277 &mat(6 * rr + 0, 0), &mat(6 * rr + 0, 1), &mat(6 * rr + 0, 2),
278 &mat(6 * rr + 1, 0), &mat(6 * rr + 1, 1), &mat(6 * rr + 1, 2),
279 &mat(6 * rr + 2, 0), &mat(6 * rr + 2, 1), &mat(6 * rr + 2, 2),
280 &mat(6 * rr + 3, 0), &mat(6 * rr + 3, 1), &mat(6 * rr + 3, 2),
281 &mat(6 * rr + 4, 0), &mat(6 * rr + 4, 1), &mat(6 * rr + 4, 2),
282 &mat(6 * rr + 5, 0), &mat(6 * rr + 5, 1), &mat(6 * rr + 5, 2)};
391 auto ¶ms = commonDataPtr->blockParams;
393 auto nb_gauss_pts = DomainEleOp::getGaussPts().size2();
394 auto t_w = DomainEleOp::getFTensor0IntegrationWeight();
395 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
396 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
397 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
398 auto t_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticFlow);
399 auto t_plastic_strain =
400 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrain);
401 auto t_plastic_strain_dot =
402 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->plasticStrainDot);
403 auto t_stress = getFTensor2SymmetricFromMat<DIM>(*(commonDataPtr->mStressPtr));
405 auto t_D_Op = getFTensor4DdgFromMat<DIM, DIM, 0>(*mDPtr);
407 auto t_diff_plastic_strain = FTensor::diff_tensor<double>();
408 auto t_diff_deviator = FTensor::diff_deviator<double, DIM>();
412 t_flow_dir_dstress(
i,
j,
k,
l) =
413 1.5 * (t_diff_deviator(
M,
N,
i,
j) * t_diff_deviator(
M,
N,
k,
l));
414 t_flow_dir_dstrain(
i,
j,
k,
l) =
415 t_flow_dir_dstress(
i,
j,
m,
n) * t_D_Op(
m,
n,
k,
l);
421 commonDataPtr->resC.resize(nb_gauss_pts,
false);
422 commonDataPtr->resCdTau.resize(nb_gauss_pts,
false);
423 commonDataPtr->resCdStrain.resize(nb_gauss_pts,
size_symm,
false);
424 commonDataPtr->resCdPlasticStrain.resize(nb_gauss_pts,
size_symm,
false);
425 commonDataPtr->resFlow.resize(nb_gauss_pts,
size_symm,
false);
426 commonDataPtr->resFlowDtau.resize(nb_gauss_pts,
size_symm,
false);
432 commonDataPtr->resC.clear();
433 commonDataPtr->resCdTau.clear();
434 commonDataPtr->resCdStrain.clear();
435 commonDataPtr->resCdPlasticStrain.clear();
436 commonDataPtr->resFlow.clear();
437 commonDataPtr->resFlowDtau.clear();
438 commonDataPtr->resFlowDstrain.clear();
439 commonDataPtr->resFlowDstrainDot.clear();
441 auto t_res_c = getFTensor0FromVec(commonDataPtr->resC);
442 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
443 auto t_res_c_dstrain =
444 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdStrain);
445 auto t_res_c_plastic_strain =
446 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resCdPlasticStrain);
447 auto t_res_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlow);
448 auto t_res_flow_dtau =
449 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
450 auto t_res_flow_dstrain =
451 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
452 auto t_res_flow_dplastic_strain =
453 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
461 ++t_plastic_strain_dot;
466 ++t_res_c_plastic_strain;
469 ++t_res_flow_dstrain;
470 ++t_res_flow_dplastic_strain;
474 auto get_avtive_pts = [&]() {
475 int nb_points_avtive_on_elem = 0;
476 int nb_points_on_elem = 0;
478 auto t_tau = getFTensor0FromVec(commonDataPtr->plasticTau);
479 auto t_tau_dot = getFTensor0FromVec(commonDataPtr->plasticTauDot);
480 auto t_f = getFTensor0FromVec(commonDataPtr->plasticSurface);
481 auto t_plastic_strain_dot =
482 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->plasticStrainDot);
484 auto dt = this->getTStimeStep();
486 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
489 eqiv, t_tau_dot, t_f,
497 ++nb_points_avtive_on_elem;
503 ++t_plastic_strain_dot;
513 nb_points += nb_points_on_elem;
514 if (nb_points_avtive_on_elem > 0) {
516 active_points += nb_points_avtive_on_elem;
517 if (nb_points_avtive_on_elem == nb_points_on_elem) {
522 if (nb_points_avtive_on_elem != nb_points_on_elem)
528 if (DomainEleOp::getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
532 auto dt = this->getTStimeStep();
533 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
537 t_diff_plastic_strain,
543 const auto d_sigma_y =
551 auto c =
constraint(eqiv, t_tau_dot, t_f, sigma_y, abs_ww,
563 t_stress,
trace(t_stress),
570 t_flow_dir(
k,
l) = 1.5 * (t_dev_stress(
I,
J) * t_diff_deviator(
I,
J,
k,
l));
572 t_flow_dstrain(
i,
j) = t_flow(
k,
l) * t_D_Op(
k,
l,
i,
j);
574 auto get_res_c = [&]() {
return c; };
576 auto get_res_c_dstrain = [&](
auto &t_diff_res) {
577 t_diff_res(
i,
j) = c_f * t_flow_dstrain(
i,
j);
580 auto get_res_c_dplastic_strain = [&](
auto &t_diff_res) {
581 t_diff_res(
i,
j) = (this->getTSa() * c_equiv) * t_diff_eqiv(
i,
j);
582 t_diff_res(
k,
l) -= c_f * t_flow(
i,
j) * t_alpha_dir(
i,
j,
k,
l);
585 auto get_res_c_dtau = [&]() {
586 return this->getTSa() * c_dot_tau + c_sigma_y * d_sigma_y;
589 [[maybe_unused]]
auto get_res_c_plastic_strain = [&](
auto &t_diff_res) {
590 t_diff_res(
k,
l) = -c_f * t_flow(
i,
j) * t_alpha_dir(
i,
j,
k,
l);
593 auto get_res_flow = [&](
auto &t_res_flow) {
594 const auto a = sigma_y;
595 const auto b = t_tau_dot;
596 t_res_flow(
k,
l) =
a * t_plastic_strain_dot(
k,
l) - b * t_flow_dir(
k,
l);
599 auto get_res_flow_dtau = [&](
auto &t_res_flow_dtau) {
600 const auto da = d_sigma_y;
601 const auto db = this->getTSa();
602 t_res_flow_dtau(
k,
l) =
603 da * t_plastic_strain_dot(
k,
l) - db * t_flow_dir(
k,
l);
606 auto get_res_flow_dstrain = [&](
auto &t_res_flow_dstrain) {
607 const auto b = t_tau_dot;
608 t_res_flow_dstrain(
m,
n,
k,
l) = -t_flow_dir_dstrain(
m,
n,
k,
l) * b;
611 auto get_res_flow_dplastic_strain = [&](
auto &t_res_flow_dplastic_strain) {
612 const auto a = sigma_y;
613 t_res_flow_dplastic_strain(
m,
n,
k,
l) =
614 (
a * this->getTSa()) * t_diff_plastic_strain(
m,
n,
k,
l);
615 const auto b = t_tau_dot;
616 t_res_flow_dplastic_strain(
m,
n,
i,
j) +=
617 (t_flow_dir_dstrain(
m,
n,
k,
l) * t_alpha_dir(
k,
l,
i,
j)) * b;
620 t_res_c = get_res_c();
621 get_res_flow(t_res_flow);
623 if (this->getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
624 t_res_c_dtau = get_res_c_dtau();
625 get_res_c_dstrain(t_res_c_dstrain);
626 get_res_c_dplastic_strain(t_res_c_plastic_strain);
627 get_res_flow_dtau(t_res_flow_dtau);
628 get_res_flow_dstrain(t_res_flow_dstrain);
629 get_res_flow_dplastic_strain(t_res_flow_dplastic_strain);
731 EntitiesFieldData::EntData &data) {
738 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
741 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
742 const auto nb_base_functions = data.getN().size2();
744 auto t_res_flow = getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlow);
746 auto t_L = FTensor::symm_l_tensor<double, DIM>();
748 auto next = [&]() { ++t_res_flow; };
750 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
751 auto t_base = data.getFTensor0N();
752 auto &nf = AssemblyDomainEleOp::locF;
753 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
754 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
758 t_rhs(L) = alpha * (t_res_flow(
i,
j) * t_L(
i,
j, L));
761 auto t_nf = getFTensor1FromArray<size_symm, size_symm>(nf);
763 for (; bb != AssemblyDomainEleOp::nbRows /
size_symm; ++bb) {
764 t_nf(L) += t_base * t_rhs(L);
768 for (; bb < nb_base_functions; ++bb)
868 &mat(6 * rr + 0, 0), &mat(6 * rr + 0, 1), &mat(6 * rr + 0, 2),
869 &mat(6 * rr + 0, 3), &mat(6 * rr + 0, 4), &mat(6 * rr + 0, 5),
870 &mat(6 * rr + 1, 0), &mat(6 * rr + 1, 1), &mat(6 * rr + 1, 2),
871 &mat(6 * rr + 1, 3), &mat(6 * rr + 1, 4), &mat(6 * rr + 1, 5),
872 &mat(6 * rr + 2, 0), &mat(6 * rr + 2, 1), &mat(6 * rr + 2, 2),
873 &mat(6 * rr + 2, 3), &mat(6 * rr + 2, 4), &mat(6 * rr + 2, 5),
874 &mat(6 * rr + 3, 0), &mat(6 * rr + 3, 1), &mat(6 * rr + 3, 2),
875 &mat(6 * rr + 3, 3), &mat(6 * rr + 3, 4), &mat(6 * rr + 3, 5),
876 &mat(6 * rr + 4, 0), &mat(6 * rr + 4, 1), &mat(6 * rr + 4, 2),
877 &mat(6 * rr + 4, 3), &mat(6 * rr + 4, 4), &mat(6 * rr + 4, 5),
878 &mat(6 * rr + 5, 0), &mat(6 * rr + 5, 1), &mat(6 * rr + 5, 2),
879 &mat(6 * rr + 5, 3), &mat(6 * rr + 5, 4), &mat(6 * rr + 5, 5)};
885 EntitiesFieldData::EntData &row_data,
886 EntitiesFieldData::EntData &col_data) {
893 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
897 auto &locMat = AssemblyDomainEleOp::locMat;
899 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
900 const auto nb_row_base_functions = row_data.getN().size2();
902 auto t_res_flow_dstrain =
903 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrain);
904 auto t_res_flow_dplastic_strain =
905 getFTensor4DdgFromMat<DIM, DIM>(commonDataPtr->resFlowDstrainDot);
906 auto t_L = FTensor::symm_l_tensor<double, DIM>();
909 ++t_res_flow_dstrain;
910 ++t_res_flow_dplastic_strain;
913 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
914 auto t_row_base = row_data.getFTensor0N();
915 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
916 double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
921 alpha * (t_L(
i,
j, O) * ((t_res_flow_dplastic_strain(
i,
j,
k,
l) -
922 t_res_flow_dstrain(
i,
j,
k,
l)) *
927 for (; rr != AssemblyDomainEleOp::nbRows /
size_symm; ++rr) {
930 auto t_col_base = col_data.getFTensor0N(gg, 0);
931 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols /
size_symm; ++cc) {
932 t_mat(O, L) += ((t_row_base * t_col_base) * t_res_mat(O, L));
940 for (; rr < nb_row_base_functions; ++rr)
1005 EntitiesFieldData::EntData &row_data,
1006 EntitiesFieldData::EntData &col_data) {
1011 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1014 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1015 const size_t nb_row_base_functions = row_data.getN().size2();
1016 auto &locMat = AssemblyDomainEleOp::locMat;
1018 auto t_res_flow_dtau =
1019 getFTensor2SymmetricFromMat<DIM>(commonDataPtr->resFlowDtau);
1021 auto t_L = FTensor::symm_l_tensor<double, DIM>();
1023 auto next = [&]() { ++t_res_flow_dtau; };
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;
1031 t_res_vec(L) = alpha * (t_res_flow_dtau(
i,
j) * t_L(
i,
j, L));
1035 for (; rr != AssemblyDomainEleOp::nbRows /
size_symm; ++rr) {
1038 auto t_col_base = col_data.getFTensor0N(gg, 0);
1039 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; cc++) {
1040 t_mat(L) += t_row_base * t_col_base * t_res_vec(L);
1046 for (; rr != nb_row_base_functions; ++rr)
1093 EntitiesFieldData::EntData &row_data,
1094 EntitiesFieldData::EntData &col_data) {
1099 constexpr auto size_symm = (DIM * (DIM + 1)) / 2;
1102 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1103 const auto nb_row_base_functions = row_data.getN().size2();
1106 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdStrain);
1107 auto t_c_dplastic_strain =
1108 getFTensor2SymmetricFromMat<SPACE_DIM>(commonDataPtr->resCdPlasticStrain);
1112 ++t_c_dplastic_strain;
1115 auto t_L = FTensor::symm_l_tensor<double, SPACE_DIM>();
1117 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1118 auto t_row_base = row_data.getFTensor0N();
1119 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
1120 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1125 t_L(
i,
j, L) * (t_c_dplastic_strain(
i,
j) - t_c_dstrain(
i,
j));
1131 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1132 const auto row_base = alpha * t_row_base;
1133 auto t_col_base = col_data.getFTensor0N(gg, 0);
1134 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols /
size_symm; cc++) {
1135 t_mat(L) += (row_base * t_col_base) * t_res_vec(L);
1141 for (; rr != nb_row_base_functions; ++rr)
1175 EntitiesFieldData::EntData &row_data,
1176 EntitiesFieldData::EntData &col_data) {
1179 const auto nb_integration_pts = AssemblyDomainEleOp::getGaussPts().size2();
1180 const auto nb_row_base_functions = row_data.getN().size2();
1182 auto t_res_c_dtau = getFTensor0FromVec(commonDataPtr->resCdTau);
1183 auto next = [&]() { ++t_res_c_dtau; };
1185 auto t_w = AssemblyDomainEleOp::getFTensor0IntegrationWeight();
1186 auto t_row_base = row_data.getFTensor0N();
1187 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
1188 const double alpha = AssemblyDomainEleOp::getMeasure() * t_w;
1191 const auto res = alpha * (t_res_c_dtau);
1194 auto mat_ptr = AssemblyDomainEleOp::locMat.data().begin();
1196 for (; rr != AssemblyDomainEleOp::nbRows; ++rr) {
1197 auto t_col_base = col_data.getFTensor0N(gg, 0);
1198 for (
size_t cc = 0; cc != AssemblyDomainEleOp::nbCols; ++cc) {
1199 *mat_ptr += t_row_base * t_col_base * res;
1205 for (; rr < nb_row_base_functions; ++rr)