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 32535 : ADKernelGradTempl<T>::validParams() 22 : { 23 32535 : return ADKernelTempl<T>::validParams(); 24 : } 25 : 26 : template <typename T> 27 2070 : ADKernelGradTempl<T>::ADKernelGradTempl(const InputParameters & parameters) 28 2070 : : ADKernelTempl<T>(parameters) 29 : { 30 2070 : } 31 : 32 : template <typename T> 33 : void 34 5689836 : ADKernelGradTempl<T>::computeResidual() 35 : { 36 5689836 : prepareVectorTag(_assembly, _var.number()); 37 : 38 5689836 : precalculateResidual(); 39 5689836 : const unsigned int n_test = _grad_test.size(); 40 5689836 : std::vector<Real> residuals(n_test); 41 : 42 5689836 : if (_use_displaced_mesh) 43 1652931 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 44 : { 45 1458746 : const auto value = precomputeQpResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 46 10368751 : for (_i = 0; _i < n_test; _i++) // target for auto vectorization 47 8910005 : residuals[_i] += raw_value(MathUtils::dotProduct(value, _grad_test[_i][_qp])); 48 : } 49 : else 50 26130571 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 51 : { 52 20634920 : const auto value = precomputeQpResidual() * _JxW[_qp] * _coord[_qp]; 53 125845684 : for (_i = 0; _i < n_test; _i++) // target for auto vectorization 54 105210764 : residuals[_i] += raw_value(MathUtils::dotProduct(value, _regular_grad_test[_i][_qp])); 55 : } 56 : 57 5689836 : this->addResiduals(_assembly, residuals, _var.dofIndices(), _var.scalingFactor()); 58 : 59 5689836 : 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 5689836 : } 63 : 64 : template <typename T> 65 : void 66 717840 : ADKernelGradTempl<T>::computeResidualsForJacobian() 67 : { 68 717840 : if (_residuals.size() != _grad_test.size()) 69 1881 : _residuals.resize(_grad_test.size(), 0); 70 3193653 : for (auto & r : _residuals) 71 2475813 : r = 0; 72 : 73 717840 : precalculateResidual(); 74 717840 : if (_use_displaced_mesh) 75 20779 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 76 : { 77 17415 : const auto value = precomputeQpResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 78 105658 : for (_i = 0; _i < _grad_test.size(); _i++) 79 88243 : _residuals[_i] += MathUtils::dotProduct(value, _grad_test[_i][_qp]); 80 : } 81 : else 82 3237704 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 83 : { 84 2523228 : const auto value = precomputeQpResidual() * _JxW[_qp] * _coord[_qp]; 85 12598764 : for (_i = 0; _i < _grad_test.size(); _i++) 86 10075536 : _residuals[_i] += MathUtils::dotProduct(value, _regular_grad_test[_i][_qp]); 87 : } 88 717840 : } 89 : 90 : template <typename T> 91 : void 92 17131 : ADKernelGradTempl<T>::computeResidualAndJacobian() 93 : { 94 17131 : computeResidualsForJacobian(); 95 17131 : this->addResidualsAndJacobian(_assembly, _residuals, _var.dofIndices(), _var.scalingFactor()); 96 17131 : } 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>;