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 #include "MooseVariableFE.h"
13 #include "SystemBase.h"
14 #include "TransientInterface.h"
15 
18 {
20  params.addRequiredParam<NonlinearVariableName>("u", "The x-velocity");
21  params.addRequiredParam<NonlinearVariableName>("v", "The y-velocity");
22  params.addParam<NonlinearVariableName>("w", "The z-velocity");
23  params.addRequiredRangeCheckedParam<unsigned short>(
24  "component", "0<=component<=1", "The velocity component this object is being applied to");
25  params.addRequiredParam<Real>("gamma", "The penalty to multiply the jump");
26  params.addClassDescription("introduces a jump correction on internal faces for grad-div "
27  "stabilization for discontinuous Galerkin methods.");
28  params.addRequiredParam<MooseFunctorName>("face_velocity",
29  "A vector functor representing the face velocity");
30  return params;
31 }
32 
34  const MooseObject * const moose_obj,
36  const TransientInterface * const ti,
37  const MooseMesh & mesh,
38  SystemBase & sys,
39  const Assembly & assembly,
40  const THREAD_ID tid,
41  const std::set<SubdomainID> & block_ids,
42  const std::set<BoundaryID> & boundary_ids)
44  moose_obj, mvdi, ti, sys, assembly, tid, block_ids, boundary_ids),
45  ADFunctorInterface(moose_obj),
46  _vel_x_var(sys.getFieldVariable<Real>(tid, moose_obj->getParam<NonlinearVariableName>("u"))),
47  _vel_y_var(sys.getFieldVariable<Real>(tid, moose_obj->getParam<NonlinearVariableName>("v"))),
48  _vel_x(_vel_x_var.adSln()),
49  _vel_y(_vel_y_var.adSln()),
50  _vel_z(moose_obj->isParamValid("w")
51  ? &sys.getFieldVariable<Real>(tid, moose_obj->getParam<NonlinearVariableName>("w"))
52  .adSln()
53  : nullptr),
54  _comp(moose_obj->getParam<unsigned short>("component")),
55  _gamma(moose_obj->getParam<Real>("gamma")),
56  _face_velocity(getFunctor<ADRealVectorValue>("face_velocity")),
57  _hmax(0)
58 {
59  if ((mesh.dimension() > 2) && !moose_obj->isParamValid("w"))
60  moose_obj->paramError("w", "For 3D meshes, the z-velocity must be provided");
61 }
62 
63 void
65 {
66  _hmax = _current_side_elem->hmax();
67 
68  for (const auto qp : make_range(_qrule_face->n_points()))
69  {
70  const auto qp_term = computeQpResidualOnSide(qp) * _JxW_face[qp];
71  for (const auto i : index_range(_scalar_re))
72  _scalar_re(i) += qp_term * _scalar_phi_face[i][qp];
73  }
74 }
75 
76 void
78 {
79  _hmax = _current_side_elem->hmax();
80 
81  for (const auto qp : make_range(_qrule_face->n_points()))
82  {
83  const auto qp_term = computeQpResidualOnSide(qp) * _JxW_face[qp];
84  for (const auto i : index_range(_lm_re))
85  _lm_re(i) -= qp_term * _lm_phi_face[i][qp];
86  }
87 }
88 
89 ADReal
91 {
92  ADRealVectorValue soln_jump(_vel_x[qp], _vel_y[qp], 0);
93  if (_vel_z)
94  soln_jump(2) = (*_vel_z)[qp];
95  soln_jump -= _face_velocity(
98 
99  return _gamma / _hmax * soln_jump * _normals[qp] * _normals[qp](_comp);
100 }
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
const MooseArray< Point > & _normals
const MooseArray< std::vector< Real > > & _lm_phi_face
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
Moose::StateArg determineState() const
const MooseArray< Real > & _JxW_face
MeshBase & mesh
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)
unsigned int n_points() const
const MooseArray< Point > & _q_point_face
static InputParameters validParams()
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
IntRange< T > make_range(T beg, T end)
void addClassDescription(const std::string &doc_string)
bool isParamValid(const std::string &name) const
const TransientInterface & _ti
const libMesh::QBase *const & _qrule_face
const MooseArray< std::vector< Real > > & _scalar_phi_face
auto index_range(const T &sizable)
unsigned int THREAD_ID