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))
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
269 surfaceTensionModels_
272 if (
found(
"interfacePorous"))
274 generatePairsAndSubModels
278 interfacePorousModelTable_
283 generatePairsTable();
335 auto iter = phaseModels_.cbegin();
339 iter()() * iter()->hc()
342 for (++iter; iter != phaseModels_.cend(); ++iter)
344 tAlphaHc.
ref() += iter()() * iter()->hc();
379 auto iter = phaseModels_.cbegin();
383 iter()() * iter()->
rho()
386 for (++iter; iter != phaseModels_.cend(); ++iter)
388 tmpRho.
ref() += iter()() * iter()->rho();
397 auto iter = phaseModels_.cbegin();
401 iter()().boundaryField()[patchI]
402 * iter()->
rho()().boundaryField()[patchI]
405 for (++iter; iter != phaseModels_.cend(); ++iter)
409 iter()().boundaryField()[patchI]
410 * iter()->rho()().boundaryField()[patchI]
420 auto iter = phaseModels_.cbegin();
424 iter()() * iter()->
Cp()
427 for (++iter; iter != phaseModels_.cend(); ++iter)
429 tmpCp.
ref() += iter()() * iter()->Cp();
443 auto iter = phaseModels_.cbegin();
447 iter()() * iter()->
Cp(
p,
T, patchI)
450 for (++iter; iter != phaseModels_.cend(); ++iter)
452 tmpCp.
ref() += iter()() * iter()->Cp(
p,
T, patchI);
461 auto iter = phaseModels_.cbegin();
465 iter()() * iter()->
Cv()
468 for (++iter; iter != phaseModels_.cend(); ++iter)
470 tmpCv.
ref() += iter()() * iter()->Cv();
484 auto iter = phaseModels_.cbegin();
488 iter()() * iter()->
Cv(
p,
T, patchI)
491 for (++iter; iter != phaseModels_.cend(); ++iter)
493 tmpCv.
ref() += iter()() * iter()->Cv(
p,
T, patchI);
502 auto iter = phaseModels_.cbegin();
506 iter()() * iter()->
Cp()
511 iter()() * iter()->
Cv()
514 for (++iter; iter != phaseModels_.cend(); ++iter)
516 tmpCp.
ref() += iter()() * iter()->Cp();
517 tmpCv.
ref() += iter()() * iter()->Cv();
520 return (tmpCp/tmpCv);
533 gamma()().boundaryField()[patchI]
540 auto iter = phaseModels_.cbegin();
544 iter()() * iter()->Cpv()
547 for (++iter; iter != phaseModels_.cend(); ++iter)
549 tmpCpv.
ref() += iter()() * iter()->Cpv();
563 auto iter = phaseModels_.cbegin();
567 iter()() * iter()->Cpv(
p,
T, patchI)
570 for (++iter; iter != phaseModels_.cend(); ++iter)
572 tmpCpv.
ref() += iter()() * iter()->Cpv(
p,
T, patchI);
581 auto iter = phaseModels_.cbegin();
585 iter()() * iter()->CpByCpv()
588 for (++iter; iter != phaseModels_.cend(); ++iter)
590 tmpCpByCpv.
ref() += iter()() * iter()->CpByCpv();
604 auto iter = phaseModels_.cbegin();
608 iter()().boundaryField()[patchI]
609 * iter()->CpByCpv(
p,
T, patchI)
612 for (++iter; iter != phaseModels_.cend(); ++iter)
616 iter()().boundaryField()[patchI]
617 * iter()->CpByCpv(
p,
T, patchI)
634 auto iter = phaseModels_.cbegin();
638 iter()() * iter()->
kappa()
641 for (++iter; iter != phaseModels_.cend(); ++iter)
643 tmpkappa.
ref() += iter()() * iter()->kappa();
652 auto iter = phaseModels_.cbegin();
656 iter()().boundaryField()[patchI]
657 * iter()->
kappa(patchI)
660 for (++iter; iter != phaseModels_.cend(); ++iter)
664 iter()().boundaryField()[patchI]
665 * iter()->kappa(patchI)
675 phaseModelTable::const_iterator phaseModelIter = phaseModels_.begin();
679 phaseModelIter()()*phaseModelIter()->alphahe()
682 for (; phaseModelIter != phaseModels_.end(); ++phaseModelIter)
684 talphaEff.
ref() += phaseModelIter()()*phaseModelIter()->alphahe();
696 phaseModelTable::const_iterator phaseModelIter = phaseModels_.begin();
700 phaseModelIter()().boundaryField()[patchi]
701 *phaseModelIter()->alphahe(patchi)
704 for (; phaseModelIter != phaseModels_.end(); ++phaseModelIter)
707 phaseModelIter()().boundaryField()[patchi]
708 *phaseModelIter()->alphahe(patchi);
732 return kappa(patchI) + kappat;
741 auto iter = phaseModels_.cbegin();
745 iter()() * iter()->
alpha()
748 for (++iter; iter != phaseModels_.cend(); ++iter)
750 tmpAlpha.
ref() += iter()() * iter()->alpha();
753 tmpAlpha.
ref() += alphat;
765 auto iter = phaseModels_.cbegin();
769 iter()().boundaryField()[patchI]
770 * iter()->
alpha(patchI)
773 for (++iter; iter != phaseModels_.cend(); ++iter)
777 iter()().boundaryField()[patchI]
778 * iter()->alpha(patchI)
782 tmpAlpha.
ref() += alphat;
796 auto iter = phaseModels_.cbegin();
800 iter()() * iter()->
mu()
803 for (++iter; iter != phaseModels_.cend(); ++iter)
805 tmpMu.
ref() += iter()() * iter()->mu();
814 auto iter = phaseModels_.cbegin();
818 iter()().boundaryField()[patchI]
822 for (++iter; iter != phaseModels_.cend(); ++iter)
826 iter()().boundaryField()[patchI]
837 auto iter = phaseModels_.cbegin();
841 iter()() * iter()->
nu()
844 for (++iter; iter != phaseModels_.cend(); ++iter)
846 tmpNu.
ref() += iter()() * iter()->nu();
855 auto iter = phaseModels_.cbegin();
859 iter()().boundaryField()[patchI]
863 for (++iter; iter != phaseModels_.cend(); ++iter)
867 iter()().boundaryField()[patchI]
915 iter()->correctTurbulence();
935 return totalPhasePairs_;
941 return totalPhasePairs_;
949 if (!iter()->
thermo().incompressible())
961 return phaseModels_[phaseName]->thermo().incompressible();
969 if (!iter()->
thermo().isochoric())
992 "surfaceTensionForce",
993 mesh_.time().timeName(),
1000 auto& stf = tstf.ref();
1003 if (surfaceTensionModels_.size())
1011 for (++iter2; iter2 != phaseModels_.cend(); ++iter2)
1043 mesh_.time().timeName(),
1050 auto& stf = tstf.ref();
1054 stf += iter()() * iter()->U();
1064 return surfaceTensionModels_[key]->sigma();
1073 return 1.0/(phaseModels_[key]->thermo().rho());
1088 for (++iterk; iterk != phaseModels_.cend(); ++iterk)
1090 if (iteri()().
name() != iterk()().
name())
1102 if (interfacePorousModelTable_.found(keyik))
1105 interfacePorousModelTable_[keyik];
1107 Udiag += Vc*interfacePtr->
S();
1149 mesh_.time().timeName(),
1156 auto& nearInt = tnearInt.ref();
1164 for (++iter2; iter2 != phaseModels_.cend(); ++iter2)
1200 return gradAlphaf/(
mag(gradAlphaf) + deltaN);
const T & second() const noexcept
Return second element, which is also the last element.
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].
const dimensionSet dimless(0, 0, 0, 0, 0, 0, 0)
Dimensionless.
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.
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 [].
word name(const complex &c)
Return string representation of complex.
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.
#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< scalar > getOrAddToDict(const word &name, dictionary &dict, const dimensionSet &dims=dimless, const scalar &deflt=scalar(Zero))
Construct dimensioned from dictionary, with default value.
bool ordered() const
Return the ordered flag.
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....
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)
void generatePairs(const dictTable &modelDicts)
Generate pairs.
dimensionedScalar pos(const dimensionedScalar &ds)