https://mooseframework.inl.gov
MassFluxPenaltyIPHDG.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 
10 #include "MassFluxPenaltyIPHDG.h"
11 
12 // MOOSE includes
13 #include "MooseVariableFE.h"
14 
15 registerMooseObject("NavierStokesApp", MassFluxPenaltyIPHDG);
16 
19 {
21  params.addRequiredParam<NonlinearVariableName>("u", "The x-velocity");
22  params.addRequiredParam<NonlinearVariableName>("v", "The y-velocity");
23  params.addRequiredParam<NonlinearVariableName>("u_face", "The x-velocity on the face");
24  params.addRequiredParam<NonlinearVariableName>("v_face", "The y-velocity on the face");
25  params.addRequiredRangeCheckedParam<unsigned short>(
26  "component", "0<=component<=1", "The velocity component this object is being applied to");
27  params.addParam<Real>("gamma", 1, "The penalty to multiply the jump");
28  params.addClassDescription("introduces a jump correction on internal faces for grad-div "
29  "stabilization for discontinuous Galerkin methods. Because this is "
30  "derived from HDGKernel this class executes twice per face.");
31  return params;
32 }
33 
35  : HDGKernel(parameters),
36  _vel_x_var(_sys.getFieldVariable<Real>(_tid, getParam<NonlinearVariableName>("u"))),
37  _vel_y_var(_sys.getFieldVariable<Real>(_tid, getParam<NonlinearVariableName>("v"))),
38  _vel_x_face_var(_sys.getFieldVariable<Real>(_tid, getParam<NonlinearVariableName>("u_face"))),
39  _vel_y_face_var(_sys.getFieldVariable<Real>(_tid, getParam<NonlinearVariableName>("v_face"))),
40  _vel_x(_vel_x_var.adSln()),
41  _vel_y(_vel_y_var.adSln()),
42  _vel_x_face(_vel_x_face_var.adSln()),
43  _vel_y_face(_vel_y_face_var.adSln()),
44  _vel_x_phi(_vel_x_var.phiFace()),
45  _vel_y_phi(_vel_y_var.phiFace()),
46  _vel_x_face_phi(_vel_x_face_var.phiFace()),
47  _vel_y_face_phi(_vel_y_face_var.phiFace()),
48  _comp(getParam<unsigned short>("component")),
49  _gamma(getParam<Real>("gamma"))
50 {
51  if (_mesh.dimension() > 2)
52  mooseError("Only two-dimensional velocity is currently implemented");
53 }
54 
55 template <typename T>
56 void
57 MassFluxPenaltyIPHDG::computeOnSideHelper(std::vector<T> & residuals,
58  const MooseArray<std::vector<Real>> & test,
59  const Real sign)
60 {
61  residuals.resize(test.size());
62  for (auto & r : residuals)
63  r = 0;
64 
65  auto return_residual = [this]() -> T
66  {
67  if constexpr (std::is_same<T, Real>::value)
69  else
70  return computeQpResidualOnSide();
71  };
72 
73  for (_qp = 0; _qp < _qrule_face->n_points(); ++_qp)
74  {
75  const auto qpres = _JxW_face[_qp] * _coord[_qp] * return_residual() * sign;
76  for (const auto i : index_range(test))
77  residuals[i] += qpres * test[i][_qp];
78  }
79 }
80 
81 void
83 {
84  const auto & var = _comp == 0 ? _vel_x_var : _vel_y_var;
85  const auto & face_var = _comp == 0 ? _vel_x_face_var : _vel_y_face_var;
86  const auto & test = _comp == 0 ? _vel_x_phi : _vel_y_phi;
87  const auto & face_test = _comp == 0 ? _vel_x_face_phi : _vel_y_face_phi;
89  addResiduals(_assembly, _residuals, var.dofIndices(), var.scalingFactor());
90  computeOnSideHelper(_residuals, face_test, -1);
91  addResiduals(_assembly, _residuals, face_var.dofIndices(), face_var.scalingFactor());
92 }
93 
94 void
96 {
97  const auto & var = _comp == 0 ? _vel_x_var : _vel_y_var;
98  const auto & face_var = _comp == 0 ? _vel_x_face_var : _vel_y_face_var;
99  const auto & test = _comp == 0 ? _vel_x_phi : _vel_y_phi;
100  const auto & face_test = _comp == 0 ? _vel_x_face_phi : _vel_y_face_phi;
102  addJacobian(_assembly, _ad_residuals, var.dofIndices(), var.scalingFactor());
103  computeOnSideHelper(_ad_residuals, face_test, -1);
104  addJacobian(_assembly, _ad_residuals, face_var.dofIndices(), face_var.scalingFactor());
105 }
106 
107 ADReal
109 {
110  const ADRealVectorValue soln_jump(
112 
113  return _gamma * soln_jump * _normals[_qp] * _normals[_qp](_comp);
114 }
const ADVariableValue & _vel_x_face
MooseMesh & _mesh
std::vector< Real > _residuals
const unsigned short _comp
void addRequiredRangeCheckedParam(const std::string &name, const std::string &parsed_function, const std::string &doc_string)
const QBase *const & _qrule_face
const MooseArray< std::vector< Real > > & _vel_x_face_phi
const MooseVariableField< Real > & _vel_y_face_var
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
registerMooseObject("NavierStokesApp", MassFluxPenaltyIPHDG)
void addResiduals(Assembly &assembly, const Residuals &residuals, const Indices &dof_indices, Real scaling_factor)
const ADVariableValue & _vel_x
auto raw_value(const Eigen::Map< T > &in)
static InputParameters validParams()
virtual void computeResidualOnSide() override
DualNumber< Real, DNDerivativeType, true > ADReal
void addRequiredParam(const std::string &name, const std::string &doc_string)
const MooseVariableField< Real > & _vel_y_var
void addJacobian(Assembly &assembly, const Residuals &residuals, const Indices &dof_indices, Real scaling_factor)
virtual void computeJacobianOnSide() override
virtual unsigned int dimension() const
std::vector< ADReal > _ad_residuals
const MooseVariableField< Real > & _vel_x_var
const MooseArray< std::vector< Real > > & _vel_x_phi
const MooseArray< std::vector< Real > > & _vel_y_phi
T sign(T x)
const MooseArray< Real > & _JxW_face
const MooseArray< Real > & _coord
Assembly & _assembly
const MooseArray< std::vector< Real > > & _vel_y_face_phi
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const ADVariableValue & _vel_y
void mooseError(Args &&... args) const
void addClassDescription(const std::string &doc_string)
MassFluxPenaltyIPHDG(const InputParameters &parameters)
static InputParameters validParams()
void computeOnSideHelper(std::vector< T > &residuals, const MooseArray< std::vector< Real >> &test, Real sign)
Helper method to reduce code duplication, this will multiply quadrature point residuals corresponding...
const MooseArray< Point > & _normals
const ADVariableValue & _vel_y_face
auto index_range(const T &sizable)
unsigned int _qp
const MooseVariableField< Real > & _vel_x_face_var