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