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> 6*2b730f8bSJeremy L Thompson 7280af619Sjeremylt #include "t320-basis.h" 8280af619Sjeremylt 9280af619Sjeremylt int main(int argc, char **argv) { 10280af619Sjeremylt Ceed ceed; 11280af619Sjeremylt CeedVector In, Out; 12d1d35e2fSjeremylt const CeedInt P = 6, Q = 4, dim = 2, num_comp = 3; 13280af619Sjeremylt CeedBasis b; 14d1d35e2fSjeremylt CeedScalar q_ref[dim * Q], q_weight[Q]; 15280af619Sjeremylt CeedScalar interp[P * Q], grad[dim * P * Q]; 16280af619Sjeremylt const CeedScalar *out; 17280af619Sjeremylt CeedScalar colsum[P], *in; 18280af619Sjeremylt 19d1d35e2fSjeremylt buildmats(q_ref, q_weight, interp, grad); 20280af619Sjeremylt 21280af619Sjeremylt CeedInit(argv[1], &ceed); 22280af619Sjeremylt 23280af619Sjeremylt for (int i = 0; i < P; i++) { 24280af619Sjeremylt colsum[i] = 0; 25280af619Sjeremylt for (int j = 0; j < Q * dim; j++) { 26280af619Sjeremylt colsum[i] += grad[i + j * P]; 27280af619Sjeremylt } 28280af619Sjeremylt } 29280af619Sjeremylt 30*2b730f8bSJeremy L Thompson CeedBasisCreateH1(ceed, CEED_TOPOLOGY_TRIANGLE, num_comp, P, Q, interp, grad, q_ref, q_weight, &b); 31280af619Sjeremylt 32d1d35e2fSjeremylt CeedVectorCreate(ceed, Q * dim * num_comp, &In); 339c774eddSJeremy L Thompson CeedVectorGetArrayWrite(In, CEED_MEM_HOST, &in); 34*2b730f8bSJeremy L Thompson for (int d = 0; d < dim; d++) { 35*2b730f8bSJeremy L Thompson for (int n = 0; n < num_comp; n++) { 36*2b730f8bSJeremy L Thompson for (int q = 0; q < Q; q++) in[q + (n + d * num_comp) * Q] = n * 1.0; 37*2b730f8bSJeremy L Thompson } 38*2b730f8bSJeremy L Thompson } 39280af619Sjeremylt CeedVectorRestoreArray(In, &in); 40d1d35e2fSjeremylt CeedVectorCreate(ceed, P * num_comp, &Out); 41280af619Sjeremylt CeedVectorSetValue(Out, 0); 42280af619Sjeremylt 43280af619Sjeremylt CeedBasisApply(b, 1, CEED_TRANSPOSE, CEED_EVAL_GRAD, In, Out); 44280af619Sjeremylt 45280af619Sjeremylt // Check values at quadrature points 46280af619Sjeremylt CeedVectorGetArrayRead(Out, CEED_MEM_HOST, &out); 47*2b730f8bSJeremy L Thompson for (int p = 0; p < P; p++) { 48*2b730f8bSJeremy L Thompson for (int n = 0; n < num_comp; n++) { 49*2b730f8bSJeremy L Thompson if (fabs(n * colsum[p] - out[p + n * P]) > 100. * CEED_EPSILON) printf("[%" CeedInt_FMT "] %f != %f\n", p, out[p + n * P], n * colsum[p]); 50*2b730f8bSJeremy L Thompson } 51*2b730f8bSJeremy L Thompson } 52280af619Sjeremylt CeedVectorRestoreArrayRead(Out, &out); 53280af619Sjeremylt 54280af619Sjeremylt CeedVectorDestroy(&In); 55280af619Sjeremylt CeedVectorDestroy(&Out); 56280af619Sjeremylt CeedBasisDestroy(&b); 57280af619Sjeremylt CeedDestroy(&ceed); 58280af619Sjeremylt return 0; 59280af619Sjeremylt } 60