1*280af619Sjeremylt /// @file 2*280af619Sjeremylt /// Test grad transpose with a 2D Simplex non-tensor H1 basis 3*280af619Sjeremylt /// \test Test grad transposewith a 2D Simplex non-tensor H1 basis 4*280af619Sjeremylt #include <ceed.h> 5*280af619Sjeremylt #include <math.h> 6*280af619Sjeremylt #include "t320-basis.h" 7*280af619Sjeremylt 8*280af619Sjeremylt int main(int argc, char **argv) { 9*280af619Sjeremylt Ceed ceed; 10*280af619Sjeremylt CeedVector In, Out; 11*280af619Sjeremylt const CeedInt P = 6, Q = 4, dim = 2, ncomp = 3; 12*280af619Sjeremylt CeedBasis b; 13*280af619Sjeremylt CeedScalar qref[dim*Q], qweight[Q]; 14*280af619Sjeremylt CeedScalar interp[P*Q], grad[dim*P*Q]; 15*280af619Sjeremylt const CeedScalar *out; 16*280af619Sjeremylt CeedScalar colsum[P], *in; 17*280af619Sjeremylt 18*280af619Sjeremylt buildmats(qref, qweight, interp, grad); 19*280af619Sjeremylt 20*280af619Sjeremylt CeedInit(argv[1], &ceed); 21*280af619Sjeremylt 22*280af619Sjeremylt for (int i=0; i<P; i++) { 23*280af619Sjeremylt colsum[i] = 0; 24*280af619Sjeremylt for (int j=0; j<Q*dim; j++) { 25*280af619Sjeremylt colsum[i] += grad[i+j*P]; 26*280af619Sjeremylt } 27*280af619Sjeremylt } 28*280af619Sjeremylt 29*280af619Sjeremylt CeedBasisCreateH1(ceed, CEED_TRIANGLE, ncomp, P, Q, interp, grad, qref, 30*280af619Sjeremylt qweight, &b); 31*280af619Sjeremylt 32*280af619Sjeremylt CeedVectorCreate(ceed, Q*dim*ncomp, &In); 33*280af619Sjeremylt CeedVectorGetArray(In, CEED_MEM_HOST, &in); 34*280af619Sjeremylt for (int d=0; d<dim; d++) 35*280af619Sjeremylt for (int n=0; n<ncomp; n++) 36*280af619Sjeremylt for (int q=0; q<Q; q++) 37*280af619Sjeremylt in[q+(n+d*ncomp)*Q] = n*1.0; 38*280af619Sjeremylt CeedVectorRestoreArray(In, &in); 39*280af619Sjeremylt CeedVectorCreate(ceed, P*ncomp, &Out); 40*280af619Sjeremylt CeedVectorSetValue(Out, 0); 41*280af619Sjeremylt 42*280af619Sjeremylt CeedBasisApply(b, 1, CEED_TRANSPOSE, CEED_EVAL_GRAD, In, Out); 43*280af619Sjeremylt 44*280af619Sjeremylt // Check values at quadrature points 45*280af619Sjeremylt CeedVectorGetArrayRead(Out, CEED_MEM_HOST, &out); 46*280af619Sjeremylt for (int p=0; p<P; p++) 47*280af619Sjeremylt for (int n=0; n<ncomp; n++) 48*280af619Sjeremylt if (fabs(n*colsum[p] - out[p+n*P]) > 1e-14) 49*280af619Sjeremylt // LCOV_EXCL_START 50*280af619Sjeremylt printf("[%d] %f != %f\n", p, out[p+n*P], n*colsum[p]); 51*280af619Sjeremylt // LCOV_EXCL_STOP 52*280af619Sjeremylt CeedVectorRestoreArrayRead(Out, &out); 53*280af619Sjeremylt 54*280af619Sjeremylt CeedVectorDestroy(&In); 55*280af619Sjeremylt CeedVectorDestroy(&Out); 56*280af619Sjeremylt CeedBasisDestroy(&b); 57*280af619Sjeremylt CeedDestroy(&ceed); 58*280af619Sjeremylt return 0; 59*280af619Sjeremylt } 60