v0.14.0
EshelbianOperators.cpp

Implementation of operators

/**
* \file EshelbianOperators.cpp
* \example EshelbianOperators.cpp
*
* \brief Implementation of operators
*/
#include <MoFEM.hpp>
using namespace MoFEM;
#include <boost/math/constants/constants.hpp>
#include <EshelbianAux.hpp>
#include <lapack_wrap.h>
#include <Lie.hpp>
EntData &data) {
int nb_integration_pts = getGaussPts().size2();
auto t_P = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(dataAtPts->approxPAtPts);
auto t_F = getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(dataAtPts->hAtPts);
auto t_energy = getFTensor0FromVec(dataAtPts->energyAtPts);
dataAtPts->SigmaAtPts.resize(SPACE_DIM * SPACE_DIM, nb_integration_pts,
false);
auto t_eshelby_stress =
getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(dataAtPts->SigmaAtPts);
for (auto gg = 0; gg != nb_integration_pts; ++gg) {
t_eshelby_stress(i, j) = t_energy * t_kd(i, j) - t_F(m, i) * t_P(m, j);
++t_energy;
++t_P;
++t_F;
++t_eshelby_stress;
}
}
EntityType type,
EntData &data) {
auto ts_ctx = getTSCtx();
int nb_integration_pts = getGaussPts().size2();
// space size indices
// sym size indices
auto t_L = symm_L_tensor();
dataAtPts->hAtPts.resize(9, nb_integration_pts, false);
dataAtPts->hdOmegaAtPts.resize(9 * 3, nb_integration_pts, false);
dataAtPts->hdLogStretchAtPts.resize(9 * 6, nb_integration_pts, false);
dataAtPts->leviKirchhoffAtPts.resize(3, nb_integration_pts, false);
dataAtPts->leviKirchhoffdOmegaAtPts.resize(9, nb_integration_pts, false);
dataAtPts->leviKirchhoffdLogStreatchAtPts.resize(3 * size_symm,
nb_integration_pts, false);
dataAtPts->leviKirchhoffPAtPts.resize(9 * 3, nb_integration_pts, false);
dataAtPts->adjointPdstretchAtPts.resize(9, nb_integration_pts, false);
dataAtPts->adjointPdUAtPts.resize(size_symm, nb_integration_pts, false);
dataAtPts->adjointPdUdPAtPts.resize(9 * size_symm, nb_integration_pts, false);
dataAtPts->adjointPdUdOmegaAtPts.resize(3 * size_symm, nb_integration_pts,
false);
dataAtPts->rotMatAtPts.resize(9, nb_integration_pts, false);
dataAtPts->stretchTensorAtPts.resize(6, nb_integration_pts, false);
dataAtPts->diffStretchTensorAtPts.resize(36, nb_integration_pts, false);
dataAtPts->eigenVals.resize(3, nb_integration_pts, false);
dataAtPts->eigenVecs.resize(9, nb_integration_pts, false);
dataAtPts->nbUniq.resize(nb_integration_pts, false);
dataAtPts->logStretch2H1AtPts.resize(6, nb_integration_pts, false);
dataAtPts->logStretchTotalTensorAtPts.resize(6, nb_integration_pts, false);
// Calculated values
auto t_h = getFTensor2FromMat<3, 3>(dataAtPts->hAtPts);
auto t_h_domega = getFTensor3FromMat<3, 3, 3>(dataAtPts->hdOmegaAtPts);
auto t_h_dlog_u =
getFTensor3FromMat<3, 3, size_symm>(dataAtPts->hdLogStretchAtPts);
auto t_levi_kirchhoff = getFTensor1FromMat<3>(dataAtPts->leviKirchhoffAtPts);
auto t_levi_kirchhoff_domega =
getFTensor2FromMat<3, 3>(dataAtPts->leviKirchhoffdOmegaAtPts);
auto t_levi_kirchhoff_dstreach = getFTensor2FromMat<3, size_symm>(
dataAtPts->leviKirchhoffdLogStreatchAtPts);
auto t_levi_kirchhoff_dP =
getFTensor3FromMat<3, 3, 3>(dataAtPts->leviKirchhoffPAtPts);
auto t_approx_P_adjoint_dstretch =
getFTensor2FromMat<3, 3>(dataAtPts->adjointPdstretchAtPts);
auto t_approx_P_adjoint_log_du =
getFTensor1FromMat<size_symm>(dataAtPts->adjointPdUAtPts);
auto t_approx_P_adjoint_log_du_dP =
getFTensor3FromMat<3, 3, size_symm>(dataAtPts->adjointPdUdPAtPts);
auto t_approx_P_adjoint_log_du_domega =
getFTensor2FromMat<3, size_symm>(dataAtPts->adjointPdUdOmegaAtPts);
auto t_R = getFTensor2FromMat<3, 3>(dataAtPts->rotMatAtPts);
auto t_u = getFTensor2SymmetricFromMat<3>(dataAtPts->stretchTensorAtPts);
auto t_diff_u =
getFTensor4DdgFromMat<3, 3, 1>(dataAtPts->diffStretchTensorAtPts);
auto t_eigen_vals = getFTensor1FromMat<3>(dataAtPts->eigenVals);
auto t_eigen_vecs = getFTensor2FromMat<3, 3>(dataAtPts->eigenVecs);
auto t_log_stretch_total =
getFTensor2SymmetricFromMat<3>(dataAtPts->logStretchTotalTensorAtPts);
auto t_log_u2_h1 =
getFTensor2SymmetricFromMat<3>(dataAtPts->logStretch2H1AtPts);
auto &nbUniq = dataAtPts->nbUniq;
auto t_nb_uniq =
// Field values
auto t_grad_h1 = getFTensor2FromMat<3, 3>(dataAtPts->wGradH1AtPts);
auto t_omega = getFTensor1FromMat<3>(dataAtPts->rotAxisAtPts);
auto t_approx_P = getFTensor2FromMat<3, 3>(dataAtPts->approxPAtPts);
auto t_log_u =
getFTensor2SymmetricFromMat<3>(dataAtPts->logStretchTensorAtPts);
auto next = [&]() {
// calculated values
++t_h;
++t_h_domega;
++t_h_dlog_u;
++t_levi_kirchhoff;
++t_levi_kirchhoff_domega;
++t_levi_kirchhoff_dstreach;
++t_levi_kirchhoff_dP;
++t_approx_P_adjoint_dstretch;
++t_approx_P_adjoint_log_du;
++t_approx_P_adjoint_log_du_dP;
++t_approx_P_adjoint_log_du_domega;
++t_R;
++t_u;
++t_diff_u;
++t_eigen_vals;
++t_eigen_vecs;
++t_nb_uniq;
++t_log_u2_h1;
++t_log_stretch_total;
// field values
++t_omega;
++t_grad_h1;
++t_approx_P;
++t_log_u;
};
auto bound_eig = [&](auto &eig) {
const auto zero = std::exp(std::numeric_limits<double>::min_exponent);
const auto large = std::exp(std::numeric_limits<double>::max_exponent);
for (int ii = 0; ii != 3; ++ii) {
eig(ii) = std::min(std::max(zero, eig(ii)), large);
}
};
auto calculate_log_stretch = [&]() {
eigen_vec(i, j) = t_log_u(i, j);
if (computeEigenValuesSymmetric(eigen_vec, eig) != MB_SUCCESS) {
MOFEM_LOG("SELF", Sev::error) << "Failed to compute eigen values";
}
// CHKERR bound_eig(eig);
// rare case when two eigen values are equal
t_nb_uniq = get_uniq_nb<3>(&eig(0));
if (t_nb_uniq < 3) {
sort_eigen_vals(eig, eigen_vec);
}
t_eigen_vals(i) = eig(i);
t_eigen_vecs(i, j) = eigen_vec(i, j);
t_u(i, j) =
EigenMatrix::getMat(t_eigen_vals, t_eigen_vecs, EshelbianCore::f)(i, j);
auto get_t_diff_u = [&]() {
return EigenMatrix::getDiffMat(t_eigen_vals, t_eigen_vecs,
t_nb_uniq);
};
t_diff_u(i, j, k, l) = get_t_diff_u()(i, j, k, l);
t_Ldiff_u(i, j, L) = t_diff_u(i, j, m, n) * t_L(m, n, L);
return t_Ldiff_u;
};
auto calculate_total_stretch = [&](auto &t_h1) {
t_log_u2_h1(i, j) = 0;
t_log_stretch_total(i, j) = t_log_u(i, j);
t_R_h1(i, j) = t_kd(i, j);
t_inv_u_h1(i, j) = t_symm_kd(i, j);
return std::make_pair(t_R_h1, t_inv_u_h1);
} else {
t_C_h1(i, j) = t_h1(k, i) * t_h1(k, j);
eigen_vec(i, j) = t_C_h1(i, j);
if (computeEigenValuesSymmetric(eigen_vec, eig) != MB_SUCCESS) {
MOFEM_LOG("SELF", Sev::error) << "Failed to compute eigen values";
}
CHKERR bound_eig(eig);
}
t_log_u2_h1(i, j) =
t_log_stretch_total(i, j) = t_log_u2_h1(i, j) / 2 + t_log_u(i, j);
auto f_inv_sqrt = [](auto e) { return 1. / std::sqrt(e); };
t_inv_u_h1(i, j) = EigenMatrix::getMat(eig, eigen_vec, f_inv_sqrt)(i, j);
t_R_h1(i, j) = t_h1(i, o) * t_inv_u_h1(o, j);
return std::make_pair(t_R_h1, t_inv_u_h1);
}
};
auto no_h1_loop = [&]() {
case LARGE_ROT:
break;
case SMALL_ROT:
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"rotSelector should be large");
};
for (int gg = 0; gg != nb_integration_pts; ++gg) {
t_h1(i, j) = t_kd(i, j);
// calculate streach
auto t_Ldiff_u = calculate_log_stretch();
// calculate total stretch
auto [t_R_h1, t_inv_u_h1] = calculate_total_stretch(t_h1);
// rotation
case LARGE_ROT:
t_R(i, j) = LieGroups::SO3::exp(t_omega, t_omega.l2())(i, j);
t_diff_R(i, j, k) =
LieGroups::SO3::diffExp(t_omega, t_omega.l2())(i, j, k);
// left
t_diff_Rr(i, j, l) = t_R(i, k) * levi_civita(k, j, l);
t_diff_diff_Rr(i, j, l, m) = t_diff_R(i, k, m) * levi_civita(k, j, l);
// right
t_diff_Rl(i, j, l) = levi_civita(i, k, l) * t_R(k, j);
t_diff_diff_Rl(i, j, l, m) = levi_civita(i, k, l) * t_diff_R(k, j, m);
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"rotationSelector not handled");
}
constexpr double half_r = 1 / 2.;
constexpr double half_l = 1 / 2.;
// calculate gradient
t_h(i, k) = t_R(i, l) * t_u(l, k);
// Adjoint stress
t_approx_P_adjoint_dstretch(l, k) =
(t_R(i, l) * t_approx_P(i, k) + t_R(i, k) * t_approx_P(i, l));
t_approx_P_adjoint_dstretch(l, k) /= 2.;
t_approx_P_adjoint_log_du(L) =
t_approx_P_adjoint_dstretch(l, k) * t_Ldiff_u(l, k, L);
// Kirchhoff stress
t_levi_kirchhoff(m) =
half_r * (t_diff_Rr(i, l, m) * (t_u(l, k) * t_approx_P(i, k)) +
t_diff_Rr(i, k, m) * (t_u(l, k) * t_approx_P(i, l)))
+
half_l * (t_diff_Rl(i, l, m) * (t_u(l, k) * t_approx_P(i, k)) +
t_diff_Rl(i, k, m) * (t_u(l, k) * t_approx_P(i, l)));
t_levi_kirchhoff(m) /= 2.;
t_h_domega(i, k, m) = half_r * (t_diff_Rr(i, l, m) * t_u(l, k))
+
half_l * (t_diff_Rl(i, l, m) * t_u(l, k));
} else {
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"symmetrySelector not handled");
}
t_h_dlog_u(i, k, L) = t_R(i, l) * t_Ldiff_u(l, k, L);
t_approx_P_adjoint_log_du_dP(i, k, L) = t_R(i, l) * t_Ldiff_u(l, k, L);
t_A(k, l, m) = t_diff_Rr(i, l, m) * t_approx_P(i, k) +
t_diff_Rr(i, k, m) * t_approx_P(i, l);
t_A(k, l, m) /= 2.;
t_B(k, l, m) = t_diff_Rl(i, l, m) * t_approx_P(i, k) +
t_diff_Rl(i, k, m) * t_approx_P(i, l);
t_B(k, l, m) /= 2.;
t_approx_P_adjoint_log_du_domega(m, L) =
half_r * (t_A(k, l, m) * t_Ldiff_u(k, l, L)) +
half_l * (t_B(k, l, m) * t_Ldiff_u(k, l, L));
t_levi_kirchhoff_domega(m, n) =
half_r *
(t_diff_diff_Rr(i, l, m, n) * (t_u(l, k) * t_approx_P(i, k)) +
t_diff_diff_Rr(i, k, m, n) * (t_u(l, k) * t_approx_P(i, l)))
+
half_l *
(t_diff_diff_Rl(i, l, m, n) * (t_u(l, k) * t_approx_P(i, k)) +
t_diff_diff_Rl(i, k, m, n) * (t_u(l, k) * t_approx_P(i, l)));
t_levi_kirchhoff_domega(m, n) /= 2.;
}
next();
}
};
auto large_loop = [&]() {
case LARGE_ROT:
break;
case SMALL_ROT:
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"rotSelector should be large");
};
for (int gg = 0; gg != nb_integration_pts; ++gg) {
t_h1(i, j) = t_kd(i, j);
break;
case LARGE_ROT:
t_h1(i, j) = t_grad_h1(i, j) + t_kd(i, j);
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"gradApproximator not handled");
};
// calculate streach
auto t_Ldiff_u = calculate_log_stretch();
// calculate total stretch
auto [t_R_h1, t_inv_u_h1] = calculate_total_stretch(t_h1);
t_h_u(l, k) = t_u(l, o) * t_h1(o, k);
t_Ldiff_h_u(l, k, L) = t_Ldiff_u(l, o, L) * t_h1(o, k);
// rotation
case LARGE_ROT:
t_R(i, j) = LieGroups::SO3::exp(t_omega, t_omega.l2())(i, j);
t_diff_R(i, j, k) =
LieGroups::SO3::diffExp(t_omega, t_omega.l2())(i, j, k);
// left
t_diff_Rr(i, j, l) = t_R(i, k) * levi_civita(k, j, l);
t_diff_diff_Rr(i, j, l, m) = t_diff_R(i, k, m) * levi_civita(k, j, l);
// right
t_diff_Rl(i, j, l) = levi_civita(i, k, l) * t_R(k, j);
t_diff_diff_Rl(i, j, l, m) = levi_civita(i, k, l) * t_diff_R(k, j, m);
break;
case SMALL_ROT:
t_R(i, k) = t_kd(i, k) + levi_civita(i, k, l) * t_omega(l);
t_diff_R(i, j, k) = levi_civita(i, j, k);
// left
t_diff_Rr(i, j, l) = levi_civita(i, j, l);
t_diff_diff_Rr(i, j, l, m) = 0;
// right
t_diff_Rl(i, j, l) = levi_civita(i, j, l);
t_diff_diff_Rl(i, j, l, m) = 0;
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"rotationSelector not handled");
}
constexpr double half_r = 1 / 2.;
constexpr double half_l = 1 / 2.;
// calculate gradient
t_h(i, k) = t_R(i, l) * t_h_u(l, k);
// Adjoint stress
t_approx_P_adjoint_dstretch(l, o) =
(t_R(i, l) * t_approx_P(i, k)) * t_h1(o, k);
t_approx_P_adjoint_log_du(L) =
t_approx_P_adjoint_dstretch(l, o) * t_Ldiff_u(l, o, L);
// Kirchhoff stress
t_levi_kirchhoff(m) =
half_r * ((t_diff_Rr(i, l, m) * (t_h_u(l, k))*t_approx_P(i, k)))
+
half_l * ((t_diff_Rl(i, l, m) * (t_h_u(l, k))*t_approx_P(i, k)));
t_h_domega(i, k, m) = half_r * (t_diff_Rr(i, l, m) * t_h_u(l, k))
+
half_l * (t_diff_Rl(i, l, m) * t_h_u(l, k));
} else {
t_h_domega(i, k, m) = t_diff_R(i, l, m) * t_h_u(l, k);
}
t_h_dlog_u(i, k, L) = t_R(i, l) * t_Ldiff_h_u(l, k, L);
t_approx_P_adjoint_log_du_dP(i, k, L) =
t_R(i, l) * t_Ldiff_h_u(l, k, L);
t_A(m, L, i, k) = t_diff_Rr(i, l, m) * t_Ldiff_h_u(l, k, L);
t_B(m, L, i, k) = t_diff_Rl(i, l, m) * t_Ldiff_h_u(l, k, L);
t_approx_P_adjoint_log_du_domega(m, L) =
half_r * (t_A(m, L, i, k) * t_approx_P(i, k))
+
half_l * (t_B(m, L, i, k) * t_approx_P(i, k));
} else {
t_A(m, L, i, k) = t_diff_R(i, l, m) * t_Ldiff_h_u(l, k, L);
t_approx_P_adjoint_log_du_domega(m, L) =
t_A(m, L, i, k) * t_approx_P(i, k);
}
t_levi_kirchhoff_dstreach(m, L) =
half_r *
(t_diff_Rr(i, l, m) * (t_Ldiff_h_u(l, k, L) * t_approx_P(i, k)))
+
half_l * (t_diff_Rl(i, l, m) *
(t_Ldiff_h_u(l, k, L) * t_approx_P(i, k)));
t_levi_kirchhoff_dP(m, i, k) =
half_r * (t_diff_Rr(i, l, m) * t_h_u(l, k))
+
half_l * (t_diff_Rl(i, l, m) * t_h_u(l, k));
t_levi_kirchhoff_domega(m, n) =
half_r *
(t_diff_diff_Rr(i, l, m, n) * (t_h_u(l, k) * t_approx_P(i, k)))
+
half_l *
(t_diff_diff_Rl(i, l, m, n) * (t_h_u(l, k) * t_approx_P(i, k)));
}
next();
}
};
auto moderate_loop = [&]() {
case LARGE_ROT:
break;
case SMALL_ROT:
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"rotSelector should be large");
};
for (int gg = 0; gg != nb_integration_pts; ++gg) {
t_h1(i, j) = t_grad_h1(i, j) + t_kd(i, j);
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"gradApproximator not handled");
};
// calculate streach
auto t_Ldiff_u = calculate_log_stretch();
// calculate total stretch
auto [t_R_h1, t_inv_u_h1] = calculate_total_stretch(t_h1);
t_h_u(l, k) = (t_symm_kd(l, o) + t_log_u(l, o)) * t_h1(o, k);
t_L_h(l, k, L) = t_L(l, o, L) * t_h1(o, k);
// rotation
case LARGE_ROT:
t_R(i, j) = LieGroups::SO3::exp(t_omega, t_omega.l2())(i, j);
t_diff_R(i, j, k) =
LieGroups::SO3::diffExp(t_omega, t_omega.l2())(i, j, k);
// left
t_diff_Rr(i, j, l) = t_R(i, k) * levi_civita(k, j, l);
t_diff_diff_Rr(i, j, l, m) = t_diff_R(i, k, m) * levi_civita(k, j, l);
// right
t_diff_Rl(i, j, l) = levi_civita(i, k, l) * t_R(k, j);
t_diff_diff_Rl(i, j, l, m) = levi_civita(i, k, l) * t_diff_R(k, j, m);
break;
case SMALL_ROT:
t_R(i, k) = t_kd(i, k) + levi_civita(i, k, l) * t_omega(l);
t_diff_R(i, j, l) = levi_civita(i, j, l);
// left
t_diff_Rr(i, j, l) = levi_civita(i, j, l);
t_diff_diff_Rr(i, j, l, m) = 0;
// right
t_diff_Rl(i, j, l) = levi_civita(i, j, l);
t_diff_diff_Rl(i, j, l, m) = 0;
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"rotationSelector not handled");
}
constexpr double half_r = 1 / 2.;
constexpr double half_l = 1 / 2.;
// calculate gradient
t_h(i, k) = t_R(i, l) * t_h_u(l, k);
// Adjoint stress
t_approx_P_adjoint_dstretch(l, o) =
(t_R(i, l) * t_approx_P(i, k)) * t_h1(o, k);
t_approx_P_adjoint_log_du(L) =
t_approx_P_adjoint_dstretch(l, o) * t_L(l, o, L);
// Kirchhoff stress
t_levi_kirchhoff(m) =
half_r * ((t_diff_Rr(i, l, m) * (t_h_u(l, k))*t_approx_P(i, k)))
+
half_l * ((t_diff_Rl(i, l, m) * (t_h_u(l, k))*t_approx_P(i, k)));
t_h_domega(i, k, m) = half_r * (t_diff_Rr(i, l, m) * t_h_u(l, k))
+
half_l * (t_diff_Rl(i, l, m) * t_h_u(l, k));
} else {
t_h_domega(i, k, m) = t_diff_R(i, l, m) * t_h_u(l, k);
}
t_h_dlog_u(i, k, L) = t_R(i, l) * t_L_h(l, k, L);
t_approx_P_adjoint_log_du_dP(i, k, L) = t_R(i, l) * t_L_h(l, k, L);
t_A(m, L, i, k) = t_diff_Rr(i, l, m) * t_L_h(l, k, L);
t_B(m, L, i, k) = t_diff_Rl(i, l, m) * t_L_h(l, k, L);
t_approx_P_adjoint_log_du_domega(m, L) =
half_r * (t_A(m, L, i, k) * t_approx_P(i, k))
+
half_l * (t_B(m, L, i, k) * t_approx_P(i, k));
} else {
t_A(m, L, i, k) = t_diff_R(i, l, m) * t_L_h(l, k, L);
t_approx_P_adjoint_log_du_domega(m, L) =
t_A(m, L, i, k) * t_approx_P(i, k);
}
t_levi_kirchhoff_dstreach(m, L) =
half_r * (t_diff_Rr(i, l, m) * (t_L_h(l, k, L) * t_approx_P(i, k)))
+
half_l * (t_diff_Rl(i, l, m) * (t_L_h(l, k, L) * t_approx_P(i, k)));
t_levi_kirchhoff_dP(m, i, k) =
half_r * (t_diff_Rr(i, l, m) * t_h_u(l, k))
+
half_l * (t_diff_Rl(i, l, m) * t_h_u(l, k));
t_levi_kirchhoff_domega(m, n) =
half_r *
(t_diff_diff_Rr(i, l, m, n) * (t_h_u(l, k) * t_approx_P(i, k)))
+
half_l *
(t_diff_diff_Rl(i, l, m, n) * (t_h_u(l, k) * t_approx_P(i, k)));
}
next();
}
};
auto small_loop = [&]() {
case SMALL_ROT:
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"rotSelector should be small");
};
for (int gg = 0; gg != nb_integration_pts; ++gg) {
case SMALL_ROT:
t_h1(i, j) = t_kd(i, j);
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"gradApproximator not handled");
};
// calculate streach
t_Ldiff_u(i, j, L) = calculate_log_stretch()(i, j, L);
} else {
t_u(i, j) = t_symm_kd(i, j) + t_log_u(i, j);
t_Ldiff_u(i, j, L) = t_L(i, j, L);
}
t_log_u2_h1(i, j) = 0;
t_log_stretch_total(i, j) = t_log_u(i, j);
t_h(i, j) = levi_civita(i, j, k) * t_omega(k) + t_u(i, j);
t_h_domega(i, j, k) = levi_civita(i, j, k);
t_h_dlog_u(i, j, L) = t_Ldiff_u(i, j, L);
// Adjoint stress
t_approx_P_adjoint_dstretch(i, j) = t_approx_P(i, j);
t_approx_P_adjoint_log_du(L) =
t_approx_P_adjoint_dstretch(i, j) * t_Ldiff_u(i, j, L);
t_approx_P_adjoint_log_du_dP(i, j, L) = t_Ldiff_u(i, j, L);
t_approx_P_adjoint_log_du_domega(m, L) = 0;
// Kirchhoff stress
t_levi_kirchhoff(k) = levi_civita(i, j, k) * t_approx_P(i, j);
t_levi_kirchhoff_dstreach(m, L) = 0;
t_levi_kirchhoff_dP(k, i, j) = levi_civita(i, j, k);
t_levi_kirchhoff_domega(m, n) = 0;
next();
}
};
CHKERR no_h1_loop();
break;
case LARGE_ROT:
CHKERR large_loop();
break;
CHKERR moderate_loop();
break;
case SMALL_ROT:
CHKERR small_loop();
break;
default:
SETERRQ(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"gradApproximator not handled");
break;
};
}
EntData &data) {
auto n_total_side_eles = getLoopSize();
auto N_InLoop = getNinTheLoop();
auto sensee = getSkeletonSense();
auto nb_gauss_pts = getGaussPts().size2();
auto t_normal = getFTensor1NormalsAtGaussPts();
auto t_sigma_ptr =
getFTensor2FromMat<SPACE_DIM, SPACE_DIM>(dataAtPts->approxPAtPts);
if (N_InLoop == 0) {
dataAtPts->tractionAtPts.resize(SPACE_DIM, nb_gauss_pts, false);
dataAtPts->tractionAtPts.clear();
}
auto t_traction = getFTensor1FromMat<SPACE_DIM>(dataAtPts->tractionAtPts);
for (int gg = 0; gg != nb_gauss_pts; gg++) {
t_traction(i) = t_sigma_ptr(i, j) * sensee * (t_normal(j) / t_normal.l2());
++t_traction;
++t_sigma_ptr;
++t_normal;
}
}
EntData &data) {
if (blockEntities.find(getFEEntityHandle()) == blockEntities.end()) {
};
int nb_integration_pts = getGaussPts().size2();
auto t_w = getFTensor0IntegrationWeight();
auto t_traction = getFTensor1FromMat<SPACE_DIM>(dataAtPts->tractionAtPts);
auto t_coords = getFTensor1CoordsAtGaussPts();
auto t_spatial_disp = getFTensor1FromMat<SPACE_DIM>(dataAtPts->wL2AtPts);
FTensor::Tensor1<double, 3> t_coords_spatial{0., 0., 0.};
// Offset for center of mass. Can be added in the future.
FTensor::Tensor1<double, 3> t_off{0.0, 0.0, 0.0};
FTensor::Tensor1<double, 3> loc_reaction_forces{0., 0., 0.};
FTensor::Tensor1<double, 3> loc_moment_forces{0., 0., 0.};
for (auto gg = 0; gg != nb_integration_pts; ++gg) {
loc_reaction_forces(i) += (t_traction(i))*t_w * getMeasure();
t_coords_spatial(i) = t_coords(i) + t_spatial_disp(i);
// t_coords_spatial(i) -= t_off(i);
loc_moment_forces(i) +=
(FTensor::levi_civita<double>(i, j, k) * t_coords_spatial(j)) *
t_traction(k) * t_w * getMeasure();
++t_coords;
++t_spatial_disp;
++t_w;
++t_traction;
}
reactionVec[0] += loc_reaction_forces(0);
reactionVec[1] += loc_reaction_forces(1);
reactionVec[2] += loc_reaction_forces(2);
reactionVec[3] += loc_moment_forces(0);
reactionVec[4] += loc_moment_forces(1);
reactionVec[5] += loc_moment_forces(2);
}
int nb_dofs = data.getIndices().size();
int nb_integration_pts = data.getN().size1();
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
auto t_div_P = getFTensor1FromMat<3>(dataAtPts->divPAtPts);
auto t_s_dot_w = getFTensor1FromMat<3>(dataAtPts->wL2DotAtPts);
if (dataAtPts->wL2DotDotAtPts.size1() == 0 &&
dataAtPts->wL2DotDotAtPts.size2() != nb_integration_pts) {
dataAtPts->wL2DotDotAtPts.resize(3, nb_integration_pts);
dataAtPts->wL2DotDotAtPts.clear();
}
auto t_s_dot_dot_w = getFTensor1FromMat<3>(dataAtPts->wL2DotDotAtPts);
auto piola_scale = dataAtPts->piolaScale;
auto alpha_w = alphaW / piola_scale;
auto alpha_rho = alphaRho / piola_scale;
int nb_base_functions = data.getN().size2();
auto t_row_base_fun = data.getFTensor0N();
auto get_ftensor1 = [](auto &v) {
&v[2]);
};
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
auto t_nf = get_ftensor1(nF);
int bb = 0;
for (; bb != nb_dofs / 3; ++bb) {
t_nf(i) -= a * t_row_base_fun * t_div_P(i);
t_nf(i) += a * t_row_base_fun * alpha_w * t_s_dot_w(i);
t_nf(i) += a * t_row_base_fun * alpha_rho * t_s_dot_dot_w(i);
++t_nf;
++t_row_base_fun;
}
for (; bb != nb_base_functions; ++bb)
++t_row_base_fun;
++t_w;
++t_div_P;
++t_s_dot_w;
++t_s_dot_dot_w;
}
}
int nb_dofs = data.getIndices().size();
int nb_integration_pts = getGaussPts().size2();
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
auto t_levi_kirchhoff = getFTensor1FromMat<3>(dataAtPts->leviKirchhoffAtPts);
auto t_omega_grad_dot =
getFTensor2FromMat<3, 3>(dataAtPts->rotAxisGradDotAtPts);
int nb_base_functions = data.getN().size2();
auto t_row_base_fun = data.getFTensor0N();
auto t_row_grad_fun = data.getFTensor1DiffN<3>();
auto get_ftensor1 = [](auto &v) {
&v[2]);
};
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
auto t_nf = get_ftensor1(nF);
int bb = 0;
for (; bb != nb_dofs / 3; ++bb) {
t_nf(k) -= (a * t_row_base_fun) * t_levi_kirchhoff(k);
t_nf(k) +=
(a * alphaOmega) * (t_row_grad_fun(i) * t_omega_grad_dot(k, i));
++t_nf;
++t_row_base_fun;
++t_row_grad_fun;
}
for (; bb != nb_base_functions; ++bb) {
++t_row_base_fun;
++t_row_grad_fun;
}
++t_w;
++t_levi_kirchhoff;
++t_omega_grad_dot;
}
}
int nb_dofs = data.getIndices().size();
int nb_integration_pts = data.getN().size1();
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
int nb_base_functions = data.getN().size2() / 3;
auto t_row_base_fun = data.getFTensor1N<3>();
auto get_ftensor1 = [](auto &v) {
&v[2]);
};
auto t_R = getFTensor2FromMat<3, 3>(dataAtPts->rotMatAtPts);
auto t_u = getFTensor2SymmetricFromMat<3>(dataAtPts->stretchTensorAtPts);
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
auto t_nf = get_ftensor1(nF);
int bb = 0;
for (; bb != nb_dofs / 3; ++bb) {
t_nf(i) -= a * (t_row_base_fun(k) * (t_R(i, l) * t_u(l, k)) / 2);
t_nf(i) -= a * (t_row_base_fun(l) * (t_R(i, k) * t_u(l, k)) / 2);
t_nf(i) += a * (t_row_base_fun(j) * t_kd(i, j));
++t_nf;
++t_row_base_fun;
}
for (; bb != nb_base_functions; ++bb)
++t_row_base_fun;
++t_w;
++t_R;
++t_u;
}
} else {
auto t_h = getFTensor2FromMat<3, 3>(dataAtPts->hAtPts);
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
auto t_nf = get_ftensor1(nF);
t_residuum(i, j) = t_h(i, j) - t_kd(i, j);
int bb = 0;
for (; bb != nb_dofs / 3; ++bb) {
t_nf(i) -= a * t_row_base_fun(j) * t_residuum(i, j);
++t_nf;
++t_row_base_fun;
}
for (; bb != nb_base_functions; ++bb)
++t_row_base_fun;
++t_w;
++t_h;
}
}
}
int nb_dofs = data.getIndices().size();
int nb_integration_pts = data.getN().size1();
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
int nb_base_functions = data.getN().size2() / 9;
auto t_row_base_fun = data.getFTensor2N<3, 3>();
auto get_ftensor0 = [](auto &v) {
};
auto t_R = getFTensor2FromMat<3, 3>(dataAtPts->rotMatAtPts);
auto t_u = getFTensor2SymmetricFromMat<3>(dataAtPts->stretchTensorAtPts);
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
auto t_nf = get_ftensor0(nF);
int bb = 0;
for (; bb != nb_dofs; ++bb) {
t_nf -= a * t_row_base_fun(i, k) * (t_R(i, l) * t_u(l, k)) / 2;
t_nf -= a * t_row_base_fun(i, l) * (t_R(i, k) * t_u(l, k)) / 2;
++t_nf;
++t_row_base_fun;
}
for (; bb != nb_base_functions; ++bb) {
++t_row_base_fun;
}
++t_w;
++t_R;
++t_u;
}
} else {
auto t_h = getFTensor2FromMat<3, 3>(dataAtPts->hAtPts);
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
auto t_nf = get_ftensor0(nF);
t_residuum(i, j) = t_h(i, j);
int bb = 0;
for (; bb != nb_dofs; ++bb) {
t_nf -= a * t_row_base_fun(i, j) * t_residuum(i, j);
++t_nf;
++t_row_base_fun;
}
for (; bb != nb_base_functions; ++bb) {
++t_row_base_fun;
}
++t_w;
++t_h;
}
}
}
int nb_dofs = data.getIndices().size();
int nb_integration_pts = data.getN().size1();
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
auto t_w_l2 = getFTensor1FromMat<3>(dataAtPts->wL2AtPts);
int nb_base_functions = data.getN().size2() / 3;
auto t_row_diff_base_fun = data.getFTensor2DiffN<3, 3>();
auto get_ftensor1 = [](auto &v) {
&v[2]);
};
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
auto t_nf = get_ftensor1(nF);
int bb = 0;
for (; bb != nb_dofs / 3; ++bb) {
double div_row_base = t_row_diff_base_fun(i, i);
t_nf(i) -= a * div_row_base * t_w_l2(i);
++t_nf;
++t_row_diff_base_fun;
}
for (; bb != nb_base_functions; ++bb) {
++t_row_diff_base_fun;
}
++t_w;
++t_w_l2;
}
}
template <AssemblyType A>
// get entity of face
EntityHandle fe_ent = OP::getFEEntityHandle();
// iterate over all boundary data
for (auto &bc : (*bcDispPtr)) {
// check if finite element entity is part of boundary condition
if (bc.faces.find(fe_ent) != bc.faces.end()) {
int nb_dofs = data.getIndices().size();
int nb_integration_pts = OP::getGaussPts().size2();
auto t_normal = OP::getFTensor1NormalsAtGaussPts();
auto t_w = OP::getFTensor0IntegrationWeight();
int nb_base_functions = data.getN().size2() / 3;
auto t_row_base_fun = data.getFTensor1N<3>();
double scale = 1;
for (auto &sm : scalingMethodsVec) {
} else {
scale *= sm->getScale(OP::getFEMethod()->ts_t);
}
}
// get bc data
FTensor::Tensor1<double, 3> t_bc_disp(bc.vals[0], bc.vals[1], bc.vals[2]);
t_bc_disp(i) *= scale;
for (int gg = 0; gg != nb_integration_pts; ++gg) {
auto t_nf = getFTensor1FromPtr<3>(&*OP::locF.begin());
int bb = 0;
for (; bb != nb_dofs / SPACE_DIM; ++bb) {
t_nf(i) +=
t_w * (t_row_base_fun(j) * t_normal(j)) * t_bc_disp(i) * 0.5;
++t_nf;
++t_row_base_fun;
}
for (; bb != nb_base_functions; ++bb)
++t_row_base_fun;
++t_w;
++t_normal;
}
}
}
}
return OP::iNtegrate(data);
}
template <AssemblyType A>
// get entity of face
EntityHandle fe_ent = OP::getFEEntityHandle();
// interate over all boundary data
for (auto &bc : (*bcRotPtr)) {
// check if finite element entity is part of boundary condition
if (bc.faces.find(fe_ent) != bc.faces.end()) {
int nb_dofs = data.getIndices().size();
int nb_integration_pts = OP::getGaussPts().size2();
auto t_normal = OP::getFTensor1NormalsAtGaussPts();
auto t_w = OP::getFTensor0IntegrationWeight();
int nb_base_functions = data.getN().size2() / 3;
auto t_row_base_fun = data.getFTensor1N<3>();
auto get_ftensor1 = [](auto &v) {
&v[2]);
};
// get bc data
FTensor::Tensor1<double, 3> t_center(bc.vals[0], bc.vals[1], bc.vals[2]);
double theta = bc.theta;
} else {
theta *= OP::getFEMethod()->ts_t;
}
const double a = sqrt(t_normal(i) * t_normal(i));
t_omega(i) = t_normal(i) * (theta / a);
? 0.
: t_omega.l2());
auto t_coords = OP::getFTensor1CoordsAtGaussPts();
for (int gg = 0; gg != nb_integration_pts; ++gg) {
t_delta(i) = t_center(i) - t_coords(i);
t_disp(i) = t_delta(i) - t_R(i, j) * t_delta(j);
auto t_nf = getFTensor1FromPtr<3>(&*OP::locF.begin());
int bb = 0;
for (; bb != nb_dofs / 3; ++bb) {
t_nf(i) += t_w * (t_row_base_fun(j) * t_normal(j)) * t_disp(i) * 0.5;
++t_nf;
++t_row_base_fun;
}
for (; bb != nb_base_functions; ++bb)
++t_row_base_fun;
++t_w;
++t_normal;
++t_coords;
}
}
}
}
return OP::iNtegrate(data);
}
int nb_dofs = data.getFieldData().size();
int nb_integration_pts = getGaussPts().size2();
int nb_base_functions = data.getN().size2();
double ts_t = getFEMethod()->ts_t;
}
double time_scale = 1;
for (auto &sm : scalingMethodsVec) {
time_scale *= sm->getScale(ts_t);
}
#ifndef NDEBUG
if (this->locF.size() != nb_dofs)
SETERRQ2(PETSC_COMM_SELF, MOFEM_DATA_INCONSISTENCY,
"Size of locF %d != nb_dofs %d", this->locF.size(), nb_dofs);
#endif // NDEBUG
auto integrate_rhs = [&](auto &bc, auto calc_tau) {
auto t_val = getFTensor1FromPtr<3>(&*bc.vals.begin());
auto t_row_base = data.getFTensor0N();
auto t_w = getFTensor0IntegrationWeight();
auto t_coords = getFTensor1CoordsAtGaussPts();
double scale = (piolaScalePtr) ? 1. / (*piolaScalePtr) : 1.0;
for (int gg = 0; gg != nb_integration_pts; ++gg) {
const auto tau = calc_tau(t_coords(0), t_coords(1), t_coords(2));
auto t_f = getFTensor1FromPtr<3>(&*this->locF.begin());
int rr = 0;
for (; rr != nb_dofs / SPACE_DIM; ++rr) {
t_f(i) -= time_scale * t_w * t_row_base * tau * (t_val(i) * scale);
++t_row_base;
++t_f;
}
for (; rr != nb_base_functions; ++rr)
++t_row_base;
++t_w;
++t_coords;
}
// Multiply by 2 since we integrate on triangle, and hybrid constrain is
// multiplied by norm.
this->locF *= 2. * getMeasure();
};
// get entity of face
EntityHandle fe_ent = getFEEntityHandle();
for (auto &bc : *(bcData)) {
if (bc.faces.find(fe_ent) != bc.faces.end()) {
int nb_dofs = data.getFieldData().size();
if (nb_dofs) {
if (std::regex_match(bc.blockName, std::regex(".*COOK.*"))) {
auto calc_tau = [](double, double y, double) {
y -= 44;
y /= (60 - 44);
return -y * (y - 1) / 0.25;
};
CHKERR integrate_rhs(bc, calc_tau);
} else {
CHKERR integrate_rhs(bc, [](double, double, double) { return 1; });
}
}
}
}
}
EntData &col_data) {
int nb_integration_pts = row_data.getN().size1();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto get_ftensor1 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c + 0), &m(r + 1, c + 1), &m(r + 2, c + 2));
};
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
int row_nb_base_functions = row_data.getN().size2();
auto t_row_base_fun = row_data.getFTensor0N();
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs / 3; ++rr) {
auto t_col_diff_base_fun = col_data.getFTensor2DiffN<3, 3>(gg, 0);
auto t_m = get_ftensor1(K, 3 * rr, 0);
for (int cc = 0; cc != col_nb_dofs / 3; ++cc) {
double div_col_base = t_col_diff_base_fun(i, i);
t_m(i) -= a * t_row_base_fun * div_col_base;
++t_m;
++t_col_diff_base_fun;
}
++t_row_base_fun;
}
for (; rr != row_nb_base_functions; ++rr)
++t_row_base_fun;
++t_w;
}
}
EntData &col_data) {
if (alphaW < std::numeric_limits<double>::epsilon() &&
alphaRho < std::numeric_limits<double>::epsilon())
const int nb_integration_pts = row_data.getN().size1();
const int row_nb_dofs = row_data.getIndices().size();
auto get_ftensor1 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c + 0), &m(r + 1, c + 1), &m(r + 2, c + 2)
);
};
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
auto piola_scale = dataAtPts->piolaScale;
auto alpha_w = alphaW / piola_scale;
auto alpha_rho = alphaRho / piola_scale;
int row_nb_base_functions = row_data.getN().size2();
auto t_row_base_fun = row_data.getFTensor0N();
double ts_scale = alpha_w * getTSa();
if (std::abs(alphaRho) > std::numeric_limits<double>::epsilon())
ts_scale += alpha_rho * getTSaa();
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w * ts_scale;
int rr = 0;
for (; rr != row_nb_dofs / 3; ++rr) {
auto t_col_base_fun = row_data.getFTensor0N(gg, 0);
auto t_m = get_ftensor1(K, 3 * rr, 0);
for (int cc = 0; cc != row_nb_dofs / 3; ++cc) {
const double b = a * t_row_base_fun * t_col_base_fun;
t_m(i) += b;
++t_m;
++t_col_base_fun;
}
++t_row_base_fun;
}
for (; rr != row_nb_base_functions; ++rr)
++t_row_base_fun;
++t_w;
}
}
EntData &col_data) {
int nb_integration_pts = row_data.getN().size1();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto get_ftensor3 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c + 0), &m(r + 0, c + 1), &m(r + 0, c + 2),
&m(r + 1, c + 0), &m(r + 1, c + 1), &m(r + 1, c + 2),
&m(r + 2, c + 0), &m(r + 2, c + 1), &m(r + 2, c + 2),
&m(r + 3, c + 0), &m(r + 3, c + 1), &m(r + 3, c + 2),
&m(r + 4, c + 0), &m(r + 4, c + 1), &m(r + 4, c + 2),
&m(r + 5, c + 0), &m(r + 5, c + 1), &m(r + 5, c + 2));
};
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
int row_nb_base_functions = row_data.getN().size2();
auto t_row_base_fun = row_data.getFTensor0N();
auto t_approx_P_adjoint_log_du_dP =
getFTensor3FromMat<3, 3, size_symm>(dataAtPts->adjointPdUdPAtPts);
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs / 6; ++rr) {
auto t_col_base_fun = col_data.getFTensor1N<3>(gg, 0);
auto t_m = get_ftensor3(K, 6 * rr, 0);
for (int cc = 0; cc != col_nb_dofs / 3; ++cc) {
t_m(L, i) -=
a * (t_approx_P_adjoint_log_du_dP(i, j, L) * t_col_base_fun(j)) *
t_row_base_fun;
++t_col_base_fun;
++t_m;
}
++t_row_base_fun;
}
for (; rr != row_nb_base_functions; ++rr)
++t_row_base_fun;
++t_w;
++t_approx_P_adjoint_log_du_dP;
}
}
EntData &col_data) {
int nb_integration_pts = row_data.getN().size1();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto get_ftensor2 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c), &m(r + 1, c), &m(r + 2, c), &m(r + 3, c), &m(r + 4, c),
&m(r + 5, c));
};
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
auto t_row_base_fun = row_data.getFTensor0N();
int row_nb_base_functions = row_data.getN().size2();
auto t_approx_P_adjoint_log_du_dP =
getFTensor3FromMat<3, 3, size_symm>(dataAtPts->adjointPdUdPAtPts);
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs / 6; ++rr) {
auto t_m = get_ftensor2(K, 6 * rr, 0);
auto t_col_base_fun = col_data.getFTensor2N<3, 3>(gg, 0);
for (int cc = 0; cc != col_nb_dofs; ++cc) {
t_m(L) -=
a * (t_approx_P_adjoint_log_du_dP(i, j, L) * t_col_base_fun(i, j)) *
t_row_base_fun;
++t_m;
++t_col_base_fun;
}
++t_row_base_fun;
}
for (; rr != row_nb_base_functions; ++rr)
++t_row_base_fun;
++t_w;
++t_approx_P_adjoint_log_du_dP;
}
}
EntData &col_data) {
auto t_L = symm_L_tensor();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto get_ftensor3 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c + 0), &m(r + 0, c + 1), &m(r + 0, c + 2),
&m(r + 1, c + 0), &m(r + 1, c + 1), &m(r + 1, c + 2),
&m(r + 2, c + 0), &m(r + 2, c + 1), &m(r + 2, c + 2),
&m(r + 3, c + 0), &m(r + 3, c + 1), &m(r + 3, c + 2),
&m(r + 4, c + 0), &m(r + 4, c + 1), &m(r + 4, c + 2),
&m(r + 5, c + 0), &m(r + 5, c + 1), &m(r + 5, c + 2)
);
};
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
auto t_approx_P_adjoint_log_du_domega =
getFTensor2FromMat<3, size_symm>(dataAtPts->adjointPdUdOmegaAtPts);
int row_nb_base_functions = row_data.getN().size2();
auto t_row_base_fun = row_data.getFTensor0N();
int nb_integration_pts = row_data.getN().size1();
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs / 6; ++rr) {
auto t_col_base_fun = col_data.getFTensor0N(gg, 0);
auto t_m = get_ftensor3(K, 6 * rr, 0);
for (int cc = 0; cc != col_nb_dofs / 3; ++cc) {
double v = a * t_row_base_fun * t_col_base_fun;
t_m(L, k) -= v * t_approx_P_adjoint_log_du_domega(k, L);
++t_m;
++t_col_base_fun;
}
++t_row_base_fun;
}
for (; rr != row_nb_base_functions; ++rr)
++t_row_base_fun;
++t_w;
++t_approx_P_adjoint_log_du_domega;
}
}
EntData &col_data) {
int nb_integration_pts = getGaussPts().size2();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto get_ftensor2 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c + 0), &m(r + 0, c + 1), &m(r + 0, c + 2), &m(r + 0, c + 3),
&m(r + 0, c + 4), &m(r + 0, c + 5),
&m(r + 1, c + 0), &m(r + 1, c + 1), &m(r + 1, c + 2), &m(r + 1, c + 3),
&m(r + 1, c + 4), &m(r + 1, c + 5),
&m(r + 2, c + 0), &m(r + 2, c + 1), &m(r + 2, c + 2), &m(r + 2, c + 3),
&m(r + 2, c + 4), &m(r + 2, c + 5)
};
};
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
auto t_levi_kirchhoff_du = getFTensor2FromMat<3, size_symm>(
dataAtPts->leviKirchhoffdLogStreatchAtPts);
int row_nb_base_functions = row_data.getN().size2();
auto t_row_base_fun = row_data.getFTensor0N();
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs / 3; ++rr) {
auto t_m = get_ftensor2(K, 3 * rr, 0);
const double b = a * t_row_base_fun;
auto t_col_base_fun = col_data.getFTensor0N(gg, 0);
for (int cc = 0; cc != col_nb_dofs / size_symm; ++cc) {
t_m(k, L) -= (b * t_col_base_fun) * t_levi_kirchhoff_du(k, L);
++t_m;
++t_col_base_fun;
}
++t_row_base_fun;
}
for (; rr != row_nb_base_functions; ++rr) {
++t_row_base_fun;
}
++t_w;
++t_levi_kirchhoff_du;
}
}
EntData &col_data) {
int nb_integration_pts = getGaussPts().size2();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto get_ftensor2 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c + 0), &m(r + 0, c + 1), &m(r + 0, c + 2),
&m(r + 1, c + 0), &m(r + 1, c + 1), &m(r + 1, c + 2),
&m(r + 2, c + 0), &m(r + 2, c + 1), &m(r + 2, c + 2)
);
};
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
int row_nb_base_functions = row_data.getN().size2();
auto t_row_base_fun = row_data.getFTensor0N();
auto t_levi_kirchhoff_dP =
getFTensor3FromMat<3, 3, 3>(dataAtPts->leviKirchhoffPAtPts);
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs / 3; ++rr) {
double b = a * t_row_base_fun;
auto t_col_base_fun = col_data.getFTensor1N<3>(gg, 0);
auto t_m = get_ftensor2(K, 3 * rr, 0);
for (int cc = 0; cc != col_nb_dofs / 3; ++cc) {
t_m(m, i) -= b * (t_levi_kirchhoff_dP(m, i, k) * t_col_base_fun(k));
++t_m;
++t_col_base_fun;
}
++t_row_base_fun;
}
for (; rr != row_nb_base_functions; ++rr) {
++t_row_base_fun;
}
++t_w;
++t_levi_kirchhoff_dP;
}
}
EntData &col_data) {
int nb_integration_pts = getGaussPts().size2();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto get_ftensor1 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c), &m(r + 1, c), &m(r + 2, c));
};
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
auto t_levi_kirchoff_dP =
getFTensor3FromMat<3, 3, 3>(dataAtPts->leviKirchhoffPAtPts);
int row_nb_base_functions = row_data.getN().size2();
auto t_row_base_fun = row_data.getFTensor0N();
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs / 3; ++rr) {
double b = a * t_row_base_fun;
auto t_col_base_fun = col_data.getFTensor2N<3, 3>(gg, 0);
auto t_m = get_ftensor1(K, 3 * rr, 0);
for (int cc = 0; cc != col_nb_dofs; ++cc) {
t_m(m) -= b * (t_levi_kirchoff_dP(m, i, k) * t_col_base_fun(i, k));
++t_m;
++t_col_base_fun;
}
++t_row_base_fun;
}
for (; rr != row_nb_base_functions; ++rr) {
++t_row_base_fun;
}
++t_w;
++t_levi_kirchoff_dP;
}
}
EntData &col_data) {
int nb_integration_pts = getGaussPts().size2();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto get_ftensor2 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c + 0), &m(r + 0, c + 1), &m(r + 0, c + 2),
&m(r + 1, c + 0), &m(r + 1, c + 1), &m(r + 1, c + 2),
&m(r + 2, c + 0), &m(r + 2, c + 1), &m(r + 2, c + 2)
);
};
auto v = getVolume();
auto ts_a = getTSa();
auto t_w = getFTensor0IntegrationWeight();
auto t_levi_kirchhoff_domega =
getFTensor2FromMat<3, 3>(dataAtPts->leviKirchhoffdOmegaAtPts);
int row_nb_base_functions = row_data.getN().size2();
auto t_row_base_fun = row_data.getFTensor0N();
auto t_row_grad_fun = row_data.getFTensor1DiffN<3>();
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
double c = a * alphaOmega * ts_a;
int rr = 0;
for (; rr != row_nb_dofs / 3; ++rr) {
auto t_m = get_ftensor2(K, 3 * rr, 0);
const double b = a * t_row_base_fun;
auto t_col_base_fun = col_data.getFTensor0N(gg, 0);
auto t_col_grad_fun = col_data.getFTensor1DiffN<3>(gg, 0);
for (int cc = 0; cc != col_nb_dofs / 3; ++cc) {
t_m(k, l) -= (b * t_col_base_fun) * t_levi_kirchhoff_domega(k, l);
t_m(k, l) += t_kd(k, l) * (c * (t_row_grad_fun(i) * t_col_grad_fun(i)));
++t_m;
++t_col_base_fun;
++t_col_grad_fun;
}
++t_row_base_fun;
++t_row_grad_fun;
}
for (; rr != row_nb_base_functions; ++rr) {
++t_row_base_fun;
++t_row_grad_fun;
}
++t_w;
++t_levi_kirchhoff_domega;
}
}
EntData &col_data) {
if (dataAtPts->matInvD.size1() == size_symm &&
dataAtPts->matInvD.size2() == size_symm) {
return integrateImpl<0>(row_data, col_data);
} else {
return integrateImpl<size_symm>(row_data, col_data);
}
};
template <int S>
EntData &col_data) {
auto get_ftensor2 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c + 0), &m(r + 0, c + 1), &m(r + 0, c + 2),
&m(r + 1, c + 0), &m(r + 1, c + 1), &m(r + 1, c + 2),
&m(r + 2, c + 0), &m(r + 2, c + 1), &m(r + 2, c + 2)
);
};
int nb_integration_pts = getGaussPts().size2();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
int row_nb_base_functions = row_data.getN().size2() / 3;
auto t_inv_D = getFTensor4DdgFromPtr<SPACE_DIM, SPACE_DIM, S>(
&*dataAtPts->matInvD.data().begin());
auto t_row_base = row_data.getFTensor1N<3>();
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs / 3; ++rr) {
auto t_col_base = col_data.getFTensor1N<3>(gg, 0);
auto t_m = get_ftensor2(K, 3 * rr, 0);
for (int cc = 0; cc != col_nb_dofs / 3; ++cc) {
t_m(i, k) -= a * t_row_base(j) * (t_inv_D(i, j, k, l) * t_col_base(l));
++t_m;
++t_col_base;
}
++t_row_base;
}
for (; rr != row_nb_base_functions; ++rr)
++t_row_base;
++t_w;
++t_inv_D;
}
}
EntData &col_data) {
if (dataAtPts->matInvD.size1() == size_symm &&
dataAtPts->matInvD.size2() == size_symm) {
return integrateImpl<0>(row_data, col_data);
} else {
return integrateImpl<size_symm>(row_data, col_data);
}
};
template <int S>
EntData &col_data) {
int nb_integration_pts = getGaussPts().size2();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
int row_nb_base_functions = row_data.getN().size2() / 9;
auto t_inv_D = getFTensor4DdgFromPtr<SPACE_DIM, SPACE_DIM, S>(
&*dataAtPts->matInvD.data().begin());
auto t_row_base = row_data.getFTensor2N<3, 3>();
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs; ++rr) {
auto t_col_base = col_data.getFTensor2N<3, 3>(gg, 0);
for (int cc = 0; cc != col_nb_dofs; ++cc) {
K(rr, cc) -=
a * (t_row_base(i, j) * (t_inv_D(i, j, k, l) * t_col_base(k, l)));
++t_col_base;
}
++t_row_base;
}
for (; rr != row_nb_base_functions; ++rr)
++t_row_base;
++t_w;
++t_inv_D;
}
}
EntData &col_data) {
if (dataAtPts->matInvD.size1() == size_symm &&
dataAtPts->matInvD.size2() == size_symm) {
return integrateImpl<0>(row_data, col_data);
} else {
return integrateImpl<size_symm>(row_data, col_data);
}
};
template <int S>
EntData &col_data) {
auto get_ftensor1 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c + 0), &m(r + 0, c + 1), &m(r + 0, c + 2)
);
};
int nb_integration_pts = getGaussPts().size2();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
int row_nb_base_functions = row_data.getN().size2() / 9;
auto t_inv_D = getFTensor4DdgFromPtr<SPACE_DIM, SPACE_DIM, S>(
&*dataAtPts->matInvD.data().begin());
auto t_row_base = row_data.getFTensor2N<3, 3>();
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
auto t_m = get_ftensor1(K, 0, 0);
int rr = 0;
for (; rr != row_nb_dofs; ++rr) {
auto t_col_base = col_data.getFTensor1N<3>(gg, 0);
for (int cc = 0; cc != col_nb_dofs / 3; ++cc) {
t_m(k) -= a * (t_row_base(i, j) * t_inv_D(i, j, k, l)) * t_col_base(l);
++t_col_base;
++t_m;
}
++t_row_base;
}
for (; rr != row_nb_base_functions; ++rr)
++t_row_base;
++t_w;
++t_inv_D;
}
}
EntData &col_data) {
int nb_integration_pts = row_data.getN().size1();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto get_ftensor2 = [](MatrixDouble &m, const int r, const int c) {
&m(r + 0, c + 0), &m(r + 0, c + 1), &m(r + 0, c + 2),
&m(r + 1, c + 0), &m(r + 1, c + 1), &m(r + 1, c + 2),
&m(r + 2, c + 0), &m(r + 2, c + 1), &m(r + 2, c + 2)
);
};
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
int row_nb_base_functions = row_data.getN().size2() / 3;
auto t_row_base_fun = row_data.getFTensor1N<3>();
const double ts_a = getTSa();
auto t_h_domega = getFTensor3FromMat<3, 3, 3>(dataAtPts->hdOmegaAtPts);
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs / 3; ++rr) {
t_PRT(i, k) = t_row_base_fun(j) * t_h_domega(i, j, k);
auto t_col_base_fun = col_data.getFTensor0N(gg, 0);
auto t_m = get_ftensor2(K, 3 * rr, 0);
for (int cc = 0; cc != col_nb_dofs / 3; ++cc) {
t_m(i, j) -= (a * t_col_base_fun) * t_PRT(i, j);
++t_m;
++t_col_base_fun;
}
++t_row_base_fun;
}
for (; rr != row_nb_base_functions; ++rr)
++t_row_base_fun;
++t_w;
++t_h_domega;
}
}
EntData &col_data) {
int nb_integration_pts = row_data.getN().size1();
int row_nb_dofs = row_data.getIndices().size();
int col_nb_dofs = col_data.getIndices().size();
auto get_ftensor2 = [](MatrixDouble &m, const int r, const int c) {
&m(r, c + 0), &m(r, c + 1), &m(r, c + 2));
};
auto v = getVolume();
auto t_w = getFTensor0IntegrationWeight();
int row_nb_base_functions = row_data.getN().size2() / 9;
auto t_row_base_fun = row_data.getFTensor2N<3, 3>();
const double ts_a = getTSa();
auto t_h_domega = getFTensor3FromMat<3, 3, 3>(dataAtPts->hdOmegaAtPts);
for (int gg = 0; gg != nb_integration_pts; ++gg) {
double a = v * t_w;
int rr = 0;
for (; rr != row_nb_dofs; ++rr) {
t_PRT(k) = t_row_base_fun(i, j) * t_h_domega(i, j, k);
auto t_col_base_fun = col_data.getFTensor0N(gg, 0);
auto t_m = get_ftensor2(K, rr, 0);
for (int cc = 0; cc != col_nb_dofs / 3; ++cc) {
t_m(j) -= (a * t_col_base_fun) * t_PRT(j);
++t_m;
++t_col_base_fun;
}
++t_row_base_fun;
}
for (; rr != row_nb_base_functions; ++rr)
++t_row_base_fun;
++t_w;
++t_h_domega;
}
}
EntData &data) {
if (tagSense != getSkeletonSense())
auto get_tag = [&](auto name) {
auto &mob = getPtrFE()->mField.get_moab();
Tag tag;
CHK_MOAB_THROW(mob.tag_get_handle(name, tag), "get tag");
return tag;
};
auto get_tag_value = [&](auto &&tag, int dim) {
auto &mob = getPtrFE()->mField.get_moab();
auto face = getSidePtrFE()->getFEEntityHandle();
std::vector<double> value(dim);
CHK_MOAB_THROW(mob.tag_get_data(tag, &face, 1, value.data()), "set tag");
return value;
};
auto create_tag = [this](const std::string tag_name, const int size) {
double def_VAL[] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
Tag th;
CHKERR postProcMesh.tag_get_handle(tag_name.c_str(), size, MB_TYPE_DOUBLE,
th, MB_TAG_CREAT | MB_TAG_SPARSE,
def_VAL);
return th;
};
Tag th_cauchy_streess = create_tag("CauchyStress", 9);
Tag th_detF = create_tag("detF", 1);
Tag th_traction = create_tag("traction", 3);
Tag th_disp_error = create_tag("DisplacementError", 1);
Tag th_energy = create_tag("Energy", 1);
auto t_w = getFTensor1FromMat<3>(dataAtPts->wL2AtPts);
auto t_h = getFTensor2FromMat<3, 3>(dataAtPts->hAtPts);
auto t_approx_P = getFTensor2FromMat<3, 3>(dataAtPts->approxPAtPts);
auto t_normal = getFTensor1NormalsAtGaussPts();
auto t_disp = getFTensor1FromMat<3>(dataAtPts->wH1AtPts);
auto next = [&]() {
++t_w;
++t_h;
++t_approx_P;
++t_normal;
++t_disp;
};
if (dataAtPts->energyAtPts.size() == 0) {
// that is for case that energy is not calculated
dataAtPts->energyAtPts.resize(getGaussPts().size2());
dataAtPts->energyAtPts.clear();
}
auto t_energy = getFTensor0FromVec(dataAtPts->energyAtPts);
auto set_float_precision = [](const double x) {
if (std::abs(x) < std::numeric_limits<float>::epsilon())
return 0.;
else
return x;
};
// scalars
auto save_scal_tag = [&](auto &th, auto v, const int gg) {
v = set_float_precision(v);
CHKERR postProcMesh.tag_set_data(th, &mapGaussPts[gg], 1, &v);
};
// vectors
auto save_vec_tag = [&](auto &th, auto &t_d, const int gg) {
t_v(i) = t_d(i);
for (auto &a : v.data())
a = set_float_precision(a);
CHKERR postProcMesh.tag_set_data(th, &mapGaussPts[gg], 1,
&*v.data().begin());
};
// tensors
&m(0, 0), &m(0, 1), &m(0, 2),
&m(1, 0), &m(1, 1), &m(1, 2),
&m(2, 0), &m(2, 1), &m(2, 2));
auto save_mat_tag = [&](auto &th, auto &t_d, const int gg) {
t_m(i, j) = t_d(i, j);
for (auto &v : m.data())
v = set_float_precision(v);
CHKERR postProcMesh.tag_set_data(th, &mapGaussPts[gg], 1,
&*m.data().begin());
};
const auto nb_gauss_pts = getGaussPts().size2();
for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
t_traction(i) = t_approx_P(i, j) * t_normal(j) / t_normal.l2();
// vectors
CHKERR save_vec_tag(th_traction, t_traction, gg);
double u_error = sqrt((t_disp(i) - t_w(i)) * (t_disp(i) - t_w(i)));
CHKERR save_scal_tag(th_disp_error, u_error, gg);
CHKERR save_scal_tag(th_energy, t_energy, gg);
const double jac = determinantTensor3by3(t_h);
t_cauchy(i, j) = (1. / jac) * (t_approx_P(i, k) * t_h(j, k));
CHKERR save_mat_tag(th_cauchy_streess, t_cauchy, gg);
CHKERR postProcMesh.tag_set_data(th_detF, &mapGaussPts[gg], 1, &jac);
next();
}
}
boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
std::vector<FieldSpace> spaces, std::string geom_field_name,
boost::shared_ptr<Range> crack_front_edges_ptr) {
constexpr bool scale_l2 = false;
if (scale_l2) {
: public MoFEM::OpGetHONormalsOnFace<SPACE_DIM> {
boost::shared_ptr<Range> edges_ptr)
: OP(field_name), edgesPtr(edges_ptr) {}
MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
auto ent = data.getFieldEntities().size()
? data.getFieldEntities()[0]->getEnt()
: 0;
if (type == MBEDGE && edgesPtr->find(ent) != edgesPtr->end()) {
return 0;
} else {
return OP::doWork(side, type, data);
}
};
private:
boost::shared_ptr<Range> edgesPtr;
};
auto jac = boost::make_shared<MatrixDouble>();
auto det = boost::make_shared<VectorDouble>();
pipeline.push_back(new OpGetHONormalsOnFace(
? crack_front_edges_ptr
: boost::make_shared<Range>()));
pipeline.push_back(new OpCalculateHOJacForFaceEmbeddedIn3DSpace(jac));
pipeline.push_back(new OpInvertMatrix<3>(jac, det, nullptr));
pipeline.push_back(new OpScaleBaseBySpaceInverseOfMeasure(
}
CHKERR MoFEM::AddHOOps<2, 3, 3>::add(pipeline, spaces, geom_field_name);
}
boost::ptr_deque<ForcesAndSourcesCore::UserDataOperator> &pipeline,
std::vector<FieldSpace> spaces, std::string geom_field_name,
boost::shared_ptr<Range> crack_front_edges_ptr) {
auto jac = boost::make_shared<MatrixDouble>();
auto det = boost::make_shared<VectorDouble>();
geom_field_name, jac));
pipeline.push_back(new OpInvertMatrix<3>(jac, det, nullptr));
pipeline.push_back(
}
constexpr bool scale_l2_ainsworth_legendre_base = false;
if (scale_l2_ainsworth_legendre_base) {
: public MoFEM::OpCalculateVectorFieldGradient<SPACE_DIM, SPACE_DIM> {
boost::shared_ptr<MatrixDouble> jac,
boost::shared_ptr<Range> edges_ptr)
: OP(field_name, jac), edgesPtr(edges_ptr) {}
MoFEMErrorCode doWork(int side, EntityType type, EntData &data) {
auto ent = data.getFieldEntities().size()
? data.getFieldEntities()[0]->getEnt()
: 0;
if (type == MBEDGE && edgesPtr->find(ent) != edgesPtr->end()) {
return 0;
} else {
return OP::doWork(side, type, data);
}
};
private:
boost::shared_ptr<Range> edgesPtr;
};
auto jac = boost::make_shared<MatrixDouble>();
auto det = boost::make_shared<VectorDouble>();
pipeline.push_back(new OpCalculateVectorFieldGradient(
geom_field_name, jac,
EshelbianCore::setSingularity ? crack_front_edges_ptr
: boost::make_shared<Range>()));
pipeline.push_back(new OpInvertMatrix<3>(jac, det, nullptr));
pipeline.push_back(new OpScaleBaseBySpaceInverseOfMeasure(
}
CHKERR MoFEM::AddHOOps<3, 3, 3>::add(pipeline, spaces, geom_field_name,
nullptr, nullptr, nullptr);
}
EntData &data) {
// sym size indices
auto t_L = symm_L_tensor();
const auto nb_integration_pts = getGaussPts().size2();
auto t_w = getFTensor0IntegrationWeight();
auto t_h = getFTensor2FromMat<3, 3>(dataAtPts->hAtPts);
auto t_P = getFTensor2FromMat<3, 3>(dataAtPts->approxPAtPts);
auto t_var_omega = getFTensor1FromMat<3>(dataAtPts->varRotAxis);
auto t_var_log_u = getFTensor2SymmetricFromMat<3>(dataAtPts->varLogStreach);
auto t_var_P = getFTensor2FromMat<3, 3>(dataAtPts->varPiola);
auto t_h_domega = getFTensor3FromMat<3, 3, 3>(dataAtPts->hdOmegaAtPts);
auto t_h_dlog_u =
getFTensor3FromMat<3, 3, size_symm>(dataAtPts->hdLogStretchAtPts);
auto t_approx_P_adjoint_log_du =
getFTensor1FromMat<size_symm>(dataAtPts->adjointPdUAtPts);
double var_element_energy = 0.;
for (auto gg = 0; gg != nb_integration_pts; ++gg) {
t_var_L_u(L) = t_L(J, K, L) * t_var_log_u(J, K);
auto var_energy = t_P(i, J) * (t_h_domega(i, J, j) * t_var_omega(j) +
t_h_dlog_u(i, J, L) * t_var_L_u(L));
var_element_energy += t_w * var_energy;
auto var_complementary = t_var_P(i, J) * t_h(i, J);
var_element_energy += t_w * var_complementary;
++t_w;
++t_h;
++t_P;
++t_var_omega;
++t_var_log_u;
++t_var_P;
++t_h_domega;
++t_h_dlog_u;
++t_approx_P_adjoint_log_du;
}
var_element_energy *= getMeasure();
auto get_tag = [&]() {
auto &mob = getPtrFE()->mField.get_moab();
Tag tag;
double def_val[] = {0.};
CHK_MOAB_THROW(mob.tag_get_handle("ReleaseEnergy", 1, MB_TYPE_DOUBLE, tag,
MB_TAG_CREAT | MB_TAG_SPARSE, def_val),
"create tag");
return tag;
};
auto set_tag = [&](auto &&tag, auto &energy) {
auto &mob = getPtrFE()->mField.get_moab();
auto tet = getPtrFE()->getFEEntityHandle();
CHK_MOAB_THROW(mob.tag_set_data(tag, &tet, 1, &energy), "set tag");
};
set_tag(get_tag(), var_element_energy);
*releaseEnergyPtr += var_element_energy;
}
} // namespace EshelbianPlasticity
MoFEMFunctionReturnHot
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:460
CHK_MOAB_THROW
#define CHK_MOAB_THROW(err, msg)
Check error code of MoAB function and throw MoFEM exception.
Definition: definitions.h:589
MoFEM::K
VectorDouble K
Definition: Projection10NodeCoordsOnField.cpp:125
MoFEM::EntitiesFieldData::EntData
Data on single entity (This is passed as argument to DataOperator::doWork)
Definition: EntitiesFieldData.hpp:128
OpSpatialConsistency_dBubble_dBubble::integrateImpl
MoFEMErrorCode integrateImpl(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1947
MoFEM::EntitiesFieldData::EntData::getFieldEntities
const VectorFieldEntities & getFieldEntities() const
get field entities
Definition: EntitiesFieldData.hpp:1277
EshelbianPlasticity::LINEAR
@ LINEAR
Definition: EshelbianPlasticity.hpp:46
OpRotationBc::iNtegrate
MoFEMErrorCode iNtegrate(EntData &data)
Definition: EshelbianOperators.cpp:1274
MoFEM::Types::VectorDouble3
VectorBoundedArray< double, 3 > VectorDouble3
Definition: Types.hpp:92
OpCalculateEshelbyStress::doWork
MoFEMErrorCode doWork(int row_side, EntityType row_type, EntData &row_data)
Operator for linear form, usually to calculate values on right hand side.
Definition: EshelbianOperators.cpp:24
OpDispBcImpl
Definition: EshelbianOperators.hpp:272
FTensor::Tensor1< double, 3 >
EntityHandle
MoFEM::OpCalculateHOJacForFaceEmbeddedIn3DSpace
OpCalculateHOJacForFaceImpl< 3 > OpCalculateHOJacForFaceEmbeddedIn3DSpace
Definition: HODataOperators.hpp:265
EshelbianCore::f
static boost::function< double(const double)> f
Definition: EshelbianCore.hpp:32
OpDispBc::iNtegrate
MoFEMErrorCode iNtegrate(EntData &data)
Definition: EshelbianOperators.cpp:1199
OpCalculateReactionForces::doWork
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
Definition: EshelbianOperators.cpp:823
L2
@ L2
field with C-1 continuity
Definition: definitions.h:88
EshelbianCore::stretchSelector
static enum StretchSelector stretchSelector
Definition: EshelbianCore.hpp:17
OpSpatialConsistencyP::integrate
MoFEMErrorCode integrate(EntData &data)
Definition: EshelbianOperators.cpp:959
OpSpatialConsistency_dBubble_dBubble::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1933
MoFEM::Exceptions::MoFEMErrorCode
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
Definition: Exceptions.hpp:56
FTensor::Tensor1::l2
T l2() const
Definition: Tensor1_value.hpp:84
MoFEM::Types::MatrixDouble
UBlasMatrix< double > MatrixDouble
Definition: Types.hpp:77
MoFEM::th
Tag th
Definition: Projection10NodeCoordsOnField.cpp:122
MoFEM::EntitiesFieldData::EntData::getFieldData
const VectorDouble & getFieldData() const
get dofs values
Definition: EntitiesFieldData.hpp:1254
FTensor::Kronecker_Delta
Kronecker Delta class.
Definition: Kronecker_Delta.hpp:15
EshelbianPlasticity
Definition: CGGTonsorialBubbleBase.hpp:11
MoFEM.hpp
OpSpatialRotation_domega_domega::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1798
J
FTensor::Index< 'J', DIM1 > J
Definition: level_set.cpp:30
MoFEM::OpScaleBaseBySpaceInverseOfMeasure
Scale base functions by inverses of measure of element.
Definition: HODataOperators.hpp:390
FTensor::Tensor2_symmetric
Definition: Tensor2_symmetric_value.hpp:13
FTENSOR_INDEX
#define FTENSOR_INDEX(DIM, I)
Definition: Templates.hpp:2013
EshelbianPlasticity::NO_H1_CONFIGURATION
@ NO_H1_CONFIGURATION
Definition: EshelbianPlasticity.hpp:45
scale
double scale
Definition: plastic.cpp:123
FTensor::levi_civita
constexpr std::enable_if<(Dim0<=2 &&Dim1<=2), Tensor2_Expr< Levi_Civita< T >, T, Dim0, Dim1, i, j > >::type levi_civita(const Index< i, Dim0 > &, const Index< j, Dim1 > &)
levi_civita functions to make for easy adhoc use
Definition: Levi_Civita.hpp:617
ts_ctx
MoFEM::TsCtx * ts_ctx
Definition: level_set.cpp:1932
OpSpatialRotation_domega_dBubble::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1750
OpSpatialRotation_domega_dP::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1692
LieGroups::SO3::exp
static auto exp(A &&t_w_vee, B &&theta)
Definition: Lie.hpp:49
sdf.r
int r
Definition: sdf.py:8
FTensor::Tensor2< double, 3, 3 >
USER_BASE
@ USER_BASE
user implemented approximation base
Definition: definitions.h:68
OpSpatialConsistencyDivTerm::integrate
MoFEMErrorCode integrate(EntData &data)
Definition: EshelbianOperators.cpp:1112
OpSpatialRotation::integrate
MoFEMErrorCode integrate(EntData &data)
Definition: EshelbianOperators.cpp:917
EshelbianCore::setSingularity
static PetscBool setSingularity
Definition: EshelbianCore.hpp:19
OpSpatialConsistency_dP_dP::integrateImpl
MoFEMErrorCode integrateImpl(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1874
I
constexpr IntegrationType I
Definition: operators_tests.cpp:31
MoFEM::EntitiesFieldData::EntData::getFTensor0N
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
Definition: EntitiesFieldData.hpp:1502
EshelbianCore::gradApproximator
static enum RotSelector gradApproximator
Definition: EshelbianCore.hpp:16
c
const double c
speed of light (cm/ns)
Definition: initial_diffusion.cpp:39
EigenMatrix::getMat
auto getMat(A &&t_val, B &&t_vec, Fun< double > f)
Get the Mat object.
Definition: MatrixFunction.hpp:114
MoFEM::EntitiesFieldData::EntData::getFTensor2DiffN
FTensor::Tensor2< FTensor::PackPtr< double *, Tensor_Dim0 *Tensor_Dim1 >, Tensor_Dim0, Tensor_Dim1 > getFTensor2DiffN(FieldApproximationBase base)
Get derivatives of base functions for Hdiv space.
Definition: EntitiesFieldData.cpp:660
EigenMatrix::getDiffMat
auto getDiffMat(A &&t_val, B &&t_vec, Fun< double > f, Fun< double > d_f, const int nb)
Get the Diff Mat object.
Definition: MatrixFunction.hpp:166
OpSpatialPhysical_du_domega::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1570
CHKERR
#define CHKERR
Inline error check.
Definition: definitions.h:548
FTensor::Tensor3
Definition: Tensor3_value.hpp:12
EshelbianPlasticity::SYMMETRIC
@ SYMMETRIC
Definition: EshelbianPlasticity.hpp:44
OpBrokenTractionBc::iNtegrate
MoFEMErrorCode iNtegrate(EntData &data)
Definition: EshelbianOperators.cpp:1278
OpSpatialConsistency_dBubble_domega::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:2125
MoFEM
implementation of Data Operators for Forces and Sources
Definition: Common.hpp:10
SPACE_DIM
constexpr int SPACE_DIM
Definition: child_and_parent.cpp:16
LieGroups::SO3::diffExp
static auto diffExp(A &&t_w_vee, B &&theta)
Definition: Lie.hpp:80
a
constexpr double a
Definition: approx_sphere.cpp:30
double
convert.type
type
Definition: convert.py:64
OpRotationBcImpl
Definition: EshelbianOperators.hpp:303
MoFEM::TSMethod::CTX_TSSETIJACOBIAN
@ CTX_TSSETIJACOBIAN
Definition: LoopMethods.hpp:147
Lie.hpp
OpSpatialEquilibrium_dw_dP::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1359
MoFEM::getFTensor0FromVec
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
Definition: Templates.hpp:135
OpCalculateRotationAndSpatialGradient::doWork
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
Operator for linear form, usually to calculate values on right hand side.
Definition: EshelbianOperators.cpp:55
MoFEM::EntitiesFieldData::EntData::getIndices
const VectorInt & getIndices() const
Get global indices of dofs on entity.
Definition: EntitiesFieldData.hpp:1214
lapack_wrap.h
OpSpatialRotation_domega_du::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1638
MatrixFunction.hpp
MoFEM::EntitiesFieldData::EntData::getFTensor2N
FTensor::Tensor2< FTensor::PackPtr< double *, Tensor_Dim0 *Tensor_Dim1 >, Tensor_Dim0, Tensor_Dim1 > getFTensor2N(FieldApproximationBase base)
Get base functions for Hdiv/Hcurl spaces.
Definition: EntitiesFieldData.cpp:762
MoFEM::L
VectorDouble L
Definition: Projection10NodeCoordsOnField.cpp:124
MoFEM::OpGetHONormalsOnFace
Calculate normals at Gauss points of triangle element.
Definition: HODataOperators.hpp:281
EshelbianPlasticity.hpp
Eshelbian plasticity interface.
OpSpatialConsistency_dP_domega::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:2061
FTensor::Tensor4
Definition: Tensor4_value.hpp:18
size_symm
constexpr auto size_symm
Definition: plastic.cpp:42
i
FTensor::Index< 'i', SPACE_DIM > i
Definition: hcurl_divergence_operator_2d.cpp:27
t_kd
constexpr auto t_kd
Definition: free_surface.cpp:139
field_name
constexpr auto field_name
Definition: poisson_2d_homogeneous.cpp:13
FTensor::Index< 'i', 3 >
EshelbianCore::symmetrySelector
static enum SymmetrySelector symmetrySelector
Definition: EshelbianCore.hpp:14
MoFEM::AddHOOps
Add operators pushing bases from local to physical configuration.
Definition: HODataOperators.hpp:417
MoFEM::OpCalculateVectorFieldGradient
Get field gradients at integration pts for scalar filed rank 0, i.e. vector field.
Definition: UserDataOperators.hpp:1561
convert.n
n
Definition: convert.py:82
MoFEM::determinantTensor3by3
static auto determinantTensor3by3(T &t)
Calculate the determinant of a 3x3 matrix or a tensor of rank 2.
Definition: Templates.hpp:1540
OpSpatialPhysical_du_dBubble::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1519
v
const double v
phase velocity of light in medium (cm/ns)
Definition: initial_diffusion.cpp:40
HenckyOps::sort_eigen_vals
auto sort_eigen_vals(FTensor::Tensor1< double, DIM > &eig, FTensor::Tensor2< double, DIM, DIM > &eigen_vec)
Definition: HenckyOps.hpp:41
EshelbianPlasticity::SMALL_ROT
@ SMALL_ROT
Definition: EshelbianPlasticity.hpp:45
MOFEM_LOG
#define MOFEM_LOG(channel, severity)
Log.
Definition: LogManager.hpp:308
MoFEM::EntitiesFieldData::EntData::getFTensor1DiffN
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
Definition: EntitiesFieldData.cpp:526
EshelbianPlasticity::LARGE_ROT
@ LARGE_ROT
Definition: EshelbianPlasticity.hpp:45
FTensor::Tensor0
Definition: Tensor0.hpp:16
EshelbianPlasticity::LOG
@ LOG
Definition: EshelbianPlasticity.hpp:46
EshelbianCore::dynamicRelaxation
static PetscBool dynamicRelaxation
Definition: EshelbianCore.hpp:20
PlasticOps::symm_L_tensor
auto symm_L_tensor(FTensor::Number< DIM >)
Definition: PlasticOpsGeneric.hpp:21
MoFEM::EntitiesFieldData::EntData::getN
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
Definition: EntitiesFieldData.hpp:1318
j
FTensor::Index< 'j', 3 > j
Definition: matrix_function.cpp:19
MoFEM::EntitiesFieldData::EntData::getFTensor1N
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1N(FieldApproximationBase base)
Get base functions for Hdiv/Hcurl spaces.
Definition: EntitiesFieldData.cpp:640
OpCalculateTractionFromSideEl::doWork
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
Definition: EshelbianOperators.cpp:793
OpSpatialConsistency_dBubble_dP::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1991
EshelbianCore::inv_f
static boost::function< double(const double)> inv_f
Definition: EshelbianCore.hpp:35
AINSWORTH_LEGENDRE_BASE
@ AINSWORTH_LEGENDRE_BASE
Ainsworth Cole (Legendre) approx. base .
Definition: definitions.h:60
MOFEM_DATA_INCONSISTENCY
@ MOFEM_DATA_INCONSISTENCY
Definition: definitions.h:31
OpSpatialEquilibrium::integrate
MoFEMErrorCode integrate(EntData &data)
Definition: EshelbianOperators.cpp:867
MoFEM::OpInvertMatrix
Definition: UserDataOperators.hpp:3684
OpReleaseEnergy::doWork
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
Definition: EshelbianOperators.cpp:2436
MoFEM::Types::MatrixDouble3by3
MatrixBoundedArray< double, 9 > MatrixDouble3by3
Definition: Types.hpp:105
OpSpatialConsistency_dBubble_dP::integrateImpl
MoFEMErrorCode integrateImpl(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:2005
EshelbianAux.hpp
Auxilary functions for Eshelbian plasticity.
m
FTensor::Index< 'm', 3 > m
Definition: shallow_wave.cpp:80
EshelbianCore::rotSelector
static enum RotSelector rotSelector
Definition: EshelbianCore.hpp:15
OpPostProcDataStructure::doWork
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
Definition: EshelbianOperators.cpp:2182
FTensor::Kronecker_Delta_symmetric
Kronecker Delta class symmetric.
Definition: Kronecker_Delta.hpp:49
MoFEMFunctionBeginHot
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:453
OpSpatialPhysical_du_dP::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1454
EshelbianPlasticity::MODERATE_ROT
@ MODERATE_ROT
Definition: EshelbianPlasticity.hpp:45
k
FTensor::Index< 'k', 3 > k
Definition: matrix_function.cpp:20
EshelbianCore::dynamicTime
static double dynamicTime
Definition: EshelbianCore.hpp:23
OpSpatialConsistencyBubble::integrate
MoFEMErrorCode integrate(EntData &data)
Definition: EshelbianOperators.cpp:1038
OP
MoFEMFunctionReturn
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
Definition: definitions.h:429
OpSpatialEquilibrium_dw_dw::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1395
EshelbianCore::l2UserBaseScale
static PetscBool l2UserBaseScale
Definition: EshelbianCore.hpp:27
MoFEMFunctionBegin
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
Definition: definitions.h:359
l
FTensor::Index< 'l', 3 > l
Definition: matrix_function.cpp:21
OpSpatialConsistency_dP_dP::integrate
MoFEMErrorCode integrate(EntData &row_data, EntData &col_data)
Definition: EshelbianOperators.cpp:1861
MoFEM::computeEigenValuesSymmetric
MoFEMErrorCode computeEigenValuesSymmetric(const MatrixDouble &mat, VectorDouble &eig, MatrixDouble &eigen_vec)
compute eigenvalues of a symmetric matrix using lapack dsyev
Definition: Templates.hpp:1452
EshelbianCore::d_f
static boost::function< double(const double)> d_f
Definition: EshelbianCore.hpp:33