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