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 "ADKernelValue.h" 11 : #include "Assembly.h" 12 : #include "SystemBase.h" 13 : #include "ADUtils.h" 14 : 15 : // libmesh includes 16 : #include "libmesh/threads.h" 17 : 18 : template <typename T> 19 : InputParameters 20 100942 : ADKernelValueTempl<T>::validParams() 21 : { 22 100942 : return ADKernelTempl<T>::validParams(); 23 : } 24 : 25 : template <typename T> 26 567 : ADKernelValueTempl<T>::ADKernelValueTempl(const InputParameters & parameters) 27 567 : : ADKernelTempl<T>(parameters) 28 : { 29 567 : } 30 : 31 : template <typename T> 32 : void 33 1380908 : ADKernelValueTempl<T>::computeResidual() 34 : { 35 1380908 : prepareVectorTag(_assembly, _var.number()); 36 : 37 1380908 : precalculateResidual(); 38 1380908 : const unsigned int n_test = _test.size(); 39 : 40 1380908 : if (_use_displaced_mesh) 41 0 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 42 : { 43 0 : const auto value = precomputeQpResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 44 0 : for (_i = 0; _i < n_test; _i++) // target for auto vectorization 45 0 : _local_re(_i) += raw_value(value * _test[_i][_qp]); 46 : } 47 : else 48 6821924 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 49 : { 50 5441016 : const auto value = precomputeQpResidual() * _JxW[_qp] * _coord[_qp]; 51 28383080 : for (_i = 0; _i < n_test; _i++) // target for auto vectorization 52 22942064 : _local_re(_i) += raw_value(value * _test[_i][_qp]); 53 : } 54 : 55 1380908 : accumulateTaggedLocalResidual(); 56 : 57 1380908 : if (_has_save_in) 58 : { 59 0 : Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx); 60 0 : for (unsigned int i = 0; i < _save_in.size(); i++) 61 0 : _save_in[i]->sys().solution().add_vector(_local_re, _save_in[i]->dofIndices()); 62 0 : } 63 1380908 : } 64 : 65 : template <typename T> 66 : void 67 216105 : ADKernelValueTempl<T>::computeResidualsForJacobian() 68 : { 69 216105 : if (_residuals.size() != _test.size()) 70 534 : _residuals.resize(_test.size(), 0); 71 1159573 : for (auto & r : _residuals) 72 943468 : r = 0; 73 : 74 216105 : precalculateResidual(); 75 : 76 216105 : if (_use_displaced_mesh) 77 0 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 78 : { 79 0 : const auto value = precomputeQpResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 80 0 : for (_i = 0; _i < _test.size(); _i++) 81 0 : _residuals[_i] += value * _test[_i][_qp]; 82 : } 83 : else 84 1028885 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 85 : { 86 812780 : const auto value = precomputeQpResidual() * _JxW[_qp] * _coord[_qp]; 87 4483372 : for (_i = 0; _i < _test.size(); _i++) 88 3670592 : _residuals[_i] += value * _test[_i][_qp]; 89 : } 90 216105 : } 91 : 92 : template <typename T> 93 : ADReal 94 0 : ADKernelValueTempl<T>::computeQpResidual() 95 : { 96 0 : mooseError("Override precomputeQpResidual() in your ADKernelValueTempl derived class!"); 97 : } 98 : 99 : template class ADKernelValueTempl<Real>; 100 : template class ADKernelValueTempl<RealVectorValue>;