surfaceRefineRedGreen.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2011-2013 OpenFOAM Foundation
9 Copyright (C) 2020-2021 OpenCFD Ltd.
10-------------------------------------------------------------------------------
11License
12 This file is part of OpenFOAM.
13
14 OpenFOAM is free software: you can redistribute it and/or modify it
15 under the terms of the GNU General Public License as published by
16 the Free Software Foundation, either version 3 of the License, or
17 (at your option) any later version.
18
19 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
20 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
23
24 You should have received a copy of the GNU General Public License
25 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
26
27Application
28 surfaceRefineRedGreen
29
30Group
31 grpSurfaceUtilities
32
33Description
34 Refine by splitting all three edges of triangle ('red' refinement).
35
36 Neighbouring triangles (which are not marked for refinement get split
37 in half ('green' refinement).
38
39 Reference:
40 \verbatim
41 R. Verfuerth, "A review of a posteriori
42 error estimation and adaptive mesh refinement techniques",
43 Wiley-Teubner, 1996)
44 \endverbatim
45
46\*---------------------------------------------------------------------------*/
47
48#include "triSurface.H"
49#include "triSurfaceTools.H"
50#include "argList.H"
51#include "OFstream.H"
52
53using namespace Foam;
54
55
56// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
57
58int main(int argc, char *argv[])
59{
60 argList::addNote
61 (
62 "Refine by splitting all three edges of triangle"
63 );
64 argList::noParallel();
65 argList::addArgument("input", "The input surface file");
66 argList::addArgument("output", "The output surface file");
67 argList::addOption
68 (
69 "steps",
70 "N",
71 "Number of refinement steps (default: 1)"
72 );
73 argList args(argc, argv);
74
75 const auto surfFileName = args.get<fileName>(1);
76 const auto outFileName = args.get<fileName>(2);
77
78 Info<< "Reading surface from " << surfFileName << " ..." << endl;
79
80 triSurface surf(surfFileName);
81
82 Info<< "Original surface:" << nl
83 << " triangles :" << surf.size() << nl
84 << " vertices(used):" << surf.nPoints() << endl;
85
86
87 const label nsteps =
88 args.getCheckOrDefault<label>("steps", 1, labelMinMax::ge(1));
89
90
91 Info<< "Refining " << nsteps << " times" << flush;
92
93 for (label step = 0; step < nsteps; ++step)
94 {
95 Info<< '.' << flush;
96
97 surf = triSurfaceTools::redGreenRefine
98 (
99 surf,
100 identity(surf.size()) // Refine all
101 );
102 }
103 Info<< endl;
104
105 Info<< "Refined surface:" << nl
106 << " triangles :" << surf.size() << nl
107 << " vertices(used):" << surf.nPoints() << endl;
108
109 Info<< nl
110 << "Writing refined surface to " << outFileName << " ..." << endl;
111
112 surf.write(outFileName);
113
114 Info<< "End\n" << endl;
115
116 return 0;
117}
118
119
120// ************************************************************************* //
virtual bool write(const token &tok)=0
Write token to stream or otherwise handle it.
Extract command arguments and options from the supplied argc and argv parameters.
Definition: argList.H:124
T get(const label index) const
Get a value from the argument at index.
Definition: argListI.H:278
T getCheckOrDefault(const word &optName, const T &deflt, const Predicate &pred) const
Definition: argListI.H:470
A class for handling file names.
Definition: fileName.H:76
Triangulated surface description with patch information.
Definition: triSurface.H:79
Namespace for OpenFOAM.
labelList identity(const label len, label start=0)
Return an identity map of the given length with (map[i] == i)
Definition: labelList.C:38
messageStream Info
Information stream (stdout output on master, null elsewhere)
Ostream & endl(Ostream &os)
Add newline and flush stream.
Definition: Ostream.H:372
Ostream & flush(Ostream &os)
Flush stream.
Definition: Ostream.H:364
constexpr char nl
The newline '\n' character (0x0a)
Definition: Ostream.H:53
Foam::argList args(argc, argv)