1*ed264d09SValeria Barra // Copyright (c) 2017, Lawrence Livermore National Security, LLC. Produced at 2*ed264d09SValeria Barra // the Lawrence Livermore National Laboratory. LLNL-CODE-734707. All Rights 3*ed264d09SValeria Barra // reserved. See files LICENSE and NOTICE for details. 4*ed264d09SValeria Barra // 5*ed264d09SValeria Barra // This file is part of CEED, a collection of benchmarks, miniapps, software 6*ed264d09SValeria Barra // libraries and APIs for efficient high-order finite element and spectral 7*ed264d09SValeria Barra // element discretizations for exascale applications. For more information and 8*ed264d09SValeria Barra // source code availability see http://github.com/ceed. 9*ed264d09SValeria Barra // 10*ed264d09SValeria Barra // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC, 11*ed264d09SValeria Barra // a collaborative effort of two U.S. Department of Energy organizations (Office 12*ed264d09SValeria Barra // of Science and the National Nuclear Security Administration) responsible for 13*ed264d09SValeria Barra // the planning and preparation of a capable exascale ecosystem, including 14*ed264d09SValeria Barra // software, applications, hardware, advanced system engineering and early 15*ed264d09SValeria Barra // testbed platforms, in support of the nation's exascale computing imperative. 16*ed264d09SValeria Barra 17*ed264d09SValeria Barra /// @file 18*ed264d09SValeria Barra /// libCEED QFunctions for mass operator example for a vector field on the sphere using PETSc 19*ed264d09SValeria Barra 20*ed264d09SValeria Barra #ifndef __CUDACC__ 21*ed264d09SValeria Barra # include <math.h> 22*ed264d09SValeria Barra #endif 23*ed264d09SValeria Barra 24*ed264d09SValeria Barra // ***************************************************************************** 25*ed264d09SValeria Barra // This QFunction sets up the rhs and true solution for the problem 26*ed264d09SValeria Barra // ***************************************************************************** 27*ed264d09SValeria Barra 28*ed264d09SValeria Barra // ----------------------------------------------------------------------------- 29*ed264d09SValeria Barra CEED_QFUNCTION(SetupMassRhs3)(void *ctx, const CeedInt Q, 30*ed264d09SValeria Barra const CeedScalar *const *in, 31*ed264d09SValeria Barra CeedScalar *const *out) { 32*ed264d09SValeria Barra // Inputs 33*ed264d09SValeria Barra const CeedScalar *X = in[0], *qdata = in[1]; 34*ed264d09SValeria Barra // Outputs 35*ed264d09SValeria Barra CeedScalar *true_soln = out[0], *rhs = out[1]; 36*ed264d09SValeria Barra 37*ed264d09SValeria Barra // Context 38*ed264d09SValeria Barra const CeedScalar *context = (const CeedScalar*)ctx; 39*ed264d09SValeria Barra const CeedScalar R = context[0]; 40*ed264d09SValeria Barra 41*ed264d09SValeria Barra // Quadrature Point Loop 42*ed264d09SValeria Barra CeedPragmaSIMD 43*ed264d09SValeria Barra for (CeedInt i=0; i<Q; i++) { 44*ed264d09SValeria Barra // Compute latitude 45*ed264d09SValeria Barra const CeedScalar theta = asin(X[i+2*Q] / R); 46*ed264d09SValeria Barra 47*ed264d09SValeria Barra // Use absolute value of latitute for true solution 48*ed264d09SValeria Barra // Component 1 49*ed264d09SValeria Barra true_soln[i+0*Q] = fabs(theta); 50*ed264d09SValeria Barra // Component 2 51*ed264d09SValeria Barra true_soln[i+1*Q] = 2 * true_soln[i+0*Q]; 52*ed264d09SValeria Barra // Component 3 53*ed264d09SValeria Barra true_soln[i+2*Q] = 3 * true_soln[i+0*Q]; 54*ed264d09SValeria Barra 55*ed264d09SValeria Barra // Component 1 56*ed264d09SValeria Barra rhs[i+0*Q] = qdata[i] * true_soln[i]; 57*ed264d09SValeria Barra // Component 2 58*ed264d09SValeria Barra rhs[i+1*Q] = 2 * rhs[i+0*Q]; 59*ed264d09SValeria Barra // Component 3 60*ed264d09SValeria Barra rhs[i+2*Q] = 3 * rhs[i+0*Q]; 61*ed264d09SValeria Barra } // End of Quadrature Point Loop 62*ed264d09SValeria Barra 63*ed264d09SValeria Barra return 0; 64*ed264d09SValeria Barra } 65*ed264d09SValeria Barra 66*ed264d09SValeria Barra // ***************************************************************************** 67*ed264d09SValeria Barra // This QFunction applies the mass operator for a vector field of 3 components. 68*ed264d09SValeria Barra // 69*ed264d09SValeria Barra // Inputs: 70*ed264d09SValeria Barra // u - Input vector at quadrature points 71*ed264d09SValeria Barra // qdata - Geometric factors 72*ed264d09SValeria Barra // 73*ed264d09SValeria Barra // Output: 74*ed264d09SValeria Barra // v - Output vector (test functions) at quadrature points 75*ed264d09SValeria Barra // 76*ed264d09SValeria Barra // ***************************************************************************** 77*ed264d09SValeria Barra 78*ed264d09SValeria Barra // ----------------------------------------------------------------------------- 79*ed264d09SValeria Barra CEED_QFUNCTION(Mass3)(void *ctx, const CeedInt Q, 80*ed264d09SValeria Barra const CeedScalar *const *in, CeedScalar *const *out) { 81*ed264d09SValeria Barra const CeedScalar *u = in[0], *qdata = in[1]; 82*ed264d09SValeria Barra CeedScalar *v = out[0]; 83*ed264d09SValeria Barra 84*ed264d09SValeria Barra // Quadrature Point Loop 85*ed264d09SValeria Barra CeedPragmaSIMD 86*ed264d09SValeria Barra for (CeedInt i=0; i<Q; i++) { 87*ed264d09SValeria Barra const CeedScalar r = qdata[i]; 88*ed264d09SValeria Barra // Component 1 89*ed264d09SValeria Barra v[i+0*Q] = r * u[i+0*Q]; 90*ed264d09SValeria Barra // Component 2 91*ed264d09SValeria Barra v[i+1*Q] = r * u[i+1*Q]; 92*ed264d09SValeria Barra // Component 3 93*ed264d09SValeria Barra v[i+2*Q] = r * u[i+2*Q]; 94*ed264d09SValeria Barra } // End of Quadrature Point Loop 95*ed264d09SValeria Barra 96*ed264d09SValeria Barra return 0; 97*ed264d09SValeria Barra } 98*ed264d09SValeria Barra // ----------------------------------------------------------------------------- 99