Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "starMesh.H"
00030 #include <OpenFOAM/IFstream.H>
00031
00032
00033
00034 void starMesh::addRegularCell
00035 (
00036 const labelList& labels,
00037 const label nCreatedCells
00038 )
00039 {
00040
00041 static labelList labelsHex(8);
00042 static labelList labelsPrism(6);
00043 static labelList labelsPyramid(5);
00044 static labelList labelsTet(4);
00045 static labelList labelsTetWedge(5);
00046
00047 label regularTypeFlag = -1;
00048
00049
00050 const cellModel* curModelPtr = reinterpret_cast<cellModel*>(0);
00051
00052 if
00053 (
00054 labels[2] == labels[3]
00055 && labels[4] == labels[5]
00056 && labels[5] == labels[6]
00057 && labels[6] == labels[7]
00058 )
00059 {
00060 regularTypeFlag = 0;
00061 curModelPtr = tetPtr_;
00062 }
00063 else if
00064 (
00065 labels[4] == labels[5]
00066 && labels[5] == labels[6]
00067 && labels[6] == labels[7]
00068 )
00069 {
00070 regularTypeFlag = 1;
00071 curModelPtr = pyrPtr_;
00072 }
00073 else if
00074 (
00075 labels[2] == labels[3]
00076 && labels[4] == labels[5]
00077 && labels[6] == labels[7]
00078 )
00079 {
00080 regularTypeFlag = 2;
00081 curModelPtr = tetWedgePtr_;
00082 }
00083 else if
00084 (
00085 labels[2] == labels[3]
00086 && labels[6] == labels[7]
00087 )
00088 {
00089 regularTypeFlag = 3;
00090 curModelPtr = prismPtr_;
00091 }
00092 else if
00093 (
00094 labels[4] == labels[7]
00095 )
00096 {
00097 regularTypeFlag = 4;
00098 curModelPtr = wedgePtr_;
00099 }
00100 else
00101 {
00102 regularTypeFlag = 5;
00103 curModelPtr = hexPtr_;
00104 }
00105
00106 labelList regularCellLabels(curModelPtr->nPoints(), -1);
00107
00108 const label* addressing = regularAddressingTable[regularTypeFlag];
00109
00110 forAll (regularCellLabels, labelI)
00111 {
00112 regularCellLabels[labelI] = labels[addressing[labelI]];
00113 }
00114
00115 cellShapes_[nCreatedCells] = cellShape(*curModelPtr, regularCellLabels);
00116 }
00117
00118
00119 void starMesh::addSAMMcell
00120 (
00121 const labelList& labels,
00122 const label nCreatedCells
00123 )
00124 {
00125
00126 label typeFlag = labels[21];
00127
00128 label permutationFlag = labels[23];
00129
00130
00131 label sammTypeFlag = -1;
00132 const cellModel* curModelPtr = reinterpret_cast<cellModel*>(0);
00133
00134 switch (typeFlag)
00135 {
00136 case 1:
00137 {
00138 sammTypeFlag = 1;
00139 curModelPtr = sammTrim1Ptr_;
00140 break;
00141 }
00142
00143 case 2:
00144 {
00145 sammTypeFlag = 2;
00146 curModelPtr = sammTrim2Ptr_;
00147 break;
00148 }
00149
00150 case 7:
00151 {
00152 if (labels[0] != -1)
00153 {
00154 sammTypeFlag = 3;
00155 curModelPtr = sammTrim3Ptr_;
00156 }
00157 else
00158 {
00159 sammTypeFlag = 5;
00160 curModelPtr = sammTrim5Ptr_;
00161 }
00162
00163 break;
00164 }
00165
00166 case 8:
00167 {
00168 sammTypeFlag = 4;
00169 curModelPtr = sammTrim4Ptr_;
00170 break;
00171 }
00172
00173 case 85:
00174 {
00175 sammTypeFlag = 8;
00176 curModelPtr = sammTrim8Ptr_;
00177 break;
00178 }
00179
00180 default:
00181 {
00182 FatalErrorIn
00183 (
00184 "starMesh::addSAMMcell"
00185 "(const labelList& labels, const label nCreatedCells)"
00186 ) << "SAMM type " << sammTypeFlag << " is invalid"
00187 << abort(FatalError);
00188 }
00189 }
00190
00191
00192 labelList sammCellLabels(curModelPtr->nPoints(), -1);
00193
00194 const label* addressing = sammAddressingTable[sammTypeFlag];
00195
00196 forAll (sammCellLabels, labelI)
00197 {
00198 sammCellLabels[labelI] = labels[addressing[labelI]];
00199 }
00200
00201 cellShapes_[nCreatedCells] = cellShape(*curModelPtr, sammCellLabels);
00202
00203
00204 starCellPermutation_[nCreatedCells] = permutationFlag;
00205 }
00206
00207
00208 void starMesh::readCells()
00209 {
00210 label nCells = 0;
00211 label maxLabel = -1;
00212
00213 fileName cellsFileName(casePrefix_ + ".cel");
00214
00215 {
00216 IFstream cellsFile(cellsFileName);
00217
00218 if (cellsFile.good())
00219 {
00220 label lineLabel, pointLabel, regionLabel, typeFlag;
00221
00222 maxLabel = -1;
00223 while (!(cellsFile >> lineLabel).eof())
00224 {
00225 maxLabel = max(maxLabel, lineLabel);
00226 for (int i=0; i<8; i++)
00227 {
00228 cellsFile >> pointLabel;
00229 }
00230
00231 cellsFile >> regionLabel;
00232 cellsFile >> typeFlag;
00233
00234
00235 if (typeFlag != 0)
00236 {
00237 nCells++;
00238 }
00239
00240
00241
00242
00243 readToNl(cellsFile);
00244 }
00245 }
00246 else
00247 {
00248 FatalErrorIn("starMesh::readCells()")
00249 << "Cannot read file " << cellsFileName
00250 << abort(FatalError);
00251 }
00252 }
00253
00254 Info<< "Number of cells = " << nCells << endl << endl;
00255
00256 cellShapes_.setSize(nCells);
00257 starCellID_.setSize(nCells);
00258 starCellPermutation_.setSize(nCells);
00259
00260
00261 forAll (starCellPermutation_, i)
00262 {
00263 starCellPermutation_[i] = -1;
00264 }
00265
00266 starCellLabelLookup_.setSize(maxLabel+1);
00267
00268
00269 forAll (starCellLabelLookup_, i)
00270 {
00271 starCellLabelLookup_[i] = -1;
00272 }
00273
00274 if (nCells > 0)
00275 {
00276 IFstream cellsFile(cellsFileName);
00277
00278 labelList labels(24, -1);
00279 label lineLabel, starLabel, regionLabel, typeFlag;
00280
00281 for (label cellI = 0; cellI < nCells; cellI++)
00282 {
00283 label nLabels = 0;
00284
00285 label addOnToCell = 0;
00286
00287
00288 forAll (labels, i)
00289 {
00290 labels[i] = -1;
00291 }
00292
00293 do
00294 {
00295 if ((cellsFile >> lineLabel).eof())
00296 {
00297 FatalErrorIn("starMesh::readCells()")
00298 << "Reached end of cells file before "
00299 << "all cells are read in."
00300 << abort(FatalError);
00301 }
00302
00303 nLabels += 8;
00304
00305 for (int i=nLabels-8; i<nLabels; i++)
00306 {
00307 cellsFile >> starLabel;
00308
00309 if (i < 21)
00310 {
00311 if (starLabel != 0)
00312 {
00313
00314 labels[i] = starPointLabelLookup_[starLabel];
00315
00316 if (labels[i] < 0)
00317 {
00318 Info<< "Cells not consistent with vertex file. "
00319 << "Star vertex number " << starLabel
00320 << " does not exist\n";
00321 }
00322 }
00323 else
00324 {
00325 labels[i] = -1;
00326 }
00327 }
00328 else
00329 {
00330 labels[i] = starLabel;
00331 }
00332 }
00333
00334 cellsFile >> regionLabel;
00335 cellsFile >> typeFlag;
00336
00337
00338 if (typeFlag == -1)
00339 {
00340 addOnToCell = 2;
00341 }
00342
00343
00344
00345 readToNl(cellsFile);
00346
00347 addOnToCell--;
00348
00349 } while (addOnToCell >= 0);
00350
00351
00352 starCellID_[cellI] = lineLabel;
00353
00354
00355 starCellLabelLookup_[lineLabel] = cellI;
00356
00357 if (nLabels == 8)
00358 {
00359 addRegularCell(labels, cellI);
00360 }
00361 else
00362 {
00363 addSAMMcell(labels, cellI);
00364 }
00365
00366
00367 const labelList& curShapeLabels = cellShapes_[cellI];
00368
00369 forAll (curShapeLabels, i)
00370 {
00371 if (curShapeLabels[i] < 0)
00372 {
00373 FatalErrorIn("starMesh::readCells()")
00374 << "Invalid vertex found in cell " << cellI
00375 << ". STAR cell no: " << lineLabel
00376 << " labels: " << curShapeLabels
00377 << abort(FatalError);
00378 }
00379 }
00380 }
00381 }
00382 else
00383 {
00384 FatalErrorIn("starMesh::readCells()")
00385 << "No cells in file " << cellsFileName
00386 << abort(FatalError);
00387 }
00388 }
00389
00390
00391