150c301a5SRezgar Shakeri /// @file 250c301a5SRezgar Shakeri /// Test GetInterp and BasisApply for a 2D Quad non-tensor H(div) basis 350c301a5SRezgar Shakeri /// \test Test GetInterp and BasisApply for a 2D Quad non-tensor H(div) basis 450c301a5SRezgar Shakeri #include <ceed.h> 550c301a5SRezgar Shakeri #include <math.h> 62b730f8bSJeremy L Thompson 750c301a5SRezgar Shakeri #include "t330-basis.h" 850c301a5SRezgar Shakeri 950c301a5SRezgar Shakeri int main(int argc, char **argv) { 1050c301a5SRezgar Shakeri Ceed ceed; 11*4fee36f0SJeremy L Thompson const CeedInt num_nodes = 4, q = 3, dim = 2, num_qpts = q * q; 12*4fee36f0SJeremy L Thompson CeedInt num_comp = 1; // one vector component 13*4fee36f0SJeremy L Thompson CeedInt p = dim * num_nodes; // DoF per element 14*4fee36f0SJeremy L Thompson CeedBasis basis; 1550c301a5SRezgar Shakeri CeedScalar q_ref[dim * num_qpts], q_weights[num_qpts]; 16*4fee36f0SJeremy L Thompson CeedScalar div[p * num_qpts], interp[p * dim * num_qpts]; 17*4fee36f0SJeremy L Thompson CeedVector u, v; 1850c301a5SRezgar Shakeri 1950c301a5SRezgar Shakeri CeedInit(argv[1], &ceed); 2050c301a5SRezgar Shakeri 21*4fee36f0SJeremy L Thompson BuildHdivQuadrilateral(q, q_ref, q_weights, interp, div, CEED_GAUSS); 22*4fee36f0SJeremy L Thompson CeedBasisCreateHdiv(ceed, CEED_TOPOLOGY_QUAD, num_comp, p, num_qpts, interp, div, q_ref, q_weights, &basis); 2350c301a5SRezgar Shakeri 2450c301a5SRezgar Shakeri // Test GetInterp for H(div) 25*4fee36f0SJeremy L Thompson { 26*4fee36f0SJeremy L Thompson const CeedScalar *interp_2; 27*4fee36f0SJeremy L Thompson CeedBasisGetInterp(basis, &interp_2); 28*4fee36f0SJeremy L Thompson for (CeedInt i = 0; i < p * dim * num_qpts; i++) { 29*4fee36f0SJeremy L Thompson if (fabs(interp[i] - interp_2[i]) > 100. * CEED_EPSILON) { 3050c301a5SRezgar Shakeri // LCOV_EXCL_START 31*4fee36f0SJeremy L Thompson printf("%f != %f\n", interp[i], interp_2[i]); 3250c301a5SRezgar Shakeri // LCOV_EXCL_STOP 3350c301a5SRezgar Shakeri } 342b730f8bSJeremy L Thompson } 35*4fee36f0SJeremy L Thompson } 3650c301a5SRezgar Shakeri 37*4fee36f0SJeremy L Thompson CeedVectorCreate(ceed, p, &u); 38*4fee36f0SJeremy L Thompson CeedVectorSetValue(u, 1.0); 39*4fee36f0SJeremy L Thompson CeedVectorCreate(ceed, num_qpts * dim, &v); 40*4fee36f0SJeremy L Thompson CeedVectorSetValue(v, 0.); 41*4fee36f0SJeremy L Thompson 4250c301a5SRezgar Shakeri // BasisApply for H(div): CEED_EVAL_INTERP, NOTRANSPOSE case 43*4fee36f0SJeremy L Thompson CeedBasisApply(basis, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, u, v); 4450c301a5SRezgar Shakeri 45*4fee36f0SJeremy L Thompson { 46*4fee36f0SJeremy L Thompson const CeedScalar *v_array; 47*4fee36f0SJeremy L Thompson 48*4fee36f0SJeremy L Thompson CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array); 4950c301a5SRezgar Shakeri for (CeedInt i = 0; i < dim * num_qpts; i++) { 50*4fee36f0SJeremy L Thompson if (fabs(q_ref[i] - v_array[i]) > 100. * CEED_EPSILON) { 5150c301a5SRezgar Shakeri // LCOV_EXCL_START 52*4fee36f0SJeremy L Thompson printf("%f != %f\n", q_ref[i], v_array[i]); 5350c301a5SRezgar Shakeri // LCOV_EXCL_STOP 5450c301a5SRezgar Shakeri } 552b730f8bSJeremy L Thompson } 56*4fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(v, &v_array); 57*4fee36f0SJeremy L Thompson } 5850c301a5SRezgar Shakeri 59*4fee36f0SJeremy L Thompson CeedVectorSetValue(v, 1.0); 60*4fee36f0SJeremy L Thompson CeedVectorSetValue(u, 0.0); 61*4fee36f0SJeremy L Thompson 6250c301a5SRezgar Shakeri // BasisApply for Hdiv: CEED_EVAL_INTERP, TRANSPOSE case 63*4fee36f0SJeremy L Thompson CeedBasisApply(basis, 1, CEED_TRANSPOSE, CEED_EVAL_INTERP, v, u); 6450c301a5SRezgar Shakeri 65*4fee36f0SJeremy L Thompson { 66*4fee36f0SJeremy L Thompson const CeedScalar *u_array; 67*4fee36f0SJeremy L Thompson 68*4fee36f0SJeremy L Thompson CeedVectorGetArrayRead(u, CEED_MEM_HOST, &u_array); 6950c301a5SRezgar Shakeri CeedScalar sum = 0.; 70*4fee36f0SJeremy L Thompson for (CeedInt i = 0; i < p; i++) { 71*4fee36f0SJeremy L Thompson sum += u_array[i]; 7250c301a5SRezgar Shakeri } 732b730f8bSJeremy L Thompson if (fabs(sum) > 100. * CEED_EPSILON) printf("sum of array %f != %f\n", sum, 0.0); 74*4fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(u, &u_array); 75*4fee36f0SJeremy L Thompson } 7650c301a5SRezgar Shakeri 77*4fee36f0SJeremy L Thompson CeedBasisDestroy(&basis); 78*4fee36f0SJeremy L Thompson CeedVectorDestroy(&u); 79*4fee36f0SJeremy L Thompson CeedVectorDestroy(&v); 8050c301a5SRezgar Shakeri CeedDestroy(&ceed); 8150c301a5SRezgar Shakeri return 0; 8250c301a5SRezgar Shakeri } 83