xref: /libCEED/tests/t218-elemrestriction.c (revision bd403d52388e064913153593f96f75d758a54e86)
1*bd403d52SSebastian Grimberg /// @file
2*bd403d52SSebastian Grimberg /// Test creation, use, and destruction of a curl-conforming oriented element restriction
3*bd403d52SSebastian Grimberg /// \test Test creation, use, and destruction of a curl-conforming oriented element restriction
4*bd403d52SSebastian Grimberg #include <ceed.h>
5*bd403d52SSebastian Grimberg #include <stdio.h>
6*bd403d52SSebastian Grimberg 
7*bd403d52SSebastian Grimberg int main(int argc, char **argv) {
8*bd403d52SSebastian Grimberg   Ceed                ceed;
9*bd403d52SSebastian Grimberg   CeedVector          x, y;
10*bd403d52SSebastian Grimberg   CeedInt             num_elem = 6, elem_size = 2;
11*bd403d52SSebastian Grimberg   CeedInt             ind[elem_size * num_elem], curl_orients[3 * elem_size * num_elem];
12*bd403d52SSebastian Grimberg   CeedScalar          x_array[num_elem + 1];
13*bd403d52SSebastian Grimberg   CeedElemRestriction elem_restriction;
14*bd403d52SSebastian Grimberg 
15*bd403d52SSebastian Grimberg   CeedInit(argv[1], &ceed);
16*bd403d52SSebastian Grimberg 
17*bd403d52SSebastian Grimberg   CeedVectorCreate(ceed, num_elem + 1, &x);
18*bd403d52SSebastian Grimberg   for (CeedInt i = 0; i < num_elem + 1; i++) x_array[i] = 10 + i;
19*bd403d52SSebastian Grimberg   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, x_array);
20*bd403d52SSebastian Grimberg   CeedVectorCreate(ceed, num_elem * elem_size, &y);
21*bd403d52SSebastian Grimberg 
22*bd403d52SSebastian Grimberg   for (CeedInt i = 0; i < num_elem; i++) {
23*bd403d52SSebastian Grimberg     ind[2 * i + 0]          = i;
24*bd403d52SSebastian Grimberg     ind[2 * i + 1]          = i + 1;
25*bd403d52SSebastian Grimberg     curl_orients[3 * 2 * i] = curl_orients[3 * 2 * (i + 1) - 1] = 0;
26*bd403d52SSebastian Grimberg     if (i % 2 > 0) {
27*bd403d52SSebastian Grimberg       // T = [0  -1]
28*bd403d52SSebastian Grimberg       //     [-1  0]
29*bd403d52SSebastian Grimberg       curl_orients[3 * 2 * i + 1] = 0;
30*bd403d52SSebastian Grimberg       curl_orients[3 * 2 * i + 2] = -1;
31*bd403d52SSebastian Grimberg       curl_orients[3 * 2 * i + 3] = -1;
32*bd403d52SSebastian Grimberg       curl_orients[3 * 2 * i + 4] = 0;
33*bd403d52SSebastian Grimberg     } else {
34*bd403d52SSebastian Grimberg       // T = I
35*bd403d52SSebastian Grimberg       curl_orients[3 * 2 * i + 1] = 1;
36*bd403d52SSebastian Grimberg       curl_orients[3 * 2 * i + 2] = 0;
37*bd403d52SSebastian Grimberg       curl_orients[3 * 2 * i + 3] = 0;
38*bd403d52SSebastian Grimberg       curl_orients[3 * 2 * i + 4] = 1;
39*bd403d52SSebastian Grimberg     }
40*bd403d52SSebastian Grimberg   }
41*bd403d52SSebastian Grimberg   CeedElemRestrictionCreateCurlOriented(ceed, num_elem, elem_size, 1, 1, num_elem + 1, CEED_MEM_HOST, CEED_USE_POINTER, ind, curl_orients,
42*bd403d52SSebastian Grimberg                                         &elem_restriction);
43*bd403d52SSebastian Grimberg 
44*bd403d52SSebastian Grimberg   // NoTranspose
45*bd403d52SSebastian Grimberg   CeedElemRestrictionApply(elem_restriction, CEED_NOTRANSPOSE, x, y, CEED_REQUEST_IMMEDIATE);
46*bd403d52SSebastian Grimberg   {
47*bd403d52SSebastian Grimberg     const CeedScalar *y_array;
48*bd403d52SSebastian Grimberg 
49*bd403d52SSebastian Grimberg     CeedVectorGetArrayRead(y, CEED_MEM_HOST, &y_array);
50*bd403d52SSebastian Grimberg     for (CeedInt i = 0; i < num_elem; i++) {
51*bd403d52SSebastian Grimberg       for (CeedInt j = 0; j < elem_size; j++) {
52*bd403d52SSebastian Grimberg         CeedInt k = j + elem_size * i;
53*bd403d52SSebastian Grimberg         if (i % 2 > 0) {
54*bd403d52SSebastian Grimberg           if (j == 0 && 10 + i + 1 != -y_array[k]) {
55*bd403d52SSebastian Grimberg             // LCOV_EXCL_START
56*bd403d52SSebastian Grimberg             printf("Error in restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_array[k]);
57*bd403d52SSebastian Grimberg             // LCOV_EXCL_STOP
58*bd403d52SSebastian Grimberg           } else if (j == 1 && 10 + i != -y_array[k]) {
59*bd403d52SSebastian Grimberg             // LCOV_EXCL_START
60*bd403d52SSebastian Grimberg             printf("Error in restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_array[k]);
61*bd403d52SSebastian Grimberg             // LCOV_EXCL_STOP
62*bd403d52SSebastian Grimberg           }
63*bd403d52SSebastian Grimberg         } else {
64*bd403d52SSebastian Grimberg           if (10 + (k + 1) / 2 != y_array[k]) {
65*bd403d52SSebastian Grimberg             // LCOV_EXCL_START
66*bd403d52SSebastian Grimberg             printf("Error in restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_array[k]);
67*bd403d52SSebastian Grimberg             // LCOV_EXCL_STOP
68*bd403d52SSebastian Grimberg           }
69*bd403d52SSebastian Grimberg         }
70*bd403d52SSebastian Grimberg       }
71*bd403d52SSebastian Grimberg     }
72*bd403d52SSebastian Grimberg     CeedVectorRestoreArrayRead(y, &y_array);
73*bd403d52SSebastian Grimberg   }
74*bd403d52SSebastian Grimberg 
75*bd403d52SSebastian Grimberg   // Transpose
76*bd403d52SSebastian Grimberg   CeedVectorSetValue(x, 0);
77*bd403d52SSebastian Grimberg   CeedElemRestrictionApply(elem_restriction, CEED_TRANSPOSE, y, x, CEED_REQUEST_IMMEDIATE);
78*bd403d52SSebastian Grimberg   {
79*bd403d52SSebastian Grimberg     const CeedScalar *x_array;
80*bd403d52SSebastian Grimberg 
81*bd403d52SSebastian Grimberg     CeedVectorGetArrayRead(x, CEED_MEM_HOST, &x_array);
82*bd403d52SSebastian Grimberg     for (CeedInt i = 0; i < num_elem + 1; i++) {
83*bd403d52SSebastian Grimberg       if (x_array[i] != (10 + i) * (i > 0 && i < num_elem ? 2.0 : 1.0))
84*bd403d52SSebastian Grimberg         printf("Error in restricted array x[%" CeedInt_FMT "] = %f\n", i, (CeedScalar)x_array[i]);
85*bd403d52SSebastian Grimberg     }
86*bd403d52SSebastian Grimberg     CeedVectorRestoreArrayRead(x, &x_array);
87*bd403d52SSebastian Grimberg   }
88*bd403d52SSebastian Grimberg 
89*bd403d52SSebastian Grimberg   CeedVectorDestroy(&x);
90*bd403d52SSebastian Grimberg   CeedVectorDestroy(&y);
91*bd403d52SSebastian Grimberg   CeedElemRestrictionDestroy(&elem_restriction);
92*bd403d52SSebastian Grimberg   CeedDestroy(&ceed);
93*bd403d52SSebastian Grimberg   return 0;
94*bd403d52SSebastian Grimberg }
95