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 0 : for (unsigned int i = 0; i < _save_in.size(); i++) 60 0 : _save_in[i]->sys().solution().add_vector(_local_re, _save_in[i]->dofIndices()); 61 0 : } 62 : 63 : template <typename T> 64 : void 65 0 : ADKernelStabilizedTempl<T>::computeResidualsForJacobian() 66 : { 67 0 : if (_residuals.size() != _grad_test.size()) 68 0 : _residuals.resize(_grad_test.size(), 0); 69 0 : for (auto & r : _residuals) 70 0 : r = 0; 71 : 72 0 : precalculateResidual(); 73 : 74 0 : if (_use_displaced_mesh) 75 0 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 76 : { 77 0 : const auto value = precomputeQpStrongResidual() * _ad_JxW[_qp] * _ad_coord[_qp]; 78 0 : for (_i = 0; _i < _grad_test.size(); _i++) 79 0 : _residuals[_i] += _grad_test[_i][_qp] * computeQpStabilization() * value; 80 : } 81 : else 82 0 : for (_qp = 0; _qp < _qrule->n_points(); _qp++) 83 : { 84 0 : const auto value = precomputeQpStrongResidual() * _JxW[_qp] * _coord[_qp]; 85 0 : for (_i = 0; _i < _grad_test.size(); _i++) 86 0 : _residuals[_i] += _regular_grad_test[_i][_qp] * computeQpStabilization() * value; 87 : } 88 0 : } 89 : 90 : template <typename T> 91 : ADReal 92 0 : ADKernelStabilizedTempl<T>::computeQpResidual() 93 : { 94 0 : mooseError("Override precomputeQpStrongResidual() in your ADKernelStabilized derived class!"); 95 : } 96 : 97 : template class ADKernelStabilizedTempl<Real>; 98 : template class ADKernelStabilizedTempl<RealVectorValue>;