17template <
typename T1,
typename T2,
int DIM1,
int DIM2>
23 "Case of mixed dimension by gradient not implemented");
27 double ave_tr_strain = 0;
30 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
32 ave_tr_strain += t_w * t_grad(
i,
i);
36 ave_tr_strain /= (
DIM1 *
v);
41template <
typename T1,
typename T2,
int DIM1,
int DIM2,
int DIM3>
49 "Case of mixed dimension by gradient not implemented");
55 t_strain(
i,
j) = (t_grad(
i,
j) || t_grad(
j,
i)) / 2;
56 double tr_strain = t_grad(
i,
i) /
DIM1;
61 t_strain(
i,
j) += (ave_tr_strain - tr_strain) *
t_kd(
i,
j);
68 return t_voight_strain;
71template <
typename T1,
typename T2,
int DIM1,
int DIM3>
85 return t_voight_strain;
103 MatrixDouble &storage,
const bool b_bar,
104 const int nb_integration_pts,
double *w_ptr,
106 const auto nb_dofs = data.getFieldData().size();
107 const auto nb_bases = data.getN().size2();
109 storage.resize(nb_integration_pts, 6 * nb_dofs,
false);
120 auto get_ftensor2_symmetric = [&](
const int gg,
const int rr) {
125 auto calc_base = [&]() {
126 auto t_t2_diff = get_ftensor2_symmetric(0, 0);
127 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
128 auto t_diff = data.getFTensor1DiffN<DIM>(gg, 0);
129 for (
auto b = 0; b != nb_dofs / DIM; ++b) {
134 t_grad(N0,
J) = t_diff(
J);
135 t_t2_diff(
i,
j) = (t_grad(
i,
j) || t_grad(
j,
i)) / 2;
139 t_grad(N1,
J) = t_diff(
J);
140 t_t2_diff(
i,
j) = (t_grad(
i,
j) || t_grad(
j,
i)) / 2;
144 if constexpr (DIM == 3) {
145 t_grad(N2,
J) = t_diff(
J);
146 t_t2_diff(
i,
j) = (t_grad(
i,
j) || t_grad(
j,
i)) / 2;
153 return get_ftensor2_symmetric(0, 0);
157 auto calc_vol = [&](
auto &&t_t2_dff) {
158 std::vector<double> vol(nb_dofs, 0);
159 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
160 for (
auto b = 0; b != nb_dofs; ++b) {
161 vol[b] += w_ptr[gg] * t_t2_dff(
i,
i) / DIM;
166 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
169 for (
auto &
v : vol) {
176 auto make_b_bar = [&](
auto &&vol) {
177 auto t_t2_diff = get_ftensor2_symmetric(0, 0);
179 for (
auto gg = 0; gg != nb_integration_pts; ++gg) {
180 for (
auto b = 0; b != nb_dofs; ++b) {
181 const auto trace = t_t2_diff(
J,
J) / DIM;
186 return get_ftensor2_symmetric(0, 0);
189 return b_bar ? make_b_bar(calc_vol(calc_base())) : calc_base();
195 MatrixDouble &storage,
const bool b_bar,
196 const int nb_integration_pts,
double *w_ptr,
204 MatrixDouble &storage,
const bool b_bar,
205 const int nb_integration_pts,
double *w_ptr,
211struct OpUpdate :
public ForcesAndSourcesCore::UserDataOperator {
213 OpUpdate(boost::shared_ptr<CommonData> common_data_ptr);
216 DataForcesAndSourcesCore::EntData &data);
225 commonDataPtr(common_data_ptr) {}
228 DataForcesAndSourcesCore::EntData &data) {
231 int nb_gauss_pts = getGaussPts().size2();
233 for (
int gg = 0; gg < nb_gauss_pts; gg++) {
235 auto cp_plastic_strain =
commonDataPtr->getPlasticStrain(gg);
236 auto cp_internal_variables =
commonDataPtr->getInternalVariables(gg);
237 const auto nb_internal_variables = cp_internal_variables.size();
238 auto plastic_strain =
241 &
commonDataPtr->internalVariablesPtr[gg * nb_internal_variables],
242 nb_internal_variables);
243 plastic_strain = cp_plastic_strain;
244 internal_variables = cp_internal_variables;
251template <
int DIM, StrainType STRAIN>
255 boost::shared_ptr<CommonData> common_data_ptr,
256 boost::shared_ptr<ClosestPointProjection> cp_ptr,
262 boost::shared_ptr<ClosestPointProjection>
cpPtr;
271 const int nb_internal_variables);
274template <
int DIM, StrainType STRAIN>
280 DataForcesAndSourcesCore::EntData &data)
override;
288 DataForcesAndSourcesCore::EntData &data)
override;
297 DataForcesAndSourcesCore::EntData &data)
override;
300template <
int DIM, StrainType STRAIN>
303 boost::shared_ptr<ClosestPointProjection> cp_ptr,
bool calc_lhs)
306 mField(m_field), commonDataPtr(common_data_ptr), cpPtr(cp_ptr),
311template <
int DIM, StrainType STRAIN>
315 CHKERR mField.get_moab().tag_get_handle(
316 "PLASTIC_STRAIN", def_length, MB_TYPE_DOUBLE, thPlasticStrain,
317 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN, NULL);
318 CHKERR mField.get_moab().tag_get_handle(
319 "INTERNAL_VARIABLES", def_length, MB_TYPE_DOUBLE, thInternalVariables,
320 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN, NULL);
324template <
int DIM, StrainType STRAIN>
327 const int nb_internal_variables) {
332 rval = mField.get_moab().tag_get_by_ptr(
333 thPlasticStrain, &tet, 1,
334 (
const void **)&commonDataPtr->plasticStrainPtr,
335 &commonDataPtr->plasticStrainSize);
336 if (
rval != MB_SUCCESS ||
337 commonDataPtr->plasticStrainSize != 6 * nb_gauss_pts) {
338 v.resize(6 * nb_gauss_pts,
false);
341 tag_size[0] =
v.size();
342 void const *tag_data[] = {&
v[0]};
343 CHKERR mField.get_moab().tag_set_by_ptr(thPlasticStrain, &tet, 1,
345 CHKERR mField.get_moab().tag_get_by_ptr(
346 thPlasticStrain, &tet, 1,
347 (
const void **)&commonDataPtr->plasticStrainPtr,
348 &commonDataPtr->plasticStrainSize);
351 if (nb_internal_variables > 0) {
352 rval = mField.get_moab().tag_get_by_ptr(
353 thInternalVariables, &tet, 1,
354 (
const void **)&commonDataPtr->internalVariablesPtr,
355 &commonDataPtr->internalVariablesSize);
356 if (
rval != MB_SUCCESS || commonDataPtr->internalVariablesSize !=
357 nb_internal_variables * nb_gauss_pts) {
358 v.resize(nb_internal_variables * nb_gauss_pts,
false);
361 tag_size[0] =
v.size();
362 void const *tag_data[] = {&
v[0]};
363 CHKERR mField.get_moab().tag_set_by_ptr(thInternalVariables, &tet, 1,
365 CHKERR mField.get_moab().tag_get_by_ptr(
366 thInternalVariables, &tet, 1,
367 (
const void **)&commonDataPtr->internalVariablesPtr,
368 &commonDataPtr->internalVariablesSize);
377 DataForcesAndSourcesCore::EntData &data) {
380 auto do_work_impl = [
this](
auto commonDataPtr,
auto cpPtr) {
383 int nb_gauss_pts = this->getGaussPts().size2();
385 int nb_internal_variables = cpPtr->nbInternalVariables;
386 auto tet = this->getNumeredEntFiniteElementPtr()->getEnt();
387 CHKERR this->setTagsData(tet, nb_gauss_pts, nb_internal_variables);
389 commonDataPtr->activeVariablesW.resize(
390 nb_gauss_pts, 12 + cpPtr->nbInternalVariables,
false);
391 commonDataPtr->gradientW.resize(nb_gauss_pts,
392 12 + cpPtr->nbInternalVariables,
false);
393 commonDataPtr->materialTangentOperator.resize(36, nb_gauss_pts,
false);
394 commonDataPtr->deltaGamma.resize(nb_gauss_pts);
406 CHKERR SNESGetLinearSolveIterations(this->getFEMethod()->snes, &iter);
409 double ave_tr_strain = 0;
418 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
422 12 + cpPtr->nbInternalVariables);
423 cpPtr->activeVariablesW.swap(tmp_active);
425 12 + cpPtr->nbInternalVariables);
426 this->cpPtr->gradientW.swap(tmp_gradient);
428 auto t_voigt_strain =
429 calcStrain(commonDataPtr->bBar, ave_tr_strain, t_grad,
434 auto copy_plastic_strain_and_internal_variables = [&]() {
440 6, &commonDataPtr->plasticStrainPtr[gg * 6]));
442 nb_internal_variables,
443 ublas::shallow_array_adaptor<double>(
444 nb_internal_variables,
446 ->internalVariablesPtr[gg * nb_internal_variables]));
449 cpPtr->plasticStrain0.resize(6,
false);
450 noalias(cpPtr->plasticStrain0) = plastic_strain_tags;
451 cpPtr->internalVariables0.resize(nb_internal_variables,
false);
452 noalias(cpPtr->internalVariables0) = internal_variables_tags;
454 auto cp_plastic_strain = cpPtr->getPlasticStrain();
455 auto cp_internal_variables = cpPtr->getInternalVariables();
456 noalias(cp_plastic_strain) = plastic_strain_tags;
457 noalias(cp_internal_variables) = internal_variables_tags;
461 CHKERR copy_plastic_strain_and_internal_variables();
463 auto closest_point_projection = [&](
auto &recalculate_elastic_tangent) {
467 CHKERR cpPtr->setParams(
t, recalculate_elastic_tangent);
469 CHKERR cpPtr->playW_NoHessian();
470 CHKERR cpPtr->playY_NoGradient();
472 cpPtr->deltaGamma = 0;
473 if (iter > 0 && y > std::numeric_limits<double>::epsilon()) {
474 CHKERR cpPtr->solveClosestProjection();
476 commonDataPtr->deltaGamma[gg] = cpPtr->deltaGamma;
480 auto evaluate_consistent_tangent_matrix =
481 [&](
auto &recalculate_elastic_tangent) {
483 if (recalculate_elastic_tangent)
487 cpPtr->deltaGamma > std::numeric_limits<double>::epsilon()) {
489 CHKERR cpPtr->consistentTangent();
491 auto &
m = cpPtr->Cep;
496 &
m(0, 0), &
m(0, 1), &
m(0, 2), &
m(0, 3), &
m(0, 4),
499 &
m(1, 0), &
m(1, 1), &
m(1, 2), &
m(1, 3), &
m(1, 4),
502 &
m(2, 0), &
m(2, 1), &
m(2, 2), &
m(2, 3), &
m(2, 4),
505 &
m(3, 0), &
m(3, 1), &
m(3, 2), &
m(3, 3), &
m(3, 4),
508 &
m(4, 0), &
m(4, 1), &
m(4, 2), &
m(4, 3), &
m(4, 4),
511 &
m(5, 0), &
m(5, 1), &
m(5, 2), &
m(5, 3), &
m(5, 4), &
m(5, 5)
516 t_voight_stress_op(
i,
j, Z) *
517 (t_voight_cep(Z, Y) * t_voight_stress_op(
k,
l, Y));
524 &
m(0, 0), &
m(0, 1), &
m(0, 2), &
m(0, 3), &
m(0, 4),
527 &
m(1, 1), &
m(1, 2), &
m(1, 3), &
m(1, 4), &
m(1, 5),
529 &
m(2, 2), &
m(2, 3), &
m(2, 4), &
m(2, 5),
531 &
m(3, 3), &
m(3, 4), &
m(3, 5),
538 t_voight_stress_op(
i,
j, Z) *
539 (t_voight_cep(Z, Y) * t_voight_stress_op(
k,
l, Y));
547 bool recalculate_elastic_tangent =
548 (this->getNinTheLoop() == 0) ?
true :
false;
549 CHKERR closest_point_projection(recalculate_elastic_tangent);
551 CHKERR evaluate_consistent_tangent_matrix(recalculate_elastic_tangent);
554 auto calcs_stress_matrix = [&]() {
557 commonDataPtr->stressMatrix.resize(
558 6, this->commonDataPtr->gradientW.size1(),
false);
561 auto t_voight_stress = commonDataPtr->getFTensor1StressAtGaussPts();
562 for (
auto gg = 0; gg != commonDataPtr->gradientW.size1(); ++gg) {
563 t_stess(
i,
j) = t_voight_stress_op(
i,
j, Z) * t_voight_stress(Z);
570 auto calcs_plastic_strain_matrix = [&]() {
573 commonDataPtr->plasticStrainMatrix.resize(
574 6, commonDataPtr->activeVariablesW.size1(),
false);
575 auto t_plastic_strain =
577 auto t_voight_plastic_strain =
578 commonDataPtr->getFTensor1PlasticStrainAtGaussPts();
579 for (
auto gg = 0; gg != commonDataPtr->activeVariablesW.size1(); ++gg) {
580 t_plastic_strain(
i,
j) =
581 t_voight_strain_op(
i,
j, Z) * t_voight_plastic_strain(Z);
582 ++t_voight_plastic_strain;
588 CHKERR calcs_stress_matrix();
589 CHKERR calcs_plastic_strain_matrix();
593 CHKERR do_work_impl(this->commonDataPtr, this->cpPtr);
601 DataForcesAndSourcesCore::EntData &data) {
604 auto do_work_impl = [
this](
auto commonDataPtr,
auto cpPtr) {
607 int nb_gauss_pts = this->getGaussPts().size2();
609 int nb_internal_variables = cpPtr->nbInternalVariables;
610 auto tet = this->getNumeredEntFiniteElementPtr()->getEnt();
611 CHKERR this->setTagsData(tet, nb_gauss_pts, nb_internal_variables);
613 commonDataPtr->activeVariablesW.resize(
614 nb_gauss_pts, 12 + cpPtr->nbInternalVariables,
false);
615 commonDataPtr->gradientW.resize(nb_gauss_pts,
616 12 + cpPtr->nbInternalVariables,
false);
617 commonDataPtr->materialTangentOperator.resize(36, nb_gauss_pts,
false);
618 commonDataPtr->deltaGamma.resize(nb_gauss_pts);
630 CHKERR SNESGetLinearSolveIterations(this->getFEMethod()->snes, &iter);
635 this->commonDataPtr->bBar, nb_gauss_pts,
637 this->getFTensor0IntegrationWeight());
644 this->commonDataPtr->materialTangentOperator);
645 for (
auto gg = 0; gg != nb_gauss_pts; ++gg) {
649 12 + cpPtr->nbInternalVariables);
650 cpPtr->activeVariablesW.swap(tmp_active);
652 12 + cpPtr->nbInternalVariables);
653 cpPtr->gradientW.swap(tmp_gradient);
655 auto t_voigt_strain =
656 calcStrain(commonDataPtr->bBar, ave_tr_strain, t_grad,
661 auto copy_plastic_strain_and_internal_variables = [&]() {
667 6, &commonDataPtr->plasticStrainPtr[gg * 6]));
669 nb_internal_variables,
670 ublas::shallow_array_adaptor<double>(
671 nb_internal_variables,
673 ->internalVariablesPtr[gg * nb_internal_variables]));
676 cpPtr->plasticStrain0.resize(6,
false);
677 noalias(cpPtr->plasticStrain0) = plastic_strain_tags;
678 cpPtr->internalVariables0.resize(nb_internal_variables,
false);
679 noalias(cpPtr->internalVariables0) = internal_variables_tags;
681 auto cp_plastic_strain = cpPtr->getPlasticStrain();
682 auto cp_internal_variables = cpPtr->getInternalVariables();
683 noalias(cp_plastic_strain) = plastic_strain_tags;
684 noalias(cp_internal_variables) = internal_variables_tags;
688 CHKERR copy_plastic_strain_and_internal_variables();
690 auto closest_point_projection = [&](
auto &recalculate_elastic_tangent) {
694 CHKERR cpPtr->setParams(
t, recalculate_elastic_tangent);
696 CHKERR cpPtr->playW_NoHessian();
697 CHKERR cpPtr->playY_NoGradient();
699 cpPtr->deltaGamma = 0;
700 if (iter > 0 && y > std::numeric_limits<double>::epsilon()) {
701 CHKERR cpPtr->solveClosestProjection();
703 commonDataPtr->deltaGamma[gg] = cpPtr->deltaGamma;
707 auto evaluate_consistent_tangent_matrix =
708 [&](
auto &recalculate_elastic_tangent) {
710 if (recalculate_elastic_tangent)
714 cpPtr->deltaGamma > std::numeric_limits<double>::epsilon()) {
716 CHKERR cpPtr->consistentTangent();
718 auto &
m = cpPtr->Cep;
723 &
m(0, 0), &
m(0, 1), &
m(0, 2), &
m(0, 3), &
m(0, 4),
726 &
m(1, 0), &
m(1, 1), &
m(1, 2), &
m(1, 3), &
m(1, 4),
729 &
m(2, 0), &
m(2, 1), &
m(2, 2), &
m(2, 3), &
m(2, 4),
732 &
m(3, 0), &
m(3, 1), &
m(3, 2), &
m(3, 3), &
m(3, 4),
735 &
m(4, 0), &
m(4, 1), &
m(4, 2), &
m(4, 3), &
m(4, 4),
738 &
m(5, 0), &
m(5, 1), &
m(5, 2), &
m(5, 3), &
m(5, 4), &
m(5, 5)
743 t_voight_stress_op(
i,
j, Z) *
744 (t_voight_cep(Z, Y) * t_voight_stress_op(
k,
l, Y));
751 &
m(0, 0), &
m(0, 1), &
m(0, 2), &
m(0, 3), &
m(0, 4),
754 &
m(1, 1), &
m(1, 2), &
m(1, 3), &
m(1, 4), &
m(1, 5),
756 &
m(2, 2), &
m(2, 3), &
m(2, 4), &
m(2, 5),
758 &
m(3, 3), &
m(3, 4), &
m(3, 5),
765 t_voight_stress_op(
i,
j, Z) *
766 (t_voight_cep(Z, Y) * t_voight_stress_op(
k,
l, Y));
774 bool recalculate_elastic_tangent =
775 (this->getNinTheLoop() == 0) ?
true :
false;
776 CHKERR closest_point_projection(recalculate_elastic_tangent);
778 CHKERR evaluate_consistent_tangent_matrix(recalculate_elastic_tangent);
781 auto calcs_stress_matrix = [&]() {
784 commonDataPtr->stressMatrix.resize(6, commonDataPtr->gradientW.size1(),
788 auto t_voight_stress = commonDataPtr->getFTensor1StressAtGaussPts();
789 for (
auto gg = 0; gg != commonDataPtr->gradientW.size1(); ++gg) {
790 t_stess(
i,
j) = t_voight_stress_op(
i,
j, Z) * t_voight_stress(Z);
797 auto calcs_plastic_strain_matrix = [&]() {
800 commonDataPtr->plasticStrainMatrix.resize(
801 6, commonDataPtr->activeVariablesW.size1(),
false);
802 auto t_plastic_strain =
804 auto t_voight_plastic_strain =
805 commonDataPtr->getFTensor1PlasticStrainAtGaussPts();
806 for (
auto gg = 0; gg != commonDataPtr->activeVariablesW.size1(); ++gg) {
807 t_plastic_strain(
i,
j) =
808 t_voight_strain_op(
i,
j, Z) * t_voight_plastic_strain(Z);
809 ++t_voight_plastic_strain;
815 CHKERR calcs_stress_matrix();
816 CHKERR calcs_plastic_strain_matrix();
820 CHKERR do_work_impl(this->commonDataPtr, this->cpPtr);
828 boost::shared_ptr<ClosestPointProjection> cp_ptr,
bool calc_lhs) {
836 boost::shared_ptr<ClosestPointProjection> cp_ptr,
bool calc_lhs) {
844 boost::shared_ptr<ClosestPointProjection> cp_ptr,
bool calc_lhs) {
852 boost::shared_ptr<ClosestPointProjection> cp_ptr,
bool calc_lhs) {
860 std::string block_name,
861 boost::shared_ptr<CommonData> common_data_ptr,
862 boost::shared_ptr<ClosestPointProjection> cp_ptr) {
864 pip.push_back(
new OpUpdate(common_data_ptr));
871 std::string block_name,
872 boost::shared_ptr<CommonData> common_data_ptr,
873 boost::shared_ptr<ClosestPointProjection> cp_ptr) {
881 std::string block_name,
882 boost::shared_ptr<CommonData> common_data_ptr,
883 boost::shared_ptr<ClosestPointProjection> cp_ptr) {
895 TSUpdateImpl(std::string fe_name, boost::shared_ptr<FEMethod> fe_ptr);
904 boost::shared_ptr<FEMethod> fe_ptr)
905 : feName(fe_name), fePtr(fe_ptr) {}
925 boost::shared_ptr<FEMethod> fe_ptr) {
926 return boost::make_shared<TSUpdateImpl>(fe_name, fe_ptr);
ForcesAndSourcesCore::UserDataOperator UserDataOperator
Kronecker Delta class symmetric.
#define CHK_THROW_MESSAGE(err, msg)
Check and throw MoFEM exception.
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_DATA_INCONSISTENCY
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
double trace(FTensor::Tensor2< T, 2, 2 > &t_stress)
PetscErrorCode DMoFEMLoopFiniteElements(DM dm, const char fe_name[], MoFEM::FEMethod *method, CacheTupleWeakPtr cache_ptr=CacheTupleSharedPtr())
Executes FEMethod for finite elements in DM.
FTensor::Index< 'i', SPACE_DIM > i
const double v
phase velocity of light in medium (cm/ns)
FTensor::Index< 'J', DIM1 > J
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
ForcesAndSourcesCore::UserDataOperator * getRawPtrOpCalculateStress< 3, SMALL_STRAIN >(MoFEM::Interface &m_field, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< ClosestPointProjection > cp_ptr, bool calc_lhs)
ForcesAndSourcesCore::UserDataOperator * getRawPtrOpCalculateStress< 2, SMALL_STRAIN >(MoFEM::Interface &m_field, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< ClosestPointProjection > cp_ptr, bool calc_lhs)
FTensor::Dg< double, 3, 6 > strain_to_voight_op()
Op convert strain tensor to Vight strain vector.
FTensor::Dg< double, 3, 6 > voight_to_stress_op()
Op convert Vight stress vector to stress tensor.
MoFEMErrorCode opFactoryDomainUpdate< 2 >(MoFEM::Interface &m_field, Pip &pip, std::string block_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< ClosestPointProjection > cp_ptr)
Push operators to update history variables.
static FTensor::Dg< double, 3, 6 > tStrainToVoightOp
FTensor::Tensor2_symmetric< FTensor::PackPtr< double *, 6 >, 3 > getFTensor2SymmetricDiffBaseImpl(DataForcesAndSourcesCore::EntData &data, MatrixDouble &storage, const bool b_bar, const int nb_integration_pts, double *w_ptr, FTensor::Number< DIM >)
[BBar method]
double calcAveStrain(bool b_bar, const int nb_gauss_pts, FTensor::Tensor2< T1, DIM1, DIM2 > &&t_grad, FTensor::Tensor0< T2 > &&t_w)
MoFEMErrorCode opFactoryDomainUpdateImpl(MoFEM::Interface &m_field, Pip &pip, std::string block_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< ClosestPointProjection > cp_ptr)
FTensor::Tensor1< T2, DIM3 > calcStrain(bool b_bar, double ave_tr_strain, FTensor::Tensor2< T1, DIM1, DIM2 > &t_grad, FTensor::Tensor1< T2, DIM3 > &&t_voight_strain)
boost::shared_ptr< TSUpdate > createTSUpdate(std::string fe_name, boost::shared_ptr< FEMethod > fe_ptr)
ForcesAndSourcesCore::UserDataOperator * getRawPtrOpCalculateStress< 2, LARGE_STRAIN >(MoFEM::Interface &m_field, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< ClosestPointProjection > cp_ptr, bool calc_lhs)
ForcesAndSourcesCore::UserDataOperator * getRawPtrOpCalculateStress< 3, LARGE_STRAIN >(MoFEM::Interface &m_field, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< ClosestPointProjection > cp_ptr, bool calc_lhs)
boost::ptr_deque< ForcesAndSourcesCore::UserDataOperator > Pip
MoFEMErrorCode opFactoryDomainUpdate< 3 >(MoFEM::Interface &m_field, Pip &pip, std::string block_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< ClosestPointProjection > cp_ptr)
Push operators to update history variables.
static MoFEMErrorCodeGeneric< moab::ErrorCode > rval
PetscErrorCode MoFEMErrorCode
MoFEM/PETSc error code.
VectorShallowArrayAdaptor< double > VectorAdaptor
implementation of Data Operators for Forces and Sources
auto getVectorAdaptor(T1 ptr, const size_t n)
Get Vector adaptor.
static FTensor::Ddg< FTensor::PackPtr< T *, 1 >, Tensor_Dim01, Tensor_Dim23 > getFTensor4DdgFromMat(ublas::matrix< T, L, A > &data)
Get symmetric tensor rank 4 on first two and last indices from form data matrix.
FTensor::Tensor2< FTensor::PackPtr< double *, 1 >, Tensor_Dim1, Tensor_Dim2 > getFTensor2FromMat(MatrixDouble &data)
Get tensor rank 2 (matrix) form data matrix.
static auto getFTensor2SymmetricFromMat(ublas::matrix< T, L, A > &data)
Get symmetric tensor rank 2 (matrix) form data matrix.
FTensor::Tensor1< FTensor::PackPtr< double *, S >, DIM > getFTensor1FromPtr(double *ptr)
Make Tensor1 from pointer.
FTensor::Tensor2_symmetric< FTensor::PackPtr< double *, 6 >, 3 > getFTensor2SymmetricFromPtr< 3 >(double *ptr)
constexpr IntegrationType I
constexpr double t
plate stiffness
FTensor::Index< 'm', 3 > m
static FTensor::Tensor2_symmetric< FTensor::PackPtr< double *, 6 >, 3 > getFTensor2SymmetricDiffBase(DataForcesAndSourcesCore::EntData &data, MatrixDouble &storage, const bool b_bar, const int nb_integration_pts, double *w_ptr, FTensor::Number< 2 >)
boost::shared_ptr< CommonData > commonDataPtr
MoFEMErrorCode setTagsData(const EntityHandle tet, const int nb_gauss_pts, const int nb_internal_variables)
boost::shared_ptr< ClosestPointProjection > cpPtr
OpCalculateStressImpl(MoFEM::Interface &m_field, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< ClosestPointProjection > cp_ptr, bool calc_lhs)
MoFEM::Interface & mField
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data) override
boost::shared_ptr< CommonData > commonDataPtr
OpUpdate(boost::shared_ptr< CommonData > common_data_ptr)
MoFEMErrorCode doWork(int side, EntityType type, DataForcesAndSourcesCore::EntData &data)
MoFEMErrorCode postProcess(TS ts)
boost::shared_ptr< FEMethod > fePtr
TSUpdateImpl(std::string fe_name, boost::shared_ptr< FEMethod > fe_ptr)
Update internal fluxes (update history variables)
Deprecated interface functions.
structure to get information form mofem into EntitiesFieldData