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 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