57 #include "libmesh/libmesh.h" 
   58 #include "libmesh/mesh.h" 
   59 #include "libmesh/mesh_generation.h" 
   60 #include "libmesh/mesh_refinement.h" 
   61 #include "libmesh/exodusII_io.h" 
   62 #include "libmesh/equation_systems.h" 
   63 #include "libmesh/fe.h" 
   64 #include "libmesh/quadrature_gauss.h" 
   65 #include "libmesh/dof_map.h" 
   66 #include "libmesh/sparse_matrix.h" 
   67 #include "libmesh/numeric_vector.h" 
   68 #include "libmesh/dense_matrix.h" 
   69 #include "libmesh/dense_vector.h" 
   70 #include "libmesh/getpot.h" 
   71 #include "libmesh/elem.h" 
   72 #include "libmesh/fe_interface.h" 
   73 #include "libmesh/boundary_info.h" 
   74 #include "libmesh/linear_implicit_system.h" 
   75 #include "libmesh/zero_function.h" 
   76 #include "libmesh/dirichlet_boundaries.h" 
   77 #include "libmesh/enum_solver_package.h" 
   83 #define MIN_Z_BOUNDARY 1 
   84 #define MAX_Z_BOUNDARY 2 
   85 #define CRACK_BOUNDARY_LOWER 3 
   86 #define CRACK_BOUNDARY_UPPER 4 
   98 int main (
int argc, 
char ** argv)
 
  104 #ifndef LIBMESH_HAVE_EXODUS_API 
  105   libmesh_example_requires(
false, 
"--enable-exodus");
 
  109   libmesh_example_requires(3 <= LIBMESH_DIM, 
"3D support");
 
  112 #ifndef LIBMESH_ENABLE_DIRICHLET 
  113   libmesh_example_requires(
false, 
"--enable-dirichlet");
 
  116   GetPot command_line (argc, argv);
 
  119   if (command_line.search(1, 
"-R"))
 
  120     R = command_line.next(R);
 
  134 #ifdef LIBMESH_ENABLE_DIRICHLET 
  136   std::set<boundary_id_type> boundary_ids;
 
  137   boundary_ids.insert(MAX_Z_BOUNDARY);
 
  138   std::vector<unsigned int> variables;
 
  139   variables.push_back(0);
 
  147 #endif // LIBMESH_ENABLE_DIRICHLET 
  156     (
mesh, CRACK_BOUNDARY_LOWER, CRACK_BOUNDARY_UPPER);
 
  161   equation_systems.init();
 
  162   equation_systems.print_info();
 
  165   equation_systems.parameters.set<
Real>(
"R") = R;
 
  172 #ifdef LIBMESH_HAVE_EXODUS_API 
  178 #ifdef LIBMESH_ENABLE_AMR 
  181   unsigned int n_refinements = 0;
 
  182   if (command_line.search(
"-n_refinements"))
 
  183     n_refinements = command_line.next(0);
 
  185   for (
unsigned int r = 0; r != n_refinements; ++r)
 
  187       std::cout << 
"Refining the mesh" << std::endl;
 
  190       equation_systems.reinit();
 
  196 #ifdef LIBMESH_HAVE_EXODUS_API 
  198       std::ostringstream 
out;
 
  199       out << 
"solution_" << r << 
".exo";
 
  221   const DofMap & dof_map = system.get_dof_map();
 
  223   FEType fe_type = dof_map.variable_type(0);
 
  232   fe->attach_quadrature_rule (&qrule);
 
  233   fe_elem_face->attach_quadrature_rule (&qface);
 
  234   fe_neighbor_face->attach_quadrature_rule (&qface);
 
  236   const std::vector<Real> & JxW = fe->get_JxW();
 
  237   const std::vector<std::vector<Real>> & phi = fe->get_phi();
 
  238   const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
 
  240   const std::vector<Real> & JxW_face = fe_elem_face->get_JxW();
 
  242   const std::vector<Point> & qface_points = fe_elem_face->get_xyz();
 
  244   const std::vector<std::vector<Real>> & phi_face          = fe_elem_face->get_phi();
 
  245   const std::vector<std::vector<Real>> & phi_neighbor_face = fe_neighbor_face->get_phi();
 
  255   std::vector<dof_id_type> dof_indices;
 
  259       dof_map.dof_indices (elem, dof_indices);
 
  260       const unsigned int n_dofs = dof_indices.size();
 
  264       Ke.
resize (n_dofs, n_dofs);
 
  268       for (
unsigned int qp=0; qp<qrule.n_points(); qp++)
 
  269         for (
unsigned int i=0; i<n_dofs; i++)
 
  270           for (
unsigned int j=0; j<n_dofs; j++)
 
  271             Ke(i,j) += JxW[qp]*(dphi[i][qp]*dphi[j][qp]);
 
  275         for (
auto side : elem->side_index_range())
 
  276           if (elem->neighbor_ptr(side) == 
nullptr)
 
  280                   fe_elem_face->reinit(elem, side);
 
  282                   for (
unsigned int qp=0; qp<qface.n_points(); qp++)
 
  283                     for (std::size_t i=0; i<phi.size(); i++)
 
  284                       Fe(i) += JxW_face[qp] * phi_face[i][qp];
 
  292         for (
auto side : elem->side_index_range())
 
  293           if (elem->neighbor_ptr(side) == 
nullptr)
 
  298                   fe_elem_face->reinit(elem, side);
 
  300                   ElementSideMap::const_iterator ltu_it =
 
  301                     lower_to_upper.find(std::make_pair(elem, side));
 
  304                   const Elem * neighbor = ltu_it->second;
 
  306                   std::vector<Point> qface_neighbor_points;
 
  309                                       qface_neighbor_points);
 
  310                   fe_neighbor_face->reinit(neighbor, &qface_neighbor_points);
 
  312                   std::vector<dof_id_type> neighbor_dof_indices;
 
  313                   dof_map.dof_indices (neighbor, neighbor_dof_indices);
 
  314                   const unsigned int n_neighbor_dofs = neighbor_dof_indices.
size();
 
  316                   Kne.
resize (n_neighbor_dofs, n_dofs);
 
  317                   Ken.
resize (n_dofs, n_neighbor_dofs);
 
  318                   Kee.
resize (n_dofs, n_dofs);
 
  319                   Knn.
resize (n_neighbor_dofs, n_neighbor_dofs);
 
  322                   for (
unsigned int qp=0; qp<qface.n_points(); qp++)
 
  323                     for (
unsigned int i=0; i<n_dofs; i++)
 
  324                       for (
unsigned int j=0; j<n_dofs; j++)
 
  325                         Kee(i,j) -= JxW_face[qp] * (1./R)*(phi_face[i][qp] * phi_face[j][qp]);
 
  328                   for (
unsigned int qp=0; qp<qface.n_points(); qp++)
 
  329                     for (
unsigned int i=0; i<n_dofs; i++)
 
  330                       for (
unsigned int j=0; j<n_neighbor_dofs; j++)
 
  331                         Ken(i,j) += JxW_face[qp] * (1./R)*(phi_face[i][qp] * phi_neighbor_face[j][qp]);
 
  334                   for (
unsigned int qp=0; qp<qface.n_points(); qp++)
 
  335                     for (
unsigned int i=0; i<n_neighbor_dofs; i++)
 
  336                       for (
unsigned int j=0; j<n_neighbor_dofs; j++)
 
  337                         Knn(i,j) -= JxW_face[qp] * (1./R)*(phi_neighbor_face[i][qp] * phi_neighbor_face[j][qp]);
 
  340                   for (
unsigned int qp=0; qp<qface.n_points(); qp++)
 
  341                     for (
unsigned int i=0; i<n_neighbor_dofs; i++)
 
  342                       for (
unsigned int j=0; j<n_dofs; j++)
 
  343                         Kne(i,j) += JxW_face[qp] * (1./R)*(phi_neighbor_face[i][qp] * phi_face[j][qp]);
 
  345                   system.matrix->add_matrix(Kne, neighbor_dof_indices, dof_indices);
 
  346                   system.matrix->add_matrix(Ken, dof_indices, neighbor_dof_indices);
 
  347                   system.matrix->add_matrix(Kee, dof_indices);
 
  348                   system.matrix->add_matrix(Knn, neighbor_dof_indices);
 
  353       dof_map.constrain_element_matrix_and_vector (Ke, Fe, dof_indices);
 
  355       system.matrix->add_matrix (Ke, dof_indices);
 
  356       system.rhs->add_vector    (Fe, dof_indices);