Bugfixes and improvements for parallel decomposition/reconstruction of regions

This commit is contained in:
Pascal Beckstein 2016-09-06 17:59:55 +02:00
parent 4fad65ce7c
commit 5d7e870db7
6 changed files with 116 additions and 24 deletions

View file

@ -284,6 +284,7 @@ int main(int argc, char *argv[])
( (
"cellDist", "cellDist",
runTime.timeName(), runTime.timeName(),
mesh.dbDir(),
mesh, mesh,
IOobject::NO_READ, IOobject::NO_READ,
IOobject::NO_WRITE IOobject::NO_WRITE
@ -914,7 +915,7 @@ int main(int argc, char *argv[])
"faBoundary", "faBoundary",
mesh.time().findInstance mesh.time().findInstance
( (
mesh.dbDir()/polyMesh::meshSubDir, mesh.meshDir(),
"boundary" "boundary"
), ),
faMesh::meshSubDir, faMesh::meshSubDir,
@ -989,12 +990,20 @@ int main(int argc, char *argv[])
faMesh procMesh(procFvMesh); faMesh procMesh(procFvMesh);
word faceLabelsInstance =
procMesh.time().findInstance
(
procMesh.meshDir(),
"faceLabels"
);
labelIOList faceProcAddressing labelIOList faceProcAddressing
( (
IOobject IOobject
( (
"faceProcAddressing", "faceProcAddressing",
"constant", faceLabelsInstance,
procMesh.meshSubDir, procMesh.meshSubDir,
procFvMesh, procFvMesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -1007,7 +1016,7 @@ int main(int argc, char *argv[])
IOobject IOobject
( (
"boundaryProcAddressing", "boundaryProcAddressing",
"constant", faceLabelsInstance,
procMesh.meshSubDir, procMesh.meshSubDir,
procFvMesh, procFvMesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -1031,7 +1040,7 @@ int main(int argc, char *argv[])
IOobject IOobject
( (
"edgeProcAddressing", "edgeProcAddressing",
"constant", faceLabelsInstance,
procMesh.meshSubDir, procMesh.meshSubDir,
procFvMesh, procFvMesh,
IOobject::MUST_READ, IOobject::MUST_READ,

View file

@ -78,7 +78,7 @@ void faMeshDecomposition::distributeFaces()
IOobject IOobject
( (
"faceProcAddressing", "faceProcAddressing",
"constant", procMesh.facesInstance(),
procMesh.meshSubDir, procMesh.meshSubDir,
procMesh, procMesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -94,7 +94,7 @@ void faMeshDecomposition::distributeFaces()
IOobject IOobject
( (
"owner", "owner",
"constant", procMesh.facesInstance(),
procMesh.meshSubDir, procMesh.meshSubDir,
procMesh, procMesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -127,7 +127,7 @@ void faMeshDecomposition::distributeFaces()
IOobject IOobject
( (
"faceProcAddressing", "faceProcAddressing",
"constant", procMesh.facesInstance(),
procMesh.meshSubDir, procMesh.meshSubDir,
procMesh, procMesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -263,7 +263,7 @@ void faMeshDecomposition::decomposeMesh(const bool filterEmptyPatches)
IOobject IOobject
( (
"pointProcAddressing", "pointProcAddressing",
"constant", procFvMesh.facesInstance(),
procFvMesh.meshSubDir, procFvMesh.meshSubDir,
procFvMesh, procFvMesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -279,7 +279,7 @@ void faMeshDecomposition::decomposeMesh(const bool filterEmptyPatches)
IOobject IOobject
( (
"faceProcAddressing", "faceProcAddressing",
"constant", procFvMesh.facesInstance(),
procFvMesh.meshSubDir, procFvMesh.meshSubDir,
procFvMesh, procFvMesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -1202,7 +1202,7 @@ bool faMeshDecomposition::writeDecomposition()
IOobject IOobject
( (
"boundaryProcAddressing", "boundaryProcAddressing",
"constant", procFvMesh.facesInstance(),
procFvMesh.meshSubDir, procFvMesh.meshSubDir,
procFvMesh, procFvMesh,
IOobject::MUST_READ, IOobject::MUST_READ,
@ -1340,13 +1340,20 @@ bool faMeshDecomposition::writeDecomposition()
maxProcPatches = max(maxProcPatches, nProcPatches); maxProcPatches = max(maxProcPatches, nProcPatches);
maxProcEdges = max(maxProcEdges, nProcEdges); maxProcEdges = max(maxProcEdges, nProcEdges);
word faceLabelsInstance =
procMesh.time().findInstance
(
procMesh.meshDir(),
"faceLabels"
);
// create and write the addressing information // create and write the addressing information
labelIOList pointProcAddressing labelIOList pointProcAddressing
( (
IOobject IOobject
( (
"pointProcAddressing", "pointProcAddressing",
"constant", faceLabelsInstance,
procMesh.meshSubDir, procMesh.meshSubDir,
procFvMesh, procFvMesh,
IOobject::NO_READ, IOobject::NO_READ,
@ -1361,7 +1368,7 @@ bool faMeshDecomposition::writeDecomposition()
IOobject IOobject
( (
"edgeProcAddressing", "edgeProcAddressing",
"constant", faceLabelsInstance,
procMesh.meshSubDir, procMesh.meshSubDir,
procFvMesh, procFvMesh,
IOobject::NO_READ, IOobject::NO_READ,
@ -1376,7 +1383,7 @@ bool faMeshDecomposition::writeDecomposition()
IOobject IOobject
( (
"faceProcAddressing", "faceProcAddressing",
"constant", faceLabelsInstance,
procMesh.meshSubDir, procMesh.meshSubDir,
procFvMesh, procFvMesh,
IOobject::NO_READ, IOobject::NO_READ,
@ -1391,7 +1398,7 @@ bool faMeshDecomposition::writeDecomposition()
IOobject IOobject
( (
"boundaryProcAddressing", "boundaryProcAddressing",
"constant", faceLabelsInstance,
procMesh.meshSubDir, procMesh.meshSubDir,
procFvMesh, procFvMesh,
IOobject::NO_READ, IOobject::NO_READ,

View file

@ -157,6 +157,16 @@ Foam::polyMesh::readUpdateState Foam::processorMeshes::readUpdate()
// Check if any new meshes need to be read. // Check if any new meshes need to be read.
polyMesh::readUpdateState procStat = meshes_[procI].readUpdate(); polyMesh::readUpdateState procStat = meshes_[procI].readUpdate();
// Force changed mesh if the processor mesh holds points. This is
// essential for changed region meshes and if the current time is
// equal to the initial time during construction.
// Pascal Beckstein, 14/Jul/2016
fileName timePath = meshes_[procI].time().timePath();
if (isFile(timePath/meshes_[procI].meshDir()/"points"))
{
procStat = polyMesh::POINTS_MOVED;
}
// Combine into overall mesh change status // Combine into overall mesh change status
if (stat == polyMesh::UNCHANGED) if (stat == polyMesh::UNCHANGED)
{ {
@ -196,8 +206,36 @@ Foam::polyMesh::readUpdateState Foam::processorMeshes::readUpdate()
void Foam::processorMeshes::reconstructPoints(fvMesh& mesh) void Foam::processorMeshes::reconstructPoints(fvMesh& mesh)
{ {
// We may not use
// mesh.movePoints(newPoints);
// mesh.write();
// here, as this will fail for mesh regions containing
// directMappedPolyPatches or
// directMappedWallPolyPatches
// and probably other region-coupled patches. E.g. for both above
// mentioned directMapped patch types we have calls to
// directMappedPatchBase::map()
// in the corresponding initMovePoints(const pointField& p) member
// function. This however involves parallel communication and it would
// require all other connected regions to be already reconstructed and
// registered during reconstruction of the current region!
// Pascal Beckstein, 14/Jul/2016
// Create the new points // Create the new points
vectorField newPoints(mesh.nPoints()); pointIOField newPoints
(
IOobject
(
"points",
mesh.time().timeName(),
mesh.meshSubDir,
mesh,
IOobject::NO_READ,
IOobject::NO_WRITE,
false
),
mesh.allPoints()
);
forAll (meshes_, procI) forAll (meshes_, procI)
{ {
@ -225,8 +263,8 @@ void Foam::processorMeshes::reconstructPoints(fvMesh& mesh)
} }
} }
mesh.movePoints(newPoints); newPoints.write();
mesh.write(); mesh.readUpdate();
} }

View file

@ -157,6 +157,16 @@ Foam::polyMesh::readUpdateState Foam::processorMeshes::readUpdate()
// Check if any new meshes need to be read. // Check if any new meshes need to be read.
polyMesh::readUpdateState procStat = meshes_[procI].readUpdate(); polyMesh::readUpdateState procStat = meshes_[procI].readUpdate();
// Force changed mesh if the processor mesh holds points. This is
// essential for changed region meshes and if the current time is
// equal to the initial time during construction.
// Pascal Beckstein, 14/Jul/2016
fileName timePath = meshes_[procI].time().timePath();
if (isFile(timePath/meshes_[procI].meshDir()/"points"))
{
procStat = polyMesh::POINTS_MOVED;
}
// Combine into overall mesh change status // Combine into overall mesh change status
if (stat == polyMesh::UNCHANGED) if (stat == polyMesh::UNCHANGED)
{ {
@ -196,8 +206,36 @@ Foam::polyMesh::readUpdateState Foam::processorMeshes::readUpdate()
void Foam::processorMeshes::reconstructPoints(fvMesh& mesh) void Foam::processorMeshes::reconstructPoints(fvMesh& mesh)
{ {
// We may not use
// mesh.movePoints(newPoints);
// mesh.write();
// here, as this will fail for mesh regions containing
// directMappedPolyPatches or
// directMappedWallPolyPatches
// and probably other region-coupled patches. E.g. for both above
// mentioned directMapped patch types we have calls to
// directMappedPatchBase::map()
// in the corresponding initMovePoints(const pointField& p) member
// function. This however involves parallel communication and it would
// require all other connected regions to be already reconstructed and
// registered during reconstruction of the current region!
// Pascal Beckstein, 14/Jul/2016
// Create the new points // Create the new points
vectorField newPoints(mesh.nPoints()); pointIOField newPoints
(
IOobject
(
"points",
mesh.time().timeName(),
mesh.meshSubDir,
mesh,
IOobject::NO_READ,
IOobject::NO_WRITE,
false
),
mesh.allPoints()
);
forAll (meshes_, procI) forAll (meshes_, procI)
{ {
@ -225,8 +263,8 @@ void Foam::processorMeshes::reconstructPoints(fvMesh& mesh)
} }
} }
mesh.movePoints(newPoints); newPoints.write();
mesh.write(); mesh.readUpdate();
} }

View file

@ -258,7 +258,7 @@ Foam::faMesh::faMesh(const polyMesh& pMesh)
// Calculate the geometry for the patches (transformation tensors etc.) // Calculate the geometry for the patches (transformation tensors etc.)
boundary_.calcGeometry(); boundary_.calcGeometry();
if (isFile(pMesh.time().timePath()/"S0")) if (isFile(pMesh.time().timePath()/pMesh.dbDir()/"S0"))
{ {
S0Ptr_ = new DimensionedField<scalar, areaMesh> S0Ptr_ = new DimensionedField<scalar, areaMesh>
( (
@ -805,7 +805,7 @@ Foam::faMesh::faMesh
// Calculate the geometry for the patches (transformation tensors etc.) // Calculate the geometry for the patches (transformation tensors etc.)
boundary_.calcGeometry(); boundary_.calcGeometry();
if (isFile(mesh().time().timePath()/"S0")) if (isFile(mesh().time().timePath()/mesh().dbDir()/"S0"))
{ {
S0Ptr_ = new DimensionedField<scalar, areaMesh> S0Ptr_ = new DimensionedField<scalar, areaMesh>
( (

View file

@ -123,7 +123,7 @@ Foam::fvMesh::fvMesh(const IOobject& io)
// Check the existance of the cell volumes and read if present // Check the existance of the cell volumes and read if present
// and set the storage of V00 // and set the storage of V00
if (isFile(time().timePath()/"V0")) if (isFile(time().timePath()/polyMesh::dbDir()/"V0"))
{ {
if (debug) if (debug)
{ {
@ -148,7 +148,7 @@ Foam::fvMesh::fvMesh(const IOobject& io)
// Check the existance of the mesh fluxes, read if present and set the // Check the existance of the mesh fluxes, read if present and set the
// mesh to be moving // mesh to be moving
if (isFile(time().timePath()/"meshPhi")) if (isFile(time().timePath()/polyMesh::dbDir()/"meshPhi"))
{ {
if (debug) if (debug)
{ {