1 // Copyright (c) 2017-2022, 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 8 //------------------------------------------------------------------------------ 9 // Setup 1D mass matrix 10 //------------------------------------------------------------------------------ 11 CEED_QFUNCTION(setup_mass)(void *ctx, const CeedInt Q, 12 const CeedScalar *const *in, 13 CeedScalar *const *out) { 14 // in[0] is quadrature weights, size (Q) 15 // in[1] is Jacobians, size (Q) 16 const CeedScalar *w = in[0], *J = in[1]; 17 18 // out[0] is quadrature data, size (Q) 19 CeedScalar *qdata = out[0]; 20 21 // Quadrature point loop 22 CeedPragmaSIMD 23 for (CeedInt i=0; i<Q; i++) { 24 qdata[i] = J[i] * w[i]; 25 } 26 27 return 0; 28 } 29 30 //------------------------------------------------------------------------------ 31 // Setup 2D mass matrix 32 //------------------------------------------------------------------------------ 33 CEED_QFUNCTION(setup_mass_2d)(void *ctx, const CeedInt Q, 34 const CeedScalar *const *in, 35 CeedScalar *const *out) { 36 // in[0] is quadrature weights, size (Q) 37 // in[1] is Jacobians with shape [2, nc=2, Q] 38 const CeedScalar *w = in[0], *J = in[1]; 39 40 // out[0] is quadrature data, size (Q) 41 CeedScalar *qdata = out[0]; 42 43 // Quadrature point loop 44 CeedPragmaSIMD 45 for (CeedInt i=0; i<Q; i++) { 46 qdata[i] = w[i] * (J[i+Q*0]*J[i+Q*3] - J[i+Q*1]*J[i+Q*2]); 47 } 48 49 return 0; 50 } 51 52 //------------------------------------------------------------------------------ 53 // Apply mass matrix 54 //------------------------------------------------------------------------------ 55 CEED_QFUNCTION(apply_mass)(void *ctx, const CeedInt Q, 56 const CeedScalar *const *in, 57 CeedScalar *const *out) { 58 // Get scaling factor, if set 59 const CeedScalar *scale_array = ctx ? (CeedScalar *)ctx : NULL; 60 const CeedScalar scale = ctx ? scale_array[4] : 1.; 61 62 // in[0] is quadrature data, size (Q) 63 // in[1] is u, size (Q) 64 const CeedScalar *qdata = in[0], *u = in[1]; 65 66 // out[0] is v, size (Q) 67 CeedScalar *v = out[0]; 68 69 // Quadrature point loop 70 CeedPragmaSIMD 71 for (CeedInt i=0; i<Q; i++) { 72 v[i] = scale * qdata[i] * u[i]; 73 } 74 75 return 0; 76 } 77 78 //------------------------------------------------------------------------------ 79 // Apply mass matrix to two components 80 //------------------------------------------------------------------------------ 81 CEED_QFUNCTION(apply_mass_two)(void *ctx, const CeedInt Q, 82 const CeedScalar *const *in, 83 CeedScalar *const *out) { 84 // in[0] is quadrature data, size (Q) 85 // in[1] is u, size (2*Q) 86 const CeedScalar *qdata = in[0], *u = in[1]; 87 88 // out[0] is v, size (2*Q) 89 CeedScalar *v = out[0]; 90 91 // Quadrature point loop 92 CeedPragmaSIMD 93 for (CeedInt i=0; i<Q; i++) { 94 v[i] = qdata[i] * u[i]; 95 v[Q+i] = qdata[i] * u[Q+i]; 96 } 97 98 return 0; 99 } 100 101 //------------------------------------------------------------------------------ 102