Foam::tmp<Foam::fvMatrix<Type> > Foam::fvm::SuSp ( const DimensionedField<scalar, volMesh>& susp, const GeometricField<Type, fvPatchField, volMesh>& vf ) { const fvMesh& mesh = vf.mesh(); tmp<fvMatrix<Type> > tfvm ( new fvMatrix<Type> ( vf, dimVol*susp.dimensions()*vf.dimensions() ) ); fvMatrix<Type>& fvm = tfvm(); fvm.diag() += mesh.V()*max(susp.field(), scalar(0)); fvm.source() -= mesh.V()*min(susp.field(), scalar(0)) *vf.internalField(); return tfvm; }
tmp<fvMatrix<Type>> EulerD2dt2Scheme<Type>::fvmD2dt2 ( const dimensionedScalar& rho, const GeometricField<Type, fvPatchField, volMesh>& vf ) { tmp<fvMatrix<Type>> tfvm ( new fvMatrix<Type> ( vf, rho.dimensions()*vf.dimensions()*dimVol /dimTime/dimTime ) ); fvMatrix<Type>& fvm = tfvm.ref(); scalar deltaT = mesh().time().deltaTValue(); scalar deltaT0 = mesh().time().deltaT0Value(); scalar coefft = (deltaT + deltaT0)/(2*deltaT); scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0); scalar rDeltaT2 = 4.0/sqr(deltaT + deltaT0); if (mesh().moving()) { scalar halfRdeltaT2 = 0.5*rDeltaT2; const scalarField VV0(mesh().V() + mesh().V0()); const scalarField V0V00(mesh().V0() + mesh().V00()); fvm.diag() = rho.value()*(coefft*halfRdeltaT2)*VV0; fvm.source() = halfRdeltaT2*rho.value()* ( (coefft*VV0 + coefft00*V0V00) *vf.oldTime().primitiveField() - (coefft00*V0V00)*vf.oldTime().oldTime().primitiveField() ); } else { fvm.diag() = (coefft*rDeltaT2)*mesh().V()*rho.value(); fvm.source() = rDeltaT2*mesh().V()*rho.value()* ( (coefft + coefft00)*vf.oldTime().primitiveField() - coefft00*vf.oldTime().oldTime().primitiveField() ); } return tfvm; }
tmp<fvMatrix<Type> > EulerLocalDdtScheme<Type>::fvmDdt ( const volScalarField& rho, GeometricField<Type, fvPatchField, volMesh>& vf ) { const objectRegistry& registry = this->mesh(); // get access to the scalar beta[i] const scalarField& beta = registry.lookupObject<scalarField>(deltaTName_); tmp<fvMatrix<Type> > tfvm ( new fvMatrix<Type> ( vf, rho.dimensions()*vf.dimensions()*dimVol/dimTime ) ); fvMatrix<Type>& fvm = tfvm(); scalarField rDeltaT = 1.0/(beta[0]*registry.lookupObject<volScalarField>(deltaTauName_).internalField()); fvm.diag() = rDeltaT*rho.internalField()*mesh().V(); if (mesh().moving()) { fvm.source() = rDeltaT *rho.oldTime().internalField() *vf.oldTime().internalField()*mesh().V0(); } else { fvm.source() = rDeltaT *rho.oldTime().internalField() *vf.oldTime().internalField()*mesh().V(); } return tfvm; }
tmp<fvMatrix<Type> > laplacian ( const tmp<GeometricField<GType, fvsPatchField, surfaceMesh> >& tGamma, GeometricField<Type, fvPatchField, volMesh>& vf ) { tmp<fvMatrix<Type> > tfvm(fvm::laplacian(tGamma(), vf)); tGamma.clear(); return tfvm; }
tmp<fvVectorMatrix> thermocapillaryForce::correct(volVectorField& U) { const volScalarField& sigma = filmModel_.sigma(); tmp<fvVectorMatrix> tfvm(new fvVectorMatrix(U, dimForce/dimArea*dimVolume)); tfvm.ref() += fvc::grad(sigma); return tfvm; }
tmp<fvMatrix<Type> > noConvectionScheme<Type>::fvmDiv ( const surfaceScalarField& faceFlux, GeometricField<Type, fvPatchField, volMesh>& vf ) const { tmp<fvMatrix<Type> > tfvm ( new fvMatrix<Type> ( vf, faceFlux.dimensions()*vf.dimensions() ) ); // Touch diagonal for consistency tfvm().diag() = 0; return tfvm; }
Foam::tmp<Foam::fvMatrix<Type> > Foam::fvm::Sp ( const DimensionedField<scalar, volMesh>& sp, const GeometricField<Type, fvPatchField, volMesh>& vf ) { const fvMesh& mesh = vf.mesh(); tmp<fvMatrix<Type> > tfvm ( new fvMatrix<Type> ( vf, dimVol*sp.dimensions()*vf.dimensions() ) ); fvMatrix<Type>& fvm = tfvm(); fvm.diag() += mesh.V()*sp.field(); return tfvm; }
Foam::tmp<Foam::fvMatrix<Type> > Foam::fvm::Su ( const DimensionedField<Type, volMesh>& su, const GeometricField<Type, fvPatchField, volMesh>& vf ) { const fvMesh& mesh = vf.mesh(); tmp<fvMatrix<Type> > tfvm ( new fvMatrix<Type> ( vf, dimVol*su.dimensions() ) ); fvMatrix<Type>& fvm = tfvm(); fvm.source() -= mesh.V()*su.field(); return tfvm; }
tmp<fvMatrix<Type> > steadyStateDdtScheme<Type>::fvmDdt ( const GeometricField<Type, fvPatchField, volMesh>& vf ) { tmp<fvMatrix<Type> > tfvm ( new fvMatrix<Type> ( vf, vf.dimensions()*dimVol/dimTime ) ); return tfvm; }
tmp<fvMatrix<Type> > steadyStateD2dt2Scheme<Type>::fvmD2dt2 ( const volScalarField& rho, const GeometricField<Type, fvPatchField, volMesh>& vf ) { tmp<fvMatrix<Type> > tfvm ( new fvMatrix<Type> ( vf, rho.dimensions()*vf.dimensions()*dimVol/dimTime/dimTime ) ); return tfvm; }
tmp<fvVectorMatrix> thermocapillaryForce::correct(volVectorField& U) { const volScalarField& sigma = filmModel_.sigma(); const volScalarField& deltaf = filmModel_.delta(); // kvm const dimensionedScalar delta0("d0", dimLength, 1e-4); // kvm tmp<volScalarField> // kvm tRatio(deltaf/delta0); // kvm tRatio->min(1.0); // kvm tmp<fvVectorMatrix> tfvm(new fvVectorMatrix(U, dimForce/dimArea*dimVolume)); // TODO: use estimated surface temperature here instead of mean film temperature tfvm.ref() += fvc::grad(sigma)*tRatio; // kvm if(filmModel_.time().outputTime()){ // kvm // tmp<volVectorField> tGradSigma(fvc::grad(sigma)); // tGradSigma->write(); } // kvm return tfvm; }