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