14 #include <stk_util/environment/ReportHandler.hpp> 16 #include <Kokkos_Core.hpp> 20 #ifdef __INTEL_COMPILER 21 #define POINTER_RESTRICT restrict 23 #define POINTER_RESTRICT __restrict__ 30 return (1.0e6*std::numeric_limits<double>::min());
33 template <
typename ScalarType>
34 KOKKOS_FORCEINLINE_FUNCTION ScalarType
vecnorm_sq2(
const ScalarType* x) {
35 return (x[0] * x[0] + x[1] * x[1]);
38 template <
typename ScalarType>
39 KOKKOS_FORCEINLINE_FUNCTION ScalarType
vecnorm_sq3(
const ScalarType* x) {
40 return (x[0] * x[0] + x[1] * x[1] + x[2] * x[2]);
43 template <
typename ScalarType>
44 ScalarType
ddot(
const ScalarType* u,
const ScalarType* v,
int n)
47 for (
int i = 0; i < n; ++i) {
53 template <
typename ScalarType>
54 void cross3(
const ScalarType* u,
const ScalarType* v, ScalarType* cross)
56 cross[0] = u[1]*v[2] - u[2]*v[1];
57 cross[1] = -(u[0]*v[2] - u[2]*v[0]);
58 cross[2] = u[0]*v[1] - u[1]*v[0];
61 template <
typename ScalarType>
62 KOKKOS_FORCEINLINE_FUNCTION ScalarType
determinant22(
const ScalarType* mat)
64 enum { XX = 0, XY = 1, YX = 2, YY = 3 };
65 return (mat[XX] * mat[YY] - mat[XY] * mat[YX]);
68 template <
typename ScalarType>
69 KOKKOS_FORCEINLINE_FUNCTION ScalarType
determinant33(
const ScalarType* mat) {
70 enum { XX = 0, XY = 1, XZ = 2, YX = 3, YY = 4, YZ = 5, ZX = 6, ZY = 7, ZZ = 8 };
71 return (mat[XX] * (mat[YY] * mat[ZZ] - mat[YZ] * mat[ZY])
72 - mat[XY] * (mat[YX] * mat[ZZ] - mat[YZ] * mat[ZX])
73 + mat[XZ] * (mat[YX] * mat[ZY] - mat[YY] * mat[ZX]));
76 template <
typename ScalarType>
77 KOKKOS_FORCEINLINE_FUNCTION
void adjugate_matrix33(
const ScalarType jact[3][3], ScalarType adjJac[3][3])
79 adjJac[0][0] = jact[1][1] * jact[2][2] - jact[2][1] * jact[1][2];
80 adjJac[0][1] = jact[1][2] * jact[2][0] - jact[2][2] * jact[1][0];
81 adjJac[0][2] = jact[1][0] * jact[2][1] - jact[2][0] * jact[1][1];
83 adjJac[1][0] = jact[0][2] * jact[2][1] - jact[2][2] * jact[0][1];
84 adjJac[1][1] = jact[0][0] * jact[2][2] - jact[2][0] * jact[0][2];
85 adjJac[1][2] = jact[0][1] * jact[2][0] - jact[2][1] * jact[0][0];
87 adjJac[2][0] = jact[0][1] * jact[1][2] - jact[1][1] * jact[0][2];
88 adjJac[2][1] = jact[0][2] * jact[1][0] - jact[1][2] * jact[0][0];
89 adjJac[2][2] = jact[0][0] * jact[1][1] - jact[1][0] * jact[0][1];
92 template <
typename ScalarType>
93 KOKKOS_FORCEINLINE_FUNCTION
void invert_matrix33(
const ScalarType A[3][3], ScalarType Ainv[3][3])
97 Ainv[0][0] = inv_detj*(A[1][1] * A[2][2] - A[2][1] * A[1][2]);
98 Ainv[0][1] = inv_detj*(A[1][2] * A[2][0] - A[2][2] * A[1][0]);
99 Ainv[0][2] = inv_detj*(A[1][0] * A[2][1] - A[2][0] * A[1][1]);
101 Ainv[1][0] = inv_detj*(A[0][2] * A[2][1] - A[2][2] * A[0][1]);
102 Ainv[1][1] = inv_detj*(A[0][0] * A[2][2] - A[2][0] * A[0][2]);
103 Ainv[1][2] = inv_detj*(A[0][1] * A[2][0] - A[2][1] * A[0][0]);
105 Ainv[2][0] = inv_detj*(A[0][1] * A[1][2] - A[1][1] * A[0][2]);
106 Ainv[2][1] = inv_detj*(A[0][2] * A[1][0] - A[1][2] * A[0][0]);
107 Ainv[2][2] = inv_detj*(A[0][0] * A[1][1] - A[1][0] * A[0][1]);
110 template <
typename ScalarType>
115 enum { XX = 0, XY = 1, XZ = 2, YX = 3, YY = 4, YZ = 5, ZX = 6, ZY = 7, ZZ = 8 };
118 Ainv[XX] = inv_detj*(A[YY] * A[ZZ] - A[ZY] * A[YZ]);
119 Ainv[XY] = inv_detj*(A[YZ] * A[ZX] - A[ZZ] * A[YX]);
120 Ainv[XZ] = inv_detj*(A[YX] * A[ZY] - A[ZX] * A[YY]);
121 Ainv[YX] = inv_detj*(A[XZ] * A[ZY] - A[ZZ] * A[XY]);
122 Ainv[YY] = inv_detj*(A[XX] * A[ZZ] - A[ZX] * A[XZ]);
123 Ainv[YZ] = inv_detj*(A[XY] * A[ZX] - A[ZY] * A[XX]);
124 Ainv[ZX] = inv_detj*(A[XY] * A[YZ] - A[YY] * A[XZ]);
125 Ainv[ZY] = inv_detj*(A[XZ] * A[YZ] - A[YZ] * A[XX]);
126 Ainv[ZZ] = inv_detj*(A[XX] * A[YY] - A[YX] * A[XY]);
129 template <
typename ScalarType>
136 enum { XX = 0, XY = 1, YX = 2, YY = 3 };
137 enum { X_RANK1 = 0, Y_RANK1 = 1};
140 x[X_RANK1] = (A[YY] * b[X_RANK1] - A[XY] * b[Y_RANK1]) * inv_detA;
141 x[Y_RANK1] = -(A[YX] * b[X_RANK1] - A[XX] * b[Y_RANK1]) * inv_detA;
145 template <
typename ScalarType>
154 enum { XX = 0, XY = 1, XZ = 2, YX = 3, YY = 4, YZ = 5, ZX = 6, ZY = 7, ZZ = 8 };
155 enum { X_RANK1 = 0, Y_RANK1 = 1, Z_RANK1 = 2 };
158 x[X_RANK1] = ((A[YY] * A[ZZ] - A[YZ] * A[ZY]) * b[X_RANK1] + (A[XZ] * A[ZY] - A[XY] * A[ZZ]) * b[Y_RANK1] +
159 (A[XY] * A[YZ] - A[XZ] * A[YY]) * b[Z_RANK1]) *
162 x[Y_RANK1] = ((A[YZ] * A[ZX] - A[YX] * A[ZZ]) * b[X_RANK1] + (A[XX] * A[ZZ] - A[XZ] * A[ZX]) * b[Y_RANK1] +
163 (A[XZ] * A[YX] - A[XX] * A[YZ]) * b[Z_RANK1]) *
166 x[Z_RANK1] = ((A[YX] * A[ZY] - A[YY] * A[ZX]) * b[X_RANK1] + (A[XY] * A[ZX] - A[XX] * A[ZY]) * b[Y_RANK1] +
167 (A[XX] * A[YY] - A[XY] * A[YX]) * b[Z_RANK1]) *
171 template <
typename ScalarType>
172 KOKKOS_FORCEINLINE_FUNCTION
void matvec22(
const ScalarType* A,
const ScalarType* x, ScalarType* b)
174 b[0] = A[0] * x[0] + A[1] * x[1];
175 b[1] = A[2] * x[0] + A[3] * x[1];
178 template <
typename ScalarType>
179 KOKKOS_FORCEINLINE_FUNCTION
void mxm22(
const ScalarType* A,
const ScalarType* B, ScalarType* C)
181 C[0] = A[0] * B[0] + A[1] * B[2];
182 C[1] = A[0] * B[1] + A[1] * B[3];
183 C[2] = A[2] * B[0] + A[3] * B[2];
184 C[3] = A[2] * B[1] + A[3] * B[3];
187 template <
typename ScalarType>
188 KOKKOS_FORCEINLINE_FUNCTION
void mxm33(
const ScalarType* A,
const ScalarType* B, ScalarType* C)
190 enum { XX = 0, XY = 1, XZ = 2, YX = 3, YY = 4, YZ = 5, ZX = 6, ZY = 7, ZZ = 8 };
191 C[XX] = A[XX] * B[XX] + A[XY] * B[YX] + A[XZ] * B[ZX];
192 C[XY] = A[XX] * B[XY] + A[XY] * B[YY] + A[XZ] * B[ZY];
193 C[XZ] = A[XX] * B[XZ] + A[XY] * B[YZ] + A[XZ] * B[ZZ];
194 C[YX] = A[YX] * B[XX] + A[YY] * B[YX] + A[YZ] * B[ZX];
195 C[YY] = A[YX] * B[XY] + A[YY] * B[YY] + A[YZ] * B[ZY];
196 C[YZ] = A[YX] * B[XZ] + A[YY] * B[YZ] + A[YZ] * B[ZZ];
197 C[ZX] = A[ZX] * B[XX] + A[ZY] * B[YX] + A[ZZ] * B[ZX];
198 C[ZY] = A[ZX] * B[XY] + A[ZY] * B[YY] + A[ZZ] * B[ZY];
199 C[ZZ] = A[ZX] * B[XZ] + A[ZY] * B[YZ] + A[ZZ] * B[ZZ];
202 template <
typename ScalarType>
203 KOKKOS_FORCEINLINE_FUNCTION
void matvec33(
const ScalarType* A,
const ScalarType* x, ScalarType* b)
205 b[0] = A[0] * x[0] + A[1] * x[1] + A[2] * x[2];
206 b[1] = A[3] * x[0] + A[4] * x[1] + A[5] * x[2];
207 b[2] = A[6] * x[0] + A[7] * x[1] + A[8] * x[2];
210 template <
typename ScalarType>
211 KOKKOS_FORCEINLINE_FUNCTION
void transpose22(
const ScalarType* A, ScalarType* At)
219 template <
typename ScalarType>
220 KOKKOS_FORCEINLINE_FUNCTION
void transpose33(
const ScalarType* A, ScalarType* At)
222 enum { XX = 0, XY = 1, XZ = 2, YX = 3, YY = 4, YZ = 5, ZX = 6, ZY = 7, ZZ = 8 };
Definition: ABLForcingAlgorithm.C:26
KOKKOS_FORCEINLINE_FUNCTION void mxm33(const ScalarType *A, const ScalarType *B, ScalarType *C)
Definition: TensorOps.h:188
ScalarType ddot(const ScalarType *u, const ScalarType *v, int n)
Definition: TensorOps.h:44
KOKKOS_FORCEINLINE_FUNCTION void matvec22(const ScalarType *A, const ScalarType *x, ScalarType *b)
Definition: TensorOps.h:172
KOKKOS_FORCEINLINE_FUNCTION void solve22(const ScalarType *POINTER_RESTRICT A, const ScalarType *POINTER_RESTRICT b, ScalarType *POINTER_RESTRICT x)
Definition: TensorOps.h:130
KOKKOS_FORCEINLINE_FUNCTION void transpose33(const ScalarType *A, ScalarType *At)
Definition: TensorOps.h:220
KOKKOS_FORCEINLINE_FUNCTION ScalarType determinant22(const ScalarType *mat)
Definition: TensorOps.h:62
void cross3(const ScalarType *u, const ScalarType *v, ScalarType *cross)
Definition: TensorOps.h:54
KOKKOS_FORCEINLINE_FUNCTION void mxm22(const ScalarType *A, const ScalarType *B, ScalarType *C)
Definition: TensorOps.h:179
KOKKOS_FORCEINLINE_FUNCTION void adjugate_matrix33(const ScalarType jact[3][3], ScalarType adjJac[3][3])
Definition: TensorOps.h:77
KOKKOS_FORCEINLINE_FUNCTION ScalarType determinant33(const ScalarType *mat)
Definition: TensorOps.h:69
KOKKOS_FORCEINLINE_FUNCTION void matvec33(const ScalarType *A, const ScalarType *x, ScalarType *b)
Definition: TensorOps.h:203
KOKKOS_FORCEINLINE_FUNCTION ScalarType vecnorm_sq3(const ScalarType *x)
Definition: TensorOps.h:39
constexpr double tiny_positive_value()
Definition: TensorOps.h:29
KOKKOS_FORCEINLINE_FUNCTION ScalarType vecnorm_sq2(const ScalarType *x)
Definition: TensorOps.h:34
KOKKOS_FORCEINLINE_FUNCTION void solve33(const ScalarType *POINTER_RESTRICT A, const ScalarType *POINTER_RESTRICT b, ScalarType *POINTER_RESTRICT x)
Definition: TensorOps.h:146
#define POINTER_RESTRICT
Definition: TensorOps.h:23
KOKKOS_FORCEINLINE_FUNCTION void transpose22(const ScalarType *A, ScalarType *At)
Definition: TensorOps.h:211
KOKKOS_FORCEINLINE_FUNCTION void invert_matrix33(const ScalarType A[3][3], ScalarType Ainv[3][3])
Definition: TensorOps.h:93