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 #include <ceed.h> 9 10 CEED_QFUNCTION(setup_diff)(void *ctx, const CeedInt Q, 11 const CeedScalar *const *in, 12 CeedScalar *const *out) { 13 // in[0] is Jacobians with shape [2, nc=2, Q] 14 // in[1] is quadrature weights, size (Q) 15 const CeedScalar *J = in[0], *w = in[1]; 16 17 // out[0] is qdata, size (Q) 18 CeedScalar *q_data = out[0]; 19 20 // Quadrature point loop 21 CeedPragmaSIMD 22 for (CeedInt i=0; i<Q; i++) { 23 // Qdata stored in Voigt convention 24 // J: 0 2 q_data: 0 2 adj(J): J22 -J12 25 // 1 3 2 1 -J21 J11 26 const CeedScalar J11 = J[i+Q*0]; 27 const CeedScalar J21 = J[i+Q*1]; 28 const CeedScalar J12 = J[i+Q*2]; 29 const CeedScalar J22 = J[i+Q*3]; 30 const CeedScalar qw = w[i] / (J11*J22 - J21*J12); 31 q_data[i+Q*0] = qw * (J12*J12 + J22*J22); 32 q_data[i+Q*1] = qw * (J11*J11 + J21*J21); 33 q_data[i+Q*2] = - qw * (J11*J12 + J21*J22); 34 } // End of Quadrature Point Loop 35 return 0; 36 } 37 38 CEED_QFUNCTION(apply)(void *ctx, const CeedInt Q, const CeedScalar *const *in, 39 CeedScalar *const *out) { 40 // in[0] is gradient u, shape [2, nc=1, Q] 41 // in[1] is quadrature data, size (3*Q) 42 const CeedScalar *ug = in[0], *q_data = in[1]; 43 44 // out[0] is output to multiply against gradient v, shape [2, nc=1, Q] 45 CeedScalar *vg = out[0]; 46 47 // Quadrature point loop 48 CeedPragmaSIMD 49 for (CeedInt i=0; i<Q; i++) { 50 // Read spatial derivatives of u 51 const CeedScalar du[2] = {ug[i+Q*0], 52 ug[i+Q*1] 53 }; 54 55 // Read qdata (dXdxdXdxT symmetric matrix) 56 // Stored in Voigt convention 57 // 0 2 58 // 2 1 59 // *INDENT-OFF* 60 const CeedScalar dXdxdXdxT[2][2] = {{q_data[i+0*Q], 61 q_data[i+2*Q]}, 62 {q_data[i+2*Q], 63 q_data[i+1*Q]} 64 }; 65 // *INDENT-ON* 66 67 // Apply Poisson operator 68 // j = direction of vg 69 for (int j=0; j<2; j++) 70 vg[i+j*Q] = (du[0] * dXdxdXdxT[0][j] + 71 du[1] * dXdxdXdxT[1][j]); 72 } // End of Quadrature Point Loop 73 return 0; 74 } 75