576 {
578
579 auto get_sense_index = [
this]() {
return (
faceSense == 1) ? 0 : 1; };
580
584
585 int nb_integration_pts = OP::getGaussPts().size2();
586
588 auto t_lambda = getFTensor2FromMat<3, 3>(
lambdaPtr->at(get_sense_index()));
589 auto t_kappa = getFTensor0FromVec<0>(*
kappaPtr);
591 auto t_face_normal = getFTensor1NormalsAtGaussPts();
592 auto t_w = OP::getFTensor0IntegrationWeight();
593
594 auto next = [&]() {
595 ++t_P;
596 ++t_face_normal;
597 ++t_kappa;
598 ++t_delta_kappa;
599 ++t_lambda;
600 ++t_w;
601 };
602
603 double face_dissipation = 0.0;
604 double face_grad_dissipation = 0.0;
605 auto face_handle = OP::getFEEntityHandle();
607 &face_dissipation);
609 &face_grad_dissipation);
610
611 for (auto gg = 0; gg != nb_integration_pts; ++gg) {
615 t_normalized_normal(
J) = t_normal(
J);
618 t_traction(
i) = t_P(
i,
J) * t_normalized_normal(
J);
619
620 auto dJ_dkappa = [](auto &t_delta_kappa, auto &t_traction,
621 auto &t_normalized_normal, auto &t_kappa, auto gc) {
622 double kappa =
static_cast<double>(t_kappa);
623 double delta_kappa = static_cast<double>(t_delta_kappa);
627 delta_kappa, teff,
kappa, gc);
628 double m_grad =
630 delta_kappa, teff,
kappa, gc);
631 return boost::make_tuple(
m, m_grad);
632 };
633
634 auto dr_kappa = [](auto &t_delta_kappa, auto &t_traction,
635 auto &t_normalized_normal, auto &t_kappa, auto gc) {
636 double kappa =
static_cast<double>(t_kappa);
637 double delta_kappa = static_cast<double>(t_delta_kappa);
638 double kappa_plus_delta =
kappa + delta_kappa;
639 double diff_alpha =
645 t_gap_double(
i) = -t_gap(
i);
646 return t_gap_double;
647 };
648
649 auto [
J, dJ] = dJ_dkappa(t_delta_kappa, t_traction, t_normalized_normal,
651 face_dissipation += t_w *
J * t_normal.
l2();
652 face_grad_dissipation += t_w * dJ * t_normal.
l2();
653
654 auto t_dr = dr_kappa(t_delta_kappa, t_traction, t_normalized_normal,
657 t_l(
i) = t_lambda(
i,
K) * t_normal(
K);
658 face_grad_dissipation -= t_w * t_l(
i) * t_dr(
i);
659
660 next();
661 }
662
664 &face_dissipation);
666 &face_grad_dissipation);
667
668
670 };
#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)
static auto calculateGap(const FTensor::Tensor1< T, 3 > &t_traction, FTensor::Tensor1< double, 3 > &t_n_normalize, double alpha, double beta)
static auto calculateEffectiveTraction(const FTensor::Tensor1< T, 3 > &t_traction, FTensor::Tensor1< double, 3 > &t_n_normalize, double beta)
static auto calculateDissipationSurplusDiffKappa(const T &delta_kappa, const T &t_eff, const T &kappa, double gc)
static T getDiffAlpha(const T &kappa, double gc)
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