xref: /libCEED/tests/t325-basis.c (revision 4fee36f0a30516a0b5ad51bf7eb3b32d83efd623)
1 /// @file
2 /// Test grad transpose with a 2D Simplex non-tensor H1 basis
3 /// \test Test grad transpose with a 2D Simplex non-tensor H1 basis
4 #include <ceed.h>
5 #include <math.h>
6 
7 #include "t320-basis.h"
8 
9 int main(int argc, char **argv) {
10   Ceed          ceed;
11   CeedVector    u, v;
12   const CeedInt p = 6, q = 4, dim = 2, num_comp = 3;
13   CeedBasis     basis;
14   CeedScalar    q_ref[dim * q], q_weight[q];
15   CeedScalar    interp[p * q], grad[dim * p * q];
16   CeedScalar    column_sum[p];
17 
18   CeedInit(argv[1], &ceed);
19 
20   Build2DSimplex(q_ref, q_weight, interp, grad);
21   CeedBasisCreateH1(ceed, CEED_TOPOLOGY_TRIANGLE, num_comp, p, q, interp, grad, q_ref, q_weight, &basis);
22 
23   CeedVectorCreate(ceed, q * dim * num_comp, &u);
24   {
25     CeedScalar *u_array;
26 
27     CeedVectorGetArrayWrite(u, CEED_MEM_HOST, &u_array);
28     for (int d = 0; d < dim; d++) {
29       for (int i = 0; i < num_comp; i++) {
30         for (int j = 0; j < q; j++) u_array[j + (i + d * num_comp) * q] = i * 1.0;
31       }
32     }
33     CeedVectorRestoreArray(u, &u_array);
34   }
35   CeedVectorCreate(ceed, p * num_comp, &v);
36   CeedVectorSetValue(v, 0);
37 
38   CeedBasisApply(basis, 1, CEED_TRANSPOSE, CEED_EVAL_GRAD, u, v);
39 
40   // Check values at quadrature points
41   for (int i = 0; i < p; i++) {
42     column_sum[i] = 0;
43     for (int j = 0; j < q * dim; j++) {
44       column_sum[i] += grad[i + j * p];
45     }
46   }
47   {
48     const CeedScalar *v_array;
49 
50     CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array);
51     for (int i = 0; i < p; i++) {
52       for (int j = 0; j < num_comp; j++) {
53         if (fabs(j * column_sum[i] - v_array[i + j * p]) > 100. * CEED_EPSILON) {
54           // LCOV_EXCL_START
55           printf("[%" CeedInt_FMT "] %f != %f\n", i, v_array[i + j * p], j * column_sum[i]);
56           // LCOV_EXCL_STOP
57         }
58       }
59     }
60     CeedVectorRestoreArrayRead(v, &v_array);
61   }
62 
63   CeedVectorDestroy(&u);
64   CeedVectorDestroy(&v);
65   CeedBasisDestroy(&basis);
66   CeedDestroy(&ceed);
67   return 0;
68 }
69