Research Article

Finite Element Assembly Using an Embedded Domain Specific Language

Listing 16

Pressure Poisson problem for Chorin’s method.
(  // The pressure field, using the default first order shape function
()  FieldVariable<1, ScalarField> p("Pressure", pressure_lss->solution_tag());
()  // The linear system manager
()  Handle<LSSActionUnsteady> pressure_lss = create_component<LSSActionUnsteady>("PressureLSS");
()  // The assembly action
()  Handle<ProtoAction> pressure_mat_assembly =
()  pressure_lss->create_component<ProtoAction>("MatrixAssembly");
()  pressure_mat_assembly->set_expression(elements_expression(LagrangeP1(),
()  group
() (
() _A(p) = _0,
() element_quadrature(_A(p) += transpose(nabla(p))*nabla(p)),
() pressure_lss->system_matrix += _A
() )));
()  
() Handle<ProtoAction> pressure_rhs_assembly =
() pressure_lss->create_component<ProtoAction>("RHSAssembly");
() pressure_rhs_assembly->set_expression(elements_expression(LagrangeP1P2(),
() group
() (
() _a[p] = _0,
() element_quadrature(_a[p] += transpose(N(p))*divergence(u)),
() pressure_lss->system_rhs += lit(pressure_lss->invdt())*_a
() )));