4444 * \ingroup ViscDiscr
4545 * \author C. Pederson, A. Bueno, and F. Palacios
4646 */
47+ template <class FlowIndices >
4748class CAvgGrad_Scalar : public CNumerics {
4849 protected:
49- su2double* Proj_Mean_GradScalarVar_Normal = nullptr ; /* !< \brief Mean_gradScalarVar DOT normal. */
50- su2double* Proj_Mean_GradScalarVar = nullptr ; /* !< \brief Mean_gradScalarVar DOT normal, corrected if required. */
51- su2double proj_vector_ij = 0.0 ; /* !< \brief (Edge_Vector DOT normal)/|Edge_Vector|^2 */
52- su2double* Flux = nullptr ; /* !< \brief Final result, diffusive flux/residual. */
53- su2double** Jacobian_i = nullptr ; /* !< \brief Flux Jacobian w.r.t. node i. */
54- su2double** Jacobian_j = nullptr ; /* !< \brief Flux Jacobian w.r.t. node j. */
50+ enum : unsigned short {MAXNVAR = 8 };
51+
52+ const FlowIndices idx; /* !< \brief Object to manage the access to the flow primitives. */
53+ su2double Proj_Mean_GradScalarVar[MAXNVAR]; /* !< \brief Mean_gradScalarVar DOT normal, corrected if required. */
54+ su2double proj_vector_ij = 0.0 ; /* !< \brief (Edge_Vector DOT normal)/|Edge_Vector|^2 */
55+ su2double Flux[MAXNVAR]; /* !< \brief Final result, diffusive flux/residual. */
56+ su2double* Jacobian_i[MAXNVAR]; /* !< \brief Flux Jacobian w.r.t. node i. */
57+ su2double* Jacobian_j[MAXNVAR]; /* !< \brief Flux Jacobian w.r.t. node j. */
58+ su2double JacobianBuffer[2 *MAXNVAR*MAXNVAR];/* !< \brief Static storage for the two Jacobians. */
5559
5660 const bool correct_gradient = false , implicit = false , incompressible = false ;
5761
@@ -75,17 +79,59 @@ class CAvgGrad_Scalar : public CNumerics {
7579 * \param[in] correct_gradient - Whether to correct gradient for skewness.
7680 * \param[in] config - Definition of the particular problem.
7781 */
78- CAvgGrad_Scalar (unsigned short val_nDim, unsigned short val_nVar, bool correct_gradient, const CConfig* config);
79-
80- /* !
81- * \brief Destructor of the class.
82- */
83- ~CAvgGrad_Scalar (void ) override ;
82+ CAvgGrad_Scalar (unsigned short val_nDim, unsigned short val_nVar, bool correct_grad,
83+ const CConfig* config)
84+ : CNumerics(val_nDim, val_nVar, config),
85+ idx (val_nDim, config->GetnSpecies ()),
86+ correct_gradient(correct_grad),
87+ implicit(config->GetKind_TimeIntScheme_Turb () == EULER_IMPLICIT),
88+ incompressible(config->GetKind_Regime () == ENUM_REGIME::INCOMPRESSIBLE) {
89+ if (nVar > MAXNVAR) {
90+ SU2_MPI::Error (" Static arrays are too small." , CURRENT_FUNCTION);
91+ }
92+ for (unsigned short iVar = 0 ; iVar < nVar; iVar++) {
93+ Jacobian_i[iVar] = &JacobianBuffer[iVar * nVar];
94+ Jacobian_j[iVar] = &JacobianBuffer[iVar * nVar + MAXNVAR * MAXNVAR];
95+ }
96+ }
8497
8598 /* !
8699 * \brief Compute the viscous residual using an average of gradients without correction.
87100 * \param[in] config - Definition of the particular problem.
88101 * \return A lightweight const-view (read-only) of the residual/flux and Jacobians.
89102 */
90- ResidualType<> ComputeResidual (const CConfig* config) override ;
103+ ResidualType<> ComputeResidual (const CConfig* config) final {
104+ AD::StartPreacc ();
105+ AD::SetPreaccIn (Coord_i, nDim);
106+ AD::SetPreaccIn (Coord_j, nDim);
107+ AD::SetPreaccIn (Normal, nDim);
108+ AD::SetPreaccIn (ScalarVar_Grad_i, nVar, nDim);
109+ AD::SetPreaccIn (ScalarVar_Grad_j, nVar, nDim);
110+ if (correct_gradient) {
111+ AD::SetPreaccIn (ScalarVar_i, nVar);
112+ AD::SetPreaccIn (ScalarVar_j, nVar);
113+ }
114+ AD::SetPreaccIn (V_i[idx.Density ()], V_i[idx.LaminarViscosity ()], V_i[idx.EddyViscosity ()]);
115+ AD::SetPreaccIn (V_j[idx.Density ()], V_j[idx.LaminarViscosity ()], V_j[idx.EddyViscosity ()]);
116+
117+ Density_i = V_i[idx.Density ()];
118+ Density_j = V_j[idx.Density ()];
119+ Laminar_Viscosity_i = V_i[idx.LaminarViscosity ()];
120+ Laminar_Viscosity_j = V_j[idx.LaminarViscosity ()];
121+ Eddy_Viscosity_i = V_i[idx.EddyViscosity ()];
122+ Eddy_Viscosity_j = V_j[idx.EddyViscosity ()];
123+
124+ ExtraADPreaccIn ();
125+
126+ su2double ProjGradScalarVarNoCorr[MAXNVAR];
127+ proj_vector_ij = ComputeProjectedGradient (nDim, nVar, Normal, Coord_i, Coord_j, ScalarVar_Grad_i, ScalarVar_Grad_j,
128+ correct_gradient, ScalarVar_i, ScalarVar_j, ProjGradScalarVarNoCorr,
129+ Proj_Mean_GradScalarVar);
130+ FinishResidualCalc (config);
131+
132+ AD::SetPreaccOut (Flux, nVar);
133+ AD::EndPreacc ();
134+
135+ return ResidualType<>(Flux, Jacobian_i, Jacobian_j);
136+ }
91137};
0 commit comments