1*2ebaca42Sjeremylt /// @file 2*2ebaca42Sjeremylt /// Test viewing of mass matrix operator 3*2ebaca42Sjeremylt /// \test Test viewing of mass matrix operator 4*2ebaca42Sjeremylt #include <ceed.h> 5*2ebaca42Sjeremylt #include <stdlib.h> 6*2ebaca42Sjeremylt #include <math.h> 7*2ebaca42Sjeremylt 8*2ebaca42Sjeremylt #include "t500-operator.h" 9*2ebaca42Sjeremylt 10*2ebaca42Sjeremylt int main(int argc, char **argv) { 11*2ebaca42Sjeremylt Ceed ceed; 12*2ebaca42Sjeremylt CeedElemRestriction Erestrictx, Erestrictu, Erestrictxi, Erestrictui; 13*2ebaca42Sjeremylt CeedBasis bx, bu; 14*2ebaca42Sjeremylt CeedQFunction qf_setup, qf_mass; 15*2ebaca42Sjeremylt CeedOperator op_setup, op_mass; 16*2ebaca42Sjeremylt CeedVector qdata; 17*2ebaca42Sjeremylt CeedInt nelem = 15, P = 5, Q = 8; 18*2ebaca42Sjeremylt CeedInt Nx = nelem+1, Nu = nelem*(P-1)+1; 19*2ebaca42Sjeremylt CeedInt indx[nelem*2], indu[nelem*P]; 20*2ebaca42Sjeremylt 21*2ebaca42Sjeremylt CeedInit(argv[1], &ceed); 22*2ebaca42Sjeremylt 23*2ebaca42Sjeremylt for (CeedInt i=0; i<nelem; i++) { 24*2ebaca42Sjeremylt indx[2*i+0] = i; 25*2ebaca42Sjeremylt indx[2*i+1] = i+1; 26*2ebaca42Sjeremylt } 27*2ebaca42Sjeremylt // Restrictions 28*2ebaca42Sjeremylt CeedElemRestrictionCreate(ceed, nelem, 2, Nx, 1, CEED_MEM_HOST, 29*2ebaca42Sjeremylt CEED_USE_POINTER, indx, &Erestrictx); 30*2ebaca42Sjeremylt CeedElemRestrictionCreateIdentity(ceed, nelem, 2, nelem*2, 1, &Erestrictxi); 31*2ebaca42Sjeremylt 32*2ebaca42Sjeremylt for (CeedInt i=0; i<nelem; i++) { 33*2ebaca42Sjeremylt for (CeedInt j=0; j<P; j++) { 34*2ebaca42Sjeremylt indu[P*i+j] = i*(P-1) + j; 35*2ebaca42Sjeremylt } 36*2ebaca42Sjeremylt } 37*2ebaca42Sjeremylt CeedElemRestrictionCreate(ceed, nelem, P, Nu, 2, CEED_MEM_HOST, 38*2ebaca42Sjeremylt CEED_USE_POINTER, indu, &Erestrictu); 39*2ebaca42Sjeremylt CeedElemRestrictionCreateIdentity(ceed, nelem, Q, Q*nelem, 1, &Erestrictui); 40*2ebaca42Sjeremylt 41*2ebaca42Sjeremylt // Bases 42*2ebaca42Sjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS, &bx); 43*2ebaca42Sjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 2, P, Q, CEED_GAUSS, &bu); 44*2ebaca42Sjeremylt 45*2ebaca42Sjeremylt // QFunctions 46*2ebaca42Sjeremylt CeedQFunctionCreateInterior(ceed, 1, setup, setup_loc, &qf_setup); 47*2ebaca42Sjeremylt CeedQFunctionAddInput(qf_setup, "_weight", 1, CEED_EVAL_WEIGHT); 48*2ebaca42Sjeremylt CeedQFunctionAddInput(qf_setup, "dx", 1*1, CEED_EVAL_GRAD); 49*2ebaca42Sjeremylt CeedQFunctionAddOutput(qf_setup, "rho", 1, CEED_EVAL_NONE); 50*2ebaca42Sjeremylt 51*2ebaca42Sjeremylt CeedQFunctionCreateInterior(ceed, 1, mass, mass_loc, &qf_mass); 52*2ebaca42Sjeremylt CeedQFunctionAddInput(qf_mass, "rho", 1, CEED_EVAL_NONE); 53*2ebaca42Sjeremylt CeedQFunctionAddInput(qf_mass, "u", 2, CEED_EVAL_INTERP); 54*2ebaca42Sjeremylt CeedQFunctionAddOutput(qf_mass, "v", 2, CEED_EVAL_INTERP); 55*2ebaca42Sjeremylt 56*2ebaca42Sjeremylt // Operators 57*2ebaca42Sjeremylt CeedOperatorCreate(ceed, qf_setup, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, 58*2ebaca42Sjeremylt &op_setup); 59*2ebaca42Sjeremylt 60*2ebaca42Sjeremylt CeedOperatorCreate(ceed, qf_mass, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, 61*2ebaca42Sjeremylt &op_mass); 62*2ebaca42Sjeremylt 63*2ebaca42Sjeremylt CeedVectorCreate(ceed, nelem*Q, &qdata); 64*2ebaca42Sjeremylt 65*2ebaca42Sjeremylt CeedOperatorSetField(op_setup, "_weight", Erestrictxi, CEED_NOTRANSPOSE, 66*2ebaca42Sjeremylt bx, CEED_VECTOR_NONE); 67*2ebaca42Sjeremylt CeedOperatorSetField(op_setup, "dx", Erestrictx, CEED_NOTRANSPOSE, 68*2ebaca42Sjeremylt bx, CEED_VECTOR_ACTIVE); 69*2ebaca42Sjeremylt CeedOperatorSetField(op_setup, "rho", Erestrictui, CEED_NOTRANSPOSE, 70*2ebaca42Sjeremylt CEED_BASIS_COLLOCATED, CEED_VECTOR_ACTIVE); 71*2ebaca42Sjeremylt 72*2ebaca42Sjeremylt CeedOperatorSetField(op_mass, "rho", Erestrictui, CEED_NOTRANSPOSE, 73*2ebaca42Sjeremylt CEED_BASIS_COLLOCATED, qdata); 74*2ebaca42Sjeremylt CeedOperatorSetField(op_mass, "u", Erestrictu, CEED_TRANSPOSE, 75*2ebaca42Sjeremylt bu, CEED_VECTOR_ACTIVE); 76*2ebaca42Sjeremylt CeedOperatorSetField(op_mass, "v", Erestrictu, CEED_TRANSPOSE, 77*2ebaca42Sjeremylt bu, CEED_VECTOR_ACTIVE); 78*2ebaca42Sjeremylt 79*2ebaca42Sjeremylt CeedOperatorView(op_setup, stdout); 80*2ebaca42Sjeremylt CeedOperatorView(op_mass, stdout); 81*2ebaca42Sjeremylt 82*2ebaca42Sjeremylt CeedQFunctionDestroy(&qf_setup); 83*2ebaca42Sjeremylt CeedQFunctionDestroy(&qf_mass); 84*2ebaca42Sjeremylt CeedOperatorDestroy(&op_setup); 85*2ebaca42Sjeremylt CeedOperatorDestroy(&op_mass); 86*2ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictu); 87*2ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictx); 88*2ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictui); 89*2ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictxi); 90*2ebaca42Sjeremylt CeedBasisDestroy(&bu); 91*2ebaca42Sjeremylt CeedBasisDestroy(&bx); 92*2ebaca42Sjeremylt CeedVectorDestroy(&qdata); 93*2ebaca42Sjeremylt CeedDestroy(&ceed); 94*2ebaca42Sjeremylt return 0; 95*2ebaca42Sjeremylt } 96