https://mooseframework.inl.gov
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | List of all members
INSADTauMaterialTempl< T > Class Template Reference

#include <INSADTauMaterial.h>

Inheritance diagram for INSADTauMaterialTempl< T >:
[legend]

Public Member Functions

 INSADTauMaterialTempl (const InputParameters &parameters)
 

Static Public Member Functions

static InputParameters validParams ()
 

Protected Member Functions

virtual void computeProperties () override
 
virtual void computeQpProperties () override
 
void computeHMax ()
 Compute the maximum dimension of the current element. More...
 
void computeViscousStrongResidual ()
 Compute the viscous strong residual. More...
 
void viscousTermRZ ()
 Compute the strong form corresponding to RZ pieces of the viscous term. More...
 
bool doVelocityDerivatives () const
 Whether to seed with respect to velocity derivatives. More...
 

Protected Attributes

const Real _alpha
 
ADMaterialProperty< Real > & _tau
 
ADMaterialProperty< RealVectorValue > & _viscous_strong_residual
 Strong residual corresponding to the momentum viscous term. More...
 
ADMaterialProperty< RealVectorValue > & _momentum_strong_residual
 The strong residual of the momentum equation. More...
 
ADReal _hmax
 
const VectorMooseVariable *const _velocity_var
 The velocity variable. More...
 
const FEBase *const & _scalar_lagrange_fe
 A scalar Lagrange FE data member to compute the velocity second derivatives since they're currently not supported for vector FE types. More...
 
std::vector< ADRealTensorValue_d2u
 Containers to hold the matrix of second spatial derivatives of velocity. More...
 
std::vector< ADRealTensorValue_d2v
 
std::vector< ADRealTensorValue_d2w
 
const unsigned int _vel_number
 The velocity variable number. More...
 
const unsigned int _vel_sys_number
 The velocity system number. More...
 
ADReal _speed
 The speed of the medium. More...
 

Detailed Description

template<typename T>
class INSADTauMaterialTempl< T >

Definition at line 32 of file INSADTauMaterial.h.

Constructor & Destructor Documentation

◆ INSADTauMaterialTempl()

template<typename T >
INSADTauMaterialTempl< T >::INSADTauMaterialTempl ( const InputParameters parameters)

Definition at line 152 of file INSADTauMaterial.h.

153  : T(parameters),
154  _alpha(this->template getParam<Real>("alpha")),
155  _tau(this->template declareADProperty<Real>("tau")),
157  this->template declareADProperty<RealVectorValue>("viscous_strong_residual")),
159  this->template declareADProperty<RealVectorValue>("momentum_strong_residual")),
160  _velocity_var(getVectorVar("velocity", 0)),
162  _assembly.getFE(FEType(_velocity_var->feType().order, LAGRANGE), _mesh.dimension())),
165 {
167 }
LAGRANGE
const libMesh::FEType & feType() const
const FEBase *const & _scalar_lagrange_fe
A scalar Lagrange FE data member to compute the velocity second derivatives since they&#39;re currently n...
unsigned int number() const
OrderWrapper order
ADMaterialProperty< RealVectorValue > & _momentum_strong_residual
The strong residual of the momentum equation.
const unsigned int _vel_number
The velocity variable number.
ADMaterialProperty< RealVectorValue > & _viscous_strong_residual
Strong residual corresponding to the momentum viscous term.
const std::vector< std::vector< OutputTensor > > & get_d2phi() const
unsigned int number() const
const VectorMooseVariable *const _velocity_var
The velocity variable.
ADMaterialProperty< Real > & _tau
const unsigned int _vel_sys_number
The velocity system number.
SystemBase & sys()

Member Function Documentation

◆ computeHMax()

template<typename T >
void INSADTauMaterialTempl< T >::computeHMax ( )
protected

Compute the maximum dimension of the current element.

Definition at line 179 of file INSADTauMaterial.h.

180 {
181  if (_disp_x_num == libMesh::invalid_uint || !ADReal::do_derivatives)
182  {
183  _hmax = _current_elem->hmax();
184  return;
185  }
186 
187  _hmax = 0;
188  std::array<unsigned int, 3> disps = {_disp_x_num, _disp_y_num, _disp_z_num};
189  std::array<unsigned int, 3> disp_sys_nums = {_disp_x_sys_num, _disp_y_sys_num, _disp_z_sys_num};
190 
191  for (unsigned int n_outer = 0; n_outer < _current_elem->n_vertices(); n_outer++)
192  for (unsigned int n_inner = n_outer + 1; n_inner < _current_elem->n_vertices(); n_inner++)
193  {
194  VectorValue<ADReal> diff = (_current_elem->point(n_outer) - _current_elem->point(n_inner));
195  for (const auto i : index_range(disps))
196  {
197  const auto disp_num = disps[i];
198  if (disp_num == libMesh::invalid_uint)
199  continue;
200  const auto sys_num = disp_sys_nums[i];
201 
202  // Here we insert derivatives of the difference in nodal positions with respect to the
203  // displacement degrees of freedom. From above, diff = outer_node_position -
204  // inner_node_position
205  diff(i).derivatives().insert(
206  _current_elem->node_ref(n_outer).dof_number(sys_num, disp_num, 0)) = 1.;
207  diff(i).derivatives().insert(
208  _current_elem->node_ref(n_inner).dof_number(sys_num, disp_num, 0)) = -1.;
209  }
210 
211  _hmax = std::max(_hmax, diff.norm_sq());
212  }
213 
214  using std::sqrt;
215  _hmax = sqrt(_hmax);
216 }
const unsigned int invalid_uint
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh
auto index_range(const T &sizable)

◆ computeProperties()

template<typename T >
void INSADTauMaterialTempl< T >::computeProperties ( )
overrideprotectedvirtual

Definition at line 220 of file INSADTauMaterial.h.

221 {
222  computeHMax();
224 
225  T::computeProperties();
226 }
void computeHMax()
Compute the maximum dimension of the current element.
void computeViscousStrongResidual()
Compute the viscous strong residual.

◆ computeQpProperties()

template<typename T >
void INSADTauMaterialTempl< T >::computeQpProperties ( )
overrideprotectedvirtual

Reimplemented in INSADStabilized3Eqn.

Definition at line 344 of file INSADTauMaterial.h.

Referenced by INSADStabilized3Eqn::computeQpProperties().

345 {
346  T::computeQpProperties();
347 
348  using std::sqrt;
349 
350  const auto nu = _mu[_qp] / _rho[_qp];
351  const auto transient_part = _has_transient ? 4. / (_dt * _dt) : 0.;
352  _speed = NS::computeSpeed<ADReal>(_relative_velocity[_qp]);
353  _tau[_qp] = _alpha / sqrt(transient_part + (2. * _speed / _hmax) * (2. * _speed / _hmax) +
354  9. * (4. * nu / (_hmax * _hmax)) * (4. * nu / (_hmax * _hmax)));
355 
357  _advective_strong_residual[_qp] + _viscous_strong_residual[_qp] + _grad_p[_qp];
358 
359  if (_has_transient)
360  _momentum_strong_residual[_qp] += _td_strong_residual[_qp];
361 
362  if (_has_gravity)
363  _momentum_strong_residual[_qp] += _gravity_strong_residual[_qp];
364 
365  if (_has_boussinesq)
366  _momentum_strong_residual[_qp] += _boussinesq_strong_residual[_qp];
367 
368  if (_has_advected_mesh)
369  _momentum_strong_residual[_qp] += _advected_mesh_strong_residual[_qp];
370 
371  if (_has_coupled_force)
372  _momentum_strong_residual[_qp] += _coupled_force_strong_residual[_qp];
373 
374  // // Future addition
375  // if (_object_tracker->hasMMS())
376  // _momentum_strong_residual[_qp] += _mms_function_strong_residual[_qp];
377 }
ADMaterialProperty< RealVectorValue > & _momentum_strong_residual
The strong residual of the momentum equation.
ADReal _speed
The speed of the medium.
ADMaterialProperty< RealVectorValue > & _viscous_strong_residual
Strong residual corresponding to the momentum viscous term.
ADMaterialProperty< Real > & _tau
template ADReal computeSpeed< ADReal >(const libMesh::VectorValue< ADReal > &velocity)
CTSub CT_OPERATOR_BINARY CTMul CTCompareLess CTCompareGreater CTCompareEqual _arg template * sqrt(_arg)) *_arg.template D< dtag >()) CT_SIMPLE_UNARY_FUNCTION(tanh

◆ computeViscousStrongResidual()

template<typename T >
void INSADTauMaterialTempl< T >::computeViscousStrongResidual ( )
protected

Compute the viscous strong residual.

Definition at line 230 of file INSADTauMaterial.h.

231 {
232  auto resize_and_zero = [this](auto & d2vel)
233  {
234  d2vel.resize(_qrule->n_points());
235  for (auto & d2qp : d2vel)
236  d2qp = 0;
237  };
238  resize_and_zero(_d2u);
239  resize_and_zero(_d2v);
240  resize_and_zero(_d2w);
241 
242  auto get_d2 = [this](const auto i) -> std::vector<ADRealTensorValue> &
243  {
244  switch (i)
245  {
246  case 0:
247  return _d2u;
248  case 1:
249  return _d2v;
250  case 2:
251  return _d2w;
252  default:
253  mooseError("invalid value of 'i'");
254  }
255  };
256 
257  // libMesh does not yet have the capability for computing second order spatial derivatives of
258  // vector bases. Lacking that capability, we can compute the second order spatial derivatives "by
259  // hand" using the scalar field version of the vector basis, e.g. LAGRANGE instead of
260  // LAGRANGE_VEC. Adding this implementation allows us to be fully consistent with results from a
261  // scalar velocity field component implementation of Navier-Stokes
262  const auto & vel_dof_indices = _velocity_var->dofIndices();
263  for (const auto i : index_range(vel_dof_indices))
264  {
265  // This may not work if the element and spatial dimensions are different
266  mooseAssert(_current_elem->dim() == _mesh.dimension(),
267  "Below logic only applicable if element and mesh dimension are the same");
268  const auto dimensional_component = i % _mesh.dimension();
269  auto & d2vel = get_d2(dimensional_component);
270  const auto dof_index = vel_dof_indices[i];
271  ADReal dof_value = (*_velocity_var->sys().currentSolution())(dof_index);
272  if (doVelocityDerivatives())
273  dof_value.derivatives().insert(dof_index) = 1;
274  const auto scalar_i_component = i / _mesh.dimension();
275  for (const auto qp : make_range(_qrule->n_points()))
276  d2vel[qp] += dof_value * _scalar_lagrange_fe->get_d2phi()[scalar_i_component][qp];
277  }
278 
279  // Now that we have the second order spatial derivatives of velocity, we can compute the strong
280  // form of the viscous residual for use in our stabilization calculations
281  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
282  {
283  _viscous_strong_residual[_qp](0) = -_mu[_qp] * _d2u[_qp].tr();
284  _viscous_strong_residual[_qp](1) =
285  _mesh.dimension() >= 2 ? -_mu[_qp] * _d2v[_qp].tr() : ADReal(0);
286  _viscous_strong_residual[_qp](2) =
287  _mesh.dimension() == 3 ? -_mu[_qp] * _d2w[_qp].tr() : ADReal(0);
288  if (_viscous_form == NS::ViscousForm::Traction)
289  {
290  _viscous_strong_residual[_qp] -= _mu[_qp] * _d2u[_qp].row(0);
291  if (_mesh.dimension() >= 2)
292  _viscous_strong_residual[_qp] -= _mu[_qp] * _d2v[_qp].row(1);
293  if (_mesh.dimension() == 3)
294  _viscous_strong_residual[_qp] -= _mu[_qp] * _d2w[_qp].row(2);
295  }
296  if (_coord_sys == Moose::COORD_RZ)
297  viscousTermRZ();
298  }
299 }
std::vector< ADRealTensorValue > _d2u
Containers to hold the matrix of second spatial derivatives of velocity.
virtual const NumericVector< Number > *const & currentSolution() const=0
const FEBase *const & _scalar_lagrange_fe
A scalar Lagrange FE data member to compute the velocity second derivatives since they&#39;re currently n...
void mooseError(Args &&... args)
bool doVelocityDerivatives() const
Whether to seed with respect to velocity derivatives.
DualNumber< Real, DNDerivativeType, true > ADReal
const std::vector< dof_id_type > & dofIndices() const final
ADMaterialProperty< RealVectorValue > & _viscous_strong_residual
Strong residual corresponding to the momentum viscous term.
const std::vector< std::vector< OutputTensor > > & get_d2phi() const
const VectorMooseVariable *const _velocity_var
The velocity variable.
IntRange< T > make_range(T beg, T end)
std::vector< ADRealTensorValue > _d2w
std::vector< ADRealTensorValue > _d2v
SystemBase & sys()
auto index_range(const T &sizable)
void viscousTermRZ()
Compute the strong form corresponding to RZ pieces of the viscous term.

◆ doVelocityDerivatives()

template<typename T >
bool INSADTauMaterialTempl< T >::doVelocityDerivatives ( ) const
protected

Whether to seed with respect to velocity derivatives.

Definition at line 171 of file INSADTauMaterial.h.

172 {
173  return ADReal::do_derivatives &&
174  (_vel_sys_number == _fe_problem.currentNonlinearSystem().number());
175 }
const unsigned int _vel_sys_number
The velocity system number.

◆ validParams()

template<typename T >
InputParameters INSADTauMaterialTempl< T >::validParams ( )
static

Definition at line 142 of file INSADTauMaterial.h.

Referenced by INSADStabilized3Eqn::validParams().

143 {
144  InputParameters params = T::validParams();
145  params.addClassDescription(
146  "This is the material class used to compute the stabilization parameter tau.");
147  params.addParam<Real>("alpha", 1., "Multiplicative factor on the stabilization parameter tau.");
148  return params;
149 }
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
void addClassDescription(const std::string &doc_string)

◆ viscousTermRZ()

template<typename T >
void INSADTauMaterialTempl< T >::viscousTermRZ ( )
protected

Compute the strong form corresponding to RZ pieces of the viscous term.

Definition at line 303 of file INSADTauMaterial.h.

304 {
305  // To understand the code immediately below, visit
306  // https://en.wikipedia.org/wiki/Del_in_cylindrical_and_spherical_coordinates.
307  // The u_r / r^2 term comes from the vector Laplacian. The -du_i/dr * 1/r term comes from
308  // the scalar Laplacian. The scalar Laplacian in axisymmetric cylindrical coordinates is
309  // equivalent to the Cartesian Laplacian plus a 1/r * du_i/dr term. And of course we are
310  // applying a minus sign here because the strong form is -\nabala^2 * \vec{u}
311  //
312  // Another note: libMesh implements grad(v) as dvi/dxj or more obviously:
313  //
314  // grad(v) = (vx_x vx_y)
315  // (vy_x vy_y)
316  //
317  // so, the gradient of the velocity with respect to the radial coordinate will correspond to a
318  // *column* slice
319 
320  const auto & r = _ad_q_point[_qp](_rz_radial_coord);
321 
322  {
323  // Do the "Laplace" form. This will be present in *both* Laplace and Traction forms
324  ADRealVectorValue rz_term;
325  for (const auto i : make_range((unsigned int)2))
326  rz_term(i) = -_mu[_qp] * _grad_velocity[_qp](i, _rz_radial_coord) / r;
327  rz_term(_rz_radial_coord) += _mu[_qp] * _velocity[_qp](_rz_radial_coord) / (r * r);
328  _viscous_strong_residual[_qp] += rz_term;
329  }
330  if (_viscous_form == NS::ViscousForm::Traction)
331  {
332  ADRealVectorValue rz_term;
333  for (const auto i : make_range((unsigned int)2))
334  // This is the transpose of the above
335  rz_term(i) = -_mu[_qp] * _grad_velocity[_qp](_rz_radial_coord, i) / r;
336  // This is the same as above (since the transpose of the diagonal is the diagonal)
337  rz_term(_rz_radial_coord) += _mu[_qp] * _velocity[_qp](_rz_radial_coord) / (r * r);
338  _viscous_strong_residual[_qp] += rz_term;
339  }
340 }
ADMaterialProperty< RealVectorValue > & _viscous_strong_residual
Strong residual corresponding to the momentum viscous term.
IntRange< T > make_range(T beg, T end)

Member Data Documentation

◆ _alpha

template<typename T>
const Real INSADTauMaterialTempl< T >::_alpha
protected

Definition at line 63 of file INSADTauMaterial.h.

◆ _d2u

template<typename T>
std::vector<ADRealTensorValue> INSADTauMaterialTempl< T >::_d2u
protected

Containers to hold the matrix of second spatial derivatives of velocity.

Definition at line 83 of file INSADTauMaterial.h.

◆ _d2v

template<typename T>
std::vector<ADRealTensorValue> INSADTauMaterialTempl< T >::_d2v
protected

Definition at line 84 of file INSADTauMaterial.h.

◆ _d2w

template<typename T>
std::vector<ADRealTensorValue> INSADTauMaterialTempl< T >::_d2w
protected

Definition at line 85 of file INSADTauMaterial.h.

◆ _hmax

template<typename T>
ADReal INSADTauMaterialTempl< T >::_hmax
protected

Definition at line 73 of file INSADTauMaterial.h.

◆ _momentum_strong_residual

template<typename T>
ADMaterialProperty<RealVectorValue>& INSADTauMaterialTempl< T >::_momentum_strong_residual
protected

The strong residual of the momentum equation.

Definition at line 71 of file INSADTauMaterial.h.

◆ _scalar_lagrange_fe

template<typename T>
const FEBase* const& INSADTauMaterialTempl< T >::_scalar_lagrange_fe
protected

A scalar Lagrange FE data member to compute the velocity second derivatives since they're currently not supported for vector FE types.

Definition at line 80 of file INSADTauMaterial.h.

Referenced by INSADTauMaterialTempl< INSAD3Eqn >::INSADTauMaterialTempl().

◆ _speed

template<typename T>
ADReal INSADTauMaterialTempl< T >::_speed
protected

The speed of the medium.

This is the norm of the relative velocity, e.g. the velocity minus the mesh velocity, at the current _qp

Definition at line 95 of file INSADTauMaterial.h.

◆ _tau

template<typename T>
ADMaterialProperty<Real>& INSADTauMaterialTempl< T >::_tau
protected

Definition at line 64 of file INSADTauMaterial.h.

◆ _vel_number

template<typename T>
const unsigned int INSADTauMaterialTempl< T >::_vel_number
protected

The velocity variable number.

Definition at line 88 of file INSADTauMaterial.h.

◆ _vel_sys_number

template<typename T>
const unsigned int INSADTauMaterialTempl< T >::_vel_sys_number
protected

The velocity system number.

Definition at line 91 of file INSADTauMaterial.h.

◆ _velocity_var

template<typename T>
const VectorMooseVariable* const INSADTauMaterialTempl< T >::_velocity_var
protected

The velocity variable.

Definition at line 76 of file INSADTauMaterial.h.

◆ _viscous_strong_residual

template<typename T>
ADMaterialProperty<RealVectorValue>& INSADTauMaterialTempl< T >::_viscous_strong_residual
protected

Strong residual corresponding to the momentum viscous term.

This is only used by stabilization kernels

Definition at line 68 of file INSADTauMaterial.h.


The documentation for this class was generated from the following file: