34 #include "libmesh/libmesh.h" 
   35 #include "libmesh/mesh.h" 
   36 #include "libmesh/mesh_generation.h" 
   37 #include "libmesh/exodusII_io.h" 
   38 #include "libmesh/equation_systems.h" 
   39 #include "libmesh/fe.h" 
   40 #include "libmesh/quadrature_gauss.h" 
   41 #include "libmesh/dof_map.h" 
   42 #include "libmesh/sparse_matrix.h" 
   43 #include "libmesh/numeric_vector.h" 
   44 #include "libmesh/dense_matrix.h" 
   45 #include "libmesh/dense_vector.h" 
   46 #include "libmesh/linear_implicit_system.h" 
   47 #include "libmesh/enum_solver_package.h" 
   53 #include "libmesh/dense_submatrix.h" 
   54 #include "libmesh/dense_subvector.h" 
   57 #include "libmesh/elem.h" 
   65                       const std::string & system_name);
 
   68 int main (
int argc, 
char ** argv)
 
   75                            "--enable-petsc, --enable-trilinos, or --enable-eigen");
 
   78   libmesh_example_requires(2 <= LIBMESH_DIM, 
"2D support");
 
  127   equation_systems.
init ();
 
  129   equation_systems.
parameters.
set<
unsigned int>(
"linear solver maximum iterations") = 250;
 
  137   equation_systems.
get_system(
"Stokes").solve();
 
  139 #ifdef LIBMESH_HAVE_EXODUS_API 
  142 #endif // #ifdef LIBMESH_HAVE_EXODUS_API 
  149                       const std::string & libmesh_dbg_var(system_name))
 
  153   libmesh_assert_equal_to (system_name, 
"Stokes");
 
  190   fe_vel->attach_quadrature_rule (&qrule);
 
  191   fe_pres->attach_quadrature_rule (&qrule);
 
  197   const std::vector<Real> & JxW = fe_vel->get_JxW();
 
  201   const std::vector<std::vector<RealGradient>> & dphi = fe_vel->get_dphi();
 
  205   const std::vector<std::vector<Real>> & psi = fe_pres->get_phi();
 
  221     Kuu(Ke), Kuv(Ke), Kup(Ke),
 
  222     Kvu(Ke), Kvv(Ke), Kvp(Ke),
 
  223     Kpu(Ke), Kpv(Ke), Kpp(Ke);
 
  233   std::vector<dof_id_type> dof_indices;
 
  234   std::vector<dof_id_type> dof_indices_u;
 
  235   std::vector<dof_id_type> dof_indices_v;
 
  236   std::vector<dof_id_type> dof_indices_p;
 
  255       const unsigned int n_dofs   = dof_indices.size();
 
  256       const unsigned int n_u_dofs = dof_indices_u.size();
 
  257       const unsigned int n_v_dofs = dof_indices_v.size();
 
  258       const unsigned int n_p_dofs = dof_indices_p.size();
 
  264       fe_vel->reinit  (elem);
 
  265       fe_pres->reinit (elem);
 
  273       Ke.
resize (n_dofs, n_dofs);
 
  289       Kuu.reposition (u_var*n_u_dofs, u_var*n_u_dofs, n_u_dofs, n_u_dofs);
 
  290       Kuv.reposition (u_var*n_u_dofs, v_var*n_u_dofs, n_u_dofs, n_v_dofs);
 
  291       Kup.reposition (u_var*n_u_dofs, p_var*n_u_dofs, n_u_dofs, n_p_dofs);
 
  293       Kvu.reposition (v_var*n_v_dofs, u_var*n_v_dofs, n_v_dofs, n_u_dofs);
 
  294       Kvv.reposition (v_var*n_v_dofs, v_var*n_v_dofs, n_v_dofs, n_v_dofs);
 
  295       Kvp.reposition (v_var*n_v_dofs, p_var*n_v_dofs, n_v_dofs, n_p_dofs);
 
  297       Kpu.reposition (p_var*n_u_dofs, u_var*n_u_dofs, n_p_dofs, n_u_dofs);
 
  298       Kpv.reposition (p_var*n_u_dofs, v_var*n_u_dofs, n_p_dofs, n_v_dofs);
 
  299       Kpp.
reposition (p_var*n_u_dofs, p_var*n_u_dofs, n_p_dofs, n_p_dofs);
 
  301       Fu.reposition (u_var*n_u_dofs, n_u_dofs);
 
  302       Fv.reposition (v_var*n_u_dofs, n_v_dofs);
 
  306       for (
unsigned int qp=0; qp<qrule.n_points(); qp++)
 
  310           for (
unsigned int i=0; i<n_u_dofs; i++)
 
  311             for (
unsigned int j=0; j<n_u_dofs; j++)
 
  312               Kuu(i,j) += JxW[qp]*(dphi[i][qp]*dphi[j][qp]);
 
  315           for (
unsigned int i=0; i<n_u_dofs; i++)
 
  316             for (
unsigned int j=0; j<n_p_dofs; j++)
 
  317               Kup(i,j) += -JxW[qp]*psi[j][qp]*dphi[i][qp](0);
 
  322           for (
unsigned int i=0; i<n_v_dofs; i++)
 
  323             for (
unsigned int j=0; j<n_v_dofs; j++)
 
  324               Kvv(i,j) += JxW[qp]*(dphi[i][qp]*dphi[j][qp]);
 
  327           for (
unsigned int i=0; i<n_v_dofs; i++)
 
  328             for (
unsigned int j=0; j<n_p_dofs; j++)
 
  329               Kvp(i,j) += -JxW[qp]*psi[j][qp]*dphi[i][qp](1);
 
  334           for (
unsigned int i=0; i<n_p_dofs; i++)
 
  335             for (
unsigned int j=0; j<n_u_dofs; j++)
 
  336               Kpu(i,j) += -JxW[qp]*psi[i][qp]*dphi[j][qp](0);
 
  339           for (
unsigned int i=0; i<n_p_dofs; i++)
 
  340             for (
unsigned int j=0; j<n_v_dofs; j++)
 
  341               Kpv(i,j) += -JxW[qp]*psi[i][qp]*dphi[j][qp](1);
 
  357         for (
auto s : elem->side_index_range())
 
  358           if (elem->neighbor_ptr(s) == 
nullptr)
 
  360               std::unique_ptr<const Elem> side (elem->build_side_ptr(s));
 
  363               for (
auto ns : side->node_index_range())
 
  369                   const Real yf = side->point(ns)(1);
 
  372                   const Real penalty = 1.e10;
 
  377                   const Real u_value = (yf > .99) ? 1. : 0.;
 
  380                   const Real v_value = 0.;
 
  385                   for (
auto n : elem->node_index_range())
 
  386                     if (elem->node_id(n) == side->node_id(ns))
 
  393                         Fu(n) += penalty*u_value;
 
  394                         Fv(n) += penalty*v_value;