15aed82e4SJeremy L Thompson // Copyright (c) 2017-2024, 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 7*c0b5abf0SJeremy L Thompson #pragma once 84d537eeaSYohann 9*c0b5abf0SJeremy L Thompson #include <ceed/types.h> 10*c0b5abf0SJeremy L Thompson #ifndef CEED_RUNNING_JIT_PASS 114d537eeaSYohann #include <math.h> 12*c0b5abf0SJeremy 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