BUG: UListIO: byteSize overflowing on really big faceLists
[OpenFOAM-2.0.x.git] / src / surfMesh / MeshedSurface / MeshedSurface.H
blob2170781dcfe67ddf4a546b6e1c202e52399e5fd8
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2011 OpenFOAM Foundation
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::MeshedSurface
27 Description
28     A surface geometry mesh with zone information, not to be confused with
29     the similarly named surfaceMesh, which actually refers to the cell faces
30     of a volume mesh.
32     A MeshedSurface can have zero or more surface zones (roughly equivalent
33     to faceZones for a polyMesh). If surface zones are defined, they must
34     be contiguous and cover all of the faces.
36     The MeshedSurface is intended for surfaces from a variety of sources.
37     - A set of points and faces without any surface zone information.
38     - A set of points and faces with randomly ordered zone information.
39       This could arise, for example, from reading external file formats
40       such as STL, etc.
42 SourceFiles
43     MeshedSurface.C
45 \*---------------------------------------------------------------------------*/
47 #ifndef MeshedSurface_H
48 #define MeshedSurface_H
50 #include "PrimitivePatch.H"
51 #include "PatchTools.H"
52 #include "pointField.H"
53 #include "face.H"
54 #include "triFace.H"
56 #include "surfZoneList.H"
57 #include "surfaceFormatsCore.H"
58 #include "runTimeSelectionTables.H"
59 #include "memberFunctionSelectionTables.H"
60 #include "HashSet.H"
62 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
64 namespace Foam
67 // Forward declaration of friend functions and operators
69 class Time;
70 class surfMesh;
71 class polyBoundaryMesh;
73 template<class Face> class MeshedSurface;
74 template<class Face> class MeshedSurfaceProxy;
75 template<class Face> class UnsortedMeshedSurface;
77 /*---------------------------------------------------------------------------*\
78                       Class MeshedSurface Declaration
79 \*---------------------------------------------------------------------------*/
81 template<class Face>
82 class MeshedSurface
84     public PrimitivePatch<Face, ::Foam::List, pointField, point>,
85     public fileFormats::surfaceFormatsCore
87     // friends - despite different face representationsx
88     template<class Face2> friend class MeshedSurface;
89     template<class Face2> friend class UnsortedMeshedSurface;
90     friend class surfMesh;
93 private:
95     // Private typedefs for convenience
97         typedef PrimitivePatch
98         <
99             Face,
100             ::Foam::List,
101             pointField,
102             point
103         >
104         ParentType;
106         typedef UnsortedMeshedSurface<Face>  FriendType;
107         typedef MeshedSurfaceProxy<Face>     ProxyType;
110     // Private Member Data
112         //- Zone information
113         // (face ordering nFaces/startFace only used during reading/writing)
114         List<surfZone> zones_;
117 protected:
119     // Protected Member functions
121         //- Transfer points/zones and transcribe face -> triFace
122         void transcribe(MeshedSurface<face>&);
124         //- basic sanity check on zones
125         void checkZones();
127         //- Non-const access to global points
128         pointField& storedPoints()
129         {
130             return const_cast<pointField&>(ParentType::points());
131         }
133         //- Non-const access to the faces
134         List<Face>& storedFaces()
135         {
136             return static_cast<List<Face> &>(*this);
137         }
139         //- Non-const access to the zones
140         surfZoneList& storedZones()
141         {
142             return zones_;
143         }
145         //- sort faces by zones and store sorted faces
146         void sortFacesAndStore
147         (
148             const Xfer<List<Face> >& unsortedFaces,
149             const Xfer<List<label> >& zoneIds,
150             const bool sorted
151         );
153         //- Set new zones from faceMap
154         virtual void remapFaces(const labelUList& faceMap);
157 public:
159     // Public typedefs
161         //- Face type used
162         typedef Face FaceType;
164         //- Runtime type information
165         ClassName("MeshedSurface");
168     // Static
170         //- Face storage only handles triangulated faces
171         inline static bool isTri();
173         //- Can we read this file format?
174         static bool canRead(const fileName&, const bool verbose=false);
176         //- Can we read this file format?
177         static bool canReadType(const word& ext, const bool verbose=false);
179         //- Can we write this file format?
180         static bool canWriteType(const word& ext, const bool verbose=false);
182         static wordHashSet readTypes();
183         static wordHashSet writeTypes();
186     // Constructors
188         //- Construct null
189         MeshedSurface();
191         //- Construct by transferring components (points, faces, zones).
192         MeshedSurface
193         (
194             const Xfer<pointField>&,
195             const Xfer<List<Face> >&,
196             const Xfer<surfZoneList>&
197         );
199         //- Construct by transferring components (points, faces).
200         //  Use zone information if available
201         MeshedSurface
202         (
203             const Xfer<pointField>&,
204             const Xfer<List<Face> >&,
205             const labelUList& zoneSizes = labelUList(),
206             const UList<word>& zoneNames = UList<word>()
207         );
209         //- Construct as copy
210         MeshedSurface(const MeshedSurface&);
212         //- Construct from a UnsortedMeshedSurface
213         MeshedSurface(const UnsortedMeshedSurface<Face>&);
215         //- Construct from a boundary mesh with local points/faces
216         MeshedSurface
217         (
218             const polyBoundaryMesh&,
219             const bool globalPoints=false
220         );
222         //- Construct from a surfMesh
223         MeshedSurface(const surfMesh&);
225         //- Construct by transferring the contents from a UnsortedMeshedSurface
226         MeshedSurface(const Xfer<UnsortedMeshedSurface<Face> >&);
228         //- Construct by transferring the contents from a MeshedSurface
229         MeshedSurface(const Xfer<MeshedSurface<Face> >&);
231         //- Construct from file name (uses extension to determine type)
232         MeshedSurface(const fileName&);
234         //- Construct from file name (uses extension to determine type)
235         MeshedSurface(const fileName&, const word& ext);
237         //- Construct from database
238         MeshedSurface(const Time&, const word& surfName="");
241     // Declare run-time constructor selection table
243         declareRunTimeSelectionTable
244         (
245             autoPtr,
246             MeshedSurface,
247             fileExtension,
248             (
249                 const fileName& name
250             ),
251             (name)
252         );
255     // Selectors
257         //- Select constructed from filename (explicit extension)
258         static autoPtr<MeshedSurface> New
259         (
260             const fileName&,
261             const word& ext
262         );
264         //- Select constructed from filename (implicit extension)
265         static autoPtr<MeshedSurface> New(const fileName&);
268     //- Destructor
269     virtual ~MeshedSurface();
272     // Member Function Selectors
274         declareMemberFunctionSelectionTable
275         (
276             void,
277             UnsortedMeshedSurface,
278             write,
279             fileExtension,
280             (
281                 const fileName& name,
282                 const MeshedSurface<Face>& surf
283             ),
284             (name, surf)
285         );
287         //- Write to file
288         static void write(const fileName&, const MeshedSurface<Face>&);
291     // Member Functions
293         // Access
295             //- The surface size is the number of faces
296             label size() const
297             {
298                 return ParentType::size();
299             }
301             //- Return const access to the faces
302             inline const List<Face>& faces() const
303             {
304                 return static_cast<const List<Face> &>(*this);
305             }
307             //- Const access to the surface zones.
308             //  If zones are defined, they must be contiguous and cover the
309             //  entire surface
310             const List<surfZone>& surfZones() const
311             {
312                 return zones_;
313             }
315             //- Add surface zones
316             virtual void addZones
317             (
318                 const UList<surfZone>&,
319                 const bool cullEmpty=false
320             );
322             //- Add surface zones
323             virtual void addZones
324             (
325                 const labelUList& sizes,
326                 const UList<word>& names,
327                 const bool cullEmpty=false
328             );
330             //- Add surface zones
331             virtual void addZones
332             (
333                 const labelUList& sizes,
334                 const bool cullEmpty=false
335             );
337             //- Remove surface zones
338             virtual void removeZones();
341         // Edit
343             //- Clear all storage
344             virtual void clear();
346             //- Move points
347             virtual void movePoints(const pointField&);
349             //- Scale points. A non-positive factor is ignored
350             virtual void scalePoints(const scalar);
352             //- Reset primitive data (points, faces and zones)
353             //  Note, optimized to avoid overwriting data (with Xfer::null)
354             virtual void reset
355             (
356                 const Xfer<pointField >& points,
357                 const Xfer<List<Face> >& faces,
358                 const Xfer<surfZoneList>& zones
359             );
361             //- Reset primitive data (points, faces and zones)
362             //  Note, optimized to avoid overwriting data (with Xfer::null)
363             virtual void reset
364             (
365                 const Xfer<List<point> >& points,
366                 const Xfer<List<Face> >& faces,
367                 const Xfer<surfZoneList >& zones
368             );
370             //- Remove invalid faces
371             virtual void cleanup(const bool verbose);
373             virtual bool stitchFaces
374             (
375                 const scalar tol=SMALL,
376                 const bool verbose=false
377             );
379             virtual bool checkFaces
380             (
381                 const bool verbose=false
382             );
384             //- Triangulate in-place, returning the number of triangles added
385             virtual label triangulate();
387             //- Triangulate in-place, returning the number of triangles added
388             //  and setting a map of original face Ids.
389             //  The faceMap is zero-sized when no triangulation was done.
390             virtual label triangulate(List<label>& faceMap);
393             //- Return new surface.
394             //  Returns return pointMap, faceMap from subsetMeshMap
395             MeshedSurface subsetMesh
396             (
397                 const labelHashSet& include,
398                 labelList& pointMap,
399                 labelList& faceMap
400             ) const;
402             //- Return new surface.
403             MeshedSurface subsetMesh
404             (
405                 const labelHashSet& include
406             ) const;
408             //- Transfer the contents of the argument and annul the argument
409             void transfer(MeshedSurface<Face>&);
411             //- Transfer the contents of the argument and annul the argument
412             void transfer(UnsortedMeshedSurface<Face>&);
414             //- Transfer contents to the Xfer container
415             Xfer<MeshedSurface<Face> > xfer();
418         // Read
420             //- Read from file. Chooses reader based on explicit extension
421             bool read(const fileName&, const word& ext);
423             //- Read from file. Chooses reader based on detected extension
424             virtual bool read(const fileName&);
427         // Write
429             void writeStats(Ostream& os) const;
431             //- Generic write routine. Chooses writer based on extension.
432             virtual void write(const fileName& name) const
433             {
434                 write(name, *this);
435             }
437             //- Write to database
438             void write(const Time&, const word& surfName="") const;
441     // Member operators
443         void operator=(const MeshedSurface<Face>&);
445         //- Conversion operator to MeshedSurfaceProxy
446         operator MeshedSurfaceProxy<Face>() const;
450 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
452 //- Specialization for holding triangulated information
453 template<>
454 inline bool MeshedSurface<triFace>::isTri()
456     return true;
460 //- Specialization for holding triangulated information
461 template<>
462 inline label MeshedSurface<triFace>::triangulate()
464     return 0;
468 //- Specialization for holding triangulated information
469 template<>
470 inline label MeshedSurface<triFace>::triangulate(List<label>& faceMap)
472     if (&faceMap)
473     {
474         faceMap.clear();
475     }
477     return 0;
481 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
483 } // End namespace Foam
485 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
487 #ifdef NoRepository
488 #   include "MeshedSurface.C"
489 #endif
491 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
493 #endif
495 // ************************************************************************* //