https://mooseframework.inl.gov
ADPenaltyVelocityContinuity.C
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
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 #include "Assembly.h"
12 
14 
17 {
19  params.addClassDescription(
20  "Enforces continuity of flux and continuity of solution via penalty across an interface.");
21  params.addRequiredParam<Real>(
22  "penalty",
23  "The penalty that penalizes jump between primary and neighbor secondary variables.");
24  params.addRequiredCoupledVar("fluid_velocity", "The fluid velocity");
25  params.renameCoupledVar("neighbor_var", "displacements", "All the displacement variables");
26  params.addRequiredCoupledVar("solid_velocities", "The solid velocity components");
27  return params;
28 }
29 
31  : InterfaceKernelBase(parameters),
32  _penalty(getParam<Real>("penalty")),
33  _velocity_var(getVectorVar("fluid_velocity", 0)),
34  _velocity(adCoupledVectorValue("fluid_velocity")),
35  _ad_JxW(_assembly.adJxWFace()),
36  _ad_coord(_assembly.adCoordTransformation())
37 {
38  if (isCoupledConstant("fluid_velocity"))
39  paramError("fluid_velocity", "The fluid velocity must be an actual variable");
40 
41  _solid_velocities.resize(coupledComponents("solid_velocities"));
42  for (const auto i : index_range(_solid_velocities))
43  _solid_velocities[i] = &adCoupledNeighborValue("solid_velocities", i);
44 
45  _displacements.resize(coupledComponents("displacements"));
46  for (const auto i : index_range(_displacements))
47  _displacements[i] = getVar("displacements", i);
48 }
49 
50 void
52 {
53  _qp_jumps.resize(_qrule->n_points());
54  for (auto & qp_jump : _qp_jumps)
55  qp_jump = 0;
56 
57  const auto solid_velocity = [&](const auto qp)
58  {
60  for (const auto i : index_range(_solid_velocities))
61  if (_solid_velocities[i])
62  ret(i) = (*_solid_velocities[i])[qp];
63 
64  return ret;
65  };
66 
67  for (const auto qp : make_range(_qrule->n_points()))
68  _qp_jumps[qp] = _ad_JxW[qp] * _ad_coord[qp] * _penalty * (_velocity[qp] - solid_velocity(qp));
69 
70  // Fluid velocity residuals
71  {
72  const auto & phi = _velocity_var->phiFace();
73  const auto & dof_indices = _velocity_var->dofIndices();
74  mooseAssert(phi.size() == dof_indices.size(), "These should be the same");
75 
76  _residuals.resize(phi.size());
77  for (auto & r : _residuals)
78  r = 0;
79 
80  for (const auto i : index_range(phi))
81  for (const auto qp : make_range(_qrule->n_points()))
82  _residuals[i] += phi[i][qp] * _qp_jumps[qp];
83 
85  }
86 
87  // Displacement residuals
88  for (const auto dim : index_range(_displacements))
89  {
90  const auto * const disp_var = _displacements[dim];
91  if (disp_var)
92  {
93  const auto & phi = disp_var->phiFaceNeighbor();
94  const auto & dof_indices = disp_var->dofIndicesNeighbor();
95  mooseAssert(phi.size() == dof_indices.size(), "These should be the same");
96 
97  _residuals.resize(phi.size());
98  for (auto & r : _residuals)
99  r = 0;
100 
101  for (const auto qp : make_range(_qrule->n_points()))
102  for (const auto i : index_range(phi))
103  _residuals[i] -= phi[i][qp] * _qp_jumps[qp](dim);
104 
105  addResidualsAndJacobian(_assembly, _residuals, dof_indices, disp_var->scalingFactor());
106  }
107  }
108 }
const MooseArray< ADReal > & _ad_coord
Coordinate transformation with displacement derivatives.
void addResidualsAndJacobian(Assembly &assembly, const Residuals &residuals, const Indices &dof_indices, Real scaling_factor)
static InputParameters validParams()
virtual bool isCoupledConstant(const std::string &var_name) const
unsigned int dim
ADPenaltyVelocityContinuity(const InputParameters &parameters)
void renameCoupledVar(const std::string &old_name, const std::string &new_name, const std::string &new_docstring)
MooseVariable * getVar(const std::string &var_name, unsigned int comp)
std::vector< const MooseVariable * > _displacements
Displacement variables.
void addRequiredParam(const std::string &name, const std::string &doc_string)
std::vector< const ADVariableValue * > _solid_velocities
Solid velocity values.
std::vector< ADRealVectorValue > _qp_jumps
Jump data member to avoid constant heap allocations.
const std::vector< dof_id_type > & dofIndices() const final
Interface kernel for enforcing continuity of stress and velocity.
registerMooseObject("FsiApp", ADPenaltyVelocityContinuity)
const QBase *const & _qrule
const Real _penalty
The penalty factor.
virtual const ADVariableValue & adCoupledNeighborValue(const std::string &var_name, unsigned int comp=0) const
void paramError(const std::string &param, Args... args) const
Assembly & _assembly
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
std::vector< ADReal > _residuals
Residuals data member to avoid constant heap allocation.
const MooseArray< ADReal > & _ad_JxW
JxW with displacement derivatives.
unsigned int coupledComponents(const std::string &var_name) const
const ADVectorVariableValue & _velocity
Fluid velocity values.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
const VectorMooseVariable *const _velocity_var
Fluid velocity variable.
virtual void computeResidual() override
static InputParameters validParams()
IntRange< T > make_range(T beg, T end)
void addClassDescription(const std::string &doc_string)
const FieldVariablePhiValue & phiFace() const override final
auto index_range(const T &sizable)
void scalingFactor(const std::vector< Real > &factor)