41 if (!config.dataIOControl.uniqueStamps)
44 log() <<
"=== Got Time Stamp: [" << output_stamp <<
"] ===" << std::endl;
49 auto &BCHandler = *pBCHandler;
56 DNDS_assert(config.dataIOControl.readMeshMode == 0 || config.dataIOControl.readMeshMode == 1 || config.dataIOControl.readMeshMode == 2);
57 DNDS_assert(config.dataIOControl.outPltMode == 0 || config.dataIOControl.outPltMode == 1);
58 mesh->periodicInfo.translation[1].map() = config.boundaryDefinition.PeriodicTranslation1;
59 mesh->periodicInfo.translation[2].map() = config.boundaryDefinition.PeriodicTranslation2;
60 mesh->periodicInfo.translation[3].map() = config.boundaryDefinition.PeriodicTranslation3;
61 mesh->periodicInfo.rotationCenter[1].map() = config.boundaryDefinition.PeriodicRotationCent1;
62 mesh->periodicInfo.rotationCenter[2].map() = config.boundaryDefinition.PeriodicRotationCent2;
63 mesh->periodicInfo.rotationCenter[3].map() = config.boundaryDefinition.PeriodicRotationCent3;
64 mesh->periodicInfo.rotation[1].map() =
65 Geom::RotZ(config.boundaryDefinition.PeriodicRotationEulerAngles1[2]) *
66 Geom::RotY(config.boundaryDefinition.PeriodicRotationEulerAngles1[1]) *
67 Geom::RotX(config.boundaryDefinition.PeriodicRotationEulerAngles1[0]);
68 mesh->periodicInfo.rotation[2].map() =
69 Geom::RotZ(config.boundaryDefinition.PeriodicRotationEulerAngles2[2]) *
70 Geom::RotY(config.boundaryDefinition.PeriodicRotationEulerAngles2[1]) *
71 Geom::RotX(config.boundaryDefinition.PeriodicRotationEulerAngles2[0]);
72 mesh->periodicInfo.rotation[3].map() =
73 Geom::RotZ(config.boundaryDefinition.PeriodicRotationEulerAngles3[2]) *
74 Geom::RotY(config.boundaryDefinition.PeriodicRotationEulerAngles3[1]) *
75 Geom::RotX(config.boundaryDefinition.PeriodicRotationEulerAngles3[0]);
77 if (config.dataIOControl.readMeshMode == 0)
79 if (config.dataIOControl.meshFormat == 1)
80 reader->ReadFromOpenFOAMAndConvertSerial(
81 config.dataIOControl.meshFile,
83 [&](
const std::string &name)
85 { return BCHandler.GetIDFromName(name); });
87 reader->ReadFromCGNSSerial(
88 config.dataIOControl.meshFile,
90 { return BCHandler.GetIDFromName(name); });
91 reader->Deduplicate1to1Periodic(config.boundaryDefinition.periodicTolerance);
92 reader->BuildCell2Cell();
93 reader->MeshPartitionCell2Cell(config.dataIOControl.meshPartitionOptions);
94 reader->PartitionReorderToMeshCell2Cell();
96 mesh->RecoverNode2CellAndNode2Bnd();
97 mesh->RecoverCell2CellAndBnd2Cell();
98 mesh->BuildGhostPrimary();
99 mesh->AdjGlobal2LocalPrimary();
100 mesh->AdjGlobal2LocalN2CB();
101 if (config.dataIOControl.meshElevation == 1)
105 meshO2->BuildO2FromO1Elevation(*mesh);
106 std::swap(meshO2, mesh);
109 mesh->RecoverNode2CellAndNode2Bnd();
110 mesh->RecoverCell2CellAndBnd2Cell();
111 mesh->BuildGhostPrimary();
112 mesh->AdjGlobal2LocalPrimary();
113 mesh->AdjGlobal2LocalN2CB();
115 DNDS_assert(config.dataIOControl.meshDirectBisect <= 4);
116 for (
int iter = 1; iter <= config.dataIOControl.meshDirectBisect; iter++)
120 meshO2->BuildO2FromO1Elevation(*mesh);
122 meshO2->RecoverNode2CellAndNode2Bnd();
123 meshO2->RecoverCell2CellAndBnd2Cell();
124 meshO2->BuildGhostPrimary();
127 meshO1B->BuildBisectO1FormO2(*meshO2);
129 std::swap(meshO1B, mesh);
131 mesh->RecoverNode2CellAndNode2Bnd();
132 mesh->RecoverCell2CellAndBnd2Cell();
133 mesh->BuildGhostPrimary();
134 mesh->AdjGlobal2LocalPrimary();
135 mesh->AdjGlobal2LocalN2CB();
136 index nCell = mesh->NumCellGlobal();
137 index nNode = mesh->NumNodeGlobal();
138 if (mesh->getMPI().rank == 0)
140 log() << fmt::format(
"Mesh Direct Bisect {} done, nCell [{}], nNode [{}]", iter, nCell, nNode) << std::endl;
144 else if (config.dataIOControl.readMeshMode == 1)
146 using namespace std::literals;
147 std::string meshOutName = std::string(config.dataIOControl.meshFile) +
"_part_" + std::to_string(mpi.size) +
148 (config.dataIOControl.meshElevation == 1 ?
"_elevated"s :
""s) +
149 (config.dataIOControl.meshDirectBisect > 0 ?
"_bisect" + std::to_string(config.dataIOControl.meshDirectBisect) :
""s);
154 log() <<
"EulerSolver === to read via [" << config.dataIOControl.meshPartitionedReaderType <<
"]" << std::endl;
156 serializerP->OpenFile(meshOutNameMod,
true);
157 mesh->ReadSerialize(serializerP,
"meshPart");
158 serializerP->CloseFile();
160 mesh->RecoverNode2CellAndNode2Bnd();
161 mesh->RecoverCell2CellAndBnd2Cell();
162 mesh->BuildGhostPrimary();
163 mesh->AdjGlobal2LocalPrimary();
164 mesh->AdjGlobal2LocalN2CB();
166 else if (config.dataIOControl.readMeshMode == 2)
170 using namespace std::literals;
171 std::string meshOutName = std::string(config.dataIOControl.meshFile) +
"_part_" + std::to_string(mpi.size) +
172 (config.dataIOControl.meshElevation == 1 ?
"_elevated"s :
""s) +
173 (config.dataIOControl.meshDirectBisect > 0 ?
"_bisect" + std::to_string(config.dataIOControl.meshDirectBisect) :
""s);
178 log() <<
"EulerSolver === distributed read via [" << config.dataIOControl.meshPartitionedReaderType <<
"]" << std::endl;
180 serializerP->OpenFile(meshOutNameMod,
true);
181 mesh->ReadSerializeAndDistribute(serializerP,
"meshPart", config.dataIOControl.meshPartitionOptions);
182 serializerP->CloseFile();
184 mesh->RecoverNode2CellAndNode2Bnd();
185 mesh->RecoverCell2CellAndBnd2Cell();
186 mesh->BuildGhostPrimary();
187 mesh->AdjGlobal2LocalPrimary();
188 mesh->AdjGlobal2LocalN2CB();
191 if (config.dataIOControl.meshReorderCells == 1)
195 mesh->ReorderLocalCells();
198 mesh->InterpolateFace();
199 mesh->AssertOnFaces();
206 mesh->AdjLocal2GlobalN2CB();
207 mesh->BuildGhostN2CB();
208 mesh->AdjGlobal2LocalN2CB();
209 log() << fmt::format(
"{}, NumBndGhost {}", mpi.rank, mesh->NumBndGhost()) << std::endl;
213 for (
index iNode = 0; iNode < mesh->NumNode(); iNode++)
214 for (
index iCell : mesh->node2cell[iNode])
217 if (config.dataIOControl.meshElevation == 1 && config.dataIOControl.readMeshMode == 0)
219 mesh->elevationInfo.nIter = config.dataIOControl.meshElevationIter;
220 mesh->elevationInfo.nSearch = config.dataIOControl.meshElevationNSearch;
221 mesh->elevationInfo.RBFRadius = config.dataIOControl.meshElevationRBFRadius;
222 mesh->elevationInfo.RBFPower = config.dataIOControl.meshElevationRBFPower;
223 mesh->elevationInfo.kernel = config.dataIOControl.meshElevationRBFKernel;
224 mesh->elevationInfo.MaxIncludedAngle = config.dataIOControl.meshElevationMaxIncludedAngle;
225 mesh->elevationInfo.refDWall = config.dataIOControl.meshElevationRefDWall;
226 mesh->ElevatedNodesGetBoundarySmooth(
229 auto bType = pBCHandler->GetTypeFromID(bndId);
232 if (config.dataIOControl.meshElevationBoundaryMode == 1 &&
237 if (config.dataIOControl.meshElevationInternalSmoother == 0)
238 mesh->ElevatedNodesSolveInternalSmooth();
239 else if (config.dataIOControl.meshElevationInternalSmoother == 1)
240 mesh->ElevatedNodesSolveInternalSmoothV1();
241 else if (config.dataIOControl.meshElevationInternalSmoother == 2)
242 mesh->ElevatedNodesSolveInternalSmoothV2();
243 else if (config.dataIOControl.meshElevationInternalSmoother == -1)
246 log() <<
" WARNING !!! Not Smoothing internal, abandoning boundary smooth displacements" << std::endl;
252 if (config.dataIOControl.meshBuildWallDist)
254 mesh->BuildNodeWallDist(
257 auto euler_bc_type = pBCHandler->GetTypeFromID(
id);
260 config.dataIOControl.meshWallDistOptions);
263 if (config.dataIOControl.outPltMode == 0)
265 mesh->AdjLocal2GlobalPrimary();
266 reader->BuildSerialOut();
267 mesh->AdjGlobal2LocalPrimary();
270 if (config.timeMarchControl.partitionMeshOnly)
272 using namespace std::literals;
273 std::string meshOutName = std::string(config.dataIOControl.meshFile) +
"_part_" + std::to_string(mpi.size) +
274 (config.dataIOControl.meshElevation == 1 ?
"_elevated"s :
""s) +
275 (config.dataIOControl.meshDirectBisect > 0 ?
"_bisect" + std::to_string(config.dataIOControl.meshDirectBisect) :
""s);
295 auto [meshOutNameMod, meshPartPath] = config.dataIOControl.meshPartitionedWriter.ModifyFilePath(meshOutName, mpi,
"part_%d",
false);
299 serializerP->OpenFile(meshOutNameMod,
false);
300 mesh->AdjLocal2GlobalPrimary();
301 mesh->WriteSerialize(serializerP,
"meshPart");
302 mesh->AdjGlobal2LocalPrimary();
303 serializerP->CloseFile();
307 mesh->ConstructBndMesh(*meshBnd);
308 if (config.dataIOControl.outPltMode == 0)
310 meshBnd->AdjLocal2GlobalPrimaryForBnd();
311 readerBnd->BuildSerialOut();
312 meshBnd->AdjGlobal2LocalPrimaryForBnd();
315 if (config.dataIOControl.meshRotZ != 0.0)
317 real rz = config.dataIOControl.meshRotZ / 180.0 *
pi;
319 {std::cos(rz), -std::sin(rz), 0},
320 {std::sin(rz), std::cos(rz), 0},
323 mesh->TransformCoords(
326 meshBnd->TransformCoords(
330 for (
auto &
r : mesh->periodicInfo.rotation)
331 r.map() = Rz *
r.map() * Rz.transpose();
332 for (
auto &p : mesh->periodicInfo.rotationCenter)
333 p.map() = Rz * p.map();
334 for (
auto &p : mesh->periodicInfo.translation)
335 p.map() = Rz * p.map();
338 if (config.dataIOControl.meshScale != 1.0)
340 auto scale = config.dataIOControl.meshScale;
341 mesh->TransformCoords(
343 {
return p * scale; });
344 meshBnd->TransformCoords(
346 {
return p * scale; });
348 for (
auto &i : mesh->periodicInfo.translation)
350 for (
auto &i : mesh->periodicInfo.rotationCenter)
353 if (config.dataIOControl.rectifyNearPlane)
358 if (config.dataIOControl.rectifyNearPlane & 1)
359 if (std::abs(ret(0)) < config.dataIOControl.rectifyNearPlaneThres)
361 if (config.dataIOControl.rectifyNearPlane & 2)
362 if (std::abs(ret(1)) < config.dataIOControl.rectifyNearPlaneThres)
364 if (config.dataIOControl.rectifyNearPlane & 4)
365 if (std::abs(ret(2)) < config.dataIOControl.rectifyNearPlaneThres)
369 mesh->TransformCoords(fTrans);
370 meshBnd->TransformCoords(fTrans);
373 for (
index iB = 0; iB < mesh->NumBnd(); iB++)
375 index iFace = mesh->bnd2faceV.at(iB);
376 auto bndID = mesh->bndElemInfo(iB, 0).zone;
377 EulerBCType bndType = pBCHandler->GetTypeFromID(bndID);
378 if (bndType ==
BCSym)
380 auto rectifyOpt = pBCHandler->GetFlagFromID(bndID,
"rectifyOpt");
381 if (rectifyOpt >= 1 && rectifyOpt <= 3)
382 for (
auto iNode : mesh->bnd2node[iB])
383 mesh->coords[iNode](rectifyOpt - 1) = 0.0;
386 mesh->coords.trans.pullOnce();
387 for (
index iB = 0; iB < meshBnd->NumCell(); iB++)
389 auto bndID = meshBnd->cellElemInfo(iB, 0).zone;
390 EulerBCType bndType = pBCHandler->GetTypeFromID(bndID);
391 if (bndType ==
BCSym)
393 auto rectifyOpt = pBCHandler->GetFlagFromID(bndID,
"rectifyOpt");
394 if (rectifyOpt >= 1 && rectifyOpt <= 3)
395 for (
auto iNode : meshBnd->cell2node[iB])
396 meshBnd->coords[iNode](rectifyOpt - 1) = 0.0;
401 if (config.dataIOControl.outPltMode == 0)
402 reader->coordSerialOutTrans.pullOnce(),
403 readerBnd->coordSerialOutTrans.pullOnce();
405 mesh->RecreatePeriodicNodes();
406 mesh->BuildVTKConnectivity();
407 meshBnd->RecreatePeriodicNodes();
408 meshBnd->BuildVTKConnectivity();
415 vfv->parseSettings(config.vfvSettings);
416 if (vfv->SetAxisSymmetric(config.others.axisSymmetric) && mpi.rank == 0)
417 log() <<
"EulerSolver === Using Axis Symmetric" << std::endl;
418 TEval::InitializeFV(mesh, vfv, pBCHandler);
419 if (config.others.printRecMatrix)
421 auto serializerP = config.others.recMatrixWriter.BuildSerializer(mpi);
422 std::string fName = config.dataIOControl.outPltName +
"_RecMatrix";
423 auto [fNameMod, partPath] = config.others.recMatrixWriter.ModifyFilePath(fName, mpi,
"part_%d",
true);
424 serializerP->OpenFile(partPath,
false);
425 vfv->WriteSerializeRecMatrix(serializerP);
426 serializerP->CloseFile();
429 vfv->BuildUDof(u, nVars);
430 vfv->BuildUDof(uIncBufODE, nVars);
431 if (config.timeAverageControl.enabled)
433 vfv->BuildUDof(wAveraged, nVars);
434 vfv->BuildUDof(uAveraged, nVars);
438 { vfv->BuildUDof(uu, nVars); });
440 vfv->BuildURec(uRec, nVars);
441 if (config.timeMarchControl.timeMarchIsTwoStage())
442 vfv->BuildURec(uRec1, nVars);
443 vfv->BuildURec(uRecLimited, nVars);
444 vfv->BuildURec(uRecNew, nVars);
445 vfv->BuildURec(uRecNew1, nVars);
446 vfv->BuildURec(uRecB, nVars);
447 vfv->BuildURec(uRecB1, nVars);
448 vfv->BuildURec(uRecOld, nVars);
449 vfv->BuildScalar(ifUseLimiter);
450 vfv->BuildUDof(betaPP, 1);
451 vfv->BuildUDof(alphaPP, 1);
452 vfv->BuildUDof(alphaPP_tmp, 1);
453 vfv->BuildUDof(dTauTmp, 1);
454 betaPP.setConstant(1.0);
455 alphaPP.setConstant(1.0);
456 if (config.timeMarchControl.timeMarchIsTwoStage())
458 vfv->BuildUDof(betaPP1, 1);
459 vfv->BuildUDof(alphaPP1, 1);
460 betaPP1.setConstant(1.0);
461 alphaPP1.setConstant(1.0);
463 if (config.implicitReconstructionControl.storeRecInc)
465 vfv->BuildURec(uRecInc, nVars);
466 if (config.timeMarchControl.timeMarchIsTwoStage())
467 vfv->BuildURec(uRecInc1, nVars);
473 DNDS_MAKE_SSP(pEval, mesh, vfv, pBCHandler, config.eulerSettings, nVars);
476 JD.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
477 JSource.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
478 if (config.timeMarchControl.timeMarchIsTwoStage())
480 JD1.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
481 JSource1.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
483 JDTmp.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
484 JSourceTmp.SetModeAndInit(eval.
settings.useScalarJacobian ? 0 : 1, nVars, u);
491 DNDS_assert(config.dataIOControl.outCellScalarNames.size() < 128);
492 nOUTS += config.dataIOControl.outCellScalarNames.size();
494 DNDS_assert(config.dataIOControl.outAtCellData || config.dataIOControl.outAtPointData);
495 DNDS_assert(config.dataIOControl.outPltVTKFormat || config.dataIOControl.outPltTecplotFormat || config.dataIOControl.outPltVTKHDFFormat);
497 outDistBnd->Resize(meshBnd->NumCell(), nOUTSBnd);
499 if (config.dataIOControl.outAtCellData)
502 outDist->Resize(mesh->NumCell(), nOUTS);
504 if (config.dataIOControl.outAtPointData)
507 outDistPoint->Resize(mesh->NumNode(), nOUTSPoint);
510 outDistPointPair.father = outDistPoint;
512 outDistPointPair.TransAttach();
513 outDistPointPair.trans.BorrowGGIndexing(mesh->coords.trans);
514 outDistPointPair.trans.createMPITypes();
515 outDistPointPair.trans.initPersistentPull();
518 if (config.dataIOControl.outPltMode == 0)
522 outDist2SerialTransBnd.setFatherSon(outDistBnd, outSerialBnd);
524 outDist2SerialTransBnd.BorrowGGIndexing(readerBnd->cell2nodeSerialOutTrans);
525 outDist2SerialTransBnd.createMPITypes();
526 outDist2SerialTransBnd.initPersistentPull();
528 if (config.dataIOControl.outAtCellData)
531 outDist2SerialTrans.setFatherSon(outDist, outSerial);
533 outDist2SerialTrans.BorrowGGIndexing(reader->cell2nodeSerialOutTrans);
534 outDist2SerialTrans.createMPITypes();
535 outDist2SerialTrans.initPersistentPull();
537 if (config.dataIOControl.outAtPointData)
540 outDist2SerialTransPoint.setFatherSon(outDistPoint, outSerialPoint);
542 outDist2SerialTransPoint.BorrowGGIndexing(reader->coordSerialOutTrans);
543 outDist2SerialTransPoint.createMPITypes();
544 outDist2SerialTransPoint.initPersistentPull();
553 using namespace std::literals;
560 bool useRHSasResBase = !config.timeMarchControl.steadyQuit && config.convergenceControl.resBaseType == 1;
563 eval.EvaluateNorm(
res, cres, config.convergenceControl.normOrd, config.convergenceControl.useVolWiseResidual);
564 if (config.convergenceControl.mergeMultiResidual == 1 && config.timeMarchControl.timeMarchIsTwoStage())
567 eval.EvaluateNorm(res1,
ode->getRES(1), config.convergenceControl.normOrd, config.convergenceControl.useVolWiseResidual);
575 resBaseCInternal.setZero();
582 eval.EvaluateNorm(rhsBaseNorm,
ode->getLatestRHS(), 1, config.convergenceControl.useVolWiseResidual);
583 resBaseCInternal = rhsBaseNorm;
593 resBaseCInternal = resBaseCInternal.array().max(resBaseNorm.array());
596 bool ifStop = resRel(0) < config.convergenceControl.rhsThresholdInternal;
597 if (config.convergenceControl.useCLDriver)
598 ifStop = ifStop && eval.pCLDriver->ConvergedAtTarget();
599 if (iter < config.convergenceControl.nTimeStepInternalMin)
601 auto [CLCur, CDCur, AOACur] = eval.CLDriverGetIntegrationUpdate(iter);
602 if (iter % config.outputControl.nConsoleCheckInternal == 0 || iter > config.convergenceControl.nTimeStepInternal || ifStop)
604 double tWall = MPI_Wtime();
605 real telapsed = MPI_Wtime() - tstartInternal;
606 bool useCollectiveTimer = config.outputControl.useCollectiveTimer;
614 auto [telapsedM, telapsedS] = tInternalStats[
"t"].update(telapsed).get();
615 auto [tcommM, tcommS] = tInternalStats[
"c"].update(tcomm).get();
616 auto [trhsM, trhsS] = tInternalStats[
"r"].update(trhs).get();
617 auto [trecM, trecS] = tInternalStats[
"v"].update(trec).get();
618 auto [tLimM, tLimS] = tInternalStats[
"l"].update(tLim).get();
619 auto [tPPrM, tPPrS] = tInternalStats[
"p"].update(tPP).get();
623 auto fmt =
log().flags();
624 std::string formatStringMain =
"";
625 for (
auto &s : config.outputControl.consoleMainOutputFormatInternal)
626 formatStringMain += s;
627 log() << fmt::format(formatStringMain +
629 (config.outputControl.consoleOutputMode == 1
630 ?
"WallFlux {termYellow}{wallFlux:.6e}{termReset} CL,CD,AoA [{CLCur:.6e},{CDCur:.6e},{AOACur:.2e}]"s
636 fmt::arg(
"resRel", resRel.transpose()),
637 fmt::arg(
"wallFlux", eval.fluxWallSum.transpose()),
696 auto &fluxWall = eval.fluxWallSum;
697 auto &logErrVal = std::get<1>(logErr);
698#define DNDS_FILL_IN_LOG_ERR_VAL(v) FillLogValue(logErrVal, #v, v)
726 real CL{CLCur}, CD{CDCur}, AoA(AOACur);
730#undef DNDS_FILL_IN_LOG_ERR_VAL
732 std::get<0>(logErr)->WriteLine(std::get<1>(logErr), config.outputControl.nPrecisionLog);
734 FillLogValue(logErrVal,
"step", step);
736 eval.ConsoleOutputBndIntegrations();
737 eval.BndIntegrationLogWriteLine(
738 config.dataIOControl.getOutLogName() +
"_" + output_stamp,
741 tstartInternal = MPI_Wtime();
745 if (iter % config.outputControl.nDataOutInternal == 0)
747 eval.FixUMaxFilter(u);
749 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" + std::to_string(step) +
"_" + std::to_string(iter),
750 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" + std::to_string(step),
752 { return ode->getLatestRHS()[iCell](0); },
755 eval.PrintBCProfiles(config.dataIOControl.outPltName +
"_" + output_stamp +
"_" + std::to_string(step),
758 if ((iter % config.outputControl.nDataOutCInternal == 0) &&
759 !(config.outputControl.lazyCoverDataOutput && (iter % config.outputControl.nDataOutInternal == 0)))
761 eval.FixUMaxFilter(u);
763 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"C",
766 { return ode->getLatestRHS()[iCell](0); },
769 eval.PrintBCProfiles(config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"C",
772 if (iter % config.outputControl.nRestartOutInternal == 0)
774 config.restartState.iStep = step;
775 config.restartState.iStepInternal = iter;
776 PrintRestart(config.dataIOControl.getOutRestartName() +
"_" + output_stamp +
"_" + std::to_string(step) +
"_" + std::to_string(iter));
778 if ((iter % config.outputControl.nRestartOutCInternal == 0) &&
779 !(config.outputControl.lazyCoverDataOutput && (iter % config.outputControl.nRestartOutInternal == 0)))
781 config.restartState.iStep = step;
782 config.restartState.iStepInternal = iter;
783 PrintRestart(config.dataIOControl.getOutRestartName() +
"_" + output_stamp +
"_" +
"C");
785 if (iter >= config.implicitCFLControl.nCFLRampStart && iter <= config.implicitCFLControl.nCFLRampLength + config.implicitCFLControl.nCFLRampStart)
787 real inter =
real(iter - config.implicitCFLControl.nCFLRampStart) / config.implicitCFLControl.nCFLRampLength;
788 real logCFL = std::log(config.implicitCFLControl.CFL) + (std::log(config.implicitCFLControl.CFLRampEnd / config.implicitCFLControl.CFL) * inter);
789 CFLNow = std::exp(logCFL);
791 if (ifStop || iter > config.convergenceControl.nTimeStepInternal)
793 CFLNow = config.implicitCFLControl.CFL;
802 using namespace std::literals;
805 { vfv->BuildUDof(uu, nVars); };
807 { vfv->BuildURec(uu, nVars); };
808#define DNDS_EULER_SOLVER_GET_TEMP_UDOF(name) \
809 auto __p##name = uPool.getAllocInit(initUDOF); \
810 auto &name = *__p##name;
812 tSimu += curDtImplicit;
816 eval.EvaluateNorm(
res,
ode->getLatestRHS(), 1, config.convergenceControl.useVolWiseResidual);
817 if (stepCount == 0 && resBaseC.norm() == 0)
820 if (config.timeAverageControl.enabled)
823 eval.MeanValueCons2Prim(u, uTemp);
824 eval.TimeAverageAddition(uTemp, wAveraged, curDtImplicit, tAverage);
827 real CLCur{0.0}, CDCur{0.0}, AOACur{0.0};
829 if (step % config.outputControl.nConsoleCheck == 0)
831 double tWall = MPI_Wtime();
832 real telapsed = MPI_Wtime() - tstart;
833 bool useCollectiveTimer = config.outputControl.useCollectiveTimer;
841 tcomm = tInternalStats[
"c"].update(tcomm).getSum();
842 trhs = tInternalStats[
"r"].update(trhs).getSum();
843 trec = tInternalStats[
"v"].update(trec).getSum();
844 tLim = tInternalStats[
"l"].update(tLim).getSum();
848 auto format =
log().flags();
849 std::string formatStringMain =
"";
850 for (
auto &s : config.outputControl.consoleMainOutputFormat)
851 formatStringMain += s;
852 log() << fmt::format(formatStringMain +
854 (config.outputControl.consoleOutputMode == 1
855 ?
"WallFlux {termYellow}{wallFlux:.6e}{termReset}"s
860 fmt::arg(
"resRel", (
res.array() / (resBaseC.array() +
verySmallReal)).transpose()),
861 fmt::arg(
"wallFlux", eval.fluxWallSum.transpose()),
890 auto &fluxWall = eval.fluxWallSum;
891 auto &logErrVal = std::get<1>(logErr);
892 int iStep{-1}, iter{-1};
893#define DNDS_FILL_IN_LOG_ERR_VAL(v) FillLogValue(logErrVal, #v, v)
920 real CL{CLCur}, CD{CDCur}, AoA(AOACur);
924#undef DNDS_FILL_IN_LOG_ERR_VAL
925 std::get<0>(logErr)->WriteLine(std::get<1>(logErr), config.outputControl.nPrecisionLog);
927 eval.ConsoleOutputBndIntegrations();
928 eval.BndIntegrationLogWriteLine(
929 config.dataIOControl.getOutLogName() +
"_" + output_stamp,
932 tstart = MPI_Wtime();
934 for (
auto &s : tInternalStats)
937 if (step == nextStepOutC)
939 if (!(config.outputControl.lazyCoverDataOutput && (step == nextStepOut)))
941 eval.FixUMaxFilter(u);
943 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"C",
946 { return ode->getLatestRHS()[iCell](0); },
949 eval.PrintBCProfiles(config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"C",
952 nextStepOutC += config.outputControl.nDataOutC;
954 if (step == nextStepOut)
956 eval.FixUMaxFilter(u);
958 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" + std::to_string(step),
959 config.dataIOControl.outPltName +
"_" + output_stamp,
961 { return ode->getLatestRHS()[iCell](0); },
964 eval.PrintBCProfiles(config.dataIOControl.outPltName +
"_" + output_stamp +
"_" + std::to_string(step),
966 nextStepOut += config.outputControl.nDataOut;
968 if (step == nextStepOutAverageC)
970 if (!(config.outputControl.lazyCoverDataOutput && (step == nextStepOutAverage)))
973 eval.MeanValuePrim2Cons(wAveraged, uAveraged);
974 eval.FixUMaxFilter(uAveraged);
976 config.dataIOControl.outPltName +
"_TimeAveraged_" + output_stamp +
"_" +
"C",
979 { return ode->getLatestRHS()[iCell](0); },
982 PrintDataTimeAverage);
984 nextStepOutAverageC += config.outputControl.nTimeAverageOutC;
986 if (step == nextStepOutAverage)
989 eval.MeanValuePrim2Cons(wAveraged, uAveraged);
990 eval.FixUMaxFilter(uAveraged);
992 config.dataIOControl.outPltName +
"_TimeAveraged_" + output_stamp +
"_" + std::to_string(step),
993 config.dataIOControl.outPltName +
"_TimeAveraged_" + output_stamp,
995 { return ode->getLatestRHS()[iCell](0); },
998 PrintDataTimeAverage);
999 nextStepOutAverage += config.outputControl.nTimeAverageOut;
1001 if (step == nextStepRestartC)
1003 if (!(config.outputControl.lazyCoverDataOutput && (step == nextStepRestart)))
1005 config.restartState.iStep = step;
1006 config.restartState.iStepInternal = -1;
1007 PrintRestart(config.dataIOControl.getOutRestartName() +
"_" + output_stamp +
"_" +
"C");
1009 nextStepRestartC += config.outputControl.nRestartOutC;
1011 if (step == nextStepRestart)
1013 config.restartState.iStep = step;
1014 config.restartState.iStepInternal = -1;
1015 PrintRestart(config.dataIOControl.getOutRestartName() +
"_" + output_stamp +
"_" + std::to_string(step));
1016 nextStepRestart += config.outputControl.nRestartOut;
1020 eval.FixUMaxFilter(u);
1022 config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"t_" + std::to_string(nextTout),
1023 config.dataIOControl.outPltName +
"_" + output_stamp,
1025 { return ode->getLatestRHS()[iCell](0); },
1028 eval.PrintBCProfiles(config.dataIOControl.outPltName +
"_" + output_stamp +
"_" +
"t_" + std::to_string(nextTout),
1030 nextTout += config.outputControl.tDataOut;
1031 if (nextTout >= config.timeMarchControl.tEnd)
1032 nextTout = config.timeMarchControl.tEnd;
1034 if ((eval.settings.specialBuiltinInitializer == 2 ||
1035 eval.settings.specialBuiltinInitializer == 203) &&
1036 (step % config.outputControl.nConsoleCheck == 0))
1040 switch (eval.settings.specialBuiltinInitializer)
1057 Eigen::Vector<
real, -1> err1, errInf;
1058 eval.EvaluateRecNorm(
1059 err1, u, uRec, 1,
true,
1062 eval.EvaluateRecNorm(
1063 errInf, u, uRec, 1000,
true,
1069 log() <<
"=== Mean Error IV: [" << std::scientific
1070 << std::setprecision(config.outputControl.nPrecisionConsole + 4) << err1(0) <<
", "
1071 << err1(0) / vfv->GetGlobalVol() <<
", "
1073 <<
"]" << std::endl;
1076 if (config.implicitReconstructionControl.zeroGrads)
1077 uRec.setConstant(0.0), gradIsZero =
true;
1081 return tSimu >= config.timeMarchControl.tEnd;