xref: /libCEED/tests/t317-basis.c (revision 3bd813ff881321d63f499fd87a0d6e6a47c6a2dc)
1*3bd813ffSjeremylt /// @file
2*3bd813ffSjeremylt /// Test polynomial derivative interpolation in 1D
3*3bd813ffSjeremylt /// \test Test polynomial derivative interpolation in 1D
4*3bd813ffSjeremylt #include <ceed.h>
5*3bd813ffSjeremylt #include <math.h>
6*3bd813ffSjeremylt 
7*3bd813ffSjeremylt #define ALEN(a) (sizeof(a) / sizeof((a)[0]))
8*3bd813ffSjeremylt 
9*3bd813ffSjeremylt static CeedScalar PolyEval(CeedScalar x, CeedInt n, const CeedScalar *p) {
10*3bd813ffSjeremylt   CeedScalar y = p[n-1];
11*3bd813ffSjeremylt   for (CeedInt i=n-2; i>=0; i--) y = y*x + p[i];
12*3bd813ffSjeremylt   return y;
13*3bd813ffSjeremylt }
14*3bd813ffSjeremylt 
15*3bd813ffSjeremylt int main(int argc, char **argv) {
16*3bd813ffSjeremylt   Ceed ceed;
17*3bd813ffSjeremylt   CeedVector X, Xq, U, Uq;
18*3bd813ffSjeremylt   CeedBasis bxl, bul, bxg, bug;
19*3bd813ffSjeremylt   CeedInt Q = 6;
20*3bd813ffSjeremylt   const CeedScalar p[6] = {1, 2, 3, 4, 5, 6}; // 1 + 2x + 3x^2 + ...
21*3bd813ffSjeremylt   const CeedScalar dp[5] = {2, 6, 12, 20, 30}; // 2 + 6x + 12x^2 + ...
22*3bd813ffSjeremylt   const CeedScalar *xq, *uuq;
23*3bd813ffSjeremylt   CeedScalar x[2], uq[Q];
24*3bd813ffSjeremylt 
25*3bd813ffSjeremylt   CeedInit(argv[1], &ceed);
26*3bd813ffSjeremylt 
27*3bd813ffSjeremylt   CeedVectorCreate(ceed, 2, &X);
28*3bd813ffSjeremylt   CeedVectorCreate(ceed, Q, &Xq);
29*3bd813ffSjeremylt   CeedVectorSetValue(Xq, 0);
30*3bd813ffSjeremylt   CeedVectorCreate(ceed, Q, &U);
31*3bd813ffSjeremylt   CeedVectorSetValue(U, 0);
32*3bd813ffSjeremylt   CeedVectorCreate(ceed, Q, &Uq);
33*3bd813ffSjeremylt 
34*3bd813ffSjeremylt   CeedBasisCreateTensorH1Lagrange(ceed, 1,  1, 2, Q, CEED_GAUSS_LOBATTO, &bxl);
35*3bd813ffSjeremylt   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, Q, Q, CEED_GAUSS_LOBATTO, &bul);
36*3bd813ffSjeremylt 
37*3bd813ffSjeremylt   for (int i = 0; i < 2; i++)
38*3bd813ffSjeremylt     x[i] = CeedIntPow(-1, i+1);
39*3bd813ffSjeremylt   CeedVectorSetArray(X, CEED_MEM_HOST, CEED_USE_POINTER, (CeedScalar *)&x);
40*3bd813ffSjeremylt 
41*3bd813ffSjeremylt   CeedBasisApply(bxl, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, X, Xq);
42*3bd813ffSjeremylt 
43*3bd813ffSjeremylt   CeedVectorGetArrayRead(Xq, CEED_MEM_HOST, &xq);
44*3bd813ffSjeremylt   for (CeedInt i=0; i<Q; i++)
45*3bd813ffSjeremylt     uq[i] = PolyEval(xq[i], ALEN(p), p);
46*3bd813ffSjeremylt   CeedVectorRestoreArrayRead(Xq, &xq);
47*3bd813ffSjeremylt   CeedVectorSetArray(Uq, CEED_MEM_HOST, CEED_USE_POINTER, (CeedScalar *)&uq);
48*3bd813ffSjeremylt 
49*3bd813ffSjeremylt   // This operation is the identity because the quadrature is collocated
50*3bd813ffSjeremylt   CeedBasisApply(bul, 1, CEED_TRANSPOSE, CEED_EVAL_INTERP, Uq, U);
51*3bd813ffSjeremylt 
52*3bd813ffSjeremylt   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS, &bxg);
53*3bd813ffSjeremylt   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, Q, Q, CEED_GAUSS, &bug);
54*3bd813ffSjeremylt 
55*3bd813ffSjeremylt   CeedBasisApply(bxg, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, X, Xq);
56*3bd813ffSjeremylt   CeedBasisApply(bug, 1, CEED_NOTRANSPOSE, CEED_EVAL_GRAD, U, Uq);
57*3bd813ffSjeremylt 
58*3bd813ffSjeremylt   CeedVectorGetArrayRead(Xq, CEED_MEM_HOST, &xq);
59*3bd813ffSjeremylt   CeedVectorGetArrayRead(Uq, CEED_MEM_HOST, &uuq);
60*3bd813ffSjeremylt   for (CeedInt i=0; i<Q; i++) {
61*3bd813ffSjeremylt     CeedScalar px = PolyEval(xq[i], ALEN(dp), dp);
62*3bd813ffSjeremylt     if (fabs(uuq[i] - px) > 1E-13)
63*3bd813ffSjeremylt       // LCOV_EXCL_START
64*3bd813ffSjeremylt       printf("%f != %f=p(%f)\n", uuq[i], px, xq[i]);
65*3bd813ffSjeremylt     // LCOV_EXCL_STOP
66*3bd813ffSjeremylt   }
67*3bd813ffSjeremylt   CeedVectorRestoreArrayRead(Xq, &xq);
68*3bd813ffSjeremylt   CeedVectorRestoreArrayRead(Uq, &uuq);
69*3bd813ffSjeremylt 
70*3bd813ffSjeremylt   CeedVectorDestroy(&X);
71*3bd813ffSjeremylt   CeedVectorDestroy(&Xq);
72*3bd813ffSjeremylt   CeedVectorDestroy(&U);
73*3bd813ffSjeremylt   CeedVectorDestroy(&Uq);
74*3bd813ffSjeremylt   CeedBasisDestroy(&bxl);
75*3bd813ffSjeremylt   CeedBasisDestroy(&bul);
76*3bd813ffSjeremylt   CeedBasisDestroy(&bxg);
77*3bd813ffSjeremylt   CeedBasisDestroy(&bug);
78*3bd813ffSjeremylt   CeedDestroy(&ceed);
79*3bd813ffSjeremylt   return 0;
80*3bd813ffSjeremylt }
81