1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
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 the
13 Free Software Foundation; either version 2 of the License, or (at your
14 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
21 You should have received a copy of the GNU General Public License
22 along with OpenFOAM; if not, write to the Free Software Foundation,
23 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
26 Create intermediate mesh from SAMM files
28 \*---------------------------------------------------------------------------*/
33 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
35 void sammMesh::addRegularCell
37 const labelList& labels,
38 const label nCreatedCells
42 static labelList labelsHex(8);
43 static labelList labelsWedge(7);
44 static labelList labelsPrism(6);
45 static labelList labelsPyramid(5);
46 static labelList labelsTet(4);
47 static labelList labelsTetWedge(5);
51 labels[2] == labels[3]
52 && labels[4] == labels[5]
53 && labels[5] == labels[6]
54 && labels[6] == labels[7]
57 labelsTet[0] = labels[0];
58 labelsTet[1] = labels[1];
59 labelsTet[2] = labels[2];
60 labelsTet[3] = labels[4];
61 cellShapes_[nCreatedCells] = cellShape(*tetPtr_, labelsTet);
64 else if // Square-based pyramid
66 labels[4] == labels[5]
67 && labels[5] == labels[6]
68 && labels[6] == labels[7]
71 labelsPyramid[0] = labels[0];
72 labelsPyramid[1] = labels[1];
73 labelsPyramid[2] = labels[2];
74 labelsPyramid[3] = labels[3];
75 labelsPyramid[4] = labels[4];
76 cellShapes_[nCreatedCells] = cellShape(*pyrPtr_, labelsPyramid);
81 labels[2] == labels[3]
82 && labels[4] == labels[5]
83 && labels[6] == labels[7]
86 labelsTetWedge[0] = labels[0];
87 labelsTetWedge[1] = labels[1];
88 labelsTetWedge[2] = labels[2];
89 labelsTetWedge[3] = labels[4];
90 labelsTetWedge[4] = labels[6];
91 cellShapes_[nCreatedCells] = cellShape(*tetWedgePtr_, labelsTetWedge);
94 else if // Triangular prism
96 labels[2] == labels[3]
97 && labels[6] == labels[7]
100 labelsPrism[0] = labels[0];
101 labelsPrism[1] = labels[1];
102 labelsPrism[2] = labels[2];
103 labelsPrism[3] = labels[4];
104 labelsPrism[4] = labels[5];
105 labelsPrism[5] = labels[6];
106 cellShapes_[nCreatedCells] = cellShape(*prismPtr_, labelsPrism);
111 labels[4] == labels[7]
114 labelsWedge[0] = labels[7];
115 labelsWedge[1] = labels[6];
116 labelsWedge[2] = labels[5];
117 labelsWedge[3] = labels[3];
118 labelsWedge[4] = labels[2];
119 labelsWedge[5] = labels[1];
120 labelsWedge[6] = labels[0];
121 cellShapes_[nCreatedCells] = cellShape(*wedgePtr_, labelsWedge);
126 labelsHex[0] = labels[0];
127 labelsHex[1] = labels[1];
128 labelsHex[2] = labels[2];
129 labelsHex[3] = labels[3];
130 labelsHex[4] = labels[4];
131 labelsHex[5] = labels[5];
132 labelsHex[6] = labels[6];
133 labelsHex[7] = labels[7];
134 cellShapes_[nCreatedCells] = cellShape(*hexPtr_, labelsHex);
139 void sammMesh::addSAMMcell
141 const label typeFlag,
142 const labelList& globalLabels,
143 const label nCreatedCells
147 // grab the shape from the table
148 if (!sammShapeLookup[typeFlag] || !sammAddressingTable[typeFlag])
152 "sammMesh::addRegularCell(const labelList& labels, "
153 "const label nCreatedCells)"
154 ) << "SAMM type " << typeFlag << " has no registered label. BUG!"
155 << abort(FatalError);
158 const cellModel& curModel = *(sammShapeLookup[typeFlag]);
160 // get reference to the addressing list
161 const label* addressing = sammAddressingTable[typeFlag];
163 // make a list of labels
164 labelList sammCellLabels(curModel.nPoints(), -1);
166 forAll (sammCellLabels, labelI)
168 sammCellLabels[labelI] = globalLabels[addressing[labelI]];
171 cellShapes_[nCreatedCells] = cellShape(curModel, sammCellLabels);
175 void sammMesh::readCells()
180 fileName cellsFileName(casePrefix_ + ".cel");
183 IFstream cellsFile(cellsFileName);
185 if (cellsFile.good())
187 label lineLabel, cellLabel = -1, pointLabel, regionLabel, typeFlag;
190 while (!(cellsFile >> lineLabel).eof())
192 maxLabel = max(maxLabel, lineLabel);
193 for (int i=0; i<8; i++)
195 cellsFile >> pointLabel;
198 cellsFile >> regionLabel;
199 cellsFile >> typeFlag;
201 if (lineLabel != cellLabel)
203 cellLabel = lineLabel;
210 FatalErrorIn("sammMesh::readCells()")
211 << "Cannot read file "
213 << abort(FatalError);
217 Info<< "Number of cells = " << nCells << endl << endl;
219 cellShapes_.setSize(nCells);
221 starCellLabelLookup_.setSize(maxLabel+1);
223 // reset point labels to invalid value
224 forAll (starCellLabelLookup_, i)
226 starCellLabelLookup_[i] = -1;
232 IFstream cellsFile(cellsFileName);
234 labelList labels(24, -1);
235 label lineLabel, sammLabel, regionLabel, typeFlag;
237 for (label cellI = 0; cellI < nCells; cellI++)
241 bool addOnToCell = false;
247 FatalErrorIn("sammMesh::readCells()")
248 << "Unknown SAMM cell. "
249 << "More than 24 vertices"
250 << abort(FatalError);
253 if ((cellsFile >> lineLabel).eof())
255 FatalErrorIn("sammMesh::readCells()")
256 << "Reached end of cells file before "
257 << "all cells are read in."
258 << abort(FatalError);
261 // prepare for possible continuation
264 for (int i=nLabels-8; i<nLabels; i++)
266 cellsFile >> sammLabel;
270 // Convert Samm vertex number to point label
271 labels[i] = starPointLabelLookup_[sammLabel];
275 Info<< "Cell file not consistent with vertex file. "
276 << "Samm vertex number " << sammLabel
277 << " does not exist\n";
286 cellsFile >> regionLabel;
287 cellsFile >> typeFlag;
289 // check for continuation line
290 if (!addOnToCell && typeFlag == 255)
299 } while (typeFlag == -1 || addOnToCell);
301 starCellLabelLookup_[lineLabel] = cellI;
305 addRegularCell(labels, cellI);
309 addSAMMcell(typeFlag, labels, cellI);
315 FatalErrorIn("sammMesh::readCells()")
316 << "No cells in file "
318 << abort(FatalError);
323 // ************************************************************************* //