00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef BOUNDARY_CONDITION_SURFACE_MESH_ASSOCIATION_HPP
00021 #define BOUNDARY_CONDITION_SURFACE_MESH_ASSOCIATION_HPP
00022
00023 #include <VariationalLinearBorderOperator.hpp>
00024 #include <VariationalBilinearBorderOperator.hpp>
00025
00026 #include <VariationalBorderOperatorFV.hpp>
00027 #include <VariationalBorderOperatorAlphaUV.hpp>
00028 #include <Dirichlet.hpp>
00029 #include <Neumann.hpp>
00030 #include <Fourrier.hpp>
00031
00032 #include <BoundaryMeshAssociation.hpp>
00033
00034 #include <map>
00035 #include <vector>
00036
00052 class BoundaryConditionSurfaceMeshAssociation
00053 {
00054 public:
00055 typedef
00056 std::
00057 multimap<const Dirichlet*,
00058 ConstReferenceCounting<SurfaceMesh> >
00059 DirichletMeshAssociation;
00060
00061 typedef
00062 std::
00063 multimap<ConstReferenceCounting<VariationalLinearBorderOperator>,
00064 ConstReferenceCounting<SurfaceMesh> >
00065 LinearBorderOperatorMeshAssociation;
00066
00067 typedef
00068 std::
00069 multimap<ConstReferenceCounting<VariationalBilinearBorderOperator>,
00070 ConstReferenceCounting<SurfaceMesh> >
00071 BilinearBorderOperatorMeshAssociation;
00072
00073 private:
00074 std::vector<DirichletMeshAssociation>
00075 __dirichletMeshAssociation;
00079 LinearBorderOperatorMeshAssociation
00080 __lboMeshAssociation;
00083 BilinearBorderOperatorMeshAssociation
00084 __bboMeshAssociation;
00087 public:
00088
00097 void addPDEBoundaryConditionAndMesh(const size_t& i,
00098 const BoundaryCondition* bc,
00099 const SurfaceMesh* S) {
00100
00101 switch (bc->condition()->type()) {
00102 case PDECondition::dirichlet: {
00103 const Dirichlet& D = dynamic_cast<const Dirichlet&>(*bc->condition());
00104 __dirichletMeshAssociation[i].insert(std::pair<const Dirichlet*,
00105 const SurfaceMesh*>(&D,S));
00106 break;
00107 }
00108 case PDECondition::neumann: {
00109 const Neumann& N = dynamic_cast<const Neumann&>(*bc->condition());
00110
00111 ConstReferenceCounting<VariationalLinearBorderOperator>
00112 LV = new VariationalBorderOperatorFV(i, N.g(), bc->boundary());
00113
00114 __lboMeshAssociation.insert(std::pair<ConstReferenceCounting<VariationalLinearBorderOperator>,
00115 const SurfaceMesh*>(LV,S));
00116 break;
00117 }
00118 case PDECondition::fourrier: {
00119 const Fourrier& F = dynamic_cast<const Fourrier&>(*bc->condition());
00120
00121 ConstReferenceCounting<VariationalLinearBorderOperator>
00122 LV = new VariationalBorderOperatorFV(i, F.g(), bc->boundary());
00123
00124 __lboMeshAssociation.insert(std::pair<ConstReferenceCounting<VariationalLinearBorderOperator>,
00125 const SurfaceMesh*>(LV,S));
00126
00127 ConstReferenceCounting<VariationalBilinearBorderOperator>
00128 BLV = new VariationalBorderOperatorAlphaUV(i,F.unknownNumber(),
00129 F.alpha(), bc->boundary());
00130
00131 __bboMeshAssociation.insert(std::pair<ConstReferenceCounting<VariationalBilinearBorderOperator>,
00132 const SurfaceMesh*>(BLV, S));
00133
00134 break;
00135 }
00136 }
00137 }
00138
00145 DirichletMeshAssociation& bc(const size_t& i)
00146 {
00147 ASSERT(i<__dirichletMeshAssociation.size());
00148 return __dirichletMeshAssociation[i];
00149 }
00150
00157 const DirichletMeshAssociation& bc(const size_t& i) const
00158 {
00159 ASSERT(i<__dirichletMeshAssociation.size());
00160 return __dirichletMeshAssociation[i];
00161 }
00162
00168 void bcSetSize(const size_t& i)
00169 {
00170 __dirichletMeshAssociation.resize(i);
00171 }
00172
00179 void bilinearBorderOperatorAdd(ConstReferenceCounting<VariationalBilinearBorderOperator> v,
00180 const SurfaceMesh* s)
00181 {
00182 __bboMeshAssociation.insert(std::pair<ConstReferenceCounting<VariationalBilinearBorderOperator>,
00183 const SurfaceMesh*>(v,s));
00184 }
00185
00192 void linearBorderOperatorAdd(ConstReferenceCounting<VariationalLinearBorderOperator> v,
00193 const SurfaceMesh* s)
00194 {
00195 __lboMeshAssociation.insert(std::pair<ConstReferenceCounting<VariationalLinearBorderOperator>,
00196 const SurfaceMesh*>(v,s));
00197 }
00198
00204 BoundaryConditionSurfaceMeshAssociation
00205 ::BilinearBorderOperatorMeshAssociation
00206 ::iterator beginOfBilinear()
00207 {
00208 return __bboMeshAssociation.begin();
00209 }
00210
00216 BoundaryConditionSurfaceMeshAssociation
00217 ::BilinearBorderOperatorMeshAssociation
00218 ::const_iterator beginOfBilinear() const
00219 {
00220 return __bboMeshAssociation.begin();
00221 }
00222
00228 BoundaryConditionSurfaceMeshAssociation
00229 ::BilinearBorderOperatorMeshAssociation
00230 ::const_iterator endOfBilinear() const
00231 {
00232 return __bboMeshAssociation.end();
00233 }
00234
00240 BoundaryConditionSurfaceMeshAssociation
00241 ::LinearBorderOperatorMeshAssociation
00242 ::iterator beginOfLinear()
00243 {
00244 return __lboMeshAssociation.begin();
00245 }
00246
00252 BoundaryConditionSurfaceMeshAssociation
00253 ::LinearBorderOperatorMeshAssociation
00254 ::const_iterator beginOfLinear() const
00255 {
00256 return __lboMeshAssociation.begin();
00257 }
00258
00264 BoundaryConditionSurfaceMeshAssociation
00265 ::LinearBorderOperatorMeshAssociation
00266 ::const_iterator endOfLinear() const
00267 {
00268 return __lboMeshAssociation.end();
00269 }
00270
00275 BoundaryConditionSurfaceMeshAssociation(const Problem& P,
00276 const BoundaryMeshAssociation& bma)
00277 : __dirichletMeshAssociation(P.numberOfUnknown())
00278 {
00279 for (size_t i=0; i<P.numberOfUnknown(); ++i) {
00280 const BoundaryConditionSet& bcSet
00281 = P.boundaryConditionSet(i);
00282
00283 for(size_t j=0; j<bcSet.nbBoundaryCondition(); ++j) {
00284 const BoundaryCondition& bc = bcSet[j];
00285 const Boundary& b = *bc.boundary();
00286 this->addPDEBoundaryConditionAndMesh(i,&bc,bma[b]);
00287 }
00288 }
00289
00290
00291 if(P.type() == Problem::variational) {
00292 const VariationalProblem& VP = dynamic_cast<const VariationalProblem&>(P);
00293 for (VariationalProblem::bilinearBorderOperatorConst_iterator i = VP.beginBilinearBorderOperator();
00294 i != VP.endBilinearBorderOperator(); ++i) {
00295 const Boundary& b = dynamic_cast<const Boundary&>(*(*i)->boundary());
00296 this->bilinearBorderOperatorAdd(*i,bma[b]);
00297 }
00298 for (VariationalProblem::linearBorderOperatorConst_iterator i = VP.beginLinearBorderOperator();
00299 i != VP.endLinearBorderOperator(); ++i) {
00300 const Boundary& b = dynamic_cast<const Boundary&>(*(*i)->boundary());
00301 this->linearBorderOperatorAdd(*i,bma[b]);
00302 }
00303 }
00304 }
00305
00311 BoundaryConditionSurfaceMeshAssociation(const BoundaryConditionSurfaceMeshAssociation& B)
00312 : __dirichletMeshAssociation(B.__dirichletMeshAssociation),
00313 __lboMeshAssociation(B.__lboMeshAssociation),
00314 __bboMeshAssociation(B.__bboMeshAssociation)
00315 {
00316 ;
00317 }
00318
00323 ~BoundaryConditionSurfaceMeshAssociation()
00324 {
00325 ;
00326 }
00327 };
00328
00329 #endif // BOUNDARY_CONDITION_SURFACE_MESH_ASSOCIATION_HPP
00330