Merge branch 'master' of ssh://git.code.sf.net/p/foam-extend/foam-extend-3.2
[foam-extend-3.2.git] / src / conversion / ensight / part / ensightPartFaces.C
blob61137d0465b4c8e43f9bea88d6badba494cdfc6e
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend 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     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 \*----------------------------------------------------------------------------*/
26 #include "ensightPartFaces.H"
27 #include "addToRunTimeSelectionTable.H"
28 #include "IOstreams.H"
29 #include "IStringStream.H"
30 #include "dictionary.H"
32 // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
34 namespace Foam
36    defineTypeNameAndDebug(ensightPartFaces, 0);
37    addToRunTimeSelectionTable(ensightPart, ensightPartFaces, istream);
41 Foam::List<Foam::word> Foam::ensightPartFaces::elemTypes_
43     IStringStream
44     (
45         "(tria3 quad4 nsided)"
46     )()
50 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
52 Foam::ensightPartFaces::ensightPartFaces
54     label partNumber,
55     const string& partDescription
58     ensightPart(partNumber, partDescription)
60     isCellData_ = false;
64 Foam::ensightPartFaces::ensightPartFaces
66     label partNumber,
67     const polyMesh& pMesh,
68     const polyPatch& pPatch
71     ensightPart(partNumber, pPatch.name(), pMesh)
73     isCellData_ = false;
74     offset_ = pPatch.start();
75     size_ = pPatch.size();
77     // count the shapes
78     label nTri  = 0;
79     label nQuad = 0;
80     label nPoly = 0;
82     forAll (pPatch, patchfaceI)
83     {
84         const face& f = pMesh.faces()[patchfaceI + offset_];
86         if (f.size() == 3)
87         {
88             nTri++;
89         }
90         else if (f.size() == 4)
91         {
92             nQuad++;
93         }
94         else
95         {
96             nPoly++;
97         }
98     }
100     // we can avoid double looping, but at the cost of allocation
102     labelList triCells(nTri);
103     labelList quadCells(nQuad);
104     labelList polygonCells(nPoly);
106     nTri  = 0;
107     nQuad = 0;
108     nPoly = 0;
110     // classify the shapes
111     forAll(pPatch, patchfaceI)
112     {
113         const face& f = pMesh.faces()[patchfaceI + offset_];
115         if (f.size() == 3)
116         {
117             triCells[nTri++] = patchfaceI;
118         }
119         else if (f.size() == 4)
120         {
121             quadCells[nQuad++] = patchfaceI;
122         }
123         else
124         {
125             polygonCells[nPoly++] = patchfaceI;
126         }
127     }
130     // MUST match with elementTypes
131     elemLists_.setSize(elementTypes().size());
133     elemLists_[tria3Elements].transfer( triCells );
134     elemLists_[quad4Elements].transfer( quadCells );
135     elemLists_[nsidedElements].transfer( polygonCells );
139 Foam::ensightPartFaces::ensightPartFaces(const ensightPartFaces &part)
141     ensightPart(part)
145 Foam::ensightPartFaces::ensightPartFaces(Istream& is)
147     ensightPart()
149     isCellData_ = false;
150     reconstruct(is);
154 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
156 Foam::ensightPartFaces::~ensightPartFaces()
160 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
162 Foam::ensightPart::localPoints Foam::ensightPartFaces::calcLocalPoints() const
164     const polyMesh& mesh = *meshPtr_;
166     localPoints ptList(mesh);
167     labelList& usedPoints = ptList.list;
168     label nPoints = 0;
170     forAll(elemLists_, typeI)
171     {
172         const labelList& idList = elemLists_[typeI];
174         // add all points from faces
175         forAll(idList, i)
176         {
177             label id = idList[i] + offset_;
178             const face& f = mesh.faces()[id];
180             forAll(f, fp)
181             {
182                 if (usedPoints[f[fp]] == -1)
183                 {
184                     usedPoints[f[fp]] = nPoints++;
185                 }
186             }
187         }
188     }
190     // this is not absolutely necessary, but renumber anyhow
191     nPoints = 0;
192     forAll(usedPoints, ptI)
193     {
194         if (usedPoints[ptI] > -1)
195         {
196             usedPoints[ptI] = nPoints++;
197         }
198     }
200     ptList.nPoints = nPoints;
201     return ptList;
205 void Foam::ensightPartFaces::writeConnectivity
207     ensightGeoFile& os,
208     const string& key,
209     const labelList& idList,
210     const labelList& pointMap
211 ) const
213     os.writeKeyword(key);
214     os.write(idList.size());
215     os.newline();
217     const faceList& meshFaces = meshPtr_->faces();
219     // write (polygon) face sizes
220     if (word(key) == "nsided")
221     {
222         // write the number of points per face
223         forAll(idList, i)
224         {
225             label id = idList[i] + offset_;
226             const face& f = meshFaces[id];
228             os.write( f.size() );
229             os.newline();
230         }
231     }
233     // write the points describing the face
234     forAll(idList, i)
235     {
236         label id = idList[i] + offset_;
237         const face& f = meshFaces[id];
239         // convert global -> local index
240         // (note: Ensight indices start with 1)
241         forAll(f, fp)
242         {
243             os.write( pointMap[f[fp]] + 1 );
244         }
245         os.newline();
246     }
250 // ************************************************************************* //