1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
Description
Create intermediate mesh files from PROSTAR files
\*---------------------------------------------------------------------------*/
#include "starMesh.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void Foam::starMesh::calcPointCells() const
{
static const label UNIT_POINT_CELLS = 12;
if (pointCellsPtr_)
{
FatalErrorInFunction
<< "pointCells already calculated"
<< abort(FatalError);
}
pointCellsPtr_ = new labelListList(points_.size());
labelListList& pc = *pointCellsPtr_;
forAll(pc, i)
{
pc[i].setSize(UNIT_POINT_CELLS);
}
// Initialise the list of labels which will hold the count the
// actual number of cells per point during the analysis
labelList cellCount(points_.size());
forAll(cellCount, i)
{
cellCount[i] = 0;
}
// Note. Unlike the standard point-cell algorithm, which asks the cell for
// the supporting point labels, we need to work based on the cell faces.
// This is because some of the faces for meshes with arbitrary interfaces
// do not come from the cell shape, but from the slaves of the coupled
// match. It is also adventageous to remove the duplicates from the
// point-cell addressing, because this removes a lot of waste later.
//
// For each cell
forAll(cellShapes_, celli)
{
const faceList& faces = cellFaces_[celli];
forAll(faces, i)
{
// For each vertex
const labelList& labels = faces[i];
forAll(labels, j)
{
// Set working point label
label curPoint = labels[j];
labelList& curPointCells = pc[curPoint];
label curCount = cellCount[curPoint];
// check if the cell has been added before
bool found = false;
for (label f = 0; f < curCount; f++)
{
if (curPointCells[f] == celli)
{
found = true;
break;
}
}
if (!found)
{
// If the list of pointCells is not big enough, double it
if (curPointCells.size() <= curCount)
{
curPointCells.setSize(curPointCells.size()*2);
}
// Enter the cell label in the point's cell list
curPointCells[curCount] = celli;
// Increment the cell count for the point addressed
cellCount[curPoint]++;
}
}
}
}
// Finally, truncate the lists made to their active size
forAll(pc, i)
{
pc[i].setSize(cellCount[i]);
}
}
const Foam::labelListList& Foam::starMesh::pointCells() const
{
if (!pointCellsPtr_)
{
calcPointCells();
}
return *pointCellsPtr_;
}
// ************************************************************************* //
|