UserObject based Crystal Plasticity System

UserObject based Crystal Plasticity system.

Description

The UserObject based crystal plasticity system is designed to facilitate the implementation of different constitutive laws in a modular way. Both phenomenological constitutive models and dislocation-based constitutive models can be implemented through this system. This system consists of one material class FiniteStrainUObasedCP and four UserObject classes, namely CrystalPlasticitySlipRate, CrystalPlasticitySlipResistance, CrystalPlasticityStateVarRateComponent and CrystalPlasticityStateVariable.

The material class is based on plastic flow on individual slip systems to obtain the inelastic deformation in materials. The present formulation considers large deformation and is based on a stress update algorithm. Some of the important functions associated with this class are outlined below.

Function computeQpStress:

Input:

  • 2nd^{nd} Piola-Kirchhoff (PK2) stress in the intermediate configuration at previous increment (variable _pk2_old, symbol TnT_n);

  • Plastic deformation gradient at previous increment (variable _fp_old, symbol FnpF^p_n);

  • State variables at previous increment;

  • Current deformation gradient (variable _dfgrd, symbol FF).

Output:

  • Current PK2 stress (variable _pk2, symbol TT);

  • Current plastic deformation gradient (variable _fp, symbol FpF^p);

  • Current slip system resistances.

  • State variables are solved iteratively using a predictor corrector algorithm. TT is solved using Newton Raphson.

Flowchart:

i: At iteration i=0, yiα=ynαy^\alpha_i=y^\alpha_n

ii: Calculate the residual r and Jacobian J=r/T\partial r/\partial T from the function calc_resid_jacob

iii: Update T as: Ti+1=TiJ1rT_{i+1}=T_{i}-J^{-1}r

iv: Check r2<||r||_2 < _rtol (Optional user defined parameter)

If False then go to Step ii

Else

v: Calculate yi+1αy^\alpha_{i+1} from function updateSlipSystemResistanceAndStateVariable

vi: Check maxsi+1αsiα/siα<max|s^\alpha_{i+1}-s^\alpha_{i}|/|s^\alpha_{i}| < _stol (Optional user defined parameter)

If False then go to Step ii

Else

vii: Obtain rotation tensor R

viii: Update rotation as R~=RQ\tilde{R}=RQ where Q is the rotation tensor from Euler angles

Exit Function

Function calc_resid_jacob: User can override this function.

Input:

  • PK2 stress at previous iteration (variable _pk2, symbol TiT_i, i - iteration);

  • Inverse of plastic deformation gradient at previous increment (variable _fp_old_inv, symbol Fnp1F^{p-1}_n);

  • Current deformation gradient (variable _dfgrd, symbol FF).

Output:

  • Residual (variable resid, symbol r);

  • Jacobian (variable jac, symbol J);

  • Updated inverse of plastic deformation gradient (variable _fp_inv, symbol Fp1F^{p-1})

Residual r as implemented:

i. Get slip rates from userobject.

ii. Resultant slip increment (variable eqv_slip_incr) Δγres=Imα(ΔγmαSmα)\Delta \gamma_{res}=I-\sum\limits_m\sum \limits_\alpha \left( \Delta \gamma^\alpha_m S_m^\alpha\right) where SmαS_m^\alpha is the flow direction.

iii. Current plastic component of deformation gradient Fp1=Fnp1ΔγresF^{p-1}=F^{p-1}_n\Delta \gamma_{res}.

iv. Elastic component of deformation gradient in iteration i+1, Fe=FFp1F^e=FF^{p-1}.

vi: PK2 stress due to TiT_i and associated slip increment in current iteration i+1 (variable pk2_new), T=C:12(FeTFeI)T^\prime=C:\frac{1}{2}\left(F^{eT}F^e-I\right).

vii. Residual r=TiTr=T_i-T^\prime.

Jacobian J formulation:

i. r=TiTr=T_i-T^\prime and J=rTi=ITTiJ=\frac{\partial r}{\partial T_i}=I-\frac{\partial T^\prime}{\partial T_i}.

ii. T=C:EeT^\prime=C:E^e which gives TTi=C:EeTi\frac{\partial T^\prime}{\partial T_i}=C: \frac{\partial E^e}{\partial T_i}.

iii. Ee=12(FeTFeI)E^e=\frac{1}{2}\left(F^{eT}F^e -I\right) which gives in indicial notation EijeFkle=12(δilFkje+δjlFkie)\frac{\partial E^e_{ij}}{\partial F^e_{kl}}=\frac{1}{2}\left( \delta_{il}F^e_{kj}+\delta_{jl}F^e_{ki}\right) where δij\delta_{ij} is the Kronecker delta.

iv. Fe=FFp1F^e=FF^{p-1} which gives in indicial notation FijeFklp1=Fikδlj\frac{\partial F^e_{ij}}{\partial F^{p-1}_{kl}}=F_{ik}\delta_{lj}.

v. Fp1=Fnp1ΔγresF^{p-1}=F^{p-1}_n\Delta \gamma_{res} which gives Fp1Δγres=Fnp1\frac{\partial F^{p-1}}{\partial \Delta \gamma_{res}}=F^{p-1}_n.

vi. Δγres=Imα(ΔγmαSmα)\Delta \gamma_{res}=I-\sum\limits_m\sum \limits_\alpha \left( \Delta \gamma^\alpha_m S_m^\alpha\right) which gives ΔγresΔγmα=αSmα\frac{\partial \Delta \gamma_{res}}{\partial \Delta \gamma^\alpha_m}=-\sum\limits_\alpha S_m^\alpha.

vii. Δγmα=f(τmα)\Delta \gamma^\alpha_m=f(\tau_m^\alpha) which gives Δγmατmα\frac{\partial \Delta \gamma^\alpha_m}{\partial \tau^\alpha_m}.

viii. τα=Ti:Sm\tau^\alpha=T_i:S_m gives τmαTi=Smα\frac{\partial \tau^\alpha_m}{\partial T_i}=S_m^\alpha.

ix. Hence TTi=C:EeFeFeFp1Fp1Δγresm(ΔγresΔγmαΔγmατmα)ταTi\frac{\partial T^\prime}{\partial T_i}=C: \frac{\partial E^e}{\partial F^e} \frac{\partial F^e}{\partial F^{p-1}} \frac{\partial F^{p-1}}{\partial \Delta \gamma_{res}}\sum\limits_m(\frac{\partial \Delta \gamma_{res}}{\partial \Delta \gamma^\alpha_m}\frac{\partial \Delta \gamma^\alpha_m}{\partial \tau^\alpha_m})\frac{\partial \tau^\alpha}{\partial T_i}.

Jacobian J as implemented:

i. Variable dtaudpk2, ταTi\frac{\partial \tau^\alpha}{\partial T_i}.

ii. Variable dfpinvdslip, Fp1Δγα\frac{\partial F^{p-1}}{\partial \Delta \gamma^\alpha}.

iii. Variable dfedfpinv, FeFp1\frac{\partial F^e}{\partial F^{p-1}}.

iv: Variable deedfe, EeFe\frac{\partial E^e}{\partial F^e}.

v. Variable dfpinvdpk2, Fp1Ti=Fp1ΔγαΔγαταταTi\frac{\partial F^{p-1}}{\partial T_i}=\frac{\partial F^{p-1}}{\partial \Delta \gamma^\alpha} \frac{\partial \Delta \gamma^\alpha}{\partial \tau^\alpha} \frac{\partial \tau^\alpha}{\partial T_i}.

vi. Δγmατmα\frac{\partial \Delta \gamma^\alpha_m}{\partial \tau^\alpha_m} obtained from slip rate userobject.

vii. Variable jac, J=C:EeFeFeFp1Fp1TiJ=C:\frac{\partial E^e}{\partial F^e} \frac{\partial F^e}{\partial F^{p-1}} \frac{\partial F^{p-1}}{\partial T_i}, followed by J=IJJ=\mathfrak{I}-J where I\mathfrak{I} is the fourth order identity tensor.

Update Cauchy stress (variable sig) σ=FeTiFeT/Je\sigma=F^e T_i F^{eT}/J^e.

Function computeQpElasticityTensor: Defines tangent moduli K and can be used as preconditioner for JFNK. User can override this function.

Input:

  • Current plastic deformation gradient (variable _fp, symbol FpF^p);

  • Current deformation gradient (variable _dfgrd, symbol FF)

Output:

  • Tangent moduli (variable _Jacobian_mult,symbol K).

Formulation:

i. K=σFK=\frac{\partial \sigma}{\partial F}.

ii. σ=FeTFeT/Je\sigma=F^eTF^{eT}/J^e which gives σF=1Je(FeFTFeT+FeTFFeT+FeTFeTF)\frac{\partial \sigma}{\partial F}=\frac{1}{J^e}\left(\frac{\partial F^e}{\partial F}TF^{eT}+F^e\frac{\partial T}{\partial F}F^{eT}+F^eT\frac{\partial F^{eT}}{\partial F}\right).

iii. In indicial notation FijeFkl=δkiFljp1\frac{\partial F^e_{ij}}{\partial F_{kl}}=\delta_{ki}F^{p-1}_{lj}.

iv. T=C:EeT=C:E^e which gives TF=TEeEeFeFeF=C:EeFeFeF\frac{\partial T}{\partial F}=\frac{\partial T}{\partial E^e}\frac{\partial E^e}{\partial F^e}\frac{\partial F^e}{\partial F}=C:\frac{\partial E^e}{\partial F^e}\frac{\partial F^e}{\partial F}.

v. In indicial notation EijeFkle=12(δilFkje+δjlFkie)\frac{\partial E^e_{ij}}{\partial F^e_{kl}}=\frac{1}{2}\left(\delta_{il}F^e_{kj}+\delta_{jl}F^e_{ki}\right).

Implementation:

i. Variable dfedf calculates FeF\frac{\partial F^e}{\partial F}.

ii. Variable deedfe calculates EeFe\frac{\partial E^e}{\partial F^e}.

iii. Variable dsigspk2dfe calculates FeTC:EeFeFeF^{eT} C:\frac{\partial E^e}{\partial F^e} F^e.

Input Parameters

  • uo_slip_ratesList of names of user objects that define the slip rates for this material.

    C++ Type:std::vector<UserObjectName>

    Unit:(no unit assumed)

    Controllable:No

    Description:List of names of user objects that define the slip rates for this material.

  • uo_slip_resistancesList of names of user objects that define the slip resistances for this material.

    C++ Type:std::vector<UserObjectName>

    Unit:(no unit assumed)

    Controllable:No

    Description:List of names of user objects that define the slip resistances for this material.

  • uo_state_var_evol_rate_compsList of names of user objects that define the state variable evolution rate components for this material.

    C++ Type:std::vector<UserObjectName>

    Unit:(no unit assumed)

    Controllable:No

    Description:List of names of user objects that define the state variable evolution rate components for this material.

  • uo_state_varsList of names of user objects that define the state variable for this material.

    C++ Type:std::vector<UserObjectName>

    Unit:(no unit assumed)

    Controllable:No

    Description:List of names of user objects that define the state variable for this material.

Required Parameters

  • abs_tol1e-06Constitutive stress residue absolute tolerance

    Default:1e-06

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Constitutive stress residue absolute tolerance

  • base_nameOptional parameter that allows the user to define multiple mechanics material systems on the same block, i.e. for multiple phases

    C++ Type:std::string

    Unit:(no unit assumed)

    Controllable:No

    Description:Optional parameter that allows the user to define multiple mechanics material systems on the same block, i.e. for multiple phases

  • blockThe list of blocks (ids or names) that this object will be applied

    C++ Type:std::vector<SubdomainName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The list of blocks (ids or names) that this object will be applied

  • boundaryThe list of boundaries (ids or names) from the mesh where this object applies

    C++ Type:std::vector<BoundaryName>

    Unit:(no unit assumed)

    Controllable:No

    Description:The list of boundaries (ids or names) from the mesh where this object applies

  • computeTrueWhen false, MOOSE will not call compute methods on this material. The user must call computeProperties() after retrieving the MaterialBase via MaterialBasePropertyInterface::getMaterialBase(). Non-computed MaterialBases are not sorted for dependencies.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:When false, MOOSE will not call compute methods on this material. The user must call computeProperties() after retrieving the MaterialBase via MaterialBasePropertyInterface::getMaterialBase(). Non-computed MaterialBases are not sorted for dependencies.

  • constant_onNONEWhen ELEMENT, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps.When SUBDOMAIN, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps. Evaluations on element qps will be skipped

    Default:NONE

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:NONE, ELEMENT, SUBDOMAIN

    Controllable:No

    Description:When ELEMENT, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps.When SUBDOMAIN, MOOSE will only call computeQpProperties() for the 0th quadrature point, and then copy that value to the other qps. Evaluations on element qps will be skipped

  • declare_suffixAn optional suffix parameter that can be appended to any declared properties. The suffix will be prepended with a '_' character.

    C++ Type:MaterialPropertyName

    Unit:(no unit assumed)

    Controllable:No

    Description:An optional suffix parameter that can be appended to any declared properties. The suffix will be prepended with a '_' character.

  • line_search_maxiter20Line search bisection method maximum number of iteration

    Default:20

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Line search bisection method maximum number of iteration

  • line_search_methodCUT_HALFThe method used in line search

    Default:CUT_HALF

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:CUT_HALF, BISECTION

    Controllable:No

    Description:The method used in line search

  • line_search_tol0.5Line search bisection method tolerance

    Default:0.5

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Line search bisection method tolerance

  • maximum_substep_iteration1Maximum number of substep iteration

    Default:1

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Maximum number of substep iteration

  • maxiter100Maximum number of iterations for stress update

    Default:100

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Maximum number of iterations for stress update

  • maxiter_state_variable100Maximum number of iterations for state variable update

    Default:100

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:Maximum number of iterations for state variable update

  • min_line_search_step_size0.01Minimum line search step size

    Default:0.01

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Minimum line search step size

  • prop_getter_suffixAn optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

    C++ Type:MaterialPropertyName

    Unit:(no unit assumed)

    Controllable:No

    Description:An optional suffix parameter that can be appended to any attempt to retrieve/get material properties. The suffix will be prepended with a '_' character.

  • rtol1e-06Constitutive stress residue relative tolerance

    Default:1e-06

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Constitutive stress residue relative tolerance

  • stol0.01Constitutive slip system resistance relative residual tolerance

    Default:0.01

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Constitutive slip system resistance relative residual tolerance

  • tan_mod_typenoneType of tangent moduli for preconditioner: default elastic

    Default:none

    C++ Type:MooseEnum

    Unit:(no unit assumed)

    Options:exact, none

    Controllable:No

    Description:Type of tangent moduli for preconditioner: default elastic

  • use_interpolated_stateFalseFor the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:For the old and older state use projected material properties interpolated at the quadrature points. To set up projection use the ProjectedStatefulMaterialStorageAction.

  • use_line_searchFalseUse line search in constitutive update

    Default:False

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Use line search in constitutive update

  • zero_tol1e-12Tolerance for residual check when variable value is zero

    Default:1e-12

    C++ Type:double

    Unit:(no unit assumed)

    Controllable:No

    Description:Tolerance for residual check when variable value is zero

Optional Parameters

  • control_tagsAdds user-defined labels for accessing object parameters via control logic.

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:Adds user-defined labels for accessing object parameters via control logic.

  • enableTrueSet the enabled status of the MooseObject.

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:Yes

    Description:Set the enabled status of the MooseObject.

  • implicitTrueDetermines whether this object is calculated using an implicit or explicit form

    Default:True

    C++ Type:bool

    Unit:(no unit assumed)

    Controllable:No

    Description:Determines whether this object is calculated using an implicit or explicit form

  • seed0The seed for the master random number generator

    Default:0

    C++ Type:unsigned int

    Unit:(no unit assumed)

    Controllable:No

    Description:The seed for the master random number generator

Advanced Parameters

  • output_propertiesList of material properties, from this material, to output (outputs must also be defined to an output type)

    C++ Type:std::vector<std::string>

    Unit:(no unit assumed)

    Controllable:No

    Description:List of material properties, from this material, to output (outputs must also be defined to an output type)

  • outputsnone Vector of output names where you would like to restrict the output of variables(s) associated with this object

    Default:none

    C++ Type:std::vector<OutputName>

    Unit:(no unit assumed)

    Controllable:No

    Description:Vector of output names where you would like to restrict the output of variables(s) associated with this object

Outputs Parameters

References

No citations exist within this document.