OGS
MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim > Class Template Referencefinal

Detailed Description

template<int DisplacementDim>
class MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >

Definition at line 272 of file Ehlers.h.

#include <Ehlers.h>

Inheritance diagram for MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >:
[legend]
Collaboration diagram for MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >:
[legend]

Public Types

using ResidualVectorType = Eigen::Matrix<double, JacobianResidualSize, 1>
using JacobianMatrix
using KelvinVector
using KelvinMatrix
Public Types inherited from MaterialLib::Solids::MechanicsBase< DisplacementDim >
using KelvinVector
using KelvinMatrix

Public Member Functions

std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables > createMaterialStateVariables () const override
 SolidEhlers (NumLib::NewtonRaphsonSolverParameters nonlinear_solver_parameters, MaterialPropertiesParameters material_properties, std::unique_ptr< DamagePropertiesParameters > &&damage_properties, TangentType tangent_type)
double computeFreeEnergyDensity (double const, ParameterLib::SpatialPosition const &, double const, KelvinVector const &eps, KelvinVector const &sigma, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const override
std::optional< std::tuple< KelvinVector, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, KelvinMatrix > > integrateStress (MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const dt, typename MechanicsBase< DisplacementDim >::MaterialStateVariables const &material_state_variables) const override
std::vector< typename MechanicsBase< DisplacementDim >::InternalVariable > getInternalVariables () const override
MaterialProperties evaluatedMaterialProperties (double const t, ParameterLib::SpatialPosition const &x) const
double getBulkModulus (double const t, ParameterLib::SpatialPosition const &x, KelvinMatrix const *const) const override
DamageProperties evaluatedDamageProperties (double const t, ParameterLib::SpatialPosition const &x) const
Public Member Functions inherited from MaterialLib::Solids::MechanicsBase< DisplacementDim >
virtual void initializeInternalStateVariables (double const, ParameterLib::SpatialPosition const &, typename MechanicsBase< DisplacementDim >::MaterialStateVariables &) const
virtual std::optional< std::tuple< KelvinVector, std::unique_ptr< MaterialStateVariables >, KelvinMatrix > > integrateStress (MaterialPropertyLib::VariableArray const &variable_array_prev, MaterialPropertyLib::VariableArray const &variable_array, double const t, ParameterLib::SpatialPosition const &x, double const dt, MaterialStateVariables const &material_state_variables) const =0
virtual ConstitutiveModel getConstitutiveModel () const
 Gets the type of constitutive model.
virtual double getTemperatureRelatedCoefficient (double const, double const, ParameterLib::SpatialPosition const &, double const, double const) const
virtual double computeFreeEnergyDensity (double const t, ParameterLib::SpatialPosition const &x, double const dt, KelvinVector const &eps, KelvinVector const &sigma, MaterialStateVariables const &material_state_variables) const =0
virtual ~MechanicsBase ()=default

Static Public Attributes

static int const KelvinVectorSize
static int const JacobianResidualSize

Private Attributes

NumLib::NewtonRaphsonSolverParameters const _nonlinear_solver_parameters
MaterialPropertiesParameters _mp
std::unique_ptr< DamagePropertiesParameters_damage_properties
TangentType const _tangent_type

Member Typedef Documentation

◆ JacobianMatrix

template<int DisplacementDim>
using MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::JacobianMatrix
Initial value:
Eigen::Matrix<double, JacobianResidualSize,
JacobianResidualSize, Eigen::RowMajor>

Definition at line 283 of file Ehlers.h.

◆ KelvinMatrix

template<int DisplacementDim>
using MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::KelvinMatrix
Initial value:
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), kelvin_vector_dimensions(DisplacementDim), Eigen::RowMajor > KelvinMatrixType

Definition at line 297 of file Ehlers.h.

◆ KelvinVector

template<int DisplacementDim>
using MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::KelvinVector
Initial value:
Eigen::Matrix< double, kelvin_vector_dimensions(DisplacementDim), 1, Eigen::ColMajor > KelvinVectorType

Definition at line 295 of file Ehlers.h.

◆ ResidualVectorType

template<int DisplacementDim>
using MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::ResidualVectorType = Eigen::Matrix<double, JacobianResidualSize, 1>

Definition at line 282 of file Ehlers.h.

Constructor & Destructor Documentation

◆ SolidEhlers()

template<int DisplacementDim>
MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::SolidEhlers ( NumLib::NewtonRaphsonSolverParameters nonlinear_solver_parameters,
MaterialPropertiesParameters material_properties,
std::unique_ptr< DamagePropertiesParameters > && damage_properties,
TangentType tangent_type )

Member Function Documentation

◆ computeFreeEnergyDensity()

template<int DisplacementDim>
double MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::computeFreeEnergyDensity ( double const ,
ParameterLib::SpatialPosition const & ,
double const ,
KelvinVector const & eps,
KelvinVector const & sigma,
typename MechanicsBase< DisplacementDim >::MaterialStateVariables const & material_state_variables ) const
override

Definition at line 516 of file Ehlers.cpp.

524{
526 &material_state_variables) != nullptr);
527
528 auto const& eps_p = static_cast<StateVariables<DisplacementDim> const&>(
530 .eps_p;
532 auto const& identity2 = Invariants::identity2;
533 return (eps - eps_p.D - eps_p.V / 3 * identity2).dot(sigma) / 2;
534}

◆ createMaterialStateVariables()

template<int DisplacementDim>
std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables > MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::createMaterialStateVariables ( ) const
inlineoverridevirtual

Polymorphic creator for MaterialStateVariables objects specific for a material model.

Reimplemented from MaterialLib::Solids::MechanicsBase< DisplacementDim >.

Definition at line 289 of file Ehlers.h.

◆ evaluatedDamageProperties()

template<int DisplacementDim>
DamageProperties MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::evaluatedDamageProperties ( double const t,
ParameterLib::SpatialPosition const & x ) const
inline

Definition at line 343 of file Ehlers.h.

345 {
347 }

References _damage_properties.

◆ evaluatedMaterialProperties()

template<int DisplacementDim>
MaterialProperties MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::evaluatedMaterialProperties ( double const t,
ParameterLib::SpatialPosition const & x ) const
inline

Definition at line 330 of file Ehlers.h.

332 {
333 return MaterialProperties(t, x, _mp);
334 }

References _mp.

◆ getBulkModulus()

template<int DisplacementDim>
double MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::getBulkModulus ( double const t,
ParameterLib::SpatialPosition const & x,
KelvinMatrix const * const  ) const
inlineoverridevirtual

Reimplemented from MaterialLib::Solids::MechanicsBase< DisplacementDim >.

Definition at line 336 of file Ehlers.h.

339 {
340 return _mp.K(t, x)[0];
341 }

References _mp.

◆ getInternalVariables()

template<int DisplacementDim>
std::vector< typename MechanicsBase< DisplacementDim >::InternalVariable > MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::getInternalVariables ( ) const
overridevirtual

Returns internal variables defined by the specific material model, if any.

Reimplemented from MaterialLib::Solids::MechanicsBase< DisplacementDim >.

Definition at line 732 of file Ehlers.cpp.

733{
734 return {{"damage.kappa_d", 1,
735 [](typename MechanicsBase<
738 {
740 &state) != nullptr);
741 auto const& ehlers_state =
743
744 cache.resize(1);
745 cache.front() = ehlers_state.damage.kappa_d();
746 return cache;
747 },
750 {
752 &state) != nullptr);
753 auto& ehlers_state =
755
756 return {&ehlers_state.damage.kappa_d(), 1};
757 }},
758 {"damage.value", 1,
759 [](typename MechanicsBase<
762 {
764 &state) != nullptr);
765 auto const& ehlers_state =
767
768 cache.resize(1);
769 cache.front() = ehlers_state.damage.value();
770 return cache;
771 },
774 {
776 &state) != nullptr);
777 auto& ehlers_state =
779
780 return {&ehlers_state.damage.value(), 1};
781 }},
783 [](typename MechanicsBase<
786 {
788 &state) != nullptr);
789 auto const& ehlers_state =
791
796 ehlers_state.eps_p.D);
797
798 return cache;
799 },
802 {
804 &state) != nullptr);
805 auto& ehlers_state =
807
808 return {
809 ehlers_state.eps_p.D.data(),
811 }},
812 {"eps_p.V", 1,
813 [](typename MechanicsBase<
816 {
818 &state) != nullptr);
819 auto const& ehlers_state =
821
822 cache.resize(1);
823 cache.front() = ehlers_state.eps_p.V;
824 return cache;
825 },
828 {
830 &state) != nullptr);
831 auto& ehlers_state =
833
834 return {&ehlers_state.eps_p.V, 1};
835 }},
836 {"eps_p.eff", 1,
837 [](typename MechanicsBase<
840 {
842 &state) != nullptr);
843 auto const& ehlers_state =
845
846 cache.resize(1);
847 cache.front() = ehlers_state.eps_p.eff;
848 return cache;
849 },
852 {
854 &state) != nullptr);
855 auto& ehlers_state =
857
858 return {&ehlers_state.eps_p.eff, 1};
859 }}};
860}
Eigen::Matrix< double, 4, 1 > kelvinVectorToSymmetricTensor(Eigen::Matrix< double, 4, 1, Eigen::ColMajor, 4, 1 > const &v)
Eigen::Map< const Vector > toVector(std::vector< double > const &data, Eigen::VectorXd::Index size)
Creates an Eigen mapped vector from the given data vector.

References MaterialLib::Solids::Ehlers::StateVariables< DisplacementDim >::damage, MaterialLib::Solids::Ehlers::StateVariables< DisplacementDim >::eps_p, MaterialLib::Solids::Ehlers::Damage::kappa_d(), MathLib::KelvinVector::kelvinVectorToSymmetricTensor(), MathLib::toVector(), and MaterialLib::Solids::Ehlers::Damage::value().

◆ integrateStress()

template<int DisplacementDim>
std::optional< std::tuple< typename SolidEhlers< DisplacementDim >::KelvinVector, std::unique_ptr< typename MechanicsBase< DisplacementDim >::MaterialStateVariables >, typename SolidEhlers< DisplacementDim >::KelvinMatrix > > MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::integrateStress ( MaterialPropertyLib::VariableArray const & variable_array_prev,
MaterialPropertyLib::VariableArray const & variable_array,
double const t,
ParameterLib::SpatialPosition const & x,
double const dt,
typename MechanicsBase< DisplacementDim >::MaterialStateVariables const & material_state_variables ) const
override

Definition at line 541 of file Ehlers.cpp.

547{
549 variable_array.mechanical_strain);
551 variable_array_prev.mechanical_strain);
553 variable_array_prev.stress);
554
556 &material_state_variables) != nullptr);
557
561 state.setInitialConditions();
562
564
565 // volumetric strain
566 double const eps_V = Invariants::trace(eps_m);
567
569 // deviatoric strain
570 KelvinVector const eps_D = P_dev * eps_m;
571
572 // do the evaluation once per function call.
573 MaterialProperties const mp(t, x, _mp);
574
577
579
581 // Quit early if sigma is zero (nothing to do), or dt is zero, or if we are
582 // still in elastic zone.
583 // dt can be zero if we are in the initialization phase and the tangent
584 // stiffness will no be necessary. Anyway the newton loop below would not
585 // work because of division by zero.
586 if ((sigma.squaredNorm() == 0. || dt == 0. ||
588 mp, s,
589 calculateIsotropicHardening(mp.kappa, mp.hardening_coefficient,
590 state.eps_p.eff)) < 0.))
591 {
593 mp.K - 2. / 3 * mp.G, mp.G);
594 }
595 else
596 {
597 // Linear solver for the newton loop is required after the loop with the
598 // same matrix. This saves one decomposition.
602
603 {
604 using KelvinVector =
606 using ResidualVectorType =
608 using JacobianMatrix =
611
613
614 // Agglomerated solution vector construction. It is later split
615 // into individual parts by splitSolutionVector().
617 solution << sigma, state.eps_p.D, state.eps_p.V, state.eps_p.eff, 0;
618
620 {
621 auto const& eps_p_D =
625 (eps_p_D - state.eps_p_prev.D) / dt;
626
627 double const& eps_p_V = solution[KelvinVectorSize * 2];
628 double const eps_p_V_dot = (eps_p_V - state.eps_p_prev.V) / dt;
629
630 double const& eps_p_eff = solution[KelvinVectorSize * 2 + 1];
631 double const eps_p_eff_dot =
632 (eps_p_eff - state.eps_p_prev.eff) / dt;
633
635 mp.kappa, mp.hardening_coefficient,
636 solution[KelvinVectorSize * 2 + 1]);
638 eps_D, eps_V, s,
643 k_hardening, mp);
644 };
645
646 auto const update_jacobian = [&](JacobianMatrix& jacobian)
647 {
649 dt, s, solution[KelvinVectorSize * 2 + 2], mp);
650 };
651
652 auto const update_solution =
653 [&](ResidualVectorType const& increment)
654 {
657 mp.G * solution.template segment<KelvinVectorSize>(0)};
658 };
659
663
664 auto const success_iterations = newton_solver.solve(jacobian);
665
667 {
668 return {};
669 }
670
671 // If the Newton loop didn't run, the linear solver will not be
672 // initialized.
673 // This happens usually for the first iteration of the first
674 // timestep.
675 if (*success_iterations == 0)
676 {
677 linear_solver.compute(jacobian);
678 }
679
682 }
683
684 // Calculate residual derivative w.r.t. strain
692
694 {
697 }
700 {
702 mp.G *
706 {
707 tangentStiffness *= 1 - state.damage.value();
708 }
709 }
710 else
711 {
712 OGS_FATAL(
713 "Unimplemented tangent type behaviour for the tangent type "
714 "'{}'.",
716 }
717 }
718
720
721 return {std::make_tuple(
728}
#define OGS_FATAL(...)
Definition Error.h:26
Eigen::Matrix< double, JacobianResidualSize, JacobianResidualSize, Eigen::RowMajor > JacobianMatrix
Definition Ehlers.h:283
MathLib::KelvinVector::KelvinVectorType< DisplacementDim > KelvinVector
Definition Ehlers.h:295
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > KelvinMatrix
Definition Ehlers.h:297
Eigen::Matrix< double, JacobianResidualSize, 1 > ResidualVectorType
Definition Ehlers.h:282
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > calculateDResidualDEps(double const K, double const G)
Definition Ehlers.cpp:438
SolidEhlers< DisplacementDim >::JacobianMatrix calculatePlasticJacobian(double const dt, PhysicalStressWithInvariants< DisplacementDim > const &s, double const lambda, MaterialProperties const &mp)
Definition Ehlers.cpp:257
double calculateIsotropicHardening(double const kappa, double const hardening_coefficient, double const eps_p_eff)
Definition Ehlers.cpp:453
std::tuple< KelvinVector, PlasticStrain< KelvinVector >, double > splitSolutionVector(ResidualVector const &solution)
Definition Ehlers.cpp:492
SolidEhlers< DisplacementDim >::KelvinVector predict_sigma(double const G, double const K, typename SolidEhlers< DisplacementDim >::KelvinVector const &sigma_prev, typename SolidEhlers< DisplacementDim >::KelvinVector const &eps, typename SolidEhlers< DisplacementDim >::KelvinVector const &eps_prev, double const eps_V)
Definition Ehlers.cpp:461
SolidEhlers< DisplacementDim >::ResidualVectorType calculatePlasticResidual(MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &eps_D, double const eps_V, PhysicalStressWithInvariants< DisplacementDim > const &s, MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &eps_p_D, MathLib::KelvinVector::KelvinVectorType< DisplacementDim > const &eps_p_D_dot, double const eps_p_V, double const eps_p_V_dot, double const eps_p_eff_dot, double const lambda, double const k, MaterialProperties const &mp)
Definition Ehlers.cpp:196
MathLib::KelvinVector::KelvinMatrixType< DisplacementDim > elasticTangentStiffness(double const first_lame_parameter, double const shear_modulus)

References _mp, _nonlinear_solver_parameters, _tangent_type, MaterialLib::Solids::Ehlers::calculateDResidualDEps(), MaterialLib::Solids::Ehlers::calculateIsotropicHardening(), MaterialLib::Solids::Ehlers::calculatePlasticJacobian(), MaterialLib::Solids::Ehlers::calculatePlasticResidual(), MaterialLib::Solids::Ehlers::StateVariables< DisplacementDim >::damage, MaterialLib::Solids::Ehlers::Elastic, MaterialLib::Solids::elasticTangentStiffness(), MaterialLib::Solids::Ehlers::StateVariables< DisplacementDim >::eps_p, MaterialLib::Solids::Ehlers::StateVariables< DisplacementDim >::eps_p_prev, MaterialLib::Solids::Ehlers::MaterialProperties::G, MaterialLib::Solids::Ehlers::MaterialProperties::hardening_coefficient, JacobianResidualSize, MaterialLib::Solids::Ehlers::MaterialProperties::K, MaterialLib::Solids::Ehlers::MaterialProperties::kappa, KelvinVectorSize, MaterialPropertyLib::VariableArray::mechanical_strain, OGS_FATAL, MaterialLib::Solids::Ehlers::Plastic, MaterialLib::Solids::Ehlers::PlasticDamageSecant, MaterialLib::Solids::Ehlers::predict_sigma(), MaterialLib::Solids::Ehlers::StateVariables< DisplacementDim >::setInitialConditions(), MaterialLib::Solids::Ehlers::splitSolutionVector(), MaterialPropertyLib::VariableArray::stress, BaseLib::to_underlying(), MaterialLib::Solids::Ehlers::Damage::value(), and MaterialLib::Solids::Ehlers::yieldFunction().

Member Data Documentation

◆ _damage_properties

template<int DisplacementDim>
std::unique_ptr<DamagePropertiesParameters> MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::_damage_properties
private

Definition at line 353 of file Ehlers.h.

Referenced by SolidEhlers(), and evaluatedDamageProperties().

◆ _mp

template<int DisplacementDim>
MaterialPropertiesParameters MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::_mp
private

◆ _nonlinear_solver_parameters

template<int DisplacementDim>
NumLib::NewtonRaphsonSolverParameters const MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::_nonlinear_solver_parameters
private

Definition at line 350 of file Ehlers.h.

Referenced by SolidEhlers(), and integrateStress().

◆ _tangent_type

template<int DisplacementDim>
TangentType const MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::_tangent_type
private

Definition at line 354 of file Ehlers.h.

Referenced by SolidEhlers(), and integrateStress().

◆ JacobianResidualSize

template<int DisplacementDim>
int const MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::JacobianResidualSize
static
Initial value:
=

Definition at line 277 of file Ehlers.h.

Referenced by integrateStress().

◆ KelvinVectorSize

template<int DisplacementDim>
int const MaterialLib::Solids::Ehlers::SolidEhlers< DisplacementDim >::KelvinVectorSize
static
Initial value:
=
constexpr int kelvin_vector_dimensions(int const displacement_dim)
Kelvin vector dimensions for given displacement dimension.

Definition at line 275 of file Ehlers.h.

Referenced by integrateStress().


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