Load balancing support, fvMesh

This commit is contained in:
Hrvoje Jasak 2018-04-24 11:05:21 +01:00
parent 685151b9be
commit 942ecf88c1
6 changed files with 109 additions and 20 deletions

View file

@ -27,17 +27,14 @@ License
#include "fvBoundaryMesh.H" #include "fvBoundaryMesh.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
void fvBoundaryMesh::addFvPatches() void Foam::fvBoundaryMesh::addFvPatches()
{ {
const polyBoundaryMesh& bMesh = mesh_.boundaryMesh(); const polyBoundaryMesh& bMesh = mesh_.boundaryMesh();
// Clear existing patches and resize the list
clear();
setSize(bMesh.size()); setSize(bMesh.size());
// Set boundary patches, using the patches added to the polyMesh // Set boundary patches, using the patches added to the polyMesh
@ -51,9 +48,42 @@ void fvBoundaryMesh::addFvPatches()
} }
void Foam::fvBoundaryMesh::resetFvPatches(const boolList& resetFvPatchFlag)
{
const polyBoundaryMesh& bMesh = mesh_.boundaryMesh();
if (resetFvPatchFlag.size() != bMesh.size())
{
FatalErrorIn("void resetFvPatches(const boolList& resetFvPatchFlag)")
<< "Incorrect size of reset list. Boundary size: "
<< bMesh.size() << " reset size: " << resetFvPatchFlag.size()
<< abort(FatalError);
}
// Reset list size. This will delete pointers to patches
// if the list is truncated
setSize(bMesh.size());
// Set boundary patches, using the patches added to the polyMesh
// Bug fix. HJ, 1/Mar/2018
fvPatchList& Patches = *this;
// In order to preserve patch links on resize of boundary,
// only reset the empty slots
forAll (Patches, patchI)
{
if (resetFvPatchFlag[patchI])
{
// Set new patch. This also deletes old pointer
Patches.set(patchI, fvPatch::New(bMesh[patchI], *this));
}
}
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
fvBoundaryMesh::fvBoundaryMesh Foam::fvBoundaryMesh::fvBoundaryMesh
( (
const fvMesh& m const fvMesh& m
) )
@ -67,7 +97,7 @@ fvBoundaryMesh::fvBoundaryMesh
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
void fvBoundaryMesh::movePoints() void Foam::fvBoundaryMesh::movePoints()
{ {
forAll(*this, patchi) forAll(*this, patchi)
{ {
@ -81,7 +111,7 @@ void fvBoundaryMesh::movePoints()
} }
lduInterfacePtrsList fvBoundaryMesh::interfaces() const Foam::lduInterfacePtrsList Foam::fvBoundaryMesh::interfaces() const
{ {
lduInterfacePtrsList interfaces(size()); lduInterfacePtrsList interfaces(size());
@ -101,15 +131,11 @@ lduInterfacePtrsList fvBoundaryMesh::interfaces() const
} }
void fvBoundaryMesh::readUpdate() void Foam::fvBoundaryMesh::readUpdate()
{ {
clear(); clear();
addFvPatches(); addFvPatches();
} }
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// ************************************************************************* // // ************************************************************************* //

View file

@ -73,6 +73,11 @@ private:
//- Add fvPatches corresponding to the polyBoundaryMesh //- Add fvPatches corresponding to the polyBoundaryMesh
void addFvPatches(); void addFvPatches();
//- Reset fvPatches corresponding to the polyBoundaryMesh
// When the mesh is resized, the existing patches may be preserved
// or reset depending on the resetFlag
void resetFvPatches(const boolList& resetFvPatchFlag);
protected: protected:

View file

@ -392,13 +392,49 @@ void Foam::fvMesh::removeFvBoundary()
// Remove fvBoundaryMesh data first. // Remove fvBoundaryMesh data first.
boundary_.clear(); boundary_.clear();
boundary_.setSize(0);
polyMesh::removeBoundary(); polyMesh::removeBoundary();
clearOut(); clearOut();
} }
void Foam::fvMesh::resetFvPrimitives
(
const Xfer<pointField>& points,
const Xfer<faceList>& faces,
const Xfer<labelList>& owner,
const Xfer<labelList>& neighbour,
const labelList& patchSizes,
const labelList& patchStarts,
const boolList& resetFvPatchFlag,
const bool validBoundary
)
{
// Reset polyMesh primitives
polyMesh::resetPrimitives
(
points,
faces,
owner,
neighbour,
patchSizes,
patchStarts,
validBoundary
);
boundary_.resetFvPatches(resetFvPatchFlag);
surfaceInterpolation::clearOut();
clearGeomNotOldVol();
// Reset fvPatches? HJ, 16/Apr/2018
// Clear LDU
clearAddressing();
// Clear cell volumes?
}
Foam::polyMesh::readUpdateState Foam::fvMesh::readUpdate() Foam::polyMesh::readUpdateState Foam::fvMesh::readUpdate()
{ {
if (debug) if (debug)

View file

@ -360,6 +360,25 @@ public:
// these fvPatches. // these fvPatches.
void removeFvBoundary(); void removeFvBoundary();
//- Reset mesh primitive data. Assumes all patch info correct
// (so does e.g. parallel communication). If not, use
// validBoundary = false
// (still assumes patchStarts[0] = nInternalFaces and last
// patch ends at nActiveFaces) and change patches with addPatches.
// resetFvPatchFlag indicates which fvPatches will be rebuilt
// if the flag is set to false, original patch is preserved
void resetFvPrimitives
(
const Xfer<pointField>& points,
const Xfer<faceList>& faces,
const Xfer<labelList>& owner,
const Xfer<labelList>& neighbour,
const labelList& patchSizes,
const labelList& patchStarts,
const boolList& resetFvPatchFlag,
const bool validBoundary = true
);
//- Return cell face motion fluxes //- Return cell face motion fluxes
surfaceScalarField& setPhi(); surfaceScalarField& setPhi();

View file

@ -155,7 +155,8 @@ void fvMesh::makeC() const
*this, *this,
dimLength, dimLength,
cellCentres(), cellCentres(),
faceCentres() faceCentres(),
false // Do not preserve couples in geometry fields
); );
// This piece of code is necessary for cyclic and cyclicGgi interfaces // This piece of code is necessary for cyclic and cyclicGgi interfaces
@ -231,7 +232,8 @@ void fvMesh::makeCf() const
), ),
*this, *this,
dimLength, dimLength,
faceCentres() faceCentres(),
false // Do not preserve couples in geometry fields
); );
// Boundary update. Used in complex geometries, eg. immersed boundary // Boundary update. Used in complex geometries, eg. immersed boundary

View file

@ -146,7 +146,8 @@ tmp<vectorField> fvPatch::Cn() const
// Get reference to global cell centres // Get reference to global cell centres
// Bugfix: access cell centres from fvMesh data, not polyMesh. // Bugfix: access cell centres from fvMesh data, not polyMesh.
// HJ, 30/Nov/2017 // HJ, 30/Nov/2017
const vectorField& gcc = boundaryMesh().mesh().C().internalField(); // const vectorField& gcc = boundaryMesh().mesh().C().internalField();
const vectorField& gcc = boundaryMesh().mesh().cellCentres();
forAll (faceCells, faceI) forAll (faceCells, faceI)
{ {