1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | foam-extend: Open Source CFD
4 \\ / O peration | Version: 3.2
5 \\ / A nd | Web: http://www.foam-extend.org
6 \\/ M anipulation | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
9 This file is part of foam-extend.
11 foam-extend 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 3 of the License, or (at your
14 option) any later version.
16 foam-extend is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with foam-extend. If not, see <http://www.gnu.org/licenses/>.
28 An implementation of dynamic changes to mesh-topology
32 University of Massachusetts Amherst
38 dynamicTopoFvMeshCheck.C
39 dynamicTopoFvMeshCoupled.C
40 dynamicTopoFvMeshReOrder.C
41 dynamicTopoFvMeshMapping.C
46 \*---------------------------------------------------------------------------*/
48 #ifndef dynamicTopoFvMesh_H
49 #define dynamicTopoFvMesh_H
52 #include "tetMetric.H"
53 #include "topoMapper.H"
54 #include "DynamicField.H"
55 #include "threadHandler.H"
56 #include "dynamicFvMesh.H"
58 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
63 // Class forward declarations
69 class convexSetAlgorithm;
70 class lengthScaleEstimator;
71 class subMeshLduAddressing;
73 template <class MeshType>
76 /*---------------------------------------------------------------------------*\
77 Class dynamicTopoFvMesh Declaration
78 \*---------------------------------------------------------------------------*/
80 class dynamicTopoFvMesh
86 typedef coupledInfo<dynamicTopoFvMesh> coupledMesh;
87 typedef threadHandler<dynamicTopoFvMesh> meshHandler;
93 TOTAL_MODIFICATIONS = 0,
98 SURFACE_BISECTIONS = 5,
99 SURFACE_COLLAPSES = 6,
106 //- Reference to base mesh
107 const dynamicTopoFvMesh& baseMesh_;
109 //- Number of boundary patches
112 //- Topology change flag
113 bool topoChangeFlag_;
115 //- Is this a subMesh?
118 //- Dynamic mesh dictionary
121 //- Should all options be mandatorily specified?
122 // Handy for first-time use.
125 //- Mesh characteristics [2D/3D]
128 //- Edge refinement switch
129 Switch edgeRefinement_;
131 //- Load motion solver
132 Switch loadMotionSolver_;
134 //- Switch for cell-bandwidth reduction
135 Switch bandWidthReduction_;
137 //- Coupled modification switch
138 mutable Switch coupledModification_;
140 //- Sub-Mesh lduAddressing
141 mutable subMeshLduAddressing* lduPtr_;
143 //- Specify the re-meshing interval
147 autoPtr<eMesh> eMeshPtr_;
150 autoPtr<topoMapper> mapper_;
152 //- Mesh motion solver
153 autoPtr<motionSolver> motionSolver_;
155 //- Length scale estimator
156 autoPtr<lengthScaleEstimator> lengthEstimator_;
158 //- Lists that dynamically resize during topo-changes
159 // - Since resizes happen infrequently,
160 // scale up by 10% to save memory.
161 // - Current C++ standard doesn't
162 // support template typedefs,
163 // so this is a work-around
168 typedef DynamicList<T, 0, 11, 10> ListType;
169 typedef DynamicField<T, 0, 11, 10> FieldType;
172 resizable<point>::FieldType oldPoints_, points_;
173 resizable<face>::ListType faces_;
174 resizable<label>::ListType owner_, neighbour_;
175 resizable<cell>::ListType cells_;
176 resizable<edge>::ListType edges_;
177 resizable<labelList>::ListType pointEdges_;
178 resizable<labelList>::ListType edgeFaces_, faceEdges_;
179 resizable<scalar>::ListType lengthScale_;
182 labelList oldPatchSizes_, patchSizes_;
183 labelList oldPatchStarts_, patchStarts_;
184 labelList oldEdgePatchSizes_, edgePatchSizes_;
185 labelList oldEdgePatchStarts_, edgePatchStarts_;
186 labelList oldPatchNMeshPoints_, patchNMeshPoints_;
187 label nOldPoints_, nPoints_;
188 label nOldEdges_, nEdges_;
189 label nOldFaces_, nFaces_;
190 label nOldCells_, nCells_;
191 label nOldInternalFaces_, nInternalFaces_;
192 label nOldInternalEdges_, nInternalEdges_;
194 //- Maps [Old-to-New]
195 labelList reversePointMap_;
196 labelList reverseEdgeMap_;
197 labelList reverseFaceMap_;
198 labelList reverseCellMap_;
200 //- Maps [New-to-Old]
206 //- Maps for the renumbering of added entities
207 Map<label> addedPointRenumbering_;
208 Map<label> addedEdgeRenumbering_;
209 Map<label> addedFaceRenumbering_;
210 Map<label> addedCellRenumbering_;
211 Map<label> addedFacePatches_;
212 Map<label> addedEdgePatches_;
213 Map<label> addedPointZones_;
214 Map<label> addedFaceZones_;
215 Map<label> addedCellZones_;
217 // Information for field-mapping
218 Map<labelList> faceParents_;
219 List<scalarField> faceWeights_;
220 List<vectorField> faceCentres_;
222 Map<labelList> cellParents_;
223 List<scalarField> cellWeights_;
224 List<vectorField> cellCentres_;
226 // Information for mapPolyMesh
227 List<objectMap> pointsFromPoints_;
228 List<objectMap> facesFromPoints_;
229 List<objectMap> facesFromEdges_;
230 List<objectMap> facesFromFaces_;
231 List<objectMap> cellsFromPoints_;
232 List<objectMap> cellsFromEdges_;
233 List<objectMap> cellsFromFaces_;
234 List<objectMap> cellsFromCells_;
236 //- Maps to keep track of entities deleted after addition
237 labelHashSet deletedPoints_;
238 labelHashSet deletedEdges_;
239 labelHashSet deletedFaces_;
240 labelHashSet deletedCells_;
242 //- List of flipped faces
243 labelHashSet flipFaces_;
245 //- Run-time statistics
246 label maxModifications_;
247 labelList statistics_;
250 scalar sliverThreshold_;
251 Map<scalar> thresholdSlivers_;
253 //- Specific to proximity-based refinement
254 List<labelPair> slicePairs_;
256 //- 3D Mesh Flipping data
257 label maxTetsPerEdge_;
258 scalar swapDeviation_;
259 Switch allowTableResize_;
260 labelList noSwapPatchIDs_;
262 //- Stack-list of entities to be checked for topo-changes.
263 List<Stack> entityStack_;
265 //- Support for multithreading
266 autoPtr<IOmultiThreader> threader_;
268 // Pointer-list of thread-handlers
269 PtrList<meshHandler> handlerPtr_;
271 // Entity mutexes used for synchronization
272 // in multi-threaded reOrdering
273 FixedList<Mutex, 4> entityMutex_;
275 // Local coupled patch information
276 PtrList<coupledMesh> patchCoupling_;
278 // List of processors that this sub-domain talks to
279 labelList procIndices_;
281 // Processor priority list
282 labelList procPriority_;
285 PtrList<coupledMesh> sendMeshes_;
286 PtrList<coupledMesh> recvMeshes_;
288 // Private Member Functions
290 //- Disallow default bitwise copy construct
291 dynamicTopoFvMesh(const dynamicTopoFvMesh&);
293 //- Construct from components
294 //- Used for subMeshes only.
297 const dynamicTopoFvMesh& mesh,
299 const Xfer<pointField>& points,
300 const Xfer<pointField>& oldPoints,
301 const Xfer<edgeList>& edges,
302 const Xfer<faceList>& faces,
303 const Xfer<labelListList>& faceEdges,
304 const Xfer<labelList>& owner,
305 const Xfer<labelList>& neighbour,
306 const labelList& faceStarts,
307 const labelList& faceSizes,
308 const labelList& edgeStarts,
309 const labelList& edgeSizes,
310 const wordList& patchNames,
311 const dictionary& patchDict
314 //- Disallow default bitwise assignment
315 void operator=(const dynamicTopoFvMesh&);
317 // Perform a Delaunay test on an internal face
318 bool testDelaunay(const label fIndex) const;
320 //- Quality metric for tetrahedra in 3D
321 tetMetric::tetMetricReturnType tetMetric_;
323 // Compute mapping weights for modified entities
326 const scalar matchTol,
327 const bool skipMapping,
328 const bool mappingOutput,
329 const label faceStart,
330 const label faceSize,
331 const label cellStart,
335 // Static equivalent for multiThreading
336 static void computeMappingThread(void *argument);
338 // Routine to invoke threaded mapping
346 // Initialize mesh edges and related connectivity lists
349 // Load the mesh-quality metric from the library
352 // Load the mesh-motion solver
353 void loadMotionSolver();
355 // Load the field mapper
356 void loadFieldMapper();
358 // Load the length scale estimator
359 void loadLengthScaleEstimator();
361 // Initialize the threading environment
362 void initializeThreadingEnvironment(const label specThreads = -1);
364 // Return if mesh is 2D
365 inline bool is2D() const;
367 // Return if mesh is 3D
368 inline bool is3D() const;
370 // Return a non-const reference to the lengthScaleEstimator
371 inline lengthScaleEstimator& lengthEstimator();
373 // Return a const reference to the lengthScaleEstimator
374 inline const lengthScaleEstimator& lengthEstimator() const;
376 // Return a const reference to the multiThreader
377 inline const multiThreader& threader() const;
379 // Return a reference to the entity mutexes
380 inline const Mutex& entityMutex(const label entity) const;
382 // Return the edge index for a provided edge
383 inline label getEdgeIndex(const edge& edgeToCheck) const;
385 // Given a boundary face, pick out a boundary edge that
386 // contains a triangular face.
387 inline label getTriBoundaryEdge(const label fIndex) const;
389 // Given an input quad-face, determine checkEdges from mesh
390 static void getCheckEdges
393 const dynamicTopoFvMesh& mesh,
395 FixedList<edge,4>& checkEdge,
396 FixedList<label,4>& checkEdgeIndex
399 // Return length-scale at an face-location in the mesh [2D]
400 scalar faceLengthScale(const label fIndex) const;
402 // Return length-scale at an edge-location in the mesh [3D]
403 scalar edgeLengthScale(const label eIndex) const;
405 // Check for bisection
406 inline bool checkBisection(const label index) const;
408 // Check for collapse
409 inline bool checkCollapse(const label index) const;
411 // MultiThreaded topology modifier
412 void threadedTopoModifier();
414 // 2D Edge-swapping engine
415 static void swap2DEdges(void *argument);
417 // 3D Edge-swapping engine
418 static void swap3DEdges(void *argument);
420 // Edge refinement engine
421 static void edgeRefinementEngine(void *argument);
423 // Return the entity stack for a particular thread
424 inline Stack& stack(const label threadID);
426 // Return the integer ID for a given thread
427 inline label self() const;
430 inline void initStacks(const labelHashSet& entities);
432 // Initialize the coupled stack
433 void initCoupledStack
435 const labelHashSet& entities,
439 // Method to determine the boundary patch index for a given face
440 inline label whichPatch(const label index) const;
442 // Method to determine the boundary patch index for a given edge
443 inline label whichEdgePatch(const label index) const;
445 // Report or alter topo-modification status
446 inline label& status(const label type);
448 // Method for the swapping of a quad-face in 2D
455 // Method for the bisection of a quad-face in 2D
460 const changeMap& masterMap,
461 bool checkOnly = false,
465 // Method for the collapse of a quad-face in 2D
470 label overRideCase = -1,
471 bool checkOnly = false,
475 // Method for the bisection of an edge in 3D
480 bool checkOnly = false,
484 // Method for the collapse of an edge in 3D
489 label overRideCase = -1,
490 bool checkOnly = false,
494 // Slice the mesh at a particular location
495 void sliceMesh(const labelPair& pointPair);
497 // Utility method to check for invalid face-bisection.
501 const label bFaceIndex,
505 // Utility method to check for invalid face-collapse.
506 static bool checkCollapse
508 const dynamicTopoFvMesh& mesh,
509 const labelList& triFaces,
510 const FixedList<label,2>& c0BdyIndex,
511 const FixedList<label,2>& c1BdyIndex,
512 const FixedList<label,2>& pointIndex,
513 const FixedList<point,2>& newPoint,
514 const FixedList<point,2>& oldPoint,
515 scalar& collapseQuality,
516 const bool checkNeighbour,
520 // Utility method to check for invalid edge-collapse.
523 const point& newPoint,
524 const point& oldPoint,
525 const label pointIndex,
526 const label cellIndex,
527 dynamicLabelList& cellsChecked,
528 scalar& collapseQuality,
532 // Remove 2D sliver cells from the mesh
533 void remove2DSlivers();
535 // Identify the sliver type in 3D
536 const changeMap identifySliverType(const label cIndex) const;
538 // Remove sliver cells
539 void removeSlivers();
541 // Insert the specified cell to the mesh
545 const scalar lengthScale,
546 const label zoneID = -1
549 // Set fill-in mapping information for a particular cell
553 const labelList& mapCells,
557 // Set fill-in mapping information for a particular face
561 const labelList& mapFaces = labelList(0)
564 // Remove the specified cells from the mesh
568 const labelList& cList,
571 bool checkOnly = false
574 // Remove the specified cell from the mesh
580 // Insert the specified face to the mesh
585 const label newOwner,
586 const label newNeighbour,
587 const labelList& newFaceEdges,
588 const label zoneID = -1
591 // Remove the specified face from the mesh
597 // Split a set of internal faces into boundary faces,
598 // and add them to the specified patch.
599 void splitInternalFaces
601 const label patchIndex,
602 const labelList& internalFaces,
603 const Map<bool>& cellColors
606 // Merge a set of boundary faces into internal
610 const labelList& mergeFaces
613 // Insert the specified edge to the mesh
618 const labelList& edgeFaces
621 // Remove the specified edge from the mesh
627 // Insert the specified point to the mesh
630 const point& newPoint,
631 const point& oldPoint,
632 const labelList& mapPoints,
633 const label zoneID = -1
636 // Remove the specified point from the mesh
642 // Utility method to build vertexHull for an edge [3D]
646 labelList& vertexHull,
647 const label checkIndex = 0
650 // Utility to check whether points of an edge lie on a boundary
651 const FixedList<bool,2> checkEdgeBoundary(const label eIndex) const;
653 // Set a particular face index as flipped.
654 inline void setFlip(const label fIndex);
656 // Utility method to compute the minimum quality of a vertex hull
657 scalar computeMinQuality
660 labelList& hullVertices
663 // Compute minQuality given addressing
664 scalar computeMinQuality
666 const edge& edgeToCheck,
667 const labelList& hullVertices,
668 const UList<point>& points,
669 bool closedRing = false
672 // Utility method to compute the quality of a vertex hull
673 // around an edge after bisection.
674 scalar computeBisectionQuality(const label eIndex) const;
676 // Check whether the given edge is on a bounding curve
677 bool checkBoundingCurve
680 const bool overRidePurityCheck = false,
681 label* nProcCurves = NULL
684 // Allocate dynamic programming tables
688 PtrList<scalarListList>& Q,
689 PtrList<labelListList>& K,
690 PtrList<labelListList>& triangulations,
691 const label checkIndex = -1
694 // Check triangulation quality for an edge index
699 const PtrList<scalarListList>& Q,
700 const scalar minQuality,
701 const label checkIndex = 0
704 // Utility method to fill the dynamic programming tables
710 labelList& hullVertices,
711 PtrList<scalarListList>& Q,
712 PtrList<labelListList>& K,
713 PtrList<labelListList>& triangulations,
714 const label checkIndex = 0
717 // Fill tables given addressing
720 const edge& edgeToCheck,
721 const scalar minQuality,
723 const labelList& hullVertices,
724 const UList<point>& points,
727 labelListList& triangulations
730 // Print out tables for debugging
734 const PtrList<scalarListList>& Q,
735 const PtrList<labelListList>& K,
736 const label checkIndex = 0
739 // Remove the edge according to the swap sequence
744 const scalar minQuality,
745 const labelList& hullVertices,
746 PtrList<scalarListList>& Q,
747 PtrList<labelListList>& K,
748 PtrList<labelListList>& triangulations,
749 const label checkIndex = 0
752 // Extract triangulations from the programming table
753 void extractTriangulation
757 const labelListList& K,
758 label& numTriangulations,
759 labelListList& triangulations
762 // Identify the 3-2 swap from the triangulation sequence
766 const labelList& hullVertices,
767 const labelListList& triangulations,
771 // Check old-volumes for the configuration.
772 bool checkTriangulationVolumes
775 const labelList& hullVertices,
776 const labelListList& triangulations
779 // Routine to check whether the triangulation at the
780 // index lies on the boundary of the vertex ring.
781 bool boundaryTriangulation
784 label& isolatedVertex,
785 labelListList& triangulations
788 // Routine to perform 2-3 swaps
792 const label isolatedVertex,
794 const label triangulationIndex,
795 const label numTriangulations,
796 const labelListList& triangulations,
797 const labelList& hullVertices,
798 const labelList& hullFaces,
799 const labelList& hullCells
802 // Routine to perform 3-2 or 2-2 swaps
807 const label triangulationIndex,
808 const label numTriangulations,
809 const labelListList& triangulations,
810 const labelList& hullVertices,
811 const labelList& hullFaces,
812 const labelList& hullCells
815 // Reorder points after a topology change
819 pointField& preMotionPoints,
820 labelListList& pointZoneMap,
821 bool threaded = false
824 // Static equivalent for multi-threading
825 static void reOrderPointsThread(void *argument);
827 // Reorder edges after a topology change
831 labelListList& edgeFaces,
832 labelListList& faceEdges,
833 bool threaded = false
836 // Static equivalent for multi-threading
837 static void reOrderEdgesThread(void *argument);
839 // Reorder faces in upper-triangular order after a topology change
844 labelList& neighbour,
845 labelListList& faceEdges,
846 labelListList& faceZoneFaceMap,
847 bool threaded = false
850 // Static equivalent for multi-threading
851 static void reOrderFacesThread(void *argument);
853 // Reorder & renumber cells with bandwidth
854 // reduction after a topology change
857 labelListList& cellZoneMap,
858 bool threaded = false
861 // Static equivalent for multi-threading
862 static void reOrderCellsThread(void *argument);
864 // Reorder the mesh in upper-triangular order,
865 // and generate mapping information
869 pointField& preMotionPoints,
873 labelList& neighbour,
874 labelListList& faceEdges,
875 labelListList& edgeFaces,
876 labelListList& pointZoneMap,
877 labelListList& faceZoneFaceMap,
878 labelListList& cellZoneMap
881 // Invoke reOrdering with multiple threads
882 void threadedMeshReOrdering
885 pointField& preMotionPoints,
889 labelList& neighbour,
890 labelListList& faceEdges,
891 labelListList& edgeFaces,
892 labelListList& pointZoneMap,
893 labelListList& faceZoneFaceMap,
894 labelListList& cellZoneMap
897 // Reset the mesh and generate mapping information
900 // Write out connectivity for an edge
901 void writeEdgeConnectivity(const label eIndex) const;
903 // Output an entity as a VTK file
908 const label primitiveType = 3,
909 const bool useOldConnectivity = false,
910 const bool useOldPoints = false
913 // Output a list of entities as a VTK file
917 const labelList& cList,
918 const label primitiveType = 3,
919 const bool useOldConnectivity = false,
920 const bool useOldPoints = false,
921 const UList<scalar>& scalField = UList<scalar>(),
922 const UList<label>& lablField = UList<label>()
925 // Return the status report interval
926 scalar reportInterval() const;
928 // Check the state of local connectivity lists
929 void checkConnectivity(const label maxErrors = 0) const;
931 // Handle mesh slicing events.
932 void handleMeshSlicing();
934 // Handle layer addition / removal events
935 void handleLayerAdditionRemoval();
937 // Add cell layer above specified patch
938 const changeMap addCellLayer(const label patchID);
940 // Remove cell layer above specified patch
941 const changeMap removeCellLayer(const label patchID);
943 // Test an edge / face for proximity with other non-neighbouring faces.
944 // Return the scalar distance to the nearest face.
951 // Calculate the edge length-scale for the mesh
952 void calculateLengthScale(bool dump = false);
954 // Fill buffers with length-scale info
955 // and exchange across processors.
956 void exchangeLengthBuffers();
958 // Implementing the fillTables operation for coupled edges
959 bool coupledFillTables
964 PtrList<scalarListList>& Q,
965 PtrList<labelListList>& K,
966 PtrList<labelListList>& triangulations
969 // Initialize coupled weights calculation
970 void initCoupledWeights();
972 // Additional mapping contributions for coupled entities
973 void computeCoupledWeights
976 const label dimension,
978 scalarField& weights,
979 vectorField& centres,
983 // Fetch length-scale info for processor entities
984 scalar processorLengthScale(const label index) const;
986 // Method to determine whether the master entity is locally coupled
987 bool locallyCoupledEntity
990 bool checkSlaves = false,
991 bool checkProcs = true,
992 bool checkFace = false
995 // Method to determine the locally coupled patch index
996 label locallyCoupledEdgePatch(const label eIndex) const;
998 // Method to determine if the entity is on a processor boundary
999 bool processorCoupledEntity
1002 bool checkFace = false,
1003 bool checkEdge = false,
1004 bool checkPure = false,
1005 FixedList<label, 2>* patchLabels = NULL,
1006 FixedList<vector, 2>* patchNormals = NULL
1009 // Read optional dictionary parameters
1010 void readOptionalParameters(bool reRead = false);
1012 // Execute load balancing operations on the mesh
1013 void executeLoadBalancing(dictionary& balanceDict);
1015 // Identify coupled patches.
1016 bool identifyCoupledPatches();
1018 // Read coupled patch information from dictionary.
1019 void readCoupledPatches();
1021 // Initialize coupled patch connectivity for topology modifications.
1022 static void initCoupledConnectivity(void *argument);
1024 // Move coupled subMesh points
1025 void moveCoupledSubMeshes();
1027 // Build a list of entities that need to be avoided
1028 // by regular topo-changes.
1029 void buildEntitiesToAvoid
1031 labelHashSet& entities,
1035 // Check whether the specified edge is a coupled master edge.
1036 bool isCoupledMaster(const label eIndex) const;
1038 // Set coupled modification
1039 void setCoupledModification() const;
1041 // Unset coupled modification
1042 void unsetCoupledModification() const;
1044 // Insert the cells around the coupled master entity to the mesh
1045 const changeMap insertCells(const label mIndex);
1047 // Handle topology changes for coupled patches
1048 void handleCoupledPatches(labelHashSet& entities);
1050 // Synchronize topology operations across processors
1051 void syncCoupledPatches(labelHashSet& entities);
1053 // Check the state of coupled boundaries
1054 bool checkCoupledBoundaries(bool report = true) const;
1056 // Build patch sub-meshes for processor patches
1057 void buildProcessorPatchMeshes();
1059 // Build patch sub-mesh for a specified processor
1060 void buildProcessorPatchMesh
1062 coupledMesh& subMesh,
1063 Map<labelList>& commonCells
1066 // Build coupled maps for locally coupled patches
1067 void buildLocalCoupledMaps();
1069 // Build coupled maps for coupled processor patches
1070 void buildProcessorCoupledMaps();
1072 // Introduce a new processor patch to the mesh
1073 label createProcessorPatch(const label proc);
1075 // If a patch is of processor type,
1076 // get the neighbouring processor ID
1077 label getNeighbourProcessor(const label patch) const;
1079 // If the number of patches have changed during run-time,
1080 // reset boundaries with new processor patches
1081 void resetBoundaries();
1083 // Initialize subMesh field transfers for mapping
1084 void initFieldTransfers
1086 wordList& fieldTypes,
1087 List<wordList>& fieldNames,
1088 List<List<char> >& sendBuffer,
1089 List<List<char> >& recvBuffer
1092 // Synchronize field transfers for mapping
1093 void syncFieldTransfers
1095 wordList& fieldTypes,
1096 List<wordList>& fieldNames,
1097 List<List<char> >& recvBuffer
1100 // Initialize coupled boundary ordering
1101 void initCoupledBoundaryOrdering
1103 List<pointField>& centres,
1104 List<pointField>& anchors
1107 // Synchronize coupled boundary ordering
1108 bool syncCoupledBoundaryOrdering
1110 List<pointField>& centres,
1111 List<pointField>& anchors,
1112 labelListList& faceMaps,
1113 labelListList& rotations
1116 // Set processor rank priority
1117 void initProcessorPriority();
1119 // Check for processor priority
1120 template <class BinaryOp>
1121 inline bool priority
1124 const BinaryOp& bop,
1128 // Dump cell-quality statistics
1129 bool meshQuality(bool outputOption);
1133 //- Runtime type information
1134 TypeName("dynamicTopoFvMesh");
1138 //- Construct from existing IOobject
1139 explicit dynamicTopoFvMesh(const IOobject& io);
1143 virtual ~dynamicTopoFvMesh();
1147 // Return custom lduAddressing
1148 virtual const lduAddressing& lduAddr() const;
1150 // Update mesh corresponding to the given map
1151 virtual void updateMesh(const mapPolyMesh& mpm);
1153 // Map all fields in time using a customized mapper
1154 virtual void mapFields(const mapPolyMesh& mpm) const;
1156 // Update the mesh for motion / topology changes
1157 // - Return true if topology changes have occurred
1158 virtual bool update();
1162 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1164 } // End namespace Foam
1166 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1168 #include "dynamicTopoFvMeshI.H"
1170 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
1174 // ************************************************************************* //