diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index 8d86f57d684fbf0a87decb58bad04ca65e726b90..efcd5f0047e6127ed0d984e2ae711b47a77393c4 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -358,6 +358,7 @@ finiteVolume/fv/fv.C finiteVolume/fvSchemes/fvSchemes.C ddtSchemes = finiteVolume/ddtSchemes +$(ddtSchemes)/ddtScheme/ddtSchemeBase.C $(ddtSchemes)/ddtScheme/ddtSchemes.C $(ddtSchemes)/steadyStateDdtScheme/steadyStateDdtSchemes.C $(ddtSchemes)/EulerDdtScheme/EulerDdtSchemes.C diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/ddtScheme/ddtScheme.C b/src/finiteVolume/finiteVolume/ddtSchemes/ddtScheme/ddtScheme.C index b90c786dcebed51913705e4a4a074d059c26aa55..d659e26e812626b615b1566d4107c377bff56344 100644 --- a/src/finiteVolume/finiteVolume/ddtSchemes/ddtScheme/ddtScheme.C +++ b/src/finiteVolume/finiteVolume/ddtSchemes/ddtScheme/ddtScheme.C @@ -28,6 +28,7 @@ License #include "surfaceInterpolate.H" #include "fvMatrix.H" #include "cyclicAMIFvPatch.H" +#include "registerSwitch.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -146,6 +147,11 @@ tmp<surfaceScalarField> ddtScheme<Type>::fvcDdtPhiCoeff const fluxFieldType& phiCorr ) { + if (fv::debug) + { + InfoInFunction << "Using standard version" << endl; + } + tmp<surfaceScalarField> tddtCouplingCoeff ( new surfaceScalarField @@ -166,21 +172,87 @@ tmp<surfaceScalarField> ddtScheme<Type>::fvcDdtPhiCoeff if (ddtPhiCoeff_ < 0) { // v1712 and earlier - // ddtCouplingCoeff -= min - // ( - // mag(phiCorr) - // /(mag(phi) + dimensionedScalar("small", phi.dimensions(), SMALL)), - // scalar(1) - // ); + ddtCouplingCoeff -= min + ( + mag(phiCorr) + /(mag(phi) + dimensionedScalar("small", phi.dimensions(), SMALL)), + scalar(1) + ); + } + else + { + ddtCouplingCoeff = + dimensionedScalar("ddtPhiCoeff", dimless, ddtPhiCoeff_); + } + + surfaceScalarField::Boundary& ccbf = ddtCouplingCoeff.boundaryFieldRef(); + forAll(U.boundaryField(), patchi) + { + if + ( + U.boundaryField()[patchi].fixesValue() + || isA<cyclicAMIFvPatch>(mesh().boundary()[patchi]) + ) + { + ccbf[patchi] = 0.0; + } + } + + if (debug > 1) + { + InfoInFunction + << "ddtCouplingCoeff mean max min = " + << gAverage(ddtCouplingCoeff.primitiveField()) + << " " << gMax(ddtCouplingCoeff.primitiveField()) + << " " << gMin(ddtCouplingCoeff.primitiveField()) + << endl; + } + + return tddtCouplingCoeff; +} + + +template<class Type> +tmp<surfaceScalarField> ddtScheme<Type>::fvcDdtPhiCoeffExperimental +( + const GeometricField<Type, fvPatchField, volMesh>& U, + const fluxFieldType& phi, + const fluxFieldType& phiCorr +) +{ + if (fv::debug) + { + InfoInFunction << "Using experimental version" << endl; + } + + tmp<surfaceScalarField> tddtCouplingCoeff + ( + new surfaceScalarField + ( + IOobject + ( + "ddtCouplingCoeff", + U.mesh().time().timeName(), + U.mesh() + ), + U.mesh(), + dimensionedScalar("one", dimless, 1.0) + ) + ); + + surfaceScalarField& ddtCouplingCoeff = tddtCouplingCoeff.ref(); + + if (ddtPhiCoeff_ < 0) + { // See note below re: commented code ddtCouplingCoeff -= min ( - // mag(phiCorr) - //*mesh().time().deltaT()*mag(mesh().deltaCoeffs())/mesh().magSf(), - // scalar(1) + // mag(phiCorr) + // *mesh().time().deltaT()*mag(mesh().deltaCoeffs())/mesh().magSf(), + // scalar(1) mag(phiCorr) - *mesh().time().deltaT()*mesh().deltaCoeffs()/mesh().magSf(), + *mesh().time().deltaT()*mesh().deltaCoeffs()/mesh().magSf(), scalar(1) ); @@ -231,7 +303,20 @@ tmp<surfaceScalarField> ddtScheme<Type>::fvcDdtPhiCoeff const volScalarField& rho ) { - return fvcDdtPhiCoeff(U, phi, phiCorr/fvc::interpolate(rho)); + if (experimentalDdtCorr) + { + return + fvcDdtPhiCoeffExperimental + ( + U, + phi, + phiCorr/fvc::interpolate(rho) + ); + } + else + { + return fvcDdtPhiCoeff(U, phi, phiCorr); + } } @@ -242,7 +327,26 @@ tmp<surfaceScalarField> ddtScheme<Type>::fvcDdtPhiCoeff const fluxFieldType& phi ) { - return fvcDdtPhiCoeff(U, phi, phi - fvc::dotInterpolate(mesh().Sf(), U)); + if (experimentalDdtCorr) + { + return + fvcDdtPhiCoeffExperimental + ( + U, + phi, + phi - fvc::dotInterpolate(mesh().Sf(), U) + ); + } + else + { + return + fvcDdtPhiCoeff + ( + U, + phi, + phi - fvc::dotInterpolate(mesh().Sf(), U) + ); + } } @@ -254,12 +358,25 @@ tmp<surfaceScalarField> ddtScheme<Type>::fvcDdtPhiCoeff const volScalarField& rho ) { - return fvcDdtPhiCoeff - ( - U, - phi, - (phi - fvc::dotInterpolate(mesh().Sf(), U))/fvc::interpolate(rho) - ); + if (experimentalDdtCorr) + { + return fvcDdtPhiCoeffExperimental + ( + U, + phi, + (phi - fvc::dotInterpolate(mesh().Sf(), rho*U)) + /fvc::interpolate(rho) + ); + } + else + { + return fvcDdtPhiCoeff + ( + U, + phi, + (phi - fvc::dotInterpolate(mesh().Sf(), rho*U)) + ); + } } diff --git a/src/finiteVolume/finiteVolume/ddtSchemes/ddtScheme/ddtScheme.H b/src/finiteVolume/finiteVolume/ddtSchemes/ddtScheme/ddtScheme.H index 0f5552cac8f2639ec1ec68a94884ed62c2bc85f3..635145a5bcedc8b46707effb36078b111a3d436c 100644 --- a/src/finiteVolume/finiteVolume/ddtSchemes/ddtScheme/ddtScheme.H +++ b/src/finiteVolume/finiteVolume/ddtSchemes/ddtScheme/ddtScheme.H @@ -64,10 +64,24 @@ namespace fv Class ddtScheme Declaration \*---------------------------------------------------------------------------*/ +class ddtSchemeBase +{ +public: + + //- Flag to use experimental ddtCorr from org version + //- Default is off for backwards compatibility + static bool experimentalDdtCorr; + + ddtSchemeBase() + {} +}; + + template<class Type> class ddtScheme : - public refCount + public refCount, + public ddtSchemeBase { protected: @@ -76,7 +90,9 @@ protected: const fvMesh& mesh_; - //- Input for fvcDdtPhiCoeff (-1 default) + //- Input for fvcDdtPhiCoeff + // If set to -1 (default) the code will calculate the coefficient + // If > 0 the coupling coeff is set to this value scalar ddtPhiCoeff_; @@ -218,6 +234,13 @@ public: const fluxFieldType& phiCorr ); + tmp<surfaceScalarField> fvcDdtPhiCoeffExperimental + ( + const GeometricField<Type, fvPatchField, volMesh>& U, + const fluxFieldType& phi, + const fluxFieldType& phiCorr + ); + tmp<surfaceScalarField> fvcDdtPhiCoeff ( const GeometricField<Type, fvPatchField, volMesh>& U,