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 <stdlib.h> 7 8 int main(int argc, char **argv) { 9 Ceed ceed; 10 CeedElemRestriction elem_restriction_u, elem_restriction_u_i; 11 CeedBasis basis_u; 12 CeedQFunction qf_identity; 13 CeedOperator op_identity; 14 CeedVector u, v; 15 CeedInt num_elem = 15, p = 5, q = 8; 16 CeedInt elem_size = p, num_nodes = num_elem * (p - 1) + 1; 17 CeedInt ind_u[num_elem * p]; 18 19 CeedInit(argv[1], &ceed); 20 21 CeedVectorCreate(ceed, num_nodes, &u); 22 CeedVectorCreate(ceed, elem_size * num_elem, &v); 23 24 // Restrictions 25 for (CeedInt i = 0; i < num_elem; i++) { 26 for (CeedInt j = 0; j < p; j++) { 27 ind_u[p * i + j] = i * (p - 1) + j; 28 } 29 } 30 CeedElemRestrictionCreate(ceed, num_elem, elem_size, 1, 1, num_nodes, CEED_MEM_HOST, CEED_USE_POINTER, ind_u, &elem_restriction_u); 31 32 CeedInt strides_u_i[3] = {1, p, p}; 33 CeedElemRestrictionCreateStrided(ceed, num_elem, elem_size, 1, elem_size * num_elem, strides_u_i, &elem_restriction_u_i); 34 35 // Bases 36 CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, p, q, CEED_GAUSS, &basis_u); 37 38 // QFunction 39 CeedQFunctionCreateIdentity(ceed, 1, CEED_EVAL_NONE, CEED_EVAL_NONE, &qf_identity); 40 41 // Operators 42 CeedOperatorCreate(ceed, qf_identity, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, &op_identity); 43 CeedOperatorSetField(op_identity, "input", elem_restriction_u, CEED_BASIS_COLLOCATED, CEED_VECTOR_ACTIVE); 44 CeedOperatorSetField(op_identity, "output", elem_restriction_u_i, CEED_BASIS_COLLOCATED, CEED_VECTOR_ACTIVE); 45 CeedOperatorSetNumQuadraturePoints(op_identity, elem_size); 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 < elem_size * num_elem; i++) { 56 if (fabs(v_array[i] - 3.) > 1e-14) printf("[%" CeedInt_FMT "] Computed Value: %f != True Value: 1.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