diff --git a/src/finiteArea/Make/files b/src/finiteArea/Make/files index ada1c980cd..44a1db2be5 100644 --- a/src/finiteArea/Make/files +++ b/src/finiteArea/Make/files @@ -92,6 +92,10 @@ $(ddtSchemes)/EulerFaDdtScheme/EulerFaDdtSchemes.C $(ddtSchemes)/backwardFaDdtScheme/backwardFaDdtSchemes.C $(ddtSchemes)/boundedBackwardFaDdtScheme/boundedBackwardFaDdtScheme.C +d2dt2Schemes = finiteArea/d2dt2Schemes +$(d2dt2Schemes)/faD2dt2Scheme/faD2dt2Schemes.C +$(d2dt2Schemes)/EulerFaD2dt2Scheme/EulerFaD2dt2Schemes.C + divSchemes = finiteArea/divSchemes finiteArea/fam/vectorFamDiv.C $(divSchemes)/faDivScheme/faDivSchemes.C diff --git a/src/finiteArea/finiteArea/d2dt2Schemes/EulerFaD2dt2Scheme/EulerFaD2dt2Scheme.C b/src/finiteArea/finiteArea/d2dt2Schemes/EulerFaD2dt2Scheme/EulerFaD2dt2Scheme.C new file mode 100644 index 0000000000..07e0c169fd --- /dev/null +++ b/src/finiteArea/finiteArea/d2dt2Schemes/EulerFaD2dt2Scheme/EulerFaD2dt2Scheme.C @@ -0,0 +1,627 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | + \\/ M anipulation | +------------------------------------------------------------------------------- + | Copyright (C) 2017 Volkswagen AG +------------------------------------------------------------------------------- +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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "EulerFaD2dt2Scheme.H" +#include "facDiv.H" +#include "faMatrices.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace fa +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template +scalar EulerFaD2dt2Scheme::deltaT_() const +{ + return mesh().time().deltaT().value(); +} + + +template +scalar EulerFaD2dt2Scheme::deltaT0_() const +{ + return mesh().time().deltaT0().value(); +} + + +template +tmp> +EulerFaD2dt2Scheme::facD2dt2 +( + const dimensioned dt +) +{ + + scalar deltaT = deltaT_(); + scalar deltaT0 = deltaT0_(); + + dimensionedScalar rDeltaT2 = + 4.0/sqr(mesh().time().deltaT() + mesh().time().deltaT0()); + + scalar coefft = (deltaT + deltaT0)/(2*deltaT); + scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0); + + IOobject d2dt2IOobject + ( + "d2dt2("+dt.name()+')', + mesh()().time().timeName(), + mesh()(), + IOobject::NO_READ, + IOobject::NO_WRITE + ); + + if (mesh().moving()) + { + scalar halfRdeltaT2 = rDeltaT2.value()/2.0; + + scalarField SS0 = mesh().S() + mesh().S0(); + scalarField S0S00 = mesh().S0() + mesh().S00(); + + tmp > tdt2dt2 + ( + new GeometricField + ( + d2dt2IOobject, + mesh(), + dimensioned + ( + "0", + dt.dimensions()/dimTime/dimTime, + pTraits::zero + ) + ) + ); + + tdt2dt2.ref().primitiveFieldRef() = + halfRdeltaT2*dt.value() + *(coefft*SS0 - (coefft*SS0 + coefft00*S0S00) + coefft00*S0S00) + /mesh().S(); + + return tdt2dt2; + } + else + { + return tmp > + ( + new GeometricField + ( + d2dt2IOobject, + mesh(), + dimensioned + ( + "0", + dt.dimensions()/dimTime/dimTime, + pTraits::zero + ), + calculatedFaPatchField::typeName + ) + ); + } +} + + +template +tmp> +EulerFaD2dt2Scheme::facD2dt2 +( + const GeometricField& vf +) +{ + dimensionedScalar rDeltaT2 = + 4.0/sqr(mesh().time().deltaT() + mesh().time().deltaT0()); + + IOobject d2dt2IOobject + ( + "d2dt2("+vf.name()+')', + mesh()().time().timeName(), + mesh()(), + IOobject::NO_READ, + IOobject::NO_WRITE + ); + + scalar deltaT = deltaT_(); + scalar deltaT0 = deltaT0_(); + + scalar coefft = (deltaT + deltaT0)/(2*deltaT); + scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0); + scalar coefft0 = coefft + coefft00; + + if (mesh().moving()) + { + scalar halfRdeltaT2 = rDeltaT2.value()/2.0; + + scalarField SS0 = mesh().S() + mesh().S0(); + scalarField S0S00 = mesh().S0() + mesh().S00(); + + return tmp > + ( + new GeometricField + ( + d2dt2IOobject, + mesh(), + rDeltaT2.dimensions()*vf.dimensions(), + halfRdeltaT2* + ( + coefft*SS0*vf.primitiveField() + + - (coefft*SS0 + coefft00*S0S00) + *vf.oldTime().primitiveField() + + + (coefft00*S0S00)*vf.oldTime().oldTime().primitiveField() + )/mesh().S(), + rDeltaT2.value()* + ( + coefft*vf.boundaryField() + - coefft0*vf.oldTime().boundaryField() + + coefft00*vf.oldTime().oldTime().boundaryField() + ) + ) + ); + } + else + { + return tmp > + ( + new GeometricField + ( + d2dt2IOobject, + rDeltaT2* + ( + coefft*vf + - coefft0*vf.oldTime() + + coefft00*vf.oldTime().oldTime() + ) + ) + ); + } +} + + +template +tmp> +EulerFaD2dt2Scheme::facD2dt2 +( + const dimensionedScalar& rho, + const GeometricField& 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 = deltaT_(); + scalar deltaT0 = deltaT0_(); + + scalar coefft = (deltaT + deltaT0)/(2*deltaT); + scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0); + scalar coefft0 = coefft + coefft00; + + if (mesh().moving()) + { + scalar halfRdeltaT2 = 0.5*rDeltaT2.value(); + + scalarField SS0rhoRho0 = + (mesh().S() + mesh().S0()) + *rho.value(); + + scalarField S0S00rho0Rho00 = + (mesh().S0() + mesh().S00()) + *rho.value(); + + return tmp > + ( + new GeometricField + ( + d2dt2IOobject, + mesh(), + rDeltaT2.dimensions()*rho.dimensions()*vf.dimensions(), + halfRdeltaT2* + ( + coefft*SS0rhoRho0*vf.primitiveField() + + - (coefft*SS0rhoRho0 + coefft00*S0S00rho0Rho00) + *vf.oldTime().primitiveField() + + + (coefft00*S0S00rho0Rho00) + *vf.oldTime().oldTime().primitiveField() + )/mesh().S(), + rDeltaT2.value()*rho.value()* + ( + coefft*vf.boundaryField() + - coefft0*vf.oldTime().boundaryField() + + coefft00*vf.oldTime().oldTime().boundaryField() + ) + ) + ); + } + else + { + + return tmp > + ( + new GeometricField + ( + d2dt2IOobject, + rDeltaT2 * rho.value() * + ( + coefft*vf + - coefft0*vf.oldTime() + + coefft00*vf.oldTime().oldTime() + ) + ) + ); + } +} + + +template +tmp> +EulerFaD2dt2Scheme::facD2dt2 +( + const areaScalarField& rho, + const GeometricField& 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 = deltaT_(); + scalar deltaT0 = deltaT0_(); + + 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(); + + scalarField SS0rhoRho0 + ( + (mesh().S() + mesh().S0()) + *(rho.primitiveField() + rho.oldTime().primitiveField()) + ); + + scalarField S0S00rho0Rho00 + ( + (mesh().S0() + mesh().S00()) + *( + rho.oldTime().primitiveField() + + rho.oldTime().oldTime().primitiveField() + ) + ); + + return tmp > + ( + new GeometricField + ( + d2dt2IOobject, + mesh(), + rDeltaT2.dimensions()*rho.dimensions()*vf.dimensions(), + quarterRdeltaT2* + ( + coefft*SS0rhoRho0*vf.primitiveField() + + - (coefft*SS0rhoRho0 + coefft00*S0S00rho0Rho00) + *vf.oldTime().primitiveField() + + + (coefft00*S0S00rho0Rho00) + *vf.oldTime().oldTime().primitiveField() + )/mesh().S(), + 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; + + areaScalarField rhoRho0(rho + rho.oldTime()); + areaScalarField rho0Rho00(rho.oldTime() + rho.oldTime().oldTime()); + + return tmp > + ( + new GeometricField + ( + d2dt2IOobject, + halfRdeltaT2* + ( + coefft*rhoRho0*vf + - (coefft*rhoRho0 + coefft00*rho0Rho00)*vf.oldTime() + + coefft00*rho0Rho00*vf.oldTime().oldTime() + ) + ) + ); + } +} + + +template +tmp> +EulerFaD2dt2Scheme::famD2dt2 +( + const GeometricField& vf +) +{ + tmp > tfam + ( + new faMatrix + ( + vf, + vf.dimensions()*dimArea/dimTime/dimTime + ) + ); + + faMatrix& fam = tfam.ref(); + + scalar deltaT = deltaT_(); + scalar deltaT0 = deltaT0_(); + + scalar coefft = (deltaT + deltaT0)/(2*deltaT); + scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0); + scalar coefft0 = coefft + coefft00; + + scalar rDeltaT2 = 4.0/sqr(deltaT + deltaT0); + + if (mesh().moving()) + { + scalar halfRdeltaT2 = rDeltaT2/2.0; + + scalarField SS0(mesh().S() + mesh().S0()); + scalarField S0S00(mesh().S0() + mesh().S00()); + + fam.diag() = (coefft*halfRdeltaT2)*SS0; + + fam.source() = halfRdeltaT2* + ( + (coefft*SS0 + coefft00*S0S00) + *vf.oldTime().primitiveField() + + - (coefft00*S0S00)*vf.oldTime().oldTime().primitiveField() + ); + } + else + { + fam.diag() = (coefft*rDeltaT2)*mesh().S(); + + fam.source() = rDeltaT2*mesh().S()* + ( + coefft0*vf.oldTime().primitiveField() + - coefft00*vf.oldTime().oldTime().primitiveField() + ); + } + + return tfam; +} + + +template +tmp > +EulerFaD2dt2Scheme::famD2dt2 +( + const dimensionedScalar& rho, + const GeometricField& vf +) +{ + tmp > tfam + ( + new faMatrix + ( + vf, + rho.dimensions()*vf.dimensions()*dimArea + /dimTime/dimTime + ) + ); + + faMatrix& fam = tfam.ref(); + + scalar deltaT = deltaT_(); + scalar deltaT0 = deltaT0_(); + + 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; + + scalarField SS0(mesh().S() + mesh().S0()); + + scalarField S0S00(mesh().S0() + mesh().S00()); + + fam.diag() = rho.value()*(coefft*halfRdeltaT2)*SS0; + + fam.source() = halfRdeltaT2*rho.value()* + ( + (coefft*SS0 + coefft00*S0S00) + *vf.oldTime().primitiveField() + + - (coefft00*S0S00)*vf.oldTime().oldTime().primitiveField() + ); + } + else + { + fam.diag() = (coefft*rDeltaT2)*mesh().S()*rho.value(); + + fam.source() = rDeltaT2*mesh().S()*rho.value()* + ( + (coefft + coefft00)*vf.oldTime().primitiveField() + - coefft00*vf.oldTime().oldTime().primitiveField() + ); + } + + return tfam; +} + + +template +tmp> +EulerFaD2dt2Scheme::famD2dt2 +( + const areaScalarField& rho, + const GeometricField& vf +) +{ + tmp > tfam + ( + new faMatrix + ( + vf, + rho.dimensions()*vf.dimensions()*dimArea/dimTime/dimTime + ) + ); + faMatrix& fam = tfam.ref(); + + scalar deltaT =deltaT_(); + scalar deltaT0 = deltaT0_(); + + scalar coefft = (deltaT + deltaT0)/(2*deltaT); + scalar coefft00 = (deltaT + deltaT0)/(2*deltaT0); + + scalar rDeltaT2 = 4.0/sqr(deltaT + deltaT0); + + if (mesh().moving()) + { + scalar quarterRdeltaT2 = 0.25*rDeltaT2; + + scalarField SS0rhoRho0 + ( + (mesh().S() + mesh().S0()) + *(rho.primitiveField() + rho.oldTime().primitiveField()) + ); + + scalarField S0S00rho0Rho00 + ( + (mesh().S0() + mesh().S00()) + *( + rho.oldTime().primitiveField() + + rho.oldTime().oldTime().primitiveField() + ) + ); + + fam.diag() = (coefft*quarterRdeltaT2)*SS0rhoRho0; + + fam.source() = quarterRdeltaT2* + ( + (coefft*SS0rhoRho0 + coefft00*S0S00rho0Rho00) + *vf.oldTime().primitiveField() + + - (coefft00*S0S00rho0Rho00) + *vf.oldTime().oldTime().primitiveField() + ); + } + else + { + scalar halfRdeltaT2 = 0.5*rDeltaT2; + + scalarField rhoRho0 + ( + rho.primitiveField() + rho.oldTime().primitiveField() + ); + + scalarField rho0Rho00 + ( + rho.oldTime().primitiveField() + + rho.oldTime().oldTime().primitiveField() + ); + + fam.diag() = (coefft*halfRdeltaT2)*mesh().S()*rhoRho0; + + fam.source() = halfRdeltaT2*mesh().S()* + ( + (coefft*rhoRho0 + coefft00*rho0Rho00) + *vf.oldTime().primitiveField() + + - (coefft00*rho0Rho00) + *vf.oldTime().oldTime().primitiveField() + ); + } + + return tfam; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteArea/finiteArea/d2dt2Schemes/EulerFaD2dt2Scheme/EulerFaD2dt2Scheme.H b/src/finiteArea/finiteArea/d2dt2Schemes/EulerFaD2dt2Scheme/EulerFaD2dt2Scheme.H new file mode 100644 index 0000000000..8f026fe2b8 --- /dev/null +++ b/src/finiteArea/finiteArea/d2dt2Schemes/EulerFaD2dt2Scheme/EulerFaD2dt2Scheme.H @@ -0,0 +1,166 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | + \\/ M anipulation | +------------------------------------------------------------------------------- + | Copyright (C) 2017 Volkswagen AG +------------------------------------------------------------------------------- +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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::fa::EulerFaD2dt2Scheme + +Description + First-order Euler implicit d2dt2 using the current and two previous + time-step values. + +SourceFiles + EulerFaD2dt2Scheme.C + +\*---------------------------------------------------------------------------*/ + +#ifndef EulerFaD2dt2Scheme_H +#define EulerFaD2dt2Scheme_H + +#include "faD2dt2Scheme.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace fa +{ + +/*---------------------------------------------------------------------------*\ + Class EulerD2dt2Scheme Declaration +\*---------------------------------------------------------------------------*/ + +template +class EulerFaD2dt2Scheme +: + public fa::faD2dt2Scheme +{ + // Private Member Functions + + //- Return the current time-step + scalar deltaT_() const; + + //- Return the previous time-step + scalar deltaT0_() const; + + //- Disallow default bitwise copy construct + EulerFaD2dt2Scheme(const EulerFaD2dt2Scheme&); + + //- Disallow default bitwise assignment + void operator=(const EulerFaD2dt2Scheme&); + + +public: + + //- Runtime type information + TypeName("Euler"); + + + // Constructors + + //- Construct from mesh + EulerFaD2dt2Scheme(const faMesh& mesh) + : + faD2dt2Scheme(mesh) + {} + + //- Construct from mesh and Istream + EulerFaD2dt2Scheme(const faMesh& mesh, Istream& is) + : + faD2dt2Scheme(mesh, is) + {} + + + // Member Functions + + //- Return mesh reference + const faMesh& mesh() const + { + return fa::faD2dt2Scheme::mesh(); + } + + tmp > facD2dt2 + ( + const dimensioned + ); + + tmp > facD2dt2 + ( + const GeometricField& + ); + + tmp > facD2dt2 + ( + const dimensionedScalar&, + const GeometricField& + ); + + tmp > facD2dt2 + ( + const areaScalarField&, + const GeometricField& + ); + + tmp > famD2dt2 + ( + const GeometricField& + ); + + tmp > famD2dt2 + ( + const dimensionedScalar&, + const GeometricField& + ); + + tmp > famD2dt2 + ( + const areaScalarField&, + const GeometricField& + ); +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "EulerFaD2dt2Scheme.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteArea/finiteArea/d2dt2Schemes/EulerFaD2dt2Scheme/EulerFaD2dt2Schemes.C b/src/finiteArea/finiteArea/d2dt2Schemes/EulerFaD2dt2Scheme/EulerFaD2dt2Schemes.C new file mode 100644 index 0000000000..17fab64c79 --- /dev/null +++ b/src/finiteArea/finiteArea/d2dt2Schemes/EulerFaD2dt2Scheme/EulerFaD2dt2Schemes.C @@ -0,0 +1,36 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | + \\/ M anipulation | +------------------------------------------------------------------------------- + | Copyright (C) 2017 Volkswagen AG +------------------------------------------------------------------------------- +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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "EulerFaD2dt2Scheme.H" +#include "faMesh.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +makeFaD2dt2Scheme(EulerFaD2dt2Scheme) + +// ************************************************************************* // diff --git a/src/finiteArea/finiteArea/d2dt2Schemes/faD2dt2Scheme/faD2dt2Scheme.C b/src/finiteArea/finiteArea/d2dt2Schemes/faD2dt2Scheme/faD2dt2Scheme.C new file mode 100644 index 0000000000..b425bfd0b0 --- /dev/null +++ b/src/finiteArea/finiteArea/d2dt2Schemes/faD2dt2Scheme/faD2dt2Scheme.C @@ -0,0 +1,101 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | + \\/ M anipulation | +------------------------------------------------------------------------------- + | Copyright (C) 2017 Volkswagen AG +------------------------------------------------------------------------------- +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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Description + Abstract base class for finite area d2dt2 schemes. + +\*---------------------------------------------------------------------------*/ + +#include "fa.H" +#include "HashTable.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace fa +{ + +// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * // + +template +tmp > faD2dt2Scheme::New +( + const faMesh& mesh, + Istream& schemeData +) +{ + if (fa::debug) + { + InfoInFunction << "constructing faD2dt2Scheme" + << endl; + } + + if (schemeData.eof()) + { + FatalIOErrorInFunction(schemeData) + << "faD2dt2 scheme not specified" << nl << nl + << "Valid faD2dt2 schemes are :" << endl + << IstreamConstructorTablePtr_->sortedToc() + << exit(FatalIOError); + } + + const word schemeName(schemeData); + + auto cstrIter = IstreamConstructorTablePtr_->cfind(schemeName); + + if (!cstrIter.found()) + { + FatalIOErrorInFunction(schemeData) + << "Unknown d2dt2 scheme " << schemeName << nl << nl + << "Valid d2dt2 schemes are :" << endl + << IstreamConstructorTablePtr_->sortedToc() + << exit(FatalIOError); + } + + return cstrIter()(mesh, schemeData); +} + + +// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * // + +template +faD2dt2Scheme::~faD2dt2Scheme() +{} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteArea/finiteArea/d2dt2Schemes/faD2dt2Scheme/faD2dt2Scheme.H b/src/finiteArea/finiteArea/d2dt2Schemes/faD2dt2Scheme/faD2dt2Scheme.H new file mode 100644 index 0000000000..c7c062eaa9 --- /dev/null +++ b/src/finiteArea/finiteArea/d2dt2Schemes/faD2dt2Scheme/faD2dt2Scheme.H @@ -0,0 +1,228 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | + \\/ M anipulation | +------------------------------------------------------------------------------- + | Copyright (C) 2017 Volkswagen AG +------------------------------------------------------------------------------- +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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Class + Foam::fa::faD2dt2Scheme + +Description + Abstract base class for d2dt2 schemes. + +SourceFiles + faD2dt2Scheme.C + +\*---------------------------------------------------------------------------*/ + +#ifndef faD2dt2Scheme_H +#define faD2dt2Scheme_H + +#include "tmp.H" +#include "dimensionedType.H" +#include "areaFieldsFwd.H" +#include "edgeFieldsFwd.H" +#include "typeInfo.H" +#include "runTimeSelectionTables.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +template +class faMatrix; + +class faMesh; + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace fa +{ + +/*---------------------------------------------------------------------------*\ + Class faD2dt2Scheme Declaration +\*---------------------------------------------------------------------------*/ + +template +class faD2dt2Scheme +: + public refCount +{ + +protected: + + // Protected data + + const faMesh& mesh_; + + + // Private Member Functions + + //- Disallow copy construct + faD2dt2Scheme(const faD2dt2Scheme&); + + //- Disallow default bitwise assignment + void operator=(const faD2dt2Scheme&); + + +public: + + //- Runtime type information + virtual const word& type() const = 0; + + + // Declare run-time constructor selection tables + + declareRunTimeSelectionTable + ( + tmp, + faD2dt2Scheme, + Istream, + (const faMesh& mesh, Istream& schemeData), + (mesh, schemeData) + ); + + + // Constructors + + //- Construct from mesh + faD2dt2Scheme(const faMesh& mesh) + : + mesh_(mesh) + {} + + //- Construct from mesh and Istream + faD2dt2Scheme(const faMesh& mesh, Istream&) + : + mesh_(mesh) + {} + + + // Selectors + + //- Return a pointer to a new d2dt2Scheme created on freestore + static tmp > New + ( + const faMesh& mesh, + Istream& schemeData + ); + + + //- Destructor + virtual ~faD2dt2Scheme(); + + + // Member Functions + + //- Return mesh reference + const faMesh& mesh() const + { + return mesh_; + } + + virtual tmp > facD2dt2 + ( + const dimensioned + ) = 0; + + virtual tmp > facD2dt2 + ( + const GeometricField& + ) = 0; + + virtual tmp > facD2dt2 + ( + const dimensionedScalar&, + const GeometricField& + ) = 0; + + virtual tmp > facD2dt2 + ( + const areaScalarField&, + const GeometricField& + ) = 0; + + virtual tmp > famD2dt2 + ( + const GeometricField& + ) = 0; + + virtual tmp > famD2dt2 + ( + const dimensionedScalar&, + const GeometricField& + ) = 0; + + virtual tmp > famD2dt2 + ( + const areaScalarField&, + const GeometricField& + ) = 0; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +// Add the patch constructor functions to the hash tables + +#define makeFaD2dt2TypeScheme(SS, Type) \ + \ + defineNamedTemplateTypeNameAndDebug(Foam::fa::SS, 0); \ + \ + namespace Foam \ + { \ + namespace fa \ + { \ + faD2dt2Scheme::addIstreamConstructorToTable > \ + add##SS##Type##IstreamConstructorToTable_; \ + } \ + } + + +#define makeFaD2dt2Scheme(SS) \ + \ +makeFaD2dt2TypeScheme(SS, scalar) \ +makeFaD2dt2TypeScheme(SS, vector) \ +makeFaD2dt2TypeScheme(SS, tensor) + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "faD2dt2Scheme.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteArea/finiteArea/d2dt2Schemes/faD2dt2Scheme/faD2dt2Schemes.C b/src/finiteArea/finiteArea/d2dt2Schemes/faD2dt2Scheme/faD2dt2Schemes.C new file mode 100644 index 0000000000..618494ec5a --- /dev/null +++ b/src/finiteArea/finiteArea/d2dt2Schemes/faD2dt2Scheme/faD2dt2Schemes.C @@ -0,0 +1,69 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | + \\/ M anipulation | +------------------------------------------------------------------------------- + | Copyright (C) 2017 Volkswagen AG +------------------------------------------------------------------------------- +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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "faD2dt2Scheme.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace fa +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +defineTemplateRunTimeSelectionTable +( + faD2dt2Scheme, + Istream +); + +defineTemplateRunTimeSelectionTable +( + faD2dt2Scheme, + Istream +); + +defineTemplateRunTimeSelectionTable +( + faD2dt2Scheme, + Istream +); + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fa + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteArea/finiteArea/fac/fac.H b/src/finiteArea/finiteArea/fac/fac.H index 095335603b..7f6de93b78 100644 --- a/src/finiteArea/finiteArea/fac/fac.H +++ b/src/finiteArea/finiteArea/fac/fac.H @@ -42,6 +42,7 @@ Description #include "facAverage.H" #include "facLnGrad.H" #include "facDdt.H" +#include "facD2dt2.H" #include "facNGrad.H" #include "facNDiv.H" diff --git a/src/finiteArea/finiteArea/fac/facD2dt2.C b/src/finiteArea/finiteArea/fac/facD2dt2.C new file mode 100644 index 0000000000..cead98d1fb --- /dev/null +++ b/src/finiteArea/finiteArea/fac/facD2dt2.C @@ -0,0 +1,118 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | + \\/ M anipulation | +------------------------------------------------------------------------------- + | Copyright (C) 2017 Volkswagen AG +------------------------------------------------------------------------------- +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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "facD2dt2.H" +#include "faMesh.H" +#include "faD2dt2Scheme.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace fac +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template +tmp> d2dt2 +( + const dimensioned dt, + const faMesh& mesh +) +{ + return fa::faD2dt2Scheme::New + ( + mesh, + mesh.d2dt2Scheme("d2dt2(" + dt.name() + ')') + ).ref().facD2dt2(dt); +} + + +template +tmp> d2dt2 +( + const GeometricField& vf +) +{ + return fa::faD2dt2Scheme::New + ( + vf.mesh(), + vf.mesh().d2dt2Scheme("d2dt2(" + vf.name() + ')') + ).ref().facD2dt2(vf); +} + + +template +tmp> d2dt2 +( + const dimensionedScalar& rho, + const GeometricField& vf +) +{ + return fa::faD2dt2Scheme::New + ( + vf.mesh(), + vf.mesh().d2dt2Scheme + ( + "d2dt2(" + rho.name() + ',' + vf.name() + ')' + ) + ).ref().facD2dt2(rho, vf); +} + + +template +tmp> d2dt2 +( + const areaScalarField& rho, + const GeometricField& vf +) +{ + return fa::faD2dt2Scheme::New + ( + vf.mesh(), + vf.mesh().d2dt2Scheme + ( + "d2dt2(" + rho.name() + ',' + vf.name() + ')' + ) + ).ref().facD2dt2(rho, vf); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fac + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteArea/finiteArea/fac/facD2dt2.H b/src/finiteArea/finiteArea/fac/facD2dt2.H new file mode 100644 index 0000000000..e084e4adb8 --- /dev/null +++ b/src/finiteArea/finiteArea/fac/facD2dt2.H @@ -0,0 +1,101 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | + \\/ M anipulation | +------------------------------------------------------------------------------- + | Copyright (C) 2017 Volkswagen AG +------------------------------------------------------------------------------- + +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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Namespace + fac + +Description + Calculate the second temporal derivative. + +SourceFiles + facD2dt2.C + +\*---------------------------------------------------------------------------*/ + + +#ifndef facD2dt2_H +#define facD2dt2_H + +#include "areaFieldsFwd.H" +#include "edgeFieldsFwd.H" +#include "dimensionedTypes.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Namespace fac functions Declaration +\*---------------------------------------------------------------------------*/ + +namespace fac +{ + template + tmp > d2dt2 + ( + const dimensioned, + const faMesh& + ); + + template + tmp > d2dt2 + ( + const GeometricField& + ); + + template + tmp > d2dt2 + ( + const dimensionedScalar&, + const GeometricField& + ); + + template + tmp > d2dt2 + ( + const areaScalarField&, + const GeometricField& + ); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "facD2dt2.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/finiteArea/finiteArea/fam/fam.H b/src/finiteArea/finiteArea/fam/fam.H index e3be5021ec..90b3c6944e 100644 --- a/src/finiteArea/finiteArea/fam/fam.H +++ b/src/finiteArea/finiteArea/fam/fam.H @@ -36,6 +36,7 @@ Description // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // #include "famDdt.H" +#include "famD2dt2.H" #include "famDiv.H" #include "famLaplacian.H" #include "famSup.H" diff --git a/src/finiteArea/finiteArea/fam/famD2dt2.C b/src/finiteArea/finiteArea/fam/famD2dt2.C new file mode 100644 index 0000000000..a61e8c3e0a --- /dev/null +++ b/src/finiteArea/finiteArea/fam/famD2dt2.C @@ -0,0 +1,104 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | + \\/ M anipulation | +------------------------------------------------------------------------------- + | Copyright (C) 2017 Volkswagen AG +------------------------------------------------------------------------------- +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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +\*---------------------------------------------------------------------------*/ + +#include "areaFields.H" +#include "edgeFields.H" +#include "faMatrix.H" +#include "faD2dt2Scheme.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace fam +{ + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +template +tmp> d2dt2 +( + const GeometricField& vf +) +{ + return fa::faD2dt2Scheme::New + ( + vf.mesh(), + vf.mesh().d2dt2Scheme("d2dt2(" + vf.name() + ')') + ).ref().famD2dt2(vf); +} + + +template +tmp> d2dt2 +( + const dimensionedScalar& rho, + const GeometricField& vf +) +{ + return fa::faD2dt2Scheme::New + ( + vf.mesh(), + vf.mesh().d2dt2Scheme + ( + "d2dt2(" + rho.name() + ',' + vf.name() + ')' + ) + ).ref().famD2dt2(rho, vf); +} + + +template +tmp> d2dt2 +( + const areaScalarField& rho, + const GeometricField& vf +) +{ + return fa::faD2dt2Scheme::New + ( + vf.mesh(), + vf.mesh().ddtScheme + ( + "d2dt2(" + rho.name() + ',' + vf.name() + ')' + ) + ).ref().famD2dt2(rho, vf); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace fam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// ************************************************************************* // diff --git a/src/finiteArea/finiteArea/fam/famD2dt2.H b/src/finiteArea/finiteArea/fam/famD2dt2.H new file mode 100644 index 0000000000..08c6d6beac --- /dev/null +++ b/src/finiteArea/finiteArea/fam/famD2dt2.H @@ -0,0 +1,91 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | + \\/ M anipulation | +------------------------------------------------------------------------------- + | Copyright (C) 2017 Volkswagen AG +------------------------------------------------------------------------------- +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 2 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, write to the Free Software Foundation, + Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +Namespace + fam + +Description + Calulate the matrix for the second temporal derivative. + +SourceFiles + famD2dt2.C + +\*---------------------------------------------------------------------------*/ + +#ifndef famD2dt2_H +#define famD2dt2_H + +#include "areaFieldsFwd.H" +#include "faMatrix.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Namespace fam functions Declaration +\*---------------------------------------------------------------------------*/ + +namespace fam +{ + template + tmp > d2dt2 + ( + const GeometricField& + ); + + template + tmp > d2dt2 + ( + const dimensionedScalar&, + const GeometricField& + ); + + template + tmp > d2dt2 + ( + const areaScalarField&, + const GeometricField& + ); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#ifdef NoRepository +# include "famD2dt2.C" +#endif + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //