1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright held by original author
7 -------------------------------------------------------------------------------
9 This file is part of OpenFOAM.
11 OpenFOAM is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the
13 Free Software Foundation; either version 2 of the License, or (at your
14 option) any later version.
16 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
29 An implementation of dynamic changes to mesh-topology
33 University of Massachusetts Amherst
39 dynamicTopoFvMeshCheck.C
40 dynamicTopoFvMeshCoupled.C
41 dynamicTopoFvMeshReOrder.C
42 dynamicTopoFvMeshMapping.C
47 \*---------------------------------------------------------------------------*/
49 #ifndef dynamicTopoFvMesh_H
50 #define dynamicTopoFvMesh_H
53 #include "tetMetric.H"
54 #include "topoMapper.H"
55 #include "DynamicField.H"
56 #include "threadHandler.H"
57 #include "dynamicFvMesh.H"
59 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
64 // Class forward declarations
71 class convexSetAlgorithm;
72 class lengthScaleEstimator;
74 /*---------------------------------------------------------------------------*\
75 Class dynamicTopoFvMesh Declaration
76 \*---------------------------------------------------------------------------*/
78 class dynamicTopoFvMesh
84 //- Reference to base mesh
85 const dynamicTopoFvMesh& baseMesh_;
87 //- Number of boundary patches
90 //- Topology change flag
93 //- Is this a subMesh?
96 //- Dynamic mesh dictionary
99 //- Should all options be mandatorily specified?
100 // Handy for first-time use.
103 //- Mesh characteristics [2D/3D]
106 //- Edge refinement switch
107 Switch edgeRefinement_;
109 //- Load motion solver
110 Switch loadMotionSolver_;
112 //- Switch for cell-bandwidth reduction
113 Switch bandWidthReduction_;
115 //- Coupled modification switch
116 mutable Switch coupledModification_;
118 //- Specify the re-meshing interval
122 autoPtr<eMesh> eMeshPtr_;
125 autoPtr<topoMapper> mapper_;
127 //- Mesh motion solver
128 autoPtr<motionSolver> motionSolver_;
130 //- Length scale estimator
131 autoPtr<lengthScaleEstimator> lengthEstimator_;
133 //- Lists that dynamically resize during topo-changes
134 // - Since resizes happen infrequently,
135 // scale up by 10% to save memory.
136 // - Current C++ standard doesn't
137 // support template typedefs,
138 // so this is a work-around
143 typedef DynamicList<T, 0, 11, 10> ListType;
144 typedef DynamicField<T, 0, 11, 10> FieldType;
147 resizable<point>::FieldType oldPoints_, points_;
148 resizable<face>::ListType faces_;
149 resizable<label>::ListType owner_, neighbour_;
150 resizable<cell>::ListType cells_;
151 resizable<edge>::ListType edges_;
152 resizable<labelList>::ListType pointEdges_;
153 resizable<labelList>::ListType edgeFaces_, faceEdges_;
154 resizable<scalar>::ListType lengthScale_;
157 labelList oldPatchSizes_, patchSizes_;
158 labelList oldPatchStarts_, patchStarts_;
159 labelList oldEdgePatchSizes_, edgePatchSizes_;
160 labelList oldEdgePatchStarts_, edgePatchStarts_;
161 labelList oldPatchNMeshPoints_, patchNMeshPoints_;
162 label nOldPoints_, nPoints_;
163 label nOldEdges_, nEdges_;
164 label nOldFaces_, nFaces_;
165 label nOldCells_, nCells_;
166 label nOldInternalFaces_, nInternalFaces_;
167 label nOldInternalEdges_, nInternalEdges_;
169 //- Maps [Old-to-New]
170 labelList reversePointMap_;
171 labelList reverseEdgeMap_;
172 labelList reverseFaceMap_;
173 labelList reverseCellMap_;
175 //- Maps [New-to-Old]
181 //- Maps for the renumbering of added entities
182 Map<label> addedPointRenumbering_;
183 Map<label> addedEdgeRenumbering_;
184 Map<label> addedFaceRenumbering_;
185 Map<label> addedCellRenumbering_;
186 Map<label> addedFacePatches_;
187 Map<label> addedEdgePatches_;
188 Map<label> addedPointZones_;
189 Map<label> addedFaceZones_;
190 Map<label> addedCellZones_;
192 // Information for field-mapping
193 Map<labelList> faceParents_;
194 List<scalarField> faceWeights_;
195 List<vectorField> faceCentres_;
197 Map<labelList> cellParents_;
198 List<scalarField> cellWeights_;
199 List<vectorField> cellCentres_;
201 // Information for mapPolyMesh
202 List<objectMap> pointsFromPoints_;
203 List<objectMap> facesFromPoints_;
204 List<objectMap> facesFromEdges_;
205 List<objectMap> facesFromFaces_;
206 List<objectMap> cellsFromPoints_;
207 List<objectMap> cellsFromEdges_;
208 List<objectMap> cellsFromFaces_;
209 List<objectMap> cellsFromCells_;
211 //- Maps to keep track of entities deleted after addition
212 labelHashSet deletedPoints_;
213 labelHashSet deletedEdges_;
214 labelHashSet deletedFaces_;
215 labelHashSet deletedCells_;
217 //- List of flipped faces
218 labelHashSet flipFaces_;
220 //- Run-time statistics
221 label maxModifications_;
222 FixedList<label, 8> statistics_;
225 scalar sliverThreshold_;
226 Map<scalar> thresholdSlivers_;
228 //- Specific to proximity-based refinement
229 List<labelPair> slicePairs_;
231 //- 3D Mesh Flipping data
232 label maxTetsPerEdge_;
233 scalar swapDeviation_;
234 Switch allowTableResize_;
235 labelList noSwapPatchIDs_;
237 //- Stack-list of entities to be checked for topo-changes.
238 List<Stack> entityStack_;
240 //- Support for multithreading
241 autoPtr<IOmultiThreader> threader_;
243 // Pointer-list of thread-handlers
244 typedef threadHandler<dynamicTopoFvMesh> meshHandler;
246 PtrList<meshHandler> handlerPtr_;
248 // Entity mutexes used for synchronization
249 // in multi-threaded reOrdering
250 FixedList<Mutex, 4> entityMutex_;
252 // Local coupled patch information
253 PtrList<coupledInfo> patchCoupling_;
255 // List of processors that this sub-domain talks to
256 labelList procIndices_;
259 PtrList<coupledInfo> sendMeshes_;
260 PtrList<coupledInfo> recvMeshes_;
262 // Private Member Functions
264 //- Disallow default bitwise copy construct
265 dynamicTopoFvMesh(const dynamicTopoFvMesh&);
267 //- Construct from components
268 //- Used for subMeshes only.
271 const dynamicTopoFvMesh& mesh,
273 const Xfer<pointField>& points,
274 const Xfer<pointField>& oldPoints,
275 const Xfer<edgeList>& edges,
276 const Xfer<faceList>& faces,
277 const Xfer<labelListList>& faceEdges,
278 const Xfer<labelList>& owner,
279 const Xfer<labelList>& neighbour,
280 const labelList& faceStarts,
281 const labelList& faceSizes,
282 const labelList& edgeStarts,
283 const labelList& edgeSizes,
284 const wordList& patchNames,
285 const dictionary& patchDict
288 //- Disallow default bitwise assignment
289 void operator=(const dynamicTopoFvMesh&);
291 // Perform a Delaunay test on an internal face
292 bool testDelaunay(const label fIndex) const;
294 //- Quality metric for tetrahedra in 3D
295 tetMetric::tetMetricReturnType tetMetric_;
297 // Compute mapping weights for modified entities
300 const scalar matchTol,
301 const bool skipMapping,
302 const bool mappingOutput,
303 const label faceStart,
304 const label faceSize,
305 const label cellStart,
309 // Static equivalent for multiThreading
310 static void computeMappingThread(void *argument);
312 // Routine to invoke threaded mapping
320 // Initialize mesh edges and related connectivity lists
323 // Load the mesh-quality metric from the library
326 // Load the mesh-motion solver
327 void loadMotionSolver();
329 // Load the field mapper
330 void loadFieldMapper();
332 // Load the length scale estimator
333 void loadLengthScaleEstimator();
335 // Initialize the threading environment
336 void initializeThreadingEnvironment(const label specThreads = -1);
338 // Return a non-const reference to the lengthScaleEstimator
339 inline lengthScaleEstimator& lengthEstimator();
341 // Return a const reference to the lengthScaleEstimator
342 inline const lengthScaleEstimator& lengthEstimator() const;
344 // Return a const reference to the multiThreader
345 inline const multiThreader& threader() const;
347 // Return a reference to the entity mutexes
348 inline const Mutex& entityMutex(const label entity) const;
350 // Return the edge index for a provided edge
351 inline label getEdgeIndex(const edge& edgeToCheck) const;
353 // Given a boundary face, pick out a boundary edge that
354 // contains a triangular face.
355 inline label getTriBoundaryEdge(const label fIndex) const;
357 // Given an input quad-face, determine checkEdges from mesh
358 static void getCheckEdges
361 const dynamicTopoFvMesh& mesh,
363 FixedList<edge,4>& checkEdge,
364 FixedList<label,4>& checkEdgeIndex
367 // Return length-scale at an face-location in the mesh [2D]
368 scalar faceLengthScale(const label fIndex) const;
370 // Return length-scale at an edge-location in the mesh [3D]
371 scalar edgeLengthScale(const label eIndex) const;
373 // Check for bisection
374 inline bool checkBisection(const label index) const;
376 // Check for collapse
377 inline bool checkCollapse(const label index) const;
379 // MultiThreaded topology modifier
380 void threadedTopoModifier();
382 // 2D Edge-swapping engine
383 static void swap2DEdges(void *argument);
385 // 3D Edge-swapping engine
386 static void swap3DEdges(void *argument);
388 // Edge refinement engine
389 static void edgeRefinementEngine(void *argument);
391 // Return the entity stack for a particular thread
392 inline Stack& stack(const label threadID);
394 // Return the integer ID for a given thread
395 inline label self() const;
398 inline void initStacks(const labelHashSet& entities);
400 // Initialize the coupled stack
401 void initCoupledStack
403 const labelHashSet& entities,
407 // Method to determine the boundary patch index for a given face
408 inline label whichPatch(const label index) const;
410 // Method to determine the boundary patch index for a given edge
411 inline label whichEdgePatch(const label index) const;
413 // Report topo-modification status
414 inline label status(const label type) const;
416 // Method for the swapping of a quad-face in 2D
423 // Method for the bisection of a quad-face in 2D
428 const changeMap& masterMap,
429 bool checkOnly = false,
433 // Method for the collapse of a quad-face in 2D
438 label overRideCase = -1,
439 bool checkOnly = false,
443 // Method for the bisection of an edge in 3D
448 bool checkOnly = false,
452 // Method for the trisection of a face in 3D
457 bool checkOnly = false,
461 // Method for the collapse of an edge in 3D
466 label overRideCase = -1,
467 bool checkOnly = false,
471 // Slice the mesh at a particular location
472 void sliceMesh(const labelPair& pointPair);
474 // Utility method to check for invalid face-bisection.
478 const label bFaceIndex,
482 // Utility method to check for invalid face-collapse.
483 static bool checkCollapse
485 const dynamicTopoFvMesh& mesh,
486 const labelList& triFaces,
487 const FixedList<label,2>& c0BdyIndex,
488 const FixedList<label,2>& c1BdyIndex,
489 const FixedList<label,2>& pointIndex,
490 const FixedList<point,2>& newPoint,
491 const FixedList<point,2>& oldPoint,
492 scalar& collapseQuality,
493 const bool checkNeighbour,
497 // Utility method to check for invalid edge-collapse.
500 const point& newPoint,
501 const point& oldPoint,
502 const label pointIndex,
503 const label cellIndex,
504 DynamicList<label>& cellsChecked,
505 scalar& collapseQuality,
509 // Remove 2D sliver cells from the mesh
510 void remove2DSlivers();
512 // Identify the sliver type in 3D
513 const changeMap identifySliverType(const label cIndex) const;
515 // Remove sliver cells
516 void removeSlivers();
518 // Insert the specified cell to the mesh
522 const scalar lengthScale,
523 const label zoneID = -1
526 // Set fill-in mapping information for a particular cell
530 const labelList& mapCells,
534 // Set fill-in mapping information for a particular face
538 const labelList& mapFaces = labelList(0)
541 // Remove the specified cells from the mesh
545 const labelList& cList,
548 bool checkOnly = false
551 // Remove the specified cell from the mesh
557 // Insert the specified face to the mesh
562 const label newOwner,
563 const label newNeighbour,
564 const label zoneID = -1
567 // Remove the specified face from the mesh
573 // Split a set of internal faces into boundary faces,
574 // and add them to the specified patch.
575 void splitInternalFaces
577 const label patchIndex,
578 const labelList& internalFaces,
579 const Map<bool>& cellColors
582 // Merge a set of boundary faces into internal
586 const labelList& mergeFaces
589 // Insert the specified edge to the mesh
594 const labelList& edgeFaces
597 // Remove the specified edge from the mesh
603 // Insert the specified point to the mesh
606 const point& newPoint,
607 const point& oldPoint,
608 const labelList& mapPoints,
609 const label zoneID = -1
612 // Remove the specified point from the mesh
618 // Utility method to build vertexHull for an edge [3D]
622 labelList& vertexHull,
623 const label checkIndex = 0
626 // Utility to check whether points of an edge lie on a boundary
627 const FixedList<bool,2> checkEdgeBoundary(const label eIndex) const;
629 // Set a particular face index as flipped.
630 inline void setFlip(const label fIndex);
632 // Utility method to compute the minimum quality of a vertex hull
633 scalar computeMinQuality
636 labelList& hullVertices
639 // Compute minQuality given addressing
640 scalar computeMinQuality
642 const edge& edgeToCheck,
643 const labelList& hullVertices,
644 const UList<point>& points,
645 bool closedRing = false
648 // Utility method to compute the quality of a vertex hull
649 // around an edge after bisection.
650 scalar computeBisectionQuality(const label eIndex) const;
652 // Utility method to compute the quality of cells
653 // around a face after trisection.
654 scalar computeTrisectionQuality(const label fIndex) const;
656 // Check whether the given edge is on a bounding curve
657 bool checkBoundingCurve
660 const bool overRidePurityCheck = false,
661 label* nProcCurves = NULL
664 // Allocate dynamic programming tables
668 PtrList<scalarListList>& Q,
669 PtrList<labelListList>& K,
670 PtrList<labelListList>& triangulations,
671 const label checkIndex = -1
674 // Check triangulation quality for an edge index
679 const PtrList<scalarListList>& Q,
680 const scalar minQuality,
681 const label checkIndex = 0
684 // Utility method to fill the dynamic programming tables
690 labelList& hullVertices,
691 PtrList<scalarListList>& Q,
692 PtrList<labelListList>& K,
693 PtrList<labelListList>& triangulations,
694 const label checkIndex = 0
697 // Fill tables given addressing
700 const edge& edgeToCheck,
701 const scalar minQuality,
703 const labelList& hullVertices,
704 const UList<point>& points,
707 labelListList& triangulations
710 // Print out tables for debugging
714 const PtrList<scalarListList>& Q,
715 const PtrList<labelListList>& K,
716 const label checkIndex = 0
719 // Remove the edge according to the swap sequence
724 const scalar minQuality,
725 const labelList& hullVertices,
726 PtrList<scalarListList>& Q,
727 PtrList<labelListList>& K,
728 PtrList<labelListList>& triangulations,
729 const label checkIndex = 0
732 // Extract triangulations from the programming table
733 void extractTriangulation
737 const labelListList& K,
738 label& numTriangulations,
739 labelListList& triangulations
742 // Identify the 3-2 swap from the triangulation sequence
746 const labelList& hullVertices,
747 const labelListList& triangulations,
751 // Check old-volumes for the configuration.
752 bool checkTriangulationVolumes
755 const labelList& hullVertices,
756 const labelListList& triangulations
759 // Routine to check whether the triangulation at the
760 // index lies on the boundary of the vertex ring.
761 bool boundaryTriangulation
764 label& isolatedVertex,
765 labelListList& triangulations
768 // Routine to perform 2-3 swaps
772 const label isolatedVertex,
774 const label triangulationIndex,
775 const label numTriangulations,
776 const labelListList& triangulations,
777 const labelList& hullVertices,
778 const labelList& hullFaces,
779 const labelList& hullCells
782 // Routine to perform 3-2 or 2-2 swaps
787 const label triangulationIndex,
788 const label numTriangulations,
789 const labelListList& triangulations,
790 const labelList& hullVertices,
791 const labelList& hullFaces,
792 const labelList& hullCells
795 // Reorder points after a topology change
799 pointField& preMotionPoints,
800 labelListList& pointZoneMap,
801 bool threaded = false
804 // Static equivalent for multi-threading
805 static void reOrderPointsThread(void *argument);
807 // Reorder edges after a topology change
811 labelListList& edgeFaces,
812 labelListList& faceEdges,
813 bool threaded = false
816 // Static equivalent for multi-threading
817 static void reOrderEdgesThread(void *argument);
819 // Reorder faces in upper-triangular order after a topology change
824 labelList& neighbour,
825 labelListList& faceEdges,
826 labelListList& faceZoneFaceMap,
827 bool threaded = false
830 // Static equivalent for multi-threading
831 static void reOrderFacesThread(void *argument);
833 // Reorder & renumber cells with bandwidth
834 // reduction after a topology change
837 labelListList& cellZoneMap,
838 bool threaded = false
841 // Static equivalent for multi-threading
842 static void reOrderCellsThread(void *argument);
844 // Reorder the mesh in upper-triangular order,
845 // and generate mapping information
849 pointField& preMotionPoints,
853 labelList& neighbour,
854 labelListList& faceEdges,
855 labelListList& edgeFaces,
856 labelListList& pointZoneMap,
857 labelListList& faceZoneFaceMap,
858 labelListList& cellZoneMap
861 // Invoke reOrdering with multiple threads
862 void threadedMeshReOrdering
865 pointField& preMotionPoints,
869 labelList& neighbour,
870 labelListList& faceEdges,
871 labelListList& edgeFaces,
872 labelListList& pointZoneMap,
873 labelListList& faceZoneFaceMap,
874 labelListList& cellZoneMap
877 // Reset the mesh and generate mapping information
880 // Write out connectivity for an edge
881 void writeEdgeConnectivity(const label eIndex) const;
883 // Output an entity as a VTK file
888 const label primitiveType = 3,
889 const bool useOldConnectivity = false,
890 const bool useOldPoints = false
893 // Output a list of entities as a VTK file
897 const labelList& cList,
898 const label primitiveType = 3,
899 const bool useOldConnectivity = false,
900 const bool useOldPoints = false,
901 const UList<scalar>& scalField = UList<scalar>(),
902 const UList<label>& lablField = UList<label>()
905 // Return the status report interval
906 scalar reportInterval() const;
908 // Check the state of local connectivity lists
909 void checkConnectivity(const label maxErrors = 0) const;
911 // Handle mesh slicing events.
912 void handleMeshSlicing();
914 // Handle layer addition / removal events
915 void handleLayerAdditionRemoval();
917 // Add cell layer above specified patch
918 const changeMap addCellLayer(const label patchID);
920 // Remove cell layer above specified patch
921 const changeMap removeCellLayer(const label patchID);
923 // Test an edge / face for proximity with other non-neighbouring faces.
924 // Return the scalar distance to the nearest face.
931 // Calculate the edge length-scale for the mesh
932 void calculateLengthScale(bool dump = false);
934 // Fill buffers with length-scale info
935 // and exchange across processors.
936 void exchangeLengthBuffers();
938 // Implementing the fillTables operation for coupled edges
939 bool coupledFillTables
944 PtrList<scalarListList>& Q,
945 PtrList<labelListList>& K,
946 PtrList<labelListList>& triangulations
949 // Additional mapping contributions for coupled entities
950 void computeCoupledWeights
953 const label dimension,
955 scalarField& weights,
956 vectorField& centres,
960 // Fetch length-scale info for processor entities
961 scalar processorLengthScale(const label index) const;
963 // Method to determine whether the master entity is locally coupled
964 bool locallyCoupledEntity
967 bool checkSlaves = false,
968 bool checkProcs = true,
969 bool checkFace = false
972 // Method to determine the locally coupled patch index
973 label locallyCoupledEdgePatch(const label eIndex) const;
975 // Method to determine if the entity is on a processor boundary
976 bool processorCoupledEntity
979 bool checkFace = false,
980 bool checkEdge = false,
981 bool checkPure = false,
982 FixedList<label, 2>* patchLabels = NULL,
983 FixedList<vector, 2>* patchNormals = NULL
986 // Read optional dictionary parameters
987 void readOptionalParameters(bool reRead = false);
989 // Execute load balancing operations on the mesh
990 void executeLoadBalancing(const dictionary& balanceDict);
992 // Identify coupled patches.
993 bool identifyCoupledPatches();
995 // Read coupled patch information from dictionary.
996 void readCoupledPatches();
998 // Initialize coupled patch connectivity for topology modifications.
999 static void initCoupledConnectivity(void *argument);
1001 // Move coupled subMesh points
1002 void moveCoupledSubMeshes();
1004 // Build a list of entities that need to be avoided
1005 // by regular topo-changes.
1006 void buildEntitiesToAvoid
1008 labelHashSet& entities,
1012 // Check whether the specified edge is a coupled master edge.
1013 bool isCoupledMaster(const label eIndex) const;
1015 // Set coupled modification
1016 void setCoupledModification() const;
1018 // Unset coupled modification
1019 void unsetCoupledModification() const;
1021 // Insert the cells around the coupled master entity to the mesh
1022 const changeMap insertCells(const label mIndex);
1024 // Handle topology changes for coupled patches
1025 void handleCoupledPatches(labelHashSet& entities);
1027 // Synchronize topology operations across processors
1028 void syncCoupledPatches(labelHashSet& entities);
1030 // Check the state of coupled boundaries
1031 bool checkCoupledBoundaries(bool report = true) const;
1033 // Build patch sub-meshes for processor patches
1034 void buildProcessorPatchMeshes();
1036 // Build patch sub-mesh for a specified processor
1037 void buildProcessorPatchMesh
1039 coupledInfo& subMesh,
1040 Map<labelList>& commonCells
1043 // Build coupled maps for locally coupled patches
1044 void buildLocalCoupledMaps();
1046 // Build coupled maps for coupled processor patches
1047 void buildProcessorCoupledMaps();
1049 // Introduce a new processor patch to the mesh
1050 label createProcessorPatch(const label proc);
1052 // If a patch is of processor type,
1053 // get the neighbouring processor ID
1054 label getNeighbourProcessor(const label patch) const;
1056 // If the number of patches have changed during run-time,
1057 // reset boundaries with new processor patches
1058 void resetBoundaries();
1060 // Initialize subMesh field transfers for mapping
1061 void initFieldTransfers
1063 wordList& fieldTypes,
1064 List<wordList>& fieldNames,
1065 List<List<char> >& sendBuffer,
1066 List<List<char> >& recvBuffer
1069 // Synchronize field transfers for mapping
1070 void syncFieldTransfers
1072 wordList& fieldTypes,
1073 List<wordList>& fieldNames,
1074 List<List<char> >& recvBuffer
1077 // Initialize coupled boundary ordering
1078 void initCoupledBoundaryOrdering
1080 List<pointField>& centres,
1081 List<pointField>& anchors
1084 // Synchronize coupled boundary ordering
1085 bool syncCoupledBoundaryOrdering
1087 List<pointField>& centres,
1088 List<pointField>& anchors,
1089 labelListList& faceMaps,
1090 labelListList& rotations
1093 // Dump cell-quality statistics
1094 bool meshQuality(bool outputOption);
1098 // Declare the name of the class and its debug switch
1099 TypeName("dynamicTopoFvMesh");
1103 //- Construct from existing IOobject
1104 explicit dynamicTopoFvMesh(const IOobject& io);
1108 virtual ~dynamicTopoFvMesh();
1112 //- Update mesh corresponding to the given map
1113 virtual void updateMesh(const mapPolyMesh& mpm);
1115 // Map all fields in time using a customized mapper
1116 virtual void mapFields(const mapPolyMesh& mpm) const;
1118 // Update the mesh for motion / topology changes
1119 // Return true if topology changes have occurred
1120 virtual bool update();
1124 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1126 } // End namespace Foam
1128 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1130 #include "dynamicTopoFvMeshI.H"
1132 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1136 // ************************************************************************* //