Adding cfMesh-v1.0 into the repository
[foam-extend-3.2.git] / src / meshLibrary / utilities / surfaceTools / meshSurfaceMapper / meshSurfaceMapper.H
blob433c73b667f2c416b050811e10543d8704b7af67
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     meshSurfaceMapper
27 Description
28     Maps vertices to the nearest point on the geometry surface
30 SourceFiles
31     meshSurfaceMapper.C
33 \*---------------------------------------------------------------------------*/
35 #ifndef meshSurfaceMapper_H
36 #define meshSurfaceMapper_H
38 #include "labelList.H"
39 #include "pointField.H"
40 #include "labelLongList.H"
41 #include "parMapperHelper.H"
43 #include <map>
45 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
47 namespace Foam
50 // Forward declarations
51 class meshOctree;
52 class meshSurfaceEngine;
53 class meshSurfacePartitioner;
54 class triSurfacePartitioner;
56 /*---------------------------------------------------------------------------*\
57                     Class meshSurfaceMapper Declaration
58 \*---------------------------------------------------------------------------*/
60 class meshSurfaceMapper
62     // Private data
63         //- mesh surface
64         const meshSurfaceEngine& surfaceEngine_;
66         //- reference to the octree
67         const meshOctree& meshOctree_;
68     
69         //- mesh surface partitioner
70         mutable const meshSurfacePartitioner* surfaceEnginePartitionerPtr_;
71         const bool deletePartitioner_;
72     
73         //- triSurface partitioner
74         mutable triSurfacePartitioner* surfPartitionerPtr_;
75     
76     // Private member functions
77         //- create and return mesh surface partitioner
78         void createMeshSurfacePartitioner() const;
79         inline const meshSurfacePartitioner& meshPartitioner() const
80         {
81             if( !surfaceEnginePartitionerPtr_ )
82                 createMeshSurfacePartitioner();
83             
84             return *surfaceEnginePartitionerPtr_;
85         }
86         
87         //- create and return triSurfacePartitioner
88         void createTriSurfacePartitioner() const;
89         inline const triSurfacePartitioner& surfacePartitioner() const
90         {
91             if( !surfPartitionerPtr_ )
92                 createTriSurfacePartitioner();
93             
94             return *surfPartitionerPtr_;
95         }
96         
97         //- delete surfaceEnginePartitionerPtr_ and surfPartitionerPtr_
98         void clearOut();
99         
100     // Private member functions
101         //- map corner nodes to the boundary
102         void mapCorners(const labelLongList& nodesToMap);
103         
104         //- find mapping distance for selected points
105         void findMappingDistance
106         (
107             const labelLongList& nodesToMap,
108             std::map<label, scalar>& mappingDistance
109         ) const;
110         
111     // Private member functions needed for parallel execution
112         
113         //- check if nodes at parallel boundaries are selected at all processors
114         void selectNodesAtParallelBnd(const labelLongList&);
116         //- map to the smallest distance
117         //- makes sense for parallel calculations, only
118         void mapToSmallestDistance(LongList<parMapperHelper>&);
119         
120         //- Disallow default bitwise copy construct
121         meshSurfaceMapper(const meshSurfaceMapper&);
123         //- Disallow default bitwise assignment
124         void operator=(const meshSurfaceMapper&);
126 public:
128     // Constructors
130         //- Construct from meshSurfaceEngine and octree
131         meshSurfaceMapper(const meshSurfaceEngine&, const meshOctree&);
133         //- Construct from meshSurfacePartitioner and octree
134         meshSurfaceMapper(const meshSurfacePartitioner&, const meshOctree&);
136     // Destructor
138         ~meshSurfaceMapper();
140     // Member Functions
141         //- map the given surface node on the selected patch
142         //- this does not make sense for vertices at parallel boundaries
143         void mapNodeToPatch(const label bpI, const label patchI = -1);
144         
145         //- projects surface vertices onto their nearest location
146         //- on the surface mesh
147         void mapVerticesOntoSurface();
148         
149         //- projects selected surface vertices to their nearest location
150         //- on the surface mesh
151         void mapVerticesOntoSurface(const labelLongList& nodesToMap);
152         
153         //- projects corner and edge vertices onto their nearest location
154         //- on the surface mesh
155         void mapCornersAndEdges();
156         
157         //- projects selected edge vertices onto their nearest
158         //- locations on the surface mesh
159         void mapEdgeNodes(const labelLongList& nodesToMap);
160         
161         //- projects surface vertices onto the surface with respect
162         //- to the surface patch they belong to. Edges and corner are respected
163         void mapVerticesOntoSurfacePatches();
164         
165         //- projects selected surface vertices onto the surface with respect
166         //- to the surface patch they belong to. Edges and corner are respected
167         void mapVerticesOntoSurfacePatches(const labelLongList& nodesToMap);
168         
169         //- a combination of mapping and smoothing intended for better
170         //- feature capturing
171         void preMapVertices(const label nIterations = 2);
174 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
176 } // End namespace Foam
178 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
180 #endif
182 // ************************************************************************* //