https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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{
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
52{
54 for (const auto i : index_range(_solid_velocities))
55 ret(i) = (*_solid_velocities[i])[qp];
56 return ret;
57}
58
59void
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}
registerMooseObject("FsiApp", ADPenaltyVelocityContinuity)
unsigned int dim
Interface kernel for enforcing continuity of stress and velocity.
const MooseArray< ADReal > & _ad_coord
Coordinate transformation with displacement derivatives.
std::vector< ADReal > _residuals
Residuals data member to avoid constant heap allocation.
virtual ADRealVectorValue solidVelocity(const unsigned int qp) const
std::vector< const ADVariableValue * > _solid_velocities
Solid velocity values.
const ADVectorVariableValue & _velocity
Fluid velocity values.
ADPenaltyVelocityContinuity(const InputParameters &parameters)
const MooseArray< ADReal > & _ad_JxW
JxW with displacement derivatives.
std::vector< ADRealVectorValue > _qp_jumps
Jump data member to avoid constant heap allocations.
const VectorMooseVariable *const _velocity_var
Fluid velocity variable.
std::vector< const MooseVariable * > _displacements
Displacement variables.
const Real _penalty
The penalty factor.
virtual bool isCoupledConstant(const std::string &var_name) const
MooseVariable * getVar(const std::string &var_name, unsigned int comp)
unsigned int coupledComponents(const std::string &var_name) const
void addRequiredCoupledVar(const std::string &name, const std::string &doc_string)
void addRequiredParam(const std::string &name, const std::string &doc_string)
void renameCoupledVar(const std::string &old_name, const std::string &new_name, const std::string &new_docstring)
void addClassDescription(const std::string &doc_string)
static InputParameters validParams()
const QBase *const & _qrule
void paramError(const std::string &param, Args... args) const
void scalingFactor(const std::vector< Real > &factor)
const std::vector< dof_id_type > & dofIndices() const final
const FieldVariablePhiValue & phiFace() const override final
virtual const ADVariableValue & adCoupledNeighborValue(const std::string &var_name, unsigned int comp=0) const
Assembly & _assembly
void addResidualsAndJacobian(Assembly &assembly, const Residuals &residuals, const Indices &dof_indices, Real scaling_factor)