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.
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.