xref: /libCEED/tests/t509-operator.c (revision 07d5b98a8feba68a643190b8ea9bcdac5c3e6570)
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_i;
12   CeedQFunction       qf_identity;
13   CeedOperator        op_identity;
14   CeedVector          u, v;
15   CeedInt             num_elem = 15, p = 5;
16   CeedInt             num_nodes = num_elem * p;
17 
18   CeedInit(argv[1], &ceed);
19 
20   CeedVectorCreate(ceed, num_nodes, &u);
21   CeedVectorCreate(ceed, num_nodes, &v);
22 
23   // Restrictions
24   CeedInt strides_u_i[3] = {1, p, p};
25   CeedElemRestrictionCreateStrided(ceed, num_elem, p, 1, p * num_elem, strides_u_i, &elem_restriction_u_i);
26 
27   // QFunction
28   CeedQFunctionCreateIdentity(ceed, 1, CEED_EVAL_NONE, CEED_EVAL_NONE, &qf_identity);
29 
30   // Operators
31   CeedOperatorCreate(ceed, qf_identity, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, &op_identity);
32   CeedOperatorSetField(op_identity, "input", elem_restriction_u_i, CEED_BASIS_NONE, CEED_VECTOR_ACTIVE);
33   CeedOperatorSetField(op_identity, "output", elem_restriction_u_i, CEED_BASIS_NONE, CEED_VECTOR_ACTIVE);
34 
35   CeedVectorSetValue(u, 3.0);
36   CeedOperatorApply(op_identity, u, v, CEED_REQUEST_IMMEDIATE);
37 
38   // Check output
39   {
40     const CeedScalar *v_array;
41 
42     CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array);
43     for (CeedInt i = 0; i < num_nodes; i++) {
44       if (fabs(v_array[i] - 3.) > 100. * CEED_EPSILON) printf("[%" CeedInt_FMT "] Computed Value: %f != True Value: 3.0\n", i, v_array[i]);
45     }
46     CeedVectorRestoreArrayRead(v, &v_array);
47   }
48 
49   CeedVectorDestroy(&u);
50   CeedVectorDestroy(&v);
51   CeedElemRestrictionDestroy(&elem_restriction_u_i);
52   CeedQFunctionDestroy(&qf_identity);
53   CeedOperatorDestroy(&op_identity);
54   CeedDestroy(&ceed);
55   return 0;
56 }
57