LCOV - code coverage report
Current view: top level - src/kernels - SLKKSSum.C (source / functions) Hit Total Coverage
Test: idaholab/moose phase_field: #31405 (292dce) with base fef103 Lines: 37 40 92.5 %
Date: 2025-09-04 07:55:36 Functions: 5 5 100.0 %
Legend: Lines: hit not hit

          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             : }

Generated by: LCOV version 1.14