ENH: patchCloud: return pTraits<Type>::max for unfound points
[OpenFOAM-1.7.x.git] / src / sampling / cuttingPlane / cuttingPlane.H
blobd485c2443f01856685ea7df922b17bd860367abd
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-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::cuttingPlane
27 Description
28     Constructs plane through mesh.
30     No attempt at resolving degenerate cases. Since the cut faces are
31     usually quite ugly, they will always be triangulated.
33 Note
34     When the cutting plane coincides with a mesh face, the cell edge on the
35     positive side of the plane is taken.
37 SourceFiles
38     cuttingPlane.C
40 \*---------------------------------------------------------------------------*/
42 #ifndef cuttingPlane_H
43 #define cuttingPlane_H
45 #include "plane.H"
46 #include "pointField.H"
47 #include "faceList.H"
48 #include "MeshedSurface.H"
50 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
52 namespace Foam
55 class primitiveMesh;
57 /*---------------------------------------------------------------------------*\
58                        Class cuttingPlane Declaration
59 \*---------------------------------------------------------------------------*/
61 class cuttingPlane
63     public plane,
64     public MeshedSurface<face>
66     //- Private typedefs for convenience
67         typedef MeshedSurface<face> MeshStorage;
69     // Private data
71         //- List of cells cut by the plane
72         labelList cutCells_;
74     // Private Member Functions
76         //- Determine cut cells, possibly restricted to a list of cells
77         void calcCutCells
78         (
79             const primitiveMesh&,
80             const scalarField& dotProducts,
81             const UList<label>& cellIdLabels = UList<label>::null()
82         );
84         //- Determine intersection points (cutPoints).
85         void intersectEdges
86         (
87             const primitiveMesh&,
88             const scalarField& dotProducts,
89             List<label>& edgePoint
90         );
92         //- Walk circumference of cell, starting from startEdgeI crossing
93         //  only cut edges. Record cutPoint labels in faceVerts.
94         static bool walkCell
95         (
96             const primitiveMesh&,
97             const UList<label>& edgePoint,
98             const label cellI,
99             const label startEdgeI,
100             DynamicList<label>& faceVerts
101         );
103         //- Determine cuts for all cut cells.
104         void walkCellCuts
105         (
106             const primitiveMesh& mesh,
107             const UList<label>& edgePoint
108         );
111 protected:
113     // Constructors
115         //- Construct plane description without cutting
116         cuttingPlane(const plane&);
118     // Protected Member Functions
120         //- recut mesh with existing planeDesc, restricted to a list of cells
121         void reCut
122         (
123             const primitiveMesh&,
124             const UList<label>& cellIdLabels = UList<label>::null()
125         );
127         //- remap action on triangulation or cleanup
128         virtual void remapFaces(const UList<label>& faceMap);
130 public:
132     // Constructors
134         //- Construct from plane and mesh reference,
135         //  possibly restricted to a list of cells
136         cuttingPlane
137         (
138             const plane&,
139             const primitiveMesh&,
140             const UList<label>& cellIdLabels = UList<label>::null()
141         );
144     // Member Functions
146         //- Return plane used
147         const plane& planeDesc() const
148         {
149             return static_cast<const plane&>(*this);
150         }
152         //- Return List of cells cut by the plane
153         const labelList& cutCells() const
154         {
155             return cutCells_;
156         }
158         //- Return true or false to question: have any cells been cut?
159         bool cut() const
160         {
161             return cutCells_.size();
162         }
164         //- Sample the cell field
165         template<class Type>
166         tmp<Field<Type> > sample(const Field<Type>&) const;
168         template<class Type>
169         tmp<Field<Type> > sample(const tmp<Field<Type> >&) const;
172     // Member Operators
174         void operator=(const cuttingPlane&);
178 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
180 } // End namespace Foam
182 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
184 #ifdef NoRepository
185 #   include "cuttingPlaneTemplates.C"
186 #endif
188 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
190 #endif
192 // ************************************************************************* //