42 if (!config.dataIOControl.uniqueStamps)
45 log() <<
"=== Got Time Stamp: [" << output_stamp <<
"] ===" << std::endl;
50 auto &BCHandler = *pBCHandler;
57 DNDS_assert(config.dataIOControl.readMeshMode == 0 || config.dataIOControl.readMeshMode == 1 || config.dataIOControl.readMeshMode == 2);
58 DNDS_assert(config.dataIOControl.outPltMode == 0 || config.dataIOControl.outPltMode == 1);
59 mesh->periodicInfo.translation[1].map() = config.boundaryDefinition.PeriodicTranslation1;
60 mesh->periodicInfo.translation[2].map() = config.boundaryDefinition.PeriodicTranslation2;
61 mesh->periodicInfo.translation[3].map() = config.boundaryDefinition.PeriodicTranslation3;
62 mesh->periodicInfo.rotationCenter[1].map() = config.boundaryDefinition.PeriodicRotationCent1;
63 mesh->periodicInfo.rotationCenter[2].map() = config.boundaryDefinition.PeriodicRotationCent2;
64 mesh->periodicInfo.rotationCenter[3].map() = config.boundaryDefinition.PeriodicRotationCent3;
65 mesh->periodicInfo.rotation[1].map() =
66 Geom::RotZ(config.boundaryDefinition.PeriodicRotationEulerAngles1[2]) *
67 Geom::RotY(config.boundaryDefinition.PeriodicRotationEulerAngles1[1]) *
68 Geom::RotX(config.boundaryDefinition.PeriodicRotationEulerAngles1[0]);
69 mesh->periodicInfo.rotation[2].map() =
70 Geom::RotZ(config.boundaryDefinition.PeriodicRotationEulerAngles2[2]) *
71 Geom::RotY(config.boundaryDefinition.PeriodicRotationEulerAngles2[1]) *
72 Geom::RotX(config.boundaryDefinition.PeriodicRotationEulerAngles2[0]);
73 mesh->periodicInfo.rotation[3].map() =
74 Geom::RotZ(config.boundaryDefinition.PeriodicRotationEulerAngles3[2]) *
75 Geom::RotY(config.boundaryDefinition.PeriodicRotationEulerAngles3[1]) *
76 Geom::RotX(config.boundaryDefinition.PeriodicRotationEulerAngles3[0]);
78 if (config.dataIOControl.readMeshMode == 0)
80 if (config.dataIOControl.meshFormat == 1)
82 reader->ReadFromOpenFOAMAndConvertSerial(
83 config.dataIOControl.meshFile,
85 [&](
const std::string &name)
87 { return BCHandler.GetIDFromName(name); });
88 reader->Deduplicate1to1Periodic(config.boundaryDefinition.periodicTolerance);
89 reader->BuildCell2Cell();
90 reader->MeshPartitionCell2Cell(config.dataIOControl.meshPartitionOptions);
91 reader->PartitionReorderToMeshCell2Cell();
93 mesh->RecoverNode2CellAndNode2Bnd();
94 mesh->RecoverCell2CellAndBnd2Cell();
95 mesh->BuildGhostPrimary();
96 mesh->AdjGlobal2LocalPrimary();
97 mesh->AdjGlobal2LocalN2CB();
98 if (config.dataIOControl.meshElevation == 1)
102 meshO2->BuildO2FromO1Elevation(*
mesh);
103 std::swap(meshO2,
mesh);
106 mesh->RecoverNode2CellAndNode2Bnd();
107 mesh->RecoverCell2CellAndBnd2Cell();
108 mesh->BuildGhostPrimary();
109 mesh->AdjGlobal2LocalPrimary();
110 mesh->AdjGlobal2LocalN2CB();
112 DNDS_assert(config.dataIOControl.meshDirectBisect <= 4);
113 for (
int iter = 1; iter <= config.dataIOControl.meshDirectBisect; iter++)
117 meshO2->BuildO2FromO1Elevation(*
mesh);
119 meshO2->RecoverNode2CellAndNode2Bnd();
120 meshO2->RecoverCell2CellAndBnd2Cell();
121 meshO2->BuildGhostPrimary();
124 meshO1B->BuildBisectO1FormO2(*meshO2);
126 std::swap(meshO1B,
mesh);
128 mesh->RecoverNode2CellAndNode2Bnd();
129 mesh->RecoverCell2CellAndBnd2Cell();
130 mesh->BuildGhostPrimary();
131 mesh->AdjGlobal2LocalPrimary();
132 mesh->AdjGlobal2LocalN2CB();
135 if (
mesh->getMPI().rank == 0)
137 log() << fmt::format(
"Mesh Direct Bisect {} done, nCell [{}], nNode [{}]", iter,
nCell,
nNode) << std::endl;
145 config.dataIOControl.meshFile,
146 config.dataIOControl.meshPartitionOptions,
147 config.boundaryDefinition.periodicTolerance,
148 config.dataIOControl.meshElevation,
149 config.dataIOControl.meshDirectBisect,
151 { return BCHandler.GetIDFromName(name); });
154 else if (config.dataIOControl.readMeshMode == 1)
157 config.dataIOControl.meshFile, mpi.size,
158 config.dataIOControl.meshElevation,
159 config.dataIOControl.meshDirectBisect);
165 else if (config.dataIOControl.readMeshMode == 2)
168 config.dataIOControl.meshFile, mpi.size,
169 config.dataIOControl.meshElevation,
170 config.dataIOControl.meshDirectBisect);
175 config.dataIOControl.meshPartitionOptions);
180 prepOpts.
reorderCells = config.dataIOControl.meshReorderCells;
195 if (config.dataIOControl.meshElevation == 1 && config.dataIOControl.readMeshMode == 0)
197 mesh->elevationInfo.nIter = config.dataIOControl.meshElevationIter;
198 mesh->elevationInfo.nSearch = config.dataIOControl.meshElevationNSearch;
199 mesh->elevationInfo.RBFRadius = config.dataIOControl.meshElevationRBFRadius;
200 mesh->elevationInfo.RBFPower = config.dataIOControl.meshElevationRBFPower;
201 mesh->elevationInfo.kernel = config.dataIOControl.meshElevationRBFKernel;
202 mesh->elevationInfo.MaxIncludedAngle = config.dataIOControl.meshElevationMaxIncludedAngle;
203 mesh->elevationInfo.refDWall = config.dataIOControl.meshElevationRefDWall;
204 mesh->ElevatedNodesGetBoundarySmooth(
207 auto bType = pBCHandler->GetTypeFromID(bndId);
210 if (config.dataIOControl.meshElevationBoundaryMode == 1 &&
215 if (config.dataIOControl.meshElevationInternalSmoother == 0)
216 mesh->ElevatedNodesSolveInternalSmooth();
217 else if (config.dataIOControl.meshElevationInternalSmoother == 1)
218 mesh->ElevatedNodesSolveInternalSmoothV1();
219 else if (config.dataIOControl.meshElevationInternalSmoother == 2)
220 mesh->ElevatedNodesSolveInternalSmoothV2();
221 else if (config.dataIOControl.meshElevationInternalSmoother == -1)
224 log() <<
" WARNING !!! Not Smoothing internal, abandoning boundary smooth displacements" << std::endl;
230 if (config.dataIOControl.meshBuildWallDist)
232 mesh->BuildNodeWallDist(
235 auto euler_bc_type = pBCHandler->GetTypeFromID(
id);
238 config.dataIOControl.meshWallDistOptions);
241 if (config.timeMarchControl.partitionMeshOnly)
244 config.dataIOControl.meshFile, mpi.size,
245 config.dataIOControl.meshElevation,
246 config.dataIOControl.meshDirectBisect);
252 config.dataIOControl.outPltMode == 0);
254 if (config.dataIOControl.meshRotZ != 0.0)
256 real rz = config.dataIOControl.meshRotZ / 180.0 *
pi;
258 {std::cos(rz), -std::sin(rz), 0},
259 {std::sin(rz), std::cos(rz), 0},
262 mesh->TransformCoords(
265 meshBnd->TransformCoords(
269 for (
auto &
r :
mesh->periodicInfo.rotation)
270 r.map() = Rz *
r.map() * Rz.transpose();
271 for (
auto &
p :
mesh->periodicInfo.rotationCenter)
272 p.map() = Rz *
p.map();
273 for (
auto &
p :
mesh->periodicInfo.translation)
274 p.map() = Rz *
p.map();
277 if (config.dataIOControl.meshScale != 1.0)
279 auto scale = config.dataIOControl.meshScale;
280 mesh->TransformCoords(
282 {
return p * scale; });
283 meshBnd->TransformCoords(
285 {
return p * scale; });
287 for (
auto &
i :
mesh->periodicInfo.translation)
289 for (
auto &
i :
mesh->periodicInfo.rotationCenter)
292 if (config.dataIOControl.rectifyNearPlane)
297 if (config.dataIOControl.rectifyNearPlane & 1)
298 if (std::abs(ret(0)) < config.dataIOControl.rectifyNearPlaneThres)
300 if (config.dataIOControl.rectifyNearPlane & 2)
301 if (std::abs(ret(1)) < config.dataIOControl.rectifyNearPlaneThres)
303 if (config.dataIOControl.rectifyNearPlane & 4)
304 if (std::abs(ret(2)) < config.dataIOControl.rectifyNearPlaneThres)
308 mesh->TransformCoords(fTrans);
309 meshBnd->TransformCoords(fTrans);
312 for (
index iB = 0; iB <
mesh->NumBnd(); iB++)
315 auto bndID =
mesh->bndElemInfo(iB, 0).zone;
316 EulerBCType bndType = pBCHandler->GetTypeFromID(bndID);
317 if (bndType ==
BCSym)
319 auto rectifyOpt = pBCHandler->GetFlagFromID(bndID,
"rectifyOpt");
320 if (rectifyOpt >= 1 && rectifyOpt <= 3)
321 for (
auto iNode :
mesh->bnd2node[iB])
322 mesh->coords[iNode](rectifyOpt - 1) = 0.0;
325 mesh->coords.trans.pullOnce();
326 for (
index iB = 0; iB < meshBnd->NumCell(); iB++)
329 EulerBCType bndType = pBCHandler->GetTypeFromID(bndID);
330 if (bndType ==
BCSym)
332 auto rectifyOpt = pBCHandler->GetFlagFromID(bndID,
"rectifyOpt");
333 if (rectifyOpt >= 1 && rectifyOpt <= 3)
334 for (
auto iNode : meshBnd->cell2node[iB])
335 meshBnd->coords[iNode](rectifyOpt - 1) = 0.0;
340 if (config.dataIOControl.outPltMode == 0)
341 reader->coordSerialOutTrans.pullOnce(),
342 readerBnd->coordSerialOutTrans.pullOnce();
344 mesh->RecreatePeriodicNodes();
345 mesh->BuildVTKConnectivity();
346 meshBnd->RecreatePeriodicNodes();
347 meshBnd->BuildVTKConnectivity();
354 vfv->parseSettings(config.vfvSettings);
355 if (vfv->SetAxisSymmetric(config.others.axisSymmetric) && mpi.rank == 0)
356 log() <<
"EulerSolver === Using Axis Symmetric" << std::endl;
357 TEval::InitializeFV(
mesh, vfv, pBCHandler);
358 if (config.others.printRecMatrix)
360 auto serializerP = config.others.recMatrixWriter.BuildSerializer(mpi);
361 std::string fName = config.dataIOControl.outPltName +
"_RecMatrix";
362 auto [fNameMod, partPath] = config.others.recMatrixWriter.ModifyFilePath(fName, mpi,
"part_%d",
true);
363 serializerP->OpenFile(partPath,
false);
364 vfv->WriteSerializeRecMatrix(serializerP);
365 serializerP->CloseFile();
368 vfv->BuildUDof(u, nVars);
369 vfv->BuildUDof(uIncBufODE, nVars);
370 if (config.timeAverageControl.enabled)
372 vfv->BuildUDof(wAveraged, nVars);
373 vfv->BuildUDof(uAveraged, nVars);
377 { vfv->BuildUDof(uu, nVars); });
379 vfv->BuildURec(uRec, nVars);
380 if (config.timeMarchControl.timeMarchIsTwoStage())
381 vfv->BuildURec(uRec1, nVars);
382 vfv->BuildURec(uRecLimited, nVars);
383 vfv->BuildURec(uRecNew, nVars);
384 vfv->BuildURec(uRecNew1, nVars);
385 vfv->BuildURec(uRecB, nVars);
386 vfv->BuildURec(uRecB1, nVars);
387 vfv->BuildURec(uRecOld, nVars);
388 vfv->BuildScalar(ifUseLimiter);
389 vfv->BuildUDof(betaPP, 1);
390 vfv->BuildUDof(alphaPP, 1);
391 vfv->BuildUDof(alphaPP_tmp, 1);
392 vfv->BuildUDof(dTauTmp, 1);
393 betaPP.setConstant(1.0);
394 alphaPP.setConstant(1.0);
395 if (config.timeMarchControl.timeMarchIsTwoStage())
397 vfv->BuildUDof(betaPP1, 1);
398 vfv->BuildUDof(alphaPP1, 1);
399 betaPP1.setConstant(1.0);
400 alphaPP1.setConstant(1.0);
402 if (config.implicitReconstructionControl.storeRecInc)
404 vfv->BuildURec(uRecInc, nVars);
405 if (config.timeMarchControl.timeMarchIsTwoStage())
406 vfv->BuildURec(uRecInc1, nVars);
415 JD.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
416 JSource.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
417 if (config.timeMarchControl.timeMarchIsTwoStage())
419 JD1.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
420 JSource1.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
422 JDTmp.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
423 JSourceTmp.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
430 DNDS_assert(config.dataIOControl.outCellScalarNames.size() < 128);
431 nOUTS += config.dataIOControl.outCellScalarNames.size();
433 DNDS_assert(config.dataIOControl.outAtCellData || config.dataIOControl.outAtPointData);
434 DNDS_assert(config.dataIOControl.outPltVTKFormat || config.dataIOControl.outPltTecplotFormat || config.dataIOControl.outPltVTKHDFFormat);
436 outDistBnd->Resize(meshBnd->NumCell(), nOUTSBnd);
438 if (config.dataIOControl.outAtCellData)
441 outDist->Resize(
mesh->NumCell(), nOUTS);
443 if (config.dataIOControl.outAtPointData)
446 outDistPoint->Resize(
mesh->NumNode(), nOUTSPoint);
449 outDistPointPair.father = outDistPoint;
451 outDistPointPair.TransAttach();
452 outDistPointPair.trans.BorrowGGIndexing(
mesh->coords.trans);
453 outDistPointPair.trans.createMPITypes();
454 outDistPointPair.trans.initPersistentPull();
457 if (config.dataIOControl.outPltMode == 0)
461 outDist2SerialTransBnd.setFatherSon(outDistBnd, outSerialBnd);
463 outDist2SerialTransBnd.BorrowGGIndexing(readerBnd->cell2nodeSerialOutTrans);
464 outDist2SerialTransBnd.createMPITypes();
465 outDist2SerialTransBnd.initPersistentPull();
467 if (config.dataIOControl.outAtCellData)
470 outDist2SerialTrans.setFatherSon(outDist, outSerial);
472 outDist2SerialTrans.BorrowGGIndexing(reader->cell2nodeSerialOutTrans);
473 outDist2SerialTrans.createMPITypes();
474 outDist2SerialTrans.initPersistentPull();
476 if (config.dataIOControl.outAtPointData)
479 outDist2SerialTransPoint.setFatherSon(outDistPoint, outSerialPoint);
481 outDist2SerialTransPoint.BorrowGGIndexing(reader->coordSerialOutTrans);
482 outDist2SerialTransPoint.createMPITypes();
483 outDist2SerialTransPoint.initPersistentPull();
492 using namespace std::literals;
499 bool useRHSasResBase = !config.timeMarchControl.steadyQuit && config.convergenceControl.resBaseType == 1;
502 eval.EvaluateNorm(
res, cres, config.convergenceControl.normOrd, config.convergenceControl.useVolWiseResidual);
503 if (config.convergenceControl.mergeMultiResidual == 1 && config.timeMarchControl.timeMarchIsTwoStage())
506 eval.EvaluateNorm(res1,
ode->getRES(1), config.convergenceControl.normOrd, config.convergenceControl.useVolWiseResidual);
514 resBaseCInternal.setZero();
521 eval.EvaluateNorm(rhsBaseNorm,
ode->getLatestRHS(), 1, config.convergenceControl.useVolWiseResidual);
522 resBaseCInternal = rhsBaseNorm;
532 resBaseCInternal = resBaseCInternal.array().max(resBaseNorm.array());
535 bool ifStop = resRel(0) < config.convergenceControl.rhsThresholdInternal;
536 if (config.convergenceControl.useCLDriver)
537 ifStop = ifStop && eval.pCLDriver->ConvergedAtTarget();
538 if (iter < config.convergenceControl.nTimeStepInternalMin)
540 auto [CLCur, CDCur, AOACur] = eval.CLDriverGetIntegrationUpdate(iter);
541 if (iter % config.outputControl.nConsoleCheckInternal == 0 || iter > config.convergenceControl.nTimeStepInternal || ifStop)
543 double tWall = MPI_Wtime();
544 real telapsed = MPI_Wtime() - tstartInternal;
545 bool useCollectiveTimer = config.outputControl.useCollectiveTimer;
553 auto [telapsedM, telapsedS] = tInternalStats[
"t"].update(telapsed).get();
554 auto [tcommM, tcommS] = tInternalStats[
"c"].update(tcomm).get();
555 auto [trhsM, trhsS] = tInternalStats[
"r"].update(trhs).get();
556 auto [trecM, trecS] = tInternalStats[
"v"].update(trec).get();
557 auto [tLimM, tLimS] = tInternalStats[
"l"].update(tLim).get();
558 auto [tPPrM, tPPrS] = tInternalStats[
"p"].update(tPP).get();
562 auto fmt =
log().flags();
563 std::string formatStringMain =
"";
564 for (
auto &s : config.outputControl.consoleMainOutputFormatInternal)
565 formatStringMain += s;
566 log() << fmt::format(formatStringMain +
568 (config.outputControl.consoleOutputMode == 1
569 ?
"WallFlux {termYellow}{wallFlux:.6e}{termReset} CL,CD,AoA [{CLCur:.6e},{CDCur:.6e},{AOACur:.2e}]"s
575 fmt::arg(
"resRel", resRel.transpose()),
576 fmt::arg(
"wallFlux", eval.fluxWallSum.transpose()),
635 auto &fluxWall = eval.fluxWallSum;
636 auto &logErrVal = std::get<1>(logErr);
637#define DNDS_FILL_IN_LOG_ERR_VAL(v) FillLogValue(logErrVal, #v, v)
665 real CL{CLCur}, CD{CDCur}, AoA(AOACur);
669#undef DNDS_FILL_IN_LOG_ERR_VAL
671 std::get<0>(logErr)->WriteLine(std::get<1>(logErr), config.outputControl.nPrecisionLog);
673 FillLogValue(logErrVal,
"step", step);
675 eval.ConsoleOutputBndIntegrations();
676 eval.BndIntegrationLogWriteLine(
677 config.dataIOControl.getOutLogName() +
"_" + output_stamp,
680 tstartInternal = MPI_Wtime();
684 if (iter % config.outputControl.nDataOutInternal == 0)
686 eval.FixUMaxFilter(u);
688 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" + std::to_string(step) +
"_" + std::to_string(iter),
689 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" + std::to_string(step),
691 { return ode->getLatestRHS()[iCell](0); },
694 eval.PrintBCProfiles(config.dataIOControl.outPltName +
"_" + output_stamp +
"_" + std::to_string(step),
697 if ((iter % config.outputControl.nDataOutCInternal == 0) &&
698 !(config.outputControl.lazyCoverDataOutput && (iter % config.outputControl.nDataOutInternal == 0)))
700 eval.FixUMaxFilter(u);
702 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"C",
705 { return ode->getLatestRHS()[iCell](0); },
708 eval.PrintBCProfiles(config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"C",
711 if (iter % config.outputControl.nRestartOutInternal == 0)
713 config.restartState.iStep = step;
714 config.restartState.iStepInternal = iter;
715 PrintRestart(config.dataIOControl.getOutRestartName() +
"_" + output_stamp +
"_" + std::to_string(step) +
"_" + std::to_string(iter));
717 if ((iter % config.outputControl.nRestartOutCInternal == 0) &&
718 !(config.outputControl.lazyCoverDataOutput && (iter % config.outputControl.nRestartOutInternal == 0)))
720 config.restartState.iStep = step;
721 config.restartState.iStepInternal = iter;
722 PrintRestart(config.dataIOControl.getOutRestartName() +
"_" + output_stamp +
"_" +
"C");
724 if (iter >= config.implicitCFLControl.nCFLRampStart && iter <= config.implicitCFLControl.nCFLRampLength + config.implicitCFLControl.nCFLRampStart)
726 real inter =
real(iter - config.implicitCFLControl.nCFLRampStart) / config.implicitCFLControl.nCFLRampLength;
727 real logCFL = std::log(config.implicitCFLControl.CFL) + (std::log(config.implicitCFLControl.CFLRampEnd / config.implicitCFLControl.CFL) * inter);
728 CFLNow = std::exp(logCFL);
730 if (ifStop || iter > config.convergenceControl.nTimeStepInternal)
732 CFLNow = config.implicitCFLControl.CFL;
741 using namespace std::literals;
744 { vfv->BuildUDof(uu, nVars); };
746 { vfv->BuildURec(uu, nVars); };
747#define DNDS_EULER_SOLVER_GET_TEMP_UDOF(name) \
748 auto __p##name = uPool.getAllocInit(initUDOF); \
749 auto &name = *__p##name;
751 tSimu += curDtImplicit;
755 eval.EvaluateNorm(
res,
ode->getLatestRHS(), 1, config.convergenceControl.useVolWiseResidual);
756 if (stepCount == 0 && resBaseC.norm() == 0)
759 if (config.timeAverageControl.enabled)
762 eval.MeanValueCons2Prim(u, uTemp);
763 eval.TimeAverageAddition(uTemp, wAveraged, curDtImplicit, tAverage);
766 real CLCur{0.0}, CDCur{0.0}, AOACur{0.0};
768 if (step % config.outputControl.nConsoleCheck == 0)
770 double tWall = MPI_Wtime();
771 real telapsed = MPI_Wtime() - tstart;
772 bool useCollectiveTimer = config.outputControl.useCollectiveTimer;
780 tcomm = tInternalStats[
"c"].update(tcomm).getSum();
781 trhs = tInternalStats[
"r"].update(trhs).getSum();
782 trec = tInternalStats[
"v"].update(trec).getSum();
783 tLim = tInternalStats[
"l"].update(tLim).getSum();
787 auto format =
log().flags();
788 std::string formatStringMain =
"";
789 for (
auto &s : config.outputControl.consoleMainOutputFormat)
790 formatStringMain += s;
791 log() << fmt::format(formatStringMain +
793 (config.outputControl.consoleOutputMode == 1
794 ?
"WallFlux {termYellow}{wallFlux:.6e}{termReset}"s
799 fmt::arg(
"resRel", (
res.array() / (resBaseC.array() +
verySmallReal)).transpose()),
800 fmt::arg(
"wallFlux", eval.fluxWallSum.transpose()),
829 auto &fluxWall = eval.fluxWallSum;
830 auto &logErrVal = std::get<1>(logErr);
831 int iStep{-1}, iter{-1};
832#define DNDS_FILL_IN_LOG_ERR_VAL(v) FillLogValue(logErrVal, #v, v)
859 real CL{CLCur}, CD{CDCur}, AoA(AOACur);
863#undef DNDS_FILL_IN_LOG_ERR_VAL
864 std::get<0>(logErr)->WriteLine(std::get<1>(logErr), config.outputControl.nPrecisionLog);
866 eval.ConsoleOutputBndIntegrations();
867 eval.BndIntegrationLogWriteLine(
868 config.dataIOControl.getOutLogName() +
"_" + output_stamp,
871 tstart = MPI_Wtime();
873 for (
auto &s : tInternalStats)
876 if (step == nextStepOutC)
878 if (!(config.outputControl.lazyCoverDataOutput && (step == nextStepOut)))
880 eval.FixUMaxFilter(u);
882 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"C",
885 { return ode->getLatestRHS()[iCell](0); },
888 eval.PrintBCProfiles(config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"C",
891 nextStepOutC += config.outputControl.nDataOutC;
893 if (step == nextStepOut)
895 eval.FixUMaxFilter(u);
897 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" + std::to_string(step),
898 config.dataIOControl.outPltName +
"_" + output_stamp,
900 { return ode->getLatestRHS()[iCell](0); },
903 eval.PrintBCProfiles(config.dataIOControl.outPltName +
"_" + output_stamp +
"_" + std::to_string(step),
905 nextStepOut += config.outputControl.nDataOut;
907 if (step == nextStepOutAverageC)
909 if (!(config.outputControl.lazyCoverDataOutput && (step == nextStepOutAverage)))
912 eval.MeanValuePrim2Cons(wAveraged, uAveraged);
913 eval.FixUMaxFilter(uAveraged);
915 config.dataIOControl.outPltName +
"_TimeAveraged_" + output_stamp +
"_" +
"C",
918 { return ode->getLatestRHS()[iCell](0); },
921 PrintDataTimeAverage);
923 nextStepOutAverageC += config.outputControl.nTimeAverageOutC;
925 if (step == nextStepOutAverage)
928 eval.MeanValuePrim2Cons(wAveraged, uAveraged);
929 eval.FixUMaxFilter(uAveraged);
931 config.dataIOControl.outPltName +
"_TimeAveraged_" + output_stamp +
"_" + std::to_string(step),
932 config.dataIOControl.outPltName +
"_TimeAveraged_" + output_stamp,
934 { return ode->getLatestRHS()[iCell](0); },
937 PrintDataTimeAverage);
938 nextStepOutAverage += config.outputControl.nTimeAverageOut;
940 if (step == nextStepRestartC)
942 if (!(config.outputControl.lazyCoverDataOutput && (step == nextStepRestart)))
944 config.restartState.iStep = step;
945 config.restartState.iStepInternal = -1;
946 PrintRestart(config.dataIOControl.getOutRestartName() +
"_" + output_stamp +
"_" +
"C");
948 nextStepRestartC += config.outputControl.nRestartOutC;
950 if (step == nextStepRestart)
952 config.restartState.iStep = step;
953 config.restartState.iStepInternal = -1;
954 PrintRestart(config.dataIOControl.getOutRestartName() +
"_" + output_stamp +
"_" + std::to_string(step));
955 nextStepRestart += config.outputControl.nRestartOut;
959 eval.FixUMaxFilter(u);
961 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"t_" + std::to_string(nextTout),
962 config.dataIOControl.outPltName +
"_" + output_stamp,
964 { return ode->getLatestRHS()[iCell](0); },
967 eval.PrintBCProfiles(config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"t_" + std::to_string(nextTout),
969 nextTout += config.outputControl.tDataOut;
970 if (nextTout >= config.timeMarchControl.tEnd)
971 nextTout = config.timeMarchControl.tEnd;
973 if ((eval.settings.specialBuiltinInitializer == 2 ||
974 eval.settings.specialBuiltinInitializer == 203) &&
975 (step % config.outputControl.nConsoleCheck == 0))
979 switch (eval.settings.specialBuiltinInitializer)
996 Eigen::Vector<
real, -1> err1, errInf;
997 eval.EvaluateRecNorm(
998 err1, u, uRec, 1,
true,
1001 eval.EvaluateRecNorm(
1002 errInf, u, uRec, 1000,
true,
1008 log() <<
"=== Mean Error IV: [" << std::scientific
1009 << std::setprecision(config.outputControl.nPrecisionConsole + 4) << err1(0) <<
", "
1010 << err1(0) / vfv->GetGlobalVol() <<
", "
1012 <<
"]" << std::endl;
1015 if (config.implicitReconstructionControl.zeroGrads)
1016 uRec.setConstant(0.0), gradIsZero =
true;
1020 return tSimu >= config.timeMarchControl.tEnd;