1*3d8e8822SJeremy L Thompson // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors. 2*3d8e8822SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 366087c08SValeria Barra // 4*3d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 566087c08SValeria Barra // 6*3d8e8822SJeremy L Thompson // This file is part of CEED: http://github.com/ceed 766087c08SValeria Barra 8e3bad73bSvaleriabarra #ifndef ex1_volume_h 9e3bad73bSvaleriabarra #define ex1_volume_h 10e3bad73bSvaleriabarra 1166087c08SValeria Barra /// A structure used to pass additional data to f_build_mass 1266087c08SValeria Barra struct BuildContext { CeedInt dim, space_dim; }; 1366087c08SValeria Barra 1466087c08SValeria Barra /// libCEED Q-function for building quadrature data for a mass operator 1566087c08SValeria Barra CEED_QFUNCTION(f_build_mass)(void *ctx, const CeedInt Q, 1666087c08SValeria Barra const CeedScalar *const *in, CeedScalar *const *out) { 1766087c08SValeria Barra // in[0] is Jacobians with shape [dim, nc=dim, Q] 1866087c08SValeria Barra // in[1] is quadrature weights, size (Q) 1966087c08SValeria Barra struct BuildContext *bc = (struct BuildContext *)ctx; 2066087c08SValeria Barra const CeedScalar *J = in[0], *w = in[1]; 21d1d35e2fSjeremylt CeedScalar *q_data = out[0]; 2266087c08SValeria Barra 2366087c08SValeria Barra switch (bc->dim + 10*bc->space_dim) { 2466087c08SValeria Barra case 11: 2566087c08SValeria Barra // Quadrature Point Loop 2666087c08SValeria Barra CeedPragmaSIMD 2766087c08SValeria Barra for (CeedInt i=0; i<Q; i++) { 28d1d35e2fSjeremylt q_data[i] = J[i] * w[i]; 2966087c08SValeria Barra } // End of Quadrature Point Loop 3066087c08SValeria Barra break; 3166087c08SValeria Barra case 22: 3266087c08SValeria Barra // Quadrature Point Loop 3366087c08SValeria Barra CeedPragmaSIMD 3466087c08SValeria Barra for (CeedInt i=0; i<Q; i++) { 3566087c08SValeria Barra // 0 2 3666087c08SValeria Barra // 1 3 37d1d35e2fSjeremylt q_data[i] = (J[i+Q*0]*J[i+Q*3] - J[i+Q*1]*J[i+Q*2]) * w[i]; 3866087c08SValeria Barra } // End of Quadrature Point Loop 3966087c08SValeria Barra break; 4066087c08SValeria Barra case 33: 4166087c08SValeria Barra // Quadrature Point Loop 4266087c08SValeria Barra CeedPragmaSIMD 4366087c08SValeria Barra for (CeedInt i=0; i<Q; i++) { 4466087c08SValeria Barra // 0 3 6 4566087c08SValeria Barra // 1 4 7 4666087c08SValeria Barra // 2 5 8 47d1d35e2fSjeremylt q_data[i] = (J[i+Q*0]*(J[i+Q*4]*J[i+Q*8] - J[i+Q*5]*J[i+Q*7]) - 4866087c08SValeria Barra J[i+Q*1]*(J[i+Q*3]*J[i+Q*8] - J[i+Q*5]*J[i+Q*6]) + 4966087c08SValeria Barra J[i+Q*2]*(J[i+Q*3]*J[i+Q*7] - J[i+Q*4]*J[i+Q*6])) * w[i]; 5066087c08SValeria Barra } // End of Quadrature Point Loop 5166087c08SValeria Barra break; 5266087c08SValeria Barra } 5366087c08SValeria Barra return 0; 5466087c08SValeria Barra } 5566087c08SValeria Barra 5666087c08SValeria Barra /// libCEED Q-function for applying a mass operator 5766087c08SValeria Barra CEED_QFUNCTION(f_apply_mass)(void *ctx, const CeedInt Q, 5866087c08SValeria Barra const CeedScalar *const *in, CeedScalar *const *out) { 59d1d35e2fSjeremylt const CeedScalar *u = in[0], *q_data = in[1]; 6066087c08SValeria Barra CeedScalar *v = out[0]; 6166087c08SValeria Barra 6266087c08SValeria Barra // Quadrature Point Loop 6366087c08SValeria Barra CeedPragmaSIMD 6466087c08SValeria Barra for (CeedInt i=0; i<Q; i++) { 65d1d35e2fSjeremylt v[i] = q_data[i] * u[i]; 6666087c08SValeria Barra } // End of Quadrature Point Loop 6766087c08SValeria Barra return 0; 6866087c08SValeria Barra } 69e3bad73bSvaleriabarra 70e3bad73bSvaleriabarra #endif // ex1_volume_h 71