30#include "../../CNumericsSIMD.hpp"
31#include "../../util.hpp"
32#include "../variables.hpp"
51 static constexpr size_t nDim = NDIM;
70template<
size_t NDIM,
class Derived>
73 static constexpr size_t nDim = NDIM;
96 gamma(config.GetGamma()),
97 gasConst(config.GetGas_ConstantND()),
100 useSA_QCR(config.GetSAParsedOptions().qcr2000),
101 wallFun(config.GetWall_Functions()),
102 uq(config.GetSSTParsedOptions().
uq),
113 template<
class PrimVarType,
size_t nVar>
117 const PrimVarType& avgV,
130 static_assert(PrimVarType::nVar <= Derived::nPrimVar);
134 const auto derived =
static_cast<const Derived*
>(
this);
136 const auto& solution =
static_cast<const CNSVariable&
>(solution_);
143 dist2_ij += mask / (
EPS*
EPS);
147 auto avgGrad = averageGradient<nPrimVarGrad,nDim>(iPoint, jPoint, gradient);
153 auto tau =
stressTensor(avgV.laminarVisc() + eddyVisc, avgGrad);
154 if(
useSA_QCR)
addQCR(avgGrad, tau, eddyVisc / (avgV.laminarVisc() + eddyVisc));
164 Double cond = derived->thermalConductivity(avgV);
166 for (
size_t iDim = 0; iDim <
nDim; ++iDim) {
167 heatFlux(iDim) = cond * avgGrad(0,iDim);
172 auto viscFlux = viscousFlux<nVar>(avgV, tau, heatFlux, unitNormal);
173 for (
size_t iVar = 0; iVar < nVar; ++iVar) {
174 viscFlux(iVar) *= area;
175 flux(iVar) -= viscFlux(iVar);
178 if (!implicit)
return;
183 auto dtau = stressTensorJacobian<nVar>(avgV, unitNormal, dist_ij);
186 auto dEdU = derived->energyJacobian(avgV, dtau, cond, area, dist_ij, iPoint, jPoint, solution);
189 for (
size_t iDim = 0; iDim <
nDim; ++iDim) {
190 for (
size_t iVar = 0; iVar < nVar; ++iVar) {
191 jac_i(iDim+1,iVar) -= area * dtau(iDim,iVar);
192 jac_j(iDim+1,iVar) += area * dtau(iDim,iVar);
195 for (
size_t iVar = 0; iVar < nVar; ++iVar) {
196 jac_i(
nDim+1,iVar) += dEdU(iVar);
197 jac_j(
nDim+1,iVar) -= dEdU(iVar);
200 Double proj = dot<nDim>(&viscFlux(1), avgV.velocity());
201 Double halfOnRho = 0.5/avgV.density();
202 jac_i(
nDim+1,0) += halfOnRho * proj;
203 jac_j(
nDim+1,0) += halfOnRho * proj;
204 for (
size_t iDim = 0; iDim <
nDim; ++iDim) {
205 jac_i(
nDim+1,iDim+1) -= halfOnRho * viscFlux(iDim+1);
206 jac_j(
nDim+1,iDim+1) -= halfOnRho * viscFlux(iDim+1);
213 template<
class PrimVarType,
class... Ts>
220 for (
size_t iVar = 0; iVar < PrimVarType::nVar; ++iVar) {
221 avgV.all(iVar) = 0.5 * (
V.i.all(iVar) +
V.j.all(iVar));
231 template<
class PrimVarType,
class... Ts>
235 const PrimVarType& avgV,
241 const auto vector_ij = distanceVector<nDim>(iPoint, jPoint, geometry.
nodes->
GetCoord());
244 viscousTerms(iEdge, iPoint, jPoint, avgV,
V, solution_, vector_ij, geometry, args...);
265 template<
class... Ts>
271 template<
class PrimitiveType>
279 template<
size_t nVar,
size_t nDim,
class PrimitiveType,
class... Ts>
282 const Double& thermalCond,
286 Double vel2 = 0.5 * squaredNorm<nDim>(
V.velocity());
288 Double RdTdrho = phi*vel2 -
V.pressure() /
pow(
V.density(),2);
291 for (
size_t iDim = 0; iDim <
nDim; ++iDim) {
292 contraction += dtau(iDim,0) *
V.velocity(iDim);
295 dEdU(0) = area * (condOnRd * RdTdrho - contraction);
296 for (
size_t iDim = 0; iDim <
nDim; ++iDim) {
297 dEdU(iDim+1) = area * (dtau(iDim,0) - condOnRd*phi*
V.velocity(iDim));
299 dEdU(
nDim+1) = area * condOnRd * phi;
321 template<
class... Ts>
327 template<
class PrimitiveType>
335 template<
size_t nVar,
size_t nDim,
class PrimitiveType,
class VariableType>
338 const Double& thermalCond,
343 const VariableType& solution)
const {
344 Double vel2 = squaredNorm<nDim>(
V.velocity());
346 for (
size_t iDim = 0; iDim <
nDim; ++iDim) {
347 contraction += dtau(iDim,0) *
V.velocity(iDim);
350 auto secVar_i = gatherVariables<nSecVar>(iPoint, solution.GetSecondary());
351 auto secVar_j = gatherVariables<nSecVar>(jPoint, solution.GetSecondary());
353 Double dTdrho_e = 0.5 * (secVar_i(2) + secVar_j(2));
354 Double dTde_rho = 0.5 * (secVar_i(3) + secVar_j(3)) /
V.density();
356 Double condOnDist = thermalCond / dist_ij;
357 Double dTdrho = dTdrho_e + dTde_rho*(vel2-
V.enthalpy()+
V.pressure()/
V.density());
360 dEdU(0) = area * (condOnDist * dTdrho - contraction);
361 for (
size_t iDim = 0; iDim <
nDim; ++iDim) {
362 dEdU(iDim+1) = area * (dtau(iDim,0) - condOnDist*dTde_rho*
V.velocity(iDim));
364 dEdU(
nDim+1) = area * condOnDist * dTde_rho;
simd::Array< su2double > Double
Define Double and Int SIMD types.
Definition CNumericsSIMD.hpp:36
A templated matrix/vector-like object.
Definition C2DContainer.hpp:374
Decorator class to add viscous fluxes (compressible flow).
Definition viscous_fluxes.hpp:71
const bool uq
Definition viscous_fluxes.hpp:82
const bool useSA_QCR
Definition viscous_fluxes.hpp:80
const bool uq_permute
Definition viscous_fluxes.hpp:83
const bool wallFun
Definition viscous_fluxes.hpp:81
void viscousTerms(const Int &iEdge, const Int &iPoint, const Int &jPoint, const CPair< PrimVarType > &V, Ts &... args) const
Definition viscous_fluxes.hpp:214
const su2double prandtlTurb
Definition viscous_fluxes.hpp:78
const su2double uq_delta_b
Definition viscous_fluxes.hpp:85
const CVariable * turbVars
Definition viscous_fluxes.hpp:88
const su2double gasConst
Definition viscous_fluxes.hpp:77
const size_t uq_eigval_comp
Definition viscous_fluxes.hpp:84
static constexpr size_t nPrimVarGrad
Definition viscous_fluxes.hpp:74
const su2double gamma
Definition viscous_fluxes.hpp:76
void viscousTerms(const Int &iEdge, const Int &iPoint, const Int &jPoint, const PrimVarType &avgV, const CPair< PrimVarType > &V, const CVariable &solution_, const VectorDbl< nDim > &vector_ij, const CGeometry &geometry, const CConfig &config, const Double &area, const VectorDbl< nDim > &unitNormal, bool implicit, VectorDbl< nVar > &flux, MatrixDbl< nVar > &jac_i, MatrixDbl< nVar > &jac_j) const
Add viscous contributions to flux and jacobians.
Definition viscous_fluxes.hpp:114
CCompressibleViscousFluxBase(const CConfig &config, int iMesh, const CVariable *turbVars_, Ts &...)
Constructor, initialize constants and booleans.
Definition viscous_fluxes.hpp:94
static constexpr size_t nDim
Definition viscous_fluxes.hpp:73
void viscousTerms(const Int &iEdge, const Int &iPoint, const Int &jPoint, const PrimVarType &avgV, const CPair< PrimVarType > &V, const CVariable &solution_, const CGeometry &geometry, Ts &... args) const
Definition viscous_fluxes.hpp:232
const bool correct
Definition viscous_fluxes.hpp:79
const su2double uq_urlx
Definition viscous_fluxes.hpp:86
Decorator class to add viscous fluxes (compressible flow, ideal gas).
Definition viscous_fluxes.hpp:254
Double thermalConductivity(const PrimitiveType &V) const
Compute the thermal conductivity.
Definition viscous_fluxes.hpp:272
CCompressibleViscousFlux(Ts &... args)
Constructor, initialize constants and booleans.
Definition viscous_fluxes.hpp:266
static constexpr size_t nPrimVar
Definition viscous_fluxes.hpp:256
VectorDbl< nVar > energyJacobian(const PrimitiveType &V, const MatrixDbl< nDim, nVar > &dtau, const Double &thermalCond, const Double &area, const Double &dist_ij, Ts &... args) const
Compute Jacobian of the energy flux, except the part due to the work of viscous forces.
Definition viscous_fluxes.hpp:280
Main class for defining the problem; basically this class reads the configuration file,...
Definition CConfig.hpp:64
su2double GetGradient_Primitive(unsigned long iPoint, unsigned long iVar, unsigned long iDim) const final
Get the value of the primitive variables gradient.
Definition CFlowVariable.hpp:147
Decorator class to add viscous fluxes (compressible flow, real gas).
Definition viscous_fluxes.hpp:311
VectorDbl< nVar > energyJacobian(const PrimitiveType &V, const MatrixDbl< nDim, nVar > &dtau, const Double &thermalCond, const Double &area, const Double &dist_ij, const Int &iPoint, const Int &jPoint, const VariableType &solution) const
Compute Jacobian of the energy flux, except the part due to the work of viscous forces.
Definition viscous_fluxes.hpp:336
static constexpr size_t nPrimVar
Definition viscous_fluxes.hpp:313
Double thermalConductivity(const PrimitiveType &V) const
Compute the thermal conductivity.
Definition viscous_fluxes.hpp:328
static constexpr size_t nSecVar
Definition viscous_fluxes.hpp:314
CGeneralCompressibleViscousFlux(Ts &... args)
Constructor, initialize constants and booleans.
Definition viscous_fluxes.hpp:322
Parent class for defining the geometry of the problem (complete geometry, multigrid agglomerated geom...
Definition CGeometry.hpp:75
CPoint * nodes
Node vector (dual grid information).
Definition CGeometry.hpp:253
Class for defining the variables of the compressible Navier-Stokes solver.
Definition CNSVariable.hpp:38
Numerics classes that accept a compile-time decorator should use this class template as a "do-nothing...
Definition viscous_fluxes.hpp:49
static constexpr size_t nDim
Definition viscous_fluxes.hpp:51
void viscousTerms(Ts &...) const
Empty method, real decorators should take as arguments whatever the decorated class can pass them to ...
Definition viscous_fluxes.hpp:62
static constexpr size_t nPrimVar
Definition viscous_fluxes.hpp:52
CNoViscousFlux(Ts &...)
Definition viscous_fluxes.hpp:55
Base class to define the interface.
Definition CNumericsSIMD.hpp:50
su2double GetCoord(unsigned long iPoint, unsigned long iDim) const
Get the coordinates dor the control volume.
Definition CPoint.hpp:158
Main class for defining the variables.
Definition CVariable.hpp:50
su2double GetSolution(unsigned long iPoint, unsigned long iVar) const
Get the solution.
Definition CVariable.hpp:248
A simple SIMD type relying on implicit vectorization, i.e. done by the compiler, explicitly vectorize...
Definition vectorization.hpp:89
#define FORCEINLINE
Definition code_config.hpp:44
passivedouble su2double
Definition code_config.hpp:181
Helper functions for viscous methods.
void addPerturbedRSM(const PrimitiveType &V, const MatrixType &grad, const Double &turb_ke, MatrixDbl< nDim, nDim > &tau, Ts... uq_args)
Add perturbed stress tensor.
Definition common.hpp:98
void addQCR(const MatrixType &grad, MatrixDbl< nDim > &tau, Double turb_fraction)
SA-QCR2000 modification of the stress tensor.
Definition common.hpp:124
void correctGradient(const PrimitiveType &V, const VectorDbl< nDim > &vector_ij, const Double &dist2_ij, MatrixDbl< nVar, nDim > &avgGrad)
Correct average gradient with the directional derivative to avoid decoupling.
Definition common.hpp:56
MatrixDbl< nDim > stressTensor(const Double &viscosity, const MatrixDbl< nVar, nDim > &grad)
Compute the stress tensor.
Definition common.hpp:73
void addTauWall(const Int &iPoint, const Int &jPoint, const Container &tauWall, const VectorDbl< nDim > &unitNormal, MatrixDbl< nDim > &tau)
Scale the stress tensor according to the target (from a wall function) magnitude in the tangential di...
Definition common.hpp:157
FORCEINLINE ARRAY_T sqrt(const ARRAY_T &x)
Definition special_vectorization.hpp:116
FORCEINLINE ARRAY_T pow(const ARRAY_T &a, const ARRAY_T &b)
Definition special_vectorization.hpp:179
auto squaredNorm(ForwardIterator iterator) -> typename std::decay< decltype(*iterator)>::type
Squared norm.
Definition util.hpp:231
Double gatherVariables(Int iPoint, const Container &vars, size_t iVar=0)
Gather a single variable, from column iVar (0 by default) of row iPoint of a 2D container,...
Definition util.hpp:277
const unsigned int MESH_0
Definition of the finest grid level.
Definition option_structure.hpp:88
@ V
Menter k-w SST model with vorticity production terms.
constexpr passivedouble EPS
Error scale.
Definition option_structure.hpp:100
Simple pair type for i/j variables.
Definition util.hpp:130