1*361afa9aSjeremylt /// @file 2*361afa9aSjeremylt /// Test creation, action, and destruction for mass matrix operator with passive inputs and outputs 3*361afa9aSjeremylt /// \test Test creation, action, and destruction for mass matrix operator with passive inputs and outputs 4*361afa9aSjeremylt #include <ceed.h> 5*361afa9aSjeremylt #include <stdlib.h> 6*361afa9aSjeremylt #include <math.h> 7*361afa9aSjeremylt 8*361afa9aSjeremylt #include "t503-operator.h" 9*361afa9aSjeremylt 10*361afa9aSjeremylt int main(int argc, char **argv) { 11*361afa9aSjeremylt Ceed ceed; 12*361afa9aSjeremylt CeedElemRestriction Erestrictx, Erestrictu, Erestrictxi, Erestrictui; 13*361afa9aSjeremylt CeedBasis bx, bu; 14*361afa9aSjeremylt CeedQFunction qf_setup, qf_mass; 15*361afa9aSjeremylt CeedOperator op_setup, op_mass; 16*361afa9aSjeremylt CeedVector qdata, X, U, V; 17*361afa9aSjeremylt const CeedScalar *hv; 18*361afa9aSjeremylt CeedInt nelem = 15, P = 5, Q = 8; 19*361afa9aSjeremylt CeedInt Nx = nelem+1, Nu = nelem*(P-1)+1; 20*361afa9aSjeremylt CeedInt indx[nelem*2], indu[nelem*P]; 21*361afa9aSjeremylt CeedScalar x[Nx]; 22*361afa9aSjeremylt CeedScalar sum; 23*361afa9aSjeremylt 24*361afa9aSjeremylt CeedInit(argv[1], &ceed); 25*361afa9aSjeremylt 26*361afa9aSjeremylt // Vectors 27*361afa9aSjeremylt CeedVectorCreate(ceed, Nu, &U); 28*361afa9aSjeremylt CeedVectorSetValue(U, 1.0); 29*361afa9aSjeremylt 30*361afa9aSjeremylt CeedVectorCreate(ceed, Nu, &V); 31*361afa9aSjeremylt 32*361afa9aSjeremylt for (CeedInt i=0; i<Nx; i++) 33*361afa9aSjeremylt x[i] = (CeedScalar) i / (Nx - 1); 34*361afa9aSjeremylt CeedVectorCreate(ceed, Nx, &X); 35*361afa9aSjeremylt CeedVectorSetArray(X, CEED_MEM_HOST, CEED_USE_POINTER, x); 36*361afa9aSjeremylt 37*361afa9aSjeremylt CeedVectorCreate(ceed, nelem*Q, &qdata); 38*361afa9aSjeremylt 39*361afa9aSjeremylt // Restrictions 40*361afa9aSjeremylt for (CeedInt i=0; i<nelem; i++) { 41*361afa9aSjeremylt indx[2*i+0] = i; 42*361afa9aSjeremylt indx[2*i+1] = i+1; 43*361afa9aSjeremylt } 44*361afa9aSjeremylt CeedElemRestrictionCreate(ceed, nelem, 2, Nx, 1, CEED_MEM_HOST, 45*361afa9aSjeremylt CEED_USE_POINTER, indx, &Erestrictx); 46*361afa9aSjeremylt CeedElemRestrictionCreateIdentity(ceed, nelem, 2, nelem*2, 1, &Erestrictxi); 47*361afa9aSjeremylt 48*361afa9aSjeremylt for (CeedInt i=0; i<nelem; i++) { 49*361afa9aSjeremylt for (CeedInt j=0; j<P; j++) { 50*361afa9aSjeremylt indu[P*i+j] = i*(P-1) + j; 51*361afa9aSjeremylt } 52*361afa9aSjeremylt } 53*361afa9aSjeremylt CeedElemRestrictionCreate(ceed, nelem, P, Nu, 1, CEED_MEM_HOST, 54*361afa9aSjeremylt CEED_USE_POINTER, indu, &Erestrictu); 55*361afa9aSjeremylt CeedElemRestrictionCreateIdentity(ceed, nelem, Q, Q*nelem, 1, &Erestrictui); 56*361afa9aSjeremylt 57*361afa9aSjeremylt // Bases 58*361afa9aSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS, &bx); 59*361afa9aSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, P, Q, CEED_GAUSS, &bu); 60*361afa9aSjeremylt 61*361afa9aSjeremylt // QFunctions 62*361afa9aSjeremylt CeedQFunctionCreateInterior(ceed, 1, setup, setup_loc, &qf_setup); 63*361afa9aSjeremylt CeedQFunctionAddInput(qf_setup, "_weight", 1, CEED_EVAL_WEIGHT); 64*361afa9aSjeremylt CeedQFunctionAddInput(qf_setup, "dx", 1, CEED_EVAL_GRAD); 65*361afa9aSjeremylt CeedQFunctionAddOutput(qf_setup, "rho", 1, CEED_EVAL_NONE); 66*361afa9aSjeremylt 67*361afa9aSjeremylt CeedQFunctionCreateInterior(ceed, 1, mass, mass_loc, &qf_mass); 68*361afa9aSjeremylt CeedQFunctionAddInput(qf_mass, "rho", 1, CEED_EVAL_NONE); 69*361afa9aSjeremylt CeedQFunctionAddInput(qf_mass, "u", 1, CEED_EVAL_INTERP); 70*361afa9aSjeremylt CeedQFunctionAddOutput(qf_mass, "v", 1, CEED_EVAL_INTERP); 71*361afa9aSjeremylt 72*361afa9aSjeremylt // Operators 73*361afa9aSjeremylt CeedOperatorCreate(ceed, qf_setup, NULL, NULL, &op_setup); 74*361afa9aSjeremylt 75*361afa9aSjeremylt CeedOperatorCreate(ceed, qf_mass, NULL, NULL, &op_mass); 76*361afa9aSjeremylt 77*361afa9aSjeremylt CeedOperatorSetField(op_setup, "_weight", Erestrictxi, CEED_NOTRANSPOSE, 78*361afa9aSjeremylt bx, CEED_VECTOR_NONE); 79*361afa9aSjeremylt CeedOperatorSetField(op_setup, "dx", Erestrictx, CEED_NOTRANSPOSE, bx, X); 80*361afa9aSjeremylt CeedOperatorSetField(op_setup, "rho", Erestrictui, CEED_NOTRANSPOSE, 81*361afa9aSjeremylt CEED_BASIS_COLLOCATED, qdata); 82*361afa9aSjeremylt 83*361afa9aSjeremylt CeedOperatorSetField(op_mass, "rho", Erestrictui, CEED_NOTRANSPOSE, 84*361afa9aSjeremylt CEED_BASIS_COLLOCATED, qdata); 85*361afa9aSjeremylt CeedOperatorSetField(op_mass, "u", Erestrictu, CEED_NOTRANSPOSE, bu, U); 86*361afa9aSjeremylt CeedOperatorSetField(op_mass, "v", Erestrictu, CEED_NOTRANSPOSE, bu, V); 87*361afa9aSjeremylt 88*361afa9aSjeremylt // Note - It is atypical to use only passive fields; this test is intended 89*361afa9aSjeremylt // as a test for all passive input modes rather than as an example. 90*361afa9aSjeremylt CeedOperatorApply(op_setup, NULL, NULL, CEED_REQUEST_IMMEDIATE); 91*361afa9aSjeremylt CeedOperatorApply(op_mass, NULL, NULL, CEED_REQUEST_IMMEDIATE); 92*361afa9aSjeremylt 93*361afa9aSjeremylt // Check output 94*361afa9aSjeremylt CeedVectorGetArrayRead(V, CEED_MEM_HOST, &hv); 95*361afa9aSjeremylt sum = 0.; 96*361afa9aSjeremylt for (CeedInt i=0; i<Nu; i++) 97*361afa9aSjeremylt sum += hv[i]; 98*361afa9aSjeremylt if (fabs(sum-1.)>1e-10) printf("Computed Area: %f != True Area: 1.0\n", sum); 99*361afa9aSjeremylt CeedVectorRestoreArrayRead(V, &hv); 100*361afa9aSjeremylt 101*361afa9aSjeremylt CeedQFunctionDestroy(&qf_setup); 102*361afa9aSjeremylt CeedQFunctionDestroy(&qf_mass); 103*361afa9aSjeremylt CeedOperatorDestroy(&op_setup); 104*361afa9aSjeremylt CeedOperatorDestroy(&op_mass); 105*361afa9aSjeremylt CeedElemRestrictionDestroy(&Erestrictu); 106*361afa9aSjeremylt CeedElemRestrictionDestroy(&Erestrictx); 107*361afa9aSjeremylt CeedElemRestrictionDestroy(&Erestrictui); 108*361afa9aSjeremylt CeedElemRestrictionDestroy(&Erestrictxi); 109*361afa9aSjeremylt CeedBasisDestroy(&bu); 110*361afa9aSjeremylt CeedBasisDestroy(&bx); 111*361afa9aSjeremylt CeedVectorDestroy(&X); 112*361afa9aSjeremylt CeedVectorDestroy(&U); 113*361afa9aSjeremylt CeedVectorDestroy(&V); 114*361afa9aSjeremylt CeedVectorDestroy(&qdata); 115*361afa9aSjeremylt CeedDestroy(&ceed); 116*361afa9aSjeremylt return 0; 117*361afa9aSjeremylt } 118