From 4963a999359f7fe668fa9dd5228e8088964626c6 Mon Sep 17 00:00:00 2001 From: Ole Burghardt Date: Wed, 19 Mar 2025 00:16:08 +0100 Subject: [PATCH 1/7] Resolve preaccumulation error in SetRoe_Dissipation_FD. --- SU2_CFD/src/variables/CNSVariable.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/SU2_CFD/src/variables/CNSVariable.cpp b/SU2_CFD/src/variables/CNSVariable.cpp index 5b67a0bdbb8e..271c66800043 100644 --- a/SU2_CFD/src/variables/CNSVariable.cpp +++ b/SU2_CFD/src/variables/CNSVariable.cpp @@ -114,6 +114,8 @@ void CNSVariable::SetRoe_Dissipation_FD(unsigned long iPoint, su2double val_wall AD::SetPreaccIn(Primitive(iPoint, indices.EddyViscosity())); /*--- Laminar viscosity --- */ AD::SetPreaccIn(Primitive(iPoint, indices.LaminarViscosity())); + /*--- Density ---*/ + AD::SetPreaccIn(Solution(iPoint, 0)); su2double uijuij = 0.0; From cc1de1500ac34f838633c2ea2c80c39ad666d233 Mon Sep 17 00:00:00 2001 From: Ole Burghardt Date: Wed, 19 Mar 2025 00:18:35 +0100 Subject: [PATCH 2/7] Add RegisterContainer for active vectors. --- SU2_CFD/include/variables/CVariable.hpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index 98e8c2538196..094448ce0e5a 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -133,10 +133,24 @@ class CVariable { END_SU2_OMP_FOR } - void RegisterContainer(bool input, su2activematrix& variable, su2matrix& ad_index) { + void RegisterContainer(bool input, su2activematrix& variable, su2matrix& ad_index) { RegisterContainer(input, variable, &ad_index); } + void RegisterContainer(bool input, su2activevector& variable, su2vector* ad_index = nullptr) { + const auto nPoint = variable.rows(); + SU2_OMP_FOR_STAT(roundUpDiv(nPoint,omp_get_num_threads())) + for (unsigned long iPoint = 0; iPoint < nPoint; ++iPoint) { + + if (input) AD::RegisterInput(variable(iPoint)); + else AD::RegisterOutput(variable(iPoint)); + + if (ad_index) AD::SetIndex((*ad_index)(iPoint), variable(iPoint)); + + } + END_SU2_OMP_FOR + } + public: /*--- Disable copy and assignment. ---*/ CVariable(const CVariable&) = delete; From 48e519fdafd3901ebe8020583130f4bc593b220c Mon Sep 17 00:00:00 2001 From: Ole Burghardt Date: Wed, 19 Mar 2025 11:57:07 +0100 Subject: [PATCH 3/7] Compatibility with develop. --- SU2_CFD/include/variables/CVariable.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index 094448ce0e5a..9a7e456860f1 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -133,11 +133,11 @@ class CVariable { END_SU2_OMP_FOR } - void RegisterContainer(bool input, su2activematrix& variable, su2matrix& ad_index) { + void RegisterContainer(bool input, su2activematrix& variable, su2matrix& ad_index) { RegisterContainer(input, variable, &ad_index); } - void RegisterContainer(bool input, su2activevector& variable, su2vector* ad_index = nullptr) { + void RegisterContainer(bool input, su2activevector& variable, su2vector* ad_index = nullptr) { const auto nPoint = variable.rows(); SU2_OMP_FOR_STAT(roundUpDiv(nPoint,omp_get_num_threads())) for (unsigned long iPoint = 0; iPoint < nPoint; ++iPoint) { From ddc7ab40d30ab970f7477003132772a83b852df7 Mon Sep 17 00:00:00 2001 From: Ole Burghardt Date: Wed, 19 Mar 2025 00:21:32 +0100 Subject: [PATCH 4/7] Add eddy viscosity as recording input/output of RANS solvers. --- SU2_CFD/include/solvers/CTurbSolver.hpp | 8 ++++++++ SU2_CFD/include/variables/CTurbVariable.hpp | 6 +++++- SU2_CFD/include/variables/CVariable.hpp | 5 +++++ SU2_CFD/src/solvers/CTurbSolver.cpp | 6 ++++++ SU2_CFD/src/variables/CTurbVariable.cpp | 4 ++++ 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/SU2_CFD/include/solvers/CTurbSolver.hpp b/SU2_CFD/include/solvers/CTurbSolver.hpp index 8040e53ad17f..c2facedf91af 100644 --- a/SU2_CFD/include/solvers/CTurbSolver.hpp +++ b/SU2_CFD/include/solvers/CTurbSolver.hpp @@ -140,4 +140,12 @@ class CTurbSolver : public CScalarSolver { Inlet_TurbVars[val_marker][val_vertex][val_dim] = val_turb_var; } + /*! + * \brief Register additional In- or Outputs. + * \param[in] input - Boolean whether In- or Output should be registered. + * \param[in] config - The particular config. + * \returns The number of extra variables. + */ + unsigned long RegisterSolutionExtra(bool input, const CConfig* config) final; + }; diff --git a/SU2_CFD/include/variables/CTurbVariable.hpp b/SU2_CFD/include/variables/CTurbVariable.hpp index 48f2087b2bf4..466815682864 100644 --- a/SU2_CFD/include/variables/CTurbVariable.hpp +++ b/SU2_CFD/include/variables/CTurbVariable.hpp @@ -100,5 +100,9 @@ class CTurbVariable : public CScalarVariable { */ inline void SetIntermittency(unsigned long iPoint, su2double val_intermittency) final { intermittency(iPoint) = val_intermittency; } + /*! + * \brief Register eddy viscosity (muT) as Input or Output of an AD recording. + * \param[in] input - Boolean whether In- or Output should be registered. + */ + void RegisterEddyViscosity(bool input); }; - diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index 9a7e456860f1..47e0ea327c37 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -2147,6 +2147,11 @@ class CVariable { */ inline virtual void RegisterFlowTraction(bool reset) { } + /*! + * \brief A virtual member. + */ + inline virtual void RegisterEddyViscosity(bool input) { } + /*! * \brief A virtual member. */ diff --git a/SU2_CFD/src/solvers/CTurbSolver.cpp b/SU2_CFD/src/solvers/CTurbSolver.cpp index 2340369c0c77..0f3da21f98ff 100644 --- a/SU2_CFD/src/solvers/CTurbSolver.cpp +++ b/SU2_CFD/src/solvers/CTurbSolver.cpp @@ -236,3 +236,9 @@ void CTurbSolver::Impose_Fixed_Values(const CGeometry *geometry, const CConfig * } } + +unsigned long CTurbSolver::RegisterSolutionExtra(bool input, const CConfig* config) { + + nodes->RegisterEddyViscosity(input); + return 0; +} diff --git a/SU2_CFD/src/variables/CTurbVariable.cpp b/SU2_CFD/src/variables/CTurbVariable.cpp index 46b686766a78..5703e3eadc52 100644 --- a/SU2_CFD/src/variables/CTurbVariable.cpp +++ b/SU2_CFD/src/variables/CTurbVariable.cpp @@ -36,3 +36,7 @@ CTurbVariable::CTurbVariable(unsigned long npoint, unsigned long ndim, unsigned intermittency.resize(nPoint) = su2double(1.0); } + +void CTurbVariable::RegisterEddyViscosity(bool input) { + RegisterContainer(input, muT); +} From f77a7734f51eefff8a204771dc1aee0601764326 Mon Sep 17 00:00:00 2001 From: Ole Burghardt Date: Fri, 21 Mar 2025 10:58:29 +0100 Subject: [PATCH 5/7] Move registration of muT for RANS to new RegisterComplementary. --- SU2_CFD/include/solvers/CSolver.hpp | 7 +++++++ SU2_CFD/include/solvers/CTurbSolver.hpp | 6 ++---- SU2_CFD/src/solvers/CDiscAdjSolver.cpp | 5 +++++ SU2_CFD/src/solvers/CTurbSolver.cpp | 4 ++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index 2ed78a78a9be..14382ec69bd8 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -3513,6 +3513,13 @@ class CSolver { */ inline virtual void RegisterOutput(CGeometry *geometry_container, CConfig *config) { } + /*! + * \brief A virtual member. + * \param[in] input - Boolean whether In- or Output should be registered. + * \param[in] config - The particular config. + */ + inline virtual void RegisterComplementary(bool input, const CConfig* config) { } + /*! * \brief A virtual member. * \param[in] geometry - The geometrical definition of the problem. diff --git a/SU2_CFD/include/solvers/CTurbSolver.hpp b/SU2_CFD/include/solvers/CTurbSolver.hpp index c2facedf91af..c08137bf17db 100644 --- a/SU2_CFD/include/solvers/CTurbSolver.hpp +++ b/SU2_CFD/include/solvers/CTurbSolver.hpp @@ -141,11 +141,9 @@ class CTurbSolver : public CScalarSolver { } /*! - * \brief Register additional In- or Outputs. + * \brief Register additional In- or Outputs for RANS. * \param[in] input - Boolean whether In- or Output should be registered. * \param[in] config - The particular config. - * \returns The number of extra variables. */ - unsigned long RegisterSolutionExtra(bool input, const CConfig* config) final; - + void RegisterComplementary(bool input, const CConfig* config) final; }; diff --git a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp index eada9828e352..a1b6e80cb66c 100644 --- a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp @@ -164,6 +164,9 @@ void CDiscAdjSolver::RegisterSolution(CGeometry *geometry, CConfig *config) { direct_solver->RegisterSolutionExtra(true, config); + /*--- Register quantities that are no solver variables but further inputs/outputs of the (outer) iteration. ---*/ + direct_solver->RegisterComplementary(true, config); + if (time_n_needed) direct_solver->GetNodes()->RegisterSolution_time_n(); @@ -300,6 +303,8 @@ void CDiscAdjSolver::RegisterOutput(CGeometry *geometry, CConfig *config) { direct_solver->GetNodes()->RegisterSolution(false); direct_solver->RegisterSolutionExtra(false, config); + + direct_solver->RegisterComplementary(false, config); } void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config, bool CrossTerm) { diff --git a/SU2_CFD/src/solvers/CTurbSolver.cpp b/SU2_CFD/src/solvers/CTurbSolver.cpp index 0f3da21f98ff..3f40607c4579 100644 --- a/SU2_CFD/src/solvers/CTurbSolver.cpp +++ b/SU2_CFD/src/solvers/CTurbSolver.cpp @@ -237,8 +237,8 @@ void CTurbSolver::Impose_Fixed_Values(const CGeometry *geometry, const CConfig * } -unsigned long CTurbSolver::RegisterSolutionExtra(bool input, const CConfig* config) { +void CTurbSolver::RegisterComplementary(bool input, const CConfig* config) { + /*--- Register muT as input/output of a RANS iteration. ---*/ nodes->RegisterEddyViscosity(input); - return 0; } From ff6c9552fdab2a2b133e12619d72114ca7dbe839 Mon Sep 17 00:00:00 2001 From: Ole Burghardt Date: Sat, 22 Mar 2025 00:49:14 +0100 Subject: [PATCH 6/7] Move registration of muT back to RegisterSolutionExtra, add comments. --- SU2_CFD/include/solvers/CSolver.hpp | 7 ------- SU2_CFD/include/solvers/CTurbSolver.hpp | 3 ++- SU2_CFD/include/variables/CVariable.hpp | 2 +- SU2_CFD/src/solvers/CDiscAdjSolver.cpp | 6 +----- SU2_CFD/src/solvers/CTurbSolver.cpp | 5 ++++- 5 files changed, 8 insertions(+), 15 deletions(-) diff --git a/SU2_CFD/include/solvers/CSolver.hpp b/SU2_CFD/include/solvers/CSolver.hpp index 14382ec69bd8..2ed78a78a9be 100644 --- a/SU2_CFD/include/solvers/CSolver.hpp +++ b/SU2_CFD/include/solvers/CSolver.hpp @@ -3513,13 +3513,6 @@ class CSolver { */ inline virtual void RegisterOutput(CGeometry *geometry_container, CConfig *config) { } - /*! - * \brief A virtual member. - * \param[in] input - Boolean whether In- or Output should be registered. - * \param[in] config - The particular config. - */ - inline virtual void RegisterComplementary(bool input, const CConfig* config) { } - /*! * \brief A virtual member. * \param[in] geometry - The geometrical definition of the problem. diff --git a/SU2_CFD/include/solvers/CTurbSolver.hpp b/SU2_CFD/include/solvers/CTurbSolver.hpp index c08137bf17db..c61fd4d91dc3 100644 --- a/SU2_CFD/include/solvers/CTurbSolver.hpp +++ b/SU2_CFD/include/solvers/CTurbSolver.hpp @@ -144,6 +144,7 @@ class CTurbSolver : public CScalarSolver { * \brief Register additional In- or Outputs for RANS. * \param[in] input - Boolean whether In- or Output should be registered. * \param[in] config - The particular config. + * \returns The number of extra variables. */ - void RegisterComplementary(bool input, const CConfig* config) final; + unsigned long RegisterSolutionExtra(bool input, const CConfig* config) final; }; diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index 47e0ea327c37..e5852c8fad70 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -2150,7 +2150,7 @@ class CVariable { /*! * \brief A virtual member. */ - inline virtual void RegisterEddyViscosity(bool input) { } + inline void RegisterEddyViscosity(bool input) { } /*! * \brief A virtual member. diff --git a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp index a1b6e80cb66c..9f26966b91b1 100644 --- a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp @@ -162,10 +162,8 @@ void CDiscAdjSolver::RegisterSolution(CGeometry *geometry, CConfig *config) { /*--- Boolean true indicates that an input is registered ---*/ direct_solver->GetNodes()->RegisterSolution(true); - direct_solver->RegisterSolutionExtra(true, config); - /*--- Register quantities that are no solver variables but further inputs/outputs of the (outer) iteration. ---*/ - direct_solver->RegisterComplementary(true, config); + direct_solver->RegisterSolutionExtra(true, config); if (time_n_needed) direct_solver->GetNodes()->RegisterSolution_time_n(); @@ -303,8 +301,6 @@ void CDiscAdjSolver::RegisterOutput(CGeometry *geometry, CConfig *config) { direct_solver->GetNodes()->RegisterSolution(false); direct_solver->RegisterSolutionExtra(false, config); - - direct_solver->RegisterComplementary(false, config); } void CDiscAdjSolver::ExtractAdjoint_Solution(CGeometry *geometry, CConfig *config, bool CrossTerm) { diff --git a/SU2_CFD/src/solvers/CTurbSolver.cpp b/SU2_CFD/src/solvers/CTurbSolver.cpp index 3f40607c4579..9d47a99f547b 100644 --- a/SU2_CFD/src/solvers/CTurbSolver.cpp +++ b/SU2_CFD/src/solvers/CTurbSolver.cpp @@ -237,8 +237,11 @@ void CTurbSolver::Impose_Fixed_Values(const CGeometry *geometry, const CConfig * } -void CTurbSolver::RegisterComplementary(bool input, const CConfig* config) { +unsigned long CTurbSolver::RegisterSolutionExtra(bool input, const CConfig* config) { /*--- Register muT as input/output of a RANS iteration. ---*/ nodes->RegisterEddyViscosity(input); + + /*--- We don't need to save adjoint values for muT. ---*/ + return 0; } From 614ce1ea9c16848fddf3b6fa35e5706fd9a0baa4 Mon Sep 17 00:00:00 2001 From: Ole Burghardt Date: Mon, 24 Mar 2025 00:55:07 +0100 Subject: [PATCH 7/7] Remove unnecessary function definition, add comment. --- SU2_CFD/include/variables/CVariable.hpp | 5 ----- SU2_CFD/src/variables/CNSVariable.cpp | 2 +- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/SU2_CFD/include/variables/CVariable.hpp b/SU2_CFD/include/variables/CVariable.hpp index e5852c8fad70..9a7e456860f1 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -2147,11 +2147,6 @@ class CVariable { */ inline virtual void RegisterFlowTraction(bool reset) { } - /*! - * \brief A virtual member. - */ - inline void RegisterEddyViscosity(bool input) { } - /*! * \brief A virtual member. */ diff --git a/SU2_CFD/src/variables/CNSVariable.cpp b/SU2_CFD/src/variables/CNSVariable.cpp index 271c66800043..a7dda66b982d 100644 --- a/SU2_CFD/src/variables/CNSVariable.cpp +++ b/SU2_CFD/src/variables/CNSVariable.cpp @@ -114,7 +114,7 @@ void CNSVariable::SetRoe_Dissipation_FD(unsigned long iPoint, su2double val_wall AD::SetPreaccIn(Primitive(iPoint, indices.EddyViscosity())); /*--- Laminar viscosity --- */ AD::SetPreaccIn(Primitive(iPoint, indices.LaminarViscosity())); - /*--- Density ---*/ + /*--- Density; GetDensity reads from Solution (not Primitive) at index 0 ---*/ AD::SetPreaccIn(Solution(iPoint, 0)); su2double uijuij = 0.0;