LCOV - code coverage report
Current view: top level - src/bcs - ADIntegratedBC.C (source / functions) Hit Total Coverage
Test: idaholab/moose framework: 2bf808 Lines: 65 89 73.0 %
Date: 2025-07-17 01:28:37 Functions: 13 18 72.2 %
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 "ADIntegratedBC.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 "ADUtils.h"
      19             : 
      20             : #include "libmesh/quadrature.h"
      21             : 
      22             : template <typename T>
      23             : InputParameters
      24      245990 : ADIntegratedBCTempl<T>::validParams()
      25             : {
      26      245990 :   InputParameters params = IntegratedBCBase::validParams();
      27      245990 :   params += ADFunctorInterface::validParams();
      28      245990 :   return params;
      29           0 : }
      30             : 
      31             : template <typename T>
      32        1735 : ADIntegratedBCTempl<T>::ADIntegratedBCTempl(const InputParameters & parameters)
      33             :   : IntegratedBCBase(parameters),
      34             :     MooseVariableInterface<T>(this,
      35             :                               false,
      36             :                               "variable",
      37             :                               Moose::VarKindType::VAR_SOLVER,
      38             :                               std::is_same<T, Real>::value ? Moose::VarFieldType::VAR_FIELD_STANDARD
      39             :                                                            : Moose::VarFieldType::VAR_FIELD_VECTOR),
      40             :     ADFunctorInterface(this),
      41        3470 :     _var(*this->mooseVariable()),
      42        1735 :     _normals(_assembly.adNormals()),
      43        1735 :     _ad_q_points(_assembly.adQPointsFace()),
      44        1735 :     _test(_var.phiFace()),
      45        1735 :     _grad_test(_var.adGradPhiFace()),
      46        1735 :     _u(_var.adSln()),
      47        1735 :     _grad_u(_var.adGradSln()),
      48        1735 :     _ad_JxW(_assembly.adJxWFace()),
      49        1735 :     _ad_coord(_assembly.adCoordTransformation()),
      50        1735 :     _phi(_assembly.phi(_var)),
      51        3470 :     _use_displaced_mesh(getParam<bool>("use_displaced_mesh"))
      52             : {
      53        1735 :   _subproblem.haveADObjects(true);
      54             : 
      55        1735 :   addMooseVariableDependency(this->mooseVariable());
      56             : 
      57        1735 :   _save_in.resize(_save_in_strings.size());
      58        1735 :   _diag_save_in.resize(_diag_save_in_strings.size());
      59             : 
      60        1735 :   for (unsigned int i = 0; i < _save_in_strings.size(); i++)
      61             :   {
      62           0 :     MooseVariable * var = &_subproblem.getStandardVariable(_tid, _save_in_strings[i]);
      63             : 
      64           0 :     if (var->feType() != _var.feType())
      65           0 :       paramError(
      66             :           "save_in",
      67             :           "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
      68           0 :           moose::internal::incompatVarMsg(*var, _var));
      69           0 :     _save_in[i] = var;
      70           0 :     var->sys().addVariableToZeroOnResidual(_save_in_strings[i]);
      71           0 :     addMooseVariableDependency(var);
      72             :   }
      73             : 
      74        1735 :   _has_save_in = _save_in.size() > 0;
      75             : 
      76        1735 :   for (unsigned int i = 0; i < _diag_save_in_strings.size(); i++)
      77             :   {
      78           0 :     MooseVariable * var = &_subproblem.getStandardVariable(_tid, _diag_save_in_strings[i]);
      79             : 
      80           0 :     if (var->feType() != _var.feType())
      81           0 :       paramError(
      82             :           "diag_save_in",
      83             :           "saved-in auxiliary variable is incompatible with the object's nonlinear variable: ",
      84           0 :           moose::internal::incompatVarMsg(*var, _var));
      85             : 
      86           0 :     _diag_save_in[i] = var;
      87           0 :     var->sys().addVariableToZeroOnJacobian(_diag_save_in_strings[i]);
      88           0 :     addMooseVariableDependency(var);
      89             :   }
      90             : 
      91        1735 :   _has_diag_save_in = _diag_save_in.size() > 0;
      92        1735 : }
      93             : 
      94             : template <typename T>
      95             : void
      96      340856 : ADIntegratedBCTempl<T>::computeResidual()
      97             : {
      98      340856 :   _residuals.resize(_test.size(), 0);
      99     3080014 :   for (auto & r : _residuals)
     100     2739158 :     r = 0;
     101             : 
     102     1282064 :   for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     103             :   {
     104      941208 :     const auto jxw_c = _JxW[_qp] * _coord[_qp];
     105     8771846 :     for (_i = 0; _i < _test.size(); _i++)
     106     7830638 :       _residuals[_i] += jxw_c * raw_value(computeQpResidual());
     107             :   }
     108             : 
     109      340856 :   addResiduals(_assembly, _residuals, _var.dofIndices(), _var.scalingFactor());
     110             : 
     111      340856 :   if (_has_save_in)
     112           0 :     for (unsigned int i = 0; i < _save_in.size(); i++)
     113           0 :       _save_in[i]->sys().solution().add_vector(_residuals.data(), _save_in[i]->dofIndices());
     114      340856 : }
     115             : 
     116             : template <typename T>
     117             : void
     118       25944 : ADIntegratedBCTempl<T>::computeResidualsForJacobian()
     119             : {
     120       25944 :   if (_residuals_and_jacobians.size() != _test.size())
     121         739 :     _residuals_and_jacobians.resize(_test.size(), 0);
     122      159506 :   for (auto & r : _residuals_and_jacobians)
     123      133562 :     r = 0;
     124             : 
     125       25944 :   if (_use_displaced_mesh)
     126         112 :     for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     127             :     {
     128          56 :       _r = _ad_JxW[_qp];
     129          56 :       _r *= _ad_coord[_qp];
     130         168 :       for (_i = 0; _i < _test.size(); _i++)
     131         112 :         _residuals_and_jacobians[_i] += _r * computeQpResidual();
     132             :     }
     133             :   else
     134       84675 :     for (_qp = 0; _qp < _qrule->n_points(); _qp++)
     135             :     {
     136       58787 :       const auto jxw_c = _JxW[_qp] * _coord[_qp];
     137      387289 :       for (_i = 0; _i < _test.size(); _i++)
     138      328502 :         _residuals_and_jacobians[_i] += jxw_c * computeQpResidual();
     139             :     }
     140       25944 : }
     141             : 
     142             : template <typename T>
     143             : void
     144        2528 : ADIntegratedBCTempl<T>::computeResidualAndJacobian()
     145             : {
     146        2528 :   computeResidualsForJacobian();
     147        7584 :   addResidualsAndJacobian(
     148        2528 :       _assembly, _residuals_and_jacobians, _var.dofIndices(), _var.scalingFactor());
     149        2528 : }
     150             : 
     151             : template <typename T>
     152             : void
     153           0 : ADIntegratedBCTempl<T>::computeJacobian()
     154             : {
     155           0 :   computeADJacobian();
     156             : 
     157           0 :   if (_has_diag_save_in && !_sys.computingScalingJacobian())
     158           0 :     mooseError("_local_ke not computed for global AD indexing. Save-in is deprecated anyway. Use "
     159             :                "the tagging system instead.");
     160           0 : }
     161             : 
     162             : template <typename T>
     163             : void
     164       23416 : ADIntegratedBCTempl<T>::computeADJacobian()
     165             : {
     166       23416 :   computeResidualsForJacobian();
     167       23416 :   addJacobian(_assembly, _residuals_and_jacobians, _var.dofIndices(), _var.scalingFactor());
     168       23416 : }
     169             : 
     170             : template <typename T>
     171             : void
     172       25358 : ADIntegratedBCTempl<T>::computeOffDiagJacobian(const unsigned int jvar)
     173             : {
     174             :   // Only need to do this once because AD does all the derivatives at once
     175       25358 :   if (jvar == _var.number())
     176       23416 :     computeADJacobian();
     177       25358 : }
     178             : 
     179             : template <typename T>
     180             : void
     181           0 : ADIntegratedBCTempl<T>::computeOffDiagJacobianScalar(unsigned int /*jvar*/)
     182             : {
     183           0 : }
     184             : 
     185             : template class ADIntegratedBCTempl<Real>;
     186             : template class ADIntegratedBCTempl<RealVectorValue>;

Generated by: LCOV version 1.14