https://mooseframework.inl.gov
Loading...
Searching...
No Matches
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
30namespace libMesh
31{
32template <typename>
33class VectorValue;
34typedef VectorValue<Real> RealVectorValue;
35class GhostingFunctor;
36}
37
38class MooseMesh;
39class Factory;
40class Assembly;
43template <typename>
44class MooseVariableFE;
49class SystemBase;
50class LineSearch;
51class FaceInfo;
52class MooseObjectName;
53namespace Moose
54{
55class FunctorEnvelopeBase;
56}
57
58// libMesh forward declarations
59namespace libMesh
60{
61class EquationSystems;
62class DofMap;
63class CouplingMatrix;
64template <typename T>
65class SparseMatrix;
66template <typename T>
67class NumericVector;
68class System;
69} // namespace libMesh
70
73
78class SubProblem : public Problem
79{
80public:
82
84 virtual ~SubProblem();
85
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
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
290 const std::string & var_name) = 0;
291
294 const std::string & var_name) = 0;
295
298 const std::string & var_name) = 0;
299
302 const std::string & var_name) = 0;
303
305 virtual bool hasScalarVariable(const std::string & var_name) const = 0;
306
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;
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
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 void reinitNodes(const std::vector<dof_id_type> & nodes, const THREAD_ID tid);
442 void reinitNodesNeighbor(const std::vector<dof_id_type> & nodes, const THREAD_ID tid);
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
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
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
788private:
798 void cloneAlgebraicGhostingFunctor(libMesh::GhostingFunctor & algebraic_gf, bool to_mesh = true);
799
809 void cloneCouplingGhostingFunctor(libMesh::GhostingFunctor & coupling_gf, bool to_mesh = true);
810
811public:
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>
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
938 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 virtual void setCurrentLowerDElem(const Elem * const lower_d_elem, const THREAD_ID tid);
1025
1026protected:
1031 template <typename T>
1033 const std::string & var_name,
1034 Moose::VarKindType expected_var_type,
1035 Moose::VarFieldType expected_var_field_type,
1036 const std::vector<T> & nls,
1037 const SystemBase & aux) const;
1038
1042 bool verifyVectorTags() const;
1043
1045 std::map<TagName, TagID> _matrix_tag_name_to_tag_id;
1046
1048 std::map<TagID, TagName> _matrix_tag_id_to_tag_name;
1049
1052
1054
1056 std::map<SubdomainID, std::set<std::string>> _map_block_material_props;
1057
1059 std::map<BoundaryID, std::set<std::string>> _map_boundary_material_props;
1060
1062 std::map<SubdomainID, std::set<MaterialPropertyName>> _zero_block_material_props;
1063 std::map<BoundaryID, std::set<MaterialPropertyName>> _zero_boundary_material_props;
1064
1066 std::set<std::string> _material_property_requested;
1067
1069
1074 std::map<SubdomainID, std::multimap<std::string, std::string>> _map_block_material_props_check;
1075 std::map<BoundaryID, std::multimap<std::string, std::string>> _map_boundary_material_props_check;
1077
1079 std::vector<std::set<MooseVariableFieldBase *>> _active_elemental_moose_variables;
1080
1082 /* This needs to remain <unsigned int> for threading purposes */
1083 std::vector<unsigned int> _has_active_elemental_moose_variables;
1084
1085 std::vector<std::set<TagID>> _active_fe_var_coupleable_matrix_tags;
1086
1087 std::vector<std::set<TagID>> _active_fe_var_coupleable_vector_tags;
1088
1089 std::vector<std::set<TagID>> _active_sc_var_coupleable_matrix_tags;
1090
1091 std::vector<std::set<TagID>> _active_sc_var_coupleable_vector_tags;
1092
1095
1097 std::set<dof_id_type> _ghosted_elems;
1098
1101
1104
1107
1110
1113
1116
1119
1121 std::unordered_set<TagID> _not_zeroed_tagged_vectors;
1122
1123private:
1130 virtual std::pair<bool, unsigned int>
1131 determineSolverSystem(const std::string & var_name, bool error_if_not_found = false) const = 0;
1132
1133 enum class TrueFunctorIs
1134 {
1135 UNSET,
1136 NONAD,
1137 AD
1138 };
1139
1144 std::vector<std::multimap<std::string,
1145 std::tuple<TrueFunctorIs,
1146 std::unique_ptr<Moose::FunctorEnvelopeBase>,
1147 std::unique_ptr<Moose::FunctorEnvelopeBase>>>>
1149
1151 std::vector<std::map<std::string, std::unique_ptr<Moose::FunctorAbstract>>> _pbblf_functors;
1152
1154 void showFunctors() const;
1155
1157 void showFunctorRequestors() const;
1158
1161 std::map<std::string, std::set<std::string>> _functor_to_requestors;
1162
1165 std::vector<std::multimap<std::string, std::pair<bool, bool>>> _functor_to_request_info;
1166
1169
1172
1174 std::vector<VectorTag> _vector_tags;
1175
1181 std::vector<std::vector<VectorTag>> _typed_vector_tags;
1182
1184 std::map<TagName, TagID> _vector_tags_name_map;
1185
1187 std::string restrictionSubdomainCheckName(SubdomainID check_id);
1188 std::string restrictionBoundaryCheckName(BoundaryID check_id);
1190
1191 // Contains properties consumed by objects, see addConsumedPropertyName
1192 std::map<MooseObjectName, std::set<std::string>> _consumed_material_properties;
1193
1197 std::unordered_map<libMesh::GhostingFunctor *,
1198 std::vector<std::shared_ptr<libMesh::GhostingFunctor>>>
1200
1204 std::unordered_map<libMesh::GhostingFunctor *,
1205 std::vector<std::shared_ptr<libMesh::GhostingFunctor>>>
1207
1208 friend class Restartable;
1209};
1210
1211template <typename T>
1212const Moose::Functor<T> &
1213SubProblem::getFunctor(const std::string & name,
1214 const THREAD_ID tid,
1215 const std::string & requestor_name,
1216 const bool requestor_is_ad)
1217{
1218 mooseAssert(tid < _functors.size(), "Too large a thread ID");
1219
1220 // Log the requestor
1221 _functor_to_requestors["wraps_" + name].insert(requestor_name);
1222
1223 constexpr bool requested_functor_is_ad =
1224 !std::is_same<T, typename MetaPhysicL::RawType<T>::value_type>::value;
1225
1226 auto & functor_to_request_info = _functor_to_request_info[tid];
1227
1228 // Get the requested functor if we already have it
1229 auto & functors = _functors[tid];
1230 if (auto find_ret = functors.find("wraps_" + name); find_ret != functors.end())
1231 {
1232 if (functors.count("wraps_" + name) > 1)
1233 mooseError("Attempted to get a functor with the name '",
1234 name,
1235 "' but multiple (" + std::to_string(functors.count("wraps_" + name)) +
1236 ") functors match. Make sure that you do not have functor material "
1237 "properties, functions, postprocessors or variables with the same names.");
1238
1239 auto & [true_functor_is, non_ad_functor, ad_functor] = find_ret->second;
1240 auto & functor_wrapper = requested_functor_is_ad ? *ad_functor : *non_ad_functor;
1241
1242 auto * const functor = dynamic_cast<Moose::Functor<T> *>(&functor_wrapper);
1243 if (!functor)
1244 mooseError("A call to SubProblem::getFunctor requested a functor named '",
1245 name,
1246 "' that returns the type: '",
1247 libMesh::demangle(typeid(T).name()),
1248 "'. However, that functor already exists and returns a different type: '",
1249 functor_wrapper.returnType(),
1250 "'");
1251
1252 if (functor->template wrapsType<Moose::NullFunctor<T>>())
1253 // Store for future checking when the actual functor gets added
1254 functor_to_request_info.emplace(name,
1255 std::make_pair(requested_functor_is_ad, requestor_is_ad));
1256 else
1257 {
1258 // We already have the actual functor
1259 if (true_functor_is == SubProblem::TrueFunctorIs::UNSET)
1260 mooseError("We already have the functor; it should not be unset");
1261
1262 // Check for whether this is a valid request
1263 // We allow auxiliary variables and linear variables to be retrieved as non AD
1264 if (!requested_functor_is_ad && requestor_is_ad &&
1265 true_functor_is == SubProblem::TrueFunctorIs::AD &&
1267 mooseError("The AD object '",
1268 requestor_name,
1269 "' is requesting the functor '",
1270 name,
1271 "' as a non-AD functor even though it is truly an AD functor, which is not "
1272 "allowed, since this may unintentionally drop derivatives.");
1273 }
1274
1275 return *functor;
1276 }
1277
1278 // We don't have the functor yet but we could have it in the future. We'll create null functors
1279 // for now
1280 functor_to_request_info.emplace(name, std::make_pair(requested_functor_is_ad, requestor_is_ad));
1281 if constexpr (requested_functor_is_ad)
1282 {
1283 typedef typename MetaPhysicL::RawType<T>::value_type NonADType;
1284 typedef T ADType;
1285
1286 auto emplace_ret =
1287 functors.emplace("wraps_" + name,
1288 std::make_tuple(SubProblem::TrueFunctorIs::UNSET,
1289 std::make_unique<Moose::Functor<NonADType>>(
1290 std::make_unique<Moose::NullFunctor<NonADType>>()),
1291 std::make_unique<Moose::Functor<ADType>>(
1292 std::make_unique<Moose::NullFunctor<ADType>>())));
1293
1294 return cast_ref<Moose::Functor<T> &>(*(requested_functor_is_ad
1295 ? std::get<2>(emplace_ret->second)
1296 : std::get<1>(emplace_ret->second)));
1297 }
1298 else
1299 {
1300 typedef T NonADType;
1301 typedef typename Moose::ADType<T>::type ADType;
1302
1303 auto emplace_ret =
1304 functors.emplace("wraps_" + name,
1305 std::make_tuple(SubProblem::TrueFunctorIs::UNSET,
1306 std::make_unique<Moose::Functor<NonADType>>(
1307 std::make_unique<Moose::NullFunctor<NonADType>>()),
1308 std::make_unique<Moose::Functor<ADType>>(
1309 std::make_unique<Moose::NullFunctor<ADType>>())));
1310
1311 return cast_ref<Moose::Functor<T> &>(*(requested_functor_is_ad
1312 ? std::get<2>(emplace_ret->second)
1313 : std::get<1>(emplace_ret->second)));
1314 }
1315}
1316
1317template <typename T>
1318bool
1319SubProblem::hasFunctorWithType(const std::string & name, const THREAD_ID tid) const
1320{
1321 mooseAssert(tid < _functors.size(), "Too large a thread ID");
1322 auto & functors = _functors[tid];
1323
1324 const auto & it = functors.find("wraps_" + name);
1325 constexpr bool requested_functor_is_ad =
1326 !std::is_same<T, typename MetaPhysicL::RawType<T>::value_type>::value;
1327
1328 if (it == functors.end())
1329 return false;
1330 else
1331 return dynamic_cast<Moose::Functor<T> *>(
1332 requested_functor_is_ad ? std::get<2>(it->second).get() : std::get<1>(it->second).get());
1333}
1334
1335template <typename T, typename PolymorphicLambda>
1338 PolymorphicLambda my_lammy,
1339 const std::set<ExecFlagType> & clearance_schedule,
1340 const MooseMesh & mesh,
1341 const std::set<SubdomainID> & block_ids,
1342 const THREAD_ID tid)
1343{
1344 auto & pbblf_functors = _pbblf_functors[tid];
1345
1346 auto [it, first_time_added] =
1347 pbblf_functors.emplace(name,
1348 std::make_unique<PiecewiseByBlockLambdaFunctor<T>>(
1349 name, my_lammy, clearance_schedule, mesh, block_ids));
1350
1351 auto * functor = dynamic_cast<PiecewiseByBlockLambdaFunctor<T> *>(it->second.get());
1352 if (!functor)
1353 {
1354 if (first_time_added)
1355 mooseError("This should be impossible. If this was the first time we added the functor, then "
1356 "the dynamic cast absolutely should have succeeded");
1357 else
1358 mooseError("Attempted to add a lambda functor with the name '",
1359 name,
1360 "' but another lambda functor of that name returns a different type");
1361 }
1362
1363 if (first_time_added)
1364 addFunctor(name, *functor, tid);
1365 else
1366 // The functor already exists
1367 functor->setFunctor(mesh, block_ids, my_lammy);
1368
1369 return *functor;
1370}
1371
1372template <typename T>
1373void
1374SubProblem::addFunctor(const std::string & name,
1375 const Moose::FunctorBase<T> & functor,
1376 const THREAD_ID tid)
1377{
1378 constexpr bool added_functor_is_ad =
1379 !std::is_same<T, typename MetaPhysicL::RawType<T>::value_type>::value;
1380
1381 mooseAssert(tid < _functors.size(), "Too large a thread ID");
1382
1383 auto & functor_to_request_info = _functor_to_request_info[tid];
1384 auto & functors = _functors[tid];
1385 auto it = functors.find("wraps_" + name);
1386 if (it != functors.end())
1387 {
1388 // We have this functor already. If it's a null functor, we want to replace it with the valid
1389 // functor we have now. If it's not then we'll add a new entry into the multimap and then we'll
1390 // error later if a user requests a functor because their request is ambiguous. This is the
1391 // reason that the functors container is a multimap: for nice error messages
1392 auto * const existing_wrapper_base =
1393 added_functor_is_ad ? std::get<2>(it->second).get() : std::get<1>(it->second).get();
1394 auto * const existing_wrapper = dynamic_cast<Moose::Functor<T> *>(existing_wrapper_base);
1395 if (existing_wrapper && existing_wrapper->template wrapsType<Moose::NullFunctor<T>>())
1396 {
1397 // Sanity check
1398 auto [request_info_it, request_info_end_it] = functor_to_request_info.equal_range(name);
1399 if (request_info_it == request_info_end_it)
1400 mooseError("We are wrapping a NullFunctor but we don't have any unfilled functor request "
1401 "info. This doesn't make sense.");
1402
1403 // Check for valid requests
1404 while (request_info_it != request_info_end_it)
1405 {
1406 auto & [requested_functor_is_ad, requestor_is_ad] = request_info_it->second;
1407 if (!requested_functor_is_ad && requestor_is_ad && added_functor_is_ad)
1408 mooseError("We are requesting a non-AD functor '" + name +
1409 "' from an AD object, but the true functor is AD. This means we could be "
1410 "dropping important derivatives. We will not allow this");
1411 // We're going to eventually check whether we've fulfilled all functor requests and our
1412 // check will be that the multimap is empty. This request is fulfilled, so erase it from the
1413 // map now
1414 request_info_it = functor_to_request_info.erase(request_info_it);
1415 }
1416
1417 // Ok we didn't have the functor before, so we will add it now
1418 std::get<0>(it->second) =
1420 existing_wrapper->assign(functor);
1421 // Finally we create the non-AD or AD complement of the just added functor
1422 if constexpr (added_functor_is_ad)
1423 {
1424 typedef typename MetaPhysicL::RawType<T>::value_type NonADType;
1425 auto * const existing_non_ad_wrapper_base = std::get<1>(it->second).get();
1426 auto * const existing_non_ad_wrapper =
1427 dynamic_cast<Moose::Functor<NonADType> *>(existing_non_ad_wrapper_base);
1428 mooseAssert(existing_non_ad_wrapper->template wrapsType<Moose::NullFunctor<NonADType>>(),
1429 "Both members of pair should have been wrapping a NullFunctor");
1430 existing_non_ad_wrapper->assign(
1431 std::make_unique<Moose::RawValueFunctor<NonADType>>(functor));
1432 }
1433 else
1434 {
1435 typedef typename Moose::ADType<T>::type ADType;
1436 auto * const existing_ad_wrapper_base = std::get<2>(it->second).get();
1437 auto * const existing_ad_wrapper =
1438 dynamic_cast<Moose::Functor<ADType> *>(existing_ad_wrapper_base);
1439 mooseAssert(existing_ad_wrapper->template wrapsType<Moose::NullFunctor<ADType>>(),
1440 "Both members of pair should have been wrapping a NullFunctor");
1441 existing_ad_wrapper->assign(std::make_unique<Moose::ADWrapperFunctor<ADType>>(functor));
1442 }
1443 return;
1444 }
1445 else if (!existing_wrapper)
1446 {
1447 // Functor was emplaced but the cast failed. This could be a double definition with
1448 // different types, or it could be a request with one type then a definition with another
1449 // type. Either way it is going to error later, but it is cleaner to catch it now
1450 mooseError("Functor '",
1451 name,
1452 "' is being added with return type '",
1453 MooseUtils::prettyCppType<T>(),
1454 "' but it has already been defined or requested with return type '",
1455 existing_wrapper_base->returnType(),
1456 "'.");
1457 }
1458 }
1459
1460 // We are a new functor, create the opposite ADType one and store it with other functors
1461 if constexpr (added_functor_is_ad)
1462 {
1463 typedef typename MetaPhysicL::RawType<T>::value_type NonADType;
1464 auto new_non_ad_wrapper = std::make_unique<Moose::Functor<NonADType>>(
1465 std::make_unique<Moose::RawValueFunctor<NonADType>>(functor));
1466 auto new_ad_wrapper = std::make_unique<Moose::Functor<T>>(functor);
1467 _functors[tid].emplace("wraps_" + name,
1468 std::make_tuple(SubProblem::TrueFunctorIs::AD,
1469 std::move(new_non_ad_wrapper),
1470 std::move(new_ad_wrapper)));
1471 }
1472 else
1473 {
1474 typedef typename Moose::ADType<T>::type ADType;
1475 auto new_non_ad_wrapper = std::make_unique<Moose::Functor<T>>((functor));
1476 auto new_ad_wrapper = std::make_unique<Moose::Functor<ADType>>(
1477 std::make_unique<Moose::ADWrapperFunctor<ADType>>(functor));
1478 _functors[tid].emplace("wraps_" + name,
1479 std::make_tuple(SubProblem::TrueFunctorIs::NONAD,
1480 std::move(new_non_ad_wrapper),
1481 std::move(new_ad_wrapper)));
1482 }
1483}
1484
1485inline const bool &
1490
1491inline void
1493 const bool currently_computing_residual_and_jacobian)
1494{
1495 _currently_computing_residual_and_jacobian = currently_computing_residual_and_jacobian;
1496}
1497
1498namespace Moose
1499{
1500void initial_condition(libMesh::EquationSystems & es, const std::string & system_name);
1501} // namespace Moose
boundary_id_type BoundaryID
subdomain_id_type SubdomainID
unsigned int TagID
Definition MooseTypes.h:238
unsigned int THREAD_ID
Definition MooseTypes.h:237
MooseVariableFE< Real > MooseVariable
Definition SubProblem.h:45
MooseVariableFE< RealEigenVector > ArrayMooseVariable
Definition SubProblem.h:47
MooseVariableFE< RealVectorValue > VectorMooseVariable
Definition SubProblem.h:46
Keeps track of stuff related to assembling.
Definition Assembly.h:101
The DiracKernelInfo object is a place where all the Dirac points added by different DiracKernels are ...
This data structure is used to store geometric and variable related metadata about each cell face in ...
Definition FaceInfo.h:38
Generic factory class for build all sorts of objects.
Definition Factory.h:29
GeometricSearchType
Used to select groups of geometric search objects to update.
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
const InputParameters & parameters() const
Get the parameters of the object.
Definition MooseBase.h:131
const std::string & type() const
Get the type of this class.
Definition MooseBase.h:93
const std::string & name() const
Get the name of the class.
Definition MooseBase.h:103
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:271
Class for containing MooseEnum item information.
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
Definition MooseMesh.h:95
A class for storing the names of MooseObject by tag and object name.
Class for stuff related to variables.
This class provides an interface for common operations on field variables of both FE and FV types wit...
Class for scalar variables (they are different).
Wraps non-AD functors such that they can be used in objects that have requested the functor as AD.
Base class template for functor objects.
This is a wrapper that forwards calls to the implementation, which can be switched out at any time wi...
A functor that serves as a placeholder during the simulation setup phase if a functor consumer reques...
A material property that is evaluated on-the-fly via calls to various overloads of operator()
Class that hold the whole problem being solved.
Definition Problem.h:20
Abstract definition of a RestartableData value.
A class for creating restricted objects.
Definition Restartable.h:29
Generic class for solving transient nonlinear problems.
Definition SubProblem.h:79
const std::map< MooseObjectName, std::set< std::string > > & getConsumedPropertyMap() const
Return the map that tracks the object with consumed material properties.
Definition SubProblem.C:731
std::vector< std::map< std::string, std::unique_ptr< Moose::FunctorAbstract > > > _pbblf_functors
Container to hold PiecewiseByBlockLambdaFunctors.
bool _safe_access_tagged_vectors
Is it safe to retrieve data from tagged vectors.
virtual void reinitNeighbor(const Elem *elem, unsigned int side, const THREAD_ID tid)=0
virtual void addResidualNeighbor(const THREAD_ID tid)=0
virtual void clearActiveFEVariableCoupleableVectorTags(const THREAD_ID tid)
Definition SubProblem.C:367
void showFunctorRequestors() const
Lists all functors and all the objects that requested them.
virtual void prepareFace(const Elem *elem, 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:725
virtual void addJacobianNeighbor(const THREAD_ID tid)=0
std::vector< VectorTag > _vector_tags
The declared vector tags.
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:572
void reinitFVFace(const THREAD_ID tid, const FaceInfo &fi)
reinitialize the finite volume assembly data for the provided face and thread
const Moose::Functor< T > & getFunctor(const std::string &name, const THREAD_ID tid, const std::string &requestor_name, bool requestor_is_ad)
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
void showFunctors() const
Lists all functors in the problem.
virtual MooseMesh & mesh()=0
virtual bool computingScalingResidual() const =0
Getter for whether we're computing the scaling residual.
virtual unsigned int currentNlSysNum() const =0
virtual void checkBoundaryMatProps()
Checks boundary material properties integrity.
Definition SubProblem.C:654
virtual void cacheJacobianNeighbor(const THREAD_ID tid)
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:604
virtual unsigned int nLinearIterations(const unsigned int nl_sys_num) const
Definition SubProblem.C:755
virtual TagName vectorTagName(const TagID tag) const
Retrieve the name associated with a TagID.
Definition SubProblem.C:210
std::string restrictionBoundaryCheckName(BoundaryID check_id)
Definition SubProblem.C:772
void removeAlgebraicGhostingFunctor(libMesh::GhostingFunctor &algebraic_gf)
Remove an algebraic ghosting functor from this problem's DofMaps.
std::map< BoundaryID, std::multimap< std::string, std::string > > _map_boundary_material_props_check
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 bool checkResidualForNans() const =0
Whether to check residual for NaN/Inf values.
virtual void reinitElemPhys(const Elem *elem, const std::vector< Point > &phys_points_in_elem, const THREAD_ID tid)=0
unsigned int getAxisymmetricRadialCoord() const
Returns the desired radial direction for RZ coordinate transformation.
Definition SubProblem.C:785
std::vector< std::vector< VectorTag > > _typed_vector_tags
The vector tags associated with each VectorTagType This is kept separate from _vector_tags for quick ...
virtual void markMatPropRequested(const std::string &)
Helper method for adding a material property name to the _material_property_requested set.
Definition SubProblem.C:713
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.
virtual bool computingScalingJacobian() const =0
Getter for whether we're computing the scaling jacobian.
const bool & currentlyComputingJacobian() const
Returns true if the problem is in the process of computing the Jacobian.
Definition SubProblem.h:692
virtual bool hasBoundaryMaterialProperty(BoundaryID boundary_id, const std::string &prop_name)
Check if a material property is defined on a block.
Definition SubProblem.C:559
virtual void checkBlockMatProps()
Checks block material properties integrity.
Definition SubProblem.C:612
void registerUnfilledFunctorRequest(T *functor_interface, const std::string &functor_name, const THREAD_ID tid)
Register an unfulfilled functor request.
virtual TagID getVectorTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition SubProblem.C:192
std::vector< std::set< TagID > > _active_fe_var_coupleable_vector_tags
virtual void clearActiveFEVariableCoupleableMatrixTags(const THREAD_ID tid)
Definition SubProblem.C:373
virtual Moose::VectorTagType vectorTagType(const TagID tag_id) const
Definition SubProblem.C:220
virtual std::size_t numNonlinearSystems() const =0
bool _currently_computing_residual
Whether the residual is being evaluated.
virtual bool hasLinearVariable(const std::string &var_name) const
Whether or not this problem has this linear variable.
Definition SubProblem.C:791
void reinitNodesNeighbor(const std::vector< dof_id_type > &nodes, const THREAD_ID tid)
Definition SubProblem.C:984
bool _computing_nonlinear_residual
Whether the non-linear residual is being evaluated.
void clearAllDofIndices()
Clear dof indices from variables in nl and aux systems.
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
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:871
virtual const VectorTag & getVectorTag(const TagID tag_id) const
Get a VectorTag from a TagID.
Definition SubProblem.C:150
virtual const std::set< MooseVariableFieldBase * > & getActiveElementalMooseVariables(const THREAD_ID tid) const
Get the MOOSE variables to be reinited on each element.
Definition SubProblem.C:443
virtual SystemBase & systemBaseNonlinear(const unsigned int sys_num)=0
virtual void needFV()=0
marks this problem as including/needing finite volume functionality.
void hasScalingVector(const unsigned int nl_sys_num)
Tells this problem that the assembly associated with the given nonlinear system number involves a sca...
std::map< TagID, TagName > _matrix_tag_id_to_tag_name
Reverse map.
virtual bool safeAccessTaggedMatrices() const
Is it safe to access the tagged matrices.
Definition SubProblem.h:739
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.
std::map< std::string, std::vector< dof_id_type > > _var_dof_map
Definition SubProblem.h:682
virtual void customSetup(const ExecFlagType &exec_type)
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.
virtual void setCurrentBoundaryID(BoundaryID bid, const THREAD_ID tid)
sets the current boundary ID in assembly
Definition SubProblem.C:778
virtual void cacheResidual(const THREAD_ID tid)
virtual void jacobianSetup()
virtual void initialSetup()
virtual void cacheJacobian(const THREAD_ID tid)
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
Factory & _factory
The Factory for building objects.
virtual void setNeighborSubdomainID(const Elem *elem, unsigned int side, const THREAD_ID tid)=0
virtual void reinitNode(const Node *node, const THREAD_ID tid)=0
std::vector< VectorTag > getVectorTags(const std::set< TagID > &tag_ids) const
Definition SubProblem.C:161
virtual unsigned int numMatrixTags() const
The total number of tags.
Definition SubProblem.h:248
virtual SystemBase & systemBaseSolver(const unsigned int sys_num)=0
bool doingPRefinement() const
std::map< MooseObjectName, std::set< std::string > > _consumed_material_properties
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
virtual DiracKernelInfo & diracKernelInfo()
Definition SubProblem.C:737
virtual unsigned int nNonlinearIterations(const unsigned int nl_sys_num) const
Definition SubProblem.C:749
void preparePRefinement()
Prepare DofMap and Assembly classes with our p-refinement information.
virtual unsigned int currentLinearSysNum() const =0
static InputParameters validParams()
Definition SubProblem.C:34
virtual LineSearch * getLineSearch()=0
virtual void setCurrentSubdomainID(const Elem *elem, const THREAD_ID tid)=0
virtual TagID getMatrixTagID(const TagName &tag_name) const
Get a TagID from a TagName.
Definition SubProblem.C:331
virtual void addGhostedBoundary(BoundaryID boundary_id)=0
Will make sure that all necessary elements from boundary_id are ghosted to this processor.
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.
void reinitNeighborLowerDElem(const Elem *elem, const THREAD_ID tid=0)
reinitialize a neighboring lower dimensional element
Definition SubProblem.C:992
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:578
void removeCouplingGhostingFunctor(libMesh::GhostingFunctor &coupling_gf)
Remove a coupling ghosting functor from this problem's DofMaps.
virtual SystemBase & systemBaseLinear(const unsigned int sys_num)=0
virtual void setActiveScalarVariableCoupleableMatrixTags(std::set< TagID > &mtags, const THREAD_ID tid)
Definition SubProblem.C:391
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:462
std::map< TagName, TagID > _vector_tags_name_map
Map of vector tag TagName to TagID.
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:910
virtual void ghostGhostedBoundaries()=0
Causes the boundaries added using addGhostedBoundary to actually be ghosted.
std::map< SubdomainID, std::set< MaterialPropertyName > > _zero_block_material_props
Set of properties returned as zero properties.
virtual bool hasNonlocalCoupling() const =0
Whether the simulation has active nonlocal coupling which should be accounted for in the Jacobian.
virtual void reinitElemFace(const Elem *elem, unsigned int side, const THREAD_ID tid)=0
std::vector< std::set< TagID > > _active_sc_var_coupleable_vector_tags
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)
void setFunctorOutput(bool set_output)
Setter for debug functor output.
Definition SubProblem.h:932
bool defaultGhosting()
Whether or not the user has requested default ghosting ot be on.
Definition SubProblem.h:144
virtual void addJacobianNeighborLowerD(const THREAD_ID tid)=0
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:184
void reinitNodes(const std::vector< dof_id_type > &nodes, const THREAD_ID tid)
Definition SubProblem.C:976
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 ...
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...
virtual std::size_t numSolverSystems() const =0
virtual TagName matrixTagName(TagID tag)
Retrieve the name associated with a TagID.
Definition SubProblem.C:346
virtual const MooseMesh & mesh() const =0
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:138
virtual void haveADObjects(bool have_ad_objects)
Method for setting whether we have any ad objects.
Definition SubProblem.h:775
virtual void addResidual(const THREAD_ID tid)=0
virtual Assembly & assembly(const THREAD_ID tid, const unsigned int sys_num)=0
std::vector< std::set< TagID > > _active_sc_var_coupleable_matrix_tags
virtual void addGhostedElem(dof_id_type elem_id)=0
Will make sure that all dofs connected to elem_id are ghosted to this processor.
DiracKernelInfo _dirac_kernel_info
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 hasActiveElementalMooseVariables(const THREAD_ID tid) const
Whether or not a list of active elemental moose variables has been set.
Definition SubProblem.C:449
virtual std::size_t numLinearSystems() const =0
bool _show_chain_control_data
Whether to output a list of all the chain control data.
virtual void reinitNodeFace(const Node *node, BoundaryID bnd_id, const THREAD_ID tid)=0
virtual unsigned int nlSysNum(const NonlinearSystemName &nl_sys_name) const =0
virtual std::pair< bool, unsigned int > determineSolverSystem(const std::string &var_name, bool error_if_not_found=false) const =0
virtual Real finalNonlinearResidual(const unsigned int nl_sys_num) const
Definition SubProblem.C:743
virtual SystemBase & systemBaseAuxiliary()=0
void reinitMortarElem(const Elem *elem, const THREAD_ID tid=0)
Reinit a mortar element to obtain a valid JxW.
Definition SubProblem.C:999
virtual void setResidual(libMesh::NumericVector< libMesh::Number > &residual, const THREAD_ID tid)=0
bool _safe_access_tagged_matrices
Is it safe to retrieve data from tagged matrices.
virtual void prepareNeighborShapes(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 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 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:584
virtual void setActiveFEVariableCoupleableMatrixTags(std::set< TagID > &mtags, const THREAD_ID tid)
Definition SubProblem.C:352
virtual bool solverSystemConverged(const unsigned int sys_num)
Definition SubProblem.h:100
bool verifyVectorTags() const
Verify the integrity of _vector_tags and _typed_vector_tags.
Definition SubProblem.C:230
virtual TagID addVectorTag(const TagName &tag_name, const Moose::VectorTagType type=Moose::VECTOR_TAG_RESIDUAL)
Create a Tag.
Definition SubProblem.C:81
std::unordered_set< TagID > _not_zeroed_tagged_vectors
the list of vector tags that will not be zeroed when all other tags are
void addCouplingGhostingFunctor(libMesh::GhostingFunctor &coupling_gf, bool to_mesh=true)
Add a coupling functor to this problem's DofMaps.
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.
virtual const libMesh::CouplingMatrix & nonlocalCouplingMatrix(const unsigned i) const =0
void addAlgebraicGhostingFunctor(libMesh::GhostingFunctor &algebraic_gf, bool to_mesh=true)
Add an algebraic ghosting functor to this problem's DofMaps.
bool _default_ghosting
Whether or not to use default libMesh coupling.
virtual bool hasBlockMaterialProperty(SubdomainID block_id, const std::string &prop_name)
Check if a material property is defined on a block.
Definition SubProblem.C:500
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:278
virtual void setActiveScalarVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid)
Definition SubProblem.C:398
virtual bool checkNonlocalCouplingRequirement() const =0
const std::set< TagID > & getActiveScalarVariableCoupleableMatrixTags(const THREAD_ID tid) const
Definition SubProblem.C:420
std::map< SubdomainID, std::multimap< std::string, std::string > > _map_block_material_props_check
Data structures of the requested material properties.
virtual void clearActiveScalarVariableCoupleableVectorTags(const THREAD_ID tid)
Definition SubProblem.C:408
std::set< dof_id_type > _ghosted_elems
Elements that should have Dofs ghosted to the local processor.
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.
virtual void prepare(const Elem *elem, const THREAD_ID tid)=0
bool computingNonlinearResid() const
Returns true if the problem is in the process of computing the nonlinear residual.
Definition SubProblem.h:715
virtual void updateGeomSearch(GeometricSearchData::GeometricSearchType type=GeometricSearchData::ALL)=0
update geometric search data
const std::set< TagID > & getActiveFEVariableCoupleableMatrixTags(const THREAD_ID tid) const
Definition SubProblem.C:379
virtual void setActiveFEVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid)
Definition SubProblem.C:358
virtual void clearActiveElementalMooseVariables(const THREAD_ID tid)
Clear the active elemental MooseVariableFieldBase.
Definition SubProblem.C:455
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...
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:289
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
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.
std::string restrictionSubdomainCheckName(SubdomainID check_id)
Helper functions for checking MaterialProperties.
Definition SubProblem.C:761
bool haveADObjects() const
Method for reading wehther we have any ad objects.
Definition SubProblem.h:779
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:144
virtual libMesh::System & getSystem(const std::string &var_name)=0
Returns the equation system containing the variable provided.
virtual void reinitNeighborPhys(const Elem *neighbor, unsigned int neighbor_side, const std::vector< Point > &physical_points, const THREAD_ID tid)=0
virtual const SystemBase & systemBaseAuxiliary() const =0
Return the auxiliary system object as a base class reference.
Moose::CoordinateSystemType getCoordSystem(SubdomainID sid) const
virtual void clearActiveScalarVariableCoupleableMatrixTags(const THREAD_ID tid)
Definition SubProblem.C:414
virtual void prepareShapes(unsigned int var, const THREAD_ID tid)=0
virtual void onTimestepBegin()=0
virtual void setCurrentLowerDElem(const Elem *const lower_d_elem, const THREAD_ID tid)
Set the current lower dimensional element.
virtual unsigned int linearSysNum(const LinearSystemName &linear_sys_name) const =0
virtual unsigned int solverSysNum(const SolverSystemName &solver_sys_name) const =0
void setCurrentlyComputingResidualAndJacobian(bool currently_computing_residual_and_jacobian)
Set whether or not the problem is in the process of computing the Jacobian.
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
virtual bool matrixTagExists(const TagName &tag_name) const
Check to see if a particular Tag exists.
Definition SubProblem.C:317
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...
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:514
std::map< BoundaryID, std::set< std::string > > _map_boundary_material_props
Map for boundary material properties (boundary_id -> list of properties)
void setChainControlDataOutput(bool set_output)
Setter for debug chain control data output.
Definition SubProblem.h:934
const bool & currentlyComputingResidual() const
Returns true if the problem is in the process of computing the residual.
Definition SubProblem.h:728
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 void addCachedResidual(const THREAD_ID tid)
virtual bool safeAccessTaggedVectors() const
Is it safe to access the tagged vectors.
Definition SubProblem.h:742
virtual void reinitOffDiagScalars(const THREAD_ID tid)=0
virtual bool haveFV() const =0
returns true if this problem includes/needs finite volume functionality.
virtual void addCachedJacobian(const THREAD_ID tid)
virtual TagID addMatrixTag(TagName tag_name)
Create a Tag.
Definition SubProblem.C:300
bool _currently_computing_jacobian
Flag to determine whether the problem is currently computing Jacobian.
virtual bool computingPreSMOResidual(const unsigned int nl_sys_num) const =0
Returns true if the problem is in the process of computing it's initial residual.
std::map< SubdomainID, std::set< std::string > > _map_block_material_props
Map of material properties (block_id -> list of properties)
virtual void addJacobianNeighbor(libMesh::SparseMatrix< libMesh::Number > &jacobian, unsigned int ivar, unsigned int jvar, const libMesh::DofMap &dof_map, std::vector< dof_id_type > &dof_indices, std::vector< dof_id_type > &neighbor_dof_indices, const std::set< TagID > &tags, const THREAD_ID tid)=0
virtual libMesh::EquationSystems & es()=0
virtual void onTimestepEnd()=0
std::set< std::string > _material_property_requested
set containing all material property names that have been requested by getMaterialProperty*
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 setResidualNeighbor(libMesh::NumericVector< libMesh::Number > &residual, const THREAD_ID tid)=0
bool _show_functors
Whether to output a list of the functors used and requested (currently only at initialSetup)
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 bool hasAuxiliaryVariable(const std::string &var_name) const
Whether or not this problem has this auxiliary variable.
Definition SubProblem.C:800
std::vector< std::set< TagID > > _active_fe_var_coupleable_matrix_tags
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:530
std::map< BoundaryID, std::set< MaterialPropertyName > > _zero_boundary_material_props
virtual void addJacobianLowerD(const THREAD_ID tid)=0
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:432
virtual void timestepSetup()
virtual const libMesh::CouplingMatrix * couplingMatrix(const unsigned int nl_sys_num) const =0
The coupling matrix defining what blocks exist in the preconditioning matrix.
virtual void prepareAssembly(const THREAD_ID tid)=0
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.
virtual bool hasVariable(const std::string &var_name) const =0
Whether or not this problem has the variable.
virtual void reinitNeighborPhys(const Elem *neighbor, const std::vector< Point > &physical_points, const THREAD_ID tid)=0
virtual void addJacobian(const THREAD_ID tid)=0
virtual const std::vector< VectorTag > & currentResidualVectorTags() const =0
Return the residual vector tags we are currently computing.
std::map< TagName, TagID > _matrix_tag_name_to_tag_id
The currently declared tags.
virtual bool isTransient() const =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.
virtual void clearDiracInfo()=0
Gets called before Dirac Kernels are asked to add the points they are supposed to be evaluated in.
virtual bool nlConverged(const unsigned int nl_sys_num)
Definition SubProblem.C:705
virtual void reinitElem(const Elem *elem, const THREAD_ID tid)=0
virtual bool vectorTagExists(const TagID tag_id) const
Check to see if a particular Tag exists.
Definition SubProblem.h:201
virtual void prepareFaceShapes(unsigned int var, const THREAD_ID tid)=0
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
virtual void addResidualLower(const THREAD_ID tid)=0
virtual void cacheResidualNeighbor(const THREAD_ID tid)
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:596
void addFunctor(const std::string &name, const Moose::FunctorBase< T > &functor, const THREAD_ID tid)
add a functor to the problem functor container
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.
virtual MooseVariableScalar & getScalarVariable(const THREAD_ID tid, const std::string &var_name)=0
Returns the scalar variable reference from whichever system contains it.
const std::set< TagID > & getActiveFEVariableCoupleableVectorTags(const THREAD_ID tid) const
Definition SubProblem.C:385
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:478
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...
virtual void residualSetup()
virtual bool isMatPropRequested(const std::string &prop_name) const
Find out if a material property has been requested by any object.
Definition SubProblem.C:719
virtual void prepare(const Elem *elem, unsigned int ivar, unsigned int jvar, const std::vector< dof_id_type > &dof_indices, const THREAD_ID tid)=0
virtual bool haveDisplaced() const =0
Whether we have a displaced problem in our simulation.
const std::set< TagID > & getActiveScalarVariableCoupleableVectorTags(const THREAD_ID tid) const
Definition SubProblem.C:426
const bool & currentlyComputingResidualAndJacobian() const
Returns true if the problem is in the process of computing the residual and the Jacobian.
std::vector< unsigned int > _has_active_elemental_moose_variables
Whether or not there is currently a list of active elemental moose variables.
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
virtual GeometricSearchData & geomSearchData()=0
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:590
bool _currently_computing_residual_and_jacobian
Flag to determine whether the problem is currently computing the residual and Jacobian.
virtual const MooseMesh & mesh(bool use_displaced) const =0
bool _have_ad_objects
AD flag indicating whether any AD objects have been added.
virtual const Assembly & assembly(const THREAD_ID tid, const unsigned int sys_num) const =0
void reinitGeomSearch()
reinitialize this object's geometric search data, e.g.
virtual void reinitElemNeighborAndLowerD(const Elem *elem, unsigned int side, const THREAD_ID tid)=0
bool automaticScaling() const
Automatic scaling getter.
virtual ~SubProblem()
Definition SubProblem.C:78
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:946
Base class for a system (of equations)
Definition SystemBase.h:87
Storage for all of the information pretaining to a vector tag.
Definition VectorTag.h:18
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
@ VECTOR_TAG_ANY
@ VECTOR_TAG_RESIDUAL
CoordinateSystemType
Definition MooseTypes.h:864
VarKindType
Framework-wide stuff.
Definition MooseTypes.h:769
@ VAR_ANY
Definition MooseTypes.h:772
void initial_condition(libMesh::EquationSystems &es, const std::string &system_name)
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
std::string demangle(const char *name)
VectorValue< Real > RealVectorValue
Definition SubProblem.h:34