https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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"
26#include "Material.h"
27
28Coupleable::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(_c_fe_problem.numThreads())
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)
114 _optional_var_index[name][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
153bool
154Coupleable::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
176bool
177Coupleable::isCoupledConstant(const std::string & var_name) const
178{
179 return _c_parameters.hasDefaultCoupledValue(var_name);
180}
181
182unsigned int
183Coupleable::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 {
197 else
198 return 0;
199 }
200}
201
202void
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.
216void
217Coupleable::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
233bool
234Coupleable::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)
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
293Coupleable::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
301Coupleable::getFieldVar(const std::string & var_name, unsigned int comp)
302{
303 return getVarHelper<MooseVariableFieldBase>(var_name, comp);
304}
305
307Coupleable::getFieldVar(const std::string & var_name, unsigned int comp) const
308{
309 return getVarHelper<MooseVariableFieldBase>(var_name, comp);
310}
311
312std::vector<const MooseVariableFieldBase *>
313Coupleable::getFieldVars(const std::string & var_name) const
314{
315 return getVarsHelper<MooseVariableFieldBase>(var_name);
316}
317
319Coupleable::getVar(const std::string & var_name, unsigned int comp)
320{
321 return const_cast<MooseVariable *>(getVarHelper<MooseVariable>(var_name, comp));
322}
323
325Coupleable::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
337Coupleable::getArrayVar(const std::string & var_name, unsigned int comp)
338{
339 return const_cast<ArrayMooseVariable *>(getVarHelper<ArrayMooseVariable>(var_name, comp));
340}
341
342const MooseVariable *
343Coupleable::getVar(const std::string & var_name, unsigned int comp) const
344{
345 return getVarHelper<MooseVariable>(var_name, comp);
346}
347
349Coupleable::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
359const ArrayMooseVariable *
360Coupleable::getArrayVar(const std::string & var_name, unsigned int comp) const
361{
362 return getVarHelper<ArrayMooseVariable>(var_name, comp);
363}
364
365const VariableValue *
366Coupleable::getDefaultValue(const std::string & var_name, unsigned int comp) const
367{
368 // make sure we don't access values that were not provided
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
393Coupleable::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)
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
427const ArrayVariableValue *
428Coupleable::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
448template <typename T>
449const T &
450Coupleable::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
456template <>
457const RealVectorValue &
458Coupleable::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
464template <>
465const RealEigenVector &
466Coupleable::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
472unsigned int
473Coupleable::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?
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
499template <>
501Coupleable::coupledGenericValue<false>(const std::string & var_name, unsigned int comp) const
502{
503 return coupledValue(var_name, comp);
504}
505
506template <>
508Coupleable::coupledGenericValue<true>(const std::string & var_name, unsigned int comp) const
509{
510 return adCoupledValue(var_name, comp);
511}
512
513template <>
515Coupleable::coupledGenericVectorValue<false>(const std::string & var_name, unsigned int comp) const
516{
517 return coupledVectorValue(var_name, comp);
518}
519
520template <>
522Coupleable::coupledGenericVectorValue<true>(const std::string & var_name, unsigned int comp) const
523{
524 return adCoupledVectorValue(var_name, comp);
525}
526
527const VariableValue &
528Coupleable::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
551template <typename T>
552const typename OutputTools<T>::VariableValue &
553Coupleable::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
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
577template <typename T>
578void
579Coupleable::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
595template <typename T>
596const typename OutputTools<T>::VariableValue &
597Coupleable::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
618template <>
620Coupleable::coupledGenericDofValue<false>(const std::string & var_name, unsigned int comp) const
621{
622 return coupledDofValues(var_name, comp);
623}
624
625template <>
627Coupleable::coupledGenericDofValue<true>(const std::string & var_name, unsigned int comp) const
628{
629 return adCoupledDofValues(var_name, comp);
630}
631
632const VariableValue &
633Coupleable::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
649const VariableValue &
650Coupleable::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
657const VariableValue &
658Coupleable::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
665const ArrayVariableValue &
666Coupleable::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
673const ArrayVariableValue &
674Coupleable::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
681const VariableGradient &
682Coupleable::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
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
703const VariableGradient &
704Coupleable::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
720Coupleable::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
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
742Coupleable::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
757template <typename T>
758const typename OutputTools<T>::VariableValue &
759Coupleable::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
773template <typename T>
774const typename OutputTools<T>::VariableValue &
775Coupleable::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
797const VariableValue &
798Coupleable::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
805const VariableValue &
806Coupleable::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
813const ArrayVariableValue &
814Coupleable::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
821const VariableValue &
822Coupleable::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
838const VariableValue &
839Coupleable::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
855Coupleable::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
879const ArrayVariableValue &
880Coupleable::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
901std::vector<const ArrayVariableValue *>
902Coupleable::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
909Coupleable::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
946Coupleable::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)
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()))
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
983void
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
1034}
1035
1036const VariableValue &
1037Coupleable::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
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
1058const VariableValue &
1059Coupleable::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
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
1080const VariableValue &
1081Coupleable::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
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
1103const VectorVariableValue &
1104Coupleable::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();
1114 return (_c_is_implicit) ? var->slnOld() : var->slnOlder();
1115 return (_c_is_implicit) ? var->slnOldNeighbor() : var->slnOlderNeighbor();
1116}
1117
1118const VectorVariableValue &
1119Coupleable::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
1127 return var->slnOlder();
1128 return var->slnOlderNeighbor();
1129}
1130
1131const ArrayVariableValue &
1132Coupleable::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
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
1153const ArrayVariableValue &
1154Coupleable::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
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
1175const VariableValue &
1176Coupleable::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
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
1200const VariableValue &
1201Coupleable::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
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
1225template <>
1227Coupleable::coupledGenericDotDot<false>(const std::string & var_name, unsigned int comp) const
1228{
1229 return coupledDotDot(var_name, comp);
1230}
1231
1232template <>
1234Coupleable::coupledGenericDotDot<true>(const std::string & var_name, unsigned int comp) const
1235{
1236 return adCoupledDotDot(var_name, comp);
1237}
1238
1239const VariableValue &
1240Coupleable::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
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
1264const VariableValue &
1265Coupleable::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
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
1289const VectorVariableValue &
1290Coupleable::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
1301 return var->uDot();
1302 return var->uDotNeighbor();
1303}
1304
1305const VectorVariableValue &
1306Coupleable::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
1317 return var->uDotDot();
1318 return var->uDotDotNeighbor();
1319}
1320
1321const VectorVariableValue &
1322Coupleable::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
1333 return var->uDotOld();
1334 return var->uDotOldNeighbor();
1335}
1336
1337const VectorVariableValue &
1338Coupleable::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
1349 return var->uDotDotOld();
1350 return var->uDotDotOldNeighbor();
1351}
1352
1353const VariableValue &
1354Coupleable::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
1365 return var->duDotDu();
1366 return var->duDotDuNeighbor();
1367}
1368
1369const VariableValue &
1370Coupleable::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
1381 return var->duDotDotDu();
1382 return var->duDotDotDuNeighbor();
1383}
1384
1385const ArrayVariableValue &
1386Coupleable::coupledArrayDot(const std::string & var_name, unsigned int comp) const
1387{
1388 const auto * var = getArrayVar(var_name, comp);
1389 if (!var)
1392
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
1407const ArrayVariableValue &
1408Coupleable::coupledArrayDotDot(const std::string & var_name, unsigned int comp) const
1409{
1410 const auto * var = getArrayVar(var_name, comp);
1411 if (!var)
1414
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
1429const ArrayVariableValue &
1430Coupleable::coupledArrayDotOld(const std::string & var_name, unsigned int comp) const
1431{
1432 const auto * var = getArrayVar(var_name, comp);
1433 if (!var)
1436
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
1451const ArrayVariableValue &
1452Coupleable::coupledArrayDotDotOld(const std::string & var_name, unsigned int comp) const
1453{
1454 const auto * var = getArrayVar(var_name, comp);
1455 if (!var)
1458
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
1473const VariableValue &
1474Coupleable::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
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
1498const VariableValue &
1499Coupleable::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
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
1523const VariableValue &
1524Coupleable::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
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
1548const VariableGradient &
1549Coupleable::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
1560 return (_c_is_implicit) ? var->gradSln() : var->gradSlnOld();
1561 return (_c_is_implicit) ? var->gradSlnNeighbor() : var->gradSlnOldNeighbor();
1562}
1563
1564const VariableGradient &
1565Coupleable::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
1576 return (_c_is_implicit) ? var->gradSlnOld() : var->gradSlnOlder();
1577 return (_c_is_implicit) ? var->gradSlnOldNeighbor() : var->gradSlnOlderNeighbor();
1578}
1579
1580const VariableGradient &
1581Coupleable::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
1592 return var->gradSlnOlder();
1593 return var->gradSlnOlderNeighbor();
1594}
1595
1596const VariableGradient &
1597Coupleable::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
1609 return var->gradSlnPreviousNL();
1610 return var->gradSlnPreviousNLNeighbor();
1611}
1612
1613const VariableGradient &
1614Coupleable::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
1625 return var->gradSlnDot();
1626 return var->gradSlnNeighborDot();
1627}
1628
1629const VariableGradient &
1630Coupleable::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
1641 return var->gradSlnDotDot();
1642 return var->gradSlnNeighborDotDot();
1643}
1644
1646Coupleable::coupledVectorGradient(const std::string & var_name, unsigned int comp) const
1647{
1648 const auto * var = getVectorVar(var_name, comp);
1649 if (!var)
1650 {
1653 }
1655
1657 return (_c_is_implicit) ? var->gradSln() : var->gradSlnOld();
1658 return (_c_is_implicit) ? var->gradSlnNeighbor() : var->gradSlnOldNeighbor();
1659}
1660
1662Coupleable::coupledVectorGradientOld(const std::string & var_name, unsigned int comp) const
1663{
1664 const auto * var = getVectorVar(var_name, comp);
1665 if (!var)
1666 {
1669 }
1671
1673 return (_c_is_implicit) ? var->gradSlnOld() : var->gradSlnOlder();
1674 return (_c_is_implicit) ? var->gradSlnOldNeighbor() : var->gradSlnOlderNeighbor();
1675}
1676
1678Coupleable::coupledVectorGradientOlder(const std::string & var_name, unsigned int comp) const
1679{
1680 const auto * var = getVectorVar(var_name, comp);
1681 if (!var)
1682 {
1685 }
1687
1689 return var->gradSlnOlder();
1690 return var->gradSlnOlderNeighbor();
1691}
1692
1694Coupleable::coupledArrayGradient(const std::string & var_name, unsigned int comp) const
1695{
1696 const auto * var = getArrayVar(var_name, comp);
1697 if (!var)
1700
1702 return (_c_is_implicit) ? var->gradSln() : var->gradSlnOld();
1703 return (_c_is_implicit) ? var->gradSlnNeighbor() : var->gradSlnOldNeighbor();
1704}
1705
1707Coupleable::coupledArrayGradientOld(const std::string & var_name, unsigned int comp) const
1708{
1709 const auto * var = getArrayVar(var_name, comp);
1710 if (!var)
1713
1715 return (_c_is_implicit) ? var->gradSlnOld() : var->gradSlnOlder();
1716 return (_c_is_implicit) ? var->gradSlnOldNeighbor() : var->gradSlnOlderNeighbor();
1717}
1718
1720Coupleable::coupledArrayGradientOlder(const std::string & var_name, unsigned int comp) const
1721{
1722 const auto * var = getArrayVar(var_name, comp);
1723 if (!var)
1726
1728 return var->gradSlnOlder();
1729 return var->gradSlnOlderNeighbor();
1730}
1731
1733Coupleable::coupledArrayGradientDot(const std::string & var_name, unsigned int comp) const
1734{
1735 const auto * const var = getArrayVar(var_name, comp);
1736 if (!var)
1739
1741 return var->gradSlnDot();
1742 return var->gradSlnNeighborDot();
1743}
1744
1745const VectorVariableCurl &
1746Coupleable::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
1757 return (_c_is_implicit) ? var->curlSln() : var->curlSlnOld();
1758 return (_c_is_implicit) ? var->curlSlnNeighbor() : var->curlSlnOldNeighbor();
1759}
1760
1761const VectorVariableCurl &
1762Coupleable::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
1773 return (_c_is_implicit) ? var->curlSlnOld() : var->curlSlnOlder();
1774 return (_c_is_implicit) ? var->curlSlnOldNeighbor() : var->curlSlnOlderNeighbor();
1775}
1776
1777const VectorVariableCurl &
1778Coupleable::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
1789 return var->curlSlnOlder();
1790 return var->curlSlnOlderNeighbor();
1791}
1792
1794Coupleable::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
1806 return var->adCurlSln();
1807 return var->adCurlSlnNeighbor();
1808}
1809
1811Coupleable::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
1822 return (_c_is_implicit) ? var->divSln() : var->divSlnOld();
1823 return (_c_is_implicit) ? var->divSlnNeighbor() : var->divSlnOldNeighbor();
1824}
1825
1827Coupleable::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
1838 return (_c_is_implicit) ? var->divSlnOld() : var->divSlnOlder();
1839 return (_c_is_implicit) ? var->divSlnOldNeighbor() : var->divSlnOlderNeighbor();
1840}
1841
1843Coupleable::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
1854 return var->divSlnOlder();
1855 return var->divSlnOlderNeighbor();
1856}
1857
1858const VariableSecond &
1859Coupleable::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
1870 return (_c_is_implicit) ? var->secondSln() : var->secondSlnOlder();
1871 return (_c_is_implicit) ? var->secondSlnNeighbor() : var->secondSlnOlderNeighbor();
1872}
1873
1874const VariableSecond &
1875Coupleable::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
1886 return (_c_is_implicit) ? var->secondSlnOld() : var->secondSlnOlder();
1887 return (_c_is_implicit) ? var->secondSlnOldNeighbor() : var->secondSlnOlderNeighbor();
1888}
1889
1890const VariableSecond &
1891Coupleable::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
1902 return var->secondSlnOlder();
1903 return var->secondSlnOlderNeighbor();
1904}
1905
1906const VariableSecond &
1907Coupleable::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
1919 return var->secondSlnPreviousNL();
1920 return var->secondSlnPreviousNLNeighbor();
1921}
1922
1923template <typename T>
1924const T &
1925Coupleable::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
1939 return (_c_is_implicit) ? var->nodalValue() : var->nodalValueOld();
1940 return (_c_is_implicit) ? var->nodalValueNeighbor() : var->nodalValueOldNeighbor();
1941}
1942
1943template <typename T>
1944const T &
1945Coupleable::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
1959 return (_c_is_implicit) ? var->nodalValueOld() : var->nodalValueOlder();
1960 return (_c_is_implicit) ? var->nodalValueOldNeighbor() : var->nodalValueOlderNeighbor();
1961}
1962
1963template <typename T>
1964const T &
1965Coupleable::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
1979 return var->nodalValueOlder();
1980 return var->nodalValueOlderNeighbor();
1981}
1982
1983template <typename T>
1984const T &
1985Coupleable::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
1995 return var->nodalValuePreviousNL();
1996 return var->nodalValuePreviousNLNeighbor();
1997}
1998
1999template <typename T>
2000const T &
2001Coupleable::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
2010 return var->nodalValueDot();
2011 mooseError("Neighbor version not implemented");
2012}
2013
2014const VariableValue &
2015Coupleable::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
2026 return var->dofValuesDotDot();
2027 return var->dofValuesDotDotNeighbor();
2028}
2029
2030const VariableValue &
2031Coupleable::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
2042 return var->dofValuesDotOld();
2043 return var->dofValuesDotOldNeighbor();
2044}
2045
2046const VariableValue &
2047Coupleable::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
2058 return var->dofValuesDotDotOld();
2059 return var->dofValuesDotDotOldNeighbor();
2060}
2061
2062const VariableValue &
2063Coupleable::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
2071 return (_c_is_implicit) ? var->dofValues() : var->dofValuesOld();
2072 return (_c_is_implicit) ? var->dofValuesNeighbor() : var->dofValuesOldNeighbor();
2073}
2074
2075std::vector<const VariableValue *>
2076Coupleable::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
2083const VariableValue &
2084Coupleable::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
2092 return (_c_is_implicit) ? var->dofValuesOld() : var->dofValuesOlder();
2093 return (_c_is_implicit) ? var->dofValuesOldNeighbor() : var->dofValuesOlderNeighbor();
2094}
2095
2096std::vector<const VariableValue *>
2097Coupleable::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
2103const VariableValue &
2104Coupleable::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
2112 return var->dofValuesOlder();
2113 return var->dofValuesOlderNeighbor();
2114}
2115
2116std::vector<const VariableValue *>
2117Coupleable::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
2124const ArrayVariableValue &
2125Coupleable::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
2133 return (_c_is_implicit) ? var->dofValues() : var->dofValuesOld();
2134 return (_c_is_implicit) ? var->dofValuesNeighbor() : var->dofValuesOldNeighbor();
2135}
2136
2137const ADVariableValue &
2138Coupleable::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
2150 return var->adDofValues();
2151 return var->adDofValuesNeighbor();
2152}
2153
2154void
2155Coupleable::validateExecutionerType(const std::string & name, const std::string & fn_name) const
2156{
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
2167template <typename T>
2168const typename Moose::ADType<T>::type &
2169Coupleable::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
2190const ADVariableValue &
2191Coupleable::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
2206 return var->adSln();
2207 return var->adSlnNeighbor();
2208}
2209
2210const ADVariableValue &
2211Coupleable::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
2228const ADVariableGradient &
2229Coupleable::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
2241 return usesFaceCoupledValues() ? var->adGradSlnFace() : var->adGradSln();
2242 return var->adGradSlnNeighbor();
2243}
2244
2245const ADVariableGradient &
2246Coupleable::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 mooseAssert(!usesFaceCoupledValues(),
2257 "The AD gradient time derivative is not computed on element faces");
2258
2260 return var->adGradSlnDot();
2261 return var->adGradSlnNeighborDot();
2262}
2263
2264const ADVariableSecond &
2265Coupleable::adCoupledSecond(const std::string & var_name, unsigned int comp) const
2266{
2267 const auto * var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2268
2269 if (!var)
2270 return getADDefaultSecond();
2272
2273 if (!_c_is_implicit)
2274 mooseError("Not implemented");
2275
2277 return var->adSecondSln();
2278 else
2279 return var->adSecondSlnNeighbor();
2280}
2281
2283adCoupledVectorSecond(const std::string & /*var_name*/, unsigned int /*comp = 0*/)
2284{
2285 mooseError("Automatic differentiation using second derivatives of vector variables is not "
2286 "implemented.");
2287}
2288
2289const ADVariableValue &
2290Coupleable::adCoupledDot(const std::string & var_name, unsigned int comp) const
2291{
2292 const auto * var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2293
2294 if (!var)
2295 return *getADDefaultValue(var_name);
2297
2299 {
2300 if (_c_nodal)
2301 return var->adDofValuesDot();
2302 return var->adUDot();
2303 }
2304 else
2305 {
2306 if (_c_nodal)
2307 mooseError("AD neighbor nodal dof dot not implemented");
2308 return var->adUDotNeighbor();
2309 }
2310}
2311
2312const ADVariableValue &
2313Coupleable::adCoupledDotDot(const std::string & var_name, unsigned int comp) const
2314{
2315 const auto * const var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2316
2317 if (!var)
2318 return *getADDefaultValue(var_name);
2320
2321 if (_c_nodal)
2322 mooseError("Not implemented");
2323
2325 return var->adUDotDot();
2326 return var->adUDotDotNeighbor();
2327}
2328
2330Coupleable::adCoupledVectorDot(const std::string & var_name, unsigned int comp) const
2331{
2332 const auto * var = getVectorVar(var_name, comp);
2333 if (!var)
2334 return *getADDefaultVectorValue(var_name);
2336
2337 if (_c_nodal)
2338 mooseError("Not implemented");
2339
2341 return var->adUDot();
2342 return var->adUDotNeighbor();
2343}
2344
2346Coupleable::adCoupledVectorValue(const std::string & var_name, unsigned int comp) const
2347{
2348 const auto * var = getVectorVar(var_name, comp);
2349 if (!var)
2350 return *getADDefaultVectorValue(var_name);
2352
2353 if (_c_nodal)
2354 mooseError("Not implemented");
2355 if (!_c_is_implicit)
2356 mooseError("Not implemented");
2357
2359 return var->adSln();
2360 return var->adSlnNeighbor();
2361}
2362
2364Coupleable::adCoupledVectorGradient(const std::string & var_name, unsigned int comp) const
2365{
2366 const auto * var = getVectorVar(var_name, comp);
2367 if (!var)
2370
2371 if (!_c_is_implicit)
2372 mooseError("Not implemented");
2373
2375 return usesFaceCoupledValues() ? var->adGradSlnFace() : var->adGradSln();
2376 return var->adGradSlnNeighbor();
2377}
2378
2379const ADVariableValue *
2380Coupleable::getADDefaultValue(const std::string & var_name) const
2381{
2382 auto default_value_it = _ad_default_value.find(var_name);
2383 if (default_value_it == _ad_default_value.end())
2384 {
2385 auto value = std::make_unique<ADVariableValue>(_coupleable_max_qps,
2387 default_value_it = _ad_default_value.insert(std::make_pair(var_name, std::move(value))).first;
2388 }
2389
2390 return default_value_it->second.get();
2391}
2392
2394Coupleable::getADDefaultVectorValue(const std::string & var_name) const
2395{
2396 auto default_value_it = _ad_default_vector_value.find(var_name);
2397 if (default_value_it == _ad_default_vector_value.end())
2398 {
2399 RealVectorValue default_vec;
2400 for (unsigned int i = 0; i < _c_parameters.numberDefaultCoupledValues(var_name); ++i)
2401 default_vec(i) = _c_parameters.defaultCoupledValue(var_name, i);
2402 auto value = std::make_unique<ADVectorVariableValue>(_coupleable_max_qps, default_vec);
2403 default_value_it =
2404 _ad_default_vector_value.insert(std::make_pair(var_name, std::move(value))).first;
2405 }
2406
2407 return default_value_it->second.get();
2408}
2409
2410const ADVariableGradient &
2416
2423
2424const ADVariableSecond &
2430
2437
2438const ADVariableValue &
2440{
2441 mooseDeprecated("Method adZeroValue() is deprecated. Use '_ad_zero' instead.");
2442 return _ad_zero;
2443}
2444
2445const ADVariableGradient &
2447{
2448 mooseDeprecated("Method adZeroGradient() is deprecated. Use '_ad_grad_zero' instead.");
2449 return _ad_grad_zero;
2450}
2451
2452const ADVariableSecond &
2454{
2455 mooseDeprecated("Method adZeroSecond() is deprecated. Use '_ad_second_zero' instead.");
2456 return _ad_second_zero;
2457}
2458
2459template <>
2461Coupleable::genericZeroValue<false>()
2462{
2463 return _zero;
2464}
2465
2466template <>
2468Coupleable::genericZeroValue<true>()
2469{
2470 return _ad_zero;
2471}
2472
2473template <>
2475Coupleable::genericZeroGradient<false>()
2476{
2477 return _grad_zero;
2478}
2479
2480template <>
2482Coupleable::genericZeroGradient<true>()
2483{
2484 return _ad_grad_zero;
2485}
2486
2487template <>
2489Coupleable::genericZeroSecond<false>()
2490{
2491 return _second_zero;
2492}
2493
2494template <>
2496Coupleable::genericZeroSecond<true>()
2497{
2498 return _ad_second_zero;
2499}
2500
2501template <>
2503Coupleable::coupledGenericGradient<false>(const std::string & var_name, unsigned int comp) const
2504{
2505 return coupledGradient(var_name, comp);
2506}
2507
2508template <>
2510Coupleable::coupledGenericGradient<true>(const std::string & var_name, unsigned int comp) const
2511{
2512 return adCoupledGradient(var_name, comp);
2513}
2514
2515std::vector<unsigned int>
2516Coupleable::coupledIndices(const std::string & var_name) const
2517{
2518 auto func = [this, &var_name](unsigned int comp) { return coupled(var_name, comp); };
2519 return coupledVectorHelper<unsigned int>(var_name, func);
2520}
2521
2522VariableName
2523Coupleable::coupledName(const std::string & var_name, unsigned int comp) const
2524{
2525 if (getFieldVar(var_name, comp))
2526 return getFieldVar(var_name, comp)->name();
2527 // Detect if we are in the case where a constant was passed in lieu of a variable
2528 else if (isCoupledConstant(var_name))
2530 ": a variable name was queried but a constant was passed for parameter '",
2531 var_name,
2532 "Either pass a true variable or contact a developer to shield the call to "
2533 "'coupledName' with 'isCoupledConstant'");
2534 else
2535 mooseError(
2536 _c_name, ": Variable '", var_name, "' does not exist, yet its coupled name is requested");
2537}
2538
2539std::vector<VariableName>
2540Coupleable::coupledNames(const std::string & var_name) const
2541{
2542 auto func = [this, &var_name](unsigned int comp) { return coupledName(var_name, comp); };
2543 return coupledVectorHelper<VariableName>(var_name, func);
2544}
2545
2546std::vector<const VariableValue *>
2547Coupleable::coupledValues(const std::string & var_name) const
2548{
2549 auto func = [this, &var_name](unsigned int comp) { return &coupledValue(var_name, comp); };
2550 return coupledVectorHelper<const VariableValue *>(var_name, func);
2551}
2552
2553std::vector<const VectorVariableValue *>
2554Coupleable::coupledVectorValues(const std::string & var_name) const
2555{
2556 auto func = [this, &var_name](unsigned int comp) { return &coupledVectorValue(var_name, comp); };
2557 return coupledVectorHelper<const VectorVariableValue *>(var_name, func);
2558}
2559
2560template <>
2561std::vector<const GenericVariableValue<false> *>
2562Coupleable::coupledGenericValues<false>(const std::string & var_name) const
2563{
2564 return coupledValues(var_name);
2565}
2566
2567template <>
2568std::vector<const GenericVariableValue<true> *>
2569Coupleable::coupledGenericValues<true>(const std::string & var_name) const
2570{
2571 return adCoupledValues(var_name);
2572}
2573
2574std::vector<const ADVariableValue *>
2575Coupleable::adCoupledValues(const std::string & var_name) const
2576{
2577 auto func = [this, &var_name](unsigned int comp) { return &adCoupledValue(var_name, comp); };
2578 return coupledVectorHelper<const ADVariableValue *>(var_name, func);
2579}
2580
2581std::vector<const ADVectorVariableValue *>
2582Coupleable::adCoupledVectorValues(const std::string & var_name) const
2583{
2584 auto func = [this, &var_name](unsigned int comp)
2585 { return &adCoupledVectorValue(var_name, comp); };
2586 return coupledVectorHelper<const ADVectorVariableValue *>(var_name, func);
2587}
2588
2589std::vector<const VariableValue *>
2590Coupleable::coupledVectorTagValues(const std::string & var_names, TagID tag) const
2591{
2592 auto func = [this, &var_names, &tag](unsigned int comp)
2593 { return &coupledVectorTagValue(var_names, tag, comp); };
2594 return coupledVectorHelper<const VariableValue *>(var_names, func);
2595}
2596
2597std::vector<const VariableValue *>
2598Coupleable::coupledVectorTagValues(const std::string & var_names,
2599 const std::string & tag_name) const
2600{
2601 if (!_c_parameters.isParamValid(tag_name))
2602 mooseError("Tag name parameter '", tag_name, "' is invalid");
2603
2604 TagName tagname = _c_parameters.get<TagName>(tag_name);
2605 if (!_c_fe_problem.vectorTagExists(tagname))
2606 mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2607
2608 TagID tag = _c_fe_problem.getVectorTagID(tagname);
2609 return coupledVectorTagValues(var_names, tag);
2610}
2611
2612std::vector<const ArrayVariableValue *>
2613Coupleable::coupledVectorTagArrayValues(const std::string & var_names, TagID tag) const
2614{
2615 auto func = [this, &var_names, &tag](unsigned int index)
2616 { return &coupledVectorTagArrayValue(var_names, tag, index); };
2617 return coupledVectorHelper<const ArrayVariableValue *>(var_names, func);
2618}
2619
2620std::vector<const ArrayVariableValue *>
2621Coupleable::coupledVectorTagArrayValues(const std::string & var_names,
2622 const std::string & tag_name) const
2623{
2624 if (!_c_parameters.isParamValid(tag_name))
2625 mooseError("Tag name parameter '", tag_name, "' is invalid");
2626
2627 TagName tagname = _c_parameters.get<TagName>(tag_name);
2628 if (!_c_fe_problem.vectorTagExists(tagname))
2629 mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2630
2631 TagID tag = _c_fe_problem.getVectorTagID(tagname);
2632 return coupledVectorTagArrayValues(var_names, tag);
2633}
2634
2635std::vector<const VariableGradient *>
2636Coupleable::coupledVectorTagGradients(const std::string & var_names, TagID tag) const
2637{
2638 auto func = [this, &var_names, &tag](unsigned int index)
2639 { return &coupledVectorTagGradient(var_names, tag, index); };
2640 return coupledVectorHelper<const VariableGradient *>(var_names, func);
2641}
2642
2643std::vector<const VariableGradient *>
2644Coupleable::coupledVectorTagGradients(const std::string & var_names,
2645 const std::string & tag_name) const
2646{
2647 if (!_c_parameters.isParamValid(tag_name))
2648 mooseError("Tag name parameter '", tag_name, "' is invalid");
2649
2650 TagName tagname = _c_parameters.get<TagName>(tag_name);
2651 if (!_c_fe_problem.vectorTagExists(tagname))
2652 mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2653
2654 TagID tag = _c_fe_problem.getVectorTagID(tagname);
2655 return coupledVectorTagGradients(var_names, tag);
2656}
2657
2658std::vector<const ArrayVariableGradient *>
2659Coupleable::coupledVectorTagArrayGradients(const std::string & var_names, TagID tag) const
2660{
2661 auto func = [this, &var_names, &tag](unsigned int index)
2662 { return &coupledVectorTagArrayGradient(var_names, tag, index); };
2663 return coupledVectorHelper<const ArrayVariableGradient *>(var_names, func);
2664}
2665
2666std::vector<const ArrayVariableGradient *>
2668 const std::string & tag_name) const
2669{
2670 if (!_c_parameters.isParamValid(tag_name))
2671 mooseError("Tag name parameter '", tag_name, "' is invalid");
2672
2673 TagName tagname = _c_parameters.get<TagName>(tag_name);
2674 if (!_c_fe_problem.vectorTagExists(tagname))
2675 mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2676
2677 TagID tag = _c_fe_problem.getVectorTagID(tagname);
2678 return coupledVectorTagArrayGradients(var_names, tag);
2679}
2680
2681std::vector<const VariableValue *>
2682Coupleable::coupledVectorTagDofValues(const std::string & var_names, TagID tag) const
2683{
2684 auto func = [this, &var_names, &tag](unsigned int comp)
2685 { return &coupledVectorTagDofValue(var_names, tag, comp); };
2686 return coupledVectorHelper<const VariableValue *>(var_names, func);
2687}
2688
2689std::vector<const VariableValue *>
2690Coupleable::coupledVectorTagDofValues(const std::string & var_names,
2691 const std::string & tag_name) const
2692{
2693 if (!_c_parameters.isParamValid(tag_name))
2694 mooseError("Tag name parameter '", tag_name, "' is invalid");
2695
2696 TagName tagname = _c_parameters.get<TagName>(tag_name);
2697 if (!_c_fe_problem.vectorTagExists(tagname))
2698 mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2699
2700 TagID tag = _c_fe_problem.getVectorTagID(tagname);
2701 return coupledVectorTagDofValues(var_names, tag);
2702}
2703
2704std::vector<const VariableValue *>
2705Coupleable::coupledMatrixTagValues(const std::string & var_names, TagID tag) const
2706{
2707 auto func = [this, &var_names, &tag](unsigned int comp)
2708 { return &coupledMatrixTagValue(var_names, tag, comp); };
2709 return coupledVectorHelper<const VariableValue *>(var_names, func);
2710}
2711
2712std::vector<const VariableValue *>
2713Coupleable::coupledMatrixTagValues(const std::string & var_names,
2714 const std::string & tag_name) const
2715{
2716 if (!_c_parameters.isParamValid(tag_name))
2717 mooseError("Tag name parameter '", tag_name, "' is invalid");
2718
2719 TagName tagname = _c_parameters.get<TagName>(tag_name);
2720 if (!_c_fe_problem.matrixTagExists(tagname))
2721 mooseError("Matrix tag name '", tagname, "' does not exist");
2722
2723 TagID tag = _c_fe_problem.getMatrixTagID(tagname);
2724 return coupledMatrixTagValues(var_names, tag);
2725}
2726
2727std::vector<const VariableValue *>
2728Coupleable::coupledValuesOld(const std::string & var_name) const
2729{
2730 auto func = [this, &var_name](unsigned int comp) { return &coupledValueOld(var_name, comp); };
2731 return coupledVectorHelper<const VariableValue *>(var_name, func);
2732}
2733
2734std::vector<const VariableValue *>
2735Coupleable::coupledValuesOlder(const std::string & var_name) const
2736{
2737 auto func = [this, &var_name](unsigned int comp) { return &coupledValueOlder(var_name, comp); };
2738 return coupledVectorHelper<const VariableValue *>(var_name, func);
2739}
2740
2741std::vector<const VectorVariableValue *>
2742Coupleable::coupledVectorValuesOld(const std::string & var_name) const
2743{
2744 auto func = [this, &var_name](unsigned int comp)
2745 { return &coupledVectorValueOld(var_name, comp); };
2746 return coupledVectorHelper<const VectorVariableValue *>(var_name, func);
2747}
2748
2749std::vector<const VariableGradient *>
2750Coupleable::coupledGradients(const std::string & var_name) const
2751{
2752 auto func = [this, &var_name](unsigned int comp) { return &coupledGradient(var_name, comp); };
2753 return coupledVectorHelper<const VariableGradient *>(var_name, func);
2754}
2755
2756template <>
2757std::vector<const GenericVariableGradient<false> *>
2758Coupleable::coupledGenericGradients<false>(const std::string & var_name) const
2759{
2760 return coupledGradients(var_name);
2761}
2762
2763template <>
2764std::vector<const GenericVariableGradient<true> *>
2765Coupleable::coupledGenericGradients<true>(const std::string & var_name) const
2766{
2767 auto func = [this, &var_name](unsigned int comp) { return &adCoupledGradient(var_name, comp); };
2768 return coupledVectorHelper<const GenericVariableGradient<true> *>(var_name, func);
2769}
2770
2771std::vector<const ADVariableGradient *>
2772Coupleable::adCoupledGradients(const std::string & var_name) const
2773{
2774 auto func = [this, &var_name](unsigned int comp) { return &adCoupledGradient(var_name, comp); };
2775 return coupledVectorHelper<const ADVariableGradient *>(var_name, func);
2776}
2777
2778std::vector<const VariableGradient *>
2779Coupleable::coupledGradientsOld(const std::string & var_name) const
2780{
2781 auto func = [this, &var_name](unsigned int comp) { return &coupledGradientOld(var_name, comp); };
2782 return coupledVectorHelper<const VariableGradient *>(var_name, func);
2783}
2784
2785std::vector<const VariableValue *>
2786Coupleable::coupledDots(const std::string & var_name) const
2787{
2788 auto func = [this, &var_name](unsigned int comp) { return &coupledDot(var_name, comp); };
2789 return coupledVectorHelper<const VariableValue *>(var_name, func);
2790}
2791
2792std::vector<const ADVariableValue *>
2793Coupleable::adCoupledDots(const std::string & var_name) const
2794{
2795 auto func = [this, &var_name](unsigned int comp) { return &adCoupledDot(var_name, comp); };
2796 return coupledVectorHelper<const ADVariableValue *>(var_name, func);
2797}
2798
2799template <>
2801Coupleable::coupledGenericDot<false>(const std::string & var_name, unsigned int comp) const
2802{
2803 return coupledDot(var_name, comp);
2804}
2805
2806template <>
2808Coupleable::coupledGenericDot<true>(const std::string & var_name, unsigned int comp) const
2809{
2810 return adCoupledDot(var_name, comp);
2811}
2812
2813// Explicit instantiations
2814
2815template const Real & Coupleable::getDefaultNodalValue<Real>(const std::string & var_name,
2816 unsigned int comp) const;
2817
2818template const Real & Coupleable::coupledNodalValue<Real>(const std::string & var_name,
2819 unsigned int comp) const;
2820template const ADReal & Coupleable::adCoupledNodalValue<Real>(const std::string & var_name,
2821 unsigned int comp) const;
2822template const ADRealVectorValue &
2823Coupleable::adCoupledNodalValue<RealVectorValue>(const std::string & var_name,
2824 unsigned int comp) const;
2825
2826template const RealVectorValue &
2827Coupleable::coupledNodalValue<RealVectorValue>(const std::string & var_name,
2828 unsigned int comp) const;
2829template const Real & Coupleable::coupledNodalValueOld<Real>(const std::string & var_name,
2830 unsigned int comp) const;
2831template const RealVectorValue &
2832Coupleable::coupledNodalValueOld<RealVectorValue>(const std::string & var_name,
2833 unsigned int comp) const;
2834template const Real & Coupleable::coupledNodalValueOlder<Real>(const std::string & var_name,
2835 unsigned int comp) const;
2836template const RealVectorValue &
2837Coupleable::coupledNodalValueOlder<RealVectorValue>(const std::string & var_name,
2838 unsigned int comp) const;
2839template const Real & Coupleable::coupledNodalValuePreviousNL<Real>(const std::string & var_name,
2840 unsigned int comp) const;
2841template const RealVectorValue &
2842Coupleable::coupledNodalValuePreviousNL<RealVectorValue>(const std::string & var_name,
2843 unsigned int comp) const;
2844template const Real & Coupleable::coupledNodalDot<Real>(const std::string & var_name,
2845 unsigned int comp) const;
2846template const RealVectorValue &
2847Coupleable::coupledNodalDot<RealVectorValue>(const std::string & var_name, unsigned int comp) const;
DualNumber< Real, DNDerivativeType, true > ADReal
void checkComponent(const MooseObject *obj, unsigned int comp, unsigned int bound, const std::string &var_name)
Definition Coupleable.C:203
const ADVectorVariableSecond & adCoupledVectorSecond(const std::string &, unsigned int)
void mooseWarning(Args &&... args)
Emit a warning message with the given stringified, concatenated args.
Definition MooseError.h:345
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
void mooseDeprecated(Args &&... args)
Emit a deprecated code/feature message with the given stringified, concatenated args.
Definition MooseError.h:363
OutputTools< RealVectorValue >::VariableCurl VectorVariableCurl
Definition MooseTypes.h:368
OutputTools< Real >::VariableGradient VariableGradient
Definition MooseTypes.h:349
unsigned int TagID
Definition MooseTypes.h:238
OutputTools< RealEigenVector >::VariableValue ArrayVariableValue
Definition MooseTypes.h:382
Moose::GenericType< VariableValue, is_ad > GenericVariableValue
Definition MooseTypes.h:712
Moose::GenericType< VectorVariableValue, is_ad > GenericVectorVariableValue
Definition MooseTypes.h:714
Moose::GenericType< VariableSecond, is_ad > GenericVariableSecond
Definition MooseTypes.h:718
OutputTools< Real >::VariableValue VariableValue
Definition MooseTypes.h:348
OutputTools< RealVectorValue >::VariableDivergence VectorVariableDivergence
Definition MooseTypes.h:369
Moose::GenericType< VariableGradient, is_ad > GenericVariableGradient
Definition MooseTypes.h:716
OutputTools< RealEigenVector >::VariableGradient ArrayVariableGradient
Definition MooseTypes.h:384
OutputTools< Real >::VariableSecond VariableSecond
Definition MooseTypes.h:350
OutputTools< RealVectorValue >::VariableGradient VectorVariableGradient
Definition MooseTypes.h:366
unsigned int THREAD_ID
Definition MooseTypes.h:237
OutputTools< RealVectorValue >::VariableValue VectorVariableValue
Definition MooseTypes.h:365
char ** vars
An interface that restricts an object to subdomains via the 'blocks' input parameter.
Interface for objects that needs coupling capabilities.
Definition Coupleable.h:53
const ADVariableValue & adZeroValue() const
method that returns _zero to RESIDUAL computing objects and _ad_zero to JACOBIAN computing objects
virtual const VariableValue & coupledNodalDotOld(const std::string &var_name, unsigned int comp=0) const
Nodal values of old time derivative of a coupled variable.
std::unordered_map< std::string, std::vector< MooseVariableScalar * > > _c_coupled_scalar_vars
Scalar variables coupled into this object (for error checking)
std::unordered_map< std::string, std::unique_ptr< ArrayVariableValue > > _default_array_value
Will hold the default value for optional array coupled variables.
virtual const ArrayVariableGradient & coupledArrayGradientDot(const std::string &var_name, unsigned int comp=0) const
Retun a gradient of a coupled array variable's time derivative.
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.
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.
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
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.
const ADVariableValue * getADDefaultValue(const std::string &var_name) const
Helper method to return (and insert if necessary) the default value for Automatic Differentiation for...
VectorVariableCurl _default_vector_curl
This will always be zero because the default values for optionally coupled variables is always consta...
const ADVariableValue & adCoupledDotDot(const std::string &var_name, unsigned int comp=0) const
Second time derivative of a coupled variable for ad simulations.
bool _c_is_implicit
True if implicit value is required.
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.
virtual const ArrayVariableGradient & coupledArrayGradient(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled array variable.
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.
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.
virtual const VectorVariableValue & coupledVectorDotOld(const std::string &var_name, unsigned int comp=0) const
Old time derivative of a coupled vector variable.
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
virtual const VectorVariableValue & coupledVectorDotDotOld(const std::string &var_name, unsigned int comp=0) const
Old second time derivative of a coupled vector variable.
const ADVariableGradient & adCoupledGradient(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled variable for use in Automatic Differentiation.
std::vector< ArrayMooseVariable * > _coupled_array_moose_vars
Vector of array coupled variables.
std::unordered_map< std::string, std::vector< unsigned int > > _optional_var_index
Unique indices for optionally coupled vars that weren't provided.
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
MooseArray< ADRealTensorValue > _ad_default_second
This will always be zero because the default values for optionally coupled variables is always consta...
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
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.
virtual const VariableValue & coupledDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled variable.
Coupleable(const MooseObject *moose_object, bool nodal, bool is_fv=false)
Constructing the object.
Definition Coupleable.C:28
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
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.
std::unordered_map< std::string, std::vector< std::unique_ptr< VariableValue > > > _default_value
Will hold the default value for optional coupled variables.
virtual const ArrayVariableValue & coupledArrayDotOld(const std::string &var_name, unsigned int comp=0) const
Old time derivative of a coupled array variable.
void addFEVariableCoupleableVectorTag(TagID tag)
Definition Coupleable.h:116
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.
virtual const VariableGradient & coupledGradientDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of the gradient of a coupled variable.
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's degree of freedom indices.
Definition Coupleable.C:814
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 & coupledValue(const std::string &var_name, unsigned int comp=0) const
Returns value of a coupled variable.
Definition Coupleable.C:528
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.
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.
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.
std::vector< const VariableGradient * > coupledGradientsOld(const std::string &var_name) const
Returns the old gradients for all of a coupled variable's components.
ArrayVariableValue _default_array_value_zero
This will always be zero because the default values for optionally coupled variables is always consta...
virtual const VariableGradient & coupledGradientPreviousNL(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled variable for previous Newton iterate.
VectorVariableDivergence _default_div
This will always be zero because the default values for optionally coupled variables is always consta...
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.
std::vector< const ADVariableValue * > adCoupledValues(const std::string &var_name) const
Returns the values for all of a coupled variable's components for use in Automatic Differentiation.
const VariableValue & _zero
Zero value of a variable.
std::unordered_map< std::string, std::vector< MooseVariableFieldBase * > > _coupled_vars
Coupled vars whose values we provide.
std::vector< const ADVariableValue * > adCoupledDots(const std::string &var_name) const
Returns the time derivatives for all of a coupled variable's components for ad simulations.
const ADVariableValue & adCoupledValue(const std::string &var_name, unsigned int comp=0) const
Returns value of a coupled variable for use in Automatic Differentiation.
const VariableGradient & _grad_zero
Zero gradient of a variable.
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.
MooseArray< ADRealTensorValue > _ad_default_vector_gradient
This will always be zero because the default values for optionally coupled vector variables is always...
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.
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.
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.
virtual const VectorVariableCurl & coupledCurl(const std::string &var_name, unsigned int comp=0) const
Returns curl of a coupled variable.
const MooseObject *const _obj
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.
bool _c_nodal
True if we provide coupling to nodal values.
VectorVariableGradient _default_vector_gradient
This will always be zero because the default values for optionally coupled variables is always consta...
const MooseArray< ADRealTensorValue > & _ad_second_zero
std::vector< const VariableGradient * > coupledGradients(const std::string &var_name) const
Returns the gradients for all of a coupled variable's components.
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.
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.
MooseArray< ADRealVectorValue > _ad_default_curl
This will always be zero because the default values for optionally coupled vector variables is always...
const ADVariableGradient & adZeroGradient() const
method that returns _grad_zero to RESIDUAL computing objects and _ad_grad_zero to JACOBIAN computing ...
virtual const VectorVariableGradient & coupledVectorGradient(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled vector variable.
std::vector< const VectorVariableValue * > coupledVectorValuesOld(const std::string &var_name) const
Returns the old values for all of a coupled vector variable's components.
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.
const ADVectorVariableValue & adCoupledVectorDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a vector coupled variable for ad simulations.
MooseVariable * getVar(const std::string &var_name, unsigned int comp)
Extract pointer to a coupled variable.
Definition Coupleable.C:319
const ADVariableSecond & adZeroSecond() const
Retrieve a zero second for automatic differentiation.
const T & coupledNodalDot(const std::string &var_name, unsigned int comp=0) const
Nodal values of time derivative of a coupled variable.
const T & coupledNodalValue(const std::string &var_name, unsigned int comp=0) const
Returns nodal values of a coupled variable.
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
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...
std::vector< const VariableValue * > coupledAllDofValuesOld(const std::string &var_name) const
Returns DoFs in the old solution vector of all of a coupled variable's components for the local eleme...
void addFEVariableCoupleableMatrixTag(TagID tag)
Definition Coupleable.h:118
VectorVariableValue _default_vector_value_zero
This will always be zero because the default values for optionally coupled variables is always consta...
virtual const VectorVariableValue & coupledVectorDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled vector variable.
std::unordered_map< std::string, std::unique_ptr< VectorVariableValue > > _default_vector_value
Will hold the default value for optional vector coupled variables.
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.
const T & getDefaultNodalValue(const std::string &var_name, unsigned int comp=0) const
Get nodal default value.
Definition Coupleable.C:450
const ADVariableSecond & getADDefaultSecond() const
Helper method to return (and insert if necessary) the default second derivatives for Automatic Differ...
const std::string & _c_name
The name of the object this interface is part of.
virtual bool usesFaceCoupledValues() const
Whether this object evaluates coupled variables on element faces, so that it must request coupled AD ...
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.
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.
std::vector< unsigned int > coupledIndices(const std::string &var_name) const
Returns the indices for a coupled variable's components.
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.
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
VectorMooseVariable * getVectorVar(const std::string &var_name, unsigned int comp)
Extract pointer to a coupled vector variable.
Definition Coupleable.C:325
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.
const ADVariableGradient & getADDefaultGradient() const
Helper method to return (and insert if necessary) the default gradient for Automatic Differentiation ...
virtual const VariableValue & coupledNodalDotDot(const std::string &var_name, unsigned int comp=0) const
Nodal values of second time derivative of a coupled variable.
std::vector< const VariableValue * > coupledDots(const std::string &var_name) const
Returns the time derivatives for all of a coupled variable's components.
std::vector< const ADVariableGradient * > adCoupledGradients(const std::string &var_name) const
Returns the gradients for all of a coupled variable's components for use in Automatic Differentiation...
FEProblemBase & _c_fe_problem
const MooseVariableFieldBase * getFieldVar(const std::string &var_name, unsigned int comp) const
Definition Coupleable.C:307
const MooseVariableFieldBase * getFEVar(const std::string &var_name, unsigned int comp) const
Deprecated method.
Definition Coupleable.C:293
THREAD_ID _c_tid
Thread ID of the thread using this object.
virtual const VariableValue & coupledDotDotOld(const std::string &var_name, unsigned int comp=0) const
Old second time derivative of a coupled variable.
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.
const std::set< std::string > _older_state_tags
vector tag names for which we need to request older solution states from the system
virtual const VariableSecond & coupledSecond(const std::string &var_name, unsigned int comp=0) const
Returns second spatial derivatives of a coupled variable.
const ADVectorVariableGradient & getADDefaultVectorGradient() const
Helper method to return (and insert if necessary) the default gradient for Automatic Differentiation ...
std::vector< const VariableValue * > coupledValues(const std::string &var_name) const
Returns the values for all of a coupled variable components.
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.
const VariableSecond & _second_zero
Zero second derivative of a variable.
VariableValue _default_value_zero
This will always be zero because the default values for optionally coupled variables is always consta...
ArrayVariableGradient _default_array_gradient
This will always be zero because the default values for optionally coupled variables is always consta...
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
const ADVariableValue & adCoupledDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled variable for ad simulations.
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.
VariableGradient _default_gradient
This will always be zero because the default values for optionally coupled variables is always consta...
const InputParameters & _c_parameters
virtual const VariableGradient & coupledGradient(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled variable.
virtual const ArrayVariableValue & coupledArrayDotDot(const std::string &var_name, unsigned int comp=0) const
Second time derivative of a coupled array variable.
std::vector< const ArrayVariableValue * > coupledArrayValues(const std::string &var_name) const
Returns the values for all of a coupled array variable's components.
Definition Coupleable.C:902
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.
virtual const VariableValue & coupledValuePreviousNL(const std::string &var_name, unsigned int comp=0) const
Returns value of previous Newton iterate of a coupled variable.
void checkFuncType(const std::string var_name, VarType t, FuncAge age) const
Definition Coupleable.C:217
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
const ADVariableGradient & adCoupledGradientDot(const std::string &var_name, unsigned int comp=0) const
Returns gradient of a coupled variable's time derivative for use in Automatic Differentiation.
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.
virtual const VectorVariableDivergence & coupledDiv(const std::string &var_name, unsigned int comp=0) const
Returns divergence of a coupled variable.
unsigned int _coupleable_max_qps
Maximum qps for any element in this system.
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
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.
ArrayMooseVariable * getArrayVar(const std::string &var_name, unsigned int comp)
Extract pointer to a coupled array variable.
Definition Coupleable.C:337
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.
virtual const VectorVariableValue & coupledVectorDotDot(const std::string &var_name, unsigned int comp=0) const
Second time derivative of a coupled vector variable.
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.
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
std::vector< VariableName > coupledNames(const std::string &var_name) const
Names of the variables in the Coupleable interface.
const bool _c_allow_element_to_nodal_coupling
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.
std::vector< const VariableValue * > coupledAllDofValues(const std::string &var_name) const
Returns DoFs in the current solution vector of all of a coupled variable's components for the local e...
const SystemBase *const _c_sys
Pointer to the system object if the moose object this is an interface for has one.
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.
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.
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.
VariableName coupledName(const std::string &var_name, unsigned int comp=0) const
Names of the variable in the Coupleable interface.
virtual const VariableValue & coupledDotDot(const std::string &var_name, unsigned int comp=0) const
Second time derivative of a coupled variable.
const MooseArray< ADRealVectorValue > & _ad_grad_zero
const ADVectorVariableValue * getADDefaultVectorValue(const std::string &var_name) const
Helper method to return (and insert if necessary) the default vector value for Automatic Differentiat...
unsigned int coupledComponents(const std::string &var_name) const
Number of coupled components.
Definition Coupleable.C:183
std::vector< const VectorVariableValue * > coupledVectorValues(const std::string &var_name) const
Returns the values for all of a coupled vector variable's components.
std::vector< const VariableValue * > coupledAllDofValuesOlder(const std::string &var_name) const
Returns DoFs in the older solution vector of all of a coupled variable's components for the local ele...
std::vector< MooseVariable * > _coupled_standard_moose_vars
Vector of standard coupled variables.
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.
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
virtual const VariableGradient & coupledGradientDotDot(const std::string &var_name, unsigned int comp=0) const
Second time derivative of the gradient of a coupled variable.
std::vector< const ADVectorVariableValue * > adCoupledVectorValues(const std::string &var_name) const
Returns the values for all of a coupled vector variable's components for use in Automatic Differentia...
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 VariableValue & coupledDotOld(const std::string &var_name, unsigned int comp=0) const
Old time derivative of a coupled variable.
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...
std::vector< const VariableValue * > coupledValuesOlder(const std::string &var_name) const
Returns the older values for all of a coupled variable's components.
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's system depending on the value ...
Definition Coupleable.C:579
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
std::vector< MooseVariableFieldBase * > _coupled_moose_vars
Vector of all coupled variables.
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 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
const Moose::ADType< T >::type & adCoupledNodalValue(const std::string &var_name, unsigned int comp=0) const
Returns AD nodal values of a coupled variable.
bool _coupleable_neighbor
Whether or not this object is a "neighbor" object: ie all of it's coupled values should be neighbor v...
virtual const ArrayVariableValue & coupledArrayDotDotOld(const std::string &var_name, unsigned int comp=0) const
Old second time derivative of a coupled array variable.
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
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
std::vector< const MooseVariableFieldBase * > getFieldVars(const std::string &var_name) const
Definition Coupleable.C:313
std::vector< const VariableValue * > coupledValuesOld(const std::string &var_name) const
Returns the old values for all of a coupled variable's components.
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.
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
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.
std::vector< VectorMooseVariable * > _coupled_vector_moose_vars
Vector of vector coupled variables.
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.
const T & coupledNodalValuePreviousNL(const std::string &var_name, unsigned int comp=0) const
Returns nodal values of a coupled variable for previous Newton iterate.
const MooseArray< ADReal > & _ad_zero
const ADVectorVariableCurl & getADDefaultCurl() const
Helper method to return (and insert if necessary) the default curl value for Automatic Differentiatio...
VariableSecond _default_second
This will always be zero because the default values for optionally coupled variables is always consta...
std::vector< MooseVariableField< Real > * > _coupled_fv_moose_vars
Vector of all finite volume coupled variables.
const bool _is_fv
Whether the MooseObject is a finite volume object.
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.
MooseArray< ADRealVectorValue > _ad_default_gradient
This will always be zero because the default values for optionally coupled variables is always consta...
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
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
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.
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.
virtual const ArrayVariableValue & coupledArrayDot(const std::string &var_name, unsigned int comp=0) const
Time derivative of a coupled array variable.
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
void needsPreviousNewtonIteration(bool state)
Set a flag that indicated that user required values for the previous Newton iterate.
AuxiliarySystem & getAuxiliarySystem()
virtual bool isTransient() const override
std::vector< std::string > getVecMooseType(const std::string &name) const
unsigned int numberDefaultCoupledValues(const std::string &coupling_name) const
Get the number of defaulted coupled value entries.
bool hasCoupledVar(const std::string &coupling_name) const
Return whether or not the coupled variable exists.
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::set< std::string >::const_iterator coupledVarsEnd() const
bool have_parameter(std::string_view name) const
A wrapper around the Parameters base class method.
std::set< std::string >::const_iterator coupledVarsBegin() const
Methods returning iterators to the coupled variables names stored in this InputParameters object.
bool hasDefaultCoupledValue(const std::string &coupling_name) const
Return whether or not the requested parameter has a default coupled value.
Real defaultCoupledValue(const std::string &coupling_name, unsigned int i=0) const
Get the default value for an optionally coupled variable.
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.
const std::string & checkForRename(const std::string &name) const
Checks whether the provided name is a renamed parameter name.
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another,...
Materials compute MaterialProperties.
Definition Material.h:36
void registerInterfaceObject(T &interface)
Registers an interface object for accessing with getInterfaceObjects.
Definition MooseApp.h:1782
const std::vector< T * > & getInterfaceObjects() const
Gets the registered interface objects for a given interface.
Definition MooseApp.h:1804
forward declarations
Definition MooseArray.h:18
void resize(unsigned int size)
Change the number of elements the array can store.
Definition MooseArray.h:216
const std::string & name() const
Get the name of the class.
Definition MooseBase.h:103
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
MooseApp & getMooseApp() const
Get the MooseApp this class is associated with.
Definition MooseBase.h:87
This class provides variable solution interface for linear finite volume problems.
Every object that can be built by the factory should be derived from this class.
Definition MooseObject.h:31
This class provides variable solution values for other classes/objects to bind to when looping over f...
This class provides an interface for common operations on field variables of both FE and FV types wit...
Class for stuff related to variables.
bool hasBlocks(const SubdomainID id) const override
Returns whether the functor is defined on this block.
Class for scalar variables (they are different).
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type.
A user object that runs over all the nodes and does an aggregation step to compute a single value.
A NodeElemConstraintBase is used when you need to create constraints between a secondary node and a p...
A NodeFaceConstraint is used when you need to create constraints between two surfaces in a mesh.
Generic class for solving transient nonlinear problems.
Definition SubProblem.h:79
virtual TagID getVectorTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition SubProblem.C:195
virtual TagID getMatrixTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition SubProblem.C:334
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...
virtual bool matrixTagExists(const TagName &tag_name) const
Check to see if a particular Tag exists.
Definition SubProblem.C:320
virtual bool hasScalarVariable(const std::string &var_name) const =0
Returns a Boolean indicating whether any system contains a variable with the name provided.
virtual bool hasVariable(const std::string &var_name) const =0
Whether or not this problem has the variable.
virtual bool vectorTagExists(const TagID tag_id) const
Check to see if a particular Tag exists.
Definition SubProblem.h:204
virtual MooseVariableScalar & getScalarVariable(const THREAD_ID tid, const std::string &var_name)=0
Returns the scalar variable reference from whichever system contains it.
Base class for a system (of equations)
Definition SystemBase.h:87
unsigned int number() const
Gets the number of this system.
Moose::VarKindType varKind() const
Definition SystemBase.h:957
virtual bool hasVariable(const std::string &var_name) const
Query a system for a variable.
Definition SystemBase.C:851
std::string toUpper(std::string name)
Convert supplied string to upper case.
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
@ VAR_FIELD_ANY
Definition MooseTypes.h:781
const TagName OLDER_SOLUTION_TAG
Definition MooseTypes.C:27
static constexpr std::size_t dim
This is the dimension of all vector and tensor datastructures used in MOOSE.
Definition Moose.h:175
const TagName OLD_SOLUTION_TAG
Definition MooseTypes.C:26
@ VAR_ANY
Definition MooseTypes.h:772
@ VAR_SOLVER
Definition MooseTypes.h:770