Line data Source code
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 : 10 : #include "DeformedGrainMaterial.h" 11 : #include "GrainTrackerInterface.h" 12 : 13 : registerMooseObject("PhaseFieldApp", DeformedGrainMaterial); 14 : 15 : InputParameters 16 47 : DeformedGrainMaterial::validParams() 17 : { 18 47 : InputParameters params = Material::validParams(); 19 47 : params.addClassDescription("Computes scaled grain material properties"); 20 94 : params.addRequiredCoupledVarWithAutoBuild( 21 : "v", "var_name_base", "op_num", "Array of coupled variables"); 22 94 : params.addRequiredParam<unsigned int>("deformed_grain_num", 23 : "Number of OP representing deformed grains"); 24 94 : params.addParam<Real>("length_scale", 1.0e-9, "Length scale in m, where default is nm"); 25 94 : params.addParam<Real>("int_width", 4.0, "Diffuse Interface width in length_scale unit"); 26 94 : params.addParam<Real>("time_scale", 1.0e-6, "Time scale in sec, where default is micro sec"); 27 94 : params.addParam<Real>("GBMobility", 2.0e-13, "GB mobility input in m^4/(J*s)"); 28 94 : params.addParam<Real>("GBE", 1.0, "Grain boundary energy in J/m^2"); 29 94 : params.addParam<Real>("Disloc_Den", 9.0e15, "Dislocation Density in m^-2"); 30 94 : params.addParam<Real>("Elas_Mod", 2.50e10, "Elastic Modulus in J/m^3"); 31 94 : params.addParam<Real>("Burg_vec", 3.0e-10, "Length of Burger Vector in m"); 32 94 : params.addRequiredParam<UserObjectName>("grain_tracker", 33 : "The GrainTracker UserObject to get values from."); 34 47 : return params; 35 0 : } 36 : 37 36 : DeformedGrainMaterial::DeformedGrainMaterial(const InputParameters & parameters) 38 : : Material(parameters), 39 36 : _op_num(coupledComponents("v")), 40 36 : _vals(coupledValues("v")), 41 72 : _length_scale(getParam<Real>("length_scale")), 42 72 : _int_width(getParam<Real>("int_width")), 43 72 : _time_scale(getParam<Real>("time_scale")), 44 72 : _GBMobility(getParam<Real>("GBMobility")), 45 72 : _GBE(getParam<Real>("GBE")), 46 72 : _Disloc_Den(getParam<Real>("Disloc_Den")), 47 72 : _Elas_Mod(getParam<Real>("Elas_Mod")), 48 72 : _Burg_vec(getParam<Real>("Burg_vec")), 49 36 : _kappa(declareProperty<Real>("kappa_op")), 50 36 : _gamma(declareProperty<Real>("gamma_asymm")), 51 36 : _L(declareProperty<Real>("L")), 52 36 : _mu(declareProperty<Real>("mu")), 53 36 : _beta(declareProperty<Real>("beta")), 54 36 : _Disloc_Den_i(declareProperty<Real>("Disloc_Den_i")), 55 36 : _rho_eff(declareProperty<Real>("rho_eff")), 56 36 : _Def_Eng(declareProperty<Real>("Def_Eng")), 57 72 : _deformed_grain_num(getParam<unsigned int>("deformed_grain_num")), 58 36 : _grain_tracker(getUserObject<GrainTrackerInterface>("grain_tracker")), 59 36 : _kb(8.617343e-5), // Boltzmann constant in eV/K 60 36 : _JtoeV(6.24150974e18) // Joule to eV conversion 61 : { 62 36 : if (_op_num == 0) 63 0 : paramError("op_num", "Model requires op_num > 0"); 64 36 : } 65 : 66 : void 67 1085440 : DeformedGrainMaterial::computeQpProperties() 68 : { 69 1085440 : _Disloc_Den_i[_qp] = _Disloc_Den * (_length_scale * _length_scale); 70 : 71 : Real rho_i; 72 : Real rho0 = 0.0; 73 : Real SumEtai2 = 0.0; 74 9768960 : for (unsigned int i = 0; i < _op_num; ++i) 75 8683520 : SumEtai2 += (*_vals[i])[_qp] * (*_vals[i])[_qp]; 76 : 77 : // calculate effective dislocation density and assign zero dislocation densities to undeformed 78 : // grains 79 1085440 : const auto & op_to_grains = _grain_tracker.getVarToFeatureVector(_current_elem->id()); 80 : 81 : // loop over active OPs 82 : bool one_active = false; 83 9768960 : for (MooseIndex(op_to_grains) op_index = 0; op_index < op_to_grains.size(); ++op_index) 84 : { 85 8683520 : if (op_to_grains[op_index] == FeatureFloodCount::invalid_id) 86 7259020 : continue; 87 : 88 : one_active = true; 89 : auto grain_id = op_to_grains[op_index]; 90 : 91 1424500 : if (grain_id >= _deformed_grain_num) 92 : rho_i = 0.0; 93 : else 94 1238020 : rho_i = _Disloc_Den_i[_qp]; 95 1424500 : rho0 += rho_i * (*_vals[op_index])[_qp] * (*_vals[op_index])[_qp]; 96 : } 97 : 98 1085440 : if (!one_active && _t_step > 0) 99 0 : mooseError("No active order parameters"); 100 : 101 1085440 : _rho_eff[_qp] = rho0 / SumEtai2; 102 1085440 : if (_rho_eff[_qp] < 1e-9) 103 : { 104 126104 : _rho_eff[_qp] = 0.0; 105 126104 : _Disloc_Den_i[_qp] = 0.0; 106 : } 107 : 108 1085440 : _beta[_qp] = 0.5 * _Elas_Mod * _Burg_vec * _Burg_vec * _JtoeV * _length_scale; 109 : 110 : // Compute the deformation energy 111 1085440 : _Def_Eng[_qp] = _beta[_qp] * _rho_eff[_qp]; 112 : 113 1085440 : const Real sigma = _GBE * _JtoeV * (_length_scale * _length_scale); 114 1085440 : const Real length_scale4 = _length_scale * _length_scale * _length_scale * _length_scale; 115 1085440 : const Real M_GB = _GBMobility * _time_scale / (_JtoeV * length_scale4); 116 : 117 1085440 : _L[_qp] = 4.0 / 3.0 * M_GB / _int_width; 118 1085440 : _kappa[_qp] = 3.0 / 4.0 * sigma * _int_width; 119 1085440 : _gamma[_qp] = 1.5; 120 1085440 : _mu[_qp] = 6.0 * sigma / _int_width; 121 1085440 : }