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