xref: /libCEED/tests/t302-basis.c (revision 57c64913cb6f06c2f6a40825dd942ceba0d2fe12)
1*57c64913Sjeremylt // Test polynomial interpolation in 1D
2*57c64913Sjeremylt #include <ceed.h>
3*57c64913Sjeremylt #include <math.h>
4*57c64913Sjeremylt 
5*57c64913Sjeremylt #define ALEN(a) (sizeof(a) / sizeof((a)[0]))
6*57c64913Sjeremylt 
7*57c64913Sjeremylt static CeedScalar PolyEval(CeedScalar x, CeedInt n, const CeedScalar *p) {
8*57c64913Sjeremylt   CeedScalar y = p[n-1];
9*57c64913Sjeremylt   for (CeedInt i=n-2; i>=0; i--) y = y*x + p[i];
10*57c64913Sjeremylt   return y;
11*57c64913Sjeremylt }
12*57c64913Sjeremylt 
13*57c64913Sjeremylt int main(int argc, char **argv) {
14*57c64913Sjeremylt   Ceed ceed;
15*57c64913Sjeremylt   CeedBasis bxl, bul, bxg, bug;
16*57c64913Sjeremylt   CeedInt Q = 6;
17*57c64913Sjeremylt   const CeedScalar p[] = {1, 2, 3, 4, 5, 6}; // 1 + 2x + 3x^2 + ...
18*57c64913Sjeremylt   const CeedScalar x[] = {-1, 1};
19*57c64913Sjeremylt   CeedScalar xq[Q], uq[Q], u[Q];
20*57c64913Sjeremylt 
21*57c64913Sjeremylt   CeedInit(argv[1], &ceed);
22*57c64913Sjeremylt   CeedBasisCreateTensorH1Lagrange(ceed, 1,  1, 2, Q, CEED_GAUSS_LOBATTO, &bxl);
23*57c64913Sjeremylt   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, Q, Q, CEED_GAUSS_LOBATTO, &bul);
24*57c64913Sjeremylt   CeedBasisApply(bxl, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, x, xq);
25*57c64913Sjeremylt   for (CeedInt i=0; i<Q; i++) uq[i] = PolyEval(xq[i], ALEN(p), p);
26*57c64913Sjeremylt 
27*57c64913Sjeremylt   // This operation is the identity because the quadrature is collocated
28*57c64913Sjeremylt   CeedBasisApply(bul, 1, CEED_TRANSPOSE, CEED_EVAL_INTERP, uq, u);
29*57c64913Sjeremylt 
30*57c64913Sjeremylt   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS, &bxg);
31*57c64913Sjeremylt   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, Q, Q, CEED_GAUSS, &bug);
32*57c64913Sjeremylt   CeedBasisApply(bxg, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, x, xq);
33*57c64913Sjeremylt   CeedBasisApply(bug, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, u, uq);
34*57c64913Sjeremylt   for (CeedInt i=0; i<Q; i++) {
35*57c64913Sjeremylt     CeedScalar px = PolyEval(xq[i], ALEN(p), p);
36*57c64913Sjeremylt     if (!(fabs(uq[i] - px) < 1e-14)) {
37*57c64913Sjeremylt       printf("%f != %f=p(%f)\n", uq[i], px, xq[i]);
38*57c64913Sjeremylt     }
39*57c64913Sjeremylt   }
40*57c64913Sjeremylt 
41*57c64913Sjeremylt   CeedBasisDestroy(&bxl);
42*57c64913Sjeremylt   CeedBasisDestroy(&bul);
43*57c64913Sjeremylt   CeedBasisDestroy(&bxg);
44*57c64913Sjeremylt   CeedBasisDestroy(&bug);
45*57c64913Sjeremylt   CeedDestroy(&ceed);
46*57c64913Sjeremylt   return 0;
47*57c64913Sjeremylt }
48