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 "ArrayNodalKernel.h" 11 : #include "SubProblem.h" 12 : #include "SystemBase.h" 13 : #include "MooseVariableFE.h" 14 : #include "Assembly.h" 15 : 16 : InputParameters 17 6254 : ArrayNodalKernel::validParams() 18 : { 19 6254 : return NodalKernelBase::validParams(); 20 : } 21 : 22 69 : ArrayNodalKernel::ArrayNodalKernel(const InputParameters & parameters) 23 : : NodalKernelBase(parameters), 24 : MooseVariableInterface<RealEigenVector>(this, 25 : true, 26 : "variable", 27 : Moose::VarKindType::VAR_SOLVER, 28 : Moose::VarFieldType::VAR_FIELD_ARRAY), 29 138 : _var(*mooseVariable()), 30 69 : _u(_var.dofValues()), 31 69 : _count(_var.count()), 32 69 : _work_vector(_count), 33 276 : _scaling(_var.arrayScalingFactor()) 34 : { 35 69 : addMooseVariableDependency(mooseVariable()); 36 69 : } 37 : 38 : void 39 1908 : ArrayNodalKernel::computeResidual() 40 : { 41 1908 : if (!_var.isNodalDefined()) 42 0 : return; 43 1908 : _qp = 0; 44 1908 : computeQpResidual(_work_vector); 45 1908 : addResiduals(_assembly, _work_vector, _var.dofIndices(), _scaling); 46 : } 47 : 48 : void 49 261 : ArrayNodalKernel::computeJacobian() 50 : { 51 261 : if (!_var.isNodalDefined()) 52 0 : return; 53 261 : _qp = 0; 54 : 55 261 : _ivar_indices = &_var.dofIndices(); 56 261 : _jvar_indices = &_var.dofIndices(); 57 : mooseAssert(_ivar_indices->size() == _count, "The number of dofs should be equal to count"); 58 : 59 261 : computeQpJacobian(); 60 : } 61 : 62 : void 63 261 : ArrayNodalKernel::computeOffDiagJacobian(const unsigned int jvar_num) 64 : { 65 261 : if (!_var.isNodalDefined()) 66 0 : return; 67 : 68 261 : if (jvar_num == _var.number()) 69 261 : computeJacobian(); 70 : else 71 : { 72 0 : const auto & jvar = getVariable(jvar_num); 73 0 : _ivar_indices = &_var.dofIndices(); 74 0 : _jvar_indices = &jvar.dofIndices(); 75 : mooseAssert(_ivar_indices->size() == _count, "The number of dofs should be equal to count"); 76 : mooseAssert(_jvar_indices->size() == jvar.count(), 77 : "The number of dofs should be equal to count"); 78 : 79 0 : computeQpOffDiagJacobian(jvar_num); 80 : } 81 : } 82 : 83 : void 84 522 : ArrayNodalKernel::setJacobian(unsigned int i, unsigned int j, Real value) 85 : { 86 522 : addJacobianElement(_assembly, value, (*_ivar_indices)[i], (*_jvar_indices)[j], _scaling[i]); 87 522 : }