xref: /libCEED/tests/t410-qfunction.c (revision d1d35e2f02dc969aee8debf3fd943dd784aa847a) !
1288c0443SJeremy L Thompson /// @file
2*d1d35e2fSjeremylt /// Test creation, evaluation, and destruction for QFunction by name
3*d1d35e2fSjeremylt /// \test Test creation, evaluation, and destruction for QFunction by name
4288c0443SJeremy L Thompson #include <ceed.h>
5288c0443SJeremy L Thompson 
6288c0443SJeremy L Thompson int main(int argc, char **argv) {
7288c0443SJeremy L Thompson   Ceed ceed;
8288c0443SJeremy L Thompson   CeedVector in[16], out[16];
9*d1d35e2fSjeremylt   CeedVector Q_data, J, W, U, V;
10288c0443SJeremy L Thompson   CeedQFunction qf_setup, qf_mass;
11288c0443SJeremy L Thompson   CeedInt Q = 8;
12288c0443SJeremy L Thompson   const CeedScalar *vv;
13288c0443SJeremy L Thompson   CeedScalar j[Q], w[Q], u[Q], v[Q];
14288c0443SJeremy L Thompson 
15288c0443SJeremy L Thompson   CeedInit(argv[1], &ceed);
16288c0443SJeremy L Thompson 
17288c0443SJeremy L Thompson   CeedQFunctionCreateInteriorByName(ceed, "Mass1DBuild", &qf_setup);
18288c0443SJeremy L Thompson   CeedQFunctionCreateInteriorByName(ceed, "MassApply", &qf_mass);
19288c0443SJeremy L Thompson 
20288c0443SJeremy L Thompson   for (CeedInt i=0; i<Q; i++) {
21288c0443SJeremy L Thompson     CeedScalar x = 2.*i/(Q-1) - 1;
22288c0443SJeremy L Thompson     j[i] = 1;
23288c0443SJeremy L Thompson     w[i] = 1 - x*x;
24288c0443SJeremy L Thompson     u[i] = 2 + 3*x + 5*x*x;
25288c0443SJeremy L Thompson     v[i] = w[i] * u[i];
26288c0443SJeremy L Thompson   }
27288c0443SJeremy L Thompson 
28288c0443SJeremy L Thompson   CeedVectorCreate(ceed, Q, &J);
29288c0443SJeremy L Thompson   CeedVectorSetArray(J, CEED_MEM_HOST, CEED_USE_POINTER, j);
30288c0443SJeremy L Thompson   CeedVectorCreate(ceed, Q, &W);
31288c0443SJeremy L Thompson   CeedVectorSetArray(W, CEED_MEM_HOST, CEED_USE_POINTER, w);
32288c0443SJeremy L Thompson   CeedVectorCreate(ceed, Q, &U);
33288c0443SJeremy L Thompson   CeedVectorSetArray(U, CEED_MEM_HOST, CEED_USE_POINTER, u);
34288c0443SJeremy L Thompson   CeedVectorCreate(ceed, Q, &V);
35288c0443SJeremy L Thompson   CeedVectorSetValue(V, 0);
36*d1d35e2fSjeremylt   CeedVectorCreate(ceed, Q, &Q_data);
37*d1d35e2fSjeremylt   CeedVectorSetValue(Q_data, 0);
38288c0443SJeremy L Thompson 
39288c0443SJeremy L Thompson   {
40288c0443SJeremy L Thompson     in[0] = J;
41288c0443SJeremy L Thompson     in[1] = W;
42*d1d35e2fSjeremylt     out[0] = Q_data;
43288c0443SJeremy L Thompson     CeedQFunctionApply(qf_setup, Q, in, out);
44288c0443SJeremy L Thompson   }
45288c0443SJeremy L Thompson   {
46288c0443SJeremy L Thompson     in[0] = W;
47288c0443SJeremy L Thompson     in[1] = U;
48288c0443SJeremy L Thompson     out[0] = V;
49288c0443SJeremy L Thompson     CeedQFunctionApply(qf_mass, Q, in, out);
50288c0443SJeremy L Thompson   }
51288c0443SJeremy L Thompson 
52288c0443SJeremy L Thompson   CeedVectorGetArrayRead(V, CEED_MEM_HOST, &vv);
53288c0443SJeremy L Thompson   for (CeedInt i=0; i<Q; i++)
54288c0443SJeremy L Thompson     if (v[i] != vv[i])
55288c0443SJeremy L Thompson       // LCOV_EXCL_START
56288c0443SJeremy L Thompson       printf("[%d] v %f != vv %f\n",i, v[i], vv[i]);
57288c0443SJeremy L Thompson   // LCOV_EXCL_STOP
58288c0443SJeremy L Thompson   CeedVectorRestoreArrayRead(V, &vv);
59288c0443SJeremy L Thompson 
60288c0443SJeremy L Thompson   CeedVectorDestroy(&W);
61288c0443SJeremy L Thompson   CeedVectorDestroy(&U);
62288c0443SJeremy L Thompson   CeedVectorDestroy(&V);
63*d1d35e2fSjeremylt   CeedVectorDestroy(&Q_data);
64288c0443SJeremy L Thompson   CeedQFunctionDestroy(&qf_setup);
65288c0443SJeremy L Thompson   CeedQFunctionDestroy(&qf_mass);
66288c0443SJeremy L Thompson   CeedDestroy(&ceed);
67288c0443SJeremy L Thompson   return 0;
68288c0443SJeremy L Thompson }
69