Go to the documentation of this file.
29 #include "surfaceTensionModel.H"
34 #include "surfaceInterpolate.H"
69 for (
const word& phaseName : phaseNames)
91 auto iter = phaseModels.
cbegin();
99 for (++iter; iter != phaseModels.
cend(); ++iter)
115 if (phasePairs_.found(
key))
119 else if (
key.ordered())
129 phaseModels_[
key.first()],
130 phaseModels_[
key.second()]
145 phaseModels_[
key.first()],
146 phaseModels_[
key.second()]
161 if (phaseIter1()->
name() != phaseIter2()->
name())
165 phaseIter1()->
name(),
166 phaseIter2()->
name(),
172 phaseIter2()->
name(),
173 phaseIter1()->
name(),
179 !totalPhasePairs_.found(
key)
180 && !totalPhasePairs_.found(keyInverse)
190 phaseModels_[
key.first()],
191 phaseModels_[
key.second()]
216 mesh_.time().timeName(),
221 calculatedFvPatchScalarField::typeName
223 phaseNames_(get<wordList>(
"phases")),
229 mesh_.time().timeName(),
242 mesh_.time().timeName(),
248 phaseModels_(generatePhaseModels(phaseNames_)),
259 rhoPhi_.setOriented();
263 if (
found(
"surfaceTension"))
265 generatePairsAndSubModels
268 surfaceTensionModels_
271 if (
found(
"interfacePorous"))
273 generatePairsAndSubModels
277 interfacePorousModelTable_
282 generatePairsTable();
334 auto iter = phaseModels_.cbegin();
338 iter()() * iter()->hc()
341 for (++iter; iter != phaseModels_.cend(); ++iter)
343 tAlphaHc.
ref() += iter()() * iter()->hc();
378 auto iter = phaseModels_.cbegin();
382 iter()() * iter()->
rho()
385 for (++iter; iter != phaseModels_.cend(); ++iter)
387 tmpRho.
ref() += iter()() * iter()->rho();
396 auto iter = phaseModels_.cbegin();
400 iter()().boundaryField()[patchI]
401 * iter()->
rho()().boundaryField()[patchI]
404 for (++iter; iter != phaseModels_.cend(); ++iter)
408 iter()().boundaryField()[patchI]
409 * iter()->rho()().boundaryField()[patchI]
419 auto iter = phaseModels_.cbegin();
423 iter()() * iter()->
Cp()
426 for (++iter; iter != phaseModels_.cend(); ++iter)
428 tmpCp.
ref() += iter()() * iter()->Cp();
442 auto iter = phaseModels_.cbegin();
446 iter()() * iter()->
Cp(
p,
T, patchI)
449 for (++iter; iter != phaseModels_.cend(); ++iter)
451 tmpCp.
ref() += iter()() * iter()->Cp(
p,
T, patchI);
460 auto iter = phaseModels_.cbegin();
464 iter()() * iter()->
Cv()
467 for (++iter; iter != phaseModels_.cend(); ++iter)
469 tmpCv.
ref() += iter()() * iter()->Cv();
483 auto iter = phaseModels_.cbegin();
487 iter()() * iter()->
Cv(
p,
T, patchI)
490 for (++iter; iter != phaseModels_.cend(); ++iter)
492 tmpCv.
ref() += iter()() * iter()->Cv(
p,
T, patchI);
513 auto iter = phaseModels_.cbegin();
517 iter()() * iter()->
Cp()
522 iter()() * iter()->
Cv()
525 for (++iter; iter != phaseModels_.cend(); ++iter)
527 tmpCp.
ref() += iter()() * iter()->Cp();
528 tmpCv.
ref() += iter()() * iter()->Cv();
531 return (tmpCp/tmpCv);
544 gamma()().boundaryField()[patchI]
551 auto iter = phaseModels_.cbegin();
555 iter()() * iter()->Cpv()
558 for (++iter; iter != phaseModels_.cend(); ++iter)
560 tmpCpv.
ref() += iter()() * iter()->Cpv();
574 auto iter = phaseModels_.cbegin();
578 iter()() * iter()->Cpv(
p,
T, patchI)
581 for (++iter; iter != phaseModels_.cend(); ++iter)
583 tmpCpv.
ref() += iter()() * iter()->Cpv(
p,
T, patchI);
592 auto iter = phaseModels_.cbegin();
596 iter()() * iter()->CpByCpv()
599 for (++iter; iter != phaseModels_.cend(); ++iter)
601 tmpCpByCpv.
ref() += iter()() * iter()->CpByCpv();
615 auto iter = phaseModels_.cbegin();
619 iter()().boundaryField()[patchI]
620 * iter()->CpByCpv(
p,
T, patchI)
623 for (++iter; iter != phaseModels_.cend(); ++iter)
627 iter()().boundaryField()[patchI]
628 * iter()->CpByCpv(
p,
T, patchI)
645 auto iter = phaseModels_.cbegin();
649 iter()() * iter()->
kappa()
652 for (++iter; iter != phaseModels_.cend(); ++iter)
654 tmpkappa.
ref() += iter()() * iter()->kappa();
663 auto iter = phaseModels_.cbegin();
667 iter()().boundaryField()[patchI]
668 * iter()->
kappa(patchI)
671 for (++iter; iter != phaseModels_.cend(); ++iter)
675 iter()().boundaryField()[patchI]
676 * iter()->kappa(patchI)
686 phaseModelTable::const_iterator phaseModelIter = phaseModels_.begin();
690 phaseModelIter()()*phaseModelIter()->alphahe()
693 for (; phaseModelIter != phaseModels_.end(); ++phaseModelIter)
695 talphaEff.
ref() += phaseModelIter()()*phaseModelIter()->alphahe();
707 phaseModelTable::const_iterator phaseModelIter = phaseModels_.begin();
711 phaseModelIter()().boundaryField()[patchi]
712 *phaseModelIter()->alphahe(patchi)
715 for (; phaseModelIter != phaseModels_.end(); ++phaseModelIter)
718 phaseModelIter()().boundaryField()[patchi]
719 *phaseModelIter()->alphahe(patchi);
743 return kappa(patchI) + kappat;
752 auto iter = phaseModels_.cbegin();
756 iter()() * iter()->
alpha()
759 for (++iter; iter != phaseModels_.cend(); ++iter)
761 tmpAlpha.
ref() += iter()() * iter()->alpha();
764 tmpAlpha.
ref() += alphat;
776 auto iter = phaseModels_.cbegin();
780 iter()().boundaryField()[patchI]
781 * iter()->
alpha(patchI)
784 for (++iter; iter != phaseModels_.cend(); ++iter)
788 iter()().boundaryField()[patchI]
789 * iter()->alpha(patchI)
793 tmpAlpha.
ref() += alphat;
807 auto iter = phaseModels_.cbegin();
811 iter()() * iter()->
mu()
814 for (++iter; iter != phaseModels_.cend(); ++iter)
816 tmpMu.
ref() += iter()() * iter()->mu();
825 auto iter = phaseModels_.cbegin();
829 iter()().boundaryField()[patchI]
833 for (++iter; iter != phaseModels_.cend(); ++iter)
837 iter()().boundaryField()[patchI]
848 auto iter = phaseModels_.cbegin();
852 iter()() * iter()->
nu()
855 for (++iter; iter != phaseModels_.cend(); ++iter)
857 tmpNu.
ref() += iter()() * iter()->nu();
866 auto iter = phaseModels_.cbegin();
870 iter()().boundaryField()[patchI]
874 for (++iter; iter != phaseModels_.cend(); ++iter)
878 iter()().boundaryField()[patchI]
926 iter()->correctTurbulence();
946 return totalPhasePairs_;
952 return totalPhasePairs_;
960 if (!iter()->
thermo().incompressible())
972 return phaseModels_[phaseName]->thermo().incompressible();
980 if (!iter()->
thermo().isochoric())
1003 "surfaceTensionForce",
1004 mesh_.time().timeName(),
1011 auto& stf = tstf.ref();
1014 if (surfaceTensionModels_.size())
1022 for (++iter2; iter2 != phaseModels_.cend(); ++iter2)
1054 mesh_.time().timeName(),
1061 auto& stf = tstf.ref();
1065 stf += iter()() * iter()->U();
1075 return surfaceTensionModels_[
key]->sigma();
1084 return 1.0/(phaseModels_[
key]->thermo().rho());
1099 for (++iterk; iterk != phaseModels_.cend(); ++iterk)
1101 if (iteri()().
name() != iterk()().
name())
1113 if (interfacePorousModelTable_.found(keyik))
1116 interfacePorousModelTable_[keyik];
1118 Udiag += Vc*interfacePtr->
S();
1160 mesh_.time().timeName(),
1167 auto& nearInt = tnearInt.ref();
1175 for (++iter2; iter2 != phaseModels_.cend(); ++iter2)
1211 return gradAlphaf/(
mag(gradAlphaf) + deltaN);
const phasePairTable & totalPhasePairs() const
Constant access the total phase pairs.
tmp< surfaceScalarField > surfaceTensionForce() const
Calculate surface tension of the mixture.
Single incompressible phase derived from the phase-fraction. Used as part of the multiPhaseMixture fo...
virtual tmp< volScalarField > Cpv() const
Heat capacity at constant pressure/volume [J/kg/K].
tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > snGrad(const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
virtual tmp< volScalarField > Cv() const
Return Cv of the mixture.
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Description for mass transfer between a pair of phases. The direction of the mass transfer is from th...
virtual tmp< volScalarField > alphahe() const
Thermal diffusivity for energy of mixture [kg/m/s].
tmp< GeometricField< typename outerProduct< vector, Type >::type, fvPatchField, volMesh >> grad(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
virtual tmp< volScalarField > nu() const
Kinematic viscosity of mixture [m^2/s].
A class for handling words, derived from Foam::string.
const dimensionedScalar mu
Atomic mass unit.
A class for managing temporary objects.
static constexpr const zero Zero
Global zero (0)
const dimensionSet dimVelocity
tmp< volScalarField > nearInterface() const
Near Interface of alpha'n.
const dimensionSet dimDensity
const volScalarField & alpha2
const_iterator cbegin() const
const_iterator set to the beginning of the HashTable
const dimensionedScalar alpha
Fine-structure constant: default SI units: [].
tmp< surfaceScalarField > nHatf(const volScalarField &alpha1, const volScalarField &alpha2) const
Interface normal volume vector.
const dimensionedScalar & Prt() const
Return Prandt number.
psiReactionThermo & thermo
Calculate the snGrad of the given volField.
phaseSystem(const fvMesh &mesh)
Construct from fvMesh.
const volScalarField & Cv
virtual bool read()
Read object.
auto key(const Type &t) -> typename std::enable_if< std::is_enum< Type >::value, typename std::underlying_type< Type >::type >::type
Calculate the divergence of the given field.
bool insert(const Key &key, const T &obj)
Copy insert a new entry, not overwriting existing entries.
virtual tmp< scalarField > THE(const scalarField &h, const scalarField &p, const scalarField &T0, const labelList &cells) const
Temperature from enthalpy/internal energy for cell-set.
tmp< GeometricField< Type, fvPatchField, volMesh > > div(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
constexpr const_iterator cend() const noexcept
const_iterator to signal the end (for any HashTable)
const surfaceScalarField & phi() const
Constant access to the total flux.
Abstract base-class for fluid and solid thermodynamic properties.
tmp< volVectorField > U() const
Mixture U.
virtual tmp< volScalarField > mu() const
Dynamic viscosity of mixture [kg/m/s].
void generatePairsTable()
Generate pair table.
const volScalarField & alpha1
virtual ~phaseSystem()
Destructor.
volScalarField mu_
Dynamic viscocity.
const dimensionedScalar kappa
Coulomb constant: default SI units: [N.m2/C2].
virtual tmp< volScalarField > gamma() const
Gamma = Cp/Cv [].
virtual volScalarField & he()
Return access to the internal energy field [J/Kg].
tmp< surfaceVectorField > nHatfv(const volScalarField &alpha1, const volScalarField &alpha2) const
Interface normal surface vector.
dimensioned< vector > dimensionedVector
Dimensioned vector obtained from generic dimensioned type.
CGAL::Exact_predicates_exact_constructions_kernel K
tmp< volScalarField > K(const volScalarField &alpha1, const volScalarField &alpha2) const
Interface curvature.
#define NotImplemented
Issue a FatalErrorIn for a function not currently implemented.
const dimensionSet dimTime(0, 0, 1, 0, 0, 0, 0)
virtual tmp< volScalarField > alphaEff(const volScalarField &alphat) const
Effective thermal diffusivity of mixture [kg/m/s].
virtual tmp< volScalarField > CpByCpv() const
Heat capacity ratio [].
virtual tmp< volScalarField > S() const =0
Momentum source.
virtual tmp< volScalarField > kappaEff(const volScalarField &kappat) const
Effective thermal diffusivity for temperature.
void T(FieldField< Field, Type > &f1, const FieldField< Field, Type > &f2)
virtual void correct()
Correct the mixture thermos.
dimensioned< scalar > dimensionedScalar
Dimensioned scalar obtained from generic dimensioned type.
An ordered or unorder pair of phase names. Typically specified as follows.
#define forAllIters(container, iter)
Iterate across all elements in the container object.
const dimensionSet dimViscosity
virtual tmp< volScalarField > Cp() const
Return Cp of the mixture.
virtual tmp< volScalarField > W() const
Molecular weight [kg/kmol] of the mixture.
virtual tmp< volScalarField > hc() const
Chemical enthalpy of the mixture [J/kg].
Mesh data needed to do the Finite Volume discretisation.
const dimensionSet dimMass(1, 0, 0, 0, 0, 0, 0)
virtual tmp< volScalarField > kappa() const
Thermal diffusivity for temperature of mixture [J/m/s/K].
static tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > interpolate(const GeometricField< Type, fvPatchField, volMesh > &tvf, const surfaceScalarField &faceFlux, Istream &schemeData)
Interpolate field onto faces using scheme given by Istream.
static dimensioned< Type > getOrAddToDict(const word &name, dictionary &dict, const dimensionSet &dims=dimless, const Type &deflt=Type(Zero))
Construct dimensioned from dictionary, with default value.
void calcMu()
Calculate and return the laminar viscosity.
const fvMesh & mesh() const
Return mesh.
const word & name() const
virtual void correctTurbulence()
Correct the turbulence.
virtual tmp< volScalarField > surfaceTensionCoeff(const phasePairKey &key) const
Return the surface tension coefficient.
forAllConstIters(mixture.phases(), phase)
static const word phasePropertiesName
Default name of the phase properties dictionary.
virtual bool isochoric() const
Return true if the equation of state is isochoric for all phasses.
HashTable< autoPtr< phaseModel > > generatePhaseModels(const wordList &names) const
Generate the phases.
Calculate the gradient of the given field.
dimensioned< typename typeOfMag< Type >::type > mag(const dimensioned< Type > &dt)
const surfaceScalarField & rhoPhi() const
Constant access to the mixture mass flux.
const dimensionedScalar e
Elementary charge.
static tmp< T > New(Args &&... args)
Construct tmp of T with forwarding arguments.
const volScalarField & Cp
static const word null
An empty word.
void addInterfacePorosity(fvVectorMatrix &UEqn)
Add interface porosity on phasePair.
A special matrix type and solver, designed for finite volume solutions of scalar equations....
virtual tmp< scalarField > rhoEoS(const scalarField &p, const scalarField &T, const labelList &cells) const
Density from pressure and temperature.
word name(const expressions::valueTypeCode typeCode)
A word representation of a valueTypeCode. Empty for INVALID.
tmp< surfaceScalarField > generatePhi(const HashTable< autoPtr< phaseModel >> &phaseModels) const
Generate the mixture flux.
const phaseModelTable & phases() const
Constant access the phases.
dimensionedScalar cbrt(const dimensionedScalar &ds)
const dimensionSet dimVolume(pow3(dimLength))
virtual tmp< volScalarField > rho() const
Return the mixture density.
defineTypeNameAndDebug(combustionModel, 0)
virtual bool incompressible() const
Return true if the equation of state is incompressible for all.
virtual bool read()
Read base phaseProperties dictionary.
virtual tmp< volScalarField > coeffs(const word &key) const
Return coefficients (1/rho)
static autoPtr< phaseModel > New(const phaseSystem &fluid, const word &phaseName)
dimensioned< Type > average(const DimensionedField< Type, GeoMesh > &df)
const dimensionSet dimless
Dimensionless.
void generatePairs(const dictTable &modelDicts)
Generate pairs.
dimensionedScalar pos(const dimensionedScalar &ds)