30#include "../../CNumericsSIMD.hpp"
31#include "../../util.hpp"
32#include "../variables.hpp"
33#include "../../../numerics/CNumerics.hpp"
38template<
size_t nVar,
size_t nDim,
class GradientType>
40 const GradientType& gradient) {
41 auto avgGrad = gatherVariables<nVar,nDim>(iPoint, gradient);
42 auto grad_j = gatherVariables<nVar,nDim>(jPoint, gradient);
43 for (
size_t iVar = 0; iVar < nVar; ++iVar) {
44 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
45 avgGrad(iVar,iDim) *= 0.5;
46 avgGrad(iVar,iDim) += 0.5 * grad_j(iVar,iDim);
55template<
size_t nVar,
size_t nDim,
class PrimitiveType>
60 for (
size_t iVar = 0; iVar < nVar; ++iVar) {
61 Double corr = (
dot(avgGrad[iVar],vector_ij) -
V.j.all(iVar) +
V.i.all(iVar)) / dist2_ij;
62 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
63 avgGrad(iVar,iDim) -= corr * vector_ij(iDim);
72template<
size_t nVar,
size_t nDim>
77 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
78 velDiv += grad(iDim+1,iDim);
80 Double pTerm = 2.0/3.0 * viscosity * velDiv;
83 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
85 for (
size_t jDim = 0; jDim < nDim; ++jDim) {
86 tau(iDim,jDim) = viscosity * (grad(jDim+1,iDim) + grad(iDim+1,jDim));
88 tau(iDim,iDim) -= pTerm;
97template<
class PrimitiveType,
class MatrixType,
size_t nDim,
class... Ts>
99 const MatrixType& grad,
106 for (
size_t iVar = 0; iVar < nDim; ++iVar)
107 for (
size_t iDim = 0; iDim < nDim; ++iDim)
108 velgrad[iVar][iDim] = grad(iVar+1,iDim)[k];
112 V.eddyVisc()[k], turb_ke[k], rsm);
114 for (
size_t iDim = 0; iDim < nDim; ++iDim)
115 for (
size_t jDim = 0; jDim < nDim; ++jDim)
116 tau(iDim,jDim)[k] -=
V.density()[k] * rsm[iDim][jDim];
123template<
class MatrixType,
size_t nDim>
129 for (
size_t iDim = 0; iDim < nDim; ++iDim)
130 for (
size_t jDim = 0; jDim < nDim; ++jDim)
131 denom += grad(iDim+1,jDim) * grad(iDim+1,jDim);
133 const Double factor = 1 /
sqrt(fmax(denom,1e-10));
137 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
138 for (
size_t jDim = 0; jDim < nDim; ++jDim) {
139 qcr(iDim,jDim) = 0.0;
140 for (
size_t kDim = 0; kDim < nDim; ++kDim) {
141 Double O_ik = (grad(iDim+1,kDim) - grad(kDim+1,iDim)) * factor;
142 Double O_jk = (grad(jDim+1,kDim) - grad(kDim+1,jDim)) * factor;
143 qcr(iDim,jDim) += O_ik*tau(jDim,kDim) + O_jk*tau(iDim,kDim);
147 for (
size_t iDim = 0; iDim < nDim; ++iDim)
148 for (
size_t jDim = 0; jDim < nDim; ++jDim)
149 tau(iDim,jDim) -= turb_fraction * c_cr1 * qcr(iDim,jDim);
156template<
class Container,
size_t nDim>
158 const Container& tauWall,
165 Double isWall_i = tauWall_i > 0.0;
166 Double isWall_j = tauWall_j > 0.0;
168 Double isNormalEdge = isWall_i+isWall_j - 2*isWall_i*isWall_j;
171 Double tauWall_ij = (tauWall_i+tauWall_j) * isNormalEdge;
177 for (
size_t iDim = 0; iDim < nDim; ++iDim)
178 for (
size_t jDim = 0; jDim < nDim; ++jDim)
179 tau(iDim,jDim) *= scale;
185template<
size_t nVar,
size_t nDim,
class PrimitiveType>
189 Double viscosity =
V.laminarVisc() +
V.eddyVisc();
190 Double xi = viscosity / (
V.density() * dist_ij);
192 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
194 for (
size_t jDim = 0; jDim < nDim; ++jDim) {
195 jac(iDim,jDim+1) = (-1/3.0) * xi * normal(iDim) * normal(jDim);
197 jac(iDim,iDim+1) -= xi;
199 jac(iDim,0) = -dot<nDim>(&jac(iDim,1),
V.velocity());
201 jac(iDim,nDim+1) = 0.0;
209template<
size_t nVar,
size_t nDim,
class PrimitiveType>
216 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
218 flux(iDim+1) =
dot(tau[iDim], normal);
221 for (
size_t iDim = 0; iDim < nDim; ++iDim) {
222 auto viscWork = dot<nDim>(tau[iDim],
V.velocity());
223 flux(nDim+1) += normal(iDim) * (heatFlux(iDim) + viscWork);
A templated matrix/vector-like object.
Definition C2DContainer.hpp:374
static void ComputePerturbedRSM(size_t nDim, size_t uq_eigval_comp, bool uq_permute, su2double uq_delta_b, su2double uq_urlx, const Mat1 &velgrad, Scalar density, Scalar viscosity, Scalar turb_ke, Mat2 &MeanPerturbedRSM)
Perturb the Reynolds stress tensor based on parameters.
Definition CNumerics.hpp:581
A simple SIMD type relying on implicit vectorization, i.e. done by the compiler, explicitly vectorize...
Definition vectorization.hpp:89
@ Size
Definition vectorization.hpp:95
double passivedouble
Definition code_config.hpp:129
#define NEVERINLINE
Definition code_config.hpp:50
#define FORCEINLINE
Definition code_config.hpp:44
passivedouble su2double
Definition code_config.hpp:181
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
VectorDbl< nVar > viscousFlux(const PrimitiveType &V, const MatrixDbl< nDim > &tau, const VectorDbl< nDim > &heatFlux, const VectorDbl< nDim > &normal)
Viscous flux for compressible flows.
Definition common.hpp:210
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
MatrixDbl< nDim, nVar > stressTensorJacobian(const PrimitiveType &V, const VectorDbl< nDim > &normal, const Double &dist_ij)
Jacobian of the stress tensor (compressible flow).
Definition common.hpp:186
MatrixDbl< nVar, nDim > averageGradient(const Int &iPoint, const Int &jPoint, const GradientType &gradient)
Average gradients at i/j points.
Definition common.hpp:39
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
Double norm(const Vector< Double, nDim > &vector)
Vector norm.
Definition util.hpp:267
Vector< Double, nDim > tangentProjection(const Matrix< Double, nDim, nDim > &tensor, const Vector< Double, nDim > &unitVector)
Tangential projection.
Definition util.hpp:251
auto dot(ForwardIterator iterator, const T *ptr) -> typename std::decay< decltype(*ptr)>::type
Dot product.
Definition util.hpp:203
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
@ V
Menter k-w SST model with vorticity production terms.
constexpr passivedouble EPS
Error scale.
Definition option_structure.hpp:100