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 "SoretDiffusion.h" 11 : 12 : // MOOSE includes 13 : #include "MooseVariable.h" 14 : 15 : registerMooseObject("PhaseFieldApp", SoretDiffusion); 16 : 17 : InputParameters 18 92 : SoretDiffusion::validParams() 19 : { 20 92 : InputParameters params = Kernel::validParams(); 21 92 : params.addClassDescription("Add Soret effect to Split formulation Cahn-Hilliard Kernel"); 22 184 : params.addRequiredCoupledVar("T", "Temperature"); 23 184 : params.addCoupledVar("c", "Concentration"); 24 184 : params.addRequiredParam<MaterialPropertyName>("diff_name", 25 : "The diffusivity used with the kernel"); 26 184 : params.addParam<MaterialPropertyName>( 27 : "Q_name", "Qheat", "The material name for the heat of transport"); 28 92 : return params; 29 0 : } 30 : 31 48 : SoretDiffusion::SoretDiffusion(const InputParameters & parameters) 32 : : Kernel(parameters), 33 48 : _T_var(coupled("T")), 34 48 : _T(coupledValue("T")), 35 48 : _grad_T(coupledGradient("T")), 36 48 : _is_coupled(isCoupled("c")), 37 48 : _c_var(_is_coupled ? coupled("c") : _var.number()), 38 48 : _c(_is_coupled ? coupledValue("c") : _u), 39 96 : _D(getMaterialProperty<Real>("diff_name")), 40 96 : _Q(getMaterialProperty<Real>("Q_name")), 41 48 : _kB(8.617343e-5) // Boltzmann constant in eV/K 42 : { 43 48 : } 44 : 45 : Real 46 7032200 : SoretDiffusion::computeQpResidual() 47 : { 48 7032200 : const Real T_term = _D[_qp] * _Q[_qp] * _c[_qp] / (_kB * _T[_qp] * _T[_qp]); 49 7032200 : return T_term * _grad_T[_qp] * _grad_test[_i][_qp]; 50 : } 51 : 52 : Real 53 9727840 : SoretDiffusion::computeQpJacobian() 54 : { 55 9727840 : return (_is_coupled && _c_var != _var.number()) ? 0.0 : computeQpCJacobian(); 56 : } 57 : 58 : Real 59 2480640 : SoretDiffusion::computeQpOffDiagJacobian(unsigned int jvar) 60 : { 61 : // c Off-Diagonal Jacobian 62 2480640 : if (_c_var == jvar) 63 830880 : return computeQpCJacobian(); 64 : 65 : // T Off-Diagonal Jacobian 66 1649760 : if (_T_var == jvar) 67 1649760 : return _D[_qp] * _Q[_qp] * _c[_qp] * _grad_test[_i][_qp] * 68 1649760 : (_grad_phi[_j][_qp] - 2.0 * _grad_T[_qp] * _phi[_j][_qp] / _T[_qp]) / 69 1649760 : (_kB * _T[_qp] * _T[_qp]); 70 : 71 : return 0.0; 72 : } 73 : 74 : Real 75 9727840 : SoretDiffusion::computeQpCJacobian() 76 : { 77 : // Calculate the Jacobian for the c variable 78 9727840 : return _D[_qp] * _Q[_qp] * _phi[_j][_qp] * _grad_T[_qp] / (_kB * _T[_qp] * _T[_qp]) * 79 9727840 : _grad_test[_i][_qp]; 80 : }