1 /// @file 2 /// Test creation, action, and destruction for identity operator 3 /// \test Test creation, action, and destruction for identity operator 4 #include <ceed.h> 5 #include <math.h> 6 #include <stdio.h> 7 #include <stdlib.h> 8 9 int main(int argc, char **argv) { 10 Ceed ceed; 11 CeedElemRestriction elem_restriction_u, elem_restriction_u_i; 12 CeedBasis basis_u; 13 CeedQFunction qf_identity; 14 CeedOperator op_identity; 15 CeedVector u, v; 16 CeedInt num_elem = 15, p = 5, q = 8; 17 CeedInt num_nodes = num_elem * (p - 1) + 1; 18 CeedInt ind_u[num_elem * p]; 19 20 CeedInit(argv[1], &ceed); 21 22 CeedVectorCreate(ceed, num_nodes, &u); 23 CeedVectorCreate(ceed, q * num_elem, &v); 24 25 // Restrictions 26 for (CeedInt i = 0; i < num_elem; i++) { 27 for (CeedInt j = 0; j < p; j++) { 28 ind_u[p * i + j] = i * (p - 1) + j; 29 } 30 } 31 CeedElemRestrictionCreate(ceed, num_elem, p, 1, 1, num_nodes, CEED_MEM_HOST, CEED_USE_POINTER, ind_u, &elem_restriction_u); 32 33 CeedInt strides_u_i[3] = {1, q, q}; 34 CeedElemRestrictionCreateStrided(ceed, num_elem, q, 1, q * num_elem, strides_u_i, &elem_restriction_u_i); 35 36 // Bases 37 CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, p, q, CEED_GAUSS, &basis_u); 38 39 // QFunction 40 CeedQFunctionCreateIdentity(ceed, 1, CEED_EVAL_INTERP, CEED_EVAL_NONE, &qf_identity); 41 42 // Operators 43 CeedOperatorCreate(ceed, qf_identity, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, &op_identity); 44 CeedOperatorSetField(op_identity, "input", elem_restriction_u, basis_u, CEED_VECTOR_ACTIVE); 45 CeedOperatorSetField(op_identity, "output", elem_restriction_u_i, CEED_BASIS_NONE, CEED_VECTOR_ACTIVE); 46 47 CeedVectorSetValue(u, 3.0); 48 CeedOperatorApply(op_identity, u, v, CEED_REQUEST_IMMEDIATE); 49 50 // Check output 51 { 52 const CeedScalar *v_array; 53 54 CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array); 55 for (CeedInt i = 0; i < q * num_elem; i++) { 56 if (fabs(v_array[i] - 3.) > 100. * CEED_EPSILON) printf("[%" CeedInt_FMT "] Computed Value: %f != True Value: 3.0\n", i, v_array[i]); 57 } 58 CeedVectorRestoreArrayRead(v, &v_array); 59 } 60 61 CeedVectorDestroy(&u); 62 CeedVectorDestroy(&v); 63 CeedElemRestrictionDestroy(&elem_restriction_u); 64 CeedElemRestrictionDestroy(&elem_restriction_u_i); 65 CeedBasisDestroy(&basis_u); 66 CeedQFunctionDestroy(&qf_identity); 67 CeedOperatorDestroy(&op_identity); 68 CeedDestroy(&ceed); 69 return 0; 70 } 71