52 t_diff(
i,
j,
k,
l) = 0;
53 t_diff(0, 0, 0, 0) = 1;
54 t_diff(1, 1, 1, 1) = 1;
56 t_diff(1, 0, 1, 0) = 0.5;
57 t_diff(1, 0, 0, 1) = 0.5;
59 t_diff(0, 1, 0, 1) = 0.5;
60 t_diff(0, 1, 1, 0) = 0.5;
62 if constexpr (DIM == 3) {
63 t_diff(2, 2, 2, 2) = 1;
65 t_diff(2, 0, 2, 0) = 0.5;
66 t_diff(2, 0, 0, 2) = 0.5;
67 t_diff(0, 2, 0, 2) = 0.5;
68 t_diff(0, 2, 2, 0) = 0.5;
70 t_diff(2, 1, 2, 1) = 0.5;
71 t_diff(2, 1, 1, 2) = 0.5;
72 t_diff(1, 2, 1, 2) = 0.5;
73 t_diff(1, 2, 2, 1) = 0.5;
130 t_diff_deviator(
I,
J,
k,
l) = 0;
131 for (
int ii = 0; ii != DIM; ++ii)
132 for (
int jj = ii; jj != DIM; ++jj)
133 for (
int kk = 0; kk != DIM; ++kk)
134 for (
int ll = kk; ll != DIM; ++ll)
135 t_diff_deviator(ii, jj, kk, ll) = t_diff_stress(ii, jj, kk, ll);
137 constexpr double third = boost::math::constants::third<double>();
139 t_diff_deviator(0, 0, 0, 0) -=
third;
140 t_diff_deviator(0, 0, 1, 1) -=
third;
142 t_diff_deviator(1, 1, 0, 0) -=
third;
143 t_diff_deviator(1, 1, 1, 1) -=
third;
145 t_diff_deviator(2, 2, 0, 0) -=
third;
146 t_diff_deviator(2, 2, 1, 1) -=
third;
148 if constexpr (DIM == 3) {
149 t_diff_deviator(0, 0, 2, 2) -=
third;
150 t_diff_deviator(1, 1, 2, 2) -=
third;
151 t_diff_deviator(2, 2, 2, 2) -=
third;
154 return t_diff_deviator;
388 &mat(6 * rr + 0, 0), &mat(6 * rr + 0, 1), &mat(6 * rr + 0, 2),
389 &mat(6 * rr + 1, 0), &mat(6 * rr + 1, 1), &mat(6 * rr + 1, 2),
390 &mat(6 * rr + 2, 0), &mat(6 * rr + 2, 1), &mat(6 * rr + 2, 2),
391 &mat(6 * rr + 3, 0), &mat(6 * rr + 3, 1), &mat(6 * rr + 3, 2),
392 &mat(6 * rr + 4, 0), &mat(6 * rr + 4, 1), &mat(6 * rr + 4, 2),
393 &mat(6 * rr + 5, 0), &mat(6 * rr + 5, 1), &mat(6 * rr + 5, 2)};
502 auto ¶ms = commonDataPtr->blockParams;
504 auto nb_gauss_pts = DomainEleOp::getGaussPts().size2();
505 auto t_w = DomainEleOp::getFTensor0IntegrationWeight();
506 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
507 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
508 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
509 auto t_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticFlow);
510 auto t_plastic_strain =
511 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
512 auto t_plastic_strain_dot =
513 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrainDot);
514 auto t_stress = getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStressPtr));
516 auto t_D_Op = getFTensor4DdgFromMat<DIM, DIM, 0>(*mDPtr);
523 t_flow_dir_dstress(
i,
j,
k,
l) =
524 1.5 * (t_diff_deviator(
M,
N,
i,
j) * t_diff_deviator(
M,
N,
k,
l));
525 t_flow_dir_dstrain(
i,
j,
k,
l) =
526 t_flow_dir_dstress(
i,
j,
m,
n) * t_D_Op(
m,
n,
k,
l);
532 commonDataPtr->resC.resize(nb_gauss_pts,
false);
533 commonDataPtr->resCdTau.resize(nb_gauss_pts,
false);
534 commonDataPtr->resCdStrain.resize(nb_gauss_pts,
size_symm,
false);
535 commonDataPtr->resCdPlasticStrain.resize(nb_gauss_pts,
size_symm,
false);
536 commonDataPtr->resFlow.resize(nb_gauss_pts,
size_symm,
false);
537 commonDataPtr->resFlowDtau.resize(nb_gauss_pts,
size_symm,
false);
543 commonDataPtr->resC.clear();
544 commonDataPtr->resCdTau.clear();
545 commonDataPtr->resCdStrain.clear();
546 commonDataPtr->resCdPlasticStrain.clear();
547 commonDataPtr->resFlow.clear();
548 commonDataPtr->resFlowDtau.clear();
549 commonDataPtr->resFlowDstrain.clear();
550 commonDataPtr->resFlowDstrainDot.clear();
552 auto t_res_c = getFTensor0FromVec(commonDataPtr->resC);
553 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
554 auto t_res_c_dstrain =
555 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdStrain);
556 auto t_res_c_plastic_strain =
557 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdPlasticStrain);
558 auto t_res_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlow);
559 auto t_res_flow_dtau =
560 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
561 auto t_res_flow_dstrain =
562 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
563 auto t_res_flow_dplastic_strain =
564 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
572 ++t_plastic_strain_dot;
577 ++t_res_c_plastic_strain;
580 ++t_res_flow_dstrain;
581 ++t_res_flow_dplastic_strain;
585 auto get_avtive_pts = [&]() {
586 int nb_points_avtive_on_elem = 0;
587 int nb_points_on_elem = 0;
589 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
590 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
591 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
592 auto t_plastic_strain_dot =
593 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->plasticStrainDot);
595 auto dt = this->getTStimeStep();
597 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
600 eqiv, t_tau_dot, t_f,
608 ++nb_points_avtive_on_elem;
614 ++t_plastic_strain_dot;
624 nb_points += nb_points_on_elem;
625 if (nb_points_avtive_on_elem > 0) {
627 active_points += nb_points_avtive_on_elem;
628 if (nb_points_avtive_on_elem == nb_points_on_elem) {
633 if (nb_points_avtive_on_elem != nb_points_on_elem)
639 if (DomainEleOp::getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
643 auto dt = this->getTStimeStep();
644 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
648 t_diff_plastic_strain,
654 const auto d_sigma_y =
662 auto c =
constraint(eqiv, t_tau_dot, t_f, sigma_y, abs_ww,
674 t_stress,
trace(t_stress),
681 t_flow_dir(
k,
l) = 1.5 * (t_dev_stress(
I,
J) * t_diff_deviator(
I,
J,
k,
l));
683 t_flow_dstrain(
i,
j) = t_flow(
k,
l) * t_D_Op(
k,
l,
i,
j);
685 auto get_res_c = [&]() {
return c; };
687 auto get_res_c_dstrain = [&](
auto &t_diff_res) {
688 t_diff_res(
i,
j) = c_f * t_flow_dstrain(
i,
j);
691 auto get_res_c_dplastic_strain = [&](
auto &t_diff_res) {
692 t_diff_res(
i,
j) = (this->getTSa() * c_equiv) * t_diff_eqiv(
i,
j);
693 t_diff_res(
k,
l) -= c_f * t_flow(
i,
j) * t_alpha_dir(
i,
j,
k,
l);
696 auto get_res_c_dtau = [&]() {
697 return this->getTSa() * c_dot_tau + c_sigma_y * d_sigma_y;
700 [[maybe_unused]]
auto get_res_c_plastic_strain = [&](
auto &t_diff_res) {
701 t_diff_res(
k,
l) = -c_f * t_flow(
i,
j) * t_alpha_dir(
i,
j,
k,
l);
704 auto get_res_flow = [&](
auto &t_res_flow) {
705 const auto a = sigma_y;
706 const auto b = t_tau_dot;
707 t_res_flow(
k,
l) =
a * t_plastic_strain_dot(
k,
l) - b * t_flow_dir(
k,
l);
710 auto get_res_flow_dtau = [&](
auto &t_res_flow_dtau) {
711 const auto da = d_sigma_y;
712 const auto db = this->getTSa();
713 t_res_flow_dtau(
k,
l) =
714 da * t_plastic_strain_dot(
k,
l) - db * t_flow_dir(
k,
l);
717 auto get_res_flow_dstrain = [&](
auto &t_res_flow_dstrain) {
718 const auto b = t_tau_dot;
719 t_res_flow_dstrain(
m,
n,
k,
l) = -t_flow_dir_dstrain(
m,
n,
k,
l) * b;
722 auto get_res_flow_dplastic_strain = [&](
auto &t_res_flow_dplastic_strain) {
723 const auto a = sigma_y;
724 t_res_flow_dplastic_strain(
m,
n,
k,
l) =
725 (
a * this->getTSa()) * t_diff_plastic_strain(
m,
n,
k,
l);
726 const auto b = t_tau_dot;
727 t_res_flow_dplastic_strain(
m,
n,
i,
j) +=
728 (t_flow_dir_dstrain(
m,
n,
k,
l) * t_alpha_dir(
k,
l,
i,
j)) * b;
731 t_res_c = get_res_c();
732 get_res_flow(t_res_flow);
734 if (this->getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
735 t_res_c_dtau = get_res_c_dtau();
736 get_res_c_dstrain(t_res_c_dstrain);
737 get_res_c_dplastic_strain(t_res_c_plastic_strain);
738 get_res_flow_dtau(t_res_flow_dtau);
739 get_res_flow_dstrain(t_res_flow_dstrain);
740 get_res_flow_dplastic_strain(t_res_flow_dplastic_strain);
979 &mat(6 * rr + 0, 0), &mat(6 * rr + 0, 1), &mat(6 * rr + 0, 2),
980 &mat(6 * rr + 0, 3), &mat(6 * rr + 0, 4), &mat(6 * rr + 0, 5),
981 &mat(6 * rr + 1, 0), &mat(6 * rr + 1, 1), &mat(6 * rr + 1, 2),
982 &mat(6 * rr + 1, 3), &mat(6 * rr + 1, 4), &mat(6 * rr + 1, 5),
983 &mat(6 * rr + 2, 0), &mat(6 * rr + 2, 1), &mat(6 * rr + 2, 2),
984 &mat(6 * rr + 2, 3), &mat(6 * rr + 2, 4), &mat(6 * rr + 2, 5),
985 &mat(6 * rr + 3, 0), &mat(6 * rr + 3, 1), &mat(6 * rr + 3, 2),
986 &mat(6 * rr + 3, 3), &mat(6 * rr + 3, 4), &mat(6 * rr + 3, 5),
987 &mat(6 * rr + 4, 0), &mat(6 * rr + 4, 1), &mat(6 * rr + 4, 2),
988 &mat(6 * rr + 4, 3), &mat(6 * rr + 4, 4), &mat(6 * rr + 4, 5),
989 &mat(6 * rr + 5, 0), &mat(6 * rr + 5, 1), &mat(6 * rr + 5, 2),
990 &mat(6 * rr + 5, 3), &mat(6 * rr + 5, 4), &mat(6 * rr + 5, 5)};
996 EntitiesFieldData::EntData &row_data,
997 EntitiesFieldData::EntData &col_data) {
1004 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1008 auto &locMat = AssemblyDomainEleOp::locMat;
1010 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1011 const auto nb_row_base_functions = row_data.getN().size2();
1013 auto t_res_flow_dstrain =
1014 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
1015 auto t_res_flow_dplastic_strain =
1016 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
1020 ++t_res_flow_dstrain;
1021 ++t_res_flow_dplastic_strain;
1024 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1025 auto t_row_base = row_data.getFTensor0N();
1026 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
1027 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1032 alpha * (t_L(
i,
j, O) * ((t_res_flow_dplastic_strain(
i,
j,
k,
l) -
1033 t_res_flow_dstrain(
i,
j,
k,
l)) *
1038 for (; rr != AssemblyDomainEleOp::nbRows /
size_symm; ++rr) {
1041 auto t_col_base = col_data.getFTensor0N(gg, 0);
1042 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols /
size_symm; ++cc) {
1043 t_mat(O, L) += ((t_row_base * t_col_base) * t_res_mat(O, L));
1051 for (; rr < nb_row_base_functions; ++rr)
1116 EntitiesFieldData::EntData &row_data,
1117 EntitiesFieldData::EntData &col_data) {
1122 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1125 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1126 const size_t nb_row_base_functions = row_data.getN().size2();
1127 auto &locMat = AssemblyDomainEleOp::locMat;
1129 auto t_res_flow_dtau =
1130 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
1134 auto next = [&]() { ++t_res_flow_dtau; };
1136 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1137 auto t_row_base = row_data.getFTensor0N();
1138 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
1139 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1142 t_res_vec(L) = alpha * (t_res_flow_dtau(
i,
j) * t_L(
i,
j, L));
1146 for (; rr != AssemblyDomainEleOp::nbRows /
size_symm; ++rr) {
1149 auto t_col_base = col_data.getFTensor0N(gg, 0);
1150 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
1151 t_mat(L) += t_row_base * t_col_base * t_res_vec(L);
1157 for (; rr != nb_row_base_functions; ++rr)
1204 EntitiesFieldData::EntData &row_data,
1205 EntitiesFieldData::EntData &col_data) {
1210 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1213 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1214 const auto nb_row_base_functions = row_data.getN().size2();
1217 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdStrain);
1218 auto t_c_dplastic_strain =
1219 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdPlasticStrain);
1223 ++t_c_dplastic_strain;
1228 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1229 auto t_row_base = row_data.getFTensor0N();
1230 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
1231 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1236 t_L(
i,
j, L) * (t_c_dplastic_strain(
i,
j) - t_c_dstrain(
i,
j));
1242 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1243 const auto row_base = alpha * t_row_base;
1244 auto t_col_base = col_data.getFTensor0N(gg, 0);
1245 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols /
size_symm; cc++) {
1246 t_mat(L) += (row_base * t_col_base) * t_res_vec(L);
1252 for (; rr != nb_row_base_functions; ++rr)
1286 EntitiesFieldData::EntData &row_data,
1287 EntitiesFieldData::EntData &col_data) {
1290 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1291 const auto nb_row_base_functions = row_data.getN().size2();
1293 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
1294 auto next = [&]() { ++t_res_c_dtau; };
1296 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1297 auto t_row_base = row_data.getFTensor0N();
1298 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
1299 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1302 const auto res = alpha * (t_res_c_dtau);
1305 auto mat_ptr = AssemblyDomainEleOp::locMat.data().begin();
1307 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1308 auto t_col_base = col_data.getFTensor0N(gg, 0);
1309 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; ++cc) {
1310 *mat_ptr += t_row_base * t_col_base * res;
1316 for (; rr < nb_row_base_functions; ++rr)