1280af619Sjeremylt /// @file 2280af619Sjeremylt /// Test grad transpose with a 2D Simplex non-tensor H1 basis 3280af619Sjeremylt /// \test Test grad transposewith a 2D Simplex non-tensor H1 basis 4280af619Sjeremylt #include <ceed.h> 5280af619Sjeremylt #include <math.h> 6280af619Sjeremylt #include "t320-basis.h" 7280af619Sjeremylt 8280af619Sjeremylt int main(int argc, char **argv) { 9280af619Sjeremylt Ceed ceed; 10280af619Sjeremylt CeedVector In, Out; 11280af619Sjeremylt const CeedInt P = 6, Q = 4, dim = 2, ncomp = 3; 12280af619Sjeremylt CeedBasis b; 13280af619Sjeremylt CeedScalar qref[dim*Q], qweight[Q]; 14280af619Sjeremylt CeedScalar interp[P*Q], grad[dim*P*Q]; 15280af619Sjeremylt const CeedScalar *out; 16280af619Sjeremylt CeedScalar colsum[P], *in; 17280af619Sjeremylt 18280af619Sjeremylt buildmats(qref, qweight, interp, grad); 19280af619Sjeremylt 20280af619Sjeremylt CeedInit(argv[1], &ceed); 21280af619Sjeremylt 22280af619Sjeremylt for (int i=0; i<P; i++) { 23280af619Sjeremylt colsum[i] = 0; 24280af619Sjeremylt for (int j=0; j<Q*dim; j++) { 25280af619Sjeremylt colsum[i] += grad[i+j*P]; 26280af619Sjeremylt } 27280af619Sjeremylt } 28280af619Sjeremylt 29280af619Sjeremylt CeedBasisCreateH1(ceed, CEED_TRIANGLE, ncomp, P, Q, interp, grad, qref, 30280af619Sjeremylt qweight, &b); 31280af619Sjeremylt 32280af619Sjeremylt CeedVectorCreate(ceed, Q*dim*ncomp, &In); 33280af619Sjeremylt CeedVectorGetArray(In, CEED_MEM_HOST, &in); 34280af619Sjeremylt for (int d=0; d<dim; d++) 35280af619Sjeremylt for (int n=0; n<ncomp; n++) 36280af619Sjeremylt for (int q=0; q<Q; q++) 37280af619Sjeremylt in[q+(n+d*ncomp)*Q] = n*1.0; 38280af619Sjeremylt CeedVectorRestoreArray(In, &in); 39280af619Sjeremylt CeedVectorCreate(ceed, P*ncomp, &Out); 40280af619Sjeremylt CeedVectorSetValue(Out, 0); 41280af619Sjeremylt 42280af619Sjeremylt CeedBasisApply(b, 1, CEED_TRANSPOSE, CEED_EVAL_GRAD, In, Out); 43280af619Sjeremylt 44280af619Sjeremylt // Check values at quadrature points 45280af619Sjeremylt CeedVectorGetArrayRead(Out, CEED_MEM_HOST, &out); 46280af619Sjeremylt for (int p=0; p<P; p++) 47280af619Sjeremylt for (int n=0; n<ncomp; n++) 48*8634965cSvaleriabarra if (fabs(n*colsum[p] - out[p+n*P]) > 1E-14) 49280af619Sjeremylt // LCOV_EXCL_START 50280af619Sjeremylt printf("[%d] %f != %f\n", p, out[p+n*P], n*colsum[p]); 51280af619Sjeremylt // LCOV_EXCL_STOP 52280af619Sjeremylt CeedVectorRestoreArrayRead(Out, &out); 53280af619Sjeremylt 54280af619Sjeremylt CeedVectorDestroy(&In); 55280af619Sjeremylt CeedVectorDestroy(&Out); 56280af619Sjeremylt CeedBasisDestroy(&b); 57280af619Sjeremylt CeedDestroy(&ceed); 58280af619Sjeremylt return 0; 59280af619Sjeremylt } 60