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; 11*d1d35e2fSjeremylt const CeedInt P = 6, Q = 4, dim = 2, num_comp = 3; 12280af619Sjeremylt CeedBasis b; 13*d1d35e2fSjeremylt CeedScalar q_ref[dim*Q], q_weight[Q]; 14280af619Sjeremylt CeedScalar interp[P*Q], grad[dim*P*Q]; 15280af619Sjeremylt const CeedScalar *out; 16280af619Sjeremylt CeedScalar colsum[P], *in; 17280af619Sjeremylt 18*d1d35e2fSjeremylt buildmats(q_ref, q_weight, 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 29*d1d35e2fSjeremylt CeedBasisCreateH1(ceed, CEED_TRIANGLE, num_comp, P, Q, interp, grad, q_ref, 30*d1d35e2fSjeremylt q_weight, &b); 31280af619Sjeremylt 32*d1d35e2fSjeremylt CeedVectorCreate(ceed, Q*dim*num_comp, &In); 33280af619Sjeremylt CeedVectorGetArray(In, CEED_MEM_HOST, &in); 34280af619Sjeremylt for (int d=0; d<dim; d++) 35*d1d35e2fSjeremylt for (int n=0; n<num_comp; n++) 36280af619Sjeremylt for (int q=0; q<Q; q++) 37*d1d35e2fSjeremylt in[q+(n+d*num_comp)*Q] = n*1.0; 38280af619Sjeremylt CeedVectorRestoreArray(In, &in); 39*d1d35e2fSjeremylt CeedVectorCreate(ceed, P*num_comp, &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++) 47*d1d35e2fSjeremylt for (int n=0; n<num_comp; n++) 488634965cSvaleriabarra 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