xref: /libCEED/tests/t400-qfunction.c (revision 288c044332e33f37503f09b6484fec9d0a55fba1)
14411cf47Sjeremylt /// @file
24411cf47Sjeremylt /// Test creation, evaluation, and destruction for qfunction
34411cf47Sjeremylt /// \test Test creation, evaluation, and destruction for qfunction
457c64913Sjeremylt #include <ceed.h>
557c64913Sjeremylt 
64d537eeaSYohann #include "t400-qfunction.h"
757c64913Sjeremylt 
857c64913Sjeremylt int main(int argc, char **argv) {
957c64913Sjeremylt   Ceed ceed;
10aedaa0e5Sjeremylt   CeedVector in[16], out[16];
11aedaa0e5Sjeremylt   CeedVector Qdata, W, U, V;
1257c64913Sjeremylt   CeedQFunction qf_setup, qf_mass;
1357c64913Sjeremylt   CeedInt Q = 8;
14aedaa0e5Sjeremylt   const CeedScalar *vv;
15aedaa0e5Sjeremylt   CeedScalar w[Q], u[Q], v[Q];
1657c64913Sjeremylt 
1757c64913Sjeremylt 
1857c64913Sjeremylt   CeedInit(argv[1], &ceed);
19aedaa0e5Sjeremylt 
204d537eeaSYohann   CeedQFunctionCreateInterior(ceed, 1, setup, setup_loc, &qf_setup);
2157c64913Sjeremylt   CeedQFunctionAddInput(qf_setup, "w", 1, CEED_EVAL_INTERP);
2257c64913Sjeremylt   CeedQFunctionAddOutput(qf_setup, "qdata", 1, CEED_EVAL_INTERP);
2357c64913Sjeremylt 
244d537eeaSYohann   CeedQFunctionCreateInterior(ceed, 1, mass, mass_loc, &qf_mass);
2557c64913Sjeremylt   CeedQFunctionAddInput(qf_mass, "qdata", 1, CEED_EVAL_INTERP);
2657c64913Sjeremylt   CeedQFunctionAddInput(qf_mass, "u", 1, CEED_EVAL_INTERP);
2757c64913Sjeremylt   CeedQFunctionAddOutput(qf_mass, "v", 1, CEED_EVAL_INTERP);
2857c64913Sjeremylt 
2957c64913Sjeremylt   for (CeedInt i=0; i<Q; i++) {
3057c64913Sjeremylt     CeedScalar x = 2.*i/(Q-1) - 1;
3157c64913Sjeremylt     w[i] = 1 - x*x;
3257c64913Sjeremylt     u[i] = 2 + 3*x + 5*x*x;
3357c64913Sjeremylt     v[i] = w[i] * u[i];
3457c64913Sjeremylt   }
35aedaa0e5Sjeremylt 
36aedaa0e5Sjeremylt   CeedVectorCreate(ceed, Q, &W);
37*288c0443SJeremy L Thompson   CeedVectorSetArray(W, CEED_MEM_HOST, CEED_USE_POINTER, w);
38aedaa0e5Sjeremylt   CeedVectorCreate(ceed, Q, &U);
39*288c0443SJeremy L Thompson   CeedVectorSetArray(U, CEED_MEM_HOST, CEED_USE_POINTER, u);
40aedaa0e5Sjeremylt   CeedVectorCreate(ceed, Q, &V);
41aedaa0e5Sjeremylt   CeedVectorSetValue(V, 0);
42aedaa0e5Sjeremylt   CeedVectorCreate(ceed, Q, &Qdata);
43aedaa0e5Sjeremylt   CeedVectorSetValue(Qdata, 0);
44aedaa0e5Sjeremylt 
4557c64913Sjeremylt   {
46aedaa0e5Sjeremylt     in[0] = W;
47aedaa0e5Sjeremylt     out[0] = Qdata;
4857c64913Sjeremylt     CeedQFunctionApply(qf_setup, Q, in, out);
4957c64913Sjeremylt   }
5057c64913Sjeremylt   {
51aedaa0e5Sjeremylt     in[0] = W;
52aedaa0e5Sjeremylt     in[1] = U;
53aedaa0e5Sjeremylt     out[0] = V;
5457c64913Sjeremylt     CeedQFunctionApply(qf_mass, Q, in, out);
5557c64913Sjeremylt   }
56aedaa0e5Sjeremylt 
57aedaa0e5Sjeremylt   CeedVectorGetArrayRead(V, CEED_MEM_HOST, &vv);
58a2546046Sjeremylt   for (CeedInt i=0; i<Q; i++)
59a2546046Sjeremylt     if (v[i] != vv[i])
60a2546046Sjeremylt       // LCOV_EXCL_START
61a2546046Sjeremylt       printf("[%d] v %f != vv %f\n",i, v[i], vv[i]);
62de996c55Sjeremylt   // LCOV_EXCL_STOP
63aedaa0e5Sjeremylt   CeedVectorRestoreArrayRead(V, &vv);
64aedaa0e5Sjeremylt 
65aedaa0e5Sjeremylt   CeedVectorDestroy(&W);
66aedaa0e5Sjeremylt   CeedVectorDestroy(&U);
67aedaa0e5Sjeremylt   CeedVectorDestroy(&V);
68aedaa0e5Sjeremylt   CeedVectorDestroy(&Qdata);
6957c64913Sjeremylt   CeedQFunctionDestroy(&qf_setup);
7057c64913Sjeremylt   CeedQFunctionDestroy(&qf_mass);
7157c64913Sjeremylt   CeedDestroy(&ceed);
7257c64913Sjeremylt   return 0;
7357c64913Sjeremylt }
74