xref: /libCEED/tests/t401-qfunction.c (revision 1e35832b7882b4f9539a80b9596f7c908d7f362c)
1*1e35832bSjeremylt /// @file
2*1e35832bSjeremylt /// Test creation, evaluation, and destruction for qfunction
3*1e35832bSjeremylt /// \test Test creation, evaluation, and destruction for qfunction
4*1e35832bSjeremylt #include <ceed.h>
5*1e35832bSjeremylt #include <math.h>
6*1e35832bSjeremylt 
7*1e35832bSjeremylt static int setup(void *ctx, CeedInt Q, const CeedScalar *const *in,
8*1e35832bSjeremylt                  CeedScalar *const *out) {
9*1e35832bSjeremylt   const CeedScalar *w = in[0];
10*1e35832bSjeremylt   CeedScalar *qdata = out[0];
11*1e35832bSjeremylt   for (CeedInt i=0; i<Q; i++) {
12*1e35832bSjeremylt     qdata[i] = w[i];
13*1e35832bSjeremylt   }
14*1e35832bSjeremylt   return 0;
15*1e35832bSjeremylt }
16*1e35832bSjeremylt 
17*1e35832bSjeremylt static int mass(void *ctx, CeedInt Q, const CeedScalar *const *in,
18*1e35832bSjeremylt                 CeedScalar *const *out) {
19*1e35832bSjeremylt   CeedScalar *scale = (CeedScalar *)ctx;
20*1e35832bSjeremylt   const CeedScalar *qdata = in[0], *u = in[1];
21*1e35832bSjeremylt   CeedScalar *v = out[0];
22*1e35832bSjeremylt   for (CeedInt i=0; i<Q; i++) {
23*1e35832bSjeremylt     v[i] = scale[4] * qdata[i] * u[i];
24*1e35832bSjeremylt   }
25*1e35832bSjeremylt   return 0;
26*1e35832bSjeremylt }
27*1e35832bSjeremylt 
28*1e35832bSjeremylt int main(int argc, char **argv) {
29*1e35832bSjeremylt   Ceed ceed;
30*1e35832bSjeremylt   CeedVector in[16], out[16];
31*1e35832bSjeremylt   CeedVector Qdata, W, U, V;
32*1e35832bSjeremylt   CeedQFunction qf_setup, qf_mass;
33*1e35832bSjeremylt   CeedInt Q = 8;
34*1e35832bSjeremylt   const CeedScalar *vv;
35*1e35832bSjeremylt   CeedScalar w[Q], u[Q], v[Q], ctx[5] = {1, 2, 3, 4, 5};
36*1e35832bSjeremylt 
37*1e35832bSjeremylt 
38*1e35832bSjeremylt   CeedInit(argv[1], &ceed);
39*1e35832bSjeremylt 
40*1e35832bSjeremylt   CeedQFunctionCreateInterior(ceed, 1, setup, __FILE__ ":setup", &qf_setup);
41*1e35832bSjeremylt   CeedQFunctionAddInput(qf_setup, "w", 1, CEED_EVAL_INTERP);
42*1e35832bSjeremylt   CeedQFunctionAddOutput(qf_setup, "qdata", 1, CEED_EVAL_INTERP);
43*1e35832bSjeremylt 
44*1e35832bSjeremylt   CeedQFunctionCreateInterior(ceed, 1, mass, __FILE__ ":mass", &qf_mass);
45*1e35832bSjeremylt   CeedQFunctionAddInput(qf_mass, "qdata", 1, CEED_EVAL_INTERP);
46*1e35832bSjeremylt   CeedQFunctionAddInput(qf_mass, "u", 1, CEED_EVAL_INTERP);
47*1e35832bSjeremylt   CeedQFunctionAddOutput(qf_mass, "v", 1, CEED_EVAL_INTERP);
48*1e35832bSjeremylt 
49*1e35832bSjeremylt   CeedQFunctionSetContext(qf_mass, &ctx, sizeof(ctx));
50*1e35832bSjeremylt 
51*1e35832bSjeremylt   for (CeedInt i=0; i<Q; i++) {
52*1e35832bSjeremylt     CeedScalar x = 2.*i/(Q-1) - 1;
53*1e35832bSjeremylt     w[i] = 1 - x*x;
54*1e35832bSjeremylt     u[i] = 2 + 3*x + 5*x*x;
55*1e35832bSjeremylt     v[i] = w[i] * u[i];
56*1e35832bSjeremylt   }
57*1e35832bSjeremylt 
58*1e35832bSjeremylt   CeedVectorCreate(ceed, Q, &W);
59*1e35832bSjeremylt   CeedVectorSetArray(W, CEED_MEM_HOST, CEED_USE_POINTER, (CeedScalar *)&w);
60*1e35832bSjeremylt   CeedVectorCreate(ceed, Q, &U);
61*1e35832bSjeremylt   CeedVectorSetArray(U, CEED_MEM_HOST, CEED_USE_POINTER, (CeedScalar *)&u);
62*1e35832bSjeremylt   CeedVectorCreate(ceed, Q, &V);
63*1e35832bSjeremylt   CeedVectorSetValue(V, 0);
64*1e35832bSjeremylt   CeedVectorCreate(ceed, Q, &Qdata);
65*1e35832bSjeremylt   CeedVectorSetValue(Qdata, 0);
66*1e35832bSjeremylt 
67*1e35832bSjeremylt   {
68*1e35832bSjeremylt     in[0] = W;
69*1e35832bSjeremylt     out[0] = Qdata;
70*1e35832bSjeremylt     CeedQFunctionApply(qf_setup, Q, in, out);
71*1e35832bSjeremylt   }
72*1e35832bSjeremylt   {
73*1e35832bSjeremylt     in[0] = W;
74*1e35832bSjeremylt     in[1] = U;
75*1e35832bSjeremylt     out[0] = V;
76*1e35832bSjeremylt     CeedQFunctionApply(qf_mass, Q, in, out);
77*1e35832bSjeremylt   }
78*1e35832bSjeremylt 
79*1e35832bSjeremylt   CeedVectorGetArrayRead(V, CEED_MEM_HOST, &vv);
80*1e35832bSjeremylt   for (CeedInt i=0; i<Q; i++) {
81*1e35832bSjeremylt     if (fabs(ctx[4] * v[i] - vv[i]) > 1.e-14)
82*1e35832bSjeremylt       printf("[%d] v %f != vv %f\n",i, v[i], vv[i]);
83*1e35832bSjeremylt   }
84*1e35832bSjeremylt   CeedVectorRestoreArrayRead(V, &vv);
85*1e35832bSjeremylt 
86*1e35832bSjeremylt   CeedVectorDestroy(&W);
87*1e35832bSjeremylt   CeedVectorDestroy(&U);
88*1e35832bSjeremylt   CeedVectorDestroy(&V);
89*1e35832bSjeremylt   CeedVectorDestroy(&Qdata);
90*1e35832bSjeremylt   CeedQFunctionDestroy(&qf_setup);
91*1e35832bSjeremylt   CeedQFunctionDestroy(&qf_mass);
92*1e35832bSjeremylt   CeedDestroy(&ceed);
93*1e35832bSjeremylt   return 0;
94*1e35832bSjeremylt }
95