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