xref: /libCEED/tests/t217-elemrestriction.c (revision bd403d52388e064913153593f96f75d758a54e86)
1*bd403d52SSebastian Grimberg /// @file
2*bd403d52SSebastian Grimberg /// Test creation, use, and destruction of an oriented element restriction
3*bd403d52SSebastian Grimberg /// \test Test creation, use, and destruction of an oriented element restriction
4*bd403d52SSebastian Grimberg #include <ceed.h>
5*bd403d52SSebastian Grimberg #include <stdio.h>
6*bd403d52SSebastian Grimberg 
7*bd403d52SSebastian Grimberg int main(int argc, char **argv) {
8*bd403d52SSebastian Grimberg   Ceed                ceed;
9*bd403d52SSebastian Grimberg   CeedVector          x, y;
10*bd403d52SSebastian Grimberg   CeedInt             num_elem = 6, elem_size = 2;
11*bd403d52SSebastian Grimberg   CeedInt             ind[elem_size * num_elem];
12*bd403d52SSebastian Grimberg   bool                orients[elem_size * num_elem];
13*bd403d52SSebastian Grimberg   CeedScalar          x_array[num_elem + 1];
14*bd403d52SSebastian Grimberg   CeedElemRestriction elem_restriction;
15*bd403d52SSebastian Grimberg 
16*bd403d52SSebastian Grimberg   CeedInit(argv[1], &ceed);
17*bd403d52SSebastian Grimberg 
18*bd403d52SSebastian Grimberg   CeedVectorCreate(ceed, num_elem + 1, &x);
19*bd403d52SSebastian Grimberg   for (CeedInt i = 0; i < num_elem + 1; i++) x_array[i] = 10 + i;
20*bd403d52SSebastian Grimberg   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, x_array);
21*bd403d52SSebastian Grimberg   CeedVectorCreate(ceed, num_elem * elem_size, &y);
22*bd403d52SSebastian Grimberg 
23*bd403d52SSebastian Grimberg   for (CeedInt i = 0; i < num_elem; i++) {
24*bd403d52SSebastian Grimberg     ind[2 * i + 0]     = i;
25*bd403d52SSebastian Grimberg     ind[2 * i + 1]     = i + 1;
26*bd403d52SSebastian Grimberg     orients[2 * i + 0] = (i % 2) > 0;  // flip the dofs on element 1, 3, ...
27*bd403d52SSebastian Grimberg     orients[2 * i + 1] = (i % 2) > 0;
28*bd403d52SSebastian Grimberg   }
29*bd403d52SSebastian Grimberg   CeedElemRestrictionCreateOriented(ceed, num_elem, elem_size, 1, 1, num_elem + 1, CEED_MEM_HOST, CEED_USE_POINTER, ind, orients, &elem_restriction);
30*bd403d52SSebastian Grimberg 
31*bd403d52SSebastian Grimberg   // NoTranspose
32*bd403d52SSebastian Grimberg   CeedElemRestrictionApply(elem_restriction, CEED_NOTRANSPOSE, x, y, CEED_REQUEST_IMMEDIATE);
33*bd403d52SSebastian Grimberg   {
34*bd403d52SSebastian Grimberg     const CeedScalar *y_array;
35*bd403d52SSebastian Grimberg 
36*bd403d52SSebastian Grimberg     CeedVectorGetArrayRead(y, CEED_MEM_HOST, &y_array);
37*bd403d52SSebastian Grimberg     for (CeedInt i = 0; i < num_elem; i++) {
38*bd403d52SSebastian Grimberg       for (CeedInt j = 0; j < elem_size; j++) {
39*bd403d52SSebastian Grimberg         CeedInt k = j + elem_size * i;
40*bd403d52SSebastian Grimberg         if (y_array[k] * CeedIntPow(-1, i % 2) != 10 + (k + 1) / 2) {
41*bd403d52SSebastian Grimberg           // LCOV_EXCL_START
42*bd403d52SSebastian Grimberg           printf("Error in restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_array[k]);
43*bd403d52SSebastian Grimberg           // LCOV_EXCL_STOP
44*bd403d52SSebastian Grimberg         }
45*bd403d52SSebastian Grimberg       }
46*bd403d52SSebastian Grimberg     }
47*bd403d52SSebastian Grimberg     CeedVectorRestoreArrayRead(y, &y_array);
48*bd403d52SSebastian Grimberg   }
49*bd403d52SSebastian Grimberg 
50*bd403d52SSebastian Grimberg   // Transpose
51*bd403d52SSebastian Grimberg   CeedVectorSetValue(x, 0);
52*bd403d52SSebastian Grimberg   CeedElemRestrictionApply(elem_restriction, CEED_TRANSPOSE, y, x, CEED_REQUEST_IMMEDIATE);
53*bd403d52SSebastian Grimberg   {
54*bd403d52SSebastian Grimberg     const CeedScalar *x_array;
55*bd403d52SSebastian Grimberg 
56*bd403d52SSebastian Grimberg     CeedVectorGetArrayRead(x, CEED_MEM_HOST, &x_array);
57*bd403d52SSebastian Grimberg     for (CeedInt i = 0; i < num_elem + 1; i++) {
58*bd403d52SSebastian Grimberg       if (x_array[i] != (10 + i) * (i > 0 && i < num_elem ? 2.0 : 1.0))
59*bd403d52SSebastian Grimberg         printf("Error in restricted array x[%" CeedInt_FMT "] = %f\n", i, (CeedScalar)x_array[i]);
60*bd403d52SSebastian Grimberg     }
61*bd403d52SSebastian Grimberg     CeedVectorRestoreArrayRead(x, &x_array);
62*bd403d52SSebastian Grimberg   }
63*bd403d52SSebastian Grimberg 
64*bd403d52SSebastian Grimberg   CeedVectorDestroy(&x);
65*bd403d52SSebastian Grimberg   CeedVectorDestroy(&y);
66*bd403d52SSebastian Grimberg   CeedElemRestrictionDestroy(&elem_restriction);
67*bd403d52SSebastian Grimberg   CeedDestroy(&ceed);
68*bd403d52SSebastian Grimberg   return 0;
69*bd403d52SSebastian Grimberg }
70