Forward compatibility: flex
[foam-extend-3.2.git] / applications / utilities / mesh / generation / cfMesh / improveMeshQuality / improveMeshQuality.C
blob55a35d540285466407834812e126f9d4710b043e
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
25     Performs point relocations in the mesh (smoothing) in order to
26     improve quality measures. It does not make the mesh invalied.
28 \*---------------------------------------------------------------------------*/
30 #include "argList.H"
31 #include "objectRegistry.H"
32 #include "foamTime.H"
33 #include "polyMeshGenModifier.H"
34 #include "meshOptimizer.H"
36 using namespace Foam;
38 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
40 int main(int argc, char *argv[])
42     argList::validArgs.clear();
44     argList::validOptions.insert("nLoops", "int");
45     argList::validOptions.insert("nIterations", "int");
46     argList::validOptions.insert("nSurfaceIterations", "int");
47     argList::validOptions.insert("qualityThreshold", "scalar");
48     argList::validOptions.insert("constrainedCellsSet", "word");
50 #   include "setRootCase.H"
51 #   include "createTime.H"
53     //- read the settings
54     label nIterations(50);
55     label nLoops(10);
56     label nSurfaceIterations(2);
57     scalar qualityThreshold(0.1);
59     if( args.options().found("nLoops") )
60     {
61         nLoops = readLabel(IStringStream(args.options()["nLoops"])());
62     }
63     else
64     {
65         Info << "Default number of loops is 10" << endl;
66     }
68     if( args.options().found("nIterations") )
69     {
70         nIterations =
71             readLabel(IStringStream(args.options()["nIterations"])());
72     }
73     else
74     {
75         Info << "Default number of iterations is 50" << endl;
76     }
78     if( args.options().found("nSurfaceIterations") )
79     {
80         nSurfaceIterations =
81             readLabel(IStringStream(args.options()["nSurfaceIterations"])());
82     }
83     else
84     {
85         Info << "Default number of surface iterations is 2" << endl;
86     }
88     if( args.options().found("qualityThreshold") )
89     {
90         qualityThreshold =
91             readScalar(IStringStream(args.options()["qualityThreshold"])());
92     }
93     else
94     {
95         Info << "Using default quality threshold 0.1" << endl;
96     }
98     word constrainedCellSet;
100     if( args.options().found("constrainedCellsSet") )
101     {
102         constrainedCellSet = args.options()["constrainedCellsSet"];
103     }
104     else
105     {
106         Info << "No constraints applied on the smoothing procedure" << endl;
107     }
109     //- load the mesh from disk
110     polyMeshGen pmg(runTime);
111     pmg.read();
113     //- construct the smoother
114     meshOptimizer mOpt(pmg);
116     if( !constrainedCellSet.empty() )
117     {
118         //- lock cells in constrainedCellSet
119         mOpt.lockCellsInSubset(constrainedCellSet);
121         //- find boundary faces which shall be locked
122         labelLongList lockedBndFaces, selectedCells;
124         const label sId = pmg.cellSubsetIndex(constrainedCellSet);
125         pmg.cellsInSubset(sId, selectedCells);
127         boolList activeCell(pmg.cells().size(), false);
128         forAll(selectedCells, i)
129             activeCell[selectedCells[i]] = true;
130     }
132     //- clear geometry information before volume smoothing
133     pmg.clearAddressingData();
135     //- perform optimisation using the laplace smoother and
136     mOpt.optimizeMeshFV
137     (
138         nLoops,
139         nLoops,
140         nIterations,
141         nSurfaceIterations
142     );
144     //- perform optimisation of worst quality faces
145     mOpt.optimizeMeshFVBestQuality(nLoops, qualityThreshold);
147     //- check the mesh again and untangl bad regions if any of them exist
148     mOpt.untangleMeshFV(nLoops, nIterations, nSurfaceIterations);
150     Info << "Writing mesh" << endl;
151     pmg.write();
153     Info << "End\n" << endl;
154     return 0;
157 // ************************************************************************* //