Chaste
Release::2018.1
|
#include <FineCoarseMeshPair.hpp>
Public Member Functions | |
FineCoarseMeshPair (AbstractTetrahedralMesh< DIM, DIM > &rFineMesh, AbstractTetrahedralMesh< DIM, DIM > &rCoarseMesh) | |
~FineCoarseMeshPair () | |
void | SetUpBoxesOnFineMesh (double boxWidth=-1) |
void | SetUpBoxesOnCoarseMesh (double boxWidth=-1) |
void | ComputeFineElementsAndWeightsForCoarseQuadPoints (GaussianQuadratureRule< DIM > &rQuadRule, bool safeMode) |
void | ComputeFineElementsAndWeightsForCoarseNodes (bool safeMode) |
void | PrintStatistics () |
void | ComputeCoarseElementsForFineNodes (bool safeMode) |
void | ComputeCoarseElementsForFineElementCentroids (bool safeMode) |
std::vector< ElementAndWeights < DIM > > & | rGetElementsAndWeights () |
std::vector< unsigned > & | rGetCoarseElementsForFineNodes () |
std::vector< unsigned > & | rGetCoarseElementsForFineElementCentroids () |
void | DeleteFineBoxCollection () |
void | DeleteCoarseBoxCollection () |
const AbstractTetrahedralMesh < DIM, DIM > & | GetFineMesh () const |
const AbstractTetrahedralMesh < DIM, DIM > & | GetCoarseMesh () const |
Private Member Functions | |
void | ComputeFineElementAndWeightForGivenPoint (ChastePoint< DIM > &rPoint, bool safeMode, unsigned boxForThisPoint, unsigned index) |
unsigned | ComputeCoarseElementForGivenPoint (ChastePoint< DIM > &rPoint, bool safeMode, unsigned boxForThisPoint) |
void | SetUpBoxes (AbstractTetrahedralMesh< DIM, DIM > &rMesh, double boxWidth, DistributedBoxCollection< DIM > *&rpBoxCollection) |
void | CollectElementsInContainingBox (DistributedBoxCollection< DIM > *&rpBoxCollection, unsigned boxIndex, std::set< unsigned > &rElementIndices) |
void | CollectElementsInLocalBoxes (DistributedBoxCollection< DIM > *&rpBoxCollection, unsigned boxIndex, std::set< unsigned > &rElementIndices) |
void | ResetStatisticsVariables () |
void | ShareFineElementData () |
void | ShareCoarseElementData () |
Private Attributes | |
AbstractTetrahedralMesh< DIM, DIM > & | mrFineMesh |
AbstractTetrahedralMesh< DIM, DIM > & | mrCoarseMesh |
DistributedBoxCollection< DIM > * | mpFineMeshBoxCollection |
DistributedBoxCollection< DIM > * | mpCoarseMeshBoxCollection |
std::vector< ElementAndWeights < DIM > > | mFineMeshElementsAndWeights |
std::vector< unsigned > | mNotInMesh |
std::vector< c_vector< double, DIM+1 > > | mNotInMeshNearestElementWeights |
std::vector< unsigned > | mStatisticsCounters |
std::vector< unsigned > | mCoarseElementsForFineNodes |
std::vector< unsigned > | mCoarseElementsForFineElementCentroids |
Friends | |
class | TestFineCoarseMeshPair |
Class for a pair of meshes, one fine, one coarse, which should cover the same domain (or very nearly match). This class is used to set up interpolation information from one mesh to the other.
The functionality is based on the four information-transfers required in cardiac electro-mechanics problems
The usage of this class for each of these tasks is:
To see progression for any of these methods, run test from the command line with '-mesh_pair_verbose' as a command line parameter
Definition at line 106 of file FineCoarseMeshPair.hpp.
FineCoarseMeshPair< DIM >::FineCoarseMeshPair | ( | AbstractTetrahedralMesh< DIM, DIM > & | rFineMesh, |
AbstractTetrahedralMesh< DIM, DIM > & | rCoarseMesh | ||
) |
Constructor sets up domain size.
rFineMesh | Fine mesh (reference) |
rCoarseMesh | Coarse mesh (reference) |
Definition at line 39 of file FineCoarseMeshPair.cpp.
References FineCoarseMeshPair< DIM >::ResetStatisticsVariables().
FineCoarseMeshPair< DIM >::~FineCoarseMeshPair | ( | ) |
Destructor just deletes the box collection.
Definition at line 61 of file FineCoarseMeshPair.cpp.
|
private |
Helper method. Gets all the elements in the given box, in the given box collection and puts them in the returned std::vector.
rpBoxCollection | Reference to the box collection to use (either mpFineBoxCollection or mpCoarseBoxCollection) |
boxIndex | box index |
rElementIndices | The returned vector of element indices in that box of the box collection. Not cleared before use. |
Definition at line 561 of file FineCoarseMeshPair.cpp.
References DistributedBoxCollection< DIM >::rGetBox().
|
private |
Helper method. Gets all the elements in the given box, or in a box local to the given box, in the given box collection, and puts them in the returned std::vector.
rpBoxCollection | Reference to the box collection to use (either mpFineBoxCollection or mpCoarseBoxCollection) |
boxIndex | box index |
rElementIndices | The returned vector of element indices in that box or a local box. Not cleared before use. |
Definition at line 574 of file FineCoarseMeshPair.cpp.
References DistributedBoxCollection< DIM >::rGetBox(), and DistributedBoxCollection< DIM >::rGetLocalBoxes().
|
private |
rPoint | The point |
safeMode | See documentation in ComputeCoarseElementsForFineNodes |
boxForThisPoint | The box in coarse box collection containing this point |
Definition at line 485 of file FineCoarseMeshPair.cpp.
void FineCoarseMeshPair< DIM >::ComputeCoarseElementsForFineElementCentroids | ( | bool | safeMode | ) |
Compute the element in the coarse mesh that each fine element centroid is contained in (or nearest to). Call SetUpBoxesOnCoarseMesh() before, and rGetCoarseElementsForFineElementCentroids() afterwards.
safeMode | This method uses the elements in the boxes to guess which element a point is in. If a point is in none of these elements, then if safeMode==true, it will then search the whole mesh. If safeMode==false it will assume immediately the point isn't in the coarse mesh at all. safeMode=false is will far more efficient with big meshes. It should be fine to use safeMode=false if SetUpBoxesOnFineMesh() is called with default values. |
Definition at line 443 of file FineCoarseMeshPair.cpp.
References EXCEPTION, CommandLineArguments::Instance(), and CommandLineArguments::OptionExists().
void FineCoarseMeshPair< DIM >::ComputeCoarseElementsForFineNodes | ( | bool | safeMode | ) |
Compute the element in the coarse mesh that each fine mesh node is contained in (or nearest to). Call SetUpBoxesOnCoarseMesh() before, and rGetCoarseElementsForFineNodes() afterwards.
safeMode | This method uses the elements in the boxes to guess which element a point is in. If a point is in none of these elements, then if safeMode==true, it will then search the whole mesh. If safeMode==false it will assume immediately the point isn't in the coarse mesh at all. safeMode=false is will far more efficient with big meshes. It should be fine to use safeMode=false if SetUpBoxesOnFineMesh() is called with default values. |
Definition at line 404 of file FineCoarseMeshPair.cpp.
References EXCEPTION, CommandLineArguments::Instance(), and CommandLineArguments::OptionExists().
|
private |
For a given point, compute the containing element and corresponding weight in the fine mesh.
rPoint | The point |
safeMode | See documentation for ComputeFineElementsAndWeightsForCoarseQuadPoints() |
boxForThisPoint | The box in the fine box collection containing this point |
index | The index into the mFineMeshElementsAndWeights std::vector |
Definition at line 306 of file FineCoarseMeshPair.cpp.
void FineCoarseMeshPair< DIM >::ComputeFineElementsAndWeightsForCoarseNodes | ( | bool | safeMode | ) |
Set up the containing (fine) elements and corresponding weights for all the nodes in the coarse mesh. Call GetElementsAndWeights() after calling this with the index of the nodes.
If calling this DO NOT call ComputeFineElementsAndWeightsForCoarseQuadPoints until you do done with this data.
safeMode | This method uses the elements in the boxes to guess which element a point is in. If a point is in none of these elements, then if safeMode==true, it will then search the whole mesh. If safeMode==false it will assume immediately the point isn't in the coarse mesh at all. safeMode=false is will far more efficient with big meshes. It should be fine to use safeMode=false if SetUpBoxesOnFineMesh() is called with default values. |
Definition at line 250 of file FineCoarseMeshPair.cpp.
References EXCEPTION, CommandLineArguments::Instance(), CommandLineArguments::OptionExists(), Node< SPACE_DIM >::rGetLocation(), and Node< SPACE_DIM >::rGetModifiableLocation().
Referenced by VoltageInterpolaterOntoMechanicsMesh< DIM >::VoltageInterpolaterOntoMechanicsMesh().
void FineCoarseMeshPair< DIM >::ComputeFineElementsAndWeightsForCoarseQuadPoints | ( | GaussianQuadratureRule< DIM > & | rQuadRule, |
bool | safeMode | ||
) |
Set up the containing (fine) elements and corresponding weights for all the quadrature points in the coarse mesh. Call GetElementsAndWeights() after calling this with the index of the quad point (=the index of the quad point in a QuadraturePointsGroup= the index if the quad points were listed by looping over all the element and then looping over all the quad points).
If calling this DO NOT call ComputeFineElementsAndWeightsForCoarseNodes until you do done with this data
rQuadRule | The quadrature rule, used to determine the number of quadrature points per element. |
safeMode | This method uses the elements in the boxes to guess which element a quad point is in. If a quad point is in none of these elements, then if safeMode==true, it will then search the whole mesh. If safeMode==false it will assume immediately the quad point isn't in the mesh at all. safeMode=false is will far more efficient with big meshes. It should be fine to use safeMode=false if SetUpBoxesOnFineMesh() is called with default values. |
Definition at line 188 of file FineCoarseMeshPair.cpp.
References EXCEPTION, CommandLineArguments::Instance(), CommandLineArguments::OptionExists(), QuadraturePointsGroup< DIM >::rGet(), and QuadraturePointsGroup< DIM >::Size().
void FineCoarseMeshPair< DIM >::DeleteCoarseBoxCollection | ( | ) |
Destroy the box collection for the coarse mesh - can be used to free memory once ComputeCoarseElementsForFineNodes (etc) has been called.
Definition at line 78 of file FineCoarseMeshPair.cpp.
void FineCoarseMeshPair< DIM >::DeleteFineBoxCollection | ( | ) |
Destroy the box collection for the fine mesh - can be used to free memory once ComputeFineElementsAndWeightsForCoarseQuadPoints (etc) has been called.
Definition at line 68 of file FineCoarseMeshPair.cpp.
const AbstractTetrahedralMesh< DIM, DIM > & FineCoarseMeshPair< DIM >::GetCoarseMesh | ( | ) | const |
Access the coarse mesh of this mesh pair
Definition at line 55 of file FineCoarseMeshPair.cpp.
Referenced by AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::SetFineCoarseMeshPair().
const AbstractTetrahedralMesh< DIM, DIM > & FineCoarseMeshPair< DIM >::GetFineMesh | ( | ) | const |
Access the fine mesh of this mesh pair
Definition at line 49 of file FineCoarseMeshPair.cpp.
void FineCoarseMeshPair< DIM >::PrintStatistics | ( | ) |
Print information about the number of points found in the searched mesh. What the points are and which mesh was searched depends on whichever of the main Compute methods was last called.
If ComputeFineElementsAndWeightsForCoarseQuadPoints() or ComputeFineElementsAndWeightsForCoarseNodes() were last called, the indices of the points that were not found to be contained in the searched mesh are also printed, along with the weights for that point in the nearest element (which indicates how far from the mesh the points are).
Definition at line 676 of file FineCoarseMeshPair.cpp.
|
private |
Resets mNotInMesh, mNotInMeshNearestElementWeights and mStatisticsCounters.
Definition at line 597 of file FineCoarseMeshPair.cpp.
Referenced by FineCoarseMeshPair< DIM >::FineCoarseMeshPair().
|
inline |
Definition at line 390 of file FineCoarseMeshPair.hpp.
References FineCoarseMeshPair< DIM >::mCoarseElementsForFineElementCentroids.
|
inline |
Definition at line 380 of file FineCoarseMeshPair.hpp.
References FineCoarseMeshPair< DIM >::mCoarseElementsForFineNodes.
|
inline |
Definition at line 371 of file FineCoarseMeshPair.hpp.
References FineCoarseMeshPair< DIM >::mFineMeshElementsAndWeights.
Referenced by VoltageInterpolaterOntoMechanicsMesh< DIM >::VoltageInterpolaterOntoMechanicsMesh().
|
private |
Set up a box collection on the given mesh. Should only be called using either SetUpBoxes(*mpFineMesh, boxWidth, mpFineBoxCollection) (from SetUpBoxesOnFineMesh) or SetUpBoxes(*mpCoarseMesh, boxWidth, mpCoarseBoxCollection) (from SetUpBoxesOnCoarseMesh)
rMesh | The mesh, either *mpFineMesh or *mpCoarseMesh) |
boxWidth | box width (see SetUpBoxesOnCoarseMesh() dox) |
rpBoxCollection | reference to either mpFineBoxCollection or mpCoarseBoxCollection |
Definition at line 104 of file FineCoarseMeshPair.cpp.
References AbstractMesh< ELEMENT_DIM, SPACE_DIM >::CalculateBoundingBox(), DistributedBoxCollection< DIM >::CalculateContainingBox(), AbstractTetrahedralMesh< ELEMENT_DIM, SPACE_DIM >::CalculateMinMaxEdgeLengths(), AbstractTetrahedralMesh< ELEMENT_DIM, SPACE_DIM >::GetElement(), AbstractElement< ELEMENT_DIM, SPACE_DIM >::GetNode(), AbstractTetrahedralMesh< ELEMENT_DIM, SPACE_DIM >::GetNumElements(), ChasteCuboid< SPACE_DIM >::GetWidth(), DistributedBoxCollection< DIM >::IsBoxOwned(), DistributedBoxCollection< DIM >::IsOwned(), DistributedBoxCollection< DIM >::rGetBox(), ChasteCuboid< SPACE_DIM >::rGetLowerCorner(), ChasteCuboid< SPACE_DIM >::rGetUpperCorner(), and DistributedBoxCollection< DIM >::SetupAllLocalBoxes().
void FineCoarseMeshPair< DIM >::SetUpBoxesOnCoarseMesh | ( | double | boxWidth = -1 | ) |
Set up boxes on coarse mesh. The elements contained in each box is stored, which makes finding the containing element for a given point much faster. This should be called before ComputeCoarseElementsForFineNodes() or ComputeCoarseElementsForFineElementCentroids()
boxWidth | width to use for the boxes (which will be cubes). Note that a domain which is a touch larger than the smallest containing cuboid of the fine mesh is used. boxWidth defaults to a negative value, in which case a box width such that there are approximately 20 boxes in the x-direction, unless this width is less than maximum (fine mesh edge length), in which case it is chosen accordingly. |
Definition at line 98 of file FineCoarseMeshPair.cpp.
void FineCoarseMeshPair< DIM >::SetUpBoxesOnFineMesh | ( | double | boxWidth = -1 | ) |
Set up boxes on fine mesh. The elements contained in each box is stored, which makes finding the containing element for a given point much faster. This should be called before ComputeFineElementsAndWeightsForCoarseQuadPoints() or ComputeFineElementsAndWeightsForCoarseNodes().
boxWidth | width to use for the boxes (which will be cubes). Note that a domain which is a touch larger than the smallest containing cuboid of the fine mesh is used. boxWidth defaults to a negative value, in which case a box width such that there are approximately 20 boxes in the x-direction, unless this width is less than maximum (fine mesh edge length), in which case it is chosen accordingly. |
Definition at line 92 of file FineCoarseMeshPair.cpp.
Referenced by CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::Initialise(), and VoltageInterpolaterOntoMechanicsMesh< DIM >::VoltageInterpolaterOntoMechanicsMesh().
|
private |
In parallel: share mStatisticsCounters and all the "this coarse element index for..." information
Definition at line 650 of file FineCoarseMeshPair.cpp.
References PetscTools::IsSequential().
|
private |
In parallel: share mStatisticsCounters and all the "fine element weights for..." information
Definition at line 605 of file FineCoarseMeshPair.cpp.
References PetscTools::IsSequential().
|
private |
The element in the coarse mesh that each fine element centroid is contained in (or nearest to). ComputeCoarseElementsForFineElementCentroids() needs to be called for this to be set up.
Definition at line 168 of file FineCoarseMeshPair.hpp.
Referenced by FineCoarseMeshPair< DIM >::rGetCoarseElementsForFineElementCentroids().
|
private |
The element in the coarse mesh that each fine mesh node is contained in (or nearest to). ComputeCoarseElementsForFineNodes() needs to be called for this to be set up.
Definition at line 161 of file FineCoarseMeshPair.hpp.
Referenced by FineCoarseMeshPair< DIM >::rGetCoarseElementsForFineNodes().
|
private |
The containing elements and corresponding weights in the fine mesh for the set of points given. The points may have been quadrature points in the coarse mesh, or nodes in coarse mesh, etc.
Definition at line 134 of file FineCoarseMeshPair.hpp.
Referenced by FineCoarseMeshPair< DIM >::rGetElementsAndWeights().
|
private |
Indices of the points which were found to be outside the fine mesh.
Definition at line 137 of file FineCoarseMeshPair.hpp.
|
private |
The corresponding weights, for the nearest elements, of the points which were found to be outside the fine mesh.
Definition at line 143 of file FineCoarseMeshPair.hpp.
|
private |
Boxes on the coarse mesh domain, for easier determination of containing element for a given point.
Definition at line 127 of file FineCoarseMeshPair.hpp.
|
private |
Boxes on the fine mesh domain, for easier determination of containing element for a given point.
Definition at line 121 of file FineCoarseMeshPair.hpp.
|
private |
Coarse mesh (often this will be a quadratic mesh).
Definition at line 116 of file FineCoarseMeshPair.hpp.
|
private |
Fine mesh.
Definition at line 113 of file FineCoarseMeshPair.hpp.
|
private |
2 values, [0] number of points for which the containing element was found [1] num points not in the searched mesh at all
Note, after ComputeFineElementsAndWeightsForCoarseQuadPoints() or ComputeFineElementsAndWeightsForCoarseNodes(), then mStatisticsCounters[1] = mNotInMesh.size() = mNotInMeshNearestElementWeights.size();
Definition at line 154 of file FineCoarseMeshPair.hpp.