LCOV - code coverage report
Current view: top level - src/bcs - IntegratedBC.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: #32971 (54bef8) with base c6cf66 Lines: 95 99 96.0 %
Date: 2026-05-29 20:35:17 Functions: 7 7 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 "IntegratedBC.h"
      11             : 
      12             : // MOOSE includes
      13             : #include "Assembly.h"
      14             : #include "SubProblem.h"
      15             : #include "SystemBase.h"
      16             : #include "MooseVariableFE.h"
      17             : #include "MooseVariableScalar.h"
      18             : #include "FEProblemBase.h"
      19             : 
      20             : #include "libmesh/quadrature.h"
      21             : 
      22             : InputParameters
      23      129069 : IntegratedBC::validParams()
      24             : {
      25      129069 :   InputParameters params = IntegratedBCBase::validParams();
      26      129069 :   return params;
      27             : }
      28             : 
      29        6646 : IntegratedBC::IntegratedBC(const InputParameters & parameters)
      30             :   : IntegratedBCBase(parameters),
      31             :     MooseVariableInterface<Real>(this,
      32             :                                  false,
      33             :                                  "variable",
      34             :                                  Moose::VarKindType::VAR_SOLVER,
      35             :                                  Moose::VarFieldType::VAR_FIELD_STANDARD),
      36       13282 :     _var(*mooseVariable()),
      37        6641 :     _normals(_assembly.normals()),
      38        6641 :     _phi(_assembly.phiFace(_var)),
      39        6641 :     _grad_phi(_assembly.gradPhiFace(_var)),
      40        6641 :     _test(_var.phiFace()),
      41        6641 :     _grad_test(_var.gradPhiFace()),
      42        6641 :     _u(_is_implicit ? _var.sln() : _var.slnOld()),
      43       26569 :     _grad_u(_is_implicit ? _var.gradSln() : _var.gradSlnOld())
      44             : {
      45        6641 :   addMooseVariableDependency(mooseVariable());
      46             : 
      47        6641 :   _save_in.resize(_save_in_strings.size());
      48        6641 :   _diag_save_in.resize(_diag_save_in_strings.size());
      49             : 
      50        6735 :   for (unsigned int i = 0; i < _save_in_strings.size(); i++)
      51             :   {
      52          94 :     MooseVariable * var = &_subproblem.getStandardVariable(_tid, _save_in_strings[i]);
      53             : 
      54          94 :     if (var->feType() != _var.feType())
      55           0 :       paramError(
      56             :           "save_in",
      57             :           "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
      58           0 :           moose::internal::incompatVarMsg(*var, _var));
      59          94 :     _save_in[i] = var;
      60          94 :     var->sys().addVariableToZeroOnResidual(_save_in_strings[i]);
      61          94 :     addMooseVariableDependency(var);
      62             :   }
      63             : 
      64        6641 :   _has_save_in = _save_in.size() > 0;
      65             : 
      66        6688 :   for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
      67             :   {
      68          47 :     MooseVariable * var = &_subproblem.getStandardVariable(_tid, _diag_save_in_strings[i]);
      69             : 
      70          47 :     if (var->feType() != _var.feType())
      71           0 :       paramError(
      72             :           "diag_save_in",
      73             :           "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
      74           0 :           moose::internal::incompatVarMsg(*var, _var));
      75             : 
      76          47 :     _diag_save_in[i] = var;
      77          47 :     var->sys().addVariableToZeroOnJacobian(_diag_save_in_strings[i]);
      78          47 :     addMooseVariableDependency(var);
      79             :   }
      80             : 
      81        6641 :   _has_diag_save_in = _diag_save_in.size() > 0;
      82        6641 : }
      83             : 
      84             : void
      85     1881848 : IntegratedBC::computeResidual()
      86             : {
      87     1881848 :   prepareVectorTag(_assembly, _var.number());
      88             : 
      89     1881848 :   precalculateResidual();
      90             : 
      91     6999485 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
      92             :   {
      93     5117637 :     precalculateQpResidual();
      94    46722729 :     for (_i = 0; _i < _test.size(); _i++)
      95    41605092 :       _local_re(_i) += _JxW[_qp] * _coord[_qp] * computeQpResidual();
      96             :   }
      97             : 
      98     1881848 :   accumulateTaggedLocalResidual();
      99             : 
     100     1881848 :   if (_has_save_in)
     101        2668 :     for (unsigned int i = 0; i < _save_in.size(); i++)
     102        1414 :       _save_in[i]->sys().solution().add_vector(_local_re, _save_in[i]->dofIndices());
     103     1881848 : }
     104             : 
     105             : void
     106      221560 : IntegratedBC::computeJacobian()
     107             : {
     108      221560 :   prepareMatrixTag(_assembly, _var.number(), _var.number());
     109             : 
     110      221560 :   precalculateJacobian();
     111             : 
     112      895139 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     113             :   {
     114      673579 :     precalculateQpJacobian();
     115     6220558 :     for (_i = 0; _i < _test.size(); _i++)
     116    81520066 :       for (_j = 0; _j < _phi.size(); _j++)
     117    75973087 :         _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian();
     118             :   }
     119             : 
     120      221560 :   accumulateTaggedLocalMatrix();
     121             : 
     122      221560 :   if (_has_diag_save_in)
     123             :   {
     124         158 :     unsigned int rows = _local_ke.m();
     125         158 :     DenseVector<Number> diag(rows);
     126         790 :     for (unsigned int i = 0; i < rows; i++)
     127         632 :       diag(i) = _local_ke(i, i);
     128             : 
     129         316 :     for (unsigned int i = 0; i < _diag_save_in.size(); i++)
     130         158 :       _diag_save_in[i]->sys().solution().add_vector(diag, _diag_save_in[i]->dofIndices());
     131         158 :   }
     132      221560 : }
     133             : 
     134             : void
     135      122616 : IntegratedBC::computeOffDiagJacobian(const unsigned int jvar_num)
     136             : {
     137      122616 :   const auto & jvar = getVariable(jvar_num);
     138             : 
     139      122616 :   if (jvar_num == _var.number())
     140             :   {
     141      109082 :     computeJacobian();
     142      109082 :     return;
     143             :   }
     144             : 
     145       13534 :   prepareMatrixTag(_assembly, _var.number(), jvar_num);
     146             : 
     147       13534 :   precalculateOffDiagJacobian(jvar_num);
     148             : 
     149       13534 :   const auto n_dofs = jvar.dofIndices().size();
     150       13534 :   const auto phi_size = n_dofs / jvar.count();
     151             :   mooseAssert(n_dofs == _local_ke.n(),
     152             :               "The size of the phi container does not match the number of local Jacobian columns");
     153             : 
     154       52172 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     155             :   {
     156       38638 :     precalculateQpOffDiagJacobian(jvar);
     157      396694 :     for (_i = 0; _i < _test.size(); _i++)
     158     1185112 :       for (_j = 0; _j < phi_size; _j++)
     159      827056 :         _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar_num);
     160             :   }
     161             : 
     162       13534 :   accumulateTaggedLocalMatrix();
     163             : }
     164             : 
     165             : void
     166          46 : IntegratedBC::computeOffDiagJacobianScalar(const unsigned int jvar)
     167             : {
     168          46 :   prepareMatrixTag(_assembly, _var.number(), jvar);
     169             : 
     170          46 :   MooseVariableScalar & jv = _sys.getScalarVariable(_tid, jvar);
     171         128 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     172         390 :     for (_i = 0; _i < _test.size(); _i++)
     173         616 :       for (_j = 0; _j < jv.order(); _j++)
     174         308 :         _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobianScalar(jvar);
     175             : 
     176          46 :   accumulateTaggedLocalMatrix();
     177          46 : }
     178             : 
     179             : void
     180         184 : IntegratedBC::computeResidualAndJacobian()
     181             : {
     182         184 :   computeResidual();
     183             : 
     184         824 :   for (const auto & [ivariable, jvariable] : _fe_problem.couplingEntries(_tid, _sys.number()))
     185             :   {
     186         640 :     const unsigned int ivar = ivariable->number();
     187         640 :     const unsigned int jvar = jvariable->number();
     188             : 
     189         640 :     if (ivar != _var.number())
     190         304 :       continue;
     191             : 
     192         336 :     if (_is_implicit)
     193             :     {
     194         336 :       prepareShapes(jvar);
     195         336 :       computeOffDiagJacobian(jvar);
     196             :     }
     197             :   }
     198             : 
     199             :   /// TODO: add nonlocal Jacobians and scalar Jacobians
     200         184 : }

Generated by: LCOV version 1.14