49 virtual void addObject(std::shared_ptr<T>
object,
THREAD_ID tid = 0,
bool recurse =
true);
62 const std::map<SubdomainID, std::vector<std::shared_ptr<T>>> &
65 const std::map<BoundaryID, std::vector<std::shared_ptr<T>>> &
78 const std::map<SubdomainID, std::vector<std::shared_ptr<T>>> &
82 const std::map<BoundaryID, std::vector<std::shared_ptr<T>>> &
109 const std::set<SubdomainID> &
blocks,
110 std::set<SubdomainID> & blocks_covered,
150 std::set<MooseVariableFieldBase *> & needed_moose_vars,
155 std::set<MooseVariableFieldBase *> & needed_moose_vars,
167 std::set<TagID> & needed_fe_var_vector_tags,
180 const bool producer_only =
false)
const;
182 std::unordered_set<unsigned int> & needed_mat_props,
184 const bool producer_only =
false)
const;
187 const bool producer_only =
false)
const;
189 std::unordered_set<unsigned int> & needed_mat_props,
191 const bool producer_only =
false)
const;
198 std::set<std::string> & unique_variables,
212 const std::string & prefix =
"[DBG]")
const;
243 const std::vector<std::shared_ptr<T>> & all);
248 static void sortHelper(std::vector<std::shared_ptr<T>> & objects);
254 const std::vector<std::shared_ptr<T>> & objects);
261 const std::vector<std::shared_ptr<T>> & objects);
267 const std::vector<std::shared_ptr<T>> & objects,
268 const bool producer_only)
const;
278 template <
typename T>
291 template <
typename T>
296 template <
typename T>
304 template <
typename T>
316 bool enabled =
object->enabled();
321 std::shared_ptr<BoundaryRestrictable> bnd =
326 if (bnd && bnd->boundaryRestricted())
328 const std::set<BoundaryID> & ids = bnd->boundaryIDs();
329 for (std::set<BoundaryID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
340 const std::set<SubdomainID> & ids =
341 blk->blockRestricted() ? blk->blockIDs() : blk->meshBlockIDs();
342 for (std::set<SubdomainID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
353 blk->checkVariable(*var);
364 std::string variable_name = parameters.
getMooseType(
"variable");
365 if (variable_name ==
"")
378 template <
typename T>
379 inline const std::vector<std::shared_ptr<T>> &
386 template <
typename T>
387 inline const std::map<BoundaryID, std::vector<std::shared_ptr<T>>> &
394 template <
typename T>
402 template <
typename T>
403 const std::vector<std::shared_ptr<T>> &
409 "Unable to located active boundary objects for the given id: " <<
id <<
".");
413 template <
typename T>
414 inline const std::map<SubdomainID, std::vector<std::shared_ptr<T>>> &
421 template <
typename T>
422 const std::vector<std::shared_ptr<T>> &
428 "Unable to located active block objects for the given id: " <<
id <<
".");
432 template <
typename T>
433 inline const std::vector<std::shared_ptr<T>> &
440 template <
typename T>
441 inline const std::map<BoundaryID, std::vector<std::shared_ptr<T>>> &
448 template <
typename T>
449 const std::vector<std::shared_ptr<T>> &
455 "Unable to located active boundary objects for the given id: " <<
id <<
".");
459 template <
typename T>
460 inline const std::map<SubdomainID, std::vector<std::shared_ptr<T>>> &
467 template <
typename T>
468 const std::vector<std::shared_ptr<T>> &
474 "Unable to located active block objects for the given id: " <<
id <<
".");
478 template <
typename T>
486 template <
typename T>
494 template <
typename T>
503 template <
typename T>
506 const std::set<SubdomainID> &
blocks,
507 std::set<SubdomainID> & blocks_covered,
511 blocks_covered.clear();
519 if (blk && blk->hasBlocks(
blocks))
531 for (
const auto & block :
blocks)
532 if (blk->hasBlocks(block))
533 blocks_covered.insert(block);
536 if (blocks_covered.empty())
539 return (
blocks == blocks_covered);
542 template <
typename T>
547 bool has_active_block_objects =
false;
549 has_active_block_objects |= !(object_pair.second.empty());
550 return has_active_block_objects;
553 template <
typename T>
562 template <
typename T>
567 bool has_active_boundary_objects =
false;
569 has_active_boundary_objects |= !(object_pair.second.empty());
570 return has_active_boundary_objects;
573 template <
typename T>
582 template <
typename T>
588 if (object->name() ==
name)
593 template <
typename T>
599 if (object->name() ==
name)
604 template <
typename T>
610 if (object->name() ==
name)
615 template <
typename T>
616 const std::vector<std::shared_ptr<T>> &
623 template <
typename T>
624 std::set<SubdomainID>
628 std::set<SubdomainID> ids;
630 ids.insert(object_pair.first);
634 template <
typename T>
649 template <
typename T>
652 const std::vector<std::shared_ptr<T>> & all)
657 std::copy_if(all.begin(),
659 std::back_inserter(active),
660 [](
const std::shared_ptr<T> & object) {
return object->enabled(); });
663 template <
typename T>
681 template <
typename T>
684 std::set<MooseVariableFieldBase *> & needed_moose_vars,
THREAD_ID tid )
const 690 template <
typename T>
694 std::set<MooseVariableFieldBase *> & needed_moose_vars,
701 template <
typename T>
704 std::set<MooseVariableFieldBase *> & needed_moose_vars,
THREAD_ID tid )
const 708 typename std::map<BoundaryID, std::vector<std::shared_ptr<T>>>::const_iterator it;
714 template <
typename T>
718 std::set<MooseVariableFieldBase *> & needed_moose_vars,
725 template <
typename T>
728 std::set<MooseVariableFieldBase *> & needed_moose_vars,
729 const std::vector<std::shared_ptr<T>> & objects)
731 for (
const auto &
object : objects)
737 needed_moose_vars.insert(mv_deps.begin(), mv_deps.end());
742 template <
typename T>
745 std::set<TagID> & needed_fe_var_vector_tags,
THREAD_ID tid )
const 752 template <
typename T>
762 template <
typename T>
772 template <
typename T>
775 std::set<TagID> & needed_fe_var_vector_tags,
const std::vector<std::shared_ptr<T>> & objects)
777 for (
const auto &
object : objects)
779 auto c =
dynamic_cast<const Coupleable *
>(
object.get());
783 needed_fe_var_vector_tags.insert(tag_deps.begin(), tag_deps.end());
788 template <
typename T>
791 std::unordered_set<unsigned int> & needed_mat_props,
793 const bool producer_only )
const 799 template <
typename T>
803 std::unordered_set<unsigned int> & needed_mat_props,
805 const bool producer_only )
const 811 template <
typename T>
814 std::unordered_set<unsigned int> & needed_mat_props,
816 const bool producer_only )
const 823 template <
typename T>
827 std::unordered_set<unsigned int> & needed_mat_props,
829 const bool producer_only )
const 836 template <
typename T>
839 std::unordered_set<unsigned int> & needed_mat_props,
840 const std::vector<std::shared_ptr<T>> & objects,
843 for (
auto &
object : objects)
849 needed_mat_props.insert(mp_deps.begin(), mp_deps.end());
854 template <
typename T>
857 std::set<std::string> & unique_variables,
862 unique_variables.insert(object->variable().name());
863 const auto additional_variables_covered =
object->additionalROVariables();
864 unique_variables.insert(additional_variables_covered.begin(),
865 additional_variables_covered.end());
869 subdomains_covered.insert(object_pair.first);
872 template <
typename T>
875 const THREAD_ID tid ,
const std::string & prefix )
const 877 std::vector<std::string> output;
879 output.push_back(object->name());
883 template <
typename T>
894 DependencyResolverInterface::sort<std::shared_ptr<T>>(objects);
898 DependencyResolverInterface::cyclicDependencyError<std::shared_ptr<T>>(
899 e,
"Cyclic dependency detected in object ordering");
903 template <
typename T>
908 "Attempting to access a thread id (" 909 << tid <<
") greater than the number allowed by the storage item (" virtual const std::unordered_set< unsigned int > & getMatPropDependencies() const
Retrieve the set of material properties that this object depends on.
std::string name(const ElemQuality q)
void updateVariableDependency(std::set< MooseVariableFieldBase *> &needed_moose_vars, THREAD_ID tid=0) const
Update variable dependency vector.
std::string activeObjectsToFormattedString(THREAD_ID tid=0, const std::string &prefix="[DBG]") const
Output the active content of the warehouse to a string, meant to be output to the console...
void sort(THREAD_ID tid=0)
Sort the objects using the DependencyResolver.
const std::set< MooseVariableFieldBase * > & getMooseVariableDependencies() const
Retrieve the set of MooseVariableFieldBase that this object depends on.
unsigned int size(THREAD_ID tid=0) const
Return how many kernels we store in the current warehouse.
bool hasObjectsForVariableAndBlocks(const VariableName &var_name, const std::set< SubdomainID > &blocks, std::set< SubdomainID > &blocks_covered, THREAD_ID tid) const
Whether there are objects for this variable and the set of blocks passed.
bool hasActiveBlockObjects(THREAD_ID tid=0) const
const std::map< SubdomainID, std::vector< std::shared_ptr< T > > > & getActiveBlockObjects(THREAD_ID tid=0) const
bool hasObjects(THREAD_ID tid=0) const
Convenience functions for determining if objects exist.
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
std::vector< std::map< SubdomainID, std::vector< std::shared_ptr< T > > > > _all_block_objects
std::vector< std::vector< std::shared_ptr< T > > > _all_objects
Storage container for the ALL pointers (THREAD_ID on outer vector)
std::vector< std::map< VariableName, std::vector< std::shared_ptr< T > > > > _all_variable_objects
All objects with a certain variable selected, as the 'variable' parameter.
std::vector< std::map< SubdomainID, std::vector< std::shared_ptr< T > > > > _active_block_objects
Active block restricted objects (THREAD_ID on outer vector)
void checkThreadID(THREAD_ID tid) const
Calls assert on thread id.
virtual ~MooseObjectWarehouseBase()
Destructor.
/class BoundaryRestrictable /brief Provides functionality for limiting the object to certain boundary...
MooseObjectWarehouseBase(bool threaded=true)
Constructor.
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.
This class provides an interface for common operations on field variables of both FE and FV types wit...
MaterialBase objects are special in that they have additional objects created automatically (see FEPr...
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...
void updateBlockVariableDependency(SubdomainID id, std::set< MooseVariableFieldBase *> &needed_moose_vars, THREAD_ID tid=0) const
void updateBoundaryFEVariableCoupledVectorTagDependency(BoundaryID id, std::set< TagID > &needed_fe_var_vector_tags, THREAD_ID tid=0) const
static void updateFEVariableCoupledVectorTagDependencyHelper(std::set< TagID > &needed_fe_var_vector_tags, const std::vector< std::shared_ptr< T >> &objects)
Helper method for updating FE variable coupleable vector tag vector.
bool hasBoundaryObjects(BoundaryID id, THREAD_ID tid=0) const
const std::vector< std::shared_ptr< T > > & getObjectsForVariable(const VariableName &var_name, THREAD_ID tid) const
Getter for objects that have the 'variable' set to a particular variable Note that users should check...
bool hasObjectsForVariable(const VariableName &var_name, THREAD_ID tid) const
bool hasActiveBoundaryObjects(THREAD_ID tid=0) const
std::vector< std::map< BoundaryID, std::vector< std::shared_ptr< T > > > > _active_boundary_objects
Active boundary restricted objects (THREAD_ID on outer vector)
const std::vector< std::shared_ptr< T > > & getActiveObjects(THREAD_ID tid=0) const
Retrieve complete vector to the active all/block/boundary restricted objects for a given thread...
virtual void updateMatPropDependencyHelper(std::unordered_set< unsigned int > &needed_mat_props, const std::vector< std::shared_ptr< MaterialBase >> &objects, const bool producer_only) const override
Helper method for updating material property dependency vector.
std::set< SubdomainID > getActiveBlocks(THREAD_ID tid=0) const
Return a set of active SubdomainsIDs.
std::shared_ptr< T > getActiveObject(const std::string &name, THREAD_ID tid=0) const
const std::vector< std::shared_ptr< T > > & getObjects(THREAD_ID tid=0) const
Retrieve complete vector to the all/block/boundary restricted objects for a given thread...
std::shared_ptr< T > getObject(const std::string &name, THREAD_ID tid=0) const
static void sortHelper(std::vector< std::shared_ptr< T >> &objects)
Helper method for sorting vectors of objects.
std::string formatString(std::string message, const std::string &prefix)
Add new lines and prefixes to a string for pretty display in output NOTE: This makes a copy of the st...
boundary_id_type BoundaryID
static void updateVariableDependencyHelper(std::set< MooseVariableFieldBase *> &needed_moose_vars, const std::vector< std::shared_ptr< T >> &objects)
Helper method for updating variable dependency vector.
void subdomainsCovered(std::set< SubdomainID > &subdomains_covered, std::set< std::string > &unique_variables, THREAD_ID tid=0) const
Populates a set of covered subdomains and the associated variable names.
const std::map< SubdomainID, std::vector< std::shared_ptr< T > > > & getBlockObjects(THREAD_ID tid=0) const
const std::map< BoundaryID, std::vector< std::shared_ptr< T > > > & getBoundaryObjects(THREAD_ID tid=0) const
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...
std::vector< std::map< BoundaryID, std::vector< std::shared_ptr< T > > > > _all_boundary_objects
void updateBlockMatPropDependency(SubdomainID id, std::unordered_set< unsigned int > &needed_mat_props, THREAD_ID tid=0, const bool producer_only=false) const
const std::map< BoundaryID, std::vector< std::shared_ptr< T > > > & getActiveBoundaryObjects(THREAD_ID tid=0) const
void updateBoundaryMatPropDependency(std::unordered_set< unsigned int > &needed_mat_props, THREAD_ID tid=0, const bool producer_only=false) const
const THREAD_ID _num_threads
Convenience member storing the number of threads used for storage (1 or libMesh::n_threads) ...
Interface for objects that needs coupling capabilities.
void updateBlockFEVariableCoupledVectorTagDependency(SubdomainID id, std::set< TagID > &needed_fe_var_vector_tags, THREAD_ID tid=0) const
Generic class for solving transient nonlinear problems.
bool hasActiveObject(const std::string &name, THREAD_ID tid=0) const
Convenience functions for checking/getting specific objects.
bool hasActiveObjects(THREAD_ID tid=0) const
An interface for accessing Materials.
void updateMatPropDependency(std::unordered_set< unsigned int > &needed_mat_props, THREAD_ID tid=0, const bool producer_only=false) const
Update material property dependency vector.
An interface that restricts an object to subdomains via the 'blocks' input parameter.
virtual void addObject(std::shared_ptr< T > object, THREAD_ID tid=0, bool recurse=true)
Adds an object to the storage structure.
void updateFEVariableCoupledVectorTagDependency(std::set< TagID > &needed_fe_var_vector_tags, THREAD_ID tid=0) const
Update FE variable coupleable vector tag vector for all objects, block-restricted objects...
std::vector< std::vector< std::shared_ptr< T > > > _active_objects
All active objects (THREAD_ID on outer vector)
void updateBoundaryVariableDependency(std::set< MooseVariableFieldBase *> &needed_moose_vars, THREAD_ID tid=0) const
THREAD_ID numThreads() const
Return the number of threads.
A base storage container for MooseObjects.
std::set< TagID > & getFEVariableCoupleableVectorTags()
virtual void updateMatPropDependencyHelper(std::unordered_set< unsigned int > &needed_mat_props, const std::vector< std::shared_ptr< T >> &objects, const bool producer_only) const
Helper method for updating material property dependency vector.
static void updateActiveHelper(std::vector< std::shared_ptr< T >> &active, const std::vector< std::shared_ptr< T >> &all)
Helper method for updating active vectors.
virtual void updateActive(THREAD_ID tid=0)
Updates the active objects storage.
virtual void updateActive(THREAD_ID tid=0) override
Update the active status of Kernels.