11 #include "petscblaslapack.h" 25 params.
addParam<
Real>(
"rtol", 1e-6,
"Constitutive stress residue relative tolerance");
26 params.
addParam<
Real>(
"abs_tol", 1e-6,
"Constitutive stress residue absolute tolerance");
28 "stol", 1e-2,
"Constitutive slip system resistance relative residual tolerance");
30 "zero_tol", 1e-12,
"Tolerance for residual check when variable value is zero");
31 params.
addParam<
unsigned int>(
"maxiter", 100,
"Maximum number of iterations for stress update");
33 "maxiter_state_variable", 100,
"Maximum number of iterations for state variable update");
34 MooseEnum tan_mod_options(
"exact none",
"none");
37 "Type of tangent moduli for preconditioner: default elastic");
39 "maximum_substep_iteration", 1,
"Maximum number of substep iteration");
40 params.
addParam<
bool>(
"use_line_search",
false,
"Use line search in constitutive update");
41 params.
addParam<
Real>(
"min_line_search_step_size", 0.01,
"Minimum line search step size");
42 params.
addParam<
Real>(
"line_search_tol", 0.5,
"Line search bisection method tolerance");
44 "line_search_maxiter", 20,
"Line search bisection method maximum number of iteration");
45 MooseEnum line_search_method(
"CUT_HALF BISECTION",
"CUT_HALF");
47 "line_search_method", line_search_method,
"The method used in line search");
50 "List of names of user objects that define the slip rates for this material.");
52 "uo_slip_resistances",
53 "List of names of user objects that define the slip resistances for this material.");
56 "List of names of user objects that define the state variable for this material.");
58 "uo_state_var_evol_rate_comps",
59 "List of names of user objects that define the state " 60 "variable evolution rate components for this material.");
66 _num_uo_slip_rates(parameters.
get<
std::vector<UserObjectName>>(
"uo_slip_rates").size()),
67 _num_uo_slip_resistances(
68 parameters.
get<
std::vector<UserObjectName>>(
"uo_slip_resistances").size()),
69 _num_uo_state_vars(parameters.
get<
std::vector<UserObjectName>>(
"uo_state_vars").size()),
70 _num_uo_state_var_evol_rate_comps(
71 parameters.
get<
std::vector<UserObjectName>>(
"uo_state_var_evol_rate_comps").size()),
72 _rtol(getParam<
Real>(
"rtol")),
73 _abs_tol(getParam<
Real>(
"abs_tol")),
74 _stol(getParam<
Real>(
"stol")),
75 _zero_tol(getParam<
Real>(
"zero_tol")),
76 _maxiter(getParam<unsigned
int>(
"maxiter")),
77 _maxiterg(getParam<unsigned
int>(
"maxiter_state_variable")),
78 _tan_mod_type(getParam<
MooseEnum>(
"tan_mod_type")),
79 _max_substep_iter(getParam<unsigned
int>(
"maximum_substep_iteration")),
80 _use_line_search(getParam<bool>(
"use_line_search")),
81 _min_lsrch_step(getParam<
Real>(
"min_line_search_step_size")),
82 _lsrch_tol(getParam<
Real>(
"line_search_tol")),
83 _lsrch_max_iter(getParam<unsigned
int>(
"line_search_maxiter")),
84 _lsrch_method(getParam<
MooseEnum>(
"line_search_method")),
94 _update_rot_old(getMaterialPropertyOld<
RankTwoTensor>(
"update_rot")),
95 _elasticity_tensor_name(_base_name +
"elasticity_tensor"),
96 _elasticity_tensor(getMaterialPropertyByName<
RankFourTensor>(_elasticity_tensor_name)),
97 _deformation_gradient(getMaterialProperty<
RankTwoTensor>(
"deformation_gradient")),
98 _deformation_gradient_old(getMaterialPropertyOld<
RankTwoTensor>(
"deformation_gradient")),
129 _uo_slip_rates[i] = &getUserObjectByName<CrystalPlasticitySlipRate>(
130 parameters.
get<std::vector<UserObjectName>>(
"uo_slip_rates")[i]);
132 parameters.
get<std::vector<UserObjectName>>(
"uo_slip_rates")[i]);
134 parameters.
get<std::vector<UserObjectName>>(
"uo_slip_rates")[i] +
"_flow_direction");
140 parameters.
get<std::vector<UserObjectName>>(
"uo_slip_resistances")[i]);
142 parameters.
get<std::vector<UserObjectName>>(
"uo_slip_resistances")[i]);
147 _uo_state_vars[i] = &getUserObjectByName<CrystalPlasticityStateVariable>(
148 parameters.
get<std::vector<UserObjectName>>(
"uo_state_vars")[i]);
150 parameters.
get<std::vector<UserObjectName>>(
"uo_state_vars")[i]);
152 parameters.
get<std::vector<UserObjectName>>(
"uo_state_vars")[i]);
158 parameters.
get<std::vector<UserObjectName>>(
"uo_state_var_evol_rate_comps")[i]);
160 parameters.
get<std::vector<UserObjectName>>(
"uo_state_var_evol_rate_comps")[i]);
214 unsigned int substep_iter = 1;
216 unsigned int num_substep = 1;
239 for (
unsigned int istep = 0; istep < num_substep; ++istep)
254 throw MooseException(
"FiniteStrainUObasedCP: Constitutive failure.");
316 bool iter_flag =
true;
342 mooseWarning(
"FiniteStrainUObasedCP: Hardness Integration error\n");
356 for (
unsigned j = 0;
j < n;
j++)
387 unsigned int iter = 0;
389 Real rnorm, rnorm0, rnorm_prev;
396 mooseWarning(
"FiniteStrainUObasedCP: Slip increment exceeds tolerance - Element number ",
419 mooseWarning(
"FiniteStrainUObasedCP: Slip increment exceeds tolerance - Element number ",
433 mooseWarning(
"FiniteStrainUObasedCP: Failed with line search");
448 mooseWarning(
"FiniteStrainUObasedCP: Stress Integration error rmax = ",
450 " and the tolerance is ",
452 " when the rnorm0 value is ",
527 eqv_slip_incr = iden - eqv_slip_incr;
554 deedfe(i,
j,
k, i) = deedfe(i,
j,
k, i) +
_fe(
k,
j) * 0.5;
555 deedfe(i,
j,
k,
j) = deedfe(i,
j,
k,
j) +
_fe(
k, i) * 0.5;
561 std::vector<RankTwoTensor> dtaudpk2(nss), dfpinvdslip(nss);
562 std::vector<Real> dslipdtau;
563 dslipdtau.resize(nss);
565 for (
unsigned int j = 0;
j < nss;
j++)
569 dfpinvdpk2 += (dfpinvdslip[
j] * dslipdtau[
j] *
_substep_dt).outerProduct(dtaudpk2[
j]);
601 deedfe(i,
j,
k, i) = deedfe(i,
j,
k, i) +
_fe(
k,
j) * 0.5;
602 deedfe(i,
j,
k,
j) = deedfe(i,
j,
k,
j) +
_fe(
k, i) * 0.5;
605 usingTensorIndices(i_, j_, k_, l_);
615 tan_mod(i,
j, i, l) += pk2fet(l,
j);
616 tan_mod(i,
j,
j, l) += fepk2(i, l);
619 tan_mod += dsigdpk2dfe;
666 unsigned int count = 0;
682 if ((rnorm1 / rnorm0) <
_lsrch_tol || s_a * s_b > 0)
691 step = 0.5 * (step_b + step_a);
715 mooseError(
"Line search method is not provided.");
const MooseArray< Point > & _q_point
virtual bool isStateVariablesConverged()
evaluates convergence of state variables.
const MaterialProperty< RankTwoTensor > & _pk2_old
MaterialProperty< RankFourTensor > & _Jacobian_mult
derivative of stress w.r.t. strain (_dstress_dstrain)
RankTwoTensorTempl< Real > inverse() const
std::vector< std::vector< Real > > _state_vars_old
Local state variable.
ComputeStressBase is the base class for stress tensors computed from MOOSE's strain calculators...
virtual void postSolveStatevar()
update internal variable after solve.
bool _err_tol
Flag to check whether convergence is achieved.
std::vector< MaterialProperty< std::vector< Real > > * > _mat_prop_slip_rates
Slip rates material property.
Real _stol
Internal variable update equation tolerance.
std::vector< MaterialProperty< std::vector< Real > > * > _mat_prop_state_var_evol_rate_comps
State variable evolution rate component material property.
std::vector< const CrystalPlasticitySlipResistance * > _uo_slip_resistances
User objects that define the slip resistance.
static RankFourTensorTempl< Real > IdentityFour()
MooseEnum _tan_mod_type
Type of tangent moduli calculation.
unsigned int _lsrch_max_iter
Line search bisection method maximum iteration number.
Real _zero_tol
Residual tolerance when variable value is zero. Default 1e-12.
static InputParameters validParams()
FiniteStrainUObasedCP(const InputParameters ¶meters)
std::vector< MaterialProperty< std::vector< Real > > * > _mat_prop_slip_resistances
Slip resistance material property.
std::vector< const CrystalPlasticityStateVarRateComponent * > _uo_state_var_evol_rate_comps
User objects that define the state variable evolution rate component.
virtual void initQpStatefulProperties()
initializes the stateful properties such as stress, plastic deformation gradient, slip system resista...
std::vector< std::vector< Real > > _state_vars_old_stored
Local stored state variable (for sub-stepping)
RankTwoTensor _delta_dfgrd
Used for substepping; Uniformly divides the increment in deformation gradient.
static constexpr std::size_t dim
static InputParameters validParams()
std::vector< std::vector< Real > > _state_vars_prev
Local old state variable.
unsigned int _maxiter
Maximum number of iterations for stress update.
std::vector< const CrystalPlasticityStateVariable * > _uo_state_vars
User objects that define the state variable.
virtual void calcTangentModuli()
calculate the tangent moduli for preconditioner.
virtual bool isBoundaryMaterial() const override
void mooseWarning(Args &&... args) const
virtual void calcResidJacob()
calls the residual and jacobian functions used in the stress update algorithm.
virtual void updateSlipSystemResistanceAndStateVariable()
updates the slip system resistances and state variables.
ADRealEigenVector< T, D, asd > abs(const ADRealEigenVector< T, D, asd > &)
virtual void calcResidual()
calculate stress residual.
virtual void computeQpStress()
updates the stress at a quadrature point.
virtual void postSolveQp()
update stress and internal variable after solve.
MaterialProperty< RankTwoTensor > & _fp
virtual void getSlipRates()
updates the slip rates.
Real _lsrch_tol
Line search bisection method tolerance.
virtual void postSolveStress()
update stress and plastic deformation gradient after solve.
virtual void preSolveStress()
set variables for stress solve.
unsigned int _num_uo_slip_rates
Number of slip rate user objects.
unsigned int _maxiterg
Maximum number of iterations for internal variable update.
void addIa(const Real &a)
const MaterialProperty< RankTwoTensor > & _deformation_gradient
std::vector< const CrystalPlasticitySlipRate * > _uo_slip_rates
User objects that define the slip rate.
RankFourTensor _jac
Jacobian tensor.
Real doubleContraction(const RankTwoTensorTempl< Real > &a) const
unsigned int _num_uo_state_vars
Number of state variable user objects.
unsigned int _num_uo_slip_resistances
Number of slip resistance user objects.
MaterialProperty< RankTwoTensor > & _lag_e
unsigned int _num_uo_state_var_evol_rate_comps
Number of state variable evolution rate component user objects.
Real _rtol
Stress residual equation relative tolerance.
FiniteStrainUObasedCP uses the multiplicative decomposition of deformation gradient and solves the PK...
bool lineSearchUpdate(const Real rnorm_prev, const RankTwoTensor)
performs the line search update
virtual void preSolveQp()
set variables for stress and internal variable solve.
Real _substep_dt
Current substep size.
virtual void elastoPlasticTangentModuli()
calculate the exact tangent moduli for preconditioner.
const MaterialProperty< RankTwoTensor > & _crysrot
Crystal rotation.
virtual void elasticTangentModuli()
calculate the elastic tangent moduli for preconditioner.
RankTwoTensorTempl< Real > transpose() const
std::vector< const MaterialProperty< std::vector< Real > > * > _mat_prop_state_vars_old
Old state variable material property.
virtual void preSolveStatevar()
set variables for internal variable solve.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
RankFourTensorTempl< Real > times(const RankTwoTensorTempl< Real > &b) const
MaterialProperty< RankTwoTensor > & _update_rot
virtual void solveQp()
solve stress and internal variables.
RankTwoTensor _resid
Residual tensor.
IntRange< T > make_range(T beg, T end)
bool _use_line_search
Flag to activate line serach.
void mooseError(Args &&... args) const
const MaterialProperty< RankTwoTensor > & _fp_old
unsigned int _max_substep_iter
Maximum number of substep iterations.
Real _abs_tol
Stress residual equation absolute tolerance.
const InputParameters & parameters() const
static const std::complex< double > j(0, 1)
Complex number "j" (also known as "i")
MaterialProperty< RankTwoTensor > & _stress
Stress material property.
virtual void solveStatevar()
solve internal variables.
const MaterialProperty< RankTwoTensor > & _deformation_gradient_old
RankTwoTensor _fp_old_inv
std::vector< MaterialProperty< std::vector< Real > > * > _mat_prop_state_vars
State variable material property.
const MaterialProperty< RankFourTensor > & _elasticity_tensor
Elasticity tensor material property.
std::vector< MaterialProperty< std::vector< RankTwoTensor > > * > _flow_direction
Real _min_lsrch_step
Minimum line search step size.
registerMooseObject("SolidMechanicsApp", FiniteStrainUObasedCP)
virtual void solveStress()
solves for stress, updates plastic deformation gradient.
MooseEnum _lsrch_method
Line search method.
RankFourTensorTempl< T > invSymm() const
static const std::string k
void ErrorVector unsigned int
const Elem & get(const ElemType type_in)
const Elem *const & _current_elem
RankTwoTensor _dfgrd_tmp_old
MaterialProperty< RankTwoTensor > & _pk2
virtual void calcJacobian()
calculate jacobian.