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 33791 : ADKernelGradTempl<T>::validParams() 22 : { 23 33791 : return ADKernelTempl<T>::validParams(); 24 : } 25 : 26 : template <typename T> 27 2230 : ADKernelGradTempl<T>::ADKernelGradTempl(const InputParameters & parameters) 28 2230 : : ADKernelTempl<T>(parameters) 29 : { 30 2230 : } 31 : 32 : template <typename T> 33 : void 34 6190003 : ADKernelGradTempl<T>::computeResidual() 35 : { 36 6190003 : prepareVectorTag(_assembly, _var.number()); 37 : 38 6190003 : precalculateResidual(); 39 6190003 : const unsigned int n_test = _grad_test.size(); 40 6190003 : std::vector<Real> residuals(n_test); 41 : 42 6190003 : if (_use_displaced_mesh) 43 1659305 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 44 : { 45 1463826 : const auto value = precomputeQpResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 46 10393959 : for (_i = 0; _i < n_test; _i++) // target for auto vectorization 47 8930133 : residuals[_i] += raw_value(MathUtils::dotProduct(value, _grad_test[_i][_qp])); 48 : } 49 : else 50 28543524 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 51 : { 52 22549000 : const auto value = precomputeQpResidual() * _JxW[_qp] * _coord[_qp]; 53 135119308 : for (_i = 0; _i < n_test; _i++) // target for auto vectorization 54 112570308 : residuals[_i] += raw_value(MathUtils::dotProduct(value, _regular_grad_test[_i][_qp])); 55 : } 56 : 57 6190003 : this->addResiduals(_assembly, residuals, _var.dofIndices(), _var.scalingFactor()); 58 : 59 6190003 : 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 6190003 : } 63 : 64 : template <typename T> 65 : void 66 843917 : ADKernelGradTempl<T>::computeResidualsForJacobian() 67 : { 68 843917 : if (_residuals.size() != _grad_test.size()) 69 2045 : _residuals.resize(_grad_test.size(), 0); 70 3777218 : for (auto & r : _residuals) 71 2933301 : r = 0; 72 : 73 843917 : precalculateResidual(); 74 843917 : if (_use_displaced_mesh) 75 21711 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 76 : { 77 18155 : const auto value = precomputeQpResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 78 109302 : for (_i = 0; _i < _grad_test.size(); _i++) 79 91147 : _residuals[_i] += MathUtils::dotProduct(value, _grad_test[_i][_qp]); 80 : } 81 : else 82 3831841 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 83 : { 84 2991480 : const auto value = precomputeQpResidual() * _JxW[_qp] * _coord[_qp]; 85 14921512 : for (_i = 0; _i < _grad_test.size(); _i++) 86 11930032 : _residuals[_i] += MathUtils::dotProduct(value, _regular_grad_test[_i][_qp]); 87 : } 88 843917 : } 89 : 90 : template <typename T> 91 : void 92 18599 : ADKernelGradTempl<T>::computeResidualAndJacobian() 93 : { 94 18599 : computeResidualsForJacobian(); 95 18599 : this->addResidualsAndJacobian(_assembly, _residuals, _var.dofIndices(), _var.scalingFactor()); 96 18599 : } 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>;