Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / meshTools / searchableSurface / searchableSurfaceCollection.H
blob81ac620a1082ce61ecaf6c1b272e44981e8ddf84
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::searchableSurfaceCollection
27 Description
28     Set of transformed searchableSurfaces. Does not do boolean operations.
29     So when meshing might find parts 'inside'.
31 SourceFiles
32     searchableSurfaceCollection.C
34 \*---------------------------------------------------------------------------*/
36 #ifndef searchableSurfaceCollection_H
37 #define searchableSurfaceCollection_H
39 #include "searchableSurface.H"
40 #include "treeBoundBox.H"
41 #include "coordinateSystem.H"
42 #include "UPtrList.H"
43 #include "Switch.H"
45 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
47 namespace Foam
50 // Forward declaration of classes
52 /*---------------------------------------------------------------------------*\
53                  Class searchableSurfaceCollection Declaration
54 \*---------------------------------------------------------------------------*/
56 class searchableSurfaceCollection
58     public searchableSurface
60 private:
62     // Private Member Data
64         // Per instance data
66             //- instance name
67             wordList instance_;
69             //- scaling vector
70             vectorField scale_;
72             //- transformation
73             PtrList<coordinateSystem> transform_;
75             UPtrList<searchableSurface> subGeom_;
77             Switch mergeSubRegions_;
79             //- offsets for indices coming from different surfaces
80             //  (sized with size() of each surface)
81             labelList indexOffset_;
83         //- Region names
84         mutable wordList regions_;
85         //- From individual regions to collection regions
86         mutable labelList regionOffset_;
89     // Private Member Functions
91         //- Find point nearest to sample. Updates minDistSqr. Sets nearestInfo
92         //  and surface index
93         void findNearest
94         (
95             const pointField& samples,
96             scalarField& minDistSqr,
97             List<pointIndexHit>& nearestInfo,
98             labelList& nearestSurf
99         ) const;
101         //- Sort hits into per-surface bins. Misses are rejected.
102         //  Maintains map back to position
103         void sortHits
104         (
105             const List<pointIndexHit>& info,
106             List<List<pointIndexHit> >& surfInfo,
107             labelListList& infoMap
108         ) const;
111         //- Disallow default bitwise copy construct
112         searchableSurfaceCollection(const searchableSurfaceCollection&);
114         //- Disallow default bitwise assignment
115         void operator=(const searchableSurfaceCollection&);
118 public:
120     //- Runtime type information
121     TypeName("searchableSurfaceCollection");
124     // Constructors
126         //- Construct from dictionary (used by searchableSurface)
127         searchableSurfaceCollection
128         (
129             const IOobject& io,
130             const dictionary& dict
131         );
133     //- Destructor
134     virtual ~searchableSurfaceCollection();
137     // Member Functions
139         //- scaling vector per subsurface
140         const vectorField& scale() const
141         {
142             return scale_;
143         }
145         //- scaling vector per subsurface
146         vectorField& scale()
147         {
148             return scale_;
149         }
151         //- coordinate system per subsurface
152         const PtrList<coordinateSystem>& transform() const
153         {
154             return transform_;
155         }
157         //- coordinate system per subsurface
158         PtrList<coordinateSystem>& transform()
159         {
160             return transform_;
161         }
164         virtual const wordList& regions() const;
166         //- Whether supports volume type below
167         virtual bool hasVolumeType() const
168         {
169             return false;
170         }
172         //- Range of local indices that can be returned.
173         virtual label size() const;
175         //- Get representative set of element coordinates
176         //  Usually the element centres (should be of length size()).
177         virtual pointField coordinates() const;
180         // Multiple point queries.
182             virtual void findNearest
183             (
184                 const pointField& sample,
185                 const scalarField& nearestDistSqr,
186                 List<pointIndexHit>&
187             ) const;
189             virtual void findLine
190             (
191                 const pointField& start,
192                 const pointField& end,
193                 List<pointIndexHit>&
194             ) const;
196             virtual void findLineAny
197             (
198                 const pointField& start,
199                 const pointField& end,
200                 List<pointIndexHit>&
201             ) const;
203             //- Get all intersections in order from start to end.
204             virtual void findLineAll
205             (
206                 const pointField& start,
207                 const pointField& end,
208                 List<List<pointIndexHit> >&
209             ) const;
211             //- From a set of points and indices get the region
212             virtual void getRegion
213             (
214                 const List<pointIndexHit>&,
215                 labelList& region
216             ) const;
218             //- From a set of points and indices get the normal
219             virtual void getNormal
220             (
221                 const List<pointIndexHit>&,
222                 vectorField& normal
223             ) const;
225             //- Determine type (inside/outside/mixed) for point. unknown if
226             //  cannot be determined (e.g. non-manifold surface)
227             virtual void getVolumeType
228             (
229                 const pointField&,
230                 List<volumeType>&
231             ) const;
233         // Other
235             //- Set bounds of surface. Bounds currently set as list of
236             //  bounding boxes. The bounds are hints to the surface as for
237             //  the range of queries it can expect. faceMap/pointMap can be
238             //  set if the surface has done any redistribution.
239             virtual void distribute
240             (
241                 const List<treeBoundBox>&,
242                 const bool keepNonLocal,
243                 autoPtr<mapDistribute>& faceMap,
244                 autoPtr<mapDistribute>& pointMap
245             );
247             //- WIP. Store element-wise field.
248             virtual void setField(const labelList& values);
250             //- WIP. From a set of hits (points and
251             //  indices) get the specified field. Misses do not get set. Return
252             //  empty field if not supported.
253             virtual void getField(const List<pointIndexHit>&, labelList&) const;
255         // regIOobject implementation
257             bool writeData(Ostream&) const
258             {
259                 notImplemented
260                 (
261                     "searchableSurfaceCollection::writeData(Ostream&) const"
262                 );
263                 return false;
264             }
269 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
271 } // End namespace Foam
273 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
275 #endif
277 // ************************************************************************* //