https://mooseframework.inl.gov
Loading...
Searching...
No Matches
CappedMohrCoulombCosseratStressUpdate.C
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
11#include "libmesh/utility.h"
12
14
17{
19 params.addClassDescription("Capped Mohr-Coulomb plasticity stress calculator for the Cosserat "
20 "situation where the host medium (ie, the limit where all Cosserat "
21 "effects are zero) is isotropic. Note that the return-map flow rule "
22 "uses an isotropic elasticity tensor built with the 'host' properties "
23 "defined by the user.");
24 params.addRequiredRangeCheckedParam<Real>("host_youngs_modulus",
25 "host_youngs_modulus>0",
26 "Young's modulus for the isotropic host medium");
27 params.addRequiredRangeCheckedParam<Real>("host_poissons_ratio",
28 "host_poissons_ratio>=0 & host_poissons_ratio<0.5",
29 "Poisson's ratio for the isotropic host medium");
30 return params;
31}
32
34 const InputParameters & parameters)
36 _host_young(getParam<Real>("host_youngs_modulus")),
37 _host_poisson(getParam<Real>("host_poissons_ratio")),
38 _host_E0011(_host_young * _host_poisson / (1.0 + _host_poisson) / (1.0 - 2.0 * _host_poisson)),
39 _host_E0000(_host_E0011 + _host_young / (1.0 + _host_poisson)),
40 _eigvals_scratch(_tensor_dimensionality)
41{
42}
43
44void
46 const std::vector<Real> & /*trial_stress_params*/,
47 const RankTwoTensor & stress_trial,
48 const std::vector<Real> & /*intnl_old*/,
49 const std::vector<Real> & /*yf*/,
50 const RankFourTensor & /*Eijkl*/)
51{
52 mooseAssert(
54 "_eigvals_scratch incorrectly sized in CappedMohCoulombCosseratStressUpdate::preReturnMapV");
57}
58
59void
61{
62 _Eij[0][0] = _Eij[1][1] = _Eij[2][2] = _host_E0000;
63 _Eij[0][1] = _Eij[1][0] = _Eij[0][2] = _Eij[2][0] = _Eij[1][2] = _Eij[2][1] = _host_E0011;
64 _En = _Eij[2][2];
65 const Real denom = _Eij[0][0] * (_Eij[0][0] + _Eij[0][1]) - 2 * Utility::pow<2>(_Eij[0][1]);
66 for (unsigned a = 0; a < _num_sp; ++a)
67 {
68 _Cij[a][a] = (_Eij[0][0] + _Eij[0][1]) / denom;
69 for (unsigned b = 0; b < a; ++b)
70 _Cij[a][b] = _Cij[b][a] = -_Eij[0][1] / denom;
71 }
72}
73
74void
76 const RankTwoTensor & stress_trial,
77 const std::vector<Real> & stress_params,
78 Real /*gaE*/,
79 const std::vector<Real> & /*intnl*/,
80 const yieldAndFlow & /*smoothed_q*/,
81 const RankFourTensor & /*Eijkl*/,
82 RankTwoTensor & stress) const
83{
84 // form the diagonal stress
85 stress = RankTwoTensor(stress_params[0], stress_params[1], stress_params[2], 0.0, 0.0, 0.0);
86 // rotate to the original frame, to give the symmetric part of the stress
87 stress = _eigvecs * stress * (_eigvecs.transpose());
88 // add the non-symmetric parts
89 stress += 0.5 * (stress_trial - stress_trial.transpose());
90}
91
92void
94 const RankTwoTensor & stress_trial,
95 const std::vector<Real> & trial_stress_params,
96 const RankTwoTensor & stress,
97 const std::vector<Real> & stress_params,
98 Real gaE,
99 const yieldAndFlow & smoothed_q,
100 const RankFourTensor & elasticity_tensor,
101 bool compute_full_tangent_operator,
102 const std::vector<std::vector<Real>> & dvar_dtrial,
103 RankFourTensor & cto)
104{
106 trial_stress_params,
107 stress,
108 stress_params,
109 gaE,
110 smoothed_q,
112 compute_full_tangent_operator,
113 dvar_dtrial,
114 cto);
115
116 if (!compute_full_tangent_operator)
117 return;
118
135 RankFourTensor anti;
136 for (unsigned i = 0; i < _tensor_dimensionality; ++i)
137 for (unsigned j = 0; j < _tensor_dimensionality; ++j)
138 for (unsigned k = 0; k < _tensor_dimensionality; ++k)
139 for (unsigned l = 0; l < _tensor_dimensionality; ++l)
140 anti(i, j, k, l) = 0.5 * (elasticity_tensor(i, j, k, l) - elasticity_tensor(j, i, k, l));
141
142 cto += anti;
143}
registerMooseObject("SolidMechanicsApp", CappedMohrCoulombCosseratStressUpdate)
CappedMohrCoulombCosseratStressUpdate implements rate-independent nonassociative Mohr-Coulomb plus te...
virtual void consistentTangentOperatorV(const RankTwoTensor &stress_trial, const std::vector< Real > &trial_stress_params, const RankTwoTensor &stress, const std::vector< Real > &stress_params, Real gaE, const yieldAndFlow &smoothed_q, const RankFourTensor &Eijkl, bool compute_full_tangent_operator, const std::vector< std::vector< Real > > &dvar_dtrial, RankFourTensor &cto) override
Calculates the consistent tangent operator.
virtual void setStressAfterReturnV(const RankTwoTensor &stress_trial, const std::vector< Real > &stress_params, Real gaE, const std::vector< Real > &intnl, const yieldAndFlow &smoothed_q, const RankFourTensor &Eijkl, RankTwoTensor &stress) const override
Sets stress from the admissible parameters.
const Real _host_E0000
E0000 = Lame lambda + 2 * shear modulus of the host material.
virtual void preReturnMapV(const std::vector< Real > &trial_stress_params, const RankTwoTensor &stress_trial, const std::vector< Real > &intnl_old, const std::vector< Real > &yf, const RankFourTensor &Eijkl) override
Derived classes may employ this function to record stuff or do other computations prior to the return...
CappedMohrCoulombCosseratStressUpdate(const InputParameters &parameters)
const Real _host_poisson
Poisson's of the host material.
const Real _host_E0011
E0011 = Lame lambda modulus of the host material.
void setEffectiveElasticity(const RankFourTensor &Eijkl) override
Sets _Eij and _En and _Cij.
CappedMohrCoulombStressUpdate implements rate-independent nonassociative Mohr-Coulomb plus tensile pl...
RankTwoTensor _eigvecs
Eigenvectors of the trial stress as a RankTwoTensor, in order to rotate the returned stress back to s...
virtual void consistentTangentOperatorV(const RankTwoTensor &stress_trial, const std::vector< Real > &trial_stress_params, const RankTwoTensor &stress, const std::vector< Real > &stress_params, Real gaE, const yieldAndFlow &smoothed_q, const RankFourTensor &Eijkl, bool compute_full_tangent_operator, const std::vector< std::vector< Real > > &dvar_dtrial, RankFourTensor &cto) override
Calculates the consistent tangent operator.
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
void addClassDescription(const std::string &doc_string)
std::vector< std::vector< Real > > _Eij
E[i, j] in the system of equations to be solved.
std::vector< std::vector< Real > > _Cij
_Cij[i, j] * _Eij[j, k] = 1 iff j == k
const unsigned _num_sp
Number of stress parameters.
static constexpr unsigned _tensor_dimensionality
Internal dimensionality of tensors (currently this is 3 throughout solid mechanics)
RankTwoTensorTempl< T > transpose() const
void symmetricEigenvaluesEigenvectors(std::vector< T > &eigvals, RankTwoTensorTempl< T > &eigvecs) const
Real elasticity_tensor(unsigned int i, unsigned int j, unsigned int k, unsigned int l)
Struct designed to hold info about a single yield function and its derivatives, as well as the flow d...