tmp < GeometricField < typename outerProduct<vector,Type>::type, faPatchField, areaMesh > > grad ( const tmp<GeometricField<Type, faPatchField, areaMesh> >& tvf, const word& name ) { tmp < GeometricField < typename outerProduct<vector, Type>::type, faPatchField, areaMesh > > tGrad ( fac::grad(tvf(), name) ); tvf.clear(); return tGrad; }
Foam::tmp<Foam::volVectorField> Foam::fv::faceLimitedGrad<Foam::scalar>::calcGrad ( const volScalarField& vsf, const word& name ) const { const fvMesh& mesh = vsf.mesh(); tmp<volVectorField> tGrad = basicGradScheme_().calcGrad(vsf, name); if (k_ < SMALL) { return tGrad; } volVectorField& g = tGrad(); const labelUList& owner = mesh.owner(); const labelUList& neighbour = mesh.neighbour(); const volVectorField& C = mesh.C(); const surfaceVectorField& Cf = mesh.Cf(); // create limiter scalarField limiter(vsf.internalField().size(), 1.0); scalar rk = (1.0/k_ - 1.0); forAll(owner, facei) { label own = owner[facei]; label nei = neighbour[facei]; scalar vsfOwn = vsf[own]; scalar vsfNei = vsf[nei]; scalar maxFace = max(vsfOwn, vsfNei); scalar minFace = min(vsfOwn, vsfNei); scalar maxMinFace = rk*(maxFace - minFace); maxFace += maxMinFace; minFace -= maxMinFace; // owner side limitFace ( limiter[own], maxFace - vsfOwn, minFace - vsfOwn, (Cf[facei] - C[own]) & g[own] ); // neighbour side limitFace ( limiter[nei], maxFace - vsfNei, minFace - vsfNei, (Cf[facei] - C[nei]) & g[nei] ); }
Foam::tmp<Foam::volVectorField> Foam::fv::cellLimitedGrad<Foam::scalar>::calcGrad ( const volScalarField& vsf, const word& name ) const { const fvMesh& mesh = vsf.mesh(); tmp<volVectorField> tGrad = basicGradScheme_().calcGrad(vsf, name); if (k_ < SMALL) { return tGrad; } volVectorField& g = tGrad(); const labelUList& owner = mesh.owner(); const labelUList& neighbour = mesh.neighbour(); const volVectorField& C = mesh.C(); const surfaceVectorField& Cf = mesh.Cf(); scalarField maxVsf(vsf.internalField()); scalarField minVsf(vsf.internalField()); forAll(owner, facei) { label own = owner[facei]; label nei = neighbour[facei]; scalar vsfOwn = vsf[own]; scalar vsfNei = vsf[nei]; maxVsf[own] = max(maxVsf[own], vsfNei); minVsf[own] = min(minVsf[own], vsfNei); maxVsf[nei] = max(maxVsf[nei], vsfOwn); minVsf[nei] = min(minVsf[nei], vsfOwn); }
tmp<volVectorField> cellMDLimitedGrad<scalar>::grad ( const volScalarField& vsf ) const { const fvMesh& mesh = vsf.mesh(); tmp<volVectorField> tGrad = basicGradScheme_().grad(vsf); if (k_ < SMALL) { return tGrad; } volVectorField& g = tGrad(); const unallocLabelList& owner = mesh.owner(); const unallocLabelList& neighbour = mesh.neighbour(); const volVectorField& C = mesh.C(); const surfaceVectorField& Cf = mesh.Cf(); scalarField maxVsf(vsf.internalField()); scalarField minVsf(vsf.internalField()); forAll(owner, facei) { label own = owner[facei]; label nei = neighbour[facei]; scalar vsfOwn = vsf[own]; scalar vsfNei = vsf[nei]; maxVsf[own] = max(maxVsf[own], vsfNei); minVsf[own] = min(minVsf[own], vsfNei); maxVsf[nei] = max(maxVsf[nei], vsfOwn); minVsf[nei] = min(minVsf[nei], vsfOwn); }