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