v0.16.0
Loading...
Searching...
No Matches
Public Member Functions | Protected Attributes | List of all members
PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp > Struct Template Reference

#include "tutorials/adv-0_plasticity/src/PlasticOpsGeneric.hpp"

Inheritance diagram for PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp >:
[legend]
Collaboration diagram for PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp >:
[legend]

Public Member Functions

 OpCalculatePlasticityImpl (const std::string field_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< MatrixDouble > m_D_ptr)
 
MoFEMErrorCode doWork (int side, EntityType type, EntData &data)
 
 OpCalculatePlasticityImpl (const std::string field_name, boost::shared_ptr< CommonData > common_data_ptr, boost::shared_ptr< MatrixDouble > m_D_ptr, boost::shared_ptr< ThermoPlasticOps::ThermoPlasticBlockedParameters > tp_common_data_ptr=nullptr)
 
MoFEMErrorCode doWork (int side, EntityType type, EntData &data)
 

Protected Attributes

boost::shared_ptr< CommonDatacommonDataPtr
 
boost::shared_ptr< MatrixDouble > mDPtr
 
boost::shared_ptr< ThermoPlasticOps::ThermoPlasticBlockedParametersTPCommonDataPtr
 

Detailed Description

template<int DIM, typename DomainEleOp>
struct PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp >

Definition at line 357 of file PlasticOpsGeneric.hpp.

Constructor & Destructor Documentation

◆ OpCalculatePlasticityImpl() [1/2]

template<int DIM, typename DomainEleOp >
PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp >::OpCalculatePlasticityImpl ( const std::string  field_name,
boost::shared_ptr< CommonData common_data_ptr,
boost::shared_ptr< MatrixDouble >  m_D_ptr 
)

Definition at line 369 of file PlasticOpsGeneric.hpp.

372 : DomainEleOp(field_name, DomainEleOp::OPROW),
373 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr) {
374 // Opetor is only executed for vertices
375 std::fill(&DomainEleOp::doEntities[MBEDGE],
376 &DomainEleOp::doEntities[MBMAXTYPE], false);
377}
DomainEle::UserDataOperator DomainEleOp
Finire element operator type.
constexpr auto field_name

◆ OpCalculatePlasticityImpl() [2/2]

template<int DIM, typename DomainEleOp >
PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp >::OpCalculatePlasticityImpl ( const std::string  field_name,
boost::shared_ptr< CommonData common_data_ptr,
boost::shared_ptr< MatrixDouble >  m_D_ptr,
boost::shared_ptr< ThermoPlasticOps::ThermoPlasticBlockedParameters tp_common_data_ptr = nullptr 
)

Definition at line 502 of file PlasticOpsGeneric.hpp.

507 : DomainEleOp(field_name, DomainEleOp::OPROW),
508 commonDataPtr(common_data_ptr), mDPtr(m_D_ptr),
509 TPCommonDataPtr(tp_common_data_ptr) {
510 // Opetor is only executed for vertices
511 std::fill(&DomainEleOp::doEntities[MBEDGE],
512 &DomainEleOp::doEntities[MBMAXTYPE], false);
513}
boost::shared_ptr< ThermoPlasticOps::ThermoPlasticBlockedParameters > TPCommonDataPtr

Member Function Documentation

◆ doWork() [1/2]

template<int DIM, typename DomainEleOp >
MoFEMErrorCode PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp >::doWork ( int  side,
EntityType  type,
EntData data 
)

< material parameters

< material parameters

Definition at line 380 of file PlasticOpsGeneric.hpp.

381 {
383
384 FTensor::Index<'i', DIM> i;
385 FTensor::Index<'j', DIM> j;
386 FTensor::Index<'k', DIM> k;
387 FTensor::Index<'l', DIM> l;
388 FTensor::Index<'m', DIM> m;
389 FTensor::Index<'n', DIM> n;
390
391 auto &params = commonDataPtr->blockParams; ///< material parameters
392
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));
404
405 auto t_D_Op = getFTensor4DdgFromMat<DIM, DIM, 0>(*mDPtr);
406
407 auto t_diff_plastic_strain = FTensor::diff_tensor<double>();
408 auto t_diff_deviator = FTensor::diff_deviator<double, DIM>();
409
410 FTensor::Ddg<double, DIM, DIM> t_flow_dir_dstress;
411 FTensor::Ddg<double, DIM, DIM> t_flow_dir_dstrain;
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);
416
417
418 auto t_alpha_dir =
419 kinematic_hardening_dplastic_strain<DIM>(params[CommonData::C1_k]);
420
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);
427 commonDataPtr->resFlowDstrain.resize(nb_gauss_pts, size_symm * size_symm,
428 false);
429 commonDataPtr->resFlowDstrainDot.resize(nb_gauss_pts, size_symm * size_symm,
430 false);
431
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();
440
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);
454
455 auto next = [&]() {
456 ++t_tau;
457 ++t_tau_dot;
458 ++t_f;
459 ++t_flow;
460 ++t_plastic_strain;
461 ++t_plastic_strain_dot;
462 ++t_stress;
463 ++t_res_c;
464 ++t_res_c_dtau;
465 ++t_res_c_dstrain;
466 ++t_res_c_plastic_strain;
467 ++t_res_flow;
468 ++t_res_flow_dtau;
469 ++t_res_flow_dstrain;
470 ++t_res_flow_dplastic_strain;
471 ++t_w;
472 };
473
474 auto get_avtive_pts = [&]() {
475 int nb_points_avtive_on_elem = 0;
476 int nb_points_on_elem = 0;
477
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);
483
484 auto dt = this->getTStimeStep();
485
486 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
487 auto eqiv = equivalent_strain_dot(t_plastic_strain_dot);
488 const auto ww = w(
489 eqiv, t_tau_dot, t_f,
490 iso_hardening(t_tau, params[CommonData::H], params[CommonData::QINF],
491 params[CommonData::BISO], params[CommonData::SIGMA_Y]),
492 params[CommonData::SIGMA_Y]);
493 const auto sign_ww = constrian_sign(ww, dt);
494
495 ++nb_points_on_elem;
496 if (sign_ww > 0) {
497 ++nb_points_avtive_on_elem;
498 }
499
500 ++t_tau;
501 ++t_tau_dot;
502 ++t_f;
503 ++t_plastic_strain_dot;
504 }
505
506 int &active_points = PlasticOps::CommonData::activityData[0];
507 int &avtive_full_elems = PlasticOps::CommonData::activityData[1];
508 int &avtive_elems = PlasticOps::CommonData::activityData[2];
509 int &nb_points = PlasticOps::CommonData::activityData[3];
510 int &nb_elements = PlasticOps::CommonData::activityData[4];
511
512 ++nb_elements;
513 nb_points += nb_points_on_elem;
514 if (nb_points_avtive_on_elem > 0) {
515 ++avtive_elems;
516 active_points += nb_points_avtive_on_elem;
517 if (nb_points_avtive_on_elem == nb_points_on_elem) {
518 ++avtive_full_elems;
519 }
520 }
521
522 if (nb_points_avtive_on_elem != nb_points_on_elem)
523 return 1;
524 else
525 return 0;
526 };
527
528 if (DomainEleOp::getTSCtx() == TSMethod::TSContext::CTX_TSSETIJACOBIAN) {
529 get_avtive_pts();
530 }
531
532 auto dt = this->getTStimeStep();
533 for (auto gg = 0; gg != nb_gauss_pts; ++gg) {
534
535 auto eqiv = equivalent_strain_dot(t_plastic_strain_dot);
536 auto t_diff_eqiv = diff_equivalent_strain_dot(eqiv, t_plastic_strain_dot,
537 t_diff_plastic_strain,
539
540 const auto sigma_y =
541 iso_hardening(t_tau, params[CommonData::H], params[CommonData::QINF],
542 params[CommonData::BISO], params[CommonData::SIGMA_Y]);
543 const auto d_sigma_y =
544 iso_hardening_dtau(t_tau, params[CommonData::H],
545 params[CommonData::QINF], params[CommonData::BISO]);
546
547 auto ww = w(eqiv, t_tau_dot, t_f, sigma_y, params[CommonData::SIGMA_Y]);
548 auto abs_ww = constrain_abs(ww, dt);
549 auto sign_ww = constrian_sign(ww, dt);
550
551 auto c = constraint(eqiv, t_tau_dot, t_f, sigma_y, abs_ww,
552 params[CommonData::VIS_H], params[CommonData::SIGMA_Y]);
553 auto c_dot_tau = diff_constrain_ddot_tau(sign_ww, eqiv, t_tau_dot,
554 params[CommonData::VIS_H],
555 params[CommonData::SIGMA_Y]);
556 auto c_equiv = diff_constrain_deqiv(sign_ww, eqiv, t_tau_dot,
557 params[CommonData::SIGMA_Y]);
558 auto c_sigma_y = diff_constrain_dsigma_y(sign_ww);
559 auto c_f = diff_constrain_df(sign_ww);
560
561 auto t_dev_stress = deviator(
562
563 t_stress, trace(t_stress),
564
565 kinematic_hardening(t_plastic_strain, params[CommonData::C1_k])
566
567 );
568
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);
573
574 auto get_res_c = [&]() { return c; };
575
576 auto get_res_c_dstrain = [&](auto &t_diff_res) {
577 t_diff_res(i, j) = c_f * t_flow_dstrain(i, j);
578 };
579
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);
583 };
584
585 auto get_res_c_dtau = [&]() {
586 return this->getTSa() * c_dot_tau + c_sigma_y * d_sigma_y;
587 };
588
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);
591 };
592
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);
597 };
598
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);
604 };
605
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;
609 };
610
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;
618 };
619
620 t_res_c = get_res_c();
621 get_res_flow(t_res_flow);
622
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);
630 }
631
632 next();
633 }
634
636}
constexpr double a
#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()
FTensor::Index< 'i', SPACE_DIM > i
double dt
const double c
speed of light (cm/ns)
const double n
refractive index of diffusive medium
FTensor::Index< 'l', 3 > l
FTensor::Index< 'j', 3 > j
FTensor::Index< 'k', 3 > k
FTensor::Index< 'N', 3 > N
double diff_constrain_ddot_tau(double sign, double eqiv, double dot_tau, double vis_H, double sigma_Y)
double constrian_sign(double x, double dt)
FTensor::Index< 'J', 3 > J
double diff_constrain_deqiv(double sign, double eqiv, double dot_tau, double sigma_Y)
auto diff_equivalent_strain_dot(const T1 eqiv, T2 &t_plastic_strain_dot, T3 &t_diff_plastic_strain, FTensor::Number< DIM >)
double constraint(double eqiv, double dot_tau, double f, double sigma_y, double abs_w, double vis_H, double sigma_Y)
auto diff_constrain_df(double sign)
auto diff_constrain_dsigma_y(double sign)
FTensor::Index< 'I', 3 > I
[Common data]
double trace(FTensor::Tensor2_symmetric< T, 2 > &t_stress)
auto deviator(FTensor::Tensor2_symmetric< T, DIM > &t_stress, double trace, FTensor::Tensor2_symmetric< double, DIM > &t_alpha, FTensor::Number< DIM >)
double w(double eqiv, double dot_tau, double f, double sigma_y, double sigma_Y)
auto equivalent_strain_dot(FTensor::Tensor2_symmetric< T, DIM > &t_plastic_strain_dot)
double constrain_abs(double x, double dt)
FTensor::Index< 'm', 3 > m
static std::array< int, 5 > activityData
auto kinematic_hardening(FTensor::Tensor2_symmetric< T, DIM > &t_plastic_strain, double C1_k)
Definition plastic.cpp:93
double iso_hardening_dtau(double tau, double H, double Qinf, double b_iso)
Definition plastic.cpp:79
constexpr auto size_symm
Definition plastic.cpp:42
double iso_hardening(double tau, double H, double Qinf, double b_iso, double sigmaY)
Definition plastic.cpp:74

◆ doWork() [2/2]

template<int DIM, typename DomainEleOp >
MoFEMErrorCode PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp >::doWork ( int  side,
EntityType  type,
EntData data 
)

Member Data Documentation

◆ commonDataPtr

template<int DIM, typename DomainEleOp >
boost::shared_ptr< CommonData > PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp >::commonDataPtr
protected

Definition at line 364 of file PlasticOpsGeneric.hpp.

◆ mDPtr

template<int DIM, typename DomainEleOp >
boost::shared_ptr< MatrixDouble > PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp >::mDPtr
protected

Definition at line 365 of file PlasticOpsGeneric.hpp.

◆ TPCommonDataPtr

template<int DIM, typename DomainEleOp >
boost::shared_ptr<ThermoPlasticOps::ThermoPlasticBlockedParameters> PlasticOps::OpCalculatePlasticityImpl< DIM, GAUSS, DomainEleOp >::TPCommonDataPtr
protected

Definition at line 497 of file PlasticOpsGeneric.hpp.


The documentation for this struct was generated from the following files: