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> 649aac155SJeremy L Thompson #include <stdio.h> 7a8de75f0Sjeremylt 852bfb9bbSJeremy L Thompson #define ALEN(a) (sizeof(a) / sizeof((a)[0])) 952bfb9bbSJeremy L Thompson 104fee36f0SJeremy L Thompson static CeedScalar Eval(CeedScalar x, CeedInt n, const CeedScalar *p) { 1152bfb9bbSJeremy L Thompson CeedScalar y = p[n - 1]; 1252bfb9bbSJeremy L Thompson for (CeedInt i = n - 2; i >= 0; i--) y = y * x + p[i]; 1352bfb9bbSJeremy L Thompson return y; 14a8de75f0Sjeremylt } 15a8de75f0Sjeremylt 16a8de75f0Sjeremylt int main(int argc, char **argv) { 17a8de75f0Sjeremylt Ceed ceed; 184fee36f0SJeremy L Thompson CeedVector x, x_q, u, u_q; 19d1d35e2fSjeremylt CeedBasis basis_x_lobatto, basis_u_lobatto, basis_x_gauss, basis_u_gauss; 204fee36f0SJeremy L Thompson CeedInt q = 6; 2152bfb9bbSJeremy L Thompson const CeedScalar p[6] = {1, 2, 3, 4, 5, 6}; // 1 + 2x + 3x^2 + ... 22a8de75f0Sjeremylt 23a8de75f0Sjeremylt CeedInit(argv[1], &ceed); 24aedaa0e5Sjeremylt 254fee36f0SJeremy L Thompson CeedVectorCreate(ceed, 2, &x); 264fee36f0SJeremy L Thompson CeedVectorCreate(ceed, q, &x_q); 274fee36f0SJeremy L Thompson CeedVectorSetValue(x_q, 0); 284fee36f0SJeremy L Thompson CeedVectorCreate(ceed, q, &u); 294fee36f0SJeremy L Thompson CeedVectorSetValue(u, 0); 304fee36f0SJeremy L Thompson CeedVectorCreate(ceed, q, &u_q); 31a8de75f0Sjeremylt 324fee36f0SJeremy L Thompson { 334fee36f0SJeremy L Thompson CeedScalar x_array[2]; 34aedaa0e5Sjeremylt 35*c8c3fa7dSJeremy L Thompson for (CeedInt i = 0; i < 2; i++) x_array[i] = CeedIntPow(-1, i + 1); 364fee36f0SJeremy L Thompson CeedVectorSetArray(x, CEED_MEM_HOST, CEED_COPY_VALUES, x_array); 374fee36f0SJeremy L Thompson } 38aedaa0e5Sjeremylt 394fee36f0SJeremy L Thompson CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, q, CEED_GAUSS_LOBATTO, &basis_x_lobatto); 404fee36f0SJeremy L Thompson CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, q, q, CEED_GAUSS_LOBATTO, &basis_u_lobatto); 41a8de75f0Sjeremylt 424fee36f0SJeremy L Thompson CeedBasisApply(basis_x_lobatto, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, x, x_q); 434fee36f0SJeremy L Thompson { 444fee36f0SJeremy L Thompson const CeedScalar *x_q_array; 454fee36f0SJeremy L Thompson CeedScalar u_array[q]; 464fee36f0SJeremy L Thompson 474fee36f0SJeremy L Thompson CeedVectorGetArrayRead(x_q, CEED_MEM_HOST, &x_q_array); 484fee36f0SJeremy L Thompson for (CeedInt i = 0; i < q; i++) u_array[i] = Eval(x_q_array[i], ALEN(p), p); 494fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(x_q, &x_q_array); 504fee36f0SJeremy L Thompson CeedVectorSetArray(u_q, CEED_MEM_HOST, CEED_COPY_VALUES, (CeedScalar *)&u_array); 514fee36f0SJeremy L Thompson } 5252bfb9bbSJeremy L Thompson 5352bfb9bbSJeremy L Thompson // This operation is the identity because the quadrature is collocated 544fee36f0SJeremy L Thompson CeedBasisApply(basis_u_lobatto, 1, CEED_TRANSPOSE, CEED_EVAL_INTERP, u_q, u); 5552bfb9bbSJeremy L Thompson 564fee36f0SJeremy L Thompson CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, q, CEED_GAUSS, &basis_x_gauss); 574fee36f0SJeremy L Thompson CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, q, q, CEED_GAUSS, &basis_u_gauss); 5852bfb9bbSJeremy L Thompson 594fee36f0SJeremy L Thompson CeedBasisApply(basis_x_gauss, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, x, x_q); 604fee36f0SJeremy L Thompson CeedBasisApply(basis_u_gauss, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, u, u_q); 6152bfb9bbSJeremy L Thompson 624fee36f0SJeremy L Thompson { 634fee36f0SJeremy L Thompson const CeedScalar *x_q_array, *u_q_array; 644fee36f0SJeremy L Thompson 654fee36f0SJeremy L Thompson CeedVectorGetArrayRead(x_q, CEED_MEM_HOST, &x_q_array); 664fee36f0SJeremy L Thompson CeedVectorGetArrayRead(u_q, CEED_MEM_HOST, &u_q_array); 674fee36f0SJeremy L Thompson for (CeedInt i = 0; i < q; i++) { 684fee36f0SJeremy L Thompson CeedScalar px = Eval(x_q_array[i], ALEN(p), p); 694fee36f0SJeremy 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]); 70a8de75f0Sjeremylt } 714fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(x_q, &x_q_array); 724fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(u_q, &u_q_array); 734fee36f0SJeremy L Thompson } 74a8de75f0Sjeremylt 754fee36f0SJeremy L Thompson CeedVectorDestroy(&x); 764fee36f0SJeremy L Thompson CeedVectorDestroy(&x_q); 774fee36f0SJeremy L Thompson CeedVectorDestroy(&u); 784fee36f0SJeremy 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); 83a8de75f0Sjeremylt CeedDestroy(&ceed); 84a8de75f0Sjeremylt return 0; 85a8de75f0Sjeremylt } 86