Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / dynamicMesh / meshCut / meshModifiers / meshCutAndRemove / meshCutAndRemove.H
blob8004505eada886efeb83fc19e9ba9f6837d58030
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2010 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
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
13     the Free Software Foundation, either version 3 of the License, or
14     (at your 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
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     Foam::meshCutAndRemove
27 Description
28     like meshCutter but also removes non-anchor side of cell.
30 SourceFiles
31     meshCutAndRemove.C
33 \*---------------------------------------------------------------------------*/
35 #ifndef meshCutAndRemove_H
36 #define meshCutAndRemove_H
38 #include "edgeVertex.H"
39 #include "boolList.H"
40 #include "labelList.H"
41 #include "typeInfo.H"
42 #include "Map.H"
44 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
46 namespace Foam
49 // Forward declaration of classes
50 class Time;
51 class polyTopoChange;
52 class cellCuts;
53 class polyMesh;
54 class face;
55 class mapPolyMesh;
57 /*---------------------------------------------------------------------------*\
58                            Class meshCutAndRemove Declaration
59 \*---------------------------------------------------------------------------*/
61 class meshCutAndRemove
63     public edgeVertex
65     // Private data
67         //- Faces added in last setRefinement. Per split cell label of added
68         //  face
69         Map<label> addedFaces_;
71         //- Points added in last setRefinement. Per split edge label of added
72         //  point
73         HashTable<label, edge, Hash<edge> > addedPoints_;
76     // Private Static Functions
78         // Returns -1 or index in elems1 of first shared element.
79         static label firstCommon(const labelList& lst1, const labelList& lst2);
81         //- Do the elements of edge appear in consecutive order in the list
82         static bool isIn(const edge&, const labelList&);
85     // Private Member Functions
87         //- Returns -1 or the cell in cellLabels that is cut.
88         label findCutCell(const cellCuts&, const labelList&) const;
90         //- Returns first pointI in pointLabels that uses an internal
91         //  face. Used to find point to inflate cell/face from (has to be
92         //  connected to internal face)
93         label findInternalFacePoint(const labelList& pointLabels) const;
95         //- Find point on face that is part of original mesh and that is
96         //  point connected to the patch
97         label findPatchFacePoint(const face& f, const label patchI) const;
99         //- Get new owner and neighbour of face. Checks anchor points to see if
100         // need to get original or added cell.
101         void faceCells
102         (
103             const cellCuts& cuts,
104             const label exposedPatchI,
105             const label faceI,
106             label& own,
107             label& nei,
108             label& patchID
109         ) const;
111         //- Get zone information for face.
112         void getZoneInfo
113         (
114             const label faceI,
115             label& zoneID,
116             bool& zoneFlip
117         ) const;
119         //- Adds a face from point. Flips face if owner>neighbour
120         void addFace
121         (
122             polyTopoChange& meshMod,
123             const label faceI,
124             const label masterPointI,
125             const face& newFace,
126             const label owner,
127             const label neighbour,
128             const label patchID
129         );
131         //- Modifies existing faceI for either new owner/neighbour or
132         //  new face points. Checks if anything changed and flips face
133         //  if owner>neighbour
134         void modFace
135         (
136             polyTopoChange& meshMod,
137             const label faceI,
138             const face& newFace,
139             const label owner,
140             const label neighbour,
141             const label patchID
142         );
144         // Copies face starting from startFp. Jumps cuts. Marks visited
145         // vertices in visited.
146         void copyFace
147         (
148             const face& f,
149             const label startFp,
150             const label endFp,
151             face& newFace
152         ) const;
154         //- Split face along cut into two faces. Faces are in same point
155         //  order as original face (i.e. maintain normal direction)
156         void splitFace
157         (
158             const face& f,
159             const label v0,
160             const label v1,
162             face& f0,
163             face& f1
164         ) const;
166         //- Add cuts of edges to face
167         face addEdgeCutsToFace(const label faceI) const;
169         //- Convert loop of cuts into face.
170         face loopToFace
171         (
172             const label cellI,
173             const labelList& loop
174         ) const;
178         //- Disallow default bitwise copy construct
179         meshCutAndRemove(const meshCutAndRemove&);
181         //- Disallow default bitwise assignment
182         void operator=(const meshCutAndRemove&);
184 public:
186     //- Runtime type information
187     ClassName("meshCutAndRemove");
190     // Constructors
192         //- Construct from mesh
193         meshCutAndRemove(const polyMesh& mesh);
196     // Member Functions
198         // Edit
200             //- Do actual cutting with cut description. Inserts mesh changes
201             //  into meshMod.
202             //  cuts: all loops and topological information
203             //  cutPatch: for every cell that has loop the patch number
204             //  exposedPatch: patch for other exposed faces
205             void setRefinement
206             (
207                 const label exposedPatchI,
208                 const cellCuts& cuts,
209                 const labelList& cutPatch,
210                 polyTopoChange& meshMod
211             );
213             //- Force recalculation of locally stored data on topological change
214             void updateMesh(const mapPolyMesh&);
217         // Access
219             //- Faces added. Per split cell label of added face
220             const Map<label>& addedFaces() const
221             {
222                 return addedFaces_;
223             }
225             //- Points added. Per split edge label of added point.
226             //  (note: fairly useless across topology changes since one of the
227             //  points of the edge will probably disappear)
228             const HashTable<label, edge, Hash<edge> >& addedPoints() const
229             {
230                 return addedPoints_;
231             }
235 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
237 } // End namespace Foam
239 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
241 #endif
243 // ************************************************************************* //