xref: /libCEED/tests/t303-basis.c (revision aedaa0e5fd3a3e03ad33ad8a6308ac527f4f900e)
14411cf47Sjeremylt /// @file
24411cf47Sjeremylt /// Test interpolation in multiple dimensions
34411cf47Sjeremylt /// \test Test interpolation in multiple dimensions
457c64913Sjeremylt #include <ceed.h>
557c64913Sjeremylt #include <math.h>
657c64913Sjeremylt 
757c64913Sjeremylt static CeedScalar Eval(CeedInt dim, const CeedScalar x[]) {
857c64913Sjeremylt   CeedScalar result = 1, center = 0.1;
957c64913Sjeremylt   for (CeedInt d=0; d<dim; d++) {
1057c64913Sjeremylt     result *= tanh(x[d] - center);
1157c64913Sjeremylt     center += 0.1;
1257c64913Sjeremylt   }
1357c64913Sjeremylt   return result;
1457c64913Sjeremylt }
1557c64913Sjeremylt 
1657c64913Sjeremylt int main(int argc, char **argv) {
1757c64913Sjeremylt   Ceed ceed;
1857c64913Sjeremylt 
1957c64913Sjeremylt   CeedInit(argv[1], &ceed);
2057c64913Sjeremylt   for (CeedInt dim=1; dim<=3; dim++) {
21*aedaa0e5Sjeremylt     CeedVector X, Xq, U, Uq;
2257c64913Sjeremylt     CeedBasis bxl, bul, bxg, bug;
23b5cf12eeSjeremylt     CeedInt Q = 10, Qdim = CeedIntPow(Q, dim), Xdim = CeedIntPow(2, dim);
2457c64913Sjeremylt     CeedScalar x[Xdim*dim];
25*aedaa0e5Sjeremylt     const CeedScalar *xq, *u;
26*aedaa0e5Sjeremylt     CeedScalar uq[Qdim];
2757c64913Sjeremylt 
2857c64913Sjeremylt     for (CeedInt d=0; d<dim; d++) {
2957c64913Sjeremylt       for (CeedInt i=0; i<Xdim; i++) {
30b5cf12eeSjeremylt         x[d*Xdim + i] = (i % CeedIntPow(2, dim-d)) / CeedIntPow(2, dim-d-1) ? 1 : -1;
3157c64913Sjeremylt       }
3257c64913Sjeremylt     }
33*aedaa0e5Sjeremylt 
34*aedaa0e5Sjeremylt     CeedVectorCreate(ceed, Xdim*dim, &X);
35*aedaa0e5Sjeremylt     CeedVectorSetArray(X, CEED_MEM_HOST, CEED_USE_POINTER, (CeedScalar *)&x);
36*aedaa0e5Sjeremylt     CeedVectorCreate(ceed, Qdim*dim, &Xq);
37*aedaa0e5Sjeremylt     CeedVectorSetValue(Xq, 0);
38*aedaa0e5Sjeremylt     CeedVectorCreate(ceed, Qdim, &U);
39*aedaa0e5Sjeremylt     CeedVectorSetValue(U, 0);
40*aedaa0e5Sjeremylt     CeedVectorCreate(ceed, Qdim, &Uq);
41*aedaa0e5Sjeremylt 
4257c64913Sjeremylt     CeedBasisCreateTensorH1Lagrange(ceed, dim, dim, 2, Q, CEED_GAUSS_LOBATTO, &bxl);
4357c64913Sjeremylt     CeedBasisCreateTensorH1Lagrange(ceed, dim, 1, Q, Q, CEED_GAUSS_LOBATTO, &bul);
44*aedaa0e5Sjeremylt 
45*aedaa0e5Sjeremylt     CeedBasisApply(bxl, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, X, Xq);
46*aedaa0e5Sjeremylt 
47*aedaa0e5Sjeremylt     CeedVectorGetArrayRead(Xq, CEED_MEM_HOST, &xq);
4857c64913Sjeremylt     for (CeedInt i=0; i<Qdim; i++) {
4957c64913Sjeremylt       CeedScalar xx[dim];
5057c64913Sjeremylt       for (CeedInt d=0; d<dim; d++) xx[d] = xq[d*Qdim + i];
5157c64913Sjeremylt       uq[i] = Eval(dim, xx);
5257c64913Sjeremylt     }
53*aedaa0e5Sjeremylt     CeedVectorRestoreArrayRead(Xq, &xq);
54*aedaa0e5Sjeremylt     CeedVectorSetArray(Uq, CEED_MEM_HOST, CEED_USE_POINTER, (CeedScalar *)&uq);
5557c64913Sjeremylt 
5657c64913Sjeremylt     // This operation is the identity because the quadrature is collocated
57*aedaa0e5Sjeremylt     CeedBasisApply(bul, 1, CEED_TRANSPOSE, CEED_EVAL_INTERP, Uq, U);
5857c64913Sjeremylt 
5957c64913Sjeremylt     CeedBasisCreateTensorH1Lagrange(ceed, dim, dim, 2, Q, CEED_GAUSS, &bxg);
6057c64913Sjeremylt     CeedBasisCreateTensorH1Lagrange(ceed, dim, 1, Q, Q, CEED_GAUSS, &bug);
61*aedaa0e5Sjeremylt 
62*aedaa0e5Sjeremylt     CeedBasisApply(bxg, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, X, Xq);
63*aedaa0e5Sjeremylt     CeedBasisApply(bug, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, U, Uq);
64*aedaa0e5Sjeremylt 
65*aedaa0e5Sjeremylt     CeedVectorGetArrayRead(Xq, CEED_MEM_HOST, &xq);
66*aedaa0e5Sjeremylt     CeedVectorGetArrayRead(Uq, CEED_MEM_HOST, &u);
6757c64913Sjeremylt     for (CeedInt i=0; i<Qdim; i++) {
6857c64913Sjeremylt       CeedScalar xx[dim];
6957c64913Sjeremylt       for (CeedInt d=0; d<dim; d++) xx[d] = xq[d*Qdim + i];
7057c64913Sjeremylt       CeedScalar fx = Eval(dim, xx);
71*aedaa0e5Sjeremylt       if ((fabs(u[i] - fx) > 1e-4)) {
72*aedaa0e5Sjeremylt         printf("[%d] %f != %f=f(%f", dim, u[i], fx, xx[0]);
7357c64913Sjeremylt         for (CeedInt d=1; d<dim; d++) printf(",%f", xx[d]);
7457c64913Sjeremylt         puts(")");
7557c64913Sjeremylt       }
7657c64913Sjeremylt     }
77*aedaa0e5Sjeremylt     CeedVectorRestoreArrayRead(Xq, &xq);
78*aedaa0e5Sjeremylt     CeedVectorRestoreArrayRead(Uq, &u);
7957c64913Sjeremylt 
80*aedaa0e5Sjeremylt     CeedVectorDestroy(&X);
81*aedaa0e5Sjeremylt     CeedVectorDestroy(&Xq);
82*aedaa0e5Sjeremylt     CeedVectorDestroy(&U);
83*aedaa0e5Sjeremylt     CeedVectorDestroy(&Uq);
8457c64913Sjeremylt     CeedBasisDestroy(&bxl);
8557c64913Sjeremylt     CeedBasisDestroy(&bul);
8657c64913Sjeremylt     CeedBasisDestroy(&bxg);
8757c64913Sjeremylt     CeedBasisDestroy(&bug);
8857c64913Sjeremylt   }
8957c64913Sjeremylt   CeedDestroy(&ceed);
9057c64913Sjeremylt   return 0;
9157c64913Sjeremylt }
92