xref: /libCEED/tests/t332-basis.c (revision 49aac155e7a09736f56fb3abac0f57dab29f7cbf)
150c301a5SRezgar Shakeri /// @file
250c301a5SRezgar Shakeri /// Test GetDiv and BasisApply for a 2D Quad non-tensor H(div) basis
350c301a5SRezgar Shakeri /// \test Test GetDiv and BasisApply for a 2D Quad non-tensor H(div) basis
450c301a5SRezgar Shakeri #include <ceed.h>
550c301a5SRezgar Shakeri #include <math.h>
6*49aac155SJeremy L Thompson #include <stdio.h>
72b730f8bSJeremy L Thompson 
850c301a5SRezgar Shakeri #include "t330-basis.h"
950c301a5SRezgar Shakeri 
1050c301a5SRezgar Shakeri int main(int argc, char **argv) {
1150c301a5SRezgar Shakeri   Ceed          ceed;
124fee36f0SJeremy L Thompson   const CeedInt num_nodes = 4, q = 3, dim = 2, num_qpts = q * q;
134fee36f0SJeremy L Thompson   CeedInt       num_comp = 1;                // one vector component
144fee36f0SJeremy L Thompson   CeedInt       p        = dim * num_nodes;  // DoF per element
154fee36f0SJeremy L Thompson   CeedBasis     basis;
1650c301a5SRezgar Shakeri   CeedScalar    q_ref[dim * num_qpts], q_weights[num_qpts];
174fee36f0SJeremy L Thompson   CeedScalar    div[p * num_qpts], interp[p * dim * num_qpts];
184fee36f0SJeremy L Thompson   CeedVector    u, v;
1950c301a5SRezgar Shakeri 
2050c301a5SRezgar Shakeri   CeedInit(argv[1], &ceed);
2150c301a5SRezgar Shakeri 
224fee36f0SJeremy L Thompson   BuildHdivQuadrilateral(q, q_ref, q_weights, interp, div, CEED_GAUSS);
234fee36f0SJeremy L Thompson   CeedBasisCreateHdiv(ceed, CEED_TOPOLOGY_QUAD, num_comp, p, num_qpts, interp, div, q_ref, q_weights, &basis);
244fee36f0SJeremy L Thompson 
2550c301a5SRezgar Shakeri   // Test GetDiv
264fee36f0SJeremy L Thompson   {
274fee36f0SJeremy L Thompson     const CeedScalar *div_2;
284fee36f0SJeremy L Thompson 
294fee36f0SJeremy L Thompson     CeedBasisGetDiv(basis, &div_2);
304fee36f0SJeremy L Thompson     for (CeedInt i = 0; i < p * num_qpts; i++) {
314fee36f0SJeremy L Thompson       if (fabs(div[i] - div_2[i]) > 100. * CEED_EPSILON) printf("%f != %f\n", div[i], div_2[i]);
3250c301a5SRezgar Shakeri     }
334fee36f0SJeremy L Thompson   }
344fee36f0SJeremy L Thompson 
354fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, p, &u);
364fee36f0SJeremy L Thompson   CeedVectorSetValue(u, 1);
374fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, num_qpts, &v);
384fee36f0SJeremy L Thompson   CeedVectorSetValue(v, 0);
394fee36f0SJeremy L Thompson 
4050c301a5SRezgar Shakeri   // BasisApply for H(div): CEED_EVAL_DIV, NOTRANSPOSE case
414fee36f0SJeremy L Thompson   CeedBasisApply(basis, 1, CEED_NOTRANSPOSE, CEED_EVAL_DIV, u, v);
4250c301a5SRezgar Shakeri 
434fee36f0SJeremy L Thompson   {
444fee36f0SJeremy L Thompson     const CeedScalar *v_array;
454fee36f0SJeremy L Thompson 
464fee36f0SJeremy L Thompson     CeedVectorGetArrayRead(v, CEED_MEM_HOST, &v_array);
4750c301a5SRezgar Shakeri     for (CeedInt i = 0; i < num_qpts; i++) {
484fee36f0SJeremy L Thompson       if (fabs(p * 0.25 - v_array[i]) > 100. * CEED_EPSILON) printf("%f != %f\n", 2.0, v_array[i]);
4950c301a5SRezgar Shakeri     }
504fee36f0SJeremy L Thompson     CeedVectorRestoreArrayRead(v, &v_array);
514fee36f0SJeremy L Thompson   }
5250c301a5SRezgar Shakeri 
534fee36f0SJeremy L Thompson   CeedVectorSetValue(v, 1.0);
544fee36f0SJeremy L Thompson   CeedVectorSetValue(u, 0.0);
554fee36f0SJeremy L Thompson 
5650c301a5SRezgar Shakeri   // BasisApply for H(div): CEED_EVAL_DIV, TRANSPOSE case
574fee36f0SJeremy L Thompson   CeedBasisApply(basis, 1, CEED_TRANSPOSE, CEED_EVAL_DIV, v, u);
5850c301a5SRezgar Shakeri 
594fee36f0SJeremy L Thompson   {
604fee36f0SJeremy L Thompson     const CeedScalar *u_array;
614fee36f0SJeremy L Thompson 
624fee36f0SJeremy L Thompson     CeedVectorGetArrayRead(u, CEED_MEM_HOST, &u_array);
634fee36f0SJeremy L Thompson     for (CeedInt i = 0; i < p; i++) {
644fee36f0SJeremy L Thompson       if (fabs(num_qpts * 0.25 - u_array[i]) > 100. * CEED_EPSILON) printf("%f != %f\n", 2.0, u_array[i]);
6550c301a5SRezgar Shakeri     }
664fee36f0SJeremy L Thompson     CeedVectorRestoreArrayRead(u, &u_array);
674fee36f0SJeremy L Thompson   }
6850c301a5SRezgar Shakeri 
694fee36f0SJeremy L Thompson   CeedBasisDestroy(&basis);
704fee36f0SJeremy L Thompson   CeedVectorDestroy(&u);
714fee36f0SJeremy L Thompson   CeedVectorDestroy(&v);
7250c301a5SRezgar Shakeri   CeedDestroy(&ceed);
7350c301a5SRezgar Shakeri   return 0;
7450c301a5SRezgar Shakeri }
75