https://mooseframework.inl.gov
WCNSFV2PInterfaceAreaSourceSink.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 "NS.h"
12 #include "NonlinearSystemBase.h"
13 #include "NavierStokesMethods.h"
14 
16 
19 {
21  params.addClassDescription(
22  "Source and sink of interfacial area for two-phase flow mixture model.");
23  params.addRequiredParam<MooseFunctorName>("u", "The velocity in the x direction.");
24  params.addParam<MooseFunctorName>("v", "The velocity in the y direction.");
25  params.addParam<MooseFunctorName>("w", "The velocity in the z direction.");
26 
27  params.addParam<MooseFunctorName>("L", 1.0, "The characteristic dissipation length.");
28  params.addRequiredParam<MooseFunctorName>(NS::density, "Continuous phase density.");
29  params.addRequiredParam<MooseFunctorName>(NS::density + std::string("_d"),
30  "Dispersed phase density.");
31  params.addRequiredParam<MooseFunctorName>(NS::pressure, "Continuous phase density.");
32  params.addParam<MooseFunctorName>(
33  "k_c", 0.0, "Mass exchange coefficients from continous to dispersed phases.");
34  params.addParam<MooseFunctorName>("fd", 0.0, "Fraction dispersed phase.");
35  params.addParam<Real>("fd_max", 1.0, "Maximum dispersed phase fraction.");
36 
37  params.addParam<MooseFunctorName>("sigma", 1.0, "Surface tension between phases.");
38  params.addParam<MooseFunctorName>("particle_diameter", 1.0, "Maximum particle diameter.");
39 
40  params.addParam<Real>("cutoff_fraction",
41  0.1,
42  "Void fraction at which the interface area density mass transfer model is "
43  "activated. Below this fraction, spherical bubbles are assumed.");
44 
45  params.set<unsigned short>("ghost_layers") = 2;
46 
47  return params;
48 }
49 
51  : FVElementalKernel(params),
52  _dim(_subproblem.mesh().dimension()),
53  _u_var(getFunctor<ADReal>("u")),
54  _v_var(params.isParamValid("v") ? &(getFunctor<ADReal>("v")) : nullptr),
55  _w_var(params.isParamValid("w") ? &(getFunctor<ADReal>("w")) : nullptr),
56  _characheristic_length(getFunctor<ADReal>("L")),
57  _rho_mixture(getFunctor<ADReal>(NS::density)),
58  _rho_d(getFunctor<ADReal>(NS::density + std::string("_d"))),
59  _pressure(getFunctor<ADReal>(NS::pressure)),
60  _mass_exchange_coefficient(getFunctor<ADReal>("k_c")),
61  _f_d(getFunctor<ADReal>("fd")),
62  _f_d_max(getParam<Real>("fd_max")),
63  _sigma(getFunctor<ADReal>("sigma")),
64  _particle_diameter(getFunctor<ADReal>("particle_diameter")),
65  _cutoff_fraction(getParam<Real>("cutoff_fraction"))
66 {
67  if (_dim >= 2 && !_v_var)
68  paramError("v", "In two or more dimensions, the v velocity must be supplied!");
69 
70  if (_dim >= 3 && !_w_var)
71  paramError("w", "In three or more dimensions, the w velocity must be supplied!");
72 }
73 
74 ADReal
76 {
77 
78  // Useful Arguments
79  const auto state = determineState();
80  const auto elem_arg = makeElemArg(_current_elem);
81  const bool is_transient = _subproblem.isTransient();
82 
83  // Current Variables
84  const auto u = _u_var(elem_arg, state);
85  const auto rho_d = _rho_d(elem_arg, state);
86  const auto rho_d_grad = _rho_d.gradient(elem_arg, state);
87  const auto xi = _var(elem_arg, state);
88  const auto rho_m = _rho_mixture(elem_arg, state);
89  const auto f_d = _f_d(elem_arg, state);
90  const auto sigma = _sigma(elem_arg, state);
91  const auto rho_l = (rho_m - f_d * rho_d) / (1.0 - f_d + libMesh::TOLERANCE);
92  const auto complement_fd = std::max(_f_d_max - f_d, libMesh::TOLERANCE);
93  const auto f_d_o_xi = f_d / (_var(elem_arg, state) + libMesh::TOLERANCE) + libMesh::TOLERANCE;
94  const auto f_d_o_xi_old =
95  f_d / (raw_value(_var(elem_arg, state)) + libMesh::TOLERANCE) + libMesh::TOLERANCE;
96 
97  // Adding bubble compressibility term
98  ADReal material_time_derivative_rho_d = u * rho_d_grad(0);
99  if (_dim > 1)
100  {
101  material_time_derivative_rho_d += (*_v_var)(elem_arg, state) * rho_d_grad(1);
102  if (_dim > 2)
103  {
104  material_time_derivative_rho_d += (*_w_var)(elem_arg, state) * rho_d_grad(2);
105  }
106  }
107  if (is_transient)
108  material_time_derivative_rho_d +=
109  raw_value(_rho_d(elem_arg, state) - _rho_d(elem_arg, Moose::oldState())) / _dt;
110  const auto bubble_compressibility = material_time_derivative_rho_d * xi / 3.0;
111 
112  // Adding area growth due to added mass
113  ADReal bubble_added_mass;
114  if (f_d < _cutoff_fraction)
115  bubble_added_mass = raw_value(_rho_d(elem_arg, state)) *
116  (f_d * 6.0 / _particle_diameter(elem_arg, state) - _var(elem_arg, state));
117  else
118  bubble_added_mass = 2. / 3. * _mass_exchange_coefficient(elem_arg, state) *
119  (1.0 / (f_d + libMesh::TOLERANCE) - 2.0);
120 
121  // Model parameters
122  const auto db = _shape_factor * f_d_o_xi_old + libMesh::TOLERANCE;
123 
125  if (_v_var)
126  velocity(1) = (*_v_var)(elem_arg, state);
127  if (_w_var)
128  velocity(2) = (*_w_var)(elem_arg, state);
129 
130  const ADReal velocity_norm = NS::computeSpeed(velocity);
131  const auto pressure_gradient = raw_value(_pressure.gradient(elem_arg, state));
132  const Real pressure_grad_norm =
133  MooseUtils::isZero(pressure_gradient) ? 1e-42 : pressure_gradient.norm();
134 
135  const auto u_eps =
136  std::pow(velocity_norm * _characheristic_length(elem_arg, state) * pressure_grad_norm / rho_m,
137  1. / 3.);
138 
139  const auto interaction_prefactor =
140  Utility::pow<2>(f_d_o_xi) * u_eps / (std::pow(db, 11. / 3.) / complement_fd);
141 
142  // Adding coalescence term
143  const auto f_c = interaction_prefactor * _gamma_c * Utility::pow<2>(f_d);
144  const auto exp_c = std::exp(-_Kc * std::pow(db, 5. / 6.) * std::sqrt(rho_l / sigma) * u_eps);
145  const auto s_rc = f_c * exp_c;
146 
147  // Adding breakage term
148  const auto f_b = interaction_prefactor * _gamma_b * f_d * (1. - f_d);
149  const auto exp_b =
150  std::exp(-_Kb * sigma / (rho_l * std::pow(db, 5. / 3.) * Utility::pow<2>(u_eps)));
151  const auto s_rb = f_b * exp_b;
152 
153  return -bubble_added_mass + bubble_compressibility + s_rc - s_rb;
154 }
StateArg oldState()
void addParam(const std::string &name, const std::initializer_list< typename T::value_type > &value, const std::string &doc_string)
static constexpr Real TOLERANCE
bool isZero(const T &value, const Real tolerance=TOLERANCE *TOLERANCE *TOLERANCE)
const Moose::Functor< ADReal > & _rho_d
Dispersed Phase Density.
Moose::StateArg determineState() const
T & set(const std::string &name, bool quiet_mode=false)
WCNSFV2PInterfaceAreaSourceSink(const InputParameters &parameters)
MeshBase & mesh
static const std::string density
Definition: NS.h:33
auto raw_value(const Eigen::Map< T > &in)
const Real _cutoff_fraction
Cutoff fraction at which the full mass transfer model is activated.
const Moose::Functor< ADReal > & _particle_diameter
Particle Diameter.
const Moose::Functor< ADReal > & _characheristic_length
Characterisitc Length.
const Moose::Functor< ADReal > & _rho_mixture
Mixture Density.
DualNumber< Real, DNDerivativeType, true > ADReal
Computes source the sink terms for the interface area in the mixture model of two-phase flows...
const Moose::Functor< ADReal > & _mass_exchange_coefficient
Interface Mass Exchange Coeefficient.
void addRequiredParam(const std::string &name, const std::string &doc_string)
const Moose::Functor< ADReal > & _pressure
Pressure field.
const unsigned int _dim
The dimension of the domain.
Moose::ElemArg makeElemArg(const Elem *elem, bool correct_skewnewss=false) const
const GeochemicalDatabaseReader db("database/moose_testdb.json", true, true, false)
const Elem *const & _current_elem
const Moose::Functor< ADReal > * _v_var
y-velocity
const Moose::Functor< ADReal > * _w_var
z-velocity
const Moose::Functor< ADReal > & _sigma
Surface Tension.
SubProblem & _subproblem
static InputParameters validParams()
virtual bool isTransient() const=0
registerMooseObject("NavierStokesApp", WCNSFV2PInterfaceAreaSourceSink)
void paramError(const std::string &param, Args... args) const
const Real _f_d_max
Maximum Void Fraction.
static constexpr Real _gamma_c
Internal closure coefficients.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
static const std::string pressure
Definition: NS.h:56
const Moose::Functor< ADReal > & _u_var
x-velocity
void addClassDescription(const std::string &doc_string)
static const std::string velocity
Definition: NS.h:45
ADReal computeSpeed(const ADRealVectorValue &velocity)
Compute the speed (velocity norm) given the supplied velocity.
MooseUnits pow(const MooseUnits &, int)
const Moose::Functor< ADReal > & _f_d
Void Fraction.
MooseVariableFV< Real > & _var