230 lines
6.1 KiB
C
230 lines
6.1 KiB
C
|
/*---------------------------------------------------------------------------*\
|
||
|
========= |
|
||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||
|
\\ / O peration |
|
||
|
\\ / A nd | Copyright held by original author
|
||
|
\\/ 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 2 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, write to the Free Software Foundation,
|
||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||
|
|
||
|
Description
|
||
|
|
||
|
\*---------------------------------------------------------------------------*/
|
||
|
|
||
|
#include "fvCFD.H"
|
||
|
#include "IStringStream.H"
|
||
|
|
||
|
#include "myBoundBox.H"
|
||
|
#include "myBoundBoxList.H"
|
||
|
#include "octree.H"
|
||
|
#include "octreeData.H"
|
||
|
|
||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||
|
// Main program:
|
||
|
|
||
|
|
||
|
|
||
|
int main(int argc, char *argv[])
|
||
|
{
|
||
|
argList::validOptions.insert("x1", "X1");
|
||
|
argList::validOptions.insert("y1", "Y1");
|
||
|
argList::validOptions.insert("z1", "Z1");
|
||
|
|
||
|
argList::validOptions.insert("x2", "X2");
|
||
|
argList::validOptions.insert("y2", "Y2");
|
||
|
argList::validOptions.insert("z2", "Z2");
|
||
|
|
||
|
# include "setRootCase.H"
|
||
|
# include "createTime.H"
|
||
|
# include "createMesh.H"
|
||
|
|
||
|
// Calculate BB of all cells
|
||
|
|
||
|
|
||
|
myBoundBoxList allBb(mesh.nCells());
|
||
|
|
||
|
const pointField& allPoints = mesh.points();
|
||
|
|
||
|
vectorField bbMin(mesh.nCells());
|
||
|
bbMin = vector(GREAT, GREAT, GREAT);
|
||
|
vectorField bbMax(mesh.nCells());
|
||
|
bbMax = vector(-GREAT, -GREAT, -GREAT);
|
||
|
|
||
|
const labelListList& pCells = mesh.pointCells();
|
||
|
|
||
|
forAll(pCells, pointi)
|
||
|
{
|
||
|
const point& vertCoord = allPoints[pointi];
|
||
|
|
||
|
const labelList& cells = pCells[pointi];
|
||
|
|
||
|
forAll(cells, celli)
|
||
|
{
|
||
|
label cellNum = cells[celli];
|
||
|
|
||
|
bbMin[cellNum].x() = min(bbMin[cellNum].x(), vertCoord.x());
|
||
|
bbMin[cellNum].y() = min(bbMin[cellNum].y(), vertCoord.y());
|
||
|
bbMin[cellNum].z() = min(bbMin[cellNum].z(), vertCoord.z());
|
||
|
|
||
|
bbMax[cellNum].x() = max(bbMax[cellNum].x(), vertCoord.x());
|
||
|
bbMax[cellNum].y() = max(bbMax[cellNum].y(), vertCoord.y());
|
||
|
bbMax[cellNum].z() = max(bbMax[cellNum].z(), vertCoord.z());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
forAll(allBb, celli)
|
||
|
{
|
||
|
allBb[celli] = myBoundBox(bbMin[celli], bbMax[celli]);
|
||
|
}
|
||
|
|
||
|
|
||
|
myBoundBox meshBb(allPoints);
|
||
|
|
||
|
scalar typDim = meshBb.minDim()/111;
|
||
|
|
||
|
myBoundBox shiftedBb
|
||
|
(
|
||
|
meshBb.min(),
|
||
|
point
|
||
|
(
|
||
|
meshBb.max().x() + typDim,
|
||
|
meshBb.max().y() + typDim,
|
||
|
meshBb.max().z() + typDim
|
||
|
)
|
||
|
);
|
||
|
|
||
|
|
||
|
Info<< "Mesh" << endl;
|
||
|
Info<< " bounding box :" << shiftedBb << endl;
|
||
|
Info<< " typical dimension:" << shiftedBb.typDim() << endl;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Now we have allBb and shiftedBb
|
||
|
*/
|
||
|
|
||
|
|
||
|
|
||
|
// Construct table of subset of cells
|
||
|
|
||
|
labelList cellIndices(10);
|
||
|
|
||
|
cellIndices[0] = 1433;
|
||
|
cellIndices[1] = 1434;
|
||
|
cellIndices[2] = 1435;
|
||
|
cellIndices[3] = 1436;
|
||
|
cellIndices[4] = 1437;
|
||
|
cellIndices[5] = 1438;
|
||
|
cellIndices[6] = 1439;
|
||
|
cellIndices[7] = 1440;
|
||
|
cellIndices[8] = 1441;
|
||
|
cellIndices[9] = 1442;
|
||
|
|
||
|
// Get the corresponding bounding boxes
|
||
|
|
||
|
forAll(cellIndices, i)
|
||
|
{
|
||
|
allBb[i] = allBb[cellIndices[i]];
|
||
|
}
|
||
|
allBb.setSize(cellIndices.size());
|
||
|
|
||
|
|
||
|
|
||
|
// Wrap indices and mesh information into helper object
|
||
|
octreeData shapes(mesh, cellIndices);
|
||
|
|
||
|
octree oc
|
||
|
(
|
||
|
shiftedBb, // overall bounding box
|
||
|
shapes, // all information needed to do checks on cells
|
||
|
allBb, // bounding boxes of cells
|
||
|
10.0 // maximum ratio of cubes v.s. cells
|
||
|
);
|
||
|
|
||
|
// scalar x1(readScalar(IStringStream(args.options()["x1"])()));
|
||
|
// scalar y1(readScalar(IStringStream(args.options()["y1"])()));
|
||
|
// scalar z1(readScalar(IStringStream(args.options()["z1"])()));
|
||
|
|
||
|
// scalar x2(readScalar(IStringStream(args.options()["x2"])()));
|
||
|
// scalar y2(readScalar(IStringStream(args.options()["y2"])()));
|
||
|
// scalar z2(readScalar(IStringStream(args.options()["z2"])()));
|
||
|
|
||
|
|
||
|
|
||
|
label nFound = 0;
|
||
|
|
||
|
scalar x = -5.0;
|
||
|
for(int i = 0; i < 100; i++)
|
||
|
{
|
||
|
scalar y = -7.0;
|
||
|
for(int j = 0; j < 10; j++)
|
||
|
{
|
||
|
scalar z = -12.0;
|
||
|
for (int k = 0; k < 10; k++)
|
||
|
{
|
||
|
point sample(x, y, z);
|
||
|
|
||
|
label index = oc.find(sample);
|
||
|
|
||
|
// Convert index into shapes back into cellindex.
|
||
|
label cell;
|
||
|
if (index != -1)
|
||
|
{
|
||
|
cell = cellIndices[index];
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
cell = -1;
|
||
|
}
|
||
|
Info<< "Point:" << sample
|
||
|
<< " is in cell " << cell << "(octree) "
|
||
|
<< mesh.findCell(sample) << "(linear)"
|
||
|
<< endl;
|
||
|
|
||
|
z += 1.2;
|
||
|
}
|
||
|
y += 0.9;
|
||
|
}
|
||
|
x += 0.1;
|
||
|
}
|
||
|
|
||
|
|
||
|
Info<< "nFound=" << nFound << endl;
|
||
|
|
||
|
Info<< "End\n" << endl;
|
||
|
|
||
|
|
||
|
Info<< "Statistics:" << endl
|
||
|
<< " nCells :" << allBb.size() << endl
|
||
|
<< " nNodes :" << oc.nNodes() << endl
|
||
|
<< " nLeaves :" << oc.nLeaves() << endl
|
||
|
<< " nEntries :" << oc.nEntries() << endl
|
||
|
<< " Cells per leaf :"
|
||
|
<< oc.nEntries()/oc.nLeaves()
|
||
|
<< endl
|
||
|
<< " Every cell in :"
|
||
|
<< oc.nEntries()/allBb.size() << " cubes"
|
||
|
<< endl;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
// ************************************************************************* //
|