00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef BOUNDARY_CONDITION_DISCRETIZATION_FEM_HPP
00021 #define BOUNDARY_CONDITION_DISCRETIZATION_FEM_HPP
00022
00023 #include <BoundaryConditionDiscretization.hpp>
00024
00025 #include <BoundaryConditionCommonFEMDiscretization.hpp>
00026 #include <SurfaceMesh.hpp>
00027
00028 #include <UnAssembledMatrix.hpp>
00029
00030 #include <ErrorHandler.hpp>
00031
00040 template <typename MeshType,
00041 ScalarDiscretizationTypeBase::Type TypeOfDiscretization>
00042 class BoundaryConditionDiscretizationFEM
00043 : public BoundaryConditionCommonFEMDiscretization<MeshType,
00044 TypeOfDiscretization>
00045 {
00046 public:
00047 void getDiagonal (BaseVector& Z) const
00048 {
00049 Vector<real_t>& z = dynamic_cast<Vector<real_t>&>(Z);
00050
00051
00052 BoundaryConditionCommonFEMDiscretization<MeshType,
00053 TypeOfDiscretization>
00054 ::__StandardGetDiagonalVariationalBorderBilinearOperator(*this, z);
00055
00056 BoundaryConditionCommonFEMDiscretization<MeshType,
00057 TypeOfDiscretization>
00058 ::__StandardGetDiagonalDirichletBorderBilinearOperator(*this, z);
00059 }
00060
00061 void setMatrix (ReferenceCounting<BaseMatrix> givenA,
00062 ReferenceCounting<BaseVector> b) const
00063 {
00064 switch((*givenA).type()) {
00065 case BaseMatrix::doubleHashedMatrix: {
00066
00067 DoubleHashedMatrix& A = dynamic_cast<DoubleHashedMatrix&>(*givenA);
00068
00069
00070 BoundaryConditionCommonFEMDiscretization<MeshType,
00071 TypeOfDiscretization>
00072 ::__StandardVariationalBorderBilinearOperator(*this, A);
00073
00074
00075 BoundaryConditionCommonFEMDiscretization<MeshType,
00076 TypeOfDiscretization>
00077 ::__StandardDirichletBorderBilinearOperator(*this, A);
00078 break;
00079 }
00080
00081 case BaseMatrix::unAssembled: {
00082 UnAssembledMatrix& A = dynamic_cast<UnAssembledMatrix&>(*givenA);
00083 A.setBoundaryConditions(this);
00084 break;
00085 }
00086
00087 default: {
00088 throw ErrorHandler(__FILE__,__LINE__,
00089 "unexected matrix type",
00090 ErrorHandler::unexpected);
00091 }
00092 }
00093 }
00094
00095 void setSecondMember (ReferenceCounting<BaseMatrix> givenA,
00096 ReferenceCounting<BaseVector> givenB) const
00097 {
00098 Vector<real_t>& b = dynamic_cast<Vector<real_t>&>(*givenB);
00099 BaseMatrix& A = *givenA;
00100
00102 BoundaryConditionCommonFEMDiscretization<MeshType,
00103 TypeOfDiscretization>::
00104 __StandardVariationalBorderLinearOperator(*this, b);
00105
00107 BoundaryConditionCommonFEMDiscretization<MeshType,
00108 TypeOfDiscretization>::
00109 __StandardDirichletBorderLinearOperator(*this, A, b);
00110 }
00111
00112 void timesX(const BaseVector& X, BaseVector& Z) const
00113 {
00114 const Vector<real_t>& x = dynamic_cast<const Vector<real_t>&>(X);
00115 Vector<real_t>& z = dynamic_cast<Vector<real_t>&>(Z);
00116
00117
00118 BoundaryConditionCommonFEMDiscretization<MeshType,
00119 TypeOfDiscretization>::
00120 __StandardVariationalBorderBilinearOperatorTimesX(*this,
00121 x, z);
00122
00123
00124 BoundaryConditionCommonFEMDiscretization<MeshType,
00125 TypeOfDiscretization>::
00126 __StandardDirichletBorderBilinearOperatorTimesX(*this,
00127 x, z);
00128 }
00129
00130 void transposedTimesX(const BaseVector& X, BaseVector& Z) const
00131 {
00132 const Vector<real_t>& x = dynamic_cast<const Vector<real_t>&>(X);
00133 Vector<real_t>& z = dynamic_cast<Vector<real_t>&>(Z);
00134
00135
00136 BoundaryConditionCommonFEMDiscretization<MeshType,
00137 TypeOfDiscretization>::
00138 __StandardVariationalBorderBilinearOperatorTransposedTimesX(*this,
00139 x, z);
00140
00141
00142 BoundaryConditionCommonFEMDiscretization<MeshType,
00143 TypeOfDiscretization>::
00144 __StandardDirichletBorderBilinearOperatorTransposedTimesX(*this,
00145 x, z);
00146 }
00147
00148 BoundaryConditionDiscretizationFEM(const Problem& problem,
00149 const MeshType& mesh,
00150 const DegreeOfFreedomSet& dof)
00151 : BoundaryConditionCommonFEMDiscretization<MeshType,
00152 TypeOfDiscretization>(problem, mesh, dof)
00153 {
00154 ;
00155 }
00156
00157 BoundaryConditionDiscretizationFEM(const BoundaryConditionDiscretizationFEM<MeshType, TypeOfDiscretization>& b)
00158 : BoundaryConditionCommonFEMDiscretization<MeshType,
00159 TypeOfDiscretization>(b)
00160 {
00161 ;
00162 }
00163
00164 ~BoundaryConditionDiscretizationFEM()
00165 {
00166 ;
00167 }
00168 };
00169
00170 #endif // BOUNDARY_CONDITION_DISCRETIZATION_FEM_HPP