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 
51 ADPenaltyVelocityContinuity::solidVelocity(const unsigned int qp) const
52 {
54  for (const auto i : index_range(_solid_velocities))
55  ret(i) = (*_solid_velocities[i])[qp];
56  return ret;
57 }
58 
59 void
61 {
62  _qp_jumps.resize(_qrule->n_points());
63  for (auto & qp_jump : _qp_jumps)
64  qp_jump = 0;
65 
66  for (const auto qp : make_range(_qrule->n_points()))
67  _qp_jumps[qp] = _ad_JxW[qp] * _ad_coord[qp] * _penalty * (_velocity[qp] - solidVelocity(qp));
68 
69  // Fluid velocity residuals
70  {
71  const auto & phi = _velocity_var->phiFace();
72  const auto & dof_indices = _velocity_var->dofIndices();
73  mooseAssert(phi.size() == dof_indices.size(), "These should be the same");
74 
75  _residuals.resize(phi.size());
76  for (auto & r : _residuals)
77  r = 0;
78 
79  for (const auto i : index_range(phi))
80  for (const auto qp : make_range(_qrule->n_points()))
81  _residuals[i] += phi[i][qp] * _qp_jumps[qp];
82 
84  }
85 
86  // Displacement residuals
87  for (const auto dim : index_range(_displacements))
88  {
89  const auto * const disp_var = _displacements[dim];
90  if (disp_var)
91  {
92  const auto & phi = disp_var->phiFaceNeighbor();
93  const auto & dof_indices = disp_var->dofIndicesNeighbor();
94  mooseAssert(phi.size() == dof_indices.size(), "These should be the same");
95 
96  _residuals.resize(phi.size());
97  for (auto & r : _residuals)
98  r = 0;
99 
100  for (const auto qp : make_range(_qrule->n_points()))
101  for (const auto i : index_range(phi))
102  _residuals[i] -= phi[i][qp] * _qp_jumps[qp](dim);
103 
104  addResidualsAndJacobian(_assembly, _residuals, dof_indices, disp_var->scalingFactor());
105  }
106  }
107 }
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
void paramError(const std::string &param, Args... args) const
unsigned int dim
virtual ADRealVectorValue solidVelocity(const unsigned int qp) const
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
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)