12ebaca42Sjeremylt /// @file 22ebaca42Sjeremylt /// Test viewing of mass matrix operator 32ebaca42Sjeremylt /// \test Test viewing of mass matrix operator 42ebaca42Sjeremylt #include <ceed.h> 52ebaca42Sjeremylt #include <stdlib.h> 62ebaca42Sjeremylt #include <math.h> 72ebaca42Sjeremylt 82ebaca42Sjeremylt #include "t500-operator.h" 92ebaca42Sjeremylt 102ebaca42Sjeremylt int main(int argc, char **argv) { 112ebaca42Sjeremylt Ceed ceed; 12*a8d32208Sjeremylt CeedTransposeMode lmode = CEED_NOTRANSPOSE; 132ebaca42Sjeremylt CeedElemRestriction Erestrictx, Erestrictu, Erestrictxi, Erestrictui; 142ebaca42Sjeremylt CeedBasis bx, bu; 152ebaca42Sjeremylt CeedQFunction qf_setup, qf_mass; 162ebaca42Sjeremylt CeedOperator op_setup, op_mass; 172ebaca42Sjeremylt CeedVector qdata; 182ebaca42Sjeremylt CeedInt nelem = 15, P = 5, Q = 8; 192ebaca42Sjeremylt CeedInt Nx = nelem+1, Nu = nelem*(P-1)+1; 202ebaca42Sjeremylt CeedInt indx[nelem*2], indu[nelem*P]; 212ebaca42Sjeremylt 222ebaca42Sjeremylt CeedInit(argv[1], &ceed); 232ebaca42Sjeremylt 242ebaca42Sjeremylt for (CeedInt i=0; i<nelem; i++) { 252ebaca42Sjeremylt indx[2*i+0] = i; 262ebaca42Sjeremylt indx[2*i+1] = i+1; 272ebaca42Sjeremylt } 282ebaca42Sjeremylt // Restrictions 29*a8d32208Sjeremylt CeedElemRestrictionCreate(ceed, lmode, nelem, 2, Nx, 1, CEED_MEM_HOST, 302ebaca42Sjeremylt CEED_USE_POINTER, indx, &Erestrictx); 31*a8d32208Sjeremylt CeedElemRestrictionCreateIdentity(ceed, lmode, nelem, 2, nelem*2, 1, 32*a8d32208Sjeremylt &Erestrictxi); 332ebaca42Sjeremylt 342ebaca42Sjeremylt for (CeedInt i=0; i<nelem; i++) { 352ebaca42Sjeremylt for (CeedInt j=0; j<P; j++) { 362ebaca42Sjeremylt indu[P*i+j] = i*(P-1) + j; 372ebaca42Sjeremylt } 382ebaca42Sjeremylt } 39*a8d32208Sjeremylt CeedElemRestrictionCreate(ceed, lmode, nelem, P, Nu, 2, CEED_MEM_HOST, 402ebaca42Sjeremylt CEED_USE_POINTER, indu, &Erestrictu); 41*a8d32208Sjeremylt CeedElemRestrictionCreateIdentity(ceed, lmode, nelem, Q, Q*nelem, 1, 42*a8d32208Sjeremylt &Erestrictui); 432ebaca42Sjeremylt 442ebaca42Sjeremylt // Bases 452ebaca42Sjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS, &bx); 462ebaca42Sjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 2, P, Q, CEED_GAUSS, &bu); 472ebaca42Sjeremylt 482ebaca42Sjeremylt // QFunctions 492ebaca42Sjeremylt CeedQFunctionCreateInterior(ceed, 1, setup, setup_loc, &qf_setup); 502ebaca42Sjeremylt CeedQFunctionAddInput(qf_setup, "_weight", 1, CEED_EVAL_WEIGHT); 512ebaca42Sjeremylt CeedQFunctionAddInput(qf_setup, "dx", 1*1, CEED_EVAL_GRAD); 522ebaca42Sjeremylt CeedQFunctionAddOutput(qf_setup, "rho", 1, CEED_EVAL_NONE); 532ebaca42Sjeremylt 542ebaca42Sjeremylt CeedQFunctionCreateInterior(ceed, 1, mass, mass_loc, &qf_mass); 552ebaca42Sjeremylt CeedQFunctionAddInput(qf_mass, "rho", 1, CEED_EVAL_NONE); 562ebaca42Sjeremylt CeedQFunctionAddInput(qf_mass, "u", 2, CEED_EVAL_INTERP); 572ebaca42Sjeremylt CeedQFunctionAddOutput(qf_mass, "v", 2, CEED_EVAL_INTERP); 582ebaca42Sjeremylt 592ebaca42Sjeremylt // Operators 602ebaca42Sjeremylt CeedOperatorCreate(ceed, qf_setup, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, 612ebaca42Sjeremylt &op_setup); 622ebaca42Sjeremylt 632ebaca42Sjeremylt CeedOperatorCreate(ceed, qf_mass, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, 642ebaca42Sjeremylt &op_mass); 652ebaca42Sjeremylt 662ebaca42Sjeremylt CeedVectorCreate(ceed, nelem*Q, &qdata); 672ebaca42Sjeremylt 68*a8d32208Sjeremylt CeedOperatorSetField(op_setup, "_weight", Erestrictxi, bx, CEED_VECTOR_NONE); 69*a8d32208Sjeremylt CeedOperatorSetField(op_setup, "dx", Erestrictx, bx, CEED_VECTOR_ACTIVE); 70*a8d32208Sjeremylt CeedOperatorSetField(op_setup, "rho", Erestrictui, CEED_BASIS_COLLOCATED, 71*a8d32208Sjeremylt CEED_VECTOR_ACTIVE); 722ebaca42Sjeremylt 73*a8d32208Sjeremylt CeedOperatorSetField(op_mass, "rho", Erestrictui, CEED_BASIS_COLLOCATED, 74*a8d32208Sjeremylt qdata); 75*a8d32208Sjeremylt CeedOperatorSetField(op_mass, "u", Erestrictu, bu, CEED_VECTOR_ACTIVE); 76*a8d32208Sjeremylt CeedOperatorSetField(op_mass, "v", Erestrictu, bu, CEED_VECTOR_ACTIVE); 772ebaca42Sjeremylt 782ebaca42Sjeremylt CeedOperatorView(op_setup, stdout); 792ebaca42Sjeremylt CeedOperatorView(op_mass, stdout); 802ebaca42Sjeremylt 812ebaca42Sjeremylt CeedQFunctionDestroy(&qf_setup); 822ebaca42Sjeremylt CeedQFunctionDestroy(&qf_mass); 832ebaca42Sjeremylt CeedOperatorDestroy(&op_setup); 842ebaca42Sjeremylt CeedOperatorDestroy(&op_mass); 852ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictu); 862ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictx); 872ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictui); 882ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictxi); 892ebaca42Sjeremylt CeedBasisDestroy(&bu); 902ebaca42Sjeremylt CeedBasisDestroy(&bx); 912ebaca42Sjeremylt CeedVectorDestroy(&qdata); 922ebaca42Sjeremylt CeedDestroy(&ceed); 932ebaca42Sjeremylt return 0; 942ebaca42Sjeremylt } 95