11 #include "petscblaslapack.h"
12 #include "MooseException.h"
26 params.addClassDescription(
"UserObject based Crystal Plasticity system.");
27 params.addParam<Real>(
"rtol", 1e-6,
"Constitutive stress residue relative tolerance");
28 params.addParam<Real>(
"abs_tol", 1e-6,
"Constitutive stress residue absolute tolerance");
29 params.addParam<Real>(
30 "stol", 1e-2,
"Constitutive slip system resistance relative residual tolerance");
31 params.addParam<Real>(
32 "zero_tol", 1e-12,
"Tolerance for residual check when variable value is zero");
33 params.addParam<
unsigned int>(
"maxiter", 100,
"Maximum number of iterations for stress update");
34 params.addParam<
unsigned int>(
35 "maxiter_state_variable", 100,
"Maximum number of iterations for state variable update");
36 MooseEnum tan_mod_options(
"exact none",
"none");
37 params.addParam<MooseEnum>(
"tan_mod_type",
39 "Type of tangent moduli for preconditioner: default elastic");
40 params.addParam<
unsigned int>(
41 "maximum_substep_iteration", 1,
"Maximum number of substep iteration");
42 params.addParam<
bool>(
"use_line_search",
false,
"Use line search in constitutive update");
43 params.addParam<Real>(
"min_line_search_step_size", 0.01,
"Minimum line search step size");
44 params.addParam<Real>(
"line_search_tol", 0.5,
"Line search bisection method tolerance");
45 params.addParam<
unsigned int>(
46 "line_search_maxiter", 20,
"Line search bisection method maximum number of iteration");
47 MooseEnum line_search_method(
"CUT_HALF BISECTION",
"CUT_HALF");
48 params.addParam<MooseEnum>(
49 "line_search_method", line_search_method,
"The method used in line search");
50 params.addRequiredParam<std::vector<UserObjectName>>(
52 "List of names of user objects that define the slip rates for this material.");
53 params.addRequiredParam<std::vector<UserObjectName>>(
54 "uo_slip_resistances",
55 "List of names of user objects that define the slip resistances for this material.");
56 params.addRequiredParam<std::vector<UserObjectName>>(
58 "List of names of user objects that define the state variable for this material.");
59 params.addRequiredParam<std::vector<UserObjectName>>(
60 "uo_state_var_evol_rate_comps",
61 "List of names of user objects that define the state "
62 "variable evolution rate components for this material.");
68 _num_uo_slip_rates(parameters.get<std::vector<UserObjectName>>(
"uo_slip_rates").size()),
69 _num_uo_slip_resistances(
70 parameters.get<std::vector<UserObjectName>>(
"uo_slip_resistances").size()),
71 _num_uo_state_vars(parameters.get<std::vector<UserObjectName>>(
"uo_state_vars").size()),
72 _num_uo_state_var_evol_rate_comps(
73 parameters.get<std::vector<UserObjectName>>(
"uo_state_var_evol_rate_comps").size()),
74 _rtol(getParam<Real>(
"rtol")),
75 _abs_tol(getParam<Real>(
"abs_tol")),
76 _stol(getParam<Real>(
"stol")),
77 _zero_tol(getParam<Real>(
"zero_tol")),
78 _maxiter(getParam<unsigned int>(
"maxiter")),
79 _maxiterg(getParam<unsigned int>(
"maxiter_state_variable")),
80 _tan_mod_type(getParam<MooseEnum>(
"tan_mod_type")),
81 _max_substep_iter(getParam<unsigned int>(
"maximum_substep_iteration")),
82 _use_line_search(getParam<bool>(
"use_line_search")),
83 _min_lsrch_step(getParam<Real>(
"min_line_search_step_size")),
84 _lsrch_tol(getParam<Real>(
"line_search_tol")),
85 _lsrch_max_iter(getParam<unsigned int>(
"line_search_maxiter")),
86 _lsrch_method(getParam<MooseEnum>(
"line_search_method")),
96 _update_rot_old(getMaterialPropertyOld<
RankTwoTensor>(
"update_rot")),
97 _elasticity_tensor_name(_base_name +
"elasticity_tensor"),
98 _elasticity_tensor(getMaterialPropertyByName<
RankFourTensor>(_elasticity_tensor_name)),
99 _deformation_gradient(getMaterialProperty<
RankTwoTensor>(
"deformation_gradient")),
100 _deformation_gradient_old(getMaterialPropertyOld<
RankTwoTensor>(
"deformation_gradient")),
131 _uo_slip_rates[i] = &getUserObjectByName<CrystalPlasticitySlipRate>(
132 parameters.get<std::vector<UserObjectName>>(
"uo_slip_rates")[i]);
134 parameters.get<std::vector<UserObjectName>>(
"uo_slip_rates")[i]);
136 parameters.get<std::vector<UserObjectName>>(
"uo_slip_rates")[i] +
"_flow_direction");
142 parameters.get<std::vector<UserObjectName>>(
"uo_slip_resistances")[i]);
144 parameters.get<std::vector<UserObjectName>>(
"uo_slip_resistances")[i]);
149 _uo_state_vars[i] = &getUserObjectByName<CrystalPlasticityStateVariable>(
150 parameters.get<std::vector<UserObjectName>>(
"uo_state_vars")[i]);
152 parameters.get<std::vector<UserObjectName>>(
"uo_state_vars")[i]);
154 parameters.get<std::vector<UserObjectName>>(
"uo_state_vars")[i]);
160 parameters.get<std::vector<UserObjectName>>(
"uo_state_var_evol_rate_comps")[i]);
162 parameters.get<std::vector<UserObjectName>>(
"uo_state_var_evol_rate_comps")[i]);
194 _fp[_qp].setToIdentity();
211 if (isBoundaryMaterial())
214 unsigned int substep_iter = 1;
216 unsigned int num_substep = 1;
218 Real dt_original = _dt;
239 _dt = dt_original / num_substep;
241 for (
unsigned int istep = 0; istep < num_substep; ++istep)
255 throw MooseException(
"FiniteStrainUObasedCP: Constitutive failure.");
318 bool iter_flag =
true;
343 mooseWarning(
"FiniteStrainUObasedCP: Hardness Integration error\n");
357 for (
unsigned j = 0; j < n; j++)
388 unsigned int iter = 0;
390 Real rnorm, rnorm0, rnorm_prev;
397 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 = ", rnorm);
507 RankTwoTensor iden(RankTwoTensor::initIdentity), ce, ee, ce_pk2, eqv_slip_incr, pk2_new;
514 for (
unsigned int j = 0; j <
_uo_slip_rates[i]->variableSize(); ++j)
517 eqv_slip_incr = iden - eqv_slip_incr;
521 ce =
_fe.transpose() *
_fe;
535 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
536 for (
unsigned int j = 0; j < LIBMESH_DIM; ++j)
537 for (
unsigned int k = 0; k < LIBMESH_DIM; ++k)
540 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
541 for (
unsigned int j = 0; j < LIBMESH_DIM; ++j)
542 for (
unsigned int k = 0; k < LIBMESH_DIM; ++k)
544 deedfe(i, j, k, i) = deedfe(i, j, k, i) +
_fe(k, j) * 0.5;
545 deedfe(i, j, k, j) = deedfe(i, j, k, j) +
_fe(k, i) * 0.5;
551 std::vector<RankTwoTensor> dtaudpk2(nss), dfpinvdslip(nss);
552 std::vector<Real> dslipdtau;
553 dslipdtau.resize(nss);
555 for (
unsigned int j = 0; j < nss; j++)
561 for (
unsigned int j = 0; j < nss; j++)
562 dfpinvdpk2 += (dfpinvdslip[j] * dslipdtau[j] * _dt).outerProduct(dtaudpk2[j]);
565 RankFourTensor::IdentityFour() - (
_elasticity_tensor[_qp] * deedfe * dfedfpinv * dfpinvdpk2);
589 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
590 for (
unsigned int j = 0; j < LIBMESH_DIM; ++j)
591 for (
unsigned int k = 0; k < LIBMESH_DIM; ++k)
593 deedfe(i, j, k, i) = deedfe(i, j, k, i) +
_fe(k, j) * 0.5;
594 deedfe(i, j, k, j) = deedfe(i, j, k, j) +
_fe(k, i) * 0.5;
599 pk2fet =
_pk2[_qp] *
_fe.transpose();
602 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
603 for (
unsigned int j = 0; j < LIBMESH_DIM; ++j)
604 for (
unsigned int l = 0; l < LIBMESH_DIM; ++l)
606 tan_mod(i, j, i, l) += pk2fet(l, j);
607 tan_mod(i, j, j, l) += fepk2(i, l);
610 tan_mod += dsigdpk2dfe;
616 for (
unsigned int i = 0; i < LIBMESH_DIM; ++i)
617 for (
unsigned int j = 0; j < LIBMESH_DIM; ++j)
618 for (
unsigned int l = 0; l < LIBMESH_DIM; ++l)
619 dfedf(i, j, i, l) =
_fp_inv(l, j);
643 _pk2[_qp] =
_pk2[_qp] - step * dpk2;
645 _pk2[_qp] =
_pk2[_qp] + step * dpk2;
657 unsigned int count = 0;
665 Real s_b =
_resid.doubleContraction(dpk2);
666 Real rnorm1 =
_resid.L2norm();
669 Real s_a =
_resid.doubleContraction(dpk2);
670 Real rnorm0 =
_resid.L2norm();
673 if ((rnorm1 / rnorm0) <
_lsrch_tol || s_a * s_b > 0)
681 _pk2[_qp] =
_pk2[_qp] - step * dpk2;
682 step = 0.5 * (step_b + step_a);
683 _pk2[_qp] =
_pk2[_qp] + step * dpk2;
685 s_m =
_resid.doubleContraction(dpk2);
706 mooseError(
"Line search method is not provided.");