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