1 // Copyright (c) 2017-2026, Lawrence Livermore National Security, LLC and other CEED contributors.
2 // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3 //
4 // SPDX-License-Identifier: BSD-2-Clause
5 //
6 // This file is part of CEED: http://github.com/ceed
7 #pragma once
8
9 #include <ceed/types.h>
10 #ifndef CEED_RUNNING_JIT_PASS
11 #include <math.h>
12 #endif
13
14 #ifndef M_PI
15 #define M_PI 3.14159265358979323846
16 #endif
17
18 // *****************************************************************************
19 // BP 1
20 // *****************************************************************************
masssetupf(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)21 CEED_QFUNCTION(masssetupf)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
22 CeedScalar *qdata = out[0], *rhs = out[1];
23 const CeedScalar *x = in[0];
24 const CeedScalar *J = in[1];
25 const CeedScalar *w = in[2];
26
27 // Quadrature Point Loop
28 for (CeedInt i = 0; i < Q; i++) {
29 CeedScalar det = (J[i + Q * 0] * (J[i + Q * 4] * J[i + Q * 8] - J[i + Q * 5] * J[i + Q * 7]) -
30 J[i + Q * 1] * (J[i + Q * 3] * J[i + Q * 8] - J[i + Q * 5] * J[i + Q * 6]) +
31 J[i + Q * 2] * (J[i + Q * 3] * J[i + Q * 7] - J[i + Q * 4] * J[i + Q * 6]));
32 qdata[i] = det * w[i];
33 rhs[i] = qdata[i] * sqrt(x[i] * x[i] + x[i + Q] * x[i + Q] + x[i + 2 * Q] * x[i + 2 * Q]);
34 } // End of Quadrature Point Loop
35 return 0;
36 }
37
massf(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)38 CEED_QFUNCTION(massf)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
39 const CeedScalar *u = in[0];
40 const CeedScalar *qdata = in[1];
41 CeedScalar *v = out[0];
42
43 // Quadrature Point Loop
44 for (CeedInt i = 0; i < Q; i++) v[i] = qdata[i] * u[i];
45
46 return 0;
47 }
48 // *****************************************************************************
49 // BP 3
50 // *****************************************************************************
diffsetupf(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)51 CEED_QFUNCTION(diffsetupf)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
52 const CeedScalar *x = in[0];
53 const CeedScalar *J = in[1];
54 const CeedScalar *w = in[2];
55 CeedScalar *qdata = out[0], *rhs = out[1];
56
57 // Quadrature Point Loop
58 for (CeedInt i = 0; i < Q; i++) {
59 // Stored in Voigt convention
60 // 0 5 4
61 // 5 1 3
62 // 4 3 2
63 const CeedScalar J11 = J[i + Q * 0];
64 const CeedScalar J21 = J[i + Q * 1];
65 const CeedScalar J31 = J[i + Q * 2];
66 const CeedScalar J12 = J[i + Q * 3];
67 const CeedScalar J22 = J[i + Q * 4];
68 const CeedScalar J32 = J[i + Q * 5];
69 const CeedScalar J13 = J[i + Q * 6];
70 const CeedScalar J23 = J[i + Q * 7];
71 const CeedScalar J33 = J[i + Q * 8];
72 const CeedScalar A11 = J22 * J33 - J23 * J32;
73 const CeedScalar A12 = J13 * J32 - J12 * J33;
74 const CeedScalar A13 = J12 * J23 - J13 * J22;
75 const CeedScalar A21 = J23 * J31 - J21 * J33;
76 const CeedScalar A22 = J11 * J33 - J13 * J31;
77 const CeedScalar A23 = J13 * J21 - J11 * J23;
78 const CeedScalar A31 = J21 * J32 - J22 * J31;
79 const CeedScalar A32 = J12 * J31 - J11 * J32;
80 const CeedScalar A33 = J11 * J22 - J12 * J21;
81 const CeedScalar qw = w[i] / (J11 * A11 + J21 * A12 + J31 * A13);
82 qdata[i + Q * 0] = qw * (A11 * A11 + A12 * A12 + A13 * A13);
83 qdata[i + Q * 1] = qw * (A21 * A21 + A22 * A22 + A23 * A23);
84 qdata[i + Q * 2] = qw * (A31 * A31 + A32 * A32 + A33 * A33);
85 qdata[i + Q * 3] = qw * (A21 * A31 + A22 * A32 + A23 * A33);
86 qdata[i + Q * 4] = qw * (A11 * A31 + A12 * A32 + A13 * A33);
87 qdata[i + Q * 5] = qw * (A11 * A21 + A12 * A22 + A13 * A23);
88 const CeedScalar c[3] = {0, 1., 2.};
89 const CeedScalar k[3] = {1., 2., 3.};
90 const CeedScalar rho = w[i] * (J11 * A11 + J21 * A12 + J31 * A13);
91 rhs[i] = rho * M_PI * M_PI * (k[0] * k[0] + k[1] * k[1] + k[2] * k[2]) * sin(M_PI * (c[0] + k[0] * x[i + Q * 0])) *
92 sin(M_PI * (c[1] + k[1] * x[i + Q * 1])) * sin(M_PI * (c[2] + k[2] * x[i + Q * 2]));
93 } // End of Quadrature Point Loop
94 return 0;
95 }
96
diffusionf(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)97 CEED_QFUNCTION(diffusionf)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
98 const CeedScalar *ug = in[0];
99 const CeedScalar *qdata = in[1];
100 CeedScalar *vg = out[0];
101
102 // Quadrature Point Loop
103 for (CeedInt i = 0; i < Q; i++) {
104 const CeedScalar ug0 = ug[i + Q * 0];
105 const CeedScalar ug1 = ug[i + Q * 1];
106 const CeedScalar ug2 = ug[i + Q * 2];
107 vg[i + Q * 0] = qdata[i + Q * 0] * ug0 + qdata[i + Q * 5] * ug1 + qdata[i + Q * 4] * ug2;
108 vg[i + Q * 1] = qdata[i + Q * 5] * ug0 + qdata[i + Q * 1] * ug1 + qdata[i + Q * 3] * ug2;
109 vg[i + Q * 2] = qdata[i + Q * 4] * ug0 + qdata[i + Q * 3] * ug1 + qdata[i + Q * 2] * ug2;
110 } // End of Quadrature Point Loop
111 return 0;
112 }
113