diff --git a/SU2_CFD/include/solvers/CTurbSolver.hpp b/SU2_CFD/include/solvers/CTurbSolver.hpp index 8040e53ad17f..c61fd4d91dc3 100644 --- a/SU2_CFD/include/solvers/CTurbSolver.hpp +++ b/SU2_CFD/include/solvers/CTurbSolver.hpp @@ -140,4 +140,11 @@ class CTurbSolver : public CScalarSolver { Inlet_TurbVars[val_marker][val_vertex][val_dim] = val_turb_var; } + /*! + * \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; }; 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 98e8c2538196..9a7e456860f1 100644 --- a/SU2_CFD/include/variables/CVariable.hpp +++ b/SU2_CFD/include/variables/CVariable.hpp @@ -137,6 +137,20 @@ class CVariable { 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; diff --git a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp index eada9828e352..9f26966b91b1 100644 --- a/SU2_CFD/src/solvers/CDiscAdjSolver.cpp +++ b/SU2_CFD/src/solvers/CDiscAdjSolver.cpp @@ -162,6 +162,7 @@ void CDiscAdjSolver::RegisterSolution(CGeometry *geometry, CConfig *config) { /*--- Boolean true indicates that an input is registered ---*/ direct_solver->GetNodes()->RegisterSolution(true); + /*--- Register quantities that are no solver variables but further inputs/outputs of the (outer) iteration. ---*/ direct_solver->RegisterSolutionExtra(true, config); if (time_n_needed) diff --git a/SU2_CFD/src/solvers/CTurbSolver.cpp b/SU2_CFD/src/solvers/CTurbSolver.cpp index 2340369c0c77..9d47a99f547b 100644 --- a/SU2_CFD/src/solvers/CTurbSolver.cpp +++ b/SU2_CFD/src/solvers/CTurbSolver.cpp @@ -236,3 +236,12 @@ void CTurbSolver::Impose_Fixed_Values(const CGeometry *geometry, const CConfig * } } + +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; +} diff --git a/SU2_CFD/src/variables/CNSVariable.cpp b/SU2_CFD/src/variables/CNSVariable.cpp index 5b67a0bdbb8e..a7dda66b982d 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; GetDensity reads from Solution (not Primitive) at index 0 ---*/ + AD::SetPreaccIn(Solution(iPoint, 0)); su2double uijuij = 0.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); +}