diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index dc325c1ddf..14aa39935e 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -287,6 +287,7 @@ $(ddtSchemes)/steadyStateDdtScheme/steadyStateDdtSchemes.C $(ddtSchemes)/EulerDdtScheme/EulerDdtSchemes.C $(ddtSchemes)/CoEulerDdtScheme/CoEulerDdtSchemes.C $(ddtSchemes)/SLTSDdtScheme/SLTSDdtSchemes.C +$(ddtSchemes)/localEulerDdtScheme/localEulerDdtSchemes.C $(ddtSchemes)/backwardDdtScheme/backwardDdtSchemes.C $(ddtSchemes)/boundedBackwardDdtScheme/boundedBackwardDdtScheme.C $(ddtSchemes)/boundedBackwardDdtScheme/boundedBackwardDdtSchemes.C diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/localEulerDdtScheme/localEulerDdtScheme.C b/src/finiteVolume/finiteVolume/ddtSchemes/localEulerDdtScheme/localEulerDdtScheme.C new file mode 100644 index 0000000000..b0e2f9bb11 --- /dev/null +++ b/src/finiteVolume/finiteVolume/ddtSchemes/localEulerDdtScheme/localEulerDdtScheme.C @@ -0,0 +1,584 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "localEulerDdtScheme.H" +#include "surfaceInterpolate.H" +#include "fvMatrices.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace fv +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template +const volScalarField& localEulerDdtScheme::localRDeltaT() const +{ + return mesh().objectRegistry::lookupObject(rDeltaTName_); +} + + +template +tmp > +localEulerDdtScheme::fvcDdt +( + const dimensioned& dt +) +{ + const volScalarField& rDeltaT = localRDeltaT(); + + IOobject ddtIOobject + ( + "ddt(" + dt.name() + ')', + mesh().time().timeName(), + mesh() + ); + + if (mesh().moving()) + { + tmp > tdtdt + ( + new GeometricField + ( + ddtIOobject, + mesh(), + dimensioned + ( + "0", + dt.dimensions()/dimTime, + pTraits::zero + ) + ) + ); + + tdtdt().internalField() = + rDeltaT.internalField()*dt.value()*(1.0 - mesh().V0()/mesh().V()); + + return tdtdt; + } + else + { + return tmp > + ( + new GeometricField + ( + ddtIOobject, + mesh(), + dimensioned + ( + "0", + dt.dimensions()/dimTime, + pTraits::zero + ), + calculatedFvPatchField::typeName + ) + ); + } +} + + +template +tmp > +localEulerDdtScheme::fvcDdt +( + const GeometricField& vf +) +{ + const volScalarField& rDeltaT = localRDeltaT(); + + IOobject ddtIOobject + ( + "ddt(" + vf.name() + ')', + mesh().time().timeName(), + mesh() + ); + + if (mesh().moving()) + { + return tmp > + ( + new GeometricField + ( + ddtIOobject, + mesh(), + rDeltaT.dimensions()*vf.dimensions(), + rDeltaT.internalField()* + ( + vf.internalField() + - vf.oldTime().internalField()*mesh().V0()/mesh().V() + ), + rDeltaT.boundaryField()* + ( + vf.boundaryField() - vf.oldTime().boundaryField() + ) + ) + ); + } + else + { + return tmp > + ( + new GeometricField + ( + ddtIOobject, + rDeltaT*(vf - vf.oldTime()) + ) + ); + } +} + + +template +tmp > +localEulerDdtScheme::fvcDdt +( + const dimensionedScalar& rho, + const GeometricField& vf +) +{ + const volScalarField& rDeltaT = localRDeltaT(); + + IOobject ddtIOobject + ( + "ddt(" + rho.name() + ',' + vf.name() + ')', + mesh().time().timeName(), + mesh() + ); + + if (mesh().moving()) + { + return tmp > + ( + new GeometricField + ( + ddtIOobject, + mesh(), + rDeltaT.dimensions()*rho.dimensions()*vf.dimensions(), + rDeltaT.internalField()*rho.value()* + ( + vf.internalField() + - vf.oldTime().internalField()*mesh().V0()/mesh().V() + ), + rDeltaT.boundaryField()*rho.value()* + ( + vf.boundaryField() - vf.oldTime().boundaryField() + ) + ) + ); + } + else + { + return tmp > + ( + new GeometricField + ( + ddtIOobject, + rDeltaT*rho*(vf - vf.oldTime()) + ) + ); + } +} + + +template +tmp > +localEulerDdtScheme::fvcDdt +( + const volScalarField& rho, + const GeometricField& vf +) +{ + const volScalarField& rDeltaT = localRDeltaT(); + + IOobject ddtIOobject + ( + "ddt(" + rho.name() + ',' + vf.name() + ')', + mesh().time().timeName(), + mesh() + ); + + if (mesh().moving()) + { + return tmp > + ( + new GeometricField + ( + 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 > + ( + new GeometricField + ( + ddtIOobject, + rDeltaT*(rho*vf - rho.oldTime()*vf.oldTime()) + ) + ); + } +} + + +template +tmp > +localEulerDdtScheme::fvmDdt +( + const GeometricField& vf +) +{ + tmp > tfvm + ( + new fvMatrix + ( + vf, + vf.dimensions()*dimVol/dimTime + ) + ); + + fvMatrix& fvm = tfvm(); + + const scalarField& rDeltaT = localRDeltaT().internalField(); + + fvm.diag() = rDeltaT*mesh().V(); + + if (mesh().moving()) + { + fvm.source() = rDeltaT*vf.oldTime().internalField()*mesh().V0(); + } + else + { + fvm.source() = rDeltaT*vf.oldTime().internalField()*mesh().V(); + } + + return tfvm; +} + + +template +tmp > +localEulerDdtScheme::fvmDdt +( + const dimensionedScalar& rho, + const GeometricField& vf +) +{ + tmp > tfvm + ( + new fvMatrix + ( + vf, + rho.dimensions()*vf.dimensions()*dimVol/dimTime + ) + ); + fvMatrix& fvm = tfvm(); + + const scalarField& rDeltaT = localRDeltaT().internalField(); + + fvm.diag() = rDeltaT*rho.value()*mesh().V(); + + if (mesh().moving()) + { + fvm.source() = rDeltaT + *rho.value()*vf.oldTime().internalField()*mesh().V0(); + } + else + { + fvm.source() = rDeltaT + *rho.value()*vf.oldTime().internalField()*mesh().V(); + } + + return tfvm; +} + + +template +tmp > +localEulerDdtScheme::fvmDdt +( + const volScalarField& rho, + const GeometricField& vf +) +{ + tmp > tfvm + ( + new fvMatrix + ( + vf, + rho.dimensions()*vf.dimensions()*dimVol/dimTime + ) + ); + fvMatrix& fvm = tfvm(); + + const scalarField& rDeltaT = localRDeltaT().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; +} + + +template +tmp::fluxFieldType> +localEulerDdtScheme::fvcDdtPhiCorr +( + const volScalarField& rA, + const GeometricField& U, + const fluxFieldType& phi +) +{ + IOobject ddtIOobject + ( + "ddtPhiCorr(" + rA.name() + ',' + U.name() + ',' + phi.name() + ')', + mesh().time().timeName(), + mesh() + ); + + if (mesh().moving()) + { + return tmp + ( + new fluxFieldType + ( + ddtIOobject, + mesh(), + dimensioned::type> + ( + "0", + rA.dimensions()*phi.dimensions()/dimTime, + pTraits::type>::zero + ) + ) + ); + } + else + { + const volScalarField& rDeltaT = localRDeltaT(); + + return tmp + ( + new fluxFieldType + ( + ddtIOobject, + fvcDdtPhiCoeff(U.oldTime(), phi.oldTime())* + ( + fvc::interpolate(rDeltaT*rA)*phi.oldTime() + - (fvc::interpolate(rDeltaT*rA*U.oldTime()) & mesh().Sf()) + ) + ) + ); + } +} + + +template +tmp::fluxFieldType> +localEulerDdtScheme::fvcDdtPhiCorr +( + const volScalarField& rA, + const volScalarField& rho, + const GeometricField& U, + const fluxFieldType& phi +) +{ + IOobject ddtIOobject + ( + "ddtPhiCorr(" + + rA.name() + ',' + rho.name() + ',' + U.name() + ',' + phi.name() + ')', + mesh().time().timeName(), + mesh() + ); + + if (mesh().moving()) + { + return tmp + ( + new fluxFieldType + ( + ddtIOobject, + mesh(), + dimensioned::type> + ( + "0", + rA.dimensions()*rho.dimensions()*phi.dimensions()/dimTime, + pTraits::type>::zero + ) + ) + ); + } + else + { + const volScalarField& rDeltaT = localRDeltaT(); + + if + ( + U.dimensions() == dimVelocity + && phi.dimensions() == dimVelocity*dimArea + ) + { + return tmp + ( + 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 + ( + 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 + ( + 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 + ( + "localEulerDdtScheme::fvcDdtPhiCorr" + ) << "dimensions of phi are not correct" + << abort(FatalError); + + return fluxFieldType::null(); + } + } +} + + +template +tmp localEulerDdtScheme::meshPhi +( + const GeometricField& +) +{ + return tmp + ( + new surfaceScalarField + ( + IOobject + ( + "meshPhi", + mesh().time().timeName(), + mesh() + ), + mesh(), + dimensionedScalar("0", dimVolume/dimTime, 0.0) + ) + ); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fv + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/localEulerDdtScheme/localEulerDdtScheme.H b/src/finiteVolume/finiteVolume/ddtSchemes/localEulerDdtScheme/localEulerDdtScheme.H new file mode 100644 index 0000000000..bb3f2187fe --- /dev/null +++ b/src/finiteVolume/finiteVolume/ddtSchemes/localEulerDdtScheme/localEulerDdtScheme.H @@ -0,0 +1,210 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +Class + Foam::fv::localEulerDdtScheme + +Description + Local time-step first-order Euler implicit/explicit ddt. + The reciprocal of the local time-step field is looked-up from the + database with the name provided. + + This scheme should only be used for steady-state computations + using transient codes where local time-stepping is preferably to + under-relaxation for transport consistency reasons. + + See also CoEulerDdtScheme. + +SourceFiles + localEulerDdtScheme.C + localEulerDdtSchemes.C + +\*---------------------------------------------------------------------------*/ + +#ifndef localEulerDdtScheme_H +#define localEulerDdtScheme_H + +#include "ddtScheme.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace fv +{ + +/*---------------------------------------------------------------------------*\ + Class localEulerDdtScheme Declaration +\*---------------------------------------------------------------------------*/ + +template +class localEulerDdtScheme +: + public fv::ddtScheme +{ + // Private Data + + //- Name of the reciprocal local time-step field + word rDeltaTName_; + + + // Private Member Functions + + //- Disallow default bitwise copy construct + localEulerDdtScheme(const localEulerDdtScheme&); + + //- Disallow default bitwise assignment + void operator=(const localEulerDdtScheme&); + + //- Return the reciprocal of the local time-step + const volScalarField& localRDeltaT() const; + + +public: + + //- Runtime type information + TypeName("localEuler"); + + + // Constructors + + //- Construct from mesh and Istream + localEulerDdtScheme(const fvMesh& mesh, Istream& is) + : + ddtScheme(mesh, is), + rDeltaTName_(is) + {} + + + // Member Functions + + //- Return mesh reference + const fvMesh& mesh() const + { + return fv::ddtScheme::mesh(); + } + + tmp > fvcDdt + ( + const dimensioned& + ); + + tmp > fvcDdt + ( + const GeometricField& + ); + + tmp > fvcDdt + ( + const dimensionedScalar&, + const GeometricField& + ); + + tmp > fvcDdt + ( + const volScalarField&, + const GeometricField& + ); + + tmp > fvmDdt + ( + const GeometricField& + ); + + tmp > fvmDdt + ( + const dimensionedScalar&, + const GeometricField& + ); + + tmp > fvmDdt + ( + const volScalarField&, + const GeometricField& + ); + + typedef typename ddtScheme::fluxFieldType fluxFieldType; + + tmp fvcDdtPhiCorr + ( + const volScalarField& rA, + const GeometricField& U, + const fluxFieldType& phi + ); + + tmp fvcDdtPhiCorr + ( + const volScalarField& rA, + const volScalarField& rho, + const GeometricField& U, + const fluxFieldType& phi + ); + + tmp meshPhi + ( + const GeometricField& + ); +}; + + +template<> +tmp localEulerDdtScheme::fvcDdtPhiCorr +( + const volScalarField& rA, + const volScalarField& U, + const surfaceScalarField& phi +); + + +template<> +tmp localEulerDdtScheme::fvcDdtPhiCorr +( + const volScalarField& rA, + const volScalarField& rho, + const volScalarField& U, + const surfaceScalarField& phi +); + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fv + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "localEulerDdtScheme.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/localEulerDdtScheme/localEulerDdtSchemes.C b/src/finiteVolume/finiteVolume/ddtSchemes/localEulerDdtScheme/localEulerDdtSchemes.C new file mode 100644 index 0000000000..53f12e5b7e --- /dev/null +++ b/src/finiteVolume/finiteVolume/ddtSchemes/localEulerDdtScheme/localEulerDdtSchemes.C @@ -0,0 +1,39 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2010 OpenCFD Ltd. + \\/ M anipulation | +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see . + +\*---------------------------------------------------------------------------*/ + +#include "localEulerDdtScheme.H" +#include "fvMesh.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +namespace fv +{ + makeFvDdtScheme(localEulerDdtScheme) +} +} + +// ************************************************************************* //