265 const std::string & libmesh_dbg_var(system_name))
269 libmesh_assert_equal_to (system_name,
"Shell");
285 const Real K = E * h / (1-nu*nu);
286 const Real D = E * h*h*h / (12*(1-nu*nu));
303 const int extraorder = 0;
307 fe->attach_quadrature_rule (qrule.get());
310 const std::vector<Real> & JxW = fe->get_JxW();
313 const std::vector<RealGradient> & dxyzdxi = fe->get_dxyzdxi();
314 const std::vector<RealGradient> & dxyzdeta = fe->get_dxyzdeta();
317 const std::vector<RealGradient> & d2xyzdxi2 = fe->get_d2xyzdxi2();
318 const std::vector<RealGradient> & d2xyzdeta2 = fe->get_d2xyzdeta2();
319 const std::vector<RealGradient> & d2xyzdxideta = fe->get_d2xyzdxideta();
323 const std::vector<std::vector<Real>> & phi = fe->get_phi();
324 const std::vector<std::vector<RealGradient>> & dphi = fe->get_dphi();
325 const std::vector<std::vector<RealTensor>> & d2phi = fe->get_d2phi();
343 Kuu(Ke), Kuv(Ke), Kuw(Ke),
344 Kvu(Ke), Kvv(Ke), Kvw(Ke),
345 Kwu(Ke), Kwv(Ke), Kww(Ke);
355 std::vector<dof_id_type> dof_indices;
356 std::vector<dof_id_type> dof_indices_u;
357 std::vector<dof_id_type> dof_indices_v;
358 std::vector<dof_id_type> dof_indices_w;
362 for (
const auto & elem :
mesh.active_local_element_ptr_range())
381 const std::size_t n_dofs = dof_indices.size();
382 const std::size_t n_u_dofs = dof_indices_u.size();
383 const std::size_t n_v_dofs = dof_indices_v.size();
384 const std::size_t n_w_dofs = dof_indices_w.size();
396 Ke.
resize (n_dofs, n_dofs);
412 Kuu.reposition (u_var*n_u_dofs, u_var*n_u_dofs, n_u_dofs, n_u_dofs);
413 Kuv.reposition (u_var*n_u_dofs, v_var*n_u_dofs, n_u_dofs, n_v_dofs);
414 Kuw.reposition (u_var*n_u_dofs, w_var*n_u_dofs, n_u_dofs, n_w_dofs);
416 Kvu.reposition (v_var*n_v_dofs, u_var*n_v_dofs, n_v_dofs, n_u_dofs);
417 Kvv.reposition (v_var*n_v_dofs, v_var*n_v_dofs, n_v_dofs, n_v_dofs);
418 Kvw.reposition (v_var*n_v_dofs, w_var*n_v_dofs, n_v_dofs, n_w_dofs);
420 Kwu.reposition (w_var*n_w_dofs, u_var*n_w_dofs, n_w_dofs, n_u_dofs);
421 Kwv.reposition (w_var*n_w_dofs, v_var*n_w_dofs, n_w_dofs, n_v_dofs);
422 Kww.
reposition (w_var*n_w_dofs, w_var*n_w_dofs, n_w_dofs, n_w_dofs);
424 Fu.reposition (u_var*n_u_dofs, n_u_dofs);
425 Fv.reposition (v_var*n_u_dofs, n_v_dofs);
429 for (
unsigned int qp=0; qp<qrule->n_points(); ++qp)
435 for (
unsigned int i=0; i<n_u_dofs; ++i)
436 Fw(i) += JxW[qp] * phi[i][qp] * q;
447 libmesh_assert_greater (jac, 0);
465 H(0,0) = a(1) * a(1);
466 H(0,1) = H(1,0) = nu * a(1) * a(0) + (1-nu) * a(2) * a(2);
467 H(0,2) = H(2,0) = -a(1) * a(2);
468 H(1,1) = a(0) * a(0);
469 H(1,2) = H(2,1) = -a(0) * a(2);
470 H(2,2) = 0.5 * ((1-nu) * a(1) * a(0) + (1+nu) * a(2) * a(2));
471 const Real det = a(0) * a(1) - a(2) * a(2);
472 libmesh_assert_not_equal_to (det * det, 0);
486 for (
unsigned int i=0; i<n_u_dofs; ++i)
488 for (
unsigned int j=0; j<n_u_dofs; ++j)
492 for (
unsigned int k=0; k<3; ++k)
494 MI(0,k) = dphi[i][qp](0) * a1(k);
495 MI(1,k) = dphi[i][qp](1) * a2(k);
496 MI(2,k) = dphi[i][qp](1) * a1(k)
497 + dphi[i][qp](0) * a2(k);
499 MJ(0,k) = dphi[j][qp](0) * a1(k);
500 MJ(1,k) = dphi[j][qp](1) * a2(k);
501 MJ(2,k) = dphi[j][qp](1) * a1(k)
502 + dphi[j][qp](0) * a2(k);
507 for (
unsigned int k=0; k<3; ++k)
509 const Real term_ik = dphi[i][qp](0) * a2xa3(k)
510 + dphi[i][qp](1) * a3xa1(k);
511 BI(0,k) = -d2phi[i][qp](0,0) * a3(k)
512 +(dphi[i][qp](0) * a11xa2(k)
513 + dphi[i][qp](1) * a1xa11(k)
514 + (a3*a11) * term_ik) / jac;
515 BI(1,k) = -d2phi[i][qp](1,1) * a3(k)
516 +(dphi[i][qp](0) * a22xa2(k)
517 + dphi[i][qp](1) * a1xa22(k)
518 + (a3*a22) * term_ik) / jac;
519 BI(2,k) = 2 * (-d2phi[i][qp](0,1) * a3(k)
520 +(dphi[i][qp](0) * a12xa2(k)
521 + dphi[i][qp](1) * a1xa12(k)
522 + (a3*a12) * term_ik) / jac);
524 const Real term_jk = dphi[j][qp](0) * a2xa3(k)
525 + dphi[j][qp](1) * a3xa1(k);
526 BJ(0,k) = -d2phi[j][qp](0,0) * a3(k)
527 +(dphi[j][qp](0) * a11xa2(k)
528 + dphi[j][qp](1) * a1xa11(k)
529 + (a3*a11) * term_jk) / jac;
530 BJ(1,k) = -d2phi[j][qp](1,1) * a3(k)
531 +(dphi[j][qp](0) * a22xa2(k)
532 + dphi[j][qp](1) * a1xa22(k)
533 + (a3*a22) * term_jk) / jac;
534 BJ(2,k) = 2 * (-d2phi[j][qp](0,1) * a3(k)
535 +(dphi[j][qp](0) * a12xa2(k)
536 + dphi[j][qp](1) * a1xa12(k)
537 + (a3*a12) * term_jk) / jac);
549 Kuu(i,j) += KIJ(0,0);
550 Kuv(i,j) += KIJ(0,1);
551 Kuw(i,j) += KIJ(0,2);
553 Kvu(i,j) += KIJ(1,0);
554 Kvv(i,j) += KIJ(1,1);
555 Kvw(i,j) += KIJ(1,2);
557 Kwu(i,j) += KIJ(2,0);
558 Kwv(i,j) += KIJ(2,1);
559 Kww(i,j) += KIJ(2,2);
580 for (
const auto & elem :
mesh.active_local_element_ptr_range())
591 for (
auto s : elem->side_index_range())
594 if (nb_elem ==
nullptr || nb_elem->
is_ghost())
612 const Node * nodes [4];
620 unsigned int n_int = 0;
622 while (nodes[0]->
id() == nodes[1]->
id() || nodes[0]->
id() == nodes[2]->
id())
623 nodes[0] = nb_elem->
node_ptr(++n_int);
626 const Real penalty = 1.e10;
632 for (
unsigned int n=0; n<4; ++n)
637 matrix.
add (u_dof, u_dof, penalty);
638 matrix.
add (v_dof, v_dof, penalty);
639 matrix.
add (w_dof, w_dof, penalty);