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