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
00030 #include <conversion/meshReader.H>
00031
00032
00033
00034 void Foam::meshReader::calcPointCells() const
00035 {
00036 const static label UNIT_POINT_CELLS = 12;
00037
00038 if (pointCellsPtr_)
00039 {
00040 FatalErrorIn("meshReader::calcPointCells() const")
00041 << "pointCells already calculated"
00042 << abort(FatalError);
00043 }
00044
00045 label nPoints = points_.size();
00046
00047 pointCellsPtr_ = new labelListList(nPoints);
00048 labelListList& ptCells = *pointCellsPtr_;
00049
00050 forAll(ptCells, i)
00051 {
00052 ptCells[i].setSize(UNIT_POINT_CELLS);
00053 }
00054
00055
00056
00057 labelList cellCount(nPoints, 0);
00058
00059
00060
00061
00062
00063
00064
00065 faceListList& cFaces = cellFaces();
00066
00067
00068 forAll(cFaces, cellI)
00069 {
00070 const faceList& faces = cFaces[cellI];
00071
00072 forAll(faces, i)
00073 {
00074
00075 const labelList& labels = faces[i];
00076
00077 forAll(labels, j)
00078 {
00079
00080 label curPoint = labels[j];
00081 labelList& curPointCells = ptCells[curPoint];
00082 label curCount = cellCount[curPoint];
00083
00084
00085 bool found = false;
00086
00087 for (label f = 0; f < curCount; f++)
00088 {
00089 if (curPointCells[f] == cellI)
00090 {
00091 found = true;
00092 break;
00093 }
00094 }
00095
00096 if (!found)
00097 {
00098
00099 if (curPointCells.size() <= curCount)
00100 {
00101 curPointCells.setSize(curPointCells.size()*2);
00102 }
00103
00104
00105 curPointCells[curCount] = cellI;
00106
00107
00108 cellCount[curPoint]++;
00109 }
00110 }
00111 }
00112 }
00113
00114
00115
00116 label pointI = 0;
00117 labelList oldToNew(nPoints, -1);
00118
00119 forAll(ptCells, i)
00120 {
00121 ptCells[i].setSize(cellCount[i]);
00122 if (cellCount[i] > 0)
00123 {
00124 oldToNew[i] = pointI++;
00125 }
00126 }
00127
00128
00129 if (nPoints > pointI)
00130 {
00131 Info<< "removing " << (nPoints - pointI) << " unused points" << endl;
00132
00133 nPoints = pointI;
00134
00135
00136 pointField& adjustedPoints = const_cast<pointField&>(points_);
00137
00138 inplaceReorder(oldToNew, adjustedPoints);
00139 adjustedPoints.setSize(nPoints);
00140
00141
00142 inplaceReorder(oldToNew, ptCells);
00143 ptCells.setSize(nPoints);
00144
00145
00146
00147 forAll(cFaces, cellI)
00148 {
00149 faceList& faces = cFaces[cellI];
00150
00151
00152 forAll(faces, i)
00153 {
00154 inplaceRenumber(oldToNew, faces[i]);
00155 }
00156 }
00157 }
00158 }
00159
00160
00161 const Foam::labelListList& Foam::meshReader::pointCells() const
00162 {
00163 if (!pointCellsPtr_)
00164 {
00165 calcPointCells();
00166 }
00167
00168 return *pointCellsPtr_;
00169 }
00170
00171
00172