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;