Merge remote branch 'bundle/olesenm' into home

This commit is contained in:
Mark Olesen 2010-01-15 18:51:21 +01:00
commit 6a8db69cf7
93 changed files with 3333 additions and 1123 deletions

View File

@ -15,8 +15,7 @@ EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/dynamicFvMesh/lnInclude \
-I$(LIB_SRC)/dynamicMesh/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/triSurface/lnInclude
-I$(LIB_SRC)/meshTools/lnInclude
EXE_LIBS = \
-lengine \

View File

@ -0,0 +1,3 @@
globalMeshDataTest.C
EXE = $(FOAM_USER_APPBIN)/globalMeshDataTest

View File

@ -0,0 +1,3 @@
EXE_INC =
EXE_LIBS =

View File

@ -0,0 +1,221 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\/ 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
Application
globalMeshDataTest
Description
Test global point communication
\*---------------------------------------------------------------------------*/
#include "globalMeshData.H"
#include "argList.H"
#include "polyMesh.H"
#include "Time.H"
#include "mapDistribute.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
int main(int argc, char *argv[])
{
# include "setRootCase.H"
# include "createTime.H"
# include "createPolyMesh.H"
const globalMeshData& globalData = mesh.globalData();
const indirectPrimitivePatch& coupledPatch = globalData.coupledPatch();
// Test:print shared points
{
const labelListList& globalPointSlaves =
globalData.globalPointSlaves();
const mapDistribute& globalPointSlavesMap =
globalData.globalPointSlavesMap();
pointField coords(globalPointSlavesMap.constructSize());
SubList<point>(coords, coupledPatch.nPoints()).assign
(
coupledPatch.localPoints()
);
// Exchange data
globalPointSlavesMap.distribute(coords);
// Print
forAll(globalPointSlaves, pointI)
{
const labelList& slavePoints = globalPointSlaves[pointI];
if (slavePoints.size() > 0)
{
Pout<< "Master point:" << pointI
<< " coord:" << coords[pointI]
<< " connected to slave points:" << endl;
forAll(slavePoints, i)
{
Pout<< " " << coords[slavePoints[i]] << endl;
}
}
}
}
// Test: point to faces addressing
{
const labelListList& globalPointBoundaryFaces =
globalData.globalPointBoundaryFaces();
const mapDistribute& globalPointBoundaryFacesMap =
globalData.globalPointBoundaryFacesMap();
label nBnd = mesh.nFaces()-mesh.nInternalFaces();
pointField fc(globalPointBoundaryFacesMap.constructSize());
SubList<point>(fc, nBnd).assign
(
primitivePatch
(
SubList<face>
(
mesh.faces(),
nBnd,
mesh.nInternalFaces()
),
mesh.points()
).faceCentres()
);
// Exchange data
globalPointBoundaryFacesMap.distribute(fc);
// Print
forAll(globalPointBoundaryFaces, pointI)
{
const labelList& bFaces = globalPointBoundaryFaces[pointI];
Pout<< "Point:" << pointI
<< " at:" << coupledPatch.localPoints()[pointI]
<< " connected to faces:" << endl;
forAll(bFaces, i)
{
Pout<< " " << fc[bFaces[i]] << endl;
}
}
}
// Test:point to cells addressing
{
const labelList& boundaryCells = globalData.boundaryCells();
const labelListList& globalPointBoundaryCells =
globalData.globalPointBoundaryCells();
const mapDistribute& globalPointBoundaryCellsMap =
globalData.globalPointBoundaryCellsMap();
pointField cc(globalPointBoundaryCellsMap.constructSize());
forAll(boundaryCells, i)
{
cc[i] = mesh.cellCentres()[boundaryCells[i]];
}
// Exchange data
globalPointBoundaryCellsMap.distribute(cc);
// Print
forAll(globalPointBoundaryCells, pointI)
{
const labelList& bCells = globalPointBoundaryCells[pointI];
Pout<< "Point:" << pointI
<< " at:" << coupledPatch.localPoints()[pointI]
<< " connected to cells:" << endl;
forAll(bCells, i)
{
Pout<< " " << cc[bCells[i]] << endl;
}
}
}
// Test:print shared edges
{
const labelListList& globalEdgeSlaves =
globalData.globalEdgeSlaves();
const mapDistribute& globalEdgeSlavesMap =
globalData.globalEdgeSlavesMap();
// Test: distribute edge centres
pointField ec(globalEdgeSlavesMap.constructSize());
forAll(coupledPatch.edges(), edgeI)
{
ec[edgeI] = coupledPatch.edges()[edgeI].centre
(
coupledPatch.localPoints()
);
}
// Exchange data
globalEdgeSlavesMap.distribute(ec);
// Print
forAll(globalEdgeSlaves, edgeI)
{
const labelList& slaveEdges = globalEdgeSlaves[edgeI];
if (slaveEdges.size() > 0)
{
Pout<< "Master edge:" << edgeI
<< " centre:" << ec[edgeI]
<< " connected to slave edges:" << endl;
forAll(slaveEdges, i)
{
Pout<< " " << ec[slaveEdges[i]] << endl;
}
}
}
}
Info<< "End\n" << endl;
return 0;
}
// ************************************************************************* //

View File

@ -0,0 +1,3 @@
syncToolsTest.C
EXE = $(FOAM_USER_APPBIN)/syncToolsTest

View File

@ -0,0 +1 @@
EXE_INC =

View File

@ -0,0 +1,629 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2007 OpenCFD Ltd.
\\/ 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
Application
syncToolsTest
Description
Test some functionality in syncTools.
\*---------------------------------------------------------------------------*/
#include "argList.H"
#include "polyMesh.H"
#include "Time.H"
#include "Random.H"
#include "PackedList.H"
#include "syncTools.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
void testPackedList(const polyMesh& mesh, Random& rndGen)
{
Info<< nl << "Testing PackedList synchronisation." << endl;
{
PackedList<3> bits(mesh.nEdges());
forAll(bits, i)
{
bits.set(i, rndGen.integer(0,3));
}
labelList edgeValues(mesh.nEdges());
forAll(bits, i)
{
edgeValues[i] = bits.get(i);
}
PackedList<3> maxBits(bits);
labelList maxEdgeValues(edgeValues);
syncTools::syncEdgeList(mesh, bits, minEqOp<unsigned int>(), 0);
syncTools::syncEdgeList(mesh, edgeValues, minEqOp<label>(), 0, false);
syncTools::syncEdgeList(mesh, maxBits, maxEqOp<unsigned int>(), 0);
syncTools::syncEdgeList(mesh, maxEdgeValues, maxEqOp<label>(), 0, false);
forAll(bits, i)
{
if
(
edgeValues[i] != label(bits.get(i))
|| maxEdgeValues[i] != label(maxBits.get(i))
)
{
FatalErrorIn("testPackedList()")
<< "edge:" << i
<< " minlabel:" << edgeValues[i]
<< " minbits:" << bits.get(i)
<< " maxLabel:" << maxEdgeValues[i]
<< " maxBits:" << maxBits.get(i)
<< exit(FatalError);
}
}
}
{
PackedList<3> bits(mesh.nPoints());
forAll(bits, i)
{
bits.set(i, rndGen.integer(0,3));
}
labelList pointValues(mesh.nPoints());
forAll(bits, i)
{
pointValues[i] = bits.get(i);
}
PackedList<3> maxBits(bits);
labelList maxPointValues(pointValues);
syncTools::syncPointList(mesh, bits, minEqOp<unsigned int>(), 0);
syncTools::syncPointList(mesh, pointValues, minEqOp<label>(), 0, false);
syncTools::syncPointList(mesh, maxBits, maxEqOp<unsigned int>(), 0);
syncTools::syncPointList(mesh, maxPointValues, maxEqOp<label>(), 0, false);
forAll(bits, i)
{
if
(
pointValues[i] != label(bits.get(i))
|| maxPointValues[i] != label(maxBits.get(i))
)
{
FatalErrorIn("testPackedList()")
<< "point:" << i
<< " minlabel:" << pointValues[i]
<< " minbits:" << bits.get(i)
<< " maxLabel:" << maxPointValues[i]
<< " maxBits:" << maxBits.get(i)
<< exit(FatalError);
}
}
}
{
PackedList<3> bits(mesh.nFaces());
forAll(bits, faceI)
{
bits.set(faceI, rndGen.integer(0,3));
}
labelList faceValues(mesh.nFaces());
forAll(bits, faceI)
{
faceValues[faceI] = bits.get(faceI);
}
PackedList<3> maxBits(bits);
labelList maxFaceValues(faceValues);
syncTools::syncFaceList(mesh, bits, minEqOp<unsigned int>());
syncTools::syncFaceList(mesh, faceValues, minEqOp<label>(), false);
syncTools::syncFaceList(mesh, maxBits, maxEqOp<unsigned int>());
syncTools::syncFaceList(mesh, maxFaceValues, maxEqOp<label>(), false);
forAll(bits, faceI)
{
if
(
faceValues[faceI] != label(bits.get(faceI))
|| maxFaceValues[faceI] != label(maxBits.get(faceI))
)
{
FatalErrorIn("testPackedList()")
<< "face:" << faceI
<< " minlabel:" << faceValues[faceI]
<< " minbits:" << bits.get(faceI)
<< " maxLabel:" << maxFaceValues[faceI]
<< " maxBits:" << maxBits.get(faceI)
<< exit(FatalError);
}
}
}
}
void testSparseData(const polyMesh& mesh, Random& rndGen)
{
Info<< nl << "Testing Map synchronisation." << endl;
primitivePatch allBoundary
(
SubList<face>
(
mesh.faces(),
mesh.nFaces()-mesh.nInternalFaces(),
mesh.nInternalFaces()
),
mesh.points()
);
const pointField& localPoints = allBoundary.localPoints();
const point greatPoint(GREAT, GREAT, GREAT);
// Point data
// ~~~~~~~~~~
{
// Create some data. Use slightly perturbed positions.
Map<vector> sparseData;
pointField fullData(mesh.nPoints(), greatPoint);
forAll(localPoints, i)
{
const point pt = localPoints[i] + 1E-4*rndGen.vector01();
label meshPointI = allBoundary.meshPoints()[i];
sparseData.insert(meshPointI, pt);
fullData[meshPointI] = pt;
}
//Pout<< "sparseData:" << sparseData << endl;
syncTools::syncPointMap
(
mesh,
sparseData,
minEqOp<vector>(),
true // apply separation
);
syncTools::syncPointList
(
mesh,
fullData,
minEqOp<vector>(),
greatPoint,
true // apply separation
);
// Compare.
// 1. Is all fullData also present in sparseData and same value
forAll(fullData, meshPointI)
{
const point& fullPt = fullData[meshPointI];
if (fullPt != greatPoint)
{
const point& sparsePt = sparseData[meshPointI];
if (fullPt != sparsePt)
{
FatalErrorIn("testSparseData()")
<< "point:" << meshPointI
<< " full:" << fullPt
<< " sparse:" << sparsePt
<< exit(FatalError);
}
}
}
// 2. Does sparseData contain more?
forAllConstIter(Map<vector>, sparseData, iter)
{
const point& sparsePt = iter();
label meshPointI = iter.key();
const point& fullPt = fullData[meshPointI];
if (fullPt != sparsePt)
{
FatalErrorIn("testSparseData()")
<< "point:" << meshPointI
<< " full:" << fullPt
<< " sparse:" << sparsePt
<< exit(FatalError);
}
}
}
// Edge data
// ~~~~~~~~~
{
// Create some data. Use slightly perturbed positions.
EdgeMap<vector> sparseData;
pointField fullData(mesh.nEdges(), greatPoint);
const edgeList& edges = allBoundary.edges();
const labelList meshEdges = allBoundary.meshEdges
(
mesh.edges(),
mesh.pointEdges()
);
forAll(edges, i)
{
const edge& e = edges[i];
const point pt = e.centre(localPoints) + 1E-4*rndGen.vector01();
label meshEdgeI = meshEdges[i];
sparseData.insert(mesh.edges()[meshEdgeI], pt);
fullData[meshEdgeI] = pt;
}
//Pout<< "sparseData:" << sparseData << endl;
syncTools::syncEdgeMap
(
mesh,
sparseData,
minEqOp<vector>(),
true
);
syncTools::syncEdgeList
(
mesh,
fullData,
minEqOp<vector>(),
greatPoint,
true
);
// Compare.
// 1. Is all fullData also present in sparseData and same value
forAll(fullData, meshEdgeI)
{
const point& fullPt = fullData[meshEdgeI];
if (fullPt != greatPoint)
{
const point& sparsePt = sparseData[mesh.edges()[meshEdgeI]];
if (fullPt != sparsePt)
{
FatalErrorIn("testSparseData()")
<< "edge:" << meshEdgeI
<< " points:" << mesh.edges()[meshEdgeI]
<< " full:" << fullPt
<< " sparse:" << sparsePt
<< exit(FatalError);
}
}
}
// 2. Does sparseData contain more?
forAll(fullData, meshEdgeI)
{
const edge& e = mesh.edges()[meshEdgeI];
EdgeMap<vector>::const_iterator iter = sparseData.find(e);
if (iter != sparseData.end())
{
const point& sparsePt = iter();
const point& fullPt = fullData[meshEdgeI];
if (fullPt != sparsePt)
{
FatalErrorIn("testSparseData()")
<< "Extra edge:" << meshEdgeI
<< " points:" << mesh.edges()[meshEdgeI]
<< " full:" << fullPt
<< " sparse:" << sparsePt
<< exit(FatalError);
}
}
}
}
}
void testPointSync(const polyMesh& mesh, Random& rndGen)
{
Info<< nl << "Testing point-wise data synchronisation." << endl;
const point greatPoint(GREAT, GREAT, GREAT);
// Test position.
{
WarningIn("testPointSync()")
<< "Position test only correct for cases without cyclics"
<< " with shared points." << endl;
pointField syncedPoints(mesh.points());
syncTools::syncPointList
(
mesh,
syncedPoints,
minEqOp<point>(),
greatPoint,
true
);
forAll(syncedPoints, pointI)
{
if (mag(syncedPoints[pointI] - mesh.points()[pointI]) > SMALL)
{
FatalErrorIn("testPointSync()")
<< "Point " << pointI
<< " original location " << mesh.points()[pointI]
<< " synced location " << syncedPoints[pointI]
<< exit(FatalError);
}
}
}
// Test masterPoints
{
labelList nMasters(mesh.nPoints(), 0);
PackedBoolList isMasterPoint(syncTools::getMasterPoints(mesh));
forAll(isMasterPoint, pointI)
{
if (isMasterPoint[pointI])
{
nMasters[pointI] = 1;
}
}
syncTools::syncPointList
(
mesh,
nMasters,
plusEqOp<label>(),
0,
false
);
forAll(nMasters, pointI)
{
if (nMasters[pointI] != 1)
{
//FatalErrorIn("testPointSync()")
WarningIn("testPointSync()")
<< "Point " << pointI
<< " original location " << mesh.points()[pointI]
<< " has " << nMasters[pointI]
<< " masters."
//<< exit(FatalError);
<< endl;
}
}
}
}
void testEdgeSync(const polyMesh& mesh, Random& rndGen)
{
Info<< nl << "Testing edge-wise data synchronisation." << endl;
const edgeList& edges = mesh.edges();
const point greatPoint(GREAT, GREAT, GREAT);
// Test position.
{
WarningIn("testEdgeSync()")
<< "Position test only correct for cases without cyclics"
<< " with shared edges." << endl;
pointField syncedMids(edges.size());
forAll(syncedMids, edgeI)
{
syncedMids[edgeI] = edges[edgeI].centre(mesh.points());
}
syncTools::syncEdgeList
(
mesh,
syncedMids,
minEqOp<point>(),
greatPoint,
true
);
forAll(syncedMids, edgeI)
{
point eMid = edges[edgeI].centre(mesh.points());
if (mag(syncedMids[edgeI] - eMid) > SMALL)
{
FatalErrorIn("testEdgeSync()")
<< "Edge " << edgeI
<< " original midpoint " << eMid
<< " synced location " << syncedMids[edgeI]
<< exit(FatalError);
}
}
}
// Test masterEdges
{
labelList nMasters(edges.size(), 0);
PackedBoolList isMasterEdge(syncTools::getMasterEdges(mesh));
forAll(isMasterEdge, edgeI)
{
if (isMasterEdge[edgeI])
{
nMasters[edgeI] = 1;
}
}
syncTools::syncEdgeList
(
mesh,
nMasters,
plusEqOp<label>(),
0,
false
);
forAll(nMasters, edgeI)
{
if (nMasters[edgeI] != 1)
{
//FatalErrorIn("testEdgeSync()")
WarningIn("testEdgeSync()")
<< "Edge " << edgeI
<< " midpoint " << edges[edgeI].centre(mesh.points())
<< " has " << nMasters[edgeI]
<< " masters."
//<< exit(FatalError);
<< endl;
}
}
}
}
void testFaceSync(const polyMesh& mesh, Random& rndGen)
{
Info<< nl << "Testing face-wise data synchronisation." << endl;
// Test position.
{
pointField syncedFc(mesh.faceCentres());
syncTools::syncFaceList
(
mesh,
syncedFc,
maxEqOp<point>(),
true
);
forAll(syncedFc, faceI)
{
if (mag(syncedFc[faceI] - mesh.faceCentres()[faceI]) > SMALL)
{
FatalErrorIn("testFaceSync()")
<< "Face " << faceI
<< " original centre " << mesh.faceCentres()[faceI]
<< " synced centre " << syncedFc[faceI]
<< exit(FatalError);
}
}
}
// Test masterFaces
{
labelList nMasters(mesh.nFaces(), 0);
PackedBoolList isMasterFace(syncTools::getMasterFaces(mesh));
forAll(isMasterFace, faceI)
{
if (isMasterFace[faceI])
{
nMasters[faceI] = 1;
}
}
syncTools::syncFaceList
(
mesh,
nMasters,
plusEqOp<label>(),
false
);
forAll(nMasters, faceI)
{
if (nMasters[faceI] != 1)
{
FatalErrorIn("testFaceSync()")
<< "Face " << faceI
<< " centre " << mesh.faceCentres()[faceI]
<< " has " << nMasters[faceI]
<< " masters."
<< exit(FatalError);
}
}
}
}
// Main program:
int main(int argc, char *argv[])
{
# include "setRootCase.H"
# include "createTime.H"
# include "createPolyMesh.H"
Random rndGen(5341*(Pstream::myProcNo()+1));
// Face sync
testFaceSync(mesh, rndGen);
// Edge sync
testEdgeSync(mesh, rndGen);
// Point sync
testPointSync(mesh, rndGen);
// PackedList synchronisation
testPackedList(mesh, rndGen);
// Sparse synchronisation
testSparseData(mesh, rndGen);
Info<< "End\n" << endl;
return 0;
}
// ************************************************************************* //

View File

@ -1,9 +1,7 @@
EXE_INC = \
-I$(LIB_SRC)/triSurface/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/dynamicMesh/lnInclude
EXE_LIBS = \
-ltriSurface \
-lmeshTools \
-ldynamicMesh

View File

@ -1,9 +1,7 @@
EXE_INC = \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/triSurface/lnInclude \
-I$(LIB_SRC)/dynamicMesh/lnInclude
EXE_LIBS = \
-ldynamicMesh \
-ltriSurface \
-lmeshTools

View File

@ -0,0 +1,3 @@
foamToSurface.C
EXE = $(FOAM_APPBIN)/foamToSurface

View File

@ -0,0 +1,5 @@
EXE_INC = \
-I$(LIB_SRC)/surfMesh/lnInclude
EXE_LIBS = \
-lsurfMesh

View File

@ -0,0 +1,129 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2010-2010 OpenCFD Ltd.
\\/ 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
Application
foamToSurface
Description
Reads an OpenFOAM mesh and writes the boundaries in a surface format.
Usage
- foamToSurface [OPTION] \n
Reads an OpenFOAM mesh and writes the boundaries in a surface format.
@param -scale \<factor\>\n
Specify an alternative geometry scaling factor.
Eg, use @b 1000 to scale @em [m] to @em [mm].
\*---------------------------------------------------------------------------*/
#include "argList.H"
#include "timeSelector.H"
#include "Time.H"
#include "polyMesh.H"
#include "MeshedSurfaces.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program:
int main(int argc, char *argv[])
{
argList::noParallel();
argList::validArgs.append("outputFile.ext");
timeSelector::addOptions();
argList::addOption
(
"scale",
"scale",
"specify geometry scaling factor"
);
# include "setRootCase.H"
const stringList& params = args.additionalArgs();
scalar scaleFactor = 0;
args.optionReadIfPresent<scalar>("scale", scaleFactor);
fileName exportName(params[0]);
fileName exportBase = exportName.lessExt();
word exportExt = exportName.ext();
if (!meshedSurface::canWriteType(exportExt, true))
{
return 1;
}
# include "createTime.H"
instantList timeDirs = timeSelector::select0(runTime, args);
# include "createPolyMesh.H"
forAll(timeDirs, timeI)
{
runTime.setTime(timeDirs[timeI], timeI);
# include "getTimeIndex.H"
polyMesh::readUpdateState state = mesh.readUpdate();
if (timeI == 0 || state != polyMesh::UNCHANGED)
{
if (state == polyMesh::UNCHANGED)
{
exportName = exportBase + "." + exportExt;
}
else
{
exportName =
exportBase + '_' + runTime.timeName() + "." + exportExt;
}
meshedSurface surf(mesh.boundaryMesh());
surf.scalePoints(scaleFactor);
Info<< "writing " << exportName;
if (scaleFactor <= 0)
{
Info<< " without scaling" << endl;
}
else
{
Info<< " with scaling " << scaleFactor << endl;
}
surf.write(exportName);
}
Info<< nl << endl;
}
Info<< "End\n" << endl;
return 0;
}
// ************************************************************************* //

View File

@ -0,0 +1,51 @@
// Read time index from */uniform/time, but treat 0 and constant specially
word timeName = "0";
if
(
runTime.timeName() != "constant"
&& runTime.timeName() != "0"
)
{
IOobject io
(
"time",
runTime.timeName(),
"uniform",
runTime,
IOobject::READ_IF_PRESENT,
IOobject::NO_WRITE,
false
);
if (io.headerOk())
{
IOdictionary timeObject
(
IOobject
(
"time",
runTime.timeName(),
"uniform",
runTime,
IOobject::MUST_READ,
IOobject::NO_WRITE,
false
)
);
label index;
timeObject.lookup("index") >> index;
timeName = Foam::name(index);
}
else
{
timeName = runTime.timeName();
// Info<< "skip ... missing entry " << io.objectPath() << endl;
// continue;
}
}
Info<< "\nTime [" << timeName << "] = " << runTime.timeName() << nl;

View File

@ -1,7 +1,7 @@
EXE_INC = \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/triSurface/lnInclude
-I$(LIB_SRC)/surfMesh/lnInclude
EXE_LIBS = \
-lmeshTools \
-ltriSurface
-lsurfMesh

View File

@ -41,7 +41,8 @@ Description
#include "cellSet.H"
#include "faceSet.H"
#include "DynamicList.H"
#include "triSurface.H"
#include "MeshedSurfaces.H"
using namespace Foam;
@ -268,9 +269,11 @@ void readCells
break;
}
IStringStream lineStr(line);
label cellI, feID, physProp, matProp, colour, nNodes;
lineStr >> cellI >> feID >> physProp >> matProp >> colour >> nNodes;
IStringStream lineStr(line);
lineStr
>> cellI >> feID >> physProp >> matProp >> colour >> nNodes;
if (foundFeType.insert(feID))
{
@ -297,7 +300,8 @@ void readCells
face cVerts(3);
IStringStream lineStr(line);
lineStr >> cVerts[0] >> cVerts[1] >> cVerts[2];
lineStr
>> cVerts[0] >> cVerts[1] >> cVerts[2];
boundaryFaces.append(cVerts);
boundaryFaceIndices.append(cellI);
}
@ -308,7 +312,8 @@ void readCells
face cVerts(4);
IStringStream lineStr(line);
lineStr >> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3];
lineStr
>> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3];
boundaryFaces.append(cVerts);
boundaryFaceIndices.append(cellI);
}
@ -319,14 +324,15 @@ void readCells
labelList cVerts(4);
IStringStream lineStr(line);
lineStr >> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3];
lineStr
>> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3];
cellVerts.append(cellShape(tet, cVerts, true));
cellMaterial.append(physProp);
if (cellVerts.last().size() != cVerts.size())
{
Pout<< "Line:" << is.lineNumber()
Info<< "Line:" << is.lineNumber()
<< " element:" << cellI
<< " type:" << feID
<< " collapsed from " << cVerts << nl
@ -341,15 +347,16 @@ void readCells
labelList cVerts(6);
IStringStream lineStr(line);
lineStr >> cVerts[0] >> cVerts[1] >> cVerts[2] >> cVerts[3]
>> cVerts[4] >> cVerts[5];
lineStr
>> cVerts[0] >> cVerts[1] >> cVerts[2]
>> cVerts[3] >> cVerts[4] >> cVerts[5];
cellVerts.append(cellShape(prism, cVerts, true));
cellMaterial.append(physProp);
if (cellVerts.last().size() != cVerts.size())
{
Pout<< "Line:" << is.lineNumber()
Info<< "Line:" << is.lineNumber()
<< " element:" << cellI
<< " type:" << feID
<< " collapsed from " << cVerts << nl
@ -373,7 +380,7 @@ void readCells
if (cellVerts.last().size() != cVerts.size())
{
Pout<< "Line:" << is.lineNumber()
Info<< "Line:" << is.lineNumber()
<< " element:" << cellI
<< " type:" << feID
<< " collapsed from " << cVerts << nl
@ -388,7 +395,7 @@ void readCells
IOWarningIn("readCells(IFstream&, label&)", is)
<< "Cell type " << feID << " not supported" << endl;
}
is.getLine(line); //Do nothing
is.getLine(line); // Do nothing
}
}
@ -579,7 +586,11 @@ int main(int argc, char *argv[])
{
argList::noParallel();
argList::validArgs.append(".unv file");
argList::addBoolOption("dump");
argList::addBoolOption
(
"dump",
"dump boundary faces as boundaryFaces.obj (for debugging)"
);
# include "setRootCase.H"
# include "createTime.H"
@ -858,40 +869,25 @@ int main(int argc, char *argv[])
polyPoints /= lengthScale;
// For debugging: dump boundary faces as triSurface
// For debugging: dump boundary faces as OBJ surface mesh
if (args.optionFound("dump"))
{
DynamicList<labelledTri> triangles(boundaryFaces.size());
forAll(boundaryFaces, i)
{
const face& f = boundaryFaces[i];
faceList triFaces(f.nTriangles(polyPoints));
label nTri = 0;
f.triangles(polyPoints, nTri, triFaces);
forAll(triFaces, triFaceI)
{
const face& f = triFaces[triFaceI];
triangles.append(labelledTri(f[0], f[1], f[2], 0));
}
}
// Create globally numbered tri surface
triSurface rawSurface(triangles.shrink(), polyPoints);
// Create locally numbered tri surface
triSurface surface
(
rawSurface.localFaces(),
rawSurface.localPoints()
);
Info<< "Writing boundary faces to STL file boundaryFaces.stl"
Info<< "Writing boundary faces to OBJ file boundaryFaces.obj"
<< nl << endl;
surface.write(runTime.path()/"boundaryFaces.stl");
// Create globally numbered surface
meshedSurface rawSurface
(
xferCopy(polyPoints),
xferCopyTo< faceList >(boundaryFaces)
);
// Write locally numbered surface
meshedSurface
(
xferCopy(rawSurface.localPoints()),
xferCopy(rawSurface.localFaces())
).write(runTime.path()/"boundaryFaces.obj");
}

View File

@ -180,6 +180,12 @@ castellatedMeshControls
// NOTE: This point should never be on a face, always inside a cell, even
// after refinement.
locationInMesh (5 0.28 0.43);
// Whether any faceZones (as specified in the refinementSurfaces)
// are only on the boundary of corresponding cellZones or also allow
// free-standing zone faces. Not used if there are no faceZones.
allowFreeStandingZoneFaces true;
}
@ -274,6 +280,7 @@ addLayersControls
maxThicknessToMedialRatio 0.3;
// Angle used to pick up medial axis points
// Note: changed(corrected) w.r.t 16x! 90 degrees corresponds to 130 in 16x.
minMedianAxisAngle 90;
// Create buffer region for new layer terminations

View File

@ -1,10 +1,7 @@
EXE_INC = \
-I$(LIB_SRC)/triSurface/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/dynamicMesh/lnInclude
EXE_LIBS = \
-ltriSurface \
-ldynamicMesh \
-lmeshTools

View File

@ -1,8 +1 @@
/*
EXE_INC = \
-I$(LIB_SRC)/triSurface/lnInclude
EXE_LIBS = \
-lmeshTools \
-ltriSurface
*/
/* */

View File

@ -1,9 +1,7 @@
EXE_INC = \
-I$(LIB_SRC)/dynamicMesh/lnInclude \
-I$(LIB_SRC)/triSurface/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude
EXE_LIBS = \
-ldynamicMesh \
-lmeshTools

View File

@ -18,6 +18,7 @@ EXE_LIBS = \
-lengine \
-lerrorEstimation \
-lfieldFunctionObjects \
-lfileFormats \
-lfiniteVolume \
-lforces \
-lfvMotionSolvers \

View File

@ -2,7 +2,6 @@ EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/sampling/lnInclude \
-I$(LIB_SRC)/triSurface/lnInclude \
-I$(LIB_SRC)/lagrangian/basic/lnInclude
EXE_LIBS = \
@ -10,5 +9,4 @@ EXE_LIBS = \
-lgenericPatchFields \
-lmeshTools \
-lsampling \
-ltriSurface \
-llagrangian

View File

@ -3,7 +3,6 @@ EXE_INC = \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/sampling/lnInclude \
-I$(LIB_SRC)/surfMesh/lnInclude \
-I$(LIB_SRC)/triSurface/lnInclude \
-I$(LIB_SRC)/lagrangian/basic/lnInclude
EXE_LIBS = \
@ -12,5 +11,4 @@ EXE_LIBS = \
-lmeshTools \
-lsampling \
-lsurfMesh \
-ltriSurface \
-llagrangian

View File

@ -1,5 +1,4 @@
EXE_INC = \
/* -I$(LIB_SRC)/cfdTools/general/lnInclude */ \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/triSurface/lnInclude

View File

@ -1,9 +1,7 @@
EXE_INC = \
-I$(LIB_SRC)/meshTools/lnInclude \
-I$(LIB_SRC)/edgeMesh/lnInclude \
-I$(LIB_SRC)/triSurface/lnInclude
-I$(LIB_SRC)/edgeMesh/lnInclude
EXE_LIBS = \
-lmeshTools \
-ledgeMesh \
-ltriSurface
-ledgeMesh

View File

@ -79,11 +79,7 @@ void deleteBox
{
const point eMid = surf.edges()[edgeI].centre(surf.localPoints());
if
(
(removeInside && bb.contains(eMid))
|| (!removeInside && !bb.contains(eMid))
)
if (removeInside ? bb.contains(eMid) : !bb.contains(eMid))
{
edgeStat[edgeI] = surfaceFeatures::NONE;
}
@ -133,7 +129,6 @@ int main(int argc, char *argv[])
// Either construct features from surface&featureangle or read set.
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -1,6 +1,6 @@
EXE_INC = \
-I$(LIB_SRC)/triSurface/lnInclude
-I$(LIB_SRC)/surfMesh/lnInclude
EXE_LIBS = \
-lmeshTools \
-ltriSurface
-lsurfMesh

View File

@ -23,18 +23,16 @@ License
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description
Finds nearest triangle and vertex.
Finds nearest face and vertex.
\*---------------------------------------------------------------------------*/
#include "triSurface.H"
#include "argList.H"
#include "OFstream.H"
#ifndef namespaceFoam
#define namespaceFoam
using namespace Foam;
#endif
#include "MeshedSurfaces.H"
using namespace Foam;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -44,9 +42,9 @@ int main(int argc, char *argv[])
{
argList::noParallel();
argList::validArgs.clear();
argList::addOption("x", "X");
argList::addOption("y", "Y");
argList::addOption("z", "Z");
argList::addOption("x", "X", "The point x-coordinate (if non-zero)");
argList::addOption("y", "Y", "The point y-coordinate (if non-zero)");
argList::addOption("z", "Z", "The point y-coordinate (if non-zero)");
argList::validArgs.append("surface file");
@ -54,15 +52,15 @@ int main(int argc, char *argv[])
point samplePt
(
args.optionRead<scalar>("x"),
args.optionRead<scalar>("y"),
args.optionRead<scalar>("z")
args.optionLookupOrDefault<scalar>("x", 0),
args.optionLookupOrDefault<scalar>("y", 0),
args.optionLookupOrDefault<scalar>("z", 0)
);
Info<< "Looking for nearest face/vertex to " << samplePt << endl;
Info<< "Reading surf1 ..." << endl;
triSurface surf1(args.additionalArgs()[0]);
Info<< "Reading surf ..." << endl;
meshedSurface surf1(args.additionalArgs()[0]);
//
// Nearest vertex
@ -83,11 +81,11 @@ int main(int argc, char *argv[])
}
}
Info<< "Nearest vertex:" << endl
<< " index :" << minIndex << " (in localPoints)" << endl
Info<< "Nearest vertex:" << nl
<< " index :" << minIndex << " (in localPoints)" << nl
<< " index :" << surf1.meshPoints()[minIndex]
<< " (in points)" << endl
<< " coordinates:" << localPoints[minIndex] << endl
<< " (in points)" << nl
<< " coordinates:" << localPoints[minIndex] << nl
<< endl;
//
@ -101,8 +99,7 @@ int main(int argc, char *argv[])
forAll(surf1, faceI)
{
const labelledTri& f = surf1[faceI];
const point centre = f.centre(points);
const point centre = surf1[faceI].centre(points);
const scalar dist = mag(centre - samplePt);
if (dist < minDist)
@ -112,16 +109,19 @@ int main(int argc, char *argv[])
}
}
const labelledTri& f = surf1[minIndex];
const face& f = surf1[minIndex];
Info<< "Face with nearest centre:" << endl
<< " index :" << minIndex << endl
<< " centre :" << f.centre(points) << endl
<< " face :" << f << endl
<< " vertex coords:" << points[f[0]] << " "
<< points[f[1]] << " " << points[f[2]] << endl
<< endl;
Info<< "Face with nearest centre:" << nl
<< " index :" << minIndex << nl
<< " centre :" << f.centre(points) << nl
<< " face :" << f << nl
<< " vertex coords:\n";
forAll(f, fp)
{
Info<< " " << points[f[fp]] << "\n";
}
Info<< endl;
Info<< "End\n" << endl;

View File

@ -202,6 +202,7 @@ void massPropertiesSolid
J *= density;
}
void massPropertiesShell
(
const pointField& pts,
@ -272,7 +273,7 @@ tensor applyParallelAxisTheorem
vector d = (refPt - cM);
return (J + m*((d & d)*I - d*d));
return J + m*((d & d)*I - d*d);
}
@ -389,7 +390,7 @@ int main(int argc, char *argv[])
<< eVec.x() << ' ' << eVec.y() << ' ' << eVec.z()
<< endl;
if(calcAroundRefPt)
if (calcAroundRefPt)
{
Info << "Inertia tensor relative to " << refPt << " = "
<< applyParallelAxisTheorem(m, cM, J, refPt)

View File

@ -1,6 +1,6 @@
EXE_INC = \
-I$(LIB_SRC)/triSurface/lnInclude
-I$(LIB_SRC)/surfMesh/lnInclude
EXE_LIBS = \
-lmeshTools \
-ltriSurface
-lsurfMesh

View File

@ -23,15 +23,16 @@ License
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description
Example of simple laplacian smoother
Example of a simple laplacian smoother
\*---------------------------------------------------------------------------*/
#include "triSurface.H"
#include "argList.H"
#include "OFstream.H"
#include "boundBox.H"
#include "MeshedSurfaces.H"
using namespace Foam;
@ -61,23 +62,20 @@ int main(int argc, char *argv[])
label iters(readLabel(IStringStream(args.additionalArgs()[2])()));
fileName outFileName(args.additionalArgs()[3]);
Info<< "Relax:" << relax << endl;
Info<< "Iters:" << iters << endl;
Info<< "Relax:" << relax << nl
<< "Iters:" << iters << nl
<< "Reading surface from " << surfFileName << " ..." << endl;
meshedSurface surf1(surfFileName);
Info<< "Reading surface from " << surfFileName << " ..." << endl;
triSurface surf1(surfFileName);
Info<< "Triangles : " << surf1.size() << endl;
Info<< "Vertices : " << surf1.nPoints() << endl;
Info<< "Bounding Box : " << boundBox(surf1.localPoints()) << endl;
Info<< "Faces : " << surf1.size() << nl
<< "Vertices : " << surf1.nPoints() << nl
<< "Bounding Box : " << boundBox(surf1.localPoints()) << endl;
pointField newPoints(surf1.localPoints());
const labelListList& pointEdges = surf1.pointEdges();
for (label iter = 0; iter < iters; iter++)
{
forAll(pointEdges, vertI)
@ -100,16 +98,14 @@ int main(int argc, char *argv[])
}
}
triSurface surf2
(
surf1.localFaces(),
surf1.patches(),
newPoints
);
Info<< "Writing surface to " << outFileName << " ..." << endl;
surf2.write(outFileName);
meshedSurface
(
xferMove(newPoints),
xferCopy(surf1.localFaces()),
xferCopy(surf1.surfZones())
).write(outFileName);
Info<< "End\n" << endl;

View File

@ -100,10 +100,8 @@ int main(int argc, char *argv[])
meshSubsetDict.lookup("addFaceNeighbours")
);
Switch invertSelection
(
meshSubsetDict.lookup("invertSelection")
);
const bool invertSelection =
meshSubsetDict.lookupOrDefault<bool>("invertSelection", false);
// Mark the cells for the subset
@ -246,7 +244,7 @@ int main(int argc, char *argv[])
// bb of surface
treeBoundBox bb(selectSurf.localPoints());
// Radnom number generator
// Random number generator
Random rndGen(354543);
// search engine
@ -269,14 +267,11 @@ int main(int argc, char *argv[])
indexedOctree<treeDataTriSurface>::volumeType t =
selectTree.getVolumeType(fc);
if (t == indexedOctree<treeDataTriSurface>::INSIDE && !outside)
{
facesToSubset[faceI] = true;
}
else if
if
(
t == indexedOctree<treeDataTriSurface>::OUTSIDE
&& outside
outside
? (t == indexedOctree<treeDataTriSurface>::OUTSIDE)
: (t == indexedOctree<treeDataTriSurface>::INSIDE)
)
{
facesToSubset[faceI] = true;
@ -346,20 +341,11 @@ int main(int argc, char *argv[])
if (invertSelection)
{
Info<< "Inverting selection." << endl;
boolList newFacesToSubset(facesToSubset.size());
forAll(facesToSubset, i)
{
if (facesToSubset[i])
{
newFacesToSubset[i] = false;
}
else
{
newFacesToSubset[i] = true;
}
facesToSubset[i] = facesToSubset[i] ? false : true;
}
facesToSubset.transfer(newFacesToSubset);
}

View File

@ -36,7 +36,7 @@ zone
surface
{
name "sphere.stl";
outside yes;
outside yes;
}
// Extend selection with edge neighbours

View File

@ -1,6 +1,5 @@
EXE_INC = \
-I$(LIB_SRC)/triSurface/lnInclude
-I$(LIB_SRC)/surfMesh/lnInclude
EXE_LIBS = \
-lmeshTools \
-ltriSurface
-lsurfMesh

View File

@ -35,7 +35,6 @@ Description
\*---------------------------------------------------------------------------*/
#include "triSurface.H"
#include "argList.H"
#include "OFstream.H"
#include "IFstream.H"
@ -45,6 +44,8 @@ Description
#include "quaternion.H"
#include "mathematicalConstants.H"
#include "MeshedSurfaces.H"
using namespace Foam;
using namespace Foam::constant::mathematical;
@ -114,7 +115,7 @@ int main(int argc, char *argv[])
<< exit(FatalError);
}
triSurface surf1(surfFileName);
meshedSurface surf1(surfFileName);
pointField points(surf1.points());
@ -193,9 +194,8 @@ int main(int argc, char *argv[])
points.replace(vector::Z, scaleVector.z()*points.component(vector::Z));
}
triSurface surf2(surf1, surf1.patches(), points);
surf2.write(outFileName);
surf1.movePoints(points);
surf1.write(outFileName);
Info<< "End\n" << endl;

View File

@ -22,12 +22,14 @@ wmake libso OpenFOAM
wmake libso lagrangian/basic
wmake libso fileFormats
wmake libso edgeMesh
wmake libso surfMesh
wmake libso triSurface
# Decomposition methods needed by meshTools
wmake libso parallel/decompositionMethods
wmake libso parallel/metisDecomp
wmake libso meshTools
wmake libso finiteVolume

View File

@ -32,6 +32,8 @@ License
#include "demandDrivenData.H"
#include "globalPoints.H"
//#include "geomGlobalPoints.H"
#include "polyMesh.H"
#include "mapDistribute.H"
#include "labelIOList.H"
#include "PackedList.H"
#include "mergePoints.H"
@ -115,24 +117,17 @@ void Foam::globalMeshData::initProcAddr()
// Given information about locally used edges allocate global shared edges.
void Foam::globalMeshData::countSharedEdges
(
const HashTable<labelList, edge, Hash<edge> >& procSharedEdges,
HashTable<label, edge, Hash<edge> >& globalShared,
const EdgeMap<labelList>& procSharedEdges,
EdgeMap<label>& globalShared,
label& sharedEdgeI
)
{
// Count occurrences of procSharedEdges in global shared edges table.
for
(
HashTable<labelList, edge, Hash<edge> >::const_iterator iter =
procSharedEdges.begin();
iter != procSharedEdges.end();
++iter
)
forAllConstIter(EdgeMap<labelList>, procSharedEdges, iter)
{
const edge& e = iter.key();
HashTable<label, edge, Hash<edge> >::iterator globalFnd =
globalShared.find(e);
EdgeMap<label>::iterator globalFnd = globalShared.find(e);
if (globalFnd == globalShared.end())
{
@ -189,10 +184,7 @@ void Foam::globalMeshData::calcSharedEdges() const
// Find edges using shared points. Store correspondence to local edge
// numbering. Note that multiple local edges can have the same shared
// points! (for cyclics or separated processor patches)
HashTable<labelList, edge, Hash<edge> > localShared
(
2*sharedPtAddr.size()
);
EdgeMap<labelList> localShared(2*sharedPtAddr.size());
const edgeList& edges = mesh_.edges();
@ -218,7 +210,7 @@ void Foam::globalMeshData::calcSharedEdges() const
sharedPtAddr[e1Fnd()]
);
HashTable<labelList, edge, Hash<edge> >::iterator iter =
EdgeMap<labelList>::iterator iter =
localShared.find(sharedEdge);
if (iter == localShared.end())
@ -249,7 +241,7 @@ void Foam::globalMeshData::calcSharedEdges() const
// used). But then this only gets done once so not too bothered about the
// extra global communication.
HashTable<label, edge, Hash<edge> > globalShared(nGlobalPoints());
EdgeMap<label> globalShared(nGlobalPoints());
if (Pstream::master())
{
@ -275,10 +267,7 @@ void Foam::globalMeshData::calcSharedEdges() const
{
// Receive the edges using shared points from the slave.
IPstream fromSlave(Pstream::blocking, slave);
HashTable<labelList, edge, Hash<edge> > procSharedEdges
(
fromSlave
);
EdgeMap<labelList> procSharedEdges(fromSlave);
if (debug)
{
@ -295,17 +284,11 @@ void Foam::globalMeshData::calcSharedEdges() const
// These were only used once so are not proper shared edges.
// Remove them.
{
HashTable<label, edge, Hash<edge> > oldSharedEdges(globalShared);
EdgeMap<label> oldSharedEdges(globalShared);
globalShared.clear();
for
(
HashTable<label, edge, Hash<edge> >::const_iterator iter =
oldSharedEdges.begin();
iter != oldSharedEdges.end();
++iter
)
forAllConstIter(EdgeMap<label>, oldSharedEdges, iter)
{
if (iter() != -1)
{
@ -361,18 +344,11 @@ void Foam::globalMeshData::calcSharedEdges() const
DynamicList<label> dynSharedEdgeLabels(globalShared.size());
DynamicList<label> dynSharedEdgeAddr(globalShared.size());
for
(
HashTable<labelList, edge, Hash<edge> >::const_iterator iter =
localShared.begin();
iter != localShared.end();
++iter
)
forAllConstIter(EdgeMap<labelList>, localShared, iter)
{
const edge& e = iter.key();
HashTable<label, edge, Hash<edge> >::const_iterator edgeFnd =
globalShared.find(e);
EdgeMap<label>::const_iterator edgeFnd = globalShared.find(e);
if (edgeFnd != globalShared.end())
{
@ -434,6 +410,557 @@ Foam::label Foam::globalMeshData::countCoincidentFaces
}
void Foam::globalMeshData::calcGlobalPointSlaves() const
{
if (debug)
{
Pout<< "globalMeshData::calcGlobalPointSlaves() :"
<< " calculating coupled master to slave point addressing."
<< endl;
}
// Calculate connected points for master points
globalPoints globalData(mesh_, coupledPatch(), true);
const Map<label>& meshToProcPoint = globalData.meshToProcPoint();
// Create global numbering for coupled points
globalPointNumberingPtr_.reset
(
new globalIndex(globalData.globalIndices())
);
const globalIndex& globalIndices = globalPointNumberingPtr_();
// Create master to slave addressing. Empty for slave points.
globalPointSlavesPtr_.reset
(
new labelListList(coupledPatch().nPoints())
);
labelListList& globalPointSlaves = globalPointSlavesPtr_();
forAllConstIter(Map<label>, meshToProcPoint, iter)
{
label localPointI = iter.key();
const labelList& pPoints = globalData.procPoints()[iter()];
// Am I master?
if
(
globalIndices.isLocal(pPoints[0])
&& globalIndices.toLocal(pPoints[0]) == localPointI
)
{
labelList& slaves = globalPointSlaves[localPointI];
slaves.setSize(pPoints.size()-1);
for (label i = 1; i < pPoints.size(); i++)
{
slaves[i-1] = pPoints[i];
}
}
}
// Create schedule to get information from slaves onto master
// Construct compact numbering and distribution map.
// Changes globalPointSlaves to be indices into compact data
List<Map<label> > compactMap(Pstream::nProcs());
globalPointSlavesMapPtr_.reset
(
new mapDistribute
(
globalIndices,
globalPointSlaves,
compactMap
)
);
if (debug)
{
Pout<< "globalMeshData::calcGlobalPointSlaves() :"
<< " coupled points:" << coupledPatch().nPoints()
<< " additional remote points:"
<< globalPointSlavesMapPtr_().constructSize()
- coupledPatch().nPoints()
<< endl;
}
}
void Foam::globalMeshData::calcGlobalEdgeSlaves() const
{
if (debug)
{
Pout<< "globalMeshData::calcGlobalEdgeSlaves() :"
<< " calculating coupled master to slave edge addressing."
<< endl;
}
const labelListList& globalPointSlaves = this->globalPointSlaves();
const mapDistribute& globalPointSlavesMap = this->globalPointSlavesMap();
// - Send across connected edges (in global edge addressing)
// - Check on receiving side whether edge has same slave edge
// on both endpoints.
// Create global numbering for coupled edges
globalEdgeNumberingPtr_.reset
(
new globalIndex(coupledPatch().nEdges())
);
const globalIndex& globalIndices = globalEdgeNumberingPtr_();
// Coupled point to global coupled edges.
labelListList globalPointEdges(globalPointSlavesMap.constructSize());
// Create local version
const labelListList& pointEdges = coupledPatch().pointEdges();
forAll(pointEdges, pointI)
{
const labelList& pEdges = pointEdges[pointI];
labelList& globalPEdges = globalPointEdges[pointI];
globalPEdges.setSize(pEdges.size());
forAll(pEdges, i)
{
globalPEdges[i] = globalIndices.toGlobal(pEdges[i]);
}
}
// Pull slave data to master
globalPointSlavesMap.distribute(globalPointEdges);
// Now check on master if any of my edges are also on slave.
// This assumes that if slaves have a coupled edge it is also on
// the master (otherwise the mesh would be illegal anyway)
labelHashSet pointEdgeSet;
const edgeList& edges = coupledPatch().edges();
// Create master to slave addressing. Empty for slave edges.
globalEdgeSlavesPtr_.reset(new labelListList(edges.size()));
labelListList& globalEdgeSlaves = globalEdgeSlavesPtr_();
forAll(edges, edgeI)
{
const edge& e = edges[edgeI];
const labelList& slaves0 = globalPointSlaves[e[0]];
const labelList& slaves1 = globalPointSlaves[e[1]];
// Check for edges that are in both slaves0 and slaves1.
pointEdgeSet.clear();
forAll(slaves0, i)
{
const labelList& connectedEdges = globalPointEdges[slaves0[i]];
pointEdgeSet.insert(connectedEdges);
}
forAll(slaves1, i)
{
const labelList& connectedEdges = globalPointEdges[slaves1[i]];
forAll(connectedEdges, j)
{
label globalEdgeI = connectedEdges[j];
if (pointEdgeSet.found(globalEdgeI))
{
// Found slave edge.
label sz = globalEdgeSlaves[edgeI].size();
globalEdgeSlaves[edgeI].setSize(sz+1);
globalEdgeSlaves[edgeI][sz] = globalEdgeI;
}
}
}
}
// Construct map
List<Map<label> > compactMap(Pstream::nProcs());
globalEdgeSlavesMapPtr_.reset
(
new mapDistribute
(
globalIndices,
globalEdgeSlaves,
compactMap
)
);
if (debug)
{
Pout<< "globalMeshData::calcGlobalEdgeSlaves() :"
<< " coupled edge:" << edges.size()
<< " additional remote edges:"
<< globalEdgeSlavesMapPtr_().constructSize() - edges.size()
<< endl;
}
}
// Calculate uncoupled boundary faces (without calculating
// primitiveMesh::pointFaces())
void Foam::globalMeshData::calcPointBoundaryFaces
(
labelListList& pointBoundaryFaces
) const
{
const polyBoundaryMesh& bMesh = mesh_.boundaryMesh();
const Map<label>& meshPointMap = coupledPatch().meshPointMap();
// 1. Count
labelList nPointFaces(coupledPatch().nPoints(), 0);
forAll(bMesh, patchI)
{
const polyPatch& pp = bMesh[patchI];
if (!pp.coupled())
{
forAll(pp, i)
{
const face& f = pp[i];
forAll(f, fp)
{
Map<label>::const_iterator iter = meshPointMap.find(f[fp]);
if (iter != meshPointMap.end())
{
nPointFaces[iter()]++;
}
}
}
}
}
// 2. Size
pointBoundaryFaces.setSize(coupledPatch().nPoints());
forAll(nPointFaces, pointI)
{
pointBoundaryFaces[pointI].setSize(nPointFaces[pointI]);
}
nPointFaces = 0;
// 3. Fill
forAll(bMesh, patchI)
{
const polyPatch& pp = bMesh[patchI];
if (!pp.coupled())
{
forAll(pp, i)
{
const face& f = pp[i];
forAll(f, fp)
{
Map<label>::const_iterator iter = meshPointMap.find(f[fp]);
if (iter != meshPointMap.end())
{
label bFaceI = pp.start() + i - mesh_.nInternalFaces();
pointBoundaryFaces[iter()][nPointFaces[iter()]++] =
bFaceI;
}
}
}
}
}
}
void Foam::globalMeshData::calcGlobalPointBoundaryFaces() const
{
if (debug)
{
Pout<< "globalMeshData::calcGlobalPointBoundaryFaces() :"
<< " calculating coupled point to boundary face addressing."
<< endl;
}
// Construct local point to (uncoupled)boundaryfaces.
labelListList pointBoundaryFaces;
calcPointBoundaryFaces(pointBoundaryFaces);
// Global indices for boundary faces
globalBoundaryFaceNumberingPtr_.reset
(
new globalIndex(mesh_.nFaces()-mesh_.nInternalFaces())
);
globalIndex& globalIndices = globalBoundaryFaceNumberingPtr_();
// Convert local boundary faces to global numbering
globalPointBoundaryFacesPtr_.reset
(
new labelListList(globalPointSlavesMap().constructSize())
);
labelListList& globalPointBoundaryFaces = globalPointBoundaryFacesPtr_();
forAll(pointBoundaryFaces, pointI)
{
const labelList& bFaces = pointBoundaryFaces[pointI];
labelList& globalFaces = globalPointBoundaryFaces[pointI];
globalFaces.setSize(bFaces.size());
forAll(bFaces, i)
{
globalFaces[i] = globalIndices.toGlobal(bFaces[i]);
}
}
// Pull slave pointBoundaryFaces to master
globalPointSlavesMap().distribute(globalPointBoundaryFaces);
// Merge slave labels into master globalPointBoundaryFaces
const labelListList& pointSlaves = globalPointSlaves();
forAll(pointSlaves, pointI)
{
const labelList& slaves = pointSlaves[pointI];
if (slaves.size() > 0)
{
labelList& myBFaces = globalPointBoundaryFaces[pointI];
forAll(slaves, i)
{
const labelList& slaveBFaces =
globalPointBoundaryFaces[slaves[i]];
// Add all slaveBFaces. Note that need to check for
// uniqueness only in case of cyclics.
label sz = myBFaces.size();
myBFaces.setSize(sz+slaveBFaces.size());
forAll(slaveBFaces, j)
{
label slave = slaveBFaces[j];
if (findIndex(SubList<label>(myBFaces, sz), slave) == -1)
{
myBFaces[sz++] = slave;
}
}
myBFaces.setSize(sz);
}
}
}
// Copy merged boundaryFaces back from master into slave slot
forAll(pointSlaves, pointI)
{
const labelList& bFaces = globalPointBoundaryFaces[pointI];
const labelList& slaves = pointSlaves[pointI];
forAll(slaves, i)
{
globalPointBoundaryFaces[slaves[i]] = bFaces;
}
}
// Sync back to slaves.
globalPointSlavesMap().reverseDistribute
(
coupledPatch().nPoints(),
globalPointBoundaryFaces
);
// Construct a map to get the face data directly
List<Map<label> > compactMap(Pstream::nProcs());
globalPointBoundaryFacesMapPtr_.reset
(
new mapDistribute
(
globalIndices,
globalPointBoundaryFaces,
compactMap
)
);
if (debug)
{
Pout<< "globalMeshData::calcGlobalPointBoundaryFaces() :"
<< " coupled points:" << coupledPatch().nPoints()
<< " local boundary faces:" << globalIndices.localSize()
<< " additional remote faces:"
<< globalPointBoundaryFacesMapPtr_().constructSize()
- globalIndices.localSize()
<< endl;
}
}
void Foam::globalMeshData::calcGlobalPointBoundaryCells() const
{
if (debug)
{
Pout<< "globalMeshData::calcGlobalPointBoundaryCells() :"
<< " calculating coupled point to boundary cell addressing."
<< endl;
}
// Create map of boundary cells and point-cell addressing
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
label bCellI = 0;
Map<label> meshCellMap(4*coupledPatch().nPoints());
DynamicList<label> cellMap(meshCellMap.size());
// Create addressing for point to boundary cells (local)
labelListList pointBoundaryCells(coupledPatch().nPoints());
forAll(coupledPatch().meshPoints(), pointI)
{
label meshPointI = coupledPatch().meshPoints()[pointI];
const labelList& pCells = mesh_.pointCells(meshPointI);
labelList& bCells = pointBoundaryCells[pointI];
bCells.setSize(pCells.size());
forAll(pCells, i)
{
label cellI = pCells[i];
Map<label>::iterator fnd = meshCellMap.find(cellI);
if (fnd != meshCellMap.end())
{
bCells[i] = fnd();
}
else
{
meshCellMap.insert(cellI, bCellI);
cellMap.append(cellI);
bCells[i] = bCellI;
bCellI++;
}
}
}
boundaryCellsPtr_.reset(new labelList());
labelList& boundaryCells = boundaryCellsPtr_();
boundaryCells.transfer(cellMap.shrink());
// Convert point-cells to global point numbers
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
globalBoundaryCellNumberingPtr_.reset
(
new globalIndex(boundaryCells.size())
);
globalIndex& globalIndices = globalBoundaryCellNumberingPtr_();
globalPointBoundaryCellsPtr_.reset
(
new labelListList(globalPointSlavesMap().constructSize())
);
labelListList& globalPointBoundaryCells = globalPointBoundaryCellsPtr_();
forAll(pointBoundaryCells, pointI)
{
const labelList& pCells = pointBoundaryCells[pointI];
labelList& globalCells = globalPointBoundaryCells[pointI];
globalCells.setSize(pCells.size());
forAll(pCells, i)
{
globalCells[i] = globalIndices.toGlobal(pCells[i]);
}
}
// Pull slave pointBoundaryCells to master
globalPointSlavesMap().distribute(globalPointBoundaryCells);
// Merge slave labels into master globalPointBoundaryCells
const labelListList& pointSlaves = globalPointSlaves();
forAll(pointSlaves, pointI)
{
const labelList& slaves = pointSlaves[pointI];
if (slaves.size() > 0)
{
labelList& myBCells = globalPointBoundaryCells[pointI];
forAll(slaves, i)
{
const labelList& slaveBCells =
globalPointBoundaryCells[slaves[i]];
// Add all slaveBCells. Note that need to check for
// uniqueness only in case of cyclics.
label sz = myBCells.size();
myBCells.setSize(sz+slaveBCells.size());
forAll(slaveBCells, j)
{
label slave = slaveBCells[j];
if (findIndex(SubList<label>(myBCells, sz), slave) == -1)
{
myBCells[sz++] = slave;
}
}
myBCells.setSize(sz);
}
}
}
// Copy merged boundaryCells back from master into slave slot
forAll(pointSlaves, pointI)
{
const labelList& bCells = globalPointBoundaryCells[pointI];
const labelList& slaves = pointSlaves[pointI];
forAll(slaves, i)
{
globalPointBoundaryCells[slaves[i]] = bCells;
}
}
// Sync back to slaves.
globalPointSlavesMap().reverseDistribute
(
coupledPatch().nPoints(),
globalPointBoundaryCells
);
// Construct a map to get the cell data directly
List<Map<label> > compactMap(Pstream::nProcs());
globalPointBoundaryCellsMapPtr_.reset
(
new mapDistribute
(
globalIndices,
globalPointBoundaryCells,
compactMap
)
);
if (debug)
{
Pout<< "globalMeshData::calcGlobalPointBoundaryCells() :"
<< " coupled points:" << coupledPatch().nPoints()
<< " local boundary cells:" << globalIndices.localSize()
<< " additional remote cells:"
<< globalPointBoundaryCellsMapPtr_().constructSize()
- globalIndices.localSize()
<< endl;
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Construct from polyMesh
@ -511,6 +1038,25 @@ void Foam::globalMeshData::clearOut()
nGlobalPoints_ = -1;
deleteDemandDrivenData(sharedEdgeLabelsPtr_);
deleteDemandDrivenData(sharedEdgeAddrPtr_);
coupledPatchPtr_.clear();
// Point
globalPointNumberingPtr_.clear();
globalPointSlavesPtr_.clear();
globalPointSlavesMapPtr_.clear();
// Edge
globalEdgeNumberingPtr_.clear();
globalEdgeSlavesPtr_.clear();
globalEdgeSlavesMapPtr_.clear();
// Face
globalBoundaryFaceNumberingPtr_.clear();
globalPointBoundaryFacesPtr_.clear();
globalPointBoundaryFacesMapPtr_.clear();
// Cell
boundaryCellsPtr_.clear();
globalBoundaryCellNumberingPtr_.clear();
globalPointBoundaryCellsPtr_.clear();
globalPointBoundaryCellsMapPtr_.clear();
}
@ -709,6 +1255,203 @@ const Foam::labelList& Foam::globalMeshData::sharedEdgeAddr() const
}
const Foam::indirectPrimitivePatch& Foam::globalMeshData::coupledPatch() const
{
if (!coupledPatchPtr_.valid())
{
const polyBoundaryMesh& bMesh = mesh_.boundaryMesh();
label nCoupled = 0;
forAll(bMesh, patchI)
{
const polyPatch& pp = bMesh[patchI];
if (pp.coupled())
{
nCoupled += pp.size();
}
}
labelList coupledFaces(nCoupled);
nCoupled = 0;
forAll(bMesh, patchI)
{
const polyPatch& pp = bMesh[patchI];
if (pp.coupled())
{
label faceI = pp.start();
forAll(pp, i)
{
coupledFaces[nCoupled++] = faceI++;
}
}
}
coupledPatchPtr_.reset
(
new indirectPrimitivePatch
(
IndirectList<face>
(
mesh_.faces(),
coupledFaces
),
mesh_.points()
)
);
if (debug)
{
Pout<< "globalMeshData::coupledPatch() :"
<< " constructed coupled faces patch:"
<< " faces:" << coupledPatchPtr_().size()
<< " points:" << coupledPatchPtr_().nPoints()
<< endl;
}
}
return coupledPatchPtr_();
}
const Foam::globalIndex& Foam::globalMeshData::globalPointNumbering() const
{
if (!globalPointNumberingPtr_.valid())
{
calcGlobalPointSlaves();
}
return globalPointNumberingPtr_();
}
const Foam::labelListList& Foam::globalMeshData::globalPointSlaves() const
{
if (!globalPointSlavesPtr_.valid())
{
calcGlobalPointSlaves();
}
return globalPointSlavesPtr_();
}
const Foam::mapDistribute& Foam::globalMeshData::globalPointSlavesMap() const
{
if (!globalPointSlavesMapPtr_.valid())
{
calcGlobalPointSlaves();
}
return globalPointSlavesMapPtr_();
}
const Foam::globalIndex& Foam::globalMeshData::globalEdgeNumbering() const
{
if (!globalEdgeNumberingPtr_.valid())
{
calcGlobalEdgeSlaves();
}
return globalEdgeNumberingPtr_();
}
const Foam::labelListList& Foam::globalMeshData::globalEdgeSlaves() const
{
if (!globalEdgeSlavesPtr_.valid())
{
calcGlobalEdgeSlaves();
}
return globalEdgeSlavesPtr_();
}
const Foam::mapDistribute& Foam::globalMeshData::globalEdgeSlavesMap() const
{
if (!globalEdgeSlavesMapPtr_.valid())
{
calcGlobalEdgeSlaves();
}
return globalEdgeSlavesMapPtr_();
}
const Foam::globalIndex& Foam::globalMeshData::globalBoundaryFaceNumbering()
const
{
if (!globalBoundaryFaceNumberingPtr_.valid())
{
calcGlobalPointBoundaryFaces();
}
return globalBoundaryFaceNumberingPtr_();
}
const Foam::labelListList& Foam::globalMeshData::globalPointBoundaryFaces()
const
{
if (!globalPointBoundaryFacesPtr_.valid())
{
calcGlobalPointBoundaryFaces();
}
return globalPointBoundaryFacesPtr_();
}
const Foam::mapDistribute& Foam::globalMeshData::globalPointBoundaryFacesMap()
const
{
if (!globalPointBoundaryFacesMapPtr_.valid())
{
calcGlobalPointBoundaryFaces();
}
return globalPointBoundaryFacesMapPtr_();
}
const Foam::labelList& Foam::globalMeshData::boundaryCells() const
{
if (!boundaryCellsPtr_.valid())
{
calcGlobalPointBoundaryCells();
}
return boundaryCellsPtr_();
}
const Foam::globalIndex& Foam::globalMeshData::globalBoundaryCellNumbering()
const
{
if (!globalBoundaryCellNumberingPtr_.valid())
{
calcGlobalPointBoundaryCells();
}
return globalBoundaryCellNumberingPtr_();
}
const Foam::labelListList& Foam::globalMeshData::globalPointBoundaryCells()
const
{
if (!globalPointBoundaryCellsPtr_.valid())
{
calcGlobalPointBoundaryCells();
}
return globalPointBoundaryCellsPtr_();
}
const Foam::mapDistribute& Foam::globalMeshData::globalPointBoundaryCellsMap()
const
{
if (!globalPointBoundaryCellsMapPtr_.valid())
{
calcGlobalPointBoundaryCells();
}
return globalPointBoundaryCellsMapPtr_();
}
void Foam::globalMeshData::movePoints(const pointField& newPoints)
{
// Topology does not change and we don't store any geometry so nothing
@ -740,7 +1483,7 @@ void Foam::globalMeshData::updateMesh()
// Option 1. Topological
{
// Calculate all shared points. This does all the hard work.
globalPoints parallelPoints(mesh_);
globalPoints parallelPoints(mesh_, false);
// Copy data out.
nGlobalPoints_ = parallelPoints.nGlobalPoints();

View File

@ -74,10 +74,13 @@ SourceFiles
#ifndef globalMeshData_H
#define globalMeshData_H
#include "polyMesh.H"
//#include "polyMesh.H"
#include "Switch.H"
#include "processorTopology.H"
#include "labelPair.H"
#include "indirectPrimitivePatch.H"
#include "boundBox.H"
#include "IOobject.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -88,7 +91,10 @@ namespace Foam
class globalMeshData;
Ostream& operator<<(Ostream&, const globalMeshData&);
class globalIndex;
class polyMesh;
class mapDistribute;
template<class T> class EdgeMap;
/*---------------------------------------------------------------------------*\
Class globalMeshData Declaration
@ -194,6 +200,39 @@ class globalMeshData
mutable labelList* sharedEdgeAddrPtr_;
// Coupled point addressing
// This is addressing from coupled point to coupled points,faces,cells
// This is a full schedule so includes points only used by two
// coupled patches.
mutable autoPtr<indirectPrimitivePatch> coupledPatchPtr_;
// Coupled point to coupled points
mutable autoPtr<globalIndex> globalPointNumberingPtr_;
mutable autoPtr<labelListList> globalPointSlavesPtr_;
mutable autoPtr<mapDistribute> globalPointSlavesMapPtr_;
// Coupled edge to coupled edges
mutable autoPtr<globalIndex> globalEdgeNumberingPtr_;
mutable autoPtr<labelListList> globalEdgeSlavesPtr_;
mutable autoPtr<mapDistribute> globalEdgeSlavesMapPtr_;
// Coupled point to boundary faces
mutable autoPtr<globalIndex> globalBoundaryFaceNumberingPtr_;
mutable autoPtr<labelListList> globalPointBoundaryFacesPtr_;
mutable autoPtr<mapDistribute> globalPointBoundaryFacesMapPtr_;
// Coupled point to boundary cells
mutable autoPtr<labelList> boundaryCellsPtr_;
mutable autoPtr<globalIndex> globalBoundaryCellNumberingPtr_;
mutable autoPtr<labelListList> globalPointBoundaryCellsPtr_;
mutable autoPtr<mapDistribute> globalPointBoundaryCellsMapPtr_;
// Private Member Functions
//- Set up processor patch addressing
@ -202,8 +241,8 @@ class globalMeshData
//- Helper function for shared edge addressing
static void countSharedEdges
(
const HashTable<labelList, edge, Hash<edge> >& procSharedEdges,
HashTable<label, edge, Hash<edge> >&,
const EdgeMap<labelList>&,
EdgeMap<label>&,
label&
);
@ -217,6 +256,22 @@ class globalMeshData
const vectorField& separationDist
);
//- Calculate global point addressing.
void calcGlobalPointSlaves() const;
//- Calculate global edge addressing.
void calcGlobalEdgeSlaves() const;
//- Calculate coupled point to uncoupled boundary faces. Local only.
void calcPointBoundaryFaces(labelListList& pointBoundaryFaces) const;
//- Calculate global point to global boundary face addressing.
void calcGlobalPointBoundaryFaces() const;
//- Calculate global point to global boundary cell addressing.
void calcGlobalPointBoundaryCells() const;
//- Disallow default bitwise copy construct
globalMeshData(const globalMeshData&);
@ -388,6 +443,47 @@ public:
const labelList& sharedEdgeAddr() const;
// Global master - slave point communication
//- Return patch of all coupled faces
const indirectPrimitivePatch& coupledPatch() const;
// Coupled point to coupled points. Coupled points are points on
// any coupled patch.
//- Numbering of coupled points is according to coupledPatch.
const globalIndex& globalPointNumbering() const;
//- For every coupled point the indices into the field
// distributed by below map.
const labelListList& globalPointSlaves() const;
const mapDistribute& globalPointSlavesMap() const;
// Coupled edge to coupled edges.
const globalIndex& globalEdgeNumbering() const;
const labelListList& globalEdgeSlaves() const;
const mapDistribute& globalEdgeSlavesMap() const;
// Coupled point to boundary faces. These are uncoupled boundary
// faces only but include empty patches.
//- Numbering of boundary faces is face-mesh.nInternalFaces()
const globalIndex& globalBoundaryFaceNumbering() const;
const labelListList& globalPointBoundaryFaces() const;
const mapDistribute& globalPointBoundaryFacesMap() const;
// Coupled point to boundary cell
//- From boundary cell to mesh cell
const labelList& boundaryCells() const;
//- Numbering of boundary cells is according to boundaryCells()
const globalIndex& globalBoundaryCellNumbering() const;
const labelListList& globalPointBoundaryCells() const;
const mapDistribute& globalPointBoundaryCellsMap() const;
// Edit
//- Update for moving points.

File diff suppressed because it is too large Load Diff

View File

@ -29,9 +29,8 @@ Description
Calculates points shared by more than two processor patches or cyclic
patches.
Is used in globalMeshData. (this info is needed for point-edge
communication where you do all but these shared points with patch to
patch communication but need to do a reduce on these shared points)
Is used in globalMeshData. (this info is needed for point/edge
communication where processor swaps are not enough to exchange data)
Works purely topological and using local communication only.
Needs:
@ -41,8 +40,8 @@ Description
- f[0] ordering on patch faces to be ok.
Works by constructing equivalence lists for all the points on processor
patches. These list are procPointList and give processor and meshPoint
label on that processor.
patches. These list are in globalIndex numbering (so consecutively numbered
per processor)
E.g.
@verbatim
((7 93)(4 731)(3 114))
@ -85,6 +84,9 @@ Description
endloop until nothing changes.
Note: the data held is either mesh point labels (construct from mesh only)
or patch point labels (construct from mesh and patch).
SourceFiles
globalPoints.C
@ -95,11 +97,11 @@ SourceFiles
#include "DynamicList.H"
#include "Map.H"
#include "labelList.H"
#include "FixedList.H"
#include "primitivePatch.H"
#include "className.H"
#include "edgeList.H"
#include "globalIndex.H"
#include "indirectPrimitivePatch.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -119,30 +121,29 @@ class globalPoints
{
// Private classes
//- Define procPointList as holding a list of meshPoint/processor labels
typedef FixedList<label, 2> procPoint;
typedef List<procPoint> procPointList;
// Private data
//- Mesh reference
const polyMesh& mesh_;
//- Global numbering of points
globalIndex globalIndices_;
//- Sum of points on processor patches (unfiltered, point on 2 patches
// counts as 2)
const label nPatchPoints_;
//- All points on boundaries and their corresponding connected points
// on other processors.
DynamicList<procPointList> procPoints_;
DynamicList<labelList> procPoints_;
//- Map from mesh point to index in procPoints
//- Map from mesh (or patch) point to index in procPoints
Map<label> meshToProcPoint_;
//- Shared points used by this processor (= global point number)
labelList sharedPointAddr_;
//- My meshpoints corresponding to the shared points
//- My mesh(or patch) points corresponding to the shared points
labelList sharedPointLabels_;
//- Total number of shared points.
@ -155,56 +156,108 @@ class globalPoints
// information is collected.
static label countPatchPoints(const polyBoundaryMesh&);
////- Get all faces on coupled patches
//static labelListl coupledFaces(const polyBoundaryMesh&);
//- Add information about patchPointI in relative indices to send
// buffers (patchFaces, indexInFace etc.)
static void addToSend
(
const primitivePatch&,
const label patchPointI,
const procPointList&,
const labelList&,
DynamicList<label>& patchFaces,
DynamicList<label>& indexInFace,
DynamicList<procPointList>& allInfo
DynamicList<labelList>& allInfo
);
//- Merge info from neighbour into my data
static bool mergeInfo
(
const procPointList& nbrInfo,
procPointList& myInfo
const labelList& nbrInfo,
labelList& myInfo
);
//- From mesh point to 'local point'. Is the mesh point itself
// if meshToPatchPoint is empty.
static label meshToLocalPoint
(
const Map<label>& meshToPatchPoint,
const label meshPointI
);
//- Opposite of meshToLocalPoint.
static label localToMeshPoint
(
const labelList& patchToMeshPoint,
const label localPointI
);
//- Store (and merge) info for meshPointI
bool storeInfo(const procPointList& nbrInfo, const label meshPointI);
bool storeInfo
(
const labelList& nbrInfo,
const label localPointI
);
//- Initialize procPoints_ to my patch points. allPoints = true:
// seed with all patch points, = false: only boundaryPoints().
void initOwnPoints(const bool allPoints, labelHashSet& changedPoints);
void initOwnPoints
(
const Map<label>& meshToPatchPoint,
const bool allPoints,
labelHashSet& changedPoints
);
//- Send subset of procPoints to neighbours
void sendPatchPoints(const labelHashSet& changedPoints) const;
void sendPatchPoints
(
const Map<label>&,
PstreamBuffers&,
const labelHashSet&
) const;
//- Receive neighbour points and merge into my procPoints.
void receivePatchPoints(labelHashSet& changedPoints);
void receivePatchPoints
(
const Map<label>&,
PstreamBuffers&,
labelHashSet&
);
//- Remove entries of size 2 where meshPoint is in provided Map.
// Used to remove normal face-face connected points.
void remove(const Map<label>&);
void remove(const labelList& patchToMeshPoint, const Map<label>&);
//- Compact out unused elements of procPoints.
void compact();
//- Get indices of point for which I am master (lowest numbered proc)
labelList getMasterPoints() const;
labelList getMasterPoints(const labelList& patchToMeshPoint) const;
//- Send subset of shared points to neighbours
void sendSharedPoints(const labelList& changedIndices) const;
void sendSharedPoints(PstreamBuffers&, const labelList&) const;
//- Receive shared points and update subset.
void receiveSharedPoints(labelList& changedIndices);
void receiveSharedPoints
(
const Map<label>&,
PstreamBuffers&,
labelList&
);
//- Should move into cyclicPolyPatch but some ordering problem
//- Should move into cyclicPolyPatch ordering problem
// keeps on giving problems.
static edgeList coupledPoints(const cyclicPolyPatch&);
//- Do all calculations.
void calculateSharedPoints
(
const Map<label>&,
const labelList&,
const bool keepAllPoints
);
//- Disallow default bitwise copy construct
globalPoints(const globalPoints&);
@ -220,36 +273,59 @@ public:
// Constructors
//- Construct from mesh
globalPoints(const polyMesh& mesh);
//- Construct from mesh.
// keepAllPoints = false : filter out points that are on two
// neighbouring coupled patches (so can be swapped)
globalPoints(const polyMesh& mesh, const bool keepAllPoints);
//- Construct from mesh and patch of coupled faces. Difference with
// construct from mesh only is that this stores the meshToProcPoint,
// procPoints and sharedPointLabels as patch local point labels
// instead of mesh point labels.
globalPoints
(
const polyMesh& mesh,
const indirectPrimitivePatch& coupledPatch,
const bool keepAllPoints
);
// Member Functions
// Access
label nPatchPoints() const
{
return nPatchPoints_;
}
//- From (mesh or patch) point to index in procPoints
const Map<label>& meshToProcPoint() const
{
return meshToProcPoint_;
}
//- procPoints is per point the connected points (in global
// point numbers)
const DynamicList<labelList>& procPoints() const
{
return procPoints_;
}
//- Global numbering of (mesh or patch) points
const globalIndex& globalIndices() const
{
return globalIndices_;
}
//- shared points used by this processor (= global point number)
const labelList& sharedPointAddr() const
{
return sharedPointAddr_;
}
//- my meshpoints corresponding to the shared points
//- my (mesh or patch)points corresponding to the shared points
const labelList& sharedPointLabels() const
{
return sharedPointLabels_;
}
//- total number of shared points
label nGlobalPoints() const
{
return nGlobalPoints_;

View File

@ -288,6 +288,7 @@ Foam::mapDistribute::mapDistribute
forAll(compactMap, procI)
{
compactMap[procI].clear();
if (procI != Pstream::myProcNo())
{
compactMap[procI].resize(2*nNonLocal[procI]);
@ -433,6 +434,7 @@ Foam::mapDistribute::mapDistribute
forAll(compactMap, procI)
{
compactMap[procI].clear();
if (procI != Pstream::myProcNo())
{
compactMap[procI].resize(2*nNonLocal[procI]);

View File

@ -276,6 +276,49 @@ public:
}
}
//- Reverse distribute data using default commsType.
template<class T>
void reverseDistribute(const label constructSize, List<T>& fld)
const
{
if (Pstream::defaultCommsType == Pstream::nonBlocking)
{
distribute
(
Pstream::nonBlocking,
List<labelPair>(),
constructSize,
constructMap_,
subMap_,
fld
);
}
else if (Pstream::defaultCommsType == Pstream::scheduled)
{
distribute
(
Pstream::scheduled,
schedule(),
constructSize,
constructMap_,
subMap_,
fld
);
}
else
{
distribute
(
Pstream::blocking,
List<labelPair>(),
constructSize,
constructMap_,
subMap_,
fld
);
}
}
//- Correct for topo change.
void updateMesh(const mapPolyMesh&)
{

View File

@ -552,7 +552,6 @@ void Foam::mapDistribute::distribute
{
if (!contiguous<T>())
{
//XXXXXX
PstreamBuffers pBuffs(Pstream::nonBlocking);
// Stream data into buffer

View File

@ -26,7 +26,7 @@ Class
Foam::syncTools
Description
Various tools to aid synchronizing lists across coupled patches.
Various tools to aid synchronizing lists across coupled patches. WIP.
Require
- combineOperator (e.g. sumEqOp - not sumOp!) that is defined for the
@ -34,8 +34,11 @@ Description
- null value which gets overridden by any valid value.
- transform function
Can apply coordinate rotation/separation on cyclics but only for faces
note:Can apply coordinate rotation/separation on cyclics but only for faces
or if there is a single rotation/separation tensor.
note:syncPointList or syncEdgeList will visit shared points/edges
multiple times (once through patch exchange, once through shared
points reduce). Should be replaced by pointMesh functionality.
SourceFiles
syncTools.C

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -31,6 +31,10 @@ Description
SourceFiles
wcharIO.C
SeeAlso
http://en.wikipedia.org/wiki/UTF-8
http://en.wikibooks.org/wiki/Unicode/Character_reference
\*---------------------------------------------------------------------------*/
#ifndef wchar_H
@ -48,10 +52,10 @@ class Ostream;
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
//- Output via a normal char
//- Output wide character (Unicode) as UTF-8
Ostream& operator<<(Ostream&, const wchar_t);
//- Output string via normal char
//- Output wide character (Unicode) string as UTF-8
Ostream& operator<<(Ostream&, const wchar_t*);

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2009-2009 OpenCFD Ltd.
\\ / A nd | Copyright (C) 2009-2010 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -22,11 +22,6 @@ License
along with OpenFOAM; if not, write to the Free Software Foundation,
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Description
Reads a char from an input stream, for a given version
number and File format. If an ascii File is being read, then the line
numbers are counted and an erroneous read is reported.
\*---------------------------------------------------------------------------*/
#include "error.H"
@ -38,7 +33,68 @@ Description
Foam::Ostream& Foam::operator<<(Ostream& os, const wchar_t wc)
{
os.write(char(wc));
if (!(wc & ~0x0000007F))
{
// 0x00000000 - 0x0000007F: (1-byte output)
// 0xxxxxxx
os.write(char(wc));
}
else if (!(wc & ~0x000007FF))
{
// 0x00000080 - 0x000007FF: (2-byte output)
// 110bbbaa 10aaaaaa
os.write(char(0xC0 | ((wc >> 6) & 0x1F)));
os.write(char(0x80 | ((wc) & 0x3F)));
}
else if (!(wc & ~0x0000FFFF))
{
// 0x00000800 - 0x0000FFFF: (3-byte output)
// 1110bbbb 10bbbbaa 10aaaaaa
os.write(char(0xE0 | ((wc >> 12) & 0x0F)));
os.write(char(0x80 | ((wc >> 6) & 0x3F)));
os.write(char(0x80 | ((wc) & 0x3F)));
}
else if (!(wc & ~0x001FFFFF))
{
// 0x00010000 - 0x001FFFFF: (4-byte output)
// 11110ccc 10ccbbbb 10bbbbaa 10aaaaaa
os.write(char(0xF0 | ((wc >> 18) & 0x07)));
os.write(char(0x80 | ((wc >> 12) & 0x3F)));
os.write(char(0x80 | ((wc >> 6) & 0x3F)));
os.write(char(0x80 | ((wc) & 0x3F)));
}
else if (!(wc & ~0x03FFFFFF))
{
// 0x00200000 - 0x03FFFFFF: (5-byte output)
// 111110dd 10cccccc 10ccbbbb 10bbbbaa 10aaaaaa
os.write(char(0xF8 | ((wc >> 24) & 0x03)));
os.write(char(0x80 | ((wc >> 18) & 0x3F)));
os.write(char(0x80 | ((wc >> 12) & 0x3F)));
os.write(char(0x80 | ((wc >> 6) & 0x3F)));
os.write(char(0x80 | ((wc) & 0x3F)));
}
else if (!(wc & ~0x7FFFFFFF))
{
// 0x04000000 - 0x7FFFFFFF: (6-byte output)
// 1111110d 10dddddd 10cccccc 10ccbbbb 10bbbbaa 10aaaaaa
os.write(char(0xFC | ((wc >> 30) & 0x01)));
os.write(char(0x80 | ((wc >> 24) & 0x3F)));
os.write(char(0x80 | ((wc >> 18) & 0x3F)));
os.write(char(0x80 | ((wc >> 12) & 0x3F)));
os.write(char(0x80 | ((wc >> 6) & 0x3F)));
os.write(char(0x80 | ((wc) & 0x3F)));
}
else
{
// according to man page utf8(7)
// the Unicode standard specifies no characters above 0x0010FFFF,
// so Unicode characters can only be up to four bytes long in UTF-8.
// report anything unknown/invalid as replacement character U+FFFD
os.write(char(0xEF));
os.write(char(0xBF));
os.write(char(0xBD));
}
os.check("Ostream& operator<<(Ostream&, const wchar_t)");
return os;
@ -51,10 +107,10 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const wchar_t* ws)
{
for (const wchar_t* p = ws; *p; ++p)
{
os.write(char(*p));
os << *p;
}
}
os.check("Ostream& operator<<(Ostream&, const wchar_t*)");
return os;
}

View File

@ -0,0 +1,5 @@
EXE_INC = \
-I$(LIB_SRC)/fileFormats/lnInclude
LIB_LIBS = \
-lfileFormats

View File

@ -29,34 +29,6 @@ License
#include "IStringStream.H"
#include "PackedBoolList.H"
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
// Do weird things to extract a floating point number
Foam::scalar Foam::fileFormats::NASedgeFormat::parseNASCoord
(
const string& s
)
{
size_t expSign = s.find_last_of("+-");
if (expSign != string::npos && expSign > 0 && !isspace(s[expSign-1]))
{
scalar mantissa = readScalar(IStringStream(s.substr(0, expSign))());
scalar exponent = readScalar(IStringStream(s.substr(expSign+1))());
if (s[expSign] == '-')
{
exponent = -exponent;
}
return mantissa * pow(10, exponent);
}
else
{
return readScalar(IStringStream(s)());
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::fileFormats::NASedgeFormat::NASedgeFormat

View File

@ -37,6 +37,7 @@ SourceFiles
#define NASedgeFormat_H
#include "edgeMesh.H"
#include "NASCore.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -51,7 +52,8 @@ namespace fileFormats
class NASedgeFormat
:
public edgeMesh
public edgeMesh,
public NASCore
{
// Private Member Functions
@ -61,13 +63,6 @@ class NASedgeFormat
//- Disallow default bitwise assignment
void operator=(const NASedgeFormat&);
protected:
// Protected Member Functions
//- Do weird things to extract number
static scalar parseNASCoord(const string&);
public:
// Constructors

View File

@ -59,134 +59,6 @@ inline void Foam::fileFormats::STARCDedgeFormat::writeLines
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
bool Foam::fileFormats::STARCDedgeFormat::readHeader
(
IFstream& is,
const word& signature
)
{
if (!is.good())
{
FatalErrorIn
(
"fileFormats::STARCDedgeFormat::readHeader(...)"
)
<< "cannot read " << signature << " " << is.name()
<< abort(FatalError);
}
word header;
label majorVersion;
string line;
is.getLine(line);
IStringStream(line)() >> header;
is.getLine(line);
IStringStream(line)() >> majorVersion;
// add other checks ...
if (header != signature)
{
Info<< "header mismatch " << signature << " " << is.name()
<< endl;
}
return true;
}
void Foam::fileFormats::STARCDedgeFormat::writeHeader
(
Ostream& os,
const char* filetype
)
{
os << "PROSTAR_" << filetype << nl
<< 4000
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< endl;
}
bool Foam::fileFormats::STARCDedgeFormat::readPoints
(
IFstream& is,
pointField& points,
labelList& ids
)
{
//
// read .vrt file
// ~~~~~~~~~~~~~~
if (!is.good())
{
FatalErrorIn
(
"fileFormats::STARCDedgeFormat::readPoints(...)"
)
<< "Cannot read file " << is.name()
<< exit(FatalError);
}
readHeader(is, "PROSTAR_VERTEX");
DynamicList<point> dynPoints;
DynamicList<label> dynPointId; // STAR-CD index of points
label lineLabel;
while ((is >> lineLabel).good())
{
scalar x, y, z;
is >> x >> y >> z;
dynPoints.append(point(x, y, z));
dynPointId.append(lineLabel);
}
points.transfer(dynPoints);
ids.transfer(dynPointId);
return true;
}
void Foam::fileFormats::STARCDedgeFormat::writePoints
(
Ostream& os,
const pointField& pointLst
)
{
writeHeader(os, "VERTEX");
// Set the precision of the points data to 10
os.precision(10);
// force decimal point for Fortran input
os.setf(std::ios::showpoint);
forAll(pointLst, ptI)
{
os
<< ptI + 1 << " "
<< pointLst[ptI].x() << " "
<< pointLst[ptI].y() << " "
<< pointLst[ptI].z() << nl;
}
os.flush();
}
void Foam::fileFormats::STARCDedgeFormat::writeCase
(
Ostream& os,

View File

@ -43,6 +43,8 @@ SourceFiles
#define STARCDedgeFormat_H
#include "edgeMesh.H"
#include "STARCDCore.H"
#include "IFstream.H"
#include "Ostream.H"
#include "OFstream.H"
@ -60,7 +62,8 @@ namespace fileFormats
class STARCDedgeFormat
:
public edgeMesh
public edgeMesh,
public STARCDCore
{
// Private Data
@ -90,14 +93,6 @@ protected:
// Protected Member Functions
static bool readHeader(IFstream&, const word&);
static void writeHeader(Ostream&, const char* filetype);
static bool readPoints(IFstream&, pointField&, labelList& ids);
static void writePoints(Ostream&, const pointField&);
static void writeCase
(
Ostream&,

View File

@ -0,0 +1,4 @@
nas/NASCore.C
starcd/STARCDCore.C
LIB = $(FOAM_LIBBIN)/libfileFormats

View File

View File

@ -24,13 +24,18 @@ License
\*---------------------------------------------------------------------------*/
#include "NASsurfaceFormatCore.H"
#include "NASCore.H"
#include "IStringStream.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
// Do weird things to extract a floating point number
Foam::scalar Foam::fileFormats::NASsurfaceFormatCore::parseNASCoord
Foam::fileFormats::NASCore::NASCore()
{}
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
Foam::scalar Foam::fileFormats::NASCore::parseNASCoord
(
const string& s
)

View File

@ -2,7 +2,7 @@
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 1991-2009 OpenCFD Ltd.
\\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd.
\\/ M anipulation |
-------------------------------------------------------------------------------
License
@ -23,21 +23,21 @@ License
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Class
Foam::fileFormats::NASsurfaceFormatCore
Foam::fileFormats::NASCore
Description
Internal class used by the NASsurfaceFormat
Core routines used when reading/writing NASTRAN files.
SourceFiles
NASsurfaceFormatCore.C
NASCore.C
\*---------------------------------------------------------------------------*/
#ifndef NASsurfaceFormatCore_H
#define NASsurfaceFormatCore_H
#ifndef NASCore_H
#define NASCore_H
#include "Ostream.H"
#include "OFstream.H"
#include "scalar.H"
#include "string.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -47,17 +47,25 @@ namespace fileFormats
{
/*---------------------------------------------------------------------------*\
Class NASsurfaceFormatCore Declaration
Class fileFormats::NASCore Declaration
\*---------------------------------------------------------------------------*/
class NASsurfaceFormatCore
class NASCore
{
protected:
public:
// Protected Member Functions
// Public Member Functions
//- Do weird things to extract number
static scalar parseNASCoord(const string&);
// Constructors
//- Construct null
NASCore();
};

View File

@ -0,0 +1,173 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2006-2010 OpenCFD Ltd.
\\/ 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
\*---------------------------------------------------------------------------*/
#include "STARCDCore.H"
#include "ListOps.H"
#include "clock.H"
#include "PackedBoolList.H"
#include "IStringStream.H"
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
Foam::fileFormats::STARCDCore::STARCDCore()
{}
// * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * * //
bool Foam::fileFormats::STARCDCore::readHeader
(
IFstream& is,
const word& signature
)
{
if (!is.good())
{
FatalErrorIn
(
"fileFormats::STARCDCore::readHeader(...)"
)
<< "cannot read " << signature << " " << is.name()
<< abort(FatalError);
}
word header;
label majorVersion;
string line;
is.getLine(line);
IStringStream(line)() >> header;
is.getLine(line);
IStringStream(line)() >> majorVersion;
// add other checks ...
if (header != signature)
{
Info<< "header mismatch " << signature << " " << is.name()
<< endl;
}
return true;
}
void Foam::fileFormats::STARCDCore::writeHeader
(
Ostream& os,
const word& filetype
)
{
os << "PROSTAR_" << filetype << nl
<< 4000
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< endl;
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::fileFormats::STARCDCore::readPoints
(
IFstream& is,
pointField& points,
labelList& ids
)
{
if (!is.good())
{
FatalErrorIn
(
"fileFormats::STARCDedgeFormat::readPoints(...)"
)
<< "Cannot read file " << is.name()
<< exit(FatalError);
}
readHeader(is, "PROSTAR_VERTEX");
// reuse memory if possible
DynamicList<point> dynPoints(points.xfer());
DynamicList<label> dynPointId(ids.xfer()); // STAR-CD index of points
dynPoints.clear();
dynPointId.clear();
label lineLabel;
while ((is >> lineLabel).good())
{
scalar x, y, z;
is >> x >> y >> z;
dynPoints.append(point(x, y, z));
dynPointId.append(lineLabel);
}
points.transfer(dynPoints);
ids.transfer(dynPointId);
return true;
}
void Foam::fileFormats::STARCDCore::writePoints
(
Ostream& os,
const pointField& pointLst
)
{
writeHeader(os, "VERTEX");
// Set the precision of the points data to 10
os.precision(10);
// force decimal point for Fortran input
os.setf(std::ios::showpoint);
forAll(pointLst, ptI)
{
os
<< ptI + 1 << " "
<< pointLst[ptI].x() << " "
<< pointLst[ptI].y() << " "
<< pointLst[ptI].z() << nl;
}
os.flush();
}
// ************************************************************************* //

View File

@ -0,0 +1,131 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2006-2010 OpenCFD Ltd.
\\/ 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
Class
Foam::fileFormats::STARCDCore
Description
Core routines used when reading/writing pro-STAR vrt/cel/bnd files.
SourceFiles
STARCDCore.C
\*---------------------------------------------------------------------------*/
#ifndef STARCDCore_H
#define STARCDCore_H
#include "IFstream.H"
#include "pointField.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
namespace fileFormats
{
/*---------------------------------------------------------------------------*\
Class fileFormats::STARCDCore Declaration
\*---------------------------------------------------------------------------*/
class STARCDCore
{
protected:
// Protected Member Functions
//- Read header
static bool readHeader(IFstream&, const word& fileSignature);
//- Write header for fileType (CELL|VERTEX|BOUNDARY)
static void writeHeader(Ostream&, const word& fileType);
protected:
enum cellType
{
starcdFluidType = 1,
starcdSolidType = 2,
starcdBaffleType = 3,
starcdShellType = 4,
starcdLineType = 5,
starcdPointType = 6
};
enum shapeType
{
starcdPoint = 1,
starcdLine = 2,
starcdShell = 3,
starcdHex = 11,
starcdPrism = 12,
starcdTet = 13,
starcdPyr = 14,
starcdPoly = 255
};
public:
// Public Member Functions
//- Read points from a (.vrt) file
// The file format is as follows:
// @verbatim
// Line 1:
// PROSTAR_VERTEX newline
//
// Line 2:
// {version} 0 0 0 0 0 0 0 newline
//
// Body:
// {vertexId} {x} {y} {z} newline
// @endverbatim
static bool readPoints(IFstream&, pointField&, labelList& ids);
//- Write header and points to (.vrt) file
static void writePoints(Ostream&, const pointField&);
// Constructors
//- Construct null
STARCDCore();
};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace fileFormats
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //

View File

@ -55,7 +55,7 @@ slicedFvPatchField<Type>::slicedFvPatchField
const DimensionedField<Type, volMesh>& iF
)
:
fvPatchField<Type>(p, iF)
fvPatchField<Type>(p, iF, Field<Type>())
{}

View File

@ -8,7 +8,6 @@ EXE_INC = \
-I$(LIB_SRC)/triSurface/lnInclude
LIB_LIBS = \
-ldecompositionMethods \
-ldynamicMesh \
-lfiniteVolume \
-llagrangian \

View File

@ -1506,8 +1506,12 @@ void Foam::autoSnapDriver::doSnap
// meshMover.
calcNearestSurface(snapDist, meshMover);
// Get smoothly varying internal displacement field.
smoothDisplacement(snapParams, meshMover);
//// Get smoothly varying internal displacement field.
//- 2009-12-16 : was not found to be beneficial. Keeping internal
// fields fixed slightly increases skewness (on boundary)
// but lowers non-orthogonality quite a bit (e.g. 65->59 degrees).
// Maybe if better smoother?
//smoothDisplacement(snapParams, meshMover);
// Apply internal displacement to mesh.
scaleMesh(snapParams, nInitErrors, baffles, meshMover);

View File

@ -9,16 +9,17 @@ cellDist/wallPoint/wallPoint.C
cellFeatures/cellFeatures.C
coordinateSystems/coordinateSystem.C
coordinateSystems/coordinateSystemNew.C
coordinateSystems/coordinateSystems.C
coordinateSystems/cylindricalCS.C
coordinateSystems/sphericalCS.C
coordinateSystems/parabolicCylindricalCS.C
coordinateSystems/toroidalCS.C
coordinateSystems/coordinateRotation/coordinateRotation.C
coordinateSystems/coordinateRotation/EulerCoordinateRotation.C
coordinateSystems/coordinateRotation/STARCDCoordinateRotation.C
csys = coordinateSystems
$(csys)/coordinateSystem.C
$(csys)/coordinateSystemNew.C
$(csys)/coordinateSystems.C
$(csys)/cylindricalCS.C
$(csys)/sphericalCS.C
$(csys)/parabolicCylindricalCS.C
$(csys)/toroidalCS.C
$(csys)/coordinateRotation/coordinateRotation.C
$(csys)/coordinateRotation/EulerCoordinateRotation.C
$(csys)/coordinateRotation/STARCDCoordinateRotation.C
edgeFaceCirculator/edgeFaceCirculator.C

View File

@ -6,4 +6,5 @@ EXE_INC = \
LIB_LIBS = \
-ltriSurface \
-ldecompositionMethods \
-lmetisDecompositionMethod \
-llagrangian

View File

@ -85,8 +85,7 @@ public:
};
// Tree node. Has up pointer and down pointers.
//- Tree node. Has up pointer and down pointers.
class node
{
public:

View File

@ -3,6 +3,7 @@ cd ${0%/*} || exit 1 # run from this directory
set -x
wmake libso decompositionMethods
wmake libso metisDecomp
wmake libso reconstruct
if [ -d "$FOAM_MPI_LIBBIN" ]

View File

@ -6,6 +6,4 @@ manualDecomp/manualDecomp.C
scotchDecomp/scotchDecomp.C
metisDecomp/metisDecomp.C
LIB = $(FOAM_LIBBIN)/libdecompositionMethods

View File

@ -1,8 +1,6 @@
EXE_INC = \
-I$(WM_THIRD_PARTY_DIR)/scotch_5.1/src/libscotch/lnInclude \
-I$(WM_THIRD_PARTY_DIR)/metis-5.0pre2/include
-I$(WM_THIRD_PARTY_DIR)/scotch_5.1/include \
-I../metisDecomp/lnInclude
LIB_LIBS = \
-lscotch \
-lmetis \
-lGKlib
-lscotch -lscotcherrexit

View File

@ -61,17 +61,12 @@ License
#include "scotchDecomp.H"
#include "addToRunTimeSelectionTable.H"
#include "floatScalar.H"
#include "IFstream.H"
#include "Time.H"
#include "cyclicPolyPatch.H"
#include "OFstream.H"
#include "metisDecomp.H"
extern "C"
{
#define OMPI_SKIP_MPICXX
#include "module.h"
#include "common.h"
#include "scotch.h"
}
@ -115,13 +110,13 @@ void Foam::scotchDecomp::check(const int retVal, const char* str)
if (retVal)
{
FatalErrorIn("scotchDecomp::decompose(..)")
<< "Called to scotch routine " << str << " failed."
<< "Call to scotch routine " << str << " failed."
<< exit(FatalError);
}
}
// Call Metis with options from dictionary.
// Call scotch with options from dictionary.
Foam::label Foam::scotchDecomp::decompose
(
const List<int>& adjncy,
@ -173,7 +168,7 @@ Foam::label Foam::scotchDecomp::decompose
{
FatalErrorIn
(
"parMetisDecomp::decompose"
"scotchDecomp::decompose"
"(const pointField&, const scalarField&)"
) << "Number of cell weights " << cWeights.size()
<< " does not equal number of cells " << xadj.size()-1
@ -377,7 +372,10 @@ Foam::labelList Foam::scotchDecomp::decompose
{
if (points.size() != mesh_.nCells())
{
FatalErrorIn("scotchDecomp::decompose(const pointField&)")
FatalErrorIn
(
"scotchDecomp::decompose(const pointField&, const scalarField&)"
)
<< "Can use this decomposition method only for the whole mesh"
<< endl
<< "and supply one coordinate (cellCentre) for every cell." << endl
@ -391,12 +389,7 @@ Foam::labelList Foam::scotchDecomp::decompose
// xadj(celli) : start of information in adjncy for celli
List<int> adjncy;
List<int> xadj;
metisDecomp::calcMetisCSR
(
mesh_,
adjncy,
xadj
);
calcCSR(mesh_, adjncy, xadj);
// Decompose using default weights
List<int> finalDecomp;
@ -445,7 +438,7 @@ Foam::labelList Foam::scotchDecomp::decompose
cellCells
);
metisDecomp::calcMetisCSR(cellCells, adjncy, xadj);
calcCSR(cellCells, adjncy, xadj);
}
// Decompose using weights
@ -475,7 +468,8 @@ Foam::labelList Foam::scotchDecomp::decompose
{
FatalErrorIn
(
"scotchDecomp::decompose(const pointField&, const labelListList&)"
"scotchDecomp::decompose"
"(const labelListList&, const pointField&, const scalarField&)"
) << "Inconsistent number of cells (" << globalCellCells.size()
<< ") and number of cell centres (" << cellCentres.size()
<< ")." << exit(FatalError);
@ -488,7 +482,7 @@ Foam::labelList Foam::scotchDecomp::decompose
List<int> adjncy;
List<int> xadj;
metisDecomp::calcMetisCSR(globalCellCells, adjncy, xadj);
calcCSR(globalCellCells, adjncy, xadj);
// Decompose using weights
List<int> finalDecomp;
@ -504,4 +498,144 @@ Foam::labelList Foam::scotchDecomp::decompose
}
void Foam::scotchDecomp::calcCSR
(
const polyMesh& mesh,
List<int>& adjncy,
List<int>& xadj
)
{
// Make Metis CSR (Compressed Storage Format) storage
// adjncy : contains neighbours (= edges in graph)
// xadj(celli) : start of information in adjncy for celli
xadj.setSize(mesh.nCells()+1);
// Initialise the number of internal faces of the cells to twice the
// number of internal faces
label nInternalFaces = 2*mesh.nInternalFaces();
// Check the boundary for coupled patches and add to the number of
// internal faces
const polyBoundaryMesh& pbm = mesh.boundaryMesh();
forAll(pbm, patchi)
{
if (isA<cyclicPolyPatch>(pbm[patchi]))
{
nInternalFaces += pbm[patchi].size();
}
}
// Create the adjncy array the size of the total number of internal and
// coupled faces
adjncy.setSize(nInternalFaces);
// Fill in xadj
// ~~~~~~~~~~~~
label freeAdj = 0;
for (label cellI = 0; cellI < mesh.nCells(); cellI++)
{
xadj[cellI] = freeAdj;
const labelList& cFaces = mesh.cells()[cellI];
forAll(cFaces, i)
{
label faceI = cFaces[i];
if
(
mesh.isInternalFace(faceI)
|| isA<cyclicPolyPatch>(pbm[pbm.whichPatch(faceI)])
)
{
freeAdj++;
}
}
}
xadj[mesh.nCells()] = freeAdj;
// Fill in adjncy
// ~~~~~~~~~~~~~~
labelList nFacesPerCell(mesh.nCells(), 0);
// Internal faces
for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
{
label own = mesh.faceOwner()[faceI];
label nei = mesh.faceNeighbour()[faceI];
adjncy[xadj[own] + nFacesPerCell[own]++] = nei;
adjncy[xadj[nei] + nFacesPerCell[nei]++] = own;
}
// Coupled faces. Only cyclics done.
forAll(pbm, patchi)
{
if (isA<cyclicPolyPatch>(pbm[patchi]))
{
const unallocLabelList& faceCells = pbm[patchi].faceCells();
label sizeby2 = faceCells.size()/2;
for (label facei=0; facei<sizeby2; facei++)
{
label own = faceCells[facei];
label nei = faceCells[facei + sizeby2];
adjncy[xadj[own] + nFacesPerCell[own]++] = nei;
adjncy[xadj[nei] + nFacesPerCell[nei]++] = own;
}
}
}
}
// From cell-cell connections to Metis format (like CompactListList)
void Foam::scotchDecomp::calcCSR
(
const labelListList& cellCells,
List<int>& adjncy,
List<int>& xadj
)
{
// Count number of internal faces
label nConnections = 0;
forAll(cellCells, coarseI)
{
nConnections += cellCells[coarseI].size();
}
// Create the adjncy array as twice the size of the total number of
// internal faces
adjncy.setSize(nConnections);
xadj.setSize(cellCells.size()+1);
// Fill in xadj
// ~~~~~~~~~~~~
label freeAdj = 0;
forAll(cellCells, coarseI)
{
xadj[coarseI] = freeAdj;
const labelList& cCells = cellCells[coarseI];
forAll(cCells, i)
{
adjncy[freeAdj++] = cCells[i];
}
}
xadj[cellCells.size()] = freeAdj;
}
// ************************************************************************* //

View File

@ -135,6 +135,25 @@ public:
const scalarField& cWeights
);
//- Helper to convert local connectivity (supplied as owner,neighbour)
// into CSR (Metis,scotch) storage. Does cyclics but not processor
// patches
static void calcCSR
(
const polyMesh& mesh,
List<int>& adjncy,
List<int>& xadj
);
//- Helper to convert connectivity (supplied as cellcells) into
// CSR (Metis,scotch) storage
static void calcCSR
(
const labelListList& globalCellCells,
List<int>& adjncy,
List<int>& xadj
);
};

View File

@ -0,0 +1,3 @@
metisDecomp.C
LIB = $(FOAM_LIBBIN)/libmetisDecompositionMethod

View File

@ -0,0 +1,7 @@
EXE_INC = \
-I$(WM_THIRD_PARTY_DIR)/metis-5.0pre2/include \
-I../decompositionMethods/lnInclude
LIB_LIBS = \
-lmetis \
-lGKlib

View File

@ -27,9 +27,8 @@ License
#include "metisDecomp.H"
#include "addToRunTimeSelectionTable.H"
#include "floatScalar.H"
#include "IFstream.H"
#include "Time.H"
#include "cyclicPolyPatch.H"
#include "scotchDecomp.H"
extern "C"
{
@ -331,12 +330,7 @@ Foam::labelList Foam::metisDecomp::decompose
List<int> adjncy;
List<int> xadj;
calcMetisCSR
(
mesh_,
adjncy,
xadj
);
scotchDecomp::calcCSR(mesh_, adjncy, xadj);
// Decompose using default weights
List<int> finalDecomp;
@ -352,145 +346,6 @@ Foam::labelList Foam::metisDecomp::decompose
}
void Foam::metisDecomp::calcMetisCSR
(
const polyMesh& mesh,
List<int>& adjncy,
List<int>& xadj
)
{
// Make Metis CSR (Compressed Storage Format) storage
// adjncy : contains neighbours (= edges in graph)
// xadj(celli) : start of information in adjncy for celli
xadj.setSize(mesh.nCells()+1);
// Initialise the number of internal faces of the cells to twice the
// number of internal faces
label nInternalFaces = 2*mesh.nInternalFaces();
// Check the boundary for coupled patches and add to the number of
// internal faces
const polyBoundaryMesh& pbm = mesh.boundaryMesh();
forAll(pbm, patchi)
{
if (isA<cyclicPolyPatch>(pbm[patchi]))
{
nInternalFaces += pbm[patchi].size();
}
}
// Create the adjncy array the size of the total number of internal and
// coupled faces
adjncy.setSize(nInternalFaces);
// Fill in xadj
// ~~~~~~~~~~~~
label freeAdj = 0;
for (label cellI = 0; cellI < mesh.nCells(); cellI++)
{
xadj[cellI] = freeAdj;
const labelList& cFaces = mesh.cells()[cellI];
forAll(cFaces, i)
{
label faceI = cFaces[i];
if
(
mesh.isInternalFace(faceI)
|| isA<cyclicPolyPatch>(pbm[pbm.whichPatch(faceI)])
)
{
freeAdj++;
}
}
}
xadj[mesh.nCells()] = freeAdj;
// Fill in adjncy
// ~~~~~~~~~~~~~~
labelList nFacesPerCell(mesh.nCells(), 0);
// Internal faces
for (label faceI = 0; faceI < mesh.nInternalFaces(); faceI++)
{
label own = mesh.faceOwner()[faceI];
label nei = mesh.faceNeighbour()[faceI];
adjncy[xadj[own] + nFacesPerCell[own]++] = nei;
adjncy[xadj[nei] + nFacesPerCell[nei]++] = own;
}
// Coupled faces. Only cyclics done.
forAll(pbm, patchi)
{
if (isA<cyclicPolyPatch>(pbm[patchi]))
{
const unallocLabelList& faceCells = pbm[patchi].faceCells();
label sizeby2 = faceCells.size()/2;
for (label facei=0; facei<sizeby2; facei++)
{
label own = faceCells[facei];
label nei = faceCells[facei + sizeby2];
adjncy[xadj[own] + nFacesPerCell[own]++] = nei;
adjncy[xadj[nei] + nFacesPerCell[nei]++] = own;
}
}
}
}
// From cell-cell connections to Metis format (like CompactListList)
void Foam::metisDecomp::calcMetisCSR
(
const labelListList& cellCells,
List<int>& adjncy,
List<int>& xadj
)
{
// Count number of internal faces
label nConnections = 0;
forAll(cellCells, coarseI)
{
nConnections += cellCells[coarseI].size();
}
// Create the adjncy array as twice the size of the total number of
// internal faces
adjncy.setSize(nConnections);
xadj.setSize(cellCells.size()+1);
// Fill in xadj
// ~~~~~~~~~~~~
label freeAdj = 0;
forAll(cellCells, coarseI)
{
xadj[coarseI] = freeAdj;
const labelList& cCells = cellCells[coarseI];
forAll(cCells, i)
{
adjncy[freeAdj++] = cCells[i];
}
}
xadj[cellCells.size()] = freeAdj;
}
Foam::labelList Foam::metisDecomp::decompose
(
const labelList& agglom,
@ -525,7 +380,7 @@ Foam::labelList Foam::metisDecomp::decompose
cellCells
);
calcMetisCSR(cellCells, adjncy, xadj);
scotchDecomp::calcCSR(cellCells, adjncy, xadj);
}
// Decompose using default weights
@ -570,7 +425,7 @@ Foam::labelList Foam::metisDecomp::decompose
List<int> adjncy;
List<int> xadj;
calcMetisCSR(globalCellCells, adjncy, xadj);
scotchDecomp::calcCSR(globalCellCells, adjncy, xadj);
// Decompose using default weights

View File

@ -132,24 +132,6 @@ public:
const scalarField& cWeights
);
//- Helper to convert connectivity (supplied as owner,neighbour) into
// Metis storage
static void calcMetisCSR
(
const polyMesh& mesh,
List<int>& adjncy,
List<int>& xadj
);
//- Helper to convert connectivity (supplied as cellcells) into
// Metis storage
static void calcMetisCSR
(
const labelListList& globalCellCells,
List<int>& adjncy,
List<int>& xadj
);
};

View File

@ -4,7 +4,8 @@ EXE_INC = \
$(PFLAGS) $(PINC) \
-I$(WM_THIRD_PARTY_DIR)/ParMetis-3.1/ParMETISLib \
-I$(WM_THIRD_PARTY_DIR)/ParMetis-3.1 \
-I../decompositionMethods/lnInclude
-I../decompositionMethods/lnInclude \
-I../metisDecomp/lnInclude
LIB_LIBS = \
-L$(FOAM_MPI_LIBBIN) \

View File

@ -26,6 +26,7 @@ License
#include "parMetisDecomp.H"
#include "metisDecomp.H"
#include "scotchDecomp.H"
#include "syncTools.H"
#include "addToRunTimeSelectionTable.H"
#include "floatScalar.H"
@ -434,7 +435,7 @@ Foam::labelList Foam::parMetisDecomp::decompose
{
FatalErrorIn
(
"metisDecomp::decompose"
"parMetisDecomp::decompose"
"(const pointField&, const scalarField&)"
) << "Number of cell weights " << cWeights.size()
<< " does not equal number of cells " << mesh_.nCells()
@ -762,7 +763,7 @@ Foam::labelList Foam::parMetisDecomp::decompose
Field<int> adjncy;
// Offsets into adjncy
Field<int> xadj;
metisDecomp::calcMetisCSR(globalCellCells, adjncy, xadj);
scotchDecomp::calcCSR(globalCellCells, adjncy, xadj);
// decomposition options. 0 = use defaults
List<int> options(3, 0);

View File

@ -24,7 +24,6 @@ $(surfaceFormats)/ac3d/AC3DsurfaceFormatCore.C
$(surfaceFormats)/ac3d/AC3DsurfaceFormatRunTime.C
$(surfaceFormats)/ftr/FTRsurfaceFormatRunTime.C
$(surfaceFormats)/gts/GTSsurfaceFormatRunTime.C
$(surfaceFormats)/nas/NASsurfaceFormatCore.C
$(surfaceFormats)/nas/NASsurfaceFormatRunTime.C
$(surfaceFormats)/obj/OBJsurfaceFormatRunTime.C
$(surfaceFormats)/off/OFFsurfaceFormatRunTime.C

View File

@ -0,0 +1,5 @@
EXE_INC = \
-I$(LIB_SRC)/fileFormats/lnInclude
LIB_LIBS = \
-lfileFormats

View File

@ -47,7 +47,7 @@ SourceFiles
#include "MeshedSurface.H"
#include "MeshedSurfaceProxy.H"
#include "UnsortedMeshedSurface.H"
#include "NASsurfaceFormatCore.H"
#include "NASCore.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -64,7 +64,7 @@ template<class Face>
class NASsurfaceFormat
:
public MeshedSurface<Face>,
public NASsurfaceFormatCore
public NASCore
{
// Private Member Functions

View File

@ -31,63 +31,6 @@ License
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
bool Foam::fileFormats::STARCDsurfaceFormatCore::readHeader
(
IFstream& is,
const word& signature
)
{
if (!is.good())
{
FatalErrorIn
(
"fileFormats::STARCDsurfaceFormatCore::readHeader(...)"
)
<< "cannot read " << signature << " " << is.name()
<< abort(FatalError);
}
word header;
label majorVersion;
string line;
is.getLine(line);
IStringStream(line)() >> header;
is.getLine(line);
IStringStream(line)() >> majorVersion;
// add other checks ...
if (header != signature)
{
Info<< "header mismatch " << signature << " " << is.name()
<< endl;
}
return true;
}
void Foam::fileFormats::STARCDsurfaceFormatCore::writeHeader
(
Ostream& os,
const char* filetype
)
{
os << "PROSTAR_" << filetype << nl
<< 4000
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< " " << 0
<< endl;
}
// parse things like this:
// CTNAME 1 someName
// don't bother with the older comma-delimited format
@ -102,12 +45,12 @@ Foam::fileFormats::STARCDsurfaceFormatCore::readInpCellTable
regExp ctnameRE
(
" *CTNA[^ ]*" // keyword - min 4 chars
"[[:space:]]+" // space delimited
"([0-9]+)" // 1: <digits>
"[[:space:]]+" // space delimited
" *CTNA[^ ]*" // keyword - min 4 chars
"[[:space:]]+" // space delimited
"([0-9]+)" // 1: <digits>
"[[:space:]]+" // space delimited
"([^,[:space:]].*)", // 2: <name>
true // ignore case
true // ignore case
);
string line;
@ -132,78 +75,6 @@ Foam::fileFormats::STARCDsurfaceFormatCore::readInpCellTable
}
bool Foam::fileFormats::STARCDsurfaceFormatCore::readPoints
(
IFstream& is,
pointField& points,
labelList& ids
)
{
//
// read .vrt file
// ~~~~~~~~~~~~~~
if (!is.good())
{
FatalErrorIn
(
"fileFormats::STARCDsurfaceFormatCore::readPoints(...)"
)
<< "Cannot read file " << is.name()
<< exit(FatalError);
}
readHeader(is, "PROSTAR_VERTEX");
DynamicList<point> dynPoints;
// STAR-CD index of points
DynamicList<label> dynPointId;
label lineLabel;
while ((is >> lineLabel).good())
{
scalar x, y, z;
is >> x >> y >> z;
dynPoints.append(point(x, y, z));
dynPointId.append(lineLabel);
}
points.transfer(dynPoints);
ids.transfer(dynPointId);
return true;
}
void Foam::fileFormats::STARCDsurfaceFormatCore::writePoints
(
Ostream& os,
const pointField& pointLst
)
{
writeHeader(os, "VERTEX");
// Set the precision of the points data to 10
os.precision(10);
// force decimal point for Fortran input
os.setf(std::ios::showpoint);
forAll(pointLst, ptI)
{
os
<< ptI + 1 << " "
<< pointLst[ptI].x() << " "
<< pointLst[ptI].y() << " "
<< pointLst[ptI].z() << nl;
}
os.flush();
}
void Foam::fileFormats::STARCDsurfaceFormatCore::writeCase
(
Ostream& os,
@ -238,4 +109,3 @@ void Foam::fileFormats::STARCDsurfaceFormatCore::writeCase
// ************************************************************************* //

View File

@ -40,6 +40,7 @@ SourceFiles
#include "Ostream.H"
#include "OFstream.H"
#include "MeshedSurface.H"
#include "STARCDCore.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -53,21 +54,15 @@ namespace fileFormats
\*---------------------------------------------------------------------------*/
class STARCDsurfaceFormatCore
:
public STARCDCore
{
protected:
// Protected Member Functions
static bool readHeader(IFstream&, const word&);
static void writeHeader(Ostream&, const char* filetype);
static Map<word> readInpCellTable(IFstream&);
static bool readPoints(IFstream&, pointField&, labelList& ids);
static void writePoints(Ostream&, const pointField&);
static void writeCase
(
Ostream&,

View File

@ -1 +1,5 @@
EXE_INC =
EXE_INC = \
-I$(LIB_SRC)/fileFormats/lnInclude
LIB_LIBS = \
-lfileFormats

View File

@ -36,7 +36,7 @@ Description
Example usage:
myInterfacePatchName
{
type turbulentTemperatureCoupledBaffle;
type compressible::turbulentTemperatureCoupledBaffle;
neighbourFieldName T;
K K; // or none
value uniform 300;

View File

@ -37,7 +37,7 @@ Description
Example usage:
myInterfacePatchName
{
type turbulentTemperatureCoupledBaffleMixed;
type compressible::turbulentTemperatureCoupledBaffleMixed;
neighbourFieldName T;
K K; // or none
value uniform 300;

View File

@ -220,6 +220,12 @@ castellatedMeshControls
// NOTE: This point should never be on a face, always inside a cell, even
// after refinement.
locationInMesh (3 0.28 0.43);
// Whether any faceZones (as specified in the refinementSurfaces)
// are only on the boundary of corresponding cellZones or also allow
// free-standing zone faces. Not used if there are no faceZones.
allowFreeStandingZoneFaces true;
}
@ -311,7 +317,8 @@ addLayersControls
maxThicknessToMedialRatio 0.3;
// Angle used to pick up medial axis points
minMedianAxisAngle 130;
// Note: changed(corrected) w.r.t 16x! 90 degrees corresponds to 130 in 16x.
minMedianAxisAngle 90;
// Create buffer region for new layer terminations
nBufferCellsNoExtrude 0;

View File

@ -145,6 +145,12 @@ castellatedMeshControls
// NOTE: This point should never be on a face, always inside a cell, even
// after refinement.
locationInMesh (3 3 0.43);
// Whether any faceZones (as specified in the refinementSurfaces)
// are only on the boundary of corresponding cellZones or also allow
// free-standing zone faces. Not used if there are no faceZones.
allowFreeStandingZoneFaces true;
}
@ -500,7 +506,9 @@ addLayersControls
maxThicknessToMedialRatio 0.3;
// Angle used to pick up medial axis points
minMedianAxisAngle 130;
// Note: changed(corrected) w.r.t 16x! 90 degrees corresponds to 130 in 16x.
minMedianAxisAngle 90;
// Create buffer region for new layer terminations
nBufferCellsNoExtrude 0;

View File

@ -33,17 +33,18 @@ boundaryField
{
type flowRateInletVelocity;
flowRate 0.00379;
value uniform (-0 10.82857143 -0);
value uniform (0 14.68 0);
}
inletSides
{
type flowRateInletVelocity;
flowRate 0.00832;
value uniform (-0 11.88571429 -0);
value uniform (0 17.79 0);
}
outlet
{
type zeroGradient;
type inletOutlet;
inletValue uniform (0 0 0);
}
walls
{

View File

@ -17,7 +17,7 @@ FoamFile
dimensions [0 2 -2 0 0 0 0];
internalField uniform 3.75e-11;
internalField uniform 3.75e-9;
boundaryField
{
@ -33,22 +33,23 @@ boundaryField
{
type turbulentIntensityKineticEnergyInlet;
intensity 0.15;
value uniform 3.75e-11;
value uniform 3.75e-9;
}
inletSides
{
type turbulentIntensityKineticEnergyInlet;
intensity 0.16;
value uniform 3.75e-11;
value uniform 3.75e-9;
}
outlet
{
type zeroGradient;
type inletOutlet;
inletValue uniform 3.75e-9;
}
walls
{
type compressible::kqRWallFunction;
value uniform 3.75e-11;
value uniform 0;
}
}

View File

@ -17,7 +17,7 @@ FoamFile
dimensions [0 0 -1 0 0 0 0];
internalField uniform 0.0016;
internalField uniform 4.5e-3;
boundaryField
{
@ -34,18 +34,19 @@ boundaryField
type compressible::turbulentMixingLengthFrequencyInlet;
mixingLength 0.007;
k k;
value uniform 0.0016;
value uniform 4.5e-3;
}
inletSides
{
type compressible::turbulentMixingLengthFrequencyInlet;
mixingLength 0.007;
k k;
value uniform 0.0016;
value uniform 4.5e-3;
}
outlet
{
type zeroGradient;
type inletOutlet;
inletValue uniform 4.5e-3;
}
walls
{
@ -53,7 +54,7 @@ boundaryField
Cmu 0.09;
kappa 0.41;
E 9.8;
value uniform 0.0016;
value uniform 0;
}
}

View File

@ -43,7 +43,8 @@ boundaryField
}
outlet
{
type zeroGradient;
type inletOutlet;
inletValue uniform (0 0 0);
}
walls
{

View File

@ -17,7 +17,7 @@ FoamFile
dimensions [0 2 -2 0 0 0 0];
internalField uniform 3.75e-11;
internalField uniform 3.75e-9;
boundaryField
{
@ -33,22 +33,23 @@ boundaryField
{
type turbulentIntensityKineticEnergyInlet;
intensity 0.15;
value uniform 3.75e-11;
value uniform 3.75e-9;
}
inletSides
{
type turbulentIntensityKineticEnergyInlet;
intensity 0.16;
value uniform 3.75e-11;
value uniform 3.75e-9;
}
outlet
{
type zeroGradient;
type inletOutlet;
inletValue uniform 3.75e-9;
}
walls
{
type compressible::kqRWallFunction;
value uniform 3.75e-11;
value uniform 0;
}
}

View File

@ -17,7 +17,7 @@ FoamFile
dimensions [0 0 -1 0 0 0 0];
internalField uniform 0.0016;
internalField uniform 4.5e-3;
boundaryField
{
@ -34,18 +34,19 @@ boundaryField
type compressible::turbulentMixingLengthFrequencyInlet;
mixingLength 0.007;
k k;
value uniform 0.0016;
value uniform 4.5e-3;
}
inletSides
{
type compressible::turbulentMixingLengthFrequencyInlet;
mixingLength 0.007;
k k;
value uniform 0.0016;
value uniform 4.5-3;
}
outlet
{
type zeroGradient;
type inletOutlet;
inletValue uniform 4.5e-3;
}
walls
{
@ -53,7 +54,7 @@ boundaryField
Cmu 0.09;
kappa 0.41;
E 9.8;
value uniform 0.0016;
value uniform 0;
}
}

View File

@ -5,5 +5,9 @@
# create mesh
runApplication blockMesh
# initialise with potentialFoam solution
runApplication potentialFoam
rm -f 0/phi
# run the solver
runApplication porousExplicitSourceReactingParcelFoam

View File

@ -16,7 +16,7 @@ FoamFile
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
dimensions [0 1 -2 0 0 0 0];
value ( 0 0 0 );
value ( 0 -9.81 0 );
// ************************************************************************* //

View File

@ -1,7 +1,7 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: 1.6 |
| \\ / O peration | Version: dev |
| \\ / A nd | Web: www.OpenFOAM.org |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/

View File

@ -129,7 +129,7 @@ StandardWallInteractionCoeffs
RanzMarshallCoeffs
{
BirdCorrection on; // off;
BirdCorrection off;
}
SinglePhaseMixtureCoeffs