Non-const access to the internal field now obtained from a specifically
named access function consistent with the new names for non-canst access
to the boundary field boundaryFieldRef() and dimensioned internal field
dimensionedInternalFieldRef().
See also commit a4e2afa4b3
148 lines
4.3 KiB
C
148 lines
4.3 KiB
C
/*---------------------------------------------------------------------------*\
|
|
========= |
|
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
\\ / O peration |
|
|
\\ / A nd | Copyright (C) 2011-2016 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 "volFields.H"
|
|
#include "surfaceFields.H"
|
|
#include "fvcGrad.H"
|
|
#include "coupledFvPatchFields.H"
|
|
#include "surfaceInterpolate.H"
|
|
|
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
|
|
template<class Type, class PhiLimiter>
|
|
Foam::tmp<Foam::surfaceScalarField>
|
|
Foam::PhiScheme<Type, PhiLimiter>::limiter
|
|
(
|
|
const GeometricField<Type, fvPatchField, volMesh>& phi
|
|
) const
|
|
{
|
|
const fvMesh& mesh = this->mesh();
|
|
|
|
tmp<surfaceScalarField> tLimiter
|
|
(
|
|
new surfaceScalarField
|
|
(
|
|
IOobject
|
|
(
|
|
"PhiLimiter",
|
|
mesh.time().timeName(),
|
|
mesh
|
|
),
|
|
mesh,
|
|
dimless
|
|
)
|
|
);
|
|
surfaceScalarField& Limiter = tLimiter.ref();
|
|
|
|
const surfaceScalarField& CDweights = mesh.surfaceInterpolation::weights();
|
|
|
|
const surfaceVectorField& Sf = mesh.Sf();
|
|
const surfaceScalarField& magSf = mesh.magSf();
|
|
|
|
const labelUList& owner = mesh.owner();
|
|
const labelUList& neighbour = mesh.neighbour();
|
|
|
|
tmp<surfaceScalarField> tUflux = this->faceFlux_;
|
|
|
|
if (this->faceFlux_.dimensions() == dimDensity*dimVelocity*dimArea)
|
|
{
|
|
const volScalarField& rho =
|
|
phi.db().objectRegistry::template lookupObject<volScalarField>
|
|
("rho");
|
|
|
|
tUflux = this->faceFlux_/fvc::interpolate(rho);
|
|
}
|
|
else if (this->faceFlux_.dimensions() != dimVelocity*dimArea)
|
|
{
|
|
FatalErrorInFunction
|
|
<< "dimensions of faceFlux are not correct"
|
|
<< exit(FatalError);
|
|
}
|
|
|
|
const surfaceScalarField& Uflux = tUflux();
|
|
|
|
scalarField& pLimiter = Limiter.internalFieldRef();
|
|
|
|
forAll(pLimiter, face)
|
|
{
|
|
pLimiter[face] = PhiLimiter::limiter
|
|
(
|
|
CDweights[face],
|
|
Uflux[face],
|
|
phi[owner[face]],
|
|
phi[neighbour[face]],
|
|
Sf[face],
|
|
magSf[face]
|
|
);
|
|
}
|
|
|
|
|
|
surfaceScalarField::Boundary& bLimiter =
|
|
Limiter.boundaryFieldRef();
|
|
|
|
forAll(bLimiter, patchi)
|
|
{
|
|
scalarField& pLimiter = bLimiter[patchi];
|
|
|
|
if (bLimiter[patchi].coupled())
|
|
{
|
|
const scalarField& pCDweights = CDweights.boundaryField()[patchi];
|
|
const vectorField& pSf = Sf.boundaryField()[patchi];
|
|
const scalarField& pmagSf = magSf.boundaryField()[patchi];
|
|
const scalarField& pFaceFlux = Uflux.boundaryField()[patchi];
|
|
|
|
const Field<Type> pphiP
|
|
(
|
|
phi.boundaryField()[patchi].patchInternalField()
|
|
);
|
|
const Field<Type> pphiN
|
|
(
|
|
phi.boundaryField()[patchi].patchNeighbourField()
|
|
);
|
|
|
|
forAll(pLimiter, face)
|
|
{
|
|
pLimiter[face] = PhiLimiter::limiter
|
|
(
|
|
pCDweights[face],
|
|
pFaceFlux[face],
|
|
pphiP[face],
|
|
pphiN[face],
|
|
pSf[face],
|
|
pmagSf[face]
|
|
);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
pLimiter = 1.0;
|
|
}
|
|
}
|
|
|
|
return tLimiter;
|
|
}
|
|
|
|
|
|
// ************************************************************************* //
|