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 elem_size = p, 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, elem_size * 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, elem_size, 1, 1, num_nodes, CEED_MEM_HOST, CEED_USE_POINTER, ind_u, &elem_restriction_u); 32 33 CeedInt strides_u_i[3] = {1, p, p}; 34 CeedElemRestrictionCreateStrided(ceed, num_elem, elem_size, 1, elem_size * 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_NONE, 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, CEED_BASIS_COLLOCATED, CEED_VECTOR_ACTIVE); 45 CeedOperatorSetField(op_identity, "output", elem_restriction_u_i, CEED_BASIS_COLLOCATED, CEED_VECTOR_ACTIVE); 46 CeedOperatorSetNumQuadraturePoints(op_identity, elem_size); 47 48 CeedVectorSetValue(u, 3.0); 49 CeedOperatorApply(op_identity, u, v, CEED_REQUEST_IMMEDIATE); 50 51 // Check output 52 { 53 const CeedScalar *v_array; 54 55 CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array); 56 for (CeedInt i = 0; i < elem_size * num_elem; i++) { 57 if (fabs(v_array[i] - 3.) > 1e-14) printf("[%" CeedInt_FMT "] Computed Value: %f != True Value: 1.0\n", i, v_array[i]); 58 } 59 CeedVectorRestoreArrayRead(v, &v_array); 60 } 61 62 CeedVectorDestroy(&u); 63 CeedVectorDestroy(&v); 64 CeedElemRestrictionDestroy(&elem_restriction_u); 65 CeedElemRestrictionDestroy(&elem_restriction_u_i); 66 CeedBasisDestroy(&basis_u); 67 CeedQFunctionDestroy(&qf_identity); 68 CeedOperatorDestroy(&op_identity); 69 CeedDestroy(&ceed); 70 return 0; 71 } 72