tmp<typename steadyStateDdtScheme<Type>::fluxFieldType> steadyStateDdtScheme<Type>::fvcDdtPhiCorr ( const volScalarField& rA, const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& U, const fluxFieldType& phi ) { return tmp<fluxFieldType> ( new fluxFieldType ( IOobject ( "ddtPhiCorr(" + rA.name() + ',' + rho.name() + ',' + U.name() + ',' + phi.name() + ')', mesh().time().timeName(), mesh() ), mesh(), dimensioned<typename flux<Type>::type> ( "0", rA.dimensions()*rho.dimensions()*phi.dimensions()/dimTime, pTraits<typename flux<Type>::type>::zero ) ) ); }
tmp<GeometricField<Type, fvPatchField, volMesh>> steadyStateD2dt2Scheme<Type>::fvcD2dt2 ( const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& vf ) { return tmp<GeometricField<Type, fvPatchField, volMesh>> ( new GeometricField<Type, fvPatchField, volMesh> ( IOobject ( "d2dt2("+rho.name()+','+vf.name()+')', mesh().time().timeName(), mesh(), IOobject::NO_READ, IOobject::NO_WRITE ), mesh(), dimensioned<Type> ( "0", rho.dimensions()*vf.dimensions()/dimTime/dimTime, Zero ) ) ); }
tmp<GeometricField<Type, fvPatchField, volMesh> > steadyStateDdtScheme<Type>::fvcDdt ( const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& vf ) { return tmp<GeometricField<Type, fvPatchField, volMesh> > ( new GeometricField<Type, fvPatchField, volMesh> ( IOobject ( "ddt("+rho.name()+','+vf.name()+')', mesh().time().timeName(), mesh() ), mesh(), dimensioned<Type> ( "0", rho.dimensions()*vf.dimensions()/dimTime, pTraits<Type>::zero ) ) ); }
void Foam::bound(volScalarField& vsf, const dimensionedScalar& vsf0) { scalar minVsf = min(vsf).value(); if (minVsf < vsf0.value()) { Info<< "bounding " << vsf.name() << ", min: " << gMin(vsf.internalField()) << " max: " << gMax(vsf.internalField()) << " average: " << gAverage(vsf.internalField()) << endl; vsf.internalField() = max ( max ( vsf.internalField(), fvc::average(max(vsf, vsf0))().internalField() // Bug fix: was assuming bound on zero. HJ, 25/Nov/2008 *pos(vsf0.value() - vsf.internalField()) ), vsf0.value() ); vsf.correctBoundaryConditions(); vsf.boundaryField() = max(vsf.boundaryField(), vsf0.value()); } }
tmp<fvScalarMatrix> singleStepCombustion<CombThermoType, ThermoType>::R ( volScalarField& Y ) const { const label specieI = this->thermoPtr_->composition().species()[Y.name()]; volScalarField wSpecie ( wFuel_*singleMixturePtr_->specieStoichCoeffs()[specieI] ); if (semiImplicit_) { const label fNorm = singleMixturePtr_->specieProd()[specieI]; const volScalarField fres(singleMixturePtr_->fres(specieI)); wSpecie /= max(fNorm*(Y - fres), scalar(1e-2)); return -fNorm*wSpecie*fres + fNorm*fvm::Sp(wSpecie, Y); } else { return wSpecie + fvm::Sp(0.0*wSpecie, Y); } }
tmp<GeometricField<Type, fvPatchField, volMesh> > EulerLocalDdtScheme<Type>::fvcDdt ( const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& vf ) { const objectRegistry& registry = this->mesh(); // get access to the scalar beta[i] const scalarField& beta = registry.lookupObject<scalarField>(deltaTName_); volScalarField rDeltaT = 1.0/(beta[0]*registry.lookupObject<volScalarField>(deltaTauName_)); IOobject ddtIOobject ( "ddt("+rho.name()+','+vf.name()+')', mesh().time().timeName(), mesh() ); if (mesh().moving()) { return tmp<GeometricField<Type, fvPatchField, volMesh> > ( new GeometricField<Type, fvPatchField, volMesh> ( ddtIOobject, mesh(), rDeltaT.dimensions()*rho.dimensions()*vf.dimensions(), rDeltaT.internalField()* ( rho.internalField()*vf.internalField() - rho.oldTime().internalField() *vf.oldTime().internalField()*mesh().V0()/mesh().V() ), rDeltaT.boundaryField()* ( rho.boundaryField()*vf.boundaryField() - rho.oldTime().boundaryField() *vf.oldTime().boundaryField() ) ) ); } else { return tmp<GeometricField<Type, fvPatchField, volMesh> > ( new GeometricField<Type, fvPatchField, volMesh> ( ddtIOobject, rDeltaT*(rho*vf - rho.oldTime()*vf.oldTime()) ) ); } }
void writeCellGraph ( const volScalarField& vsf, const word& graphFormat ) { fileName path(vsf.time().path()/"graphs"/vsf.time().timeName()); mkDir(path); graph ( vsf.name(), "x", vsf.name(), vsf.mesh().C().primitiveField().component(vector::X), vsf.primitiveField() ).write(path/vsf.name(), graphFormat); }
tmp<fvMatrix<Type> > ddt ( const volScalarField& rho, GeometricField<Type, fvPatchField, volMesh>& vf ) { return fvm::ddt(rho, vf, "ddt(" + rho.name() + ',' + vf.name() + ')'); }
tmp<typename EulerLocalDdtScheme<Type>::fluxFieldType> EulerLocalDdtScheme<Type>::fvcDdtPhiCorr ( const volScalarField& rA, const GeometricField<Type, fvPatchField, volMesh>& U, const fluxFieldType& phi ) { IOobject ddtIOobject ( "ddtPhiCorr(" + rA.name() + ',' + U.name() + ',' + phi.name() + ')', mesh().time().timeName(), mesh() ); if (mesh().moving()) { return tmp<fluxFieldType> ( new fluxFieldType ( ddtIOobject, mesh(), dimensioned<typename flux<Type>::type> ( "0", rA.dimensions()*phi.dimensions()/dimTime, pTraits<typename flux<Type>::type>::zero ) ) ); } else { const objectRegistry& registry = this->mesh(); // get access to the scalar beta[i] const scalarField& beta = registry.lookupObject<scalarField>(deltaTName_); volScalarField rDeltaT = 1.0/(beta[0]*registry.lookupObject<volScalarField>(deltaTauName_)); return tmp<fluxFieldType> ( new fluxFieldType ( ddtIOobject, fvcDdtPhiCoeff(U.oldTime(), phi.oldTime())* ( fvc::interpolate(rDeltaT*rA)*phi.oldTime() - (fvc::interpolate(rDeltaT*rA*U.oldTime()) & mesh().Sf()) ) ) ); } }
void makeGraph ( const scalarField& x, const volScalarField& vsf, const word& graphFormat ) { makeGraph(x, vsf, vsf.name(), graphFormat); }
void Foam::boundMinMax ( volScalarField& vsf, const dimensionedScalar& vsf0, const dimensionedScalar& vsf1 ) { scalar minVsf = min(vsf).value(); scalar maxVsf = max(vsf).value(); if (minVsf < vsf0.value() || maxVsf > vsf1.value()) { Info<< "bounding " << vsf.name() << ", min: " << gMin(vsf.internalField()) << " max: " << gMax(vsf.internalField()) << " average: " << gAverage(vsf.internalField()) << endl; } if (minVsf < vsf0.value()) { vsf.internalField() = max ( max ( vsf.internalField(), fvc::average(max(vsf, vsf0))().internalField() *pos(vsf0.value() - vsf.internalField()) ), vsf0.value() ); vsf.correctBoundaryConditions(); vsf.boundaryField() = max(vsf.boundaryField(), vsf0.value()); } if (maxVsf > vsf1.value()) { vsf.internalField() = min ( min ( vsf.internalField(), fvc::average(min(vsf, vsf1))().internalField() *neg(vsf1.value() - vsf.internalField()) // This is needed when all values are above max // HJ, 18/Apr/2009 + pos(vsf1.value() - vsf.internalField())*vsf1.value() ), vsf1.value() ); vsf.correctBoundaryConditions(); vsf.boundaryField() = min(vsf.boundaryField(), vsf1.value()); } }
Foam::tmp<Foam::surfaceScalarField> Foam::fvc::meshPhi ( const volScalarField& rho, const volVectorField& vf ) { return fv::ddtScheme<vector>::New ( vf.mesh(), vf.mesh().ddtScheme("ddt(" + rho.name() + ',' + vf.name() + ')') )().meshPhi(vf); }
tmp<GeometricField<Type, fvPatchField, volMesh> > ddt ( const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& vf ) { return fv::ddtScheme<Type>::New ( vf.mesh(), vf.mesh().ddtScheme("ddt(" + rho.name() + ',' + vf.name() + ')') )().fvcDdt(rho, vf); }
tmp<fvMatrix<Type> > d2dt2 ( const volScalarField& rho, GeometricField<Type, fvPatchField, volMesh>& vf ) { return fv::d2dt2Scheme<Type>::New ( vf.mesh(), vf.mesh().d2dt2Scheme("d2dt2(" + rho.name() + ',' + vf.name() + ')') )().fvmD2dt2(rho, vf); }
Foam::tmp<Foam::fvScalarMatrix> singleStepCombustion<CombThermoType, ThermoType>::R ( const volScalarField& Y ) const { const label specieI = this->thermo_->composition().species()[Y.name()]; const volScalarField wSpecie ( wFuel_*singleMixture_.specieStoichCoeffs()[specieI] ); return wSpecie + fvm::Sp(0.0*wSpecie, Y); }
void Foam::MULES::explicitSolve ( const RdeltaTType& rDeltaT, const RhoType& rho, volScalarField& psi, const surfaceScalarField& phiPsi, const SpType& Sp, const SuType& Su ) { Info<< "MULES: Solving for " << psi.name() << endl; const fvMesh& mesh = psi.mesh(); scalarField& psiIf = psi; const scalarField& psi0 = psi.oldTime(); psiIf = 0.0; fvc::surfaceIntegrate(psiIf, phiPsi); if (mesh.moving()) { psiIf = ( mesh.Vsc0()().field()*rho.oldTime().field() *psi0*rDeltaT/mesh.Vsc()().field() + Su.field() - psiIf )/(rho.field()*rDeltaT - Sp.field()); } else { psiIf = ( rho.oldTime().field()*psi0*rDeltaT + Su.field() - psiIf )/(rho.field()*rDeltaT - Sp.field()); } psi.correctBoundaryConditions(); }
tmp<GeometricField<typename flux<Type>::type, fvsPatchField, surfaceMesh> > ddtPhiCorr ( const volScalarField& rA, const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& U, const GeometricField < typename flux<Type>::type, fvsPatchField, surfaceMesh >& phi ) { return fv::ddtScheme<Type>::New ( U.mesh(), U.mesh().ddtScheme("ddt(" + rho.name() + ',' + U.name() + ')') )().fvcDdtPhiCorr(rA, rho, U, phi); }
tmp<typename EulerLocalDdtScheme<Type>::fluxFieldType> EulerLocalDdtScheme<Type>::fvcDdtPhiCorr ( const volScalarField& rA, const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& U, const fluxFieldType& phi ) { IOobject ddtIOobject ( "ddtPhiCorr(" + rA.name() + ',' + rho.name() + ',' + U.name() + ',' + phi.name() + ')', mesh().time().timeName(), mesh() ); if (mesh().moving()) { return tmp<fluxFieldType> ( new fluxFieldType ( ddtIOobject, mesh(), dimensioned<typename flux<Type>::type> ( "0", rA.dimensions()*phi.dimensions()/dimTime, pTraits<typename flux<Type>::type>::zero ) ) ); } else { const objectRegistry& registry = this->mesh(); // get access to the scalar beta[i] const scalarField& beta = registry.lookupObject<scalarField>(deltaTName_); volScalarField rDeltaT = 1.0/(beta[0]*registry.lookupObject<volScalarField>(deltaTauName_)); if ( U.dimensions() == dimVelocity && phi.dimensions() == dimVelocity*dimArea ) { return tmp<fluxFieldType> ( new fluxFieldType ( ddtIOobject, fvcDdtPhiCoeff(U.oldTime(), phi.oldTime()) *( fvc::interpolate(rDeltaT*rA*rho.oldTime())*phi.oldTime() - (fvc::interpolate(rDeltaT*rA*rho.oldTime()*U.oldTime()) & mesh().Sf()) ) ) ); } else if ( U.dimensions() == dimVelocity && phi.dimensions() == dimDensity*dimVelocity*dimArea ) { return tmp<fluxFieldType> ( new fluxFieldType ( ddtIOobject, fvcDdtPhiCoeff ( U.oldTime(), phi.oldTime()/fvc::interpolate(rho.oldTime()) ) *( fvc::interpolate(rDeltaT*rA*rho.oldTime()) *phi.oldTime()/fvc::interpolate(rho.oldTime()) - ( fvc::interpolate ( rDeltaT*rA*rho.oldTime()*U.oldTime() ) & mesh().Sf() ) ) ) ); } else if ( U.dimensions() == dimDensity*dimVelocity && phi.dimensions() == dimDensity*dimVelocity*dimArea ) { return tmp<fluxFieldType> ( new fluxFieldType ( ddtIOobject, fvcDdtPhiCoeff(rho.oldTime(), U.oldTime(), phi.oldTime()) *( fvc::interpolate(rDeltaT*rA)*phi.oldTime() - ( fvc::interpolate(rDeltaT*rA*U.oldTime())&mesh().Sf() ) ) ) ); } else { FatalErrorIn ( "EulerLocalDdtScheme<Type>::fvcDdtPhiCorr" ) << "dimensions of phi are not correct" << abort(FatalError); return fluxFieldType::null(); } } }
void Foam::MULES::limiter ( scalarField& allLambda, const RdeltaTType& rDeltaT, const RhoType& rho, const volScalarField& psi, const surfaceScalarField& phiBD, const surfaceScalarField& phiCorr, const SpType& Sp, const SuType& Su, const scalar psiMax, const scalar psiMin ) { const scalarField& psiIf = psi; const volScalarField::GeometricBoundaryField& psiBf = psi.boundaryField(); const fvMesh& mesh = psi.mesh(); const dictionary& MULEScontrols = mesh.solverDict(psi.name()); label nLimiterIter ( MULEScontrols.lookupOrDefault<label>("nLimiterIter", 3) ); scalar smoothLimiter ( MULEScontrols.lookupOrDefault<scalar>("smoothLimiter", 0) ); const scalarField& psi0 = psi.oldTime(); const labelUList& owner = mesh.owner(); const labelUList& neighb = mesh.neighbour(); tmp<volScalarField::DimensionedInternalField> tVsc = mesh.Vsc(); const scalarField& V = tVsc(); const scalarField& phiBDIf = phiBD; const surfaceScalarField::GeometricBoundaryField& phiBDBf = phiBD.boundaryField(); const scalarField& phiCorrIf = phiCorr; const surfaceScalarField::GeometricBoundaryField& phiCorrBf = phiCorr.boundaryField(); slicedSurfaceScalarField lambda ( IOobject ( "lambda", mesh.time().timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE, false ), mesh, dimless, allLambda, false // Use slices for the couples ); scalarField& lambdaIf = lambda; surfaceScalarField::GeometricBoundaryField& lambdaBf = lambda.boundaryField(); scalarField psiMaxn(psiIf.size(), psiMin); scalarField psiMinn(psiIf.size(), psiMax); scalarField sumPhiBD(psiIf.size(), 0.0); scalarField sumPhip(psiIf.size(), VSMALL); scalarField mSumPhim(psiIf.size(), VSMALL); forAll(phiCorrIf, facei) { label own = owner[facei]; label nei = neighb[facei]; psiMaxn[own] = max(psiMaxn[own], psiIf[nei]); psiMinn[own] = min(psiMinn[own], psiIf[nei]); psiMaxn[nei] = max(psiMaxn[nei], psiIf[own]); psiMinn[nei] = min(psiMinn[nei], psiIf[own]); sumPhiBD[own] += phiBDIf[facei]; sumPhiBD[nei] -= phiBDIf[facei]; scalar phiCorrf = phiCorrIf[facei]; if (phiCorrf > 0.0) { sumPhip[own] += phiCorrf; mSumPhim[nei] += phiCorrf; } else { mSumPhim[own] -= phiCorrf; sumPhip[nei] -= phiCorrf; } }
void Foam::setRefCell ( const volScalarField& field, const volScalarField& fieldRef, const dictionary& dict, label& refCelli, scalar& refValue, const bool forceReference ) { if (fieldRef.needReference() || forceReference) { word refCellName = field.name() + "RefCell"; word refPointName = field.name() + "RefPoint"; word refValueName = field.name() + "RefValue"; if (dict.found(refCellName)) { if (Pstream::master()) { refCelli = readLabel(dict.lookup(refCellName)); if (refCelli < 0 || refCelli >= field.mesh().nCells()) { FatalIOErrorIn ( "void Foam::setRefCell\n" "(\n" " const volScalarField&,\n" " const volScalarField&,\n" " const dictionary&,\n" " label& scalar&,\n" " bool\n" ")", dict ) << "Illegal master cellID " << refCelli << ". Should be 0.." << field.mesh().nCells() << exit(FatalIOError); } } else { refCelli = -1; } } else if (dict.found(refPointName)) { point refPointi(dict.lookup(refPointName)); refCelli = field.mesh().findCell(refPointi); label hasRef = (refCelli >= 0 ? 1 : 0); label sumHasRef = returnReduce<label>(hasRef, sumOp<label>()); if (sumHasRef != 1) { FatalIOErrorIn ( "void Foam::setRefCell\n" "(\n" " const volScalarField&,\n" " const volScalarField&,\n" " const dictionary&,\n" " label& scalar&,\n" " bool\n" ")", dict ) << "Unable to set reference cell for field " << field.name() << nl << " Reference point " << refPointName << " " << refPointi << " found on " << sumHasRef << " domains (should be one)" << nl << exit(FatalIOError); } } else { FatalIOErrorIn ( "void Foam::setRefCell\n" "(\n" " const volScalarField&,\n" " const volScalarField&,\n" " const dictionary&,\n" " label& scalar&,\n" " bool\n" ")", dict ) << "Unable to set reference cell for field " << field.name() << nl << " Please supply either " << refCellName << " or " << refPointName << nl << exit(FatalIOError); } refValue = readScalar(dict.lookup(refValueName)); } }
void Foam::MULES::explicitSolve ( const RhoType& rho, volScalarField& psi, const surfaceScalarField& phi, surfaceScalarField& phiPsi, const SpType& Sp, const SuType& Su, const scalar psiMax, const scalar psiMin ) { Info<< "MULES: Solving for " << psi.name() << endl; const fvMesh& mesh = psi.mesh(); psi.correctBoundaryConditions(); surfaceScalarField phiBD(upwind<scalar>(psi.mesh(), phi).flux(psi)); surfaceScalarField& phiCorr = phiPsi; phiCorr -= phiBD; scalarField allLambda(mesh.nFaces(), 1.0); slicedSurfaceScalarField lambda ( IOobject ( "lambda", mesh.time().timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE, false ), mesh, dimless, allLambda, false // Use slices for the couples ); limiter ( allLambda, rho, psi, phiBD, phiCorr, Sp, Su, psiMax, psiMin, 3 ); phiPsi = phiBD + lambda*phiCorr; scalarField& psiIf = psi; const scalarField& psi0 = psi.oldTime(); const scalar deltaT = mesh.time().deltaTValue(); psiIf = 0.0; fvc::surfaceIntegrate(psiIf, phiPsi); if (mesh.moving()) { psiIf = ( mesh.Vsc0()().field()*rho.oldTime().field() *psi0/(deltaT*mesh.Vsc()().field()) + Su.field() - psiIf )/(rho.field()/deltaT - Sp.field()); } else { psiIf = ( rho.oldTime().field()*psi0/deltaT + Su.field() - psiIf )/(rho.field()/deltaT - Sp.field()); } psi.correctBoundaryConditions(); }
void Foam::MULES::implicitSolve ( const RhoType& rho, volScalarField& psi, const surfaceScalarField& phi, surfaceScalarField& phiPsi, const SpType& Sp, const SuType& Su, const scalar psiMax, const scalar psiMin ) { const fvMesh& mesh = psi.mesh(); const dictionary& MULEScontrols = mesh.solverDict(psi.name()); label maxIter ( readLabel(MULEScontrols.lookup("maxIter")) ); label nLimiterIter ( readLabel(MULEScontrols.lookup("nLimiterIter")) ); scalar maxUnboundedness ( readScalar(MULEScontrols.lookup("maxUnboundedness")) ); scalar CoCoeff ( readScalar(MULEScontrols.lookup("CoCoeff")) ); scalarField allCoLambda(mesh.nFaces()); { tmp<surfaceScalarField> Cof = mesh.time().deltaT()*mesh.surfaceInterpolation::deltaCoeffs() *mag(phi)/mesh.magSf(); slicedSurfaceScalarField CoLambda ( IOobject ( "CoLambda", mesh.time().timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE, false ), mesh, dimless, allCoLambda, false // Use slices for the couples ); CoLambda == 1.0/max(CoCoeff*Cof, scalar(1)); } scalarField allLambda(allCoLambda); //scalarField allLambda(mesh.nFaces(), 1.0); slicedSurfaceScalarField lambda ( IOobject ( "lambda", mesh.time().timeName(), mesh, IOobject::NO_READ, IOobject::NO_WRITE, false ), mesh, dimless, allLambda, false // Use slices for the couples ); linear<scalar> CDs(mesh); upwind<scalar> UDs(mesh, phi); //fv::uncorrectedSnGrad<scalar> snGrads(mesh); fvScalarMatrix psiConvectionDiffusion ( fvm::ddt(rho, psi) + fv::gaussConvectionScheme<scalar>(mesh, phi, UDs).fvmDiv(phi, psi) //- fv::gaussLaplacianScheme<scalar, scalar>(mesh, CDs, snGrads) //.fvmLaplacian(Dpsif, psi) - fvm::Sp(Sp, psi) - Su ); surfaceScalarField phiBD(psiConvectionDiffusion.flux()); surfaceScalarField& phiCorr = phiPsi; phiCorr -= phiBD; for (label i=0; i<maxIter; i++) { if (i != 0 && i < 4) { allLambda = allCoLambda; } limiter ( allLambda, rho, psi, phiBD, phiCorr, Sp, Su, psiMax, psiMin, nLimiterIter ); solve ( psiConvectionDiffusion + fvc::div(lambda*phiCorr), MULEScontrols ); scalar maxPsiM1 = gMax(psi.internalField()) - 1.0; scalar minPsi = gMin(psi.internalField()); scalar unboundedness = max(max(maxPsiM1, 0.0), -min(minPsi, 0.0)); if (unboundedness < maxUnboundedness) { break; } else { Info<< "MULES: max(" << psi.name() << " - 1) = " << maxPsiM1 << " min(" << psi.name() << ") = " << minPsi << endl; phiBD = psiConvectionDiffusion.flux(); /* word gammaScheme("div(phi,gamma)"); word gammarScheme("div(phirb,gamma)"); const surfaceScalarField& phir = mesh.lookupObject<surfaceScalarField>("phir"); phiCorr = fvc::flux ( phi, psi, gammaScheme ) + fvc::flux ( -fvc::flux(-phir, scalar(1) - psi, gammarScheme), psi, gammarScheme ) - phiBD; */ } } phiPsi = psiConvectionDiffusion.flux() + lambda*phiCorr; }
tmp<GeometricField<Type, fvPatchField, volMesh>> EulerD2dt2Scheme<Type>::fvcD2dt2 ( const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& vf ) { dimensionedScalar rDeltaT2 = 4.0/sqr(mesh().time().deltaT() + mesh().time().deltaT0()); IOobject d2dt2IOobject ( "d2dt2("+rho.name()+','+vf.name()+')', mesh().time().timeName(), mesh(), IOobject::NO_READ, IOobject::NO_WRITE ); scalar deltaT = mesh().time().deltaTValue(); scalar deltaT0 = mesh().time().deltaT0Value(); scalar coefft = (deltaT + deltaT0)/(2*deltaT); scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0); if (mesh().moving()) { scalar halfRdeltaT2 = 0.5*rDeltaT2.value(); scalar quarterRdeltaT2 = 0.25*rDeltaT2.value(); const scalarField VV0rhoRho0 ( (mesh().V() + mesh().V0()) * (rho.primitiveField() + rho.oldTime().primitiveField()) ); const scalarField V0V00rho0Rho00 ( (mesh().V0() + mesh().V00()) * ( rho.oldTime().primitiveField() + rho.oldTime().oldTime().primitiveField() ) ); return tmp<GeometricField<Type, fvPatchField, volMesh>> ( new GeometricField<Type, fvPatchField, volMesh> ( d2dt2IOobject, mesh(), rDeltaT2.dimensions()*rho.dimensions()*vf.dimensions(), quarterRdeltaT2* ( coefft*VV0rhoRho0*vf.primitiveField() - (coefft*VV0rhoRho0 + coefft00*V0V00rho0Rho00) *vf.oldTime().primitiveField() + (coefft00*V0V00rho0Rho00) *vf.oldTime().oldTime().primitiveField() )/mesh().V(), halfRdeltaT2* ( coefft *(rho.boundaryField() + rho.oldTime().boundaryField()) *vf.boundaryField() - ( coefft *( rho.boundaryField() + rho.oldTime().boundaryField() ) + coefft00 *( rho.oldTime().boundaryField() + rho.oldTime().oldTime().boundaryField() ) )*vf.oldTime().boundaryField() + coefft00 *( rho.oldTime().boundaryField() + rho.oldTime().oldTime().boundaryField() )*vf.oldTime().oldTime().boundaryField() ) ) ); } else { dimensionedScalar halfRdeltaT2 = 0.5*rDeltaT2; const volScalarField rhoRho0(rho + rho.oldTime()); const volScalarField rho0Rho00(rho.oldTime() +rho.oldTime().oldTime()); return tmp<GeometricField<Type, fvPatchField, volMesh>> ( new GeometricField<Type, fvPatchField, volMesh> ( d2dt2IOobject, halfRdeltaT2* ( coefft*rhoRho0*vf - (coefft*rhoRho0 + coefft00*rho0Rho00)*vf.oldTime() + coefft00*rho0Rho00*vf.oldTime().oldTime() ) ) ); } }
void Foam::setRefCell ( const volScalarField& field, const volScalarField& fieldRef, const dictionary& dict, label& refCelli, scalar& refValue, const bool forceReference ) { if (fieldRef.needReference() || forceReference) { word refCellName = field.name() + "RefCell"; word refPointName = field.name() + "RefPoint"; word refValueName = field.name() + "RefValue"; if (dict.found(refCellName)) { if (Pstream::master()) { refCelli = readLabel(dict.lookup(refCellName)); if (refCelli < 0 || refCelli >= field.mesh().nCells()) { FatalIOErrorInFunction ( dict ) << "Illegal master cellID " << refCelli << ". Should be 0.." << field.mesh().nCells() << exit(FatalIOError); } } else { refCelli = -1; } } else if (dict.found(refPointName)) { point refPointi(dict.lookup(refPointName)); // Try fast approximate search avoiding octree construction refCelli = field.mesh().findCell(refPointi, polyMesh::FACE_PLANES); label hasRef = (refCelli >= 0 ? 1 : 0); label sumHasRef = returnReduce<label>(hasRef, sumOp<label>()); // If reference cell no found use octree search // with cell tet-decompositoin if (sumHasRef != 1) { refCelli = field.mesh().findCell(refPointi); hasRef = (refCelli >= 0 ? 1 : 0); sumHasRef = returnReduce<label>(hasRef, sumOp<label>()); } if (sumHasRef != 1) { FatalIOErrorInFunction ( dict ) << "Unable to set reference cell for field " << field.name() << nl << " Reference point " << refPointName << " " << refPointi << " found on " << sumHasRef << " domains (should be one)" << nl << exit(FatalIOError); } } else { FatalIOErrorInFunction ( dict ) << "Unable to set reference cell for field " << field.name() << nl << " Please supply either " << refCellName << " or " << refPointName << nl << exit(FatalIOError); } refValue = readScalar(dict.lookup(refValueName)); } }