97 int NmodesUproj,
int NmodesPproj,
int NmodesEproj)
101 scalar residualNorm(1);
102 scalar residualJump(1);
103 Eigen::MatrixXd uResidualOld = Eigen::MatrixXd::Zero(1, NmodesUproj);
104 Eigen::MatrixXd eResidualOld = Eigen::MatrixXd::Zero(1, NmodesEproj);
105 Eigen::MatrixXd pResidualOld = Eigen::MatrixXd::Zero(1, NmodesPproj);
106 Eigen::VectorXd uResidual(Eigen::Map<Eigen::VectorXd>(uResidualOld.data(),
108 Eigen::VectorXd eResidual(Eigen::Map<Eigen::VectorXd>(eResidualOld.data(),
110 Eigen::VectorXd pResidual(Eigen::Map<Eigen::VectorXd>(pResidualOld.data(),
114 float residualJumpLim =
115 para->ITHACAdict->lookupOrDefault<
float>(
"residualJumpLim", 1e-5);
116 float normalizedResidualLim =
117 para->ITHACAdict->lookupOrDefault<
float>(
"normalizedResidualLim", 1e-5);
119 para->ITHACAdict->lookupOrDefault<
float>(
"maxIter", 2000);
120 bool closedVolume =
false;
123 fluidThermo& thermo =
problem->pThermo();
124 volVectorField& U =
problem->_U();
125 volScalarField& P =
problem->pThermo->p();
126 volScalarField& E =
problem->pThermo->he();
127 volScalarField& rho =
problem->_rho();
128 volScalarField& psi =
problem->_psi();
129 surfaceScalarField& phi =
problem->_phi();
130 Time& runTime =
problem->_runTime();
131 fvMesh& mesh =
problem->_mesh();
132 fv::options& fvOptions =
problem->_fvOptions();
133 scalar cumulativeContErr =
problem->cumulativeContErr;
135 Eigen::MatrixXd u = Eigen::MatrixXd::Zero(NmodesUproj, 1);
136 Eigen::MatrixXd e = Eigen::MatrixXd::Zero(NmodesEproj, 1);
137 Eigen::MatrixXd p = Eigen::MatrixXd::Zero(NmodesPproj, 1);
139 while ((residualJump > residualJumpLim
140 || residualNorm > normalizedResidualLim) && csolve < maxIter)
143 Info <<
"csolve:" << csolve << endl;
145 problem->_simple().loop(runTime);
149 uResidualOld = uResidual;
150 eResidualOld = eResidual;
151 pResidualOld = pResidual;
153 List<Eigen::MatrixXd> RedLinSysU;
158 - fvc::div((rho *
problem->turbulence->nuEff()) * dev2(T(fvc::grad(U))))
159 - fvm::laplacian(rho *
problem->turbulence->nuEff(), U)
164 fvOptions.constrain(UEqnR);
166 "################################ line 165 ##############################" <<
169 RedLinSysU =
problem->Umodes.project(UEqnR, NmodesUproj);
171 "################################ line 169 ##############################" <<
175 "################################ line 171 ##############################" <<
177 RedLinSysU[1] = RedLinSysU[1] - projGradP;
181 "################################ line 174 ##############################" <<
183 problem->Umodes.reconstruct(U, u,
"U");
185 "################################ line 175 ##############################" <<
189 fvOptions.correct(U);
195 + fvc::div(phi, volScalarField(
"Ekp", 0.5 * magSqr(U) + P / rho))
196 - fvm::laplacian(
problem->turbulence->alphaEff(), E)
201 fvOptions.constrain(EEqnR);
204 List<Eigen::MatrixXd> RedLinSysE =
problem->Emodes.project(EEqnR, NmodesEproj);
206 "################################ line 196 ##############################" <<
209 problem->Emodes.reconstruct(E, e,
"e");
211 "################################ line 198 ##############################" <<
215 fvOptions.correct(E);
221 constrainPressure(P, rho, U,
problem->getPhiHbyA(UEqnR, U, P),
224 surfaceScalarField phiHbyACalculated =
problem->getPhiHbyA(UEqnR, U, P);
225 closedVolume = adjustPhi(phiHbyACalculated, U, P);
226 List<Eigen::MatrixXd> RedLinSysP;
228 while (
problem->_simple().correctNonOrthogonal())
231 volScalarField rAU(1.0 /
233 volVectorField HbyA(constrainHbyA(rAU * UEqnR.H(), U,
235 surfaceScalarField phiHbyA(
"phiHbyA", fvc::interpolate(rho)*fvc::flux(HbyA));
236 surfaceScalarField rhorAUf(
"rhorAUf", fvc::interpolate(rho * rAU));
240 - fvm::laplacian(rhorAUf, P)
242 fvOptions(psi, P, rho.name())
246 problem->_pressureControl().refCell(),
247 problem->_pressureControl().refValue()
250 RedLinSysP =
problem->Pmodes.project(PEqnR, NmodesPproj);
252 problem->Pmodes.reconstruct(P, p,
"p");
256 if (
problem->_simple().finalNonOrthogonalIter())
259 phi =
problem->getPhiHbyA(UEqnR, U,
264#include "continuityErrs.H"
268 U.correctBoundaryConditions();
269 fvOptions.correct(U);
270 bool pLimited =
problem->_pressureControl().limit(P);
275 P += (
problem->_initialMass() - fvc::domainIntegrate(psi * P))
276 / fvc::domainIntegrate(psi);
279 if (pLimited || closedVolume)
281 P.correctBoundaryConditions();
286 Info <<
"Ures = " << (uResidual.cwiseAbs()).sum() /
287 (RedLinSysU[1].cwiseAbs()).sum() << endl;
288 Info <<
"Eres = " << (eResidual.cwiseAbs()).sum() /
289 (RedLinSysE[1].cwiseAbs()).sum() << endl;
290 Info <<
"Pres = " << (pResidual.cwiseAbs()).sum() /
291 (RedLinSysP[1].cwiseAbs()).sum() << endl;
295 residualNorm = max(max((uResidual.cwiseAbs()).sum() /
296 (RedLinSysU[1].cwiseAbs()).sum(),
297 (pResidual.cwiseAbs()).sum() / (RedLinSysP[1].cwiseAbs()).sum()),
298 (eResidual.cwiseAbs()).sum() / (RedLinSysE[1].cwiseAbs()).sum());
299 residualJump = max(max(((uResidual - uResidualOld).cwiseAbs()).sum() /
300 (RedLinSysU[1].cwiseAbs()).sum(),
301 ((pResidual - pResidualOld).cwiseAbs()).sum() /
302 (RedLinSysP[1].cwiseAbs()).sum()),
303 ((eResidual - eResidualOld).cwiseAbs()).sum() /
304 (RedLinSysE[1].cwiseAbs()).sum());
305 Info << residualNorm << endl;
306 Info << residualJump << endl;
307 problem->turbulence->correct();