1*a7bd39daSjeremylt /// @file 2*a7bd39daSjeremylt /// Test inderintegrated grad in multiple dimensions 3*a7bd39daSjeremylt /// \test Test inderintegraded grad in multiple dimensions 4*a7bd39daSjeremylt #include <ceed.h> 5*a7bd39daSjeremylt #include <math.h> 6*a7bd39daSjeremylt 7*a7bd39daSjeremylt static CeedScalar Eval(CeedInt dim, const CeedScalar x[]) { 8*a7bd39daSjeremylt CeedScalar result = tanh(x[0] + 0.1); 9*a7bd39daSjeremylt if (dim > 1) result += atan(x[1] + 0.2); 10*a7bd39daSjeremylt if (dim > 2) result += exp(-(x[2] + 0.3)*(x[2] + 0.3)); 11*a7bd39daSjeremylt return result; 12*a7bd39daSjeremylt } 13*a7bd39daSjeremylt 14*a7bd39daSjeremylt int main(int argc, char **argv) { 15*a7bd39daSjeremylt Ceed ceed; 16*a7bd39daSjeremylt 17*a7bd39daSjeremylt CeedInit(argv[1], &ceed); 18*a7bd39daSjeremylt for (CeedInt dim=1; dim<=3; dim++) { 19*a7bd39daSjeremylt CeedVector X, Xq, U, Uq, Ones, Gtposeones; 20*a7bd39daSjeremylt CeedBasis bxl, bug; 21*a7bd39daSjeremylt CeedInt P = 8, Q = 7, Pdim = CeedIntPow(P, dim), Qdim = CeedIntPow(Q, dim), 22*a7bd39daSjeremylt Xdim = CeedIntPow(2, dim); 23*a7bd39daSjeremylt CeedScalar x[Xdim*dim], u[Pdim]; 24*a7bd39daSjeremylt const CeedScalar *xq, *uq, *gtposeones; 25*a7bd39daSjeremylt CeedScalar sum1 = 0, sum2 = 0; 26*a7bd39daSjeremylt 27*a7bd39daSjeremylt for (CeedInt d=0; d<dim; d++) { 28*a7bd39daSjeremylt for (CeedInt i=0; i<Xdim; i++) { 29*a7bd39daSjeremylt x[d*Xdim + i] = (i % CeedIntPow(2, dim-d)) / CeedIntPow(2, dim-d-1) ? 1 : -1; 30*a7bd39daSjeremylt } 31*a7bd39daSjeremylt } 32*a7bd39daSjeremylt 33*a7bd39daSjeremylt CeedVectorCreate(ceed, Xdim*dim, &X); 34*a7bd39daSjeremylt CeedVectorSetArray(X, CEED_MEM_HOST, CEED_USE_POINTER, (CeedScalar *)&x); 35*a7bd39daSjeremylt CeedVectorCreate(ceed, Pdim*dim, &Xq); 36*a7bd39daSjeremylt CeedVectorSetValue(Xq, 0); 37*a7bd39daSjeremylt CeedVectorCreate(ceed, Pdim, &U); 38*a7bd39daSjeremylt CeedVectorCreate(ceed, Qdim*dim, &Uq); 39*a7bd39daSjeremylt CeedVectorSetValue(Uq, 0); 40*a7bd39daSjeremylt CeedVectorCreate(ceed, Qdim*dim, &Ones); 41*a7bd39daSjeremylt CeedVectorSetValue(Ones, 1); 42*a7bd39daSjeremylt CeedVectorCreate(ceed, Pdim, &Gtposeones); 43*a7bd39daSjeremylt CeedVectorSetValue(Gtposeones, 0); 44*a7bd39daSjeremylt 45*a7bd39daSjeremylt // Get function values at quadrature points 46*a7bd39daSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, dim, dim, 2, P, CEED_GAUSS_LOBATTO, &bxl); 47*a7bd39daSjeremylt CeedBasisApply(bxl, 1, CEED_NOTRANSPOSE, CEED_EVAL_INTERP, X, Xq); 48*a7bd39daSjeremylt 49*a7bd39daSjeremylt CeedVectorGetArrayRead(Xq, CEED_MEM_HOST, &xq); 50*a7bd39daSjeremylt for (CeedInt i=0; i<Pdim; i++) { 51*a7bd39daSjeremylt CeedScalar xx[dim]; 52*a7bd39daSjeremylt for (CeedInt d=0; d<dim; d++) xx[d] = xq[d*Pdim + i]; 53*a7bd39daSjeremylt u[i] = Eval(dim, xx); 54*a7bd39daSjeremylt } 55*a7bd39daSjeremylt CeedVectorRestoreArrayRead(Xq, &xq); 56*a7bd39daSjeremylt CeedVectorSetArray(U, CEED_MEM_HOST, CEED_USE_POINTER, (CeedScalar *)&u); 57*a7bd39daSjeremylt 58*a7bd39daSjeremylt // Calculate G u at quadrature points, G' * 1 at dofs 59*a7bd39daSjeremylt CeedBasisCreateTensorH1Lagrange(ceed, dim, 1, P, Q, CEED_GAUSS, &bug); 60*a7bd39daSjeremylt CeedBasisApply(bug, 1, CEED_NOTRANSPOSE, CEED_EVAL_GRAD, U, Uq); 61*a7bd39daSjeremylt CeedBasisApply(bug, 1, CEED_TRANSPOSE, CEED_EVAL_GRAD, Ones, Gtposeones); 62*a7bd39daSjeremylt 63*a7bd39daSjeremylt // Check if 1' * G * u = u' * (G' * 1) 64*a7bd39daSjeremylt CeedVectorGetArrayRead(Gtposeones, CEED_MEM_HOST, >poseones); 65*a7bd39daSjeremylt CeedVectorGetArrayRead(Uq, CEED_MEM_HOST, &uq); 66*a7bd39daSjeremylt for (CeedInt i=0; i<Pdim; i++) { 67*a7bd39daSjeremylt sum1 += gtposeones[i]*u[i]; 68*a7bd39daSjeremylt } 69*a7bd39daSjeremylt for (CeedInt i=0; i<dim*Qdim; i++) { 70*a7bd39daSjeremylt sum2 += uq[i]; 71*a7bd39daSjeremylt } 72*a7bd39daSjeremylt CeedVectorRestoreArrayRead(Gtposeones, >poseones); 73*a7bd39daSjeremylt CeedVectorRestoreArrayRead(Uq, &uq); 74*a7bd39daSjeremylt if (fabs(sum1 - sum2) > 1e-10) { 75*a7bd39daSjeremylt printf("[%d] %f != %f\n", dim, sum1, sum2); 76*a7bd39daSjeremylt } 77*a7bd39daSjeremylt 78*a7bd39daSjeremylt CeedVectorDestroy(&X); 79*a7bd39daSjeremylt CeedVectorDestroy(&Xq); 80*a7bd39daSjeremylt CeedVectorDestroy(&U); 81*a7bd39daSjeremylt CeedVectorDestroy(&Uq); 82*a7bd39daSjeremylt CeedVectorDestroy(&Ones); 83*a7bd39daSjeremylt CeedVectorDestroy(&Gtposeones); 84*a7bd39daSjeremylt CeedBasisDestroy(&bxl); 85*a7bd39daSjeremylt CeedBasisDestroy(&bug); 86*a7bd39daSjeremylt } 87*a7bd39daSjeremylt CeedDestroy(&ceed); 88*a7bd39daSjeremylt return 0; 89*a7bd39daSjeremylt } 90