38 #include "libmesh/libmesh.h" 
   39 #include "libmesh/replicated_mesh.h" 
   40 #include "libmesh/mesh_refinement.h" 
   41 #include "libmesh/mesh_modification.h" 
   42 #include "libmesh/mesh_tools.h" 
   43 #include "libmesh/linear_implicit_system.h" 
   44 #include "libmesh/equation_systems.h" 
   45 #include "libmesh/fe.h" 
   46 #include "libmesh/quadrature.h" 
   47 #include "libmesh/node.h" 
   48 #include "libmesh/elem.h" 
   49 #include "libmesh/dof_map.h" 
   50 #include "libmesh/vector_value.h" 
   51 #include "libmesh/tensor_value.h" 
   52 #include "libmesh/dense_matrix.h" 
   53 #include "libmesh/dense_submatrix.h" 
   54 #include "libmesh/dense_vector.h" 
   55 #include "libmesh/dense_subvector.h" 
   56 #include "libmesh/sparse_matrix.h" 
   57 #include "libmesh/numeric_vector.h" 
   58 #include "libmesh/vtk_io.h" 
   59 #include "libmesh/exodusII_io.h" 
   60 #include "libmesh/enum_solver_package.h" 
   61 #include "libmesh/parallel.h" 
   64 #include "libmesh/face_tri3_subdivision.h" 
   65 #include "libmesh/mesh_subdivision_support.h" 
   70 #if defined(LIBMESH_ENABLE_SECOND_DERIVATIVES) && LIBMESH_DIM > 2 
   75                      const std::string & system_name);
 
   79 int main (
int argc, 
char ** argv)
 
   86                            "--enable-petsc, --enable-trilinos, or --enable-eigen");
 
   89   libmesh_example_requires (3 == LIBMESH_DIM, 
"3D support");
 
   92 #ifndef LIBMESH_ENABLE_NODE_VALENCE 
   93   libmesh_example_requires (
false, 
"--enable-node-valence");
 
   97 #ifndef LIBMESH_ENABLE_AMR 
   98   libmesh_example_requires(
false, 
"--enable-amr");
 
  102 #ifndef LIBMESH_ENABLE_SECOND_DERIVATIVES 
  103   libmesh_example_requires(
false, 
"--enable-second");
 
  104 #elif LIBMESH_DIM > 2 
  125 #if defined(LIBMESH_HAVE_VTK) 
  128 #if defined(LIBMESH_HAVE_EXODUS_API) 
  149 #if defined(LIBMESH_HAVE_VTK) 
  152 #if defined(LIBMESH_HAVE_EXODUS_API) 
  191   equation_systems.
init();
 
  202 #if defined(LIBMESH_HAVE_VTK) 
  205 #if defined(LIBMESH_HAVE_EXODUS_API) 
  210   Node * center_node = 0;
 
  212   for (
unsigned int nid=1; nid<
mesh.
n_nodes(); ++nid)
 
  215       if (dist_sq < nearest_dist_sq)
 
  217           nearest_dist_sq = dist_sq;
 
  229   system.
comm().sum(w);
 
  235   const Real D = E * h*h*h / (12*(1-nu*nu));
 
  236   const Real w_analytic = 0.001265319 * L*L*L*L * q / D;
 
  241   libMesh::out << 
"z-displacement of the center point: " << w << std::endl;
 
  242   libMesh::out << 
"Analytic solution for pure bending: " << w_analytic << std::endl;
 
  244 #endif // LIBMESH_ENABLE_SECOND_DERIVATIVES, LIBMESH_DIM > 2 
  246 #endif // #ifdef LIBMESH_ENABLE_AMR 
  252 #if defined(LIBMESH_ENABLE_SECOND_DERIVATIVES) && LIBMESH_DIM > 2 
  260                      const std::string & libmesh_dbg_var(system_name))
 
  264   libmesh_assert_equal_to (system_name, 
"Shell");
 
  280   const Real K = E * h     /     (1-nu*nu);
 
  281   const Real D = E * h*h*h / (12*(1-nu*nu));
 
  298   const int extraorder = 0;
 
  302   fe->attach_quadrature_rule (qrule.get());
 
  305   const std::vector<Real> & JxW = fe->get_JxW();
 
  308   const std::vector<RealGradient> & dxyzdxi  = fe->get_dxyzdxi();
 
  309   const std::vector<RealGradient> & dxyzdeta = fe->get_dxyzdeta();
 
  312   const std::vector<RealGradient> & d2xyzdxi2    = fe->get_d2xyzdxi2();
 
  313   const std::vector<RealGradient> & d2xyzdeta2   = fe->get_d2xyzdeta2();
 
  314   const std::vector<RealGradient> & d2xyzdxideta = fe->get_d2xyzdxideta();
 
  318   const std::vector<std::vector<Real>> &          phi = fe->get_phi();
 
  319   const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
 
  320   const std::vector<std::vector<RealTensor>> &  d2phi = fe->get_d2phi();
 
  335     Kuu(Ke), Kuv(Ke), Kuw(Ke),
 
  336     Kvu(Ke), Kvv(Ke), Kvw(Ke),
 
  337     Kwu(Ke), Kwv(Ke), Kww(Ke);
 
  347   std::vector<dof_id_type> dof_indices;
 
  348   std::vector<dof_id_type> dof_indices_u;
 
  349   std::vector<dof_id_type> dof_indices_v;
 
  350   std::vector<dof_id_type> dof_indices_w;
 
  360       const Tri3Subdivision * sd_elem = static_cast<const Tri3Subdivision *> (elem);
 
  361       if (sd_elem->is_ghost())
 
  373       const std::size_t n_dofs   = dof_indices.size();
 
  374       const std::size_t n_u_dofs = dof_indices_u.size();
 
  375       const std::size_t n_v_dofs = dof_indices_v.size();
 
  376       const std::size_t n_w_dofs = dof_indices_w.size();
 
  388       Ke.
resize (n_dofs, n_dofs);
 
  404       Kuu.reposition (u_var*n_u_dofs, u_var*n_u_dofs, n_u_dofs, n_u_dofs);
 
  405       Kuv.reposition (u_var*n_u_dofs, v_var*n_u_dofs, n_u_dofs, n_v_dofs);
 
  406       Kuw.reposition (u_var*n_u_dofs, w_var*n_u_dofs, n_u_dofs, n_w_dofs);
 
  408       Kvu.reposition (v_var*n_v_dofs, u_var*n_v_dofs, n_v_dofs, n_u_dofs);
 
  409       Kvv.reposition (v_var*n_v_dofs, v_var*n_v_dofs, n_v_dofs, n_v_dofs);
 
  410       Kvw.reposition (v_var*n_v_dofs, w_var*n_v_dofs, n_v_dofs, n_w_dofs);
 
  412       Kwu.reposition (w_var*n_w_dofs, u_var*n_w_dofs, n_w_dofs, n_u_dofs);
 
  413       Kwv.reposition (w_var*n_w_dofs, v_var*n_w_dofs, n_w_dofs, n_v_dofs);
 
  414       Kww.
reposition (w_var*n_w_dofs, w_var*n_w_dofs, n_w_dofs, n_w_dofs);
 
  416       Fu.reposition (u_var*n_u_dofs, n_u_dofs);
 
  417       Fv.reposition (v_var*n_u_dofs, n_v_dofs);
 
  421       for (
unsigned int qp=0; qp<qrule->n_points(); ++qp)
 
  427           for (
unsigned int i=0; i<n_u_dofs; ++i)
 
  428             Fw(i) += JxW[qp] * phi[i][qp] * q;
 
  439           libmesh_assert_greater (jac, 0);
 
  457           H(0,0) = a(1) * a(1);
 
  458           H(0,1) = H(1,0) = nu * a(1) * a(0) + (1-nu) * a(2) * a(2);
 
  459           H(0,2) = H(2,0) = -a(1) * a(2);
 
  460           H(1,1) = a(0) * a(0);
 
  461           H(1,2) = H(2,1) = -a(0) * a(2);
 
  462           H(2,2) = 0.5 * ((1-nu) * a(1) * a(0) + (1+nu) * a(2) * a(2));
 
  463           const Real det = a(0) * a(1) - a(2) * a(2);
 
  464           libmesh_assert_not_equal_to (det * det, 0);
 
  478           for (
unsigned int i=0; i<n_u_dofs; ++i)
 
  480               for (
unsigned int j=0; j<n_u_dofs; ++j)
 
  484                   for (
unsigned int k=0; k<3; ++k)
 
  486                       MI(0,k) = dphi[i][qp](0) * a1(k);
 
  487                       MI(1,k) = dphi[i][qp](1) * a2(k);
 
  488                       MI(2,k) = dphi[i][qp](1) * a1(k)
 
  489                         + dphi[i][qp](0) * a2(k);
 
  491                       MJ(0,k) = dphi[j][qp](0) * a1(k);
 
  492                       MJ(1,k) = dphi[j][qp](1) * a2(k);
 
  493                       MJ(2,k) = dphi[j][qp](1) * a1(k)
 
  494                         + dphi[j][qp](0) * a2(k);
 
  499                   for (
unsigned int k=0; k<3; ++k)
 
  501                       const Real term_ik = dphi[i][qp](0) * a2xa3(k)
 
  502                         + dphi[i][qp](1) * a3xa1(k);
 
  503                       BI(0,k) = -d2phi[i][qp](0,0) * a3(k)
 
  504                         +(dphi[i][qp](0) * a11xa2(k)
 
  505                           + dphi[i][qp](1) * a1xa11(k)
 
  506                           + (a3*a11) * term_ik) / jac;
 
  507                       BI(1,k) = -d2phi[i][qp](1,1) * a3(k)
 
  508                         +(dphi[i][qp](0) * a22xa2(k)
 
  509                           + dphi[i][qp](1) * a1xa22(k)
 
  510                           + (a3*a22) * term_ik) / jac;
 
  511                       BI(2,k) = 2 * (-d2phi[i][qp](0,1) * a3(k)
 
  512                                      +(dphi[i][qp](0) * a12xa2(k)
 
  513                                        + dphi[i][qp](1) * a1xa12(k)
 
  514                                        + (a3*a12) * term_ik) / jac);
 
  516                       const Real term_jk = dphi[j][qp](0) * a2xa3(k)
 
  517                         + dphi[j][qp](1) * a3xa1(k);
 
  518                       BJ(0,k) = -d2phi[j][qp](0,0) * a3(k)
 
  519                         +(dphi[j][qp](0) * a11xa2(k)
 
  520                           + dphi[j][qp](1) * a1xa11(k)
 
  521                           + (a3*a11) * term_jk) / jac;
 
  522                       BJ(1,k) = -d2phi[j][qp](1,1) * a3(k)
 
  523                         +(dphi[j][qp](0) * a22xa2(k)
 
  524                           + dphi[j][qp](1) * a1xa22(k)
 
  525                           + (a3*a22) * term_jk) / jac;
 
  526                       BJ(2,k) = 2 * (-d2phi[j][qp](0,1) * a3(k)
 
  527                                      +(dphi[j][qp](0) * a12xa2(k)
 
  528                                        + dphi[j][qp](1) * a1xa12(k)
 
  529                                        + (a3*a12) * term_jk) / jac);
 
  541                   Kuu(i,j) += KIJ(0,0);
 
  542                   Kuv(i,j) += KIJ(0,1);
 
  543                   Kuw(i,j) += KIJ(0,2);
 
  545                   Kvu(i,j) += KIJ(1,0);
 
  546                   Kvv(i,j) += KIJ(1,1);
 
  547                   Kvw(i,j) += KIJ(1,2);
 
  549                   Kwu(i,j) += KIJ(2,0);
 
  550                   Kwv(i,j) += KIJ(2,1);
 
  551                   Kww(i,j) += KIJ(2,2);
 
  577       const Tri3Subdivision * gh_elem = static_cast<const Tri3Subdivision *> (elem);
 
  578       if (!gh_elem->is_ghost())
 
  583       for (
auto s : elem->side_index_range())
 
  585           const Tri3Subdivision * nb_elem = static_cast<const Tri3Subdivision *> (elem->neighbor_ptr(s));
 
  586           if (nb_elem == 
nullptr || nb_elem->
is_ghost())
 
  604           const Node * nodes [4]; 
 
  605           nodes[1] = gh_elem->node_ptr(s); 
 
  612           unsigned int n_int = 0;
 
  614           while (nodes[0]->
id() == nodes[1]->
id() || nodes[0]->
id() == nodes[2]->
id())
 
  615             nodes[0] = nb_elem->
node_ptr(++n_int);
 
  618           const Real penalty = 1.e10;
 
  624           for (
unsigned int n=0; n<4; ++n)
 
  629               system.
matrix->
add (u_dof, u_dof, penalty);
 
  630               system.
matrix->
add (v_dof, v_dof, penalty);
 
  631               system.
matrix->
add (w_dof, w_dof, penalty);
 
  637 #endif // defined(LIBMESH_ENABLE_SECOND_DERIVATIVES) && LIBMESH_DIM > 2