xref: /libCEED/tests/t400-qfunction.c (revision d1d35e2f02dc969aee8debf3fd943dd784aa847a)
14411cf47Sjeremylt /// @file
2*d1d35e2fSjeremylt /// Test creation, evaluation, and destruction for QFunction
3*d1d35e2fSjeremylt /// \test Test creation, evaluation, and destruction for QFunction
457c64913Sjeremylt #include <ceed.h>
54d537eeaSYohann #include "t400-qfunction.h"
657c64913Sjeremylt 
757c64913Sjeremylt int main(int argc, char **argv) {
857c64913Sjeremylt   Ceed ceed;
9aedaa0e5Sjeremylt   CeedVector in[16], out[16];
10*d1d35e2fSjeremylt   CeedVector Q_data, W, U, V;
1157c64913Sjeremylt   CeedQFunction qf_setup, qf_mass;
1257c64913Sjeremylt   CeedInt Q = 8;
13aedaa0e5Sjeremylt   const CeedScalar *vv;
14aedaa0e5Sjeremylt   CeedScalar w[Q], u[Q], v[Q];
1557c64913Sjeremylt 
1657c64913Sjeremylt   CeedInit(argv[1], &ceed);
17aedaa0e5Sjeremylt 
184d537eeaSYohann   CeedQFunctionCreateInterior(ceed, 1, setup, setup_loc, &qf_setup);
1984e209c4Sjeremylt   CeedQFunctionAddInput(qf_setup, "w", 1, CEED_EVAL_WEIGHT);
2084e209c4Sjeremylt   CeedQFunctionAddOutput(qf_setup, "qdata", 1, CEED_EVAL_NONE);
2157c64913Sjeremylt 
224d537eeaSYohann   CeedQFunctionCreateInterior(ceed, 1, mass, mass_loc, &qf_mass);
2384e209c4Sjeremylt   CeedQFunctionAddInput(qf_mass, "qdata", 1, CEED_EVAL_NONE);
2457c64913Sjeremylt   CeedQFunctionAddInput(qf_mass, "u", 1, CEED_EVAL_INTERP);
2557c64913Sjeremylt   CeedQFunctionAddOutput(qf_mass, "v", 1, CEED_EVAL_INTERP);
2657c64913Sjeremylt 
2757c64913Sjeremylt   for (CeedInt i=0; i<Q; i++) {
2857c64913Sjeremylt     CeedScalar x = 2.*i/(Q-1) - 1;
2957c64913Sjeremylt     w[i] = 1 - x*x;
3057c64913Sjeremylt     u[i] = 2 + 3*x + 5*x*x;
3157c64913Sjeremylt     v[i] = w[i] * u[i];
3257c64913Sjeremylt   }
33aedaa0e5Sjeremylt 
34aedaa0e5Sjeremylt   CeedVectorCreate(ceed, Q, &W);
35288c0443SJeremy L Thompson   CeedVectorSetArray(W, CEED_MEM_HOST, CEED_USE_POINTER, w);
36aedaa0e5Sjeremylt   CeedVectorCreate(ceed, Q, &U);
37288c0443SJeremy L Thompson   CeedVectorSetArray(U, CEED_MEM_HOST, CEED_USE_POINTER, u);
38aedaa0e5Sjeremylt   CeedVectorCreate(ceed, Q, &V);
39aedaa0e5Sjeremylt   CeedVectorSetValue(V, 0);
40*d1d35e2fSjeremylt   CeedVectorCreate(ceed, Q, &Q_data);
41*d1d35e2fSjeremylt   CeedVectorSetValue(Q_data, 0);
42aedaa0e5Sjeremylt 
4357c64913Sjeremylt   {
44aedaa0e5Sjeremylt     in[0] = W;
45*d1d35e2fSjeremylt     out[0] = Q_data;
4657c64913Sjeremylt     CeedQFunctionApply(qf_setup, Q, in, out);
4757c64913Sjeremylt   }
4857c64913Sjeremylt   {
49aedaa0e5Sjeremylt     in[0] = W;
50aedaa0e5Sjeremylt     in[1] = U;
51aedaa0e5Sjeremylt     out[0] = V;
5257c64913Sjeremylt     CeedQFunctionApply(qf_mass, Q, in, out);
5357c64913Sjeremylt   }
54aedaa0e5Sjeremylt 
55aedaa0e5Sjeremylt   CeedVectorGetArrayRead(V, CEED_MEM_HOST, &vv);
56a2546046Sjeremylt   for (CeedInt i=0; i<Q; i++)
57a2546046Sjeremylt     if (v[i] != vv[i])
58a2546046Sjeremylt       // LCOV_EXCL_START
59a2546046Sjeremylt       printf("[%d] v %f != vv %f\n",i, v[i], vv[i]);
60de996c55Sjeremylt   // LCOV_EXCL_STOP
61aedaa0e5Sjeremylt   CeedVectorRestoreArrayRead(V, &vv);
62aedaa0e5Sjeremylt 
63aedaa0e5Sjeremylt   CeedVectorDestroy(&W);
64aedaa0e5Sjeremylt   CeedVectorDestroy(&U);
65aedaa0e5Sjeremylt   CeedVectorDestroy(&V);
66*d1d35e2fSjeremylt   CeedVectorDestroy(&Q_data);
6757c64913Sjeremylt   CeedQFunctionDestroy(&qf_setup);
6857c64913Sjeremylt   CeedQFunctionDestroy(&qf_mass);
6957c64913Sjeremylt   CeedDestroy(&ceed);
7057c64913Sjeremylt   return 0;
7157c64913Sjeremylt }
72