xref: /libCEED/examples/nek/bps/bps.h (revision 9ba83ac0e4b1fca39d6fa6737a318a9f0cbc172d)
1*9ba83ac0SJeremy L Thompson // Copyright (c) 2017-2026, Lawrence Livermore National Security, LLC and other CEED contributors.
23d8e8822SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
34d537eeaSYohann //
43d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause
54d537eeaSYohann //
63d8e8822SJeremy L Thompson // This file is part of CEED:  http://github.com/ceed
7c0b5abf0SJeremy L Thompson #pragma once
84d537eeaSYohann 
9c0b5abf0SJeremy L Thompson #include <ceed/types.h>
10c0b5abf0SJeremy L Thompson #ifndef CEED_RUNNING_JIT_PASS
114d537eeaSYohann #include <math.h>
12c0b5abf0SJeremy L Thompson #endif
134d537eeaSYohann 
14ccaff030SJeremy L Thompson #ifndef M_PI
15ccaff030SJeremy L Thompson #define M_PI 3.14159265358979323846
16ccaff030SJeremy L Thompson #endif
17ccaff030SJeremy L Thompson 
184d537eeaSYohann // *****************************************************************************
194d537eeaSYohann //   BP 1
204d537eeaSYohann // *****************************************************************************
212b730f8bSJeremy L Thompson CEED_QFUNCTION(masssetupf)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
22a2fa7910SValeria Barra   CeedScalar       *qdata = out[0], *rhs = out[1];
234d537eeaSYohann   const CeedScalar *x = in[0];
244d537eeaSYohann   const CeedScalar *J = in[1];
254d537eeaSYohann   const CeedScalar *w = in[2];
26ee07ded2SValeria Barra 
27ee07ded2SValeria Barra   // Quadrature Point Loop
284d537eeaSYohann   for (CeedInt i = 0; i < Q; i++) {
294d537eeaSYohann     CeedScalar det = (J[i + Q * 0] * (J[i + Q * 4] * J[i + Q * 8] - J[i + Q * 5] * J[i + Q * 7]) -
304d537eeaSYohann                       J[i + Q * 1] * (J[i + Q * 3] * J[i + Q * 8] - J[i + Q * 5] * J[i + Q * 6]) +
314d537eeaSYohann                       J[i + Q * 2] * (J[i + Q * 3] * J[i + Q * 7] - J[i + Q * 4] * J[i + Q * 6]));
32a2fa7910SValeria Barra     qdata[i]       = det * w[i];
33ab213215SJeremy L Thompson     rhs[i]         = qdata[i] * sqrt(x[i] * x[i] + x[i + Q] * x[i + Q] + x[i + 2 * Q] * x[i + 2 * Q]);
34ee07ded2SValeria Barra   }  // End of Quadrature Point Loop
354d537eeaSYohann   return 0;
364d537eeaSYohann }
374d537eeaSYohann 
382b730f8bSJeremy L Thompson CEED_QFUNCTION(massf)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
394d537eeaSYohann   const CeedScalar *u     = in[0];
40a2fa7910SValeria Barra   const CeedScalar *qdata = in[1];
414d537eeaSYohann   CeedScalar       *v     = out[0];
42ee07ded2SValeria Barra 
43ee07ded2SValeria Barra   // Quadrature Point Loop
442b730f8bSJeremy L Thompson   for (CeedInt i = 0; i < Q; i++) v[i] = qdata[i] * u[i];
45ee07ded2SValeria Barra 
464d537eeaSYohann   return 0;
474d537eeaSYohann }
484d537eeaSYohann // *****************************************************************************
494d537eeaSYohann //   BP 3
504d537eeaSYohann // *****************************************************************************
512b730f8bSJeremy L Thompson CEED_QFUNCTION(diffsetupf)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
524d537eeaSYohann   const CeedScalar *x     = in[0];
534d537eeaSYohann   const CeedScalar *J     = in[1];
544d537eeaSYohann   const CeedScalar *w     = in[2];
55a2fa7910SValeria Barra   CeedScalar       *qdata = out[0], *rhs = out[1];
56ee07ded2SValeria Barra 
57ee07ded2SValeria Barra   // Quadrature Point Loop
584d537eeaSYohann   for (CeedInt i = 0; i < Q; i++) {
59288c0443SJeremy L Thompson     // Stored in Voigt convention
60288c0443SJeremy L Thompson     // 0 5 4
61288c0443SJeremy L Thompson     // 5 1 3
62288c0443SJeremy L Thompson     // 4 3 2
634d537eeaSYohann     const CeedScalar J11  = J[i + Q * 0];
644d537eeaSYohann     const CeedScalar J21  = J[i + Q * 1];
654d537eeaSYohann     const CeedScalar J31  = J[i + Q * 2];
664d537eeaSYohann     const CeedScalar J12  = J[i + Q * 3];
674d537eeaSYohann     const CeedScalar J22  = J[i + Q * 4];
684d537eeaSYohann     const CeedScalar J32  = J[i + Q * 5];
694d537eeaSYohann     const CeedScalar J13  = J[i + Q * 6];
704d537eeaSYohann     const CeedScalar J23  = J[i + Q * 7];
714d537eeaSYohann     const CeedScalar J33  = J[i + Q * 8];
724d537eeaSYohann     const CeedScalar A11  = J22 * J33 - J23 * J32;
734d537eeaSYohann     const CeedScalar A12  = J13 * J32 - J12 * J33;
744d537eeaSYohann     const CeedScalar A13  = J12 * J23 - J13 * J22;
754d537eeaSYohann     const CeedScalar A21  = J23 * J31 - J21 * J33;
764d537eeaSYohann     const CeedScalar A22  = J11 * J33 - J13 * J31;
774d537eeaSYohann     const CeedScalar A23  = J13 * J21 - J11 * J23;
784d537eeaSYohann     const CeedScalar A31  = J21 * J32 - J22 * J31;
794d537eeaSYohann     const CeedScalar A32  = J12 * J31 - J11 * J32;
804d537eeaSYohann     const CeedScalar A33  = J11 * J22 - J12 * J21;
814d537eeaSYohann     const CeedScalar qw   = w[i] / (J11 * A11 + J21 * A12 + J31 * A13);
82a2fa7910SValeria Barra     qdata[i + Q * 0]      = qw * (A11 * A11 + A12 * A12 + A13 * A13);
83a2fa7910SValeria Barra     qdata[i + Q * 1]      = qw * (A21 * A21 + A22 * A22 + A23 * A23);
84a2fa7910SValeria Barra     qdata[i + Q * 2]      = qw * (A31 * A31 + A32 * A32 + A33 * A33);
85a2fa7910SValeria Barra     qdata[i + Q * 3]      = qw * (A21 * A31 + A22 * A32 + A23 * A33);
86a2fa7910SValeria Barra     qdata[i + Q * 4]      = qw * (A11 * A31 + A12 * A32 + A13 * A33);
87a2fa7910SValeria Barra     qdata[i + Q * 5]      = qw * (A11 * A21 + A12 * A22 + A13 * A23);
884d537eeaSYohann     const CeedScalar c[3] = {0, 1., 2.};
894d537eeaSYohann     const CeedScalar k[3] = {1., 2., 3.};
904d537eeaSYohann     const CeedScalar rho  = w[i] * (J11 * A11 + J21 * A12 + J31 * A13);
912b730f8bSJeremy L Thompson     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])) *
922b730f8bSJeremy L Thompson              sin(M_PI * (c[1] + k[1] * x[i + Q * 1])) * sin(M_PI * (c[2] + k[2] * x[i + Q * 2]));
93ee07ded2SValeria Barra   }  // End of Quadrature Point Loop
944d537eeaSYohann   return 0;
954d537eeaSYohann }
964d537eeaSYohann 
972b730f8bSJeremy L Thompson CEED_QFUNCTION(diffusionf)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
984d537eeaSYohann   const CeedScalar *ug    = in[0];
99a2fa7910SValeria Barra   const CeedScalar *qdata = in[1];
1004d537eeaSYohann   CeedScalar       *vg    = out[0];
101ee07ded2SValeria Barra 
102ee07ded2SValeria Barra   // Quadrature Point Loop
1034d537eeaSYohann   for (CeedInt i = 0; i < Q; i++) {
1044d537eeaSYohann     const CeedScalar ug0 = ug[i + Q * 0];
1054d537eeaSYohann     const CeedScalar ug1 = ug[i + Q * 1];
1064d537eeaSYohann     const CeedScalar ug2 = ug[i + Q * 2];
107a2fa7910SValeria Barra     vg[i + Q * 0]        = qdata[i + Q * 0] * ug0 + qdata[i + Q * 5] * ug1 + qdata[i + Q * 4] * ug2;
108a2fa7910SValeria Barra     vg[i + Q * 1]        = qdata[i + Q * 5] * ug0 + qdata[i + Q * 1] * ug1 + qdata[i + Q * 3] * ug2;
109a2fa7910SValeria Barra     vg[i + Q * 2]        = qdata[i + Q * 4] * ug0 + qdata[i + Q * 3] * ug1 + qdata[i + Q * 2] * ug2;
110ee07ded2SValeria Barra   }  // End of Quadrature Point Loop
1114d537eeaSYohann   return 0;
1124d537eeaSYohann }
113