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