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 #include "hexBlock.H"
00029 
00030 
00031 
00032 namespace Foam
00033 {
00034 
00035 
00036 
00037 label hexBlock::vtxLabel(label a, label b, label c) const
00038 {
00039     return (a + b*(xDim_ + 1) + c*(xDim_ + 1)*(yDim_ + 1));
00040 }
00041 
00042 
00043 
00044 
00045 
00046 hexBlock::hexBlock(const label nx, const label ny, const label nz)
00047 :
00048     xDim_(nx),
00049     yDim_(ny),
00050     zDim_(nz),
00051     blockHandedness_(noPoints),
00052     points_((xDim_ + 1)*(yDim_ + 1)*(zDim_ + 1))
00053 {}
00054 
00055 
00056 
00057 
00058 void hexBlock::readPoints(Istream& is)
00059 {
00060     forAll (points_, i)
00061     {
00062         is >> points_[i].x() >> points_[i].y() >> points_[i].z();
00063     }
00064 
00065     
00066     vector i = points_[xDim_] - points_[0];
00067     vector j = points_[(xDim_ + 1)*yDim_] - points_[0];
00068     vector k = points_[(xDim_ + 1)*(yDim_ + 1)*zDim_] - points_[0];
00069 
00070     if (((i ^ j) & k) > 0)
00071     {
00072         Info << "right-handed block" << endl;
00073         blockHandedness_ = right;
00074     }
00075     else
00076     {
00077         Info << "left-handed block" << endl;
00078         blockHandedness_ = left;
00079     }
00080 }
00081 
00082 
00083 labelListList hexBlock::blockCells() const
00084 {
00085     labelListList result(xDim_*yDim_*zDim_);
00086 
00087     label cellNo = 0;
00088 
00089     if (blockHandedness_ == right)
00090     {
00091         for (label k = 0; k <= zDim_ - 1; k++)
00092         {
00093             for (label j = 0; j <= yDim_ - 1; j++)
00094             {
00095                 for (label i = 0; i <= xDim_ - 1; i++)
00096                 {
00097                     labelList& hexLabels = result[cellNo];
00098                     hexLabels.setSize(8);
00099 
00100                     hexLabels[0] = vtxLabel(i, j, k);
00101                     hexLabels[1] = vtxLabel(i+1, j, k);
00102                     hexLabels[2] = vtxLabel(i+1, j+1, k);
00103                     hexLabels[3] = vtxLabel(i, j+1, k);
00104                     hexLabels[4] = vtxLabel(i, j, k+1);
00105                     hexLabels[5] = vtxLabel(i+1, j, k+1);
00106                     hexLabels[6] = vtxLabel(i+1, j+1, k+1);
00107                     hexLabels[7] = vtxLabel(i, j+1, k+1);
00108 
00109                     cellNo++;
00110                 }
00111             }
00112         }
00113     }
00114     else if (blockHandedness_ == left)
00115     {
00116         for (label k = 0; k <= zDim_ - 1; k++)
00117         {
00118             for (label j = 0; j <= yDim_ - 1; j++)
00119             {
00120                 for (label i = 0; i <= xDim_ - 1; i++)
00121                 {
00122                     labelList& hexLabels = result[cellNo];
00123                     hexLabels.setSize(8);
00124 
00125                     hexLabels[0] = vtxLabel(i, j, k+1);
00126                     hexLabels[1] = vtxLabel(i+1, j, k+1);
00127                     hexLabels[2] = vtxLabel(i+1, j+1, k+1);
00128                     hexLabels[3] = vtxLabel(i, j+1, k+1);
00129                     hexLabels[4] = vtxLabel(i, j, k);
00130                     hexLabels[5] = vtxLabel(i+1, j, k);
00131                     hexLabels[6] = vtxLabel(i+1, j+1, k);
00132                     hexLabels[7] = vtxLabel(i, j+1, k);
00133 
00134                     cellNo++;
00135                 }
00136             }
00137         }
00138     }
00139     else
00140     {
00141         FatalErrorIn("hexBlock::cellShapes()")
00142             << "Unable to determine block handedness as points "
00143             << "have not been read in yet"
00144             << abort(FatalError);
00145     }
00146 
00147     return result;
00148 }
00149 
00150 
00151 
00152 
00153 
00154 
00155 
00156 faceList hexBlock::patchFaces(const label direc, const labelList& range) const
00157 {
00158     if (range.size() != 6)
00159     {
00160         FatalErrorIn
00161         (
00162             "patchFaces(const label direc, const labelList& range) const"
00163         )   << "Invalid size of the range array: " << range.size()
00164             << ". Should be 6 (xMin, xMax, yMin, yMax, zMin, zMax"
00165             << abort(FatalError);
00166     }
00167 
00168     label xMinRange = range[0];
00169     label xMaxRange = range[1];
00170     label yMinRange = range[2];
00171     label yMaxRange = range[3];
00172     label zMinRange = range[4];
00173     label zMaxRange = range[5];
00174 
00175     faceList result(0);
00176 
00177     switch (direc)
00178     {
00179         case 1:
00180         {
00181             
00182 
00183             result.setSize
00184             (
00185                 (yMaxRange - yMinRange + 1)*(zMaxRange - zMinRange + 1)
00186             );
00187 
00188             label p = 0;
00189             for (label k = zMinRange - 1; k <= zMaxRange - 1; k++)
00190             {
00191                 for (label j = yMinRange - 1; j <= yMaxRange - 1; j++)
00192                 {
00193                     result[p].setSize(4);
00194 
00195                     
00196                     result[p][0] = vtxLabel(xDim_, j, k);
00197                     result[p][1] = vtxLabel(xDim_, j+1, k);
00198                     result[p][2] = vtxLabel(xDim_, j+1, k+1);
00199                     result[p][3] = vtxLabel(xDim_, j, k+1);
00200 
00201                     p++;
00202                 }
00203             }
00204 
00205             result.setSize(p);
00206             break;
00207         }
00208 
00209         case 2:
00210         {
00211             
00212             result.setSize
00213             (
00214                 (xMaxRange - xMinRange + 1)*(zMaxRange - zMinRange + 1)
00215             );
00216 
00217             label p = 0;
00218             for (label i = xMinRange - 1; i <= xMaxRange - 1; i++)
00219             {
00220                 for (label k = zMinRange - 1; k <= zMaxRange - 1; k++)
00221                 {
00222                     result[p].setSize(4);
00223 
00224                     
00225                     result[p][0] = vtxLabel(i, yDim_, k);
00226                     result[p][1] = vtxLabel(i, yDim_, k + 1);
00227                     result[p][2] = vtxLabel(i + 1, yDim_, k + 1);
00228                     result[p][3] = vtxLabel(i + 1, yDim_, k);
00229 
00230                     p++;
00231                 }
00232             }
00233 
00234             result.setSize(p);
00235             break;
00236         }
00237 
00238         case 3:
00239         {
00240             
00241             result.setSize
00242             (
00243                 (xMaxRange - xMinRange + 1)*(yMaxRange - yMinRange + 1)
00244             );
00245 
00246             label p = 0;
00247             for (label i = xMinRange - 1; i <= xMaxRange - 1; i++)
00248             {
00249                 for (label j = yMinRange - 1; j <= yMaxRange - 1; j++)
00250                 {
00251                     result[p].setSize(4);
00252 
00253                     
00254                     result[p][0] = vtxLabel(i, j, zDim_);
00255                     result[p][1] = vtxLabel(i + 1, j, zDim_);
00256                     result[p][2] = vtxLabel(i + 1, j + 1, zDim_);
00257                     result[p][3] = vtxLabel(i, j + 1, zDim_);
00258 
00259                     p++;
00260                 }
00261             }
00262 
00263             result.setSize(p);
00264             break;
00265         }
00266 
00267         case 4:
00268         {
00269             
00270             result.setSize
00271             (
00272                 (yMaxRange - yMinRange + 1)*(zMaxRange - zMinRange + 1)
00273             );
00274 
00275             label p = 0;
00276             for (label k = zMinRange - 1; k <= zMaxRange - 1; k++)
00277             {
00278                 for (label j = yMinRange - 1; j <= yMaxRange - 1; j++)
00279                 {
00280                     result[p].setSize(4);
00281 
00282                     
00283                     result[p][0] = vtxLabel(0, j, k);
00284                     result[p][1] = vtxLabel(0, j, k + 1);
00285                     result[p][2] = vtxLabel(0, j + 1, k + 1);
00286                     result[p][3] = vtxLabel(0, j + 1, k);
00287 
00288                     p++;
00289                 }
00290             }
00291 
00292             result.setSize(p);
00293             break;
00294         }
00295 
00296         case 5:
00297         {
00298             
00299             result.setSize
00300             (
00301                 (xMaxRange - xMinRange + 1)*(zMaxRange - zMinRange + 1)
00302             );
00303 
00304             label p = 0;
00305             for (label i = xMinRange - 1; i <= xMaxRange - 1; i++)
00306             {
00307                 for (label k = zMinRange - 1; k <= zMaxRange - 1; k++)
00308                 {
00309                     result[p].setSize(4);
00310 
00311                     
00312                     result[p][0] = vtxLabel(i, 0, k);
00313                     result[p][1] = vtxLabel(i + 1, 0, k);
00314                     result[p][2] = vtxLabel(i + 1, 0, k + 1);
00315                     result[p][3] = vtxLabel(i, 0, k + 1);
00316 
00317                     p++;
00318                 }
00319             }
00320 
00321             result.setSize(p);
00322             break;
00323         }
00324 
00325         case 6:
00326         {
00327             
00328             result.setSize
00329             (
00330                 (xMaxRange - xMinRange + 1)*(yMaxRange - yMinRange + 1)
00331             );
00332 
00333             label p = 0;
00334             for (label i = xMinRange - 1; i <= xMaxRange - 1; i++)
00335             {
00336                 for (label j = yMinRange - 1; j <= yMaxRange - 1; j++)
00337                 {
00338                     result[p].setSize(4);
00339 
00340                     
00341                     result[p][0] = vtxLabel(i, j, 0);
00342                     result[p][1] = vtxLabel(i, j + 1, 0);
00343                     result[p][2] = vtxLabel(i + 1, j + 1, 0);
00344                     result[p][3] = vtxLabel(i + 1, j, 0);
00345 
00346                     p++;
00347                 }
00348             }
00349 
00350             result.setSize(p);
00351             break;
00352         }
00353 
00354         default:
00355         {
00356             FatalErrorIn
00357             (
00358                 "patchFaces(const label direc, const labelList& range) const"
00359             )   << "direction out of range (1 to 6): " << direc
00360                 << abort(FatalError);
00361         }
00362     }
00363 
00364     
00365     
00366     if (blockHandedness_ == noPoints)
00367     {
00368         FatalErrorIn
00369         (
00370             "patchFaces(const label direc, const labelList& range) const"
00371         )   << "Unable to determine block handedness as points "
00372             << "have not been read in yet"
00373             << abort(FatalError);
00374     }
00375     else if (blockHandedness_ == left)
00376     {
00377         
00378         forAll (result, faceI)
00379         {
00380             result[faceI] = result[faceI].reverseFace();
00381         }
00382     }
00383 
00384     return result;
00385 }
00386 
00387 
00388 
00389 
00390 } 
00391 
00392