xref: /libCEED/tests/t324-basis.c (revision 2b730f8b5a9c809740a0b3b302db43a719c636b1)
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>
6*2b730f8bSJeremy L Thompson 
7edcde79dSjeremylt #include "t320-basis.h"
8edcde79dSjeremylt 
9edcde79dSjeremylt int main(int argc, char **argv) {
10edcde79dSjeremylt   Ceed              ceed;
11edcde79dSjeremylt   CeedVector        In, Out;
12edcde79dSjeremylt   const CeedInt     P = 6, Q = 4, dim = 2;
13edcde79dSjeremylt   CeedBasis         b;
14d1d35e2fSjeremylt   CeedScalar        q_ref[dim * Q], q_weight[Q];
15edcde79dSjeremylt   CeedScalar        interp[P * Q], grad[dim * P * Q];
16edcde79dSjeremylt   const CeedScalar *out;
17edcde79dSjeremylt   CeedScalar        colsum[P];
18edcde79dSjeremylt 
19d1d35e2fSjeremylt   buildmats(q_ref, q_weight, interp, grad);
20edcde79dSjeremylt 
21edcde79dSjeremylt   CeedInit(argv[1], &ceed);
22edcde79dSjeremylt 
23edcde79dSjeremylt   for (int i = 0; i < P; i++) {
24edcde79dSjeremylt     colsum[i] = 0;
25edcde79dSjeremylt     for (int j = 0; j < Q * dim; j++) {
26edcde79dSjeremylt       colsum[i] += grad[i + j * P];
27edcde79dSjeremylt     }
28edcde79dSjeremylt   }
29edcde79dSjeremylt 
30*2b730f8bSJeremy L Thompson   CeedBasisCreateH1(ceed, CEED_TOPOLOGY_TRIANGLE, 1, P, Q, interp, grad, q_ref, q_weight, &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);
41*2b730f8bSJeremy L Thompson   for (int i = 0; i < P; i++) {
42*2b730f8bSJeremy L Thompson     if (fabs(colsum[i] - out[i]) > 100. * CEED_EPSILON) printf("[%" CeedInt_FMT "] %f != %f\n", i, out[i], colsum[i]);
43*2b730f8bSJeremy L Thompson   }
44edcde79dSjeremylt   CeedVectorRestoreArrayRead(Out, &out);
45edcde79dSjeremylt 
46edcde79dSjeremylt   CeedVectorDestroy(&In);
47edcde79dSjeremylt   CeedVectorDestroy(&Out);
48edcde79dSjeremylt   CeedBasisDestroy(&b);
49edcde79dSjeremylt   CeedDestroy(&ceed);
50edcde79dSjeremylt   return 0;
51edcde79dSjeremylt }
52