Skip to content

Commit 7f4bda7

Browse files
authored
Merge branch 'develop' into dev_nemo_muscl_fix
2 parents 667308d + e3fa7d9 commit 7f4bda7

16 files changed

Lines changed: 270 additions & 293 deletions

Common/src/CConfig.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4332,6 +4332,11 @@ void CConfig::SetPostprocessing(SU2_COMPONENT val_software, unsigned short val_i
43324332
}
43334333
}
43344334

4335+
if(Kind_TimeIntScheme_Turb != EULER_IMPLICIT &&
4336+
Kind_TimeIntScheme_Turb != EULER_EXPLICIT){
4337+
SU2_MPI::Error("Only TIME_DISCRE_TURB = EULER_IMPLICIT, EULER_EXPLICIT have been implemented.", CURRENT_FUNCTION);
4338+
}
4339+
43354340
if (nIntCoeffs == 0) {
43364341
nIntCoeffs = 2;
43374342
Int_Coeffs = new su2double[2]; Int_Coeffs[0] = 0.25; Int_Coeffs[1] = 0.5;

SU2_CFD/include/solvers/CFVMFlowSolverBase.hpp

Lines changed: 10 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -775,13 +775,8 @@ class CFVMFlowSolverBase : public CSolver {
775775
const su2double RK_FuncCoeff[] = {1.0/6.0, 1.0/3.0, 1.0/3.0, 1.0/6.0};
776776
const su2double RK_TimeCoeff[] = {0.5, 0.5, 1.0, 1.0};
777777

778-
/*--- Set shared residual variables to 0 and declare
779-
* local ones for current thread to work on. ---*/
780-
781-
SetResToZero();
782-
778+
/*--- Local residual variables for current thread ---*/
783779
su2double resMax[MAXNVAR] = {0.0}, resRMS[MAXNVAR] = {0.0};
784-
const su2double* coordMax[MAXNVAR] = {nullptr};
785780
unsigned long idxMax[MAXNVAR] = {0};
786781

787782
/*--- Update the solution and residuals ---*/
@@ -832,23 +827,13 @@ class CFVMFlowSolverBase : public CSolver {
832827
}
833828

834829
/*--- Update residual information for current thread. ---*/
835-
resRMS[iVar] += Res*Res;
836-
if (fabs(Res) > resMax[iVar]) {
837-
resMax[iVar] = fabs(Res);
838-
idxMax[iVar] = iPoint;
839-
coordMax[iVar] = geometry->nodes->GetCoord(iPoint);
840-
}
830+
ResidualReductions_PerThread(iPoint, iVar, Res, resRMS, resMax, idxMax);
841831
}
842832
}
843833
END_SU2_OMP_FOR
844834
/*--- Reduce residual information over all threads in this rank. ---*/
845-
SU2_OMP_CRITICAL
846-
for (unsigned short iVar = 0; iVar < nVar; iVar++) {
847-
Residual_RMS[iVar] += resRMS[iVar];
848-
AddRes_Max(iVar, resMax[iVar], geometry->nodes->GetGlobalIndex(idxMax[iVar]), coordMax[iVar]);
849-
}
850-
END_SU2_OMP_CRITICAL
851-
SU2_OMP_BARRIER
835+
ResidualReductions_FromAllThreads(geometry, config, resRMS, resMax, idxMax);
836+
852837
}
853838

854839
/*--- MPI solution ---*/
@@ -857,9 +842,6 @@ class CFVMFlowSolverBase : public CSolver {
857842
CompleteComms(geometry, config, SOLUTION);
858843

859844
if (!adjoint) {
860-
/*--- Compute the root mean square residual ---*/
861-
SetResidual_RMS(geometry, config);
862-
863845
/*--- For verification cases, compute the global error metrics. ---*/
864846
ComputeVerificationError(geometry, config);
865847
}
@@ -893,12 +875,8 @@ class CFVMFlowSolverBase : public CSolver {
893875

894876
const bool implicit = (config->GetKind_TimeIntScheme_Flow() == EULER_IMPLICIT);
895877

896-
/*--- Set shared residual variables to 0 and declare local ones for current thread to work on. ---*/
897-
898-
SetResToZero();
899-
878+
/*--- Local residual variables for current thread ---*/
900879
su2double resMax[MAXNVAR] = {0.0}, resRMS[MAXNVAR] = {0.0};
901-
const su2double* coordMax[MAXNVAR] = {nullptr};
902880
unsigned long idxMax[MAXNVAR] = {0};
903881

904882
/*--- Add pseudotime term to Jacobian. ---*/
@@ -948,26 +926,15 @@ class CFVMFlowSolverBase : public CSolver {
948926
LinSysRes[total_index] = - (LinSysRes[total_index] + local_Res_TruncError[iVar]);
949927
LinSysSol[total_index] = 0.0;
950928

951-
su2double Res = fabs(LinSysRes[total_index]);
952-
resRMS[iVar] += Res*Res;
953-
if (Res > resMax[iVar]) {
954-
resMax[iVar] = Res;
955-
idxMax[iVar] = iPoint;
956-
coordMax[iVar] = geometry->nodes->GetCoord(iPoint);
957-
}
929+
/*--- "Add" residual at (iPoint,iVar) to local residual variables. ---*/
930+
ResidualReductions_PerThread(iPoint, iVar, LinSysRes[total_index], resRMS, resMax, idxMax);
958931
}
959932
}
960933
END_SU2_OMP_FOR
961-
SU2_OMP_CRITICAL
962-
for (unsigned short iVar = 0; iVar < nVar; iVar++) {
963-
Residual_RMS[iVar] += resRMS[iVar];
964-
AddRes_Max(iVar, resMax[iVar], geometry->nodes->GetGlobalIndex(idxMax[iVar]), coordMax[iVar]);
965-
}
966-
END_SU2_OMP_CRITICAL
967-
SU2_OMP_BARRIER
968934

969-
/*--- Compute the root mean square residual ---*/
970-
SetResidual_RMS(geometry, config);
935+
/*--- "Add" residuals from all threads to global residual variables. ---*/
936+
ResidualReductions_FromAllThreads(geometry, config, resRMS, resMax, idxMax);
937+
971938
}
972939

973940
/*!

SU2_CFD/include/solvers/CScalarSolver.hpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,14 @@ class CScalarSolver : public CSolver {
259259
*/
260260
void CompleteImplicitIteration(CGeometry* geometry, CSolver** solver_container, CConfig* config) final;
261261

262+
/*!
263+
* \brief Update the solution using the explicit Euler scheme.
264+
* \param[in] geometry - Geometrical definition of the problem.
265+
* \param[in] solver_container - Container vector with all the solutions.
266+
* \param[in] config - Definition of the particular problem.
267+
*/
268+
void ExplicitEuler_Iteration(CGeometry* geometry, CSolver** solver_container, CConfig* config) final;
269+
262270
/*!
263271
* \brief Update the solution using an implicit solver.
264272
* \param[in] geometry - Geometrical definition of the problem.
@@ -287,7 +295,8 @@ class CScalarSolver : public CSolver {
287295
* \param[in] val_iter - Current external iteration number.
288296
* \param[in] val_update_geo - Flag for updating coords and grid velocity.
289297
*/
290-
virtual void LoadRestart(CGeometry** geometry, CSolver*** solver, CConfig* config, int val_iter, bool val_update_geo) override = 0;
298+
void LoadRestart(CGeometry** geometry, CSolver*** solver, CConfig* config, int val_iter,
299+
bool val_update_geo) override = 0;
291300

292301
/*!
293302
* \brief Scalar solvers support OpenMP+MPI.

SU2_CFD/include/solvers/CScalarSolver.inl

Lines changed: 43 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ CScalarSolver<VariableType>::~CScalarSolver() {
7979

8080
template <class VariableType>
8181
void CScalarSolver<VariableType>::Upwind_Residual(CGeometry* geometry, CSolver** solver_container,
82-
CNumerics** numerics_container, CConfig* config, unsigned short iMesh) {
82+
CNumerics** numerics_container, CConfig* config,
83+
unsigned short iMesh) {
8384
const bool implicit = (config->GetKind_TimeIntScheme() == EULER_IMPLICIT);
8485
const bool muscl = config->GetMUSCL_Turb();
8586
const bool limiter = (config->GetKind_SlopeLimit_Turb() != NO_LIMITER);
@@ -256,7 +257,7 @@ void CScalarSolver<VariableType>::SumEdgeFluxes(CGeometry* geometry) {
256257

257258
template <class VariableType>
258259
void CScalarSolver<VariableType>::BC_Periodic(CGeometry* geometry, CSolver** solver_container, CNumerics* numerics,
259-
CConfig* config) {
260+
CConfig* config) {
260261
/*--- Complete residuals for periodic boundary conditions. We loop over
261262
the periodic BCs in matching pairs so that, in the event that there are
262263
adjacent periodic markers, the repeated points will have their residuals
@@ -271,7 +272,7 @@ void CScalarSolver<VariableType>::BC_Periodic(CGeometry* geometry, CSolver** sol
271272

272273
template <class VariableType>
273274
void CScalarSolver<VariableType>::PrepareImplicitIteration(CGeometry* geometry, CSolver** solver_container,
274-
CConfig* config) {
275+
CConfig* config) {
275276
const auto flowNodes = solver_container[FLOW_SOL]->GetNodes();
276277

277278
/*--- Set shared residual variables to 0 and declare
@@ -280,7 +281,6 @@ void CScalarSolver<VariableType>::PrepareImplicitIteration(CGeometry* geometry,
280281
SetResToZero();
281282

282283
su2double resMax[MAXNVAR] = {0.0}, resRMS[MAXNVAR] = {0.0};
283-
const su2double* coordMax[MAXNVAR] = {nullptr};
284284
unsigned long idxMax[MAXNVAR] = {0};
285285

286286
/*--- Build implicit system ---*/
@@ -308,31 +308,19 @@ void CScalarSolver<VariableType>::PrepareImplicitIteration(CGeometry* geometry,
308308
LinSysRes[total_index] = -LinSysRes[total_index];
309309
LinSysSol[total_index] = 0.0;
310310

311-
su2double Res = fabs(LinSysRes[total_index]);
312-
resRMS[iVar] += Res * Res;
313-
if (Res > resMax[iVar]) {
314-
resMax[iVar] = Res;
315-
idxMax[iVar] = iPoint;
316-
coordMax[iVar] = geometry->nodes->GetCoord(iPoint);
317-
}
311+
/*--- "Add" residual at (iPoint,iVar) to local residual variables. ---*/
312+
ResidualReductions_PerThread(iPoint, iVar, LinSysRes[total_index], resRMS, resMax, idxMax);
318313
}
319314
}
320315
END_SU2_OMP_FOR
321-
SU2_OMP_CRITICAL
322-
for (unsigned short iVar = 0; iVar < nVar; iVar++) {
323-
Residual_RMS[iVar] += resRMS[iVar];
324-
AddRes_Max(iVar, resMax[iVar], geometry->nodes->GetGlobalIndex(idxMax[iVar]), coordMax[iVar]);
325-
}
326-
END_SU2_OMP_CRITICAL
327-
SU2_OMP_BARRIER
328316

329-
/*--- Compute the root mean square residual ---*/
330-
SetResidual_RMS(geometry, config);
317+
/*--- "Add" residuals from all threads to global residual variables. ---*/
318+
ResidualReductions_FromAllThreads(geometry, config, resRMS, resMax, idxMax);
331319
}
332320

333321
template <class VariableType>
334322
void CScalarSolver<VariableType>::CompleteImplicitIteration(CGeometry* geometry, CSolver** solver_container,
335-
CConfig* config) {
323+
CConfig* config) {
336324
const bool compressible = (config->GetKind_Regime() == ENUM_REGIME::COMPRESSIBLE);
337325

338326
const auto flowNodes = solver_container[FLOW_SOL]->GetNodes();
@@ -380,7 +368,7 @@ void CScalarSolver<VariableType>::CompleteImplicitIteration(CGeometry* geometry,
380368

381369
template <class VariableType>
382370
void CScalarSolver<VariableType>::ImplicitEuler_Iteration(CGeometry* geometry, CSolver** solver_container,
383-
CConfig* config) {
371+
CConfig* config) {
384372
PrepareImplicitIteration(geometry, solver_container, config);
385373

386374
/*--- Solve or smooth the linear system. ---*/
@@ -404,10 +392,41 @@ void CScalarSolver<VariableType>::ImplicitEuler_Iteration(CGeometry* geometry, C
404392
CompleteImplicitIteration(geometry, solver_container, config);
405393
}
406394

395+
template <class VariableType>
396+
void CScalarSolver<VariableType>::ExplicitEuler_Iteration(CGeometry* geometry, CSolver** solver_container,
397+
CConfig* config) {
398+
const auto flowNodes = solver_container[FLOW_SOL]->GetNodes();
399+
400+
/*--- Local residual variables for current thread ---*/
401+
su2double resMax[MAXNVAR] = {0.0}, resRMS[MAXNVAR] = {0.0};
402+
unsigned long idxMax[MAXNVAR] = {0};
403+
404+
SU2_OMP_FOR_STAT(omp_chunk_size)
405+
for (unsigned long iPoint = 0; iPoint < nPointDomain; iPoint++) {
406+
const su2double dt = nodes->GetLocalCFL(iPoint) / flowNodes->GetLocalCFL(iPoint) * flowNodes->GetDelta_Time(iPoint);
407+
nodes->SetDelta_Time(iPoint, dt);
408+
const su2double Vol = geometry->nodes->GetVolume(iPoint) + geometry->nodes->GetPeriodicVolume(iPoint);
409+
410+
for (auto iVar = 0u; iVar < nVar; iVar++) {
411+
/*--- "Add" residual at (iPoint,iVar) to local residual variables. ---*/
412+
ResidualReductions_PerThread(iPoint, iVar, LinSysRes(iPoint, iVar), resRMS, resMax, idxMax);
413+
/*--- Explicit Euler step: ---*/
414+
LinSysSol(iPoint, iVar) = -dt / Vol * LinSysRes(iPoint, iVar);
415+
}
416+
}
417+
END_SU2_OMP_FOR
418+
419+
/*--- "Add" residuals from all threads to global residual variables. ---*/
420+
ResidualReductions_FromAllThreads(geometry, config, resRMS, resMax, idxMax);
421+
422+
/*--- Use LinSysSol for solution update. ---*/
423+
CompleteImplicitIteration(geometry, solver_container, config);
424+
}
425+
407426
template <class VariableType>
408427
void CScalarSolver<VariableType>::SetResidual_DualTime(CGeometry* geometry, CSolver** solver_container, CConfig* config,
409-
unsigned short iRKStep, unsigned short iMesh,
410-
unsigned short RunTime_EqSystem) {
428+
unsigned short iRKStep, unsigned short iMesh,
429+
unsigned short RunTime_EqSystem) {
411430
const bool implicit = (config->GetKind_TimeIntScheme() == EULER_IMPLICIT);
412431
const bool first_order = (config->GetTime_Marching() == TIME_MARCHING::DT_STEPPING_1ST);
413432
const bool second_order = (config->GetTime_Marching() == TIME_MARCHING::DT_STEPPING_2ND);

0 commit comments

Comments
 (0)