1a8de75f0Sjeremylt /// @file 252bfb9bbSJeremy L Thompson /// Test polynomial interpolation in 1D 352bfb9bbSJeremy L Thompson /// \test Test polynomial interpolation in 1D 4a8de75f0Sjeremylt #include <ceed.h> 5a8de75f0Sjeremylt #include <math.h> 6a8de75f0Sjeremylt 752bfb9bbSJeremy L Thompson #define ALEN(a) (sizeof(a) / sizeof((a)[0])) 852bfb9bbSJeremy L Thompson 9*4fee36f0SJeremy L Thompson static CeedScalar Eval(CeedScalar x, CeedInt n, const CeedScalar *p) { 1052bfb9bbSJeremy L Thompson CeedScalar y = p[n - 1]; 1152bfb9bbSJeremy L Thompson for (CeedInt i = n - 2; i >= 0; i--) y = y * x + p[i]; 1252bfb9bbSJeremy L Thompson return y; 13a8de75f0Sjeremylt } 14a8de75f0Sjeremylt 15a8de75f0Sjeremylt int main(int argc, char **argv) { 16a8de75f0Sjeremylt 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; 2052bfb9bbSJeremy L Thompson const CeedScalar p[6] = {1, 2, 3, 4, 5, 6}; // 1 + 2x + 3x^2 + ... 21a8de75f0Sjeremylt 22a8de75f0Sjeremylt CeedInit(argv[1], &ceed); 23aedaa0e5Sjeremylt 24*4fee36f0SJeremy L Thompson CeedVectorCreate(ceed, 2, &x); 25*4fee36f0SJeremy L Thompson CeedVectorCreate(ceed, q, &x_q); 26*4fee36f0SJeremy L Thompson CeedVectorSetValue(x_q, 0); 27*4fee36f0SJeremy L Thompson CeedVectorCreate(ceed, q, &u); 28*4fee36f0SJeremy L Thompson CeedVectorSetValue(u, 0); 29*4fee36f0SJeremy L Thompson CeedVectorCreate(ceed, q, &u_q); 30a8de75f0Sjeremylt 31*4fee36f0SJeremy L Thompson { 32*4fee36f0SJeremy L Thompson CeedScalar x_array[2]; 33aedaa0e5Sjeremylt 34*4fee36f0SJeremy L Thompson for (int i = 0; i < 2; i++) x_array[i] = CeedIntPow(-1, i + 1); 35*4fee36f0SJeremy L Thompson CeedVectorSetArray(x, CEED_MEM_HOST, CEED_COPY_VALUES, x_array); 36*4fee36f0SJeremy L Thompson } 37aedaa0e5Sjeremylt 38*4fee36f0SJeremy L Thompson CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, q, CEED_GAUSS_LOBATTO, &basis_x_lobatto); 39*4fee36f0SJeremy L Thompson CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, q, q, CEED_GAUSS_LOBATTO, &basis_u_lobatto); 40a8de75f0Sjeremylt 41*4fee36f0SJeremy L Thompson CeedBasisApply(basis_x_lobatto, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, x, x_q); 42*4fee36f0SJeremy L Thompson { 43*4fee36f0SJeremy L Thompson const CeedScalar *x_q_array; 44*4fee36f0SJeremy L Thompson CeedScalar u_array[q]; 45*4fee36f0SJeremy L Thompson 46*4fee36f0SJeremy L Thompson CeedVectorGetArrayRead(x_q, CEED_MEM_HOST, &x_q_array); 47*4fee36f0SJeremy L Thompson for (CeedInt i = 0; i < q; i++) u_array[i] = Eval(x_q_array[i], ALEN(p), p); 48*4fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(x_q, &x_q_array); 49*4fee36f0SJeremy L Thompson CeedVectorSetArray(u_q, CEED_MEM_HOST, CEED_COPY_VALUES, (CeedScalar *)&u_array); 50*4fee36f0SJeremy L Thompson } 5152bfb9bbSJeremy L Thompson 5252bfb9bbSJeremy L Thompson // This operation is the identity because the quadrature is collocated 53*4fee36f0SJeremy L Thompson CeedBasisApply(basis_u_lobatto, 1, CEED_TRANSPOSE, CEED_EVAL_INTERP, u_q, u); 5452bfb9bbSJeremy L Thompson 55*4fee36f0SJeremy L Thompson CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, q, CEED_GAUSS, &basis_x_gauss); 56*4fee36f0SJeremy L Thompson CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, q, q, CEED_GAUSS, &basis_u_gauss); 5752bfb9bbSJeremy L Thompson 58*4fee36f0SJeremy L Thompson CeedBasisApply(basis_x_gauss, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, x, x_q); 59*4fee36f0SJeremy L Thompson CeedBasisApply(basis_u_gauss, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, u, u_q); 6052bfb9bbSJeremy L Thompson 61*4fee36f0SJeremy L Thompson { 62*4fee36f0SJeremy L Thompson const CeedScalar *x_q_array, *u_q_array; 63*4fee36f0SJeremy L Thompson 64*4fee36f0SJeremy L Thompson CeedVectorGetArrayRead(x_q, CEED_MEM_HOST, &x_q_array); 65*4fee36f0SJeremy L Thompson CeedVectorGetArrayRead(u_q, CEED_MEM_HOST, &u_q_array); 66*4fee36f0SJeremy L Thompson for (CeedInt i = 0; i < q; i++) { 67*4fee36f0SJeremy L Thompson CeedScalar px = Eval(x_q_array[i], ALEN(p), p); 68*4fee36f0SJeremy L Thompson if (fabs(u_q_array[i] - px) > 100. * CEED_EPSILON) printf("%f != %f = p(%f)\n", u_q_array[i], px, x_q_array[i]); 69a8de75f0Sjeremylt } 70*4fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(x_q, &x_q_array); 71*4fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(u_q, &u_q_array); 72*4fee36f0SJeremy L Thompson } 73a8de75f0Sjeremylt 74*4fee36f0SJeremy L Thompson CeedVectorDestroy(&x); 75*4fee36f0SJeremy L Thompson CeedVectorDestroy(&x_q); 76*4fee36f0SJeremy L Thompson CeedVectorDestroy(&u); 77*4fee36f0SJeremy L Thompson CeedVectorDestroy(&u_q); 78d1d35e2fSjeremylt CeedBasisDestroy(&basis_x_lobatto); 79d1d35e2fSjeremylt CeedBasisDestroy(&basis_u_lobatto); 80d1d35e2fSjeremylt CeedBasisDestroy(&basis_x_gauss); 81d1d35e2fSjeremylt CeedBasisDestroy(&basis_u_gauss); 82a8de75f0Sjeremylt CeedDestroy(&ceed); 83a8de75f0Sjeremylt return 0; 84a8de75f0Sjeremylt } 85