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