60 Cw1(Cb1 / sqr(kappa) + (1.0 + Cb2) / sigmaNut),
79 surfaceScalarField&
phi1,
84 surfaceScalarField&
phi2,
87 const volScalarField& nu,
89 volVectorField& U1Res,
90 volScalarField& p1Res,
91 surfaceScalarField& phi1Res,
92 volVectorField& U2Res,
93 volScalarField& p2Res,
94 surfaceScalarField& phi2Res,
95 const scalar& relaxUEqn)
98 word divUScheme =
"div(phi,U)";
99 word divGradUScheme =
"div((nuEff*dev2(T(grad(U)))))";
102 U0.correctBoundaryConditions();
103 U1.correctBoundaryConditions();
104 p1.correctBoundaryConditions();
105 nuTilda1.correctBoundaryConditions();
106 U2.correctBoundaryConditions();
107 p2.correctBoundaryConditions();
108 nuTilda2.correctBoundaryConditions();
114 volScalarField
nuEff1(
"nuEff1", nu + nut1);
117 fvVectorMatrix
U1Eqn(
118 fvm::div(
phi1,
U1, divUScheme)
121 - fvc::div(
nuEff1 * dev2(
T(fvc::grad(
U1))), divGradUScheme));
126 scalar meshV =
U1.mesh().V()[cellI];
129 U1Eqn.diag()[cellI] +=
D11 / deltaT * meshV;
132 U1Eqn.source()[cellI] -=
D10 / deltaT * U0[cellI] * meshV;
135 U1Eqn.source()[cellI] -=
D12 / deltaT *
U2[cellI] * meshV;
141 U1Eqn.relax(relaxUEqn);
150 fvScalarMatrix
p1Eqn(
163 volScalarField
nuEff2(
"nuEff2", nu + nut2);
166 fvVectorMatrix
U2Eqn(
167 fvm::div(
phi2,
U2, divUScheme)
170 - fvc::div(
nuEff2 * dev2(
T(fvc::grad(
U2))), divGradUScheme));
175 scalar meshV =
U2.mesh().V()[cellI];
178 U2Eqn.diag()[cellI] +=
D22 / deltaT * meshV;
181 U2Eqn.source()[cellI] -=
D20 / deltaT * U0[cellI] * meshV;
184 U2Eqn.source()[cellI] -=
D21 / deltaT *
U1[cellI] * meshV;
190 U2Eqn.relax(relaxUEqn);
200 fvScalarMatrix
p2Eqn(
211 volScalarField& nuTilda0,
213 surfaceScalarField&
phi1,
216 surfaceScalarField&
phi2,
219 const volScalarField& nu,
220 const scalar& deltaT,
221 volScalarField& nuTilda1Res,
222 volScalarField& nuTilda2Res)
225 word divNuTildaScheme =
"div(phi,nuTilda)";
228 nuTilda0.correctBoundaryConditions();
229 U1.correctBoundaryConditions();
230 nuTilda1.correctBoundaryConditions();
231 U2.correctBoundaryConditions();
232 nuTilda2.correctBoundaryConditions();
256 scalar meshV =
nuTilda1.mesh().V()[cellI];
262 nuTilda1Eqn.source()[cellI] -=
D10 / deltaT * nuTilda0[cellI] * meshV;
293 scalar meshV =
nuTilda2.mesh().V()[cellI];
299 nuTilda2Eqn.source()[cellI] -=
D20 / deltaT * nuTilda0[cellI] * meshV;
329 #include "createTime.H"
330 #include "createMesh.H"
331 #include "initContinuityErrs.H"
332 #include "createControl.H"
334 #include "CourantNo.H"
340 volScalarField& nu =
const_cast<volScalarField&
>(
mesh.thisDb().lookupObject<volScalarField>(
"nu"));
341 volScalarField& nut =
const_cast<volScalarField&
>(
mesh.thisDb().lookupObject<volScalarField>(
"nut"));
342 volScalarField& nuTilda =
const_cast<volScalarField&
>(
mesh.thisDb().lookupObject<volScalarField>(
"nuTilda"));
343 volScalarField& y =
const_cast<volScalarField&
>(
mesh.thisDb().lookupObject<volScalarField>(
"yWall"));
347 Info <<
"\nStarting time loop\n"
351 IOdictionary IRKDict(
354 mesh.time().system(),
356 IOobject::READ_IF_PRESENT,
357 IOobject::NO_WRITE));
360 if (IRKDict.found(
"relaxU"))
362 if (IRKDict.getScalar(
"relaxU") > 0)
364 relaxU = IRKDict.getScalar(
"relaxU");
369 if (IRKDict.found(
"relaxP"))
371 if (IRKDict.getScalar(
"relaxP") > 0)
373 relaxP = IRKDict.getScalar(
"relaxP");
377 scalar relaxPhi = 1.0;
378 if (IRKDict.found(
"relaxPhi"))
380 if (IRKDict.getScalar(
"relaxPhi") > 0)
382 relaxPhi = IRKDict.getScalar(
"relaxPhi");
386 scalar relaxNuTilda = 1.0;
387 if (IRKDict.found(
"relaxNuTilda"))
389 if (IRKDict.getScalar(
"relaxNuTilda") > 0)
391 relaxNuTilda = IRKDict.getScalar(
"relaxNuTilda");
395 scalar relaxStage1 = 0.8;
396 if (IRKDict.found(
"relaxStage1"))
398 if (IRKDict.getScalar(
"relaxStage1") > 0)
400 relaxStage1 = IRKDict.getScalar(
"relaxStage1");
404 scalar relaxStage2 = 0.8;
405 if (IRKDict.found(
"relaxStage2"))
407 if (IRKDict.getScalar(
"relaxStage2") > 0)
409 relaxStage2 = IRKDict.getScalar(
"relaxStage2");
413 scalar relaxUEqn = 1.0;
414 scalar relaxNuTildaEqn = 1.0;
415 if (IRKDict.found(
"relaxNuTildaEqn"))
417 if (IRKDict.getScalar(
"relaxNuTildaEqn") > 0)
419 relaxNuTildaEqn = IRKDict.getScalar(
"relaxNuTildaEqn");
424 if (IRKDict.found(
"maxSweep"))
426 if (IRKDict.getLabel(
"maxSweep") > 0)
428 maxSweep = IRKDict.getLabel(
"maxSweep");
433 volVectorField
U1(
"U1",
U);
434 volVectorField
U2(
"U2",
U);
435 volScalarField
p1(
"p1",
p);
436 volScalarField
p2(
"p2",
p);
437 surfaceScalarField
phi1(
"phi1",
phi);
438 surfaceScalarField
phi2(
"phi2",
phi);
440 volScalarField
nuTilda1(
"nuTilda1", nuTilda);
441 volScalarField
nuTilda2(
"nuTilda2", nuTilda);
442 volScalarField nut1(
"nut1", nut);
443 volScalarField nut2(
"nut2", nut);
446 mesh.setFluxRequired(
p1.name());
447 mesh.setFluxRequired(
p2.name());
450 volVectorField U1Res(
458 dimensionedVector(
"U1Res", dimensionSet(0, 1, -2, 0, 0, 0, 0), vector::zero),
459 zeroGradientFvPatchField<vector>::typeName);
460 volVectorField U2Res(
"U2Res", U1Res);
462 volScalarField p1Res(
470 dimensionedScalar(
"p1Res", dimensionSet(0, 0, -1, 0, 0, 0, 0), 0.0),
471 zeroGradientFvPatchField<scalar>::typeName);
472 volScalarField p2Res(
"p2Res", p1Res);
474 surfaceScalarField phi1Res(
482 surfaceScalarField phi2Res(
"phi2Res", phi1Res);
484 volScalarField nuTilda1Res(
492 dimensionedScalar(
"nuTilda1Res", dimensionSet(0, 2, -2, 0, 0, 0, 0), 0.0),
493 zeroGradientFvPatchField<scalar>::typeName);
494 volScalarField nuTilda2Res(
"nuTilda2Res", nuTilda1Res);
507 word divUScheme =
"div(phi,U)";
508 word divGradUScheme =
"div((nuEff*dev2(T(grad(U)))))";
509 word divNuTildaScheme =
"div(phi,nuTilda)";
511 const fvSolution& myFvSolution =
mesh.thisDb().lookupObject<fvSolution>(
"fvSolution");
512 dictionary solverDictU = myFvSolution.subDict(
"solvers").subDict(
"U");
513 dictionary solverDictP = myFvSolution.subDict(
"solvers").subDict(
"p");
514 dictionary solverDictNuTilda = myFvSolution.subDict(
"solvers").subDict(
"nuTilda");
519 #include "CourantNo.H"
523 Info <<
"Time = " <<
runTime.timeName() << nl << endl;
525 scalar deltaT =
runTime.deltaTValue();
528 label sweepIndex = 0;
529 while (sweepIndex < maxSweep)
531 Info <<
"Block GS sweep = " << sweepIndex + 1 << endl;
559 this->
calcPriResIrkOrig(
U, U1,
p1,
phi1,
nuTilda1, nut1,
U2,
p2,
phi2,
nuTilda2, nut2, nu, deltaT, U1Res, p1Res, phi1Res, U2Res, p2Res, phi2Res, relaxUEqn);
560 this->
calcPriSAResIrkOrig(nuTilda,
U1,
phi1,
nuTilda1,
U2,
phi2,
nuTilda2, y, nu, deltaT, nuTilda1Res, nuTilda2Res);
562 Info <<
"L2 norm of U1Res: " << this->
L2norm(U1Res.primitiveField()) << endl;
563 Info <<
"L2 norm of U2Res: " << this->
L2norm(U2Res.primitiveField()) << endl;
564 Info <<
"L2 norm of p1Res: " << this->
L2norm(p1Res.primitiveField()) << endl;
565 Info <<
"L2 norm of p2Res: " << this->
L2norm(p2Res.primitiveField()) << endl;
566 Info <<
"L2 norm of phi1Res: " << this->
L2norm(phi1Res,
phi1.mesh().magSf()) << endl;
567 Info <<
"L2 norm of phi2Res: " << this->
L2norm(phi2Res,
phi2.mesh().magSf()) << endl;
568 Info <<
"L2 norm of nuTilda1Res: " << this->
L2norm(nuTilda1Res.primitiveField()) << endl;
569 Info <<
"L2 norm of nuTilda2Res: " << this->
L2norm(nuTilda2Res.primitiveField()) << endl;
576 U.correctBoundaryConditions();
578 p.correctBoundaryConditions();
581 nuTilda.correctBoundaryConditions();
583 nut.correctBoundaryConditions();
596 U1.correctBoundaryConditions();
598 p1.correctBoundaryConditions();
601 nuTilda1.correctBoundaryConditions();
603 nut1.correctBoundaryConditions();
605 runTime.printExecutionTime(Info);