@@ -153,144 +153,3 @@ class CAvgGrad_Scalar : public CNumerics {
153153 return ResidualType<>(Flux, Jacobian_i, Jacobian_j);
154154 }
155155};
156-
157- /* !
158- * \class CAvgGrad_Scalar_NonCons
159- * \brief Template class for computing non-conservative viscous residual of scalar values
160- * \details This class serves as a template for the non-conservative scalar viscous
161- * residual classes. The general structure of a viscous residual calculation
162- * is the same for many different models, which leads to a lot of repeated code.
163- * By using the template design pattern, these sections of repeated code are
164- * moved to a shared base class, and the specifics of each model
165- * are implemented by derived classes. In order to add a new residual
166- * calculation for a viscous residual, extend this class and implement
167- * the pure virtual functions with model-specific behavior.
168- * \ingroup ViscDiscr
169- * \author C. Pederson, A. Bueno, and F. Palacios
170- */
171- template <class FlowIndices >
172- class CAvgGrad_Scalar_NonCons : public CNumerics {
173- protected:
174- enum : unsigned short {MAXNVAR = 8 };
175-
176- const FlowIndices idx; /* !< \brief Object to manage the access to the flow primitives. */
177- su2double Proj_Mean_GradScalarVar[MAXNVAR]; /* !< \brief Mean_gradScalarVar DOT normal, corrected if required. */
178- su2double proj_vector_ij = 0.0 ; /* !< \brief (Edge_Vector DOT normal)/|Edge_Vector|^2 */
179- su2double Flux_ij[MAXNVAR]; /* !< \brief Final result, diffusive flux/residual going from node i to j. */
180- su2double Flux_ji[MAXNVAR]; /* !< \brief Final result, diffusive flux/residual going from node j to i */
181- su2double* Jacobian_ii[MAXNVAR]; /* !< \brief Flux_ij Jacobian w.r.t. node i. */
182- su2double* Jacobian_ij[MAXNVAR]; /* !< \brief Flux_ij Jacobian w.r.t. node j. */
183- su2double* Jacobian_ji[MAXNVAR]; /* !< \brief Flux_ji Jacobian w.r.t. node i. */
184- su2double* Jacobian_jj[MAXNVAR]; /* !< \brief Flux_ji Jacobian w.r.t. node j. */
185- su2double JacobianBuffer[4 *MAXNVAR*MAXNVAR]; /* !< \brief Static storage for the two Jacobians. */
186-
187- const bool correct_gradient = false , incompressible = false ;
188-
189- /* !
190- * \brief A pure virtual function; Adds any extra variables to AD
191- */
192- virtual void ExtraADPreaccIn () = 0;
193-
194- /* !
195- * \brief Model-specific steps in the ComputeResidual method, derived classes
196- * should compute the non-conservative Fluxes (i/j) and Jacobians (i/j) inside this method.
197- * \param[out] val_residual_i - Pointer to the total residual at point i.
198- * \param[out] val_residual_j - Pointer to the total viscosity residual at point j.
199- * \param[out] val_Jacobian_ii - Jacobian of the numerical method at node i (implicit computation) from node i.
200- * \param[out] val_Jacobian_ij - Jacobian of the numerical method at node i (implicit computation) from node j.
201- * \param[out] val_Jacobian_ji - Jacobian of the numerical method at node j (implicit computation) from node i.
202- * \param[out] val_Jacobian_jj - Jacobian of the numerical method at node j (implicit computation) from node j.
203- * \param[in] config - Definition of the particular problem.
204- */
205- virtual void FinishResidualCalc (su2double *val_residual_i,
206- su2double *val_residual_j,
207- su2double **val_Jacobian_ii,
208- su2double **val_Jacobian_ij,
209- su2double **val_Jacobian_ji,
210- su2double **val_Jacobian_jj, const CConfig* config) = 0;
211-
212- public:
213- /* !
214- * \brief Constructor of the class.
215- * \param[in] val_nDim - Number of dimensions of the problem.
216- * \param[in] val_nVar - Number of variables of the problem.
217- * \param[in] correct_gradient - Whether to correct gradient for skewness.
218- * \param[in] config - Definition of the particular problem.
219- */
220- CAvgGrad_Scalar_NonCons (unsigned short val_nDim, unsigned short val_nVar, bool correct_grad,
221- const CConfig* config)
222- : CNumerics(val_nDim, val_nVar, config),
223- idx (val_nDim, config->GetnSpecies ()),
224- correct_gradient(correct_grad),
225- incompressible(config->GetKind_Regime () == ENUM_REGIME::INCOMPRESSIBLE) {
226- if (nVar > MAXNVAR) {
227- SU2_MPI::Error (" Static arrays are too small." , CURRENT_FUNCTION);
228- }
229- for (unsigned short iVar = 0 ; iVar < nVar; ++iVar) {
230- Jacobian_ii[iVar] = &JacobianBuffer[iVar * nVar + 0 * MAXNVAR * MAXNVAR];
231- Jacobian_ij[iVar] = &JacobianBuffer[iVar * nVar + 1 * MAXNVAR * MAXNVAR];
232- Jacobian_ji[iVar] = &JacobianBuffer[iVar * nVar + 2 * MAXNVAR * MAXNVAR];
233- Jacobian_jj[iVar] = &JacobianBuffer[iVar * nVar + 3 * MAXNVAR * MAXNVAR];
234- }
235-
236- /* --- Initialize the JacobianBuffer to zero. ---*/
237- for (unsigned short iVar = 0 ; iVar < 4 * MAXNVAR * MAXNVAR; iVar++) {
238- JacobianBuffer[iVar] = 0.0 ;
239- }
240- }
241-
242- /* !
243- * \brief Compute the viscous residual using an average of gradients without correction.
244- * \param[in] config - Definition of the particular problem.
245- * \return A lightweight const-view (read-only) of the residual/flux and Jacobians.
246- */
247- virtual void ComputeResidual (su2double *val_residual_i,
248- su2double *val_residual_j,
249- su2double **val_Jacobian_ii,
250- su2double **val_Jacobian_ij,
251- su2double **val_Jacobian_ji,
252- su2double **val_Jacobian_jj, const CConfig* config) final {
253- AD::StartPreacc ();
254- AD::SetPreaccIn (Coord_i, nDim);
255- AD::SetPreaccIn (Coord_j, nDim);
256- AD::SetPreaccIn (Normal, nDim);
257- AD::SetPreaccIn (ScalarVar_Grad_i, nVar, nDim);
258- AD::SetPreaccIn (ScalarVar_Grad_j, nVar, nDim);
259- if (correct_gradient) {
260- AD::SetPreaccIn (ScalarVar_i, nVar);
261- AD::SetPreaccIn (ScalarVar_j, nVar);
262- }
263- if (!std::is_same<FlowIndices, CNoFlowIndices>::value) {
264- AD::SetPreaccIn (V_i[idx.Density ()], V_i[idx.LaminarViscosity ()], V_i[idx.EddyViscosity ()]);
265- AD::SetPreaccIn (V_j[idx.Density ()], V_j[idx.LaminarViscosity ()], V_j[idx.EddyViscosity ()]);
266-
267- Density_i = V_i[idx.Density ()];
268- Density_j = V_j[idx.Density ()];
269- Laminar_Viscosity_i = V_i[idx.LaminarViscosity ()];
270- Laminar_Viscosity_j = V_j[idx.LaminarViscosity ()];
271- Eddy_Viscosity_i = V_i[idx.EddyViscosity ()];
272- Eddy_Viscosity_j = V_j[idx.EddyViscosity ()];
273- }
274-
275- ExtraADPreaccIn ();
276-
277- su2double ProjGradScalarVarNoCorr[MAXNVAR];
278- proj_vector_ij = ComputeProjectedGradient (nDim, nVar, Normal, Coord_i, Coord_j, ScalarVar_Grad_i, ScalarVar_Grad_j,
279- correct_gradient, ScalarVar_i, ScalarVar_j, ProjGradScalarVarNoCorr,
280- Proj_Mean_GradScalarVar);
281- FinishResidualCalc (val_residual_i, val_residual_j, val_Jacobian_ii, val_Jacobian_ij, val_Jacobian_ji, val_Jacobian_jj, config);
282- for (unsigned short iVar = 0 ; iVar < nVar; iVar++) {
283- val_residual_i[iVar]=Flux_ij[iVar];
284- val_residual_j[iVar]=Flux_ji[iVar];
285- val_Jacobian_ii[iVar] = Jacobian_ii[iVar];
286- val_Jacobian_ij[iVar] = Jacobian_ij[iVar];
287- val_Jacobian_ji[iVar] = Jacobian_ji[iVar];
288- val_Jacobian_jj[iVar] = Jacobian_jj[iVar];
289- }
290- AD::SetPreaccOut (Flux_ij, Flux_ji, nVar);
291- AD::EndPreacc ();
292-
293- // return (Flux_ij, Flux_ji, Jacobian_ii, Jacobian_ij, Jacobian_ji, Jacobian_jj);
294-
295- }
296- };
0 commit comments