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. 3cb32e2e7SValeria Barra // 4*3d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 5cb32e2e7SValeria Barra // 6*3d8e8822SJeremy L Thompson // This file is part of CEED: http://github.com/ceed 7cb32e2e7SValeria Barra 8cb32e2e7SValeria Barra /// @file 9cb32e2e7SValeria Barra /// libCEED QFunctions for diffusion operator example using PETSc 10cb32e2e7SValeria Barra 11f6b55d2cSvaleriabarra #ifndef bp4_h 12f6b55d2cSvaleriabarra #define bp4_h 13f6b55d2cSvaleriabarra 14f6b55d2cSvaleriabarra #include <math.h> 15f6b55d2cSvaleriabarra 16e83e87a5Sjeremylt // ----------------------------------------------------------------------------- 1713921685Svaleriabarra // This QFunction sets up the rhs and true solution for the problem 18cb32e2e7SValeria Barra // ----------------------------------------------------------------------------- 19cb32e2e7SValeria Barra CEED_QFUNCTION(SetupDiffRhs3)(void *ctx, CeedInt Q, 20cb32e2e7SValeria Barra const CeedScalar *const *in, 21cb32e2e7SValeria Barra CeedScalar *const *out) { 22cb32e2e7SValeria Barra #ifndef M_PI 23cb32e2e7SValeria Barra # define M_PI 3.14159265358979323846 24cb32e2e7SValeria Barra #endif 25e83e87a5Sjeremylt const CeedScalar *x = in[0], *w = in[1]; 26cb32e2e7SValeria Barra CeedScalar *true_soln = out[0], *rhs = out[1]; 27cb32e2e7SValeria Barra 28cb32e2e7SValeria Barra // Quadrature Point Loop 29cb32e2e7SValeria Barra CeedPragmaSIMD 30cb32e2e7SValeria Barra for (CeedInt i=0; i<Q; i++) { 31cb32e2e7SValeria Barra const CeedScalar c[3] = { 0, 1., 2. }; 32cb32e2e7SValeria Barra const CeedScalar k[3] = { 1., 2., 3. }; 33cb32e2e7SValeria Barra 34cb32e2e7SValeria Barra // Component 1 35cb32e2e7SValeria Barra true_soln[i+0*Q] = sin(M_PI*(c[0] + k[0]*x[i+Q*0])) * 36cb32e2e7SValeria Barra sin(M_PI*(c[1] + k[1]*x[i+Q*1])) * 37cb32e2e7SValeria Barra sin(M_PI*(c[2] + k[2]*x[i+Q*2])); 38cb32e2e7SValeria Barra // Component 2 3982311801Sjeremylt true_soln[i+1*Q] = 2 * true_soln[i+0*Q]; 40cb32e2e7SValeria Barra // Component 3 4182311801Sjeremylt true_soln[i+2*Q] = 3 * true_soln[i+0*Q]; 42cb32e2e7SValeria Barra 43cb32e2e7SValeria Barra // Component 1 44e83e87a5Sjeremylt rhs[i+0*Q] = w[i+Q*6] * M_PI*M_PI * (k[0]*k[0] + k[1]*k[1] + k[2]*k[2]) * 45cb32e2e7SValeria Barra true_soln[i+0*Q]; 46cb32e2e7SValeria Barra // Component 2 4782311801Sjeremylt rhs[i+1*Q] = 2 * rhs[i+0*Q]; 48cb32e2e7SValeria Barra // Component 3 4982311801Sjeremylt rhs[i+2*Q] = 3 * rhs[i+0*Q]; 50cb32e2e7SValeria Barra } // End of Quadrature Point Loop 51cb32e2e7SValeria Barra 52cb32e2e7SValeria Barra return 0; 53cb32e2e7SValeria Barra } 54cb32e2e7SValeria Barra 55e83e87a5Sjeremylt // ----------------------------------------------------------------------------- 56ed264d09SValeria Barra // This QFunction applies the diffusion operator for a vector field of 3 components. 57ed264d09SValeria Barra // 58ed264d09SValeria Barra // Inputs: 59ed264d09SValeria Barra // ug - Input vector Jacobian at quadrature points 609b072555Sjeremylt // q_data - Geometric factors 61ed264d09SValeria Barra // 62ed264d09SValeria Barra // Output: 63ed264d09SValeria Barra // vJ - Output vector (test functions) Jacobian at quadrature points 64ed264d09SValeria Barra // 65cb32e2e7SValeria Barra // ----------------------------------------------------------------------------- 66cb32e2e7SValeria Barra CEED_QFUNCTION(Diff3)(void *ctx, CeedInt Q, 67cb32e2e7SValeria Barra const CeedScalar *const *in, CeedScalar *const *out) { 68cb32e2e7SValeria Barra const CeedScalar *ug = in[0], *qd = in[1]; 69cb32e2e7SValeria Barra CeedScalar *vg = out[0]; 70cb32e2e7SValeria Barra 71cb32e2e7SValeria Barra // Quadrature Point Loop 72cb32e2e7SValeria Barra CeedPragmaSIMD 73cb32e2e7SValeria Barra for (CeedInt i=0; i<Q; i++) { 74cb32e2e7SValeria Barra // Read spatial derivatives of u components 75cb32e2e7SValeria Barra const CeedScalar uJ[3][3] = {{ug[i+(0+0*3)*Q], 76cb32e2e7SValeria Barra ug[i+(0+1*3)*Q], 77cb32e2e7SValeria Barra ug[i+(0+2*3)*Q]}, 78cb32e2e7SValeria Barra {ug[i+(1+0*3)*Q], 79cb32e2e7SValeria Barra ug[i+(1+1*3)*Q], 80cb32e2e7SValeria Barra ug[i+(1+2*3)*Q]}, 81cb32e2e7SValeria Barra {ug[i+(2+0*3)*Q], 82cb32e2e7SValeria Barra ug[i+(2+1*3)*Q], 83cb32e2e7SValeria Barra ug[i+(2+2*3)*Q]} 84cb32e2e7SValeria Barra }; 859b072555Sjeremylt // Read q_data (dXdxdXdx_T symmetric matrix) 869b072555Sjeremylt const CeedScalar dXdxdXdx_T[3][3] = {{qd[i+0*Q], 87cb32e2e7SValeria Barra qd[i+1*Q], 88cb32e2e7SValeria Barra qd[i+2*Q]}, 89cb32e2e7SValeria Barra {qd[i+1*Q], 90cb32e2e7SValeria Barra qd[i+3*Q], 91cb32e2e7SValeria Barra qd[i+4*Q]}, 92cb32e2e7SValeria Barra {qd[i+2*Q], 93cb32e2e7SValeria Barra qd[i+4*Q], 94cb32e2e7SValeria Barra qd[i+5*Q]} 95cb32e2e7SValeria Barra }; 96cb32e2e7SValeria Barra 97cb32e2e7SValeria Barra for (int k=0; k<3; k++) // k = component 98cb32e2e7SValeria Barra for (int j=0; j<3; j++) // j = direction of vg 999b072555Sjeremylt vg[i+(k+j*3)*Q] = (uJ[k][0] * dXdxdXdx_T[0][j] + 1009b072555Sjeremylt uJ[k][1] * dXdxdXdx_T[1][j] + 1019b072555Sjeremylt uJ[k][2] * dXdxdXdx_T[2][j]); 102cb32e2e7SValeria Barra } // End of Quadrature Point Loop 103cb32e2e7SValeria Barra 104cb32e2e7SValeria Barra return 0; 105cb32e2e7SValeria Barra } 106cb32e2e7SValeria Barra // ----------------------------------------------------------------------------- 107f6b55d2cSvaleriabarra 108f6b55d2cSvaleriabarra #endif // bp4_h 109