xref: /libCEED/tests/t324-basis.c (revision 6207dc84e125627a695e133ee6bef9c64e96de12)
1edcde79dSjeremylt /// @file
2edcde79dSjeremylt /// Test grad transpose with a 2D Simplex non-tensor H1 basis
3edcde79dSjeremylt /// \test Test grad transposewith a 2D Simplex non-tensor H1 basis
4edcde79dSjeremylt #include <ceed.h>
5edcde79dSjeremylt #include <math.h>
6edcde79dSjeremylt #include "t320-basis.h"
7edcde79dSjeremylt 
8edcde79dSjeremylt int main(int argc, char **argv) {
9edcde79dSjeremylt   Ceed ceed;
10edcde79dSjeremylt   CeedVector In, Out;
11edcde79dSjeremylt   const CeedInt P = 6, Q = 4, dim = 2;
12edcde79dSjeremylt   CeedBasis b;
13edcde79dSjeremylt   CeedScalar qref[dim*Q], qweight[Q];
14edcde79dSjeremylt   CeedScalar interp[P*Q], grad[dim*P*Q];
15edcde79dSjeremylt   const CeedScalar *out;
16edcde79dSjeremylt   CeedScalar colsum[P];
17edcde79dSjeremylt 
18edcde79dSjeremylt   buildmats(qref, qweight, interp, grad);
19edcde79dSjeremylt 
20edcde79dSjeremylt   CeedInit(argv[1], &ceed);
21edcde79dSjeremylt 
22edcde79dSjeremylt   for (int i=0; i<P; i++) {
23edcde79dSjeremylt     colsum[i] = 0;
24edcde79dSjeremylt     for (int j=0; j<Q*dim; j++) {
25edcde79dSjeremylt       colsum[i] += grad[i+j*P];
26edcde79dSjeremylt     }
27edcde79dSjeremylt   }
28edcde79dSjeremylt 
29edcde79dSjeremylt   CeedBasisCreateH1(ceed, CEED_TRIANGLE, 1, P, Q, interp, grad, qref,
30edcde79dSjeremylt                     qweight, &b);
31edcde79dSjeremylt 
32edcde79dSjeremylt   CeedVectorCreate(ceed, Q*dim, &In);
33edcde79dSjeremylt   CeedVectorSetValue(In, 1);
34edcde79dSjeremylt   CeedVectorCreate(ceed, P, &Out);
35edcde79dSjeremylt   CeedVectorSetValue(Out, 0);
36edcde79dSjeremylt 
37edcde79dSjeremylt   CeedBasisApply(b, 1, CEED_TRANSPOSE, CEED_EVAL_GRAD, In, Out);
38edcde79dSjeremylt 
39edcde79dSjeremylt   // Check values at quadrature points
40edcde79dSjeremylt   CeedVectorGetArrayRead(Out, CEED_MEM_HOST, &out);
41edcde79dSjeremylt   for (int i=0; i<P; i++)
42*6207dc84Svaleriabarra     if (fabs(colsum[i] - out[i]) > 1E-14)
43edcde79dSjeremylt       // LCOV_EXCL_START
44edcde79dSjeremylt       printf("[%d] %f != %f\n", i, out[i], colsum[i]);
45edcde79dSjeremylt   // LCOV_EXCL_STOP
46edcde79dSjeremylt   CeedVectorRestoreArrayRead(Out, &out);
47edcde79dSjeremylt 
48edcde79dSjeremylt   CeedVectorDestroy(&In);
49edcde79dSjeremylt   CeedVectorDestroy(&Out);
50edcde79dSjeremylt   CeedBasisDestroy(&b);
51edcde79dSjeremylt   CeedDestroy(&ceed);
52edcde79dSjeremylt   return 0;
53edcde79dSjeremylt }
54