xref: /libCEED/tests/t317-basis.c (revision 4fee36f0a30516a0b5ad51bf7eb3b32d83efd623) !
13bd813ffSjeremylt /// @file
23bd813ffSjeremylt /// Test polynomial derivative interpolation in 1D
33bd813ffSjeremylt /// \test Test polynomial derivative interpolation in 1D
43bd813ffSjeremylt #include <ceed.h>
53bd813ffSjeremylt #include <math.h>
63bd813ffSjeremylt 
73bd813ffSjeremylt #define ALEN(a) (sizeof(a) / sizeof((a)[0]))
83bd813ffSjeremylt 
9*4fee36f0SJeremy L Thompson static CeedScalar Eval(CeedScalar x, CeedInt n, const CeedScalar *p) {
103bd813ffSjeremylt   CeedScalar y = p[n - 1];
113bd813ffSjeremylt   for (CeedInt i = n - 2; i >= 0; i--) y = y * x + p[i];
123bd813ffSjeremylt   return y;
133bd813ffSjeremylt }
143bd813ffSjeremylt 
153bd813ffSjeremylt int main(int argc, char **argv) {
163bd813ffSjeremylt   Ceed             ceed;
17*4fee36f0SJeremy L Thompson   CeedVector       x, x_q, u, u_q;
18d1d35e2fSjeremylt   CeedBasis        basis_x_lobatto, basis_u_lobatto, basis_x_gauss, basis_u_gauss;
19*4fee36f0SJeremy L Thompson   CeedInt          q     = 6;
203bd813ffSjeremylt   const CeedScalar p[6]  = {1, 2, 3, 4, 5, 6};  // 1 + 2x + 3x^2 + ...
213bd813ffSjeremylt   const CeedScalar dp[5] = {2, 6, 12, 20, 30};  // 2 + 6x + 12x^2 + ...
223bd813ffSjeremylt 
233bd813ffSjeremylt   CeedInit(argv[1], &ceed);
243bd813ffSjeremylt 
25*4fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, 2, &x);
26*4fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, q, &x_q);
27*4fee36f0SJeremy L Thompson   CeedVectorSetValue(x_q, 0);
28*4fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, q, &u);
29*4fee36f0SJeremy L Thompson   CeedVectorSetValue(u, 0);
30*4fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, q, &u_q);
313bd813ffSjeremylt 
32*4fee36f0SJeremy L Thompson   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, q, CEED_GAUSS_LOBATTO, &basis_x_lobatto);
33*4fee36f0SJeremy L Thompson   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, q, q, CEED_GAUSS_LOBATTO, &basis_u_lobatto);
343bd813ffSjeremylt 
35*4fee36f0SJeremy L Thompson   {
36*4fee36f0SJeremy L Thompson     CeedScalar x_array[2];
373bd813ffSjeremylt 
38*4fee36f0SJeremy L Thompson     for (int i = 0; i < 2; i++) x_array[i] = CeedIntPow(-1, i + 1);
39*4fee36f0SJeremy L Thompson     CeedVectorSetArray(x, CEED_MEM_HOST, CEED_COPY_VALUES, x_array);
40*4fee36f0SJeremy L Thompson   }
41*4fee36f0SJeremy L Thompson   CeedBasisApply(basis_x_lobatto, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, x, x_q);
423bd813ffSjeremylt 
43*4fee36f0SJeremy L Thompson   {
44*4fee36f0SJeremy L Thompson     const CeedScalar *x_q_array;
45*4fee36f0SJeremy L Thompson     CeedScalar        u_q_array[q];
46*4fee36f0SJeremy L Thompson 
47*4fee36f0SJeremy L Thompson     CeedVectorGetArrayRead(x_q, CEED_MEM_HOST, &x_q_array);
48*4fee36f0SJeremy L Thompson     for (CeedInt i = 0; i < q; i++) u_q_array[i] = Eval(x_q_array[i], ALEN(p), p);
49*4fee36f0SJeremy L Thompson     CeedVectorRestoreArrayRead(x_q, &x_q_array);
50*4fee36f0SJeremy L Thompson     CeedVectorSetArray(u_q, CEED_MEM_HOST, CEED_COPY_VALUES, u_q_array);
51*4fee36f0SJeremy L Thompson   }
523bd813ffSjeremylt 
533bd813ffSjeremylt   // This operation is the identity because the quadrature is collocated
54*4fee36f0SJeremy L Thompson   CeedBasisApply(basis_u_lobatto, 1, CEED_TRANSPOSE, CEED_EVAL_INTERP, u_q, u);
553bd813ffSjeremylt 
56*4fee36f0SJeremy L Thompson   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, q, CEED_GAUSS, &basis_x_gauss);
57*4fee36f0SJeremy L Thompson   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, q, q, CEED_GAUSS, &basis_u_gauss);
583bd813ffSjeremylt 
59*4fee36f0SJeremy L Thompson   CeedBasisApply(basis_x_gauss, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, x, x_q);
60*4fee36f0SJeremy L Thompson   CeedBasisApply(basis_u_gauss, 1, CEED_NOTRANSPOSE, CEED_EVAL_GRAD, u, u_q);
613bd813ffSjeremylt 
62*4fee36f0SJeremy L Thompson   {
63*4fee36f0SJeremy L Thompson     const CeedScalar *x_q_array, *u_q_array;
64*4fee36f0SJeremy L Thompson 
65*4fee36f0SJeremy L Thompson     CeedVectorGetArrayRead(x_q, CEED_MEM_HOST, &x_q_array);
66*4fee36f0SJeremy L Thompson     CeedVectorGetArrayRead(u_q, CEED_MEM_HOST, &u_q_array);
67*4fee36f0SJeremy L Thompson     for (CeedInt i = 0; i < q; i++) {
68*4fee36f0SJeremy L Thompson       CeedScalar px = Eval(x_q_array[i], ALEN(dp), dp);
69*4fee36f0SJeremy L Thompson       if (fabs(u_q_array[i] - px) > 1000. * CEED_EPSILON) printf("%f != %f = p(%f)\n", u_q_array[i], px, x_q_array[i]);
703bd813ffSjeremylt     }
71*4fee36f0SJeremy L Thompson     CeedVectorRestoreArrayRead(x_q, &x_q_array);
72*4fee36f0SJeremy L Thompson     CeedVectorRestoreArrayRead(u_q, &u_q_array);
73*4fee36f0SJeremy L Thompson   }
743bd813ffSjeremylt 
75*4fee36f0SJeremy L Thompson   CeedVectorDestroy(&x);
76*4fee36f0SJeremy L Thompson   CeedVectorDestroy(&x_q);
77*4fee36f0SJeremy L Thompson   CeedVectorDestroy(&u);
78*4fee36f0SJeremy L Thompson   CeedVectorDestroy(&u_q);
79d1d35e2fSjeremylt   CeedBasisDestroy(&basis_x_lobatto);
80d1d35e2fSjeremylt   CeedBasisDestroy(&basis_u_lobatto);
81d1d35e2fSjeremylt   CeedBasisDestroy(&basis_x_gauss);
82d1d35e2fSjeremylt   CeedBasisDestroy(&basis_u_gauss);
833bd813ffSjeremylt   CeedDestroy(&ceed);
843bd813ffSjeremylt   return 0;
853bd813ffSjeremylt }
86