xref: /libCEED/tests/t504-operator.c (revision d1d35e2f02dc969aee8debf3fd943dd784aa847a)
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*d1d35e2fSjeremylt   CeedElemRestriction elem_restr_x, elem_restr_u, elem_restr_qd_i;
132ebaca42Sjeremylt   CeedBasis bx, bu;
142ebaca42Sjeremylt   CeedQFunction qf_setup, qf_mass;
152ebaca42Sjeremylt   CeedOperator op_setup, op_mass;
16*d1d35e2fSjeremylt   CeedVector q_data;
17*d1d35e2fSjeremylt   CeedInt num_elem = 15, P = 5, Q = 8;
18*d1d35e2fSjeremylt   CeedInt num_nodes_x = num_elem+1, num_nodes_u = num_elem*(P-1)+1;
19*d1d35e2fSjeremylt   CeedInt ind_x[num_elem*2], ind_u[num_elem*P];
202ebaca42Sjeremylt 
212ebaca42Sjeremylt   CeedInit(argv[1], &ceed);
222ebaca42Sjeremylt 
23*d1d35e2fSjeremylt   for (CeedInt i=0; i<num_elem; i++) {
24*d1d35e2fSjeremylt     ind_x[2*i+0] = i;
25*d1d35e2fSjeremylt     ind_x[2*i+1] = i+1;
262ebaca42Sjeremylt   }
272ebaca42Sjeremylt   // Restrictions
28*d1d35e2fSjeremylt   CeedElemRestrictionCreate(ceed, num_elem, 2, 1, 1, num_nodes_x, CEED_MEM_HOST,
29*d1d35e2fSjeremylt                             CEED_USE_POINTER, ind_x, &elem_restr_x);
3015910d16Sjeremylt 
31*d1d35e2fSjeremylt   for (CeedInt i=0; i<num_elem; i++) {
322ebaca42Sjeremylt     for (CeedInt j=0; j<P; j++) {
33*d1d35e2fSjeremylt       ind_u[P*i+j] = 2*(i*(P-1) + j);
342ebaca42Sjeremylt     }
352ebaca42Sjeremylt   }
36*d1d35e2fSjeremylt   CeedElemRestrictionCreate(ceed, num_elem, P, 2, 1, 2*num_nodes_u, CEED_MEM_HOST,
37*d1d35e2fSjeremylt                             CEED_USE_POINTER, ind_u, &elem_restr_u);
38*d1d35e2fSjeremylt   CeedInt strides_qd[3] = {1, Q, Q};
39*d1d35e2fSjeremylt   CeedElemRestrictionCreateStrided(ceed, num_elem, Q, 1, Q*num_elem, strides_qd,
40*d1d35e2fSjeremylt                                    &elem_restr_qd_i);
412ebaca42Sjeremylt 
422ebaca42Sjeremylt   // Bases
432ebaca42Sjeremylt   CeedBasisCreateTensorH1Lagrange(ceed, 1, 1, 2, Q, CEED_GAUSS, &bx);
442ebaca42Sjeremylt   CeedBasisCreateTensorH1Lagrange(ceed, 1, 2, P, Q, CEED_GAUSS, &bu);
452ebaca42Sjeremylt 
462ebaca42Sjeremylt   // QFunctions
472ebaca42Sjeremylt   CeedQFunctionCreateInterior(ceed, 1, setup, setup_loc, &qf_setup);
482ebaca42Sjeremylt   CeedQFunctionAddInput(qf_setup, "_weight", 1, CEED_EVAL_WEIGHT);
492ebaca42Sjeremylt   CeedQFunctionAddInput(qf_setup, "dx", 1*1, CEED_EVAL_GRAD);
502ebaca42Sjeremylt   CeedQFunctionAddOutput(qf_setup, "rho", 1, CEED_EVAL_NONE);
512ebaca42Sjeremylt 
522ebaca42Sjeremylt   CeedQFunctionCreateInterior(ceed, 1, mass, mass_loc, &qf_mass);
532ebaca42Sjeremylt   CeedQFunctionAddInput(qf_mass, "rho", 1, CEED_EVAL_NONE);
542ebaca42Sjeremylt   CeedQFunctionAddInput(qf_mass, "u", 2, CEED_EVAL_INTERP);
552ebaca42Sjeremylt   CeedQFunctionAddOutput(qf_mass, "v", 2, CEED_EVAL_INTERP);
562ebaca42Sjeremylt 
572ebaca42Sjeremylt   // Operators
582ebaca42Sjeremylt   CeedOperatorCreate(ceed, qf_setup, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE,
592ebaca42Sjeremylt                      &op_setup);
602ebaca42Sjeremylt 
612ebaca42Sjeremylt   CeedOperatorCreate(ceed, qf_mass, CEED_QFUNCTION_NONE, CEED_QFUNCTION_NONE,
622ebaca42Sjeremylt                      &op_mass);
632ebaca42Sjeremylt 
64*d1d35e2fSjeremylt   CeedVectorCreate(ceed, num_elem*Q, &q_data);
652ebaca42Sjeremylt 
6615910d16Sjeremylt   CeedOperatorSetField(op_setup, "_weight", CEED_ELEMRESTRICTION_NONE, bx,
6715910d16Sjeremylt                        CEED_VECTOR_NONE);
68*d1d35e2fSjeremylt   CeedOperatorSetField(op_setup, "dx", elem_restr_x, bx, CEED_VECTOR_ACTIVE);
69*d1d35e2fSjeremylt   CeedOperatorSetField(op_setup, "rho", elem_restr_qd_i, CEED_BASIS_COLLOCATED,
70a8d32208Sjeremylt                        CEED_VECTOR_ACTIVE);
712ebaca42Sjeremylt 
72*d1d35e2fSjeremylt   CeedOperatorSetField(op_mass, "rho", elem_restr_qd_i, CEED_BASIS_COLLOCATED,
73*d1d35e2fSjeremylt                        q_data);
74*d1d35e2fSjeremylt   CeedOperatorSetField(op_mass, "u", elem_restr_u, bu, CEED_VECTOR_ACTIVE);
75*d1d35e2fSjeremylt   CeedOperatorSetField(op_mass, "v", elem_restr_u, bu, CEED_VECTOR_ACTIVE);
762ebaca42Sjeremylt 
772ebaca42Sjeremylt   CeedOperatorView(op_setup, stdout);
782ebaca42Sjeremylt   CeedOperatorView(op_mass, stdout);
792ebaca42Sjeremylt 
802ebaca42Sjeremylt   CeedQFunctionDestroy(&qf_setup);
812ebaca42Sjeremylt   CeedQFunctionDestroy(&qf_mass);
822ebaca42Sjeremylt   CeedOperatorDestroy(&op_setup);
832ebaca42Sjeremylt   CeedOperatorDestroy(&op_mass);
84*d1d35e2fSjeremylt   CeedElemRestrictionDestroy(&elem_restr_u);
85*d1d35e2fSjeremylt   CeedElemRestrictionDestroy(&elem_restr_x);
86*d1d35e2fSjeremylt   CeedElemRestrictionDestroy(&elem_restr_qd_i);
8715910d16Sjeremylt 
882ebaca42Sjeremylt   CeedBasisDestroy(&bu);
892ebaca42Sjeremylt   CeedBasisDestroy(&bx);
90*d1d35e2fSjeremylt   CeedVectorDestroy(&q_data);
912ebaca42Sjeremylt   CeedDestroy(&ceed);
922ebaca42Sjeremylt   return 0;
932ebaca42Sjeremylt }
94