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 "ADKernelStabilized.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 0 : ADKernelStabilizedTempl<T>::validParams() 22 : { 23 0 : return ADKernelTempl<T>::validParams(); 24 : } 25 : 26 : template <typename T> 27 0 : ADKernelStabilizedTempl<T>::ADKernelStabilizedTempl(const InputParameters & parameters) 28 0 : : ADKernelTempl<T>(parameters) 29 : { 30 0 : } 31 : 32 : template <typename T> 33 : void 34 0 : ADKernelStabilizedTempl<T>::computeResidual() 35 : { 36 0 : prepareVectorTag(_assembly, _var.number()); 37 : 38 0 : precalculateResidual(); 39 0 : const unsigned int n_test = _grad_test.size(); 40 : 41 0 : if (_use_displaced_mesh) 42 0 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 43 : { 44 0 : const auto value = precomputeQpStrongResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 45 0 : for (_i = 0; _i < n_test; _i++) // target for auto vectorization 46 0 : _local_re(_i) += raw_value(_grad_test[_i][_qp] * computeQpStabilization() * value); 47 : } 48 : else 49 0 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 50 : { 51 0 : const auto value = precomputeQpStrongResidual() * _JxW[_qp] * _coord[_qp]; 52 0 : for (_i = 0; _i < n_test; _i++) // target for auto vectorization 53 0 : _local_re(_i) += raw_value(_regular_grad_test[_i][_qp] * computeQpStabilization() * value); 54 : } 55 : 56 0 : accumulateTaggedLocalResidual(); 57 : 58 0 : if (_has_save_in) 59 : { 60 0 : Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx); 61 0 : for (unsigned int i = 0; i < _save_in.size(); i++) 62 0 : _save_in[i]->sys().solution().add_vector(_local_re, _save_in[i]->dofIndices()); 63 0 : } 64 0 : } 65 : 66 : template <typename T> 67 : void 68 0 : ADKernelStabilizedTempl<T>::computeResidualsForJacobian() 69 : { 70 0 : if (_residuals.size() != _grad_test.size()) 71 0 : _residuals.resize(_grad_test.size(), 0); 72 0 : for (auto & r : _residuals) 73 0 : r = 0; 74 : 75 0 : precalculateResidual(); 76 : 77 0 : if (_use_displaced_mesh) 78 0 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 79 : { 80 0 : const auto value = precomputeQpStrongResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 81 0 : for (_i = 0; _i < _grad_test.size(); _i++) 82 0 : _residuals[_i] += _grad_test[_i][_qp] * computeQpStabilization() * value; 83 : } 84 : else 85 0 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 86 : { 87 0 : const auto value = precomputeQpStrongResidual() * _JxW[_qp] * _coord[_qp]; 88 0 : for (_i = 0; _i < _grad_test.size(); _i++) 89 0 : _residuals[_i] += _regular_grad_test[_i][_qp] * computeQpStabilization() * value; 90 : } 91 0 : } 92 : 93 : template <typename T> 94 : ADReal 95 0 : ADKernelStabilizedTempl<T>::computeQpResidual() 96 : { 97 0 : mooseError("Override precomputeQpStrongResidual() in your ADKernelStabilized derived class!"); 98 : } 99 : 100 : template class ADKernelStabilizedTempl<Real>; 101 : template class ADKernelStabilizedTempl<RealVectorValue>;