https://mooseframework.inl.gov
Coupleable.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 
10 #include "Coupleable.h"
11 #include "Problem.h"
12 #include "SubProblem.h"
13 #include "FEProblem.h"
14 #include "MooseVariableScalar.h"
15 #include "MooseVariableFE.h"
16 #include "InputParameters.h"
17 #include "MooseObject.h"
18 #include "SystemBase.h"
19 #include "AuxiliarySystem.h"
20 
21 #include "AuxKernel.h"
22 #include "ElementUserObject.h"
23 #include "NodalUserObject.h"
24 #include "NodeFaceConstraint.h"
25 #include "NodeElemConstraintBase.h"
26 
27 Coupleable::Coupleable(const MooseObject * moose_object, bool nodal, bool is_fv)
28  : _c_parameters(moose_object->parameters()),
29  _c_name(moose_object->name()),
30  _c_type(moose_object->type()),
31  _c_fe_problem(*_c_parameters.getCheckedPointerParam<FEProblemBase *>("_fe_problem_base")),
32  _c_sys(_c_parameters.isParamValid("_sys") ? _c_parameters.get<SystemBase *>("_sys") : nullptr),
33  _new_to_deprecated_coupled_vars(_c_parameters.getNewToDeprecatedVarMap()),
34  _c_nodal(nodal),
35  _c_is_implicit(_c_parameters.have_parameter<bool>("implicit")
36  ? _c_parameters.get<bool>("implicit")
37  : true),
38  _c_allow_element_to_nodal_coupling(
39  _c_parameters.have_parameter<bool>("_allow_nodal_to_elemental_coupling")
40  ? _c_parameters.get<bool>("_allow_nodal_to_elemental_coupling")
41  : false),
42  _c_tid(_c_parameters.get<THREAD_ID>("_tid")),
43  _zero(_c_fe_problem._zero[_c_tid]),
44  _phi_zero(_c_fe_problem._phi_zero[_c_tid]),
45  _ad_zero(_c_fe_problem._ad_zero[_c_tid]),
46  _grad_zero(_c_fe_problem._grad_zero[_c_tid]),
47  _ad_grad_zero(_c_fe_problem._ad_grad_zero[_c_tid]),
48  _grad_phi_zero(_c_fe_problem._grad_phi_zero[_c_tid]),
49  _second_zero(_c_fe_problem._second_zero[_c_tid]),
50  _ad_second_zero(_c_fe_problem._ad_second_zero[_c_tid]),
51  _second_phi_zero(_c_fe_problem._second_phi_zero[_c_tid]),
52  _vector_zero(_c_fe_problem._vector_zero[_c_tid]),
53  _vector_curl_zero(_c_fe_problem._vector_curl_zero[_c_tid]),
54  _coupleable_neighbor(_c_parameters.have_parameter<bool>("_neighbor")
55  ? _c_parameters.get<bool>("_neighbor")
56  : false),
57  _coupleable_max_qps(Moose::constMaxQpsPerElem),
58  _is_fv(is_fv),
59  _obj(moose_object),
60  _writable_coupled_variables(libMesh::n_threads())
61 {
62  SubProblem & problem = *_c_parameters.getCheckedPointerParam<SubProblem *>("_subproblem");
64 
65  unsigned int optional_var_index_counter = 0;
66 
67  // Coupling
68  for (auto iter = _c_parameters.coupledVarsBegin(); iter != _c_parameters.coupledVarsEnd(); ++iter)
69  {
70  std::string name = *iter;
71 
72  std::vector<std::string> vars = _c_parameters.getVecMooseType(name);
73  if (vars.size() > 0)
74  {
75  for (const auto & coupled_var_name : vars)
76  {
77  if (problem.hasVariable(coupled_var_name))
78  {
79  MooseVariableFieldBase * moose_var =
80  &problem.getVariable(_c_tid,
81  coupled_var_name,
84  _coupled_vars[name].push_back(moose_var);
85  _coupled_moose_vars.push_back(moose_var);
86  if (auto * tmp_var = dynamic_cast<MooseVariable *>(moose_var))
87  _coupled_standard_moose_vars.push_back(tmp_var);
88  else if (auto * tmp_var = dynamic_cast<VectorMooseVariable *>(moose_var))
89  _coupled_vector_moose_vars.push_back(tmp_var);
90  else if (auto * tmp_var = dynamic_cast<ArrayMooseVariable *>(moose_var))
91  _coupled_array_moose_vars.push_back(tmp_var);
92  else if (auto * tmp_var = dynamic_cast<MooseVariableFV<Real> *>(moose_var))
93  {
94  // We are using a finite volume variable through add*CoupledVar as opposed to getFunctor
95  // so we can be reasonably confident that the variable values will be obtained using
96  // traditional pre-evaluation and quadrature point indexing
97  tmp_var->requireQpComputations();
98  _coupled_fv_moose_vars.push_back(tmp_var);
99  }
100  else if (auto * tmp_var = dynamic_cast<MooseLinearVariableFV<Real> *>(moose_var))
101  _coupled_fv_moose_vars.push_back(tmp_var);
102  else
103  _obj->paramError(name, "provided c++ type for variable parameter is not supported");
104  }
105  else if (problem.hasScalarVariable(coupled_var_name))
106  {
107  MooseVariableScalar * moose_scalar_var =
108  &problem.getScalarVariable(_c_tid, coupled_var_name);
109  _c_coupled_scalar_vars[name].push_back(moose_scalar_var);
110  }
111  else
112  _obj->paramError(name, "coupled variable '", coupled_var_name, "' was not found");
113  }
114  }
115  else // This means it was optional coupling. Let's assign a unique id to this variable
116  {
118  for (unsigned int j = 0; j < _optional_var_index[name].size(); ++j)
120  std::numeric_limits<unsigned int>::max() - optional_var_index_counter;
121  ++optional_var_index_counter;
122  }
123  }
124 }
125 
126 #ifdef MOOSE_KOKKOS_ENABLED
128  : _c_parameters(object._c_parameters),
129  _c_name(object._c_name),
130  _c_type(object._c_type),
131  _c_fe_problem(object._c_fe_problem),
132  _c_sys(object._c_sys),
133  _new_to_deprecated_coupled_vars(object._new_to_deprecated_coupled_vars),
134  _c_nodal(object._c_nodal),
135  _c_is_implicit(object._c_is_implicit),
136  _c_allow_element_to_nodal_coupling(object._c_allow_element_to_nodal_coupling),
137  _c_tid(object._c_tid),
138  _zero(object._zero),
139  _phi_zero(object._phi_zero),
140  _ad_zero(object._ad_zero),
141  _grad_zero(object._grad_zero),
142  _ad_grad_zero(object._ad_grad_zero),
143  _grad_phi_zero(object._grad_phi_zero),
144  _second_zero(object._second_zero),
145  _ad_second_zero(object._ad_second_zero),
146  _second_phi_zero(object._second_phi_zero),
147  _vector_zero(object._vector_zero),
148  _vector_curl_zero(object._vector_curl_zero),
149  _coupleable_neighbor(object._coupleable_neighbor),
150  _coupleable_max_qps(object._coupleable_max_qps),
151  _is_fv(object._is_fv),
152  _obj(object._obj),
153  _writable_coupled_variables(object._writable_coupled_variables)
154 {
155 }
156 #endif
157 
158 bool
159 Coupleable::isCoupled(const std::string & var_name_in, unsigned int i) const
160 {
161  const auto var_name = _c_parameters.checkForRename(var_name_in);
162 
163  auto it = _coupled_vars.find(var_name);
164  if (it != _coupled_vars.end())
165  return (i < it->second.size());
166  else
167  {
168  // Make sure the user originally requested this value in the InputParameter syntax
169  if (!_c_parameters.hasCoupledValue(var_name))
171  ": The coupled variable \"",
172  var_name,
173  "\" was never added to this object's "
174  "InputParameters, please double-check your "
175  "spelling");
176 
177  return false;
178  }
179 }
180 
181 bool
182 Coupleable::isCoupledConstant(const std::string & var_name) const
183 {
184  return _c_parameters.hasDefaultCoupledValue(var_name);
185 }
186 
187 unsigned int
188 Coupleable::coupledComponents(const std::string & var_name_in) const
189 {
190  const auto var_name = _c_parameters.checkForRename(var_name_in);
191 
192  if (isCoupled(var_name))
193  {
194  mooseAssert(_coupled_vars.find(var_name) != _coupled_vars.end(),
195  var_name << " must not actually be coupled!");
196  return _coupled_vars.at(var_name).size();
197  }
198  else
199  {
201  return _c_parameters.numberDefaultCoupledValues(var_name);
202  else
203  return 0;
204  }
205 }
206 
207 void
209  unsigned int comp,
210  unsigned int bound,
211  const std::string & var_name)
212 {
213  if (bound > 0 && comp >= bound)
214  obj->paramError(
215  var_name, "component ", comp, " is out of range for this variable (max ", bound - 1, ")");
216 }
217 
218 // calls to this must go *after* get[bla]Var calls and (checking for nullptr
219 // return). Because checkFuncType calls coupledCallback which should only be
220 // called if the variables was actually coupled.
221 void
222 Coupleable::checkFuncType(const std::string var_name, VarType t, FuncAge age) const
223 {
224  if (t == VarType::Gradient && _c_nodal)
225  mooseError(_c_name, ": nodal variables do not have gradients at nodes");
226 
227  if (age == FuncAge::Old || age == FuncAge::Older || t == VarType::GradientDot ||
228  t == VarType::Dot)
229  validateExecutionerType(var_name, "coupled[Vector][Gradient/Dot]Old[er]");
230  if (age == FuncAge::Older && !_c_is_implicit)
231  mooseError("object '",
232  _c_name,
233  "' uses older variable values that are unavailable with explicit schemes");
234 
235  coupledCallback(var_name, age == FuncAge::Old || age == FuncAge::Older);
236 }
237 
238 bool
239 Coupleable::checkVar(const std::string & var_name_in,
240  unsigned int comp,
241  unsigned int comp_bound) const
242 {
243  const auto var_name = _c_parameters.checkForRename(var_name_in);
244  auto it = _c_coupled_scalar_vars.find(var_name);
245  if (it != _c_coupled_scalar_vars.end())
246  {
247  std::string cvars;
248  for (auto jt : it->second)
249  cvars += " " + jt->name();
250 
251  _obj->paramError(var_name,
252  "cannot couple '",
253  var_name,
254  "' to a scalar variable (",
255  cvars,
256  ") where field variable is expected");
257  }
258 
259  if (!isCoupled(var_name, comp))
260  return false; // return false since variable is *not* coupled
261 
262  auto vars_vector_it = _coupled_vars.find(var_name);
263  if (vars_vector_it == _coupled_vars.end())
264  mooseError(_c_name, ": Trying to get a coupled var ", var_name, " that doesn't exist");
265 
266  const auto & vars_vector = vars_vector_it->second;
267 
268  auto bound = comp_bound ? comp_bound : vars_vector.size();
269  checkComponent(_obj, comp, bound, var_name);
270 
271  // We should know we have a variable now
272  const auto * var = vars_vector[comp];
273  if (!var)
274  mooseError(
275  _c_name,
276  ": We did all our checks for the existence of a var, yet we still don't have a var!?");
277 
278  // Only perform the following checks for objects that feed into residuals/Jacobians, e.g. objects
279  // that inherit from the TaggingInterface
280  if (_c_parameters.have_parameter<MultiMooseEnum>("vector_tags"))
281  {
282  // Are we attempting to couple to a non-FV var in an FV object?
283  if (!var->isFV() && _is_fv)
284  mooseError("Attempting to couple non-FV variable ",
285  var->name(),
286  " into an FV object ",
287  _c_name,
288  ". This is not currently supported");
289  }
290 
291  if (!(vars_vector[comp])->isNodal() && _c_nodal && !_c_allow_element_to_nodal_coupling)
292  mooseError(_c_name, ": cannot couple elemental variables into nodal objects");
293 
294  return true;
295 }
296 
298 Coupleable::getFEVar(const std::string & var_name, unsigned int comp) const
299 {
300  mooseDeprecated("Coupleable::getFEVar is deprecated. Please use Coupleable::getFieldVar instead. "
301  "Note that this method could potentially return a finite volume variable");
302  return getFieldVar(var_name, comp);
303 }
304 
306 Coupleable::getFieldVar(const std::string & var_name, unsigned int comp)
307 {
308  return getVarHelper<MooseVariableFieldBase>(var_name, comp);
309 }
310 
312 Coupleable::getFieldVar(const std::string & var_name, unsigned int comp) const
313 {
314  return getVarHelper<MooseVariableFieldBase>(var_name, comp);
315 }
316 
317 std::vector<const MooseVariableFieldBase *>
318 Coupleable::getFieldVars(const std::string & var_name) const
319 {
320  return getVarsHelper<MooseVariableFieldBase>(var_name);
321 }
322 
324 Coupleable::getVar(const std::string & var_name, unsigned int comp)
325 {
326  return const_cast<MooseVariable *>(getVarHelper<MooseVariable>(var_name, comp));
327 }
328 
330 Coupleable::getVectorVar(const std::string & var_name, unsigned int comp)
331 {
332  auto * const var =
333  const_cast<VectorMooseVariable *>(getVarHelper<VectorMooseVariable>(var_name, comp));
334 
335  if (_c_nodal && var && var->feType().family != LAGRANGE_VEC)
336  mooseError(_c_name, ": Only LAGRANGE_VEC vector variables are defined at nodes");
337 
338  return var;
339 }
340 
342 Coupleable::getArrayVar(const std::string & var_name, unsigned int comp)
343 {
344  return const_cast<ArrayMooseVariable *>(getVarHelper<ArrayMooseVariable>(var_name, comp));
345 }
346 
347 const MooseVariable *
348 Coupleable::getVar(const std::string & var_name, unsigned int comp) const
349 {
350  return getVarHelper<MooseVariable>(var_name, comp);
351 }
352 
353 const VectorMooseVariable *
354 Coupleable::getVectorVar(const std::string & var_name, unsigned int comp) const
355 {
356  const auto * const var = getVarHelper<VectorMooseVariable>(var_name, comp);
357 
358  if (_c_nodal && var && var->feType().family != LAGRANGE_VEC)
359  mooseError(_c_name, ": Only LAGRANGE_VEC vector variables are defined at nodes");
360 
361  return var;
362 }
363 
364 const ArrayMooseVariable *
365 Coupleable::getArrayVar(const std::string & var_name, unsigned int comp) const
366 {
367  return getVarHelper<ArrayMooseVariable>(var_name, comp);
368 }
369 
370 const VariableValue *
371 Coupleable::getDefaultValue(const std::string & var_name, unsigned int comp) const
372 {
373  // make sure we don't access values that were not provided
374  checkComponent(_obj, comp, _c_parameters.numberDefaultCoupledValues(var_name), var_name);
375 
376  auto default_value_it = _default_value.find(var_name);
377  if (default_value_it == _default_value.end())
378  {
379  _default_value[var_name].emplace_back(std::make_unique<VariableValue>(
381  for (unsigned int j = 1; j < _c_parameters.numberDefaultCoupledValues(var_name); ++j)
382  _default_value[var_name].emplace_back(std::make_unique<VariableValue>(
384  default_value_it = _default_value.find(var_name);
385  }
386 
387  const auto & default_value_vec = default_value_it->second;
388  const auto n_default_vals = default_value_vec.size();
389  if (comp >= n_default_vals)
390  mooseError("Requested comp ",
391  comp,
392  " is equal to or greater than the number of default values ",
393  n_default_vals);
394  return default_value_vec[comp].get();
395 }
396 
397 const VectorVariableValue *
398 Coupleable::getDefaultVectorValue(const std::string & var_name) const
399 {
400  auto default_value_it = _default_vector_value.find(var_name);
401  if (default_value_it == _default_vector_value.end())
402  {
403  auto value = std::make_unique<VectorVariableValue>(_coupleable_max_qps, 0);
404  bool already_warned = false;
405  for (unsigned int qp = 0; qp < _coupleable_max_qps; ++qp)
406  for (const auto i : make_range(Moose::dim))
407  {
408  try
409  {
410  (*value)[qp](i) = _c_parameters.defaultCoupledValue(var_name, i);
411  }
412  catch (const std::out_of_range &)
413  {
414  if (!already_warned)
415  mooseWarning(
416  "You supplied less than 3 arguments for the default vector value for variable ",
417  var_name,
418  ". Did you accidently leave something off? We are going to assign 0s, assuming "
419  "this "
420  "was intentional.");
421  already_warned = true;
422  (*value)[qp](i) = 0;
423  }
424  }
425  default_value_it =
426  _default_vector_value.insert(std::make_pair(var_name, std::move(value))).first;
427  }
428 
429  return default_value_it->second.get();
430 }
431 
432 const ArrayVariableValue *
433 Coupleable::getDefaultArrayValue(const std::string & var_name) const
434 {
435  auto default_value_it = _default_array_value.find(var_name);
436  if (default_value_it == _default_array_value.end())
437  {
438  auto value = std::make_unique<ArrayVariableValue>(_coupleable_max_qps);
439  for (unsigned int qp = 0; qp < _coupleable_max_qps; ++qp)
440  {
441  auto n = _c_parameters.numberDefaultCoupledValues(var_name);
442  (*value)[qp].resize(n);
443  for (unsigned int i = 0; i < n; ++i)
444  (*value)[qp](i) = _c_parameters.defaultCoupledValue(var_name, i);
445  }
446  default_value_it =
447  _default_array_value.insert(std::make_pair(var_name, std::move(value))).first;
448  }
449 
450  return default_value_it->second.get();
451 }
452 
453 template <typename T>
454 const T &
455 Coupleable::getDefaultNodalValue(const std::string & var_name, unsigned int comp) const
456 {
457  auto && default_variable_value = getDefaultValue(var_name, comp);
458  return *default_variable_value->data();
459 }
460 
461 template <>
462 const RealVectorValue &
463 Coupleable::getDefaultNodalValue<RealVectorValue>(const std::string & var_name, unsigned int) const
464 {
465  auto && default_variable_value = getDefaultVectorValue(var_name);
466  return *default_variable_value->data();
467 }
468 
469 template <>
470 const RealEigenVector &
471 Coupleable::getDefaultNodalValue<RealEigenVector>(const std::string & var_name, unsigned int) const
472 {
473  auto && default_variable_value = getDefaultArrayValue(var_name);
474  return *default_variable_value->data();
475 }
476 
477 unsigned int
478 Coupleable::coupled(const std::string & var_name, unsigned int comp) const
479 {
480  const auto * var = getFieldVar(var_name, comp);
481  if (!var)
482  {
483  mooseAssert(_optional_var_index.find(var_name) != _optional_var_index.end(),
484  "optional var index for " << var_name << " does not exist!");
485  // make sure we don't try to access default var ids that were not provided
486  checkComponent(_obj, comp, _optional_var_index.at(var_name).size(), var_name);
487  return _optional_var_index.at(var_name)[comp];
488  }
490 
491  if (var->kind() == Moose::VAR_SOLVER &&
492  // are we not an object that feeds into the nonlinear system?
493  (!_c_sys || _c_sys->varKind() != Moose::VAR_SOLVER ||
494  // are we an object that impacts the nonlinear system and this variable is within our
495  // nonlinear system?
496  var->sys().number() == _c_sys->number()))
497  return var->number();
498  else
499  // Avoid registering coupling to variables outside of our system (e.g. avoid potentially
500  // creating bad Jacobians)
501  return std::numeric_limits<unsigned int>::max() - var->number();
502 }
503 
504 template <>
506 Coupleable::coupledGenericValue<false>(const std::string & var_name, unsigned int comp) const
507 {
508  return coupledValue(var_name, comp);
509 }
510 
511 template <>
513 Coupleable::coupledGenericValue<true>(const std::string & var_name, unsigned int comp) const
514 {
515  return adCoupledValue(var_name, comp);
516 }
517 
518 template <>
520 Coupleable::coupledGenericVectorValue<false>(const std::string & var_name, unsigned int comp) const
521 {
522  return coupledVectorValue(var_name, comp);
523 }
524 
525 template <>
527 Coupleable::coupledGenericVectorValue<true>(const std::string & var_name, unsigned int comp) const
528 {
529  return adCoupledVectorValue(var_name, comp);
530 }
531 
532 const VariableValue &
533 Coupleable::coupledValue(const std::string & var_name, unsigned int comp) const
534 {
535  const auto * const var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
536  if (!var)
537  return *getDefaultValue(var_name, comp);
539 
541  {
542  if (_c_nodal)
543  return (_c_is_implicit) ? var->dofValues() : var->dofValuesOld();
544  else
545  return (_c_is_implicit) ? var->sln() : var->slnOld();
546  }
547  else
548  {
549  if (_c_nodal)
550  return (_c_is_implicit) ? var->dofValuesNeighbor() : var->dofValuesOldNeighbor();
551  else
552  return (_c_is_implicit) ? var->slnNeighbor() : var->slnOldNeighbor();
553  }
554 }
555 
556 template <typename T>
557 const typename OutputTools<T>::VariableValue &
558 Coupleable::vectorTagValueHelper(const std::string & var_names,
559  const TagID tag,
560  const unsigned int index) const
561 {
562  const auto * const var = getVarHelper<MooseVariableField<T>>(var_names, index);
563  if (!var)
564  mooseError(var_names, ": invalid variable name for coupledVectorTagValue");
566 
567  if (!_c_fe_problem.vectorTagExists(tag))
568  mooseError("Attempting to couple to vector tag with ID ",
569  tag,
570  "in ",
571  _c_name,
572  ", but a vector tag with that ID does not exist");
573 
574  const_cast<Coupleable *>(this)->addFEVariableCoupleableVectorTag(tag);
575 
576  if (_c_nodal)
577  return var->nodalVectorTagValue(tag);
578  else
579  return var->vectorTagValue(tag);
580 }
581 
582 template <typename T>
583 void
584 Coupleable::requestStates(const std::string & var_name,
585  const TagName & tag_name,
586  const unsigned int comp)
587 {
588  auto var =
589  const_cast<MooseVariableField<T> *>(getVarHelper<MooseVariableField<T>>(var_name, comp));
590  if (!var)
591  mooseError(var_name, ": invalid variable name for tag coupling");
592 
593  auto & var_sys = var->sys();
594  if (tag_name == Moose::OLD_SOLUTION_TAG)
595  var_sys.needSolutionState(1);
596  else if (tag_name == Moose::OLDER_SOLUTION_TAG)
597  var_sys.needSolutionState(2);
598 }
599 
600 template <typename T>
601 const typename OutputTools<T>::VariableValue &
602 Coupleable::vectorTagValueHelper(const std::string & var_names,
603  const std::string & tag_param_name,
604  const unsigned int index) const
605 {
606  if (!_c_parameters.isParamValid(tag_param_name))
607  mooseError("Tag name parameter '", tag_param_name, "' is invalid");
608 
609  const TagName tag_name = MooseUtils::toUpper(_c_parameters.get<TagName>(tag_param_name));
610 
611  const bool older_state_tag = _older_state_tags.count(tag_name);
612  if (older_state_tag)
613  // We may need to add solution states and create vector tags
614  const_cast<Coupleable *>(this)->requestStates<T>(var_names, tag_name, index);
615 
616  if (!_c_fe_problem.vectorTagExists(tag_name))
617  mooseError("Tagged vector with tag name '", tag_name, "' does not exist");
618 
619  TagID tag = _c_fe_problem.getVectorTagID(tag_name);
620  return vectorTagValueHelper<T>(var_names, tag, index);
621 }
622 
623 template <>
625 Coupleable::coupledGenericDofValue<false>(const std::string & var_name, unsigned int comp) const
626 {
627  return coupledDofValues(var_name, comp);
628 }
629 
630 template <>
632 Coupleable::coupledGenericDofValue<true>(const std::string & var_name, unsigned int comp) const
633 {
634  return adCoupledDofValues(var_name, comp);
635 }
636 
637 const VariableValue &
638 Coupleable::coupledValueLower(const std::string & var_name, const unsigned int comp) const
639 {
640  const auto * var = getVar(var_name, comp);
641  if (!var)
642  return *getDefaultValue(var_name, comp);
644 
646  mooseError(_c_name, ":coupledValueLower cannot be called in a coupleable neighbor object");
647 
648  if (_c_nodal)
649  return (_c_is_implicit) ? var->dofValues() : var->dofValuesOld();
650  else
651  return (_c_is_implicit) ? var->slnLower() : var->slnLowerOld();
652 }
653 
654 const VariableValue &
655 Coupleable::coupledVectorTagValue(const std::string & var_names,
656  TagID tag,
657  unsigned int index) const
658 {
659  return vectorTagValueHelper<Real>(var_names, tag, index);
660 }
661 
662 const VariableValue &
663 Coupleable::coupledVectorTagValue(const std::string & var_names,
664  const std::string & tag_name,
665  unsigned int index) const
666 {
667  return vectorTagValueHelper<Real>(var_names, tag_name, index);
668 }
669 
670 const ArrayVariableValue &
671 Coupleable::coupledVectorTagArrayValue(const std::string & var_names,
672  TagID tag,
673  unsigned int index) const
674 {
675  return vectorTagValueHelper<RealEigenVector>(var_names, tag, index);
676 }
677 
678 const ArrayVariableValue &
679 Coupleable::coupledVectorTagArrayValue(const std::string & var_names,
680  const std::string & tag_name,
681  unsigned int index) const
682 {
683  return vectorTagValueHelper<RealEigenVector>(var_names, tag_name, index);
684 }
685 
686 const VariableGradient &
687 Coupleable::coupledVectorTagGradient(const std::string & var_names,
688  TagID tag,
689  unsigned int index) const
690 {
691  const auto * var = getVar(var_names, index);
692  if (!var)
693  mooseError(var_names, ": invalid variable name for coupledVectorTagGradient");
695 
696  if (!_c_fe_problem.vectorTagExists(tag))
697  mooseError("Attempting to couple to vector tag with ID ",
698  tag,
699  "in ",
700  _c_name,
701  ", but a vector tag with that ID does not exist");
702 
703  const_cast<Coupleable *>(this)->addFEVariableCoupleableVectorTag(tag);
704 
705  return var->vectorTagGradient(tag);
706 }
707 
708 const VariableGradient &
709 Coupleable::coupledVectorTagGradient(const std::string & var_names,
710  const std::string & tag_name,
711  unsigned int index) const
712 {
713  if (!_c_parameters.isParamValid(tag_name))
714  mooseError("Tag name parameter '", tag_name, "' is invalid");
715 
716  TagName tagname = _c_parameters.get<TagName>(tag_name);
717  if (!_c_fe_problem.vectorTagExists(tagname))
718  mooseError("Tagged vector with tag name '", tagname, "' does not exist");
719 
720  TagID tag = _c_fe_problem.getVectorTagID(tagname);
721  return coupledVectorTagGradient(var_names, tag, index);
722 }
723 
724 const ArrayVariableGradient &
725 Coupleable::coupledVectorTagArrayGradient(const std::string & var_names,
726  TagID tag,
727  unsigned int index) const
728 {
729  const auto * var = getArrayVar(var_names, index);
730  if (!var)
731  mooseError(var_names, ": invalid variable name for coupledVectorTagArrayGradient");
733 
734  if (!_c_fe_problem.vectorTagExists(tag))
735  mooseError("Attempting to couple to vector tag with ID ",
736  tag,
737  "in ",
738  _c_name,
739  ", but a vector tag with that ID does not exist");
740 
741  const_cast<Coupleable *>(this)->addFEVariableCoupleableVectorTag(tag);
742 
743  return var->vectorTagGradient(tag);
744 }
745 
746 const ArrayVariableGradient &
747 Coupleable::coupledVectorTagArrayGradient(const std::string & var_names,
748  const std::string & tag_name,
749  unsigned int index) const
750 {
751  if (!_c_parameters.isParamValid(tag_name))
752  mooseError("Tag name parameter '", tag_name, "' is invalid");
753 
754  TagName tagname = _c_parameters.get<TagName>(tag_name);
755  if (!_c_fe_problem.vectorTagExists(tagname))
756  mooseError("Tagged vector with tag name '", tagname, "' does not exist");
757 
758  TagID tag = _c_fe_problem.getVectorTagID(tagname);
759  return coupledVectorTagArrayGradient(var_names, tag, index);
760 }
761 
762 template <typename T>
763 const typename OutputTools<T>::VariableValue &
764 Coupleable::vectorTagDofValueHelper(const std::string & var_name,
765  const TagID tag,
766  const unsigned int comp) const
767 {
768  const auto * var = getVarHelper<MooseVariableField<T>>(var_name, comp);
769  if (!var)
770  mooseError(var_name, ": invalid variable name for coupledVectorTagDofValue");
772 
773  const_cast<Coupleable *>(this)->addFEVariableCoupleableVectorTag(tag);
774 
775  return var->vectorTagDofValue(tag);
776 }
777 
778 template <typename T>
779 const typename OutputTools<T>::VariableValue &
780 Coupleable::vectorTagDofValueHelper(const std::string & var_name,
781  const std::string & tag_param_name,
782  const unsigned int comp) const
783 {
784  if (!_c_parameters.isParamValid(tag_param_name))
785  mooseError("Tag name parameter '", tag_param_name, "' is invalid");
786 
787  const TagName tag_name = MooseUtils::toUpper(_c_parameters.get<TagName>(tag_param_name));
788 
789  const bool older_state_tag = _older_state_tags.count(tag_name);
790  if (older_state_tag)
791  // We may need to add solution states and create vector tags
792  const_cast<Coupleable *>(this)->requestStates<T>(var_name, tag_name, comp);
793 
794  if (!_c_fe_problem.vectorTagExists(tag_name))
795  mooseError("Tagged vector with tag name '", tag_name, "' does not exist");
796 
797  TagID tag = _c_fe_problem.getVectorTagID(tag_name);
798 
799  return vectorTagDofValueHelper<T>(var_name, tag, comp);
800 }
801 
802 const VariableValue &
803 Coupleable::coupledVectorTagDofValue(const std::string & var_name,
804  TagID tag,
805  unsigned int comp) const
806 {
807  return vectorTagDofValueHelper<Real>(var_name, tag, comp);
808 }
809 
810 const VariableValue &
811 Coupleable::coupledVectorTagDofValue(const std::string & var_name,
812  const std::string & tag_name,
813  unsigned int comp) const
814 {
815  return vectorTagDofValueHelper<Real>(var_name, tag_name, comp);
816 }
817 
818 const ArrayVariableValue &
819 Coupleable::coupledVectorTagArrayDofValue(const std::string & var_name,
820  const std::string & tag_name,
821  unsigned int comp) const
822 {
823  return vectorTagDofValueHelper<RealEigenVector>(var_name, tag_name, comp);
824 }
825 
826 const VariableValue &
827 Coupleable::coupledMatrixTagValue(const std::string & var_names,
828  TagID tag,
829  unsigned int index) const
830 {
831  const auto * var = getVarHelper<MooseVariableField<Real>>(var_names, index);
832  if (!var)
833  mooseError(var_names, ": invalid variable name for coupledMatrixTagValue");
835 
836  const_cast<Coupleable *>(this)->addFEVariableCoupleableMatrixTag(tag);
837 
838  if (_c_nodal)
839  return var->nodalMatrixTagValue(tag);
840  return var->matrixTagValue(tag);
841 }
842 
843 const VariableValue &
844 Coupleable::coupledMatrixTagValue(const std::string & var_names,
845  const std::string & tag_name,
846  unsigned int index) const
847 {
848  if (!_c_parameters.isParamValid(tag_name))
849  mooseError("Tag name parameter '", tag_name, "' is invalid");
850 
851  TagName tagname = _c_parameters.get<TagName>(tag_name);
852  if (!_c_fe_problem.matrixTagExists(tagname))
853  mooseError("Matrix tag name '", tagname, "' does not exist");
854 
855  TagID tag = _c_fe_problem.getMatrixTagID(tagname);
856  return coupledMatrixTagValue(var_names, tag, index);
857 }
858 
859 const VectorVariableValue &
860 Coupleable::coupledVectorValue(const std::string & var_name, unsigned int comp) const
861 {
862  const auto * var = getVectorVar(var_name, comp);
863  if (!var)
864  return *getDefaultVectorValue(var_name);
866 
868  {
869  if (_c_nodal)
870  return _c_is_implicit ? var->nodalValueArray() : var->nodalValueOldArray();
871  else
872  return _c_is_implicit ? var->sln() : var->slnOld();
873  }
874  else
875  {
876  if (_c_nodal)
877  // Since this is at a node, I don't feel like there should be any "neighbor" logic
878  return _c_is_implicit ? var->nodalValueArray() : var->nodalValueOldArray();
879  else
880  return _c_is_implicit ? var->slnNeighbor() : var->slnOldNeighbor();
881  }
882 }
883 
884 const ArrayVariableValue &
885 Coupleable::coupledArrayValue(const std::string & var_name, unsigned int comp) const
886 {
887  const auto * var = getArrayVar(var_name, comp);
888  if (!var)
889  return *getDefaultArrayValue(var_name);
891 
893  {
894  if (_c_nodal)
895  return (_c_is_implicit) ? var->dofValues() : var->dofValuesOld();
896  return (_c_is_implicit) ? var->sln() : var->slnOld();
897  }
898  else
899  {
900  if (_c_nodal)
901  return (_c_is_implicit) ? var->dofValuesNeighbor() : var->dofValuesOldNeighbor();
902  return (_c_is_implicit) ? var->slnNeighbor() : var->slnOldNeighbor();
903  }
904 }
905 
906 std::vector<const ArrayVariableValue *>
907 Coupleable::coupledArrayValues(const std::string & var_name) const
908 {
909  auto func = [this, &var_name](unsigned int comp) { return &coupledArrayValue(var_name, comp); };
910  return coupledVectorHelper<const ArrayVariableValue *>(var_name, func);
911 }
912 
914 Coupleable::writableVariable(const std::string & var_name, unsigned int comp)
915 {
916  auto * var = getVarHelper<MooseWritableVariable>(var_name, comp);
917 
918  const auto * aux = dynamic_cast<const AuxKernel *>(this);
919  const auto * euo = dynamic_cast<const ElementUserObject *>(this);
920  const auto * nuo = dynamic_cast<const NodalUserObject *>(this);
921  const auto * nfc = dynamic_cast<const NodeFaceConstraint *>(this);
922  const auto * nec = dynamic_cast<const NodeElemConstraintBase *>(this);
923 
924  if (!aux && !euo && !nuo && !nfc && !nec)
925  mooseError("writableVariable() can only be called from AuxKernels, ElementUserObjects, "
926  "NodalUserObjects, NodeFaceConstraints, or NodeElemConstraints. '",
927  _obj->name(),
928  "' is none of those.");
929 
930  if (aux && !aux->isNodal() && var->isNodal())
931  mooseError("The elemental AuxKernel '",
932  _obj->name(),
933  "' cannot obtain a writable reference to the nodal variable '",
934  var->name(),
935  "'.");
936  if (euo && var->isNodal())
937  mooseError("The ElementUserObject '",
938  _obj->name(),
939  "' cannot obtain a writable reference to the nodal variable '",
940  var->name(),
941  "'.");
942 
943  // make sure only one object can access a variable
944  checkWritableVar(var);
945 
946  return *var;
947 }
948 
950 Coupleable::writableCoupledValue(const std::string & var_name, unsigned int comp)
951 {
952  mooseDeprecated("Coupleable::writableCoupledValue is deprecated, please use "
953  "Coupleable::writableVariable instead. ");
954 
955  // check if the variable exists
956  auto * const var = getVar(var_name, comp);
957  if (!var)
958  mooseError(
959  "Unable to create a writable reference for '", var_name, "', is it a constant expression?");
960 
961  // is the requested variable an AuxiliaryVariable?
962  if (!_c_fe_problem.getAuxiliarySystem().hasVariable(var->name()))
963  mooseError(
964  "'", var->name(), "' must be an auxiliary variable in Coupleable::writableCoupledValue");
965 
966  // check that the variable type (elemental/nodal) is compatible with the object type
967  const auto * aux = dynamic_cast<const AuxKernel *>(this);
968 
969  if (!aux)
970  mooseError("writableCoupledValue() can only be called from AuxKernels, but '",
971  _obj->name(),
972  "' is not an AuxKernel.");
973 
974  if (!aux->isNodal() && var->isNodal())
975  mooseError("The elemental AuxKernel '",
976  _obj->name(),
977  "' cannot obtain a writable reference to the nodal variable '",
978  var->name(),
979  "'.");
980 
981  // make sure only one object can access a variable
982  checkWritableVar(var);
983 
984  return const_cast<VariableValue &>(coupledValue(var_name, comp));
985 }
986 
987 void
989 {
990  // check domain restrictions for compatibility
991  const auto * br = dynamic_cast<const BlockRestrictable *>(this);
992  const auto * nfc = dynamic_cast<const NodeFaceConstraint *>(this);
993 
994  if (br && !var->hasBlocks(br->blockIDs()))
995  mooseError("The variable '",
996  var->name(),
997  "' must be defined on all blocks '",
998  _obj->name(),
999  "' is defined on.");
1000 
1001  if (nfc && !var->hasBlocks(nfc->getSecondaryConnectedBlocks()))
1002  mooseError("The variable '",
1003  var->name(),
1004  " must be defined on all blocks '",
1005  _obj->name(),
1006  "'s secondary surface is defined on.");
1007 
1008  // make sure only one object can access a variable
1009  for (const auto & ci : _obj->getMooseApp().getInterfaceObjects<Coupleable>())
1010  if (ci != this && ci->_writable_coupled_variables[_c_tid].count(var))
1011  {
1012  // if both this and ci are block restrictable then we check if the block restrictions
1013  // are not overlapping. If they don't we permit the call.
1014  const auto * br_other = dynamic_cast<const BlockRestrictable *>(ci);
1015  if (br && br_other && br->blockRestricted() && br_other->blockRestricted() &&
1016  !MooseUtils::setsIntersect(br->blockIDs(), br_other->blockIDs()))
1017  continue;
1018  else if (nfc)
1019  continue;
1020 
1021  mooseError("'",
1022  ci->_obj->name(),
1023  "' already obtained a writable reference to '",
1024  var->name(),
1025  "'. Only one object can obtain such a reference per variable and subdomain in a "
1026  "simulation.");
1027  }
1028 
1029  // var is unique across threads, so we could forego having a separate set per thread, but we
1030  // need quick access to the list of all variables that need to be inserted into the solution
1031  // vector by a given thread.
1032 
1033  _writable_coupled_variables[_c_tid].insert(var);
1034 }
1035 
1036 const VariableValue &
1037 Coupleable::coupledValueOld(const std::string & var_name, unsigned int comp) const
1038 {
1039  const auto * var = getVar(var_name, comp);
1040  if (!var)
1041  return *getDefaultValue(var_name, comp);
1043 
1044  if (!_coupleable_neighbor)
1045  {
1046  if (_c_nodal)
1047  return (_c_is_implicit) ? var->dofValuesOld() : var->dofValuesOlder();
1048  return (_c_is_implicit) ? var->slnOld() : var->slnOlder();
1049  }
1050  else
1051  {
1052  if (_c_nodal)
1053  return (_c_is_implicit) ? var->dofValuesOldNeighbor() : var->dofValuesOlderNeighbor();
1054  return (_c_is_implicit) ? var->slnOldNeighbor() : var->slnOlderNeighbor();
1055  }
1056 }
1057 
1058 const VariableValue &
1059 Coupleable::coupledValueOlder(const std::string & var_name, unsigned int comp) const
1060 {
1061  const auto * var = getVar(var_name, comp);
1062  if (!var)
1063  return *getDefaultValue(var_name, comp);
1065 
1066  if (!_coupleable_neighbor)
1067  {
1068  if (_c_nodal)
1069  return var->dofValuesOlder();
1070  return var->slnOlder();
1071  }
1072  else
1073  {
1074  if (_c_nodal)
1075  return var->dofValuesOlderNeighbor();
1076  return var->slnOlderNeighbor();
1077  }
1078 }
1079 
1080 const VariableValue &
1081 Coupleable::coupledValuePreviousNL(const std::string & var_name, unsigned int comp) const
1082 {
1083  const auto * var = getVar(var_name, comp);
1084  if (!var)
1085  return *getDefaultValue(var_name, comp);
1087 
1089  if (!_coupleable_neighbor)
1090  {
1091  if (_c_nodal)
1092  return var->dofValuesPreviousNL();
1093  return var->slnPreviousNL();
1094  }
1095  else
1096  {
1097  if (_c_nodal)
1098  return var->dofValuesPreviousNLNeighbor();
1099  return var->slnPreviousNLNeighbor();
1100  }
1101 }
1102 
1103 const VectorVariableValue &
1104 Coupleable::coupledVectorValueOld(const std::string & var_name, unsigned int comp) const
1105 {
1106  const auto * var = getVectorVar(var_name, comp);
1107  if (!var)
1108  return *getDefaultVectorValue(var_name);
1110 
1111  if (_c_nodal)
1112  return (_c_is_implicit) ? var->nodalValueOldArray() : var->nodalValueOlderArray();
1113  if (!_coupleable_neighbor)
1114  return (_c_is_implicit) ? var->slnOld() : var->slnOlder();
1115  return (_c_is_implicit) ? var->slnOldNeighbor() : var->slnOlderNeighbor();
1116 }
1117 
1118 const VectorVariableValue &
1119 Coupleable::coupledVectorValueOlder(const std::string & var_name, unsigned int comp) const
1120 {
1121  const auto * var = getVectorVar(var_name, comp);
1122  if (!var)
1123  return *getDefaultVectorValue(var_name);
1125 
1126  if (!_coupleable_neighbor)
1127  return var->slnOlder();
1128  return var->slnOlderNeighbor();
1129 }
1130 
1131 const ArrayVariableValue &
1132 Coupleable::coupledArrayValueOld(const std::string & var_name, unsigned int comp) const
1133 {
1134  const auto * var = getArrayVar(var_name, comp);
1135  if (!var)
1136  return *getDefaultArrayValue(var_name);
1138 
1139  if (!_coupleable_neighbor)
1140  {
1141  if (_c_nodal)
1142  return (_c_is_implicit) ? var->dofValuesOld() : var->dofValuesOlder();
1143  return (_c_is_implicit) ? var->slnOld() : var->slnOlder();
1144  }
1145  else
1146  {
1147  if (_c_nodal)
1148  return (_c_is_implicit) ? var->dofValuesOldNeighbor() : var->dofValuesOlderNeighbor();
1149  return (_c_is_implicit) ? var->slnOldNeighbor() : var->slnOlderNeighbor();
1150  }
1151 }
1152 
1153 const ArrayVariableValue &
1154 Coupleable::coupledArrayValueOlder(const std::string & var_name, unsigned int comp) const
1155 {
1156  const auto * var = getArrayVar(var_name, comp);
1157  if (!var)
1158  return *getDefaultArrayValue(var_name);
1160 
1161  if (!_coupleable_neighbor)
1162  {
1163  if (_c_nodal)
1164  return var->dofValuesOlder();
1165  return var->slnOlder();
1166  }
1167  else
1168  {
1169  if (_c_nodal)
1170  return var->dofValuesOlderNeighbor();
1171  return var->slnOlderNeighbor();
1172  }
1173 }
1174 
1175 const VariableValue &
1176 Coupleable::coupledDot(const std::string & var_name, unsigned int comp) const
1177 {
1178  const auto * var = getVar(var_name, comp);
1179  if (!var)
1180  {
1182  return _default_value_zero;
1183  }
1185 
1186  if (!_coupleable_neighbor)
1187  {
1188  if (_c_nodal)
1189  return var->dofValuesDot();
1190  return var->uDot();
1191  }
1192  else
1193  {
1194  if (_c_nodal)
1195  return var->dofValuesDotNeighbor();
1196  return var->uDotNeighbor();
1197  }
1198 }
1199 
1200 const VariableValue &
1201 Coupleable::coupledDotDot(const std::string & var_name, unsigned int comp) const
1202 {
1203  const auto * var = getVar(var_name, comp);
1204  if (!var)
1205  {
1207  return _default_value_zero;
1208  }
1210 
1211  if (!_coupleable_neighbor)
1212  {
1213  if (_c_nodal)
1214  return var->dofValuesDotDot();
1215  return var->uDotDot();
1216  }
1217  else
1218  {
1219  if (_c_nodal)
1220  return var->dofValuesDotDotNeighbor();
1221  return var->uDotDotNeighbor();
1222  }
1223 }
1224 
1225 template <>
1227 Coupleable::coupledGenericDotDot<false>(const std::string & var_name, unsigned int comp) const
1228 {
1229  return coupledDotDot(var_name, comp);
1230 }
1231 
1232 template <>
1234 Coupleable::coupledGenericDotDot<true>(const std::string & var_name, unsigned int comp) const
1235 {
1236  return adCoupledDotDot(var_name, comp);
1237 }
1238 
1239 const VariableValue &
1240 Coupleable::coupledDotOld(const std::string & var_name, unsigned int comp) const
1241 {
1242  const auto * var = getVar(var_name, comp);
1243  if (!var)
1244  {
1246  return _default_value_zero;
1247  }
1249 
1250  if (!_coupleable_neighbor)
1251  {
1252  if (_c_nodal)
1253  return var->dofValuesDotOld();
1254  return var->uDotOld();
1255  }
1256  else
1257  {
1258  if (_c_nodal)
1259  return var->dofValuesDotOldNeighbor();
1260  return var->uDotOldNeighbor();
1261  }
1262 }
1263 
1264 const VariableValue &
1265 Coupleable::coupledDotDotOld(const std::string & var_name, unsigned int comp) const
1266 {
1267  const auto * var = getVar(var_name, comp);
1268  if (!var)
1269  {
1271  return _default_value_zero;
1272  }
1274 
1275  if (!_coupleable_neighbor)
1276  {
1277  if (_c_nodal)
1278  return var->dofValuesDotDotOld();
1279  return var->uDotDotOld();
1280  }
1281  else
1282  {
1283  if (_c_nodal)
1284  return var->dofValuesDotDotOldNeighbor();
1285  return var->uDotDotOldNeighbor();
1286  }
1287 }
1288 
1289 const VectorVariableValue &
1290 Coupleable::coupledVectorDot(const std::string & var_name, unsigned int comp) const
1291 {
1292  const auto * var = getVectorVar(var_name, comp);
1293  if (!var)
1294  {
1297  }
1299 
1300  if (!_coupleable_neighbor)
1301  return var->uDot();
1302  return var->uDotNeighbor();
1303 }
1304 
1305 const VectorVariableValue &
1306 Coupleable::coupledVectorDotDot(const std::string & var_name, unsigned int comp) const
1307 {
1308  const auto * var = getVectorVar(var_name, comp);
1309  if (!var)
1310  {
1313  }
1315 
1316  if (!_coupleable_neighbor)
1317  return var->uDotDot();
1318  return var->uDotDotNeighbor();
1319 }
1320 
1321 const VectorVariableValue &
1322 Coupleable::coupledVectorDotOld(const std::string & var_name, unsigned int comp) const
1323 {
1324  const auto * var = getVectorVar(var_name, comp);
1325  if (!var)
1326  {
1329  }
1331 
1332  if (!_coupleable_neighbor)
1333  return var->uDotOld();
1334  return var->uDotOldNeighbor();
1335 }
1336 
1337 const VectorVariableValue &
1338 Coupleable::coupledVectorDotDotOld(const std::string & var_name, unsigned int comp) const
1339 {
1340  const auto * var = getVectorVar(var_name, comp);
1341  if (!var)
1342  {
1345  }
1347 
1348  if (!_coupleable_neighbor)
1349  return var->uDotDotOld();
1350  return var->uDotDotOldNeighbor();
1351 }
1352 
1353 const VariableValue &
1354 Coupleable::coupledVectorDotDu(const std::string & var_name, unsigned int comp) const
1355 {
1356  const auto * var = getVectorVar(var_name, comp);
1357  if (!var)
1358  {
1360  return _default_value_zero;
1361  }
1363 
1364  if (!_coupleable_neighbor)
1365  return var->duDotDu();
1366  return var->duDotDuNeighbor();
1367 }
1368 
1369 const VariableValue &
1370 Coupleable::coupledVectorDotDotDu(const std::string & var_name, unsigned int comp) const
1371 {
1372  const auto * var = getVectorVar(var_name, comp);
1373  if (!var)
1374  {
1376  return _default_value_zero;
1377  }
1379 
1380  if (!_coupleable_neighbor)
1381  return var->duDotDotDu();
1382  return var->duDotDotDuNeighbor();
1383 }
1384 
1385 const ArrayVariableValue &
1386 Coupleable::coupledArrayDot(const std::string & var_name, unsigned int comp) const
1387 {
1388  const auto * var = getArrayVar(var_name, comp);
1389  if (!var)
1392 
1393  if (!_coupleable_neighbor)
1394  {
1395  if (_c_nodal)
1396  return var->dofValuesDot();
1397  return var->uDot();
1398  }
1399  else
1400  {
1401  if (_c_nodal)
1402  return var->dofValuesDotNeighbor();
1403  return var->uDotNeighbor();
1404  }
1405 }
1406 
1407 const ArrayVariableValue &
1408 Coupleable::coupledArrayDotDot(const std::string & var_name, unsigned int comp) const
1409 {
1410  const auto * var = getArrayVar(var_name, comp);
1411  if (!var)
1414 
1415  if (!_coupleable_neighbor)
1416  {
1417  if (_c_nodal)
1418  return var->dofValuesDotDot();
1419  return var->uDotDot();
1420  }
1421  else
1422  {
1423  if (_c_nodal)
1424  return var->dofValuesDotDotNeighbor();
1425  return var->uDotDotNeighbor();
1426  }
1427 }
1428 
1429 const ArrayVariableValue &
1430 Coupleable::coupledArrayDotOld(const std::string & var_name, unsigned int comp) const
1431 {
1432  const auto * var = getArrayVar(var_name, comp);
1433  if (!var)
1436 
1437  if (!_coupleable_neighbor)
1438  {
1439  if (_c_nodal)
1440  return var->dofValuesDotOld();
1441  return var->uDotOld();
1442  }
1443  else
1444  {
1445  if (_c_nodal)
1446  return var->dofValuesDotOldNeighbor();
1447  return var->uDotOldNeighbor();
1448  }
1449 }
1450 
1451 const ArrayVariableValue &
1452 Coupleable::coupledArrayDotDotOld(const std::string & var_name, unsigned int comp) const
1453 {
1454  const auto * var = getArrayVar(var_name, comp);
1455  if (!var)
1458 
1459  if (!_coupleable_neighbor)
1460  {
1461  if (_c_nodal)
1462  return var->dofValuesDotDotOld();
1463  return var->uDotDotOld();
1464  }
1465  else
1466  {
1467  if (_c_nodal)
1468  return var->dofValuesDotDotOldNeighbor();
1469  return var->uDotDotOldNeighbor();
1470  }
1471 }
1472 
1473 const VariableValue &
1474 Coupleable::coupledDotDu(const std::string & var_name, unsigned int comp) const
1475 {
1476  const auto * var = getVar(var_name, comp);
1477  if (!var)
1478  {
1480  return _default_value_zero;
1481  }
1483 
1484  if (!_coupleable_neighbor)
1485  {
1486  if (_c_nodal)
1487  return var->dofValuesDuDotDu();
1488  return var->duDotDu();
1489  }
1490  else
1491  {
1492  if (_c_nodal)
1493  return var->dofValuesDuDotDuNeighbor();
1494  return var->duDotDuNeighbor();
1495  }
1496 }
1497 
1498 const VariableValue &
1499 Coupleable::coupledDotDotDu(const std::string & var_name, unsigned int comp) const
1500 {
1501  const auto * var = getVar(var_name, comp);
1502  if (!var)
1503  {
1505  return _default_value_zero;
1506  }
1508 
1509  if (!_coupleable_neighbor)
1510  {
1511  if (_c_nodal)
1512  return var->dofValuesDuDotDotDu();
1513  return var->duDotDotDu();
1514  }
1515  else
1516  {
1517  if (_c_nodal)
1518  return var->dofValuesDuDotDotDuNeighbor();
1519  return var->duDotDotDuNeighbor();
1520  }
1521 }
1522 
1523 const VariableValue &
1524 Coupleable::coupledArrayDotDu(const std::string & var_name, unsigned int comp) const
1525 {
1526  const auto * const var = getArrayVar(var_name, comp);
1527  if (!var)
1528  {
1530  return _default_value_zero;
1531  }
1533 
1534  if (!_coupleable_neighbor)
1535  {
1536  if (_c_nodal)
1537  return var->dofValuesDuDotDu();
1538  return var->duDotDu();
1539  }
1540  else
1541  {
1542  if (_c_nodal)
1543  return var->dofValuesDuDotDuNeighbor();
1544  return var->duDotDuNeighbor();
1545  }
1546 }
1547 
1548 const VariableGradient &
1549 Coupleable::coupledGradient(const std::string & var_name, unsigned int comp) const
1550 {
1551  const auto * const var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
1552  if (!var)
1553  {
1555  return _default_gradient;
1556  }
1558 
1559  if (!_coupleable_neighbor)
1560  return (_c_is_implicit) ? var->gradSln() : var->gradSlnOld();
1561  return (_c_is_implicit) ? var->gradSlnNeighbor() : var->gradSlnOldNeighbor();
1562 }
1563 
1564 const VariableGradient &
1565 Coupleable::coupledGradientOld(const std::string & var_name, unsigned int comp) const
1566 {
1567  const auto * var = getVar(var_name, comp);
1568  if (!var)
1569  {
1571  return _default_gradient;
1572  }
1574 
1575  if (!_coupleable_neighbor)
1576  return (_c_is_implicit) ? var->gradSlnOld() : var->gradSlnOlder();
1577  return (_c_is_implicit) ? var->gradSlnOldNeighbor() : var->gradSlnOlderNeighbor();
1578 }
1579 
1580 const VariableGradient &
1581 Coupleable::coupledGradientOlder(const std::string & var_name, unsigned int comp) const
1582 {
1583  const auto * var = getVar(var_name, comp);
1584  if (!var)
1585  {
1587  return _default_gradient;
1588  }
1590 
1591  if (!_coupleable_neighbor)
1592  return var->gradSlnOlder();
1593  return var->gradSlnOlderNeighbor();
1594 }
1595 
1596 const VariableGradient &
1597 Coupleable::coupledGradientPreviousNL(const std::string & var_name, unsigned int comp) const
1598 {
1599  const auto * var = getVar(var_name, comp);
1601  if (!var)
1602  {
1604  return _default_gradient;
1605  }
1607 
1608  if (!_coupleable_neighbor)
1609  return var->gradSlnPreviousNL();
1610  return var->gradSlnPreviousNLNeighbor();
1611 }
1612 
1613 const VariableGradient &
1614 Coupleable::coupledGradientDot(const std::string & var_name, unsigned int comp) const
1615 {
1616  const auto * var = getVar(var_name, comp);
1617  if (!var)
1618  {
1620  return _default_gradient;
1621  }
1623 
1624  if (!_coupleable_neighbor)
1625  return var->gradSlnDot();
1626  return var->gradSlnNeighborDot();
1627 }
1628 
1629 const VariableGradient &
1630 Coupleable::coupledGradientDotDot(const std::string & var_name, unsigned int comp) const
1631 {
1632  const auto * var = getVar(var_name, comp);
1633  if (!var)
1634  {
1636  return _default_gradient;
1637  }
1639 
1640  if (!_coupleable_neighbor)
1641  return var->gradSlnDotDot();
1642  return var->gradSlnNeighborDotDot();
1643 }
1644 
1645 const VectorVariableGradient &
1646 Coupleable::coupledVectorGradient(const std::string & var_name, unsigned int comp) const
1647 {
1648  const auto * var = getVectorVar(var_name, comp);
1649  if (!var)
1650  {
1652  return _default_vector_gradient;
1653  }
1655 
1656  if (!_coupleable_neighbor)
1657  return (_c_is_implicit) ? var->gradSln() : var->gradSlnOld();
1658  return (_c_is_implicit) ? var->gradSlnNeighbor() : var->gradSlnOldNeighbor();
1659 }
1660 
1661 const VectorVariableGradient &
1662 Coupleable::coupledVectorGradientOld(const std::string & var_name, unsigned int comp) const
1663 {
1664  const auto * var = getVectorVar(var_name, comp);
1665  if (!var)
1666  {
1668  return _default_vector_gradient;
1669  }
1671 
1672  if (!_coupleable_neighbor)
1673  return (_c_is_implicit) ? var->gradSlnOld() : var->gradSlnOlder();
1674  return (_c_is_implicit) ? var->gradSlnOldNeighbor() : var->gradSlnOlderNeighbor();
1675 }
1676 
1677 const VectorVariableGradient &
1678 Coupleable::coupledVectorGradientOlder(const std::string & var_name, unsigned int comp) const
1679 {
1680  const auto * var = getVectorVar(var_name, comp);
1681  if (!var)
1682  {
1684  return _default_vector_gradient;
1685  }
1687 
1688  if (!_coupleable_neighbor)
1689  return var->gradSlnOlder();
1690  return var->gradSlnOlderNeighbor();
1691 }
1692 
1693 const ArrayVariableGradient &
1694 Coupleable::coupledArrayGradient(const std::string & var_name, unsigned int comp) const
1695 {
1696  const auto * var = getArrayVar(var_name, comp);
1697  if (!var)
1698  return _default_array_gradient;
1700 
1701  if (!_coupleable_neighbor)
1702  return (_c_is_implicit) ? var->gradSln() : var->gradSlnOld();
1703  return (_c_is_implicit) ? var->gradSlnNeighbor() : var->gradSlnOldNeighbor();
1704 }
1705 
1706 const ArrayVariableGradient &
1707 Coupleable::coupledArrayGradientOld(const std::string & var_name, unsigned int comp) const
1708 {
1709  const auto * var = getArrayVar(var_name, comp);
1710  if (!var)
1711  return _default_array_gradient;
1713 
1714  if (!_coupleable_neighbor)
1715  return (_c_is_implicit) ? var->gradSlnOld() : var->gradSlnOlder();
1716  return (_c_is_implicit) ? var->gradSlnOldNeighbor() : var->gradSlnOlderNeighbor();
1717 }
1718 
1719 const ArrayVariableGradient &
1720 Coupleable::coupledArrayGradientOlder(const std::string & var_name, unsigned int comp) const
1721 {
1722  const auto * var = getArrayVar(var_name, comp);
1723  if (!var)
1724  return _default_array_gradient;
1726 
1727  if (!_coupleable_neighbor)
1728  return var->gradSlnOlder();
1729  return var->gradSlnOlderNeighbor();
1730 }
1731 
1732 const ArrayVariableGradient &
1733 Coupleable::coupledArrayGradientDot(const std::string & var_name, unsigned int comp) const
1734 {
1735  const auto * const var = getArrayVar(var_name, comp);
1736  if (!var)
1737  return _default_array_gradient;
1739 
1740  if (!_coupleable_neighbor)
1741  return var->gradSlnDot();
1742  return var->gradSlnNeighborDot();
1743 }
1744 
1745 const VectorVariableCurl &
1746 Coupleable::coupledCurl(const std::string & var_name, unsigned int comp) const
1747 {
1748  const auto * var = getVectorVar(var_name, comp);
1749  if (!var)
1750  {
1752  return _default_vector_curl;
1753  }
1755 
1756  if (!_coupleable_neighbor)
1757  return (_c_is_implicit) ? var->curlSln() : var->curlSlnOld();
1758  return (_c_is_implicit) ? var->curlSlnNeighbor() : var->curlSlnOldNeighbor();
1759 }
1760 
1761 const VectorVariableCurl &
1762 Coupleable::coupledCurlOld(const std::string & var_name, unsigned int comp) const
1763 {
1764  const auto * var = getVectorVar(var_name, comp);
1765  if (!var)
1766  {
1768  return _default_vector_curl;
1769  }
1771 
1772  if (!_coupleable_neighbor)
1773  return (_c_is_implicit) ? var->curlSlnOld() : var->curlSlnOlder();
1774  return (_c_is_implicit) ? var->curlSlnOldNeighbor() : var->curlSlnOlderNeighbor();
1775 }
1776 
1777 const VectorVariableCurl &
1778 Coupleable::coupledCurlOlder(const std::string & var_name, unsigned int comp) const
1779 {
1780  const auto * var = getVectorVar(var_name, comp);
1781  if (!var)
1782  {
1784  return _default_vector_curl;
1785  }
1787 
1788  if (!_coupleable_neighbor)
1789  return var->curlSlnOlder();
1790  return var->curlSlnOlderNeighbor();
1791 }
1792 
1793 const ADVectorVariableCurl &
1794 Coupleable::adCoupledCurl(const std::string & var_name, unsigned int comp) const
1795 {
1796  const auto * var = getVectorVar(var_name, comp);
1797 
1798  if (!var)
1799  return getADDefaultCurl();
1801 
1802  if (!_c_is_implicit)
1803  mooseError("Not implemented");
1804 
1805  if (!_coupleable_neighbor)
1806  return var->adCurlSln();
1807  return var->adCurlSlnNeighbor();
1808 }
1809 
1811 Coupleable::coupledDiv(const std::string & var_name, unsigned int comp) const
1812 {
1813  const auto * var = getVectorVar(var_name, comp);
1814  if (!var)
1815  {
1817  return _default_div;
1818  }
1820 
1821  if (!_coupleable_neighbor)
1822  return (_c_is_implicit) ? var->divSln() : var->divSlnOld();
1823  return (_c_is_implicit) ? var->divSlnNeighbor() : var->divSlnOldNeighbor();
1824 }
1825 
1827 Coupleable::coupledDivOld(const std::string & var_name, unsigned int comp) const
1828 {
1829  const auto * var = getVectorVar(var_name, comp);
1830  if (!var)
1831  {
1833  return _default_div;
1834  }
1836 
1837  if (!_coupleable_neighbor)
1838  return (_c_is_implicit) ? var->divSlnOld() : var->divSlnOlder();
1839  return (_c_is_implicit) ? var->divSlnOldNeighbor() : var->divSlnOlderNeighbor();
1840 }
1841 
1843 Coupleable::coupledDivOlder(const std::string & var_name, unsigned int comp) const
1844 {
1845  const auto * var = getVectorVar(var_name, comp);
1846  if (!var)
1847  {
1849  return _default_div;
1850  }
1852 
1853  if (!_coupleable_neighbor)
1854  return var->divSlnOlder();
1855  return var->divSlnOlderNeighbor();
1856 }
1857 
1858 const VariableSecond &
1859 Coupleable::coupledSecond(const std::string & var_name, unsigned int comp) const
1860 {
1861  const auto * var = getVar(var_name, comp);
1862  if (!var)
1863  {
1865  return _default_second;
1866  }
1868 
1869  if (!_coupleable_neighbor)
1870  return (_c_is_implicit) ? var->secondSln() : var->secondSlnOlder();
1871  return (_c_is_implicit) ? var->secondSlnNeighbor() : var->secondSlnOlderNeighbor();
1872 }
1873 
1874 const VariableSecond &
1875 Coupleable::coupledSecondOld(const std::string & var_name, unsigned int comp) const
1876 {
1877  const auto * var = getVar(var_name, comp);
1878  if (!var)
1879  {
1881  return _default_second;
1882  }
1884 
1885  if (!_coupleable_neighbor)
1886  return (_c_is_implicit) ? var->secondSlnOld() : var->secondSlnOlder();
1887  return (_c_is_implicit) ? var->secondSlnOldNeighbor() : var->secondSlnOlderNeighbor();
1888 }
1889 
1890 const VariableSecond &
1891 Coupleable::coupledSecondOlder(const std::string & var_name, unsigned int comp) const
1892 {
1893  const auto * var = getVar(var_name, comp);
1894  if (!var)
1895  {
1897  return _default_second;
1898  }
1900 
1901  if (!_coupleable_neighbor)
1902  return var->secondSlnOlder();
1903  return var->secondSlnOlderNeighbor();
1904 }
1905 
1906 const VariableSecond &
1907 Coupleable::coupledSecondPreviousNL(const std::string & var_name, unsigned int comp) const
1908 {
1909  const auto * var = getVar(var_name, comp);
1911  if (!var)
1912  {
1914  return _default_second;
1915  }
1917 
1918  if (!_coupleable_neighbor)
1919  return var->secondSlnPreviousNL();
1920  return var->secondSlnPreviousNLNeighbor();
1921 }
1922 
1923 template <typename T>
1924 const T &
1925 Coupleable::coupledNodalValue(const std::string & var_name, unsigned int comp) const
1926 {
1927  const auto * var = getVarHelper<MooseVariableFE<T>>(var_name, comp);
1928  if (!var)
1929  return getDefaultNodalValue<T>(var_name, comp);
1931 
1932  if (!var->isNodal())
1934  ": Trying to get nodal values of variable '",
1935  var->name(),
1936  "', but it is not nodal.");
1937 
1938  if (!_coupleable_neighbor)
1939  return (_c_is_implicit) ? var->nodalValue() : var->nodalValueOld();
1940  return (_c_is_implicit) ? var->nodalValueNeighbor() : var->nodalValueOldNeighbor();
1941 }
1942 
1943 template <typename T>
1944 const T &
1945 Coupleable::coupledNodalValueOld(const std::string & var_name, unsigned int comp) const
1946 {
1947  const auto * var = getVarHelper<MooseVariableFE<T>>(var_name, comp);
1948  if (!var)
1949  return getDefaultNodalValue<T>(var_name, comp);
1951 
1952  if (!var->isNodal())
1954  ": Trying to get old nodal values of variable '",
1955  var->name(),
1956  "', but it is not nodal.");
1957 
1958  if (!_coupleable_neighbor)
1959  return (_c_is_implicit) ? var->nodalValueOld() : var->nodalValueOlder();
1960  return (_c_is_implicit) ? var->nodalValueOldNeighbor() : var->nodalValueOlderNeighbor();
1961 }
1962 
1963 template <typename T>
1964 const T &
1965 Coupleable::coupledNodalValueOlder(const std::string & var_name, unsigned int comp) const
1966 {
1967  const auto * var = getVarHelper<MooseVariableFE<T>>(var_name, comp);
1968  if (!var)
1969  return getDefaultNodalValue<T>(var_name, comp);
1971 
1972  if (!var->isNodal())
1974  ": Trying to get older nodal values of variable '",
1975  var->name(),
1976  "', but it is not nodal.");
1977 
1978  if (!_coupleable_neighbor)
1979  return var->nodalValueOlder();
1980  return var->nodalValueOlderNeighbor();
1981 }
1982 
1983 template <typename T>
1984 const T &
1985 Coupleable::coupledNodalValuePreviousNL(const std::string & var_name, unsigned int comp) const
1986 {
1987  const auto * var = getVarHelper<MooseVariableFE<T>>(var_name, comp);
1988  if (!var)
1989  return getDefaultNodalValue<T>(var_name, comp);
1991 
1993 
1994  if (!_coupleable_neighbor)
1995  return var->nodalValuePreviousNL();
1996  return var->nodalValuePreviousNLNeighbor();
1997 }
1998 
1999 template <typename T>
2000 const T &
2001 Coupleable::coupledNodalDot(const std::string & var_name, unsigned int comp) const
2002 {
2003  static const T zero = 0;
2004  const auto * var = getVarHelper<MooseVariableFE<T>>(var_name, comp);
2005  if (!var)
2006  return zero;
2008 
2009  if (!_coupleable_neighbor)
2010  return var->nodalValueDot();
2011  mooseError("Neighbor version not implemented");
2012 }
2013 
2014 const VariableValue &
2015 Coupleable::coupledNodalDotDot(const std::string & var_name, unsigned int comp) const
2016 {
2017  const auto * var = getVar(var_name, comp);
2018  if (!var)
2019  {
2021  return _default_value_zero;
2022  }
2024 
2025  if (!_coupleable_neighbor)
2026  return var->dofValuesDotDot();
2027  return var->dofValuesDotDotNeighbor();
2028 }
2029 
2030 const VariableValue &
2031 Coupleable::coupledNodalDotOld(const std::string & var_name, unsigned int comp) const
2032 {
2033  const auto * var = getVar(var_name, comp);
2034  if (!var)
2035  {
2037  return _default_value_zero;
2038  }
2040 
2041  if (!_coupleable_neighbor)
2042  return var->dofValuesDotOld();
2043  return var->dofValuesDotOldNeighbor();
2044 }
2045 
2046 const VariableValue &
2047 Coupleable::coupledNodalDotDotOld(const std::string & var_name, unsigned int comp) const
2048 {
2049  const auto * var = getVar(var_name, comp);
2050  if (!var)
2051  {
2053  return _default_value_zero;
2054  }
2056 
2057  if (!_coupleable_neighbor)
2058  return var->dofValuesDotDotOld();
2059  return var->dofValuesDotDotOldNeighbor();
2060 }
2061 
2062 const VariableValue &
2063 Coupleable::coupledDofValues(const std::string & var_name, unsigned int comp) const
2064 {
2065  const auto * var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2066  if (!var)
2067  return *getDefaultValue(var_name, comp);
2069 
2070  if (!_coupleable_neighbor)
2071  return (_c_is_implicit) ? var->dofValues() : var->dofValuesOld();
2072  return (_c_is_implicit) ? var->dofValuesNeighbor() : var->dofValuesOldNeighbor();
2073 }
2074 
2075 std::vector<const VariableValue *>
2076 Coupleable::coupledAllDofValues(const std::string & var_name) const
2077 {
2078  auto func = [this, &var_name](unsigned int comp) { return &coupledDofValues(var_name, comp); };
2080  return coupledVectorHelper<const VariableValue *>(var_name, func);
2081 }
2082 
2083 const VariableValue &
2084 Coupleable::coupledDofValuesOld(const std::string & var_name, unsigned int comp) const
2085 {
2086  const auto * var = getVar(var_name, comp);
2087  if (!var)
2088  return *getDefaultValue(var_name, comp);
2090 
2091  if (!_coupleable_neighbor)
2092  return (_c_is_implicit) ? var->dofValuesOld() : var->dofValuesOlder();
2093  return (_c_is_implicit) ? var->dofValuesOldNeighbor() : var->dofValuesOlderNeighbor();
2094 }
2095 
2096 std::vector<const VariableValue *>
2097 Coupleable::coupledAllDofValuesOld(const std::string & var_name) const
2098 {
2099  auto func = [this, &var_name](unsigned int comp) { return &coupledDofValuesOld(var_name, comp); };
2100  return coupledVectorHelper<const VariableValue *>(var_name, func);
2101 }
2102 
2103 const VariableValue &
2104 Coupleable::coupledDofValuesOlder(const std::string & var_name, unsigned int comp) const
2105 {
2106  const auto * var = getVar(var_name, comp);
2107  if (!var)
2108  return *getDefaultValue(var_name, comp);
2110 
2111  if (!_coupleable_neighbor)
2112  return var->dofValuesOlder();
2113  return var->dofValuesOlderNeighbor();
2114 }
2115 
2116 std::vector<const VariableValue *>
2117 Coupleable::coupledAllDofValuesOlder(const std::string & var_name) const
2118 {
2119  auto func = [this, &var_name](unsigned int comp)
2120  { return &coupledDofValuesOlder(var_name, comp); };
2121  return coupledVectorHelper<const VariableValue *>(var_name, func);
2122 }
2123 
2124 const ArrayVariableValue &
2125 Coupleable::coupledArrayDofValues(const std::string & var_name, unsigned int comp) const
2126 {
2127  const auto * var = getArrayVar(var_name, comp);
2128  if (!var)
2129  return *getDefaultArrayValue(var_name);
2131 
2132  if (!_coupleable_neighbor)
2133  return (_c_is_implicit) ? var->dofValues() : var->dofValuesOld();
2134  return (_c_is_implicit) ? var->dofValuesNeighbor() : var->dofValuesOldNeighbor();
2135 }
2136 
2137 const ADVariableValue &
2138 Coupleable::adCoupledDofValues(const std::string & var_name, unsigned int comp) const
2139 {
2140  const auto * var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2141 
2142  if (!var)
2143  return *getADDefaultValue(var_name);
2145 
2146  if (!_c_is_implicit)
2147  mooseError("Not implemented");
2148 
2149  if (!_coupleable_neighbor)
2150  return var->adDofValues();
2151  return var->adDofValuesNeighbor();
2152 }
2153 
2154 void
2155 Coupleable::validateExecutionerType(const std::string & name, const std::string & fn_name) const
2156 {
2157  if (!_c_fe_problem.isTransient())
2159  ": Calling \"",
2160  fn_name,
2161  "\" on variable \"",
2162  name,
2163  "\" when using a \"Steady\" executioner is not allowed. This value is available "
2164  "only in transient simulations.");
2165 }
2166 
2167 template <typename T>
2168 const typename Moose::ADType<T>::type &
2169 Coupleable::adCoupledNodalValue(const std::string & var_name, unsigned int comp) const
2170 {
2171  static const typename Moose::ADType<T>::type zero = 0;
2172  if (!isCoupled(var_name))
2173  return zero;
2174 
2175  if (!_c_nodal)
2176  mooseError("The adCoupledNodalValue method should only be called for nodal computing objects");
2178  mooseError(
2179  "The adCoupledNodalValue method shouldn't be called for neighbor computing objects. I "
2180  "don't even know what that would mean, although maybe someone could explain it to me.");
2181  if (!_c_is_implicit)
2182  mooseError("If you're going to use an explicit scheme, then use coupledNodalValue instead of "
2183  "adCoupledNodalValue");
2184 
2185  const auto * var = getVarHelper<MooseVariableFE<T>>(var_name, comp);
2186 
2187  return var->adNodalValue();
2188 }
2189 
2190 const ADVariableValue &
2191 Coupleable::adCoupledValue(const std::string & var_name, unsigned int comp) const
2192 {
2193  const auto * const var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2194 
2195  if (!var)
2196  return *getADDefaultValue(var_name);
2198 
2199  if (!_c_is_implicit)
2200  mooseError("Not implemented");
2201 
2202  if (_c_nodal)
2203  return var->adDofValues();
2204 
2205  if (!_coupleable_neighbor)
2206  return var->adSln();
2207  return var->adSlnNeighbor();
2208 }
2209 
2210 const ADVariableValue &
2211 Coupleable::adCoupledLowerValue(const std::string & var_name, unsigned int comp) const
2212 {
2213  auto var = getVarHelper<MooseVariableFE<Real>>(var_name, comp);
2214 
2215  if (!var)
2216  return *getADDefaultValue(var_name);
2218 
2219  if (!_c_is_implicit)
2220  mooseError("adCoupledLowerValue cannot be called in a coupleable neighbor object");
2221 
2222  if (_c_nodal)
2223  return var->adDofValues();
2224  else
2225  return var->adSlnLower();
2226 }
2227 
2228 const ADVariableGradient &
2229 Coupleable::adCoupledGradient(const std::string & var_name, unsigned int comp) const
2230 {
2231  const auto * var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2232 
2233  if (!var)
2234  return getADDefaultGradient();
2236 
2237  if (!_c_is_implicit)
2238  mooseError("Not implemented");
2239 
2240  if (!_coupleable_neighbor)
2241  return var->adGradSln();
2242  return var->adGradSlnNeighbor();
2243 }
2244 
2245 const ADVariableGradient &
2246 Coupleable::adCoupledGradientDot(const std::string & var_name, unsigned int comp) const
2247 {
2248  const auto * var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2249 
2250  if (!var)
2251  return getADDefaultGradient();
2253 
2254  if (!_c_is_implicit)
2255  mooseError("Not implemented");
2256 
2257  if (!_coupleable_neighbor)
2258  return var->adGradSlnDot();
2259  return var->adGradSlnNeighborDot();
2260 }
2261 
2262 const ADVariableSecond &
2263 Coupleable::adCoupledSecond(const std::string & var_name, unsigned int comp) const
2264 {
2265  const auto * var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2266 
2267  if (!var)
2268  return getADDefaultSecond();
2270 
2271  if (!_c_is_implicit)
2272  mooseError("Not implemented");
2273 
2274  if (!_coupleable_neighbor)
2275  return var->adSecondSln();
2276  else
2277  return var->adSecondSlnNeighbor();
2278 }
2279 
2280 const ADVectorVariableSecond &
2281 adCoupledVectorSecond(const std::string & /*var_name*/, unsigned int /*comp = 0*/)
2282 {
2283  mooseError("Automatic differentiation using second derivatives of vector variables is not "
2284  "implemented.");
2285 }
2286 
2287 const ADVariableValue &
2288 Coupleable::adCoupledDot(const std::string & var_name, unsigned int comp) const
2289 {
2290  const auto * var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2291 
2292  if (!var)
2293  return *getADDefaultValue(var_name);
2295 
2296  if (!_coupleable_neighbor)
2297  {
2298  if (_c_nodal)
2299  return var->adDofValuesDot();
2300  return var->adUDot();
2301  }
2302  else
2303  {
2304  if (_c_nodal)
2305  mooseError("AD neighbor nodal dof dot not implemented");
2306  return var->adUDotNeighbor();
2307  }
2308 }
2309 
2310 const ADVariableValue &
2311 Coupleable::adCoupledDotDot(const std::string & var_name, unsigned int comp) const
2312 {
2313  const auto * const var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2314 
2315  if (!var)
2316  return *getADDefaultValue(var_name);
2318 
2319  if (_c_nodal)
2320  mooseError("Not implemented");
2321 
2322  if (!_coupleable_neighbor)
2323  return var->adUDotDot();
2324  return var->adUDotDotNeighbor();
2325 }
2326 
2327 const ADVectorVariableValue &
2328 Coupleable::adCoupledVectorDot(const std::string & var_name, unsigned int comp) const
2329 {
2330  const auto * var = getVectorVar(var_name, comp);
2331  if (!var)
2332  return *getADDefaultVectorValue(var_name);
2334 
2335  if (_c_nodal)
2336  mooseError("Not implemented");
2337 
2338  if (!_coupleable_neighbor)
2339  return var->adUDot();
2340  return var->adUDotNeighbor();
2341 }
2342 
2343 const ADVectorVariableValue &
2344 Coupleable::adCoupledVectorValue(const std::string & var_name, unsigned int comp) const
2345 {
2346  const auto * var = getVectorVar(var_name, comp);
2347  if (!var)
2348  return *getADDefaultVectorValue(var_name);
2350 
2351  if (_c_nodal)
2352  mooseError("Not implemented");
2353  if (!_c_is_implicit)
2354  mooseError("Not implemented");
2355 
2356  if (!_coupleable_neighbor)
2357  return var->adSln();
2358  return var->adSlnNeighbor();
2359 }
2360 
2362 Coupleable::adCoupledVectorGradient(const std::string & var_name, unsigned int comp) const
2363 {
2364  const auto * var = getVectorVar(var_name, comp);
2365  if (!var)
2366  return getADDefaultVectorGradient();
2368 
2369  if (!_c_is_implicit)
2370  mooseError("Not implemented");
2371 
2372  if (!_coupleable_neighbor)
2373  return var->adGradSln();
2374  return var->adGradSlnNeighbor();
2375 }
2376 
2377 const ADVariableValue *
2378 Coupleable::getADDefaultValue(const std::string & var_name) const
2379 {
2380  auto default_value_it = _ad_default_value.find(var_name);
2381  if (default_value_it == _ad_default_value.end())
2382  {
2383  auto value = std::make_unique<ADVariableValue>(_coupleable_max_qps,
2385  default_value_it = _ad_default_value.insert(std::make_pair(var_name, std::move(value))).first;
2386  }
2387 
2388  return default_value_it->second.get();
2389 }
2390 
2391 const ADVectorVariableValue *
2392 Coupleable::getADDefaultVectorValue(const std::string & var_name) const
2393 {
2394  auto default_value_it = _ad_default_vector_value.find(var_name);
2395  if (default_value_it == _ad_default_vector_value.end())
2396  {
2397  RealVectorValue default_vec;
2398  for (unsigned int i = 0; i < _c_parameters.numberDefaultCoupledValues(var_name); ++i)
2399  default_vec(i) = _c_parameters.defaultCoupledValue(var_name, i);
2400  auto value = std::make_unique<ADVectorVariableValue>(_coupleable_max_qps, default_vec);
2401  default_value_it =
2402  _ad_default_vector_value.insert(std::make_pair(var_name, std::move(value))).first;
2403  }
2404 
2405  return default_value_it->second.get();
2406 }
2407 
2408 const ADVariableGradient &
2410 {
2412  return _ad_default_gradient;
2413 }
2414 
2417 {
2420 }
2421 
2422 const ADVariableSecond &
2424 {
2426  return _ad_default_second;
2427 }
2428 
2429 const ADVectorVariableCurl &
2431 {
2433  return _ad_default_curl;
2434 }
2435 
2436 const ADVariableValue &
2438 {
2439  mooseDeprecated("Method adZeroValue() is deprecated. Use '_ad_zero' instead.");
2440  return _ad_zero;
2441 }
2442 
2443 const ADVariableGradient &
2445 {
2446  mooseDeprecated("Method adZeroGradient() is deprecated. Use '_ad_grad_zero' instead.");
2447  return _ad_grad_zero;
2448 }
2449 
2450 const ADVariableSecond &
2452 {
2453  mooseDeprecated("Method adZeroSecond() is deprecated. Use '_ad_second_zero' instead.");
2454  return _ad_second_zero;
2455 }
2456 
2457 template <>
2459 Coupleable::genericZeroValue<false>()
2460 {
2461  return _zero;
2462 }
2463 
2464 template <>
2466 Coupleable::genericZeroValue<true>()
2467 {
2468  return _ad_zero;
2469 }
2470 
2471 template <>
2473 Coupleable::genericZeroGradient<false>()
2474 {
2475  return _grad_zero;
2476 }
2477 
2478 template <>
2480 Coupleable::genericZeroGradient<true>()
2481 {
2482  return _ad_grad_zero;
2483 }
2484 
2485 template <>
2487 Coupleable::genericZeroSecond<false>()
2488 {
2489  return _second_zero;
2490 }
2491 
2492 template <>
2494 Coupleable::genericZeroSecond<true>()
2495 {
2496  return _ad_second_zero;
2497 }
2498 
2499 template <>
2501 Coupleable::coupledGenericGradient<false>(const std::string & var_name, unsigned int comp) const
2502 {
2503  return coupledGradient(var_name, comp);
2504 }
2505 
2506 template <>
2508 Coupleable::coupledGenericGradient<true>(const std::string & var_name, unsigned int comp) const
2509 {
2510  return adCoupledGradient(var_name, comp);
2511 }
2512 
2513 std::vector<unsigned int>
2514 Coupleable::coupledIndices(const std::string & var_name) const
2515 {
2516  auto func = [this, &var_name](unsigned int comp) { return coupled(var_name, comp); };
2517  return coupledVectorHelper<unsigned int>(var_name, func);
2518 }
2519 
2520 VariableName
2521 Coupleable::coupledName(const std::string & var_name, unsigned int comp) const
2522 {
2523  if (getFieldVar(var_name, comp))
2524  return getFieldVar(var_name, comp)->name();
2525  // Detect if we are in the case where a constant was passed in lieu of a variable
2526  else if (isCoupledConstant(var_name))
2528  ": a variable name was queried but a constant was passed for parameter '",
2529  var_name,
2530  "Either pass a true variable or contact a developer to shield the call to "
2531  "'coupledName' with 'isCoupledConstant'");
2532  else
2533  mooseError(
2534  _c_name, ": Variable '", var_name, "' does not exist, yet its coupled name is requested");
2535 }
2536 
2537 std::vector<VariableName>
2538 Coupleable::coupledNames(const std::string & var_name) const
2539 {
2540  auto func = [this, &var_name](unsigned int comp) { return coupledName(var_name, comp); };
2541  return coupledVectorHelper<VariableName>(var_name, func);
2542 }
2543 
2544 std::vector<const VariableValue *>
2545 Coupleable::coupledValues(const std::string & var_name) const
2546 {
2547  auto func = [this, &var_name](unsigned int comp) { return &coupledValue(var_name, comp); };
2548  return coupledVectorHelper<const VariableValue *>(var_name, func);
2549 }
2550 
2551 std::vector<const VectorVariableValue *>
2552 Coupleable::coupledVectorValues(const std::string & var_name) const
2553 {
2554  auto func = [this, &var_name](unsigned int comp) { return &coupledVectorValue(var_name, comp); };
2555  return coupledVectorHelper<const VectorVariableValue *>(var_name, func);
2556 }
2557 
2558 template <>
2559 std::vector<const GenericVariableValue<false> *>
2560 Coupleable::coupledGenericValues<false>(const std::string & var_name) const
2561 {
2562  return coupledValues(var_name);
2563 }
2564 
2565 template <>
2566 std::vector<const GenericVariableValue<true> *>
2567 Coupleable::coupledGenericValues<true>(const std::string & var_name) const
2568 {
2569  return adCoupledValues(var_name);
2570 }
2571 
2572 std::vector<const ADVariableValue *>
2573 Coupleable::adCoupledValues(const std::string & var_name) const
2574 {
2575  auto func = [this, &var_name](unsigned int comp) { return &adCoupledValue(var_name, comp); };
2576  return coupledVectorHelper<const ADVariableValue *>(var_name, func);
2577 }
2578 
2579 std::vector<const ADVectorVariableValue *>
2580 Coupleable::adCoupledVectorValues(const std::string & var_name) const
2581 {
2582  auto func = [this, &var_name](unsigned int comp)
2583  { return &adCoupledVectorValue(var_name, comp); };
2584  return coupledVectorHelper<const ADVectorVariableValue *>(var_name, func);
2585 }
2586 
2587 std::vector<const VariableValue *>
2588 Coupleable::coupledVectorTagValues(const std::string & var_names, TagID tag) const
2589 {
2590  auto func = [this, &var_names, &tag](unsigned int comp)
2591  { return &coupledVectorTagValue(var_names, tag, comp); };
2592  return coupledVectorHelper<const VariableValue *>(var_names, func);
2593 }
2594 
2595 std::vector<const VariableValue *>
2596 Coupleable::coupledVectorTagValues(const std::string & var_names,
2597  const std::string & tag_name) const
2598 {
2599  if (!_c_parameters.isParamValid(tag_name))
2600  mooseError("Tag name parameter '", tag_name, "' is invalid");
2601 
2602  TagName tagname = _c_parameters.get<TagName>(tag_name);
2603  if (!_c_fe_problem.vectorTagExists(tagname))
2604  mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2605 
2606  TagID tag = _c_fe_problem.getVectorTagID(tagname);
2607  return coupledVectorTagValues(var_names, tag);
2608 }
2609 
2610 std::vector<const ArrayVariableValue *>
2611 Coupleable::coupledVectorTagArrayValues(const std::string & var_names, TagID tag) const
2612 {
2613  auto func = [this, &var_names, &tag](unsigned int index)
2614  { return &coupledVectorTagArrayValue(var_names, tag, index); };
2615  return coupledVectorHelper<const ArrayVariableValue *>(var_names, func);
2616 }
2617 
2618 std::vector<const ArrayVariableValue *>
2619 Coupleable::coupledVectorTagArrayValues(const std::string & var_names,
2620  const std::string & tag_name) const
2621 {
2622  if (!_c_parameters.isParamValid(tag_name))
2623  mooseError("Tag name parameter '", tag_name, "' is invalid");
2624 
2625  TagName tagname = _c_parameters.get<TagName>(tag_name);
2626  if (!_c_fe_problem.vectorTagExists(tagname))
2627  mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2628 
2629  TagID tag = _c_fe_problem.getVectorTagID(tagname);
2630  return coupledVectorTagArrayValues(var_names, tag);
2631 }
2632 
2633 std::vector<const VariableGradient *>
2634 Coupleable::coupledVectorTagGradients(const std::string & var_names, TagID tag) const
2635 {
2636  auto func = [this, &var_names, &tag](unsigned int index)
2637  { return &coupledVectorTagGradient(var_names, tag, index); };
2638  return coupledVectorHelper<const VariableGradient *>(var_names, func);
2639 }
2640 
2641 std::vector<const VariableGradient *>
2642 Coupleable::coupledVectorTagGradients(const std::string & var_names,
2643  const std::string & tag_name) const
2644 {
2645  if (!_c_parameters.isParamValid(tag_name))
2646  mooseError("Tag name parameter '", tag_name, "' is invalid");
2647 
2648  TagName tagname = _c_parameters.get<TagName>(tag_name);
2649  if (!_c_fe_problem.vectorTagExists(tagname))
2650  mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2651 
2652  TagID tag = _c_fe_problem.getVectorTagID(tagname);
2653  return coupledVectorTagGradients(var_names, tag);
2654 }
2655 
2656 std::vector<const ArrayVariableGradient *>
2657 Coupleable::coupledVectorTagArrayGradients(const std::string & var_names, TagID tag) const
2658 {
2659  auto func = [this, &var_names, &tag](unsigned int index)
2660  { return &coupledVectorTagArrayGradient(var_names, tag, index); };
2661  return coupledVectorHelper<const ArrayVariableGradient *>(var_names, func);
2662 }
2663 
2664 std::vector<const ArrayVariableGradient *>
2665 Coupleable::coupledVectorTagArrayGradients(const std::string & var_names,
2666  const std::string & tag_name) const
2667 {
2668  if (!_c_parameters.isParamValid(tag_name))
2669  mooseError("Tag name parameter '", tag_name, "' is invalid");
2670 
2671  TagName tagname = _c_parameters.get<TagName>(tag_name);
2672  if (!_c_fe_problem.vectorTagExists(tagname))
2673  mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2674 
2675  TagID tag = _c_fe_problem.getVectorTagID(tagname);
2676  return coupledVectorTagArrayGradients(var_names, tag);
2677 }
2678 
2679 std::vector<const VariableValue *>
2680 Coupleable::coupledVectorTagDofValues(const std::string & var_names, TagID tag) const
2681 {
2682  auto func = [this, &var_names, &tag](unsigned int comp)
2683  { return &coupledVectorTagDofValue(var_names, tag, comp); };
2684  return coupledVectorHelper<const VariableValue *>(var_names, func);
2685 }
2686 
2687 std::vector<const VariableValue *>
2688 Coupleable::coupledVectorTagDofValues(const std::string & var_names,
2689  const std::string & tag_name) const
2690 {
2691  if (!_c_parameters.isParamValid(tag_name))
2692  mooseError("Tag name parameter '", tag_name, "' is invalid");
2693 
2694  TagName tagname = _c_parameters.get<TagName>(tag_name);
2695  if (!_c_fe_problem.vectorTagExists(tagname))
2696  mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2697 
2698  TagID tag = _c_fe_problem.getVectorTagID(tagname);
2699  return coupledVectorTagDofValues(var_names, tag);
2700 }
2701 
2702 std::vector<const VariableValue *>
2703 Coupleable::coupledMatrixTagValues(const std::string & var_names, TagID tag) const
2704 {
2705  auto func = [this, &var_names, &tag](unsigned int comp)
2706  { return &coupledMatrixTagValue(var_names, tag, comp); };
2707  return coupledVectorHelper<const VariableValue *>(var_names, func);
2708 }
2709 
2710 std::vector<const VariableValue *>
2711 Coupleable::coupledMatrixTagValues(const std::string & var_names,
2712  const std::string & tag_name) const
2713 {
2714  if (!_c_parameters.isParamValid(tag_name))
2715  mooseError("Tag name parameter '", tag_name, "' is invalid");
2716 
2717  TagName tagname = _c_parameters.get<TagName>(tag_name);
2718  if (!_c_fe_problem.matrixTagExists(tagname))
2719  mooseError("Matrix tag name '", tagname, "' does not exist");
2720 
2721  TagID tag = _c_fe_problem.getMatrixTagID(tagname);
2722  return coupledMatrixTagValues(var_names, tag);
2723 }
2724 
2725 std::vector<const VariableValue *>
2726 Coupleable::coupledValuesOld(const std::string & var_name) const
2727 {
2728  auto func = [this, &var_name](unsigned int comp) { return &coupledValueOld(var_name, comp); };
2729  return coupledVectorHelper<const VariableValue *>(var_name, func);
2730 }
2731 
2732 std::vector<const VariableValue *>
2733 Coupleable::coupledValuesOlder(const std::string & var_name) const
2734 {
2735  auto func = [this, &var_name](unsigned int comp) { return &coupledValueOlder(var_name, comp); };
2736  return coupledVectorHelper<const VariableValue *>(var_name, func);
2737 }
2738 
2739 std::vector<const VectorVariableValue *>
2740 Coupleable::coupledVectorValuesOld(const std::string & var_name) const
2741 {
2742  auto func = [this, &var_name](unsigned int comp)
2743  { return &coupledVectorValueOld(var_name, comp); };
2744  return coupledVectorHelper<const VectorVariableValue *>(var_name, func);
2745 }
2746 
2747 std::vector<const VariableGradient *>
2748 Coupleable::coupledGradients(const std::string & var_name) const
2749 {
2750  auto func = [this, &var_name](unsigned int comp) { return &coupledGradient(var_name, comp); };
2751  return coupledVectorHelper<const VariableGradient *>(var_name, func);
2752 }
2753 
2754 template <>
2755 std::vector<const GenericVariableGradient<false> *>
2756 Coupleable::coupledGenericGradients<false>(const std::string & var_name) const
2757 {
2758  return coupledGradients(var_name);
2759 }
2760 
2761 template <>
2762 std::vector<const GenericVariableGradient<true> *>
2763 Coupleable::coupledGenericGradients<true>(const std::string & var_name) const
2764 {
2765  auto func = [this, &var_name](unsigned int comp) { return &adCoupledGradient(var_name, comp); };
2766  return coupledVectorHelper<const GenericVariableGradient<true> *>(var_name, func);
2767 }
2768 
2769 std::vector<const ADVariableGradient *>
2770 Coupleable::adCoupledGradients(const std::string & var_name) const
2771 {
2772  auto func = [this, &var_name](unsigned int comp) { return &adCoupledGradient(var_name, comp); };
2773  return coupledVectorHelper<const ADVariableGradient *>(var_name, func);
2774 }
2775 
2776 std::vector<const VariableGradient *>
2777 Coupleable::coupledGradientsOld(const std::string & var_name) const
2778 {
2779  auto func = [this, &var_name](unsigned int comp) { return &coupledGradientOld(var_name, comp); };
2780  return coupledVectorHelper<const VariableGradient *>(var_name, func);
2781 }
2782 
2783 std::vector<const VariableValue *>
2784 Coupleable::coupledDots(const std::string & var_name) const
2785 {
2786  auto func = [this, &var_name](unsigned int comp) { return &coupledDot(var_name, comp); };
2787  return coupledVectorHelper<const VariableValue *>(var_name, func);
2788 }
2789 
2790 std::vector<const ADVariableValue *>
2791 Coupleable::adCoupledDots(const std::string & var_name) const
2792 {
2793  auto func = [this, &var_name](unsigned int comp) { return &adCoupledDot(var_name, comp); };
2794  return coupledVectorHelper<const ADVariableValue *>(var_name, func);
2795 }
2796 
2797 template <>
2799 Coupleable::coupledGenericDot<false>(const std::string & var_name, unsigned int comp) const
2800 {
2801  return coupledDot(var_name, comp);
2802 }
2803 
2804 template <>
2806 Coupleable::coupledGenericDot<true>(const std::string & var_name, unsigned int comp) const
2807 {
2808  return adCoupledDot(var_name, comp);
2809 }
2810 
2811 // Explicit instantiations
2812 
2813 template const Real & Coupleable::getDefaultNodalValue<Real>(const std::string & var_name,
2814  unsigned int comp) const;
2815 
2816 template const Real & Coupleable::coupledNodalValue<Real>(const std::string & var_name,
2817  unsigned int comp) const;
2818 template const ADReal & Coupleable::adCoupledNodalValue<Real>(const std::string & var_name,
2819  unsigned int comp) const;
2820 template const ADRealVectorValue &
2821 Coupleable::adCoupledNodalValue<RealVectorValue>(const std::string & var_name,
2822  unsigned int comp) const;
2823 
2824 template const RealVectorValue &
2825 Coupleable::coupledNodalValue<RealVectorValue>(const std::string & var_name,
2826  unsigned int comp) const;
2827 template const Real & Coupleable::coupledNodalValueOld<Real>(const std::string & var_name,
2828  unsigned int comp) const;
2829 template const RealVectorValue &
2830 Coupleable::coupledNodalValueOld<RealVectorValue>(const std::string & var_name,
2831  unsigned int comp) const;
2832 template const Real & Coupleable::coupledNodalValueOlder<Real>(const std::string & var_name,
2833  unsigned int comp) const;
2834 template const RealVectorValue &
2835 Coupleable::coupledNodalValueOlder<RealVectorValue>(const std::string & var_name,
2836  unsigned int comp) const;
2837 template const Real & Coupleable::coupledNodalValuePreviousNL<Real>(const std::string & var_name,
2838  unsigned int comp) const;
2839 template const RealVectorValue &
2840 Coupleable::coupledNodalValuePreviousNL<RealVectorValue>(const std::string & var_name,
2841  unsigned int comp) const;
2842 template const Real & Coupleable::coupledNodalDot<Real>(const std::string & var_name,
2843  unsigned int comp) const;
2844 template const RealVectorValue &
2845 Coupleable::coupledNodalDot<RealVectorValue>(const std::string & var_name, unsigned int comp) const;
virtual const ArrayVariableValue & coupledArrayDotDotOld(const std::string &var_name, unsigned int comp=0) const
Old second time derivative of a coupled array variable.
Definition: Coupleable.C:1452
std::string name(const ElemQuality q)
virtual const VariableValue & coupledDofValues(const std::string &var_name, unsigned int comp=0) const
Returns DoFs in the current solution vector of a coupled variable for the local element.
Definition: Coupleable.C:2063
virtual const VariableValue & coupledVectorTagValue(const std::string &var_names, TagID tag, unsigned int index=0) const
Returns value of a coupled variable for a given tag.
Definition: Coupleable.C:655
virtual const VariableGradient & coupledVectorTagGradient(const std::string &var_names, TagID tag, unsigned int index=0) const
Returns gradient of a coupled variable for a given tag.
Definition: Coupleable.C:687
virtual const ArrayVariableValue & coupledArrayValueOlder(const std::string &var_name, unsigned int comp=0) const
Returns an old value from two time steps previous of a coupled array variable.
Definition: Coupleable.C:1154
OutputTools< Real >::VariableGradient VariableGradient
Definition: MooseTypes.h:344
const T & coupledNodalDot(const std::string &var_name, unsigned int comp=0) const
Nodal values of time derivative of a coupled variable.
Definition: Coupleable.C:2001
virtual TagID getVectorTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition: SubProblem.C:204
OutputTools< RealVectorValue >::VariableDivergence VectorVariableDivergence
Definition: MooseTypes.h:364
void validateExecutionerType(const std::string &name, const std::string &fn_name) const
Checks to make sure that the current Executioner has set "_is_transient" when old/older values are co...
Definition: Coupleable.C:2155
virtual bool isCoupled(const std::string &var_name, unsigned int i=0) const
Returns true if a variables has been coupled as name.
Definition: Coupleable.C:159
virtual MooseVariableScalar & getScalarVariable(const THREAD_ID tid, const std::string &var_name)=0
Returns the scalar variable reference from whichever system contains it.
virtual const VectorVariableGradient & coupledVectorGradient(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled vector variable.
Definition: Coupleable.C:1646
bool _c_nodal
True if we provide coupling to nodal values.
Definition: Coupleable.h:1444
void checkFuncType(const std::string var_name, VarType t, FuncAge age) const
Definition: Coupleable.C:222
VectorVariableCurl _default_vector_curl
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1529
Moose::GenericType< VectorVariableValue, is_ad > GenericVectorVariableValue
Definition: MooseTypes.h:709
VectorMooseVariable * getVectorVar(const std::string &var_name, unsigned int comp)
Extract pointer to a coupled vector variable.
Definition: Coupleable.C:330
virtual unsigned int coupled(const std::string &var_name, unsigned int comp=0) const
Returns the index for a coupled variable by name.
Definition: Coupleable.C:478
virtual const VectorVariableValue & coupledVectorDotDot(const std::string &var_name, unsigned int comp=0) const
Second time derivative of a coupled vector variable.
Definition: Coupleable.C:1306
virtual const VariableSecond & coupledSecondPreviousNL(const std::string &var_name, unsigned int comp=0) const
Returns second derivative of a coupled variable for the previous Newton iterate.
Definition: Coupleable.C:1907
std::unordered_map< std::string, std::unique_ptr< MooseArray< ADRealVectorValue > > > _ad_default_vector_value
Will hold the default value for optional vector coupled variables for automatic differentiation.
Definition: Coupleable.h:1471
const ArrayVariableValue * getDefaultArrayValue(const std::string &var_name) const
Helper method to return (and insert if necessary) the default value for an uncoupled array variable...
Definition: Coupleable.C:433
bool hasCoupledValue(const std::string &coupling_name) const
Return whether or not the coupled variable exists.
std::vector< const VariableValue * > coupledValuesOlder(const std::string &var_name) const
Returns the older values for all of a coupled variable&#39;s components.
Definition: Coupleable.C:2733
const ADVariableSecond & adZeroSecond() const
Retrieve a zero second for automatic differentiation.
Definition: Coupleable.C:2451
const ADVectorVariableValue * getADDefaultVectorValue(const std::string &var_name) const
Helper method to return (and insert if necessary) the default vector value for Automatic Differentiat...
Definition: Coupleable.C:2392
virtual const VariableSecond & coupledSecond(const std::string &var_name, unsigned int comp=0) const
Returns second spatial derivatives of a coupled variable.
Definition: Coupleable.C:1859
unsigned int n_threads()
virtual bool isCoupledConstant(const std::string &var_name) const
Returns true if a variable passed as a coupled value is really a constant.
Definition: Coupleable.C:182
virtual const VariableValue & coupledDotOld(const std::string &var_name, unsigned int comp=0) const
Old time derivative of a coupled variable.
Definition: Coupleable.C:1240
LAGRANGE_VEC
virtual const VectorVariableValue & coupledVectorValueOld(const std::string &var_name, unsigned int comp=0) const
Returns an old value from previous time step of a coupled vector variable.
Definition: Coupleable.C:1104
std::vector< const ArrayVariableValue * > coupledArrayValues(const std::string &var_name) const
Returns the values for all of a coupled array variable&#39;s components.
Definition: Coupleable.C:907
std::vector< const VariableValue * > coupledDots(const std::string &var_name) const
Returns the time derivatives for all of a coupled variable&#39;s components.
Definition: Coupleable.C:2784
virtual const ArrayVariableValue & coupledArrayValueOld(const std::string &var_name, unsigned int comp=0) const
Returns an old value from previous time step of a coupled array variable.
Definition: Coupleable.C:1132
void paramError(const std::string &param, Args... args) const
Emits an error prefixed with the file and line number of the given param (from the input file) along ...
Definition: MooseBase.h:467
unsigned int TagID
Definition: MooseTypes.h:238
VariableName coupledName(const std::string &var_name, unsigned int comp=0) const
Names of the variable in the Coupleable interface.
Definition: Coupleable.C:2521
virtual const VectorVariableGradient & coupledVectorGradientOld(const std::string &var_name, unsigned int comp=0) const
Returns an old gradient from previous time step of a coupled vector variable.
Definition: Coupleable.C:1662
std::unordered_map< std::string, std::vector< MooseVariableFieldBase * > > _coupled_vars
Coupled vars whose values we provide.
Definition: Coupleable.h:1423
const MooseArray< ADRealVectorValue > & _ad_grad_zero
Definition: Coupleable.h:1504
virtual const VectorVariableValue & coupledVectorDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled vector variable.
Definition: Coupleable.C:1290
virtual const VariableValue & coupledDotDotDu(const std::string &var_name, unsigned int comp=0) const
Second time derivative of a coupled variable with respect to the coefficients.
Definition: Coupleable.C:1499
void checkWritableVar(MooseWritableVariable *var)
Checks that the passed in variable is only accessed writable by one object in a given subdomain...
Definition: Coupleable.C:988
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:311
const bool _is_fv
Whether the MooseObject is a finite volume object.
Definition: Coupleable.h:1831
virtual const VariableValue & coupledDofValuesOld(const std::string &var_name, unsigned int comp=0) const
Returns DoFs in the old solution vector of a coupled variable for the local element.
Definition: Coupleable.C:2084
const TagName OLDER_SOLUTION_TAG
Definition: MooseTypes.C:27
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
std::vector< ArrayMooseVariable * > _coupled_array_moose_vars
Vector of array coupled variables.
Definition: Coupleable.h:1435
const ArrayVariableValue & coupledVectorTagArrayDofValue(const std::string &var_name, const std::string &tag_name, unsigned int comp=0) const
Returns evaluations of a tagged vector at the requested variable&#39;s degree of freedom indices...
Definition: Coupleable.C:819
std::vector< const VectorVariableValue * > coupledVectorValuesOld(const std::string &var_name) const
Returns the old values for all of a coupled vector variable&#39;s components.
Definition: Coupleable.C:2740
constexpr std::size_t constMaxQpsPerElem
This is used for places where we initialize some qp-sized data structures that would end up being siz...
Definition: MooseTypes.h:258
const T & coupledNodalValue(const std::string &var_name, unsigned int comp=0) const
Returns nodal values of a coupled variable.
Definition: Coupleable.C:1925
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition: MooseError.h:345
char ** vars
virtual const VariableValue & coupledVectorTagDofValue(const std::string &var_name, TagID tag, unsigned int index=0) const
Returns dof value of a coupled variable for a given tag.
Definition: Coupleable.C:803
OutputTools< RealVectorValue >::VariableValue VectorVariableValue
Definition: MooseTypes.h:360
const ADVariableGradient & adCoupledGradient(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled variable for use in Automatic Differentiation.
Definition: Coupleable.C:2229
VectorVariableDivergence _default_div
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1532
const bool _c_allow_element_to_nodal_coupling
Definition: Coupleable.h:1450
std::vector< const ArrayVariableValue * > coupledVectorTagArrayValues(const std::string &var_names, TagID tag) const
Returns the values for all the coupled variables desired for a given tag.
Definition: Coupleable.C:2611
virtual const ArrayVariableValue & coupledArrayDofValues(const std::string &var_name, unsigned int comp=0) const
Returns DoFs in the current solution vector of a coupled array variable for the local element...
Definition: Coupleable.C:2125
std::vector< const VariableGradient * > coupledVectorTagGradients(const std::string &var_names, TagID tag) const
Returns gradients for all the coupled variables desired for a given tag.
Definition: Coupleable.C:2634
MooseArray< ADRealVectorValue > _ad_default_curl
This will always be zero because the default values for optionally coupled vector variables is always...
Definition: Coupleable.h:1495
T getCheckedPointerParam(const std::string &name, const std::string &error_string="") const
Verifies that the requested parameter exists and is not NULL and returns it to the caller...
virtual const VariableValue & coupledDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled variable.
Definition: Coupleable.C:1176
THREAD_ID _c_tid
Thread ID of the thread using this object.
Definition: Coupleable.h:1453
const ADVariableValue & adCoupledValue(const std::string &var_name, unsigned int comp=0) const
Returns value of a coupled variable for use in Automatic Differentiation.
Definition: Coupleable.C:2191
virtual const VariableValue & coupledNodalDotDot(const std::string &var_name, unsigned int comp=0) const
Nodal values of second time derivative of a coupled variable.
Definition: Coupleable.C:2015
const ADVariableGradient & getADDefaultGradient() const
Helper method to return (and insert if necessary) the default gradient for Automatic Differentiation ...
Definition: Coupleable.C:2409
static constexpr std::size_t dim
This is the dimension of all vector and tensor datastructures used in MOOSE.
Definition: Moose.h:163
const VectorVariableValue * getDefaultVectorValue(const std::string &var_name) const
Helper method to return (and insert if necessary) the default value for an uncoupled vector variable...
Definition: Coupleable.C:398
std::set< std::string >::const_iterator coupledVarsBegin() const
Methods returning iterators to the coupled variables names stored in this InputParameters object...
std::vector< std::set< MooseWritableVariable * > > _writable_coupled_variables
keep a set of allocated writable variable references to make sure only one object can obtain them per...
Definition: Coupleable.h:1840
virtual const VariableGradient & coupledGradientDotDot(const std::string &var_name, unsigned int comp=0) const
Second time derivative of the gradient of a coupled variable.
Definition: Coupleable.C:1630
VariableValue _default_value_zero
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1477
std::unordered_map< std::string, std::vector< MooseVariableScalar * > > _c_coupled_scalar_vars
Scalar variables coupled into this object (for error checking)
Definition: Coupleable.h:1824
MooseVariable * getVar(const std::string &var_name, unsigned int comp)
Extract pointer to a coupled variable.
Definition: Coupleable.C:324
const ADVectorVariableCurl & getADDefaultCurl() const
Helper method to return (and insert if necessary) the default curl value for Automatic Differentiatio...
Definition: Coupleable.C:2430
OutputTools< RealVectorValue >::VariableCurl VectorVariableCurl
Definition: MooseTypes.h:363
virtual const ArrayVariableValue & coupledArrayDotOld(const std::string &var_name, unsigned int comp=0) const
Old time derivative of a coupled array variable.
Definition: Coupleable.C:1430
virtual const VariableValue & coupledValueOld(const std::string &var_name, unsigned int comp=0) const
Returns an old value from previous time step of a coupled variable.
Definition: Coupleable.C:1037
This class provides an interface for common operations on field variables of both FE and FV types wit...
virtual const ArrayVariableValue & coupledArrayDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled array variable.
Definition: Coupleable.C:1386
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
virtual const VariableValue & coupledMatrixTagValue(const std::string &var_names, TagID tag, unsigned int index=0) const
Returns value of a coupled variable for a given tag.
Definition: Coupleable.C:827
virtual void coupledCallback(const std::string &, bool) const
A call-back function provided by the derived object for actions before coupling a variable with funct...
Definition: Coupleable.h:149
const ADVariableGradient & adZeroGradient() const
method that returns _grad_zero to RESIDUAL computing objects and _ad_grad_zero to JACOBIAN computing ...
Definition: Coupleable.C:2444
const Number zero
MooseWritableVariable & writableVariable(const std::string &var_name, unsigned int comp=0)
Returns a writable MooseVariable object for a nodal or elemental variable.
Definition: Coupleable.C:914
Base class for a system (of equations)
Definition: SystemBase.h:85
virtual const VectorVariableDivergence & coupledDivOlder(const std::string &var_name, unsigned int comp=0) const
Returns an old divergence from two time steps previous of a coupled variable.
Definition: Coupleable.C:1843
std::unordered_map< std::string, std::unique_ptr< VectorVariableValue > > _default_vector_value
Will hold the default value for optional vector coupled variables.
Definition: Coupleable.h:1464
virtual VariableValue & writableCoupledValue(const std::string &var_name, unsigned int comp=0)
Returns a writable reference to a coupled variable for writing to multiple AuxVariables from a single...
Definition: Coupleable.C:950
DualNumber< Real, DNDerivativeType, true > ADReal
Definition: ADRealForward.h:42
std::vector< VariableName > coupledNames(const std::string &var_name) const
Names of the variables in the Coupleable interface.
Definition: Coupleable.C:2538
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
virtual const VariableGradient & coupledGradient(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled variable.
Definition: Coupleable.C:1549
MooseApp & getMooseApp() const
Get the MooseApp this class is associated with.
Definition: MooseBase.h:87
const T & coupledNodalValuePreviousNL(const std::string &var_name, unsigned int comp=0) const
Returns nodal values of a coupled variable for previous Newton iterate.
Definition: Coupleable.C:1985
auto max(const L &left, const R &right)
std::vector< const ADVariableValue * > adCoupledValues(const std::string &var_name) const
Returns the values for all of a coupled variable&#39;s components for use in Automatic Differentiation...
Definition: Coupleable.C:2573
virtual const VariableValue & coupledValueOlder(const std::string &var_name, unsigned int comp=0) const
Returns an old value from two time steps previous of a coupled variable.
Definition: Coupleable.C:1059
std::vector< MooseVariable * > _coupled_standard_moose_vars
Vector of standard coupled variables.
Definition: Coupleable.h:1429
unsigned int numberDefaultCoupledValues(const std::string &coupling_name) const
Get the number of defaulted coupled value entries.
const ADVariableValue & adCoupledDotDot(const std::string &var_name, unsigned int comp=0) const
Second time derivative of a coupled variable for ad simulations.
Definition: Coupleable.C:2311
const SystemBase *const _c_sys
Pointer to the system object if the moose object this is an interface for has one.
Definition: Coupleable.h:1420
FEProblemBase & _c_fe_problem
Definition: Coupleable.h:1417
virtual const ArrayVariableValue & coupledVectorTagArrayValue(const std::string &var_names, TagID tag, unsigned int index=0) const
Returns value of a coupled array variable for a given tag.
Definition: Coupleable.C:671
std::string toUpper(std::string name)
Convert supplied string to upper case.
virtual const VariableSecond & coupledSecondOlder(const std::string &var_name, unsigned int comp=0) const
Returns an old second derivative from two time steps previous of a coupled variable.
Definition: Coupleable.C:1891
A user object that runs over all the nodes and does an aggregation step to compute a single value...
const OutputTools< T >::VariableValue & vectorTagDofValueHelper(const std::string &var_name, TagID tag, unsigned int comp=0) const
Generic helper method to get vector tag degree of freedom values based on tag ID. ...
Definition: Coupleable.C:764
bool _c_is_implicit
True if implicit value is required.
Definition: Coupleable.h:1447
virtual const VariableValue & coupledValue(const std::string &var_name, unsigned int comp=0) const
Returns value of a coupled variable.
Definition: Coupleable.C:533
const ADVariableValue & adCoupledLowerValue(const std::string &var_name, unsigned int comp=0) const
Returns value of a coupled lower-dimensional variable for use in Automatic Differentiation.
Definition: Coupleable.C:2211
virtual const VectorVariableValue & coupledVectorValueOlder(const std::string &var_name, unsigned int comp=0) const
Returns an old value from two time steps previous of a coupled vector variable.
Definition: Coupleable.C:1119
std::vector< VectorMooseVariable * > _coupled_vector_moose_vars
Vector of vector coupled variables.
Definition: Coupleable.h:1432
const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:103
void requestStates(const std::string &var_name, const TagName &tag_name, const unsigned int comp)
Method that may request additional solution states from the variable&#39;s system depending on the value ...
Definition: Coupleable.C:584
virtual const VariableValue & coupledValueLower(const std::string &var_name, unsigned int comp=0) const
Returns value of a coupled lower-dimensional variable.
Definition: Coupleable.C:638
Coupleable(const MooseObject *moose_object, bool nodal, bool is_fv=false)
Constructing the object.
Definition: Coupleable.C:27
virtual const VariableGradient & coupledGradientOld(const std::string &var_name, unsigned int comp=0) const
Returns an old gradient from previous time step of a coupled variable.
Definition: Coupleable.C:1565
std::vector< const VariableValue * > coupledVectorTagDofValues(const std::string &var_names, TagID tag) const
Returns the dof values for all the coupled variables desired for a given tag.
Definition: Coupleable.C:2680
OutputTools< RealEigenVector >::VariableValue ArrayVariableValue
Definition: MooseTypes.h:377
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
virtual const VariableValue & coupledVectorDotDu(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled vector variable with respect to the coefficients.
Definition: Coupleable.C:1354
void addFEVariableCoupleableVectorTag(TagID tag)
Definition: Coupleable.h:116
virtual const VariableSecond & coupledSecondOld(const std::string &var_name, unsigned int comp=0) const
Returns an old second spatial derivatives from previous time step of a coupled variable.
Definition: Coupleable.C:1875
std::set< std::string >::const_iterator coupledVarsEnd() const
Moose::GenericType< VariableValue, is_ad > GenericVariableValue
Definition: MooseTypes.h:707
const TagName OLD_SOLUTION_TAG
Definition: MooseTypes.C:26
Every object that can be built by the factory should be derived from this class.
Definition: MooseObject.h:28
virtual TagID getMatrixTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition: SubProblem.C:343
Moose::GenericType< VariableGradient, is_ad > GenericVariableGradient
Definition: MooseTypes.h:711
virtual const ArrayVariableValue & coupledArrayValue(const std::string &var_name, unsigned int comp=0) const
Returns value of a coupled array variable.
Definition: Coupleable.C:885
bool hasDefaultCoupledValue(const std::string &coupling_name) const
Return whether or not the requested parameter has a default coupled value.
const OutputTools< T >::VariableValue & vectorTagValueHelper(const std::string &var_names, TagID tag, unsigned int index=0) const
Generic helper method to get vector tag values based on tag ID.
Definition: Coupleable.C:558
std::vector< const VariableGradient * > coupledGradientsOld(const std::string &var_name) const
Returns the old gradients for all of a coupled variable&#39;s components.
Definition: Coupleable.C:2777
virtual const ArrayVariableGradient & coupledVectorTagArrayGradient(const std::string &var_names, TagID tag, unsigned int index=0) const
Returns gradient of a coupled array variable for a given tag.
Definition: Coupleable.C:725
A NodeFaceConstraint is used when you need to create constraints between two surfaces in a mesh...
VariableGradient _default_gradient
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1480
Real defaultCoupledValue(const std::string &coupling_name, unsigned int i=0) const
Get the default value for an optionally coupled variable.
VariableSecond _default_second
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1489
std::unordered_map< std::string, std::unique_ptr< MooseArray< ADReal > > > _ad_default_value
Will hold the default value for optional coupled variables for automatic differentiation.
Definition: Coupleable.h:1460
const VariableValue * getDefaultValue(const std::string &var_name, unsigned int comp) const
Helper method to return (and insert if necessary) the default value for an uncoupled variable...
Definition: Coupleable.C:371
std::vector< const ADVariableValue * > adCoupledDots(const std::string &var_name) const
Returns the time derivatives for all of a coupled variable&#39;s components for ad simulations.
Definition: Coupleable.C:2791
void needsPreviousNewtonIteration(bool state)
Set a flag that indicated that user required values for the previous Newton iterate.
virtual const VariableGradient & coupledGradientDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of the gradient of a coupled variable.
Definition: Coupleable.C:1614
virtual bool hasScalarVariable(const std::string &var_name) const =0
Returns a Boolean indicating whether any system contains a variable with the name provided...
const ADVariableValue * getADDefaultValue(const std::string &var_name) const
Helper method to return (and insert if necessary) the default value for Automatic Differentiation for...
Definition: Coupleable.C:2378
const ADVariableValue & adCoupledDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled variable for ad simulations.
Definition: Coupleable.C:2288
const std::string & _c_name
The name of the object this interface is part of.
Definition: Coupleable.h:1412
virtual const VectorVariableCurl & coupledCurlOld(const std::string &var_name, unsigned int comp=0) const
Returns an old curl from previous time step of a coupled variable.
Definition: Coupleable.C:1762
virtual const ADVariableValue & adCoupledDofValues(const std::string &var_name, unsigned int comp=0) const
Returns DOF value of a coupled variable for use in Automatic Differentiation.
Definition: Coupleable.C:2138
void mooseDeprecated(Args &&... args)
Emit a deprecated code/feature message with the given stringified, concatenated args.
Definition: MooseError.h:363
virtual bool vectorTagExists(const TagID tag_id) const
Check to see if a particular Tag exists.
Definition: SubProblem.h:201
virtual const VariableValue & coupledNodalDotDotOld(const std::string &var_name, unsigned int comp=0) const
Nodal values of old second time derivative of a coupled variable.
Definition: Coupleable.C:2047
unsigned int number() const
Gets the number of this system.
Definition: SystemBase.C:1158
std::vector< const VariableValue * > coupledAllDofValuesOld(const std::string &var_name) const
Returns DoFs in the old solution vector of all of a coupled variable&#39;s components for the local eleme...
Definition: Coupleable.C:2097
std::vector< const VariableGradient * > coupledGradients(const std::string &var_name) const
Returns the gradients for all of a coupled variable&#39;s components.
Definition: Coupleable.C:2748
virtual const MooseVariableFieldBase & getVariable(const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type=Moose::VarKindType::VAR_ANY, Moose::VarFieldType expected_var_field_type=Moose::VarFieldType::VAR_FIELD_ANY) const =0
Returns the variable reference for requested variable which must be of the expected_var_type (Nonline...
std::vector< const VariableValue * > coupledAllDofValuesOlder(const std::string &var_name) const
Returns DoFs in the older solution vector of all of a coupled variable&#39;s components for the local ele...
Definition: Coupleable.C:2117
AuxiliarySystem & getAuxiliarySystem()
const ADVectorVariableValue & adCoupledVectorDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a vector coupled variable for ad simulations.
Definition: Coupleable.C:2328
virtual bool hasVariable(const std::string &var_name) const =0
Whether or not this problem has the variable.
virtual bool hasVariable(const std::string &var_name) const
Query a system for a variable.
Definition: SystemBase.C:852
virtual const VariableValue & coupledDofValuesOlder(const std::string &var_name, unsigned int comp=0) const
Returns DoFs in the older solution vector of a coupled variable for the local element.
Definition: Coupleable.C:2104
const ADVectorVariableGradient & getADDefaultVectorGradient() const
Helper method to return (and insert if necessary) the default gradient for Automatic Differentiation ...
Definition: Coupleable.C:2416
const ADVariableValue & adZeroValue() const
method that returns _zero to RESIDUAL computing objects and _ad_zero to JACOBIAN computing objects ...
Definition: Coupleable.C:2437
std::vector< unsigned int > coupledIndices(const std::string &var_name) const
Returns the indices for a coupled variable&#39;s components.
Definition: Coupleable.C:2514
const T & coupledNodalValueOlder(const std::string &var_name, unsigned int comp=0) const
Returns an old nodal value from two time steps previous of a coupled variable.
Definition: Coupleable.C:1965
const MooseObject *const _obj
Definition: Coupleable.h:1833
VectorVariableGradient _default_vector_gradient
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1526
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
std::vector< MooseVariableFieldBase * > _coupled_moose_vars
Vector of all coupled variables.
Definition: Coupleable.h:1426
virtual const VectorVariableCurl & coupledCurl(const std::string &var_name, unsigned int comp=0) const
Returns curl of a coupled variable.
Definition: Coupleable.C:1746
OutputTools< Real >::VariableValue VariableValue
Definition: MooseTypes.h:343
virtual const ArrayVariableGradient & coupledArrayGradient(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled array variable.
Definition: Coupleable.C:1694
virtual const VariableValue & coupledDotDu(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled variable with respect to the coefficients.
Definition: Coupleable.C:1474
unsigned int coupledComponents(const std::string &var_name) const
Number of coupled components.
Definition: Coupleable.C:188
bool _coupleable_neighbor
Whether or not this object is a "neighbor" object: ie all of it&#39;s coupled values should be neighbor v...
Definition: Coupleable.h:1732
virtual const ArrayVariableGradient & coupledArrayGradientOlder(const std::string &var_name, unsigned int comp=0) const
Returns an old gradient from two time steps previous of a coupled array variable. ...
Definition: Coupleable.C:1720
virtual const VariableValue & coupledVectorDotDotDu(const std::string &var_name, unsigned int comp=0) const
Second time derivative of a coupled vector variable with respect to the coefficients.
Definition: Coupleable.C:1370
void checkComponent(const MooseObject *obj, unsigned int comp, unsigned int bound, const std::string &var_name)
Definition: Coupleable.C:208
std::vector< const ADVariableGradient * > adCoupledGradients(const std::string &var_name) const
Returns the gradients for all of a coupled variable&#39;s components for use in Automatic Differentiation...
Definition: Coupleable.C:2770
Interface for objects that needs coupling capabilities.
Definition: Coupleable.h:52
forward declarations
std::vector< MooseVariableField< Real > * > _coupled_fv_moose_vars
Vector of all finite volume coupled variables.
Definition: Coupleable.h:1438
std::vector< const VariableValue * > coupledValues(const std::string &var_name) const
Returns the values for all of a coupled variable components.
Definition: Coupleable.C:2545
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
std::vector< const ArrayVariableGradient * > coupledVectorTagArrayGradients(const std::string &var_names, TagID tag) const
Returns gradients for all the coupled variables desired for a given tag.
Definition: Coupleable.C:2657
const T & getDefaultNodalValue(const std::string &var_name, unsigned int comp=0) const
Get nodal default value.
Definition: Coupleable.C:455
Generic class for solving transient nonlinear problems.
Definition: SubProblem.h:78
virtual const VectorVariableGradient & coupledVectorGradientOlder(const std::string &var_name, unsigned int comp=0) const
Returns an old gradient from two time steps previous of a coupled vector variable.
Definition: Coupleable.C:1678
const MooseArray< ADRealTensorValue > & _ad_second_zero
Definition: Coupleable.h:1511
VectorVariableValue _default_vector_value_zero
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1523
std::vector< const MooseVariableFieldBase * > getFieldVars(const std::string &var_name) const
Definition: Coupleable.C:318
bool checkVar(const std::string &var_name, unsigned int comp=0, unsigned int comp_bound=0) const
Check that the right kind of variable is being coupled in.
Definition: Coupleable.C:239
virtual const VariableValue & coupledValuePreviousNL(const std::string &var_name, unsigned int comp=0) const
Returns value of previous Newton iterate of a coupled variable.
Definition: Coupleable.C:1081
bool hasBlocks(const SubdomainID id) const override
Returns whether the functor is defined on this block.
MooseArray< ADRealTensorValue > _ad_default_vector_gradient
This will always be zero because the default values for optionally coupled vector variables is always...
Definition: Coupleable.h:1486
virtual const VectorVariableValue & coupledVectorValue(const std::string &var_name, unsigned int comp=0) const
Returns value of a coupled vector variable.
Definition: Coupleable.C:860
std::string checkForRename(const std::string &name) const
Checks whether the provided name is a renamed parameter name.
virtual const VariableValue & coupledDotDotOld(const std::string &var_name, unsigned int comp=0) const
Old second time derivative of a coupled variable.
Definition: Coupleable.C:1265
MooseArray< ADRealTensorValue > _ad_default_second
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1492
const VariableValue & coupledArrayDotDu(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled array variable with respect to the coefficients.
Definition: Coupleable.C:1524
std::vector< const VariableValue * > coupledVectorTagValues(const std::string &var_names, TagID tag) const
Returns the values for all the coupled variables desired for a given tag.
Definition: Coupleable.C:2588
ArrayMooseVariable * getArrayVar(const std::string &var_name, unsigned int comp)
Extract pointer to a coupled array variable.
Definition: Coupleable.C:342
virtual const ArrayVariableValue & coupledArrayDotDot(const std::string &var_name, unsigned int comp=0) const
Second time derivative of a coupled array variable.
Definition: Coupleable.C:1408
An interface that restricts an object to subdomains via the &#39;blocks&#39; input parameter.
Class for scalar variables (they are different).
IntRange< T > make_range(T beg, T end)
void resize(unsigned int size)
Change the number of elements the array can store.
Definition: MooseArray.h:216
const ADVectorVariableGradient & adCoupledVectorGradient(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled vector variable for use in Automatic Differentiation.
Definition: Coupleable.C:2362
std::unordered_map< std::string, std::vector< unsigned int > > _optional_var_index
Unique indices for optionally coupled vars that weren&#39;t provided.
Definition: Coupleable.h:1821
const MooseVariableFieldBase * getFEVar(const std::string &var_name, unsigned int comp) const
Deprecated method.
Definition: Coupleable.C:298
std::unordered_map< std::string, std::vector< std::unique_ptr< VariableValue > > > _default_value
Will hold the default value for optional coupled variables.
Definition: Coupleable.h:1457
std::vector< const VariableValue * > coupledMatrixTagValues(const std::string &var_names, TagID tag) const
Returns the diagonal matrix values for all the coupled variables desired for a given tag...
Definition: Coupleable.C:2703
Moose::GenericType< VariableSecond, is_ad > GenericVariableSecond
Definition: MooseTypes.h:713
const InputParameters & _c_parameters
Definition: Coupleable.h:1409
OutputTools< Real >::VariableSecond VariableSecond
Definition: MooseTypes.h:345
const MooseArray< ADReal > & _ad_zero
Definition: Coupleable.h:1500
Eigen::Matrix< Real, Eigen::Dynamic, 1 > RealEigenVector
Definition: MooseTypes.h:147
virtual const ArrayVariableGradient & coupledArrayGradientOld(const std::string &var_name, unsigned int comp=0) const
Returns an old gradient from previous time step of a coupled array variable.
Definition: Coupleable.C:1707
const std::vector< T * > & getInterfaceObjects() const
Gets the registered interface objects for a given interface.
Definition: MooseApp.h:1760
const Moose::ADType< T >::type & adCoupledNodalValue(const std::string &var_name, unsigned int comp=0) const
Returns AD nodal values of a coupled variable.
Definition: Coupleable.C:2169
virtual const VariableValue & coupledNodalDotOld(const std::string &var_name, unsigned int comp=0) const
Nodal values of old time derivative of a coupled variable.
Definition: Coupleable.C:2031
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
std::unordered_map< std::string, std::unique_ptr< ArrayVariableValue > > _default_array_value
Will hold the default value for optional array coupled variables.
Definition: Coupleable.h:1467
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type...
OutputTools< RealVectorValue >::VariableGradient VectorVariableGradient
Definition: MooseTypes.h:361
ArrayVariableGradient _default_array_gradient
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1541
virtual bool isTransient() const override
const ADVariableSecond & getADDefaultSecond() const
Helper method to return (and insert if necessary) the default second derivatives for Automatic Differ...
Definition: Coupleable.C:2423
const std::set< std::string > _older_state_tags
vector tag names for which we need to request older solution states from the system ...
Definition: Coupleable.h:1836
virtual const VectorVariableCurl & coupledCurlOlder(const std::string &var_name, unsigned int comp=0) const
Returns an old curl from two time steps previous of a coupled variable.
Definition: Coupleable.C:1778
virtual const VectorVariableDivergence & coupledDiv(const std::string &var_name, unsigned int comp=0) const
Returns divergence of a coupled variable.
Definition: Coupleable.C:1811
virtual const VariableGradient & coupledGradientPreviousNL(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled variable for previous Newton iterate.
Definition: Coupleable.C:1597
ArrayVariableValue _default_array_value_zero
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1538
unsigned int _coupleable_max_qps
Maximum qps for any element in this system.
Definition: Coupleable.h:1818
OutputTools< RealEigenVector >::VariableGradient ArrayVariableGradient
Definition: MooseTypes.h:379
void addFEVariableCoupleableMatrixTag(TagID tag)
Definition: Coupleable.h:118
A NodeElemConstraintBase is used when you need to create constraints between a secondary node and a p...
Moose::VarKindType varKind() const
Definition: SystemBase.h:927
std::vector< std::string > getVecMooseType(const std::string &name) const
std::vector< const ADVectorVariableValue * > adCoupledVectorValues(const std::string &var_name) const
Returns the values for all of a coupled vector variable&#39;s components for use in Automatic Differentia...
Definition: Coupleable.C:2580
const ADVectorVariableSecond & adCoupledVectorSecond(const std::string &, unsigned int)
Definition: Coupleable.C:2281
std::vector< const VectorVariableValue * > coupledVectorValues(const std::string &var_name) const
Returns the values for all of a coupled vector variable&#39;s components.
Definition: Coupleable.C:2552
virtual const VariableValue & coupledDotDot(const std::string &var_name, unsigned int comp=0) const
Second time derivative of a coupled variable.
Definition: Coupleable.C:1201
virtual const ArrayVariableGradient & coupledArrayGradientDot(const std::string &var_name, unsigned int comp=0) const
Retun a gradient of a coupled array variable&#39;s time derivative.
Definition: Coupleable.C:1733
virtual const VectorVariableValue & coupledVectorDotOld(const std::string &var_name, unsigned int comp=0) const
Old time derivative of a coupled vector variable.
Definition: Coupleable.C:1322
const ADVariableGradient & adCoupledGradientDot(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled variable&#39;s time derivative for use in Automatic Differentiation.
Definition: Coupleable.C:2246
void ErrorVector unsigned int
const ADVariableSecond & adCoupledSecond(const std::string &var_name, unsigned int comp=0) const
Returns second derivatives of a coupled variable for use in Automatic Differentiation.
Definition: Coupleable.C:2263
const Elem & get(const ElemType type_in)
virtual const VectorVariableValue & coupledVectorDotDotOld(const std::string &var_name, unsigned int comp=0) const
Old second time derivative of a coupled vector variable.
Definition: Coupleable.C:1338
const ADVectorVariableCurl & adCoupledCurl(const std::string &var_name, unsigned int comp=0) const
Returns curl of a coupled variable for use in objects utilizing Automatic Differentiation.
Definition: Coupleable.C:1794
virtual bool matrixTagExists(const TagName &tag_name) const
Check to see if a particular Tag exists.
Definition: SubProblem.C:329
void registerInterfaceObject(T &interface)
Registers an interface object for accessing with getInterfaceObjects.
Definition: MooseApp.h:1738
const ADVectorVariableValue & adCoupledVectorValue(const std::string &var_name, unsigned int comp=0) const
Returns value of a coupled vector variable for use in Automatic Differentiation.
Definition: Coupleable.C:2344
const T & coupledNodalValueOld(const std::string &var_name, unsigned int comp=0) const
Returns an old nodal value from previous time step of a coupled variable.
Definition: Coupleable.C:1945
MooseArray< ADRealVectorValue > _ad_default_gradient
This will always be zero because the default values for optionally coupled variables is always consta...
Definition: Coupleable.h:1483
std::vector< const VariableValue * > coupledValuesOld(const std::string &var_name) const
Returns the old values for all of a coupled variable&#39;s components.
Definition: Coupleable.C:2726
virtual const VariableGradient & coupledGradientOlder(const std::string &var_name, unsigned int comp=0) const
Returns an old gradient from two time steps previous of a coupled variable.
Definition: Coupleable.C:1581
unsigned int THREAD_ID
Definition: MooseTypes.h:237
std::vector< const VariableValue * > coupledAllDofValues(const std::string &var_name) const
Returns DoFs in the current solution vector of all of a coupled variable&#39;s components for the local e...
Definition: Coupleable.C:2076
const MooseVariableFieldBase * getFieldVar(const std::string &var_name, unsigned int comp) const
Definition: Coupleable.C:312
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another, i.e.
virtual const VectorVariableDivergence & coupledDivOld(const std::string &var_name, unsigned int comp=0) const
Returns an old divergence from previous time step of a coupled variable.
Definition: Coupleable.C:1827