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. 3cb32e2e7SValeria Barra // 43d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 5cb32e2e7SValeria Barra // 63d8e8822SJeremy 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 14*c9c2c079SJeremy L Thompson #include <ceed.h> 15f6b55d2cSvaleriabarra #include <math.h> 16f6b55d2cSvaleriabarra 17e83e87a5Sjeremylt // ----------------------------------------------------------------------------- 1813921685Svaleriabarra // This QFunction sets up the rhs and true solution for the problem 19cb32e2e7SValeria Barra // ----------------------------------------------------------------------------- 20cb32e2e7SValeria Barra CEED_QFUNCTION(SetupDiffRhs3)(void *ctx, CeedInt Q, 21cb32e2e7SValeria Barra const CeedScalar *const *in, 22cb32e2e7SValeria Barra CeedScalar *const *out) { 23cb32e2e7SValeria Barra #ifndef M_PI 24cb32e2e7SValeria Barra # define M_PI 3.14159265358979323846 25cb32e2e7SValeria Barra #endif 26e83e87a5Sjeremylt const CeedScalar *x = in[0], *w = in[1]; 27cb32e2e7SValeria Barra CeedScalar *true_soln = out[0], *rhs = out[1]; 28cb32e2e7SValeria Barra 29cb32e2e7SValeria Barra // Quadrature Point Loop 30cb32e2e7SValeria Barra CeedPragmaSIMD 31cb32e2e7SValeria Barra for (CeedInt i=0; i<Q; i++) { 32cb32e2e7SValeria Barra const CeedScalar c[3] = { 0, 1., 2. }; 33cb32e2e7SValeria Barra const CeedScalar k[3] = { 1., 2., 3. }; 34cb32e2e7SValeria Barra 35cb32e2e7SValeria Barra // Component 1 36cb32e2e7SValeria Barra true_soln[i+0*Q] = sin(M_PI*(c[0] + k[0]*x[i+Q*0])) * 37cb32e2e7SValeria Barra sin(M_PI*(c[1] + k[1]*x[i+Q*1])) * 38cb32e2e7SValeria Barra sin(M_PI*(c[2] + k[2]*x[i+Q*2])); 39cb32e2e7SValeria Barra // Component 2 4082311801Sjeremylt true_soln[i+1*Q] = 2 * true_soln[i+0*Q]; 41cb32e2e7SValeria Barra // Component 3 4282311801Sjeremylt true_soln[i+2*Q] = 3 * true_soln[i+0*Q]; 43cb32e2e7SValeria Barra 44cb32e2e7SValeria Barra // Component 1 45e83e87a5Sjeremylt rhs[i+0*Q] = w[i+Q*6] * M_PI*M_PI * (k[0]*k[0] + k[1]*k[1] + k[2]*k[2]) * 46cb32e2e7SValeria Barra true_soln[i+0*Q]; 47cb32e2e7SValeria Barra // Component 2 4882311801Sjeremylt rhs[i+1*Q] = 2 * rhs[i+0*Q]; 49cb32e2e7SValeria Barra // Component 3 5082311801Sjeremylt rhs[i+2*Q] = 3 * rhs[i+0*Q]; 51cb32e2e7SValeria Barra } // End of Quadrature Point Loop 52cb32e2e7SValeria Barra 53cb32e2e7SValeria Barra return 0; 54cb32e2e7SValeria Barra } 55cb32e2e7SValeria Barra 56e83e87a5Sjeremylt // ----------------------------------------------------------------------------- 57ed264d09SValeria Barra // This QFunction applies the diffusion operator for a vector field of 3 components. 58ed264d09SValeria Barra // 59ed264d09SValeria Barra // Inputs: 60ed264d09SValeria Barra // ug - Input vector Jacobian at quadrature points 619b072555Sjeremylt // q_data - Geometric factors 62ed264d09SValeria Barra // 63ed264d09SValeria Barra // Output: 64ed264d09SValeria Barra // vJ - Output vector (test functions) Jacobian at quadrature points 65ed264d09SValeria Barra // 66cb32e2e7SValeria Barra // ----------------------------------------------------------------------------- 67cb32e2e7SValeria Barra CEED_QFUNCTION(Diff3)(void *ctx, CeedInt Q, 68cb32e2e7SValeria Barra const CeedScalar *const *in, CeedScalar *const *out) { 69cb32e2e7SValeria Barra const CeedScalar *ug = in[0], *qd = in[1]; 70cb32e2e7SValeria Barra CeedScalar *vg = out[0]; 71cb32e2e7SValeria Barra 72cb32e2e7SValeria Barra // Quadrature Point Loop 73cb32e2e7SValeria Barra CeedPragmaSIMD 74cb32e2e7SValeria Barra for (CeedInt i=0; i<Q; i++) { 75cb32e2e7SValeria Barra // Read spatial derivatives of u components 76cb32e2e7SValeria Barra const CeedScalar uJ[3][3] = {{ug[i+(0+0*3)*Q], 77cb32e2e7SValeria Barra ug[i+(0+1*3)*Q], 78cb32e2e7SValeria Barra ug[i+(0+2*3)*Q]}, 79cb32e2e7SValeria Barra {ug[i+(1+0*3)*Q], 80cb32e2e7SValeria Barra ug[i+(1+1*3)*Q], 81cb32e2e7SValeria Barra ug[i+(1+2*3)*Q]}, 82cb32e2e7SValeria Barra {ug[i+(2+0*3)*Q], 83cb32e2e7SValeria Barra ug[i+(2+1*3)*Q], 84cb32e2e7SValeria Barra ug[i+(2+2*3)*Q]} 85cb32e2e7SValeria Barra }; 869b072555Sjeremylt // Read q_data (dXdxdXdx_T symmetric matrix) 879b072555Sjeremylt const CeedScalar dXdxdXdx_T[3][3] = {{qd[i+0*Q], 88cb32e2e7SValeria Barra qd[i+1*Q], 89cb32e2e7SValeria Barra qd[i+2*Q]}, 90cb32e2e7SValeria Barra {qd[i+1*Q], 91cb32e2e7SValeria Barra qd[i+3*Q], 92cb32e2e7SValeria Barra qd[i+4*Q]}, 93cb32e2e7SValeria Barra {qd[i+2*Q], 94cb32e2e7SValeria Barra qd[i+4*Q], 95cb32e2e7SValeria Barra qd[i+5*Q]} 96cb32e2e7SValeria Barra }; 97cb32e2e7SValeria Barra 98cb32e2e7SValeria Barra for (int k=0; k<3; k++) // k = component 99cb32e2e7SValeria Barra for (int j=0; j<3; j++) // j = direction of vg 1009b072555Sjeremylt vg[i+(k+j*3)*Q] = (uJ[k][0] * dXdxdXdx_T[0][j] + 1019b072555Sjeremylt uJ[k][1] * dXdxdXdx_T[1][j] + 1029b072555Sjeremylt uJ[k][2] * dXdxdXdx_T[2][j]); 103cb32e2e7SValeria Barra } // End of Quadrature Point Loop 104cb32e2e7SValeria Barra 105cb32e2e7SValeria Barra return 0; 106cb32e2e7SValeria Barra } 107cb32e2e7SValeria Barra // ----------------------------------------------------------------------------- 108f6b55d2cSvaleriabarra 109f6b55d2cSvaleriabarra #endif // bp4_h 110