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 "VectorKernel.h" 11 : #include "Assembly.h" 12 : #include "MooseVariableFE.h" 13 : #include "MooseVariableScalar.h" 14 : #include "SubProblem.h" 15 : #include "NonlinearSystem.h" 16 : 17 : #include "libmesh/threads.h" 18 : #include "libmesh/quadrature.h" 19 : 20 : InputParameters 21 173421 : VectorKernel::validParams() 22 : { 23 173421 : InputParameters params = KernelBase::validParams(); 24 173421 : params.registerBase("VectorKernel"); 25 173421 : return params; 26 0 : } 27 : 28 1167 : VectorKernel::VectorKernel(const InputParameters & parameters) 29 : : KernelBase(parameters), 30 : MooseVariableInterface<RealVectorValue>(this, 31 : false, 32 : "variable", 33 : Moose::VarKindType::VAR_SOLVER, 34 : Moose::VarFieldType::VAR_FIELD_VECTOR), 35 2326 : _var(*mooseVariable()), 36 1163 : _test(_var.phi()), 37 1163 : _grad_test(_var.gradPhi()), 38 1163 : _phi(_assembly.phi(_var)), 39 1163 : _grad_phi(_assembly.gradPhi(_var)), 40 1163 : _u(_is_implicit ? _var.sln() : _var.slnOld()), 41 2330 : _grad_u(_is_implicit ? _var.gradSln() : _var.gradSlnOld()) 42 : { 43 1163 : addMooseVariableDependency(mooseVariable()); 44 1163 : } 45 : 46 : void 47 1719003 : VectorKernel::computeResidual() 48 : { 49 1719003 : prepareVectorTag(_assembly, _var.number()); 50 1719003 : precalculateResidual(); 51 20638833 : for (_i = 0; _i < _test.size(); _i++) 52 139178760 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 53 : { 54 120258930 : Real residual = _JxW[_qp] * _coord[_qp] * computeQpResidual(); 55 120258930 : _local_re(_i) += residual; 56 : } 57 1719003 : accumulateTaggedLocalResidual(); 58 : 59 1719003 : if (_has_save_in) 60 0 : for (const auto & var : _save_in) 61 0 : var->sys().solution().add_vector(_local_re, var->dofIndices()); 62 1719003 : } 63 : 64 : void 65 530117 : VectorKernel::computeJacobian() 66 : { 67 530117 : prepareMatrixTag(_assembly, _var.number(), _var.number()); 68 530117 : precalculateJacobian(); 69 4385615 : for (_i = 0; _i < _test.size(); _i++) 70 40695764 : for (_j = 0; _j < _phi.size(); _j++) 71 248640184 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 72 211799918 : _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpJacobian(); 73 530117 : accumulateTaggedLocalMatrix(); 74 : 75 530117 : if (_has_diag_save_in && !_sys.computingScalingJacobian()) 76 : { 77 0 : unsigned int rows = _local_ke.m(); 78 0 : DenseVector<Number> diag(rows); 79 0 : for (unsigned int i = 0; i < rows; i++) 80 0 : diag(i) = _local_ke(i, i); 81 : 82 0 : for (const auto & var : _diag_save_in) 83 0 : var->sys().solution().add_vector(diag, var->dofIndices()); 84 0 : } 85 530117 : } 86 : 87 : void 88 967172 : VectorKernel::computeOffDiagJacobian(const unsigned int jvar_num) 89 : { 90 967172 : if (jvar_num == _var.number()) 91 493805 : computeJacobian(); 92 : else 93 : { 94 473367 : const auto & jvar = getVariable(jvar_num); 95 : 96 473367 : prepareMatrixTag(_assembly, _var.number(), jvar_num); 97 : 98 : // This (undisplaced) jvar could potentially yield the wrong phi size if this object is acting 99 : // on the displaced mesh 100 473367 : const auto phi_size = jvar.dofIndices().size(); 101 : 102 473367 : precalculateOffDiagJacobian(jvar_num); 103 3508643 : for (_i = 0; _i < _test.size(); _i++) 104 16362588 : for (_j = 0; _j < phi_size; _j++) 105 67461200 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 106 54133888 : _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobian(jvar_num); 107 : 108 473367 : accumulateTaggedLocalMatrix(); 109 : } 110 967172 : } 111 : 112 : void 113 0 : VectorKernel::computeOffDiagJacobianScalar(unsigned int jvar) 114 : { 115 0 : prepareMatrixTag(_assembly, _var.number(), jvar); 116 0 : MooseVariableScalar & jv = _sys.getScalarVariable(_tid, jvar); 117 : 118 0 : for (_i = 0; _i < _test.size(); _i++) 119 0 : for (_j = 0; _j < jv.order(); _j++) 120 0 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 121 0 : _local_ke(_i, _j) += _JxW[_qp] * _coord[_qp] * computeQpOffDiagJacobianScalar(jvar); 122 0 : accumulateTaggedLocalMatrix(); 123 0 : }