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 "SLKKSSum.h" 11 : #include "MathUtils.h" 12 : 13 : registerMooseObject("PhaseFieldApp", SLKKSSum); 14 : 15 : InputParameters 16 46 : SLKKSSum::validParams() 17 : { 18 46 : auto params = Kernel::validParams(); 19 46 : params.addClassDescription( 20 : "Enforce the sum of sublattice concentrations to a given phase concentration."); 21 92 : params.addRequiredCoupledVar("cs", "other sublattice concentrations in the same phase"); 22 92 : params.addRequiredParam<Real>("a", "Sublattice site fraction for the kernel variable"); 23 92 : params.addRequiredParam<std::vector<Real>>("as", "Phase a sublattice site fractions"); 24 92 : params.addRequiredCoupledVar("sum", "prescribed sum"); 25 46 : return params; 26 0 : } 27 : 28 24 : SLKKSSum::SLKKSSum(const InputParameters & parameters) 29 : : JvarMapKernelInterface<Kernel>(parameters), 30 24 : _ncs(coupledComponents("cs")), 31 24 : _cs(_ncs), 32 48 : _a_cs(getParam<std::vector<Real>>("as")), 33 24 : _cs_map(getParameterJvarMap("cs")), 34 48 : _a_u(getParam<Real>("a")), 35 48 : _target(coupledValue("sum")) 36 : { 37 24 : if (_a_cs.size() != _ncs) 38 0 : paramError("as", "Specify one sublattice site fraction per sublattice concentration variable"); 39 : 40 : // check and re-normalize sublattice B site fractions 41 24 : Real sum = _a_u; 42 72 : for (std::size_t i = 0; i < _ncs; ++i) 43 48 : sum += _a_cs[i]; 44 24 : if (sum <= 0.0) 45 0 : paramError("as", "The sum of the 'as' values and 'a' must be greater than zero"); 46 72 : for (std::size_t i = 0; i < _ncs; ++i) 47 48 : _a_cs[i] /= sum; 48 24 : _a_u /= sum; 49 : 50 : // fetch coupled concentrations 51 72 : for (std::size_t i = 0; i < _ncs; ++i) 52 48 : _cs[i] = &coupledValue("cs", i); 53 24 : } 54 : 55 : Real 56 4988800 : SLKKSSum::computeQpResidual() 57 : { 58 4988800 : Real csum = _u[_qp] * _a_u; 59 14966400 : for (std::size_t i = 0; i < _ncs; ++i) 60 9977600 : csum += (*_cs[i])[_qp] * _a_cs[i]; 61 : 62 4988800 : return _test[_i][_qp] * (csum - _target[_qp]); 63 : } 64 : 65 : Real 66 3840000 : SLKKSSum::computeQpJacobian() 67 : { 68 3840000 : return _test[_i][_qp] * _phi[_j][_qp] * _a_u; 69 : } 70 : 71 : Real 72 7680000 : SLKKSSum::computeQpOffDiagJacobian(unsigned int jvar) 73 : { 74 7680000 : auto csvar = mapJvarToCvar(jvar, _cs_map); 75 7680000 : if (csvar >= 0) 76 7680000 : return _test[_i][_qp] * _phi[_j][_qp] * _a_cs[csvar]; 77 : 78 : return 0.0; 79 : }