Foam::tmp<Foam::surfaceScalarField> Foam::LimitedScheme<Type, Limiter, LimitFunc>::limiter ( const GeometricField<Type, fvPatchField, volMesh>& phi ) const { const fvMesh& mesh = this->mesh(); tmp<surfaceScalarField> tLimiter ( new surfaceScalarField ( IOobject ( type() + "Limiter(" + phi.name() + ')', mesh.time().timeName(), mesh ), mesh, dimless ) ); surfaceScalarField& lim = tLimiter(); tmp<GeometricField<typename Limiter::phiType, fvPatchField, volMesh> > tlPhi = LimitFunc<Type>()(phi); const GeometricField<typename Limiter::phiType, fvPatchField, volMesh>& lPhi = tlPhi(); tmp<GeometricField<typename Limiter::gradPhiType, fvPatchField, volMesh> > tgradc(fvc::grad(lPhi)); const GeometricField<typename Limiter::gradPhiType, fvPatchField, volMesh>& gradc = tgradc(); const surfaceScalarField& CDweights = mesh.surfaceInterpolation::weights(); const labelUList& owner = mesh.owner(); const labelUList& neighbour = mesh.neighbour(); const vectorField& C = mesh.C(); scalarField& pLim = lim.internalField(); forAll(pLim, face) { label own = owner[face]; label nei = neighbour[face]; pLim[face] = Limiter::limiter ( CDweights[face], this->faceFlux_[face], lPhi[own], lPhi[nei], gradc[own], gradc[nei], C[nei] - C[own] ); }
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(); 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.internalField(); forAll(pLimiter, face) { pLimiter[face] = PhiLimiter::limiter ( CDweights[face], Uflux[face], phi[owner[face]], phi[neighbour[face]], Sf[face], magSf[face] ); }