xref: /libCEED/tests/t218-elemrestriction.c (revision c16dd8e6e8e0a81932ae319bb0553b51e9ff5213)
1bd403d52SSebastian Grimberg /// @file
2*c16dd8e6SSebastian Grimberg /// Test creation, use, and destruction of a curl-conforming oriented element restriction with and without unsigned application
3*c16dd8e6SSebastian Grimberg /// \test Test creation, use, and destruction of a curl-conforming oriented element restriction with and without unsigned application
4bd403d52SSebastian Grimberg #include <ceed.h>
5bd403d52SSebastian Grimberg #include <stdio.h>
6bd403d52SSebastian Grimberg 
7bd403d52SSebastian Grimberg int main(int argc, char **argv) {
8bd403d52SSebastian Grimberg   Ceed                ceed;
9*c16dd8e6SSebastian Grimberg   CeedVector          x, y, y_unsigned;
10*c16dd8e6SSebastian Grimberg   CeedInt             num_elem = 6, elem_size = 4;
110c73c039SSebastian Grimberg   CeedInt             ind[elem_size * num_elem];
120c73c039SSebastian Grimberg   CeedInt8            curl_orients[3 * elem_size * num_elem];
13*c16dd8e6SSebastian Grimberg   CeedScalar          x_array[3 * num_elem + 1];
14*c16dd8e6SSebastian Grimberg   CeedElemRestriction elem_restriction, elem_restriction_unsigned;
15bd403d52SSebastian Grimberg 
16bd403d52SSebastian Grimberg   CeedInit(argv[1], &ceed);
17bd403d52SSebastian Grimberg 
18*c16dd8e6SSebastian Grimberg   CeedVectorCreate(ceed, 3 * num_elem + 1, &x);
19*c16dd8e6SSebastian Grimberg   for (CeedInt i = 0; i < 3 * num_elem + 1; i++) x_array[i] = 10 + i;
20bd403d52SSebastian Grimberg   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, x_array);
21bd403d52SSebastian Grimberg   CeedVectorCreate(ceed, num_elem * elem_size, &y);
22*c16dd8e6SSebastian Grimberg   CeedVectorCreate(ceed, num_elem * elem_size, &y_unsigned);
23bd403d52SSebastian Grimberg 
24bd403d52SSebastian Grimberg   for (CeedInt i = 0; i < num_elem; i++) {
25*c16dd8e6SSebastian Grimberg     ind[4 * i + 0] = 3 * i + 0;
26*c16dd8e6SSebastian Grimberg     ind[4 * i + 1] = 3 * i + 1;
27*c16dd8e6SSebastian Grimberg     ind[4 * i + 2] = 3 * i + 2;
28*c16dd8e6SSebastian Grimberg     ind[4 * i + 3] = 3 * i + 3;
29bd403d52SSebastian Grimberg     if (i % 2 > 0) {
30*c16dd8e6SSebastian Grimberg       // T = [ 1  0  0  0]
31*c16dd8e6SSebastian Grimberg       //     [ 0  1  0  0]
32*c16dd8e6SSebastian Grimberg       //     [ 0  0  0 -1]
33*c16dd8e6SSebastian Grimberg       //     [ 0  0 -1  0]
34*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 0]  = 0;
35*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 1]  = 1;
36*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 2]  = 0;
37*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 3]  = 0;
38*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 4]  = 1;
39*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 5]  = 0;
40*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 6]  = 0;
41*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 7]  = 0;
42*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 8]  = -1;
43*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 9]  = -1;
44*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 10] = 0;
45*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 11] = 0;
46bd403d52SSebastian Grimberg     } else {
47bd403d52SSebastian Grimberg       // T = I
48*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 0]  = 0;
49*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 1]  = 1;
50*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 2]  = 0;
51*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 3]  = 0;
52*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 4]  = 1;
53*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 5]  = 0;
54*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 6]  = 0;
55*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 7]  = 1;
56*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 8]  = 0;
57*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 9]  = 0;
58*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 10] = 1;
59*c16dd8e6SSebastian Grimberg       curl_orients[3 * 4 * i + 11] = 0;
60bd403d52SSebastian Grimberg     }
61bd403d52SSebastian Grimberg   }
62*c16dd8e6SSebastian Grimberg   CeedElemRestrictionCreateCurlOriented(ceed, num_elem, elem_size, 1, 1, 3 * num_elem + 1, CEED_MEM_HOST, CEED_USE_POINTER, ind, curl_orients,
63bd403d52SSebastian Grimberg                                         &elem_restriction);
64*c16dd8e6SSebastian Grimberg   CeedElemRestrictionCreateUnsignedCopy(elem_restriction, &elem_restriction_unsigned);
65bd403d52SSebastian Grimberg 
66bd403d52SSebastian Grimberg   // NoTranspose
67bd403d52SSebastian Grimberg   CeedElemRestrictionApply(elem_restriction, CEED_NOTRANSPOSE, x, y, CEED_REQUEST_IMMEDIATE);
68*c16dd8e6SSebastian Grimberg   CeedElemRestrictionApply(elem_restriction_unsigned, CEED_NOTRANSPOSE, x, y_unsigned, CEED_REQUEST_IMMEDIATE);
69bd403d52SSebastian Grimberg   {
70*c16dd8e6SSebastian Grimberg     const CeedScalar *y_array, *y_unsigned_array;
71bd403d52SSebastian Grimberg 
72bd403d52SSebastian Grimberg     CeedVectorGetArrayRead(y, CEED_MEM_HOST, &y_array);
73*c16dd8e6SSebastian Grimberg     CeedVectorGetArrayRead(y_unsigned, CEED_MEM_HOST, &y_unsigned_array);
74bd403d52SSebastian Grimberg     for (CeedInt i = 0; i < num_elem; i++) {
75bd403d52SSebastian Grimberg       for (CeedInt j = 0; j < elem_size; j++) {
76bd403d52SSebastian Grimberg         CeedInt k = j + elem_size * i;
77*c16dd8e6SSebastian Grimberg         if (i % 2 > 0 && j >= 2) {
78*c16dd8e6SSebastian Grimberg           if (j == 2 && 10 + 3 * i + j + 1 != -y_array[k]) {
79bd403d52SSebastian Grimberg             // LCOV_EXCL_START
80bd403d52SSebastian Grimberg             printf("Error in restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_array[k]);
81bd403d52SSebastian Grimberg             // LCOV_EXCL_STOP
82*c16dd8e6SSebastian Grimberg           } else if (j == 3 && 10 + 3 * i + j - 1 != -y_array[k]) {
83bd403d52SSebastian Grimberg             // LCOV_EXCL_START
84bd403d52SSebastian Grimberg             printf("Error in restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_array[k]);
85bd403d52SSebastian Grimberg             // LCOV_EXCL_STOP
86bd403d52SSebastian Grimberg           }
87*c16dd8e6SSebastian Grimberg           if (j == 2 && 10 + 3 * i + j + 1 != y_unsigned_array[k]) {
88*c16dd8e6SSebastian Grimberg             // LCOV_EXCL_START
89*c16dd8e6SSebastian Grimberg             printf("Error in unsigned restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_unsigned_array[k]);
90*c16dd8e6SSebastian Grimberg             // LCOV_EXCL_STOP
91*c16dd8e6SSebastian Grimberg           } else if (j == 3 && 10 + 3 * i + j - 1 != y_unsigned_array[k]) {
92*c16dd8e6SSebastian Grimberg             // LCOV_EXCL_START
93*c16dd8e6SSebastian Grimberg             printf("Error in unsigned restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_unsigned_array[k]);
94*c16dd8e6SSebastian Grimberg             // LCOV_EXCL_STOP
95*c16dd8e6SSebastian Grimberg           }
96bd403d52SSebastian Grimberg         } else {
97*c16dd8e6SSebastian Grimberg           if (10 + 3 * i + j != y_array[k] || 10 + 3 * i + j != y_unsigned_array[k]) {
98bd403d52SSebastian Grimberg             // LCOV_EXCL_START
99bd403d52SSebastian Grimberg             printf("Error in restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_array[k]);
100bd403d52SSebastian Grimberg             // LCOV_EXCL_STOP
101bd403d52SSebastian Grimberg           }
102bd403d52SSebastian Grimberg         }
103bd403d52SSebastian Grimberg       }
104bd403d52SSebastian Grimberg     }
105bd403d52SSebastian Grimberg     CeedVectorRestoreArrayRead(y, &y_array);
106*c16dd8e6SSebastian Grimberg     CeedVectorRestoreArrayRead(y_unsigned, &y_unsigned_array);
107bd403d52SSebastian Grimberg   }
108bd403d52SSebastian Grimberg 
109bd403d52SSebastian Grimberg   // Transpose
110bd403d52SSebastian Grimberg   CeedVectorSetValue(x, 0);
111bd403d52SSebastian Grimberg   CeedElemRestrictionApply(elem_restriction, CEED_TRANSPOSE, y, x, CEED_REQUEST_IMMEDIATE);
112bd403d52SSebastian Grimberg   {
113bd403d52SSebastian Grimberg     const CeedScalar *x_array;
114bd403d52SSebastian Grimberg 
115bd403d52SSebastian Grimberg     CeedVectorGetArrayRead(x, CEED_MEM_HOST, &x_array);
116*c16dd8e6SSebastian Grimberg     for (CeedInt i = 0; i < 3 * num_elem + 1; i++) {
117*c16dd8e6SSebastian Grimberg       if (x_array[i] != (10 + i) * (i > 0 && i < 3 * num_elem && i % 3 == 0 ? 2.0 : 1.0))
118*c16dd8e6SSebastian Grimberg         printf("Error in restricted array x[%" CeedInt_FMT "] = %f\n", i, (CeedScalar)x_array[i]);
119*c16dd8e6SSebastian Grimberg     }
120*c16dd8e6SSebastian Grimberg     CeedVectorRestoreArrayRead(x, &x_array);
121*c16dd8e6SSebastian Grimberg   }
122*c16dd8e6SSebastian Grimberg 
123*c16dd8e6SSebastian Grimberg   // Transpose unsigned
124*c16dd8e6SSebastian Grimberg   CeedVectorSetValue(x, 0);
125*c16dd8e6SSebastian Grimberg   CeedElemRestrictionApply(elem_restriction_unsigned, CEED_TRANSPOSE, y_unsigned, x, CEED_REQUEST_IMMEDIATE);
126*c16dd8e6SSebastian Grimberg   {
127*c16dd8e6SSebastian Grimberg     const CeedScalar *x_array;
128*c16dd8e6SSebastian Grimberg 
129*c16dd8e6SSebastian Grimberg     CeedVectorGetArrayRead(x, CEED_MEM_HOST, &x_array);
130*c16dd8e6SSebastian Grimberg     for (CeedInt i = 0; i < 3 * num_elem + 1; i++) {
131*c16dd8e6SSebastian Grimberg       if (x_array[i] != (10 + i) * (i > 0 && i < 3 * num_elem && i % 3 == 0 ? 2.0 : 1.0))
132bd403d52SSebastian Grimberg         printf("Error in restricted array x[%" CeedInt_FMT "] = %f\n", i, (CeedScalar)x_array[i]);
133bd403d52SSebastian Grimberg     }
134bd403d52SSebastian Grimberg     CeedVectorRestoreArrayRead(x, &x_array);
135bd403d52SSebastian Grimberg   }
136bd403d52SSebastian Grimberg 
137bd403d52SSebastian Grimberg   CeedVectorDestroy(&x);
138bd403d52SSebastian Grimberg   CeedVectorDestroy(&y);
139*c16dd8e6SSebastian Grimberg   CeedVectorDestroy(&y_unsigned);
140bd403d52SSebastian Grimberg   CeedElemRestrictionDestroy(&elem_restriction);
141*c16dd8e6SSebastian Grimberg   CeedElemRestrictionDestroy(&elem_restriction_unsigned);
142bd403d52SSebastian Grimberg   CeedDestroy(&ceed);
143bd403d52SSebastian Grimberg   return 0;
144bd403d52SSebastian Grimberg }
145