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; 1261dbc9d2Sjeremylt CeedInterlaceMode imode = CEED_NONINTERLACED; 13*15910d16Sjeremylt CeedElemRestriction Erestrictx, Erestrictu, 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 3461dbc9d2Sjeremylt CeedElemRestrictionCreate(ceed, imode, nelem, 2, Nx, 1, CEED_MEM_HOST, 35cae8b89aSjeremylt CEED_USE_POINTER, indx, &Erestrictx); 36*15910d16Sjeremylt 37cae8b89aSjeremylt 38cae8b89aSjeremylt for (CeedInt i=0; i<nelem; i++) { 39cae8b89aSjeremylt for (CeedInt j=0; j<P; j++) { 40cae8b89aSjeremylt indu[P*i+j] = i*(P-1) + j; 41cae8b89aSjeremylt } 42cae8b89aSjeremylt } 4361dbc9d2Sjeremylt CeedElemRestrictionCreate(ceed, imode, nelem, P, Nu, 1, CEED_MEM_HOST, 44cae8b89aSjeremylt CEED_USE_POINTER, indu, &Erestrictu); 457509a596Sjeremylt CeedInt stridesu[3] = {1, Q, Q}; 467509a596Sjeremylt CeedElemRestrictionCreateStrided(ceed, nelem, Q, Q*nelem, 1, stridesu, 47a8d32208Sjeremylt &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*15910d16Sjeremylt CeedOperatorSetField(op_setup, "_weight", CEED_ELEMRESTRICTION_NONE, bx, 76*15910d16Sjeremylt CEED_VECTOR_NONE); 77a8d32208Sjeremylt CeedOperatorSetField(op_setup, "dx", Erestrictx, bx, CEED_VECTOR_ACTIVE); 78a8d32208Sjeremylt CeedOperatorSetField(op_setup, "rho", Erestrictui, CEED_BASIS_COLLOCATED, 79a8d32208Sjeremylt CEED_VECTOR_ACTIVE); 80cae8b89aSjeremylt 81a8d32208Sjeremylt CeedOperatorSetField(op_mass, "rho", Erestrictui, CEED_BASIS_COLLOCATED, 82a8d32208Sjeremylt qdata); 83a8d32208Sjeremylt CeedOperatorSetField(op_mass, "u", Erestrictu, bu, CEED_VECTOR_ACTIVE); 84a8d32208Sjeremylt CeedOperatorSetField(op_mass, "v", Erestrictu, bu, CEED_VECTOR_ACTIVE); 85cae8b89aSjeremylt 86cae8b89aSjeremylt CeedOperatorApply(op_setup, X, qdata, CEED_REQUEST_IMMEDIATE); 87cae8b89aSjeremylt 88cae8b89aSjeremylt CeedVectorCreate(ceed, Nu, &U); 89cae8b89aSjeremylt CeedVectorSetValue(U, 1.0); 90cae8b89aSjeremylt CeedVectorCreate(ceed, Nu, &V); 91cae8b89aSjeremylt CeedVectorSetValue(V, 0.0); 92cae8b89aSjeremylt 93cae8b89aSjeremylt // Apply with V = 0 94cae8b89aSjeremylt CeedOperatorApplyAdd(op_mass, U, V, CEED_REQUEST_IMMEDIATE); 95cae8b89aSjeremylt 96cae8b89aSjeremylt // Check output 97cae8b89aSjeremylt CeedVectorGetArrayRead(V, CEED_MEM_HOST, &hv); 98cae8b89aSjeremylt sum = 0.; 99cae8b89aSjeremylt for (CeedInt i=0; i<Nu; i++) 100cae8b89aSjeremylt sum += hv[i]; 101cae8b89aSjeremylt if (fabs(sum-1.)>1e-10) printf("Computed Area: %f != True Area: 1.0\n", sum); 102cae8b89aSjeremylt CeedVectorRestoreArrayRead(V, &hv); 103cae8b89aSjeremylt 104cae8b89aSjeremylt // Apply with V = 1 105cae8b89aSjeremylt CeedVectorSetValue(V, 1.0); 106cae8b89aSjeremylt CeedOperatorApplyAdd(op_mass, U, V, CEED_REQUEST_IMMEDIATE); 107cae8b89aSjeremylt 108cae8b89aSjeremylt // Check output 109cae8b89aSjeremylt CeedVectorGetArrayRead(V, CEED_MEM_HOST, &hv); 110cae8b89aSjeremylt sum = -Nu; 111cae8b89aSjeremylt for (CeedInt i=0; i<Nu; i++) 112cae8b89aSjeremylt sum += hv[i]; 113cae8b89aSjeremylt if (fabs(sum-(1.))>1e-10) printf("Computed Area: %f != True Area: 1.0\n", sum); 114cae8b89aSjeremylt CeedVectorRestoreArrayRead(V, &hv); 115cae8b89aSjeremylt 116cae8b89aSjeremylt CeedQFunctionDestroy(&qf_setup); 117cae8b89aSjeremylt CeedQFunctionDestroy(&qf_mass); 118cae8b89aSjeremylt CeedOperatorDestroy(&op_setup); 119cae8b89aSjeremylt CeedOperatorDestroy(&op_mass); 120cae8b89aSjeremylt CeedElemRestrictionDestroy(&Erestrictu); 121cae8b89aSjeremylt CeedElemRestrictionDestroy(&Erestrictx); 122cae8b89aSjeremylt CeedElemRestrictionDestroy(&Erestrictui); 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