595 {
597
598 auto get_sense_index = [
this]() {
return (
faceSense == 1) ? 0 : 1; };
599
603
604 int nb_integration_pts = OP::getGaussPts().size2();
605
607 auto t_lambda = getFTensor2FromMat<3, 3>(
lambdaPtr->at(get_sense_index()));
608 auto t_kappa = getFTensor0FromVec<0>(*
kappaPtr);
610 auto t_face_normal = getFTensor1NormalsAtGaussPts();
611 auto t_w = OP::getFTensor0IntegrationWeight();
612
613 auto next = [&]() {
614 ++t_P;
615 ++t_face_normal;
616 ++t_kappa;
617 ++t_delta_kappa;
618 ++t_lambda;
619 ++t_w;
620 };
621
622 double face_dissipation = 0.0;
623 double face_grad_dissipation = 0.0;
624 auto face_handle = OP::getFEEntityHandle();
626 &face_dissipation);
628 &face_grad_dissipation);
629
630 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
634 t_normalized_normal(
J) = t_normal(
J);
637 t_traction(
i) = t_P(
i,
J) * t_normalized_normal(
J);
638
639 auto dJ_dkappa = [](auto &t_delta_kappa, auto &t_traction,
640 auto &t_normalized_normal, auto &t_kappa, auto gc) {
641 double kappa =
static_cast<double>(t_kappa);
642 double delta_kappa = static_cast<double>(t_delta_kappa);
647 double m_grad =
650 return boost::make_tuple(
m, m_grad);
651 };
652
653 auto dr_kappa = [](auto &t_delta_kappa, auto &t_traction,
654 auto &t_normalized_normal, auto &t_kappa, auto gc) {
655 double kappa =
static_cast<double>(t_kappa);
656 double delta_kappa = static_cast<double>(t_delta_kappa);
657 double kappa_plus_delta =
kappa + delta_kappa;
664 t_gap_double(
i) = -t_gap(
i);
665 return t_gap_double;
666 };
667
668 auto [
J, dJ] = dJ_dkappa(t_delta_kappa, t_traction, t_normalized_normal,
670 face_dissipation += t_w *
J * t_normal.
l2();
671 face_grad_dissipation += t_w * dJ * t_normal.
l2();
672
673 auto t_dr = dr_kappa(t_delta_kappa, t_traction, t_normalized_normal,
676 t_l(
i) = t_lambda(
i,
K) * t_normal(
K);
677 face_grad_dissipation -= t_w * t_l(
i) * t_dr(
i);
678
679 next();
680 }
681
683 &face_dissipation);
685 &face_grad_dissipation);
686
687
689 };
#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