xref: /libCEED/tests/t325-basis.c (revision 2b730f8b5a9c809740a0b3b302db43a719c636b1)
1280af619Sjeremylt /// @file
2280af619Sjeremylt /// Test grad transpose with a 2D Simplex non-tensor H1 basis
3280af619Sjeremylt /// \test Test grad transposewith a 2D Simplex non-tensor H1 basis
4280af619Sjeremylt #include <ceed.h>
5280af619Sjeremylt #include <math.h>
6*2b730f8bSJeremy L Thompson 
7280af619Sjeremylt #include "t320-basis.h"
8280af619Sjeremylt 
9280af619Sjeremylt int main(int argc, char **argv) {
10280af619Sjeremylt   Ceed              ceed;
11280af619Sjeremylt   CeedVector        In, Out;
12d1d35e2fSjeremylt   const CeedInt     P = 6, Q = 4, dim = 2, num_comp = 3;
13280af619Sjeremylt   CeedBasis         b;
14d1d35e2fSjeremylt   CeedScalar        q_ref[dim * Q], q_weight[Q];
15280af619Sjeremylt   CeedScalar        interp[P * Q], grad[dim * P * Q];
16280af619Sjeremylt   const CeedScalar *out;
17280af619Sjeremylt   CeedScalar        colsum[P], *in;
18280af619Sjeremylt 
19d1d35e2fSjeremylt   buildmats(q_ref, q_weight, interp, grad);
20280af619Sjeremylt 
21280af619Sjeremylt   CeedInit(argv[1], &ceed);
22280af619Sjeremylt 
23280af619Sjeremylt   for (int i = 0; i < P; i++) {
24280af619Sjeremylt     colsum[i] = 0;
25280af619Sjeremylt     for (int j = 0; j < Q * dim; j++) {
26280af619Sjeremylt       colsum[i] += grad[i + j * P];
27280af619Sjeremylt     }
28280af619Sjeremylt   }
29280af619Sjeremylt 
30*2b730f8bSJeremy L Thompson   CeedBasisCreateH1(ceed, CEED_TOPOLOGY_TRIANGLE, num_comp, P, Q, interp, grad, q_ref, q_weight, &b);
31280af619Sjeremylt 
32d1d35e2fSjeremylt   CeedVectorCreate(ceed, Q * dim * num_comp, &In);
339c774eddSJeremy L Thompson   CeedVectorGetArrayWrite(In, CEED_MEM_HOST, &in);
34*2b730f8bSJeremy L Thompson   for (int d = 0; d < dim; d++) {
35*2b730f8bSJeremy L Thompson     for (int n = 0; n < num_comp; n++) {
36*2b730f8bSJeremy L Thompson       for (int q = 0; q < Q; q++) in[q + (n + d * num_comp) * Q] = n * 1.0;
37*2b730f8bSJeremy L Thompson     }
38*2b730f8bSJeremy L Thompson   }
39280af619Sjeremylt   CeedVectorRestoreArray(In, &in);
40d1d35e2fSjeremylt   CeedVectorCreate(ceed, P * num_comp, &Out);
41280af619Sjeremylt   CeedVectorSetValue(Out, 0);
42280af619Sjeremylt 
43280af619Sjeremylt   CeedBasisApply(b, 1, CEED_TRANSPOSE, CEED_EVAL_GRAD, In, Out);
44280af619Sjeremylt 
45280af619Sjeremylt   // Check values at quadrature points
46280af619Sjeremylt   CeedVectorGetArrayRead(Out, CEED_MEM_HOST, &out);
47*2b730f8bSJeremy L Thompson   for (int p = 0; p < P; p++) {
48*2b730f8bSJeremy L Thompson     for (int n = 0; n < num_comp; n++) {
49*2b730f8bSJeremy L Thompson       if (fabs(n * colsum[p] - out[p + n * P]) > 100. * CEED_EPSILON) printf("[%" CeedInt_FMT "] %f != %f\n", p, out[p + n * P], n * colsum[p]);
50*2b730f8bSJeremy L Thompson     }
51*2b730f8bSJeremy L Thompson   }
52280af619Sjeremylt   CeedVectorRestoreArrayRead(Out, &out);
53280af619Sjeremylt 
54280af619Sjeremylt   CeedVectorDestroy(&In);
55280af619Sjeremylt   CeedVectorDestroy(&Out);
56280af619Sjeremylt   CeedBasisDestroy(&b);
57280af619Sjeremylt   CeedDestroy(&ceed);
58280af619Sjeremylt   return 0;
59280af619Sjeremylt }
60