Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / mesh / cfMesh / utilities / meshes / polyMeshGenModifier / polyMeshGenModifier.H
blobda22fa2f48be040dd37a2d2f29023eea3a1ec46b
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | cfMesh: A library for mesh generation
4    \\    /   O peration     |
5     \\  /    A nd           | Author: Franjo Juretic (franjo.juretic@c-fields.com)
6      \\/     M anipulation  | Copyright (C) Creative Fields, Ltd.
7 -------------------------------------------------------------------------------
8 License
9     This file is part of cfMesh.
11     cfMesh 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     cfMesh 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
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with cfMesh.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     polyMeshGenModifier
27 Description
28     Modifier for polyMeshGen
30 SourceFiles
31     polyMeshGenModifier.C
33 \*---------------------------------------------------------------------------*/
35 #ifndef polyMeshGenModifier_H
36 #define polyMeshGenModifier_H
38 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
40 #include "polyMeshGen.H"
41 #include "boolList.H"
42 #include "VRWGraph.H"
43 #include "demandDrivenData.H"
45 namespace Foam
48 // Forward declarations
49 class VRWGraphList;
51 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
53 class polyMeshGenModifier
55     // Private data
56         //- reference to the mesh
57         polyMeshGen& mesh_;
59         //- helper data for adding cells
60         VRWGraph* pointFacesPtr_;
62     // Private member functions
63         //- calculate and return point faces
64         inline void calculatePointFaces()
65         {
66             const faceListPMG& faces = mesh_.faces();
68             pointFacesPtr_ = new VRWGraph();
69             VRWGraph& pointFaces = *pointFacesPtr_;
71             pointFaces.reverseAddressing(mesh_.points().size(), faces);
72         };
74         //- re-order positions of processor boundary faces
75         //- they should comea immediately after the internal faces
76         void reorderProcBoundaryFaces();
78 protected:
80         VRWGraph& pointFaces()
81         {
82             if( !pointFacesPtr_ )
83                 calculatePointFaces();
85             return *pointFacesPtr_;
86         };
88 public:
90     // Constructors
91         //- Construct from the reference to the mesh
92         polyMeshGenModifier(polyMeshGen& mesh)
93         :
94             mesh_(mesh),
95             pointFacesPtr_(NULL)
96         {
97             //mesh_.clearOut();
98         };
100     // Destructor
101         ~polyMeshGenModifier()
102         {
103             this->clearOut();
104         };
106     // Member functions
107         //- access to mesh points
108         inline pointFieldPMG& pointsAccess()
109         {
110             return mesh_.points_;
111         };
113         //- access to mesh faces
114         inline faceListPMG& facesAccess()
115         {
116             return mesh_.faces_;
117         };
119         //- access to cells
120         inline cellListPMG& cellsAccess()
121         {
122             return mesh_.cells_;
123         };
125         //- access to processor boundary data
126         inline PtrList<processorBoundaryPatch>& procBoundariesAccess()
127         {
128             return mesh_.procBoundaries_;
129         }
131         //- access to boundary data
132         inline PtrList<boundaryPatch>& boundariesAccess()
133         {
134             return mesh_.boundaries_;
135         }
137         //- functions which change the mesh
138         //- reorder boundary faces
139         void reorderBoundaryFaces();
141         //- remove unused vertices
142         void removeUnusedVertices();
144         //- remove faces
145         void removeFaces(const boolList& removeFace);
147         //- remove duplicate faces from the mesh
148         void removeDuplicateFaces();
150         //- remove cells
151         void removeCells
152         (
153             const boolList& removeCell,
154             const bool removeProcFaces = true
155         );
157         //- add cells (vertices must be added)
158         void addCells(const LongList<faceList>& cellFaces);
159         void addCells(const VRWGraphList& cellFaces);
160         void addCell(const faceList& cellFaces);
162         //- replace the boundary with new boundary faces
163         void replaceBoundary
164         (
165             const wordList& patchNames,
166             const VRWGraph& boundaryFaces,
167             const labelLongList& faceOwners,
168             const labelLongList& facePatches
169         );
171         //- add additional faces into processor patches
172         void addProcessorFaces
173         (
174             const VRWGraph& procFaces,
175             const labelLongList& facePatches
176         );
178         //- add new processor patch and return its label
179         label addProcessorPatch(const label otherProcLabel);
181         //- remove empty processor patch
182         bool removeEmptyProcessorPatches();
184         //- add buffer cells needed for exporting the mesh in the format
185         //- required by some solvers
186         void addBufferCells();
188         //- zip up topologically open cells
189         void zipUpCells();
191         //- reorder the cells and faces to reduce the matrix bandwidth
192         void renumberMesh();
194         //- clear out unnecessary data (pointFacesPtr_);
195         inline void clearOut()
196         {
197             deleteDemandDrivenData(pointFacesPtr_);
198         }
200         //- clear out all allocated data
201         inline void clearAll()
202         {
203             clearOut();
204             mesh_.clearOut();
205         }
208 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
210 } // End namespace Foam
212 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
214 #endif
216 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //