xref: /libCEED/tests/t509-operator.c (revision 4fee36f0a30516a0b5ad51bf7eb3b32d83efd623)
10b454692Sjeremylt /// @file
20b454692Sjeremylt /// Test creation, action, and destruction for identity operator
30b454692Sjeremylt /// \test Test creation, action, and destruction for identity operator
40b454692Sjeremylt #include <ceed.h>
50b454692Sjeremylt #include <math.h>
62b730f8bSJeremy L Thompson #include <stdlib.h>
70b454692Sjeremylt 
80b454692Sjeremylt int main(int argc, char **argv) {
90b454692Sjeremylt   Ceed                ceed;
10*4fee36f0SJeremy L Thompson   CeedElemRestriction elem_restriction_u, elem_restriction_u_i;
110b454692Sjeremylt   CeedBasis           basis_u;
120b454692Sjeremylt   CeedQFunction       qf_identity;
130b454692Sjeremylt   CeedOperator        op_identity;
14*4fee36f0SJeremy L Thompson   CeedVector          u, v;
15*4fee36f0SJeremy L Thompson   CeedInt             num_elem = 15, p = 5, q = 8;
16*4fee36f0SJeremy L Thompson   CeedInt             elem_size = p, num_nodes = num_elem * (p - 1) + 1;
17*4fee36f0SJeremy L Thompson   CeedInt             ind_u[num_elem * p];
180b454692Sjeremylt 
190b454692Sjeremylt   CeedInit(argv[1], &ceed);
200b454692Sjeremylt 
21*4fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, num_nodes, &u);
22*4fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, elem_size * num_elem, &v);
23*4fee36f0SJeremy L Thompson 
240b454692Sjeremylt   // Restrictions
250b454692Sjeremylt   for (CeedInt i = 0; i < num_elem; i++) {
26*4fee36f0SJeremy L Thompson     for (CeedInt j = 0; j < p; j++) {
27*4fee36f0SJeremy L Thompson       ind_u[p * i + j] = i * (p - 1) + j;
280b454692Sjeremylt     }
290b454692Sjeremylt   }
30*4fee36f0SJeremy L Thompson   CeedElemRestrictionCreate(ceed, num_elem, elem_size, 1, 1, num_nodes, CEED_MEM_HOST, CEED_USE_POINTER, ind_u, &elem_restriction_u);
31*4fee36f0SJeremy L Thompson 
32*4fee36f0SJeremy L Thompson   CeedInt strides_u_i[3] = {1, p, p};
33*4fee36f0SJeremy L Thompson   CeedElemRestrictionCreateStrided(ceed, num_elem, elem_size, 1, elem_size * num_elem, strides_u_i, &elem_restriction_u_i);
340b454692Sjeremylt 
350b454692Sjeremylt   // Bases
36*4fee36f0SJeremy L Thompson   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, p, q, CEED_GAUSS, &basis_u);
370b454692Sjeremylt 
380b454692Sjeremylt   // QFunction
392b730f8bSJeremy L Thompson   CeedQFunctionCreateIdentity(ceed, 1, CEED_EVAL_NONE, CEED_EVAL_NONE, &qf_identity);
400b454692Sjeremylt 
410b454692Sjeremylt   // Operators
422b730f8bSJeremy L Thompson   CeedOperatorCreate(ceed, qf_identity, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, &op_identity);
43*4fee36f0SJeremy L Thompson   CeedOperatorSetField(op_identity, "input", elem_restriction_u, CEED_BASIS_COLLOCATED, CEED_VECTOR_ACTIVE);
44*4fee36f0SJeremy L Thompson   CeedOperatorSetField(op_identity, "output", elem_restriction_u_i, CEED_BASIS_COLLOCATED, CEED_VECTOR_ACTIVE);
450b454692Sjeremylt   CeedOperatorSetNumQuadraturePoints(op_identity, elem_size);
460b454692Sjeremylt 
47*4fee36f0SJeremy L Thompson   CeedVectorSetValue(u, 3.0);
48*4fee36f0SJeremy L Thompson   CeedOperatorApply(op_identity, u, v, CEED_REQUEST_IMMEDIATE);
490b454692Sjeremylt 
500b454692Sjeremylt   // Check output
51*4fee36f0SJeremy L Thompson   {
52*4fee36f0SJeremy L Thompson     const CeedScalar *v_array;
530b454692Sjeremylt 
54*4fee36f0SJeremy L Thompson     CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array);
55*4fee36f0SJeremy L Thompson     for (CeedInt i = 0; i < elem_size * num_elem; i++) {
56*4fee36f0SJeremy L Thompson       if (fabs(v_array[i] - 3.) > 1e-14) printf("[%" CeedInt_FMT "] Computed Value: %f != True Value: 1.0\n", i, v_array[i]);
57*4fee36f0SJeremy L Thompson     }
58*4fee36f0SJeremy L Thompson     CeedVectorRestoreArrayRead(v, &v_array);
59*4fee36f0SJeremy L Thompson   }
60*4fee36f0SJeremy L Thompson 
61*4fee36f0SJeremy L Thompson   CeedVectorDestroy(&u);
62*4fee36f0SJeremy L Thompson   CeedVectorDestroy(&v);
63*4fee36f0SJeremy L Thompson   CeedElemRestrictionDestroy(&elem_restriction_u);
64*4fee36f0SJeremy L Thompson   CeedElemRestrictionDestroy(&elem_restriction_u_i);
65*4fee36f0SJeremy L Thompson   CeedBasisDestroy(&basis_u);
660b454692Sjeremylt   CeedQFunctionDestroy(&qf_identity);
670b454692Sjeremylt   CeedOperatorDestroy(&op_identity);
680b454692Sjeremylt   CeedDestroy(&ceed);
690b454692Sjeremylt   return 0;
700b454692Sjeremylt }
71