https://mooseframework.inl.gov
Loading...
Searching...
No Matches
Classes | Namespaces | Functions
ComputeUserObjectsThread.h File Reference

Go to the source code of this file.

Classes

class  ComputeUserObjectsThread
 Class for threaded computation of UserObjects. More...
 

Namespaces

namespace  libMesh
 The following methods are specializations for using the libMesh::Parallel::packed_range_* routines for std::strings.
 

Functions

template<typename T >
void groupUserObjects (TheWarehouse &w, AuxiliarySystem &aux, const ExecFlagEnum &execute_flags, const std::vector< T * > &objs, const std::set< std::string > &ic_deps)
 

Function Documentation

◆ groupUserObjects()

template<typename T >
void groupUserObjects ( TheWarehouse w,
AuxiliarySystem aux,
const ExecFlagEnum execute_flags,
const std::vector< T * > &  objs,
const std::set< std::string > &  ic_deps 
)

Definition at line 101 of file ComputeUserObjectsThread.h.

106{
107 // These flags indicate when a user object will be executed for a given exec flag time.
108 // The attributes are set by this function and their values are queried in
109 // FEProblemBase::computeUserObjectsInternal(). If a UO is found to be in one of the
110 // three groups: PRE_IC, PRE_AUX, or POST_AUX, then that UO is executed with that group.
111 //
112 // PRE_IC objects are run before initial conditions during the "INITIAL" exec flag time.
113 // On any other exec flag time, they are run in POST_AUX by default or if there is
114 // an dependency for some exec flag or if force_preaux is set, they are run in
115 // PRE_AUX
116 //
117 // PRE_AUX objects are run before the dependent AuxKernels exec flag
118 //
119 // POST_AUX objects are run after AuxKernels on any given exec flag time, and is the
120 // default group for UOs. Dependencies that would otherwise move a UO into the
121 // PRE_AUX group can be overridden by specifying the parameter force_postaux
122 //
123 // This function attempts to sort a UO based on any ICs or AuxKernels which depend on
124 // it. Alternatively, a user may select which group to execute their object with by
125 // controlling the force_preic, force_preaux and force_postaux input parameters.
126 //
127
128 std::map<T *, std::set<int>> pre_aux_dependencies;
129 std::map<T *, std::set<int>> post_aux_dependencies;
130 // This map is used to indicate, after all dependencies have
131 // been looked through, whether the UO has been flagged to
132 // execute on EXEC_INITIAL, either through a dependency or
133 // because force_preic was indicated. If neither of these
134 // are true, the UO needs to be run in POST_AUX for EXEC_INITIAL
135 std::map<T *, bool> is_pre_ic;
136
137 for (const auto obj : objs)
138 is_pre_ic[obj] = false;
139
140 for (const ExecFlagType & flag : execute_flags.items())
141 {
142 std::set<std::string> depend_objects_aux = aux.getDependObjects(flag);
143 for (const auto obj : objs)
144 {
145 if (depend_objects_aux.count(obj->name()) > 0)
146 {
147 pre_aux_dependencies[obj].insert(flag);
148 if (flag == EXEC_INITIAL)
149 is_pre_ic.at(obj) = true;
150 }
151 else if (flag != EXEC_INITIAL)
152 // default is for UO to be post_aux. If EXEC_INITIAL, check first if UO
153 // will be dependent on IC or have force_preic before deciding to put in
154 // post_aux
155 post_aux_dependencies[obj].insert(flag);
156 }
157 }
158
159 for (const auto obj : objs)
160 {
161 if (ic_deps.count(obj->name()) > 0 ||
162 (obj->isParamValid("force_preic") && obj->template getParam<bool>("force_preic")))
163 {
164 w.update(obj, AttribPreIC(w, true));
165 is_pre_ic.at(obj) = true;
166 }
167
168 if ((obj->isParamValid("force_preaux") && obj->template getParam<bool>("force_preaux")))
169 {
170 post_aux_dependencies[obj].clear();
171 for (const ExecFlagType & flag : execute_flags.items())
172 pre_aux_dependencies[obj].insert(flag);
173 }
174 else if (obj->isParamValid("force_postaux") && obj->template getParam<bool>("force_postaux"))
175 {
176 pre_aux_dependencies[obj].clear();
177 for (const ExecFlagType & flag : execute_flags.items())
178 post_aux_dependencies[obj].insert(flag);
179 }
180 else
181 {
182 // If at this point, then check if the UO has already been set to execute
183 // by either the force_preic param, an IC dependency, or a dependency
184 // already found for exec flage EXEC_INITIAL. If none of these are true,
185 // then is_pre_ic.at(obj) is false and the UO is added to the default
186 // post_aux group for the EXEC_INITIAL flag
187 if (!is_pre_ic.at(obj))
188 post_aux_dependencies[obj].insert(EXEC_INITIAL);
189 }
190 }
191
192 for (auto & item : pre_aux_dependencies)
193 w.update(item.first, AttribPreAux(w, item.second));
194
195 for (auto & item : post_aux_dependencies)
196 w.update(item.first, AttribPostAux(w, item.second));
197}
const ExecFlagType EXEC_INITIAL
Definition Moose.C:30
TODO: delete this later - it is a temporary hack for dealing with inter-system dependencies.
Definition Attributes.h:346
TODO: delete this later - it is a temporary hack for dealing with inter-system dependencies.
Definition Attributes.h:315
TODO: delete this later - it is a temporary hack for dealing with inter-system dependencies.
Definition Attributes.h:296
std::set< std::string > getDependObjects(ExecFlagType type)
Get a list of dependent UserObjects for this exec type.
Class for containing MooseEnum item information.
void update(MooseObject *obj)
update updates the metadata/attribute-info stored for the given object obj that must already exists i...
ExecFlagEnum execute_flags
Storage for the registered execute flags.