1bd403d52SSebastian Grimberg /// @file 2c16dd8e6SSebastian Grimberg /// Test creation, use, and destruction of a curl-conforming oriented element restriction with and without unsigned application 3c16dd8e6SSebastian Grimberg /// \test Test creation, use, and destruction of a curl-conforming oriented element restriction with and without unsigned application 4bd403d52SSebastian Grimberg #include <ceed.h> 5bd403d52SSebastian Grimberg #include <stdio.h> 6bd403d52SSebastian Grimberg 7bd403d52SSebastian Grimberg int main(int argc, char **argv) { 8bd403d52SSebastian Grimberg Ceed ceed; 9c16dd8e6SSebastian Grimberg CeedVector x, y, y_unsigned; 10c16dd8e6SSebastian Grimberg CeedInt num_elem = 6, elem_size = 4; 110c73c039SSebastian Grimberg CeedInt ind[elem_size * num_elem]; 120c73c039SSebastian Grimberg CeedInt8 curl_orients[3 * elem_size * num_elem]; 13c16dd8e6SSebastian Grimberg CeedScalar x_array[3 * num_elem + 1]; 14c16dd8e6SSebastian Grimberg CeedElemRestriction elem_restriction, elem_restriction_unsigned; 15bd403d52SSebastian Grimberg 16bd403d52SSebastian Grimberg CeedInit(argv[1], &ceed); 17bd403d52SSebastian Grimberg 18c16dd8e6SSebastian Grimberg CeedVectorCreate(ceed, 3 * num_elem + 1, &x); 19c16dd8e6SSebastian Grimberg for (CeedInt i = 0; i < 3 * 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); 22c16dd8e6SSebastian Grimberg CeedVectorCreate(ceed, num_elem * elem_size, &y_unsigned); 23bd403d52SSebastian Grimberg 24bd403d52SSebastian Grimberg for (CeedInt i = 0; i < num_elem; i++) { 25c16dd8e6SSebastian Grimberg ind[4 * i + 0] = 3 * i + 0; 26c16dd8e6SSebastian Grimberg ind[4 * i + 1] = 3 * i + 1; 27c16dd8e6SSebastian Grimberg ind[4 * i + 2] = 3 * i + 2; 28c16dd8e6SSebastian Grimberg ind[4 * i + 3] = 3 * i + 3; 29bd403d52SSebastian Grimberg if (i % 2 > 0) { 30c16dd8e6SSebastian Grimberg // T = [ 1 0 0 0] 31c16dd8e6SSebastian Grimberg // [ 0 1 0 0] 32c16dd8e6SSebastian Grimberg // [ 0 0 0 -1] 33c16dd8e6SSebastian Grimberg // [ 0 0 -1 0] 34c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 0] = 0; 35c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 1] = 1; 36c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 2] = 0; 37c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 3] = 0; 38c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 4] = 1; 39c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 5] = 0; 40c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 6] = 0; 41c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 7] = 0; 42c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 8] = -1; 43c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 9] = -1; 44c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 10] = 0; 45c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 11] = 0; 46bd403d52SSebastian Grimberg } else { 47bd403d52SSebastian Grimberg // T = I 48c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 0] = 0; 49c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 1] = 1; 50c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 2] = 0; 51c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 3] = 0; 52c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 4] = 1; 53c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 5] = 0; 54c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 6] = 0; 55c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 7] = 1; 56c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 8] = 0; 57c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 9] = 0; 58c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 10] = 1; 59c16dd8e6SSebastian Grimberg curl_orients[3 * 4 * i + 11] = 0; 60bd403d52SSebastian Grimberg } 61bd403d52SSebastian Grimberg } 62c16dd8e6SSebastian Grimberg CeedElemRestrictionCreateCurlOriented(ceed, num_elem, elem_size, 1, 1, 3 * num_elem + 1, CEED_MEM_HOST, CEED_USE_POINTER, ind, curl_orients, 63bd403d52SSebastian Grimberg &elem_restriction); 64c16dd8e6SSebastian Grimberg CeedElemRestrictionCreateUnsignedCopy(elem_restriction, &elem_restriction_unsigned); 65bd403d52SSebastian Grimberg 66bd403d52SSebastian Grimberg // NoTranspose 67bd403d52SSebastian Grimberg CeedElemRestrictionApply(elem_restriction, CEED_NOTRANSPOSE, x, y, CEED_REQUEST_IMMEDIATE); 68c16dd8e6SSebastian Grimberg CeedElemRestrictionApply(elem_restriction_unsigned, CEED_NOTRANSPOSE, x, y_unsigned, CEED_REQUEST_IMMEDIATE); 69bd403d52SSebastian Grimberg { 70c16dd8e6SSebastian Grimberg const CeedScalar *y_array, *y_unsigned_array; 71bd403d52SSebastian Grimberg 72bd403d52SSebastian Grimberg CeedVectorGetArrayRead(y, CEED_MEM_HOST, &y_array); 73c16dd8e6SSebastian Grimberg CeedVectorGetArrayRead(y_unsigned, CEED_MEM_HOST, &y_unsigned_array); 74bd403d52SSebastian Grimberg for (CeedInt i = 0; i < num_elem; i++) { 75bd403d52SSebastian Grimberg for (CeedInt j = 0; j < elem_size; j++) { 76bd403d52SSebastian Grimberg CeedInt k = j + elem_size * i; 77c16dd8e6SSebastian Grimberg if (i % 2 > 0 && j >= 2) { 78c16dd8e6SSebastian Grimberg if (j == 2 && 10 + 3 * i + j + 1 != -y_array[k]) { 79bd403d52SSebastian Grimberg // LCOV_EXCL_START 80bd403d52SSebastian Grimberg printf("Error in restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_array[k]); 81bd403d52SSebastian Grimberg // LCOV_EXCL_STOP 82c16dd8e6SSebastian Grimberg } else if (j == 3 && 10 + 3 * i + j - 1 != -y_array[k]) { 83bd403d52SSebastian Grimberg // LCOV_EXCL_START 84bd403d52SSebastian Grimberg printf("Error in restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_array[k]); 85bd403d52SSebastian Grimberg // LCOV_EXCL_STOP 86bd403d52SSebastian Grimberg } 87c16dd8e6SSebastian Grimberg if (j == 2 && 10 + 3 * i + j + 1 != y_unsigned_array[k]) { 88c16dd8e6SSebastian Grimberg // LCOV_EXCL_START 89c16dd8e6SSebastian Grimberg printf("Error in unsigned restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_unsigned_array[k]); 90c16dd8e6SSebastian Grimberg // LCOV_EXCL_STOP 91c16dd8e6SSebastian Grimberg } else if (j == 3 && 10 + 3 * i + j - 1 != y_unsigned_array[k]) { 92c16dd8e6SSebastian Grimberg // LCOV_EXCL_START 93c16dd8e6SSebastian Grimberg printf("Error in unsigned restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_unsigned_array[k]); 94c16dd8e6SSebastian Grimberg // LCOV_EXCL_STOP 95c16dd8e6SSebastian Grimberg } 96bd403d52SSebastian Grimberg } else { 97c16dd8e6SSebastian Grimberg if (10 + 3 * i + j != y_array[k] || 10 + 3 * i + j != y_unsigned_array[k]) { 98bd403d52SSebastian Grimberg // LCOV_EXCL_START 99bd403d52SSebastian Grimberg printf("Error in restricted array y[%" CeedInt_FMT "] = %f\n", k, (CeedScalar)y_array[k]); 100bd403d52SSebastian Grimberg // LCOV_EXCL_STOP 101bd403d52SSebastian Grimberg } 102bd403d52SSebastian Grimberg } 103bd403d52SSebastian Grimberg } 104bd403d52SSebastian Grimberg } 105bd403d52SSebastian Grimberg CeedVectorRestoreArrayRead(y, &y_array); 106c16dd8e6SSebastian Grimberg CeedVectorRestoreArrayRead(y_unsigned, &y_unsigned_array); 107bd403d52SSebastian Grimberg } 108bd403d52SSebastian Grimberg 109bd403d52SSebastian Grimberg // Transpose 110bd403d52SSebastian Grimberg CeedVectorSetValue(x, 0); 111bd403d52SSebastian Grimberg CeedElemRestrictionApply(elem_restriction, CEED_TRANSPOSE, y, x, CEED_REQUEST_IMMEDIATE); 112bd403d52SSebastian Grimberg { 113bd403d52SSebastian Grimberg const CeedScalar *x_array; 114bd403d52SSebastian Grimberg 115bd403d52SSebastian Grimberg CeedVectorGetArrayRead(x, CEED_MEM_HOST, &x_array); 116c16dd8e6SSebastian Grimberg for (CeedInt i = 0; i < 3 * num_elem + 1; i++) { 117*2b62239cSJeremy L Thompson if (x_array[i] != (10 + i) * (i > 0 && i < 3 * num_elem && i % 3 == 0 ? 2.0 : 1.0)) { 118*2b62239cSJeremy L Thompson // LCOV_EXCL_START 119c16dd8e6SSebastian Grimberg printf("Error in restricted array x[%" CeedInt_FMT "] = %f\n", i, (CeedScalar)x_array[i]); 120*2b62239cSJeremy L Thompson // LCOV_EXCL_STOP 121*2b62239cSJeremy L Thompson } 122c16dd8e6SSebastian Grimberg } 123c16dd8e6SSebastian Grimberg CeedVectorRestoreArrayRead(x, &x_array); 124c16dd8e6SSebastian Grimberg } 125c16dd8e6SSebastian Grimberg 126c16dd8e6SSebastian Grimberg // Transpose unsigned 127c16dd8e6SSebastian Grimberg CeedVectorSetValue(x, 0); 128c16dd8e6SSebastian Grimberg CeedElemRestrictionApply(elem_restriction_unsigned, CEED_TRANSPOSE, y_unsigned, x, CEED_REQUEST_IMMEDIATE); 129c16dd8e6SSebastian Grimberg { 130c16dd8e6SSebastian Grimberg const CeedScalar *x_array; 131c16dd8e6SSebastian Grimberg 132c16dd8e6SSebastian Grimberg CeedVectorGetArrayRead(x, CEED_MEM_HOST, &x_array); 133c16dd8e6SSebastian Grimberg for (CeedInt i = 0; i < 3 * num_elem + 1; i++) { 134*2b62239cSJeremy L Thompson if (x_array[i] != (10 + i) * (i > 0 && i < 3 * num_elem && i % 3 == 0 ? 2.0 : 1.0)) { 135*2b62239cSJeremy L Thompson // LCOV_EXCL_START 136bd403d52SSebastian Grimberg printf("Error in restricted array x[%" CeedInt_FMT "] = %f\n", i, (CeedScalar)x_array[i]); 137*2b62239cSJeremy L Thompson // LCOV_EXCL_STOP 138*2b62239cSJeremy L Thompson } 139bd403d52SSebastian Grimberg } 140bd403d52SSebastian Grimberg CeedVectorRestoreArrayRead(x, &x_array); 141bd403d52SSebastian Grimberg } 142bd403d52SSebastian Grimberg 143bd403d52SSebastian Grimberg CeedVectorDestroy(&x); 144bd403d52SSebastian Grimberg CeedVectorDestroy(&y); 145c16dd8e6SSebastian Grimberg CeedVectorDestroy(&y_unsigned); 146bd403d52SSebastian Grimberg CeedElemRestrictionDestroy(&elem_restriction); 147c16dd8e6SSebastian Grimberg CeedElemRestrictionDestroy(&elem_restriction_unsigned); 148bd403d52SSebastian Grimberg CeedDestroy(&ceed); 149bd403d52SSebastian Grimberg return 0; 150bd403d52SSebastian Grimberg } 151