mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: snappyHexMesh: more parallel consistency. See #2331
This commit is contained in:
@ -48,6 +48,10 @@ License
|
|||||||
#include "refinementDistanceData.H"
|
#include "refinementDistanceData.H"
|
||||||
#include "degenerateMatcher.H"
|
#include "degenerateMatcher.H"
|
||||||
|
|
||||||
|
//#include "fvMesh.H"
|
||||||
|
//#include "volFields.H"
|
||||||
|
//#include "OBJstream.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
@ -2803,17 +2807,90 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//{
|
||||||
|
// const fvMesh& fMesh = reinterpret_cast<const fvMesh&>(mesh_);
|
||||||
|
//
|
||||||
|
// // Dump origin level
|
||||||
|
// volScalarField originLevel
|
||||||
|
// (
|
||||||
|
// IOobject
|
||||||
|
// (
|
||||||
|
// "originLevel_before_walk",
|
||||||
|
// fMesh.time().timeName(),
|
||||||
|
// fMesh,
|
||||||
|
// IOobject::NO_READ,
|
||||||
|
// IOobject::NO_WRITE,
|
||||||
|
// IOobject::NO_REGISTER
|
||||||
|
// ),
|
||||||
|
// fMesh,
|
||||||
|
// dimensionedScalar(dimless, Zero)
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// forAll(originLevel, celli)
|
||||||
|
// {
|
||||||
|
// originLevel[celli] = allCellInfo[celli].originLevel();
|
||||||
|
// }
|
||||||
|
// Pout<< "Writing " << originLevel.objectPath() << endl;
|
||||||
|
// originLevel.write();
|
||||||
|
//}
|
||||||
|
//{
|
||||||
|
// const auto& cc = mesh_.cellCentres();
|
||||||
|
//
|
||||||
|
// mkDir(mesh_.time().timePath());
|
||||||
|
// OBJstream os(mesh_.time().timePath()/"origin_before_walk.obj");
|
||||||
|
// forAll(allCellInfo, celli)
|
||||||
|
// {
|
||||||
|
// os.write(linePointRef(cc[celli], allCellInfo[celli].origin()));
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
// Labels of seed faces
|
// Labels of seed faces
|
||||||
DynamicList<label> seedFaces(mesh_.nFaces()/100);
|
DynamicList<label> seedFaces(mesh_.nFaces()/100);
|
||||||
// refinementLevel data on seed faces
|
// refinementLevel data on seed faces
|
||||||
DynamicList<refinementDistanceData> seedFacesInfo(mesh_.nFaces()/100);
|
DynamicList<refinementDistanceData> seedFacesInfo(mesh_.nFaces()/100);
|
||||||
|
|
||||||
const pointField& cc = mesh_.cellCentres();
|
const pointField& cc = mesh_.cellCentres();
|
||||||
|
const polyBoundaryMesh& patches = mesh_.boundaryMesh();
|
||||||
|
|
||||||
forAll(facesToCheck, i)
|
// Get neighbour boundary data:
|
||||||
|
// - coupled faces : owner data
|
||||||
|
// - non-coupled faces : owner level + 1 so we can treat
|
||||||
|
pointField nbrCc(mesh_.nBoundaryFaces(), point::max);
|
||||||
|
labelList nbrLevel(mesh_.nBoundaryFaces(), labelMax);
|
||||||
|
bitSet isBoundary(mesh_.nFaces());
|
||||||
{
|
{
|
||||||
label facei = facesToCheck[i];
|
for (const polyPatch& pp : patches)
|
||||||
|
{
|
||||||
|
if (pp.coupled())
|
||||||
|
{
|
||||||
|
const auto& faceCells = pp.faceCells();
|
||||||
|
forAll(faceCells, i)
|
||||||
|
{
|
||||||
|
const label own = faceCells[i];
|
||||||
|
nbrCc[pp.offset()+i] = cc[own];
|
||||||
|
|
||||||
|
const label ownLevel =
|
||||||
|
(
|
||||||
|
allCellInfo[own].valid(dummyTrackData)
|
||||||
|
? allCellInfo[own].originLevel()
|
||||||
|
: cellLevel_[own]
|
||||||
|
);
|
||||||
|
nbrLevel[pp.offset()+i] = ownLevel;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isBoundary.set(pp.range());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
syncTools::swapBoundaryFaceList(mesh_, nbrCc);
|
||||||
|
syncTools::swapBoundaryFaceList(mesh_, nbrLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
for (const label facei : facesToCheck)
|
||||||
|
{
|
||||||
if (allFaceInfo[facei].valid(dummyTrackData))
|
if (allFaceInfo[facei].valid(dummyTrackData))
|
||||||
{
|
{
|
||||||
// Can only occur if face has already gone through loop below.
|
// Can only occur if face has already gone through loop below.
|
||||||
@ -2825,16 +2902,16 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
<< abort(FatalError);
|
<< abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
label own = faceOwner[facei];
|
const label own = faceOwner[facei];
|
||||||
|
const label ownLevel =
|
||||||
label ownLevel =
|
|
||||||
(
|
(
|
||||||
allCellInfo[own].valid(dummyTrackData)
|
allCellInfo[own].valid(dummyTrackData)
|
||||||
? allCellInfo[own].originLevel()
|
? allCellInfo[own].originLevel()
|
||||||
: cellLevel_[own]
|
: cellLevel_[own]
|
||||||
);
|
);
|
||||||
|
const point& ownCc = cc[own];
|
||||||
|
|
||||||
if (!mesh_.isInternalFace(facei))
|
if (isBoundary(facei))
|
||||||
{
|
{
|
||||||
// Do as if boundary face would have neighbour with one higher
|
// Do as if boundary face would have neighbour with one higher
|
||||||
// refinement level.
|
// refinement level.
|
||||||
@ -2859,14 +2936,24 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
label nei = faceNeighbour[facei];
|
label neiLevel;
|
||||||
|
point neiCc;
|
||||||
label neiLevel =
|
if (mesh_.isInternalFace(facei))
|
||||||
(
|
{
|
||||||
allCellInfo[nei].valid(dummyTrackData)
|
const label nei = faceNeighbour[facei];
|
||||||
? allCellInfo[nei].originLevel()
|
neiLevel =
|
||||||
: cellLevel_[nei]
|
(
|
||||||
);
|
allCellInfo[nei].valid(dummyTrackData)
|
||||||
|
? allCellInfo[nei].originLevel()
|
||||||
|
: cellLevel_[nei]
|
||||||
|
);
|
||||||
|
neiCc = cc[nei];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
neiLevel = nbrLevel[facei-mesh_.nInternalFaces()];
|
||||||
|
neiCc = nbrCc[facei-mesh_.nInternalFaces()];
|
||||||
|
}
|
||||||
|
|
||||||
if (ownLevel == neiLevel)
|
if (ownLevel == neiLevel)
|
||||||
{
|
{
|
||||||
@ -2875,8 +2962,8 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
(
|
(
|
||||||
mesh_,
|
mesh_,
|
||||||
facei,
|
facei,
|
||||||
nei,
|
own, // not used, should be nei
|
||||||
refinementDistanceData(level0Size, cc[nei], neiLevel+1),
|
refinementDistanceData(level0Size, neiCc, neiLevel+1),
|
||||||
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
||||||
dummyTrackData
|
dummyTrackData
|
||||||
);
|
);
|
||||||
@ -2884,8 +2971,8 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
(
|
(
|
||||||
mesh_,
|
mesh_,
|
||||||
facei,
|
facei,
|
||||||
own,
|
own, // not used
|
||||||
refinementDistanceData(level0Size, cc[own], ownLevel+1),
|
refinementDistanceData(level0Size, ownCc, ownLevel+1),
|
||||||
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
||||||
dummyTrackData
|
dummyTrackData
|
||||||
);
|
);
|
||||||
@ -2897,8 +2984,8 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
(
|
(
|
||||||
mesh_,
|
mesh_,
|
||||||
facei,
|
facei,
|
||||||
nei,
|
own, // not used, should be nei
|
||||||
refinementDistanceData(level0Size, cc[nei], neiLevel),
|
refinementDistanceData(level0Size, neiCc, neiLevel),
|
||||||
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
||||||
dummyTrackData
|
dummyTrackData
|
||||||
);
|
);
|
||||||
@ -2906,8 +2993,8 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
(
|
(
|
||||||
mesh_,
|
mesh_,
|
||||||
facei,
|
facei,
|
||||||
own,
|
own, // not used
|
||||||
refinementDistanceData(level0Size, cc[own], ownLevel),
|
refinementDistanceData(level0Size, ownCc, ownLevel),
|
||||||
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
||||||
dummyTrackData
|
dummyTrackData
|
||||||
);
|
);
|
||||||
@ -2918,31 +3005,45 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Create some initial seeds to start walking from. This is only if there
|
// Create some initial seeds to start walking from. This is only if there
|
||||||
// are no facesToCheck.
|
// are no facesToCheck.
|
||||||
// Just seed with all faces inbetween different refinement levels for now
|
// Just seed with all faces inbetween different refinement levels for now
|
||||||
forAll(faceNeighbour, facei)
|
// Note: no need to handle coupled faces since FaceCellWave below
|
||||||
|
// already swaps seedInfo upon start
|
||||||
|
//forAll(faceNeighbour, facei)
|
||||||
|
forAll(faceOwner, facei)
|
||||||
{
|
{
|
||||||
// Check if face already handled in loop above
|
// Check if face already handled in loop above
|
||||||
if (!allFaceInfo[facei].valid(dummyTrackData))
|
if (!allFaceInfo[facei].valid(dummyTrackData) && !isBoundary(facei))
|
||||||
{
|
{
|
||||||
label own = faceOwner[facei];
|
const label own = faceOwner[facei];
|
||||||
|
const label ownLevel =
|
||||||
label ownLevel =
|
|
||||||
(
|
(
|
||||||
allCellInfo[own].valid(dummyTrackData)
|
allCellInfo[own].valid(dummyTrackData)
|
||||||
? allCellInfo[own].originLevel()
|
? allCellInfo[own].originLevel()
|
||||||
: cellLevel_[own]
|
: cellLevel_[own]
|
||||||
);
|
);
|
||||||
|
const point& ownCc = cc[own];
|
||||||
|
|
||||||
label nei = faceNeighbour[facei];
|
label neiLevel;
|
||||||
|
point neiCc;
|
||||||
label neiLevel =
|
if (mesh_.isInternalFace(facei))
|
||||||
(
|
{
|
||||||
allCellInfo[nei].valid(dummyTrackData)
|
const label nei = faceNeighbour[facei];
|
||||||
? allCellInfo[nei].originLevel()
|
neiLevel =
|
||||||
: cellLevel_[nei]
|
(
|
||||||
);
|
allCellInfo[nei].valid(dummyTrackData)
|
||||||
|
? allCellInfo[nei].originLevel()
|
||||||
|
: cellLevel_[nei]
|
||||||
|
);
|
||||||
|
neiCc = cc[nei];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
neiLevel = nbrLevel[facei-mesh_.nInternalFaces()];
|
||||||
|
neiCc = nbrCc[facei-mesh_.nInternalFaces()];
|
||||||
|
}
|
||||||
|
|
||||||
if (ownLevel > neiLevel)
|
if (ownLevel > neiLevel)
|
||||||
{
|
{
|
||||||
@ -2953,7 +3054,7 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
mesh_,
|
mesh_,
|
||||||
facei,
|
facei,
|
||||||
own,
|
own,
|
||||||
refinementDistanceData(level0Size, cc[own], ownLevel),
|
refinementDistanceData(level0Size, ownCc, ownLevel),
|
||||||
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
||||||
dummyTrackData
|
dummyTrackData
|
||||||
);
|
);
|
||||||
@ -2966,8 +3067,8 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
(
|
(
|
||||||
mesh_,
|
mesh_,
|
||||||
facei,
|
facei,
|
||||||
nei,
|
own, // not used, should be nei,
|
||||||
refinementDistanceData(level0Size, cc[nei], neiLevel),
|
refinementDistanceData(level0Size, neiCc, neiLevel),
|
||||||
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
FaceCellWave<refinementDistanceData, int>::propagationTol(),
|
||||||
dummyTrackData
|
dummyTrackData
|
||||||
);
|
);
|
||||||
@ -2992,8 +3093,45 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
//- noted: origin is different face (? or cell) between non-parallel
|
||||||
|
// and parallel
|
||||||
|
//{
|
||||||
|
// const auto& cc = mesh_.cellCentres();
|
||||||
|
//
|
||||||
|
// mkDir(mesh_.time().timePath());
|
||||||
|
// OBJstream os(mesh_.time().timePath()/"origin_after_walk.obj");
|
||||||
|
// forAll(allCellInfo, celli)
|
||||||
|
// {
|
||||||
|
// os.write(linePointRef(cc[celli], allCellInfo[celli].origin()));
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//if (debug)
|
//if (debug)
|
||||||
//{
|
//{
|
||||||
|
// const fvMesh& fMesh = reinterpret_cast<const fvMesh&>(mesh_);
|
||||||
|
//
|
||||||
|
// // Dump origin level
|
||||||
|
// volScalarField originLevel
|
||||||
|
// (
|
||||||
|
// IOobject
|
||||||
|
// (
|
||||||
|
// "originLevel_after_walk",
|
||||||
|
// fMesh.time().timeName(),
|
||||||
|
// fMesh,
|
||||||
|
// IOobject::NO_READ,
|
||||||
|
// IOobject::NO_WRITE,
|
||||||
|
// IOobject::NO_REGISTER
|
||||||
|
// ),
|
||||||
|
// fMesh,
|
||||||
|
// dimensionedScalar(dimless, Zero)
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// forAll(originLevel, celli)
|
||||||
|
// {
|
||||||
|
// originLevel[celli] = allCellInfo[celli].originLevel();
|
||||||
|
// }
|
||||||
// // Dump wanted level
|
// // Dump wanted level
|
||||||
// volScalarField wantedLevel
|
// volScalarField wantedLevel
|
||||||
// (
|
// (
|
||||||
@ -3015,6 +3153,9 @@ Foam::labelList Foam::hexRef8::consistentSlowRefinement2
|
|||||||
// wantedLevel[celli] = allCellInfo[celli].wantedLevel(cc[celli]);
|
// wantedLevel[celli] = allCellInfo[celli].wantedLevel(cc[celli]);
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
|
// Pout<< "Writing " << originLevel.objectPath() << endl;
|
||||||
|
// //fMesh.write();
|
||||||
|
// originLevel.write();
|
||||||
// Pout<< "Writing " << wantedLevel.objectPath() << endl;
|
// Pout<< "Writing " << wantedLevel.objectPath() << endl;
|
||||||
// wantedLevel.write();
|
// wantedLevel.write();
|
||||||
//}
|
//}
|
||||||
|
|||||||
Reference in New Issue
Block a user