mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: snappyHexMesh: add buffer layers before snapping
This commit is contained in:
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2017 OpenFOAM Foundation
|
||||
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||
Copyright (C) 2016-2022,2024 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -666,6 +666,9 @@ int main(int argc, char *argv[])
|
||||
),
|
||||
decompDictFile
|
||||
);
|
||||
// Make sure pointMesh gets read as well
|
||||
(void)pointMesh::New(mesh, IOobject::READ_IF_PRESENT);
|
||||
|
||||
|
||||
// Decompose the mesh
|
||||
if (!decomposeFieldsOnly)
|
||||
@ -785,6 +788,7 @@ int main(int argc, char *argv[])
|
||||
PtrList<labelIOList> cellProcAddressingList(mesh.nProcs());
|
||||
PtrList<labelIOList> boundaryProcAddressingList(mesh.nProcs());
|
||||
PtrList<labelIOList> pointProcAddressingList(mesh.nProcs());
|
||||
PtrList<labelIOList> pointBoundaryProcAddressingList(mesh.nProcs());
|
||||
|
||||
PtrList<fvFieldDecomposer> fieldDecomposerList(mesh.nProcs());
|
||||
PtrList<pointFieldDecomposer> pointFieldDecomposerList
|
||||
@ -869,7 +873,10 @@ int main(int argc, char *argv[])
|
||||
|
||||
// Point fields
|
||||
// ~~~~~~~~~~~~
|
||||
const pointMesh& pMesh = pointMesh::New(mesh);
|
||||
|
||||
// Read decomposed pointMesh
|
||||
const pointMesh& pMesh =
|
||||
pointMesh::New(mesh, IOobject::READ_IF_PRESENT);
|
||||
|
||||
pointFieldDecomposer::fieldsCache pointFieldCache;
|
||||
|
||||
@ -1138,7 +1145,34 @@ int main(int argc, char *argv[])
|
||||
pointProcAddressingList
|
||||
);
|
||||
|
||||
const pointMesh& procPMesh = pointMesh::New(procMesh);
|
||||
const pointMesh& procPMesh =
|
||||
pointMesh::New(procMesh, IOobject::READ_IF_PRESENT);
|
||||
|
||||
if (!pointBoundaryProcAddressingList.set(proci))
|
||||
{
|
||||
pointBoundaryProcAddressingList.set
|
||||
(
|
||||
proci,
|
||||
autoPtr<labelIOList>::New
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"boundaryProcAddressing",
|
||||
procMesh.facesInstance(),
|
||||
polyMesh::meshSubDir
|
||||
/pointMesh::meshSubDir,
|
||||
procPMesh.thisDb(),
|
||||
IOobject::READ_IF_PRESENT,
|
||||
IOobject::NO_WRITE,
|
||||
IOobject::NO_REGISTER
|
||||
),
|
||||
boundaryProcAddressing
|
||||
)
|
||||
);
|
||||
}
|
||||
const auto& pointBoundaryProcAddressing =
|
||||
pointBoundaryProcAddressingList[proci];
|
||||
|
||||
|
||||
if (!pointFieldDecomposerList.set(proci))
|
||||
{
|
||||
@ -1150,7 +1184,7 @@ int main(int argc, char *argv[])
|
||||
pMesh,
|
||||
procPMesh,
|
||||
pointProcAddressing,
|
||||
boundaryProcAddressing
|
||||
pointBoundaryProcAddressing
|
||||
)
|
||||
);
|
||||
}
|
||||
@ -1162,6 +1196,12 @@ int main(int argc, char *argv[])
|
||||
|
||||
if (times.size() == 1)
|
||||
{
|
||||
// Early deletion
|
||||
pointBoundaryProcAddressingList.set
|
||||
(
|
||||
proci,
|
||||
nullptr
|
||||
);
|
||||
pointProcAddressingList.set(proci, nullptr);
|
||||
pointFieldDecomposerList.set(proci, nullptr);
|
||||
}
|
||||
|
||||
@ -44,6 +44,12 @@ License
|
||||
#include "decompositionModel.H"
|
||||
#include "hexRef8Data.H"
|
||||
|
||||
// For handling pointMeshes with additional patches
|
||||
#include "pointMesh.H"
|
||||
#include "meshPointPatch.H"
|
||||
#include "processorPointPatch.H"
|
||||
#include "DynamicField.H"
|
||||
|
||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||
|
||||
void Foam::domainDecomposition::mark
|
||||
@ -740,6 +746,101 @@ bool Foam::domainDecomposition::writeDecomposition(const bool decomposeSets)
|
||||
|
||||
procMesh.write();
|
||||
|
||||
// Add pointMesh if it was available
|
||||
const auto* pMeshPtr =
|
||||
thisDb().cfindObject<pointMesh>(pointMesh::typeName);
|
||||
if (pMeshPtr)
|
||||
{
|
||||
const auto& pMesh = *pMeshPtr;
|
||||
const auto& pMeshBoundary = pMesh.boundary();
|
||||
|
||||
|
||||
// 1. Generate pointBoundaryMesh from polyBoundaryMesh (so ignoring
|
||||
// any additional patches
|
||||
const auto& procPointMesh = pointMesh::New(procMesh);
|
||||
|
||||
pointBoundaryMesh& procBoundary =
|
||||
const_cast<pointBoundaryMesh&>(procPointMesh.boundary());
|
||||
|
||||
|
||||
// 2. Explicitly add subsetted meshPointPatches
|
||||
forAll(pMeshBoundary, patchi)
|
||||
{
|
||||
const auto* mppPtr = isA<meshPointPatch>(pMeshBoundary[patchi]);
|
||||
if (mppPtr && (procBoundary.findPatchID(mppPtr->name()) == -1))
|
||||
{
|
||||
const auto& mpp = *mppPtr;
|
||||
|
||||
DynamicList<label> procMeshPoints(mpp.size());
|
||||
DynamicField<vector> procNormals(mpp.size());
|
||||
forAll(mpp.meshPoints(), i)
|
||||
{
|
||||
const label pointi = mpp.meshPoints()[i];
|
||||
const label procPointi = pointLookup[pointi];
|
||||
if (procPointi != -1)
|
||||
{
|
||||
procMeshPoints.append(procPointi);
|
||||
procNormals.append(mpp.pointNormals()[i]);
|
||||
}
|
||||
}
|
||||
|
||||
procBoundary.push_back
|
||||
(
|
||||
new meshPointPatch
|
||||
(
|
||||
mpp.name(),
|
||||
procMeshPoints,
|
||||
procNormals,
|
||||
procBoundary.size(),
|
||||
procBoundary,
|
||||
meshPointPatch::typeName
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Shuffle new patches before any processor patches
|
||||
labelList oldToNew(procBoundary.size());
|
||||
label newPatchi = 0;
|
||||
forAll(procBoundary, patchi)
|
||||
{
|
||||
if (!isA<processorPointPatch>(procBoundary[patchi]))
|
||||
{
|
||||
oldToNew[patchi] = newPatchi;
|
||||
newPatchi++;
|
||||
}
|
||||
}
|
||||
|
||||
// decomposed-to-undecomposed patch numbering
|
||||
labelList boundaryProcAddressing(identity(newPatchi));
|
||||
boundaryProcAddressing.setSize(procBoundary.size(), -1);
|
||||
|
||||
forAll(procBoundary, patchi)
|
||||
{
|
||||
if (isA<processorPointPatch>(procBoundary[patchi]))
|
||||
{
|
||||
oldToNew[patchi] = newPatchi++;
|
||||
}
|
||||
}
|
||||
procBoundary.reorder(oldToNew, true);
|
||||
|
||||
// Write pointMesh/boundary
|
||||
procBoundary.write();
|
||||
|
||||
// Write pointMesh/boundaryProcAddressing
|
||||
IOobject ioAddr
|
||||
(
|
||||
"boundaryProcAddressing",
|
||||
procMesh.facesInstance(),
|
||||
polyMesh::meshSubDir/pointMesh::meshSubDir,
|
||||
procPointMesh.thisDb(),
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE,
|
||||
IOobject::NO_REGISTER
|
||||
);
|
||||
IOListRef<label>(ioAddr, boundaryProcAddressing).write();
|
||||
}
|
||||
|
||||
// Write points if pointsInstance differing from facesInstance
|
||||
if (facesInstancePointsPtr_)
|
||||
{
|
||||
|
||||
@ -427,24 +427,18 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
Info<< "Reconstructing point fields" << nl << endl;
|
||||
|
||||
const pointMesh& pMesh = pointMesh::New(mesh);
|
||||
PtrList<pointMesh> pMeshes(procMeshes.meshes().size());
|
||||
|
||||
forAll(pMeshes, proci)
|
||||
{
|
||||
pMeshes.set
|
||||
(
|
||||
proci,
|
||||
new pointMesh(procMeshes.meshes()[proci])
|
||||
);
|
||||
}
|
||||
const pointMesh& pMesh = pointMesh::New
|
||||
(
|
||||
mesh,
|
||||
IOobject::READ_IF_PRESENT
|
||||
);
|
||||
|
||||
pointFieldReconstructor reconstructor
|
||||
(
|
||||
pMesh,
|
||||
pMeshes,
|
||||
procMeshes.pointMeshes(),
|
||||
procMeshes.pointProcAddressing(),
|
||||
procMeshes.boundaryProcAddressing()
|
||||
procMeshes.pointMeshBoundaryProcAddressing()
|
||||
);
|
||||
|
||||
reconstructor.reconstructAllFields(objects, selectedFields);
|
||||
|
||||
Reference in New Issue
Block a user