13d8e8822SJeremy L Thompson // Copyright (c) 2017-2022, 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. 366087c08SValeria Barra // 43d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 566087c08SValeria Barra // 63d8e8822SJeremy 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 11*c9c2c079SJeremy L Thompson #include <ceed.h> 12*c9c2c079SJeremy L Thompson 1366087c08SValeria Barra /// A structure used to pass additional data to f_build_mass 1466087c08SValeria Barra struct BuildContext { CeedInt dim, space_dim; }; 1566087c08SValeria Barra 1666087c08SValeria Barra /// libCEED Q-function for building quadrature data for a mass operator 1766087c08SValeria Barra CEED_QFUNCTION(f_build_mass)(void *ctx, const CeedInt Q, 1866087c08SValeria Barra const CeedScalar *const *in, CeedScalar *const *out) { 1966087c08SValeria Barra // in[0] is Jacobians with shape [dim, nc=dim, Q] 2066087c08SValeria Barra // in[1] is quadrature weights, size (Q) 2166087c08SValeria Barra struct BuildContext *bc = (struct BuildContext *)ctx; 2266087c08SValeria Barra const CeedScalar *J = in[0], *w = in[1]; 23d1d35e2fSjeremylt CeedScalar *q_data = out[0]; 2466087c08SValeria Barra 2566087c08SValeria Barra switch (bc->dim + 10*bc->space_dim) { 2666087c08SValeria Barra case 11: 2766087c08SValeria Barra // Quadrature Point Loop 2866087c08SValeria Barra CeedPragmaSIMD 2966087c08SValeria Barra for (CeedInt i=0; i<Q; i++) { 30d1d35e2fSjeremylt q_data[i] = J[i] * w[i]; 3166087c08SValeria Barra } // End of Quadrature Point Loop 3266087c08SValeria Barra break; 3366087c08SValeria Barra case 22: 3466087c08SValeria Barra // Quadrature Point Loop 3566087c08SValeria Barra CeedPragmaSIMD 3666087c08SValeria Barra for (CeedInt i=0; i<Q; i++) { 3766087c08SValeria Barra // 0 2 3866087c08SValeria Barra // 1 3 39d1d35e2fSjeremylt q_data[i] = (J[i+Q*0]*J[i+Q*3] - J[i+Q*1]*J[i+Q*2]) * w[i]; 4066087c08SValeria Barra } // End of Quadrature Point Loop 4166087c08SValeria Barra break; 4266087c08SValeria Barra case 33: 4366087c08SValeria Barra // Quadrature Point Loop 4466087c08SValeria Barra CeedPragmaSIMD 4566087c08SValeria Barra for (CeedInt i=0; i<Q; i++) { 4666087c08SValeria Barra // 0 3 6 4766087c08SValeria Barra // 1 4 7 4866087c08SValeria Barra // 2 5 8 49d1d35e2fSjeremylt q_data[i] = (J[i+Q*0]*(J[i+Q*4]*J[i+Q*8] - J[i+Q*5]*J[i+Q*7]) - 5066087c08SValeria Barra J[i+Q*1]*(J[i+Q*3]*J[i+Q*8] - J[i+Q*5]*J[i+Q*6]) + 5166087c08SValeria Barra J[i+Q*2]*(J[i+Q*3]*J[i+Q*7] - J[i+Q*4]*J[i+Q*6])) * w[i]; 5266087c08SValeria Barra } // End of Quadrature Point Loop 5366087c08SValeria Barra break; 5466087c08SValeria Barra } 5566087c08SValeria Barra return 0; 5666087c08SValeria Barra } 5766087c08SValeria Barra 5866087c08SValeria Barra /// libCEED Q-function for applying a mass operator 5966087c08SValeria Barra CEED_QFUNCTION(f_apply_mass)(void *ctx, const CeedInt Q, 6066087c08SValeria Barra const CeedScalar *const *in, CeedScalar *const *out) { 61d1d35e2fSjeremylt const CeedScalar *u = in[0], *q_data = in[1]; 6266087c08SValeria Barra CeedScalar *v = out[0]; 6366087c08SValeria Barra 6466087c08SValeria Barra // Quadrature Point Loop 6566087c08SValeria Barra CeedPragmaSIMD 6666087c08SValeria Barra for (CeedInt i=0; i<Q; i++) { 67d1d35e2fSjeremylt v[i] = q_data[i] * u[i]; 6866087c08SValeria Barra } // End of Quadrature Point Loop 6966087c08SValeria Barra return 0; 7066087c08SValeria Barra } 71e3bad73bSvaleriabarra 72e3bad73bSvaleriabarra #endif // ex1_volume_h 73