627 {
629
630 auto get_sense_index = [
this]() {
return (
faceSense == 1) ? 0 : 1; };
631
635
636 int nb_integration_pts = OP::getGaussPts().size2();
637
639 auto t_lambda = getFTensor2FromMat<3, 3>(
lambdaPtr->at(get_sense_index()));
640 auto t_kappa = getFTensor0FromVec<0>(*
kappaPtr);
642 auto t_face_normal = getFTensor1NormalsAtGaussPts();
643 auto t_w = OP::getFTensor0IntegrationWeight();
644
645 auto next = [&]() {
646 ++t_P;
647 ++t_face_normal;
648 ++t_kappa;
649 ++t_delta_kappa;
650 ++t_lambda;
651 ++t_w;
652 };
653
654 double face_dissipation = 0.0;
655 double face_grad_dissipation = 0.0;
656 auto face_handle = OP::getFEEntityHandle();
658 &face_dissipation);
660 &face_grad_dissipation);
661
662 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
666 t_normalized_normal(
J) = t_normal(
J);
669 t_traction(
i) = t_P(
i,
J) * t_normalized_normal(
J);
670
671 auto dJ_dkappa = [](auto &t_delta_kappa, auto &t_traction,
672 auto &t_normalized_normal, auto &t_kappa, auto gc) {
673 double kappa =
static_cast<double>(t_kappa);
674 double delta_kappa = static_cast<double>(t_delta_kappa);
679 double m_grad =
682 return boost::make_tuple(
m, m_grad);
683 };
684
685 auto dr_kappa = [](auto &t_delta_kappa, auto &t_traction,
686 auto &t_normalized_normal, auto &t_kappa, auto gc) {
687 double kappa =
static_cast<double>(t_kappa);
688 double delta_kappa = static_cast<double>(t_delta_kappa);
689 double kappa_plus_delta =
kappa + delta_kappa;
696 t_gap_double(
i) = -t_gap(
i);
697 return t_gap_double;
698 };
699
700 auto [
J, dJ] = dJ_dkappa(t_delta_kappa, t_traction, t_normalized_normal,
702 face_dissipation += t_w *
J * t_normal.
l2();
703 face_grad_dissipation += t_w * dJ * t_normal.
l2();
704
705 auto t_dr = dr_kappa(t_delta_kappa, t_traction, t_normalized_normal,
708 t_l(
i) = t_lambda(
i,
K) * t_normal(
K);
709 face_grad_dissipation -= t_w * t_l(
i) * t_dr(
i);
710
711 next();
712 }
713
715 &face_dissipation);
717 &face_grad_dissipation);
718
719
721 };
#define FTENSOR_INDEX(DIM, I)
Tensor1< T, Tensor_Dim > normalize()
#define CHKERR
Inline error check.
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'J', DIM1 > J
FTensor::Index< 'm', 3 > m
static auto calculateDissipationSurplus(const T &delta_kappa, const T t_eff, const T &kappa, double gc, double min_stiffness)
static auto calculateGap(const FTensor::Tensor1< T, 3 > &t_traction, FTensor::Tensor1< double, 3 > &t_n_normalize, double alpha, double beta, bool sign_sensitive=true)
static auto calculateEffectiveTraction(const FTensor::Tensor1< T, 3 > &t_traction, FTensor::Tensor1< double, 3 > &t_n_normalize, double beta)
static T getDiffAlpha(const T &kappa, double gc, double min_stiffness)
static auto calculateDissipationSurplusDiffKappa(const T &delta_kappa, const T &t_eff, const T &kappa, double gc, double min_stiffness)
boost::shared_ptr< MatrixDouble > fluxMatPtr
boost::shared_ptr< double > gcPtr
boost::shared_ptr< VectorDouble > kappaDeltaPtr
boost::shared_ptr< VectorDouble > kappaPtr
boost::shared_ptr< std::array< MatrixDouble, 2 > > lambdaPtr
static double min_stiffness