xref: /libCEED/tests/t509-operator.c (revision fcbe8c069ccd22d836386af4823e4c7d84ee0a69)
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   // -- Note: number of quadrature points for field set by elem_size of restriction when CEED_BASIS_COLLOCATED used
45   CeedOperatorSetField(op_identity, "input", elem_restriction_u, CEED_BASIS_COLLOCATED, CEED_VECTOR_ACTIVE);
46   CeedOperatorSetField(op_identity, "output", elem_restriction_u_i, CEED_BASIS_COLLOCATED, CEED_VECTOR_ACTIVE);
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