1c8c3fa7dSJeremy L Thompson /// @file 2c8c3fa7dSJeremy L Thompson /// Test polynomial interpolation to arbirtary points in 1D 3c8c3fa7dSJeremy L Thompson /// \test Test polynomial interpolation to arbitrary points in 1D 4c8c3fa7dSJeremy L Thompson #include <ceed.h> 5c8c3fa7dSJeremy L Thompson #include <math.h> 6c8c3fa7dSJeremy L Thompson #include <stdio.h> 7c8c3fa7dSJeremy L Thompson 8c8c3fa7dSJeremy L Thompson #define ALEN(a) (sizeof(a) / sizeof((a)[0])) 9c8c3fa7dSJeremy L Thompson 10c8c3fa7dSJeremy L Thompson static CeedScalar Eval(CeedScalar x, CeedInt n, const CeedScalar *c) { 11c8c3fa7dSJeremy L Thompson CeedScalar y = c[n - 1]; 12c8c3fa7dSJeremy L Thompson for (CeedInt i = n - 2; i >= 0; i--) y = y * x + c[i]; 13c8c3fa7dSJeremy L Thompson return y; 14c8c3fa7dSJeremy L Thompson } 15c8c3fa7dSJeremy L Thompson 16c8c3fa7dSJeremy L Thompson int main(int argc, char **argv) { 17c8c3fa7dSJeremy L Thompson Ceed ceed; 18c8c3fa7dSJeremy L Thompson CeedVector x, x_nodes, x_points, u, v; 19c8c3fa7dSJeremy L Thompson CeedBasis basis_x, basis_u; 20c8c3fa7dSJeremy L Thompson const CeedInt p = 5, q = 5, num_points = 4; 21c8c3fa7dSJeremy L Thompson const CeedScalar c[4] = {1, 2, 3, 4}; // 1 + 2x + 3x^2 + ... 22c8c3fa7dSJeremy L Thompson 23c8c3fa7dSJeremy L Thompson CeedInit(argv[1], &ceed); 24c8c3fa7dSJeremy L Thompson 25c8c3fa7dSJeremy L Thompson CeedVectorCreate(ceed, 2, &x); 26c8c3fa7dSJeremy L Thompson CeedVectorCreate(ceed, p, &x_nodes); 27c8c3fa7dSJeremy L Thompson CeedVectorCreate(ceed, num_points, &x_points); 28c8c3fa7dSJeremy L Thompson CeedVectorCreate(ceed, p, &u); 29c8c3fa7dSJeremy L Thompson CeedVectorCreate(ceed, num_points, &v); 30c8c3fa7dSJeremy L Thompson 31c8c3fa7dSJeremy L Thompson // Get nodal coordinates 32c8c3fa7dSJeremy L Thompson CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, p, CEED_GAUSS_LOBATTO, &basis_x); 33c8c3fa7dSJeremy L Thompson { 34c8c3fa7dSJeremy L Thompson CeedScalar x_array[2]; 35c8c3fa7dSJeremy L Thompson 36c8c3fa7dSJeremy L Thompson for (CeedInt i = 0; i < 2; i++) x_array[i] = CeedIntPow(-1, i + 1); 37c8c3fa7dSJeremy L Thompson CeedVectorSetArray(x, CEED_MEM_HOST, CEED_COPY_VALUES, x_array); 38c8c3fa7dSJeremy L Thompson } 39c8c3fa7dSJeremy L Thompson CeedBasisApply(basis_x, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, x, x_nodes); 40c8c3fa7dSJeremy L Thompson 41c8c3fa7dSJeremy L Thompson // Set values of u at nodes 42c8c3fa7dSJeremy L Thompson { 43c8c3fa7dSJeremy L Thompson const CeedScalar *x_array; 44c8c3fa7dSJeremy L Thompson CeedScalar u_array[p]; 45c8c3fa7dSJeremy L Thompson 46c8c3fa7dSJeremy L Thompson CeedVectorGetArrayRead(x_nodes, CEED_MEM_HOST, &x_array); 47c8c3fa7dSJeremy L Thompson for (CeedInt i = 0; i < p; i++) u_array[i] = Eval(x_array[i], ALEN(c), c); 48c8c3fa7dSJeremy L Thompson CeedVectorRestoreArrayRead(x_nodes, &x_array); 49c8c3fa7dSJeremy L Thompson CeedVectorSetArray(u, CEED_MEM_HOST, CEED_COPY_VALUES, (CeedScalar *)&u_array); 50c8c3fa7dSJeremy L Thompson } 51c8c3fa7dSJeremy L Thompson 52c8c3fa7dSJeremy L Thompson // Interpolate to arbitrary points 53c8c3fa7dSJeremy L Thompson CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, p, q, CEED_GAUSS, &basis_u); 54c8c3fa7dSJeremy L Thompson { 55*2a94f45fSJeremy L Thompson CeedScalar x_array[4] = {-0.33, -0.65, 0.16, 0.99}; 56c8c3fa7dSJeremy L Thompson 57c8c3fa7dSJeremy L Thompson CeedVectorSetArray(x_points, CEED_MEM_HOST, CEED_COPY_VALUES, x_array); 58c8c3fa7dSJeremy L Thompson } 59c8c3fa7dSJeremy L Thompson CeedBasisApplyAtPoints(basis_u, num_points, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, x_points, u, v); 60c8c3fa7dSJeremy L Thompson 61c8c3fa7dSJeremy L Thompson { 62c8c3fa7dSJeremy L Thompson const CeedScalar *x_array, *v_array; 63c8c3fa7dSJeremy L Thompson 64c8c3fa7dSJeremy L Thompson CeedVectorGetArrayRead(x_points, CEED_MEM_HOST, &x_array); 65c8c3fa7dSJeremy L Thompson CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array); 66c8c3fa7dSJeremy L Thompson for (CeedInt i = 0; i < num_points; i++) { 67c8c3fa7dSJeremy L Thompson CeedScalar fx = Eval(x_array[i], ALEN(c), c); 68c8c3fa7dSJeremy L Thompson if (fabs(v_array[i] - fx) > 100. * CEED_EPSILON) printf("%f != %f = f(%f)\n", v_array[i], fx, x_array[i]); 69c8c3fa7dSJeremy L Thompson } 70c8c3fa7dSJeremy L Thompson CeedVectorRestoreArrayRead(x_points, &x_array); 71c8c3fa7dSJeremy L Thompson CeedVectorRestoreArrayRead(v, &v_array); 72c8c3fa7dSJeremy L Thompson } 73c8c3fa7dSJeremy L Thompson 74c8c3fa7dSJeremy L Thompson CeedVectorDestroy(&x); 75c8c3fa7dSJeremy L Thompson CeedVectorDestroy(&x_nodes); 76c8c3fa7dSJeremy L Thompson CeedVectorDestroy(&x_points); 77c8c3fa7dSJeremy L Thompson CeedVectorDestroy(&u); 78c8c3fa7dSJeremy L Thompson CeedVectorDestroy(&v); 79c8c3fa7dSJeremy L Thompson CeedBasisDestroy(&basis_x); 80c8c3fa7dSJeremy L Thompson CeedBasisDestroy(&basis_u); 81c8c3fa7dSJeremy L Thompson CeedDestroy(&ceed); 82c8c3fa7dSJeremy L Thompson return 0; 83c8c3fa7dSJeremy L Thompson } 84