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 = getFTensor4DdgFromMat<DIM, DIM, 0>(*commonDataPtr->mDPtr);
517 auto t_D_Op = getFTensor4DdgFromMat<DIM, DIM, 0>(*mDPtr);
524 t_flow_dir_dstress(
i,
j,
k,
l) =
525 1.5 * (t_diff_deviator(
M,
N,
i,
j) * t_diff_deviator(
M,
N,
k,
l));
526 t_flow_dir_dstrain(
i,
j,
k,
l) =
527 t_flow_dir_dstress(
i,
j,
m,
n) * t_D_Op(
m,
n,
k,
l);
533 commonDataPtr->resC.resize(nb_gauss_pts,
false);
534 commonDataPtr->resCdTau.resize(nb_gauss_pts,
false);
535 commonDataPtr->resCdStrain.resize(nb_gauss_pts,
size_symm,
false);
536 commonDataPtr->resCdPlasticStrain.resize(nb_gauss_pts,
size_symm,
false);
537 commonDataPtr->resFlow.resize(nb_gauss_pts,
size_symm,
false);
538 commonDataPtr->resFlowDtau.resize(nb_gauss_pts,
size_symm,
false);
544 commonDataPtr->resC.clear();
545 commonDataPtr->resCdTau.clear();
546 commonDataPtr->resCdStrain.clear();
547 commonDataPtr->resCdPlasticStrain.clear();
548 commonDataPtr->resFlow.clear();
549 commonDataPtr->resFlowDtau.clear();
550 commonDataPtr->resFlowDstrain.clear();
551 commonDataPtr->resFlowDstrainDot.clear();
553 auto t_res_c = getFTensor0FromVec(commonDataPtr->resC);
554 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
555 auto t_res_c_dstrain =
556 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdStrain);
557 auto t_res_c_plastic_strain =
558 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdPlasticStrain);
559 auto t_res_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlow);
560 auto t_res_flow_dtau =
561 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
562 auto t_res_flow_dstrain =
563 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
564 auto t_res_flow_dplastic_strain =
565 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
573 ++t_plastic_strain_dot;
578 ++t_res_c_plastic_strain;
581 ++t_res_flow_dstrain;
582 ++t_res_flow_dplastic_strain;
586 auto get_avtive_pts = [&]() {
587 int nb_points_avtive_on_elem = 0;
588 int nb_points_on_elem = 0;
590 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
591 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
592 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
593 auto t_plastic_strain_dot =
594 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->plasticStrainDot);
596 auto dt = this->getTStimeStep();
598 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
601 eqiv, t_tau_dot, t_f,
609 ++nb_points_avtive_on_elem;
615 ++t_plastic_strain_dot;
625 nb_points += nb_points_on_elem;
626 if (nb_points_avtive_on_elem > 0) {
628 active_points += nb_points_avtive_on_elem;
629 if (nb_points_avtive_on_elem == nb_points_on_elem) {
634 if (nb_points_avtive_on_elem != nb_points_on_elem)
640 if (DomainEleOp::getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
644 auto dt = this->getTStimeStep();
645 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
649 t_diff_plastic_strain,
655 const auto d_sigma_y =
663 auto c =
constraint(eqiv, t_tau_dot, t_f, sigma_y, abs_ww,
675 t_stress,
trace(t_stress),
682 t_flow_dir(
k,
l) = 1.5 * (t_dev_stress(
I,
J) * t_diff_deviator(
I,
J,
k,
l));
684 t_flow_dstrain(
i,
j) = t_flow(
k,
l) * t_D_Op(
k,
l,
i,
j);
686 auto get_res_c = [&]() {
return c; };
688 auto get_res_c_dstrain = [&](
auto &t_diff_res) {
689 t_diff_res(
i,
j) = c_f * t_flow_dstrain(
i,
j);
692 auto get_res_c_dplastic_strain = [&](
auto &t_diff_res) {
693 t_diff_res(
i,
j) = (this->getTSa() * c_equiv) * t_diff_eqiv(
i,
j);
694 t_diff_res(
k,
l) -= c_f * t_flow(
i,
j) * t_alpha_dir(
i,
j,
k,
l);
697 auto get_res_c_dtau = [&]() {
698 return this->getTSa() * c_dot_tau + c_sigma_y * d_sigma_y;
701 auto get_res_c_plastic_strain = [&](
auto &t_diff_res) {
702 t_diff_res(
k,
l) = -c_f * t_flow(
i,
j) * t_alpha_dir(
i,
j,
k,
l);
705 auto get_res_flow = [&](
auto &t_res_flow) {
706 const auto a = sigma_y;
707 const auto b = t_tau_dot;
708 t_res_flow(
k,
l) =
a * t_plastic_strain_dot(
k,
l) - b * t_flow_dir(
k,
l);
711 auto get_res_flow_dtau = [&](
auto &t_res_flow_dtau) {
712 const auto da = d_sigma_y;
713 const auto db = this->getTSa();
714 t_res_flow_dtau(
k,
l) =
715 da * t_plastic_strain_dot(
k,
l) - db * t_flow_dir(
k,
l);
718 auto get_res_flow_dstrain = [&](
auto &t_res_flow_dstrain) {
719 const auto b = t_tau_dot;
720 t_res_flow_dstrain(
m,
n,
k,
l) = -t_flow_dir_dstrain(
m,
n,
k,
l) * b;
723 auto get_res_flow_dplastic_strain = [&](
auto &t_res_flow_dplastic_strain) {
724 const auto a = sigma_y;
725 t_res_flow_dplastic_strain(
m,
n,
k,
l) =
726 (
a * this->getTSa()) * t_diff_plastic_strain(
m,
n,
k,
l);
727 const auto b = t_tau_dot;
728 t_res_flow_dplastic_strain(
m,
n,
i,
j) +=
729 (t_flow_dir_dstrain(
m,
n,
k,
l) * t_alpha_dir(
k,
l,
i,
j)) * b;
732 t_res_c = get_res_c();
733 get_res_flow(t_res_flow);
735 if (this->getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
736 t_res_c_dtau = get_res_c_dtau();
737 get_res_c_dstrain(t_res_c_dstrain);
738 get_res_c_dplastic_strain(t_res_c_plastic_strain);
739 get_res_flow_dtau(t_res_flow_dtau);
740 get_res_flow_dstrain(t_res_flow_dstrain);
741 get_res_flow_dplastic_strain(t_res_flow_dplastic_strain);
980 &mat(6 * rr + 0, 0), &mat(6 * rr + 0, 1), &mat(6 * rr + 0, 2),
981 &mat(6 * rr + 0, 3), &mat(6 * rr + 0, 4), &mat(6 * rr + 0, 5),
982 &mat(6 * rr + 1, 0), &mat(6 * rr + 1, 1), &mat(6 * rr + 1, 2),
983 &mat(6 * rr + 1, 3), &mat(6 * rr + 1, 4), &mat(6 * rr + 1, 5),
984 &mat(6 * rr + 2, 0), &mat(6 * rr + 2, 1), &mat(6 * rr + 2, 2),
985 &mat(6 * rr + 2, 3), &mat(6 * rr + 2, 4), &mat(6 * rr + 2, 5),
986 &mat(6 * rr + 3, 0), &mat(6 * rr + 3, 1), &mat(6 * rr + 3, 2),
987 &mat(6 * rr + 3, 3), &mat(6 * rr + 3, 4), &mat(6 * rr + 3, 5),
988 &mat(6 * rr + 4, 0), &mat(6 * rr + 4, 1), &mat(6 * rr + 4, 2),
989 &mat(6 * rr + 4, 3), &mat(6 * rr + 4, 4), &mat(6 * rr + 4, 5),
990 &mat(6 * rr + 5, 0), &mat(6 * rr + 5, 1), &mat(6 * rr + 5, 2),
991 &mat(6 * rr + 5, 3), &mat(6 * rr + 5, 4), &mat(6 * rr + 5, 5)};
997 EntitiesFieldData::EntData &row_data,
998 EntitiesFieldData::EntData &col_data) {
1005 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1009 auto &locMat = AssemblyDomainEleOp::locMat;
1011 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1012 const auto nb_row_base_functions = row_data.getN().size2();
1014 auto t_res_flow_dstrain =
1015 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
1016 auto t_res_flow_dplastic_strain =
1017 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
1021 ++t_res_flow_dstrain;
1022 ++t_res_flow_dplastic_strain;
1025 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1026 auto t_row_base = row_data.getFTensor0N();
1027 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
1028 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1033 alpha * (t_L(
i,
j, O) * ((t_res_flow_dplastic_strain(
i,
j,
k,
l) -
1034 t_res_flow_dstrain(
i,
j,
k,
l)) *
1039 for (; rr != AssemblyDomainEleOp::nbRows /
size_symm; ++rr) {
1042 auto t_col_base = col_data.getFTensor0N(gg, 0);
1043 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols /
size_symm; ++cc) {
1044 t_mat(O, L) += ((t_row_base * t_col_base) * t_res_mat(O, L));
1052 for (; rr < nb_row_base_functions; ++rr)
1117 EntitiesFieldData::EntData &row_data,
1118 EntitiesFieldData::EntData &col_data) {
1123 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1126 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1127 const size_t nb_row_base_functions = row_data.getN().size2();
1128 auto &locMat = AssemblyDomainEleOp::locMat;
1130 auto t_res_flow_dtau =
1131 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
1135 auto next = [&]() { ++t_res_flow_dtau; };
1137 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1138 auto t_row_base = row_data.getFTensor0N();
1139 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
1140 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1143 t_res_vec(L) = alpha * (t_res_flow_dtau(
i,
j) * t_L(
i,
j, L));
1147 for (; rr != AssemblyDomainEleOp::nbRows /
size_symm; ++rr) {
1150 auto t_col_base = col_data.getFTensor0N(gg, 0);
1151 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
1152 t_mat(L) += t_row_base * t_col_base * t_res_vec(L);
1158 for (; rr != nb_row_base_functions; ++rr)
1205 EntitiesFieldData::EntData &row_data,
1206 EntitiesFieldData::EntData &col_data) {
1211 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1214 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1215 const auto nb_row_base_functions = row_data.getN().size2();
1218 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdStrain);
1219 auto t_c_dplastic_strain =
1220 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdPlasticStrain);
1224 ++t_c_dplastic_strain;
1229 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1230 auto t_row_base = row_data.getFTensor0N();
1231 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
1232 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1237 t_L(
i,
j, L) * (t_c_dplastic_strain(
i,
j) - t_c_dstrain(
i,
j));
1243 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1244 const auto row_base = alpha * t_row_base;
1245 auto t_col_base = col_data.getFTensor0N(gg, 0);
1246 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols /
size_symm; cc++) {
1247 t_mat(L) += (row_base * t_col_base) * t_res_vec(L);
1253 for (; rr != nb_row_base_functions; ++rr)
1287 EntitiesFieldData::EntData &row_data,
1288 EntitiesFieldData::EntData &col_data) {
1291 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1292 const auto nb_row_base_functions = row_data.getN().size2();
1294 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
1295 auto next = [&]() { ++t_res_c_dtau; };
1297 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1298 auto t_row_base = row_data.getFTensor0N();
1299 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
1300 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1303 const auto res = alpha * (t_res_c_dtau);
1306 auto mat_ptr = AssemblyDomainEleOp::locMat.data().begin();
1308 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1309 auto t_col_base = col_data.getFTensor0N(gg, 0);
1310 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; ++cc) {
1311 *mat_ptr += t_row_base * t_col_base * res;
1317 for (; rr < nb_row_base_functions; ++rr)