diff --git a/applications/solvers/modules/fluid/multiphaseEuler/Allwclean b/applications/solvers/modules/fluid/multiphaseEuler/Allwclean
new file mode 100755
index 0000000000..7040d013f8
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/Allwclean
@@ -0,0 +1,13 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # Run from this directory
+
+wclean libso phaseSystems
+wclean libso interfacialModels
+wclean libso interfacialCompositionModels
+wclean libso multiphaseCompressibleMomentumTransportModels
+wclean libso multiphaseReactions
+multiphaseEuler/Allwclean
+wclean libso fvModels
+wclean libso functionObjects
+
+#------------------------------------------------------------------------------
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/Allwmake b/applications/solvers/modules/fluid/multiphaseEuler/Allwmake
new file mode 100755
index 0000000000..019aba50de
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/Allwmake
@@ -0,0 +1,16 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # Run from this directory
+
+# Parse arguments for library compilation
+. $WM_PROJECT_DIR/wmake/scripts/AllwmakeParseArguments
+
+wmake $targetType phaseSystems
+wmake $targetType interfacialModels
+wmake $targetType interfacialCompositionModels
+wmake $targetType multiphaseCompressibleMomentumTransportModels
+wmake $targetType multiphaseReactions
+multiphaseEuler/Allwmake $targetType $*
+wmake $targetType fvModels
+wmake $targetType functionObjects
+
+#------------------------------------------------------------------------------
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/Make/files b/applications/solvers/modules/fluid/multiphaseEuler/Make/files
new file mode 100644
index 0000000000..1f0d6fd7dc
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/Make/files
@@ -0,0 +1,10 @@
+setRDeltaT.C
+moveMesh.C
+alphaPredictor.C
+momentumPredictor.C
+thermophysicalPredictor.C
+compressibilityEqns.C
+pressureCorrector.C
+multiphaseEuler.C
+
+LIB = $(FOAM_LIBBIN)/libmultiphaseEuler
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/Make/options b/applications/solvers/modules/fluid/multiphaseEuler/Make/options
new file mode 100644
index 0000000000..41a7aab42e
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/Make/options
@@ -0,0 +1,28 @@
+EXE_INC = \
+ -I$(FOAM_SOLVERS)/modules/fluid/fluidSolver/lnInclude \
+ -IcompressibleTwoPhaseMixture \
+ -IcompressibleInterPhaseTransportModel/lnInclude \
+ -I$(LIB_SRC)/physicalProperties/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+ -I$(LIB_SRC)/twoPhaseModels/twoPhaseMixture/lnInclude \
+ -I$(LIB_SRC)/twoPhaseModels/interfaceProperties/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/momentumTransportModels/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/compressible/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/phaseCompressible/lnInclude \
+ -I$(LIB_SRC)/finiteVolume/lnInclude \
+ -I$(LIB_SRC)/meshTools/lnInclude
+
+LIB_LIBS = \
+ -lfluidSolver \
+ -lcompressibleTwoPhaseMixture \
+ -ltwoPhaseSurfaceTension \
+ -lfluidThermophysicalModels \
+ -ltwoPhaseMixture \
+ -ltwoPhaseProperties \
+ -linterfaceProperties \
+ -lcompressibleInterPhaseTransportModel \
+ -lfiniteVolume \
+ -lfvModels \
+ -lfvConstraints \
+ -lmeshTools \
+ -lsampling
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/Make/files b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/Make/files
new file mode 100644
index 0000000000..839b339b15
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/Make/files
@@ -0,0 +1,6 @@
+populationBalanceMoments/populationBalanceMoments.C
+populationBalanceSizeDistribution/populationBalanceSizeDistribution.C
+phaseForces/phaseForces.C
+phaseMap/phaseMap.C
+
+LIB = $(FOAM_LIBBIN)/libmultiphaseEulerFoamFunctionObjects
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/Make/options b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/Make/options
new file mode 100644
index 0000000000..b8345e0763
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/Make/options
@@ -0,0 +1,28 @@
+EXE_INC = \
+ -I../phaseSystems/lnInclude \
+ -I../interfacialModels/lnInclude \
+ -I$(LIB_SRC)/physicalProperties/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/momentumTransportModels/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/compressible/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/phaseCompressible/lnInclude \
+ -I$(LIB_SRC)/finiteVolume/lnInclude \
+ -I$(LIB_SRC)/meshTools/lnInclude \
+ -I$(LIB_SRC)/fileFormats/lnInclude \
+ -I$(LIB_SRC)/functionObjects/field/lnInclude \
+ -I$(LIB_SRC)/sampling/lnInclude
+
+LIB_LIBS = \
+ -lphaseSystem \
+ -lmultiphaseSystems \
+ -leulerianInterfacialModels \
+ -leulerianInterfacialCompositionModels \
+ -lmultiphaseMomentumTransportModels \
+ -lmultiphaseReactions \
+ -lmultiphaseProperties \
+ -lphaseFluidThermophysicalTransportModels \
+ -lphaseFluidMulticomponentThermophysicalTransportModels \
+ -lfiniteVolume \
+ -lmeshTools \
+ -lfileFormats \
+ -lfieldFunctionObjects
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseForces/phaseForces.C b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseForces/phaseForces.C
new file mode 100644
index 0000000000..8d31721ea9
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseForces/phaseForces.C
@@ -0,0 +1,303 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2018-2022 OpenFOAM Foundation
+ \\/ 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 "phaseForces.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvcGrad.H"
+#include "dragModel.H"
+#include "virtualMassModel.H"
+#include "liftModel.H"
+#include "wallLubricationModel.H"
+#include "turbulentDispersionModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+ defineTypeNameAndDebug(phaseForces, 0);
+ addToRunTimeSelectionTable(functionObject, phaseForces, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::functionObjects::phaseForces::phaseForces
+(
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+)
+:
+ fvMeshFunctionObject(name, runTime, dict),
+ phase_
+ (
+ mesh_.lookupObject
+ (
+ IOobject::groupName("alpha", dict.lookup("phase"))
+ )
+ ),
+ fluid_(mesh_.lookupObject(phaseSystem::propertiesName))
+{
+ read(dict);
+
+ forAll(fluid_.phases(), phasei)
+ {
+ const phaseModel& otherPhase = fluid_.phases()[phasei];
+
+ if (&otherPhase == &phase_) continue;
+
+ const phaseInterface interface(phase_, otherPhase);
+
+ if (fluid_.foundInterfacialModel(interface))
+ {
+ forceFields_.insert
+ (
+ dragModel::typeName,
+ new volVectorField
+ (
+ IOobject
+ (
+ IOobject::groupName("dragForce", phase_.name()),
+ mesh_.time().timeName(),
+ mesh_
+ ),
+ mesh_,
+ dimensionedVector(dimForce/dimVolume, Zero)
+ )
+ );
+ }
+
+ if (fluid_.foundInterfacialModel(interface))
+ {
+ forceFields_.insert
+ (
+ virtualMassModel::typeName,
+ new volVectorField
+ (
+ IOobject
+ (
+ IOobject::groupName
+ (
+ "virtualMassForce",
+ phase_.name()
+ ),
+ mesh_.time().timeName(),
+ mesh_
+ ),
+ mesh_,
+ dimensionedVector(dimForce/dimVolume, Zero)
+ )
+ );
+ }
+
+ if (fluid_.foundInterfacialModel(interface))
+ {
+ forceFields_.insert
+ (
+ liftModel::typeName,
+ new volVectorField
+ (
+ IOobject
+ (
+ IOobject::groupName("liftForce", phase_.name()),
+ mesh_.time().timeName(),
+ mesh_
+ ),
+ mesh_,
+ dimensionedVector(dimForce/dimVolume, Zero)
+ )
+ );
+ }
+
+ if
+ (
+ fluid_.foundInterfacialModel
+ (interface)
+ )
+ {
+ forceFields_.insert
+ (
+ wallLubricationModel::typeName,
+ new volVectorField
+ (
+ IOobject
+ (
+ IOobject::groupName
+ (
+ "wallLubricationForce",
+ phase_.name()
+ ),
+ mesh_.time().timeName(),
+ mesh_
+ ),
+ mesh_,
+ dimensionedVector(dimForce/dimVolume, Zero)
+ )
+ );
+ }
+
+ if
+ (
+ fluid_.foundInterfacialModel
+ (interface)
+ )
+ {
+ forceFields_.insert
+ (
+ turbulentDispersionModel::typeName,
+ new volVectorField
+ (
+ IOobject
+ (
+ IOobject::groupName
+ (
+ "turbulentDispersionForce",
+ phase_.name()
+ ),
+ mesh_.time().timeName(),
+ mesh_
+ ),
+ mesh_,
+ dimensionedVector(dimForce/dimVolume, Zero)
+ )
+ );
+ }
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::functionObjects::phaseForces::~phaseForces()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::functionObjects::phaseForces::read(const dictionary& dict)
+{
+ fvMeshFunctionObject::read(dict);
+
+ return true;
+}
+
+
+bool Foam::functionObjects::phaseForces::execute()
+{
+ // Zero the force fields
+ forAllConstIter
+ (
+ HashPtrTable,
+ forceFields_,
+ forceFieldIter
+ )
+ {
+ *forceFieldIter() = Zero;
+ }
+
+ // Add the forces from all the interfaces which contain this phase
+ forAll(fluid_.phases(), phasei)
+ {
+ const phaseModel& otherPhase = fluid_.phases()[phasei];
+
+ if (&otherPhase == &phase_) continue;
+
+ const phaseInterface interface(phase_, otherPhase);
+
+ if (fluid_.foundInterfacialModel(interface))
+ {
+ *forceFields_[dragModel::typeName] +=
+ fluid_.lookupInterfacialModel(interface).K()
+ *(otherPhase.U() - phase_.U());
+ }
+
+ if (fluid_.foundInterfacialModel(interface))
+ {
+ *forceFields_[virtualMassModel::typeName] +=
+ fluid_.lookupInterfacialModel
+ (interface).K()
+ *(otherPhase.DUDt() - phase_.DUDt());
+ }
+
+ if (fluid_.foundInterfacialModel(interface))
+ {
+ *forceFields_[liftModel::typeName] +=
+ (&interface.phase1() == &phase_ ? -1 : +1)
+ *fluid_.lookupInterfacialModel(interface).F();
+ }
+
+ if
+ (
+ fluid_.foundInterfacialModel
+ (interface)
+ )
+ {
+ *forceFields_[wallLubricationModel::typeName] +=
+ (&interface.phase1() == &phase_ ? -1 : +1)
+ *fluid_.lookupInterfacialModel
+ (interface).F();
+ }
+
+ if
+ (
+ fluid_.foundInterfacialModel
+ (interface)
+ )
+ {
+ *forceFields_[turbulentDispersionModel::typeName] +=
+ fluid_.lookupInterfacialModel
+ (interface).D()
+ *fvc::grad
+ (
+ otherPhase
+ /max(phase_ + otherPhase, otherPhase.residualAlpha())
+ );
+ }
+ }
+
+ return true;
+}
+
+
+bool Foam::functionObjects::phaseForces::write()
+{
+ forAllConstIter
+ (
+ HashPtrTable,
+ forceFields_,
+ forceFieldIter
+ )
+ {
+ writeObject(forceFieldIter()->name());
+ }
+
+ return true;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseForces/phaseForces.H b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseForces/phaseForces.H
new file mode 100644
index 0000000000..bad37f4a26
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseForces/phaseForces.H
@@ -0,0 +1,160 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2018-2022 OpenFOAM Foundation
+ \\/ 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::functionObjects::phaseForces
+
+Description
+ This functionObject calculates and outputs the blended interfacial forces
+ acting on a given phase, i.e. drag, virtual mass, lift, wall-lubrication and
+ turbulent dispersion. Note that it works only in run-time processing mode
+ and in combination with the multiphaseEulerFoam solver.
+
+ For a simulation involving more than two phases, the accumulated force is
+ calculated by looping over all interfaces involving that phase. The fields
+ are stored in the database so that they can be processed further, e.g. with
+ the fieldAveraging functionObject.
+
+ Example of function object specification:
+ \verbatim
+ phaseForces.water
+ {
+ type phaseForces;
+
+ libs ("libmultiphaseEulerFoamFunctionObjects.so");
+
+ phase water;
+ }
+ \endverbatim
+
+Usage
+ \table
+ Property | Description | Required | Default value
+ type | type name: phaseForces | yes |
+ phase | Name of evaluated phase | yes |
+ \endtable
+
+See also
+ Foam::BlendedInterfacialModel
+ Foam::functionObjects::fvMeshFunctionObject
+ Foam::functionObject
+
+SourceFiles
+ phaseForces.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef functionObjects_phaseForces_H
+#define functionObjects_phaseForces_H
+
+#include "fvMeshFunctionObject.H"
+#include "phaseSystem.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+ Class phaseForces Declaration
+\*---------------------------------------------------------------------------*/
+
+class phaseForces
+:
+ public fvMeshFunctionObject
+{
+protected:
+
+ // Protected data
+
+ //- Force fields
+ HashPtrTable forceFields_;
+
+ //- Phase for which forces are evaluated
+ const phaseModel& phase_;
+
+ //- Constant access to phaseSystem
+ const phaseSystem& fluid_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("phaseForces");
+
+
+ // Constructors
+
+ //- Construct from Time and dictionary
+ phaseForces
+ (
+ const word& name,
+ const Time& runTime,
+ const dictionary&
+ );
+
+ //- Disallow default bitwise copy construction
+ phaseForces(const phaseForces&) = delete;
+
+
+ //- Destructor
+ virtual ~phaseForces();
+
+
+ // Member Functions
+
+ //- Read the input data
+ virtual bool read(const dictionary& dict);
+
+ //- Return the list of fields required
+ virtual wordList fields() const
+ {
+ return wordList::null();
+ }
+
+ //- Calculate the force fields
+ virtual bool execute();
+
+ //- Write the force fields
+ virtual bool write();
+
+
+ // Member Operators
+
+ //- Disallow default bitwise assignment
+ void operator=(const phaseForces&) = delete;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseMap/phaseMap.C b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseMap/phaseMap.C
new file mode 100644
index 0000000000..5567d3c5da
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseMap/phaseMap.C
@@ -0,0 +1,102 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2020-2022 OpenFOAM Foundation
+ \\/ 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 "phaseMap.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+ defineTypeNameAndDebug(phaseMap, 0);
+ addToRunTimeSelectionTable(functionObject, phaseMap, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::functionObjects::phaseMap::phaseMap
+(
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+)
+:
+ fvMeshFunctionObject(name, runTime, dict),
+ phases_
+ (
+ mesh_.lookupObject(phaseSystem::propertiesName).phases()
+ )
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::functionObjects::phaseMap::~phaseMap()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::functionObjects::phaseMap::execute()
+{
+ return true;
+}
+
+
+bool Foam::functionObjects::phaseMap::write()
+{
+ volScalarField phaseMap
+ (
+ IOobject
+ (
+ IOobject::groupName(phases_[0].member(), "map"),
+ mesh_.time().timeName(),
+ mesh_,
+ IOobject::NO_READ,
+ IOobject::AUTO_WRITE
+ ),
+ mesh_,
+ dimensionedScalar(dimless, 0)
+ );
+
+ scalar level = 0;
+
+ forAll(phases_, i)
+ {
+ phaseMap += level*phases_[i];
+ level += 1;
+ }
+
+ phaseMap.write();
+
+ return true;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseMap/phaseMap.H b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseMap/phaseMap.H
new file mode 100644
index 0000000000..955355d4d3
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/phaseMap/phaseMap.H
@@ -0,0 +1,141 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2020-2021 OpenFOAM Foundation
+ \\/ 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::functionObjects::phaseMap
+
+Description
+ This functionObject writes the phase-fraction map field alpha.map with
+ incremental value ranges for each phase
+ e.g., with values 0 for water, 1 for air, 2 for oil etc.
+
+ Example of function object specification:
+ \verbatim
+ phaseMap
+ {
+ type phaseMap;
+ libs ("libmultiphaseEulerFoamFunctionObjects.so");
+ writeControl writeTime;
+ }
+ \endverbatim
+
+Usage
+ \table
+ Property | Description | Required | Default value
+ type | type name: phaseMap | yes |
+ \endtable
+
+See also
+ Foam::functionObjects::fvMeshFunctionObject
+ Foam::functionObject
+
+SourceFiles
+ phaseMap.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef functionObjects_phaseMap_H
+#define functionObjects_phaseMap_H
+
+#include "fvMeshFunctionObject.H"
+#include "phaseSystem.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+ Class phaseMap Declaration
+\*---------------------------------------------------------------------------*/
+
+class phaseMap
+:
+ public fvMeshFunctionObject
+{
+protected:
+
+ // Protected data
+
+ //- Constant access to phases
+ const phaseSystem::phaseModelList& phases_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("phaseMap");
+
+
+ // Constructors
+
+ //- Construct from Time and dictionary
+ phaseMap
+ (
+ const word& name,
+ const Time& runTime,
+ const dictionary&
+ );
+
+ //- Disallow default bitwise copy construction
+ phaseMap(const phaseMap&) = delete;
+
+
+ //- Destructor
+ virtual ~phaseMap();
+
+
+ // Member Functions
+
+ //- Return the list of fields required
+ virtual wordList fields() const
+ {
+ return wordList::null();
+ }
+
+ //- Calculate the force fields
+ virtual bool execute();
+
+ //- Write the force fields
+ virtual bool write();
+
+
+ // Member Operators
+
+ //- Disallow default bitwise assignment
+ void operator=(const phaseMap&) = delete;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceMoments/populationBalanceMoments.C b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceMoments/populationBalanceMoments.C
new file mode 100644
index 0000000000..e9125285da
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceMoments/populationBalanceMoments.C
@@ -0,0 +1,983 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2022 OpenFOAM Foundation
+ \\/ 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 "populationBalanceMoments.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+ defineTypeNameAndDebug(populationBalanceMoments, 0);
+ addToRunTimeSelectionTable
+ (
+ functionObject,
+ populationBalanceMoments,
+ dictionary
+ );
+}
+}
+
+
+namespace Foam
+{
+ template<>
+ const char* NamedEnum
+ <
+ Foam::functionObjects::populationBalanceMoments::momentType,
+ 4
+ >::names[] = {"integerMoment", "mean", "variance", "stdDev"};
+}
+
+
+const Foam::NamedEnum
+<
+ Foam::functionObjects::populationBalanceMoments::momentType,
+ 4
+>
+Foam::functionObjects::populationBalanceMoments::momentTypeNames_;
+
+
+namespace Foam
+{
+ template<>
+ const char* NamedEnum
+ <
+ Foam::functionObjects::populationBalanceMoments::coordinateType,
+ 3
+ >::names[] = {"volume", "area", "diameter"};
+}
+
+
+const Foam::NamedEnum
+<
+ Foam::functionObjects::populationBalanceMoments::coordinateType,
+ 3
+>
+Foam::functionObjects::populationBalanceMoments::coordinateTypeNames_;
+
+
+namespace Foam
+{
+ template<>
+ const char* NamedEnum
+ <
+ Foam::functionObjects::populationBalanceMoments::weightType,
+ 3
+ >::names[] =
+ {
+ "numberConcentration",
+ "volumeConcentration",
+ "areaConcentration"
+ };
+}
+
+
+const Foam::NamedEnum
+<
+ Foam::functionObjects::populationBalanceMoments::weightType,
+ 3
+>
+Foam::functionObjects::populationBalanceMoments::weightTypeNames_;
+
+
+namespace Foam
+{
+ template<>
+ const char* NamedEnum
+ <
+ Foam::functionObjects::populationBalanceMoments::meanType,
+ 3
+ >::names[] = {"arithmetic", "geometric", "notApplicable"};
+}
+
+
+const Foam::NamedEnum
+<
+ Foam::functionObjects::populationBalanceMoments::meanType,
+ 3
+>
+Foam::functionObjects::populationBalanceMoments::meanTypeNames_;
+
+
+// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
+
+Foam::word
+Foam::functionObjects::populationBalanceMoments::coordinateTypeSymbolicName()
+{
+ word coordinateTypeSymbolicName(word::null);
+
+ switch (coordinateType_)
+ {
+ case coordinateType::volume:
+ {
+ coordinateTypeSymbolicName = "v";
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ coordinateTypeSymbolicName = "a";
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ coordinateTypeSymbolicName = "d";
+
+ break;
+ }
+ }
+
+ return coordinateTypeSymbolicName;
+}
+
+
+Foam::word
+Foam::functionObjects::populationBalanceMoments::weightTypeSymbolicName()
+{
+ word weightTypeSymbolicName(word::null);
+
+ switch (weightType_)
+ {
+ case weightType::numberConcentration:
+ {
+ weightTypeSymbolicName = "N";
+
+ break;
+ }
+ case weightType::volumeConcentration:
+ {
+ weightTypeSymbolicName = "V";
+
+ break;
+ }
+ case weightType::areaConcentration:
+ {
+ weightTypeSymbolicName = "A";
+
+ break;
+ }
+ }
+
+ return weightTypeSymbolicName;
+}
+
+
+Foam::word Foam::functionObjects::populationBalanceMoments::defaultFldName()
+{
+ word meanName
+ (
+ meanType_ == meanType::geometric
+ ? word(meanTypeNames_[meanType_]).capitalise()
+ : word("")
+ );
+
+ return
+ word
+ (
+ IOobject::groupName
+ (
+ "weighted"
+ + meanName
+ + word(momentTypeNames_[momentType_]).capitalise()
+ + "("
+ + weightTypeSymbolicName()
+ + ","
+ + coordinateTypeSymbolicName()
+ + ")",
+ popBal_.name()
+ )
+ );
+}
+
+
+Foam::word
+Foam::functionObjects::populationBalanceMoments::integerMomentFldName()
+{
+ return
+ word
+ (
+ IOobject::groupName
+ (
+ word(momentTypeNames_[momentType_])
+ + Foam::name(order_)
+ + "("
+ + weightTypeSymbolicName()
+ + ","
+ + coordinateTypeSymbolicName()
+ + ")",
+ popBal_.name()
+ )
+ );
+}
+
+
+void Foam::functionObjects::populationBalanceMoments::setDimensions
+(
+ volScalarField& fld,
+ momentType momType
+)
+{
+ switch (momType)
+ {
+ case momentType::integerMoment:
+ {
+ switch (coordinateType_)
+ {
+ case coordinateType::volume:
+ {
+ fld.dimensions().reset
+ (
+ pow(dimVolume, order_)/dimVolume
+ );
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ fld.dimensions().reset
+ (
+ pow(dimArea, order_)/dimVolume
+ );
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ fld.dimensions().reset
+ (
+ pow(dimLength, order_)/dimVolume
+ );
+
+ break;
+ }
+ }
+
+ switch (weightType_)
+ {
+ case weightType::volumeConcentration:
+ {
+ fld.dimensions().reset(fld.dimensions()*dimVolume);
+
+ break;
+ }
+ case weightType::areaConcentration:
+ {
+ fld.dimensions().reset(fld.dimensions()*dimArea);
+
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ break;
+ }
+ case momentType::mean:
+ {
+ switch (coordinateType_)
+ {
+ case coordinateType::volume:
+ {
+ fld.dimensions().reset(dimVolume);
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ fld.dimensions().reset(dimArea);
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ fld.dimensions().reset(dimLength);
+
+ break;
+ }
+ }
+
+ break;
+ }
+ case momentType::variance:
+ {
+ switch (coordinateType_)
+ {
+ case coordinateType::volume:
+ {
+ fld.dimensions().reset(sqr(dimVolume));
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ fld.dimensions().reset(sqr(dimArea));
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ fld.dimensions().reset(sqr(dimLength));
+
+ break;
+ }
+ }
+
+ if (meanType_ == meanType::geometric)
+ {
+ fld.dimensions().reset(dimless);
+ }
+
+ break;
+ }
+ case momentType::stdDev:
+ {
+ switch (coordinateType_)
+ {
+ case coordinateType::volume:
+ {
+ fld.dimensions().reset(dimVolume);
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ fld.dimensions().reset(dimArea);
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ fld.dimensions().reset(dimLength);
+
+ break;
+ }
+ }
+
+ if (meanType_ == meanType::geometric)
+ {
+ fld.dimensions().reset(dimless);
+ }
+
+ break;
+ }
+ }
+}
+
+
+Foam::tmp
+Foam::functionObjects::populationBalanceMoments::totalConcentration()
+{
+ tmp tTotalConcentration
+ (
+ volScalarField::New
+ (
+ "totalConcentration",
+ mesh_,
+ dimensionedScalar(inv(dimVolume), Zero)
+ )
+ );
+
+ volScalarField& totalConcentration = tTotalConcentration.ref();
+
+ switch (weightType_)
+ {
+ case weightType::volumeConcentration:
+ {
+ totalConcentration.dimensions().reset
+ (
+ totalConcentration.dimensions()*dimVolume
+ );
+
+ break;
+ }
+ case weightType::areaConcentration:
+ {
+ totalConcentration.dimensions().reset
+ (
+ totalConcentration.dimensions()*dimArea
+ );
+
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ forAll(popBal_.sizeGroups(), i)
+ {
+ const Foam::diameterModels::sizeGroup& fi = popBal_.sizeGroups()[i];
+
+ switch (weightType_)
+ {
+ case weightType::numberConcentration:
+ {
+ totalConcentration += fi*fi.phase()/fi.x();
+
+ break;
+ }
+ case weightType::volumeConcentration:
+ {
+ totalConcentration += fi*fi.phase();
+
+ break;
+ }
+ case weightType::areaConcentration:
+ {
+ totalConcentration += fi.a()*fi*fi.phase()/fi.x();
+
+ break;
+ }
+ }
+ }
+
+ return tTotalConcentration;
+}
+
+
+Foam::tmp
+Foam::functionObjects::populationBalanceMoments::mean()
+{
+ tmp tMean
+ (
+ volScalarField::New
+ (
+ "mean",
+ mesh_,
+ dimensionedScalar(dimless, Zero)
+ )
+ );
+
+ volScalarField& mean = tMean.ref();
+
+ setDimensions(mean, momentType::mean);
+
+ volScalarField totalConcentration(this->totalConcentration());
+
+ forAll(popBal_.sizeGroups(), i)
+ {
+ const Foam::diameterModels::sizeGroup& fi = popBal_.sizeGroups()[i];
+
+ volScalarField concentration(fi*fi.phase()/fi.x());
+
+ switch (weightType_)
+ {
+ case weightType::volumeConcentration:
+ {
+ concentration *= fi.x();
+
+ break;
+ }
+ case weightType::areaConcentration:
+ {
+ concentration *= fi.a();
+
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ switch (meanType_)
+ {
+ case meanType::geometric:
+ {
+ mean.dimensions().reset(dimless);
+
+ switch (coordinateType_)
+ {
+ case coordinateType::volume:
+ {
+ dimensionedScalar unitVolume(dimVolume, 1);
+
+ mean +=
+ Foam::log(fi.x()/unitVolume)
+ *concentration/totalConcentration;
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ dimensionedScalar unitArea(dimArea, 1);
+
+ mean +=
+ Foam::log(fi.a()/unitArea)
+ *concentration/totalConcentration;
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ dimensionedScalar unitLength(dimLength, 1);
+
+ mean +=
+ Foam::log(fi.d()/unitLength)
+ *concentration/totalConcentration;
+
+ break;
+ }
+ }
+
+ break;
+ }
+ default:
+ {
+ switch (coordinateType_)
+ {
+ case coordinateType::volume:
+ {
+ mean += fi.x()*concentration/totalConcentration;
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ mean += fi.a()*concentration/totalConcentration;
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ mean += fi.d()*concentration/totalConcentration;
+
+ break;
+ }
+ }
+
+ break;
+ }
+ }
+ }
+
+ if (meanType_ == meanType::geometric)
+ {
+ mean = exp(mean);
+
+ setDimensions(mean, momentType::mean);
+ }
+
+ return tMean;
+}
+
+
+Foam::tmp
+Foam::functionObjects::populationBalanceMoments::variance()
+{
+ tmp tVariance
+ (
+ volScalarField::New
+ (
+ "variance",
+ mesh_,
+ dimensionedScalar(dimless, Zero)
+ )
+ );
+
+ volScalarField& variance = tVariance.ref();
+
+ setDimensions(variance, momentType::variance);
+
+ volScalarField totalConcentration(this->totalConcentration());
+ volScalarField mean(this->mean());
+
+ forAll(popBal_.sizeGroups(), i)
+ {
+ const Foam::diameterModels::sizeGroup& fi = popBal_.sizeGroups()[i];
+
+ volScalarField concentration(fi*fi.phase()/fi.x());
+
+ switch (weightType_)
+ {
+ case weightType::volumeConcentration:
+ {
+ concentration *= fi.x();
+
+ break;
+ }
+ case weightType::areaConcentration:
+ {
+ concentration *= fi.a();
+
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ switch (meanType_)
+ {
+ case meanType::geometric:
+ {
+ switch (coordinateType_)
+ {
+ case coordinateType::volume:
+ {
+ variance +=
+ sqr(Foam::log(fi.x()/mean))
+ *concentration/totalConcentration;
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ variance +=
+ sqr(Foam::log(fi.a()/mean))
+ *concentration/totalConcentration;
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ variance +=
+ sqr(Foam::log(fi.d()/mean))
+ *concentration/totalConcentration;
+
+ break;
+ }
+ }
+
+ break;
+ }
+ default:
+ {
+ switch (coordinateType_)
+ {
+ case coordinateType::volume:
+ {
+ variance +=
+ sqr(fi.x() - mean)*concentration/totalConcentration;
+
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ variance +=
+ sqr(fi.a() - mean)*concentration/totalConcentration;
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ variance +=
+ sqr(fi.d() - mean)*concentration/totalConcentration;
+
+ break;
+ }
+ }
+
+ break;
+ }
+ }
+ }
+
+ return tVariance;
+}
+
+
+Foam::tmp
+Foam::functionObjects::populationBalanceMoments::stdDev()
+{
+ switch (meanType_)
+ {
+ case meanType::geometric:
+ {
+ return exp(sqrt(this->variance()));
+ }
+ default:
+ {
+ return sqrt(this->variance());
+ }
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::functionObjects::populationBalanceMoments::populationBalanceMoments
+(
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+)
+:
+ fvMeshFunctionObject(name, runTime, dict),
+ popBal_
+ (
+ obr_.lookupObject
+ (
+ dict.lookup("populationBalance")
+ )
+ ),
+ momentType_(momentTypeNames_.read(dict.lookup("momentType"))),
+ coordinateType_(coordinateTypeNames_.read(dict.lookup("coordinateType"))),
+ weightType_
+ (
+ dict.found("weightType")
+ ? weightTypeNames_.read(dict.lookup("weightType"))
+ : weightType::numberConcentration
+ ),
+ meanType_(meanType::notApplicable),
+ order_(-1),
+ fldPtr_(nullptr)
+{
+ read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::functionObjects::populationBalanceMoments::~populationBalanceMoments()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool
+Foam::functionObjects::populationBalanceMoments::read(const dictionary& dict)
+{
+ fvMeshFunctionObject::read(dict);
+
+ switch (momentType_)
+ {
+ case momentType::integerMoment:
+ {
+ order_ = dict.lookup("order");
+
+ break;
+ }
+ default:
+ {
+ meanType_ =
+ dict.found("meanType")
+ ? meanTypeNames_.read(dict.lookup("meanType"))
+ : meanType::arithmetic;
+
+ break;
+ }
+ }
+
+ switch (momentType_)
+ {
+ case momentType::integerMoment:
+ {
+ fldPtr_.set
+ (
+ new volScalarField
+ (
+ IOobject
+ (
+ this->integerMomentFldName(),
+ mesh_.time().timeName(),
+ mesh_,
+ IOobject::NO_READ,
+ IOobject::NO_WRITE
+ ),
+ mesh_,
+ dimensionedScalar(dimless, Zero)
+ )
+ );
+
+ volScalarField& integerMoment = fldPtr_();
+
+ setDimensions(integerMoment, momentType::integerMoment);
+
+ break;
+ }
+ case momentType::mean:
+ {
+ fldPtr_.set
+ (
+ new volScalarField
+ (
+ IOobject
+ (
+ this->defaultFldName(),
+ mesh_.time().timeName(),
+ mesh_,
+ IOobject::NO_READ,
+ IOobject::NO_WRITE
+ ),
+ this->mean()
+ )
+ );
+
+ break;
+ }
+ case momentType::variance:
+ {
+ fldPtr_.set
+ (
+ new volScalarField
+ (
+ IOobject
+ (
+ this->defaultFldName(),
+ mesh_.time().timeName(),
+ mesh_,
+ IOobject::NO_READ,
+ IOobject::NO_WRITE
+ ),
+ this->variance()
+ )
+ );
+
+ break;
+ }
+ case momentType::stdDev:
+ {
+ fldPtr_.set
+ (
+ new volScalarField
+ (
+ IOobject
+ (
+ this->defaultFldName(),
+ mesh_.time().timeName(),
+ mesh_,
+ IOobject::NO_READ,
+ IOobject::NO_WRITE
+ ),
+ this->stdDev()
+ )
+ );
+
+ break;
+ }
+ }
+
+ return true;
+}
+
+
+bool Foam::functionObjects::populationBalanceMoments::execute()
+{
+ switch (momentType_)
+ {
+ case momentType::integerMoment:
+ {
+ volScalarField& integerMoment = fldPtr_();
+
+ integerMoment = Zero;
+
+ forAll(popBal_.sizeGroups(), i)
+ {
+ const Foam::diameterModels::sizeGroup& fi =
+ popBal_.sizeGroups()[i];
+
+ volScalarField concentration(fi*fi.phase()/fi.x());
+
+ switch (weightType_)
+ {
+ case weightType::volumeConcentration:
+ {
+ concentration *= fi.x();
+
+ break;
+ }
+ case weightType::areaConcentration:
+ {
+ concentration *= fi.a();
+
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+
+ switch (coordinateType_)
+ {
+ case coordinateType::volume:
+ {
+ integerMoment +=
+ pow(fi.x(), order_)*concentration;
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ integerMoment +=
+ pow(fi.a(), order_)*concentration;
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ integerMoment +=
+ pow(fi.d(), order_)*concentration;
+
+ break;
+ }
+ }
+ }
+
+ break;
+ }
+ case momentType::mean:
+ {
+ fldPtr_() = this->mean();
+
+ break;
+ }
+ case momentType::variance:
+ {
+ fldPtr_() = this->variance();
+
+ break;
+ }
+ case momentType::stdDev:
+ {
+ fldPtr_() = sqrt(this->variance());
+
+ break;
+ }
+ }
+
+ return true;
+}
+
+
+bool Foam::functionObjects::populationBalanceMoments::write()
+{
+ writeObject(fldPtr_->name());
+
+ return true;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceMoments/populationBalanceMoments.H b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceMoments/populationBalanceMoments.H
new file mode 100644
index 0000000000..858b1f0074
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceMoments/populationBalanceMoments.H
@@ -0,0 +1,258 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2022 OpenFOAM Foundation
+ \\/ 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::functionObjects::populationBalanceMoments
+
+Description
+ Calculates and writes out integral (integer moments) or mean properties
+ (mean, variance, standard deviation) of a size distribution determined by a
+ population balance model. Requires solver post-processing.
+
+ The following function object specification for example returns the first
+ moment of the volume-based number density function which is equivalent to
+ the phase fraction of the particulate phase:
+
+ \verbatim
+ populationBalanceMoments
+ {
+ type populationBalanceMoments;
+ libs ("libmultiphaseEulerFoamFunctionObjects.so");
+ executeControl timeStep;
+ writeControl writeTime;
+ populationBalance bubbles;
+ momentType integerMoment;
+ coordinateType volume;
+ order 1;
+ }
+ \endverbatim
+
+Usage
+ \table
+ Property | Description | Required | Default
+ populationBalance | population balance name | yes |
+ momentType | desired moment of the distribution\\
+ | yes |
+ coordinateType | particle property | yes |
+ weightType | number/volume/area concentration\\
+ | no\\
+ | numberConcentration
+ order | order of integer moment | for integer moments |
+ meanType | arithmetic or geometric | for non-integer moments\\
+ | arithmetic
+ \endtable
+
+See also
+ Foam::diameterModels::populationBalanceModel
+ Foam::functionObjects::fvMeshFunctionObject
+ Foam::functionObject
+
+SourceFiles
+ populationBalanceMoments.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef functionObjects_populationBalanceMoments_H
+#define functionObjects_populationBalanceMoments_H
+
+#include "fvMeshFunctionObject.H"
+#include "populationBalanceModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+ Class populationBalanceMoments Declaration
+\*---------------------------------------------------------------------------*/
+
+class populationBalanceMoments
+:
+ public fvMeshFunctionObject
+{
+public:
+
+ //- Enumeration for the moment types
+ enum class momentType
+ {
+ integerMoment,
+ mean,
+ variance,
+ stdDev
+ };
+
+ //- Names of the moment types
+ static const NamedEnum momentTypeNames_;
+
+ //- Enumeration for the coordinate types
+ enum class coordinateType
+ {
+ volume,
+ area,
+ diameter
+ };
+
+ //- Names of the coordinate types
+ static const NamedEnum coordinateTypeNames_;
+
+ //- Enumeration for the weight types
+ enum class weightType
+ {
+ numberConcentration,
+ volumeConcentration,
+ areaConcentration
+ };
+
+ //- Names of the weight types
+ static const NamedEnum weightTypeNames_;
+
+ //- Enumeration for the mean types
+ enum class meanType
+ {
+ arithmetic,
+ geometric,
+ notApplicable
+ };
+
+ //- Names of the mean types
+ static const NamedEnum meanTypeNames_;
+
+
+private:
+
+ // Private Data
+
+ //- Reference to population balance
+ const Foam::diameterModels::populationBalanceModel& popBal_;
+
+ //- Moment type
+ momentType momentType_;
+
+ //- Coordinate type
+ coordinateType coordinateType_;
+
+ //- Weight type
+ weightType weightType_;
+
+ //- Mean type
+ meanType meanType_;
+
+ //- Integer moment order
+ int order_;
+
+ //- Result field
+ autoPtr fldPtr_;
+
+
+ // Private Member Functions
+
+ //- Coordinate type symbolic name for shorter field names
+ word coordinateTypeSymbolicName();
+
+ //- Weight type symbolic name for shorter field names
+ word weightTypeSymbolicName();
+
+ //- Default field name
+ word defaultFldName();
+
+ //- Integer moment field name
+ word integerMomentFldName();
+
+ //- Set dimensions
+ void setDimensions(volScalarField& fld, momentType momType);
+
+ //- Total concentration
+ tmp totalConcentration();
+
+ //- Mean value
+ tmp mean();
+
+ //- Variance
+ tmp variance();
+
+ //- Standard deviation
+ tmp stdDev();
+
+
+public:
+
+ //- Runtime type information
+ TypeName("populationBalanceMoments");
+
+
+ // Constructors
+
+ //- Construct from Time and dictionary
+ populationBalanceMoments
+ (
+ const word& name,
+ const Time& runTime,
+ const dictionary&
+ );
+
+ //- Disallow default bitwise copy construction
+ populationBalanceMoments(const populationBalanceMoments&) = delete;
+
+
+ //- Destructor
+ virtual ~populationBalanceMoments();
+
+
+ // Member Functions
+
+ //- Read the data
+ virtual bool read(const dictionary&);
+
+ //- Return the list of fields required
+ virtual wordList fields() const
+ {
+ return wordList::null();
+ }
+
+ //- Calculate the moment fields
+ virtual bool execute();
+
+ //- Write the moment fields
+ virtual bool write();
+
+
+ // Member Operators
+
+ //- Disallow default bitwise assignment
+ void operator=(const populationBalanceMoments&) = delete;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceSizeDistribution/populationBalanceSizeDistribution.C b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceSizeDistribution/populationBalanceSizeDistribution.C
new file mode 100644
index 0000000000..c95a7fe5b6
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceSizeDistribution/populationBalanceSizeDistribution.C
@@ -0,0 +1,664 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2017-2022 OpenFOAM Foundation
+ \\/ 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 "populationBalanceSizeDistribution.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+ defineTypeNameAndDebug(populationBalanceSizeDistribution, 0);
+ addToRunTimeSelectionTable
+ (
+ functionObject,
+ populationBalanceSizeDistribution,
+ dictionary
+ );
+}
+}
+
+template<>
+const char*
+Foam::NamedEnum
+<
+ Foam::functionObjects::populationBalanceSizeDistribution::functionType,
+ 6
+>::names[] =
+{
+ "numberConcentration",
+ "numberDensity",
+ "volumeConcentration",
+ "volumeDensity",
+ "areaConcentration",
+ "areaDensity"
+};
+
+const Foam::NamedEnum
+<
+ Foam::functionObjects::populationBalanceSizeDistribution::functionType,
+ 6
+> Foam::functionObjects::populationBalanceSizeDistribution::functionTypeNames_;
+
+template<>
+const char*
+Foam::NamedEnum
+<
+ Foam::functionObjects::populationBalanceSizeDistribution::coordinateType,
+ 4
+>::names[] =
+{
+ "volume",
+ "area",
+ "diameter",
+ "projectedAreaDiameter"
+};
+
+const Foam::NamedEnum
+<
+ Foam::functionObjects::populationBalanceSizeDistribution::coordinateType,
+ 4
+> Foam::functionObjects::populationBalanceSizeDistribution::
+ coordinateTypeNames_;
+
+
+namespace Foam
+{
+ template<>
+ const char* NamedEnum
+ <
+ Foam::functionObjects::populationBalanceSizeDistribution::weightType,
+ 4
+ >::names[] =
+ {
+ "numberConcentration",
+ "volumeConcentration",
+ "areaConcentration",
+ "cellVolume"
+ };
+}
+
+
+const Foam::NamedEnum
+<
+ Foam::functionObjects::populationBalanceSizeDistribution::weightType,
+ 4
+>
+Foam::functionObjects::populationBalanceSizeDistribution::weightTypeNames_;
+
+using Foam::constant::mathematical::pi;
+
+
+// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
+
+Foam::word
+Foam::functionObjects::populationBalanceSizeDistribution::
+functionTypeSymbolicName()
+{
+ word functionTypeSymbolicName(word::null);
+
+ switch (functionType_)
+ {
+ case functionType::numberConcentration:
+ {
+ functionTypeSymbolicName = "N";
+
+ break;
+ }
+ case functionType::numberDensity:
+ {
+ functionTypeSymbolicName = "n";
+
+ break;
+ }
+ case functionType::volumeConcentration:
+ {
+ functionTypeSymbolicName = "V";
+
+ break;
+ }
+ case functionType::volumeDensity:
+ {
+ functionTypeSymbolicName = "v";
+
+ break;
+ }
+ case functionType::areaConcentration:
+ {
+ functionTypeSymbolicName = "A";
+
+ break;
+ }
+ case functionType::areaDensity:
+ {
+ functionTypeSymbolicName = "a";
+
+ break;
+ }
+ }
+
+ return functionTypeSymbolicName;
+}
+
+
+Foam::word
+Foam::functionObjects::populationBalanceSizeDistribution::
+coordinateTypeSymbolicName
+(
+ const coordinateType& cType
+)
+{
+ word coordinateTypeSymbolicName(word::null);
+
+ switch (cType)
+ {
+ case coordinateType::volume:
+ {
+ coordinateTypeSymbolicName = "v";
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ coordinateTypeSymbolicName = "a";
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ coordinateTypeSymbolicName = "d";
+
+ break;
+ }
+ case coordinateType::projectedAreaDiameter:
+ {
+ coordinateTypeSymbolicName = "dPa";
+
+ break;
+ }
+ }
+
+ return coordinateTypeSymbolicName;
+}
+
+
+Foam::tmp
+Foam::functionObjects::populationBalanceSizeDistribution::filterField
+(
+ const scalarField& field
+) const
+{
+ if (isNull(cellIDs()))
+ {
+ return field;
+ }
+ else
+ {
+ return tmp(new scalarField(field, cellIDs()));
+ }
+}
+
+
+Foam::scalar
+Foam::functionObjects::populationBalanceSizeDistribution::averageCoordinateValue
+(
+ const Foam::diameterModels::sizeGroup& fi,
+ const coordinateType& cType
+)
+{
+ scalar averageCoordinateValue(Zero);
+
+ switch (cType)
+ {
+ case coordinateType::volume:
+ {
+ averageCoordinateValue = fi.x().value();
+
+ break;
+ }
+ case coordinateType::area:
+ {
+ averageCoordinateValue =
+ weightedAverage(fi.a(), fi);
+
+ break;
+ }
+ case coordinateType::diameter:
+ {
+ averageCoordinateValue =
+ weightedAverage(fi.d(), fi);
+
+ break;
+ }
+ case coordinateType::projectedAreaDiameter:
+ {
+ averageCoordinateValue =
+ weightedAverage(sqrt(fi.a()/pi), fi);
+
+ break;
+ }
+ }
+
+ return averageCoordinateValue;
+}
+
+
+Foam::scalar
+Foam::functionObjects::populationBalanceSizeDistribution::weightedAverage
+(
+ const Foam::scalarField& fld,
+ const Foam::diameterModels::sizeGroup& fi
+)
+{
+ scalar weightedAverage(Zero);
+
+ switch (weightType_)
+ {
+ case weightType::numberConcentration:
+ {
+ scalarField Ni(filterField(fi*fi.phase()/fi.x().value()));
+
+ if (gSum(Ni) == 0)
+ {
+ weightedAverage =
+ gSum(filterField(mesh_.V()*fld))/this->V();
+ }
+ else
+ {
+ weightedAverage =
+ gSum(Ni*filterField(fld))/gSum(Ni);
+ }
+
+ break;
+ }
+ case weightType::volumeConcentration:
+ {
+ scalarField Vi(filterField(fi*fi.phase()));
+
+ if (gSum(Vi) == 0)
+ {
+ weightedAverage =
+ gSum(filterField(mesh_.V()*fld))/this->V();
+ }
+ else
+ {
+ weightedAverage =
+ gSum(Vi*filterField(fld))/gSum(Vi);
+ }
+
+ break;
+ }
+ case weightType::areaConcentration:
+ {
+ scalarField Ai(filterField(fi.a().ref()*fi.phase()));
+
+ if (gSum(Ai) == 0)
+ {
+ weightedAverage =
+ gSum(filterField(mesh_.V()*fld))/this->V();
+ }
+ else
+ {
+ weightedAverage =
+ gSum(Ai*filterField(fld))/gSum(Ai);
+ }
+
+ break;
+ }
+ case weightType::cellVolume:
+ {
+ weightedAverage =
+ gSum(filterField(mesh_.V()*fld))/this->V();
+
+ break;
+ }
+ }
+
+ return weightedAverage;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::functionObjects::populationBalanceSizeDistribution::
+populationBalanceSizeDistribution
+(
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+)
+:
+ fvMeshFunctionObject(name, runTime, dict),
+ volRegion(fvMeshFunctionObject::mesh_, dict),
+ file_(obr_, name),
+ mesh_(fvMeshFunctionObject::mesh_),
+ popBal_
+ (
+ obr_.lookupObject
+ (
+ dict.lookup("populationBalance")
+ )
+ ),
+ functionType_(functionTypeNames_.read(dict.lookup("functionType"))),
+ coordinateType_(coordinateTypeNames_.read(dict.lookup("coordinateType"))),
+ allCoordinates_
+ (
+ dict.lookupOrDefault("allCoordinates", false)
+ ),
+ normalise_(dict.lookupOrDefault("normalise", false)),
+ logTransform_
+ (
+ dict.lookupOrDefaultBackwardsCompatible
+ (
+ {"logTransform", "geometric"},
+ false
+ )
+ ),
+ weightType_
+ (
+ dict.found("weightType")
+ ? weightTypeNames_.read(dict.lookup("weightType"))
+ : weightType::numberConcentration
+ ),
+ formatterPtr_(nullptr)
+{
+ read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::functionObjects::populationBalanceSizeDistribution::
+~populationBalanceSizeDistribution()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::functionObjects::populationBalanceSizeDistribution::read
+(
+ const dictionary& dict
+)
+{
+ Log << type() << " " << name() << ":" << nl;
+
+ fvMeshFunctionObject::read(dict);
+
+ formatterPtr_ = setWriter::New(dict.lookup("setFormat"), dict);
+
+ return false;
+}
+
+
+bool Foam::functionObjects::populationBalanceSizeDistribution::execute()
+{
+ return true;
+}
+
+
+bool Foam::functionObjects::populationBalanceSizeDistribution::write()
+{
+ Log << type() << " " << name() << " write:" << nl;
+
+ const UPtrList& sizeGroups =
+ popBal_.sizeGroups();
+
+ scalarField coordinateValues(sizeGroups.size());
+ scalarField boundaryValues(sizeGroups.size() + 1);
+ scalarField resultValues(sizeGroups.size());
+
+ forAll(sizeGroups, i)
+ {
+ const diameterModels::sizeGroup& fi = sizeGroups[i];
+
+ coordinateValues[i] = averageCoordinateValue(fi, coordinateType_);
+ }
+
+ if
+ (
+ functionType_ == functionType::numberDensity
+ || functionType_ == functionType::volumeDensity
+ || functionType_ == functionType::areaDensity
+ )
+ {
+ boundaryValues.first() = coordinateValues.first();
+ boundaryValues.last() = coordinateValues.last();
+
+ for (label i = 1; i < boundaryValues.size() - 1; i++)
+ {
+ boundaryValues[i] =
+ 0.5*(coordinateValues[i] + coordinateValues[i-1]);
+ }
+
+ if (logTransform_)
+ {
+ boundaryValues = Foam::log(boundaryValues);
+ }
+ }
+
+ switch (functionType_)
+ {
+ case functionType::numberConcentration:
+ {
+ forAll(sizeGroups, i)
+ {
+ const diameterModels::sizeGroup& fi = sizeGroups[i];
+
+ resultValues[i] =
+ gSum(filterField(mesh_.V()*fi*fi.phase()/fi.x()))/this->V();
+ }
+
+ if (normalise_ && sum(resultValues) != 0)
+ {
+ resultValues /= sum(resultValues);
+ }
+
+ break;
+ }
+ case functionType::numberDensity:
+ {
+ forAll(sizeGroups, i)
+ {
+ const diameterModels::sizeGroup& fi = sizeGroups[i];
+
+ resultValues[i] =
+ gSum(filterField(mesh_.V()*fi*fi.phase()/fi.x()))/this->V();
+ }
+
+ if (normalise_ && sum(resultValues) != 0)
+ {
+ resultValues /= sum(resultValues);
+ }
+
+ forAll(resultValues, i)
+ {
+ resultValues[i] /= (boundaryValues[i+1] - boundaryValues[i]);
+ }
+
+ break;
+ }
+ case functionType::volumeConcentration:
+ {
+ forAll(sizeGroups, i)
+ {
+ const diameterModels::sizeGroup& fi = sizeGroups[i];
+
+ resultValues[i] =
+ gSum(filterField(mesh_.V()*fi*fi.phase()))/this->V();
+ }
+
+ if (normalise_ && sum(resultValues) != 0)
+ {
+ resultValues /= sum(resultValues);
+ }
+
+ break;
+ }
+ case functionType::volumeDensity:
+ {
+ forAll(sizeGroups, i)
+ {
+ const diameterModels::sizeGroup& fi = sizeGroups[i];
+
+ resultValues[i] =
+ gSum(filterField(mesh_.V()*fi*fi.phase()))/this->V();
+ }
+
+ if (normalise_ && sum(resultValues) != 0)
+ {
+ resultValues /= sum(resultValues);
+ }
+
+ forAll(resultValues, i)
+ {
+ resultValues[i] /= (boundaryValues[i+1] - boundaryValues[i]);
+ }
+
+ break;
+ }
+ case functionType::areaConcentration:
+ {
+ forAll(sizeGroups, i)
+ {
+ const diameterModels::sizeGroup& fi = sizeGroups[i];
+
+ resultValues[i] =
+ gSum
+ (
+ filterField(mesh_.V()*fi.a().ref()*fi*fi.phase()/fi.x())
+ )
+ /this->V();
+ }
+
+ if (normalise_ && sum(resultValues) != 0)
+ {
+ resultValues /= sum(resultValues);
+ }
+
+ break;
+ }
+ case functionType::areaDensity:
+ {
+ forAll(sizeGroups, i)
+ {
+ const diameterModels::sizeGroup& fi = sizeGroups[i];
+
+ resultValues[i] =
+ gSum
+ (
+ filterField(mesh_.V()*fi.a().ref()*fi*fi.phase()/fi.x())
+ )
+ /this->V();
+ }
+
+ if (normalise_ && sum(resultValues) != 0)
+ {
+ resultValues /= sum(resultValues);
+ }
+
+ forAll(resultValues, i)
+ {
+ resultValues[i] /= (boundaryValues[i+1] - boundaryValues[i]);
+ }
+
+ break;
+ }
+ }
+
+
+ if (allCoordinates_)
+ {
+ wordList otherCoordinateSymbolicNames(coordinateTypeNames_.size());
+ PtrList otherCoordinateValues(coordinateTypeNames_.size());
+ typedef NamedEnum namedEnumCoordinateType;
+
+ forAllConstIter(namedEnumCoordinateType, coordinateTypeNames_, iter)
+ {
+ const coordinateType cType = coordinateTypeNames_[iter.key()];
+
+ otherCoordinateSymbolicNames[cType] =
+ coordinateTypeSymbolicName(cType);
+
+ otherCoordinateValues.set
+ (
+ cType,
+ new scalarField(popBal_.sizeGroups().size())
+ );
+
+ forAll(sizeGroups, i)
+ {
+ const diameterModels::sizeGroup& fi = sizeGroups[i];
+
+ otherCoordinateValues[cType][i] =
+ averageCoordinateValue(fi, cType);
+ }
+ }
+
+ if (Pstream::master())
+ {
+ formatterPtr_->write
+ (
+ file_.baseTimeDir(),
+ name(),
+ coordSet
+ (
+ true,
+ coordinateTypeSymbolicName(coordinateType_),
+ coordinateValues
+ ),
+ functionTypeSymbolicName(),
+ resultValues,
+ otherCoordinateSymbolicNames,
+ otherCoordinateValues
+ );
+ }
+ }
+ else
+ {
+ if (Pstream::master())
+ {
+ formatterPtr_->write
+ (
+ file_.baseTimeDir(),
+ name(),
+ coordSet
+ (
+ true,
+ coordinateTypeSymbolicName(coordinateType_),
+ coordinateValues
+ ),
+ functionTypeSymbolicName(),
+ resultValues
+ );
+ }
+ }
+
+ return true;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceSizeDistribution/populationBalanceSizeDistribution.H b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceSizeDistribution/populationBalanceSizeDistribution.H
new file mode 100644
index 0000000000..d9b8832b03
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/functionObjects/populationBalanceSizeDistribution/populationBalanceSizeDistribution.H
@@ -0,0 +1,268 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2017-2022 OpenFOAM Foundation
+ \\/ 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::functionObjects::populationBalanceSizeDistribution
+
+Description
+ Writes out the size distribution determined by a population balance model,
+ either for the entire domain or a cell zone. Requires solver post-
+ processing.
+
+ The following function object specification for example returns the volume-
+ based number density function:
+
+ Example of function object specification:
+ \verbatim
+ numberDensity
+ {
+ type populationBalanceSizeDistribution;
+ libs ("libmultiphaseEulerFoamFunctionObjects.so");
+ writeControl writeTime;
+ populationBalance bubbles;
+ functionType numberDensity;
+ coordinateType volume;
+ setFormat raw;
+ }
+ \endverbatim
+
+Usage
+ \table
+ Property | Description | Required | Default
+ populationBalance | population balance name | yes |
+ functionType | function type | yes |
+ coordinateType | particle property | yes |
+ allCoordinates | write all coordinate values | no | false
+ normalise | divide by total concentration | no | false
+ logTransform | class width based on log of coordinate\\
+ | no | false
+ weightType | weighting in case of field-dependent particle\\
+ properties | no\\
+ | numberConcentration
+ regionType | cellZone or all | no | all
+ name | name of cellZone if required | no |
+ setFormat | output format | yes |
+ \endtable
+
+See also
+ Foam::diameterModels::populationBalanceModel
+ Foam::functionObjects::fvMeshFunctionObject
+ Foam::functionObjects::volRegion
+ Foam::functionObject
+
+SourceFiles
+ populationBalanceSizeDistribution.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef populationBalanceSizeDistribution_H
+#define populationBalanceSizeDistribution_H
+
+#include "fvMeshFunctionObject.H"
+#include "volRegion.H"
+#include "populationBalanceModel.H"
+#include "writeFile.H"
+#include "setWriter.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace functionObjects
+{
+
+/*---------------------------------------------------------------------------*\
+ Class populationBalanceSizeDistribution Declaration
+\*---------------------------------------------------------------------------*/
+
+class populationBalanceSizeDistribution
+:
+ public fvMeshFunctionObject,
+ public volRegion
+{
+public:
+
+ // Public Data Types
+
+ //- Function type enumeration
+ enum functionType
+ {
+ numberConcentration,
+ numberDensity,
+ volumeConcentration,
+ volumeDensity,
+ areaConcentration,
+ areaDensity
+ };
+
+ //- Function type names
+ static const NamedEnum functionTypeNames_;
+
+ //- Coordinate type enumeration
+ enum coordinateType
+ {
+ volume,
+ area,
+ diameter,
+ projectedAreaDiameter
+ };
+
+ //- Coordinate type names
+ static const NamedEnum coordinateTypeNames_;
+
+ //- Enumeration for the weight types
+ enum class weightType
+ {
+ numberConcentration,
+ volumeConcentration,
+ areaConcentration,
+ cellVolume
+ };
+
+ //- Names of the weight types
+ static const NamedEnum weightTypeNames_;
+
+
+private:
+
+ // Private Data
+
+ //- Write file
+ writeFile file_;
+
+ //- Reference to mesh
+ const fvMesh& mesh_;
+
+ //- Reference to population balance
+ const Foam::diameterModels::populationBalanceModel& popBal_;
+
+ //- Function type
+ functionType functionType_;
+
+ //- Coordinate type
+ coordinateType coordinateType_;
+
+ //- Add values for all coordinate types to output
+ Switch allCoordinates_;
+
+ //- Normalise result through division by sum
+ Switch normalise_;
+
+ //- Log transform
+ Switch logTransform_;
+
+ //- Weight types, relevant if particle properties are field dependent
+ weightType weightType_;
+
+ //- Set formatter
+ autoPtr formatterPtr_;
+
+
+ // Private Member Functions
+
+ //- Function type symbolic name for shorter file header
+ word functionTypeSymbolicName();
+
+ //- Coordinate type symbolic name for shorter file header
+ word coordinateTypeSymbolicName(const coordinateType& cType);
+
+ //- Filter a field according to cellIds
+ tmp filterField(const scalarField& field) const;
+
+ //- Field averaged coordinate value
+ scalar averageCoordinateValue
+ (
+ const diameterModels::sizeGroup& fi,
+ const coordinateType& cType
+ );
+
+ //- Weighted average
+ scalar weightedAverage
+ (
+ const scalarField& fld,
+ const diameterModels::sizeGroup& fi
+ );
+
+
+public:
+
+ //- Runtime type information
+ TypeName("populationBalanceSizeDistribution");
+
+
+ // Constructors
+
+ //- Construct from Time and dictionary
+ populationBalanceSizeDistribution
+ (
+ const word& name,
+ const Time& runTime,
+ const dictionary& dict
+ );
+
+ //- Disallow default bitwise copy construction
+ populationBalanceSizeDistribution
+ (
+ const populationBalanceSizeDistribution&
+ ) = delete;
+
+
+ //- Destructor
+ virtual ~populationBalanceSizeDistribution();
+
+
+ // Member Functions
+
+ //- Return the list of fields required
+ virtual wordList fields() const
+ {
+ return wordList::null();
+ }
+
+ //- Read the populationBalanceSizeDistribution data
+ virtual bool read(const dictionary&);
+
+ //- Execute, currently does nothing
+ virtual bool execute();
+
+ //- Calculate and write the size distribution
+ virtual bool write();
+
+
+ // Member Operators
+
+ //- Disallow default bitwise assignment
+ void operator=(const populationBalanceSizeDistribution&) = delete;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace functionObjects
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/fvModels/Make/files b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/Make/files
new file mode 100644
index 0000000000..44e83034b9
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/Make/files
@@ -0,0 +1,4 @@
+phaseTurbulenceStabilisation/phaseTurbulenceStabilisation.C
+interfaceTurbulenceDamping/interfaceTurbulenceDamping.C
+
+LIB = $(FOAM_LIBBIN)/libmultiphaseEulerFoamFvModels
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/fvModels/Make/options b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/Make/options
new file mode 100644
index 0000000000..ae9e6b5ce9
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/Make/options
@@ -0,0 +1,23 @@
+EXE_INC = \
+ -I../phaseSystems/lnInclude \
+ -I$(LIB_SRC)/physicalProperties/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/momentumTransportModels/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/compressible/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/phaseCompressible/lnInclude \
+ -I$(LIB_SRC)/finiteVolume/lnInclude \
+ -I$(LIB_SRC)/meshTools/lnInclude
+
+LIB_LIBS = \
+ -lphaseSystem \
+ -lmultiphaseSystems \
+ -leulerianInterfacialModels \
+ -leulerianInterfacialCompositionModels \
+ -lmultiphaseMomentumTransportModels \
+ -lmultiphaseReactions \
+ -lmultiphaseProperties \
+ -lphaseFluidThermophysicalTransportModels \
+ -lphaseFluidMulticomponentThermophysicalTransportModels \
+ -lfiniteVolume \
+ -lfvModels \
+ -lmeshTools
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/fvModels/interfaceTurbulenceDamping/interfaceTurbulenceDamping.C b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/interfaceTurbulenceDamping/interfaceTurbulenceDamping.C
new file mode 100644
index 0000000000..fd33527ddc
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/interfaceTurbulenceDamping/interfaceTurbulenceDamping.C
@@ -0,0 +1,321 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2022 OpenFOAM Foundation
+ \\/ 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 "interfaceTurbulenceDamping.H"
+#include "surfaceInterpolate.H"
+#include "fvcGrad.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+namespace Foam
+{
+ namespace fv
+ {
+ defineTypeNameAndDebug(interfaceTurbulenceDamping, 0);
+
+ addToRunTimeSelectionTable
+ (
+ fvModel,
+ interfaceTurbulenceDamping,
+ dictionary
+ );
+ }
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+Foam::tmp
+Foam::fv::interfaceTurbulenceDamping::interfaceFraction
+(
+ const volScalarField& alpha
+) const
+{
+ const fvMesh& mesh = this->mesh();
+
+ tmp tA
+ (
+ volScalarField::Internal::New
+ (
+ "A",
+ mesh,
+ dimensionedScalar(dimless, 0)
+ )
+ );
+ volScalarField::Internal& A = tA.ref();
+
+ const surfaceVectorField& Sf = mesh.Sf();
+ const labelUList& own = mesh.owner();
+ const labelUList& nei = mesh.neighbour();
+
+ const surfaceScalarField alphaf(fvc::interpolate(alpha));
+
+ const volVectorField gradAlpha(fvc::grad(alpha));
+ const volVectorField::Internal n
+ (
+ gradAlpha()/(mag(gradAlpha()) + phase_.fluid().deltaN())
+ );
+
+ const scalarField& ialpha = alpha;
+ const scalarField& ialphaf = alphaf;
+ scalarField sumnSf(mesh.nCells(), 0);
+
+ forAll(own, facei)
+ {
+ {
+ const scalar nSf(mag(n[own[facei]] & Sf[facei]));
+ A[own[facei]] += nSf*(ialphaf[facei] - ialpha[own[facei]]);
+ sumnSf[own[facei]] += nSf;
+ }
+ {
+ const scalar nSf(mag(n[nei[facei]] & Sf[facei]));
+ A[nei[facei]] += nSf*(ialphaf[facei] - ialpha[nei[facei]]);
+ sumnSf[nei[facei]] += nSf;
+ }
+ }
+
+ forAll(mesh.boundary(), patchi)
+ {
+ const labelUList& own = mesh.boundary()[patchi].faceCells();
+ const fvsPatchScalarField& palphaf = alphaf.boundaryField()[patchi];
+
+ forAll(mesh.boundary()[patchi], facei)
+ {
+ const scalar nSf(mag(n[own[facei]] & Sf[facei]));
+ A[own[facei]] += nSf*(palphaf[facei] - ialpha[own[facei]]);
+ sumnSf[own[facei]] += nSf;
+ }
+ }
+
+ scalarField& a = A.field();
+ forAll(a, i)
+ {
+ if (sumnSf[i] > small)
+ {
+ a[i] = 2*mag(a[i])/sumnSf[i];
+ }
+ else
+ {
+ a[i] = 0;
+ }
+ }
+
+ return tA;
+}
+
+
+template
+void Foam::fv::interfaceTurbulenceDamping::addRhoSup
+(
+ const RhoType& rho,
+ fvMatrix& eqn,
+ const word& fieldName
+) const
+{
+ if (debug)
+ {
+ Info<< type() << ": applying source to " << eqn.psi().name() << endl;
+ }
+
+ const phaseSystem::phaseModelPartialList& movingPhases =
+ phase_.fluid().movingPhases();
+
+ volScalarField::Internal aSqrnu
+ (
+ movingPhases[0]*sqr(movingPhases[0].thermo().nu()()())
+ );
+
+ for (label phasei=1; phasei(IOobject::groupName("alpha", phaseName_))
+ ),
+ turbulence_
+ (
+ mesh.lookupType(phaseName_)
+ ),
+ C2_("C2", dimless, 0),
+ betaStar_("betaStar", dimless, 0),
+ beta_("beta", dimless, 0)
+{
+ const word epsilonName(IOobject::groupName("epsilon", phaseName_));
+ const word omegaName(IOobject::groupName("omega", phaseName_));
+
+ if (mesh.foundObject(epsilonName))
+ {
+ fieldName_ = epsilonName;
+ C2_.read(turbulence_.coeffDict());
+ }
+ else if (mesh.foundObject(omegaName))
+ {
+ fieldName_ = omegaName;
+ betaStar_.read(turbulence_.coeffDict());
+
+ // Read beta for k-omega models or beta1 for k-omega SST
+ if (turbulence_.coeffDict().found("beta"))
+ {
+ beta_.read(turbulence_.coeffDict());
+ }
+ else
+ {
+ beta_ =
+ dimensionedScalar("beta1", dimless, turbulence_.coeffDict());
+ }
+ }
+ else
+ {
+ FatalIOErrorInFunction(dict)
+ << "Cannot find either " << epsilonName << " or " << omegaName
+ << " field for fvModel " << typeName << exit(FatalIOError);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::wordList Foam::fv::interfaceTurbulenceDamping::addSupFields() const
+{
+ return wordList(1, fieldName_);
+}
+
+
+void Foam::fv::interfaceTurbulenceDamping::addSup
+(
+ fvMatrix& eqn,
+ const word& fieldName
+) const
+{
+ addRhoSup(one(), eqn, fieldName);
+}
+
+
+void Foam::fv::interfaceTurbulenceDamping::addSup
+(
+ const volScalarField& rho,
+ fvMatrix& eqn,
+ const word& fieldName
+) const
+{
+ addRhoSup(rho(), eqn, fieldName);
+}
+
+
+void Foam::fv::interfaceTurbulenceDamping::addSup
+(
+ const volScalarField& alpha,
+ const volScalarField& rho,
+ fvMatrix& eqn,
+ const word& fieldName
+) const
+{
+ if (debug)
+ {
+ Info<< type() << ": applying source to " << eqn.psi().name() << endl;
+ }
+
+ volScalarField::Internal aSqrnu
+ (
+ alpha*sqr(phase_.thermo().nu()()())
+ );
+
+ if (fieldName == IOobject::groupName("epsilon", phaseName_))
+ {
+ eqn += rho()*interfaceFraction(alpha)
+ *C2_*aSqrnu*turbulence_.k()()/pow4(delta_);
+ }
+ else if (fieldName == IOobject::groupName("omega", phaseName_))
+ {
+ eqn += rho()*interfaceFraction(alpha)
+ *beta_*aSqrnu/(sqr(betaStar_)*pow4(delta_));
+ }
+ else
+ {
+ FatalErrorInFunction
+ << "Support for field " << fieldName << " is not implemented"
+ << exit(FatalError);
+ }
+}
+
+
+void Foam::fv::interfaceTurbulenceDamping::topoChange(const polyTopoChangeMap&)
+{}
+
+
+void Foam::fv::interfaceTurbulenceDamping::mapMesh(const polyMeshMap& map)
+{}
+
+
+void Foam::fv::interfaceTurbulenceDamping::distribute
+(
+ const polyDistributionMap&
+)
+{}
+
+
+bool Foam::fv::interfaceTurbulenceDamping::movePoints()
+{
+ return true;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/fvModels/interfaceTurbulenceDamping/interfaceTurbulenceDamping.H b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/interfaceTurbulenceDamping/interfaceTurbulenceDamping.H
new file mode 100644
index 0000000000..b8b0a7504b
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/interfaceTurbulenceDamping/interfaceTurbulenceDamping.H
@@ -0,0 +1,226 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2022 OpenFOAM Foundation
+ \\/ 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::interfaceTurbulenceDamping
+
+Description
+ Free-surface phase turbulence damping function
+
+ Adds an extra source term to the mixture or phase epsilon or omega
+ equation to reduce turbulence generated near a free-surface. The
+ implementation is based on
+
+ Reference:
+ \verbatim
+ Frederix, E. M. A., Mathur, A., Dovizio, D., Geurts, B. J.,
+ & Komen, E. M. J. (2018).
+ Reynolds-averaged modeling of turbulence damping
+ near a large-scale interface in two-phase flow.
+ Nuclear engineering and design, 333, 122-130.
+ \endverbatim
+
+ but with an improved formulation for the coefficient \c A appropriate for
+ unstructured meshes including those with split-cell refinement patterns.
+ However the dimensioned length-scale coefficient \c delta remains and must
+ be set appropriately for the case by performing test runs and comparing with
+ known results. Clearly this model is far from general and more research is
+ needed in order that \c delta can be obtained directly from the interface
+ flow and turbulence conditions.
+
+Usage
+ Example usage:
+ \verbatim
+ interfaceTurbulenceDamping
+ {
+ type interfaceTurbulenceDamping;
+
+ libs ("libmultiphaseEulerFoamFvModels.so");
+
+ phase water;
+
+ // Interface turbulence damping length scale
+ // This is a required input as described in section 3.3 of the paper
+ delta 1e-4;
+ }
+ \endverbatim
+
+SourceFiles
+ interfaceTurbulenceDamping.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef interfaceTurbulenceDamping_H
+#define interfaceTurbulenceDamping_H
+
+#include "fvModel.H"
+#include "phaseSystem.H"
+#include "phaseCompressibleMomentumTransportModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fv
+{
+
+/*---------------------------------------------------------------------------*\
+ Class interfaceTurbulenceDamping Declaration
+\*---------------------------------------------------------------------------*/
+
+class interfaceTurbulenceDamping
+:
+ public fvModel
+{
+ // Private Data
+
+ //- The name of the Lagrangian phase
+ word phaseName_;
+
+ //- Field name
+ word fieldName_;
+
+ //- Interface turbulence damping length scale
+ // This is a required input as described in section 3.3 of the paper
+ dimensionedScalar delta_;
+
+ //- Reference to the phase
+ const phaseModel& phase_;
+
+ //- Reference to the mixture turbulence model
+ const phaseCompressible::momentumTransportModel& turbulence_;
+
+ // Turbulence model coefficients
+
+ dimensionedScalar C2_;
+ dimensionedScalar betaStar_;
+ dimensionedScalar beta_;
+
+
+ // Private Member Functions
+
+ //- Interface fraction in a cell
+ tmp interfaceFraction
+ (
+ const volScalarField& alpha
+ ) const;
+
+ //- Add explicit contribution to incompressible or compressible
+ // mixture epsilon or omega equation
+ template
+ void addRhoSup
+ (
+ const RhoType& rho,
+ fvMatrix& eqn,
+ const word& fieldName
+ ) const;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("interfaceTurbulenceDamping");
+
+
+ // Constructors
+
+ //- Construct from explicit source name and mesh
+ interfaceTurbulenceDamping
+ (
+ const word& sourceName,
+ const word& modelType,
+ const dictionary& dict,
+ const fvMesh& mesh
+ );
+
+ //- Disallow default bitwise copy construction
+ interfaceTurbulenceDamping
+ (
+ const interfaceTurbulenceDamping&
+ ) = delete;
+
+
+ // Member Functions
+
+ //- Return the list of fields for which the option adds source term
+ // to the transport equation
+ virtual wordList addSupFields() const;
+
+ //- Add explicit contribution to mixture epsilon or omega equation
+ virtual void addSup
+ (
+ fvMatrix& eqn,
+ const word& fieldName
+ ) const;
+
+ //- Add explicit contribution to compressible
+ // mixture epsilon or omega equation
+ virtual void addSup
+ (
+ const volScalarField& rho,
+ fvMatrix& eqn,
+ const word& fieldName
+ ) const;
+
+ //- Add explicit contribution to phase epsilon or omega equation
+ virtual void addSup
+ (
+ const volScalarField& alpha,
+ const volScalarField& rho,
+ fvMatrix& eqn,
+ const word& fieldName
+ ) const;
+
+
+ // Mesh changes
+
+ //- Update topology using the given map
+ virtual void topoChange(const polyTopoChangeMap&);
+
+ //- Update from another mesh using the given map
+ virtual void mapMesh(const polyMeshMap&);
+
+ //- Redistribute or update using the given distribution map
+ virtual void distribute(const polyDistributionMap&);
+
+ //- Update for mesh motion
+ virtual bool movePoints();
+
+
+ // Member Operators
+
+ //- Disallow default bitwise assignment
+ void operator=(const interfaceTurbulenceDamping&) = delete;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fv
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/fvModels/phaseTurbulenceStabilisation/phaseTurbulenceStabilisation.C b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/phaseTurbulenceStabilisation/phaseTurbulenceStabilisation.C
new file mode 100644
index 0000000000..91eb6fe04d
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/phaseTurbulenceStabilisation/phaseTurbulenceStabilisation.C
@@ -0,0 +1,254 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2022 OpenFOAM Foundation
+ \\/ 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 "phaseTurbulenceStabilisation.H"
+#include "phaseSystem.H"
+#include "surfaceInterpolate.H"
+#include "fvcGrad.H"
+#include "fvmSup.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+namespace Foam
+{
+ namespace fv
+ {
+ defineTypeNameAndDebug(phaseTurbulenceStabilisation, 0);
+
+ addToRunTimeSelectionTable
+ (
+ fvModel,
+ phaseTurbulenceStabilisation,
+ dictionary
+ );
+ }
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+void Foam::fv::phaseTurbulenceStabilisation::addSup
+(
+ const volScalarField& alpha,
+ const volScalarField& rho,
+ fvMatrix& eqn,
+ tmp
+ (phaseCompressible::momentumTransportModel::*psi)() const
+) const
+{
+ if (debug)
+ {
+ Info<< type() << ": applying source to " << eqn.psi().name() << endl;
+ }
+
+ const fvMesh& mesh = this->mesh();
+
+ const phaseSystem::phaseModelPartialList& movingPhases =
+ phase_.fluid().movingPhases();
+
+ volScalarField::Internal transferRate
+ (
+ volScalarField::Internal::New
+ (
+ "transferRate",
+ mesh,
+ dimensionedScalar(dimless/dimTime, 0)
+ )
+ );
+ volScalarField::Internal psiTransferRate
+ (
+ volScalarField::Internal::New
+ (
+ "psiTransferRate",
+ mesh,
+ dimensionedScalar((turbulence_.*psi)()().dimensions()/dimTime, 0)
+ )
+ );
+
+ forAll(movingPhases, phasei)
+ {
+ if (movingPhases[phasei] != phase_)
+ {
+ const phaseCompressible::momentumTransportModel& turbulence =
+ mesh.lookupType
+ (
+ phaseName_
+ );
+
+ if (notNull(turbulence))
+ {
+ const volScalarField::Internal phaseTransferRate
+ (
+ movingPhases[phasei]
+ *min
+ (
+ turbulence.epsilon()/turbulence.k(),
+ 1.0/phase_.time().deltaT()
+ )
+ );
+
+ transferRate += phaseTransferRate;
+ psiTransferRate += phaseTransferRate*(turbulence.*psi)()();
+ }
+ }
+ }
+
+ const volScalarField::Internal transferCoeff
+ (
+ max(alphaInversion_ - alpha(), scalar(0))*rho()
+ );
+
+ eqn += transferCoeff*psiTransferRate;
+ eqn -= fvm::Sp(transferCoeff*transferRate, eqn.psi());
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::fv::phaseTurbulenceStabilisation::phaseTurbulenceStabilisation
+(
+ const word& sourceName,
+ const word& modelType,
+ const dictionary& dict,
+ const fvMesh& mesh
+)
+:
+ fvModel(sourceName, modelType, dict, mesh),
+ phaseName_(dict.lookup("phase")),
+ alphaInversion_("alphaInversion", dimless, dict),
+ phase_
+ (
+ mesh.lookupObject(IOobject::groupName("alpha", phaseName_))
+ ),
+ turbulence_
+ (
+ mesh.lookupType
+ (
+ phaseName_
+ )
+ )
+{
+ const word kName(IOobject::groupName("k", phaseName_));
+ const word epsilonName(IOobject::groupName("epsilon", phaseName_));
+ const word omegaName(IOobject::groupName("omega", phaseName_));
+
+ if (mesh.foundObject(kName))
+ {
+ fieldNames_.append(kName);
+ }
+
+ if (mesh.foundObject(epsilonName))
+ {
+ fieldNames_.append(epsilonName);
+ }
+
+ if (mesh.foundObject(omegaName))
+ {
+ fieldNames_.append(omegaName);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::wordList Foam::fv::phaseTurbulenceStabilisation::addSupFields() const
+{
+ return fieldNames_;
+}
+
+
+void Foam::fv::phaseTurbulenceStabilisation::addSup
+(
+ const volScalarField& alpha,
+ const volScalarField& rho,
+ fvMatrix& eqn,
+ const word& fieldName
+) const
+{
+ if (fieldName == IOobject::groupName("k", phaseName_))
+ {
+ addSup
+ (
+ alpha,
+ rho,
+ eqn,
+ &phaseCompressible::momentumTransportModel::k
+ );
+ }
+ else if (fieldName == IOobject::groupName("epsilon", phaseName_))
+ {
+ addSup
+ (
+ alpha,
+ rho,
+ eqn,
+ &phaseCompressible::momentumTransportModel::epsilon
+ );
+ }
+ else if (fieldName == IOobject::groupName("omega", phaseName_))
+ {
+ addSup
+ (
+ alpha,
+ rho,
+ eqn,
+ &phaseCompressible::momentumTransportModel::omega
+ );
+ }
+ else
+ {
+ FatalErrorInFunction
+ << "Support for field " << fieldName << " is not implemented"
+ << exit(FatalError);
+ }
+}
+
+
+void Foam::fv::phaseTurbulenceStabilisation::topoChange
+(
+ const polyTopoChangeMap&
+)
+{}
+
+
+void Foam::fv::phaseTurbulenceStabilisation::mapMesh(const polyMeshMap& map)
+{}
+
+
+void Foam::fv::phaseTurbulenceStabilisation::distribute
+(
+ const polyDistributionMap&
+)
+{}
+
+
+bool Foam::fv::phaseTurbulenceStabilisation::movePoints()
+{
+ return true;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/fvModels/phaseTurbulenceStabilisation/phaseTurbulenceStabilisation.H b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/phaseTurbulenceStabilisation/phaseTurbulenceStabilisation.H
new file mode 100644
index 0000000000..12546a7ba9
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/fvModels/phaseTurbulenceStabilisation/phaseTurbulenceStabilisation.H
@@ -0,0 +1,198 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2022 OpenFOAM Foundation
+ \\/ 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::phaseTurbulenceStabilisation
+
+Description
+ Phase turbulence stabilisation
+
+ In the limit of a phase-fraction->0 the turbulence properties cannot be
+ obtained from the phase turbulence model, coupling to the other phase/phases
+ is required. The phaseTurbulenceStabilisation fvModel stabilises the phase
+ turbulence properties by adding transfer terms from the corresponding
+ properties of the other phases when the phase-fraction is less than the
+ specified \c alphaInversion. This implementation is a generalisation of
+ the approach used in the Foam::RASModels::LaheyKEpsilon and
+ Foam::RASModels::continuousGasKEpsilon models to handle phase-inversion and
+ free-surface flow and can be used with any combination of RAS turbulence
+ models.
+
+ To stabilise the solution of the phase turbulence equations \c
+ alphaInversion can be set to a small value e.g. 1e-2, but unless the phase
+ turbulence model is specifically designed to handle phase-inversion and both
+ continuous and dispersed regimes it may be useful to set \c alphaInversion
+ to a higher value, corresponding to the phase-fraction at which transition
+ from continuous to dispersed happens and effectively use the turbulence
+ properties of the other phase when the phase is dispersed. This is of
+ course an approximation to the real system and if accurate handling of both
+ the continuous and dispersed phase regimes is required specially developed
+ models should be used.
+
+Usage
+ Example usage:
+ \verbatim
+ phaseTurbulenceStabilisation
+ {
+ type phaseTurbulenceStabilisation;
+
+ libs ("libmultiphaseEulerFoamFvModels.so");
+
+ phase air;
+
+ alphaInversion 0.1;
+ }
+ \endverbatim
+
+SourceFiles
+ phaseTurbulenceStabilisation.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef phaseTurbulenceStabilisation_H
+#define phaseTurbulenceStabilisation_H
+
+#include "fvModel.H"
+#include "phaseModel.H"
+#include "phaseCompressibleMomentumTransportModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fv
+{
+
+/*---------------------------------------------------------------------------*\
+ Class phaseTurbulenceStabilisation Declaration
+\*---------------------------------------------------------------------------*/
+
+class phaseTurbulenceStabilisation
+:
+ public fvModel
+{
+ // Private Data
+
+ //- The name of the Lagrangian phase
+ word phaseName_;
+
+ //- Field names
+ wordList fieldNames_;
+
+ //- Phase-fraction below which turbulence property blending is applied
+ dimensionedScalar alphaInversion_;
+
+ //- Reference to the phase
+ const phaseModel& phase_;
+
+ //- Reference to the mixture turbulence model
+ const phaseCompressible::momentumTransportModel& turbulence_;
+
+
+ // Private Member Functions
+
+ //- Add contribution to phase psi equation
+ void addSup
+ (
+ const volScalarField& alpha,
+ const volScalarField& rho,
+ fvMatrix& eqn,
+ tmp
+ (phaseCompressible::momentumTransportModel::*psi)() const
+ ) const;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("phaseTurbulenceStabilisation");
+
+
+ // Constructors
+
+ //- Construct from explicit source name and mesh
+ phaseTurbulenceStabilisation
+ (
+ const word& sourceName,
+ const word& modelType,
+ const dictionary& dict,
+ const fvMesh& mesh
+ );
+
+ //- Disallow default bitwise copy construction
+ phaseTurbulenceStabilisation
+ (
+ const phaseTurbulenceStabilisation&
+ ) = delete;
+
+
+ // Member Functions
+
+ //- Return the list of fields for which the option adds source term
+ // to the transport equation
+ virtual wordList addSupFields() const;
+
+ using fvModel::addSup;
+
+ //- Add contribution to phase k, epsilon or omega equation
+ virtual void addSup
+ (
+ const volScalarField& alpha,
+ const volScalarField& rho,
+ fvMatrix& eqn,
+ const word& fieldName
+ ) const;
+
+
+ // Mesh changes
+
+ //- Update topology using the given map
+ virtual void topoChange(const polyTopoChangeMap&);
+
+ //- Update from another mesh using the given map
+ virtual void mapMesh(const polyMeshMap&);
+
+ //- Redistribute or update using the given distribution map
+ virtual void distribute(const polyDistributionMap&);
+
+ //- Update for mesh motion
+ virtual bool movePoints();
+
+
+ // Member Operators
+
+ //- Disallow default bitwise assignment
+ void operator=(const phaseTurbulenceStabilisation&) = delete;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fv
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/include/createRDeltaTf.H b/applications/solvers/modules/fluid/multiphaseEuler/include/createRDeltaTf.H
new file mode 100644
index 0000000000..64c9f7354e
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/include/createRDeltaTf.H
@@ -0,0 +1,21 @@
+tmp trDeltaTf;
+
+if (LTS && faceMomentum)
+{
+ trDeltaTf = tmp
+ (
+ new surfaceScalarField
+ (
+ IOobject
+ (
+ fv::localEulerDdt::rDeltaTfName,
+ runTime.timeName(),
+ mesh,
+ IOobject::READ_IF_PRESENT,
+ IOobject::AUTO_WRITE
+ ),
+ mesh,
+ dimensionedScalar(dimless/dimTime, 1)
+ )
+ );
+}
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/include/setRDeltaTf.H b/applications/solvers/modules/fluid/multiphaseEuler/include/setRDeltaTf.H
new file mode 100644
index 0000000000..1c0366dc3b
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/include/setRDeltaTf.H
@@ -0,0 +1 @@
+trDeltaTf.ref() = fvc::interpolate(fv::localEulerDdt::localRDeltaT(mesh));
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/Make/files b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/Make/files
new file mode 100644
index 0000000000..a841a22219
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/Make/files
@@ -0,0 +1,26 @@
+diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModel.C
+diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModelNew.C
+diffusiveMassTransferModels/Frossling/Frossling.C
+diffusiveMassTransferModels/sphericalDiffusiveMassTransfer/sphericalDiffusiveMassTransfer.C
+
+interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModel.C
+interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModelNew.C
+interfaceSurfaceTensionModels/constantSurfaceTensionCoefficient/constantSurfaceTensionCoefficient.C
+
+interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModel.C
+interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModelNew.C
+interfaceCompositionModels/Henry/Henry.C
+interfaceCompositionModels/nonRandomTwoLiquid/nonRandomTwoLiquid.C
+interfaceCompositionModels/Raoult/Raoult.C
+interfaceCompositionModels/saturated/saturated.C
+
+saturationModels/saturationModel/saturationModel.C
+saturationModels/saturationModel/saturationModelNew.C
+saturationModels/Antoine/Antoine.C
+saturationModels/AntoineExtended/AntoineExtended.C
+saturationModels/ArdenBuck/ArdenBuck.C
+saturationModels/polynomial/polynomial.C
+saturationModels/function1/function1.C
+saturationModels/constantSaturationConditions/constantSaturationConditions.C
+
+LIB = $(FOAM_LIBBIN)/libeulerianInterfacialCompositionModels
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/Make/options b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/Make/options
new file mode 100644
index 0000000000..c9e25ee486
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/Make/options
@@ -0,0 +1,18 @@
+EXE_INC = \
+ -I../phaseSystems/lnInclude \
+ -I$(LIB_SRC)/physicalProperties/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/specie/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/thermophysicalProperties/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/multicomponentThermo/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/momentumTransportModels/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/compressible/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/phaseCompressible/lnInclude \
+ -I$(LIB_SRC)/finiteVolume/lnInclude \
+ -I$(LIB_SRC)/meshTools/lnInclude \
+ -I$(LIB_SRC)/sampling/lnInclude
+
+LIB_LIBS = \
+ -lfluidThermophysicalModels \
+ -lmulticomponentThermophysicalModels \
+ -lspecie
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/Frossling/Frossling.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/Frossling/Frossling.C
new file mode 100644
index 0000000000..e7fc7954b3
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/Frossling/Frossling.C
@@ -0,0 +1,87 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "Frossling.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace diffusiveMassTransferModels
+{
+ defineTypeNameAndDebug(Frossling, 0);
+ addToRunTimeSelectionTable
+ (
+ diffusiveMassTransferModel,
+ Frossling,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::diffusiveMassTransferModels::Frossling::Frossling
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ diffusiveMassTransferModel(dict, interface),
+ interface_
+ (
+ interface.modelCast
+ <
+ diffusiveMassTransferModel,
+ dispersedPhaseInterface
+ >()
+ ),
+ Le_("Le", dimless, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::diffusiveMassTransferModels::Frossling::~Frossling()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::diffusiveMassTransferModels::Frossling::K() const
+{
+ const volScalarField Sh
+ (
+ 2 + 0.552*sqrt(interface_.Re())*cbrt(Le_*interface_.Pr())
+ );
+
+ return 6*interface_.dispersed()*Sh/sqr(interface_.dispersed().d());
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/Frossling/Frossling.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/Frossling/Frossling.H
new file mode 100644
index 0000000000..6fb982e21f
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/Frossling/Frossling.H
@@ -0,0 +1,102 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::diffusiveMassTransferModels::Frossling
+
+Description
+ Frossling correlation for turbulent mass transfer from the surface of a
+ sphere to the surrounding fluid.
+
+SourceFiles
+ Frossling.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Frossling_H
+#define Frossling_H
+
+#include "diffusiveMassTransferModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+namespace diffusiveMassTransferModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class Frossling Declaration
+\*---------------------------------------------------------------------------*/
+
+class Frossling
+:
+ public diffusiveMassTransferModel
+{
+ // Private Data
+
+ //- Interface
+ const dispersedPhaseInterface interface_;
+
+ //- Lewis number
+ const dimensionedScalar Le_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("Frossling");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ Frossling
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~Frossling();
+
+
+ // Member Functions
+
+ //- The implicit mass transfer coefficient
+ virtual tmp K() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace diffusiveMassTransferModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModel.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModel.C
new file mode 100644
index 0000000000..714534275c
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModel.C
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "diffusiveMassTransferModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ defineTypeNameAndDebug(diffusiveMassTransferModel, 0);
+ defineBlendedInterfacialModelTypeNameAndDebug
+ (
+ diffusiveMassTransferModel,
+ 0
+ );
+ defineSidedInterfacialModelTypeNameAndDebug
+ (
+ blendedDiffusiveMassTransferModel,
+ 0
+ );
+ defineRunTimeSelectionTable(diffusiveMassTransferModel, dictionary);
+}
+
+const Foam::dimensionSet Foam::diffusiveMassTransferModel::dimK(0, -2, 0, 0, 0);
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::diffusiveMassTransferModel::diffusiveMassTransferModel
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::diffusiveMassTransferModel::~diffusiveMassTransferModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::blendedDiffusiveMassTransferModel::K() const
+{
+ tmp (diffusiveMassTransferModel::*k)() const =
+ &diffusiveMassTransferModel::K;
+ return evaluate(k, "K", diffusiveMassTransferModel::dimK, false);
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModel.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModel.H
new file mode 100644
index 0000000000..108156f8c3
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModel.H
@@ -0,0 +1,189 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::diffusiveMassTransferModel
+
+Description
+ Model for diffusive mass transfer coefficients between two phases
+
+SourceFiles
+ diffusiveMassTransferModel.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef diffusiveMassTransferModel_H
+#define diffusiveMassTransferModel_H
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "volFields.H"
+#include "dictionary.H"
+#include "runTimeSelectionTables.H"
+#include "BlendedInterfacialModel.H"
+#include "SidedInterfacialModel.H"
+
+namespace Foam
+{
+
+class phaseSystem;
+
+/*---------------------------------------------------------------------------*\
+ Class diffusiveMassTransferModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class diffusiveMassTransferModel
+{
+public:
+
+ //- Runtime type information
+ TypeName("diffusiveMassTransferModel");
+
+
+ // Declare runtime construction
+
+ declareRunTimeSelectionTable
+ (
+ autoPtr,
+ diffusiveMassTransferModel,
+ dictionary,
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ ),
+ (dict, interface)
+ );
+
+
+ // Static Data Members
+
+ //- Coefficient dimensions
+ static const dimensionSet dimK;
+
+ //- Does this model require correcting on fixed flux boundaries?
+ static const bool correctFixedFluxBCs = false;
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ diffusiveMassTransferModel
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~diffusiveMassTransferModel();
+
+
+ // Selectors
+
+ static autoPtr New
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ // Member Functions
+
+ //- The implicit mass transfer coefficient
+ // Note: this has had the species mass diffusivity factored out
+ virtual tmp K() const = 0;
+};
+
+
+/*---------------------------------------------------------------------------*\
+ Class blendedDiffusiveMassTransferModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class blendedDiffusiveMassTransferModel
+:
+ public BlendedInterfacialModel
+{
+public:
+
+ // Constructors
+
+ //- Inherit base class constructors
+ using
+ BlendedInterfacialModel::
+ BlendedInterfacialModel;
+
+
+ // Selectors
+
+ static autoPtr New
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ // Member Functions
+
+ //- Return the heatTransfer coefficient K
+ tmp K() const;
+};
+
+
+
+/*---------------------------------------------------------------------------*\
+ Class sidedBlendedDiffusiveMassTransferModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class sidedBlendedDiffusiveMassTransferModel
+:
+ public SidedInterfacialModel
+{
+public:
+
+ // Constructors
+
+ //- Inherit base class constructors
+ using
+ SidedInterfacialModel::
+ SidedInterfacialModel;
+
+
+ // Selectors
+
+ static autoPtr New
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModelNew.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModelNew.C
new file mode 100644
index 0000000000..086fc1352c
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/diffusiveMassTransferModel/diffusiveMassTransferModelNew.C
@@ -0,0 +1,90 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "diffusiveMassTransferModel.H"
+
+// * * * * * * * * * * * * * * * * Selector * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr
+Foam::diffusiveMassTransferModel::New
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+{
+ const dictionary& modelDict =
+ interface.fluid().modelSubDict(dict);
+
+ const word diffusiveMassTransferModelType(modelDict.lookup("type"));
+
+ Info<< "Selecting diffusiveMassTransferModel for "
+ << interface.name() << ": " << diffusiveMassTransferModelType << endl;
+
+ dictionaryConstructorTable::iterator cstrIter =
+ dictionaryConstructorTablePtr_->find(diffusiveMassTransferModelType);
+
+ if (cstrIter == dictionaryConstructorTablePtr_->end())
+ {
+ FatalErrorInFunction
+ << "Unknown diffusiveMassTransferModelType type "
+ << diffusiveMassTransferModelType << endl << endl
+ << "Valid diffusiveMassTransferModel types are : " << endl
+ << dictionaryConstructorTablePtr_->sortedToc()
+ << exit(FatalError);
+ }
+
+ return cstrIter()(modelDict, interface);
+}
+
+
+Foam::autoPtr
+Foam::blendedDiffusiveMassTransferModel::New
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+{
+ return autoPtr
+ (
+ new blendedDiffusiveMassTransferModel(dict, interface)
+ );
+}
+
+
+Foam::autoPtr
+Foam::sidedBlendedDiffusiveMassTransferModel::New
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+{
+ return autoPtr
+ (
+ new sidedBlendedDiffusiveMassTransferModel(dict, interface)
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/sphericalDiffusiveMassTransfer/sphericalDiffusiveMassTransfer.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/sphericalDiffusiveMassTransfer/sphericalDiffusiveMassTransfer.C
new file mode 100644
index 0000000000..3576ae2f10
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/sphericalDiffusiveMassTransfer/sphericalDiffusiveMassTransfer.C
@@ -0,0 +1,84 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "sphericalDiffusiveMassTransfer.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace diffusiveMassTransferModels
+{
+ defineTypeNameAndDebug(sphericalDiffusiveMassTransfer, 0);
+ addToRunTimeSelectionTable
+ (
+ diffusiveMassTransferModel,
+ sphericalDiffusiveMassTransfer,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::diffusiveMassTransferModels::sphericalDiffusiveMassTransfer::
+sphericalDiffusiveMassTransfer
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ diffusiveMassTransferModel(dict, interface),
+ interface_
+ (
+ interface.modelCast
+ <
+ diffusiveMassTransferModel,
+ dispersedPhaseInterface
+ >()
+ ),
+ Le_("Le", dimless, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::diffusiveMassTransferModels::sphericalDiffusiveMassTransfer::
+~sphericalDiffusiveMassTransfer()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::diffusiveMassTransferModels::sphericalDiffusiveMassTransfer::K() const
+{
+ return 60*interface_.dispersed()/sqr(interface_.dispersed().d());
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/sphericalDiffusiveMassTransfer/sphericalDiffusiveMassTransfer.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/sphericalDiffusiveMassTransfer/sphericalDiffusiveMassTransfer.H
new file mode 100644
index 0000000000..c5ab8f9b84
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/diffusiveMassTransferModels/sphericalDiffusiveMassTransfer/sphericalDiffusiveMassTransfer.H
@@ -0,0 +1,101 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::diffusiveMassTransferModels::sphericalDiffusiveMassTransfer
+
+Description
+ Model which applies an analytical solution for mass transfer from the
+ surface of a sphere to the fluid within the sphere.
+
+SourceFiles
+ sphericalDiffusiveMassTransfer.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef sphericalDiffusiveMassTransfer_H
+#define sphericalDiffusiveMassTransfer_H
+
+#include "diffusiveMassTransferModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace diffusiveMassTransferModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class sphericalDiffusiveMassTransfer Declaration
+\*---------------------------------------------------------------------------*/
+
+class sphericalDiffusiveMassTransfer
+:
+ public diffusiveMassTransferModel
+{
+ // Private Data
+
+ //- Interface
+ const dispersedPhaseInterface interface_;
+
+ //- Lewis number
+ const dimensionedScalar Le_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("spherical");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ sphericalDiffusiveMassTransfer
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~sphericalDiffusiveMassTransfer();
+
+
+ // Member Functions
+
+ //- The implicit mass transfer coefficient
+ virtual tmp K() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace diffusiveMassTransferModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Henry/Henry.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Henry/Henry.C
new file mode 100644
index 0000000000..7b3ebb3c33
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Henry/Henry.C
@@ -0,0 +1,129 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "Henry.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace interfaceCompositionModels
+{
+ defineTypeNameAndDebug(Henry, 0);
+ addToRunTimeSelectionTable(interfaceCompositionModel, Henry, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::interfaceCompositionModels::Henry::Henry
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ interfaceCompositionModel(dict, interface),
+ k_(dict.lookup("k")),
+ YSolvent_
+ (
+ IOobject
+ (
+ IOobject::groupName("YSolvent", this->interface().name()),
+ interface.mesh().time().timeName(),
+ interface.mesh()
+ ),
+ interface.mesh(),
+ dimensionedScalar(dimless, 1)
+ )
+{
+ if (k_.size() != species().size())
+ {
+ FatalErrorInFunction
+ << "Differing number of species and solubilities"
+ << exit(FatalError);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::interfaceCompositionModels::Henry::~Henry()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+void Foam::interfaceCompositionModels::Henry::update(const volScalarField& Tf)
+{
+ YSolvent_ = scalar(1);
+
+ forAllConstIter(hashedWordList, species(), iter)
+ {
+ YSolvent_ -= Yf(*iter, Tf);
+ }
+}
+
+
+Foam::tmp Foam::interfaceCompositionModels::Henry::Yf
+(
+ const word& speciesName,
+ const volScalarField& Tf
+) const
+{
+ if (species().found(speciesName))
+ {
+ const label index = species()[speciesName];
+
+ return
+ k_[index]
+ *otherComposition().Y(speciesName)
+ *otherThermo().rho()
+ /thermo().rho();
+ }
+ else
+ {
+ return YSolvent_*composition().Y(speciesName);
+ }
+}
+
+
+Foam::tmp Foam::interfaceCompositionModels::Henry::YfPrime
+(
+ const word& speciesName,
+ const volScalarField& Tf
+) const
+{
+ return volScalarField::New
+ (
+ IOobject::groupName("YfPrime", interface().name()),
+ interface().mesh(),
+ dimensionedScalar(dimless/dimTemperature, 0)
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Henry/Henry.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Henry/Henry.H
new file mode 100644
index 0000000000..d610f2bd86
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Henry/Henry.H
@@ -0,0 +1,119 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::interfaceCompositionModels::Henry
+
+Description
+ Henry's law for gas solubility in liquid. The concentration of a dissolved
+ species in the liquid is proportional to its partial pressure in the gas. A
+ dimensionless solubility, \f$k\f$, is given for each species. This is the
+ ratio of the concentration of the species in the liquid to the
+ corresponding concentration in the gas; i.e., \f$k =
+ c_{i,liq}/c_{i,gas}\f$. Mixing in the gas is assumed to be ideal.
+
+SourceFiles
+ Henry.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Henry_H
+#define Henry_H
+
+#include "interfaceCompositionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace interfaceCompositionModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class Henry Declaration
+\*---------------------------------------------------------------------------*/
+
+class Henry
+:
+ public interfaceCompositionModel
+{
+ // Private Data
+
+ //- Dimensionless solubility coefficients
+ const scalarList k_;
+
+ //- The remaining solvent species fraction
+ volScalarField YSolvent_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("Henry");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ Henry
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~Henry();
+
+
+ // Member Functions
+
+ //- Update the composition
+ virtual void update(const volScalarField& Tf);
+
+ //- The interface species fraction
+ virtual tmp Yf
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const;
+
+ //- The interface species fraction derivative w.r.t. temperature
+ virtual tmp YfPrime
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace interfaceCompositionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Raoult/Raoult.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Raoult/Raoult.C
new file mode 100644
index 0000000000..e5abf194cf
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Raoult/Raoult.C
@@ -0,0 +1,162 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "Raoult.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace interfaceCompositionModels
+{
+ defineTypeNameAndDebug(Raoult, 0);
+ addToRunTimeSelectionTable(interfaceCompositionModel, Raoult, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::interfaceCompositionModels::Raoult::Raoult
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ interfaceCompositionModel(dict, interface),
+ YNonVapour_
+ (
+ IOobject
+ (
+ IOobject::groupName("YNonVapour", this->interface().name()),
+ interface.mesh().time().timeName(),
+ interface.mesh()
+ ),
+ interface.mesh(),
+ dimensionedScalar(dimless, 1)
+ ),
+ YNonVapourPrime_
+ (
+ IOobject
+ (
+ IOobject::groupName("YNonVapourPrime", this->interface().name()),
+ interface.mesh().time().timeName(),
+ interface.mesh()
+ ),
+ interface.mesh(),
+ dimensionedScalar(dimless/dimTemperature, 0)
+ )
+{
+ forAllConstIter(hashedWordList, species(), iter)
+ {
+ speciesModels_.insert
+ (
+ *iter,
+ autoPtr
+ (
+ interfaceCompositionModel::New
+ (
+ dict.subDict(*iter),
+ interface
+ )
+ )
+ );
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::interfaceCompositionModels::Raoult::~Raoult()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+void Foam::interfaceCompositionModels::Raoult::update(const volScalarField& Tf)
+{
+ YNonVapour_ = scalar(1);
+
+ forAllIter
+ (
+ HashTable>,
+ speciesModels_,
+ iter
+ )
+ {
+ iter()->update(Tf);
+
+ YNonVapour_ -=
+ otherComposition().Y(iter.key())
+ *iter()->Yf(iter.key(), Tf);
+
+ YNonVapourPrime_ -=
+ otherComposition().Y(iter.key())
+ *iter()->YfPrime(iter.key(), Tf);
+ }
+}
+
+
+Foam::tmp Foam::interfaceCompositionModels::Raoult::Yf
+(
+ const word& speciesName,
+ const volScalarField& Tf
+) const
+{
+ if (species().found(speciesName))
+ {
+ return
+ otherComposition().Y(speciesName)
+ *speciesModels_[speciesName]->Yf(speciesName, Tf);
+ }
+ else
+ {
+ return composition().Y(speciesName)*YNonVapour_;
+ }
+}
+
+
+Foam::tmp
+Foam::interfaceCompositionModels::Raoult::YfPrime
+(
+ const word& speciesName,
+ const volScalarField& Tf
+) const
+{
+ if (species().found(speciesName))
+ {
+ return
+ otherComposition().Y(speciesName)
+ *speciesModels_[speciesName]->YfPrime(speciesName, Tf);
+ }
+ else
+ {
+ return composition().Y(speciesName)*YNonVapourPrime_;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Raoult/Raoult.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Raoult/Raoult.H
new file mode 100644
index 0000000000..d9feb8d5e8
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/Raoult/Raoult.H
@@ -0,0 +1,119 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::interfaceCompositionModels::Raoult
+
+Description
+ Raoult's law of ideal mixing. A separate composition model is given for
+ each species. The composition of a species is equal to the value given by
+ the model scaled by the species fraction in the bulk of the other phase.
+
+SourceFiles
+ Raoult.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Raoult_H
+#define Raoult_H
+
+#include "interfaceCompositionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace interfaceCompositionModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class Raoult Declaration
+\*---------------------------------------------------------------------------*/
+
+class Raoult
+:
+ public interfaceCompositionModel
+{
+ // Private Data
+
+ //- Non-vapour species fraction
+ volScalarField YNonVapour_;
+
+ //- Non-vapour species fraction derivative w.r.t. temperature
+ volScalarField YNonVapourPrime_;
+
+ //- Species' individual composition models
+ HashTable> speciesModels_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("Raoult");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ Raoult
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~Raoult();
+
+
+ // Member Functions
+
+ //- Update the composition
+ virtual void update(const volScalarField& Tf);
+
+ //- The interface species fraction
+ virtual tmp Yf
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const;
+
+ //- The interface species fraction derivative w.r.t. temperature
+ virtual tmp YfPrime
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace interfaceCompositionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModel.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModel.C
new file mode 100644
index 0000000000..3b2ce82ef2
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModel.C
@@ -0,0 +1,113 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "interfaceCompositionModel.H"
+#include "phaseModel.H"
+#include "phaseSystem.H"
+#include "rhoMulticomponentThermo.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ defineTypeNameAndDebug(interfaceCompositionModel, 0);
+ defineSidedInterfacialModelTypeNameAndDebug(interfaceCompositionModel, 0);
+ defineRunTimeSelectionTable(interfaceCompositionModel, dictionary);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::interfaceCompositionModel::interfaceCompositionModel
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ interface_
+ (
+ interface.modelCast()
+ ),
+ species_(dict.lookup("species")),
+ Le_("Le", dimless, dict),
+ thermo_
+ (
+ refCast(interface_.phase().thermo())
+ ),
+ otherThermo_(interface_.otherPhase().thermo())
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::interfaceCompositionModel::~interfaceCompositionModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp Foam::interfaceCompositionModel::dY
+(
+ const word& speciesName,
+ const volScalarField& Tf
+) const
+{
+ const label speciei = composition().species()[speciesName];
+
+ return Yf(speciesName, Tf) - composition().Y()[speciei];
+}
+
+
+Foam::tmp Foam::interfaceCompositionModel::dYfPrime
+(
+ const word& speciesName,
+ const volScalarField& Tf
+) const
+{
+ return YfPrime(speciesName, Tf);
+}
+
+
+Foam::tmp Foam::interfaceCompositionModel::D
+(
+ const word& speciesName
+) const
+{
+ const label speciei = composition().species()[speciesName];
+ const volScalarField& p(thermo_.p());
+ const volScalarField& T(thermo_.T());
+
+ return volScalarField::New
+ (
+ IOobject::groupName("D" + speciesName, interface_.name()),
+ composition().kappa(speciei, p, T)
+ /composition().Cp(speciei, p, T)
+ /composition().rho(speciei, p, T)
+ /Le_
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModel.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModel.H
new file mode 100644
index 0000000000..36be57c8bb
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModel.H
@@ -0,0 +1,231 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::interfaceCompositionModel
+
+Description
+ Generic base class for interface composition models. These models describe
+ the composition in phase 1 of the supplied pair at the interface with phase
+ 2.
+
+SourceFiles
+ interfaceCompositionModel.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef interfaceCompositionModel_H
+#define interfaceCompositionModel_H
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "volFields.H"
+#include "dictionary.H"
+#include "hashedWordList.H"
+#include "rhoMulticomponentThermo.H"
+#include "runTimeSelectionTables.H"
+#include "sidedPhaseInterface.H"
+#include "SidedInterfacialModel.H"
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class interfaceCompositionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class interfaceCompositionModel
+{
+ // Private data
+
+ //- Interface
+ const sidedPhaseInterface interface_;
+
+ //- Names of the transferring species
+ const hashedWordList species_;
+
+ //- Lewis number
+ const dimensionedScalar Le_;
+
+ //- Multi-component thermo model for this side of the interface
+ const rhoMulticomponentThermo& thermo_;
+
+ //- General thermo model for the other side of the interface
+ const rhoThermo& otherThermo_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("interfaceCompositionModel");
+
+
+ // Declare runtime construction
+
+ declareRunTimeSelectionTable
+ (
+ autoPtr,
+ interfaceCompositionModel,
+ dictionary,
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ ),
+ (dict, interface)
+ );
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ interfaceCompositionModel
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~interfaceCompositionModel();
+
+
+ // Selectors
+
+ static autoPtr New
+ (
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool outer=true
+ );
+
+
+ // Member Functions
+
+ // Access
+
+ //- Return the interface
+ inline const sidedPhaseInterface& interface() const;
+
+ //- Return the transferring species names
+ inline const hashedWordList& species() const;
+
+ //- Return the thermo
+ inline const rhoMulticomponentThermo& thermo() const;
+
+ //- Return the composition
+ inline const basicSpecieMixture& composition() const;
+
+ //- Return the other thermo
+ inline const rhoThermo& otherThermo() const;
+
+ //- Return whether the other side has a multi-specie composition
+ inline bool otherHasComposition() const;
+
+ //- Return the other composition
+ inline const basicSpecieMixture& otherComposition() const;
+
+
+ // Evaluation
+
+ //- Interface mass fraction
+ virtual tmp Yf
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const = 0;
+
+ //- The interface mass fraction derivative w.r.t. temperature
+ virtual tmp YfPrime
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const = 0;
+
+ //- Mass fraction difference between the interface and the field
+ tmp dY
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const;
+
+ //- Mass fraction difference between the interface and the field
+ // derivative w.r.t. temperature
+ tmp dYfPrime
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const;
+
+ //- Mass diffusivity
+ tmp D
+ (
+ const word& speciesName
+ ) const;
+
+
+ //- Update the composition
+ virtual void update(const volScalarField& Tf) = 0;
+};
+
+
+/*---------------------------------------------------------------------------*\
+ Class sidedInterfaceCompositionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class sidedInterfaceCompositionModel
+:
+ public SidedInterfacialModel
+{
+public:
+
+ // Constructors
+
+ //- Inherit base class constructors
+ using
+ SidedInterfacialModel::
+ SidedInterfacialModel;
+
+
+ // Selectors
+
+ static autoPtr New
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "interfaceCompositionModelI.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModelI.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModelI.H
new file mode 100644
index 0000000000..a3a1d2382d
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModelI.H
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2019-2022 OpenFOAM Foundation
+ \\/ 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 "interfaceCompositionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+const Foam::sidedPhaseInterface&
+Foam::interfaceCompositionModel::interface() const
+{
+ return interface_;
+}
+
+
+const Foam::hashedWordList& Foam::interfaceCompositionModel::species() const
+{
+ return species_;
+}
+
+
+const Foam::rhoMulticomponentThermo&
+Foam::interfaceCompositionModel::thermo() const
+{
+ return thermo_;
+}
+
+
+const Foam::basicSpecieMixture&
+Foam::interfaceCompositionModel::composition() const
+{
+ return thermo_.composition();
+}
+
+
+const Foam::rhoThermo& Foam::interfaceCompositionModel::otherThermo() const
+{
+ return otherThermo_;
+}
+
+
+bool Foam::interfaceCompositionModel::otherHasComposition() const
+{
+ return isA(otherThermo_);
+}
+
+
+const Foam::basicSpecieMixture&
+Foam::interfaceCompositionModel::otherComposition() const
+{
+ return refCast(otherThermo_).composition();
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModelNew.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModelNew.C
new file mode 100644
index 0000000000..9ded750a4e
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/interfaceCompositionModel/interfaceCompositionModelNew.C
@@ -0,0 +1,80 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "interfaceCompositionModel.H"
+#include "phaseSystem.H"
+
+// * * * * * * * * * * * * * * * * Selector * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr
+Foam::interfaceCompositionModel::New
+(
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool outer
+)
+{
+ const dictionary& modelDict =
+ outer
+ ? interface.fluid().modelSubDict(dict)
+ : dict;
+
+ const word interfaceCompositionModelType(modelDict.lookup("type"));
+
+ Info<< "Selecting interfaceCompositionModel for "
+ << interface.name() << ": " << interfaceCompositionModelType << endl;
+
+ dictionaryConstructorTable::iterator cstrIter =
+ dictionaryConstructorTablePtr_->find(interfaceCompositionModelType);
+
+ if (cstrIter == dictionaryConstructorTablePtr_->end())
+ {
+ FatalErrorInFunction
+ << "Unknown interfaceCompositionModelType type "
+ << interfaceCompositionModelType << endl << endl
+ << "Valid interfaceCompositionModel types are : " << endl
+ << dictionaryConstructorTablePtr_->sortedToc()
+ << exit(FatalError);
+ }
+
+ return cstrIter()(modelDict, interface);
+}
+
+
+Foam::autoPtr
+Foam::sidedInterfaceCompositionModel::New
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+{
+ return autoPtr
+ (
+ new sidedInterfaceCompositionModel(dict, interface)
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/nonRandomTwoLiquid/nonRandomTwoLiquid.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/nonRandomTwoLiquid/nonRandomTwoLiquid.C
new file mode 100644
index 0000000000..cfcf4b17e5
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/nonRandomTwoLiquid/nonRandomTwoLiquid.C
@@ -0,0 +1,288 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "nonRandomTwoLiquid.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace interfaceCompositionModels
+{
+ defineTypeNameAndDebug(nonRandomTwoLiquid, 0);
+ addToRunTimeSelectionTable
+ (
+ interfaceCompositionModel,
+ nonRandomTwoLiquid,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::interfaceCompositionModels::nonRandomTwoLiquid::nonRandomTwoLiquid
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ interfaceCompositionModel(dict, interface),
+ gamma1_
+ (
+ IOobject
+ (
+ IOobject::groupName("gamma1", this->interface().name()),
+ interface.mesh().time().timeName(),
+ interface.mesh()
+ ),
+ interface.mesh(),
+ dimensionedScalar(dimless, 1)
+ ),
+ gamma2_
+ (
+ IOobject
+ (
+ IOobject::groupName("gamma2", this->interface().name()),
+ interface.mesh().time().timeName(),
+ interface.mesh()
+ ),
+ interface.mesh(),
+ dimensionedScalar(dimless, 1)
+ ),
+ beta12_("", dimless/dimTemperature, 0),
+ beta21_("", dimless/dimTemperature, 0)
+{
+ if (species().size() != 2)
+ {
+ FatalErrorInFunction
+ << "nonRandomTwoLiquid model is suitable for two species only."
+ << exit(FatalError);
+ }
+
+ species1Name_ = species()[0];
+ species2Name_ = species()[1];
+
+ species1Index_ = composition().species()[species1Name_];
+ species2Index_ = composition().species()[species2Name_];
+
+ alpha12_ = dimensionedScalar
+ (
+ "alpha12",
+ dimless,
+ dict.subDict(species1Name_).lookup("alpha")
+ );
+ alpha21_ = dimensionedScalar
+ (
+ "alpha21",
+ dimless,
+ dict.subDict(species2Name_).lookup("alpha")
+ );
+
+ beta12_ = dimensionedScalar
+ (
+ "beta12",
+ dimless/dimTemperature,
+ dict.subDict(species1Name_).lookup("beta")
+ );
+ beta21_ = dimensionedScalar
+ (
+ "beta21",
+ dimless/dimTemperature,
+ dict.subDict(species2Name_).lookup("beta")
+ );
+
+ saturationModel12_.reset
+ (
+ saturationModel::New
+ (
+ dict.subDict(species1Name_).subDict("interaction"),
+ interface,
+ false
+ ).ptr()
+ );
+ saturationModel21_.reset
+ (
+ saturationModel::New
+ (
+ dict.subDict(species2Name_).subDict("interaction"),
+ interface,
+ false
+ ).ptr()
+ );
+
+ speciesModel1_.reset
+ (
+ interfaceCompositionModel::New
+ (
+ dict.subDict(species1Name_),
+ interface,
+ false
+ ).ptr()
+ );
+ speciesModel2_.reset
+ (
+ interfaceCompositionModel::New
+ (
+ dict.subDict(species2Name_),
+ interface,
+ false
+ ).ptr()
+ );
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::interfaceCompositionModels::nonRandomTwoLiquid::~nonRandomTwoLiquid()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+void Foam::interfaceCompositionModels::nonRandomTwoLiquid::update
+(
+ const volScalarField& Tf
+)
+{
+ const volScalarField W(thermo().W());
+
+ const volScalarField X1
+ (
+ composition().Y(species1Index_)
+ *W
+ /dimensionedScalar
+ (
+ "W",
+ dimMass/dimMoles,
+ composition().Wi(species1Index_)
+ )
+ );
+
+ const volScalarField X2
+ (
+ composition().Y(species2Index_)
+ *W
+ /dimensionedScalar
+ (
+ "W",
+ dimMass/dimMoles,
+ composition().Wi(species2Index_)
+ )
+ );
+
+ const volScalarField alpha12(alpha12_ + Tf*beta12_);
+ const volScalarField alpha21(alpha21_ + Tf*beta21_);
+
+ const volScalarField tau12(saturationModel12_->lnPSat(Tf));
+ const volScalarField tau21(saturationModel21_->lnPSat(Tf));
+
+ const volScalarField G12(exp(- alpha12*tau12));
+ const volScalarField G21(exp(- alpha21*tau21));
+
+ gamma1_ =
+ exp
+ (
+ sqr(X2)
+ *(
+ tau21*sqr(G21)/max(sqr(X1 + X2*G21), small)
+ + tau12*G12/max(sqr(X2 + X1*G12), small)
+ )
+ );
+ gamma2_ =
+ exp
+ (
+ sqr(X1)
+ *(
+ tau12*sqr(G12)/max(sqr(X2 + X1*G12), small)
+ + tau21*G21/max(sqr(X1 + X2*G21), small)
+ )
+ );
+}
+
+
+Foam::tmp
+Foam::interfaceCompositionModels::nonRandomTwoLiquid::Yf
+(
+ const word& speciesName,
+ const volScalarField& Tf
+) const
+{
+ if (speciesName == species1Name_)
+ {
+ return
+ otherComposition().Y(speciesName)
+ *speciesModel1_->Yf(speciesName, Tf)
+ *gamma1_;
+ }
+ else if (speciesName == species2Name_)
+ {
+ return
+ otherComposition().Y(speciesName)
+ *speciesModel2_->Yf(speciesName, Tf)
+ *gamma2_;
+ }
+ else
+ {
+ return
+ composition().Y(speciesName)
+ *(scalar(1) - Yf(species1Name_, Tf) - Yf(species2Name_, Tf));
+ }
+}
+
+
+Foam::tmp
+Foam::interfaceCompositionModels::nonRandomTwoLiquid::YfPrime
+(
+ const word& speciesName,
+ const volScalarField& Tf
+) const
+{
+ if (speciesName == species1Name_)
+ {
+ return
+ otherComposition().Y(speciesName)
+ *speciesModel1_->YfPrime(speciesName, Tf)
+ *gamma1_;
+ }
+ else if (speciesName == species2Name_)
+ {
+ return
+ otherComposition().Y(speciesName)
+ *speciesModel2_->YfPrime(speciesName, Tf)
+ *gamma2_;
+ }
+ else
+ {
+ return
+ - composition().Y(speciesName)
+ *(YfPrime(species1Name_, Tf) + YfPrime(species2Name_, Tf));
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/nonRandomTwoLiquid/nonRandomTwoLiquid.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/nonRandomTwoLiquid/nonRandomTwoLiquid.H
new file mode 100644
index 0000000000..e65dfaa3ea
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/nonRandomTwoLiquid/nonRandomTwoLiquid.H
@@ -0,0 +1,156 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::interfaceCompositionModels::nonRandomTwoLiquid
+
+Description
+ Non ideal law for the mixing of two species. A separate composition model
+ is given for each species. The composition of a species is equal to the
+ value given by the model, scaled by the species fraction in the bulk of the
+ other phase, and multiplied by the activity coefficient for that species.
+ The gas behaviour is assumed ideal; i.e. the fugacity coefficient is taken
+ as equal to 1.
+
+SourceFiles
+ nonRandomTwoLiquid.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef nonRandomTwoLiquid_H
+#define nonRandomTwoLiquid_H
+
+#include "interfaceCompositionModel.H"
+#include "saturationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace interfaceCompositionModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class nonRandomTwoLiquid Declaration
+\*---------------------------------------------------------------------------*/
+
+class nonRandomTwoLiquid
+:
+ public interfaceCompositionModel
+{
+ // Private Data
+
+ //- Activity coefficient for species 1
+ volScalarField gamma1_;
+
+ //- Activity coefficient for species 2
+ volScalarField gamma2_;
+
+ //- Name of species 1
+ word species1Name_;
+
+ //- Name of species 2
+ word species2Name_;
+
+ //- Index of species 1 within this thermo
+ label species1Index_;
+
+ //- Index of species 2 within this thermo
+ label species2Index_;
+
+ //- Non-randomness constant parameter for species 1
+ dimensionedScalar alpha12_;
+
+ //- Non-randomness constant parameter for species 2
+ dimensionedScalar alpha21_;
+
+ //- Non-randomness linear parameter for species 1
+ dimensionedScalar beta12_;
+
+ //- Non-randomness linear parameter for species 2
+ dimensionedScalar beta21_;
+
+ //- Interaction parameter model for species 1
+ autoPtr saturationModel12_;
+
+ //- Interaction parameter model for species 2
+ autoPtr saturationModel21_;
+
+ //- Composition model for species 1
+ autoPtr speciesModel1_;
+
+ //- Composition model for species 2
+ autoPtr speciesModel2_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("nonRandomTwoLiquid");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ nonRandomTwoLiquid
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~nonRandomTwoLiquid();
+
+
+ // Member Functions
+
+ //- Update the composition
+ virtual void update(const volScalarField& Tf);
+
+ //- The interface species fraction
+ virtual tmp Yf
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const;
+
+ //- The interface species fraction derivative w.r.t. temperature
+ virtual tmp YfPrime
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace interfaceCompositionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/saturated/saturated.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/saturated/saturated.C
new file mode 100644
index 0000000000..c0423cb0bb
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/saturated/saturated.C
@@ -0,0 +1,152 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "saturated.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace interfaceCompositionModels
+{
+ defineTypeNameAndDebug(saturated, 0);
+ addToRunTimeSelectionTable
+ (
+ interfaceCompositionModel,
+ saturated,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+Foam::tmp
+Foam::interfaceCompositionModels::saturated::wRatioByP() const
+{
+ const dimensionedScalar Wi
+ (
+ "W",
+ dimMass/dimMoles,
+ composition().Wi(saturatedIndex_)
+ );
+
+ return Wi/thermo().W()/thermo().p();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::interfaceCompositionModels::saturated::saturated
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ interfaceCompositionModel(dict, interface),
+ saturatedName_(species()[0]),
+ saturatedIndex_(composition().species()[saturatedName_]),
+ saturationModel_
+ (
+ saturationModel::New
+ (
+ dict.subDict("saturationPressure"),
+ interface,
+ false
+ )
+ )
+{
+ if (species().size() != 1)
+ {
+ FatalErrorInFunction
+ << "saturated model is suitable for one species only."
+ << exit(FatalError);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::interfaceCompositionModels::saturated::~saturated()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+void Foam::interfaceCompositionModels::saturated::update
+(
+ const volScalarField& Tf
+)
+{}
+
+
+Foam::tmp Foam::interfaceCompositionModels::saturated::Yf
+(
+ const word& speciesName,
+ const volScalarField& Tf
+) const
+{
+ if (saturatedName_ == speciesName)
+ {
+ return wRatioByP()*saturationModel_->pSat(Tf);
+ }
+ else
+ {
+ const label speciesIndex = composition().species()[speciesName];
+
+ return
+ composition().Y()[speciesIndex]
+ *(scalar(1) - wRatioByP()*saturationModel_->pSat(Tf))
+ /max(scalar(1) - composition().Y()[saturatedIndex_], small);
+ }
+}
+
+
+Foam::tmp
+Foam::interfaceCompositionModels::saturated::YfPrime
+(
+ const word& speciesName,
+ const volScalarField& Tf
+) const
+{
+ if (saturatedName_ == speciesName)
+ {
+ return wRatioByP()*saturationModel_->pSatPrime(Tf);
+ }
+ else
+ {
+ const label speciesIndex = composition().species()[speciesName];
+
+ return
+ - composition().Y()[speciesIndex]
+ *wRatioByP()*saturationModel_->pSatPrime(Tf)
+ /max(scalar(1) - composition().Y()[saturatedIndex_], small);
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/saturated/saturated.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/saturated/saturated.H
new file mode 100644
index 0000000000..431cbee58b
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceCompositionModels/saturated/saturated.H
@@ -0,0 +1,128 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::interfaceCompositionModels::saturated
+
+Description
+ Model which uses a saturation pressure model for a single species to
+ calculate the interface composition.
+
+SourceFiles
+ saturated.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef saturated_H
+#define saturated_H
+
+#include "interfaceCompositionModel.H"
+#include "saturationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace interfaceCompositionModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class saturated Declaration
+\*---------------------------------------------------------------------------*/
+
+class saturated
+:
+ public interfaceCompositionModel
+{
+protected:
+
+ // Private Data
+
+ //- saturated species name
+ word saturatedName_;
+
+ //- saturated species index
+ label saturatedIndex_;
+
+ //- Saturation pressure model
+ autoPtr saturationModel_;
+
+
+ // Private Member Functions
+
+ //- Constant of proportionality between partial pressure and mass
+ // fraction
+ tmp wRatioByP() const;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("saturated");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ saturated
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~saturated();
+
+
+ // Member Functions
+
+ //- Update the composition
+ virtual void update(const volScalarField& Tf);
+
+ //- The interface species fraction
+ virtual tmp Yf
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const;
+
+ //- The interface species fraction derivative w.r.t. temperature
+ virtual tmp YfPrime
+ (
+ const word& speciesName,
+ const volScalarField& Tf
+ ) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace interfaceCompositionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/constantSurfaceTensionCoefficient/constantSurfaceTensionCoefficient.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/constantSurfaceTensionCoefficient/constantSurfaceTensionCoefficient.C
new file mode 100644
index 0000000000..1bcf894f7a
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/constantSurfaceTensionCoefficient/constantSurfaceTensionCoefficient.C
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "constantSurfaceTensionCoefficient.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace interfaceSurfaceTensionModels
+{
+ defineTypeNameAndDebug(constantSurfaceTensionCoefficient, 0);
+ addToRunTimeSelectionTable
+ (
+ interfaceSurfaceTensionModel,
+ constantSurfaceTensionCoefficient,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::interfaceSurfaceTensionModels::constantSurfaceTensionCoefficient::
+constantSurfaceTensionCoefficient
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ interfaceSurfaceTensionModel(dict, interface),
+ sigma_("sigma", dimSigma, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::interfaceSurfaceTensionModels::constantSurfaceTensionCoefficient::
+~constantSurfaceTensionCoefficient()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::interfaceSurfaceTensionModels::constantSurfaceTensionCoefficient::
+sigma() const
+{
+ return volScalarField::New
+ (
+ "sigma",
+ interface_.mesh(),
+ sigma_
+ );
+}
+
+
+Foam::tmp
+Foam::interfaceSurfaceTensionModels::constantSurfaceTensionCoefficient::sigma
+(
+ const label patchi
+) const
+{
+ return tmp
+ (
+ new scalarField
+ (
+ interface_.mesh().boundary()[patchi].size(),
+ sigma_.value()
+ )
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/constantSurfaceTensionCoefficient/constantSurfaceTensionCoefficient.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/constantSurfaceTensionCoefficient/constantSurfaceTensionCoefficient.H
new file mode 100644
index 0000000000..a9508720f3
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/constantSurfaceTensionCoefficient/constantSurfaceTensionCoefficient.H
@@ -0,0 +1,100 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::interfaceSurfaceTensionModels::constantSurfaceTensionCoefficient
+
+Description
+ Constant value surface tension model.
+
+SourceFiles
+ constantSurfaceTensionCoefficient.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef constantSurfaceTensionCoefficient_H
+#define constantSurfaceTensionCoefficient_H
+
+#include "interfaceSurfaceTensionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace interfaceSurfaceTensionModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class constantSurfaceTensionCoefficient Declaration
+\*---------------------------------------------------------------------------*/
+
+class constantSurfaceTensionCoefficient
+:
+ public interfaceSurfaceTensionModel
+{
+ // Private Data
+
+ //- Constant surface tension value
+ const dimensionedScalar sigma_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("constant");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ constantSurfaceTensionCoefficient
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~constantSurfaceTensionCoefficient();
+
+
+ // Member Functions
+
+ //- Surface tension
+ virtual tmp sigma() const;
+
+ //- Surface tension for a patch
+ virtual tmp sigma(const label patchi) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace interfaceSurfaceTensionModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModel.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModel.C
new file mode 100644
index 0000000000..1853d63ddc
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModel.C
@@ -0,0 +1,60 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "interfaceSurfaceTensionModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ defineTypeNameAndDebug(interfaceSurfaceTensionModel, 0);
+ defineRunTimeSelectionTable(interfaceSurfaceTensionModel, dictionary);
+}
+
+const Foam::dimensionSet Foam::interfaceSurfaceTensionModel::dimSigma
+(
+ 1, 0, -2, 0, 0
+);
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::interfaceSurfaceTensionModel::interfaceSurfaceTensionModel
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ interface_(interface)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::interfaceSurfaceTensionModel::~interfaceSurfaceTensionModel()
+{}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModel.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModel.H
new file mode 100644
index 0000000000..f76092d2ca
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModel.H
@@ -0,0 +1,132 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::interfaceSurfaceTensionModel
+
+Description
+ Abstract base-class for interface surface-tension models which can be
+ used when interface compression is applied between two phases.
+
+SourceFiles
+ interfaceSurfaceTensionModel.C
+ interfaceSurfaceTensionModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef interfaceSurfaceTensionModel_H
+#define interfaceSurfaceTensionModel_H
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "volFields.H"
+#include "dictionary.H"
+#include "runTimeSelectionTables.H"
+#include "phaseInterface.H"
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class interfaceSurfaceTensionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class interfaceSurfaceTensionModel
+{
+protected:
+
+ // Protected data
+
+ //- Interface
+ const phaseInterface interface_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("surfaceTensionModel");
+
+
+ // Declare runtime construction
+ declareRunTimeSelectionTable
+ (
+ autoPtr,
+ interfaceSurfaceTensionModel,
+ dictionary,
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ ),
+ (dict, interface)
+ );
+
+
+ // Static Data Members
+
+ //- Coefficient dimensions
+ static const dimensionSet dimSigma;
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ interfaceSurfaceTensionModel
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~interfaceSurfaceTensionModel();
+
+
+ // Selectors
+
+ static autoPtr New
+ (
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool outer=true
+ );
+
+
+ // Member Functions
+
+ //- Surface tension
+ virtual tmp sigma() const = 0;
+
+ //- Surface tension for a patch
+ virtual tmp sigma(const label patchi) const = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModelNew.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModelNew.C
new file mode 100644
index 0000000000..df718b6414
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/interfaceSurfaceTensionModels/interfaceSurfaceTensionModel/interfaceSurfaceTensionModelNew.C
@@ -0,0 +1,66 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "interfaceSurfaceTensionModel.H"
+#include "phaseSystem.H"
+
+// * * * * * * * * * * * * * * * * Selector * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr
+Foam::interfaceSurfaceTensionModel::New
+(
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool outer
+)
+{
+ const dictionary& modelDict =
+ outer
+ ? interface.fluid().modelSubDict(dict)
+ : dict;
+
+ const word interfaceSurfaceTensionModelType(modelDict.lookup("type"));
+
+ Info<< "Selecting interfaceSurfaceTensionModel for "
+ << interface.name() << ": " << interfaceSurfaceTensionModelType << endl;
+
+ dictionaryConstructorTable::iterator cstrIter =
+ dictionaryConstructorTablePtr_->find(interfaceSurfaceTensionModelType);
+
+ if (cstrIter == dictionaryConstructorTablePtr_->end())
+ {
+ FatalErrorInFunction
+ << "Unknown interfaceSurfaceTensionModelType type "
+ << interfaceSurfaceTensionModelType << endl << endl
+ << "Valid interfaceSurfaceTensionModel types are : " << endl
+ << dictionaryConstructorTablePtr_->sortedToc()
+ << exit(FatalError);
+ }
+
+ return cstrIter()(modelDict, interface);
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/Antoine/Antoine.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/Antoine/Antoine.C
new file mode 100644
index 0000000000..8862c41b62
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/Antoine/Antoine.C
@@ -0,0 +1,108 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "Antoine.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+ defineTypeNameAndDebug(Antoine, 0);
+ addToRunTimeSelectionTable(saturationModel, Antoine, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::saturationModels::Antoine::Antoine
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ saturationModel(dict, interface),
+ A_("A", dimless, dict),
+ B_("B", dimTemperature, dict),
+ C_("C", dimTemperature, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::saturationModels::Antoine::~Antoine()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::saturationModels::Antoine::pSat
+(
+ const volScalarField& T
+) const
+{
+ return
+ dimensionedScalar(dimPressure, 1)
+ *exp(A_ + B_/(C_ + T));
+}
+
+
+Foam::tmp
+Foam::saturationModels::Antoine::pSatPrime
+(
+ const volScalarField& T
+) const
+{
+ return - pSat(T)*B_/sqr(C_ + T);
+}
+
+
+Foam::tmp
+Foam::saturationModels::Antoine::lnPSat
+(
+ const volScalarField& T
+) const
+{
+ return A_ + B_/(C_ + T);
+}
+
+
+Foam::tmp
+Foam::saturationModels::Antoine::Tsat
+(
+ const volScalarField& p
+) const
+{
+ return
+ B_/(log(p*dimensionedScalar(dimless/dimPressure, 1)) - A_)
+ - C_;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/Antoine/Antoine.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/Antoine/Antoine.H
new file mode 100644
index 0000000000..89e33c7953
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/Antoine/Antoine.H
@@ -0,0 +1,121 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::saturationModels::Antoine
+
+Description
+ Antoine equation for the vapour pressure.
+
+ \f[
+ \log p = A + \frac{B}{C + T}
+ \f]
+
+ Coefficients \f$A\f$, \f$B\f$ and \f$C\f$ are to be supplied and should be
+ suitable for natural logarithms and temperatures in Kelvin.
+
+SourceFiles
+ Antoine.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Antoine_H
+#define Antoine_H
+
+#include "saturationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class Antoine Declaration
+\*---------------------------------------------------------------------------*/
+
+class Antoine
+:
+ public saturationModel
+{
+protected:
+
+ // Protected data
+
+ //- Constant A
+ dimensionedScalar A_;
+
+ //- Constant B
+ dimensionedScalar B_;
+
+ //- Constant C
+ dimensionedScalar C_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("Antoine");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ Antoine
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~Antoine();
+
+
+ // Member Functions
+
+ //- Saturation pressure
+ virtual tmp pSat(const volScalarField& T) const;
+
+ //- Saturation pressure derivative w.r.t. temperature
+ virtual tmp pSatPrime(const volScalarField& T) const;
+
+ //- Natural log of the saturation pressure
+ virtual tmp lnPSat(const volScalarField& T) const;
+
+ //- Saturation temperature
+ virtual tmp Tsat(const volScalarField& p) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace saturationModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/AntoineExtended/AntoineExtended.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/AntoineExtended/AntoineExtended.C
new file mode 100644
index 0000000000..aeef821600
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/AntoineExtended/AntoineExtended.C
@@ -0,0 +1,118 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "AntoineExtended.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+ defineTypeNameAndDebug(AntoineExtended, 0);
+ addToRunTimeSelectionTable
+ (
+ saturationModel,
+ AntoineExtended,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::saturationModels::AntoineExtended::AntoineExtended
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ Antoine(dict, interface),
+ D_("D", dimless, dict),
+ F_("F", dimless, dict),
+ E_("E", dimless/pow(dimTemperature, F_), dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::saturationModels::AntoineExtended::~AntoineExtended()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::saturationModels::AntoineExtended::pSat
+(
+ const volScalarField& T
+) const
+{
+ return
+ dimensionedScalar(dimPressure/pow(dimTemperature, D_), 1)
+ *exp(A_ + B_/(C_ + T) + E_*pow(T, F_))
+ *pow(T, D_);
+}
+
+
+Foam::tmp
+Foam::saturationModels::AntoineExtended::pSatPrime
+(
+ const volScalarField& T
+) const
+{
+ return pSat(T)*((D_ + E_*F_*pow(T, F_))/T - B_/sqr(C_ + T));
+}
+
+
+Foam::tmp
+Foam::saturationModels::AntoineExtended::lnPSat
+(
+ const volScalarField& T
+) const
+{
+ return
+ A_
+ + B_/(C_ + T)
+ + D_*log(T*dimensionedScalar(dimless/dimTemperature, 1))
+ + E_*pow(T, F_);
+}
+
+
+Foam::tmp
+Foam::saturationModels::AntoineExtended::Tsat
+(
+ const volScalarField& p
+) const
+{
+ NotImplemented;
+
+ return volScalarField::null();
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/AntoineExtended/AntoineExtended.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/AntoineExtended/AntoineExtended.H
new file mode 100644
index 0000000000..f5f3eb1616
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/AntoineExtended/AntoineExtended.H
@@ -0,0 +1,121 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::saturationModels::AntoineExtended
+
+Description
+ Extended Antoine equation for the vapour pressure.
+
+ \f[
+ \log (p) = A + \frac{B}{C + T} + D \log (T) + E T^F
+ \f]
+
+ Coefficients \f$A\f$, \f$B\f$, \f$C\f$, \f$D\f$, \f$E\f$ and \f$F\f$ are
+ to be supplied and should be suitable for natural logarithms and
+ temperatures in Kelvin.
+
+SourceFiles
+ AntoineExtended.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef AntoineExtended_H
+#define AntoineExtended_H
+
+#include "Antoine.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class AntoineExtended Declaration
+\*---------------------------------------------------------------------------*/
+
+class AntoineExtended
+:
+ public Antoine
+{
+ // Private Data
+
+ //- Constant D
+ dimensionedScalar D_;
+
+ //- Constant F
+ dimensionedScalar F_;
+
+ //- Constant E
+ // (after F so F's dimensions can be used in the construction)
+ dimensionedScalar E_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("AntoineExtended");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ AntoineExtended
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~AntoineExtended();
+
+
+ // Member Functions
+
+ //- Saturation pressure
+ virtual tmp pSat(const volScalarField& T) const;
+
+ //- Saturation pressure derivative w.r.t. temperature
+ virtual tmp pSatPrime(const volScalarField& T) const;
+
+ //- Natural log of the saturation pressure
+ virtual tmp lnPSat(const volScalarField& T) const;
+
+ //- Saturation temperature
+ virtual tmp Tsat(const volScalarField& p) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace saturationModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/ArdenBuck/ArdenBuck.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/ArdenBuck/ArdenBuck.C
new file mode 100644
index 0000000000..c7a8f9a10e
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/ArdenBuck/ArdenBuck.C
@@ -0,0 +1,130 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "ArdenBuck.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+ defineTypeNameAndDebug(ArdenBuck, 0);
+ addToRunTimeSelectionTable(saturationModel, ArdenBuck, dictionary);
+}
+}
+
+
+static const Foam::dimensionedScalar zeroC("", Foam::dimTemperature, 273.15);
+static const Foam::dimensionedScalar A("", Foam::dimPressure, 611.21);
+static const Foam::dimensionedScalar B("", Foam::dimless, 18.678);
+static const Foam::dimensionedScalar C("", Foam::dimTemperature, 234.5);
+static const Foam::dimensionedScalar D("", Foam::dimTemperature, 257.14);
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+Foam::tmp
+Foam::saturationModels::ArdenBuck::xByTC
+(
+ const volScalarField& TC
+) const
+{
+ return (B - TC/C)/(D + TC);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::saturationModels::ArdenBuck::ArdenBuck
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ saturationModel(dict, interface)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::saturationModels::ArdenBuck::~ArdenBuck()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::saturationModels::ArdenBuck::pSat
+(
+ const volScalarField& T
+) const
+{
+ volScalarField TC(T - zeroC);
+
+ return A*exp(TC*xByTC(TC));
+}
+
+
+Foam::tmp
+Foam::saturationModels::ArdenBuck::pSatPrime
+(
+ const volScalarField& T
+) const
+{
+ volScalarField TC(T - zeroC);
+
+ volScalarField x(xByTC(TC));
+
+ return A*exp(TC*x)*(D*x - TC/C)/(D + TC);
+}
+
+
+Foam::tmp
+Foam::saturationModels::ArdenBuck::lnPSat
+(
+ const volScalarField& T
+) const
+{
+ volScalarField TC(T - zeroC);
+
+ return log(A.value()) + TC*xByTC(TC);
+}
+
+
+Foam::tmp
+Foam::saturationModels::ArdenBuck::Tsat
+(
+ const volScalarField& p
+) const
+{
+ NotImplemented;
+
+ return volScalarField::null();
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/ArdenBuck/ArdenBuck.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/ArdenBuck/ArdenBuck.H
new file mode 100644
index 0000000000..4b8b374263
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/ArdenBuck/ArdenBuck.H
@@ -0,0 +1,106 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::saturationModels::ArdenBuck
+
+Description
+ ArdenBuck equation for the vapour pressure of moist air.
+
+SourceFiles
+ ArdenBuck.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef ArdenBuck_H
+#define ArdenBuck_H
+
+#include "saturationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class ArdenBuck Declaration
+\*---------------------------------------------------------------------------*/
+
+class ArdenBuck
+:
+ public saturationModel
+{
+ // Private Member Functions
+
+ //- Exponent divided by the temperature
+ tmp xByTC(const volScalarField& TC) const;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("ArdenBuck");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ ArdenBuck
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~ArdenBuck();
+
+
+ // Member Functions
+
+ //- Saturation pressure
+ virtual tmp pSat(const volScalarField& T) const;
+
+ //- Saturation pressure derivative w.r.t. temperature
+ virtual tmp pSatPrime(const volScalarField& T) const;
+
+ //- Natural log of the saturation pressure
+ virtual tmp lnPSat(const volScalarField& T) const;
+
+ //- Saturation temperature
+ virtual tmp Tsat(const volScalarField& p) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace saturationModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/constantSaturationConditions/constantSaturationConditions.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/constantSaturationConditions/constantSaturationConditions.C
new file mode 100644
index 0000000000..3d8f4467a8
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/constantSaturationConditions/constantSaturationConditions.C
@@ -0,0 +1,130 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "constantSaturationConditions.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+ defineTypeNameAndDebug(constantSaturationConditions, 0);
+ addToRunTimeSelectionTable
+ (
+ saturationModel,
+ constantSaturationConditions,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::saturationModels::constantSaturationConditions::
+constantSaturationConditions
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ saturationModel(dict, interface),
+ pSat_("pSat", dimPressure, dict),
+ Tsat_("Tsat", dimTemperature, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::saturationModels::constantSaturationConditions::
+~constantSaturationConditions()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::saturationModels::constantSaturationConditions::pSat
+(
+ const volScalarField& T
+) const
+{
+ return volScalarField::New
+ (
+ "pSat",
+ T.mesh(),
+ pSat_
+ );
+}
+
+
+Foam::tmp
+Foam::saturationModels::constantSaturationConditions::pSatPrime
+(
+ const volScalarField& T
+) const
+{
+ return volScalarField::New
+ (
+ "pSatPrime",
+ T.mesh(),
+ dimensionedScalar(dimPressure/dimTemperature, 0)
+ );
+}
+
+
+Foam::tmp
+Foam::saturationModels::constantSaturationConditions::lnPSat
+(
+ const volScalarField& T
+) const
+{
+ return volScalarField::New
+ (
+ "lnPSat",
+ T.mesh(),
+ dimensionedScalar(dimless, log(pSat_.value()))
+ );
+}
+
+
+Foam::tmp
+Foam::saturationModels::constantSaturationConditions::Tsat
+(
+ const volScalarField& p
+) const
+{
+ return volScalarField::New
+ (
+ "Tsat",
+ p.mesh(),
+ Tsat_
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/constantSaturationConditions/constantSaturationConditions.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/constantSaturationConditions/constantSaturationConditions.H
new file mode 100644
index 0000000000..1f761e4307
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/constantSaturationConditions/constantSaturationConditions.H
@@ -0,0 +1,111 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::saturationModels::constantSaturationConditions
+
+Description
+ Constant saturation pressure and temperature.
+
+SourceFiles
+ constantSaturationConditions.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef constantSaturationConditions_H
+#define constantSaturationConditions_H
+
+#include "saturationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class constantSaturationConditions Declaration
+\*---------------------------------------------------------------------------*/
+
+class constantSaturationConditions
+:
+ public saturationModel
+{
+protected:
+
+ // Private Data
+
+ //- Constant saturation pressure
+ dimensionedScalar pSat_;
+
+ //- Constant saturation temperature
+ dimensionedScalar Tsat_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("constant");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ constantSaturationConditions
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~constantSaturationConditions();
+
+
+ // Member Functions
+
+ //- Saturation pressure
+ virtual tmp pSat(const volScalarField& T) const;
+
+ //- Saturation pressure derivative w.r.t. temperature
+ virtual tmp pSatPrime(const volScalarField& T) const;
+
+ //- Natural log of the saturation pressure
+ virtual tmp lnPSat(const volScalarField& T) const;
+
+ //- Saturation temperature
+ virtual tmp Tsat(const volScalarField& p) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace saturationModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/function1/function1.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/function1/function1.C
new file mode 100644
index 0000000000..6f54b40006
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/function1/function1.C
@@ -0,0 +1,136 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2017-2022 OpenFOAM Foundation
+ \\/ 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 "function1.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+ defineTypeNameAndDebug(function1, 0);
+ addToRunTimeSelectionTable(saturationModel, function1, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::saturationModels::function1::function1
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ saturationModel(dict, interface),
+ function_(Function1::New("function", dict))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::saturationModels::function1::~function1()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::saturationModels::function1::pSat
+(
+ const volScalarField& T
+) const
+{
+ NotImplemented;
+ return volScalarField::null();
+}
+
+
+Foam::tmp
+Foam::saturationModels::function1::pSatPrime
+(
+ const volScalarField& T
+) const
+{
+ NotImplemented;
+ return volScalarField::null();
+}
+
+
+Foam::tmp
+Foam::saturationModels::function1::lnPSat
+(
+ const volScalarField& T
+) const
+{
+ NotImplemented;
+ return volScalarField::null();
+}
+
+
+Foam::tmp
+Foam::saturationModels::function1::Tsat
+(
+ const volScalarField& p
+) const
+{
+ tmp tTsat
+ (
+ volScalarField::New
+ (
+ "Tsat",
+ p.mesh(),
+ dimensionedScalar(dimTemperature, 0)
+ )
+ );
+
+ volScalarField& Tsat = tTsat.ref();
+
+ forAll(Tsat, celli)
+ {
+ Tsat[celli] = function_->value(p[celli]);
+ }
+
+ volScalarField::Boundary& TsatBf = Tsat.boundaryFieldRef();
+
+ forAll(Tsat.boundaryField(), patchi)
+ {
+ scalarField& Tsatp = TsatBf[patchi];
+ const scalarField& pp = p.boundaryField()[patchi];
+
+ forAll(Tsatp, facei)
+ {
+ Tsatp[facei] = function_->value(pp[facei]);
+
+ }
+ }
+
+ return tTsat;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/function1/function1.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/function1/function1.H
new file mode 100644
index 0000000000..11a51dd5fd
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/function1/function1.H
@@ -0,0 +1,147 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2017-2022 OpenFOAM Foundation
+ \\/ 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::saturationModels::function1
+
+Description
+ Saturation vapour temperature in terms of
+ the vapour pressure (in Pa). The saturation temperature in Kelvins is
+ specified as a Foam::Function1 type, to enable use of, e.g. constant,
+ polynomial, table values.
+
+ Currently this class only provides \f$T_sat\f$, the inverse function to
+ return the vapour pressure for a given temperature are not implemented.
+
+ Examples:
+
+ \verbatim
+ type function1;
+ function polynomial
+ (
+ (308.0422 0)
+ (0.0015096 1)
+ (-1.61589e-8 2)
+ (1.114106e-13 3)
+ (-4.52216e-19 4)
+ (1.05192e-24 5)
+ (-1.2953e-30 6)
+ (6.5365e-37 7)
+ )
+ \endverbatim
+
+ \verbatim
+ type function1;
+ function table;
+ functionCoeffs
+ {
+ file "filename.csv";
+ format csv;
+ nHeaderLine 1;
+ refColumn 0;
+ componentColumns (1);
+ separator ",";
+ mergeSeparators no;
+ outOfBounds clamp;
+ interpolationScheme linear;
+ };
+ \endverbatim
+
+SourceFiles
+ function1.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef function1_H
+#define function1_H
+
+#include "saturationModel.H"
+#include "Function1.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class function1 Declaration
+\*---------------------------------------------------------------------------*/
+
+class function1
+:
+ public saturationModel
+{
+ // Private Data
+
+ //- Saturation temperature as a function of pressure
+ autoPtr> function_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("function1");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ function1
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~function1();
+
+
+ // Member Functions
+
+ //- Saturation pressure
+ virtual tmp pSat(const volScalarField& T) const;
+
+ //- Saturation pressure derivative w.r.t. temperature
+ virtual tmp pSatPrime(const volScalarField& T) const;
+
+ //- Natural log of the saturation pressure
+ virtual tmp lnPSat(const volScalarField& T) const;
+
+ //- Saturation temperature
+ virtual tmp Tsat(const volScalarField& p) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace saturationModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/polynomial/polynomial.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/polynomial/polynomial.C
new file mode 100644
index 0000000000..e735e7f12f
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/polynomial/polynomial.C
@@ -0,0 +1,135 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "polynomial.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+ defineTypeNameAndDebug(polynomial, 0);
+ addToRunTimeSelectionTable(saturationModel, polynomial, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::saturationModels::polynomial::polynomial
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ saturationModel(dict, interface),
+ C_(dict.lookup("C<8>"))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::saturationModels::polynomial::~polynomial()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::saturationModels::polynomial::pSat
+(
+ const volScalarField& T
+) const
+{
+ NotImplemented;
+ return volScalarField::null();
+}
+
+
+Foam::tmp
+Foam::saturationModels::polynomial::pSatPrime
+(
+ const volScalarField& T
+) const
+{
+ NotImplemented;
+ return volScalarField::null();
+}
+
+
+Foam::tmp
+Foam::saturationModels::polynomial::lnPSat
+(
+ const volScalarField& T
+) const
+{
+ NotImplemented;
+ return volScalarField::null();
+}
+
+
+Foam::tmp
+Foam::saturationModels::polynomial::Tsat
+(
+ const volScalarField& p
+) const
+{
+ tmp tTsat
+ (
+ volScalarField::New
+ (
+ "Tsat",
+ p.mesh(),
+ dimensionedScalar(dimTemperature, 0)
+ )
+ );
+
+ volScalarField& Tsat = tTsat.ref();
+
+ forAll(Tsat, celli)
+ {
+ Tsat[celli] = C_.value(p[celli]);
+ }
+
+ volScalarField::Boundary& TsatBf = Tsat.boundaryFieldRef();
+
+ forAll(Tsat.boundaryField(), patchi)
+ {
+ scalarField& Tsatp = TsatBf[patchi];
+ const scalarField& pp = p.boundaryField()[patchi];
+
+ forAll(Tsatp, facei)
+ {
+ Tsatp[facei] = C_.value(pp[facei]);
+ }
+ }
+
+ return tTsat;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/polynomial/polynomial.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/polynomial/polynomial.H
new file mode 100644
index 0000000000..d7204109a3
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/polynomial/polynomial.H
@@ -0,0 +1,117 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::saturationModels::polynomial
+
+Description
+ Polynomial equation for the saturation vapour temperature in terms of
+ the vapour pressure (in Pa).
+
+ \f[
+ T_sat = \sum_i C_i p^i
+ \f]
+
+ where \f$p\f$ is the pressure in Pa and \f$C\f$ are the coefficients.
+
+ Currently this class only provides \f$T_sat\f$, the inverse function to
+ return the vapour pressure for a given temperature are not implemented.
+
+SourceFiles
+ polynomial.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef polynomial_H
+#define polynomial_H
+
+#include "saturationModel.H"
+#include "Polynomial.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace saturationModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class polynomial Declaration
+\*---------------------------------------------------------------------------*/
+
+class polynomial
+:
+ public saturationModel
+{
+ // Private Data
+
+ //- Polynomial coefficients
+ Polynomial<8> C_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("polynomial");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ polynomial
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~polynomial();
+
+
+ // Member Functions
+
+ //- Saturation pressure
+ virtual tmp pSat(const volScalarField& T) const;
+
+ //- Saturation pressure derivative w.r.t. temperature
+ virtual tmp pSatPrime(const volScalarField& T) const;
+
+ //- Natural log of the saturation pressure
+ virtual tmp lnPSat(const volScalarField& T) const;
+
+ //- Saturation temperature
+ virtual tmp Tsat(const volScalarField& p) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace saturationModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/saturationModel/saturationModel.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/saturationModel/saturationModel.C
new file mode 100644
index 0000000000..d0d8a80761
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/saturationModel/saturationModel.C
@@ -0,0 +1,78 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "saturationModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ defineTypeNameAndDebug(saturationModel, 0);
+ defineRunTimeSelectionTable(saturationModel, dictionary);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::saturationModel::saturationModel
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ regIOobject
+ (
+ IOobject
+ (
+ IOobject::groupName("saturationModel", interface.name()),
+ interface.mesh().time().constant(),
+ interface.mesh()
+ )
+ ),
+ interface_(interface)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::saturationModel::~saturationModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+const Foam::phaseInterface& Foam::saturationModel::interface() const
+{
+ return interface_;
+}
+
+
+bool Foam::saturationModel::writeData(Ostream& os) const
+{
+ return os.good();
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/saturationModel/saturationModel.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/saturationModel/saturationModel.H
new file mode 100644
index 0000000000..ed98fe0f2f
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/saturationModel/saturationModel.H
@@ -0,0 +1,150 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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::saturationModel
+
+Description
+ Model to describe the dependence of saturation pressure on temperature, and
+ vice versa
+
+SourceFiles
+ saturationModel.C
+ saturationModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef saturationModel_H
+#define saturationModel_H
+
+#include "volFields.H"
+#include "dictionary.H"
+#include "phaseInterface.H"
+#include "runTimeSelectionTables.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class saturationModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class saturationModel
+:
+ public regIOobject
+{
+ // Private Data
+
+ //- The interface
+ const phaseInterface interface_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("saturationModel");
+
+
+ //- Declare runtime construction
+ declareRunTimeSelectionTable
+ (
+ autoPtr,
+ saturationModel,
+ dictionary,
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ ),
+ (dict, interface)
+ );
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ saturationModel
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ // Selectors
+
+ static autoPtr New
+ (
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool outer=true
+ );
+
+
+ //- Destructor
+ virtual ~saturationModel();
+
+
+ // Member Functions
+
+ //- Access the interface
+ const phaseInterface& interface() const;
+
+ //- Saturation pressure
+ virtual tmp pSat
+ (
+ const volScalarField& T
+ ) const = 0;
+
+ //- Saturation pressure derivative w.r.t. temperature
+ virtual tmp pSatPrime
+ (
+ const volScalarField& T
+ ) const = 0;
+
+ //- Natural log of the saturation pressure
+ virtual tmp lnPSat
+ (
+ const volScalarField& T
+ ) const = 0;
+
+ //- Saturation temperature
+ virtual tmp Tsat
+ (
+ const volScalarField& p
+ ) const = 0;
+
+ //- Dummy write for regIOobject
+ bool writeData(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/saturationModel/saturationModelNew.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/saturationModel/saturationModelNew.C
new file mode 100644
index 0000000000..4b2bcfbc4a
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialCompositionModels/saturationModels/saturationModel/saturationModelNew.C
@@ -0,0 +1,63 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2015-2022 OpenFOAM Foundation
+ \\/ 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 "saturationModel.H"
+#include "phaseSystem.H"
+
+// * * * * * * * * * * * * * * * * Selector * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr Foam::saturationModel::New
+(
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool outer
+)
+{
+ const dictionary& modelDict =
+ outer ? interface.fluid().modelSubDict(dict) : dict;
+
+ const word saturationModelType(modelDict.lookup("type"));
+
+ Info<< "Selecting saturationModel for "
+ << interface.name() << ": " << saturationModelType << endl;
+
+ dictionaryConstructorTable::iterator cstrIter =
+ dictionaryConstructorTablePtr_->find(saturationModelType);
+
+ if (cstrIter == dictionaryConstructorTablePtr_->end())
+ {
+ FatalErrorInFunction
+ << "Unknown saturationModelType type "
+ << saturationModelType << endl << endl
+ << "Valid saturationModel types are : " << endl
+ << dictionaryConstructorTablePtr_->sortedToc()
+ << exit(FatalError);
+ }
+
+ return cstrIter()(modelDict, interface);
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/Make/files b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/Make/files
new file mode 100644
index 0000000000..fa1eb1f6f8
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/Make/files
@@ -0,0 +1,91 @@
+dragModels/dragModel/dragModel.C
+dragModels/dragModel/dragModelNew.C
+dragModels/dispersedDragModel/dispersedDragModel.C
+dragModels/Beetstra/Beetstra.C
+dragModels/segregated/segregated.C
+dragModels/Ergun/Ergun.C
+dragModels/Gibilaro/Gibilaro.C
+dragModels/GidaspowErgunWenYu/GidaspowErgunWenYu.C
+dragModels/GidaspowSchillerNaumann/GidaspowSchillerNaumann.C
+dragModels/Lain/Lain.C
+dragModels/SchillerNaumann/SchillerNaumann.C
+dragModels/SyamlalOBrien/SyamlalOBrien.C
+dragModels/TomiyamaCorrelated/TomiyamaCorrelated.C
+dragModels/TomiyamaAnalytic/TomiyamaAnalytic.C
+dragModels/Tenneti/Tenneti.C
+dragModels/TomiyamaKataokaZunSakaguchi/TomiyamaKataokaZunSakaguchi.C
+dragModels/WenYu/WenYu.C
+dragModels/IshiiZuber/IshiiZuber.C
+dragModels/AttouFerschneider/AttouFerschneider.C
+dragModels/aerosolDrag/aerosolDrag.C
+dragModels/timeScaleFilteredDrag/timeScaleFilteredDrag.C
+
+swarmCorrections/swarmCorrection/swarmCorrection.C
+swarmCorrections/swarmCorrection/swarmCorrectionNew.C
+swarmCorrections/noSwarm/noSwarm.C
+swarmCorrections/TomiyamaSwarm/TomiyamaSwarm.C
+
+liftModels/liftModel/liftModel.C
+liftModels/liftModel/liftModelNew.C
+liftModels/dispersedLiftModel/dispersedLiftModel.C
+liftModels/noLift/noLift.C
+liftModels/constantLiftCoefficient/constantLiftCoefficient.C
+liftModels/Moraga/Moraga.C
+liftModels/LegendreMagnaudet/LegendreMagnaudet.C
+liftModels/SaffmanMei/SaffmanMei.C
+liftModels/TomiyamaLift/TomiyamaLift.C
+liftModels/wallDampedLift/wallDampedLift.C
+
+heatTransferModels/heatTransferModel/heatTransferModel.C
+heatTransferModels/heatTransferModel/heatTransferModelNew.C
+heatTransferModels/constantNu/constantNuHeatTransfer.C
+heatTransferModels/RanzMarshall/RanzMarshall.C
+heatTransferModels/Gunn/Gunn.C
+heatTransferModels/sphericalHeatTransfer/sphericalHeatTransfer.C
+heatTransferModels/timeScaleFilteredHeatTransfer/timeScaleFilteredHeatTransfer.C
+
+virtualMassModels/virtualMassModel/virtualMassModel.C
+virtualMassModels/virtualMassModel/virtualMassModelNew.C
+virtualMassModels/dispersedVirtualMassModel/dispersedVirtualMassModel.C
+virtualMassModels/noVirtualMass/noVirtualMass.C
+virtualMassModels/constantVirtualMassCoefficient/constantVirtualMassCoefficient.C
+virtualMassModels/Lamb/Lamb.C
+
+wallLubricationModels/wallLubricationModel/wallLubricationModel.C
+wallLubricationModels/wallLubricationModel/wallLubricationModelNew.C
+wallLubricationModels/dispersedWallLubricationModel/dispersedWallLubricationModel.C
+wallLubricationModels/noWallLubrication/noWallLubrication.C
+wallLubricationModels/Antal/Antal.C
+wallLubricationModels/Frank/Frank.C
+wallLubricationModels/TomiyamaWallLubrication/TomiyamaWallLubrication.C
+
+turbulentDispersionModels/turbulentDispersionModel/turbulentDispersionModel.C
+turbulentDispersionModels/turbulentDispersionModel/turbulentDispersionModelNew.C
+turbulentDispersionModels/dispersedTurbulentDispersionModel/dispersedTurbulentDispersionModel.C
+turbulentDispersionModels/noTurbulentDispersion/noTurbulentDispersion.C
+turbulentDispersionModels/constantTurbulentDispersionCoefficient/constantTurbulentDispersionCoefficient.C
+turbulentDispersionModels/Burns/Burns.C
+turbulentDispersionModels/Gosman/Gosman.C
+turbulentDispersionModels/LopezDeBertodano/LopezDeBertodano.C
+
+aspectRatioModels/aspectRatioModel/aspectRatioModel.C
+aspectRatioModels/aspectRatioModel/aspectRatioModelNew.C
+aspectRatioModels/constantAspectRatio/constantAspectRatio.C
+aspectRatioModels/TomiyamaAspectRatio/TomiyamaAspectRatio.C
+aspectRatioModels/VakhrushevEfremov/VakhrushevEfremov.C
+aspectRatioModels/Wellek/Wellek.C
+
+wallDependentModel/wallDependentModel.C
+
+wallDampingModels/wallDampingModel/wallDampingModel.C
+wallDampingModels/wallDampingModel/wallDampingModelNew.C
+wallDampingModels/linear/linearWallDamping.C
+wallDampingModels/cosine/cosineWallDamping.C
+wallDampingModels/sine/sineWallDamping.C
+
+phaseTransferModels/phaseTransferModel/phaseTransferModel.C
+phaseTransferModels/phaseTransferModel/phaseTransferModelNew.C
+phaseTransferModels/deposition/deposition.C
+phaseTransferModels/reactionDriven/reactionDriven.C
+
+LIB = $(FOAM_LIBBIN)/libeulerianInterfacialModels
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/Make/options b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/Make/options
new file mode 100644
index 0000000000..a1290d84ef
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/Make/options
@@ -0,0 +1,15 @@
+EXE_INC = \
+ -I../phaseSystems/lnInclude \
+ -I$(LIB_SRC)/physicalProperties/lnInclude \
+ -I$(LIB_SRC)/thermophysicalModels/basic/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/momentumTransportModels/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/compressible/lnInclude \
+ -I$(LIB_SRC)/MomentumTransportModels/phaseCompressible/lnInclude \
+ -I$(LIB_SRC)/finiteVolume/lnInclude \
+ -I$(LIB_SRC)/meshTools/lnInclude \
+ -I$(LIB_SRC)/sampling/lnInclude
+
+LIB_LIBS = \
+ -lphaseSystem \
+ -lfluidThermophysicalModels \
+ -lspecie
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/TomiyamaAspectRatio/TomiyamaAspectRatio.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/TomiyamaAspectRatio/TomiyamaAspectRatio.C
new file mode 100644
index 0000000000..ee5aad4c0c
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/TomiyamaAspectRatio/TomiyamaAspectRatio.C
@@ -0,0 +1,76 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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 "TomiyamaAspectRatio.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace aspectRatioModels
+{
+ defineTypeNameAndDebug(TomiyamaAspectRatio, 0);
+ addToRunTimeSelectionTable
+ (
+ aspectRatioModel,
+ TomiyamaAspectRatio,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::aspectRatioModels::TomiyamaAspectRatio::TomiyamaAspectRatio
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ VakhrushevEfremov(dict, interface),
+ wallDependentModel(interface_.mesh())
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::aspectRatioModels::TomiyamaAspectRatio::~TomiyamaAspectRatio()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::aspectRatioModels::TomiyamaAspectRatio::E() const
+{
+ return
+ VakhrushevEfremov::E()
+ *max(1 - 0.35*yWall()/interface_.dispersed().d(), scalar(0.65));
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/TomiyamaAspectRatio/TomiyamaAspectRatio.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/TomiyamaAspectRatio/TomiyamaAspectRatio.H
new file mode 100644
index 0000000000..d2c53eb758
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/TomiyamaAspectRatio/TomiyamaAspectRatio.H
@@ -0,0 +1,101 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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::aspectRatioModels::TomiyamaAspectRatio
+
+Description
+ Aspect ratio model of Tomiyama.
+
+ Reference:
+ \verbatim
+ Otromke, M. (2013).
+ Implementation and Comparison of Correlations for interfacial Forces in
+ a Gas-Liquid System within an Euler-Euler Framework.
+ PhD Thesis.
+ \endverbatim
+
+SourceFiles
+ TomiyamaAspectRatio.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef TomiyamaAspectRatio_H
+#define TomiyamaAspectRatio_H
+
+#include "VakhrushevEfremov.H"
+#include "wallDependentModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace aspectRatioModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class TomiyamaAspectRatio Declaration
+\*---------------------------------------------------------------------------*/
+
+class TomiyamaAspectRatio
+:
+ public VakhrushevEfremov,
+ public wallDependentModel
+{
+public:
+
+ //- Runtime type information
+ TypeName("Tomiyama");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ TomiyamaAspectRatio
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~TomiyamaAspectRatio();
+
+
+ // Member Functions
+
+ //- Aspect ratio
+ virtual tmp E() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace aspectRatioModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/VakhrushevEfremov/VakhrushevEfremov.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/VakhrushevEfremov/VakhrushevEfremov.C
new file mode 100644
index 0000000000..94e9f1f009
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/VakhrushevEfremov/VakhrushevEfremov.C
@@ -0,0 +1,79 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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 "VakhrushevEfremov.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace aspectRatioModels
+{
+ defineTypeNameAndDebug(VakhrushevEfremov, 0);
+ addToRunTimeSelectionTable
+ (
+ aspectRatioModel,
+ VakhrushevEfremov,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::aspectRatioModels::VakhrushevEfremov::VakhrushevEfremov
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ aspectRatioModel(dict, interface)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::aspectRatioModels::VakhrushevEfremov::~VakhrushevEfremov()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::aspectRatioModels::VakhrushevEfremov::E() const
+{
+ const volScalarField Ta(interface_.Ta());
+
+ return
+ neg(Ta - 1)
+ + pos0(Ta - 1)*neg(Ta - 39.8)
+ *pow3(0.81 + 0.206*tanh(1.6 - 2*log10(max(Ta, scalar(1)))))
+ + pos0(Ta - 39.8)*0.24;
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/VakhrushevEfremov/VakhrushevEfremov.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/VakhrushevEfremov/VakhrushevEfremov.H
new file mode 100644
index 0000000000..6303d18c93
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/VakhrushevEfremov/VakhrushevEfremov.H
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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::aspectRatioModels::VakhrushevEfremov
+
+Description
+ Aspect ratio model of Vakhrushev and Efremov.
+
+ Reference:
+ \verbatim
+ Vakhrushev, I. A., & Efremov, G. I. (1970).
+ Interpolation formula for computing the velocities of single gas bubbles
+ in liquids.
+ Chemistry and Technology of Fuels and Oils, 6(5), 376-379.
+ \endverbatim
+
+SourceFiles
+ VakhrushevEfremov.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef VakhrushevEfremov_H
+#define VakhrushevEfremov_H
+
+#include "aspectRatioModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace aspectRatioModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class VakhrushevEfremov Declaration
+\*---------------------------------------------------------------------------*/
+
+class VakhrushevEfremov
+:
+ public aspectRatioModel
+{
+public:
+
+ //- Runtime type information
+ TypeName("VakhrushevEfremov");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ VakhrushevEfremov
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~VakhrushevEfremov();
+
+
+ // Member Functions
+
+ //- Aspect ratio
+ virtual tmp E() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace aspectRatioModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/Wellek/Wellek.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/Wellek/Wellek.C
new file mode 100644
index 0000000000..45e6c5aa64
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/Wellek/Wellek.C
@@ -0,0 +1,73 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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 "Wellek.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace aspectRatioModels
+{
+ defineTypeNameAndDebug(Wellek, 0);
+ addToRunTimeSelectionTable
+ (
+ aspectRatioModel,
+ Wellek,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::aspectRatioModels::Wellek::Wellek
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ aspectRatioModel(dict, interface)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::aspectRatioModels::Wellek::~Wellek()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::aspectRatioModels::Wellek::E() const
+{
+ return scalar(1)/(1 + 0.163*pow(interface_.Eo(), 0.757));
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/Wellek/Wellek.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/Wellek/Wellek.H
new file mode 100644
index 0000000000..5cbe7991f4
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/Wellek/Wellek.H
@@ -0,0 +1,105 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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::aspectRatioModels::Wellek
+
+Description
+ Aspect ratio model of Wellek et al.
+
+ References:
+ \verbatim
+ Otromke, M. (2013).
+ Implementation and Comparison of Correlations for interfacial Forces in
+ a Gas-Liquid System within an Euler-Euler Framework.
+ PhD Thesis.
+ \endverbatim
+
+ \verbatim
+ Wellek, R. M., Agrawal, A. K., & Skelland, A. H. P. (1966).
+ Shape of liquid drops moving in liquid media.
+ AIChE Journal, 12(5), 854-862.
+ \endverbatim
+
+SourceFiles
+ Wellek.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Wellek_H
+#define Wellek_H
+
+#include "aspectRatioModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace aspectRatioModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class Wellek Declaration
+\*---------------------------------------------------------------------------*/
+
+class Wellek
+:
+ public aspectRatioModel
+{
+public:
+
+ //- Runtime type information
+ TypeName("Wellek");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ Wellek
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~Wellek();
+
+
+ // Member Functions
+
+ //- Aspect ratio
+ virtual tmp E() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace aspectRatioModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/aspectRatioModel/aspectRatioModel.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/aspectRatioModel/aspectRatioModel.C
new file mode 100644
index 0000000000..5c26399e0f
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/aspectRatioModel/aspectRatioModel.C
@@ -0,0 +1,55 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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 "aspectRatioModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ defineTypeNameAndDebug(aspectRatioModel, 0);
+ defineRunTimeSelectionTable(aspectRatioModel, dictionary);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::aspectRatioModel::aspectRatioModel
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ interface_(interface.modelCast())
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::aspectRatioModel::~aspectRatioModel()
+{}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/aspectRatioModel/aspectRatioModel.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/aspectRatioModel/aspectRatioModel.H
new file mode 100644
index 0000000000..1bca597fd9
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/aspectRatioModel/aspectRatioModel.H
@@ -0,0 +1,123 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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::aspectRatioModel
+
+Description
+ Model for deviations in the shape of the dispersed phase from spherical.
+ Just a sub-model modifier, typically for the drag model. Not a proper part
+ of the diameter/shape modelling in the phase models.
+
+SourceFiles
+ aspectRatioModel.C
+ aspectRatioModelNew.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef aspectRatioModel_H
+#define aspectRatioModel_H
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#include "volFields.H"
+#include "dictionary.H"
+#include "runTimeSelectionTables.H"
+#include "dispersedPhaseInterface.H"
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class aspectRatioModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class aspectRatioModel
+{
+protected:
+
+ // Protected data
+
+ //- Interface
+ const dispersedPhaseInterface interface_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("aspectRatioModel");
+
+
+ // Declare runtime construction
+ declareRunTimeSelectionTable
+ (
+ autoPtr,
+ aspectRatioModel,
+ dictionary,
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ ),
+ (dict, interface)
+ );
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ aspectRatioModel
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~aspectRatioModel();
+
+
+ // Selectors
+
+ static autoPtr New
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ // Member Functions
+
+ //- Aspect ratio
+ virtual tmp E() const = 0;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/aspectRatioModel/aspectRatioModelNew.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/aspectRatioModel/aspectRatioModelNew.C
new file mode 100644
index 0000000000..b807727abc
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/aspectRatioModel/aspectRatioModelNew.C
@@ -0,0 +1,60 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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 "aspectRatioModel.H"
+#include "phaseSystem.H"
+
+// * * * * * * * * * * * * * * * * Selector * * * * * * * * * * * * * * * * //
+
+Foam::autoPtr
+Foam::aspectRatioModel::New
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+{
+ const word aspectRatioModelType(dict.lookup("type"));
+
+ Info<< "Selecting aspectRatioModel for "
+ << interface.name() << ": " << aspectRatioModelType << endl;
+
+ dictionaryConstructorTable::iterator cstrIter =
+ dictionaryConstructorTablePtr_->find(aspectRatioModelType);
+
+ if (cstrIter == dictionaryConstructorTablePtr_->end())
+ {
+ FatalErrorInFunction
+ << "Unknown aspectRatioModelType type "
+ << aspectRatioModelType << endl << endl
+ << "Valid aspectRatioModel types are : " << endl
+ << dictionaryConstructorTablePtr_->sortedToc()
+ << exit(FatalError);
+ }
+
+ return cstrIter()(dict, interface);
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/constantAspectRatio/constantAspectRatio.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/constantAspectRatio/constantAspectRatio.C
new file mode 100644
index 0000000000..67ec10cf91
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/constantAspectRatio/constantAspectRatio.C
@@ -0,0 +1,79 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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 "constantAspectRatio.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace aspectRatioModels
+{
+ defineTypeNameAndDebug(constantAspectRatio, 0);
+ addToRunTimeSelectionTable
+ (
+ aspectRatioModel,
+ constantAspectRatio,
+ dictionary
+ );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::aspectRatioModels::constantAspectRatio::constantAspectRatio
+(
+ const dictionary& dict,
+ const phaseInterface& interface
+)
+:
+ aspectRatioModel(dict, interface),
+ E0_("E0", dimless, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::aspectRatioModels::constantAspectRatio::~constantAspectRatio()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::aspectRatioModels::constantAspectRatio::E() const
+{
+ return volScalarField::New
+ (
+ aspectRatioModel::typeName + ":E",
+ interface_.mesh(),
+ E0_
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/constantAspectRatio/constantAspectRatio.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/constantAspectRatio/constantAspectRatio.H
new file mode 100644
index 0000000000..86131e1c2a
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/aspectRatioModels/constantAspectRatio/constantAspectRatio.H
@@ -0,0 +1,97 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2014-2022 OpenFOAM Foundation
+ \\/ 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::aspectRatioModels::constantAspectRatio
+
+Description
+ Constant value aspect ratio model.
+
+SourceFiles
+ constantAspectRatio.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef constantAspectRatio_H
+#define constantAspectRatio_H
+
+#include "aspectRatioModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace aspectRatioModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class constantAspectRatio Declaration
+\*---------------------------------------------------------------------------*/
+
+class constantAspectRatio
+:
+ public aspectRatioModel
+{
+ // Private Data
+
+ //- Constant aspect ratio value
+ const dimensionedScalar E0_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("constant");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ constantAspectRatio
+ (
+ const dictionary& dict,
+ const phaseInterface& interface
+ );
+
+
+ //- Destructor
+ virtual ~constantAspectRatio();
+
+
+ // Member Functions
+
+ //- Aspect ratio
+ virtual tmp E() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace aspectRatioModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/AttouFerschneider/AttouFerschneider.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/AttouFerschneider/AttouFerschneider.C
new file mode 100644
index 0000000000..9b0d013e0b
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/AttouFerschneider/AttouFerschneider.C
@@ -0,0 +1,167 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2018-2022 OpenFOAM Foundation
+ \\/ 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 "AttouFerschneider.H"
+#include "phaseSystem.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+ defineTypeNameAndDebug(AttouFerschneider, 0);
+ addToRunTimeSelectionTable(dragModel, AttouFerschneider, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
+
+Foam::tmp
+Foam::dragModels::AttouFerschneider::KGasLiquid
+(
+ const phaseModel& gas,
+ const phaseModel& liquid
+) const
+{
+ const phaseModel& solid = gas.fluid().phases()[solidName_];
+
+ const volScalarField oneMinusGas(max(1 - gas, liquid.residualAlpha()));
+ const volScalarField cbrtR
+ (
+ cbrt(max(solid, solid.residualAlpha())/oneMinusGas)
+ );
+ const volScalarField magURel(mag(gas.U() - liquid.U()));
+
+ return
+ E2_*gas.thermo().mu()*sqr(oneMinusGas/solid.d())*sqr(cbrtR)
+ /max(gas, gas.residualAlpha())
+ + E2_*gas.rho()*magURel*(1 - gas)/solid.d()*cbrtR;
+}
+
+
+Foam::tmp
+Foam::dragModels::AttouFerschneider::KGasSolid
+(
+ const phaseModel& gas,
+ const phaseModel& solid
+) const
+{
+ const volScalarField oneMinusGas(max(1 - gas, solid.residualAlpha()));
+ const volScalarField cbrtR
+ (
+ cbrt(max(solid, solid.residualAlpha())/oneMinusGas)
+ );
+
+ return
+ E1_*gas.thermo().mu()*sqr(oneMinusGas/solid.d())*sqr(cbrtR)
+ /max(gas, gas.residualAlpha())
+ + E2_*gas.rho()*mag(gas.U())*(1 - gas)/solid.d()*cbrtR;
+}
+
+
+Foam::tmp
+Foam::dragModels::AttouFerschneider::KLiquidSolid
+(
+ const phaseModel& liquid,
+ const phaseModel& solid
+) const
+{
+ const phaseModel& gas = liquid.fluid().phases()[gasName_];
+
+ return
+ E1_*liquid.thermo().mu()
+ *sqr(max(solid, solid.residualAlpha())/solid.d())
+ /max(liquid, liquid.residualAlpha())
+ + E2_*liquid.rho()*mag(gas.U())*solid/solid.d();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::dragModels::AttouFerschneider::AttouFerschneider
+(
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+)
+:
+ dragModel(dict, interface, registerObject),
+ interface_(interface),
+ gasName_(dict.lookup("gas")),
+ liquidName_(dict.lookup("liquid")),
+ solidName_(dict.lookup("solid")),
+ E1_("E1", dimless, dict),
+ E2_("E2", dimless, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::dragModels::AttouFerschneider::~AttouFerschneider()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::dragModels::AttouFerschneider::K() const
+{
+ const phaseModel& gas = interface_.fluid().phases()[gasName_];
+ const phaseModel& liquid = interface_.fluid().phases()[liquidName_];
+ const phaseModel& solid = interface_.fluid().phases()[solidName_];
+
+ if (interface_.contains(gas) && interface_.contains(liquid))
+ {
+ return KGasLiquid(gas, liquid);
+ }
+ if (interface_.contains(gas) && interface_.contains(solid))
+ {
+ return KGasSolid(gas, solid);
+ }
+ if (interface_.contains(liquid) && interface_.contains(solid))
+ {
+ return KLiquidSolid(liquid, solid);
+ }
+
+ FatalErrorInFunction
+ << "The interface " << interface_.name() << " does not contain two "
+ << "out of the gas, liquid and solid phase models."
+ << exit(FatalError);
+
+ return tmp(nullptr);
+}
+
+
+Foam::tmp
+Foam::dragModels::AttouFerschneider::Kf() const
+{
+ return fvc::interpolate(K());
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/AttouFerschneider/AttouFerschneider.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/AttouFerschneider/AttouFerschneider.H
new file mode 100644
index 0000000000..d94af2396a
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/AttouFerschneider/AttouFerschneider.H
@@ -0,0 +1,150 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2018-2022 OpenFOAM Foundation
+ \\/ 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::dragModels::AttouFerschneider
+
+Description
+ Attou and Ferschneider's Drag model for film flow through packed beds. The
+ implementation follows the description of Gunjal and Ranade, who, in the
+ reference below, formulate the model in more convenient terms.
+
+ Reference:
+ \verbatim
+ Gunjal, P. R., & Ranade, V. V. (2007).
+ Modeling of laboratory and commercial scale hydro-processing reactors
+ using CFD.
+ Chemical Engineering Science, 62(18-20), 5512-5526.
+ \endverbatim
+
+SourceFiles
+ AttouFerschneider.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef AttouFerschneider_H
+#define AttouFerschneider_H
+
+#include "dragModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class AttouFerschneider Declaration
+\*---------------------------------------------------------------------------*/
+
+class AttouFerschneider
+:
+ public dragModel
+{
+ // Private Data
+
+ //- Interface
+ const phaseInterface interface_;
+
+ //- Name of the gaseous phase
+ const word gasName_;
+
+ //- Name of the liquidphase
+ const word liquidName_;
+
+ //- Name of the solid phase
+ const word solidName_;
+
+ //- Ergun constant 1
+ const dimensionedScalar E1_;
+
+ //- Ergun constant 2
+ const dimensionedScalar E2_;
+
+
+ // Private Member Functions
+
+ //- Return the momentum transfer coefficient between gas and liquid
+ virtual tmp KGasLiquid
+ (
+ const phaseModel& gas,
+ const phaseModel& liquid
+ ) const;
+
+ //- Return the momentum transfer coefficient between gas and solid
+ virtual tmp KGasSolid
+ (
+ const phaseModel& gas,
+ const phaseModel& solid
+ ) const;
+
+ //- Return the momentum transfer coefficient between liquid and solid
+ virtual tmp KLiquidSolid
+ (
+ const phaseModel& liquid,
+ const phaseModel& solid
+ ) const;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("AttouFerschneider");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ AttouFerschneider
+ (
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+ );
+
+
+ //- Destructor
+ virtual ~AttouFerschneider();
+
+
+ // Member Functions
+
+ //- The drag coefficient used in the momentum equation
+ virtual tmp K() const;
+
+ //- The drag coefficient used in the face-momentum equations
+ virtual tmp Kf() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace dragModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Beetstra/Beetstra.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Beetstra/Beetstra.C
new file mode 100644
index 0000000000..d458db7d63
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Beetstra/Beetstra.C
@@ -0,0 +1,101 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2016-2022 OpenFOAM Foundation
+ \\/ 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 "Beetstra.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+ defineTypeNameAndDebug(Beetstra, 0);
+ addToRunTimeSelectionTable(dragModel, Beetstra, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::dragModels::Beetstra::Beetstra
+(
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+)
+:
+ dispersedDragModel(dict, interface, registerObject),
+ residualRe_("residualRe", dimless, dict.lookup("residualRe"))
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::dragModels::Beetstra::~Beetstra()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp Foam::dragModels::Beetstra::CdRe() const
+{
+ const volScalarField alpha1
+ (
+ max(interface_.dispersed(), interface_.continuous().residualAlpha())
+ );
+
+ const volScalarField alpha2
+ (
+ max(1 - interface_.dispersed(), interface_.continuous().residualAlpha())
+ );
+
+ const volScalarField Res(alpha2*interface_.Re());
+
+ const volScalarField ResLim
+ (
+ "ReLim",
+ max(Res, residualRe_)
+ );
+
+ const volScalarField F0
+ (
+ "F0",
+ 10*alpha1/sqr(alpha2) + sqr(alpha2)*(1 + 1.5*sqrt(alpha1))
+ );
+
+ const volScalarField F1
+ (
+ "F1",
+ 0.413*Res/(24*sqr(alpha2))*(1.0/alpha2
+ + 3*alpha1*alpha2 + 8.4*pow(ResLim, -0.343))
+ /(1 + pow(10.0, 3*alpha1)*pow(ResLim, -(1 + 4*alpha1)/2.0))
+ );
+
+ return 24*alpha2*(F0 + F1);
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Beetstra/Beetstra.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Beetstra/Beetstra.H
new file mode 100644
index 0000000000..94e281fee8
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Beetstra/Beetstra.H
@@ -0,0 +1,108 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2016-2022 OpenFOAM Foundation
+ \\/ 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::dragModels::Beetstra
+
+Description
+ Drag model of Beetstra et al. for monodisperse gas-particle flows obtained
+ with direct numerical simulations with the Lattice-Boltzmann method and
+ accounting for the effect of particle ensembles.
+
+ Reference:
+ \verbatim
+ Beetstra, R., van der Hoef, M. A., & Kuipers, J. a. M. (2007).
+ Drag force of intermediate Reynolds number flow past mono- and
+ bidisperse arrays of spheres.
+ AIChE Journal, 53(2), 489–501.
+ \endverbatim
+
+SourceFiles
+ Beetstra.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Beetstra_H
+#define Beetstra_H
+
+#include "dispersedDragModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class Beetstra Declaration
+\*---------------------------------------------------------------------------*/
+
+class Beetstra
+:
+ public dispersedDragModel
+{
+ // Private Data
+
+ //- Residual Reynolds Number
+ const dimensionedScalar residualRe_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("Beetstra");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ Beetstra
+ (
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+ );
+
+
+ //- Destructor
+ virtual ~Beetstra();
+
+
+ // Member Functions
+
+ //- Drag coefficient
+ virtual tmp CdRe() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace dragModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Ergun/Ergun.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Ergun/Ergun.C
new file mode 100644
index 0000000000..175a9f17e0
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Ergun/Ergun.C
@@ -0,0 +1,79 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
+ \\/ 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 "Ergun.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+ defineTypeNameAndDebug(Ergun, 0);
+ addToRunTimeSelectionTable(dragModel, Ergun, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::dragModels::Ergun::Ergun
+(
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+)
+:
+ dispersedDragModel(dict, interface, registerObject)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::dragModels::Ergun::~Ergun()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp Foam::dragModels::Ergun::CdRe() const
+{
+ const phaseModel& dispersed = interface_.dispersed();
+ const phaseModel& continuous = interface_.continuous();
+
+ return
+ (4.0/3.0)
+ *(
+ 150
+ *max(1 - continuous, dispersed.residualAlpha())
+ /max(continuous, continuous.residualAlpha())
+ + 1.75
+ *interface_.Re()
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Ergun/Ergun.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Ergun/Ergun.H
new file mode 100644
index 0000000000..1197260928
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Ergun/Ergun.H
@@ -0,0 +1,98 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
+ \\/ 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::dragModels::Ergun
+
+Description
+
+ Reference:
+ \verbatim
+ Enwald, H., Peirano, E., & Almstedt, A. E. (1996).
+ Eulerian two-phase flow theory applied to fluidisation.
+ International Journal of Multiphase Flow, 22, 21-66.
+ \endverbatim
+
+SourceFiles
+ Ergun.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Ergun_H
+#define Ergun_H
+
+#include "dispersedDragModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class Ergun Declaration
+\*---------------------------------------------------------------------------*/
+
+class Ergun
+:
+ public dispersedDragModel
+{
+public:
+
+ //- Runtime type information
+ TypeName("Ergun");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ Ergun
+ (
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+ );
+
+
+ //- Destructor
+ virtual ~Ergun();
+
+
+ // Member Functions
+
+ //- Drag coefficient
+ virtual tmp CdRe() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace dragModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Gibilaro/Gibilaro.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Gibilaro/Gibilaro.C
new file mode 100644
index 0000000000..238be2d4d2
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Gibilaro/Gibilaro.C
@@ -0,0 +1,77 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
+ \\/ 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 "Gibilaro.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+ defineTypeNameAndDebug(Gibilaro, 0);
+ addToRunTimeSelectionTable(dragModel, Gibilaro, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::dragModels::Gibilaro::Gibilaro
+(
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+)
+:
+ dispersedDragModel(dict, interface, registerObject)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::dragModels::Gibilaro::~Gibilaro()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp Foam::dragModels::Gibilaro::CdRe() const
+{
+ const volScalarField alpha2
+ (
+ max(1 - interface_.dispersed(), interface_.continuous().residualAlpha())
+ );
+
+ return
+ (4.0/3.0)
+ *(17.3/alpha2 + 0.336*interface_.Re())
+ *max(interface_.continuous(), interface_.continuous().residualAlpha())
+ *pow(alpha2, -2.8);
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Gibilaro/Gibilaro.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Gibilaro/Gibilaro.H
new file mode 100644
index 0000000000..9de4e2a30b
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/Gibilaro/Gibilaro.H
@@ -0,0 +1,99 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
+ \\/ 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::dragModels::Gibilaro
+
+Description
+
+ Reference:
+ \verbatim
+ Enwald, H., Peirano, E., & Almstedt, A. E. (1996).
+ Eulerian two-phase flow theory applied to fluidisation.
+ International Journal of Multiphase Flow, 22, 21-66.
+ Eq. 106, p. 43.
+ \endverbatim
+
+SourceFiles
+ Gibilaro.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Gibilaro_H
+#define Gibilaro_H
+
+#include "dispersedDragModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class Gibilaro Declaration
+\*---------------------------------------------------------------------------*/
+
+class Gibilaro
+:
+ public dispersedDragModel
+{
+public:
+
+ //- Runtime type information
+ TypeName("Gibilaro");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ Gibilaro
+ (
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+ );
+
+
+ //- Destructor
+ virtual ~Gibilaro();
+
+
+ // Member Functions
+
+ //- Drag coefficient
+ virtual tmp CdRe() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace dragModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowErgunWenYu/GidaspowErgunWenYu.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowErgunWenYu/GidaspowErgunWenYu.C
new file mode 100644
index 0000000000..27ebb53f82
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowErgunWenYu/GidaspowErgunWenYu.C
@@ -0,0 +1,75 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
+ \\/ 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 "GidaspowErgunWenYu.H"
+#include "Ergun.H"
+#include "WenYu.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+ defineTypeNameAndDebug(GidaspowErgunWenYu, 0);
+ addToRunTimeSelectionTable(dragModel, GidaspowErgunWenYu, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::dragModels::GidaspowErgunWenYu::GidaspowErgunWenYu
+(
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+)
+:
+ dispersedDragModel(dict, interface, registerObject),
+ Ergun_(dict, interface, false),
+ WenYu_(dict, interface, false)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::dragModels::GidaspowErgunWenYu::~GidaspowErgunWenYu()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::dragModels::GidaspowErgunWenYu::CdRe() const
+{
+ return
+ pos0(interface_.continuous() - 0.8)*WenYu_.CdRe()
+ + neg(interface_.continuous() - 0.8)*Ergun_.CdRe();
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowErgunWenYu/GidaspowErgunWenYu.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowErgunWenYu/GidaspowErgunWenYu.H
new file mode 100644
index 0000000000..131500df01
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowErgunWenYu/GidaspowErgunWenYu.H
@@ -0,0 +1,111 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
+ \\/ 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::dragModels::GidaspowErgunWenYu
+
+Description
+ Gidaspow, Ergun, Wen and Yu drag model
+
+ Reference:
+ \verbatim
+ Gidaspow, D. (1994).
+ Multiphase flow and fluidisation: continuum and kinetic theory
+ descriptions.
+ Academic press, New York.
+ \endverbatim
+
+SourceFiles
+ GidaspowErgunWenYu.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef GidaspowErgunWenYu_H
+#define GidaspowErgunWenYu_H
+
+#include "dispersedDragModel.H"
+#include "Ergun.H"
+#include "WenYu.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class GidaspowErgunWenYu Declaration
+\*---------------------------------------------------------------------------*/
+
+class GidaspowErgunWenYu
+:
+ public dispersedDragModel
+{
+ // Private Data
+
+ //- Ergun drag model
+ Ergun Ergun_;
+
+ //- Wen Yu drag model
+ WenYu WenYu_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("GidaspowErgunWenYu");
+
+
+ // Constructors
+
+ //- Construct from a dictionary and an interface
+ GidaspowErgunWenYu
+ (
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+ );
+
+
+ //- Destructor
+ virtual ~GidaspowErgunWenYu();
+
+
+ // Member Functions
+
+ //- Drag coefficient
+ virtual tmp CdRe() const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace dragModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowSchillerNaumann/GidaspowSchillerNaumann.C b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowSchillerNaumann/GidaspowSchillerNaumann.C
new file mode 100644
index 0000000000..693e2ac641
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowSchillerNaumann/GidaspowSchillerNaumann.C
@@ -0,0 +1,86 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
+ \\/ 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 "GidaspowSchillerNaumann.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace dragModels
+{
+ defineTypeNameAndDebug(GidaspowSchillerNaumann, 0);
+ addToRunTimeSelectionTable(dragModel, GidaspowSchillerNaumann, dictionary);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::dragModels::GidaspowSchillerNaumann::GidaspowSchillerNaumann
+(
+ const dictionary& dict,
+ const phaseInterface& interface,
+ const bool registerObject
+)
+:
+ dispersedDragModel(dict, interface, registerObject),
+ residualRe_("residualRe", dimless, dict)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::dragModels::GidaspowSchillerNaumann::~GidaspowSchillerNaumann()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+Foam::tmp
+Foam::dragModels::GidaspowSchillerNaumann::CdRe() const
+{
+ const volScalarField alpha2
+ (
+ max(1 - interface_.dispersed(), interface_.continuous().residualAlpha())
+ );
+
+ const volScalarField Re(alpha2*interface_.Re());
+
+ const volScalarField CdsRe
+ (
+ neg(Re - 1000)*24*(1.0 + 0.15*pow(Re, 0.687))/alpha2
+ + pos0(Re - 1000)*0.44*max(Re, residualRe_)
+ );
+
+ return
+ CdsRe
+ *pow(alpha2, -2.65)
+ *max(interface_.continuous(), interface_.continuous().residualAlpha());
+}
+
+
+// ************************************************************************* //
diff --git a/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowSchillerNaumann/GidaspowSchillerNaumann.H b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowSchillerNaumann/GidaspowSchillerNaumann.H
new file mode 100644
index 0000000000..81c7a91a32
--- /dev/null
+++ b/applications/solvers/modules/fluid/multiphaseEuler/interfacialModels/dragModels/GidaspowSchillerNaumann/GidaspowSchillerNaumann.H
@@ -0,0 +1,111 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration | Website: https://openfoam.org
+ \\ / A nd | Copyright (C) 2011-2022 OpenFOAM Foundation
+ \\/ 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