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; 1261dbc9d2Sjeremylt CeedInterlaceMode imode = CEED_NONINTERLACED; 13*15910d16Sjeremylt CeedElemRestriction Erestrictx, Erestrictu, 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 2961dbc9d2Sjeremylt CeedElemRestrictionCreate(ceed, imode, nelem, 2, Nx, 1, CEED_MEM_HOST, 302ebaca42Sjeremylt CEED_USE_POINTER, indx, &Erestrictx); 31*15910d16Sjeremylt 322ebaca42Sjeremylt 332ebaca42Sjeremylt for (CeedInt i=0; i<nelem; i++) { 342ebaca42Sjeremylt for (CeedInt j=0; j<P; j++) { 352ebaca42Sjeremylt indu[P*i+j] = i*(P-1) + j; 362ebaca42Sjeremylt } 372ebaca42Sjeremylt } 3861dbc9d2Sjeremylt CeedElemRestrictionCreate(ceed, imode, nelem, P, Nu, 2, CEED_MEM_HOST, 392ebaca42Sjeremylt CEED_USE_POINTER, indu, &Erestrictu); 407509a596Sjeremylt CeedInt stridesu[3] = {1, Q, Q}; 417509a596Sjeremylt CeedElemRestrictionCreateStrided(ceed, nelem, Q, Q*nelem, 1, stridesu, 42a8d32208Sjeremylt &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*15910d16Sjeremylt CeedOperatorSetField(op_setup, "_weight", CEED_ELEMRESTRICTION_NONE, bx, 69*15910d16Sjeremylt CEED_VECTOR_NONE); 70a8d32208Sjeremylt CeedOperatorSetField(op_setup, "dx", Erestrictx, bx, CEED_VECTOR_ACTIVE); 71a8d32208Sjeremylt CeedOperatorSetField(op_setup, "rho", Erestrictui, CEED_BASIS_COLLOCATED, 72a8d32208Sjeremylt CEED_VECTOR_ACTIVE); 732ebaca42Sjeremylt 74a8d32208Sjeremylt CeedOperatorSetField(op_mass, "rho", Erestrictui, CEED_BASIS_COLLOCATED, 75a8d32208Sjeremylt qdata); 76a8d32208Sjeremylt CeedOperatorSetField(op_mass, "u", Erestrictu, bu, CEED_VECTOR_ACTIVE); 77a8d32208Sjeremylt CeedOperatorSetField(op_mass, "v", Erestrictu, bu, CEED_VECTOR_ACTIVE); 782ebaca42Sjeremylt 792ebaca42Sjeremylt CeedOperatorView(op_setup, stdout); 802ebaca42Sjeremylt CeedOperatorView(op_mass, stdout); 812ebaca42Sjeremylt 822ebaca42Sjeremylt CeedQFunctionDestroy(&qf_setup); 832ebaca42Sjeremylt CeedQFunctionDestroy(&qf_mass); 842ebaca42Sjeremylt CeedOperatorDestroy(&op_setup); 852ebaca42Sjeremylt CeedOperatorDestroy(&op_mass); 862ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictu); 872ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictx); 882ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictui); 89*15910d16Sjeremylt 902ebaca42Sjeremylt CeedBasisDestroy(&bu); 912ebaca42Sjeremylt CeedBasisDestroy(&bx); 922ebaca42Sjeremylt CeedVectorDestroy(&qdata); 932ebaca42Sjeremylt CeedDestroy(&ceed); 942ebaca42Sjeremylt return 0; 952ebaca42Sjeremylt } 96