63 int NmodesUproj,
int NmodesPproj,
int NmodesNut,
int NmodesSup,
68 for (
int i = 0;
i <
problem->inletIndex.rows();
i++)
73 for (
int i = 0;
i < NmodesUproj;
i++)
78 for (
int i = 0;
i < NmodesSup;
i++)
91 UprojN = NmodesUproj + NmodesSup;
105 NmodesNut =
problem->nutModes.size();
108 Eigen::VectorXd uresidualOld = Eigen::VectorXd::Zero(
UprojN);
109 Eigen::VectorXd presidualOld = Eigen::VectorXd::Zero(
PprojN);
112 scalar U_norm_res(1);
113 scalar P_norm_res(1);
114 Eigen::MatrixXd a = Eigen::VectorXd::Zero(
UprojN);
115 Eigen::MatrixXd b = Eigen::VectorXd::Zero(
PprojN);
117 float residualJumpLim =
118 problem->para->ITHACAdict->lookupOrDefault<
float>(
"residualJumpLim", 1e-5);
119 float normalizedResidualLim =
120 problem->para->ITHACAdict->lookupOrDefault<
float>(
"normalizedResidualLim",
124 scalar residual_jump(1 + residualJumpLim);
126 volScalarField& P =
problem->_p();
133 problem->Pmodes.reconstruct(P, b,
"p");
134 phi = fvc::interpolate(
U) &
U.mesh().Sf();
140 Eigen::MatrixXd nutCoeff;
141 nutCoeff.resize(NmodesNut, 1);
143 for (
int i = 0;
i < NmodesNut;
i++)
145 Eigen::MatrixXd muEval;
147 muEval(0, 0) = mu_now;
148 nutCoeff(
i, 0) =
problem->rbfSplines[
i]->eval(muEval);
151 volScalarField&
nut =
const_cast<volScalarField&
>
152 (
problem->_mesh().lookupObject<volScalarField>(
"nut"));
153 problem->nutModes.reconstruct(
nut, nutCoeff,
"nut");
157 PtrList<volVectorField> gradModP;
159 for (
int i = 0;
i < NmodesPproj;
i++)
161 gradModP.append(fvc::grad(
problem->Pmodes[
i]));
166 while ((residual_jump > residualJumpLim
167 || std::max(U_norm_res, P_norm_res) > normalizedResidualLim)
171 std::cout <<
"Iteration " << iter << std::endl;
172#if defined(OFVER) && (OFVER == 6)
177 volScalarField nueff =
problem->turbulence->nuEff().ref();
181 - fvm::laplacian(nueff,
U)
182 - fvc::div(nueff * dev2(
T(fvc::grad(
U))))
189 volScalarField
rAU(1.0 /
UEqn.A());
190 volVectorField
HbyA(constrainHbyA(1.0 /
UEqn.A() *
UEqn.H(),
U, P));
191 surfaceScalarField
phiHbyA(
"phiHbyA", fvc::flux(
HbyA));
199 fvc::interpolate(
rAtU() -
rAU) * fvc::snGrad(P) *
mesh.magSf();
203 List<Eigen::MatrixXd> RedLinSysP;
205 while (
simple.correctNonOrthogonal())
213 problem->Pmodes.reconstruct(P, b,
"p");
215 if (
simple.finalNonOrthogonalIter())
223 U.correctBoundaryConditions();
226 uresidualOld = uresidualOld.cwiseAbs();
227 presidualOld = presidualOld.cwiseAbs();
228 residual_jump = std::max(uresidualOld.sum(), presidualOld.sum());
233 U_norm_res =
uresidual.sum() / (RedLinSysU[1].cwiseAbs()).sum();
234 P_norm_res =
presidual.sum() / (RedLinSysP[1].cwiseAbs()).sum();
238 std::cout <<
"Residual jump = " << residual_jump << std::endl;
239 std::cout <<
"Normalized residual = " << std::max(U_norm_res,
240 P_norm_res) << std::endl;
244 std::cout <<
"Solution " <<
counter <<
" converged in " << iter <<
245 " iterations." << std::endl;
246 std::cout <<
"Final normalized residual for velocity: " << U_norm_res <<
248 std::cout <<
"Final normalized residual for pressure: " << P_norm_res <<
252 problem->Pmodes.reconstruct(P, b,
"Paux");
261 "Imposed boundary conditions dimensions do not match given values matrix dimensions");
262 Eigen::MatrixXd vel_scal;
263 vel_scal.resize(vel.rows(), vel.cols());
265 for (
int k = 0; k <
problem->inletIndex.rows(); k++)
268 int l =
problem->inletIndex(k, 1);
269 scalar area = gSum(
problem->liftfield[0].mesh().magSf().boundaryField()[
p]);
270 scalar u_lf = gSum(
problem->liftfield[k].mesh().magSf().boundaryField()[
p] *
271 problem->liftfield[k].boundaryField()[
p]).component(l) / area;
272 vel_scal(k, 0) = vel(k, 0) / u_lf;
static Eigen::MatrixXd solveLinearSys(List< Eigen::MatrixXd > LinSys, Eigen::MatrixXd x, Eigen::VectorXd &residual, const Eigen::MatrixXd &bc=Eigen::MatrixXd::Zero(0, 0), const std::string solverType="fullPivLu")
Linear system solver for the online problem.
void solveOnline_Simple(scalar mu_now, int NmodesUproj, int NmodesPproj, int NmodesNut=0, int NmodesSup=0, word Folder="./ITHACAoutput/Reconstruct/")
Method to perform an online solve using a PPE stabilisation method.
void exportSolution(GeometricField< Type, PatchField, GeoMesh > &s, fileName subfolder, fileName folder, word fieldName)
Export a field to file in a certain folder and subfolder.