diff --git a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterFoam.C b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterFoam.C index 9da399d914..eda03ec719 100644 --- a/applications/solvers/multiphase/compressibleInterFoam/compressibleInterFoam.C +++ b/applications/solvers/multiphase/compressibleInterFoam/compressibleInterFoam.C @@ -41,6 +41,7 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" +#include "interfaceCompression.H" #include "CMULES.H" #include "EulerDdtScheme.H" #include "localEulerDdtScheme.H" diff --git a/applications/solvers/multiphase/interFoam/interFoam.C b/applications/solvers/multiphase/interFoam/interFoam.C index 256e6213c8..3a6e011722 100644 --- a/applications/solvers/multiphase/interFoam/interFoam.C +++ b/applications/solvers/multiphase/interFoam/interFoam.C @@ -33,6 +33,7 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" +#include "interfaceCompression.H" #include "CMULES.H" #include "EulerDdtScheme.H" #include "localEulerDdtScheme.H" diff --git a/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C b/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C index 2b0a04851a..b6c1641d0b 100644 --- a/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C +++ b/applications/solvers/multiphase/interFoam/interMixingFoam/interMixingFoam.C @@ -32,6 +32,7 @@ Description \*---------------------------------------------------------------------------*/ #include "fvCFD.H" +#include "interfaceCompression.H" #include "CMULES.H" #include "localEulerDdtScheme.H" #include "subCycle.H" diff --git a/etc/caseDicts/postProcessing/solvers/scalarTransport b/etc/caseDicts/postProcessing/solvers/scalarTransport index 7131d7885f..7a8ee73732 100644 --- a/etc/caseDicts/postProcessing/solvers/scalarTransport +++ b/etc/caseDicts/postProcessing/solvers/scalarTransport @@ -21,5 +21,9 @@ Description field ; // Name of the transported scalar schemesField $field; // Name of the field from which to use schemes // and solvers settings +diffusion viscosity; + +alphal 1; +alphat 1; // ************************************************************************* // diff --git a/src/functionObjects/solvers/Make/options b/src/functionObjects/solvers/Make/options index 4e63d7d26c..06e6f834ef 100644 --- a/src/functionObjects/solvers/Make/options +++ b/src/functionObjects/solvers/Make/options @@ -4,6 +4,7 @@ EXE_INC = \ -I$(LIB_SRC)/MomentumTransportModels/momentumTransportModels/lnInclude \ -I$(LIB_SRC)/MomentumTransportModels/incompressible/lnInclude \ -I$(LIB_SRC)/MomentumTransportModels/compressible/lnInclude \ + -I$(LIB_SRC)/twoPhaseModels/twoPhaseMixture/lnInclude \ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude @@ -13,6 +14,7 @@ LIB_LIBS = \ -lmomentumTransportModels \ -lincompressibleMomentumTransportModels \ -lcompressibleMomentumTransportModels \ + -ltwoPhaseMixture \ -lspecie \ -lfiniteVolume \ -lmeshTools \ diff --git a/src/functionObjects/solvers/scalarTransport/scalarTransport.C b/src/functionObjects/solvers/scalarTransport/scalarTransport.C index 9d19d9dd4f..7823091e93 100644 --- a/src/functionObjects/solvers/scalarTransport/scalarTransport.C +++ b/src/functionObjects/solvers/scalarTransport/scalarTransport.C @@ -26,13 +26,23 @@ License #include "scalarTransport.H" #include "surfaceFields.H" #include "fvmDdt.H" +#include "fvcDdt.H" #include "fvmDiv.H" #include "fvmLaplacian.H" #include "fvmSup.H" +#include "fvcFlux.H" #include "fvModels.H" #include "fvConstraints.H" #include "incompressibleMomentumTransportModel.H" #include "compressibleMomentumTransportModel.H" + +#include "CMULES.H" +#include "EulerDdtScheme.H" +#include "localEulerDdtScheme.H" +#include "CrankNicolsonDdtScheme.H" +#include "subCycle.H" +#include "interfaceCompression.H" + #include "addToRunTimeSelectionTable.H" // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // @@ -53,16 +63,33 @@ namespace functionObjects } +template<> +const char* Foam::NamedEnum +< + Foam::functionObjects::scalarTransport::diffusionType, + 3 +>::names[] = +{ + "none", + "constant", + "viscosity" +}; + +const Foam::NamedEnum +< + Foam::functionObjects::scalarTransport::diffusionType, + 3 +> Foam::functionObjects::scalarTransport::diffusionTypeNames_; + + // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // -Foam::tmp Foam::functionObjects::scalarTransport::D -( - const surfaceScalarField& phi -) const +Foam::tmp +Foam::functionObjects::scalarTransport::D() const { const word Dname("D" + s_.name()); - if (constantD_) + if (diffusion_ == diffusionType::constant) { return volScalarField::New ( @@ -71,13 +98,7 @@ Foam::tmp Foam::functionObjects::scalarTransport::D dimensionedScalar(Dname, dimViscosity, D_) ); } - else if - ( - mesh_.foundObject - ( - momentumTransportModel::typeName - ) - ) + else { const momentumTransportModel& turbulence = mesh_.lookupObject @@ -85,16 +106,7 @@ Foam::tmp Foam::functionObjects::scalarTransport::D momentumTransportModel::typeName ); - return alphaD_*turbulence.nu() + alphaDt_*turbulence.nut(); - } - else - { - return volScalarField::New - ( - Dname, - mesh_, - dimensionedScalar(Dname, phi.dimensions()/dimLength, 0) - ); + return alphal_*turbulence.nu() + alphat_*turbulence.nut(); } } @@ -110,6 +122,7 @@ Foam::functionObjects::scalarTransport::scalarTransport : fvMeshFunctionObject(name, runTime, dict), fieldName_(dict.lookupOrDefault("field", "s")), + diffusion_(diffusionType::none), D_(0), nCorr_(0), s_ @@ -123,9 +136,49 @@ Foam::functionObjects::scalarTransport::scalarTransport IOobject::AUTO_WRITE ), mesh_ - ) + ), + MULES_(false), + deltaN_ + ( + "deltaN", + 1e-8/pow(average(mesh_.V()), 1.0/3.0) + ), + sRestart_(false) { read(dict); + + const dictionary& controls = mesh_.solverDict(s_.name()); + + if (controls.found("nSubCycles")) + { + MULES_ = true; + + typeIOobject sPhiHeader + ( + IOobject::groupName("sPhi", s_.group()), + runTime.timeName(), + mesh_, + IOobject::READ_IF_PRESENT, + IOobject::AUTO_WRITE + ); + + sRestart_ = sPhiHeader.headerOk(); + + if (sRestart_) + { + Info << "Restarting s" << endl; + } + + const surfaceScalarField& phi = + mesh_.lookupObject(phiName_); + + // Scalar volumetric flux + tsPhi_ = new surfaceScalarField + ( + sPhiHeader, + phi*fvc::interpolate(s_) + ); + } } @@ -145,9 +198,22 @@ bool Foam::functionObjects::scalarTransport::read(const dictionary& dict) rhoName_ = dict.lookupOrDefault("rho", "rho"); schemesField_ = dict.lookupOrDefault("schemesField", fieldName_); - constantD_ = dict.readIfPresent("D", D_); - alphaD_ = dict.lookupOrDefault("alphaD", 1.0); - alphaDt_ = dict.lookupOrDefault("alphaDt", 1.0); + diffusion_ = diffusionTypeNames_.read(dict.lookup("diffusion")); + + switch(diffusion_) + { + case diffusionType::none: + break; + + case diffusionType::constant: + dict.lookup("D") >> D_; + break; + + case diffusionType::viscosity: + dict.lookup("alphal") >> alphal_; + dict.lookup("alphat") >> alphat_; + break; + } dict.readIfPresent("nCorr", nCorr_); @@ -168,11 +234,7 @@ bool Foam::functionObjects::scalarTransport::execute() const surfaceScalarField& phi = mesh_.lookupObject(phiName_); - // Calculate the diffusivity - volScalarField D("D" + s_.name(), this->D(phi)); - - word divScheme("div(phi," + schemesField_ + ")"); - word laplacianScheme("laplacian(" + D.name() + "," + schemesField_ + ")"); + const word divScheme("div(phi," + schemesField_ + ")"); // Set under-relaxation coeff scalar relaxCoeff = 0.0; @@ -189,25 +251,38 @@ bool Foam::functionObjects::scalarTransport::execute() if (phi.dimensions() == dimVolume/dimTime) { - for (int i=0; i<=nCorr_; i++) + if (MULES_) { - fvScalarMatrix sEqn - ( - fvm::ddt(s_) - + fvm::div(phi, s_, divScheme) - - fvm::laplacian(D, s_, laplacianScheme) - == - fvModels.source(s_) - ); - - sEqn.relax(relaxCoeff); - - fvConstraints.constrain(sEqn); - - sEqn.solve(schemesField_); + subCycleMULES(); fvConstraints.constrain(s_); } + else + { + for (int i=0; i<=nCorr_; i++) + { + fvScalarMatrix sEqn + ( + fvm::ddt(s_) + + fvm::div(phi, s_, divScheme) + == + fvModels.source(s_) + ); + + if (diffusion_ != diffusionType::none) + { + sEqn -= fvm::laplacian(D(), s_); + } + + sEqn.relax(relaxCoeff); + + fvConstraints.constrain(sEqn); + + sEqn.solve(schemesField_); + + fvConstraints.constrain(s_); + } + } } else if (phi.dimensions() == dimMass/dimTime) { @@ -220,11 +295,15 @@ bool Foam::functionObjects::scalarTransport::execute() ( fvm::ddt(rho, s_) + fvm::div(phi, s_, divScheme) - - fvm::laplacian(rho*D, s_, laplacianScheme) == fvModels.source(rho, s_) ); + if (diffusion_ != diffusionType::none) + { + sEqn -= fvm::laplacian(rho*D(), s_); + } + sEqn.relax(relaxCoeff); fvConstraints.constrain(sEqn); @@ -248,6 +327,303 @@ bool Foam::functionObjects::scalarTransport::execute() } +void Foam::functionObjects::scalarTransport::subCycleMULES() +{ + const dictionary& controls = mesh_.solverDict(s_.name()); + const label nSubCycles(controls.lookup