mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
BUG: avoid excessive recalculation of map for moving meshes
This commit is contained in:
@ -724,6 +724,8 @@ void Foam::mappedPatchBase::findSamples
|
||||
|
||||
void Foam::mappedPatchBase::calcMapping() const
|
||||
{
|
||||
DebugInFunction;
|
||||
|
||||
static bool hasWarned = false;
|
||||
if (mapPtr_)
|
||||
{
|
||||
@ -1051,6 +1053,9 @@ void Foam::mappedPatchBase::calcMapping() const
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updateMeshTime().setUpToDate();
|
||||
updateSampleMeshTime().setUpToDate();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -96,6 +96,7 @@ SourceFiles
|
||||
#include "pointIndexHit.H"
|
||||
#include "AMIPatchToPatchInterpolation.H"
|
||||
#include "coupleGroupIdentifier.H"
|
||||
#include "uniformDimensionedFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -288,6 +289,16 @@ protected:
|
||||
dictionary surfDict_;
|
||||
|
||||
|
||||
// Mesh update IOobjects
|
||||
|
||||
//- Local mesh update time
|
||||
mutable autoPtr<uniformDimensionedScalarField> updateMeshTimePtr_;
|
||||
|
||||
//- Sample mesh update time
|
||||
mutable autoPtr<uniformDimensionedScalarField>
|
||||
updateSampleMeshTimePtr_;
|
||||
|
||||
|
||||
// Protected Member Functions
|
||||
|
||||
//- Add a world-world connection
|
||||
@ -515,6 +526,14 @@ public:
|
||||
//- Cached sampleRegion != mesh.name()
|
||||
inline bool sameRegion() const noexcept;
|
||||
|
||||
//- Local mesh update time
|
||||
inline uniformDimensionedScalarField& updateSampleMeshTime() const;
|
||||
|
||||
//- Sample mesh upate time
|
||||
inline uniformDimensionedScalarField& updateMeshTime() const;
|
||||
|
||||
inline bool upToDate() const;
|
||||
|
||||
//- Return reference to the parallel distribution map
|
||||
inline const mapDistribute& map() const;
|
||||
|
||||
|
||||
@ -196,16 +196,78 @@ inline bool Foam::mappedPatchBase::sameRegion() const noexcept
|
||||
}
|
||||
|
||||
|
||||
inline const Foam::mapDistribute& Foam::mappedPatchBase::map() const
|
||||
inline Foam::uniformDimensionedScalarField&
|
||||
Foam::mappedPatchBase::updateSampleMeshTime() const
|
||||
{
|
||||
if (!updateSampleMeshTimePtr_)
|
||||
{
|
||||
const auto& mesh = sampleMesh();
|
||||
|
||||
updateSampleMeshTimePtr_ =
|
||||
autoPtr<uniformDimensionedScalarField>::New
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"updateSampleMeshTime",
|
||||
mesh.pointsInstance(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE,
|
||||
false
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return updateSampleMeshTimePtr_();
|
||||
}
|
||||
|
||||
|
||||
inline Foam::uniformDimensionedScalarField&
|
||||
Foam::mappedPatchBase::updateMeshTime() const
|
||||
{
|
||||
if (!updateMeshTimePtr_)
|
||||
{
|
||||
const auto& mesh = patch_.boundaryMesh().mesh();
|
||||
|
||||
updateMeshTimePtr_ =
|
||||
autoPtr<uniformDimensionedScalarField>::New
|
||||
(
|
||||
IOobject
|
||||
(
|
||||
"updateMeshTime",
|
||||
mesh.pointsInstance(),
|
||||
mesh,
|
||||
IOobject::NO_READ,
|
||||
IOobject::NO_WRITE,
|
||||
false
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
return updateMeshTimePtr_();
|
||||
}
|
||||
|
||||
|
||||
inline bool Foam::mappedPatchBase::upToDate() const
|
||||
{
|
||||
const polyMesh& thisMesh = patch_.boundaryMesh().mesh();
|
||||
bool topoChange =
|
||||
(sameWorld() && sampleMesh().topoChanging())
|
||||
|| thisMesh.topoChanging();
|
||||
|
||||
if (topoChange)
|
||||
return
|
||||
(sameWorld() && sampleMesh().upToDatePoints(updateSampleMeshTime()))
|
||||
&& thisMesh.upToDatePoints(updateMeshTime());
|
||||
}
|
||||
|
||||
|
||||
inline const Foam::mapDistribute& Foam::mappedPatchBase::map() const
|
||||
{
|
||||
if (!upToDate())
|
||||
{
|
||||
mapPtr_.reset(nullptr);
|
||||
|
||||
if (AMIPtr_)
|
||||
{
|
||||
AMIPtr_->upToDate() = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mapPtr_)
|
||||
@ -222,12 +284,13 @@ inline const Foam::AMIPatchToPatchInterpolation& Foam::mappedPatchBase::AMI
|
||||
bool forceUpdate
|
||||
) const
|
||||
{
|
||||
const polyMesh& thisMesh = patch_.boundaryMesh().mesh();
|
||||
bool topoChange =
|
||||
(sameWorld() && sampleMesh().topoChanging())
|
||||
|| thisMesh.topoChanging();
|
||||
if (!upToDate())
|
||||
{
|
||||
mapPtr_.reset(nullptr);
|
||||
AMIPtr_->upToDate() = false;
|
||||
}
|
||||
|
||||
if (topoChange || forceUpdate)
|
||||
if (forceUpdate)
|
||||
{
|
||||
AMIPtr_->upToDate() = false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user