43 const std::string
field_name, boost::shared_ptr<CommonData> common_data_ptr)
45 commonDataPtr(common_data_ptr) {
55 const size_t nb_gauss_pts =
commonDataPtr->mStressPtr->size2();
56 auto t_stress = getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->mStressPtr));
58 commonDataPtr->plasticSurfacePtr->resize(nb_gauss_pts,
false);
59 commonDataPtr->plasticFlowPtr->resize(6, nb_gauss_pts,
false);
60 auto t_flow = getFTensor2SymmetricFromMat<3>(*
commonDataPtr->plasticFlowPtr);
61 auto t_plastic_strain =
62 getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->plasticStrainPtr));
70 t_flow(
i,
j) = t_flow_tmp(
i,
j);
81 boost::shared_ptr<CommonData> common_data_ptr,
82 boost::shared_ptr<MatrixDouble> mat_d_ptr)
84 commonDataPtr(common_data_ptr), matDPtr(mat_d_ptr) {
93 const size_t nb_gauss_pts =
commonDataPtr->mStrainPtr->size2();
96 auto t_D = getFTensor4DdgFromMat<3, 3, 0>(*
matDPtr);
97 auto t_strain = getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->mStrainPtr));
98 auto t_plastic_strain =
99 getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->plasticStrainPtr));
101 auto t_stress = getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->mStressPtr));
103 for (
size_t gg = 0; gg != nb_gauss_pts; ++gg) {
105 t_D(
i,
j,
k,
l) * (t_strain(
k,
l) - t_plastic_strain(
k,
l));
117 const std::string
field_name, boost::shared_ptr<CommonData> common_data_ptr)
119 commonDataPtr(common_data_ptr) {}
123 const size_t nb_dofs = data.
getIndices().size();
126 auto get_dt = [&]() {
128 CHKERR TSGetTimeStep(getFEMethod()->ts, &
dt);
132 const auto dt = get_dt();
135 getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->plasticFlowPtr));
137 auto t_plastic_strain_dot =
138 getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->plasticStrainDotPtr));
141 auto t_D = getFTensor4DdgFromMat<3, 3, 0>(*
commonDataPtr->mtD);
143 const size_t nb_integration_pts = data.
getN().size1();
144 const size_t nb_base_functions = data.
getN().size2();
145 auto t_w = getFTensor0IntegrationWeight();
148 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
149 double alpha =
dt * getMeasure() * t_w;
152 &locF(1), &locF(3), &locF(4),
153 &locF(2), &locF(4), &locF(5)};
156 t_flow_stress_diff(
i,
j) = t_D(
i,
j,
k,
l) * (t_plastic_strain_dot(
k,
l) -
157 t_tau_dot * t_flow(
k,
l));
160 for (; bb != nb_dofs / 6; ++bb) {
161 t_nf(
i,
j) +=
alpha * t_base * t_flow_stress_diff(
i,
j);
165 for (; bb < nb_base_functions; ++bb)
169 ++t_plastic_strain_dot;
179 const std::string
field_name, boost::shared_ptr<CommonData> common_data_ptr)
181 commonDataPtr(common_data_ptr) {}
186 const size_t nb_dofs = data.
getIndices().size();
189 auto get_dt = [&]() {
191 CHKERR TSGetTimeStep(getFEMethod()->ts, &
dt);
195 const auto dt = get_dt();
200 auto t_w = getFTensor0IntegrationWeight();
203 const size_t nb_integration_pts = data.
getN().size1();
204 const size_t nb_base_functions = data.
getN().size2();
205 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
206 const double alpha =
dt * getMeasure() * t_w * (*cache).scale_constraint;
210 for (; bb != nb_dofs; ++bb) {
211 locF(bb) += beta * t_base;
214 for (; bb < nb_base_functions; ++bb)
227template <
bool LOGSTRAIN>
230 const std::string row_field_name,
const std::string col_field_name,
231 boost::shared_ptr<CommonData> common_data_ptr,
232 boost::shared_ptr<MatrixDouble> mat_D_ptr)
235 commonDataPtr(common_data_ptr), matDPtr(mat_D_ptr) {
238template <
bool LOGSTRAIN>
243 const size_t nb_row_dofs = row_data.
getIndices().size();
244 const size_t nb_col_dofs = col_data.
getIndices().size();
245 if (nb_row_dofs && nb_col_dofs) {
247 const size_t nb_integration_pts = row_data.
getN().size1();
248 const size_t nb_row_base_functions = row_data.
getN().size2();
249 auto t_w = getFTensor0IntegrationWeight();
251 auto t_D = getFTensor4DdgFromMat<3, 3, 0>(*matDPtr);
254 auto t_dE_dF = getFTensor4FromMat<3, 3, 3, 3>(dE_dF);
263 for (
int ii = 0; ii != 3; ++ii)
264 for (
int jj = ii; jj != 3; ++jj)
265 for (
int kk = 0; kk != 3; ++kk)
266 for (
int ll = 0; ll != 3; ++ll)
267 for (
int LL = 0; LL != 6; ++LL)
268 t_DL(ii, jj, LL) += t_D(ii, jj, kk, ll) * t_L(kk, ll, LL);
271 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
272 double alpha = getMeasure() * t_w;
287 D2_symm(
k,
l,
m,
n) = t_D(
m,
n,
i,
j) * t_dE_dF(
i,
j,
k,
l);
290 for (
int ii = 0; ii != 3; ++ii)
291 for (
int jj = 0; jj != 3; ++jj)
292 for (
int kk = 0; kk != 3; ++kk)
293 for (
int ll = 0; ll != 3; ++ll)
294 for (
int LL = 0; LL != 6; ++LL)
296 D2_symm(ii, jj, kk, ll) * t_L(kk, ll, LL);
300 for (; rr != nb_row_dofs / 3; ++rr) {
303 &locMat(3 * rr + 0, 0), &locMat(3 * rr + 0, 1),
304 &locMat(3 * rr + 0, 2), &locMat(3 * rr + 0, 3),
305 &locMat(3 * rr + 0, 4), &locMat(3 * rr + 0, 5),
306 &locMat(3 * rr + 1, 0), &locMat(3 * rr + 1, 1),
307 &locMat(3 * rr + 1, 2), &locMat(3 * rr + 1, 3),
308 &locMat(3 * rr + 1, 4), &locMat(3 * rr + 1, 5),
309 &locMat(3 * rr + 2, 0), &locMat(3 * rr + 2, 1),
310 &locMat(3 * rr + 2, 2), &locMat(3 * rr + 2, 3),
311 &locMat(3 * rr + 2, 4), &locMat(3 * rr + 2, 5)};
317 t_tmp(
i,
L) = (t_DLs(
i,
j,
L) * (alpha * t_row_diff_base(
j)));
320 t_tmp(
i,
L) = (t_DL(
i,
j,
L) * (alpha * t_row_diff_base(
j)));
322 for (
size_t cc = 0; cc != nb_col_dofs / 6; ++cc) {
324 t_mat(
i,
L) -= (t_col_base * t_tmp(
i,
L));
336 for (; rr < nb_row_base_functions; ++rr)
345template <
bool LOGSTRAIN>
347 const std::string row_field_name,
const std::string col_field_name,
348 boost::shared_ptr<CommonData> common_data_ptr)
351 commonDataPtr(common_data_ptr) {
354template <
bool LOGSTRAIN>
360 const size_t nb_row_dofs = row_data.
getIndices().size();
361 const size_t nb_col_dofs = col_data.
getIndices().size();
362 if (nb_row_dofs && nb_col_dofs) {
364 auto get_dt = [&]() {
366 CHKERR TSGetTimeStep(getFEMethod()->ts, &
dt);
370 const auto dt = get_dt();
372 const size_t nb_integration_pts = row_data.
getN().size1();
373 const size_t nb_row_base_functions = row_data.
getN().size2();
374 auto t_w = getFTensor0IntegrationWeight();
376 auto get_row_base = [&]() {
377 if (commonDataPtr->isDualBase) {
378 double *base_ptr = &*commonDataPtr->dualBaseMat.data().begin();
384 auto t_row_base = get_row_base();
388 auto &diff_dev = commonDataPtr->diffDeviator;
390 getFTensor2SymmetricFromMat<3>(*(commonDataPtr->plasticFlowPtr));
391 auto t_D = getFTensor4DdgFromMat<3, 3, 0>(*commonDataPtr->mtD);
393 getFTensor4DdgFromMat<3, 3, 0>(*commonDataPtr->mtD_Deviator);
396 auto t_dE_dF = getFTensor4FromMat<3, 3, 3, 3>(dE_dF);
400 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
402 double alpha =
dt * getMeasure() * t_w;
406 t_flow_stress_dstrain(
i,
j,
k,
l) =
407 t_D(
i,
j,
m,
n) * t_diff_plastic_flow_dstrain(
m,
n,
k,
l);
411 t_diff_plastic_flow_stress_dgrad(
i,
j,
k,
l) =
412 t_flow_stress_dstrain(
i,
j,
m,
n) * t_diff_symmetrize(
m,
n,
k,
l);
416 t_diff_plastic_flow_stress_dgrads(
i,
j,
k,
l) =
417 t_flow_stress_dstrain(
i,
j,
m,
n) * t_diff_symmetrize(
m,
n,
k,
l);
418 t_diff_plastic_flow_stress_dgrad(
i,
j,
k,
l) = 0.;
419 for (
int i = 0;
i != 3; ++
i)
420 for (
int j = 0;
j != 3; ++
j)
421 for (
int k = 0;
k != 3; ++
k)
422 for (
int l = 0;
l != 3; ++
l)
423 for (
int m = 0;
m != 3; ++
m)
424 for (
int n = 0;
n != 3; ++
n)
425 t_diff_plastic_flow_stress_dgrad(
i,
j,
k,
l) +=
426 t_diff_plastic_flow_stress_dgrads(
i,
j,
m,
n) *
431 for (; rr != nb_row_dofs / 6; ++rr) {
439 &locMat(6 * rr + 0, 0),
440 &locMat(6 * rr + 0, 1),
441 &locMat(6 * rr + 0, 2),
443 &locMat(6 * rr + 1, 0),
444 &locMat(6 * rr + 1, 1),
445 &locMat(6 * rr + 1, 2),
447 &locMat(6 * rr + 2, 0),
448 &locMat(6 * rr + 2, 1),
449 &locMat(6 * rr + 2, 2),
451 &locMat(6 * rr + 1, 0),
452 &locMat(6 * rr + 1, 1),
453 &locMat(6 * rr + 1, 2),
455 &locMat(6 * rr + 3, 0),
456 &locMat(6 * rr + 3, 1),
457 &locMat(6 * rr + 3, 2),
459 &locMat(6 * rr + 4, 0),
460 &locMat(6 * rr + 4, 1),
461 &locMat(6 * rr + 4, 2),
463 &locMat(6 * rr + 2, 0),
464 &locMat(6 * rr + 2, 1),
465 &locMat(6 * rr + 2, 2),
467 &locMat(6 * rr + 4, 0),
468 &locMat(6 * rr + 4, 1),
469 &locMat(6 * rr + 4, 2),
471 &locMat(6 * rr + 5, 0),
472 &locMat(6 * rr + 5, 1),
473 &locMat(6 * rr + 5, 2)
476 const double c0 = alpha * t_row_base * t_tau_dot;
479 for (
size_t cc = 0; cc != nb_col_dofs / 3; ++cc) {
481 t_mat(
i,
j,
l) -= c0 * (t_diff_plastic_flow_stress_dgrad(
i,
j,
l,
k) *
490 for (; rr < nb_row_base_functions; ++rr)
507 const std::string row_field_name,
const std::string col_field_name,
508 boost::shared_ptr<CommonData> common_data_ptr)
511 commonDataPtr(common_data_ptr) {
519 const size_t nb_row_dofs = row_data.
getIndices().size();
520 const size_t nb_col_dofs = col_data.
getIndices().size();
521 if (nb_row_dofs && nb_col_dofs) {
523 auto get_dt = [&]() {
525 CHKERR TSGetTimeStep(getFEMethod()->ts, &
dt);
529 const auto dt = get_dt();
531 const size_t nb_integration_pts = row_data.
getN().size1();
532 const size_t nb_row_base_functions = row_data.
getN().size2();
533 auto t_w = getFTensor0IntegrationWeight();
535 auto get_row_base = [&]() {
537 double *base_ptr = &*
commonDataPtr->dualBaseMat.data().begin();
543 auto t_row_base = get_row_base();
549 getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->plasticFlowPtr));
551 auto t_D = getFTensor4DdgFromMat<3, 3, 0>(*
commonDataPtr->mtD);
553 getFTensor4DdgFromMat<3, 3, 0>(*
commonDataPtr->mtD_Deviator);
555 auto t_omega = getFTensor1FromMat<3>(*
commonDataPtr->guidingVelocityPtr);
556 bool is_rotating =
commonDataPtr->guidingVelocityPtr->size2() > 1;
560 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
561 double alpha =
dt * getMeasure() * t_w;
562 double c1 = alpha * getTSa();
563 const double c0 = alpha * t_tau_dot;
569 my_tensor(
i,
j,
k,
l) =
570 (t_D(
i,
j,
m,
n) * (c1 * t_diff_plastic_strain(
m,
n,
k,
l) +
571 c0 * t_diff_plastic_flow_dstrain(
m,
n,
k,
l)));
574 for (; rr != nb_row_dofs / 6; ++rr) {
591 &locMat(6 * rr + 0, 0),
592 &locMat(6 * rr + 0, 1),
593 &locMat(6 * rr + 0, 2),
594 &locMat(6 * rr + 0, 1),
595 &locMat(6 * rr + 0, 3),
596 &locMat(6 * rr + 0, 4),
597 &locMat(6 * rr + 0, 2),
598 &locMat(6 * rr + 0, 4),
599 &locMat(6 * rr + 0, 5),
601 &locMat(6 * rr + 1, 0),
602 &locMat(6 * rr + 1, 1),
603 &locMat(6 * rr + 1, 2),
604 &locMat(6 * rr + 1, 1),
605 &locMat(6 * rr + 1, 3),
606 &locMat(6 * rr + 1, 4),
607 &locMat(6 * rr + 1, 2),
608 &locMat(6 * rr + 1, 4),
609 &locMat(6 * rr + 1, 5),
611 &locMat(6 * rr + 2, 0),
612 &locMat(6 * rr + 2, 1),
613 &locMat(6 * rr + 2, 2),
614 &locMat(6 * rr + 2, 1),
615 &locMat(6 * rr + 2, 3),
616 &locMat(6 * rr + 2, 4),
617 &locMat(6 * rr + 2, 2),
618 &locMat(6 * rr + 2, 4),
619 &locMat(6 * rr + 2, 5),
621 &locMat(6 * rr + 1, 0),
622 &locMat(6 * rr + 1, 1),
623 &locMat(6 * rr + 1, 2),
624 &locMat(6 * rr + 1, 1),
625 &locMat(6 * rr + 1, 3),
626 &locMat(6 * rr + 1, 4),
627 &locMat(6 * rr + 1, 2),
628 &locMat(6 * rr + 1, 4),
629 &locMat(6 * rr + 1, 5),
631 &locMat(6 * rr + 3, 0),
632 &locMat(6 * rr + 3, 1),
633 &locMat(6 * rr + 3, 2),
634 &locMat(6 * rr + 3, 1),
635 &locMat(6 * rr + 3, 3),
636 &locMat(6 * rr + 3, 4),
637 &locMat(6 * rr + 3, 2),
638 &locMat(6 * rr + 3, 4),
639 &locMat(6 * rr + 3, 5),
641 &locMat(6 * rr + 4, 0),
642 &locMat(6 * rr + 4, 1),
643 &locMat(6 * rr + 4, 2),
644 &locMat(6 * rr + 4, 1),
645 &locMat(6 * rr + 4, 3),
646 &locMat(6 * rr + 4, 4),
647 &locMat(6 * rr + 4, 2),
648 &locMat(6 * rr + 4, 4),
649 &locMat(6 * rr + 4, 5),
651 &locMat(6 * rr + 2, 0),
652 &locMat(6 * rr + 2, 1),
653 &locMat(6 * rr + 2, 2),
654 &locMat(6 * rr + 2, 1),
655 &locMat(6 * rr + 2, 3),
656 &locMat(6 * rr + 2, 4),
657 &locMat(6 * rr + 2, 2),
658 &locMat(6 * rr + 2, 4),
659 &locMat(6 * rr + 2, 5),
661 &locMat(6 * rr + 4, 0),
662 &locMat(6 * rr + 4, 1),
663 &locMat(6 * rr + 4, 2),
664 &locMat(6 * rr + 4, 1),
665 &locMat(6 * rr + 4, 3),
666 &locMat(6 * rr + 4, 4),
667 &locMat(6 * rr + 4, 2),
668 &locMat(6 * rr + 4, 4),
669 &locMat(6 * rr + 4, 5),
671 &locMat(6 * rr + 5, 0),
672 &locMat(6 * rr + 5, 1),
673 &locMat(6 * rr + 5, 2),
674 &locMat(6 * rr + 5, 1),
675 &locMat(6 * rr + 5, 3),
676 &locMat(6 * rr + 5, 4),
677 &locMat(6 * rr + 5, 2),
678 &locMat(6 * rr + 5, 4),
679 &locMat(6 * rr + 5, 5)
685 for (
size_t cc = 0; cc != nb_col_dofs / 6; ++cc) {
686 t_mat(
i,
j,
k,
l) += my_tensor(
i,
j,
k,
l) * t_col_base * t_row_base;
691 (t_D(
i,
j,
m,
n) * (alpha * t_diff_plastic_strain(
m,
n,
k,
l) *
692 (t_col_diff_base(
i) * t_omega(
i))));
701 for (; rr < nb_row_base_functions; ++rr)
718 const std::string row_field_name,
const std::string col_field_name,
719 boost::shared_ptr<CommonData> common_data_ptr)
722 commonDataPtr(common_data_ptr) {
730 const size_t nb_row_dofs = row_data.
getIndices().size();
731 const size_t nb_col_dofs = col_data.
getIndices().size();
732 if (nb_row_dofs && nb_col_dofs) {
734 auto get_dt = [&]() {
736 CHKERR TSGetTimeStep(getFEMethod()->ts, &
dt);
740 const auto dt = get_dt();
742 const size_t nb_integration_pts = row_data.
getN().size1();
743 auto t_w = getFTensor0IntegrationWeight();
745 getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->plasticFlowPtr));
747 auto get_row_base = [&]() {
749 double *base_ptr = &*
commonDataPtr->dualBaseMat.data().begin();
755 auto t_row_base = get_row_base();
757 auto t_omega = getFTensor1FromMat<3>(*
commonDataPtr->guidingVelocityPtr);
758 bool is_rotating =
commonDataPtr->guidingVelocityPtr->size2() > 1;
760 auto t_D = getFTensor4DdgFromMat<3, 3, 0>(*
commonDataPtr->mtD);
762 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
763 double alpha =
dt * t_w * getMeasure();
764 double beta = alpha * getTSa();
767 t_flow_stress(
i,
j) = t_D(
i,
j,
m,
n) * t_flow(
m,
n);
769 for (
size_t rr = 0; rr != nb_row_dofs / 6; ++rr) {
772 &locMat(6 * rr + 0, 0), &locMat(6 * rr + 1, 0),
773 &locMat(6 * rr + 2, 0), &locMat(6 * rr + 1, 0),
774 &locMat(6 * rr + 3, 0), &locMat(6 * rr + 4, 0),
775 &locMat(6 * rr + 2, 0), &locMat(6 * rr + 4, 0),
776 &locMat(6 * rr + 5, 0)};
780 for (
size_t cc = 0; cc != nb_col_dofs; cc++) {
781 t_mat(
i,
j) -= beta * t_row_base * t_col_base * t_flow_stress(
i,
j);
783 t_mat(
i,
j) -= alpha * t_row_base *
784 t_flow_stress(
i,
j) *
785 (t_col_diff_base(
k) * t_omega(
k));
805 const std::string row_field_name,
const std::string col_field_name,
806 boost::shared_ptr<CommonData> common_data_ptr)
809 commonDataPtr(common_data_ptr) {
819template <
bool LOGSTRAIN>
821 const std::string row_field_name,
const std::string col_field_name,
822 boost::shared_ptr<CommonData> common_data_ptr)
825 commonDataPtr(common_data_ptr) {
828template <
bool LOGSTRAIN>
834 const size_t nb_row_dofs = row_data.
getIndices().size();
835 const size_t nb_col_dofs = col_data.
getIndices().size();
836 if (nb_row_dofs && nb_col_dofs) {
838 auto get_dt = [&]() {
840 CHKERR TSGetTimeStep(getFEMethod()->ts, &
dt);
844 const auto dt = get_dt();
846 const size_t nb_integration_pts = row_data.
getN().size1();
847 const size_t nb_row_base_functions = row_data.
getN().size2();
848 auto t_w = getFTensor0IntegrationWeight();
850 auto get_row_base = [&]() {
851 if (commonDataPtr->isDualBase) {
852 double *base_ptr = &*commonDataPtr->dualBaseMat.data().begin();
858 auto t_row_base = get_row_base();
864 getFTensor2SymmetricFromMat<3>(*(commonDataPtr->plasticFlowPtr));
866 getFTensor2SymmetricFromMat<3>(*(commonDataPtr->mStressPtr));
867 auto t_D = getFTensor4DdgFromMat<3, 3, 0>(*commonDataPtr->mtD);
869 getFTensor4DdgFromMat<3, 3, 0>(*commonDataPtr->mtD_Deviator);
873 auto t_dE_dF = getFTensor4FromMat<3, 3, 3, 3>(dE_dF);
875 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
876 double alpha =
dt * getMeasure() * t_w * (*cache).scale_constraint;
886 t_diff_constrain_dgrad(
k,
l) =
887 t_diff_constrain_dstrain(
i,
j) * t_diff_symmetrize(
i,
j,
k,
l);
891 t_diff_constrain_dgrad(
k,
l) =
892 t_diff_constrain_dstrain(
i,
j) * t_dE_dF(
i,
j,
k,
l);
899 for (; rr != nb_row_dofs; ++rr) {
902 for (
size_t cc = 0; cc != nb_col_dofs / 3; cc++) {
904 t_mat(
i) += alpha * t_row_base * t_diff_constrain_dgrad(
i,
j) *
913 for (; rr != nb_row_base_functions; ++rr)
932 const std::string row_field_name,
const std::string col_field_name,
933 boost::shared_ptr<CommonData> common_data_ptr)
936 commonDataPtr(common_data_ptr) {
944 const size_t nb_row_dofs = row_data.
getIndices().size();
945 const size_t nb_col_dofs = col_data.
getIndices().size();
946 if (nb_row_dofs && nb_col_dofs) {
948 auto get_dt = [&]() {
950 CHKERR TSGetTimeStep(getFEMethod()->ts, &
dt);
954 const auto dt = get_dt();
956 const size_t nb_integration_pts = row_data.
getN().size1();
957 const size_t nb_row_base_functions = row_data.
getN().size2();
958 auto t_w = getFTensor0IntegrationWeight();
960 auto get_row_base = [&]() {
962 double *base_ptr = &*
commonDataPtr->dualBaseMat.data().begin();
968 auto t_row_base = get_row_base();
974 getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->plasticFlowPtr));
976 auto t_D = getFTensor4DdgFromMat<3, 3, 0>(*
commonDataPtr->mtD);
978 getFTensor4DdgFromMat<3, 3, 0>(*
commonDataPtr->mtD_Deviator);
984 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
985 double alpha =
dt * getMeasure() * t_w * (*cache).scale_constraint;
987 auto mat_ptr = locMat.data().begin();
994 &locMat(0, 2), &locMat(0, 3),
995 &locMat(0, 4), &locMat(0, 5));
998 for (; rr != nb_row_dofs; ++rr) {
1001 for (
size_t cc = 0; cc != nb_col_dofs / 6; cc++) {
1003 t_mat(
L) -= (alpha * t_row_base * t_col_base) *
1004 (t_diff_constrain_dstrain(
i,
j) * t_L(
i,
j,
L));
1012 for (; rr != nb_row_base_functions; ++rr)
1027 const std::string row_field_name,
const std::string col_field_name,
1028 boost::shared_ptr<CommonData> common_data_ptr)
1031 commonDataPtr(common_data_ptr) {
1039 const size_t nb_row_dofs = row_data.
getIndices().size();
1040 const size_t nb_col_dofs = col_data.
getIndices().size();
1041 if (nb_row_dofs && nb_col_dofs) {
1043 auto get_dt = [&]() {
1045 CHKERR TSGetTimeStep(getFEMethod()->ts, &
dt);
1049 const auto dt = get_dt();
1051 const size_t nb_integration_pts = row_data.
getN().size1();
1052 const size_t nb_row_base_functions = row_data.
getN().size2();
1053 auto t_w = getFTensor0IntegrationWeight();
1058 auto t_omega = getFTensor1FromMat<3>(*
commonDataPtr->guidingVelocityPtr);
1059 bool is_rotating =
commonDataPtr->guidingVelocityPtr->size2() > 1;
1061 auto &
cn = (*cache).cn_pl;
1063 auto get_row_base = [&]() {
1065 double *base_ptr = &*
commonDataPtr->dualBaseMat.data().begin();
1071 auto t_row_base = get_row_base();
1073 for (
size_t gg = 0; gg != nb_integration_pts; ++gg) {
1074 const double alpha =
dt * getMeasure() * t_w * (*cache).scale_constraint;
1075 const double t_a = getTSa();
1083 auto mat_ptr = locMat.data().begin();
1086 for (; rr != nb_row_dofs; ++rr) {
1090 for (
size_t cc = 0; cc != nb_col_dofs; ++cc) {
1092 *mat_ptr += (c0 * t_a + c1) * t_row_base * t_col_base;
1096 c0 * (t_col_base * t_a + (t_col_diff_base(
i) * t_omega(
i)));
1097 *mat_ptr += (c0_p + c1 * t_col_base) * t_row_base;
1106 for (; rr < nb_row_base_functions; ++rr)
1123 const std::string
field_name, moab::Interface &post_proc_mesh,
1124 std::vector<EntityHandle> &map_gauss_pts,
1125 boost::shared_ptr<CommonData> common_data_ptr)
1127 postProcMesh(post_proc_mesh), mapGaussPts(map_gauss_pts),
1128 commonDataPtr(common_data_ptr) {
1138 std::array<double, 9> def;
1139 std::fill(def.begin(), def.end(), 0);
1141 auto get_tag = [&](
const std::string name,
size_t size) {
1144 MB_TAG_CREAT | MB_TAG_SPARSE,
1153 for (
size_t r = 0; r != 3; ++r)
1154 for (
size_t c = 0;
c != 3; ++
c)
1155 mat(r,
c) =
t(r,
c);
1167 &*mat.data().begin());
1170 auto th_plastic_surface = get_tag(
"PLASTIC_SURFACE", 1);
1171 auto th_tau = get_tag(
"PLASTIC_MULTIPLIER", 1);
1173 auto th_eqv_ep = get_tag(
"EQUIV_EP", 1);
1174 auto th_hardening = get_tag(
"HARDENING", 1);
1176 auto th_plastic_flow = get_tag(
"PLASTIC_FLOW", 9);
1177 string strain_name =
"PLASTIC_STRAIN";
1179 auto th_plastic_strain = get_tag(strain_name, 9);
1182 getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->plasticFlowPtr));
1183 auto t_plastic_strain =
1184 getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->plasticStrainPtr));
1185 auto t_stress = getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->mStressPtr));
1188 for (; gg !=
commonDataPtr->plasticSurfacePtr->size(); ++gg) {
1192 auto plast_surface = f / (*cache).young_modulus_inv;
1193 CHKERR set_tag(th_plastic_surface, gg, set_scalar(plast_surface));
1194 CHKERR set_tag(th_tau, gg, set_scalar(tau));
1204 CHKERR set_tag(th_plastic_strain, gg, set_matrix_3d(t_plastic_strain));
1205 const double eqv_ep =
1206 std::sqrt(t_plastic_strain(
i,
j) * t_plastic_strain(
i,
j));
1208 const double hard =
hardening(tau) / (*cache).young_modulus_inv;
1209 CHKERR set_tag(th_hardening, gg, set_scalar(hard));
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
FTensor::Index< 'n', SPACE_DIM > n
FTensor::Index< 'm', SPACE_DIM > m
FTensor::Index< 'i', SPACE_DIM > i
const double c
speed of light (cm/ns)
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
Tensors class implemented by Walter Landry.
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
implementation of Data Operators for Forces and Sources
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
constexpr IntegrationType I
constexpr double t
plate stiffness
constexpr auto field_name
std::array< bool, MBMAXTYPE > doEntities
If true operator is executed for entity.
Data on single entity (This is passed as argument to DataOperator::doWork)
FTensor::Tensor1< FTensor::PackPtr< double *, Tensor_Dim >, Tensor_Dim > getFTensor1DiffN(const FieldApproximationBase base)
Get derivatives of base functions.
FTensor::Tensor0< FTensor::PackPtr< double *, 1 > > getFTensor0N(const FieldApproximationBase base)
Get base function as Tensor0.
MatrixDouble & getN(const FieldApproximationBase base)
get base functions this return matrix (nb. of rows is equal to nb. of Gauss pts, nb....
const VectorInt & getIndices() const
Get global indices of dofs on entity.
std::vector< EntityHandle > & mapGaussPts
MoFEMErrorCode doWork(int side, EntityType type, EntData &data)
[Postprocessing]
OpPostProcPlastic(const std::string field_name, moab::Interface &post_proc_mesh, std::vector< EntityHandle > &map_gauss_pts, boost::shared_ptr< CommonData > common_data_ptr)
moab::Interface & postProcMesh
boost::shared_ptr< CommonData > commonDataPtr