https://mooseframework.inl.gov
SubProblem.h
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 #pragma once
11 
12 #include "Problem.h"
13 #include "DiracKernelInfo.h"
14 #include "GeometricSearchData.h"
15 #include "MooseTypes.h"
16 #include "VectorTag.h"
17 #include "MooseError.h"
19 #include "RawValueFunctor.h"
20 #include "ADWrapperFunctor.h"
21 
22 #include "libmesh/coupling_matrix.h"
23 #include "libmesh/parameters.h"
24 
25 #include <memory>
26 #include <unordered_map>
27 #include <map>
28 #include <vector>
29 
30 namespace libMesh
31 {
32 template <typename>
33 class VectorValue;
35 class GhostingFunctor;
36 }
37 
38 class MooseMesh;
39 class Factory;
40 class Assembly;
43 template <typename>
49 class SystemBase;
50 class LineSearch;
51 class FaceInfo;
52 class MooseObjectName;
53 namespace Moose
54 {
55 class FunctorEnvelopeBase;
56 }
57 
58 // libMesh forward declarations
59 namespace libMesh
60 {
61 class EquationSystems;
62 class DofMap;
63 class CouplingMatrix;
64 template <typename T>
65 class SparseMatrix;
66 template <typename T>
67 class NumericVector;
68 class System;
69 } // namespace libMesh
70 
73 
78 class SubProblem : public Problem
79 {
80 public:
82 
84  virtual ~SubProblem();
85 
86  virtual libMesh::EquationSystems & es() = 0;
87  virtual MooseMesh & mesh() = 0;
88  virtual const MooseMesh & mesh() const = 0;
89  virtual const MooseMesh & mesh(bool use_displaced) const = 0;
90 
95  virtual bool checkNonlocalCouplingRequirement() const = 0;
96 
100  virtual bool solverSystemConverged(const unsigned int sys_num) { return converged(sys_num); }
101 
105  virtual bool nlConverged(const unsigned int nl_sys_num);
106 
113  virtual bool converged(const unsigned int sys_num) { return solverSystemConverged(sys_num); }
114 
118  virtual unsigned int nlSysNum(const NonlinearSystemName & nl_sys_name) const = 0;
119 
123  virtual unsigned int linearSysNum(const LinearSystemName & linear_sys_name) const = 0;
124 
128  virtual unsigned int solverSysNum(const SolverSystemName & solver_sys_name) const = 0;
129 
130  virtual void onTimestepBegin() = 0;
131  virtual void onTimestepEnd() = 0;
132 
133  virtual bool isTransient() const = 0;
134 
136  virtual void needFV() = 0;
137 
139  virtual bool haveFV() const = 0;
140 
145 
156  virtual TagID addVectorTag(const TagName & tag_name,
158 
164  void addNotZeroedVectorTag(const TagID tag);
165 
173  bool vectorTagNotZeroed(const TagID tag) const;
174 
178  virtual const VectorTag & getVectorTag(const TagID tag_id) const;
179  std::vector<VectorTag> getVectorTags(const std::set<TagID> & tag_ids) const;
180 
184  virtual TagID getVectorTagID(const TagName & tag_name) const;
185 
189  virtual TagName vectorTagName(const TagID tag) const;
190 
195  virtual const std::vector<VectorTag> &
197 
201  virtual bool vectorTagExists(const TagID tag_id) const { return tag_id < _vector_tags.size(); }
202 
206  virtual bool vectorTagExists(const TagName & tag_name) const;
207 
211  virtual unsigned int numVectorTags(const Moose::VectorTagType type = Moose::VECTOR_TAG_ANY) const;
212 
213  virtual Moose::VectorTagType vectorTagType(const TagID tag_id) const;
214 
223  virtual TagID addMatrixTag(TagName tag_name);
224 
228  virtual TagID getMatrixTagID(const TagName & tag_name) const;
229 
233  virtual TagName matrixTagName(TagID tag);
234 
238  virtual bool matrixTagExists(const TagName & tag_name) const;
239 
243  virtual bool matrixTagExists(TagID tag_id) const;
244 
248  virtual unsigned int numMatrixTags() const { return _matrix_tag_name_to_tag_id.size(); }
249 
253  virtual std::map<TagName, TagID> & getMatrixTags() { return _matrix_tag_name_to_tag_id; }
254 
256  virtual bool hasVariable(const std::string & var_name) const = 0;
257 
259  virtual bool hasLinearVariable(const std::string & var_name) const;
260 
262  virtual bool hasAuxiliaryVariable(const std::string & var_name) const;
263 
273  virtual const MooseVariableFieldBase & getVariable(
274  const THREAD_ID tid,
275  const std::string & var_name,
277  Moose::VarFieldType expected_var_field_type = Moose::VarFieldType::VAR_FIELD_ANY) const = 0;
278  virtual MooseVariableFieldBase &
280  const std::string & var_name,
283  {
284  return const_cast<MooseVariableFieldBase &>(const_cast<const SubProblem *>(this)->getVariable(
285  tid, var_name, expected_var_type, expected_var_field_type));
286  }
287 
289  virtual MooseVariable & getStandardVariable(const THREAD_ID tid,
290  const std::string & var_name) = 0;
291 
294  const std::string & var_name) = 0;
295 
297  virtual VectorMooseVariable & getVectorVariable(const THREAD_ID tid,
298  const std::string & var_name) = 0;
299 
301  virtual ArrayMooseVariable & getArrayVariable(const THREAD_ID tid,
302  const std::string & var_name) = 0;
303 
305  virtual bool hasScalarVariable(const std::string & var_name) const = 0;
306 
308  virtual MooseVariableScalar & getScalarVariable(const THREAD_ID tid,
309  const std::string & var_name) = 0;
310 
312  virtual libMesh::System & getSystem(const std::string & var_name) = 0;
313 
320  virtual void
321  setActiveElementalMooseVariables(const std::set<MooseVariableFieldBase *> & moose_vars,
322  const THREAD_ID tid);
323 
329  virtual const std::set<MooseVariableFieldBase *> &
331 
337  virtual bool hasActiveElementalMooseVariables(const THREAD_ID tid) const;
338 
346  virtual void clearActiveElementalMooseVariables(const THREAD_ID tid);
347 
348  virtual Assembly & assembly(const THREAD_ID tid, const unsigned int sys_num) = 0;
349  virtual const Assembly & assembly(const THREAD_ID tid, const unsigned int sys_num) const = 0;
350 
354  virtual const SystemBase & systemBaseNonlinear(const unsigned int sys_num) const = 0;
355  virtual SystemBase & systemBaseNonlinear(const unsigned int sys_num) = 0;
359  virtual const SystemBase & systemBaseLinear(const unsigned int sys_num) const = 0;
360  virtual SystemBase & systemBaseLinear(const unsigned int sys_num) = 0;
364  virtual const SystemBase & systemBaseSolver(const unsigned int sys_num) const = 0;
365  virtual SystemBase & systemBaseSolver(const unsigned int sys_num) = 0;
369  virtual const SystemBase & systemBaseAuxiliary() const = 0;
370  virtual SystemBase & systemBaseAuxiliary() = 0;
371 
372  virtual void prepareShapes(unsigned int var, const THREAD_ID tid) = 0;
373  virtual void prepareFaceShapes(unsigned int var, const THREAD_ID tid) = 0;
374  virtual void prepareNeighborShapes(unsigned int var, const THREAD_ID tid) = 0;
376 
381  unsigned int getAxisymmetricRadialCoord() const;
382 
383  virtual DiracKernelInfo & diracKernelInfo();
384  virtual Real finalNonlinearResidual(const unsigned int nl_sys_num) const;
385  virtual unsigned int nNonlinearIterations(const unsigned int nl_sys_num) const;
386  virtual unsigned int nLinearIterations(const unsigned int nl_sys_num) const;
387 
388  virtual void addResidual(const THREAD_ID tid) = 0;
389  virtual void addResidualNeighbor(const THREAD_ID tid) = 0;
390  virtual void addResidualLower(const THREAD_ID tid) = 0;
391 
392  virtual void cacheResidual(const THREAD_ID tid);
393  virtual void cacheResidualNeighbor(const THREAD_ID tid);
394  virtual void addCachedResidual(const THREAD_ID tid);
395 
397  const THREAD_ID tid) = 0;
399  const THREAD_ID tid) = 0;
400 
401  virtual void addJacobian(const THREAD_ID tid) = 0;
402  virtual void addJacobianNeighbor(const THREAD_ID tid) = 0;
403  virtual void addJacobianNeighborLowerD(const THREAD_ID tid) = 0;
404  virtual void addJacobianLowerD(const THREAD_ID tid) = 0;
406  unsigned int ivar,
407  unsigned int jvar,
408  const libMesh::DofMap & dof_map,
409  std::vector<dof_id_type> & dof_indices,
410  std::vector<dof_id_type> & neighbor_dof_indices,
411  const std::set<TagID> & tags,
412  const THREAD_ID tid) = 0;
413 
414  virtual void cacheJacobian(const THREAD_ID tid);
415  virtual void cacheJacobianNeighbor(const THREAD_ID tid);
416  virtual void addCachedJacobian(const THREAD_ID tid);
417 
418  virtual void prepare(const Elem * elem, const THREAD_ID tid) = 0;
419  virtual void prepareFace(const Elem * elem, const THREAD_ID tid) = 0;
420  virtual void prepare(const Elem * elem,
421  unsigned int ivar,
422  unsigned int jvar,
423  const std::vector<dof_id_type> & dof_indices,
424  const THREAD_ID tid) = 0;
425  virtual void setCurrentSubdomainID(const Elem * elem, const THREAD_ID tid) = 0;
426  virtual void
427  setNeighborSubdomainID(const Elem * elem, unsigned int side, const THREAD_ID tid) = 0;
428  virtual void prepareAssembly(const THREAD_ID tid) = 0;
429 
430  virtual void reinitElem(const Elem * elem, const THREAD_ID tid) = 0;
431  virtual void reinitElemPhys(const Elem * elem,
432  const std::vector<Point> & phys_points_in_elem,
433  const THREAD_ID tid) = 0;
434  virtual void reinitElemFace(const Elem * elem, unsigned int side, const THREAD_ID tid) = 0;
435  virtual void reinitLowerDElem(const Elem * lower_d_elem,
436  const THREAD_ID tid,
437  const std::vector<Point> * const pts = nullptr,
438  const std::vector<Real> * const weights = nullptr);
439  virtual void reinitNode(const Node * node, const THREAD_ID tid) = 0;
440  virtual void reinitNodeFace(const Node * node, BoundaryID bnd_id, const THREAD_ID tid) = 0;
441  virtual void reinitNodes(const std::vector<dof_id_type> & nodes, const THREAD_ID tid) = 0;
442  virtual void reinitNodesNeighbor(const std::vector<dof_id_type> & nodes, const THREAD_ID tid) = 0;
443  virtual void reinitNeighbor(const Elem * elem, unsigned int side, const THREAD_ID tid) = 0;
444  virtual void reinitNeighborPhys(const Elem * neighbor,
445  unsigned int neighbor_side,
446  const std::vector<Point> & physical_points,
447  const THREAD_ID tid) = 0;
448  virtual void reinitNeighborPhys(const Elem * neighbor,
449  const std::vector<Point> & physical_points,
450  const THREAD_ID tid) = 0;
451  virtual void
452  reinitElemNeighborAndLowerD(const Elem * elem, unsigned int side, const THREAD_ID tid) = 0;
459  virtual void reinitScalars(const THREAD_ID tid,
460  bool reinit_for_derivative_reordering = false) = 0;
461  virtual void reinitOffDiagScalars(const THREAD_ID tid) = 0;
462 
464  virtual void setCurrentBoundaryID(BoundaryID bid, const THREAD_ID tid);
465 
472  virtual void reinitElemFaceRef(const Elem * elem,
473  unsigned int side,
474  Real tolerance,
475  const std::vector<Point> * const pts,
476  const std::vector<Real> * const weights = nullptr,
477  const THREAD_ID tid = 0);
478 
485  virtual void reinitNeighborFaceRef(const Elem * neighbor_elem,
486  unsigned int neighbor_side,
487  Real tolerance,
488  const std::vector<Point> * const pts,
489  const std::vector<Real> * const weights = nullptr,
490  const THREAD_ID tid = 0);
491 
495  void reinitNeighborLowerDElem(const Elem * elem, const THREAD_ID tid = 0);
496 
500  void reinitMortarElem(const Elem * elem, const THREAD_ID tid = 0);
501 
505  virtual bool reinitDirac(const Elem * elem, const THREAD_ID tid) = 0;
509  virtual void getDiracElements(std::set<const Elem *> & elems) = 0;
514  virtual void clearDiracInfo() = 0;
515 
519  virtual void
521 
526  void reinitGeomSearch();
527 
528  virtual GeometricSearchData & geomSearchData() = 0;
529 
538  virtual void storeSubdomainMatPropName(SubdomainID block_id, const std::string & name);
539 
548  virtual void storeBoundaryMatPropName(BoundaryID boundary_id, const std::string & name);
549 
558  virtual void storeSubdomainZeroMatProp(SubdomainID block_id, const MaterialPropertyName & name);
559 
568  virtual void storeBoundaryZeroMatProp(BoundaryID boundary_id, const MaterialPropertyName & name);
569 
576  virtual void storeSubdomainDelayedCheckMatProp(const std::string & requestor,
577  SubdomainID block_id,
578  const std::string & name);
579 
587  virtual void storeBoundaryDelayedCheckMatProp(const std::string & requestor,
588  BoundaryID boundary_id,
589  const std::string & name);
590 
596  virtual void checkBlockMatProps();
597 
603  virtual void checkBoundaryMatProps();
604 
608  virtual void markMatPropRequested(const std::string &);
609 
613  virtual bool isMatPropRequested(const std::string & prop_name) const;
614 
618  void addConsumedPropertyName(const MooseObjectName & obj_name, const std::string & prop_name);
619 
623  const std::map<MooseObjectName, std::set<std::string>> & getConsumedPropertyMap() const;
624 
628  virtual void addGhostedElem(dof_id_type elem_id) = 0;
629 
633  virtual void addGhostedBoundary(BoundaryID boundary_id) = 0;
634 
638  virtual void ghostGhostedBoundaries() = 0;
639 
643  virtual std::set<SubdomainID> getMaterialPropertyBlocks(const std::string & prop_name);
644 
648  virtual std::vector<SubdomainName> getMaterialPropertyBlockNames(const std::string & prop_name);
649 
653  virtual bool hasBlockMaterialProperty(SubdomainID block_id, const std::string & prop_name);
654 
658  virtual std::set<BoundaryID> getMaterialPropertyBoundaryIDs(const std::string & prop_name);
659 
663  virtual std::vector<BoundaryName> getMaterialPropertyBoundaryNames(const std::string & prop_name);
664 
668  virtual bool hasBoundaryMaterialProperty(BoundaryID boundary_id, const std::string & prop_name);
669 
674  virtual bool computingPreSMOResidual(const unsigned int nl_sys_num) const = 0;
675 
680  virtual std::set<dof_id_type> & ghostedElems() { return _ghosted_elems; }
681 
682  std::map<std::string, std::vector<dof_id_type>> _var_dof_map;
683 
687  virtual const libMesh::CouplingMatrix & nonlocalCouplingMatrix(const unsigned i) const = 0;
688 
693 
697  void setCurrentlyComputingJacobian(const bool currently_computing_jacobian)
698  {
699  _currently_computing_jacobian = currently_computing_jacobian;
700  }
701 
705  const bool & currentlyComputingResidualAndJacobian() const;
706 
710  void setCurrentlyComputingResidualAndJacobian(bool currently_computing_residual_and_jacobian);
711 
716 
720  virtual void computingNonlinearResid(const bool computing_nonlinear_residual)
721  {
722  _computing_nonlinear_residual = computing_nonlinear_residual;
723  }
724 
729 
733  virtual void setCurrentlyComputingResidual(const bool currently_computing_residual)
734  {
735  _currently_computing_residual = currently_computing_residual;
736  }
737 
740 
742  virtual bool safeAccessTaggedVectors() const { return _safe_access_tagged_vectors; }
743 
745 
747 
748  virtual void setActiveFEVariableCoupleableVectorTags(std::set<TagID> & vtags,
749  const THREAD_ID tid);
750 
751  virtual void setActiveFEVariableCoupleableMatrixTags(std::set<TagID> & mtags,
752  const THREAD_ID tid);
753 
755 
757 
758  virtual void setActiveScalarVariableCoupleableVectorTags(std::set<TagID> & vtags,
759  const THREAD_ID tid);
760 
761  virtual void setActiveScalarVariableCoupleableMatrixTags(std::set<TagID> & mtags,
762  const THREAD_ID tid);
763 
764  const std::set<TagID> & getActiveScalarVariableCoupleableVectorTags(const THREAD_ID tid) const;
765 
766  const std::set<TagID> & getActiveScalarVariableCoupleableMatrixTags(const THREAD_ID tid) const;
767 
768  const std::set<TagID> & getActiveFEVariableCoupleableVectorTags(const THREAD_ID tid) const;
769 
770  const std::set<TagID> & getActiveFEVariableCoupleableMatrixTags(const THREAD_ID tid) const;
771 
775  virtual void haveADObjects(bool have_ad_objects) { _have_ad_objects = have_ad_objects; }
779  bool haveADObjects() const { return _have_ad_objects; }
780 
781  virtual LineSearch * getLineSearch() = 0;
782 
786  virtual const libMesh::CouplingMatrix * couplingMatrix(const unsigned int nl_sys_num) const = 0;
787 
788 private:
798  void cloneAlgebraicGhostingFunctor(libMesh::GhostingFunctor & algebraic_gf, bool to_mesh = true);
799 
809  void cloneCouplingGhostingFunctor(libMesh::GhostingFunctor & coupling_gf, bool to_mesh = true);
810 
811 public:
815  void addAlgebraicGhostingFunctor(libMesh::GhostingFunctor & algebraic_gf, bool to_mesh = true);
816 
820  void addCouplingGhostingFunctor(libMesh::GhostingFunctor & coupling_gf, bool to_mesh = true);
821 
826 
831 
836  virtual void automaticScaling(bool automatic_scaling);
837 
842  bool automaticScaling() const;
843 
848  void hasScalingVector(const unsigned int nl_sys_num);
849 
853  virtual bool haveDisplaced() const = 0;
854 
858  virtual bool computingScalingJacobian() const = 0;
859 
863  virtual bool computingScalingResidual() const = 0;
864 
868  void clearAllDofIndices();
869 
879  template <typename T>
880  const Moose::Functor<T> & getFunctor(const std::string & name,
881  const THREAD_ID tid,
882  const std::string & requestor_name,
883  bool requestor_is_ad);
884 
888  bool hasFunctor(const std::string & name, const THREAD_ID tid) const;
889 
893  template <typename T>
894  bool hasFunctorWithType(const std::string & name, const THREAD_ID tid) const;
895 
899  template <typename T>
900  void
901  addFunctor(const std::string & name, const Moose::FunctorBase<T> & functor, const THREAD_ID tid);
902 
916  template <typename T, typename PolymorphicLambda>
917  const Moose::FunctorBase<T> &
918  addPiecewiseByBlockLambdaFunctor(const std::string & name,
919  PolymorphicLambda my_lammy,
920  const std::set<ExecFlagType> & clearance_schedule,
921  const MooseMesh & mesh,
922  const std::set<SubdomainID> & block_ids,
923  const THREAD_ID tid);
924 
925  virtual void initialSetup();
926  virtual void timestepSetup();
927  virtual void customSetup(const ExecFlagType & exec_type);
928  virtual void residualSetup();
929  virtual void jacobianSetup();
930 
932  void setFunctorOutput(bool set_output) { _show_functors = set_output; }
934  void setChainControlDataOutput(bool set_output) { _show_chain_control_data = set_output; }
935 
936 #ifndef NDEBUG
937  virtual bool checkResidualForNans() const = 0;
939 #endif
940 
944  virtual std::size_t numNonlinearSystems() const = 0;
945 
949  virtual unsigned int currentNlSysNum() const = 0;
950 
954  virtual std::size_t numLinearSystems() const = 0;
955 
959  virtual std::size_t numSolverSystems() const = 0;
960 
964  virtual unsigned int currentLinearSysNum() const = 0;
965 
969  template <typename T>
970  void registerUnfilledFunctorRequest(T * functor_interface,
971  const std::string & functor_name,
972  const THREAD_ID tid);
973 
977  virtual const std::vector<VectorTag> & currentResidualVectorTags() const = 0;
978 
985  static void selectVectorTagsFromSystem(const SystemBase & system,
986  const std::vector<VectorTag> & input_vector_tags,
987  std::set<TagID> & selected_tags);
988 
995  static void selectMatrixTagsFromSystem(const SystemBase & system,
996  const std::map<TagName, TagID> & input_matrix_tags,
997  std::set<TagID> & selected_tags);
998 
1002  void reinitFVFace(const THREAD_ID tid, const FaceInfo & fi);
1003 
1009  virtual bool hasNonlocalCoupling() const = 0;
1010 
1014  void preparePRefinement();
1015 
1019  [[nodiscard]] bool doingPRefinement() const;
1020 
1024  [[nodiscard]] bool havePRefinement() const { return _have_p_refinement; }
1025 
1030  void markFamilyPRefinement(const InputParameters & params);
1031 
1035  virtual void setCurrentLowerDElem(const Elem * const lower_d_elem, const THREAD_ID tid);
1036 
1037 protected:
1042  template <typename T>
1044  const std::string & var_name,
1045  Moose::VarKindType expected_var_type,
1046  Moose::VarFieldType expected_var_field_type,
1047  const std::vector<T> & nls,
1048  const SystemBase & aux) const;
1049 
1053  bool verifyVectorTags() const;
1054 
1056  std::map<TagName, TagID> _matrix_tag_name_to_tag_id;
1057 
1059  std::map<TagID, TagName> _matrix_tag_id_to_tag_name;
1060 
1063 
1065 
1067  std::map<SubdomainID, std::set<std::string>> _map_block_material_props;
1068 
1070  std::map<BoundaryID, std::set<std::string>> _map_boundary_material_props;
1071 
1073  std::map<SubdomainID, std::set<MaterialPropertyName>> _zero_block_material_props;
1074  std::map<BoundaryID, std::set<MaterialPropertyName>> _zero_boundary_material_props;
1075 
1077  std::set<std::string> _material_property_requested;
1078 
1080 
1085  std::map<SubdomainID, std::multimap<std::string, std::string>> _map_block_material_props_check;
1086  std::map<BoundaryID, std::multimap<std::string, std::string>> _map_boundary_material_props_check;
1088 
1090  std::vector<std::set<MooseVariableFieldBase *>> _active_elemental_moose_variables;
1091 
1093  /* This needs to remain <unsigned int> for threading purposes */
1094  std::vector<unsigned int> _has_active_elemental_moose_variables;
1095 
1096  std::vector<std::set<TagID>> _active_fe_var_coupleable_matrix_tags;
1097 
1098  std::vector<std::set<TagID>> _active_fe_var_coupleable_vector_tags;
1099 
1100  std::vector<std::set<TagID>> _active_sc_var_coupleable_matrix_tags;
1101 
1102  std::vector<std::set<TagID>> _active_sc_var_coupleable_vector_tags;
1103 
1106 
1108  std::set<dof_id_type> _ghosted_elems;
1109 
1112 
1115 
1118 
1121 
1124 
1127 
1130 
1132  std::unordered_set<TagID> _not_zeroed_tagged_vectors;
1133 
1134 private:
1141  virtual std::pair<bool, unsigned int>
1142  determineSolverSystem(const std::string & var_name, bool error_if_not_found = false) const = 0;
1143 
1144  enum class TrueFunctorIs
1145  {
1146  UNSET,
1147  NONAD,
1148  AD
1149  };
1150 
1155  std::vector<std::multimap<std::string,
1156  std::tuple<TrueFunctorIs,
1157  std::unique_ptr<Moose::FunctorEnvelopeBase>,
1158  std::unique_ptr<Moose::FunctorEnvelopeBase>>>>
1160 
1162  std::vector<std::map<std::string, std::unique_ptr<Moose::FunctorAbstract>>> _pbblf_functors;
1163 
1165  void showFunctors() const;
1166 
1168  void showFunctorRequestors() const;
1169 
1172  std::map<std::string, std::set<std::string>> _functor_to_requestors;
1173 
1176  std::vector<std::multimap<std::string, std::pair<bool, bool>>> _functor_to_request_info;
1177 
1180 
1183 
1185  std::vector<VectorTag> _vector_tags;
1186 
1192  std::vector<std::vector<VectorTag>> _typed_vector_tags;
1193 
1195  std::map<TagName, TagID> _vector_tags_name_map;
1196 
1198  std::string restrictionSubdomainCheckName(SubdomainID check_id);
1199  std::string restrictionBoundaryCheckName(BoundaryID check_id);
1201 
1202  // Contains properties consumed by objects, see addConsumedPropertyName
1203  std::map<MooseObjectName, std::set<std::string>> _consumed_material_properties;
1204 
1208  std::unordered_map<libMesh::GhostingFunctor *,
1209  std::vector<std::shared_ptr<libMesh::GhostingFunctor>>>
1211 
1215  std::unordered_map<libMesh::GhostingFunctor *,
1216  std::vector<std::shared_ptr<libMesh::GhostingFunctor>>>
1218 
1221 
1223  std::unordered_map<FEFamily, bool> _family_for_p_refinement;
1225  static const std::unordered_set<FEFamily> _default_families_without_p_refinement;
1226 
1227  friend class Restartable;
1228 };
1229 
1230 template <typename T>
1231 const Moose::Functor<T> &
1232 SubProblem::getFunctor(const std::string & name,
1233  const THREAD_ID tid,
1234  const std::string & requestor_name,
1235  const bool requestor_is_ad)
1236 {
1237  mooseAssert(tid < _functors.size(), "Too large a thread ID");
1238 
1239  // Log the requestor
1240  _functor_to_requestors["wraps_" + name].insert(requestor_name);
1241 
1242  constexpr bool requested_functor_is_ad =
1243  !std::is_same<T, typename MetaPhysicL::RawType<T>::value_type>::value;
1244 
1245  auto & functor_to_request_info = _functor_to_request_info[tid];
1246 
1247  // Get the requested functor if we already have it
1248  auto & functors = _functors[tid];
1249  if (auto find_ret = functors.find("wraps_" + name); find_ret != functors.end())
1250  {
1251  if (functors.count("wraps_" + name) > 1)
1252  mooseError("Attempted to get a functor with the name '",
1253  name,
1254  "' but multiple (" + std::to_string(functors.count("wraps_" + name)) +
1255  ") functors match. Make sure that you do not have functor material "
1256  "properties, functions, postprocessors or variables with the same names.");
1257 
1258  auto & [true_functor_is, non_ad_functor, ad_functor] = find_ret->second;
1259  auto & functor_wrapper = requested_functor_is_ad ? *ad_functor : *non_ad_functor;
1260 
1261  auto * const functor = dynamic_cast<Moose::Functor<T> *>(&functor_wrapper);
1262  if (!functor)
1263  mooseError("A call to SubProblem::getFunctor requested a functor named '",
1264  name,
1265  "' that returns the type: '",
1266  libMesh::demangle(typeid(T).name()),
1267  "'. However, that functor already exists and returns a different type: '",
1268  functor_wrapper.returnType(),
1269  "'");
1270 
1271  if (functor->template wrapsType<Moose::NullFunctor<T>>())
1272  // Store for future checking when the actual functor gets added
1273  functor_to_request_info.emplace(name,
1274  std::make_pair(requested_functor_is_ad, requestor_is_ad));
1275  else
1276  {
1277  // We already have the actual functor
1278  if (true_functor_is == SubProblem::TrueFunctorIs::UNSET)
1279  mooseError("We already have the functor; it should not be unset");
1280 
1281  // Check for whether this is a valid request
1282  // We allow auxiliary variables and linear variables to be retrieved as non AD
1283  if (!requested_functor_is_ad && requestor_is_ad &&
1284  true_functor_is == SubProblem::TrueFunctorIs::AD &&
1286  mooseError("The AD object '",
1287  requestor_name,
1288  "' is requesting the functor '",
1289  name,
1290  "' as a non-AD functor even though it is truly an AD functor, which is not "
1291  "allowed, since this may unintentionally drop derivatives.");
1292  }
1293 
1294  return *functor;
1295  }
1296 
1297  // We don't have the functor yet but we could have it in the future. We'll create null functors
1298  // for now
1299  functor_to_request_info.emplace(name, std::make_pair(requested_functor_is_ad, requestor_is_ad));
1300  if constexpr (requested_functor_is_ad)
1301  {
1302  typedef typename MetaPhysicL::RawType<T>::value_type NonADType;
1303  typedef T ADType;
1304 
1305  auto emplace_ret =
1306  functors.emplace("wraps_" + name,
1307  std::make_tuple(SubProblem::TrueFunctorIs::UNSET,
1308  std::make_unique<Moose::Functor<NonADType>>(
1309  std::make_unique<Moose::NullFunctor<NonADType>>()),
1310  std::make_unique<Moose::Functor<ADType>>(
1311  std::make_unique<Moose::NullFunctor<ADType>>())));
1312 
1313  return static_cast<Moose::Functor<T> &>(*(requested_functor_is_ad
1314  ? std::get<2>(emplace_ret->second)
1315  : std::get<1>(emplace_ret->second)));
1316  }
1317  else
1318  {
1319  typedef T NonADType;
1320  typedef typename Moose::ADType<T>::type ADType;
1321 
1322  auto emplace_ret =
1323  functors.emplace("wraps_" + name,
1324  std::make_tuple(SubProblem::TrueFunctorIs::UNSET,
1325  std::make_unique<Moose::Functor<NonADType>>(
1326  std::make_unique<Moose::NullFunctor<NonADType>>()),
1327  std::make_unique<Moose::Functor<ADType>>(
1328  std::make_unique<Moose::NullFunctor<ADType>>())));
1329 
1330  return static_cast<Moose::Functor<T> &>(*(requested_functor_is_ad
1331  ? std::get<2>(emplace_ret->second)
1332  : std::get<1>(emplace_ret->second)));
1333  }
1334 }
1335 
1336 template <typename T>
1337 bool
1338 SubProblem::hasFunctorWithType(const std::string & name, const THREAD_ID tid) const
1339 {
1340  mooseAssert(tid < _functors.size(), "Too large a thread ID");
1341  auto & functors = _functors[tid];
1342 
1343  const auto & it = functors.find("wraps_" + name);
1344  constexpr bool requested_functor_is_ad =
1345  !std::is_same<T, typename MetaPhysicL::RawType<T>::value_type>::value;
1346 
1347  if (it == functors.end())
1348  return false;
1349  else
1350  return dynamic_cast<Moose::Functor<T> *>(
1351  requested_functor_is_ad ? std::get<2>(it->second).get() : std::get<1>(it->second).get());
1352 }
1353 
1354 template <typename T, typename PolymorphicLambda>
1355 const Moose::FunctorBase<T> &
1357  PolymorphicLambda my_lammy,
1358  const std::set<ExecFlagType> & clearance_schedule,
1359  const MooseMesh & mesh,
1360  const std::set<SubdomainID> & block_ids,
1361  const THREAD_ID tid)
1362 {
1363  auto & pbblf_functors = _pbblf_functors[tid];
1364 
1365  auto [it, first_time_added] =
1366  pbblf_functors.emplace(name,
1367  std::make_unique<PiecewiseByBlockLambdaFunctor<T>>(
1368  name, my_lammy, clearance_schedule, mesh, block_ids));
1369 
1370  auto * functor = dynamic_cast<PiecewiseByBlockLambdaFunctor<T> *>(it->second.get());
1371  if (!functor)
1372  {
1373  if (first_time_added)
1374  mooseError("This should be impossible. If this was the first time we added the functor, then "
1375  "the dynamic cast absolutely should have succeeded");
1376  else
1377  mooseError("Attempted to add a lambda functor with the name '",
1378  name,
1379  "' but another lambda functor of that name returns a different type");
1380  }
1381 
1382  if (first_time_added)
1383  addFunctor(name, *functor, tid);
1384  else
1385  // The functor already exists
1386  functor->setFunctor(mesh, block_ids, my_lammy);
1387 
1388  return *functor;
1389 }
1390 
1391 template <typename T>
1392 void
1393 SubProblem::addFunctor(const std::string & name,
1394  const Moose::FunctorBase<T> & functor,
1395  const THREAD_ID tid)
1396 {
1397  constexpr bool added_functor_is_ad =
1398  !std::is_same<T, typename MetaPhysicL::RawType<T>::value_type>::value;
1399 
1400  mooseAssert(tid < _functors.size(), "Too large a thread ID");
1401 
1402  auto & functor_to_request_info = _functor_to_request_info[tid];
1403  auto & functors = _functors[tid];
1404  auto it = functors.find("wraps_" + name);
1405  if (it != functors.end())
1406  {
1407  // We have this functor already. If it's a null functor, we want to replace it with the valid
1408  // functor we have now. If it's not then we'll add a new entry into the multimap and then we'll
1409  // error later if a user requests a functor because their request is ambiguous. This is the
1410  // reason that the functors container is a multimap: for nice error messages
1411  auto * const existing_wrapper_base =
1412  added_functor_is_ad ? std::get<2>(it->second).get() : std::get<1>(it->second).get();
1413  auto * const existing_wrapper = dynamic_cast<Moose::Functor<T> *>(existing_wrapper_base);
1414  if (existing_wrapper && existing_wrapper->template wrapsType<Moose::NullFunctor<T>>())
1415  {
1416  // Sanity check
1417  auto [request_info_it, request_info_end_it] = functor_to_request_info.equal_range(name);
1418  if (request_info_it == request_info_end_it)
1419  mooseError("We are wrapping a NullFunctor but we don't have any unfilled functor request "
1420  "info. This doesn't make sense.");
1421 
1422  // Check for valid requests
1423  while (request_info_it != request_info_end_it)
1424  {
1425  auto & [requested_functor_is_ad, requestor_is_ad] = request_info_it->second;
1426  if (!requested_functor_is_ad && requestor_is_ad && added_functor_is_ad)
1427  mooseError("We are requesting a non-AD functor '" + name +
1428  "' from an AD object, but the true functor is AD. This means we could be "
1429  "dropping important derivatives. We will not allow this");
1430  // We're going to eventually check whether we've fulfilled all functor requests and our
1431  // check will be that the multimap is empty. This request is fulfilled, so erase it from the
1432  // map now
1433  request_info_it = functor_to_request_info.erase(request_info_it);
1434  }
1435 
1436  // Ok we didn't have the functor before, so we will add it now
1437  std::get<0>(it->second) =
1439  existing_wrapper->assign(functor);
1440  // Finally we create the non-AD or AD complement of the just added functor
1441  if constexpr (added_functor_is_ad)
1442  {
1443  typedef typename MetaPhysicL::RawType<T>::value_type NonADType;
1444  auto * const existing_non_ad_wrapper_base = std::get<1>(it->second).get();
1445  auto * const existing_non_ad_wrapper =
1446  dynamic_cast<Moose::Functor<NonADType> *>(existing_non_ad_wrapper_base);
1447  mooseAssert(existing_non_ad_wrapper->template wrapsType<Moose::NullFunctor<NonADType>>(),
1448  "Both members of pair should have been wrapping a NullFunctor");
1449  existing_non_ad_wrapper->assign(
1450  std::make_unique<Moose::RawValueFunctor<NonADType>>(functor));
1451  }
1452  else
1453  {
1454  typedef typename Moose::ADType<T>::type ADType;
1455  auto * const existing_ad_wrapper_base = std::get<2>(it->second).get();
1456  auto * const existing_ad_wrapper =
1457  dynamic_cast<Moose::Functor<ADType> *>(existing_ad_wrapper_base);
1458  mooseAssert(existing_ad_wrapper->template wrapsType<Moose::NullFunctor<ADType>>(),
1459  "Both members of pair should have been wrapping a NullFunctor");
1460  existing_ad_wrapper->assign(std::make_unique<Moose::ADWrapperFunctor<ADType>>(functor));
1461  }
1462  return;
1463  }
1464  else if (!existing_wrapper)
1465  {
1466  // Functor was emplaced but the cast failed. This could be a double definition with
1467  // different types, or it could be a request with one type then a definition with another
1468  // type. Either way it is going to error later, but it is cleaner to catch it now
1469  mooseError("Functor '",
1470  name,
1471  "' is being added with return type '",
1472  MooseUtils::prettyCppType<T>(),
1473  "' but it has already been defined or requested with return type '",
1474  existing_wrapper_base->returnType(),
1475  "'.");
1476  }
1477  }
1478 
1479  // We are a new functor, create the opposite ADType one and store it with other functors
1480  if constexpr (added_functor_is_ad)
1481  {
1482  typedef typename MetaPhysicL::RawType<T>::value_type NonADType;
1483  auto new_non_ad_wrapper = std::make_unique<Moose::Functor<NonADType>>(
1484  std::make_unique<Moose::RawValueFunctor<NonADType>>(functor));
1485  auto new_ad_wrapper = std::make_unique<Moose::Functor<T>>(functor);
1486  _functors[tid].emplace("wraps_" + name,
1487  std::make_tuple(SubProblem::TrueFunctorIs::AD,
1488  std::move(new_non_ad_wrapper),
1489  std::move(new_ad_wrapper)));
1490  }
1491  else
1492  {
1493  typedef typename Moose::ADType<T>::type ADType;
1494  auto new_non_ad_wrapper = std::make_unique<Moose::Functor<T>>((functor));
1495  auto new_ad_wrapper = std::make_unique<Moose::Functor<ADType>>(
1496  std::make_unique<Moose::ADWrapperFunctor<ADType>>(functor));
1497  _functors[tid].emplace("wraps_" + name,
1498  std::make_tuple(SubProblem::TrueFunctorIs::NONAD,
1499  std::move(new_non_ad_wrapper),
1500  std::move(new_ad_wrapper)));
1501  }
1502 }
1503 
1504 inline const bool &
1506 {
1508 }
1509 
1510 inline void
1512  const bool currently_computing_residual_and_jacobian)
1513 {
1514  _currently_computing_residual_and_jacobian = currently_computing_residual_and_jacobian;
1515 }
1516 
1517 namespace Moose
1518 {
1519 void initial_condition(libMesh::EquationSystems & es, const std::string & system_name);
1520 } // namespace Moose
virtual void prepareShapes(unsigned int var, const THREAD_ID tid)=0
virtual void getDiracElements(std::set< const Elem *> &elems)=0
Fills "elems" with the elements that should be looped over for Dirac Kernels.
virtual MooseMesh & mesh()=0
virtual void addCachedResidual(const THREAD_ID tid)
Definition: SubProblem.C:1310
virtual void reinitNeighborPhys(const Elem *neighbor, unsigned int neighbor_side, const std::vector< Point > &physical_points, const THREAD_ID tid)=0
virtual bool computingScalingResidual() const =0
Getter for whether we&#39;re computing the scaling residual.
void cloneCouplingGhostingFunctor(libMesh::GhostingFunctor &coupling_gf, bool to_mesh=true)
Creates (n_sys - 1) clones of the provided coupling ghosting functor (corresponding to the nonlinear ...
Definition: SubProblem.C:1036
VarFieldType
Definition: MooseTypes.h:770
unsigned int getAxisymmetricRadialCoord() const
Returns the desired radial direction for RZ coordinate transformation.
Definition: SubProblem.C:797
virtual TagID getVectorTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition: SubProblem.C:204
void reinitNeighborLowerDElem(const Elem *elem, const THREAD_ID tid=0)
reinitialize a neighboring lower dimensional element
Definition: SubProblem.C:988
virtual MooseVariableScalar & getScalarVariable(const THREAD_ID tid, const std::string &var_name)=0
Returns the scalar variable reference from whichever system contains it.
virtual const libMesh::CouplingMatrix * couplingMatrix(const unsigned int nl_sys_num) const =0
The coupling matrix defining what blocks exist in the preconditioning matrix.
std::map< TagName, TagID > _matrix_tag_name_to_tag_id
The currently declared tags.
Definition: SubProblem.h:1056
A material property that is evaluated on-the-fly via calls to various overloads of operator() ...
virtual void clearActiveFEVariableCoupleableMatrixTags(const THREAD_ID tid)
Definition: SubProblem.C:385
virtual unsigned int nNonlinearIterations(const unsigned int nl_sys_num) const
Definition: SubProblem.C:761
virtual void clearActiveFEVariableCoupleableVectorTags(const THREAD_ID tid)
Definition: SubProblem.C:379
virtual bool hasBoundaryMaterialProperty(BoundaryID boundary_id, const std::string &prop_name)
Check if a material property is defined on a block.
Definition: SubProblem.C:571
bool _have_ad_objects
AD flag indicating whether any AD objects have been added.
Definition: SubProblem.h:1129
virtual void setActiveScalarVariableCoupleableMatrixTags(std::set< TagID > &mtags, const THREAD_ID tid)
Definition: SubProblem.C:403
virtual void reinitScalars(const THREAD_ID tid, bool reinit_for_derivative_reordering=false)=0
fills the VariableValue arrays for scalar variables from the solution vector
MooseVariableFieldBase & getVariableHelper(const THREAD_ID tid, const std::string &var_name, Moose::VarKindType expected_var_type, Moose::VarFieldType expected_var_field_type, const std::vector< T > &nls, const SystemBase &aux) const
Helper function called by getVariable that handles the logic for checking whether Variables of the re...
std::map< BoundaryID, std::multimap< std::string, std::string > > _map_boundary_material_props_check
Definition: SubProblem.h:1086
A class for creating restricted objects.
Definition: Restartable.h:28
The DiracKernelInfo object is a place where all the Dirac points added by different DiracKernels are ...
Factory & _factory
The Factory for building objects.
Definition: SubProblem.h:1062
virtual VectorMooseVariable & getVectorVariable(const THREAD_ID tid, const std::string &var_name)=0
Returns the variable reference for requested VectorMooseVariable which may be in any system...
const std::set< TagID > & getActiveScalarVariableCoupleableVectorTags(const THREAD_ID tid) const
Definition: SubProblem.C:438
void removeCouplingGhostingFunctor(libMesh::GhostingFunctor &coupling_gf)
Remove a coupling ghosting functor from this problem&#39;s DofMaps.
Definition: SubProblem.C:1111
virtual std::set< BoundaryID > getMaterialPropertyBoundaryIDs(const std::string &prop_name)
Get a vector containing the block ids the material property is defined on.
Definition: SubProblem.C:526
virtual void haveADObjects(bool have_ad_objects)
Method for setting whether we have any ad objects.
Definition: SubProblem.h:775
virtual void addJacobianNeighborLowerD(const THREAD_ID tid)=0
const Moose::Functor< T > & getFunctor(const std::string &name, const THREAD_ID tid, const std::string &requestor_name, bool requestor_is_ad)
Definition: SubProblem.h:1232
virtual void addResidual(const THREAD_ID tid)=0
Base class template for functor objects.
Definition: MooseFunctor.h:137
void reinitGeomSearch()
reinitialize this object&#39;s geometric search data, e.g.
Definition: SubProblem.C:1407
virtual void reinitLowerDElem(const Elem *lower_d_elem, const THREAD_ID tid, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr)
Definition: SubProblem.C:958
void addAlgebraicGhostingFunctor(libMesh::GhostingFunctor &algebraic_gf, bool to_mesh=true)
Add an algebraic ghosting functor to this problem&#39;s DofMaps.
Definition: SubProblem.C:1024
virtual MooseVariableFieldBase & getActualFieldVariable(const THREAD_ID tid, const std::string &var_name)=0
Returns the variable reference for requested MooseVariableField which may be in any system...
Keeps track of stuff related to assembling.
Definition: Assembly.h:109
Class for stuff related to variables.
Definition: Adaptivity.h:33
virtual void reinitOffDiagScalars(const THREAD_ID tid)=0
virtual void setCurrentlyComputingResidual(const bool currently_computing_residual)
Set whether or not the problem is in the process of computing the residual.
Definition: SubProblem.h:733
virtual void reinitElem(const Elem *elem, const THREAD_ID tid)=0
unsigned int TagID
Definition: MooseTypes.h:238
virtual void onTimestepEnd()=0
virtual void storeSubdomainZeroMatProp(SubdomainID block_id, const MaterialPropertyName &name)
Adds to a map based on block ids of material properties for which a zero value can be returned...
Definition: SubProblem.C:596
virtual bool checkNonlocalCouplingRequirement() const =0
virtual const std::vector< VectorTag > & currentResidualVectorTags() const =0
Return the residual vector tags we are currently computing.
virtual bool hasBlockMaterialProperty(SubdomainID block_id, const std::string &prop_name)
Check if a material property is defined on a block.
Definition: SubProblem.C:512
const std::set< TagID > & getActiveFEVariableCoupleableMatrixTags(const THREAD_ID tid) const
Definition: SubProblem.C:391
std::string restrictionBoundaryCheckName(BoundaryID check_id)
Definition: SubProblem.C:784
Generic factory class for build all sorts of objects.
Definition: Factory.h:28
virtual bool computingScalingJacobian() const =0
Getter for whether we&#39;re computing the scaling jacobian.
MooseVariableFE< RealVectorValue > VectorMooseVariable
Definition: SubProblem.h:46
void cloneAlgebraicGhostingFunctor(libMesh::GhostingFunctor &algebraic_gf, bool to_mesh=true)
Creates (n_sys - 1) clones of the provided algebraic ghosting functor (corresponding to the nonlinear...
Definition: SubProblem.C:1002
VectorValue< Real > RealVectorValue
Definition: SubProblem.h:33
virtual const SystemBase & systemBaseNonlinear(const unsigned int sys_num) const =0
Return the nonlinear system object as a base class reference given the system number.
const std::set< TagID > & getActiveFEVariableCoupleableVectorTags(const THREAD_ID tid) const
Definition: SubProblem.C:397
std::unordered_set< TagID > _not_zeroed_tagged_vectors
the list of vector tags that will not be zeroed when all other tags are
Definition: SubProblem.h:1132
virtual unsigned int currentNlSysNum() const =0
virtual bool safeAccessTaggedVectors() const
Is it safe to access the tagged vectors.
Definition: SubProblem.h:742
virtual void reinitNodesNeighbor(const std::vector< dof_id_type > &nodes, const THREAD_ID tid)=0
void addConsumedPropertyName(const MooseObjectName &obj_name, const std::string &prop_name)
Helper for tracking the object that is consuming a property for MaterialPropertyDebugOutput.
Definition: SubProblem.C:737
bool _currently_computing_jacobian
Flag to determine whether the problem is currently computing Jacobian.
Definition: SubProblem.h:1111
std::map< std::string, std::set< std::string > > _functor_to_requestors
The requestors of functors where the key is the prop name and the value is a set of names of requesto...
Definition: SubProblem.h:1172
virtual void setActiveElementalMooseVariables(const std::set< MooseVariableFieldBase *> &moose_vars, const THREAD_ID tid)
Set the MOOSE variables to be reinited on each element.
Definition: SubProblem.C:444
virtual void setCurrentBoundaryID(BoundaryID bid, const THREAD_ID tid)
sets the current boundary ID in assembly
Definition: SubProblem.C:790
virtual void storeSubdomainDelayedCheckMatProp(const std::string &requestor, SubdomainID block_id, const std::string &name)
Adds to a map based on block ids of material properties to validate.
Definition: SubProblem.C:608
void setChainControlDataOutput(bool set_output)
Setter for debug chain control data output.
Definition: SubProblem.h:934
virtual void setCurrentLowerDElem(const Elem *const lower_d_elem, const THREAD_ID tid)
Set the current lower dimensional element.
Definition: SubProblem.C:1385
virtual ~SubProblem()
Definition: SubProblem.C:90
const InputParameters & parameters() const
Get the parameters of the object.
Definition: MooseBase.h:131
virtual void prepareNeighborShapes(unsigned int var, const THREAD_ID tid)=0
virtual TagID addVectorTag(const TagName &tag_name, const Moose::VectorTagType type=Moose::VECTOR_TAG_RESIDUAL)
Create a Tag.
Definition: SubProblem.C:93
virtual const std::set< MooseVariableFieldBase * > & getActiveElementalMooseVariables(const THREAD_ID tid) const
Get the MOOSE variables to be reinited on each element.
Definition: SubProblem.C:455
virtual void addCachedJacobian(const THREAD_ID tid)
Definition: SubProblem.C:1331
void initial_condition(libMesh::EquationSystems &es, const std::string &system_name)
virtual void residualSetup()
Definition: SubProblem.C:1204
virtual void storeBoundaryZeroMatProp(BoundaryID boundary_id, const MaterialPropertyName &name)
Adds to a map based on boundary ids of material properties for which a zero value can be returned...
Definition: SubProblem.C:602
This is a wrapper that forwards calls to the implementation, which can be switched out at any time wi...
Class that hold the whole problem being solved.
Definition: Problem.h:19
void addFunctor(const std::string &name, const Moose::FunctorBase< T > &functor, const THREAD_ID tid)
add a functor to the problem functor container
Definition: SubProblem.h:1393
Wraps non-AD functors such that they can be used in objects that have requested the functor as AD...
bool vectorTagNotZeroed(const TagID tag) const
Checks if a vector tag is in the list of vectors that will not be zeroed when other tagged vectors ar...
Definition: SubProblem.C:156
virtual void setNeighborSubdomainID(const Elem *elem, unsigned int side, const THREAD_ID tid)=0
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system...
std::unordered_map< libMesh::GhostingFunctor *, std::vector< std::shared_ptr< libMesh::GhostingFunctor > > > _root_coupling_gf_to_sys_clones
A map from a root coupling ghosting functor, e.g.
Definition: SubProblem.h:1217
virtual void storeBoundaryDelayedCheckMatProp(const std::string &requestor, BoundaryID boundary_id, const std::string &name)
Adds to a map based on boundary ids of material properties to validate.
Definition: SubProblem.C:616
virtual void addJacobianNeighbor(const THREAD_ID tid)=0
void reinitFVFace(const THREAD_ID tid, const FaceInfo &fi)
reinitialize the finite volume assembly data for the provided face and thread
Definition: SubProblem.C:1289
virtual void setCurrentSubdomainID(const Elem *elem, const THREAD_ID tid)=0
static void selectVectorTagsFromSystem(const SystemBase &system, const std::vector< VectorTag > &input_vector_tags, std::set< TagID > &selected_tags)
Select the vector tags which belong to a specific system.
Definition: SubProblem.C:290
This class provides an interface for common operations on field variables of both FE and FV types wit...
virtual void jacobianSetup()
Definition: SubProblem.C:1212
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
void setCurrentlyComputingResidualAndJacobian(bool currently_computing_residual_and_jacobian)
Set whether or not the problem is in the process of computing the Jacobian.
Definition: SubProblem.h:1511
void showFunctors() const
Lists all functors in the problem.
Definition: SubProblem.C:1252
Base class for a system (of equations)
Definition: SystemBase.h:85
const bool & currentlyComputingResidualAndJacobian() const
Returns true if the problem is in the process of computing the residual and the Jacobian.
Definition: SubProblem.h:1505
bool computingNonlinearResid() const
Returns true if the problem is in the process of computing the nonlinear residual.
Definition: SubProblem.h:715
std::vector< VectorTag > _vector_tags
The declared vector tags.
Definition: SubProblem.h:1185
virtual void clearActiveElementalMooseVariables(const THREAD_ID tid)
Clear the active elemental MooseVariableFieldBase.
Definition: SubProblem.C:467
std::set< dof_id_type > _ghosted_elems
Elements that should have Dofs ghosted to the local processor.
Definition: SubProblem.h:1108
virtual void markMatPropRequested(const std::string &)
Helper method for adding a material property name to the _material_property_requested set...
Definition: SubProblem.C:725
void clearAllDofIndices()
Clear dof indices from variables in nl and aux systems.
Definition: SubProblem.C:1178
virtual void addResidualLower(const THREAD_ID tid)=0
std::vector< std::set< TagID > > _active_sc_var_coupleable_vector_tags
Definition: SubProblem.h:1102
virtual const libMesh::CouplingMatrix & nonlocalCouplingMatrix(const unsigned i) const =0
std::map< BoundaryID, std::set< MaterialPropertyName > > _zero_boundary_material_props
Definition: SubProblem.h:1074
virtual void reinitNeighborFaceRef(const Elem *neighbor_elem, unsigned int neighbor_side, Real tolerance, const std::vector< Point > *const pts, const std::vector< Real > *const weights=nullptr, const THREAD_ID tid=0)
reinitialize FE objects on a given neighbor element on a given side at a given set of reference point...
Definition: SubProblem.C:922
virtual void reinitElemFace(const Elem *elem, unsigned int side, const THREAD_ID tid)=0
virtual void addJacobian(const THREAD_ID tid)=0
const bool & currentlyComputingResidual() const
Returns true if the problem is in the process of computing the residual.
Definition: SubProblem.h:728
bool verifyVectorTags() const
Verify the integrity of _vector_tags and _typed_vector_tags.
Definition: SubProblem.C:242
void preparePRefinement()
Prepare DofMap and Assembly classes with our p-refinement information.
Definition: SubProblem.C:1337
void setCurrentlyComputingJacobian(const bool currently_computing_jacobian)
Set whether or not the problem is in the process of computing the Jacobian.
Definition: SubProblem.h:697
const std::set< TagID > & getActiveScalarVariableCoupleableMatrixTags(const THREAD_ID tid) const
Definition: SubProblem.C:432
bool _computing_nonlinear_residual
Whether the non-linear residual is being evaluated.
Definition: SubProblem.h:1117
std::map< BoundaryID, std::set< std::string > > _map_boundary_material_props
Map for boundary material properties (boundary_id -> list of properties)
Definition: SubProblem.h:1070
virtual Real finalNonlinearResidual(const unsigned int nl_sys_num) const
Definition: SubProblem.C:755
virtual void customSetup(const ExecFlagType &exec_type)
Definition: SubProblem.C:1196
std::map< std::string, std::vector< dof_id_type > > _var_dof_map
Definition: SubProblem.h:682
virtual void checkBoundaryMatProps()
Checks boundary material properties integrity.
Definition: SubProblem.C:666
virtual void ghostGhostedBoundaries()=0
Causes the boundaries added using addGhostedBoundary to actually be ghosted.
virtual void setActiveScalarVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid)
Definition: SubProblem.C:410
bool automaticScaling() const
Automatic scaling getter.
Definition: SubProblem.C:1163
This data structure is used to store geometric and variable related metadata about each cell face in ...
Definition: FaceInfo.h:37
virtual libMesh::EquationSystems & es()=0
const std::string & name() const
Get the name of the class.
Definition: MooseBase.h:103
std::unordered_map< FEFamily, bool > _family_for_p_refinement
Indicate whether a family is disabled for p-refinement.
Definition: SubProblem.h:1223
virtual void reinitNode(const Node *node, const THREAD_ID tid)=0
virtual LineSearch * getLineSearch()=0
bool havePRefinement() const
Query whether p-refinement has been requested at any point during the simulation. ...
Definition: SubProblem.h:1024
virtual bool isMatPropRequested(const std::string &prop_name) const
Find out if a material property has been requested by any object.
Definition: SubProblem.C:731
virtual bool computingPreSMOResidual(const unsigned int nl_sys_num) const =0
Returns true if the problem is in the process of computing it&#39;s initial residual. ...
std::map< MooseObjectName, std::set< std::string > > _consumed_material_properties
Definition: SubProblem.h:1203
static const std::unordered_set< FEFamily > _default_families_without_p_refinement
The set of variable families by default disable p-refinement.
Definition: SubProblem.h:1225
virtual void clearDiracInfo()=0
Gets called before Dirac Kernels are asked to add the points they are supposed to be evaluated in...
void removeAlgebraicGhostingFunctor(libMesh::GhostingFunctor &algebraic_gf)
Remove an algebraic ghosting functor from this problem&#39;s DofMaps.
Definition: SubProblem.C:1068
std::map< TagID, TagName > _matrix_tag_id_to_tag_name
Reverse map.
Definition: SubProblem.h:1059
virtual bool hasNonlocalCoupling() const =0
Whether the simulation has active nonlocal coupling which should be accounted for in the Jacobian...
virtual DiracKernelInfo & diracKernelInfo()
Definition: SubProblem.C:749
virtual void setActiveFEVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid)
Definition: SubProblem.C:370
virtual TagID getMatrixTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition: SubProblem.C:343
virtual const SystemBase & systemBaseAuxiliary() const =0
Return the auxiliary system object as a base class reference.
virtual void clearActiveScalarVariableCoupleableVectorTags(const THREAD_ID tid)
Definition: SubProblem.C:420
bool _safe_access_tagged_vectors
Is it safe to retrieve data from tagged vectors.
Definition: SubProblem.h:1126
bool hasFunctorWithType(const std::string &name, const THREAD_ID tid) const
checks whether we have a functor of type T corresponding to name on the thread id tid ...
Definition: SubProblem.h:1338
std::vector< std::multimap< std::string, std::pair< bool, bool > > > _functor_to_request_info
A multimap (for each thread) from unfilled functor requests to whether the requests were for AD funct...
Definition: SubProblem.h:1176
boundary_id_type BoundaryID
virtual unsigned int nLinearIterations(const unsigned int nl_sys_num) const
Definition: SubProblem.C:767
void hasScalingVector(const unsigned int nl_sys_num)
Tells this problem that the assembly associated with the given nonlinear system number involves a sca...
Definition: SubProblem.C:1171
VarKindType
Framework-wide stuff.
Definition: MooseTypes.h:763
virtual std::size_t numSolverSystems() const =0
virtual void storeBoundaryMatPropName(BoundaryID boundary_id, const std::string &name)
Adds the given material property to a storage map based on boundary ids.
Definition: SubProblem.C:590
SubProblem(const InputParameters &parameters)
Definition: SubProblem.C:60
std::unordered_map< libMesh::GhostingFunctor *, std::vector< std::shared_ptr< libMesh::GhostingFunctor > > > _root_alg_gf_to_sys_clones
A map from a root algebraic ghosting functor, e.g.
Definition: SubProblem.h:1210
virtual bool isTransient() const =0
virtual TagID addMatrixTag(TagName tag_name)
Create a Tag.
Definition: SubProblem.C:312
std::string restrictionSubdomainCheckName(SubdomainID check_id)
Helper functions for checking MaterialProperties.
Definition: SubProblem.C:773
virtual Moose::VectorTagType vectorTagType(const TagID tag_id) const
Definition: SubProblem.C:232
virtual void reinitElemFaceRef(const Elem *elem, unsigned int side, Real tolerance, const std::vector< Point > *const pts, const std::vector< Real > *const weights=nullptr, const THREAD_ID tid=0)
reinitialize FE objects on a given element on a given side at a given set of reference points and the...
Definition: SubProblem.C:883
virtual void onTimestepBegin()=0
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition: MooseMesh.h:93
virtual bool converged(const unsigned int sys_num)
Eventually we want to convert this virtual over to taking a solver system number argument.
Definition: SubProblem.h:113
void markFamilyPRefinement(const InputParameters &params)
Mark a variable family for either disabling or enabling p-refinement with valid parameters of a varia...
Definition: SubProblem.C:1372
virtual bool hasScalarVariable(const std::string &var_name) const =0
Returns a Boolean indicating whether any system contains a variable with the name provided...
const std::string & type() const
Get the type of this class.
Definition: MooseBase.h:93
virtual void checkBlockMatProps()
Checks block material properties integrity.
Definition: SubProblem.C:624
bool _show_functors
Whether to output a list of the functors used and requested (currently only at initialSetup) ...
Definition: SubProblem.h:1179
std::vector< VectorTag > getVectorTags(const std::set< TagID > &tag_ids) const
Definition: SubProblem.C:173
virtual MooseVariable & getStandardVariable(const THREAD_ID tid, const std::string &var_name)=0
Returns the variable reference for requested MooseVariable which may be in any system.
virtual std::set< dof_id_type > & ghostedElems()
Return the list of elements that should have their DoFs ghosted to this processor.
Definition: SubProblem.h:680
virtual ArrayMooseVariable & getArrayVariable(const THREAD_ID tid, const std::string &var_name)=0
Returns the variable reference for requested ArrayMooseVariable which may be in any system...
virtual void addJacobianLowerD(const THREAD_ID tid)=0
virtual std::vector< SubdomainName > getMaterialPropertyBlockNames(const std::string &prop_name)
Get a vector of block id equivalences that the material property is defined on.
Definition: SubProblem.C:490
virtual bool vectorTagExists(const TagID tag_id) const
Check to see if a particular Tag exists.
Definition: SubProblem.h:201
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 GeometricSearchData & geomSearchData()=0
std::string demangle(const char *name)
virtual void prepare(const Elem *elem, const THREAD_ID tid)=0
virtual bool hasVariable(const std::string &var_name) const =0
Whether or not this problem has the variable.
bool haveADObjects() const
Method for reading wehther we have any ad objects.
Definition: SubProblem.h:779
virtual void clearActiveScalarVariableCoupleableMatrixTags(const THREAD_ID tid)
Definition: SubProblem.C:426
virtual std::map< TagName, TagID > & getMatrixTags()
Return all matrix tags in the system, where a tag is represented by a map from name to ID...
Definition: SubProblem.h:253
virtual libMesh::System & getSystem(const std::string &var_name)=0
Returns the equation system containing the variable provided.
void showFunctorRequestors() const
Lists all functors and all the objects that requested them.
Definition: SubProblem.C:1264
GeometricSearchType
Used to select groups of geometric search objects to update.
bool doingPRefinement() const
Definition: SubProblem.C:1366
VectorTagType
Definition: MooseTypes.h:1027
virtual void cacheJacobianNeighbor(const THREAD_ID tid)
Definition: SubProblem.C:1325
std::vector< std::map< std::string, std::unique_ptr< Moose::FunctorAbstract > > > _pbblf_functors
Container to hold PiecewiseByBlockLambdaFunctors.
Definition: SubProblem.h:1162
std::vector< std::set< TagID > > _active_fe_var_coupleable_vector_tags
Definition: SubProblem.h:1098
virtual void prepareFace(const Elem *elem, const THREAD_ID tid)=0
virtual void cacheResidual(const THREAD_ID tid)
Definition: SubProblem.C:1296
virtual void timestepSetup()
Definition: SubProblem.C:1186
virtual unsigned int numMatrixTags() const
The total number of tags.
Definition: SubProblem.h:248
virtual unsigned int currentLinearSysNum() const =0
virtual void addResidualNeighbor(const THREAD_ID tid)=0
virtual bool reinitDirac(const Elem *elem, const THREAD_ID tid)=0
Returns true if the Problem has Dirac kernels it needs to compute on elem.
virtual void reinitElemPhys(const Elem *elem, const std::vector< Point > &phys_points_in_elem, const THREAD_ID tid)=0
void registerUnfilledFunctorRequest(T *functor_interface, const std::string &functor_name, const THREAD_ID tid)
Register an unfulfilled functor request.
std::vector< std::set< MooseVariableFieldBase * > > _active_elemental_moose_variables
This is the set of MooseVariableFieldBase that will actually get reinited by a call to reinit(elem) ...
Definition: SubProblem.h:1090
virtual bool nlConverged(const unsigned int nl_sys_num)
Definition: SubProblem.C:717
virtual void reinitElemNeighborAndLowerD(const Elem *elem, unsigned int side, const THREAD_ID tid)=0
bool _default_ghosting
Whether or not to use default libMesh coupling.
Definition: SubProblem.h:1105
virtual std::set< SubdomainID > getMaterialPropertyBlocks(const std::string &prop_name)
Get a vector containing the block ids the material property is defined on.
Definition: SubProblem.C:474
void addCouplingGhostingFunctor(libMesh::GhostingFunctor &coupling_gf, bool to_mesh=true)
Add a coupling functor to this problem&#39;s DofMaps.
Definition: SubProblem.C:1057
bool _show_chain_control_data
Whether to output a list of all the chain control data.
Definition: SubProblem.h:1182
virtual void setResidualNeighbor(libMesh::NumericVector< libMesh::Number > &residual, const THREAD_ID tid)=0
virtual void initialSetup()
Definition: SubProblem.C:1220
bool _have_p_refinement
Whether p-refinement has been requested at any point during the simulation.
Definition: SubProblem.h:1220
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Generic class for solving transient nonlinear problems.
Definition: SubProblem.h:78
virtual void needFV()=0
marks this problem as including/needing finite volume functionality.
std::map< SubdomainID, std::set< MaterialPropertyName > > _zero_block_material_props
Set of properties returned as zero properties.
Definition: SubProblem.h:1073
CoordinateSystemType
Definition: MooseTypes.h:858
Class for containing MooseEnum item information.
Definition: MooseEnumItem.h:18
virtual std::vector< BoundaryName > getMaterialPropertyBoundaryNames(const std::string &prop_name)
Get a vector of block id equivalences that the material property is defined on.
Definition: SubProblem.C:542
virtual 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)
Definition: SubProblem.h:279
std::map< TagName, TagID > _vector_tags_name_map
Map of vector tag TagName to TagID.
Definition: SubProblem.h:1195
virtual void updateGeomSearch(GeometricSearchData::GeometricSearchType type=GeometricSearchData::ALL)=0
update geometric search data
std::vector< unsigned int > _has_active_elemental_moose_variables
Whether or not there is currently a list of active elemental moose variables.
Definition: SubProblem.h:1094
virtual void addGhostedBoundary(BoundaryID boundary_id)=0
Will make sure that all necessary elements from boundary_id are ghosted to this processor.
std::vector< std::vector< VectorTag > > _typed_vector_tags
The vector tags associated with each VectorTagType This is kept separate from _vector_tags for quick ...
Definition: SubProblem.h:1192
virtual void reinitNeighbor(const Elem *elem, unsigned int side, const THREAD_ID tid)=0
virtual void addGhostedElem(dof_id_type elem_id)=0
Will make sure that all dofs connected to elem_id are ghosted to this processor.
virtual Assembly & assembly(const THREAD_ID tid, const unsigned int sys_num)=0
virtual const SystemBase & systemBaseSolver(const unsigned int sys_num) const =0
Return the solver system object as a base class reference given the system number.
static void selectMatrixTagsFromSystem(const SystemBase &system, const std::map< TagName, TagID > &input_matrix_tags, std::set< TagID > &selected_tags)
Select the matrix tags which belong to a specific system.
Definition: SubProblem.C:301
virtual std::pair< bool, unsigned int > determineSolverSystem(const std::string &var_name, bool error_if_not_found=false) const =0
Class for scalar variables (they are different).
virtual void prepareAssembly(const THREAD_ID tid)=0
const Moose::FunctorBase< T > & addPiecewiseByBlockLambdaFunctor(const std::string &name, PolymorphicLambda my_lammy, const std::set< ExecFlagType > &clearance_schedule, const MooseMesh &mesh, const std::set< SubdomainID > &block_ids, const THREAD_ID tid)
Add a functor that has block-wise lambda definitions, e.g.
Definition: SubProblem.h:1356
MooseVariableFE< RealEigenVector > ArrayMooseVariable
Definition: SubProblem.h:47
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
Definition: MooseBase.h:281
std::set< std::string > _material_property_requested
set containing all material property names that have been requested by getMaterialProperty* ...
Definition: SubProblem.h:1077
virtual bool checkResidualForNans() const =0
Whether to check residual for NaN/Inf values.
virtual unsigned int numVectorTags(const Moose::VectorTagType type=Moose::VECTOR_TAG_ANY) const
The total number of tags, which can be limited to the tag type.
Definition: SubProblem.C:196
virtual void setActiveFEVariableCoupleableMatrixTags(std::set< TagID > &mtags, const THREAD_ID tid)
Definition: SubProblem.C:364
virtual unsigned int linearSysNum(const LinearSystemName &linear_sys_name) const =0
std::vector< std::multimap< std::string, std::tuple< TrueFunctorIs, std::unique_ptr< Moose::FunctorEnvelopeBase >, std::unique_ptr< Moose::FunctorEnvelopeBase > > > > _functors
A container holding pointers to all the functors in our problem.
Definition: SubProblem.h:1159
Moose::CoordinateSystemType getCoordSystem(SubdomainID sid) const
Definition: SubProblem.C:1283
virtual void cacheResidualNeighbor(const THREAD_ID tid)
Definition: SubProblem.C:1303
virtual bool hasLinearVariable(const std::string &var_name) const
Whether or not this problem has this linear variable.
Definition: SubProblem.C:803
virtual TagName vectorTagName(const TagID tag) const
Retrieve the name associated with a TagID.
Definition: SubProblem.C:222
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
virtual bool hasActiveElementalMooseVariables(const THREAD_ID tid) const
Whether or not a list of active elemental moose variables has been set.
Definition: SubProblem.C:461
static InputParameters validParams()
Definition: SubProblem.C:36
bool _currently_computing_residual
Whether the residual is being evaluated.
Definition: SubProblem.h:1120
std::map< SubdomainID, std::multimap< std::string, std::string > > _map_block_material_props_check
Data structures of the requested material properties.
Definition: SubProblem.h:1085
void setFunctorOutput(bool set_output)
Setter for debug functor output.
Definition: SubProblem.h:932
virtual bool haveDisplaced() const =0
Whether we have a displaced problem in our simulation.
const bool & currentlyComputingJacobian() const
Returns true if the problem is in the process of computing the Jacobian.
Definition: SubProblem.h:692
virtual void computingNonlinearResid(const bool computing_nonlinear_residual)
Set whether or not the problem is in the process of computing the nonlinear residual.
Definition: SubProblem.h:720
virtual bool safeAccessTaggedMatrices() const
Is it safe to access the tagged matrices.
Definition: SubProblem.h:739
virtual std::size_t numNonlinearSystems() const =0
virtual bool haveFV() const =0
returns true if this problem includes/needs finite volume functionality.
bool hasFunctor(const std::string &name, const THREAD_ID tid) const
checks whether we have a functor corresponding to name on the thread id tid
Definition: SubProblem.C:1275
const std::map< MooseObjectName, std::set< std::string > > & getConsumedPropertyMap() const
Return the map that tracks the object with consumed material properties.
Definition: SubProblem.C:743
Storage for all of the information pretaining to a vector tag.
Definition: VectorTag.h:17
bool _safe_access_tagged_matrices
Is it safe to retrieve data from tagged matrices.
Definition: SubProblem.h:1123
MooseVariableFE< Real > MooseVariable
Definition: SubProblem.h:44
DiracKernelInfo _dirac_kernel_info
Definition: SubProblem.h:1064
virtual bool solverSystemConverged(const unsigned int sys_num)
Definition: SubProblem.h:100
virtual void prepareFaceShapes(unsigned int var, const THREAD_ID tid)=0
std::map< SubdomainID, std::set< std::string > > _map_block_material_props
Map of material properties (block_id -> list of properties)
Definition: SubProblem.h:1067
A class for storing the names of MooseObject by tag and object name.
bool defaultGhosting()
Whether or not the user has requested default ghosting ot be on.
Definition: SubProblem.h:144
virtual const SystemBase & systemBaseLinear(const unsigned int sys_num) const =0
Return the linear system object as a base class reference given the system number.
std::vector< std::set< TagID > > _active_fe_var_coupleable_matrix_tags
Definition: SubProblem.h:1096
virtual const VectorTag & getVectorTag(const TagID tag_id) const
Get a VectorTag from a TagID.
Definition: SubProblem.C:162
std::vector< std::set< TagID > > _active_sc_var_coupleable_matrix_tags
Definition: SubProblem.h:1100
A functor that serves as a placeholder during the simulation setup phase if a functor consumer reques...
virtual void storeSubdomainMatPropName(SubdomainID block_id, const std::string &name)
Adds the given material property to a storage map based on block ids.
Definition: SubProblem.C:584
virtual void cacheJacobian(const THREAD_ID tid)
Definition: SubProblem.C:1317
Abstract definition of a RestartableData value.
void reinitMortarElem(const Elem *elem, const THREAD_ID tid=0)
Reinit a mortar element to obtain a valid JxW.
Definition: SubProblem.C:995
virtual std::size_t numLinearSystems() const =0
virtual bool hasAuxiliaryVariable(const std::string &var_name) const
Whether or not this problem has this auxiliary variable.
Definition: SubProblem.C:812
virtual bool matrixTagExists(const TagName &tag_name) const
Check to see if a particular Tag exists.
Definition: SubProblem.C:329
virtual void setResidual(libMesh::NumericVector< libMesh::Number > &residual, const THREAD_ID tid)=0
virtual TagName matrixTagName(TagID tag)
Retrieve the name associated with a TagID.
Definition: SubProblem.C:358
void addNotZeroedVectorTag(const TagID tag)
Adds a vector tag to the list of vectors that will not be zeroed when other tagged vectors are...
Definition: SubProblem.C:150
virtual void reinitNodeFace(const Node *node, BoundaryID bnd_id, const THREAD_ID tid)=0
virtual unsigned int solverSysNum(const SolverSystemName &solver_sys_name) const =0
unsigned int THREAD_ID
Definition: MooseTypes.h:237
uint8_t dof_id_type
bool _currently_computing_residual_and_jacobian
Flag to determine whether the problem is currently computing the residual and Jacobian.
Definition: SubProblem.h:1114
virtual void reinitNodes(const std::vector< dof_id_type > &nodes, const THREAD_ID tid)=0
virtual unsigned int nlSysNum(const NonlinearSystemName &nl_sys_name) const =0