1*9ba83ac0SJeremy L Thompson // Copyright (c) 2017-2026, 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. 315ed3f7dSjeremylt // 43d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 515ed3f7dSjeremylt // 63d8e8822SJeremy L Thompson // This file is part of CEED: http://github.com/ceed 715ed3f7dSjeremylt 8c0b5abf0SJeremy L Thompson #include <ceed/types.h> 9c9c2c079SJeremy L Thompson 102b730f8bSJeremy L Thompson CEED_QFUNCTION(setup_diff)(void *ctx, const CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 1115ed3f7dSjeremylt // in[0] is Jacobians with shape [2, nc=2, Q] 1215ed3f7dSjeremylt // in[1] is quadrature weights, size (Q) 1315ed3f7dSjeremylt const CeedScalar *J = in[0], *w = in[1]; 1415ed3f7dSjeremylt 1515ed3f7dSjeremylt // out[0] is qdata, size (Q) 1615ed3f7dSjeremylt CeedScalar *q_data = out[0]; 1715ed3f7dSjeremylt 1815ed3f7dSjeremylt // Quadrature point loop 192b730f8bSJeremy L Thompson CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) { 2015ed3f7dSjeremylt // Qdata stored in Voigt convention 2115ed3f7dSjeremylt // J: 0 2 q_data: 0 2 adj(J): J22 -J12 2215ed3f7dSjeremylt // 1 3 2 1 -J21 J11 2315ed3f7dSjeremylt const CeedScalar J11 = J[i + Q * 0]; 2415ed3f7dSjeremylt const CeedScalar J21 = J[i + Q * 1]; 2515ed3f7dSjeremylt const CeedScalar J12 = J[i + Q * 2]; 2615ed3f7dSjeremylt const CeedScalar J22 = J[i + Q * 3]; 2715ed3f7dSjeremylt const CeedScalar qw = w[i] / (J11 * J22 - J21 * J12); 2815ed3f7dSjeremylt q_data[i + Q * 0] = qw * (J12 * J12 + J22 * J22); 2915ed3f7dSjeremylt q_data[i + Q * 1] = qw * (J11 * J11 + J21 * J21); 3015ed3f7dSjeremylt q_data[i + Q * 2] = -qw * (J11 * J12 + J21 * J22); 3115ed3f7dSjeremylt } // End of Quadrature Point Loop 3215ed3f7dSjeremylt return 0; 3315ed3f7dSjeremylt } 3415ed3f7dSjeremylt 352b730f8bSJeremy L Thompson CEED_QFUNCTION(apply)(void *ctx, const CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 3615ed3f7dSjeremylt // in[0] is gradient u, shape [2, nc=1, Q] 3715ed3f7dSjeremylt // in[1] is quadrature data, size (3*Q) 3815ed3f7dSjeremylt const CeedScalar *ug = in[0], *q_data = in[1]; 3915ed3f7dSjeremylt 4015ed3f7dSjeremylt // out[0] is output to multiply against gradient v, shape [2, nc=1, Q] 4115ed3f7dSjeremylt CeedScalar *vg = out[0]; 4215ed3f7dSjeremylt 4315ed3f7dSjeremylt // Quadrature point loop 442b730f8bSJeremy L Thompson CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) { 4515ed3f7dSjeremylt // Read spatial derivatives of u 462b730f8bSJeremy L Thompson const CeedScalar du[2] = {ug[i + Q * 0], ug[i + Q * 1]}; 4715ed3f7dSjeremylt 4815ed3f7dSjeremylt // Read qdata (dXdxdXdxT symmetric matrix) 4915ed3f7dSjeremylt // Stored in Voigt convention 5015ed3f7dSjeremylt // 0 2 5115ed3f7dSjeremylt // 2 1 522b730f8bSJeremy L Thompson const CeedScalar dXdxdXdxT[2][2] = { 532b730f8bSJeremy L Thompson {q_data[i + 0 * Q], q_data[i + 2 * Q]}, 542b730f8bSJeremy L Thompson {q_data[i + 2 * Q], q_data[i + 1 * Q]} 5515ed3f7dSjeremylt }; 5615ed3f7dSjeremylt 5715ed3f7dSjeremylt // Apply Poisson operator 5815ed3f7dSjeremylt // j = direction of vg 592b730f8bSJeremy L Thompson for (int j = 0; j < 2; j++) vg[i + j * Q] = (du[0] * dXdxdXdxT[0][j] + du[1] * dXdxdXdxT[1][j]); 6015ed3f7dSjeremylt } // End of Quadrature Point Loop 6115ed3f7dSjeremylt return 0; 6215ed3f7dSjeremylt } 63