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 "ADKernelGrad.h" 11 : #include "MathUtils.h" 12 : #include "Assembly.h" 13 : #include "SystemBase.h" 14 : #include "ADUtils.h" 15 : 16 : // libmesh includes 17 : #include "libmesh/threads.h" 18 : 19 : template <typename T> 20 : InputParameters 21 10044 : ADKernelGradTempl<T>::validParams() 22 : { 23 10044 : return ADKernelTempl<T>::validParams(); 24 : } 25 : 26 : template <typename T> 27 2044 : ADKernelGradTempl<T>::ADKernelGradTempl(const InputParameters & parameters) 28 2044 : : ADKernelTempl<T>(parameters) 29 : { 30 2044 : } 31 : 32 : template <typename T> 33 : void 34 5460334 : ADKernelGradTempl<T>::computeResidual() 35 : { 36 5460334 : prepareVectorTag(_assembly, _var.number()); 37 : 38 5460334 : precalculateResidual(); 39 5460334 : const unsigned int n_test = _grad_test.size(); 40 5460334 : std::vector<Real> residuals(n_test); 41 : 42 5460334 : if (_use_displaced_mesh) 43 1420848 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 44 : { 45 1253145 : const auto value = precomputeQpResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 46 8891628 : for (_i = 0; _i < n_test; _i++) // target for auto vectorization 47 7638483 : residuals[_i] += raw_value(MathUtils::dotProduct(value, _grad_test[_i][_qp])); 48 : } 49 : else 50 25102149 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 51 : { 52 19809518 : const auto value = precomputeQpResidual() * _JxW[_qp] * _coord[_qp]; 53 118074658 : for (_i = 0; _i < n_test; _i++) // target for auto vectorization 54 98265140 : residuals[_i] += raw_value(MathUtils::dotProduct(value, _regular_grad_test[_i][_qp])); 55 : } 56 : 57 5460334 : this->addResiduals(_assembly, residuals, _var.dofIndices(), _var.scalingFactor()); 58 : 59 5460334 : if (_has_save_in) 60 0 : for (unsigned int i = 0; i < _save_in.size(); i++) 61 0 : _save_in[i]->sys().solution().add_vector(residuals.data(), _save_in[i]->dofIndices()); 62 5460334 : } 63 : 64 : template <typename T> 65 : void 66 753031 : ADKernelGradTempl<T>::computeResidualsForJacobian() 67 : { 68 753031 : if (_residuals.size() != _grad_test.size()) 69 1866 : _residuals.resize(_grad_test.size(), 0); 70 3365416 : for (auto & r : _residuals) 71 2612385 : r = 0; 72 : 73 753031 : precalculateResidual(); 74 753031 : if (_use_displaced_mesh) 75 18841 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 76 : { 77 15743 : const auto value = precomputeQpResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 78 94528 : for (_i = 0; _i < _grad_test.size(); _i++) 79 78785 : _residuals[_i] += MathUtils::dotProduct(value, _grad_test[_i][_qp]); 80 : } 81 : else 82 3414435 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 83 : { 84 2664502 : const auto value = precomputeQpResidual() * _JxW[_qp] * _coord[_qp]; 85 13273970 : for (_i = 0; _i < _grad_test.size(); _i++) 86 10609468 : _residuals[_i] += MathUtils::dotProduct(value, _regular_grad_test[_i][_qp]); 87 : } 88 753031 : } 89 : 90 : template <typename T> 91 : void 92 16360 : ADKernelGradTempl<T>::computeResidualAndJacobian() 93 : { 94 16360 : computeResidualsForJacobian(); 95 16360 : this->addResidualsAndJacobian(_assembly, _residuals, _var.dofIndices(), _var.scalingFactor()); 96 16360 : } 97 : 98 : template <typename T> 99 : ADReal 100 0 : ADKernelGradTempl<T>::computeQpResidual() 101 : { 102 0 : mooseError("Override precomputeQpResidual() in your ADKernelGrad derived class!"); 103 : } 104 : 105 : template class ADKernelGradTempl<Real>; 106 : template class ADKernelGradTempl<RealVectorValue>;