https://mooseframework.inl.gov
MassFluxPenaltyIPHDGAssemblyHelper.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
11 
12 // MOOSE includes
13 #include "MooseVariableFE.h"
14 
17 {
19  params.addRequiredParam<NonlinearVariableName>("u", "The x-velocity");
20  params.addRequiredParam<NonlinearVariableName>("v", "The y-velocity");
21  params.addParam<NonlinearVariableName>("w", "The z-velocity");
22  params.addRequiredRangeCheckedParam<unsigned short>(
23  "component", "0<=component<=1", "The velocity component this object is being applied to");
24  params.addRequiredParam<Real>("gamma", "The penalty to multiply the jump");
25  params.addClassDescription("introduces a jump correction on internal faces for grad-div "
26  "stabilization for discontinuous Galerkin methods.");
27  params.addRequiredParam<MooseFunctorName>("face_velocity",
28  "A vector functor representing the face velocity");
29  return params;
30 }
31 
33  const MooseObject * const moose_obj,
35  const TransientInterface * const ti,
36  const MooseMesh & mesh,
37  SystemBase & sys,
38  const Assembly & assembly,
39  const THREAD_ID tid,
40  const std::set<SubdomainID> & block_ids,
41  const std::set<BoundaryID> & boundary_ids)
42  : IPHDGAssemblyHelper(moose_obj, mvdi, ti, sys, assembly, tid, block_ids, boundary_ids),
43  ADFunctorInterface(moose_obj),
44  _vel_x_var(sys.getFieldVariable<Real>(tid, moose_obj->getParam<NonlinearVariableName>("u"))),
45  _vel_y_var(sys.getFieldVariable<Real>(tid, moose_obj->getParam<NonlinearVariableName>("v"))),
46  _vel_x(_vel_x_var.adSln()),
47  _vel_y(_vel_y_var.adSln()),
48  _vel_z(moose_obj->isParamValid("w")
49  ? &sys.getFieldVariable<Real>(tid, moose_obj->getParam<NonlinearVariableName>("w"))
50  .adSln()
51  : nullptr),
52  _comp(moose_obj->getParam<unsigned short>("component")),
53  _gamma(moose_obj->getParam<Real>("gamma")),
54  _face_velocity(getFunctor<ADRealVectorValue>("face_velocity")),
55  _hmax(0)
56 {
57  if ((mesh.dimension() > 2) && !moose_obj->isParamValid("w"))
58  moose_obj->paramError("w", "For 3D meshes, the z-velocity must be provided");
59 }
60 
61 void
63 {
64  _hmax = _ip_current_side_elem->hmax();
65 
66  for (const auto qp : make_range(_ip_qrule_face->n_points()))
67  {
68  const auto qp_term = computeQpResidualOnSide(qp) * _ip_JxW_face[qp];
69  for (const auto i : index_range(_scalar_re))
70  _scalar_re(i) += qp_term * _scalar_phi_face[i][qp];
71  }
72 }
73 
74 void
76 {
77  _hmax = _ip_current_side_elem->hmax();
78 
79  for (const auto qp : make_range(_ip_qrule_face->n_points()))
80  {
81  const auto qp_term = computeQpResidualOnSide(qp) * _ip_JxW_face[qp];
82  for (const auto i : index_range(_lm_re))
83  _lm_re(i) -= qp_term * _lm_phi_face[i][qp];
84  }
85 }
86 
87 ADReal
89 {
90  ADRealVectorValue soln_jump(_vel_x[qp], _vel_y[qp], 0);
91  if (_vel_z)
92  soln_jump(2) = (*_vel_z)[qp];
93  soln_jump -= _face_velocity(
97 
98  return _gamma / _hmax * soln_jump * _ip_normals[qp] * _ip_normals[qp](_comp);
99 }
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
DenseVector< ADReal > _scalar_re
void paramError(const std::string &param, Args... args) const
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
Real _hmax
Facet characteristic length for correct norm computations.
const Moose::Functor< ADRealVectorValue > & _face_velocity
DenseVector< ADReal > _lm_re
const unsigned int & _ip_current_side
Moose::StateArg determineState() const
MeshBase & mesh
const MooseArray< std::vector< Real > > & _lm_phi_face
const QBase *const & _ip_qrule_face
const TransientInterface & _ti
const Elem *const & _ip_current_elem
DualNumber< Real, DNDerivativeType, false > ADReal
void addRequiredParam(const std::string &name, const std::string &doc_string)
MassFluxPenaltyIPHDGAssemblyHelper(const MooseObject *const moose_obj, MooseVariableDependencyInterface *const mvdi, const TransientInterface *const ti, const MooseMesh &mesh, SystemBase &sys, const Assembly &assembly, const THREAD_ID tid, const std::set< SubdomainID > &block_ids, const std::set< BoundaryID > &boundary_ids)
const MooseArray< Point > & _ip_normals
const MooseArray< Point > & _ip_q_point_face
const Elem *const & _ip_current_side_elem
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const MooseArray< Real > & _ip_JxW_face
const MooseArray< std::vector< Real > > & _scalar_phi_face
IntRange< T > make_range(T beg, T end)
void addClassDescription(const std::string &doc_string)
bool isParamValid(const std::string &name) const
static InputParameters validParams()
auto index_range(const T &sizable)
unsigned int THREAD_ID