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>
649aac155SJeremy L Thompson #include <stdio.h>
72b730f8bSJeremy L Thompson #include <stdlib.h>
80b454692Sjeremylt
main(int argc,char ** argv)90b454692Sjeremylt int main(int argc, char **argv) {
100b454692Sjeremylt Ceed ceed;
11*b4b7eaf6SJeremy L Thompson CeedElemRestriction elem_restriction_u_i;
120b454692Sjeremylt CeedQFunction qf_identity;
130b454692Sjeremylt CeedOperator op_identity;
144fee36f0SJeremy L Thompson CeedVector u, v;
15*b4b7eaf6SJeremy L Thompson CeedInt num_elem = 15, p = 5;
16*b4b7eaf6SJeremy L Thompson CeedInt num_nodes = num_elem * p;
170b454692Sjeremylt
180b454692Sjeremylt CeedInit(argv[1], &ceed);
190b454692Sjeremylt
204fee36f0SJeremy L Thompson CeedVectorCreate(ceed, num_nodes, &u);
21*b4b7eaf6SJeremy L Thompson CeedVectorCreate(ceed, num_nodes, &v);
224fee36f0SJeremy L Thompson
230b454692Sjeremylt // Restrictions
24*b4b7eaf6SJeremy L Thompson CeedInt strides_u_i[3] = {1, p, p};
25*b4b7eaf6SJeremy L Thompson CeedElemRestrictionCreateStrided(ceed, num_elem, p, 1, p * num_elem, strides_u_i, &elem_restriction_u_i);
260b454692Sjeremylt
270b454692Sjeremylt // QFunction
28*b4b7eaf6SJeremy L Thompson CeedQFunctionCreateIdentity(ceed, 1, CEED_EVAL_NONE, CEED_EVAL_NONE, &qf_identity);
290b454692Sjeremylt
300b454692Sjeremylt // Operators
312b730f8bSJeremy L Thompson CeedOperatorCreate(ceed, qf_identity, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, &op_identity);
32*b4b7eaf6SJeremy L Thompson CeedOperatorSetField(op_identity, "input", elem_restriction_u_i, CEED_BASIS_NONE, CEED_VECTOR_ACTIVE);
33356036faSJeremy L Thompson CeedOperatorSetField(op_identity, "output", elem_restriction_u_i, CEED_BASIS_NONE, CEED_VECTOR_ACTIVE);
340b454692Sjeremylt
354fee36f0SJeremy L Thompson CeedVectorSetValue(u, 3.0);
364fee36f0SJeremy L Thompson CeedOperatorApply(op_identity, u, v, CEED_REQUEST_IMMEDIATE);
370b454692Sjeremylt
380b454692Sjeremylt // Check output
394fee36f0SJeremy L Thompson {
404fee36f0SJeremy L Thompson const CeedScalar *v_array;
410b454692Sjeremylt
424fee36f0SJeremy L Thompson CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array);
43*b4b7eaf6SJeremy L Thompson for (CeedInt i = 0; i < num_nodes; i++) {
44506b1a0cSSebastian Grimberg if (fabs(v_array[i] - 3.) > 100. * CEED_EPSILON) printf("[%" CeedInt_FMT "] Computed Value: %f != True Value: 3.0\n", i, v_array[i]);
454fee36f0SJeremy L Thompson }
464fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(v, &v_array);
474fee36f0SJeremy L Thompson }
484fee36f0SJeremy L Thompson
494fee36f0SJeremy L Thompson CeedVectorDestroy(&u);
504fee36f0SJeremy L Thompson CeedVectorDestroy(&v);
514fee36f0SJeremy L Thompson CeedElemRestrictionDestroy(&elem_restriction_u_i);
520b454692Sjeremylt CeedQFunctionDestroy(&qf_identity);
530b454692Sjeremylt CeedOperatorDestroy(&op_identity);
540b454692Sjeremylt CeedDestroy(&ceed);
550b454692Sjeremylt return 0;
560b454692Sjeremylt }
57