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 "CoupledForce.h" 11 : #include "MooseVariableFE.h" 12 : #include "SystemBase.h" 13 : 14 : registerMooseObject("MooseApp", CoupledForce); 15 : registerMooseObject("MooseApp", ADCoupledForce); 16 : 17 : template <bool is_ad> 18 : InputParameters 19 77819 : CoupledForceTempl<is_ad>::validParams() 20 : { 21 77819 : InputParameters params = GenericKernel<is_ad>::validParams(); 22 : 23 77819 : params.addClassDescription("Implements a source term proportional to the value of a coupled " 24 : "variable. Weak form: $(\\psi_i, -\\sigma v)$."); 25 77819 : params.addRequiredCoupledVar("v", "The coupled variable which provides the force"); 26 233457 : params.addParam<Real>( 27 155638 : "coef", 1.0, "Coefficent ($\\sigma$) multiplier for the coupled force term."); 28 : 29 77819 : return params; 30 0 : } 31 : 32 : template <bool is_ad> 33 3349 : CoupledForceTempl<is_ad>::CoupledForceTempl(const InputParameters & parameters) 34 : : GenericKernel<is_ad>(parameters), 35 3345 : _v_var(coupled("v")), 36 3341 : _v(this->template coupledGenericValue<is_ad>("v")), 37 6690 : _coef(this->template getParam<Real>("coef")) 38 : { 39 3341 : if (_var.number() == _v_var) 40 8 : paramError("v", 41 : "Coupled variable 'v' needs to be different from 'variable' with CoupledForce / " 42 : "ADCoupledForce, consider using the CoefReaction kernel or something similar"); 43 3333 : } 44 : 45 : template <bool is_ad> 46 : GenericReal<is_ad> 47 634230432 : CoupledForceTempl<is_ad>::computeQpResidual() 48 : { 49 634230432 : return -_coef * _v[_qp] * _test[_i][_qp]; 50 : } 51 : 52 : template <bool is_ad> 53 : Real 54 19738336 : CoupledForceTempl<is_ad>::computeQpOffDiagJacobian(unsigned int jvar) 55 : { 56 : // This function will never be called for the AD version. But because C++ does 57 : // not support an optional function declaration based on a template parameter, 58 : // we must keep this template for all cases. 59 : mooseAssert(!is_ad, 60 : "In ADCoupledForce, computeQpJacobian should not be called. Check computeJacobian " 61 : "implementation."); 62 19738336 : if (jvar == _v_var) 63 19726816 : return -_coef * _phi[_j][_qp] * _test[_i][_qp]; 64 11520 : return 0.0; 65 : } 66 : 67 : template class CoupledForceTempl<false>; 68 : template class CoupledForceTempl<true>;