pEqn.H
Go to the documentation of this file.
2 surfaceScalarField alphaf2("alphaf2", scalar(1) - alphaf1);
3 
5 (
6  "alphaRhof10",
8  (
9  max(alpha1.oldTime(), phase1.residualAlpha())
10  *rho1.oldTime()
11  )
12 );
13 
15 (
16  "alphaRhof20",
18  (
19  max(alpha2.oldTime(), phase2.residualAlpha())
20  *rho2.oldTime()
21  )
22 );
23 
24 // Drag coefficient
25 const surfaceScalarField Kdf("Kdf", fluid.Kdf());
26 
27 // Diagonal coefficients
28 PtrList<surfaceScalarField> AFfs(fluid.AFfs());
29 
30 PtrList<surfaceScalarField> rAUfs;
31 rAUfs.append
32 (
34  (
35  IOobject::groupName("rAUf", phase1.name()),
36  1.0
37  /(
39  + fvc::interpolate(U1Eqn.A())
40  + AFfs[0]
41  )
42  )
43 );
44 rAUfs.append
45 (
47  (
48  IOobject::groupName("rAUf", phase2.name()),
49  1.0
50  /(
52  + fvc::interpolate(U2Eqn.A())
53  + AFfs[0]
54  )
55  )
56 );
57 const surfaceScalarField& rAUf1 = rAUfs[0];
58 const surfaceScalarField& rAUf2 = rAUfs[1];
59 
60 AFfs.clear();
61 
62 // Explicit force fluxes
63 PtrList<surfaceScalarField> phiFfs(fluid.phiFfs(rAUfs));
64 const surfaceScalarField& phiFf1 = phiFfs[0];
65 const surfaceScalarField& phiFf2 = phiFfs[1];
66 
67 while (pimple.correct())
68 {
69  volScalarField rho("rho", fluid.rho());
70 
71  // Correct p_rgh for consistency with p and the updated densities
72  p_rgh = p - rho*gh;
73 
76 
77  // Correct fixed-flux BCs to be consistent with the velocity BCs
78  MRF.correctBoundaryFlux(U1, phi1);
79  MRF.correctBoundaryFlux(U2, phi2);
80 
82  (
83  IOobject::groupName("alpharAUf", phase1.name()),
84  max(alphaf1, phase1.residualAlpha())*rAUf1
85  );
86 
88  (
89  IOobject::groupName("alpharAUf", phase2.name()),
90  max(alphaf2, phase2.residualAlpha())*rAUf2
91  );
92 
93  // Combined buoyancy and force fluxes
95  (
96  "ghSnGradRho",
97  ghf*fvc::snGrad(rho)*mesh.magSf()
98  );
99 
100  const surfaceScalarField phigF1
101  (
102  alpharAUf1
103  *(
105  - alphaf2*(rhof1 - rhof2)*(g & mesh.Sf())
106  )
107  + phiFf1
108  );
109 
110  const surfaceScalarField phigF2
111  (
112  alpharAUf2
113  *(
115  - alphaf1*(rhof2 - rhof1)*(g & mesh.Sf())
116  )
117  + phiFf2
118  );
119 
120  // Predicted fluxes
121  surfaceScalarField phiHbyA1
122  (
123  IOobject::groupName("phiHbyA", phase1.name()),
124  phi1
125  );
126 
127  phiHbyA1 =
128  rAUf1
129  *(
130  alphaRhof10*byDt(MRF.absolute(phi1.oldTime()))
131  + fvc::flux(U1Eqn.H())
132  )
133  - phigF1;
134 
135  surfaceScalarField phiHbyA2
136  (
137  IOobject::groupName("phiHbyA", phase2.name()),
138  phi2
139  );
140 
141  phiHbyA2 =
142  rAUf2
143  *(
144  alphaRhof20*byDt(MRF.absolute(phi2.oldTime()))
145  + fvc::flux(U2Eqn.H())
146  )
147  - phigF2;
148 
149  // Drag fluxes
150  PtrList<surfaceScalarField> phiKdPhifs(fluid.phiKdPhifs(rAUfs));
151  const surfaceScalarField& phiKdPhif1 = phiKdPhifs[0];
152  const surfaceScalarField& phiKdPhif2 = phiKdPhifs[1];
153 
154  // Total predicted flux
156  (
157  "phiHbyA",
158  alphaf1*(phiHbyA1 - phiKdPhif1) + alphaf2*(phiHbyA2 - phiKdPhif2)
159  );
160 
161  MRF.makeRelative(phiHbyA);
162 
163  phiKdPhifs.clear();
164 
165  // Construct pressure "diffusivity"
167  (
168  "rAUf",
169  mag(alphaf1*alpharAUf1 + alphaf2*alpharAUf2)
170  );
171 
172  // Update the fixedFluxPressure BCs to ensure flux consistency
174  (
175  p_rgh.boundaryFieldRef(),
176  (
177  phiHbyA.boundaryField()
178  - (
179  alphaf1.boundaryField()*phi1.boundaryField()
180  + alphaf2.boundaryField()*phi2.boundaryField()
181  )
182  )/(mesh.magSf().boundaryField()*rAUf.boundaryField())
183  );
184 
185  // Construct the compressibility parts of the pressure equation
186  tmp<fvScalarMatrix> pEqnComp1, pEqnComp2;
187  if (phase1.compressible())
188  {
189  if (pimple.transonic())
190  {
191  surfaceScalarField phid1
192  (
193  IOobject::groupName("phid", phase1.name()),
195  );
196 
197  pEqnComp1 =
198  (
199  fvc::ddt(alpha1, rho1) + fvc::div(phase1.alphaRhoPhi())
201  )/rho1
202  + correction
203  (
204  (alpha1/rho1)*
205  (
206  psi1*fvm::ddt(p_rgh)
207  + fvm::div(phid1, p_rgh) - fvm::Sp(fvc::div(phid1), p_rgh)
208  )
209  );
210 
211  pEqnComp1.ref().relax();
212  }
213  else
214  {
215  pEqnComp1 =
216  (
217  fvc::ddt(alpha1, rho1) + fvc::div(phase1.alphaRhoPhi())
219  )/rho1
220  + (alpha1*psi1/rho1)*correction(fvm::ddt(p_rgh));
221  }
222  }
223  if (phase2.compressible())
224  {
225  if (pimple.transonic())
226  {
227  surfaceScalarField phid2
228  (
229  IOobject::groupName("phid", phase2.name()),
231  );
232 
233  pEqnComp2 =
234  (
235  fvc::ddt(alpha2, rho2) + fvc::div(phase2.alphaRhoPhi())
237  )/rho2
238  + correction
239  (
240  (alpha2/rho2)*
241  (
242  psi2*fvm::ddt(p_rgh)
243  + fvm::div(phid2, p_rgh) - fvm::Sp(fvc::div(phid2), p_rgh)
244  )
245  );
246 
247  pEqnComp2.ref().relax();
248  }
249  else
250  {
251  pEqnComp2 =
252  (
253  fvc::ddt(alpha2, rho2) + fvc::div(phase2.alphaRhoPhi())
255  )/rho2
256  + (alpha2*psi2/rho2)*correction(fvm::ddt(p_rgh));
257  }
258  }
259 
260  // Add option sources
261  {
262  if (fvOptions.appliesToField(rho1.name()))
263  {
264  tmp<fvScalarMatrix> optEqn1 = fvOptions(alpha1, rho1);
265  if (pEqnComp1.valid())
266  {
267  pEqnComp1.ref() -= (optEqn1 & rho1)/rho1;
268  }
269  else
270  {
271  pEqnComp1 = fvm::Su(- (optEqn1 & rho1)/rho1, p_rgh);
272  }
273  }
274  if (fvOptions.appliesToField(rho2.name()))
275  {
276  tmp<fvScalarMatrix> optEqn2 = fvOptions(alpha2, rho2);
277  if (pEqnComp2.valid())
278  {
279  pEqnComp2.ref() -= (optEqn2 & rho2)/rho2;
280  }
281  else
282  {
283  pEqnComp2 = fvm::Su(- (optEqn2 & rho2)/rho2, p_rgh);
284  }
285  }
286  }
287 
288  // Add mass transfer
289  {
290  PtrList<volScalarField> dmdts(fluid.dmdts());
291  if (dmdts.set(0))
292  {
293  if (pEqnComp1.valid())
294  {
295  pEqnComp1.ref() -= dmdts[0]/rho1;
296  }
297  else
298  {
299  pEqnComp1 = fvm::Su(- dmdts[0]/rho1, p_rgh);
300  }
301  }
302  if (dmdts.set(1))
303  {
304  if (pEqnComp2.valid())
305  {
306  pEqnComp2.ref() -= dmdts[1]/rho2;
307  }
308  else
309  {
310  pEqnComp2 = fvm::Su(- dmdts[1]/rho2, p_rgh);
311  }
312  }
313  }
314 
315  // Cache p prior to solve for density update
316  volScalarField p_rgh_0("p_rgh_0", p_rgh);
317 
318  while (pimple.correctNonOrthogonal())
319  {
320  fvScalarMatrix pEqnIncomp
321  (
322  fvc::div(phiHbyA)
323  - fvm::laplacian(rAUf, p_rgh)
324  );
325 
326  {
327  fvScalarMatrix pEqn(pEqnIncomp);
328 
329  if (pEqnComp1.valid())
330  {
331  pEqn += pEqnComp1();
332  }
333 
334  if (pEqnComp2.valid())
335  {
336  pEqn += pEqnComp2();
337  }
338 
339  solve
340  (
341  pEqn,
342  mesh.solver(p_rgh.select(pimple.finalInnerIter()))
343  );
344  }
345 
346  if (pimple.finalNonOrthogonalIter())
347  {
348  surfaceScalarField mSfGradp("mSfGradp", pEqnIncomp.flux()/rAUf);
349 
350  phi = phiHbyA + pEqnIncomp.flux();
351 
352  const surfaceScalarField phi1s
353  (
354  phiHbyA1 + alpharAUf1*mSfGradp
355  );
356 
357  const surfaceScalarField phi2s
358  (
359  phiHbyA2 + alpharAUf2*mSfGradp
360  );
361 
363  (
364  ((phi2s + rAUf2*Kdf*phi1s) - (phi1s + rAUf1*Kdf*phi2s))
365  /(1 - rAUf1*rAUf2*sqr(Kdf))
366  );
367 
368  phi1 = phi - alphaf2*phir;
369  phi2 = phi + alphaf1*phir;
370 
371  U1 = fvc::reconstruct(MRF.absolute(phi1));
372  U1.correctBoundaryConditions();
373  fvOptions.correct(U1);
374 
375  U2 = fvc::reconstruct(MRF.absolute(phi2));
376  U2.correctBoundaryConditions();
377  fvOptions.correct(U2);
378 
379  // Set the phase dilatation rates
380  if (pEqnComp1.valid())
381  {
382  phase1.divU(-pEqnComp1 & p_rgh);
383  }
384  if (pEqnComp2.valid())
385  {
386  phase2.divU(-pEqnComp2 & p_rgh);
387  }
388  }
389  }
390 
391  // Update and limit the static pressure
392  p = max(p_rgh + rho*gh, pMin);
393 
394  // Limit p_rgh
395  p_rgh = p - rho*gh;
396 
397  // Update densities from change in p_rgh
398  rho1 += psi1*(p_rgh - p_rgh_0);
399  rho2 += psi2*(p_rgh - p_rgh_0);
400 
401  // Correct p_rgh for consistency with p and the updated densities
402  rho = fluid.rho();
403  p_rgh = p - rho*gh;
404  p_rgh.correctBoundaryConditions();
405 }
tmp< fvMatrix< Type > > correction(const fvMatrix< Type > &)
Return the correction form of the given matrix.
psi2
Definition: TEqns.H:35
fvMatrix< scalar > fvScalarMatrix
Definition: fvMatricesFwd.H:42
const surfaceScalarField & alphaPhi2
fv::options & fvOptions
rho
Definition: pEqn.H:1
pimpleNoLoopControl & pimple
zeroField Su
Definition: alphaSuSp.H:1
surfaceScalarField & phi2
multiphaseSystem & fluid
Definition: createFields.H:11
p
Definition: pEqn.H:50
const surfaceScalarField alpharAUf2(fvc::interpolate(max(alpha2, phase2.residualAlpha()) *rAU2))
IOMRFZoneList & MRF
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
phiHbyA
Definition: pEqn.H:20
dimensionedSymmTensor sqr(const dimensionedVector &dv)
tmp< GeometricField< Type, fvPatchField, volMesh > > div(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
Definition: fvcDiv.C:47
const surfaceScalarField & alphaPhi1
surfaceScalarField & phi1
PtrList< surfaceScalarField > AFfs(fluid.AFfs())
tmp< GeometricField< Type, fvPatchField, volMesh > > laplacian(const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
Definition: fvcLaplacian.C:45
const surfaceScalarField alphaf2("alphaf2", scalar(1) - alphaf1)
tmp< GeometricField< Type, fvPatchField, volMesh > > ddt(const dimensioned< Type > dt, const fvMesh &mesh)
Definition: fvcDdt.C:45
GeometricField< scalar, fvPatchField, volMesh > volScalarField
Definition: volFieldsFwd.H:52
dynamicFvMesh & mesh
surfaceScalarField phir(fvc::flux(UdmModel.Udm()))
const volScalarField & alpha1
rhoEqn solve()
volVectorField & U1
surfaceScalarField alphaRhof10("alphaRhof10", fvc::interpolate(max(alpha1.oldTime(), phase1.residualAlpha()) *rho1.oldTime()))
PtrList< surfaceScalarField > rAUfs
Definition: pEqn.H:30
alpha2
Definition: alphaEqn.H:115
phaseModel & phase1
p_rgh
Definition: pEqn.H:152
const surfaceScalarField & ghf
dimensionedScalar pMin("pMin", dimPressure, fluid)
tmp< volScalarField > byDt(const volScalarField &vf)
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.
surfaceScalarField alphaRhof20("alphaRhof20", fvc::interpolate(max(alpha2.oldTime(), phase2.residualAlpha()) *rho2.oldTime()))
surfaceScalarField rAUf("rAUf", fvc::interpolate(rAU))
tmp< GeometricField< typename outerProduct< vector, Type >::type, fvPatchField, volMesh >> reconstruct(const GeometricField< Type, fvsPatchField, surfaceMesh > &ssf)
psi1
Definition: TEqns.H:34
surfaceScalarField ghSnGradRho(ghf *fvc::snGrad(rho) *mesh.magSf())
setSnGrad< fixedFluxPressureFvPatchScalarField >(p_rgh.boundaryFieldRef(),(phiHbyA.boundaryField() - MRF.relative(phib))/(mesh.magSf().boundaryField() *rAUf.boundaryField()))
volVectorField & U2
volScalarField p_rgh_0(p_rgh)
const surfaceScalarField Kdf("Kdf", fluid.Kdf())
const volScalarField & gh
dimensioned< scalar > mag(const dimensioned< Type > &)
const dimensionedScalar & rho2
Definition: createFields.H:40
phi
Definition: pEqn.H:18
phaseModel & phase2
tmp< surfaceScalarField > flux(const volVectorField &vvf)
Return the face-flux field obtained from the given volVectorField.
Definition: fvcFlux.C:32
const surfaceScalarField & phiFf2
Definition: pEqn.H:65
const surfaceScalarField & phiFf1
Definition: pEqn.H:64
GeometricField< scalar, fvsPatchField, surfaceMesh > surfaceScalarField
const dimensionedVector & g
const dimensionedScalar & rho1
Definition: createFields.H:39
PtrList< surfaceScalarField > phiFfs(fluid.phiFfs(rAUfs))
const surfaceScalarField alphaf1("alphaf1", fvc::interpolate(alpha1))
const surfaceScalarField alpharAUf1(fvc::interpolate(max(alpha1, phase1.residualAlpha()) *rAU1))
tmp< GeometricField< Type, fvsPatchField, surfaceMesh > > snGrad(const GeometricField< Type, fvPatchField, volMesh > &vf, const word &name)
Definition: fvcSnGrad.C:45
zeroField Sp
Definition: alphaSuSp.H:2