Research Article

Finite Element Assembly Using an Embedded Domain Specific Language

Listing 18

The assembly of the PSPG/SUPG stabilized incompressible Navier-Stokes equations.
(1) assembly->set_expression(elements_expression
(2) (
(3)  AllElementsT(),
(4)  group
(5)  (
(6)   _A = _0, _T = _0,
(7)   compute_tau(u, nu_eff, u_ref, lit(tau_ps), lit(tau_su), lit(tau_bulk)),
(8)   element_quadrature
(9)   (
(10)    _A(p, u[_i]) += transpose(N(p) + tau_ps*u_adv*nabla(p)*0.5) * nabla(u)[_i]
(11)              + tau_ps * transpose(nabla(p)[_i]) * u_adv*nabla(u),
(12)    _A(p, p) += tau_ps * transpose(nabla(p)) * nabla(p) / rho,
(13)    _A(u[_i], u[_j]) += transpose((tau_bulk + 1/3*nu_eff)*nabla(u)[_i]
(14)              + 0.5*u_adv[_i]*(N(u) + tau_su*u_adv*nabla(u))) * nabla(u)[_j],
(15)    _A(u[_i], u[_i]) += nu_eff * transpose(nabla(u)) * nabla(u)
(16)              + transpose(N(u) + tau_su*u_adv*nabla(u)) * u_adv*nabla(u),
(17)    _A(u[_i], p) += transpose(N(u) + tau_su*u_adv*nabla(u)) * nabla(p)[_i] / rho,
(18)    _T(p, u[_i]) += tau_ps * transpose(nabla(p)[_i]) * N(u),
(19)    _T(u[_i], u[_i]) += transpose(N(u) + tau_su*u_adv*nabla(u)) * N(u)
(20)   ),
(21)   system_rhs += _A * _x,
(22)   _A(p) = _A(p) / theta,
(23)   system_matrix += invdt() * _T + theta * _A
(24) )));