fvMeshStitchers::moving: Correct meshPhi with a wave
This is more efficient than the previous algorithm, and it also fixes some bugs with regards to operation on 2D and wedge cases
This commit is contained in:
@ -24,8 +24,11 @@ License
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "fvMeshStitchersMoving.H"
|
#include "fvMeshStitchersMoving.H"
|
||||||
|
#include "FvFaceCellWave.H"
|
||||||
#include "fvMeshSubset.H"
|
#include "fvMeshSubset.H"
|
||||||
#include "fvmLaplacian.H"
|
#include "fvmLaplacian.H"
|
||||||
|
#include "meshPhiCorrectInfo.H"
|
||||||
|
#include "meshPhiPreCorrectInfo.H"
|
||||||
#include "movingWallVelocityFvPatchVectorField.H"
|
#include "movingWallVelocityFvPatchVectorField.H"
|
||||||
#include "movingWallSlipVelocityFvPatchVectorField.H"
|
#include "movingWallSlipVelocityFvPatchVectorField.H"
|
||||||
#include "regionSplit.H"
|
#include "regionSplit.H"
|
||||||
@ -537,18 +540,34 @@ void Foam::fvMeshStitchers::moving::internalFaceCorrectMeshPhi
|
|||||||
// across the couplings, as the mismatch will be fixed later when area and
|
// across the couplings, as the mismatch will be fixed later when area and
|
||||||
// mesh flux is added to the error faces. So, here, we correct the
|
// mesh flux is added to the error faces. So, here, we correct the
|
||||||
// correction (!) by propagating the error from the cells furthest from the
|
// correction (!) by propagating the error from the cells furthest from the
|
||||||
// interface back to the interface. This process is wave-like, but the
|
// interface back to the interface. This is done using waves.
|
||||||
// sub-mesh is thin, so it should only require 1 or 2 iterations.
|
|
||||||
|
|
||||||
// Initialise layers and weights
|
// Dynamic memory for wave initialisation
|
||||||
List<layerAndWeight> subFaceLayerAndWeight(subMesh.nFaces(), {-1, NaN});
|
DynamicList<labelPair> subChangedPatchAndFaces;
|
||||||
List<layerAndWeight> subCellLayerAndWeight(subMesh.nCells(), {-1, Zero});
|
DynamicList<meshPhiPreCorrectInfo> subChangedFacePci;
|
||||||
|
DynamicList<meshPhiCorrectInfo> subChangedFaceCi;
|
||||||
|
|
||||||
|
// Allocate data for the pre-correction wave
|
||||||
|
List<meshPhiPreCorrectInfo> subInternalFacePci(subMesh.nInternalFaces());
|
||||||
|
List<List<meshPhiPreCorrectInfo>> subPatchFacePci
|
||||||
|
(
|
||||||
|
FvFaceCellWave<meshPhiPreCorrectInfo>::template
|
||||||
|
sizesListList<List<List<meshPhiPreCorrectInfo>>>
|
||||||
|
(
|
||||||
|
FvFaceCellWave<meshPhiPreCorrectInfo>::template
|
||||||
|
listListSizes(subMesh.boundary()),
|
||||||
|
meshPhiPreCorrectInfo()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
List<meshPhiPreCorrectInfo> subCellPci(subMesh.nCells());
|
||||||
|
|
||||||
|
// Initialisation for the pre-correction wave
|
||||||
|
subChangedPatchAndFaces.clear();
|
||||||
|
subChangedFacePci.clear();
|
||||||
forAll(subMesh.boundary(), subPatchi)
|
forAll(subMesh.boundary(), subPatchi)
|
||||||
{
|
{
|
||||||
const fvPatch& subFvp = subMesh.boundary()[subPatchi];
|
const fvPatch& subFvp = subMesh.boundary()[subPatchi];
|
||||||
|
|
||||||
if (subFvp.coupled()) continue;
|
|
||||||
|
|
||||||
forAll(subFvp, subPatchFacei)
|
forAll(subFvp, subPatchFacei)
|
||||||
{
|
{
|
||||||
const label subFacei = subFvp.start() + subPatchFacei;
|
const label subFacei = subFvp.start() + subPatchFacei;
|
||||||
@ -557,171 +576,127 @@ void Foam::fvMeshStitchers::moving::internalFaceCorrectMeshPhi
|
|||||||
|
|
||||||
if (bFacei >= 0 && bFaceIsOwnerOrig[bFacei])
|
if (bFacei >= 0 && bFaceIsOwnerOrig[bFacei])
|
||||||
{
|
{
|
||||||
subFaceLayerAndWeight[subFacei] = {0, bFaceNccMagSf[bFacei]};
|
subChangedPatchAndFaces.append({subPatchi, subPatchFacei});
|
||||||
|
subChangedFacePci.append
|
||||||
|
(
|
||||||
|
meshPhiPreCorrectInfo(0, bFaceNccMagSf[bFacei])
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create layers and weights by waving from owner-orig faces
|
// Pre-correction wave
|
||||||
while (gMin(subFaceLayerAndWeight).layer < 0)
|
FvFaceCellWave<meshPhiPreCorrectInfo> preWave
|
||||||
|
(
|
||||||
|
subMesh,
|
||||||
|
subInternalFacePci,
|
||||||
|
subPatchFacePci,
|
||||||
|
subCellPci
|
||||||
|
);
|
||||||
|
preWave.setFaceInfo(subChangedPatchAndFaces, subChangedFacePci);
|
||||||
|
const label nWaveLayers =
|
||||||
|
preWave.iterate(subMesh.globalData().nTotalCells() + 1);
|
||||||
|
|
||||||
|
// Allocate data for the correction wave
|
||||||
|
List<meshPhiCorrectInfo> subInternalFaceCi(subMesh.nInternalFaces());
|
||||||
|
List<List<meshPhiCorrectInfo>> subPatchFaceCi
|
||||||
|
(
|
||||||
|
FvFaceCellWave<meshPhiCorrectInfo>::template
|
||||||
|
sizesListList<List<List<meshPhiCorrectInfo>>>
|
||||||
|
(
|
||||||
|
FvFaceCellWave<meshPhiCorrectInfo>::template
|
||||||
|
listListSizes(subMesh.boundary()),
|
||||||
|
meshPhiCorrectInfo()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
List<meshPhiCorrectInfo> subCellCi(subMesh.nCells());
|
||||||
|
|
||||||
|
// Calculate the current error in the rate of change of volume
|
||||||
|
const volScalarField::Internal dVdtError
|
||||||
|
(
|
||||||
|
(subV - subV0)/subMesh.time().deltaT()
|
||||||
|
- fvc::surfaceIntegrate(subPhi + subDeltaPhi)()*subV
|
||||||
|
);
|
||||||
|
|
||||||
|
// Construct track data for the correction wave
|
||||||
|
meshPhiCorrectInfo::trackData td
|
||||||
|
(
|
||||||
|
subInternalFacePci,
|
||||||
|
subPatchFacePci,
|
||||||
|
subCellPci,
|
||||||
|
dVdtError
|
||||||
|
);
|
||||||
|
|
||||||
|
// Wave backwards through the layers to generate the corrections. Note that
|
||||||
|
// this has to be done in stages, so that later layers complete in their
|
||||||
|
// entirety before the earlier layers begin. Otherwise they interfere.
|
||||||
|
for (label waveLayeri = nWaveLayers - 1; waveLayeri >= 0; waveLayeri --)
|
||||||
{
|
{
|
||||||
// Face to cell
|
// The layer indices on the faces that we want to wave from
|
||||||
List<layerAndWeight> subCellLayerAndWeight0(subCellLayerAndWeight);
|
const label faceLayeri = (waveLayeri + 1)*2;
|
||||||
forAll(subMesh.faces(), subFacei)
|
|
||||||
|
// Initialisation for the correction wave
|
||||||
|
subChangedPatchAndFaces.clear();
|
||||||
|
subChangedFaceCi.clear();
|
||||||
|
forAll(subInternalFacePci, subFacei)
|
||||||
{
|
{
|
||||||
if (subFaceLayerAndWeight[subFacei].layer != -1)
|
if (subInternalFacePci[subFacei].layer() == faceLayeri)
|
||||||
{
|
{
|
||||||
const label subOwnCelli = subMesh.faceOwner()[subFacei];
|
subChangedPatchAndFaces.append({-1, subFacei});
|
||||||
if (subCellLayerAndWeight0[subOwnCelli].layer == -1)
|
subChangedFaceCi.append
|
||||||
{
|
(
|
||||||
subCellLayerAndWeight[subOwnCelli].layer =
|
subInternalFaceCi[subFacei].valid(td)
|
||||||
subFaceLayerAndWeight[subFacei].layer + 1;
|
? subInternalFaceCi[subFacei]
|
||||||
subCellLayerAndWeight[subOwnCelli].weight +=
|
: meshPhiCorrectInfo(meshPhiCorrectInfo::shape::face)
|
||||||
subFaceLayerAndWeight[subFacei].weight;
|
);
|
||||||
}
|
|
||||||
|
|
||||||
if (!subMesh.isInternalFace(subFacei)) continue;
|
|
||||||
|
|
||||||
const label subNbrCelli = subMesh.faceNeighbour()[subFacei];
|
|
||||||
if (subCellLayerAndWeight0[subNbrCelli].layer == -1)
|
|
||||||
{
|
|
||||||
subCellLayerAndWeight[subNbrCelli].layer =
|
|
||||||
subFaceLayerAndWeight[subFacei].layer + 1;
|
|
||||||
subCellLayerAndWeight[subNbrCelli].weight +=
|
|
||||||
subFaceLayerAndWeight[subFacei].weight;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
forAll(subPatchFacePci, subPatchi)
|
||||||
// Cell to face
|
|
||||||
List<layerAndWeight> subFaceLayerAndWeight0(subFaceLayerAndWeight);
|
|
||||||
forAll(subMesh.cells(), subCelli)
|
|
||||||
{
|
{
|
||||||
if (subCellLayerAndWeight[subCelli].layer != -1)
|
forAll(subPatchFacePci[subPatchi], subPatchFacei)
|
||||||
{
|
{
|
||||||
forAll(subMesh.cells()[subCelli], subCellFacei)
|
|
||||||
{
|
|
||||||
const label subFacei =
|
|
||||||
subMesh.cells()[subCelli][subCellFacei];
|
|
||||||
if (subFaceLayerAndWeight0[subFacei].layer == -1)
|
|
||||||
{
|
|
||||||
subFaceLayerAndWeight[subFacei].layer =
|
|
||||||
subCellLayerAndWeight[subCelli].layer + 1;
|
|
||||||
subFaceLayerAndWeight[subFacei].weight =
|
|
||||||
subCellLayerAndWeight[subCelli].weight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Synchronise
|
|
||||||
SubList<layerAndWeight> subBFaceLayerAndWeight
|
|
||||||
(
|
|
||||||
subFaceLayerAndWeight,
|
|
||||||
subMesh.nFaces() - subMesh.nInternalFaces(),
|
|
||||||
subMesh.nInternalFaces()
|
|
||||||
);
|
|
||||||
syncTools::syncBoundaryFaceList
|
|
||||||
(
|
|
||||||
subMesh,
|
|
||||||
subBFaceLayerAndWeight,
|
|
||||||
maxEqOp<layerAndWeight>(),
|
|
||||||
[](const coupledPolyPatch&, List<layerAndWeight>&){}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Function to extract a value from a surface field given a face index
|
|
||||||
auto subFaceValue = [&subMesh]
|
|
||||||
(
|
|
||||||
surfaceScalarField& sf,
|
|
||||||
const label subFacei
|
|
||||||
) -> scalar&
|
|
||||||
{
|
|
||||||
const label subBFacei =
|
|
||||||
subMesh.isInternalFace(subFacei)
|
|
||||||
? -1 : subFacei - subMesh.nInternalFaces();
|
|
||||||
const label subPatchi =
|
|
||||||
subMesh.isInternalFace(subFacei)
|
|
||||||
? -1 : subMesh.boundaryMesh().patchID()[subBFacei];
|
|
||||||
const label subPatchFacei =
|
|
||||||
subMesh.isInternalFace(subFacei)
|
|
||||||
? -1 : subFacei - subMesh.boundaryMesh()[subPatchi].start();
|
|
||||||
|
|
||||||
return
|
|
||||||
subMesh.isInternalFace(subFacei)
|
|
||||||
? sf[subFacei]
|
|
||||||
: sf.boundaryFieldRef()[subPatchi][subPatchFacei];
|
|
||||||
};
|
|
||||||
|
|
||||||
// Correct volume conservation error by waving back to the owner-orig faces
|
|
||||||
for
|
|
||||||
(
|
|
||||||
label cellLayeri = gMax(subCellLayerAndWeight).layer;
|
|
||||||
cellLayeri > 0;
|
|
||||||
cellLayeri -= 2
|
|
||||||
)
|
|
||||||
{
|
|
||||||
const surfaceScalarField subDeltaPhi0(subDeltaPhi);
|
|
||||||
|
|
||||||
forAll(subMesh.cells(), subCelli)
|
|
||||||
{
|
|
||||||
if (subCellLayerAndWeight[subCelli].layer != cellLayeri) continue;
|
|
||||||
|
|
||||||
// Compute the error for this cell
|
|
||||||
scalar deltaV = subV[subCelli] - subV0[subCelli];
|
|
||||||
forAll(subV.mesh().cells()[subCelli], subCellFacei)
|
|
||||||
{
|
|
||||||
const label subFacei =
|
|
||||||
subV.mesh().cells()[subCelli][subCellFacei];
|
|
||||||
const bool o = subV.mesh().faceOwner()[subFacei] == subCelli;
|
|
||||||
|
|
||||||
deltaV -=
|
|
||||||
(
|
|
||||||
subFaceValue(subPhi, subFacei)
|
|
||||||
+ subFaceValue(subDeltaPhi, subFacei)
|
|
||||||
)
|
|
||||||
*(o ? +1 : -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Push the error onto the lower-layered faces
|
|
||||||
forAll(subMesh.cells()[subCelli], subCellFacei)
|
|
||||||
{
|
|
||||||
const label subFacei =
|
|
||||||
subMesh.cells()[subCelli][subCellFacei];
|
|
||||||
const bool o = subMesh.faceOwner()[subFacei] == subCelli;
|
|
||||||
const scalar w =
|
|
||||||
subFaceLayerAndWeight[subFacei].weight
|
|
||||||
/subCellLayerAndWeight[subCelli].weight;
|
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
subCellLayerAndWeight[subCelli].layer
|
subPatchFacePci[subPatchi][subPatchFacei].layer()
|
||||||
> subFaceLayerAndWeight[subFacei].layer
|
== faceLayeri
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
subFaceValue(subDeltaPhi, subFacei) +=
|
subChangedPatchAndFaces.append({subPatchi, subPatchFacei});
|
||||||
deltaV*w*(o ? +1 : -1);
|
subChangedFaceCi.append
|
||||||
|
(
|
||||||
|
subPatchFaceCi[subPatchi][subPatchFacei].valid(td)
|
||||||
|
? subPatchFaceCi[subPatchi][subPatchFacei]
|
||||||
|
: meshPhiCorrectInfo(meshPhiCorrectInfo::shape::face)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Synchronise
|
// Correction wave
|
||||||
const surfaceScalarField::Boundary dSubDeltaPhiNbrBf
|
FvFaceCellWave<meshPhiCorrectInfo, meshPhiCorrectInfo::trackData> wave
|
||||||
(
|
(
|
||||||
surfaceScalarField::Internal::null(),
|
subMesh,
|
||||||
(subDeltaPhi - subDeltaPhi0)()
|
subInternalFaceCi,
|
||||||
.boundaryField()
|
subPatchFaceCi,
|
||||||
.boundaryNeighbourField()
|
subCellCi,
|
||||||
|
td
|
||||||
);
|
);
|
||||||
forAll(subMesh.boundary(), subPatchi)
|
wave.setFaceInfo(subChangedPatchAndFaces, subChangedFaceCi);
|
||||||
{
|
wave.iterate(1);
|
||||||
const fvPatch& subFvp = subMesh.boundary()[subPatchi];
|
}
|
||||||
|
|
||||||
if (subFvp.coupled())
|
// Apply corrections
|
||||||
{
|
forAll(subInternalFaceCi, subFacei)
|
||||||
subDeltaPhi.boundaryFieldRef()[subPatchi] -=
|
{
|
||||||
dSubDeltaPhiNbrBf[subPatchi];
|
subDeltaPhi.primitiveFieldRef()[subFacei] +=
|
||||||
}
|
subInternalFaceCi[subFacei].deltaPhi();
|
||||||
|
}
|
||||||
|
forAll(subPatchFacePci, subPatchi)
|
||||||
|
{
|
||||||
|
forAll(subPatchFacePci[subPatchi], subPatchFacei)
|
||||||
|
{
|
||||||
|
subDeltaPhi.boundaryFieldRef()[subPatchi][subPatchFacei] +=
|
||||||
|
subPatchFaceCi[subPatchi][subPatchFacei].deltaPhi();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
243
src/fvMeshStitchers/moving/meshPhiCorrectInfo.H
Normal file
243
src/fvMeshStitchers/moving/meshPhiCorrectInfo.H
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration | Website: https://openfoam.org
|
||||||
|
\\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::meshPhiCorrectInfo
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
meshPhiCorrectInfoI.H
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef meshPhiCorrectInfo_H
|
||||||
|
#define meshPhiCorrectInfo_H
|
||||||
|
|
||||||
|
#include "meshPhiPreCorrectInfo.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// Forward declaration of classes
|
||||||
|
class fvPatch;
|
||||||
|
class fvMesh;
|
||||||
|
class transformer;
|
||||||
|
|
||||||
|
// Forward declaration of friend functions and operators
|
||||||
|
class meshPhiCorrectInfo;
|
||||||
|
Ostream& operator<<(Ostream&, const meshPhiCorrectInfo&);
|
||||||
|
Istream& operator>>(Istream&, meshPhiCorrectInfo&);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class meshPhiCorrectInfo Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class meshPhiCorrectInfo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Public Classes
|
||||||
|
|
||||||
|
//- Enumeration to define the mesh shape the info applies to
|
||||||
|
enum class shape
|
||||||
|
{
|
||||||
|
invalid,
|
||||||
|
face,
|
||||||
|
cell
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//- Tracking data. Mostly just a collection of references to the
|
||||||
|
// pre-correct info.
|
||||||
|
class trackData
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
const List<meshPhiPreCorrectInfo>& internalFacePci_;
|
||||||
|
const List<List<meshPhiPreCorrectInfo>>& patchFacePci_;
|
||||||
|
const List<meshPhiPreCorrectInfo>& cellPci_;
|
||||||
|
const DimensionedField<scalar, volMesh>& dVdtError_;
|
||||||
|
|
||||||
|
trackData
|
||||||
|
(
|
||||||
|
const List<meshPhiPreCorrectInfo>& internalFacePci,
|
||||||
|
const List<List<meshPhiPreCorrectInfo>>& patchFacePci,
|
||||||
|
const List<meshPhiPreCorrectInfo>& cellPci,
|
||||||
|
const DimensionedField<scalar, volMesh>& dVdtError
|
||||||
|
)
|
||||||
|
:
|
||||||
|
internalFacePci_(internalFacePci),
|
||||||
|
patchFacePci_(patchFacePci),
|
||||||
|
cellPci_(cellPci),
|
||||||
|
dVdtError_(dVdtError)
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
// Private Data
|
||||||
|
|
||||||
|
//- The primitive shape that this info applies to
|
||||||
|
shape shape_;
|
||||||
|
|
||||||
|
//- Flux correction (if on a face) or volume conservation correction
|
||||||
|
// (if in a cell)
|
||||||
|
scalar delta_;
|
||||||
|
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Throw an error if this is not a face
|
||||||
|
void validateFace() const;
|
||||||
|
|
||||||
|
//- Throw an error if this is not a cell
|
||||||
|
void validateCell() const;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
inline meshPhiCorrectInfo();
|
||||||
|
|
||||||
|
//- Construct for given shape
|
||||||
|
inline meshPhiCorrectInfo(const shape& s);
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
// Access
|
||||||
|
|
||||||
|
//- Return the flux correction
|
||||||
|
inline scalar deltaPhi() const;
|
||||||
|
|
||||||
|
//- Access the flux correction
|
||||||
|
inline scalar& deltaPhi();
|
||||||
|
|
||||||
|
//- Return the volume change rate error correction
|
||||||
|
inline scalar deltaDVdtError() const;
|
||||||
|
|
||||||
|
//- Access the volume change rate error correction
|
||||||
|
inline scalar& deltaDVdtError();
|
||||||
|
|
||||||
|
|
||||||
|
// Needed by FaceCellWave
|
||||||
|
|
||||||
|
//- Check whether the meshPhiCorrectInfo has been changed at all
|
||||||
|
// or still contains original (invalid) value.
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool valid(TrackingData& td) const;
|
||||||
|
|
||||||
|
//- Check for identical geometrical data. Used for checking
|
||||||
|
// consistency across cyclics.
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool sameGeometry
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const meshPhiCorrectInfo&,
|
||||||
|
const scalar,
|
||||||
|
TrackingData& td
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Transform across an interface
|
||||||
|
template<class TrackingData>
|
||||||
|
inline void transform
|
||||||
|
(
|
||||||
|
const fvPatch& patch,
|
||||||
|
const label patchFacei,
|
||||||
|
const transformer& transform,
|
||||||
|
TrackingData& td
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Influence of neighbouring face
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool updateCell
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const label thisCelli,
|
||||||
|
const labelPair& neighbourPatchAndFacei,
|
||||||
|
const meshPhiCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Influence of neighbouring cell
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool updateFace
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const labelPair& thisPatchAndFacei,
|
||||||
|
const label neighbourCelli,
|
||||||
|
const meshPhiCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Influence of different value on same face
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool updateFace
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const labelPair& thisPatchAndFacei,
|
||||||
|
const meshPhiCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Test equality
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool equal
|
||||||
|
(
|
||||||
|
const meshPhiCorrectInfo&,
|
||||||
|
TrackingData& td
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Operators
|
||||||
|
|
||||||
|
inline bool operator==(const meshPhiCorrectInfo&) const;
|
||||||
|
inline bool operator!=(const meshPhiCorrectInfo&) const;
|
||||||
|
|
||||||
|
|
||||||
|
// IOstream Operators
|
||||||
|
|
||||||
|
friend Ostream& operator<<(Ostream&, const meshPhiCorrectInfo&);
|
||||||
|
friend Istream& operator>>(Istream&, meshPhiCorrectInfo&);
|
||||||
|
};
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#include "meshPhiCorrectInfoI.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
292
src/fvMeshStitchers/moving/meshPhiCorrectInfoI.H
Normal file
292
src/fvMeshStitchers/moving/meshPhiCorrectInfoI.H
Normal file
@ -0,0 +1,292 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration | Website: https://openfoam.org
|
||||||
|
\\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "meshPhiCorrectInfo.H"
|
||||||
|
#include "fvMesh.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline void Foam::meshPhiCorrectInfo::validateFace() const
|
||||||
|
{
|
||||||
|
if (shape_ != shape::face)
|
||||||
|
{
|
||||||
|
FatalError
|
||||||
|
<< "Face data requested from a non-face correction info"
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::meshPhiCorrectInfo::validateCell() const
|
||||||
|
{
|
||||||
|
if (shape_ != shape::cell)
|
||||||
|
{
|
||||||
|
FatalError
|
||||||
|
<< "Cell data requested from a non-cell correction info"
|
||||||
|
<< exit(FatalError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline Foam::meshPhiCorrectInfo::meshPhiCorrectInfo()
|
||||||
|
:
|
||||||
|
shape_(shape::invalid),
|
||||||
|
delta_(NaN)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::meshPhiCorrectInfo::meshPhiCorrectInfo(const shape& s)
|
||||||
|
:
|
||||||
|
shape_(s),
|
||||||
|
delta_(s == shape::invalid ? NaN : 0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline Foam::scalar Foam::meshPhiCorrectInfo::deltaPhi() const
|
||||||
|
{
|
||||||
|
validateFace();
|
||||||
|
return delta_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::scalar& Foam::meshPhiCorrectInfo::deltaPhi()
|
||||||
|
{
|
||||||
|
validateFace();
|
||||||
|
return delta_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::scalar Foam::meshPhiCorrectInfo::deltaDVdtError() const
|
||||||
|
{
|
||||||
|
validateCell();
|
||||||
|
return delta_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::scalar& Foam::meshPhiCorrectInfo::deltaDVdtError()
|
||||||
|
{
|
||||||
|
validateCell();
|
||||||
|
return delta_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiCorrectInfo::valid(TrackingData& td) const
|
||||||
|
{
|
||||||
|
return shape_ != shape::invalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiCorrectInfo::sameGeometry
|
||||||
|
(
|
||||||
|
const fvMesh&,
|
||||||
|
const meshPhiCorrectInfo& l,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline void Foam::meshPhiCorrectInfo::transform
|
||||||
|
(
|
||||||
|
const fvPatch& patch,
|
||||||
|
const label patchFacei,
|
||||||
|
const transformer& transform,
|
||||||
|
TrackingData& td
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiCorrectInfo::updateCell
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const label thisCelli,
|
||||||
|
const labelPair& neighbourPatchAndFacei,
|
||||||
|
const meshPhiCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const label neighbourPatchi = neighbourPatchAndFacei.first();
|
||||||
|
const label neighbourFacei = neighbourPatchAndFacei.second();
|
||||||
|
|
||||||
|
const meshPhiPreCorrectInfo& thisPci =
|
||||||
|
td.cellPci_[thisCelli];
|
||||||
|
const meshPhiPreCorrectInfo& neighbourPci =
|
||||||
|
neighbourPatchi == -1
|
||||||
|
? td.internalFacePci_[neighbourFacei]
|
||||||
|
: td.patchFacePci_[neighbourPatchi][neighbourFacei];
|
||||||
|
|
||||||
|
if (!valid(td))
|
||||||
|
{
|
||||||
|
shape_ = shape::cell;
|
||||||
|
deltaDVdtError() = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thisPci.layer() < neighbourPci.layer())
|
||||||
|
{
|
||||||
|
const label s =
|
||||||
|
neighbourPatchi == -1
|
||||||
|
? (mesh.owner()[neighbourFacei] == thisCelli ? +1 : -1)
|
||||||
|
: +1;
|
||||||
|
|
||||||
|
deltaDVdtError() -= s*neighbourInfo.deltaPhi();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiCorrectInfo::updateFace
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const labelPair& thisPatchAndFacei,
|
||||||
|
const label neighbourCelli,
|
||||||
|
const meshPhiCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const label thisPatchi = thisPatchAndFacei.first();
|
||||||
|
const label thisFacei = thisPatchAndFacei.second();
|
||||||
|
|
||||||
|
const meshPhiPreCorrectInfo& thisPci =
|
||||||
|
thisPatchi == -1
|
||||||
|
? td.internalFacePci_[thisFacei]
|
||||||
|
: td.patchFacePci_[thisPatchi][thisFacei];
|
||||||
|
const meshPhiPreCorrectInfo& neighbourPci =
|
||||||
|
td.cellPci_[neighbourCelli];
|
||||||
|
|
||||||
|
if (!valid(td))
|
||||||
|
{
|
||||||
|
shape_ = shape::face;
|
||||||
|
deltaPhi() = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (thisPci.layer() < neighbourPci.layer())
|
||||||
|
{
|
||||||
|
const label s =
|
||||||
|
thisPatchi == -1
|
||||||
|
? (mesh.owner()[thisFacei] == neighbourCelli ? +1 : -1)
|
||||||
|
: +1;
|
||||||
|
|
||||||
|
deltaPhi() =
|
||||||
|
s*thisPci.weight()/neighbourPci.weight()
|
||||||
|
*(td.dVdtError_[neighbourCelli] + neighbourInfo.deltaDVdtError());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiCorrectInfo::updateFace
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const labelPair& thisPatchAndFacei,
|
||||||
|
const meshPhiCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (!valid(td))
|
||||||
|
{
|
||||||
|
shape_ = shape::face;
|
||||||
|
deltaPhi() = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
deltaPhi() = - neighbourInfo.deltaPhi();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiCorrectInfo::equal
|
||||||
|
(
|
||||||
|
const meshPhiCorrectInfo& rhs,
|
||||||
|
TrackingData& td
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return operator==(rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline bool Foam::meshPhiCorrectInfo::operator==
|
||||||
|
(
|
||||||
|
const Foam::meshPhiCorrectInfo& rhs
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return shape_ == rhs.shape_ && delta_ == rhs.delta_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::meshPhiCorrectInfo::operator!=
|
||||||
|
(
|
||||||
|
const Foam::meshPhiCorrectInfo& rhs
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return !(*this == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::Ostream& Foam::operator<<(Ostream& os, const meshPhiCorrectInfo& l)
|
||||||
|
{
|
||||||
|
return os << static_cast<label>(l.shape_) << token::SPACE << l.delta_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::Istream& Foam::operator>>(Istream& is, meshPhiCorrectInfo& l)
|
||||||
|
{
|
||||||
|
label s;
|
||||||
|
is >> s >> l.delta_;
|
||||||
|
l.shape_ = static_cast<meshPhiCorrectInfo::shape>(s);
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
191
src/fvMeshStitchers/moving/meshPhiPreCorrectInfo.H
Normal file
191
src/fvMeshStitchers/moving/meshPhiPreCorrectInfo.H
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration | Website: https://openfoam.org
|
||||||
|
\\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::meshPhiPreCorrectInfo
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
meshPhiPreCorrectInfoI.H
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef meshPhiPreCorrectInfo_H
|
||||||
|
#define meshPhiPreCorrectInfo_H
|
||||||
|
|
||||||
|
#include "labelPair.H"
|
||||||
|
#include "pointField.H"
|
||||||
|
#include "face.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// Forward declaration of classes
|
||||||
|
class fvPatch;
|
||||||
|
class fvMesh;
|
||||||
|
class transformer;
|
||||||
|
|
||||||
|
// Forward declaration of friend functions and operators
|
||||||
|
class meshPhiPreCorrectInfo;
|
||||||
|
Ostream& operator<<(Ostream&, const meshPhiPreCorrectInfo&);
|
||||||
|
Istream& operator>>(Istream&, meshPhiPreCorrectInfo&);
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class meshPhiPreCorrectInfo Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class meshPhiPreCorrectInfo
|
||||||
|
{
|
||||||
|
// Private Data
|
||||||
|
|
||||||
|
//- Layer index
|
||||||
|
label layer_;
|
||||||
|
|
||||||
|
//- Weight
|
||||||
|
scalar weight_;
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null
|
||||||
|
inline meshPhiPreCorrectInfo();
|
||||||
|
|
||||||
|
//- Construct given the layer index and weight
|
||||||
|
inline meshPhiPreCorrectInfo
|
||||||
|
(
|
||||||
|
const label layer,
|
||||||
|
const scalar weight
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
// Access
|
||||||
|
|
||||||
|
//- Return the layer index
|
||||||
|
inline label layer() const;
|
||||||
|
|
||||||
|
//- Return the weight
|
||||||
|
inline scalar weight() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Needed by FaceCellWave
|
||||||
|
|
||||||
|
//- Check whether the meshPhiPreCorrectInfo has been changed at all
|
||||||
|
// or still contains original (invalid) value.
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool valid(TrackingData& td) const;
|
||||||
|
|
||||||
|
//- Check for identical geometrical data. Used for checking
|
||||||
|
// consistency across cyclics.
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool sameGeometry
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const meshPhiPreCorrectInfo&,
|
||||||
|
const scalar,
|
||||||
|
TrackingData& td
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Transform across an interface
|
||||||
|
template<class TrackingData>
|
||||||
|
inline void transform
|
||||||
|
(
|
||||||
|
const fvPatch& patch,
|
||||||
|
const label patchFacei,
|
||||||
|
const transformer& transform,
|
||||||
|
TrackingData& td
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Influence of neighbouring face
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool updateCell
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const label thisCelli,
|
||||||
|
const labelPair& neighbourPatchAndFacei,
|
||||||
|
const meshPhiPreCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Influence of neighbouring cell
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool updateFace
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const labelPair& thisPatchAndFacei,
|
||||||
|
const label neighbourCelli,
|
||||||
|
const meshPhiPreCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Influence of different value on same face
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool updateFace
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const labelPair& thisPatchAndFacei,
|
||||||
|
const meshPhiPreCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
);
|
||||||
|
|
||||||
|
//- Test equality
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool equal
|
||||||
|
(
|
||||||
|
const meshPhiPreCorrectInfo&,
|
||||||
|
TrackingData& td
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Operators
|
||||||
|
|
||||||
|
inline bool operator==(const meshPhiPreCorrectInfo&) const;
|
||||||
|
inline bool operator!=(const meshPhiPreCorrectInfo&) const;
|
||||||
|
|
||||||
|
|
||||||
|
// IOstream Operators
|
||||||
|
|
||||||
|
friend Ostream& operator<<(Ostream&, const meshPhiPreCorrectInfo&);
|
||||||
|
friend Istream& operator>>(Istream&, meshPhiPreCorrectInfo&);
|
||||||
|
};
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#include "meshPhiPreCorrectInfoI.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
218
src/fvMeshStitchers/moving/meshPhiPreCorrectInfoI.H
Normal file
218
src/fvMeshStitchers/moving/meshPhiPreCorrectInfoI.H
Normal file
@ -0,0 +1,218 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration | Website: https://openfoam.org
|
||||||
|
\\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "meshPhiPreCorrectInfo.H"
|
||||||
|
#include "fvMesh.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline Foam::meshPhiPreCorrectInfo::meshPhiPreCorrectInfo()
|
||||||
|
:
|
||||||
|
layer_(-labelMax),
|
||||||
|
weight_(NaN)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::meshPhiPreCorrectInfo::meshPhiPreCorrectInfo
|
||||||
|
(
|
||||||
|
const label layer,
|
||||||
|
const scalar weight
|
||||||
|
)
|
||||||
|
:
|
||||||
|
layer_(layer),
|
||||||
|
weight_(weight)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline Foam::label Foam::meshPhiPreCorrectInfo::layer() const
|
||||||
|
{
|
||||||
|
return layer_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::scalar Foam::meshPhiPreCorrectInfo::weight() const
|
||||||
|
{
|
||||||
|
return weight_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiPreCorrectInfo::valid(TrackingData& td) const
|
||||||
|
{
|
||||||
|
return layer_ != -labelMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiPreCorrectInfo::sameGeometry
|
||||||
|
(
|
||||||
|
const fvMesh&,
|
||||||
|
const meshPhiPreCorrectInfo& l,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return layer_ == l.layer_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline void Foam::meshPhiPreCorrectInfo::transform
|
||||||
|
(
|
||||||
|
const fvPatch& patch,
|
||||||
|
const label patchFacei,
|
||||||
|
const transformer& transform,
|
||||||
|
TrackingData& td
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiPreCorrectInfo::updateCell
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const label thisCelli,
|
||||||
|
const labelPair& neighbourPatchAndFacei,
|
||||||
|
const meshPhiPreCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (!valid(td))
|
||||||
|
{
|
||||||
|
layer_ = neighbourInfo.layer_ + 1;
|
||||||
|
weight_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (layer_ > neighbourInfo.layer_)
|
||||||
|
{
|
||||||
|
weight_ += neighbourInfo.weight_;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiPreCorrectInfo::updateFace
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const labelPair& thisPatchAndFacei,
|
||||||
|
const label neighbourCelli,
|
||||||
|
const meshPhiPreCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (!valid(td))
|
||||||
|
{
|
||||||
|
layer_ = neighbourInfo.layer_ + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (layer_ > neighbourInfo.layer_)
|
||||||
|
{
|
||||||
|
weight_ = neighbourInfo.weight_;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiPreCorrectInfo::updateFace
|
||||||
|
(
|
||||||
|
const fvMesh& mesh,
|
||||||
|
const labelPair& thisPatchAndFacei,
|
||||||
|
const meshPhiPreCorrectInfo& neighbourInfo,
|
||||||
|
const scalar tol,
|
||||||
|
TrackingData& td
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (layer_ < neighbourInfo.layer_)
|
||||||
|
{
|
||||||
|
layer_ = neighbourInfo.layer_;
|
||||||
|
weight_ = neighbourInfo.weight_;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class TrackingData>
|
||||||
|
inline bool Foam::meshPhiPreCorrectInfo::equal
|
||||||
|
(
|
||||||
|
const meshPhiPreCorrectInfo& rhs,
|
||||||
|
TrackingData& td
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return operator==(rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline bool Foam::meshPhiPreCorrectInfo::operator==
|
||||||
|
(
|
||||||
|
const Foam::meshPhiPreCorrectInfo& rhs
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return layer_ == rhs.layer_ && weight_ == rhs.weight_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::meshPhiPreCorrectInfo::operator!=
|
||||||
|
(
|
||||||
|
const Foam::meshPhiPreCorrectInfo& rhs
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return !(*this == rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::Ostream& Foam::operator<<(Ostream& os, const meshPhiPreCorrectInfo& l)
|
||||||
|
{
|
||||||
|
return os << l.layer_ << token::SPACE << l.weight_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::Istream& Foam::operator>>(Istream& is, meshPhiPreCorrectInfo& l)
|
||||||
|
{
|
||||||
|
return is >> l.layer_ >> l.weight_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
Reference in New Issue
Block a user