mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
Feature grad update
This commit is contained in:
committed by
Andrew Heather
parent
f186b0098b
commit
e100e4d084
@ -1,4 +1,4 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
@ -36,23 +36,18 @@ License
|
|||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class Type, class Stencil>
|
template<class Type, class Stencil>
|
||||||
Foam::tmp
|
void Foam::fv::LeastSquaresGrad<Type, Stencil>::calcGrad
|
||||||
<
|
|
||||||
Foam::GeometricField
|
|
||||||
<
|
|
||||||
typename Foam::outerProduct<Foam::vector, Type>::type,
|
|
||||||
Foam::fvPatchField,
|
|
||||||
Foam::volMesh
|
|
||||||
>
|
|
||||||
>
|
|
||||||
Foam::fv::LeastSquaresGrad<Type, Stencil>::calcGrad
|
|
||||||
(
|
(
|
||||||
const GeometricField<Type, fvPatchField, volMesh>& vtf,
|
GeometricField
|
||||||
const word& name
|
<
|
||||||
|
typename outerProduct<vector, Type>::type,
|
||||||
|
fvPatchField,
|
||||||
|
volMesh
|
||||||
|
>& lsGrad,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& vtf
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
typedef typename outerProduct<vector, Type>::type GradType;
|
typedef typename outerProduct<vector, Type>::type GradType;
|
||||||
typedef GeometricField<GradType, fvPatchField, volMesh> GradFieldType;
|
|
||||||
|
|
||||||
const fvMesh& mesh = vtf.mesh();
|
const fvMesh& mesh = vtf.mesh();
|
||||||
|
|
||||||
@ -62,24 +57,7 @@ Foam::fv::LeastSquaresGrad<Type, Stencil>::calcGrad
|
|||||||
mesh
|
mesh
|
||||||
);
|
);
|
||||||
|
|
||||||
tmp<GradFieldType> tlsGrad
|
lsGrad = dimensioned<GradType>(vtf.dimensions()/dimLength, Zero);
|
||||||
(
|
|
||||||
new GradFieldType
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
name,
|
|
||||||
vtf.instance(),
|
|
||||||
mesh,
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
mesh,
|
|
||||||
dimensioned<GradType>(vtf.dimensions()/dimLength, Zero),
|
|
||||||
fvPatchFieldBase::extrapolatedCalculatedType()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
GradFieldType& lsGrad = tlsGrad.ref();
|
|
||||||
Field<GradType>& lsGradIf = lsGrad;
|
Field<GradType>& lsGradIf = lsGrad;
|
||||||
|
|
||||||
const extendedCentredCellToCellStencil& stencil = lsv.stencil();
|
const extendedCentredCellToCellStencil& stencil = lsv.stencil();
|
||||||
@ -131,6 +109,50 @@ Foam::fv::LeastSquaresGrad<Type, Stencil>::calcGrad
|
|||||||
// Correct the boundary conditions
|
// Correct the boundary conditions
|
||||||
lsGrad.correctBoundaryConditions();
|
lsGrad.correctBoundaryConditions();
|
||||||
gaussGrad<Type>::correctBoundaryConditions(vtf, lsGrad);
|
gaussGrad<Type>::correctBoundaryConditions(vtf, lsGrad);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type, class Stencil>
|
||||||
|
Foam::tmp
|
||||||
|
<
|
||||||
|
Foam::GeometricField
|
||||||
|
<
|
||||||
|
typename Foam::outerProduct<Foam::vector, Type>::type,
|
||||||
|
Foam::fvPatchField,
|
||||||
|
Foam::volMesh
|
||||||
|
>
|
||||||
|
>
|
||||||
|
Foam::fv::LeastSquaresGrad<Type, Stencil>::calcGrad
|
||||||
|
(
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& vtf,
|
||||||
|
const word& name
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
typedef typename outerProduct<vector, Type>::type GradType;
|
||||||
|
typedef GeometricField<GradType, fvPatchField, volMesh> GradFieldType;
|
||||||
|
|
||||||
|
const fvMesh& mesh = vtf.mesh();
|
||||||
|
|
||||||
|
tmp<GradFieldType> tlsGrad
|
||||||
|
(
|
||||||
|
new GradFieldType
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
name,
|
||||||
|
vtf.instance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh,
|
||||||
|
vtf.dimensions()/dimLength,
|
||||||
|
fvPatchFieldBase::extrapolatedCalculatedType()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
GradFieldType& lsGrad = tlsGrad.ref();
|
||||||
|
|
||||||
|
calcGrad(lsGrad, vtf);
|
||||||
|
|
||||||
return tlsGrad;
|
return tlsGrad;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -132,6 +132,14 @@ public:
|
|||||||
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
||||||
const word& name
|
const word& name
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
//- Calculate the grad of the given field into supplied field
|
||||||
|
virtual void calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<typename outerProduct<vector, Type>::type, fvPatchField, volMesh>& res,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>&
|
||||||
|
) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -38,19 +38,21 @@ License
|
|||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::tmp
|
void Foam::fv::fourthGrad<Type>::calcGrad
|
||||||
<
|
|
||||||
Foam::GeometricField
|
|
||||||
<
|
|
||||||
typename Foam::outerProduct<Foam::vector, Type>::type,
|
|
||||||
Foam::fvPatchField,
|
|
||||||
Foam::volMesh
|
|
||||||
>
|
|
||||||
>
|
|
||||||
Foam::fv::fourthGrad<Type>::calcGrad
|
|
||||||
(
|
(
|
||||||
|
GeometricField
|
||||||
|
<
|
||||||
|
typename outerProduct<vector, Type>::type,
|
||||||
|
fvPatchField,
|
||||||
|
volMesh
|
||||||
|
>& fGrad,
|
||||||
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
||||||
const word& name
|
const GeometricField
|
||||||
|
<
|
||||||
|
typename outerProduct<vector, Type>::type,
|
||||||
|
fvPatchField,
|
||||||
|
volMesh
|
||||||
|
>& secondfGrad
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
// The fourth-order gradient is calculated in two passes. First,
|
// The fourth-order gradient is calculated in two passes. First,
|
||||||
@ -59,37 +61,11 @@ Foam::fv::fourthGrad<Type>::calcGrad
|
|||||||
// gradient to complete the accuracy.
|
// gradient to complete the accuracy.
|
||||||
|
|
||||||
typedef typename outerProduct<vector, Type>::type GradType;
|
typedef typename outerProduct<vector, Type>::type GradType;
|
||||||
typedef GeometricField<GradType, fvPatchField, volMesh> GradFieldType;
|
|
||||||
|
|
||||||
const fvMesh& mesh = vsf.mesh();
|
const fvMesh& mesh = vsf.mesh();
|
||||||
|
|
||||||
// Assemble the second-order least-square gradient
|
// Initialise to gradient
|
||||||
// Calculate the second-order least-square gradient
|
fGrad = secondfGrad;
|
||||||
tmp<GradFieldType> tsecondfGrad
|
|
||||||
= leastSquaresGrad<Type>(mesh).grad
|
|
||||||
(
|
|
||||||
vsf,
|
|
||||||
"leastSquaresGrad(" + vsf.name() + ")"
|
|
||||||
);
|
|
||||||
const GradFieldType& secondfGrad =
|
|
||||||
tsecondfGrad();
|
|
||||||
|
|
||||||
tmp<GradFieldType> tfGrad
|
|
||||||
(
|
|
||||||
new GradFieldType
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
name,
|
|
||||||
vsf.instance(),
|
|
||||||
mesh,
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
),
|
|
||||||
secondfGrad
|
|
||||||
)
|
|
||||||
);
|
|
||||||
GradFieldType& fGrad = tfGrad.ref();
|
|
||||||
|
|
||||||
const vectorField& C = mesh.C();
|
const vectorField& C = mesh.C();
|
||||||
|
|
||||||
@ -158,9 +134,102 @@ Foam::fv::fourthGrad<Type>::calcGrad
|
|||||||
|
|
||||||
fGrad.correctBoundaryConditions();
|
fGrad.correctBoundaryConditions();
|
||||||
gaussGrad<Type>::correctBoundaryConditions(vsf, fGrad);
|
gaussGrad<Type>::correctBoundaryConditions(vsf, fGrad);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::tmp
|
||||||
|
<
|
||||||
|
Foam::GeometricField
|
||||||
|
<
|
||||||
|
typename Foam::outerProduct<Foam::vector, Type>::type,
|
||||||
|
Foam::fvPatchField,
|
||||||
|
Foam::volMesh
|
||||||
|
>
|
||||||
|
>
|
||||||
|
Foam::fv::fourthGrad<Type>::calcGrad
|
||||||
|
(
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
||||||
|
const word& name
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// The fourth-order gradient is calculated in two passes. First,
|
||||||
|
// the standard least-square gradient is assembled. Then, the
|
||||||
|
// fourth-order correction is added to the second-order accurate
|
||||||
|
// gradient to complete the accuracy.
|
||||||
|
|
||||||
|
typedef typename outerProduct<vector, Type>::type GradType;
|
||||||
|
typedef GeometricField<GradType, fvPatchField, volMesh> GradFieldType;
|
||||||
|
|
||||||
|
const fvMesh& mesh = vsf.mesh();
|
||||||
|
|
||||||
|
// Assemble the second-order least-square gradient
|
||||||
|
// Calculate the second-order least-square gradient
|
||||||
|
tmp<GradFieldType> tsecondfGrad
|
||||||
|
= leastSquaresGrad<Type>(mesh).grad
|
||||||
|
(
|
||||||
|
vsf,
|
||||||
|
"leastSquaresGrad(" + vsf.name() + ")"
|
||||||
|
);
|
||||||
|
const GradFieldType& secondfGrad = tsecondfGrad();
|
||||||
|
|
||||||
|
tmp<GradFieldType> tfGrad
|
||||||
|
(
|
||||||
|
new GradFieldType
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
name,
|
||||||
|
vsf.instance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh,
|
||||||
|
vsf.dimensions()/dimLength,
|
||||||
|
fvPatchFieldBase::extrapolatedCalculatedType()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
calcGrad(tfGrad.ref(), vsf, secondfGrad);
|
||||||
|
|
||||||
return tfGrad;
|
return tfGrad;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Foam::fv::fourthGrad<Type>::calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<
|
||||||
|
typename outerProduct<vector, Type>::type,
|
||||||
|
fvPatchField,
|
||||||
|
volMesh
|
||||||
|
>& fGrad,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& vsf
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
// The fourth-order gradient is calculated in two passes. First,
|
||||||
|
// the standard least-square gradient is assembled. Then, the
|
||||||
|
// fourth-order correction is added to the second-order accurate
|
||||||
|
// gradient to complete the accuracy.
|
||||||
|
|
||||||
|
typedef typename outerProduct<vector, Type>::type GradType;
|
||||||
|
typedef GeometricField<GradType, fvPatchField, volMesh> GradFieldType;
|
||||||
|
|
||||||
|
const fvMesh& mesh = vsf.mesh();
|
||||||
|
|
||||||
|
// Assemble the second-order least-square gradient
|
||||||
|
// Calculate the second-order least-square gradient
|
||||||
|
tmp<GradFieldType> tsecondfGrad
|
||||||
|
= leastSquaresGrad<Type>(mesh).grad
|
||||||
|
(
|
||||||
|
vsf,
|
||||||
|
"leastSquaresGrad(" + vsf.name() + ")"
|
||||||
|
);
|
||||||
|
|
||||||
|
calcGrad(fGrad, vsf, tsecondfGrad());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -99,6 +99,32 @@ public:
|
|||||||
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
||||||
const word& name
|
const word& name
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
//- Calculate the grad of the given field into supplied field
|
||||||
|
virtual void calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<typename outerProduct<vector, Type>::type, fvPatchField, volMesh>& res,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>&
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Helper : calculate the grad of the given field into supplied field
|
||||||
|
void calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<
|
||||||
|
typename outerProduct<vector, Type>::type,
|
||||||
|
fvPatchField,
|
||||||
|
volMesh
|
||||||
|
>& fGrad,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
||||||
|
const GeometricField
|
||||||
|
<
|
||||||
|
typename outerProduct<vector, Type>::type,
|
||||||
|
fvPatchField,
|
||||||
|
volMesh
|
||||||
|
>& secondfGrad
|
||||||
|
) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -140,6 +140,67 @@ Foam::fv::gaussGrad<Type>::calcGrad
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Foam::fv::gaussGrad<Type>::calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<
|
||||||
|
typename outerProduct<vector, Type>::type,
|
||||||
|
fvPatchField,
|
||||||
|
volMesh
|
||||||
|
>& gGrad,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& vsf
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
typedef typename outerProduct<vector, Type>::type GradType;
|
||||||
|
|
||||||
|
DebugPout<< "gaussGrad<Type>::calcGrad on " << vsf.name()
|
||||||
|
<< " into " << gGrad.name() << endl;
|
||||||
|
|
||||||
|
const fvMesh& mesh = vsf.mesh();
|
||||||
|
const labelUList& owner = mesh.owner();
|
||||||
|
const labelUList& neighbour = mesh.neighbour();
|
||||||
|
const vectorField& Sf = mesh.Sf();
|
||||||
|
|
||||||
|
const auto tssf(tinterpScheme_().interpolate(vsf));
|
||||||
|
const auto& ssf = tssf();
|
||||||
|
|
||||||
|
gGrad = dimensioned<GradType>(vsf.dimensions()/dimLength, Zero);
|
||||||
|
|
||||||
|
Field<GradType>& igGrad = gGrad;
|
||||||
|
const Field<Type>& issf = ssf;
|
||||||
|
|
||||||
|
forAll(owner, facei)
|
||||||
|
{
|
||||||
|
const GradType Sfssf = Sf[facei]*issf[facei];
|
||||||
|
|
||||||
|
igGrad[owner[facei]] += Sfssf;
|
||||||
|
igGrad[neighbour[facei]] -= Sfssf;
|
||||||
|
}
|
||||||
|
|
||||||
|
forAll(mesh.boundary(), patchi)
|
||||||
|
{
|
||||||
|
const labelUList& pFaceCells =
|
||||||
|
mesh.boundary()[patchi].faceCells();
|
||||||
|
|
||||||
|
const vectorField& pSf = mesh.Sf().boundaryField()[patchi];
|
||||||
|
|
||||||
|
const fvsPatchField<Type>& pssf = ssf.boundaryField()[patchi];
|
||||||
|
|
||||||
|
forAll(mesh.boundary()[patchi], facei)
|
||||||
|
{
|
||||||
|
igGrad[pFaceCells[facei]] += pSf[facei]*pssf[facei];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
igGrad /= mesh.V();
|
||||||
|
|
||||||
|
gGrad.correctBoundaryConditions();
|
||||||
|
|
||||||
|
correctBoundaryConditions(vsf, gGrad);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
void Foam::fv::gaussGrad<Type>::correctBoundaryConditions
|
void Foam::fv::gaussGrad<Type>::correctBoundaryConditions
|
||||||
(
|
(
|
||||||
|
|||||||
@ -145,6 +145,14 @@ public:
|
|||||||
const word& name
|
const word& name
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
//- Calculate the grad of the given field into supplied field
|
||||||
|
virtual void calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<typename outerProduct<vector, Type>::type, fvPatchField, volMesh>& res,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>&
|
||||||
|
) const;
|
||||||
|
|
||||||
//- Correct the boundary values of the gradient using the patchField
|
//- Correct the boundary values of the gradient using the patchField
|
||||||
//- snGrad functions
|
//- snGrad functions
|
||||||
static void correctBoundaryConditions
|
static void correctBoundaryConditions
|
||||||
|
|||||||
@ -96,7 +96,7 @@ Foam::fv::gradScheme<Type>::grad
|
|||||||
GradFieldType* pgGrad =
|
GradFieldType* pgGrad =
|
||||||
mesh().objectRegistry::template getObjectPtr<GradFieldType>(name);
|
mesh().objectRegistry::template getObjectPtr<GradFieldType>(name);
|
||||||
|
|
||||||
if (!this->mesh().cache(name) || this->mesh().changing())
|
if (!this->mesh().cache(name) || this->mesh().topoChanging())
|
||||||
{
|
{
|
||||||
// Delete any old occurrences to avoid double registration
|
// Delete any old occurrences to avoid double registration
|
||||||
if (pgGrad && pgGrad->ownedByRegistry())
|
if (pgGrad && pgGrad->ownedByRegistry())
|
||||||
@ -119,17 +119,14 @@ Foam::fv::gradScheme<Type>::grad
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (pgGrad->upToDate(vsf))
|
if (pgGrad->upToDate(vsf) && this->mesh().upToDatePoints(*pgGrad))
|
||||||
{
|
{
|
||||||
solution::cachePrintMessage("Reusing", name, vsf);
|
solution::cachePrintMessage("Reusing", name, vsf);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
solution::cachePrintMessage("Updating", name, vsf);
|
solution::cachePrintMessage("Updating", name, vsf);
|
||||||
delete pgGrad;
|
calcGrad(*pgGrad, vsf);
|
||||||
|
|
||||||
pgGrad = calcGrad(vsf, name).ptr();
|
|
||||||
regIOobject::store(pgGrad);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,4 +177,23 @@ Foam::fv::gradScheme<Type>::grad
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Foam::fv::gradScheme<Type>::calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<
|
||||||
|
typename outerProduct<vector, Type>::type,
|
||||||
|
fvPatchField,
|
||||||
|
volMesh
|
||||||
|
>& result,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& vsf
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
DebugPout<< "gradScheme<Type>::calcGrad on " << vsf.name()
|
||||||
|
<< " into " << result.name() << endl;
|
||||||
|
|
||||||
|
result = calcGrad(vsf, result.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -142,6 +142,14 @@ public:
|
|||||||
const word& name
|
const word& name
|
||||||
) const = 0;
|
) const = 0;
|
||||||
|
|
||||||
|
//- Calculate the grad of the given field into supplied field
|
||||||
|
virtual void calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<typename outerProduct<vector, Type>::type, fvPatchField, volMesh>& res,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>&
|
||||||
|
) const;
|
||||||
|
|
||||||
//- Calculate and return the grad of the given field
|
//- Calculate and return the grad of the given field
|
||||||
//- which may have been cached
|
//- which may have been cached
|
||||||
tmp
|
tmp
|
||||||
|
|||||||
@ -62,40 +62,25 @@ void Foam::fv::cellLimitedGrad<Type, Limiter>::limitGradient
|
|||||||
|
|
||||||
|
|
||||||
template<class Type, class Limiter>
|
template<class Type, class Limiter>
|
||||||
Foam::tmp
|
void Foam::fv::cellLimitedGrad<Type, Limiter>::calcGrad
|
||||||
<
|
|
||||||
Foam::GeometricField
|
|
||||||
<
|
|
||||||
typename Foam::outerProduct<Foam::vector, Type>::type,
|
|
||||||
Foam::fvPatchField,
|
|
||||||
Foam::volMesh
|
|
||||||
>
|
|
||||||
>
|
|
||||||
Foam::fv::cellLimitedGrad<Type, Limiter>::calcGrad
|
|
||||||
(
|
(
|
||||||
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
|
||||||
const word& name
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const fvMesh& mesh = vsf.mesh();
|
|
||||||
|
|
||||||
tmp
|
|
||||||
<
|
|
||||||
GeometricField
|
|
||||||
<typename outerProduct<vector, Type>::type, fvPatchField, volMesh>
|
|
||||||
> tGrad = basicGradScheme_().calcGrad(vsf, name);
|
|
||||||
|
|
||||||
if (k_ < SMALL)
|
|
||||||
{
|
|
||||||
return tGrad;
|
|
||||||
}
|
|
||||||
|
|
||||||
GeometricField
|
GeometricField
|
||||||
<
|
<
|
||||||
typename outerProduct<vector, Type>::type,
|
typename outerProduct<vector, Type>::type,
|
||||||
fvPatchField,
|
fvPatchField,
|
||||||
volMesh
|
volMesh
|
||||||
>& g = tGrad.ref();
|
>& g,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& vsf
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
const fvMesh& mesh = vsf.mesh();
|
||||||
|
|
||||||
|
basicGradScheme_().calcGrad(g, vsf);
|
||||||
|
|
||||||
|
if (k_ < SMALL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const labelUList& owner = mesh.owner();
|
const labelUList& owner = mesh.owner();
|
||||||
const labelUList& neighbour = mesh.neighbour();
|
const labelUList& neighbour = mesh.neighbour();
|
||||||
@ -227,6 +212,49 @@ Foam::fv::cellLimitedGrad<Type, Limiter>::calcGrad
|
|||||||
limitGradient(limiter, g);
|
limitGradient(limiter, g);
|
||||||
g.correctBoundaryConditions();
|
g.correctBoundaryConditions();
|
||||||
gaussGrad<Type>::correctBoundaryConditions(vsf, g);
|
gaussGrad<Type>::correctBoundaryConditions(vsf, g);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type, class Limiter>
|
||||||
|
Foam::tmp
|
||||||
|
<
|
||||||
|
Foam::GeometricField
|
||||||
|
<
|
||||||
|
typename Foam::outerProduct<Foam::vector, Type>::type,
|
||||||
|
Foam::fvPatchField,
|
||||||
|
Foam::volMesh
|
||||||
|
>
|
||||||
|
>
|
||||||
|
Foam::fv::cellLimitedGrad<Type, Limiter>::calcGrad
|
||||||
|
(
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
||||||
|
const word& name
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
typedef typename outerProduct<vector, Type>::type GradType;
|
||||||
|
typedef GeometricField<GradType, fvPatchField, volMesh> GradFieldType;
|
||||||
|
|
||||||
|
const fvMesh& mesh = vsf.mesh();
|
||||||
|
|
||||||
|
tmp<GradFieldType> tGrad
|
||||||
|
(
|
||||||
|
new GradFieldType
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
name,
|
||||||
|
vsf.instance(),
|
||||||
|
mesh,
|
||||||
|
IOobject::NO_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
),
|
||||||
|
mesh,
|
||||||
|
vsf.dimensions()/dimLength,
|
||||||
|
fvPatchFieldBase::extrapolatedCalculatedType()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
calcGrad(tGrad.ref(), vsf);
|
||||||
|
|
||||||
return tGrad;
|
return tGrad;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -150,6 +150,14 @@ public:
|
|||||||
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
const GeometricField<Type, fvPatchField, volMesh>& vsf,
|
||||||
const word& name
|
const word& name
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
//- Calculate the grad of the given field into supplied field
|
||||||
|
virtual void calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<typename outerProduct<vector, Type>::type, fvPatchField, volMesh>& res,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>&
|
||||||
|
) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -226,6 +226,94 @@ Foam::fv::fusedGaussGrad<Type>::calcGrad
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
void Foam::fv::fusedGaussGrad<Type>::calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<
|
||||||
|
typename outerProduct<vector, Type>::type,
|
||||||
|
fvPatchField,
|
||||||
|
volMesh
|
||||||
|
>& gGrad,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>& vf
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
typedef typename outerProduct<vector, Type>::type GradType;
|
||||||
|
|
||||||
|
const fvMesh& mesh = vf.mesh();
|
||||||
|
|
||||||
|
DebugPout<< "fusedGaussGrad<Type>::calcGrad on " << vf.name()
|
||||||
|
<< " into " << gGrad.name() << endl;
|
||||||
|
|
||||||
|
gGrad = dimensioned<GradType>(vf.dimensions()/dimLength, Zero);
|
||||||
|
|
||||||
|
if (this->tinterpScheme_().corrected())
|
||||||
|
{
|
||||||
|
const auto tfaceCorr(this->tinterpScheme_().correction(vf));
|
||||||
|
auto& faceCorr = tfaceCorr();
|
||||||
|
|
||||||
|
DebugPout<< "fusedGaussGrad<Type>::calcGrad corrected interpScheme "
|
||||||
|
<< this->tinterpScheme_().type() << endl;
|
||||||
|
|
||||||
|
const auto interpolate = [&]
|
||||||
|
(
|
||||||
|
const vector& area,
|
||||||
|
const scalar lambda,
|
||||||
|
|
||||||
|
const Type& ownVal,
|
||||||
|
const Type& neiVal,
|
||||||
|
|
||||||
|
const Type& correction
|
||||||
|
|
||||||
|
) -> GradType
|
||||||
|
{
|
||||||
|
return area*((lambda*(ownVal - neiVal) + neiVal) + correction);
|
||||||
|
};
|
||||||
|
|
||||||
|
fvc::surfaceSum
|
||||||
|
(
|
||||||
|
this->tinterpScheme_().weights(vf),
|
||||||
|
vf,
|
||||||
|
faceCorr,
|
||||||
|
interpolate,
|
||||||
|
gGrad,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DebugPout<< "fusedGaussGrad<Type>::calcGrad uncorrected interpScheme "
|
||||||
|
<< this->tinterpScheme_().type() << endl;
|
||||||
|
|
||||||
|
const auto interpolate = [&]
|
||||||
|
(
|
||||||
|
const vector& area,
|
||||||
|
const scalar lambda,
|
||||||
|
const Type& ownVal,
|
||||||
|
const Type& neiVal
|
||||||
|
) -> GradType
|
||||||
|
{
|
||||||
|
return area*(lambda*(ownVal - neiVal) + neiVal);
|
||||||
|
};
|
||||||
|
|
||||||
|
fvc::surfaceSum
|
||||||
|
(
|
||||||
|
tinterpScheme_().weights(vf),
|
||||||
|
vf,
|
||||||
|
interpolate,
|
||||||
|
gGrad,
|
||||||
|
false
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
gGrad.primitiveFieldRef() /= mesh.V();
|
||||||
|
|
||||||
|
gGrad.correctBoundaryConditions();
|
||||||
|
|
||||||
|
correctBoundaryConditions(vf, gGrad);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
template<class GradType>
|
template<class GradType>
|
||||||
void Foam::fv::fusedGaussGrad<Type>::correctBoundaryConditions
|
void Foam::fv::fusedGaussGrad<Type>::correctBoundaryConditions
|
||||||
|
|||||||
@ -145,6 +145,14 @@ public:
|
|||||||
const word& name
|
const word& name
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
|
//- Calculate the grad of the given field into supplied field
|
||||||
|
virtual void calcGrad
|
||||||
|
(
|
||||||
|
GeometricField
|
||||||
|
<typename outerProduct<vector, Type>::type, fvPatchField, volMesh>& res,
|
||||||
|
const GeometricField<Type, fvPatchField, volMesh>&
|
||||||
|
) const;
|
||||||
|
|
||||||
//- Correct the boundary values of the gradient using the patchField
|
//- Correct the boundary values of the gradient using the patchField
|
||||||
//- snGrad functions
|
//- snGrad functions
|
||||||
template<class GradType>
|
template<class GradType>
|
||||||
|
|||||||
@ -19,4 +19,12 @@ sed "s/GAUSS/fusedGauss/g" system/fvSchemes.template > system/fvSchemes
|
|||||||
runParallel -s fusedGauss $(getApplication)
|
runParallel -s fusedGauss $(getApplication)
|
||||||
|
|
||||||
|
|
||||||
|
echo "Updating fvSolution to cache gradients"
|
||||||
|
sed 's/GRADIENT/"grad(.*)"/g' system/fvSolution.template > system/fvSolution
|
||||||
|
|
||||||
|
runParallel -s fusedGaussCached $(getApplication)
|
||||||
|
|
||||||
|
# Restore
|
||||||
|
cp system/fvSolution.template system/fvSolution
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
|
|||||||
@ -16,6 +16,15 @@ FoamFile
|
|||||||
|
|
||||||
libs (fusedFiniteVolume);
|
libs (fusedFiniteVolume);
|
||||||
|
|
||||||
|
/*
|
||||||
|
DebugSwitches
|
||||||
|
{
|
||||||
|
fusedGauss 1;
|
||||||
|
Gauss 1;
|
||||||
|
solution 1;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
application simpleFoam;
|
application simpleFoam;
|
||||||
|
|
||||||
startFrom startTime;
|
startFrom startTime;
|
||||||
|
|||||||
@ -55,5 +55,11 @@ relaxationFactors
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cache
|
||||||
|
{
|
||||||
|
// Cache all grads
|
||||||
|
GRADIENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -0,0 +1,65 @@
|
|||||||
|
/*--------------------------------*- C++ -*----------------------------------*\
|
||||||
|
| ========= | |
|
||||||
|
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
|
||||||
|
| \\ / O peration | Version: v2506 |
|
||||||
|
| \\ / A nd | Website: www.openfoam.com |
|
||||||
|
| \\/ M anipulation | |
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
FoamFile
|
||||||
|
{
|
||||||
|
version 2.0;
|
||||||
|
format ascii;
|
||||||
|
class dictionary;
|
||||||
|
object fvSolution;
|
||||||
|
}
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
solvers
|
||||||
|
{
|
||||||
|
p
|
||||||
|
{
|
||||||
|
solver GAMG;
|
||||||
|
tolerance 1e-06;
|
||||||
|
relTol 0.1;
|
||||||
|
smoother GaussSeidel;
|
||||||
|
}
|
||||||
|
|
||||||
|
"(U|k|epsilon|omega|f|v2)"
|
||||||
|
{
|
||||||
|
solver smoothSolver;
|
||||||
|
smoother symGaussSeidel;
|
||||||
|
tolerance 1e-05;
|
||||||
|
relTol 0.1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SIMPLE
|
||||||
|
{
|
||||||
|
nNonOrthogonalCorrectors 0;
|
||||||
|
consistent yes;
|
||||||
|
|
||||||
|
residualControl
|
||||||
|
{
|
||||||
|
p 1e-2;
|
||||||
|
U 1e-3;
|
||||||
|
"(k|epsilon|omega|f|v2)" 1e-3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
relaxationFactors
|
||||||
|
{
|
||||||
|
equations
|
||||||
|
{
|
||||||
|
U 0.9; // 0.9 is more stable but 0.95 more convergent
|
||||||
|
".*" 0.9; // 0.9 is more stable but 0.95 more convergent
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cache
|
||||||
|
{
|
||||||
|
// Cache all grads
|
||||||
|
GRADIENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
Reference in New Issue
Block a user