Line data Source code
1 : // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2 : // SPDX-License-Identifier: Apache-2.0
3 :
4 : #ifndef PALACE_LIBCEED_UTILS_21_QF_H
5 : #define PALACE_LIBCEED_UTILS_21_QF_H
6 :
7 : #ifndef CEED_RUNNING_JIT_PASS
8 : #include <math.h>
9 : #endif
10 :
11 : CEED_QFUNCTION_HELPER CeedScalar DetJ21(const CeedScalar J[2])
12 : {
13 : // J: 0
14 : // 1
15 : return sqrt(J[0] * J[0] + J[1] * J[1]);
16 : }
17 :
18 : template <bool ComputeDet = false>
19 : CEED_QFUNCTION_HELPER CeedScalar AdjJt21(const CeedScalar J[2], CeedScalar adjJt[2])
20 : {
21 : // Compute adj(J)^T / det(J) and store the result.
22 : // J: 0 adj(J): 1/sqrt(J^T J) J^T
23 : // 1
24 443832 : const CeedScalar d = sqrt(J[0] * J[0] + J[1] * J[1]);
25 443832 : adjJt[0] = J[0] / d;
26 443832 : adjJt[1] = J[1] / d;
27 : return ComputeDet ? d : 0.0;
28 : }
29 :
30 : CEED_QFUNCTION_HELPER void MatUnpack21(const CeedScalar *A, const CeedInt A_stride,
31 : CeedScalar A_loc[2])
32 : {
33 512976 : A_loc[0] = A[A_stride * 0];
34 512976 : A_loc[1] = A[A_stride * 1];
35 : }
36 :
37 : CEED_QFUNCTION_HELPER void MultAtBCx21(const CeedScalar A[2], const CeedScalar B[4],
38 : const CeedScalar C[2], const CeedScalar x[1],
39 : CeedScalar y[1])
40 : {
41 : // A: 0 B: 0 2 C: 0
42 : // 1 1 3 1
43 : CeedScalar z[2], t;
44 :
45 69144 : y[0] = C[0] * x[0];
46 69144 : t = C[1] * x[0];
47 :
48 69144 : z[0] = B[0] * y[0] + B[2] * t;
49 69144 : z[1] = B[1] * y[0] + B[3] * t;
50 :
51 69144 : y[0] = A[0] * z[0] + A[1] * z[1];
52 : }
53 :
54 : CEED_QFUNCTION_HELPER void MultBAx21(const CeedScalar A[2], const CeedScalar B[4],
55 : const CeedScalar x[1], CeedScalar y[2])
56 : {
57 : // A: 0 B: 0 2
58 : // 1 1 3
59 : CeedScalar z[2];
60 :
61 0 : z[0] = A[0] * x[0];
62 0 : z[1] = A[1] * x[0];
63 :
64 0 : y[0] = B[0] * z[0] + B[2] * z[1];
65 0 : y[1] = B[1] * z[0] + B[3] * z[1];
66 : }
67 :
68 : CEED_QFUNCTION_HELPER void MultAtBA21(const CeedScalar A[2], const CeedScalar B[4],
69 : CeedScalar C[1])
70 : {
71 : // A: 0 B: 0 2 C: 0
72 : // 1 1 3
73 :
74 : // First compute entries of R = B A.
75 0 : const CeedScalar R11 = B[0] * A[0] + B[2] * A[1];
76 0 : const CeedScalar R21 = B[1] * A[0] + B[3] * A[1];
77 :
78 0 : C[0] = A[0] * R11 + A[1] * R21;
79 : }
80 :
81 : CEED_QFUNCTION_HELPER void MultAtBC21(const CeedScalar A[2], const CeedScalar B[4],
82 : const CeedScalar C[2], CeedScalar D[1])
83 : {
84 : // A, C: 0 B: 0 2 D: 0
85 : // 1 1 3
86 :
87 : // First compute entries of R = B C.
88 0 : const CeedScalar R11 = B[0] * C[0] + B[2] * C[1];
89 0 : const CeedScalar R21 = B[1] * C[0] + B[3] * C[1];
90 :
91 0 : D[0] = A[0] * R11 + A[1] * R21;
92 : }
93 :
94 : CEED_QFUNCTION_HELPER void MultBA21(const CeedScalar A[2], const CeedScalar B[4],
95 : CeedScalar C[2])
96 : {
97 : // A: 0 B: 0 2 C: 0
98 : // 1 1 3 1
99 0 : C[0] = B[0] * A[0] + B[2] * A[1];
100 0 : C[1] = B[1] * A[0] + B[3] * A[1];
101 : }
102 :
103 : #endif // PALACE_LIBCEED_UTILS_21_QF_H
|