Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OpenFOAM / meshes / meshShapes / cellShape / cellShapeI.H
blob43530f0c1bf9c49077f3eedcf5650a4c86658626
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 \*---------------------------------------------------------------------------*/
26 #include "Istream.H"
27 #include "cell.H"
29 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
31 inline Foam::cellShape::cellShape()
33     m(NULL)
37 inline Foam::cellShape::cellShape
39     const cellModel& M,
40     const labelList& l,
41     const bool doCollapse
44     labelList(l),
45     m(&M)
47     if (doCollapse)
48     {
49         collapse();
50     }
54 inline Foam::cellShape::cellShape(Istream& is)
56     is >> *this;
60 inline Foam::autoPtr<Foam::cellShape> Foam::cellShape::clone() const
62     return autoPtr<cellShape>(new cellShape(*this));
66 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
68 inline Foam::pointField Foam::cellShape::points
70     const pointField& meshPoints
71 ) const
73     // There are as many points as there labels for them
74     pointField p(size());
76     // For each point in list, set it to the point in 'pnts' addressed
77     // by 'labs'
78     forAll(p, i)
79     {
80         p[i] = meshPoints[operator[](i)];
81     }
83     // Return list
84     return p;
88 inline const Foam::cellModel& Foam::cellShape::model() const
90     return *m;
94 inline Foam::labelList Foam::cellShape::meshFaces
96     const faceList& allFaces,
97     const cell& cFaces
98 ) const
100     // Faces in model order
101     faceList localFaces(faces());
103     // Do linear match (usually cell shape is low complexity)
105     labelList modelToMesh(localFaces.size(), -1);
107     forAll(localFaces, i)
108     {
109         const face& localF = localFaces[i];
111         forAll(cFaces, j)
112         {
113             label meshFaceI = cFaces[j];
115             if (allFaces[meshFaceI] == localF)
116             {
117                 modelToMesh[i] = meshFaceI;
119                 break;
120             }
121         }
122     }
124     return modelToMesh;
128 inline Foam::labelList Foam::cellShape::meshEdges
130     const edgeList& allEdges,
131     const labelList& cEdges
132 ) const
134     // Edges in model order
135     edgeList localEdges(edges());
137     // Do linear match (usually cell shape is low complexity)
139     labelList modelToMesh(localEdges.size(), -1);
141     forAll(localEdges, i)
142     {
143         const edge& e = localEdges[i];
145         forAll(cEdges, j)
146         {
147             label edgeI = cEdges[j];
149             if (allEdges[edgeI] == e)
150             {
151                 modelToMesh[i] = edgeI;
153                 break;
154             }
155         }
156     }
158     return modelToMesh;
162 inline Foam::faceList Foam::cellShape::faces() const
164     return m->faces(*this);
168 inline Foam::faceList Foam::cellShape::collapsedFaces() const
170     faceList oldFaces(faces());
172     faceList newFaces(oldFaces.size());
173     label newFaceI = 0;
175     forAll(oldFaces, oldFaceI)
176     {
177         const face& f = oldFaces[oldFaceI];
179         face& newF = newFaces[newFaceI];
181         newF.setSize(f.size());
183         label newFp = 0;
184         label prevVertI = -1;
186         forAll(f, fp)
187         {
188             label vertI = f[fp];
190             if (vertI != prevVertI)
191             {
192                 newF[newFp++] = vertI;
194                 prevVertI = vertI;
195             }
196         }
198         if ((newFp > 1) && (newF[newFp-1] == newF[0]))
199         {
200             --newFp;
201         }
203         if (newFp > 2)
204         {
205             // Size face and go to next one
206             newF.setSize(newFp);
208             newFaceI++;
209         }
210     }
211     newFaces.setSize(newFaceI);
213     return newFaces;
217 inline Foam::label Foam::cellShape::nFaces() const
219     return m->nFaces();
223 inline Foam::edgeList Foam::cellShape::edges() const
225     return m->edges(*this);
229 inline Foam::label Foam::cellShape::nEdges() const
231     return m->nEdges();
235 inline Foam::label Foam::cellShape::nPoints() const
237     return size();
241 inline Foam::point Foam::cellShape::centre(const pointField& points) const
243     return m->centre(*this, points);
247 inline Foam::scalar Foam::cellShape::mag(const pointField& points) const
249     return m->mag(*this, points);
253 // ************************************************************************* //