Add jumpFaceFluxCorrectionPtr_ to fvMatrix for cases of jump discontinuities in grad(psi).
This commit is contained in:
parent
2cf62e7950
commit
64068d50c5
2 changed files with 182 additions and 5 deletions
|
@ -257,7 +257,8 @@ Foam::fvMatrix<Type>::fvMatrix
|
||||||
internalCoeffs_(psi.mesh().boundary().size()),
|
internalCoeffs_(psi.mesh().boundary().size()),
|
||||||
boundaryCoeffs_(psi.mesh().boundary().size()),
|
boundaryCoeffs_(psi.mesh().boundary().size()),
|
||||||
assemblyCompleted_(false),
|
assemblyCompleted_(false),
|
||||||
faceFluxCorrectionPtr_(NULL)
|
faceFluxCorrectionPtr_(NULL),
|
||||||
|
jumpFaceFluxCorrectionPtr_(NULL)
|
||||||
{
|
{
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
|
@ -315,7 +316,8 @@ Foam::fvMatrix<Type>::fvMatrix(const fvMatrix<Type>& fvm)
|
||||||
internalCoeffs_(fvm.internalCoeffs_),
|
internalCoeffs_(fvm.internalCoeffs_),
|
||||||
boundaryCoeffs_(fvm.boundaryCoeffs_),
|
boundaryCoeffs_(fvm.boundaryCoeffs_),
|
||||||
assemblyCompleted_(fvm.assemblyCompleted_),
|
assemblyCompleted_(fvm.assemblyCompleted_),
|
||||||
faceFluxCorrectionPtr_(NULL)
|
faceFluxCorrectionPtr_(NULL),
|
||||||
|
jumpFaceFluxCorrectionPtr_(NULL)
|
||||||
{
|
{
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
|
@ -332,6 +334,15 @@ Foam::fvMatrix<Type>::fvMatrix(const fvMatrix<Type>& fvm)
|
||||||
*(fvm.faceFluxCorrectionPtr_)
|
*(fvm.faceFluxCorrectionPtr_)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (fvm.jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
jumpFaceFluxCorrectionPtr_ = new
|
||||||
|
GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
|
(
|
||||||
|
*(fvm.jumpFaceFluxCorrectionPtr_)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -363,7 +374,8 @@ Foam::fvMatrix<Type>::fvMatrix(const tmp<fvMatrix<Type> >& tfvm)
|
||||||
tfvm.isTmp()
|
tfvm.isTmp()
|
||||||
),
|
),
|
||||||
assemblyCompleted_(tfvm().assemblyCompleted()),
|
assemblyCompleted_(tfvm().assemblyCompleted()),
|
||||||
faceFluxCorrectionPtr_(NULL)
|
faceFluxCorrectionPtr_(NULL),
|
||||||
|
jumpFaceFluxCorrectionPtr_(NULL)
|
||||||
{
|
{
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
|
@ -389,6 +401,23 @@ Foam::fvMatrix<Type>::fvMatrix(const tmp<fvMatrix<Type> >& tfvm)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tfvm().jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
if (tfvm.isTmp())
|
||||||
|
{
|
||||||
|
jumpFaceFluxCorrectionPtr_ = tfvm().jumpFaceFluxCorrectionPtr_;
|
||||||
|
tfvm().jumpFaceFluxCorrectionPtr_ = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
jumpFaceFluxCorrectionPtr_ = new
|
||||||
|
GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
|
(
|
||||||
|
*(tfvm().jumpFaceFluxCorrectionPtr_)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
tfvm.clear();
|
tfvm.clear();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -408,7 +437,8 @@ Foam::fvMatrix<Type>::fvMatrix
|
||||||
internalCoeffs_(psi.mesh().boundary().size()),
|
internalCoeffs_(psi.mesh().boundary().size()),
|
||||||
boundaryCoeffs_(psi.mesh().boundary().size()),
|
boundaryCoeffs_(psi.mesh().boundary().size()),
|
||||||
assemblyCompleted_(false),
|
assemblyCompleted_(false),
|
||||||
faceFluxCorrectionPtr_(NULL)
|
faceFluxCorrectionPtr_(NULL),
|
||||||
|
jumpFaceFluxCorrectionPtr_(NULL)
|
||||||
{
|
{
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
|
@ -459,6 +489,11 @@ Foam::fvMatrix<Type>::~fvMatrix()
|
||||||
{
|
{
|
||||||
delete faceFluxCorrectionPtr_;
|
delete faceFluxCorrectionPtr_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
delete jumpFaceFluxCorrectionPtr_;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1099,6 +1134,75 @@ flux() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp<Foam::GeometricField<Type, Foam::fvsPatchField, Foam::surfaceMesh> >
|
||||||
|
Foam::fvMatrix<Type>::
|
||||||
|
jumpFlux() const
|
||||||
|
{
|
||||||
|
if (!psi_.mesh().schemesDict().fluxRequired(psi_.name()))
|
||||||
|
{
|
||||||
|
FatalErrorIn("fvMatrix<Type>::jumpFlux()")
|
||||||
|
<< "jumpFlux requested but " << psi_.name()
|
||||||
|
<< " not specified in the fluxRequired sub-dictionary"
|
||||||
|
" of fvSchemes."
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
// construct GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
|
tmp<GeometricField<Type, fvsPatchField, surfaceMesh> > tfieldFlux
|
||||||
|
(
|
||||||
|
new GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"flux("+psi_.name()+')',
|
||||||
|
psi_.instance(),
|
||||||
|
psi_.mesh(),
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
psi_.mesh(),
|
||||||
|
dimensions()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
GeometricField<Type, fvsPatchField, surfaceMesh>& fieldFlux = tfieldFlux();
|
||||||
|
|
||||||
|
for (direction cmpt=0; cmpt<pTraits<Type>::nComponents; cmpt++)
|
||||||
|
{
|
||||||
|
fieldFlux.internalField().replace
|
||||||
|
(
|
||||||
|
cmpt,
|
||||||
|
lduMatrix::faceH(psi_.internalField().component(cmpt))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This needs to go into virtual functions for all coupled patches
|
||||||
|
// in order to simplify handling of overset meshes
|
||||||
|
// HJ, 29/May/2013
|
||||||
|
forAll (psi_.boundaryField(), patchI)
|
||||||
|
{
|
||||||
|
psi_.boundaryField()[patchI].patchFlux
|
||||||
|
(
|
||||||
|
fieldFlux,
|
||||||
|
*this
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
// If grad(psi) is not continuous, jumpFlux() differs from flux()
|
||||||
|
fieldFlux += *jumpFaceFluxCorrectionPtr_;
|
||||||
|
}
|
||||||
|
else if (faceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
// If grad(psi) is continuous, jumpFlux() equals flux()
|
||||||
|
fieldFlux += *faceFluxCorrectionPtr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
return tfieldFlux;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
|
@ -1133,6 +1237,17 @@ void Foam::fvMatrix<Type>::operator=(const fvMatrix<Type>& fvmv)
|
||||||
new GeometricField<Type, fvsPatchField, surfaceMesh>
|
new GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
(*fvmv.faceFluxCorrectionPtr_);
|
(*fvmv.faceFluxCorrectionPtr_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (jumpFaceFluxCorrectionPtr_ && fvmv.jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
*jumpFaceFluxCorrectionPtr_ = *fvmv.jumpFaceFluxCorrectionPtr_;
|
||||||
|
}
|
||||||
|
else if (fvmv.jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
jumpFaceFluxCorrectionPtr_ =
|
||||||
|
new GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
|
(*fvmv.jumpFaceFluxCorrectionPtr_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1156,6 +1271,11 @@ void Foam::fvMatrix<Type>::negate()
|
||||||
{
|
{
|
||||||
faceFluxCorrectionPtr_->negate();
|
faceFluxCorrectionPtr_->negate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
jumpFaceFluxCorrectionPtr_->negate();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1182,6 +1302,19 @@ void Foam::fvMatrix<Type>::operator+=(const fvMatrix<Type>& fvmv)
|
||||||
*fvmv.faceFluxCorrectionPtr_
|
*fvmv.faceFluxCorrectionPtr_
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (jumpFaceFluxCorrectionPtr_ && fvmv.jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
*jumpFaceFluxCorrectionPtr_ += *fvmv.jumpFaceFluxCorrectionPtr_;
|
||||||
|
}
|
||||||
|
else if (fvmv.jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
jumpFaceFluxCorrectionPtr_ = new
|
||||||
|
GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
|
(
|
||||||
|
*fvmv.jumpFaceFluxCorrectionPtr_
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1214,6 +1347,17 @@ void Foam::fvMatrix<Type>::operator-=(const fvMatrix<Type>& fvmv)
|
||||||
new GeometricField<Type, fvsPatchField, surfaceMesh>
|
new GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
(-*fvmv.faceFluxCorrectionPtr_);
|
(-*fvmv.faceFluxCorrectionPtr_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (jumpFaceFluxCorrectionPtr_ && fvmv.jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
*jumpFaceFluxCorrectionPtr_ -= *fvmv.jumpFaceFluxCorrectionPtr_;
|
||||||
|
}
|
||||||
|
else if (fvmv.jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
jumpFaceFluxCorrectionPtr_ =
|
||||||
|
new GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
|
(-*fvmv.jumpFaceFluxCorrectionPtr_);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1357,6 +1501,16 @@ void Foam::fvMatrix<Type>::operator*=
|
||||||
) << "cannot scale a matrix containing a faceFluxCorrection"
|
) << "cannot scale a matrix containing a faceFluxCorrection"
|
||||||
<< abort(FatalError);
|
<< abort(FatalError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"fvMatrix<Type>::operator*="
|
||||||
|
"(const DimensionedField<scalar, volMesh>&)"
|
||||||
|
) << "cannot scale a matrix containing a jumpFaceFluxCorrection"
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1396,7 +1550,12 @@ void Foam::fvMatrix<Type>::operator*=
|
||||||
|
|
||||||
if (faceFluxCorrectionPtr_)
|
if (faceFluxCorrectionPtr_)
|
||||||
{
|
{
|
||||||
*faceFluxCorrectionPtr_ *= ds.value();
|
*faceFluxCorrectionPtr_ *= ds;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jumpFaceFluxCorrectionPtr_)
|
||||||
|
{
|
||||||
|
*jumpFaceFluxCorrectionPtr_ *= ds;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1572,6 +1731,7 @@ Foam::tmp<Foam::fvMatrix<Type> > Foam::correction
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
tAcorr().faceFluxCorrectionPtr() = (-A.flux()).ptr();
|
tAcorr().faceFluxCorrectionPtr() = (-A.flux()).ptr();
|
||||||
|
tAcorr().jumpFaceFluxCorrectionPtr() = (-A.jumpFlux()).ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
return tAcorr;
|
return tAcorr;
|
||||||
|
@ -1596,6 +1756,7 @@ Foam::tmp<Foam::fvMatrix<Type> > Foam::correction
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
tAcorr().faceFluxCorrectionPtr() = (-A.flux()).ptr();
|
tAcorr().faceFluxCorrectionPtr() = (-A.flux()).ptr();
|
||||||
|
tAcorr().jumpFaceFluxCorrectionPtr() = (-A.jumpFlux()).ptr();
|
||||||
}
|
}
|
||||||
|
|
||||||
return tAcorr;
|
return tAcorr;
|
||||||
|
|
|
@ -138,6 +138,11 @@ class fvMatrix
|
||||||
mutable GeometricField<Type, fvsPatchField, surfaceMesh>
|
mutable GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
*faceFluxCorrectionPtr_;
|
*faceFluxCorrectionPtr_;
|
||||||
|
|
||||||
|
//- Jump face flux field for non-orthogonal correction
|
||||||
|
// in case of a psi with jump discontinuity in grad(psi)
|
||||||
|
mutable GeometricField<Type, fvsPatchField, surfaceMesh>
|
||||||
|
*jumpFaceFluxCorrectionPtr_;
|
||||||
|
|
||||||
|
|
||||||
// Private member functions
|
// Private member functions
|
||||||
|
|
||||||
|
@ -291,6 +296,13 @@ public:
|
||||||
return faceFluxCorrectionPtr_;
|
return faceFluxCorrectionPtr_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//- Return pointer to the jump face-flux non-orthogonal correction
|
||||||
|
// field in case of a psi with jump discontinuity in grad(psi)
|
||||||
|
surfaceTypeFieldPtr& jumpFaceFluxCorrectionPtr()
|
||||||
|
{
|
||||||
|
return jumpFaceFluxCorrectionPtr_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Matrix completion functionality
|
// Matrix completion functionality
|
||||||
|
|
||||||
|
@ -399,6 +411,10 @@ public:
|
||||||
tmp<GeometricField<Type, fvsPatchField, surfaceMesh> >
|
tmp<GeometricField<Type, fvsPatchField, surfaceMesh> >
|
||||||
flux() const;
|
flux() const;
|
||||||
|
|
||||||
|
//- Return the jump face-flux field from the matrix
|
||||||
|
tmp<GeometricField<Type, fvsPatchField, surfaceMesh> >
|
||||||
|
jumpFlux() const;
|
||||||
|
|
||||||
|
|
||||||
// Member operators
|
// Member operators
|
||||||
|
|
||||||
|
|
Reference in a new issue