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  _hmax = std::sqrt(_hmax);
215 }
const unsigned int invalid_uint
auto index_range(const T &sizable)

◆ computeProperties()

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

Definition at line 219 of file INSADTauMaterial.h.

220 {
221  computeHMax();
223 
224  T::computeProperties();
225 }
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 343 of file INSADTauMaterial.h.

Referenced by INSADStabilized3Eqn::computeQpProperties().

344 {
345  T::computeQpProperties();
346 
347  const auto nu = _mu[_qp] / _rho[_qp];
348  const auto transient_part = _has_transient ? 4. / (_dt * _dt) : 0.;
349  _speed = NS::computeSpeed(_relative_velocity[_qp]);
350  _tau[_qp] = _alpha / std::sqrt(transient_part + (2. * _speed / _hmax) * (2. * _speed / _hmax) +
351  9. * (4. * nu / (_hmax * _hmax)) * (4. * nu / (_hmax * _hmax)));
352 
354  _advective_strong_residual[_qp] + _viscous_strong_residual[_qp] + _grad_p[_qp];
355 
356  if (_has_transient)
357  _momentum_strong_residual[_qp] += _td_strong_residual[_qp];
358 
359  if (_has_gravity)
360  _momentum_strong_residual[_qp] += _gravity_strong_residual[_qp];
361 
362  if (_has_boussinesq)
363  _momentum_strong_residual[_qp] += _boussinesq_strong_residual[_qp];
364 
365  if (_has_advected_mesh)
366  _momentum_strong_residual[_qp] += _advected_mesh_strong_residual[_qp];
367 
368  if (_has_coupled_force)
369  _momentum_strong_residual[_qp] += _coupled_force_strong_residual[_qp];
370 
371  // // Future addition
372  // if (_object_tracker->hasMMS())
373  // _momentum_strong_residual[_qp] += _mms_function_strong_residual[_qp];
374 }
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
ADReal computeSpeed(const ADRealVectorValue &velocity)
Compute the speed (velocity norm) given the supplied velocity.

◆ computeViscousStrongResidual()

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

Compute the viscous strong residual.

Definition at line 229 of file INSADTauMaterial.h.

230 {
231  auto resize_and_zero = [this](auto & d2vel)
232  {
233  d2vel.resize(_qrule->n_points());
234  for (auto & d2qp : d2vel)
235  d2qp = 0;
236  };
237  resize_and_zero(_d2u);
238  resize_and_zero(_d2v);
239  resize_and_zero(_d2w);
240 
241  auto get_d2 = [this](const auto i) -> std::vector<ADRealTensorValue> &
242  {
243  switch (i)
244  {
245  case 0:
246  return _d2u;
247  case 1:
248  return _d2v;
249  case 2:
250  return _d2w;
251  default:
252  mooseError("invalid value of 'i'");
253  }
254  };
255 
256  // libMesh does not yet have the capability for computing second order spatial derivatives of
257  // vector bases. Lacking that capability, we can compute the second order spatial derivatives "by
258  // hand" using the scalar field version of the vector basis, e.g. LAGRANGE instead of
259  // LAGRANGE_VEC. Adding this implementation allows us to be fully consistent with results from a
260  // scalar velocity field component implementation of Navier-Stokes
261  const auto & vel_dof_indices = _velocity_var->dofIndices();
262  for (const auto i : index_range(vel_dof_indices))
263  {
264  // This may not work if the element and spatial dimensions are different
265  mooseAssert(_current_elem->dim() == _mesh.dimension(),
266  "Below logic only applicable if element and mesh dimension are the same");
267  const auto dimensional_component = i % _mesh.dimension();
268  auto & d2vel = get_d2(dimensional_component);
269  const auto dof_index = vel_dof_indices[i];
270  ADReal dof_value = (*_velocity_var->sys().currentSolution())(dof_index);
271  if (doVelocityDerivatives())
272  dof_value.derivatives().insert(dof_index) = 1;
273  const auto scalar_i_component = i / _mesh.dimension();
274  for (const auto qp : make_range(_qrule->n_points()))
275  d2vel[qp] += dof_value * _scalar_lagrange_fe->get_d2phi()[scalar_i_component][qp];
276  }
277 
278  // Now that we have the second order spatial derivatives of velocity, we can compute the strong
279  // form of the viscous residual for use in our stabilization calculations
280  for (_qp = 0; _qp < _qrule->n_points(); ++_qp)
281  {
282  _viscous_strong_residual[_qp](0) = -_mu[_qp] * _d2u[_qp].tr();
283  _viscous_strong_residual[_qp](1) =
284  _mesh.dimension() >= 2 ? -_mu[_qp] * _d2v[_qp].tr() : ADReal(0);
285  _viscous_strong_residual[_qp](2) =
286  _mesh.dimension() == 3 ? -_mu[_qp] * _d2w[_qp].tr() : ADReal(0);
287  if (_viscous_form == NS::ViscousForm::Traction)
288  {
289  _viscous_strong_residual[_qp] -= _mu[_qp] * _d2u[_qp].row(0);
290  if (_mesh.dimension() >= 2)
291  _viscous_strong_residual[_qp] -= _mu[_qp] * _d2v[_qp].row(1);
292  if (_mesh.dimension() == 3)
293  _viscous_strong_residual[_qp] -= _mu[_qp] * _d2w[_qp].row(2);
294  }
295  if (_coord_sys == Moose::COORD_RZ)
296  viscousTermRZ();
297  }
298 }
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 302 of file INSADTauMaterial.h.

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