www.mooseframework.org
CoupledConvectionReactionSub.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 
11 
12 registerMooseObject("ChemicalReactionsApp", CoupledConvectionReactionSub);
13 
14 template <>
15 InputParameters
17 {
18  InputParameters params = validParams<Kernel>();
19  params.addParam<Real>("weight", 1.0, "Weight of the equilibrium species");
20  params.addCoupledVar("log_k", 0.0, "Equilibrium constant of dissociation equilibrium reaction");
21  params.addParam<Real>("sto_u",
22  1.0,
23  "Stoichiometric coef of the primary species the kernel "
24  "operates on in the equilibrium reaction");
25  params.addCoupledVar(
26  "gamma_u", 1.0, "Activity coefficient of primary species that this kernel operates on");
27  params.addParam<std::vector<Real>>(
28  "sto_v",
29  "The stoichiometric coefficients of coupled primary species in equilibrium reaction");
30  params.addRequiredCoupledVar("p", "Pressure");
31  params.addCoupledVar("v", "List of coupled primary species");
32  params.addCoupledVar("gamma_v", 1.0, "Activity coefficients of coupled primary species");
33  params.addCoupledVar("gamma_eq", 1.0, "Activity coefficient of this equilibrium species");
34  RealVectorValue g(0, 0, 0);
35  params.addParam<RealVectorValue>("gravity", g, "Gravity vector (default is (0, 0, 0))");
36  params.addClassDescription("Convection of equilibrium species");
37  return params;
38 }
39 
41  : DerivativeMaterialInterface<Kernel>(parameters),
42  _weight(getParam<Real>("weight")),
43  _log_k(coupledValue("log_k")),
44  _sto_u(getParam<Real>("sto_u")),
45  _sto_v(getParam<std::vector<Real>>("sto_v")),
46  _cond(getMaterialProperty<Real>("conductivity")),
47  _gravity(getParam<RealVectorValue>("gravity")),
48  _density(getDefaultMaterialProperty<Real>("density")),
49  _grad_p(coupledGradient("p")),
50  _pvar(coupled("p")),
51  _gamma_u(coupledValue("gamma_u")),
52  _gamma_eq(coupledValue("gamma_eq"))
53 {
54  const unsigned int n = coupledComponents("v");
55 
56  // Check that the correct number of coupled values have been provided
57  if (_sto_v.size() != n)
58  mooseError("The number of stoichiometric coefficients in sto_v is not equal to the number of "
59  "coupled species in ",
60  _name);
61 
62  if (isCoupled("gamma_v"))
63  if (coupledComponents("gamma_v") != n)
64  mooseError("The number of activity coefficients in gamma_v is not equal to the number of "
65  "coupled species in ",
66  _name);
67  _vars.resize(n);
68  _vals.resize(n);
69  _grad_vals.resize(n);
70  _gamma_v.resize(n);
71 
72  for (unsigned int i = 0; i < n; ++i)
73  {
74  _vars[i] = coupled("v", i);
75  _vals[i] = &coupledValue("v", i);
76  _grad_vals[i] = &coupledGradient("v", i);
77  // If gamma_v has been supplied, use those values, but if not, use the default value
78  _gamma_v[i] = (isCoupled("gamma_v") ? &coupledValue("gamma_v", i) : &coupledValue("gamma_v"));
79  }
80 }
81 
82 Real
84 {
85  RealVectorValue darcy_vel = -_cond[_qp] * (_grad_p[_qp] - _density[_qp] * _gravity);
86  RealGradient d_u =
87  _sto_u * _gamma_u[_qp] * std::pow(_gamma_u[_qp] * _u[_qp], _sto_u - 1.0) * _grad_u[_qp];
88  RealGradient d_var_sum(0.0, 0.0, 0.0);
89  const Real d_v_u = std::pow(_gamma_u[_qp] * _u[_qp], _sto_u);
90 
91  for (unsigned int i = 0; i < _vals.size(); ++i)
92  {
93  d_u *= std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i]);
94 
95  RealGradient d_var = d_v_u * _sto_v[i] * (*_gamma_v[i])[_qp] *
96  std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i] - 1.0) *
97  (*_grad_vals[i])[_qp];
98 
99  for (unsigned int j = 0; j < _vals.size(); ++j)
100  if (j != i)
101  d_var *= std::pow((*_gamma_v[i])[_qp] * (*_vals[j])[_qp], _sto_v[j]);
102 
103  d_var_sum += d_var;
104  }
105 
106  mooseAssert(_gamma_eq[_qp] > 0.0, "Activity coefficient must be greater than zero");
107  return _weight * std::pow(10.0, _log_k[_qp]) * _test[_i][_qp] * darcy_vel * (d_u + d_var_sum) /
108  _gamma_eq[_qp];
109 }
110 
111 Real
113 {
114  RealVectorValue darcy_vel = -_cond[_qp] * (_grad_p[_qp] - _density[_qp] * _gravity);
115 
116  RealGradient d_u_1 =
117  _sto_u * _gamma_u[_qp] * std::pow(_gamma_u[_qp] * _u[_qp], _sto_u - 1.0) * _grad_phi[_j][_qp];
118  RealGradient d_u_2 = _phi[_j][_qp] * _sto_u * (_sto_u - 1.0) * _gamma_u[_qp] * _gamma_u[_qp] *
119  std::pow(_gamma_u[_qp] * _u[_qp], _sto_u - 2.0) * _grad_u[_qp];
120 
121  RealGradient d_var_sum(0.0, 0.0, 0.0);
122  const Real d_v_u =
123  _sto_u * _gamma_u[_qp] * std::pow(_gamma_u[_qp] * _u[_qp], _sto_u - 1.0) * _phi[_j][_qp];
124 
125  for (unsigned int i = 0; i < _vals.size(); ++i)
126  {
127  d_u_1 *= std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i]);
128  d_u_2 *= std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i]);
129 
130  RealGradient d_var = d_v_u * _sto_v[i] * (*_gamma_v[i])[_qp] *
131  std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i] - 1.0) *
132  (*_grad_vals[i])[_qp];
133  for (unsigned int j = 0; j < _vals.size(); ++j)
134  if (j != i)
135  d_var *= std::pow((*_gamma_v[i])[_qp] * (*_vals[j])[_qp], _sto_v[j]);
136 
137  d_var_sum += d_var;
138  }
139 
140  RealGradient d_u_j = d_u_1 + d_u_2;
141  return _weight * std::pow(10.0, _log_k[_qp]) * _test[_i][_qp] * darcy_vel * (d_u_j + d_var_sum) /
142  _gamma_eq[_qp];
143 }
144 
145 Real
147 {
148  if (jvar == _pvar)
149  {
150  RealVectorValue ddarcy_vel_dp = -_cond[_qp] * _grad_phi[_j][_qp];
151 
152  RealGradient d_u =
153  _sto_u * _gamma_u[_qp] * std::pow(_gamma_u[_qp] * _u[_qp], _sto_u - 1.0) * _grad_u[_qp];
154  RealGradient d_var_sum(0.0, 0.0, 0.0);
155  const Real d_v_u = std::pow(_gamma_u[_qp] * _u[_qp], _sto_u);
156 
157  for (unsigned int i = 0; i < _vals.size(); ++i)
158  {
159  d_u *= std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i]);
160 
161  RealGradient d_var = d_v_u * _sto_v[i] * (*_gamma_v[i])[_qp] *
162  std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i] - 1.0) *
163  (*_grad_vals[i])[_qp];
164  for (unsigned int j = 0; j < _vals.size(); ++j)
165  if (j != i)
166  d_var *= std::pow((*_gamma_v[i])[_qp] * (*_vals[j])[_qp], _sto_v[j]);
167 
168  d_var_sum += d_var;
169  }
170  return _weight * std::pow(10.0, _log_k[_qp]) * _test[_i][_qp] * ddarcy_vel_dp *
171  (d_u + d_var_sum) / _gamma_eq[_qp];
172  }
173 
174  if (_vals.size() == 0)
175  return 0.0;
176 
177  RealVectorValue darcy_vel = -_cond[_qp] * (_grad_p[_qp] - _density[_qp] * _gravity);
178  RealGradient diff1 =
179  _sto_u * _gamma_u[_qp] * std::pow(_gamma_u[_qp] * _u[_qp], _sto_u - 1.0) * _grad_u[_qp];
180  for (unsigned int i = 0; i < _vals.size(); ++i)
181  {
182  if (jvar == _vars[i])
183  diff1 *= _sto_v[i] * (*_gamma_v[i])[_qp] *
184  std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i] - 1.0) * _phi[_j][_qp];
185  else
186  diff1 *= std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i]);
187  }
188 
189  Real val_u = std::pow(_gamma_u[_qp] * _u[_qp], _sto_u);
190  RealGradient diff2_1(1.0, 1.0, 1.0);
191  RealGradient diff2_2(1.0, 1.0, 1.0);
192  for (unsigned int i = 0; i < _vals.size(); ++i)
193  if (jvar == _vars[i])
194  {
195  diff2_1 = _sto_v[i] * (*_gamma_v[i])[_qp] * (*_gamma_v[i])[_qp] * (_sto_v[i] - 1.0) *
196  std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i] - 2.0) * _phi[_j][_qp] *
197  (*_grad_vals[i])[_qp];
198  diff2_2 = _sto_v[i] * (*_gamma_v[i])[_qp] *
199  std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i] - 1.0) *
200  _grad_phi[_j][_qp];
201  }
202 
203  RealGradient diff2 = val_u * (diff2_1 + diff2_2);
204  for (unsigned int i = 0; i < _vals.size(); ++i)
205  if (jvar != _vars[i])
206  {
207  diff2 *= std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i]);
208  }
209 
210  RealGradient diff3;
211  RealGradient diff3_sum(0.0, 0.0, 0.0);
212  Real val_jvar = 0.0;
213  unsigned int var = 0;
214 
215  for (unsigned int i = 0; i < _vals.size(); ++i)
216  if (jvar == _vars[i])
217  {
218  var = i;
219  val_jvar = val_u * _sto_v[i] * (*_gamma_v[i])[_qp] *
220  std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i] - 1.0) * _phi[_j][_qp];
221  }
222 
223  for (unsigned int i = 0; i < _vals.size(); ++i)
224  if (i != var)
225  {
226  diff3 = val_jvar * _sto_v[i] * (*_gamma_v[i])[_qp] *
227  std::pow((*_gamma_v[i])[_qp] * (*_vals[i])[_qp], _sto_v[i] - 1.0) *
228  (*_grad_vals[i])[_qp];
229 
230  for (unsigned int j = 0; j < _vals.size(); ++j)
231  if (j != var && j != i)
232  diff3 *= std::pow((*_gamma_v[i])[_qp] * (*_vals[j])[_qp], _sto_v[j]);
233 
234  diff3_sum += diff3;
235  }
236 
237  return _weight * std::pow(10.0, _log_k[_qp]) * _test[_i][_qp] * darcy_vel *
238  (diff1 + diff2 + diff3_sum) / _gamma_eq[_qp];
239 }
CoupledConvectionReactionSub::_grad_p
const VariableGradient & _grad_p
Pressure gradient.
Definition: CoupledConvectionReactionSub.h:48
CoupledConvectionReactionSub::_weight
const Real _weight
Weight of the equilibrium species concentration in the total primary species concentration.
Definition: CoupledConvectionReactionSub.h:34
CoupledConvectionReactionSub::_gravity
const RealVectorValue _gravity
Gravity.
Definition: CoupledConvectionReactionSub.h:44
CoupledConvectionReactionSub::_log_k
const VariableValue & _log_k
Equilibrium constant for the equilibrium species in association form.
Definition: CoupledConvectionReactionSub.h:36
pow
ExpressionBuilder::EBTerm pow(const ExpressionBuilder::EBTerm &left, T exponent)
Definition: ExpressionBuilder.h:673
libMesh::RealGradient
VectorValue< Real > RealGradient
Definition: GrainForceAndTorqueInterface.h:17
CoupledConvectionReactionSub::_sto_u
const Real _sto_u
Stoichiometric coefficient of the primary species.
Definition: CoupledConvectionReactionSub.h:38
CoupledConvectionReactionSub::_vars
std::vector< unsigned int > _vars
Coupled primary species variable numbers.
Definition: CoupledConvectionReactionSub.h:52
CoupledConvectionReactionSub::_cond
const MaterialProperty< Real > & _cond
Hydraulic conductivity.
Definition: CoupledConvectionReactionSub.h:42
CoupledConvectionReactionSub::_gamma_u
const VariableValue & _gamma_u
Activity coefficient of primary species in the equilibrium species.
Definition: CoupledConvectionReactionSub.h:58
CoupledConvectionReactionSub::_vals
std::vector< const VariableValue * > _vals
Coupled primary species concentrations.
Definition: CoupledConvectionReactionSub.h:54
CoupledConvectionReactionSub::computeQpResidual
virtual Real computeQpResidual() override
Definition: CoupledConvectionReactionSub.C:83
CoupledConvectionReactionSub::CoupledConvectionReactionSub
CoupledConvectionReactionSub(const InputParameters &parameters)
Definition: CoupledConvectionReactionSub.C:40
CoupledConvectionReactionSub::_gamma_eq
const VariableValue & _gamma_eq
Activity coefficient of equilibrium species.
Definition: CoupledConvectionReactionSub.h:62
CoupledConvectionReactionSub::computeQpJacobian
virtual Real computeQpJacobian() override
Definition: CoupledConvectionReactionSub.C:112
registerMooseObject
registerMooseObject("ChemicalReactionsApp", CoupledConvectionReactionSub)
CoupledConvectionReactionSub.h
CoupledConvectionReactionSub::_gamma_v
std::vector< const VariableValue * > _gamma_v
Activity coefficients of coupled primary species in the equilibrium species.
Definition: CoupledConvectionReactionSub.h:60
validParams< CoupledConvectionReactionSub >
InputParameters validParams< CoupledConvectionReactionSub >()
Definition: CoupledConvectionReactionSub.C:16
CoupledConvectionReactionSub::_grad_vals
std::vector< const VariableGradient * > _grad_vals
Coupled gradients of primary species concentrations.
Definition: CoupledConvectionReactionSub.h:56
CoupledConvectionReactionSub::_density
const MaterialProperty< Real > & _density
Fluid density.
Definition: CoupledConvectionReactionSub.h:46
CoupledConvectionReactionSub::_pvar
const unsigned int _pvar
Pressure variable number.
Definition: CoupledConvectionReactionSub.h:50
CoupledConvectionReactionSub::computeQpOffDiagJacobian
virtual Real computeQpOffDiagJacobian(unsigned int jvar) override
Definition: CoupledConvectionReactionSub.C:146
CoupledConvectionReactionSub
Convection of primary species in given equilibrium species.
Definition: CoupledConvectionReactionSub.h:23
CoupledConvectionReactionSub::_sto_v
const std::vector< Real > _sto_v
Stoichiometric coefficients of the coupled primary species.
Definition: CoupledConvectionReactionSub.h:40