26 #include "multiphaseSystem.H"
27 #include "alphaContactAngleFvPatchScalarField.H"
64 PtrList<surfaceScalarField> alphaPhiCorrs(phases_.size());
67 forAllIter(PtrDictionary<phaseModel>, phases_, iter)
69 phaseModel&
phase1 = iter();
80 "phi" +
alpha1.name() +
"Corr",
85 "div(phi," +
alpha1.name() +
')'
92 forAllIter(PtrDictionary<phaseModel>, phases_, iter2)
94 phaseModel&
phase2 = iter2();
101 scalarCoeffSymmTable::const_iterator cAlpha
106 if (cAlpha != cAlphas_.end())
133 alphaPhiCorr.boundaryField()[
patchi];
135 if (!alphaPhiCorrp.coupled())
140 forAll(alphaPhiCorrp, facei)
142 if (phi1p[facei] < 0)
144 alphaPhiCorrp[facei] = alpha1p[facei]*phi1p[facei];
152 1.0/mesh_.time().deltaT().value(),
174 mesh_.time().timeName(),
183 forAllIter(PtrDictionary<phaseModel>, phases_, iter)
185 phaseModel&
phase1 = iter();
202 <<
phase1.weightedAverage(mesh_.V()).value()
212 Info<<
"Phase-sum volume fraction, min, max = "
213 << sumAlpha.weightedAverage(mesh_.V()).value()
244 return gradAlphaf/(
mag(gradAlphaf) + deltaN_);
269 surfaceVectorField::GeometricBoundaryField& nHatb
272 const volScalarField::GeometricBoundaryField& gbf
275 const fvBoundaryMesh&
boundary = mesh_.boundary();
279 if (isA<alphaContactAngleFvPatchScalarField>(gbf[
patchi]))
281 const alphaContactAngleFvPatchScalarField& acap =
282 refCast<const alphaContactAngleFvPatchScalarField>(gbf[
patchi]);
288 mesh_.Sf().boundaryField()[
patchi]
289 /mesh_.magSf().boundaryField()[
patchi]
292 alphaContactAngleFvPatchScalarField::thetaPropsTable::
296 if (
tp == acap.thetaProps().end())
299 <<
"Cannot find interface " << interfacePair(
phase1,
phase2)
300 <<
"\n in table of theta properties for patch "
301 << acap.patch().name()
307 scalar theta0 = convertToRad*
tp().theta0(matched);
310 scalar uTheta =
tp().uTheta();
315 scalar thetaA = convertToRad*
tp().thetaA(matched);
316 scalar thetaR = convertToRad*
tp().thetaR(matched);
324 Uwall -= (AfHatPatch & Uwall)*AfHatPatch;
329 nHatPatch - (AfHatPatch & nHatPatch)*AfHatPatch
333 nWall /= (
mag(nWall) + SMALL);
339 theta += (thetaA - thetaR)*
tanh(uwall/uTheta);
353 b2[facei] =
cos(
acos(a12[facei]) - theta[facei]);
361 nHatPatch = a*AfHatPatch +
b*nHatPatch;
363 nHatPatch /= (
mag(nHatPatch) + deltaN_.
value());
375 tmp<surfaceVectorField> tnHatfv = nHatfv(
phase1,
phase2);
380 return -
fvc::div(tnHatfv & mesh_.Sf());
396 "transportProperties",
399 IOobject::MUST_READ_IF_MODIFIED,
404 phases_(
lookup(
"phases"), phaseModel::iNew(
U.
mesh())),
421 zeroGradientFvPatchScalarField::typeName
424 sigmas_(
lookup(
"sigmas")),
425 dimSigma_(1, 0, -2, 0, 0),
426 cAlphas_(
lookup(
"interfaceCompression")),
427 Cvms_(
lookup(
"virtualMass")),
437 interfaceDictTable dragModelsDict(
lookup(
"drag"));
447 *phases_.lookup(iter.key().first()),
448 *phases_.lookup(iter.key().second())
455 const phaseModel&
phase1 = iter1();
459 const phaseModel&
phase2 = iter2();
463 scalarCoeffSymmTable::const_iterator
sigma
468 if (
sigma != sigmas_.end())
470 scalarCoeffSymmTable::const_iterator cAlpha
475 if (cAlpha == cAlphas_.end())
478 <<
"Compression coefficient not specified for "
481 <<
") for which a surface tension "
482 "coefficient is specified"
496 PtrDictionary<phaseModel>::const_iterator iter = phases_.begin();
498 tmp<volScalarField>
trho = iter()*iter().rho();
500 for (++iter; iter != phases_.end(); ++iter)
502 trho() += iter()*iter().rho();
512 PtrDictionary<phaseModel>::const_iterator iter = phases_.begin();
514 tmp<scalarField>
trho = iter().boundaryField()[
patchi]*iter().rho().value();
516 for (++iter; iter != phases_.end(); ++iter)
518 trho() += iter().boundaryField()[
patchi]*iter().rho().value();
527 PtrDictionary<phaseModel>::const_iterator iter = phases_.begin();
529 tmp<volScalarField> tmu = iter()*(iter().rho()*iter().nu());
531 for (++iter; iter != phases_.end(); ++iter)
533 tmu() += iter()*(iter().rho()*iter().nu());
543 PtrDictionary<phaseModel>::const_iterator iter = phases_.begin();
545 tmp<scalarField> tmu =
546 iter().boundaryField()[
patchi]
547 *(iter().rho().value()*iter().nu().value());
549 for (++iter; iter != phases_.end(); ++iter)
552 iter().boundaryField()[
patchi]
553 *(iter().rho().value()*iter().nu().value());
562 const phaseModel& phase
565 tmp<volScalarField> tCvm
572 mesh_.time().timeName(),
579 dimensionSet(1, -3, 0, 0, 0),
587 const phaseModel&
phase2 = iter();
591 scalarCoeffTable::const_iterator Cvm
593 Cvms_.find(interfacePair(phase,
phase2))
596 if (Cvm != Cvms_.end())
602 Cvm = Cvms_.find(interfacePair(
phase2, phase));
604 if (Cvm != Cvms_.end())
606 tCvm() += Cvm()*phase.rho()*
phase2;
618 const phaseModel& phase
621 tmp<volVectorField> tSvm
628 mesh_.time().timeName(),
635 dimensionSet(1, -2, -2, 0, 0),
643 const phaseModel&
phase2 = iter();
647 scalarCoeffTable::const_iterator Cvm
649 Cvms_.find(interfacePair(phase,
phase2))
652 if (Cvm != Cvms_.end())
658 Cvm = Cvms_.find(interfacePair(
phase2, phase));
660 if (Cvm != Cvms_.end())
673 isA<fixedValueFvsPatchScalarField>
675 phase.phi().boundaryField()[
patchi]
690 autoPtr<dragCoeffFields> dragCoeffsPtr(
new dragCoeffFields);
694 const dragModel& dm = *iter();
702 dm.phase1()*dm.phase2(),
703 dm.residualPhaseFraction()
709 mag(dm.phase1().U() - dm.phase2().U()),
720 isA<fixedValueFvsPatchScalarField>
722 dm.phase1().phi().boundaryField()[
patchi]
726 Kptr->boundaryField()[
patchi] = 0.0;
730 dragCoeffsPtr().insert(iter.key(), Kptr);
733 return dragCoeffsPtr;
739 const phaseModel& phase,
743 tmp<volScalarField> tdragCoeff
750 mesh_.time().timeName(),
757 dimensionSet(1, -3, -1, 0, 0),
763 dragModelTable::const_iterator dmIter = dragModels_.begin();
764 dragCoeffFields::const_iterator dcIter =
dragCoeffs.begin();
768 dmIter != dragModels_.end() && dcIter !=
dragCoeffs.end();
774 &phase == &dmIter()->
phase1()
775 || &phase == &dmIter()->
phase2()
778 tdragCoeff() += *dcIter();
791 tmp<surfaceScalarField> tSurfaceTension
798 mesh_.time().timeName(),
805 dimensionSet(1, -2, -2, 0, 0),
813 const phaseModel&
phase2 = iter();
817 scalarCoeffSymmTable::const_iterator
sigma
822 if (
sigma != sigmas_.end())
835 return tSurfaceTension;
842 tmp<volScalarField> tnearInt
849 mesh_.time().timeName(),
859 tnearInt() =
max(tnearInt(),
pos(iter() - 0.01)*
pos(0.99 - iter()));
868 forAllIter(PtrDictionary<phaseModel>, phases_, iter)
873 const Time& runTime = mesh_.time();
882 PtrList<volScalarField> alpha0s(phases_.size());
883 PtrList<surfaceScalarField> alphaPhiSums(phases_.size());
886 forAllIter(PtrDictionary<phaseModel>, phases_, iter)
888 phaseModel& phase = iter();
918 subCycleTime alphaSubCycle
920 const_cast<Time&
>(runTime),
923 !(++alphaSubCycle).end();
929 forAllIter(PtrDictionary<phaseModel>, phases_, iter)
937 forAllIter(PtrDictionary<phaseModel>, phases_, iter)
939 phaseModel& phase = iter();
942 phase.alphaPhi() = alphaPhiSums[
phasei];
946 alpha.timeIndex() = runTime.timeIndex();
950 alpha.oldTime().timeIndex() = runTime.timeIndex();
968 PtrList<entry> phaseData(
lookup(
"phases"));
971 forAllIter(PtrDictionary<phaseModel>, phases_, iter)
973 readOK &= iter().read(phaseData[
phasei++].
dict());
976 lookup(
"sigmas") >> sigmas_;
977 lookup(
"interfaceCompression") >> cAlphas_;
978 lookup(
"virtualMass") >> Cvms_;