From b370628d9ec22ecd27da2fda718da4c9e2f3bcdb Mon Sep 17 00:00:00 2001 From: Will Bainbridge Date: Tue, 30 Mar 2021 15:34:14 +0100 Subject: [PATCH] functionObjects: forces: Added support for Euler-Euler multiphase --- src/functionObjects/forces/Make/options | 4 + src/functionObjects/forces/forces/forces.C | 154 +++++++++++++++------ src/functionObjects/forces/forces/forces.H | 10 +- 3 files changed, 117 insertions(+), 51 deletions(-) diff --git a/src/functionObjects/forces/Make/options b/src/functionObjects/forces/Make/options index 1df84f267f..d1a743738e 100644 --- a/src/functionObjects/forces/Make/options +++ b/src/functionObjects/forces/Make/options @@ -5,6 +5,8 @@ EXE_INC = \ -I$(LIB_SRC)/MomentumTransportModels/momentumTransportModels/lnInclude \ -I$(LIB_SRC)/MomentumTransportModels/incompressible/lnInclude \ -I$(LIB_SRC)/MomentumTransportModels/compressible/lnInclude \ + -I$(LIB_SRC)/MomentumTransportModels/phaseIncompressible/lnInclude \ + -I$(LIB_SRC)/MomentumTransportModels/phaseCompressible/lnInclude \ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude @@ -14,6 +16,8 @@ LIB_LIBS = \ -lmomentumTransportModels \ -lincompressibleMomentumTransportModels \ -lcompressibleMomentumTransportModels \ + -lphaseIncompressibleMomentumTransportModels \ + -lphaseCompressibleMomentumTransportModels \ -lspecie \ -lfileFormats \ -lfiniteVolume \ diff --git a/src/functionObjects/forces/forces/forces.C b/src/functionObjects/forces/forces/forces.C index d913b6aaaf..1f685c145a 100644 --- a/src/functionObjects/forces/forces/forces.C +++ b/src/functionObjects/forces/forces/forces.C @@ -28,6 +28,8 @@ License #include "porosityModel.H" #include "kinematicMomentumTransportModel.H" #include "dynamicMomentumTransportModel.H" +#include "phaseKinematicMomentumTransportModel.H" +#include "phaseDynamicMomentumTransportModel.H" #include "fluidThermo.H" #include "addToRunTimeSelectionTable.H" @@ -224,23 +226,45 @@ void Foam::functionObjects::forces::initialise() Foam::tmp Foam::functionObjects::forces::devTau() const { - typedef compressible::momentumTransportModel cmpModel; typedef incompressible::momentumTransportModel icoModel; + typedef compressible::momentumTransportModel cmpModel; + typedef phaseIncompressible::momentumTransportModel phaseIcoModel; + typedef phaseCompressible::momentumTransportModel phaseCmpModel; - if (obr_.foundObject(momentumTransportModel::typeName)) - { - const cmpModel& model = - obr_.lookupObject(momentumTransportModel::typeName); + const word& modelName = momentumTransportModel::typeName; + const word phaseModelName = + phaseName_ == word::null + ? word::null + : IOobject::groupName(momentumTransportModel::typeName, phaseName_); - return model.devTau(); - } - else if (obr_.foundObject(momentumTransportModel::typeName)) + if (obr_.foundObject(modelName)) { const incompressible::momentumTransportModel& model = - obr_.lookupObject(momentumTransportModel::typeName); + obr_.lookupObject(modelName); + + return alpha()*rho()*model.devSigma(); + } + else if (obr_.foundObject(modelName)) + { + const cmpModel& model = + obr_.lookupObject(modelName); + + return alpha()*model.devTau(); + } + else if (obr_.foundObject(phaseModelName)) + { + const phaseIcoModel& model = + obr_.lookupObject(phaseModelName); return rho()*model.devSigma(); } + else if (obr_.foundObject(phaseModelName)) + { + const phaseCmpModel& model = + obr_.lookupObject(phaseModelName); + + return model.devTau(); + } else if (obr_.foundObject("transportProperties")) { // Legacy support for icoFoam @@ -272,25 +296,49 @@ Foam::functionObjects::forces::devTau() const Foam::tmp Foam::functionObjects::forces::mu() const { - if (obr_.foundObject(basicThermo::dictName)) - { - const fluidThermo& thermo = - obr_.lookupObject(basicThermo::dictName); + typedef incompressible::momentumTransportModel icoModel; + typedef compressible::momentumTransportModel cmpModel; + typedef phaseIncompressible::momentumTransportModel phaseIcoModel; + typedef phaseCompressible::momentumTransportModel phaseCmpModel; - return thermo.mu(); + const word& modelName = momentumTransportModel::typeName; + const word phaseModelName = + phaseName_ == word::null + ? word::null + : IOobject::groupName(momentumTransportModel::typeName, phaseName_); + + if (obr_.foundObject(modelName)) + { + const incompressible::momentumTransportModel& model = + obr_.lookupObject(modelName); + + return rho()*model.transport().nu(); } - else if - ( - obr_.foundObject("transportProperties") - ) + else if (obr_.foundObject(modelName)) { - const kinematicTransportModel& laminarT = - obr_.lookupObject("transportProperties"); + const cmpModel& model = + obr_.lookupObject(modelName); - return rho()*laminarT.nu(); + return model.transport().mu(); + } + else if (obr_.foundObject(phaseModelName)) + { + const phaseIcoModel& model = + obr_.lookupObject(phaseModelName); + + return rho()*model.transport().nu(); + } + else if (obr_.foundObject(phaseModelName)) + { + const phaseCmpModel& model = + obr_.lookupObject(phaseModelName); + + return model.transport().mu(); } else if (obr_.foundObject("transportProperties")) { + // Legacy support for icoFoam + const dictionary& transportProperties = obr_.lookupObject("transportProperties"); @@ -352,27 +400,45 @@ Foam::scalar Foam::functionObjects::forces::rho(const volScalarField& p) const } -Foam::tmp Foam::functionObjects::forces::phaseFilter -( - const tmp& tF, - const label patchi -) const +Foam::tmp Foam::functionObjects::forces::alpha() const { - if (phaseName_ != word::null) + if (phaseName_ == word::null) { - const volScalarField& alpha + return volScalarField::New ( - obr_.lookupObject - ( - IOobject::groupName("alpha", phaseName_) - ) + "alpha", + mesh_, + dimensionedScalar(dimless, 1) ); - - return alpha.boundaryField()[patchi]*tF; } else { - return tF; + return obr_.lookupObject + ( + IOobject::groupName("alpha", phaseName_) + ); + } +} + + +Foam::tmp Foam::functionObjects::forces::alpha +( + const label patchi +) const +{ + if (phaseName_ == word::null) + { + return tmp + ( + new scalarField(mesh_.boundary()[patchi].size(), 1) + ); + } + else + { + return obr_.lookupObject + ( + IOobject::groupName("alpha", phaseName_) + ).boundaryField()[patchi]; } } @@ -854,8 +920,8 @@ void Foam::functionObjects::forces::calcForcesMoment() mesh_.Sf().boundaryField(); tmp tdevTau = devTau(); - const volSymmTensorField::Boundary& devTaub - = tdevTau().boundaryField(); + const volSymmTensorField::Boundary& devTaub = + tdevTau().boundaryField(); // Scale pRef by density for incompressible simulations const scalar pRef = pRef_/rho(p); @@ -871,17 +937,13 @@ void Foam::functionObjects::forces::calcForcesMoment() const vectorField fN ( - phaseFilter - ( - rho(p)*Sfb[patchi]*(p.boundaryField()[patchi] - pRef), - patchi - ) + alpha(patchi) + *rho(p) + *Sfb[patchi] + *(p.boundaryField()[patchi] - pRef) ); - const vectorField fT - ( - phaseFilter(Sfb[patchi] & devTaub[patchi], patchi) - ); + const vectorField fT(Sfb[patchi] & devTaub[patchi]); const vectorField fP(Md.size(), Zero); diff --git a/src/functionObjects/forces/forces/forces.H b/src/functionObjects/forces/forces/forces.H index 8c657ad419..71dfd3cbca 100644 --- a/src/functionObjects/forces/forces/forces.H +++ b/src/functionObjects/forces/forces/forces.H @@ -251,11 +251,11 @@ protected: // otherwise return 1 scalar rho(const volScalarField& p) const; - tmp phaseFilter - ( - const tmp& F, - const label patchi - ) const; + //- Get the volume fraction field + tmp alpha() const; + + //- Get the volume fraction field on a patch + tmp alpha(const label patchi) const; //- Accumulate bin data void applyBins