|
21 | 21 | #define POISSON_MASS3D_H |
22 | 22 |
|
23 | 23 | #include <math.h> |
24 | | - |
25 | | -// ----------------------------------------------------------------------------- |
26 | | -// Compute determinant of 3x3 matrix |
27 | | -// ----------------------------------------------------------------------------- |
28 | | -#ifndef DetMat |
29 | | -#define DetMat |
30 | | -CEED_QFUNCTION_HELPER CeedScalar ComputeDetMat(const CeedScalar A[3][3]) { |
31 | | - // Compute det(A) |
32 | | - const CeedScalar B11 = A[1][1]*A[2][2] - A[1][2]*A[2][1]; |
33 | | - const CeedScalar B12 = A[0][2]*A[2][1] - A[0][1]*A[2][2]; |
34 | | - const CeedScalar B13 = A[0][1]*A[1][2] - A[0][2]*A[1][1]; |
35 | | - CeedScalar detA = A[0][0]*B11 + A[1][0]*B12 + A[2][0]*B13; |
36 | | - |
37 | | - return detA; |
38 | | -}; |
39 | | -#endif |
40 | | - |
| 24 | +#include "utils.h" |
41 | 25 | // ----------------------------------------------------------------------------- |
42 | 26 | // This QFunction applies the mass operator for a vector field of 2 components. |
43 | 27 | // |
@@ -71,24 +55,17 @@ CEED_QFUNCTION(SetupMass3D)(void *ctx, CeedInt Q, const CeedScalar *const *in, |
71 | 55 | const CeedScalar J[3][3] = {{dxdX[0][0][i], dxdX[1][0][i], dxdX[2][0][i]}, |
72 | 56 | {dxdX[0][1][i], dxdX[1][1][i], dxdX[2][1][i]}, |
73 | 57 | {dxdX[0][2][i], dxdX[1][2][i], dxdX[2][2][i]}}; |
74 | | - const CeedScalar detJ = ComputeDetMat(J); |
75 | | - const CeedScalar u1[3] = {u[0][i], u[1][i], u[2][i]}; |
| 58 | + const CeedScalar det_J = MatDet3x3(J); |
| 59 | + CeedScalar u1[3] = {u[0][i], u[1][i], u[2][i]}, v1[3]; |
76 | 60 | // *INDENT-ON* |
77 | 61 | // Piola map: J^T*J*u*w/detJ |
78 | 62 | // 1) Compute J^T * J |
79 | | - CeedScalar JTJ[3][3]; |
80 | | - for (CeedInt j = 0; j < 3; j++) { |
81 | | - for (CeedInt k = 0; k < 3; k++) { |
82 | | - JTJ[j][k] = 0; |
83 | | - for (CeedInt m = 0; m < 3; m++) |
84 | | - JTJ[j][k] += J[m][j] * J[m][k]; |
85 | | - } |
86 | | - } |
| 63 | + CeedScalar JT_J[3][3]; |
| 64 | + AlphaMatTransposeMatMult3x3(1., J, J, JT_J); |
87 | 65 | // 2) Compute J^T*J*u * w /detJ |
| 66 | + AlphaMatVecMult3x3(w[i]/det_J, JT_J, u1, v1); |
88 | 67 | for (CeedInt k = 0; k < 3; k++) { |
89 | | - v[k][i] = 0; |
90 | | - for (CeedInt m = 0; m < 3; m++) |
91 | | - v[k][i] += JTJ[k][m] * u1[m] * w[i]/detJ; |
| 68 | + v[k][i] = v1[k]; |
92 | 69 | } |
93 | 70 | } // End of Quadrature Point Loop |
94 | 71 |
|
|
0 commit comments