FineCoarseMeshPair.hpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #ifndef FINECOARSEMESHPAIR_HPP_
00037 #define FINECOARSEMESHPAIR_HPP_
00038
00039 #include "AbstractTetrahedralMesh.hpp"
00040 #include "BoxCollection.hpp"
00041 #include "QuadraturePointsGroup.hpp"
00042 #include "GaussianQuadratureRule.hpp"
00043 #include "Warnings.hpp"
00044 #include "CommandLineArguments.hpp"
00045
00052 template<unsigned DIM>
00053 struct ElementAndWeights
00054 {
00055 unsigned ElementNum;
00056 c_vector<double, DIM+1> Weights;
00057 };
00058
00105 template <unsigned DIM>
00106 class FineCoarseMeshPair
00107 {
00108 friend class TestFineCoarseMeshPair;
00109
00110 private:
00111
00113 AbstractTetrahedralMesh<DIM,DIM>& mrFineMesh;
00114
00116 AbstractTetrahedralMesh<DIM,DIM>& mrCoarseMesh;
00117
00121 BoxCollection<DIM>* mpFineMeshBoxCollection;
00122
00127 BoxCollection<DIM>* mpCoarseMeshBoxCollection;
00128
00134 std::vector<ElementAndWeights<DIM> > mFineMeshElementsAndWeights;
00135
00137 std::vector<unsigned> mNotInMesh;
00138
00143 std::vector<c_vector<double,DIM+1> > mNotInMeshNearestElementWeights;
00144
00154 std::vector<unsigned> mStatisticsCounters;
00155
00161 std::vector<unsigned> mCoarseElementsForFineNodes;
00162
00168 std::vector<unsigned> mCoarseElementsForFineElementCentroids;
00169
00179 void ComputeFineElementAndWeightForGivenPoint(ChastePoint<DIM>& rPoint,
00180 bool safeMode,
00181 unsigned boxForThisPoint,
00182 unsigned index);
00183
00191 unsigned ComputeCoarseElementForGivenPoint(ChastePoint<DIM>& rPoint,
00192 bool safeMode,
00193 unsigned boxForThisPoint);
00194
00205 void SetUpBoxes(AbstractTetrahedralMesh<DIM,DIM>& rMesh,
00206 double boxWidth,
00207 BoxCollection<DIM>*& rpBoxCollection);
00208
00219 void CollectElementsInContainingBox(BoxCollection<DIM>*& rpBoxCollection,
00220 unsigned boxIndex,
00221 std::set<unsigned>& rElementIndices);
00232 void CollectElementsInLocalBoxes(BoxCollection<DIM>*& rpBoxCollection,
00233 unsigned boxIndex,
00234 std::set<unsigned>& rElementIndices);
00235
00240 void ResetStatisticsVariables();
00241
00242 public:
00243
00250 FineCoarseMeshPair(AbstractTetrahedralMesh<DIM,DIM>& rFineMesh, AbstractTetrahedralMesh<DIM,DIM>& rCoarseMesh);
00251
00255 ~FineCoarseMeshPair();
00256
00269 void SetUpBoxesOnFineMesh(double boxWidth = -1);
00270
00283 void SetUpBoxesOnCoarseMesh(double boxWidth = -1);
00284
00302 void ComputeFineElementsAndWeightsForCoarseQuadPoints(GaussianQuadratureRule<DIM>& rQuadRule,
00303 bool safeMode);
00304
00319 void ComputeFineElementsAndWeightsForCoarseNodes(bool safeMode);
00320
00333 void PrintStatistics();
00334
00345 void ComputeCoarseElementsForFineNodes(bool safeMode);
00346
00358 void ComputeCoarseElementsForFineElementCentroids(bool safeMode);
00359
00363 std::vector<ElementAndWeights<DIM> >& rGetElementsAndWeights()
00364 {
00365 return mFineMeshElementsAndWeights;
00366 }
00367
00372 std::vector<unsigned>& rGetCoarseElementsForFineNodes()
00373 {
00374 assert(mCoarseElementsForFineNodes.size() > 0);
00375 return mCoarseElementsForFineNodes;
00376 }
00377
00382 std::vector<unsigned>& rGetCoarseElementsForFineElementCentroids()
00383 {
00384 assert(mCoarseElementsForFineElementCentroids.size() > 0);
00385 return mCoarseElementsForFineElementCentroids;
00386 }
00387
00392 void DeleteFineBoxCollection();
00393
00398 void DeleteCoarseBoxCollection();
00399
00404 const AbstractTetrahedralMesh<DIM, DIM>& GetFineMesh() const;
00405
00410 const AbstractTetrahedralMesh<DIM, DIM>& GetCoarseMesh() const;
00411
00412 };
00413
00414 #endif