1*3bd813ffSjeremylt /// @file 2*3bd813ffSjeremylt /// Test polynomial derivative interpolation in 1D 3*3bd813ffSjeremylt /// \test Test polynomial derivative interpolation in 1D 4*3bd813ffSjeremylt #include <ceed.h> 5*3bd813ffSjeremylt #include <math.h> 6*3bd813ffSjeremylt 7*3bd813ffSjeremylt #define ALEN(a) (sizeof(a) / sizeof((a)[0])) 8*3bd813ffSjeremylt 9*3bd813ffSjeremylt static CeedScalar PolyEval(CeedScalar x, CeedInt n, const CeedScalar *p) { 10*3bd813ffSjeremylt CeedScalar y = p[n-1]; 11*3bd813ffSjeremylt for (CeedInt i=n-2; i>=0; i--) y = y*x + p[i]; 12*3bd813ffSjeremylt return y; 13*3bd813ffSjeremylt } 14*3bd813ffSjeremylt 15*3bd813ffSjeremylt int main(int argc, char **argv) { 16*3bd813ffSjeremylt Ceed ceed; 17*3bd813ffSjeremylt CeedVector X, Xq, U, Uq; 18*3bd813ffSjeremylt CeedBasis bxl, bul, bxg, bug; 19*3bd813ffSjeremylt CeedInt Q = 6; 20*3bd813ffSjeremylt const CeedScalar p[6] = {1, 2, 3, 4, 5, 6}; // 1 + 2x + 3x^2 + ... 21*3bd813ffSjeremylt const CeedScalar dp[5] = {2, 6, 12, 20, 30}; // 2 + 6x + 12x^2 + ... 22*3bd813ffSjeremylt const CeedScalar *xq, *uuq; 23*3bd813ffSjeremylt CeedScalar x[2], uq[Q]; 24*3bd813ffSjeremylt 25*3bd813ffSjeremylt CeedInit(argv[1], &ceed); 26*3bd813ffSjeremylt 27*3bd813ffSjeremylt CeedVectorCreate(ceed, 2, &X); 28*3bd813ffSjeremylt CeedVectorCreate(ceed, Q, &Xq); 29*3bd813ffSjeremylt CeedVectorSetValue(Xq, 0); 30*3bd813ffSjeremylt CeedVectorCreate(ceed, Q, &U); 31*3bd813ffSjeremylt CeedVectorSetValue(U, 0); 32*3bd813ffSjeremylt CeedVectorCreate(ceed, Q, &Uq); 33*3bd813ffSjeremylt 34*3bd813ffSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS_LOBATTO, &bxl); 35*3bd813ffSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, Q, Q, CEED_GAUSS_LOBATTO, &bul); 36*3bd813ffSjeremylt 37*3bd813ffSjeremylt for (int i = 0; i < 2; i++) 38*3bd813ffSjeremylt x[i] = CeedIntPow(-1, i+1); 39*3bd813ffSjeremylt CeedVectorSetArray(X, CEED_MEM_HOST, CEED_USE_POINTER, (CeedScalar *)&x); 40*3bd813ffSjeremylt 41*3bd813ffSjeremylt CeedBasisApply(bxl, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, X, Xq); 42*3bd813ffSjeremylt 43*3bd813ffSjeremylt CeedVectorGetArrayRead(Xq, CEED_MEM_HOST, &xq); 44*3bd813ffSjeremylt for (CeedInt i=0; i<Q; i++) 45*3bd813ffSjeremylt uq[i] = PolyEval(xq[i], ALEN(p), p); 46*3bd813ffSjeremylt CeedVectorRestoreArrayRead(Xq, &xq); 47*3bd813ffSjeremylt CeedVectorSetArray(Uq, CEED_MEM_HOST, CEED_USE_POINTER, (CeedScalar *)&uq); 48*3bd813ffSjeremylt 49*3bd813ffSjeremylt // This operation is the identity because the quadrature is collocated 50*3bd813ffSjeremylt CeedBasisApply(bul, 1, CEED_TRANSPOSE, CEED_EVAL_INTERP, Uq, U); 51*3bd813ffSjeremylt 52*3bd813ffSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS, &bxg); 53*3bd813ffSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, Q, Q, CEED_GAUSS, &bug); 54*3bd813ffSjeremylt 55*3bd813ffSjeremylt CeedBasisApply(bxg, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, X, Xq); 56*3bd813ffSjeremylt CeedBasisApply(bug, 1, CEED_NOTRANSPOSE, CEED_EVAL_GRAD, U, Uq); 57*3bd813ffSjeremylt 58*3bd813ffSjeremylt CeedVectorGetArrayRead(Xq, CEED_MEM_HOST, &xq); 59*3bd813ffSjeremylt CeedVectorGetArrayRead(Uq, CEED_MEM_HOST, &uuq); 60*3bd813ffSjeremylt for (CeedInt i=0; i<Q; i++) { 61*3bd813ffSjeremylt CeedScalar px = PolyEval(xq[i], ALEN(dp), dp); 62*3bd813ffSjeremylt if (fabs(uuq[i] - px) > 1E-13) 63*3bd813ffSjeremylt // LCOV_EXCL_START 64*3bd813ffSjeremylt printf("%f != %f=p(%f)\n", uuq[i], px, xq[i]); 65*3bd813ffSjeremylt // LCOV_EXCL_STOP 66*3bd813ffSjeremylt } 67*3bd813ffSjeremylt CeedVectorRestoreArrayRead(Xq, &xq); 68*3bd813ffSjeremylt CeedVectorRestoreArrayRead(Uq, &uuq); 69*3bd813ffSjeremylt 70*3bd813ffSjeremylt CeedVectorDestroy(&X); 71*3bd813ffSjeremylt CeedVectorDestroy(&Xq); 72*3bd813ffSjeremylt CeedVectorDestroy(&U); 73*3bd813ffSjeremylt CeedVectorDestroy(&Uq); 74*3bd813ffSjeremylt CeedBasisDestroy(&bxl); 75*3bd813ffSjeremylt CeedBasisDestroy(&bul); 76*3bd813ffSjeremylt CeedBasisDestroy(&bxg); 77*3bd813ffSjeremylt CeedBasisDestroy(&bug); 78*3bd813ffSjeremylt CeedDestroy(&ceed); 79*3bd813ffSjeremylt return 0; 80*3bd813ffSjeremylt } 81