516 {
518
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) {
522
523 auto get_dt = [&]() {
525 CHKERR TSGetTimeStep(getFEMethod()->ts, &
dt);
528 };
529 const auto dt = get_dt();
530
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();
534
535 auto get_row_base = [&]() {
537 double *base_ptr = &*
commonDataPtr->dualBaseMat.data().begin();
539 } else {
541 }
542 };
543 auto t_row_base = get_row_base();
544
548 auto t_flow =
549 getFTensor2SymmetricFromMat<3>(*(
commonDataPtr->plasticFlowPtr));
550
551 auto t_D = getFTensor4DdgFromMat<3, 3, 0>(*
commonDataPtr->mtD);
552 auto t_D_Deviator =
553 getFTensor4DdgFromMat<3, 3, 0>(*
commonDataPtr->mtD_Deviator);
554
555 auto t_omega = getFTensor1FromMat<3>(*
commonDataPtr->guidingVelocityPtr);
556 bool is_rotating =
commonDataPtr->guidingVelocityPtr->size2() > 1;
557
559
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;
564
565
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)));
572
573 size_t rr = 0;
574 for (; rr != nb_row_dofs / 6; ++rr) {
575
576
577
578
579
580
581
582
583
584
585
586
587
588
590
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),
600
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),
610
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),
620
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),
630
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),
640
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),
650
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),
660
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),
670
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)
680
681 };
682
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;
687
688 if (is_rotating)
690 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))));
693
694 ++t_mat;
695 ++t_col_diff_base;
696 ++t_col_base;
697 }
698
699 ++t_row_base;
700 }
701 for (; rr < nb_row_base_functions; ++rr)
702 ++t_row_base;
703
704 if (is_rotating)
705 ++t_omega;
706
707 ++t_w;
708 ++t_f;
709 ++t_flow;
710 ++t_tau_dot;
711 }
712 }
713
715}
#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.
FTensor::Index< 'n', SPACE_DIM > n
FTensor::Index< 'm', SPACE_DIM > m
FTensor::Index< 'i', SPACE_DIM > i
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
static auto getFTensor0FromVec(ublas::vector< T, A > &data)
Get tensor rank 0 (scalar) form data vector.
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.