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 "KKSXeVacSolidMaterial.h" 11 : 12 : registerMooseObject("PhaseFieldApp", KKSXeVacSolidMaterial); 13 : 14 : InputParameters 15 47 : KKSXeVacSolidMaterial::validParams() 16 : { 17 47 : InputParameters params = DerivativeFunctionMaterialBase::validParams(); 18 47 : params.addClassDescription("KKS Solid phase free energy for Xe,Vac in UO2. Fm(cmg,cmv)"); 19 94 : params.addRequiredParam<Real>("T", "Temperature in [K]"); 20 94 : params.addRequiredCoupledVar("cmg", "Gas concentration"); 21 94 : params.addRequiredCoupledVar("cmv", "Vacancy concentration"); 22 47 : return params; 23 0 : } 24 : 25 36 : KKSXeVacSolidMaterial::KKSXeVacSolidMaterial(const InputParameters & parameters) 26 : : DerivativeFunctionMaterialBase(parameters), 27 36 : _T(getParam<Real>("T")), 28 36 : _Omega(2.53), 29 36 : _kB(8.6173324e-5), 30 36 : _Efv(3.0), 31 36 : _Efg(3.0), 32 36 : _cmg(coupledValue("cmg")), 33 36 : _cmg_var(coupled("cmg")), 34 36 : _cmv(coupledValue("cmv")), 35 72 : _cmv_var(coupled("cmv")) 36 : { 37 36 : } 38 : 39 : // Catch fixable singularity at 0 40 : Real 41 90000 : KKSXeVacSolidMaterial::cLogC(Real c) 42 : { 43 90000 : return c <= 0.0 ? 0.0 : c * std::log(c); 44 : } 45 : 46 : // / Fm(cmg,cmv) takes three arguments 47 : unsigned int 48 0 : KKSXeVacSolidMaterial::expectedNumArgs() 49 : { 50 0 : return 2; 51 : } 52 : 53 : // Free energy value 54 : Real 55 22500 : KKSXeVacSolidMaterial::computeF() 56 : { 57 22500 : return 1.0 / _Omega * 58 22500 : (_kB * _T * (cLogC(_cmv[_qp]) + cLogC(1.0 - _cmv[_qp])) + _Efv * _cmv[_qp] + 59 22500 : _kB * _T * (cLogC(_cmg[_qp]) + cLogC(1.0 - _cmg[_qp])) + _Efg * _cmg[_qp]); 60 : } 61 : 62 : // Derivative of the Free energy 63 : Real 64 45000 : KKSXeVacSolidMaterial::computeDF(unsigned int i_var) 65 : { 66 : const Real tol = 1e-10; 67 45000 : Real cmg = _cmg[_qp] < tol ? tol : (_cmg[_qp] > (1.0 - tol) ? (1.0 - tol) : _cmg[_qp]); 68 45000 : Real cmv = _cmv[_qp] < tol ? tol : (_cmv[_qp] > (1.0 - tol) ? (1.0 - tol) : _cmv[_qp]); 69 : 70 45000 : if (i_var == _cmg_var) 71 22500 : return 1.0 / _Omega * (_Efg + _kB * _T * (std::log(cmg) - std::log(-cmg + 1.0))); 72 : 73 22500 : if (i_var == _cmv_var) 74 22500 : return 1.0 / _Omega * (_Efv + _kB * _T * (std::log(cmv) - std::log(-cmv + 1.0))); 75 : 76 0 : mooseError("Unknown derivative requested"); 77 : } 78 : 79 : // Derivative of the Free energy 80 : Real 81 67500 : KKSXeVacSolidMaterial::computeD2F(unsigned int i_var, unsigned int j_var) 82 : { 83 67500 : if (i_var != j_var) 84 : return 0.0; 85 : 86 : const Real tol = 1e-10; 87 45000 : Real cmg = _cmg[_qp] < tol ? tol : (_cmg[_qp] > (1.0 - tol) ? (1.0 - tol) : _cmg[_qp]); 88 45000 : Real cmv = _cmv[_qp] < tol ? tol : (_cmv[_qp] > (1.0 - tol) ? (1.0 - tol) : _cmv[_qp]); 89 : 90 45000 : if (i_var == _cmg_var) 91 22500 : return 1.0 / _Omega * _kB * _T * (1.0 / (1.0 - cmg) + 1.0 / cmg); 92 : 93 22500 : if (i_var == _cmv_var) 94 22500 : return 1.0 / _Omega * _kB * _T * (1.0 / (1.0 - cmv) + 1.0 / cmv); 95 : 96 0 : mooseError("Unknown derivative requested"); 97 : } 98 : 99 : // note that the second cross derivatives are actually 0.0! 100 : 101 : // Third derivative: 1.0/Omega * kB*T*((-c^m_v + 1.0)**(-2) - 1/c^m_v**2)