1*b5404d5dSSebastian Grimberg /// @file 2*b5404d5dSSebastian Grimberg /// Test curl with a 2D Simplex non-tensor H(curl) basis 3*b5404d5dSSebastian Grimberg /// \test Test curl with a 2D Simplex non-tensor H(curl) basis 4*b5404d5dSSebastian Grimberg #include <ceed.h> 5*b5404d5dSSebastian Grimberg #include <math.h> 6*b5404d5dSSebastian Grimberg 7*b5404d5dSSebastian Grimberg #include "t340-basis.h" 8*b5404d5dSSebastian Grimberg 9*b5404d5dSSebastian Grimberg int main(int argc, char **argv) { 10*b5404d5dSSebastian Grimberg Ceed ceed; 11*b5404d5dSSebastian Grimberg CeedVector u, v; 12*b5404d5dSSebastian Grimberg const CeedInt p = 8, q = 4, dim = 2; 13*b5404d5dSSebastian Grimberg CeedBasis basis; 14*b5404d5dSSebastian Grimberg CeedScalar q_ref[dim * q], q_weight[q]; 15*b5404d5dSSebastian Grimberg CeedScalar interp[dim * p * q], curl[p * q]; 16*b5404d5dSSebastian Grimberg CeedScalar row_sum[dim * q], column_sum[p]; 17*b5404d5dSSebastian Grimberg 18*b5404d5dSSebastian Grimberg CeedInit(argv[1], &ceed); 19*b5404d5dSSebastian Grimberg 20*b5404d5dSSebastian Grimberg BuildHcurl2DSimplex(q_ref, q_weight, interp, curl); 21*b5404d5dSSebastian Grimberg CeedBasisCreateHcurl(ceed, CEED_TOPOLOGY_TRIANGLE, 1, p, q, interp, curl, q_ref, q_weight, &basis); 22*b5404d5dSSebastian Grimberg 23*b5404d5dSSebastian Grimberg // Test curl for H(curl) 24*b5404d5dSSebastian Grimberg { 25*b5404d5dSSebastian Grimberg const CeedScalar *curl_in_basis; 26*b5404d5dSSebastian Grimberg 27*b5404d5dSSebastian Grimberg CeedBasisGetCurl(basis, &curl_in_basis); 28*b5404d5dSSebastian Grimberg for (CeedInt i = 0; i < p * q; i++) { 29*b5404d5dSSebastian Grimberg if (fabs(curl[i] - curl_in_basis[i]) > 100. * CEED_EPSILON) printf("%f != %f\n", curl[i], curl_in_basis[i]); 30*b5404d5dSSebastian Grimberg } 31*b5404d5dSSebastian Grimberg } 32*b5404d5dSSebastian Grimberg 33*b5404d5dSSebastian Grimberg for (int i = 0; i < q; i++) { 34*b5404d5dSSebastian Grimberg row_sum[i] = 0; 35*b5404d5dSSebastian Grimberg for (int j = 0; j < p; j++) { 36*b5404d5dSSebastian Grimberg row_sum[i] += curl[j + i * p]; 37*b5404d5dSSebastian Grimberg } 38*b5404d5dSSebastian Grimberg } 39*b5404d5dSSebastian Grimberg for (int i = 0; i < p; i++) { 40*b5404d5dSSebastian Grimberg column_sum[i] = 0; 41*b5404d5dSSebastian Grimberg for (int j = 0; j < q; j++) { 42*b5404d5dSSebastian Grimberg column_sum[i] += curl[i + j * p]; 43*b5404d5dSSebastian Grimberg } 44*b5404d5dSSebastian Grimberg } 45*b5404d5dSSebastian Grimberg 46*b5404d5dSSebastian Grimberg CeedVectorCreate(ceed, p, &u); 47*b5404d5dSSebastian Grimberg CeedVectorSetValue(u, 1.0); 48*b5404d5dSSebastian Grimberg CeedVectorCreate(ceed, q, &v); 49*b5404d5dSSebastian Grimberg CeedVectorSetValue(v, 0.0); 50*b5404d5dSSebastian Grimberg 51*b5404d5dSSebastian Grimberg CeedBasisApply(basis, 1, CEED_NOTRANSPOSE, CEED_EVAL_CURL, u, v); 52*b5404d5dSSebastian Grimberg 53*b5404d5dSSebastian Grimberg { 54*b5404d5dSSebastian Grimberg const CeedScalar *v_array; 55*b5404d5dSSebastian Grimberg 56*b5404d5dSSebastian Grimberg CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array); 57*b5404d5dSSebastian Grimberg for (CeedInt i = 0; i < q; i++) { 58*b5404d5dSSebastian Grimberg if (fabs(row_sum[i] - v_array[i]) > 100. * CEED_EPSILON) printf("%f != %f\n", row_sum[i], v_array[i]); 59*b5404d5dSSebastian Grimberg } 60*b5404d5dSSebastian Grimberg CeedVectorRestoreArrayRead(v, &v_array); 61*b5404d5dSSebastian Grimberg } 62*b5404d5dSSebastian Grimberg 63*b5404d5dSSebastian Grimberg CeedVectorSetValue(v, 1.0); 64*b5404d5dSSebastian Grimberg CeedVectorSetValue(u, 0.0); 65*b5404d5dSSebastian Grimberg 66*b5404d5dSSebastian Grimberg CeedBasisApply(basis, 1, CEED_TRANSPOSE, CEED_EVAL_CURL, v, u); 67*b5404d5dSSebastian Grimberg 68*b5404d5dSSebastian Grimberg { 69*b5404d5dSSebastian Grimberg const CeedScalar *u_array; 70*b5404d5dSSebastian Grimberg 71*b5404d5dSSebastian Grimberg CeedVectorGetArrayRead(u, CEED_MEM_HOST, &u_array); 72*b5404d5dSSebastian Grimberg for (CeedInt i = 0; i < p; i++) { 73*b5404d5dSSebastian Grimberg if (fabs(column_sum[i] - u_array[i]) > 100. * CEED_EPSILON) printf("%f != %f\n", column_sum[i], u_array[i]); 74*b5404d5dSSebastian Grimberg } 75*b5404d5dSSebastian Grimberg CeedVectorRestoreArrayRead(u, &u_array); 76*b5404d5dSSebastian Grimberg } 77*b5404d5dSSebastian Grimberg 78*b5404d5dSSebastian Grimberg CeedBasisDestroy(&basis); 79*b5404d5dSSebastian Grimberg CeedVectorDestroy(&u); 80*b5404d5dSSebastian Grimberg CeedVectorDestroy(&v); 81*b5404d5dSSebastian Grimberg CeedDestroy(&ceed); 82*b5404d5dSSebastian Grimberg return 0; 83*b5404d5dSSebastian Grimberg } 84