diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearUpwind/linearUpwind.C b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearUpwind/linearUpwind.C index 6fceae450..69492761b 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearUpwind/linearUpwind.C +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearUpwind/linearUpwind.C @@ -65,6 +65,15 @@ Foam::linearUpwind::correction const volVectorField& C = mesh.C(); const surfaceVectorField& Cf = mesh.Cf(); + tmp> gradScheme_ + ( + fv::gradScheme::New + ( + mesh, + mesh.gradScheme(gradSchemeName_) + ) + ); + for (direction cmpt = 0; cmpt < pTraits::nComponents; cmpt++) { tmp tgradVf = @@ -133,6 +142,121 @@ Foam::linearUpwind::correction } +template<> +Foam::tmp +Foam::linearUpwind::correction +( + const volVectorField& vf +) const +{ + const fvMesh& mesh = this->mesh(); + + tmp> tsfCorr + ( + new GeometricField + ( + IOobject + ( + "linearUpwind::correction(" + vf.name() + ')', + mesh.time().timeName(), + mesh, + IOobject::NO_READ, + IOobject::NO_WRITE, + false + ), + mesh, + dimensioned(vf.name(), vf.dimensions(), Zero) + ) + ); + + GeometricField& sfCorr = tsfCorr.ref(); + + const surfaceScalarField& faceFlux = this->faceFlux_; + + const labelList& owner = mesh.owner(); + const labelList& neighbour = mesh.neighbour(); + + const volVectorField& C = mesh.C(); + const surfaceVectorField& Cf = mesh.Cf(); + + tmp> gradScheme_ + ( + fv::gradScheme::New + ( + mesh, + mesh.gradScheme(gradSchemeName_) + ) + ); + + tmp + < + GeometricField + < + typename outerProduct::type, + fvPatchField, + volMesh + > + > tgradVf = gradScheme_().grad(vf, gradSchemeName_); + + const GeometricField + < + typename outerProduct::type, + fvPatchField, + volMesh + >& gradVf = tgradVf(); + + forAll(faceFlux, facei) + { + label celli = (faceFlux[facei] > 0) ? owner[facei] : neighbour[facei]; + sfCorr[facei] = (Cf[facei] - C[celli]) & gradVf[celli]; + } + + + typename GeometricField:: + Boundary& bSfCorr = sfCorr.boundaryFieldRef(); + + forAll(bSfCorr, patchi) + { + fvsPatchField& pSfCorr = bSfCorr[patchi]; + + if (pSfCorr.coupled()) + { + const labelUList& pOwner = + mesh.boundary()[patchi].faceCells(); + + const vectorField& pCf = Cf.boundaryField()[patchi]; + + const scalarField& pFaceFlux = faceFlux.boundaryField()[patchi]; + + const Field::type> pGradVfNei + ( + gradVf.boundaryField()[patchi].patchNeighbourField() + ); + + // Build the d-vectors + vectorField pd(Cf.boundaryField()[patchi].patch().delta()); + + forAll(pOwner, facei) + { + label own = pOwner[facei]; + + if (pFaceFlux[facei] > 0) + { + pSfCorr[facei] = (pCf[facei] - C[own]) & gradVf[own]; + } + else + { + pSfCorr[facei] = + (pCf[facei] - pd[facei] - C[own]) & pGradVfNei[facei]; + } + } + } + } + + return tsfCorr; +} + + namespace Foam { makelimitedSurfaceInterpolationScheme(linearUpwind) diff --git a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearUpwind/linearUpwind.H b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearUpwind/linearUpwind.H index d7f0e4351..e9d16eadd 100644 --- a/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearUpwind/linearUpwind.H +++ b/src/finiteVolume/interpolation/surfaceInterpolation/schemes/linearUpwind/linearUpwind.H @@ -57,7 +57,6 @@ class linearUpwind // Private Data word gradSchemeName_; - tmp> gradScheme_; // Private Member Functions @@ -85,11 +84,7 @@ public: ) : upwind(mesh, faceFlux), - gradSchemeName_("grad"), - gradScheme_ - ( - new fv::gaussGrad(mesh) - ) + gradSchemeName_("grad") {} //- Construct from Istream. @@ -102,15 +97,7 @@ public: ) : upwind(mesh, schemeData), - gradSchemeName_(schemeData), - gradScheme_ - ( - fv::gradScheme::New - ( - mesh, - mesh.gradScheme(gradSchemeName_) - ) - ) + gradSchemeName_(schemeData) {} //- Construct from faceFlux and Istream @@ -122,15 +109,7 @@ public: ) : upwind(mesh, faceFlux, schemeData), - gradSchemeName_(schemeData), - gradScheme_ - ( - fv::gradScheme::New - ( - mesh, - mesh.gradScheme(gradSchemeName_) - ) - ) + gradSchemeName_(schemeData) {} @@ -151,6 +130,14 @@ public: }; +// Specialize for volVectorField to support cached gradients +template<> +tmp linearUpwind::correction +( + const volVectorField& vf +) const; + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam