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(libMesh::n_threads())
62{
63 SubProblem & problem = *_c_parameters.getCheckedPointerParam<SubProblem *>("_subproblem");
65
66 unsigned int optional_var_index_counter = 0;
67
68 // Coupling
69 for (auto iter = _c_parameters.coupledVarsBegin(); iter != _c_parameters.coupledVarsEnd(); ++iter)
70 {
71 std::string name = *iter;
72
73 std::vector<std::string> vars = _c_parameters.getVecMooseType(name);
74 if (vars.size() > 0)
75 {
76 for (const auto & coupled_var_name : vars)
77 {
78 if (problem.hasVariable(coupled_var_name))
79 {
80 MooseVariableFieldBase * moose_var =
81 &problem.getVariable(_c_tid,
82 coupled_var_name,
85 _coupled_vars[name].push_back(moose_var);
86 _coupled_moose_vars.push_back(moose_var);
87 if (auto * tmp_var = dynamic_cast<MooseVariable *>(moose_var))
88 _coupled_standard_moose_vars.push_back(tmp_var);
89 else if (auto * tmp_var = dynamic_cast<VectorMooseVariable *>(moose_var))
90 _coupled_vector_moose_vars.push_back(tmp_var);
91 else if (auto * tmp_var = dynamic_cast<ArrayMooseVariable *>(moose_var))
92 _coupled_array_moose_vars.push_back(tmp_var);
93 else if (auto * tmp_var = dynamic_cast<MooseVariableFV<Real> *>(moose_var))
94 _coupled_fv_moose_vars.push_back(tmp_var);
95 else if (auto * tmp_var = dynamic_cast<MooseLinearVariableFV<Real> *>(moose_var))
96 _coupled_fv_moose_vars.push_back(tmp_var);
97 else
98 _obj->paramError(name, "provided c++ type for variable parameter is not supported");
99 }
100 else if (problem.hasScalarVariable(coupled_var_name))
101 {
102 MooseVariableScalar * moose_scalar_var =
103 &problem.getScalarVariable(_c_tid, coupled_var_name);
104 _c_coupled_scalar_vars[name].push_back(moose_scalar_var);
105 }
106 else
107 _obj->paramError(name, "coupled variable '", coupled_var_name, "' was not found");
108 }
109 }
110 else // This means it was optional coupling. Let's assign a unique id to this variable
111 {
113 for (unsigned int j = 0; j < _optional_var_index[name].size(); ++j)
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 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
2258 return var->adGradSlnDot();
2259 return var->adGradSlnNeighborDot();
2260}
2261
2262const ADVariableSecond &
2263Coupleable::adCoupledSecond(const std::string & var_name, unsigned int comp) const
2264{
2265 const auto * var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2266
2267 if (!var)
2268 return getADDefaultSecond();
2270
2271 if (!_c_is_implicit)
2272 mooseError("Not implemented");
2273
2275 return var->adSecondSln();
2276 else
2277 return var->adSecondSlnNeighbor();
2278}
2279
2281adCoupledVectorSecond(const std::string & /*var_name*/, unsigned int /*comp = 0*/)
2282{
2283 mooseError("Automatic differentiation using second derivatives of vector variables is not "
2284 "implemented.");
2285}
2286
2287const ADVariableValue &
2288Coupleable::adCoupledDot(const std::string & var_name, unsigned int comp) const
2289{
2290 const auto * var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2291
2292 if (!var)
2293 return *getADDefaultValue(var_name);
2295
2297 {
2298 if (_c_nodal)
2299 return var->adDofValuesDot();
2300 return var->adUDot();
2301 }
2302 else
2303 {
2304 if (_c_nodal)
2305 mooseError("AD neighbor nodal dof dot not implemented");
2306 return var->adUDotNeighbor();
2307 }
2308}
2309
2310const ADVariableValue &
2311Coupleable::adCoupledDotDot(const std::string & var_name, unsigned int comp) const
2312{
2313 const auto * const var = getVarHelper<MooseVariableField<Real>>(var_name, comp);
2314
2315 if (!var)
2316 return *getADDefaultValue(var_name);
2318
2319 if (_c_nodal)
2320 mooseError("Not implemented");
2321
2323 return var->adUDotDot();
2324 return var->adUDotDotNeighbor();
2325}
2326
2328Coupleable::adCoupledVectorDot(const std::string & var_name, unsigned int comp) const
2329{
2330 const auto * var = getVectorVar(var_name, comp);
2331 if (!var)
2332 return *getADDefaultVectorValue(var_name);
2334
2335 if (_c_nodal)
2336 mooseError("Not implemented");
2337
2339 return var->adUDot();
2340 return var->adUDotNeighbor();
2341}
2342
2344Coupleable::adCoupledVectorValue(const std::string & var_name, unsigned int comp) const
2345{
2346 const auto * var = getVectorVar(var_name, comp);
2347 if (!var)
2348 return *getADDefaultVectorValue(var_name);
2350
2351 if (_c_nodal)
2352 mooseError("Not implemented");
2353 if (!_c_is_implicit)
2354 mooseError("Not implemented");
2355
2357 return var->adSln();
2358 return var->adSlnNeighbor();
2359}
2360
2362Coupleable::adCoupledVectorGradient(const std::string & var_name, unsigned int comp) const
2363{
2364 const auto * var = getVectorVar(var_name, comp);
2365 if (!var)
2368
2369 if (!_c_is_implicit)
2370 mooseError("Not implemented");
2371
2373 return var->adGradSln();
2374 return var->adGradSlnNeighbor();
2375}
2376
2377const ADVariableValue *
2378Coupleable::getADDefaultValue(const std::string & var_name) const
2379{
2380 auto default_value_it = _ad_default_value.find(var_name);
2381 if (default_value_it == _ad_default_value.end())
2382 {
2383 auto value = std::make_unique<ADVariableValue>(_coupleable_max_qps,
2385 default_value_it = _ad_default_value.insert(std::make_pair(var_name, std::move(value))).first;
2386 }
2387
2388 return default_value_it->second.get();
2389}
2390
2392Coupleable::getADDefaultVectorValue(const std::string & var_name) const
2393{
2394 auto default_value_it = _ad_default_vector_value.find(var_name);
2395 if (default_value_it == _ad_default_vector_value.end())
2396 {
2397 RealVectorValue default_vec;
2398 for (unsigned int i = 0; i < _c_parameters.numberDefaultCoupledValues(var_name); ++i)
2399 default_vec(i) = _c_parameters.defaultCoupledValue(var_name, i);
2400 auto value = std::make_unique<ADVectorVariableValue>(_coupleable_max_qps, default_vec);
2401 default_value_it =
2402 _ad_default_vector_value.insert(std::make_pair(var_name, std::move(value))).first;
2403 }
2404
2405 return default_value_it->second.get();
2406}
2407
2408const ADVariableGradient &
2414
2421
2422const ADVariableSecond &
2428
2435
2436const ADVariableValue &
2438{
2439 mooseDeprecated("Method adZeroValue() is deprecated. Use '_ad_zero' instead.");
2440 return _ad_zero;
2441}
2442
2443const ADVariableGradient &
2445{
2446 mooseDeprecated("Method adZeroGradient() is deprecated. Use '_ad_grad_zero' instead.");
2447 return _ad_grad_zero;
2448}
2449
2450const ADVariableSecond &
2452{
2453 mooseDeprecated("Method adZeroSecond() is deprecated. Use '_ad_second_zero' instead.");
2454 return _ad_second_zero;
2455}
2456
2457template <>
2459Coupleable::genericZeroValue<false>()
2460{
2461 return _zero;
2462}
2463
2464template <>
2466Coupleable::genericZeroValue<true>()
2467{
2468 return _ad_zero;
2469}
2470
2471template <>
2473Coupleable::genericZeroGradient<false>()
2474{
2475 return _grad_zero;
2476}
2477
2478template <>
2480Coupleable::genericZeroGradient<true>()
2481{
2482 return _ad_grad_zero;
2483}
2484
2485template <>
2487Coupleable::genericZeroSecond<false>()
2488{
2489 return _second_zero;
2490}
2491
2492template <>
2494Coupleable::genericZeroSecond<true>()
2495{
2496 return _ad_second_zero;
2497}
2498
2499template <>
2501Coupleable::coupledGenericGradient<false>(const std::string & var_name, unsigned int comp) const
2502{
2503 return coupledGradient(var_name, comp);
2504}
2505
2506template <>
2508Coupleable::coupledGenericGradient<true>(const std::string & var_name, unsigned int comp) const
2509{
2510 return adCoupledGradient(var_name, comp);
2511}
2512
2513std::vector<unsigned int>
2514Coupleable::coupledIndices(const std::string & var_name) const
2515{
2516 auto func = [this, &var_name](unsigned int comp) { return coupled(var_name, comp); };
2517 return coupledVectorHelper<unsigned int>(var_name, func);
2518}
2519
2520VariableName
2521Coupleable::coupledName(const std::string & var_name, unsigned int comp) const
2522{
2523 if (getFieldVar(var_name, comp))
2524 return getFieldVar(var_name, comp)->name();
2525 // Detect if we are in the case where a constant was passed in lieu of a variable
2526 else if (isCoupledConstant(var_name))
2528 ": a variable name was queried but a constant was passed for parameter '",
2529 var_name,
2530 "Either pass a true variable or contact a developer to shield the call to "
2531 "'coupledName' with 'isCoupledConstant'");
2532 else
2533 mooseError(
2534 _c_name, ": Variable '", var_name, "' does not exist, yet its coupled name is requested");
2535}
2536
2537std::vector<VariableName>
2538Coupleable::coupledNames(const std::string & var_name) const
2539{
2540 auto func = [this, &var_name](unsigned int comp) { return coupledName(var_name, comp); };
2541 return coupledVectorHelper<VariableName>(var_name, func);
2542}
2543
2544std::vector<const VariableValue *>
2545Coupleable::coupledValues(const std::string & var_name) const
2546{
2547 auto func = [this, &var_name](unsigned int comp) { return &coupledValue(var_name, comp); };
2548 return coupledVectorHelper<const VariableValue *>(var_name, func);
2549}
2550
2551std::vector<const VectorVariableValue *>
2552Coupleable::coupledVectorValues(const std::string & var_name) const
2553{
2554 auto func = [this, &var_name](unsigned int comp) { return &coupledVectorValue(var_name, comp); };
2555 return coupledVectorHelper<const VectorVariableValue *>(var_name, func);
2556}
2557
2558template <>
2559std::vector<const GenericVariableValue<false> *>
2560Coupleable::coupledGenericValues<false>(const std::string & var_name) const
2561{
2562 return coupledValues(var_name);
2563}
2564
2565template <>
2566std::vector<const GenericVariableValue<true> *>
2567Coupleable::coupledGenericValues<true>(const std::string & var_name) const
2568{
2569 return adCoupledValues(var_name);
2570}
2571
2572std::vector<const ADVariableValue *>
2573Coupleable::adCoupledValues(const std::string & var_name) const
2574{
2575 auto func = [this, &var_name](unsigned int comp) { return &adCoupledValue(var_name, comp); };
2576 return coupledVectorHelper<const ADVariableValue *>(var_name, func);
2577}
2578
2579std::vector<const ADVectorVariableValue *>
2580Coupleable::adCoupledVectorValues(const std::string & var_name) const
2581{
2582 auto func = [this, &var_name](unsigned int comp)
2583 { return &adCoupledVectorValue(var_name, comp); };
2584 return coupledVectorHelper<const ADVectorVariableValue *>(var_name, func);
2585}
2586
2587std::vector<const VariableValue *>
2588Coupleable::coupledVectorTagValues(const std::string & var_names, TagID tag) const
2589{
2590 auto func = [this, &var_names, &tag](unsigned int comp)
2591 { return &coupledVectorTagValue(var_names, tag, comp); };
2592 return coupledVectorHelper<const VariableValue *>(var_names, func);
2593}
2594
2595std::vector<const VariableValue *>
2596Coupleable::coupledVectorTagValues(const std::string & var_names,
2597 const std::string & tag_name) const
2598{
2599 if (!_c_parameters.isParamValid(tag_name))
2600 mooseError("Tag name parameter '", tag_name, "' is invalid");
2601
2602 TagName tagname = _c_parameters.get<TagName>(tag_name);
2603 if (!_c_fe_problem.vectorTagExists(tagname))
2604 mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2605
2606 TagID tag = _c_fe_problem.getVectorTagID(tagname);
2607 return coupledVectorTagValues(var_names, tag);
2608}
2609
2610std::vector<const ArrayVariableValue *>
2611Coupleable::coupledVectorTagArrayValues(const std::string & var_names, TagID tag) const
2612{
2613 auto func = [this, &var_names, &tag](unsigned int index)
2614 { return &coupledVectorTagArrayValue(var_names, tag, index); };
2615 return coupledVectorHelper<const ArrayVariableValue *>(var_names, func);
2616}
2617
2618std::vector<const ArrayVariableValue *>
2619Coupleable::coupledVectorTagArrayValues(const std::string & var_names,
2620 const std::string & tag_name) const
2621{
2622 if (!_c_parameters.isParamValid(tag_name))
2623 mooseError("Tag name parameter '", tag_name, "' is invalid");
2624
2625 TagName tagname = _c_parameters.get<TagName>(tag_name);
2626 if (!_c_fe_problem.vectorTagExists(tagname))
2627 mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2628
2629 TagID tag = _c_fe_problem.getVectorTagID(tagname);
2630 return coupledVectorTagArrayValues(var_names, tag);
2631}
2632
2633std::vector<const VariableGradient *>
2634Coupleable::coupledVectorTagGradients(const std::string & var_names, TagID tag) const
2635{
2636 auto func = [this, &var_names, &tag](unsigned int index)
2637 { return &coupledVectorTagGradient(var_names, tag, index); };
2638 return coupledVectorHelper<const VariableGradient *>(var_names, func);
2639}
2640
2641std::vector<const VariableGradient *>
2642Coupleable::coupledVectorTagGradients(const std::string & var_names,
2643 const std::string & tag_name) const
2644{
2645 if (!_c_parameters.isParamValid(tag_name))
2646 mooseError("Tag name parameter '", tag_name, "' is invalid");
2647
2648 TagName tagname = _c_parameters.get<TagName>(tag_name);
2649 if (!_c_fe_problem.vectorTagExists(tagname))
2650 mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2651
2652 TagID tag = _c_fe_problem.getVectorTagID(tagname);
2653 return coupledVectorTagGradients(var_names, tag);
2654}
2655
2656std::vector<const ArrayVariableGradient *>
2657Coupleable::coupledVectorTagArrayGradients(const std::string & var_names, TagID tag) const
2658{
2659 auto func = [this, &var_names, &tag](unsigned int index)
2660 { return &coupledVectorTagArrayGradient(var_names, tag, index); };
2661 return coupledVectorHelper<const ArrayVariableGradient *>(var_names, func);
2662}
2663
2664std::vector<const ArrayVariableGradient *>
2666 const std::string & tag_name) const
2667{
2668 if (!_c_parameters.isParamValid(tag_name))
2669 mooseError("Tag name parameter '", tag_name, "' is invalid");
2670
2671 TagName tagname = _c_parameters.get<TagName>(tag_name);
2672 if (!_c_fe_problem.vectorTagExists(tagname))
2673 mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2674
2675 TagID tag = _c_fe_problem.getVectorTagID(tagname);
2676 return coupledVectorTagArrayGradients(var_names, tag);
2677}
2678
2679std::vector<const VariableValue *>
2680Coupleable::coupledVectorTagDofValues(const std::string & var_names, TagID tag) const
2681{
2682 auto func = [this, &var_names, &tag](unsigned int comp)
2683 { return &coupledVectorTagDofValue(var_names, tag, comp); };
2684 return coupledVectorHelper<const VariableValue *>(var_names, func);
2685}
2686
2687std::vector<const VariableValue *>
2688Coupleable::coupledVectorTagDofValues(const std::string & var_names,
2689 const std::string & tag_name) const
2690{
2691 if (!_c_parameters.isParamValid(tag_name))
2692 mooseError("Tag name parameter '", tag_name, "' is invalid");
2693
2694 TagName tagname = _c_parameters.get<TagName>(tag_name);
2695 if (!_c_fe_problem.vectorTagExists(tagname))
2696 mooseError("Tagged vector with tag name '", tagname, "' does not exist");
2697
2698 TagID tag = _c_fe_problem.getVectorTagID(tagname);
2699 return coupledVectorTagDofValues(var_names, tag);
2700}
2701
2702std::vector<const VariableValue *>
2703Coupleable::coupledMatrixTagValues(const std::string & var_names, TagID tag) const
2704{
2705 auto func = [this, &var_names, &tag](unsigned int comp)
2706 { return &coupledMatrixTagValue(var_names, tag, comp); };
2707 return coupledVectorHelper<const VariableValue *>(var_names, func);
2708}
2709
2710std::vector<const VariableValue *>
2711Coupleable::coupledMatrixTagValues(const std::string & var_names,
2712 const std::string & tag_name) const
2713{
2714 if (!_c_parameters.isParamValid(tag_name))
2715 mooseError("Tag name parameter '", tag_name, "' is invalid");
2716
2717 TagName tagname = _c_parameters.get<TagName>(tag_name);
2718 if (!_c_fe_problem.matrixTagExists(tagname))
2719 mooseError("Matrix tag name '", tagname, "' does not exist");
2720
2721 TagID tag = _c_fe_problem.getMatrixTagID(tagname);
2722 return coupledMatrixTagValues(var_names, tag);
2723}
2724
2725std::vector<const VariableValue *>
2726Coupleable::coupledValuesOld(const std::string & var_name) const
2727{
2728 auto func = [this, &var_name](unsigned int comp) { return &coupledValueOld(var_name, comp); };
2729 return coupledVectorHelper<const VariableValue *>(var_name, func);
2730}
2731
2732std::vector<const VariableValue *>
2733Coupleable::coupledValuesOlder(const std::string & var_name) const
2734{
2735 auto func = [this, &var_name](unsigned int comp) { return &coupledValueOlder(var_name, comp); };
2736 return coupledVectorHelper<const VariableValue *>(var_name, func);
2737}
2738
2739std::vector<const VectorVariableValue *>
2740Coupleable::coupledVectorValuesOld(const std::string & var_name) const
2741{
2742 auto func = [this, &var_name](unsigned int comp)
2743 { return &coupledVectorValueOld(var_name, comp); };
2744 return coupledVectorHelper<const VectorVariableValue *>(var_name, func);
2745}
2746
2747std::vector<const VariableGradient *>
2748Coupleable::coupledGradients(const std::string & var_name) const
2749{
2750 auto func = [this, &var_name](unsigned int comp) { return &coupledGradient(var_name, comp); };
2751 return coupledVectorHelper<const VariableGradient *>(var_name, func);
2752}
2753
2754template <>
2755std::vector<const GenericVariableGradient<false> *>
2756Coupleable::coupledGenericGradients<false>(const std::string & var_name) const
2757{
2758 return coupledGradients(var_name);
2759}
2760
2761template <>
2762std::vector<const GenericVariableGradient<true> *>
2763Coupleable::coupledGenericGradients<true>(const std::string & var_name) const
2764{
2765 auto func = [this, &var_name](unsigned int comp) { return &adCoupledGradient(var_name, comp); };
2766 return coupledVectorHelper<const GenericVariableGradient<true> *>(var_name, func);
2767}
2768
2769std::vector<const ADVariableGradient *>
2770Coupleable::adCoupledGradients(const std::string & var_name) const
2771{
2772 auto func = [this, &var_name](unsigned int comp) { return &adCoupledGradient(var_name, comp); };
2773 return coupledVectorHelper<const ADVariableGradient *>(var_name, func);
2774}
2775
2776std::vector<const VariableGradient *>
2777Coupleable::coupledGradientsOld(const std::string & var_name) const
2778{
2779 auto func = [this, &var_name](unsigned int comp) { return &coupledGradientOld(var_name, comp); };
2780 return coupledVectorHelper<const VariableGradient *>(var_name, func);
2781}
2782
2783std::vector<const VariableValue *>
2784Coupleable::coupledDots(const std::string & var_name) const
2785{
2786 auto func = [this, &var_name](unsigned int comp) { return &coupledDot(var_name, comp); };
2787 return coupledVectorHelper<const VariableValue *>(var_name, func);
2788}
2789
2790std::vector<const ADVariableValue *>
2791Coupleable::adCoupledDots(const std::string & var_name) const
2792{
2793 auto func = [this, &var_name](unsigned int comp) { return &adCoupledDot(var_name, comp); };
2794 return coupledVectorHelper<const ADVariableValue *>(var_name, func);
2795}
2796
2797template <>
2799Coupleable::coupledGenericDot<false>(const std::string & var_name, unsigned int comp) const
2800{
2801 return coupledDot(var_name, comp);
2802}
2803
2804template <>
2806Coupleable::coupledGenericDot<true>(const std::string & var_name, unsigned int comp) const
2807{
2808 return adCoupledDot(var_name, comp);
2809}
2810
2811// Explicit instantiations
2812
2813template const Real & Coupleable::getDefaultNodalValue<Real>(const std::string & var_name,
2814 unsigned int comp) const;
2815
2816template const Real & Coupleable::coupledNodalValue<Real>(const std::string & var_name,
2817 unsigned int comp) const;
2818template const ADReal & Coupleable::adCoupledNodalValue<Real>(const std::string & var_name,
2819 unsigned int comp) const;
2820template const ADRealVectorValue &
2821Coupleable::adCoupledNodalValue<RealVectorValue>(const std::string & var_name,
2822 unsigned int comp) const;
2823
2824template const RealVectorValue &
2825Coupleable::coupledNodalValue<RealVectorValue>(const std::string & var_name,
2826 unsigned int comp) const;
2827template const Real & Coupleable::coupledNodalValueOld<Real>(const std::string & var_name,
2828 unsigned int comp) const;
2829template const RealVectorValue &
2830Coupleable::coupledNodalValueOld<RealVectorValue>(const std::string & var_name,
2831 unsigned int comp) const;
2832template const Real & Coupleable::coupledNodalValueOlder<Real>(const std::string & var_name,
2833 unsigned int comp) const;
2834template const RealVectorValue &
2835Coupleable::coupledNodalValueOlder<RealVectorValue>(const std::string & var_name,
2836 unsigned int comp) const;
2837template const Real & Coupleable::coupledNodalValuePreviousNL<Real>(const std::string & var_name,
2838 unsigned int comp) const;
2839template const RealVectorValue &
2840Coupleable::coupledNodalValuePreviousNL<RealVectorValue>(const std::string & var_name,
2841 unsigned int comp) const;
2842template const Real & Coupleable::coupledNodalDot<Real>(const std::string & var_name,
2843 unsigned int comp) const;
2844template const RealVectorValue &
2845Coupleable::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 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:1779
const std::vector< T * > & getInterfaceObjects() const
Gets the registered interface objects for a given interface.
Definition MooseApp.h:1801
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:204
virtual TagID getMatrixTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition SubProblem.C:343
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:329
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:201
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:945
virtual bool hasVariable(const std::string &var_name) const
Query a system for a variable.
Definition SystemBase.C:850
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:165
const TagName OLD_SOLUTION_TAG
Definition MooseTypes.C:26
@ VAR_ANY
Definition MooseTypes.h:772
@ VAR_SOLVER
Definition MooseTypes.h:770
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...