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;
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 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
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 [[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
1037protected:
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
1134private:
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
1230template <typename T>
1231const Moose::Functor<T> &
1232SubProblem::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
1336template <typename T>
1337bool
1338SubProblem::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
1354template <typename T, typename PolymorphicLambda>
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
1391template <typename T>
1392void
1393SubProblem::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
1504inline const bool &
1509
1510inline void
1512 const bool currently_computing_residual_and_jacobian)
1513{
1514 _currently_computing_residual_and_jacobian = currently_computing_residual_and_jacobian;
1515}
1516
1517namespace Moose
1518{
1519void initial_condition(libMesh::EquationSystems & es, const std::string & system_name);
1520} // namespace Moose
boundary_id_type BoundaryID
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:110
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:743
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:379
void showFunctorRequestors() const
Lists all functors and all the objects that requested them.
bool havePRefinement() const
Query whether p-refinement has been requested at any point during the simulation.
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:737
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:584
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:666
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:616
virtual unsigned int nLinearIterations(const unsigned int nl_sys_num) const
Definition SubProblem.C:767
virtual TagName vectorTagName(const TagID tag) const
Retrieve the name associated with a TagID.
Definition SubProblem.C:222
std::string restrictionBoundaryCheckName(BoundaryID check_id)
Definition SubProblem.C:784
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
virtual void reinitNodes(const std::vector< dof_id_type > &nodes, const THREAD_ID tid)=0
unsigned int getAxisymmetricRadialCoord() const
Returns the desired radial direction for RZ coordinate transformation.
Definition SubProblem.C:797
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:725
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:571
virtual void checkBlockMatProps()
Checks block material properties integrity.
Definition SubProblem.C:624
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:204
std::vector< std::set< TagID > > _active_fe_var_coupleable_vector_tags
virtual void clearActiveFEVariableCoupleableMatrixTags(const THREAD_ID tid)
Definition SubProblem.C:385
virtual Moose::VectorTagType vectorTagType(const TagID tag_id) const
Definition SubProblem.C:232
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:803
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:883
virtual const VectorTag & getVectorTag(const TagID tag_id) const
Get a VectorTag from a TagID.
Definition SubProblem.C:162
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 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:790
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:173
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:749
virtual void reinitNodesNeighbor(const std::vector< dof_id_type > &nodes, const THREAD_ID tid)=0
virtual unsigned int nNonlinearIterations(const unsigned int nl_sys_num) const
Definition SubProblem.C:761
void preparePRefinement()
Prepare DofMap and Assembly classes with our p-refinement information.
virtual unsigned int currentLinearSysNum() const =0
static InputParameters validParams()
Definition SubProblem.C:36
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:343
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:988
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
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:403
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
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:922
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:196
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:358
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:150
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
void markFamilyPRefinement(const InputParameters &params)
Mark a variable family for either disabling or enabling p-refinement with valid parameters of a varia...
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:461
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:755
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:995
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:596
virtual void setActiveFEVariableCoupleableMatrixTags(std::set< TagID > &mtags, const THREAD_ID tid)
Definition SubProblem.C:364
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:242
virtual TagID addVectorTag(const TagName &tag_name, const Moose::VectorTagType type=Moose::VECTOR_TAG_RESIDUAL)
Create a Tag.
Definition SubProblem.C:93
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:512
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
virtual void setActiveScalarVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid)
Definition SubProblem.C:410
virtual bool checkNonlocalCouplingRequirement() const =0
const std::set< TagID > & getActiveScalarVariableCoupleableMatrixTags(const THREAD_ID tid) const
Definition SubProblem.C:432
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:420
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:391
virtual void setActiveFEVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid)
Definition SubProblem.C:370
virtual void clearActiveElementalMooseVariables(const THREAD_ID tid)
Clear the active elemental MooseVariableFieldBase.
Definition SubProblem.C:467
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...
std::unordered_map< FEFamily, bool > _family_for_p_refinement
Indicate whether a family is disabled for p-refinement.
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 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
bool _have_p_refinement
Whether p-refinement has been requested at any point during the simulation.
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:773
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:156
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:426
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:329
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:526
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
static const std::unordered_set< FEFamily > _default_families_without_p_refinement
The set of variable families by default disable p-refinement.
Definition SubProblem.h:50
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:312
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:812
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:542
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:444
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:717
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:608
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:397
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
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:731
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:438
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:602
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:90
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
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