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 / polyMeshGenModifierRemoveCells.C
blob760fc288ff4ed2449f8060d85ebba1e77932e599
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 Description
26 \*---------------------------------------------------------------------------*/
28 #include "polyMeshGenModifier.H"
29 #include "demandDrivenData.H"
31 # ifdef USE_OMP
32 #include <omp.h>
33 # endif
35 namespace Foam
38 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
40 void polyMeshGenModifier::removeCells
42     const boolList& removeCell,
43     const bool removeProcFaces
46     Info << "Removing selected cells from the mesh" << endl;
48     //mesh_.clearOut();
50     faceListPMG& faces = mesh_.faces_;
51     cellListPMG& cells = mesh_.cells_;
53     if( removeCell.size() != cells.size() )
54     {
55         Info << "Size of cells " << cells.size() << endl;
56         Info << "Size of list for removal " << removeCell.size() << endl;
57         FatalErrorIn
58         (
59             "void polyMeshGenModifier::removeCells(const boolList& removeCell)"
60         ) << "Incorrect number of entries in removeCell list!"
61             << abort(FatalError);
62     }
64     //- flip internal faces which will become boundary ones
65     const labelList& owner = mesh_.owner();
66     const labelList& neighbour = mesh_.neighbour();
68     # ifdef USE_OMP
69     # pragma omp parallel for schedule(dynamic, 40)
70     # endif
71     forAll(faces, faceI)
72     {
73         if( neighbour[faceI] == -1 )
74         {
75             faceI = faces.size();
76             continue;
77         }
79         if( removeCell[owner[faceI]] && !removeCell[neighbour[faceI]] )
80             faces[faceI] = faces[faceI].reverseFace();
81     }
83     mesh_.clearOut();
85     //- remove unwanted cells
86     label nCells(0);
87     labelLongList newCellLabel(cells.size(), -1);
88     forAll(newCellLabel, cellI)
89         if( !removeCell[cellI] )
90             newCellLabel[cellI] = nCells++;
92     forAll(cells, cellI)
93         if( (newCellLabel[cellI] != -1) && (newCellLabel[cellI] < cellI) )
94         {
95             cells[newCellLabel[cellI]].transfer(cells[cellI]);
96         }
98     cells.setSize(nCells);
100     //- update cell subsets in the mesh
101     mesh_.updateCellSubsets(newCellLabel);
103     reduce(nCells, sumOp<label>());
104     Info << "New cells size " << nCells << endl;
106     //- reorder positions of boundary faces
107     //- this outs the newly-created bnd faces at the end of the list
108     this->reorderBoundaryFaces();
110     mesh_.clearOut();
111     //- remove unused faces
112     boolList removeFace(faces.size(), true);
114     # ifdef USE_OMP
115     # pragma omp parallel if( cells.size() > 1000 )
116     # endif
117     {
118         # ifdef USE_OMP
119         # pragma omp for schedule(dynamic, 40)
120         # endif
121         forAll(cells, cellI)
122         {
123             const cell& c = cells[cellI];
125             forAll(c, fI)
126                 removeFace[c[fI]] = false;
127         }
129         if( Pstream::parRun() && !removeProcFaces )
130         {
131             const PtrList<processorBoundaryPatch>& procBoundaries =
132                 mesh_.procBoundaries_;
134             # ifdef USE_OMP
135             # pragma omp for
136             # endif
137             for(label fI=procBoundaries[0].patchStart();fI<faces.size();++fI)
138                 removeFace[fI] = false;
139         }
140     }
142     mesh_.clearOut();
144     this->removeFaces(removeFace);
146     Info << "Finished removing selected cells from the mesh" << endl;
149 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
151 } // End namespace Foam
153 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //