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