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; 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 2961dbc9d2Sjeremylt CeedElemRestrictionCreate(ceed, imode, nelem, 2, Nx, 1, CEED_MEM_HOST, 302ebaca42Sjeremylt CEED_USE_POINTER, indx, &Erestrictx); 31*7509a596Sjeremylt CeedInt stridesx[3] = {1, 2, 2}; 32*7509a596Sjeremylt CeedElemRestrictionCreateStrided(ceed, nelem, 2, nelem*2, 1, stridesx, 33a8d32208Sjeremylt &Erestrictxi); 342ebaca42Sjeremylt 352ebaca42Sjeremylt for (CeedInt i=0; i<nelem; i++) { 362ebaca42Sjeremylt for (CeedInt j=0; j<P; j++) { 372ebaca42Sjeremylt indu[P*i+j] = i*(P-1) + j; 382ebaca42Sjeremylt } 392ebaca42Sjeremylt } 4061dbc9d2Sjeremylt CeedElemRestrictionCreate(ceed, imode, nelem, P, Nu, 2, CEED_MEM_HOST, 412ebaca42Sjeremylt CEED_USE_POINTER, indu, &Erestrictu); 42*7509a596Sjeremylt CeedInt stridesu[3] = {1, Q, Q}; 43*7509a596Sjeremylt CeedElemRestrictionCreateStrided(ceed, nelem, Q, Q*nelem, 1, stridesu, 44a8d32208Sjeremylt &Erestrictui); 452ebaca42Sjeremylt 462ebaca42Sjeremylt // Bases 472ebaca42Sjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS, &bx); 482ebaca42Sjeremylt CeedBasisCreateTensorH1Lagrange(ceed, 1, 2, P, Q, CEED_GAUSS, &bu); 492ebaca42Sjeremylt 502ebaca42Sjeremylt // QFunctions 512ebaca42Sjeremylt CeedQFunctionCreateInterior(ceed, 1, setup, setup_loc, &qf_setup); 522ebaca42Sjeremylt CeedQFunctionAddInput(qf_setup, "_weight", 1, CEED_EVAL_WEIGHT); 532ebaca42Sjeremylt CeedQFunctionAddInput(qf_setup, "dx", 1*1, CEED_EVAL_GRAD); 542ebaca42Sjeremylt CeedQFunctionAddOutput(qf_setup, "rho", 1, CEED_EVAL_NONE); 552ebaca42Sjeremylt 562ebaca42Sjeremylt CeedQFunctionCreateInterior(ceed, 1, mass, mass_loc, &qf_mass); 572ebaca42Sjeremylt CeedQFunctionAddInput(qf_mass, "rho", 1, CEED_EVAL_NONE); 582ebaca42Sjeremylt CeedQFunctionAddInput(qf_mass, "u", 2, CEED_EVAL_INTERP); 592ebaca42Sjeremylt CeedQFunctionAddOutput(qf_mass, "v", 2, CEED_EVAL_INTERP); 602ebaca42Sjeremylt 612ebaca42Sjeremylt // Operators 622ebaca42Sjeremylt CeedOperatorCreate(ceed, qf_setup, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, 632ebaca42Sjeremylt &op_setup); 642ebaca42Sjeremylt 652ebaca42Sjeremylt CeedOperatorCreate(ceed, qf_mass, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE, 662ebaca42Sjeremylt &op_mass); 672ebaca42Sjeremylt 682ebaca42Sjeremylt CeedVectorCreate(ceed, nelem*Q, &qdata); 692ebaca42Sjeremylt 70a8d32208Sjeremylt CeedOperatorSetField(op_setup, "_weight", Erestrictxi, bx, CEED_VECTOR_NONE); 71a8d32208Sjeremylt CeedOperatorSetField(op_setup, "dx", Erestrictx, bx, CEED_VECTOR_ACTIVE); 72a8d32208Sjeremylt CeedOperatorSetField(op_setup, "rho", Erestrictui, CEED_BASIS_COLLOCATED, 73a8d32208Sjeremylt CEED_VECTOR_ACTIVE); 742ebaca42Sjeremylt 75a8d32208Sjeremylt CeedOperatorSetField(op_mass, "rho", Erestrictui, CEED_BASIS_COLLOCATED, 76a8d32208Sjeremylt qdata); 77a8d32208Sjeremylt CeedOperatorSetField(op_mass, "u", Erestrictu, bu, CEED_VECTOR_ACTIVE); 78a8d32208Sjeremylt CeedOperatorSetField(op_mass, "v", Erestrictu, bu, CEED_VECTOR_ACTIVE); 792ebaca42Sjeremylt 802ebaca42Sjeremylt CeedOperatorView(op_setup, stdout); 812ebaca42Sjeremylt CeedOperatorView(op_mass, stdout); 822ebaca42Sjeremylt 832ebaca42Sjeremylt CeedQFunctionDestroy(&qf_setup); 842ebaca42Sjeremylt CeedQFunctionDestroy(&qf_mass); 852ebaca42Sjeremylt CeedOperatorDestroy(&op_setup); 862ebaca42Sjeremylt CeedOperatorDestroy(&op_mass); 872ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictu); 882ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictx); 892ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictui); 902ebaca42Sjeremylt CeedElemRestrictionDestroy(&Erestrictxi); 912ebaca42Sjeremylt CeedBasisDestroy(&bu); 922ebaca42Sjeremylt CeedBasisDestroy(&bx); 932ebaca42Sjeremylt CeedVectorDestroy(&qdata); 942ebaca42Sjeremylt CeedDestroy(&ceed); 952ebaca42Sjeremylt return 0; 962ebaca42Sjeremylt } 97