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