92 using Scalar =
typename Mat::Scalar;
97 for (
int j = 0; j <
M; ++j) mat(j, j) = 1;
100 for (
int j = 0; j <
M; ++j) {
103 Scalar valMax = fabs(aug(j, j));
104 for (
int i = j + 1; i <
M; ++i) {
105 Scalar val = fabs(aug(i, j));
114 for (
int k = j; k <
M; ++k) std::swap(aug(j, k), aug(jj, k));
115 for (
int k = 0; k <
M; ++k) std::swap(mat(j, k), mat(jj, k));
120 for (
int i = 0; i <
M; ++i) {
121 if (i == j)
continue;
122 valMax = aug(i, j) / aug(j, j);
123 for (
int k = j; k <
M; ++k) aug(i, k) -= valMax * aug(j, k);
124 for (
int k = 0; k <
M; ++k) mat(i, k) -= valMax * mat(j, k);
127 valMax = 1.0 / aug(j, j);
128 for (
int k = j; k <
M; ++k) aug(j, k) *= valMax;
129 for (
int k = 0; k <
M; ++k) mat(j, k) *= valMax;
168 template <
class Mat,
class Vec,
class W>
169 static void tred2(Mat&
V, Vec& d,
W& e,
int n) {
170 using Scalar =
typename std::decay<
decltype(e[0])>::type;
174 for (j = 0; j < n; j++) {
180 for (i = n - 1; i > 0; i--) {
185 for (k = 0; k < i; k++) {
186 scale = scale + fabs(d[k]);
190 for (j = 0; j < i; j++) {
198 for (k = 0; k < i; k++) {
210 for (j = 0; j < i; j++) {
216 for (j = 0; j < i; j++) {
219 g = e[j] +
V[j][j] * f;
220 for (k = j + 1; k <= i - 1; k++) {
227 for (j = 0; j < i; j++) {
232 for (j = 0; j < i; j++) {
235 for (j = 0; j < i; j++) {
238 for (k = j; k <= i - 1; k++) {
239 V[k][j] -= (f * e[k] + g * d[k]);
250 for (i = 0; i < n - 1; i++) {
251 V[n - 1][i] =
V[i][i];
255 for (k = 0; k <= i; k++) {
256 d[k] =
V[k][i + 1] / h;
258 for (j = 0; j <= i; j++) {
260 for (k = 0; k <= i; k++) {
261 g +=
V[k][i + 1] *
V[k][j];
263 for (k = 0; k <= i; k++) {
268 for (k = 0; k <= i; k++) {
272 for (j = 0; j < n; j++) {
276 V[n - 1][n - 1] = 1.0;
315 template <
class Mat,
class Vec,
class W>
316 static void tql2(Mat&
V, Vec& d,
W& e,
int n) {
317 using Scalar =
typename std::decay<
decltype(e[0])>::type;
320 for (i = 1; i < n; i++) {
328 for (l = 0; l < n; l++) {
331 tst1 = max(tst1, (fabs(d[l]) + fabs(e[l])));
334 if (fabs(e[m]) <= eps * tst1) {
351 Scalar p = (d[l + 1] - g) / (2.0 * e[l]);
356 d[l] = e[l] / (p + r);
357 d[l + 1] = e[l] * (p + r);
360 for (i = l + 2; i < n; i++) {
374 for (i = m - 1; i >= l; i--) {
380 r =
sqrt(p * p + e[i] * e[i]);
384 p = c * d[i] - s * g;
385 d[i + 1] = h + s * (c * g + s * d[i]);
389 for (k = 0; k < n; k++) {
391 V[k][i + 1] = s *
V[k][i] + c * h;
392 V[k][i] = c *
V[k][i] - s * h;
395 p = -s * s2 * c3 * el1 * e[l] / dl1;
401 }
while (fabs(e[l]) > eps * tst1);
409 for (i = 0; i < n - 1; i++) {
412 for (j = i + 1; j < n; j++) {
421 for (j = 0; j < n; j++) {
438 template <
class Mat,
class Vec,
class W>
440 for (
int iDim = 0; iDim < n; iDim++) {
442 for (
int jDim = 0; jDim < n; jDim++) {
443 Eig_Vec[iDim][jDim] = A_ij[iDim][jDim];
446 tred2(Eig_Vec, Eig_Val, e, n);
447 tql2(Eig_Vec, Eig_Val, e, n);
457 template <
class Mat,
class Vec>
459 for (
int i = 0; i < n; i++) {
460 for (
int j = 0; j < n; j++) {
462 for (
int k = 0; k < n; k++) A_ij[i][j] += Eig_Vec[i][k] * Eig_Val[k] * Eig_Vec[j][k];
475 template <
class Vec,
class Scalar = su2
double>
476 static void tdma(
const Vec& lower,
const Vec&
main, Vec& upper, Vec& rhs) {
477 const int N =
main.size();
482 for (
int i = 1; i < N; i++) {
483 const Scalar denom = 1.0 / (
main[i] - lower[i] * upper[i - 1]);
485 rhs[i] = (rhs[i] - lower[i] * rhs[i - 1]) * denom;
488 for (
int i = N - 2; i >= 0; i--) rhs[i] -= upper[i] * rhs[i + 1];
492#if !(defined(HAVE_BLAS) || defined(HAVE_MKL)) || (defined(CODI_REVERSE_TYPE) || defined(CODI_FORWARD_TYPE))
CNewtonIntegration::Scalar Scalar
Definition CNewtonIntegration.cpp:31
int main(int argc, char *argv[])
Definition SU2_CFD.cpp:37
#define C(i, j)
Definition blas_structure.cpp:133
#define B(i, j)
Definition blas_structure.cpp:132
Class, which serves as an interface to the BLAS functionalities needed.
Definition blas_structure.hpp:41
static void EigenDecomposition(const Mat &A_ij, Mat &Eig_Vec, Vec &Eig_Val, int n, W &e)
Decomposes the symmetric matrix A_ij, into eigenvectors and eigenvalues.
Definition blas_structure.hpp:439
CBlasStructure(void)
Constructor of the class. Initialize the constant member variables.
Definition blas_structure.cpp:53
static void EigenRecomposition(Mat &A_ij, const Mat &Eig_Vec, const Vec &Eig_Val, int n)
Recomposes the eigenvectors and eigenvalues into a matrix.
Definition blas_structure.hpp:458
void gemv(const int M, const int N, const su2double *A, const su2double *x, su2double *y)
Function, which carries out a dense matrix vector product y = A x. It is a limited version of the BLA...
Definition blas_structure.cpp:99
static void tdma(const Vec &lower, const Vec &main, Vec &upper, Vec &rhs)
Algorithm to solve a linear system with a tridiagonal matrix.
Definition blas_structure.hpp:476
static void tred2(Mat &V, Vec &d, W &e, int n)
tred2 Author:
Definition blas_structure.hpp:169
void gemm(const int M, const int N, const int K, const su2double *A, const su2double *B, su2double *C, const CConfig *config)
Function, which carries out a dense matrix product. It is a limited version of the BLAS gemm function...
Definition blas_structure.cpp:63
static void inverse(const int M, Mat &mat)
Invert a square matrix.
Definition blas_structure.hpp:91
static void tql2(Mat &V, Vec &d, W &e, int n)
tql2 Author:
Definition blas_structure.hpp:316
void axpy(const int n, const su2double a, const su2double *x, const int incx, su2double *y, const int incy)
Function, to carry out the axpy operation, i.e y += a*x.
Main class for defining the problem; basically this class reads the configuration file,...
Definition CConfig.hpp:64
passivedouble su2double
Definition code_config.hpp:181
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
@ V
Menter k-w SST model with vorticity production terms.
@ W
W-cycle multigrid solver.