https://mooseframework.inl.gov
Loading...
Searching...
No Matches
MooseObjectWarehouseBase.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// MOOSE includes
15#include "BlockRestrictable.h"
16#include "TransientInterface.h"
17#include "Coupleable.h"
20#include "SubProblem.h"
21#include "MooseApp.h"
22
23// Forward declarations
25
29template <typename T>
31{
32public:
37 MooseObjectWarehouseBase(bool threaded = true);
38
43
49 virtual void addObject(std::shared_ptr<T> object, THREAD_ID tid = 0, bool recurse = true);
50
54 unsigned int size(THREAD_ID tid = 0) const;
55
57
61 const std::vector<std::shared_ptr<T>> & getObjects(THREAD_ID tid = 0) const;
62 const std::map<SubdomainID, std::vector<std::shared_ptr<T>>> &
63 getBlockObjects(THREAD_ID tid = 0) const;
64 const std::vector<std::shared_ptr<T>> & getBlockObjects(SubdomainID id, THREAD_ID tid = 0) const;
65 const std::map<BoundaryID, std::vector<std::shared_ptr<T>>> &
67 const std::vector<std::shared_ptr<T>> & getBoundaryObjects(BoundaryID id,
68 THREAD_ID tid = 0) const;
70
72
77 const std::vector<std::shared_ptr<T>> & getActiveObjects(THREAD_ID tid = 0) const;
78 const std::map<SubdomainID, std::vector<std::shared_ptr<T>>> &
80 const std::vector<std::shared_ptr<T>> & getActiveBlockObjects(SubdomainID id,
81 THREAD_ID tid = 0) const;
82 const std::map<BoundaryID, std::vector<std::shared_ptr<T>>> &
84 const std::vector<std::shared_ptr<T>> & getActiveBoundaryObjects(BoundaryID id,
85 THREAD_ID tid = 0) const;
87
89
92 bool hasObjects(THREAD_ID tid = 0) const;
93 bool hasActiveObjects(THREAD_ID tid = 0) const;
94 bool hasObjectsForVariable(const VariableName & var_name, THREAD_ID tid) const;
95 bool hasActiveBlockObjects(THREAD_ID tid = 0) const;
99 bool hasBoundaryObjects(THREAD_ID tid = 0) const;
100 bool hasBoundaryObjects(BoundaryID id, THREAD_ID tid = 0) const;
102
109 bool hasObjectsForVariableAndBlocks(const VariableName & var_name,
110 const std::set<SubdomainID> & blocks,
111 std::set<SubdomainID> & blocks_covered,
112 THREAD_ID tid) const;
113
117 std::set<SubdomainID> getActiveBlocks(THREAD_ID tid = 0) const;
118
120
123 bool hasActiveObject(const std::string & name, THREAD_ID tid = 0) const;
124 std::shared_ptr<T> getObject(const std::string & name, THREAD_ID tid = 0) const;
125 std::shared_ptr<T> getActiveObject(const std::string & name, THREAD_ID tid = 0) const;
127
131 const std::vector<std::shared_ptr<T>> & getObjectsForVariable(const VariableName & var_name,
132 THREAD_ID tid) const;
133
137 virtual void updateActive(THREAD_ID tid = 0);
138
142 void sort(THREAD_ID tid = 0);
143
145
148 void updateVariableDependency(std::set<MooseVariableFieldBase *> & needed_moose_vars,
149 THREAD_ID tid = 0) const;
151 std::set<MooseVariableFieldBase *> & needed_moose_vars,
152 THREAD_ID tid = 0) const;
153 void updateBoundaryVariableDependency(std::set<MooseVariableFieldBase *> & needed_moose_vars,
154 THREAD_ID tid = 0) const;
156 std::set<MooseVariableFieldBase *> & needed_moose_vars,
157 THREAD_ID tid = 0) const;
159
161
165 void updateFEVariableCoupledVectorTagDependency(std::set<TagID> & needed_fe_var_vector_tags,
166 THREAD_ID tid = 0) const;
168 std::set<TagID> & needed_fe_var_vector_tags,
169 THREAD_ID tid = 0) const;
171 BoundaryID id, std::set<TagID> & needed_fe_var_vector_tags, THREAD_ID tid = 0) const;
173
175
179 void updateMatPropDependency(std::unordered_set<unsigned int> & needed_mat_props,
180 THREAD_ID tid = 0,
181 const bool producer_only = false) const;
183 std::unordered_set<unsigned int> & needed_mat_props,
184 THREAD_ID tid = 0,
185 const bool producer_only = false) const;
186 void updateBoundaryMatPropDependency(std::unordered_set<unsigned int> & needed_mat_props,
187 THREAD_ID tid = 0,
188 const bool producer_only = false) const;
190 std::unordered_set<unsigned int> & needed_mat_props,
191 THREAD_ID tid = 0,
192 const bool producer_only = false) const;
194
198 void subdomainsCovered(std::set<SubdomainID> & subdomains_covered,
199 std::set<std::string> & unique_variables,
200 THREAD_ID tid = 0) const;
201
206
213 const std::string & prefix = "[DBG]") const;
214
215protected:
218
220 std::vector<std::vector<std::shared_ptr<T>>> _all_objects;
221
223 std::vector<std::vector<std::shared_ptr<T>>> _active_objects;
224
225 // All block restricted objects (THREAD_ID on outer vector)
226 std::vector<std::map<SubdomainID, std::vector<std::shared_ptr<T>>>> _all_block_objects;
227
229 std::vector<std::map<SubdomainID, std::vector<std::shared_ptr<T>>>> _active_block_objects;
230
231 // All boundary restricted objects (THREAD_ID on outer vector)
232 std::vector<std::map<BoundaryID, std::vector<std::shared_ptr<T>>>> _all_boundary_objects;
233
235 std::vector<std::map<BoundaryID, std::vector<std::shared_ptr<T>>>> _active_boundary_objects;
236
238 std::vector<std::map<VariableName, std::vector<std::shared_ptr<T>>>> _all_variable_objects;
239
243 static void updateActiveHelper(std::vector<std::shared_ptr<T>> & active,
244 const std::vector<std::shared_ptr<T>> & all);
245
249 static void sortHelper(std::vector<std::shared_ptr<T>> & objects);
250
254 static void updateVariableDependencyHelper(std::set<MooseVariableFieldBase *> & needed_moose_vars,
255 const std::vector<std::shared_ptr<T>> & objects);
256
260 static void
261 updateFEVariableCoupledVectorTagDependencyHelper(std::set<TagID> & needed_fe_var_vector_tags,
262 const std::vector<std::shared_ptr<T>> & objects);
263
267 virtual void updateMatPropDependencyHelper(std::unordered_set<unsigned int> & needed_mat_props,
268 const std::vector<std::shared_ptr<T>> & objects,
269 const bool producer_only) const;
270
274 void checkThreadID(THREAD_ID tid) const;
275
280 const std::vector<std::map<BoundaryID, std::vector<std::shared_ptr<T>>>> & boundary_objects,
281 const THREAD_ID tid = 0) const;
282
283 friend class MaterialWarehouse;
284};
285
286template <typename T>
298
299template <typename T>
303
304template <typename T>
305unsigned int
307{
308 checkThreadID(tid);
309 return _all_objects[tid].size();
310}
311
312template <typename T>
313void
315 THREAD_ID tid /*= 0*/,
316 bool /* recurse = true */)
317{
318 checkThreadID(tid);
319
320 // Stores object in list of all objects
321 _all_objects[tid].push_back(object);
322
323 // If enabled, store object in a list of all active
324 bool enabled = object->enabled();
325 if (enabled)
326 _active_objects[tid].push_back(object);
327
328 // Perform casts to the Block/BoundaryRestrictable
329 std::shared_ptr<BoundaryRestrictable> bnd =
330 std::dynamic_pointer_cast<BoundaryRestrictable>(object);
331 std::shared_ptr<BlockRestrictable> blk = std::dynamic_pointer_cast<BlockRestrictable>(object);
332
333 // Boundary Restricted
334 if (bnd && bnd->boundaryRestricted())
335 {
336 const std::set<BoundaryID> & ids = bnd->boundaryIDs();
337 for (std::set<BoundaryID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
338 {
339 _all_boundary_objects[tid][*it].push_back(object);
340 if (enabled)
341 _active_boundary_objects[tid][*it].push_back(object);
342 }
343 }
344
345 // Block Restricted
346 else if (blk)
347 {
348 const std::set<SubdomainID> & ids =
349 blk->blockRestricted() ? blk->blockIDs() : blk->meshBlockIDs();
350 for (std::set<SubdomainID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
351 {
352 _all_block_objects[tid][*it].push_back(object);
353 if (enabled)
354 _active_block_objects[tid][*it].push_back(object);
355 }
356
357 // Check variables
358 std::shared_ptr<Coupleable> c_ptr = std::dynamic_pointer_cast<Coupleable>(object);
359 if (c_ptr)
360 for (MooseVariableFieldBase * var : c_ptr->getCoupledMooseVars())
361 blk->checkVariable(*var);
362
363 const InputParameters & parameters = object->parameters();
364
365 SubProblem & problem = *parameters.get<SubProblem *>("_subproblem");
366
367 THREAD_ID tid = parameters.get<THREAD_ID>("_tid");
368
369 if (parameters.isParamValid("variable"))
370 {
371 // Try the scalar version first
372 std::string variable_name = parameters.getMooseType("variable");
373 if (variable_name == "")
374 // When using vector variables, we are only going to use the first one in the list at the
375 // interface level...
376 variable_name = parameters.getVecMooseType("variable")[0];
377
378 blk->checkVariable(problem.getVariable(
380
381 _all_variable_objects[tid][variable_name].push_back(object);
382 }
383 }
384}
385
386template <typename T>
387inline const std::vector<std::shared_ptr<T>> &
389{
390 checkThreadID(tid);
391 return _all_objects[tid];
392}
393
394template <typename T>
395inline const std::map<BoundaryID, std::vector<std::shared_ptr<T>>> &
401
402template <typename T>
403bool
405{
406 checkThreadID(tid);
407 return _all_boundary_objects[tid].find(id) != _all_boundary_objects[tid].end();
408}
409
410template <typename T>
411const std::vector<std::shared_ptr<T>> &
413{
414 checkThreadID(tid);
415 const auto iter = _all_boundary_objects[tid].find(id);
416 mooseAssert(iter != _all_boundary_objects[tid].end(),
417 "Unable to located active boundary objects for the given id: " << id << ".");
418 return iter->second;
419}
420
421template <typename T>
422inline const std::map<SubdomainID, std::vector<std::shared_ptr<T>>> &
424{
425 checkThreadID(tid);
426 return _all_block_objects[tid];
427}
428
429template <typename T>
430const std::vector<std::shared_ptr<T>> &
432{
433 checkThreadID(tid);
434 const auto iter = _all_block_objects[tid].find(id);
435 mooseAssert(iter != _all_block_objects[tid].end(),
436 "Unable to located active block objects for the given id: " << id << ".");
437 return iter->second;
438}
439
440template <typename T>
441inline const std::vector<std::shared_ptr<T>> &
443{
444 checkThreadID(tid);
445 return _active_objects[tid];
446}
447
448template <typename T>
449inline const std::map<BoundaryID, std::vector<std::shared_ptr<T>>> &
455
456template <typename T>
457const std::vector<std::shared_ptr<T>> &
459{
460 checkThreadID(tid);
461 const auto iter = _active_boundary_objects[tid].find(id);
462 mooseAssert(iter != _active_boundary_objects[tid].end(),
463 "Unable to located active boundary objects for the given id: " << id << ".");
464 return iter->second;
465}
466
467template <typename T>
468inline const std::map<SubdomainID, std::vector<std::shared_ptr<T>>> &
474
475template <typename T>
476const std::vector<std::shared_ptr<T>> &
478{
479 checkThreadID(tid);
480 const auto iter = _active_block_objects[tid].find(id);
481 mooseAssert(iter != _active_block_objects[tid].end(),
482 "Unable to located active block objects for the given id: " << id << ".");
483 return iter->second;
484}
485
486template <typename T>
487bool
489{
490 checkThreadID(tid);
491 return !_all_objects[tid].empty();
492}
493
494template <typename T>
495bool
497{
498 checkThreadID(tid);
499 return !_active_objects[tid].empty();
500}
501
502template <typename T>
503bool
505 THREAD_ID tid) const
506{
507 checkThreadID(tid);
508 return _all_variable_objects[tid].count(var_name);
509}
510
511template <typename T>
512bool
514 const std::set<SubdomainID> & blocks,
515 std::set<SubdomainID> & blocks_covered,
516 THREAD_ID tid /* = 0*/) const
517{
518 checkThreadID(tid);
519 blocks_covered.clear();
520 if (!hasObjectsForVariable(var_name, tid))
521 return false;
522
523 // Check block restriction as a whole
524 for (const auto & object : libmesh_map_find(_all_variable_objects[tid], var_name))
525 {
526 std::shared_ptr<BlockRestrictable> blk = std::dynamic_pointer_cast<BlockRestrictable>(object);
527 if (blk && blk->hasBlocks(blocks))
528 {
529 blocks_covered = blocks;
530 return true;
531 }
532 }
533 // No object has all the blocks, but one might overlap, which could be troublesome.
534 // We'll keep track of which blocks are covered in case several overlap
535 for (const auto & object : libmesh_map_find(_all_variable_objects[tid], var_name))
536 {
537 std::shared_ptr<BlockRestrictable> blk = std::dynamic_pointer_cast<BlockRestrictable>(object);
538 if (blk)
539 for (const auto & block : blocks)
540 if (blk->hasBlocks(block))
541 blocks_covered.insert(block);
542 }
543 // No overlap at all
544 if (blocks_covered.empty())
545 return false;
546
547 return (blocks == blocks_covered);
548}
549
550template <typename T>
551bool
553{
554 checkThreadID(tid);
555 bool has_active_block_objects = false;
556 for (const auto & object_pair : _active_block_objects[tid])
557 has_active_block_objects |= !(object_pair.second.empty());
558 return has_active_block_objects;
559}
560
561template <typename T>
562bool
564{
565 checkThreadID(tid);
566 const auto iter = _active_block_objects[tid].find(id);
567 return iter != _active_block_objects[tid].end();
568}
569
570template <typename T>
571bool
573 const std::vector<std::map<BoundaryID, std::vector<std::shared_ptr<T>>>> & boundary_objects,
574 THREAD_ID tid /* = 0*/) const
575{
576 checkThreadID(tid);
577 bool has_boundary_objects = false;
578 for (const auto & object_pair : boundary_objects[tid])
579 has_boundary_objects |= !(object_pair.second.empty());
580 return has_boundary_objects;
581}
582
583template <typename T>
584bool
589
590template <typename T>
591bool
596
597template <typename T>
598bool
600{
601 checkThreadID(tid);
602 const auto iter = _active_boundary_objects[tid].find(id);
603 return iter != _active_boundary_objects[tid].end();
604}
605
606template <typename T>
607bool
608MooseObjectWarehouseBase<T>::hasActiveObject(const std::string & name, THREAD_ID tid /* = 0*/) const
609{
610 checkThreadID(tid);
611 for (const auto & object : _active_objects[tid])
612 if (object->name() == name)
613 return true;
614 return false;
615}
616
617template <typename T>
618std::shared_ptr<T>
619MooseObjectWarehouseBase<T>::getObject(const std::string & name, THREAD_ID tid /* = 0*/) const
620{
621 checkThreadID(tid);
622 for (const auto & object : _all_objects[tid])
623 if (object->name() == name)
624 return object;
625 mooseError("Unable to locate object: ", name, ".");
626}
627
628template <typename T>
629std::shared_ptr<T>
630MooseObjectWarehouseBase<T>::getActiveObject(const std::string & name, THREAD_ID tid /* = 0*/) const
631{
632 checkThreadID(tid);
633 for (const auto & object : _active_objects[tid])
634 if (object->name() == name)
635 return object;
636 mooseError("Unable to locate active object: ", name, ".");
637}
638
639template <typename T>
640const std::vector<std::shared_ptr<T>> &
642 THREAD_ID tid /* = 0*/) const
643{
644 return libmesh_map_find(_all_variable_objects[tid], var_name);
645}
646
647template <typename T>
648std::set<SubdomainID>
650{
651 checkThreadID(tid);
652 std::set<SubdomainID> ids;
653 for (const auto & object_pair : _active_block_objects[tid])
654 ids.insert(object_pair.first);
655 return ids;
656}
657
658template <typename T>
659void
661{
662 checkThreadID(tid);
663
665
666 for (const auto & object_pair : _all_block_objects[tid])
667 updateActiveHelper(_active_block_objects[tid][object_pair.first], object_pair.second);
668
669 for (const auto & object_pair : _all_boundary_objects[tid])
670 updateActiveHelper(_active_boundary_objects[tid][object_pair.first], object_pair.second);
671}
672
673template <typename T>
674void
675MooseObjectWarehouseBase<T>::updateActiveHelper(std::vector<std::shared_ptr<T>> & active,
676 const std::vector<std::shared_ptr<T>> & all)
677{
678 // Clear the active list
679 active.clear();
680
681 std::copy_if(all.begin(),
682 all.end(),
683 std::back_inserter(active),
684 [](const std::shared_ptr<T> & object) { return object->enabled(); });
685}
686
687template <typename T>
688void
690{
691 checkThreadID(tid);
692
693 for (auto & object_pair : _all_block_objects[tid])
694 sortHelper(object_pair.second);
695
696 for (auto & object_pair : _all_boundary_objects[tid])
697 sortHelper(object_pair.second);
698
700
701 // The active lists now must be update to reflect the order changes
702 updateActive(tid);
703}
704
705template <typename T>
706void
708 std::set<MooseVariableFieldBase *> & needed_moose_vars, THREAD_ID tid /* = 0*/) const
709{
710 if (hasActiveObjects(tid))
711 updateVariableDependencyHelper(needed_moose_vars, _active_objects[tid]);
712}
713
714template <typename T>
715void
717 SubdomainID id,
718 std::set<MooseVariableFieldBase *> & needed_moose_vars,
719 THREAD_ID tid /* = 0*/) const
720{
721 if (hasActiveBlockObjects(id, tid))
722 updateVariableDependencyHelper(needed_moose_vars, getActiveBlockObjects(id, tid));
723}
724
725template <typename T>
726void
728 std::set<MooseVariableFieldBase *> & needed_moose_vars, THREAD_ID tid /* = 0*/) const
729{
731 {
732 typename std::map<BoundaryID, std::vector<std::shared_ptr<T>>>::const_iterator it;
733 for (const auto & object_pair : _active_boundary_objects[tid])
734 updateVariableDependencyHelper(needed_moose_vars, object_pair.second);
735 }
736}
737
738template <typename T>
739void
741 BoundaryID id,
742 std::set<MooseVariableFieldBase *> & needed_moose_vars,
743 THREAD_ID tid /* = 0*/) const
744{
745 if (hasActiveBoundaryObjects(id, tid))
746 updateVariableDependencyHelper(needed_moose_vars, getActiveBoundaryObjects(id, tid));
747}
748
749template <typename T>
750void
752 std::set<MooseVariableFieldBase *> & needed_moose_vars,
753 const std::vector<std::shared_ptr<T>> & objects)
754{
755 for (const auto & object : objects)
756 {
757 auto c = dynamic_cast<const MooseVariableDependencyInterface *>(object.get());
758 if (c)
759 {
760 const auto & mv_deps = c->getMooseVariableDependencies();
761 needed_moose_vars.insert(mv_deps.begin(), mv_deps.end());
762 }
763 }
764}
765
766template <typename T>
767void
769 std::set<TagID> & needed_fe_var_vector_tags, THREAD_ID tid /* = 0*/) const
770{
771 if (hasActiveObjects(tid))
772 updateFEVariableCoupledVectorTagDependencyHelper(needed_fe_var_vector_tags,
773 _active_objects[tid]);
774}
775
776template <typename T>
777void
779 SubdomainID id, std::set<TagID> & needed_fe_var_vector_tags, THREAD_ID tid /* = 0*/) const
780{
781 if (hasActiveBlockObjects(id, tid))
782 updateFEVariableCoupledVectorTagDependencyHelper(needed_fe_var_vector_tags,
783 getActiveBlockObjects(id, tid));
784}
785
786template <typename T>
787void
789 BoundaryID id, std::set<TagID> & needed_fe_var_vector_tags, THREAD_ID tid /* = 0*/) const
790{
791 if (hasActiveBoundaryObjects(id, tid))
792 updateFEVariableCoupledVectorTagDependencyHelper(needed_fe_var_vector_tags,
793 getActiveBoundaryObjects(id, tid));
794}
795
796template <typename T>
797void
799 std::set<TagID> & needed_fe_var_vector_tags, const std::vector<std::shared_ptr<T>> & objects)
800{
801 for (const auto & object : objects)
802 {
803 auto c = dynamic_cast<const Coupleable *>(object.get());
804 if (c)
805 {
806 const auto & tag_deps = c->getFEVariableCoupleableVectorTags();
807 needed_fe_var_vector_tags.insert(tag_deps.begin(), tag_deps.end());
808 }
809 }
810}
811
812template <typename T>
813void
815 std::unordered_set<unsigned int> & needed_mat_props,
816 THREAD_ID tid /* = 0*/,
817 const bool producer_only /* = false*/) const
818{
819 if (hasActiveObjects(tid))
820 updateMatPropDependencyHelper(needed_mat_props, _active_objects[tid], producer_only);
821}
822
823template <typename T>
824void
826 SubdomainID id,
827 std::unordered_set<unsigned int> & needed_mat_props,
828 THREAD_ID tid /* = 0*/,
829 const bool producer_only /* = false*/) const
830{
831 if (hasActiveBlockObjects(id, tid))
832 updateMatPropDependencyHelper(needed_mat_props, getActiveBlockObjects(id, tid), producer_only);
833}
834
835template <typename T>
836void
838 std::unordered_set<unsigned int> & needed_mat_props,
839 THREAD_ID tid /* = 0*/,
840 const bool producer_only /* = false*/) const
841{
843 for (auto & active_bnd_object : _active_boundary_objects[tid])
844 updateMatPropDependencyHelper(needed_mat_props, active_bnd_object.second, producer_only);
845}
846
847template <typename T>
848void
850 BoundaryID id,
851 std::unordered_set<unsigned int> & needed_mat_props,
852 THREAD_ID tid /* = 0*/,
853 const bool producer_only /* = false*/) const
854{
855 if (hasActiveBoundaryObjects(id, tid))
857 needed_mat_props, getActiveBoundaryObjects(id, tid), producer_only);
858}
859
860template <typename T>
861void
863 std::unordered_set<unsigned int> & needed_mat_props,
864 const std::vector<std::shared_ptr<T>> & objects,
865 const bool /* producer_only */) const
866{
867 for (auto & object : objects)
868 {
869 auto c = dynamic_cast<const MaterialPropertyInterface *>(object.get());
870 if (c)
871 {
872 auto & mp_deps = c->getMatPropDependencies();
873 needed_mat_props.insert(mp_deps.begin(), mp_deps.end());
874 }
875 }
876}
877
878template <typename T>
879void
880MooseObjectWarehouseBase<T>::subdomainsCovered(std::set<SubdomainID> & subdomains_covered,
881 std::set<std::string> & unique_variables,
882 THREAD_ID tid /*=0*/) const
883{
884 for (const auto & object : _active_objects[tid])
885 {
886 unique_variables.insert(object->variable().name());
887 const auto additional_variables_covered = object->additionalROVariables();
888 unique_variables.insert(additional_variables_covered.begin(),
889 additional_variables_covered.end());
890 }
891
892 for (const auto & object_pair : _active_block_objects[tid])
893 subdomains_covered.insert(object_pair.first);
894}
895
896template <typename T>
897std::string
899 const THREAD_ID tid /*=0*/, const std::string & prefix /*="[DBG]"*/) const
900{
901 std::vector<std::string> output;
902 for (const auto & object : _active_objects[tid])
903 output.push_back(object->name());
904 return ConsoleUtils::formatString(MooseUtils::join(output, " "), prefix);
905}
906
907template <typename T>
908void
909MooseObjectWarehouseBase<T>::sortHelper(std::vector<std::shared_ptr<T>> & objects)
910{
911 // Do nothing if the vector is empty
912 if (objects.empty())
913 return;
914
915 try
916 {
917 // Sort based on dependencies
918 DependencyResolverInterface::sort<std::shared_ptr<T>>(objects);
919 }
920 catch (CyclicDependencyException<std::shared_ptr<T>> & e)
921 {
922 DependencyResolverInterface::cyclicDependencyError<std::shared_ptr<T>>(
923 e, "Cyclic dependency detected in object ordering");
924 }
925}
926
927template <typename T>
928inline void
930{
931 mooseAssert(tid < _num_threads,
932 "Attempting to access a thread id ("
933 << tid << ") greater than the number allowed by the storage item ("
934 << _num_threads << ")");
935}
boundary_id_type BoundaryID
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application.
Definition MooseError.h:311
unsigned int THREAD_ID
Definition MooseTypes.h:237
char ** blocks
Interface for objects that needs coupling capabilities.
Definition Coupleable.h:53
std::set< TagID > & getFEVariableCoupleableVectorTags()
Definition Coupleable.h:120
The main MOOSE class responsible for handling user-defined parameters in almost every MOOSE system.
std::string getMooseType(const std::string &name) const
Utility functions for retrieving one of the MooseTypes variables into the common "string" base class.
std::vector< std::string > getVecMooseType(const std::string &name) const
std::vector< std::pair< R1, R2 > > get(const std::string &param1, const std::string &param2) const
Combine two vector parameters into a single vector of pairs.
bool isParamValid(const std::string &name) const
This method returns parameters that have been initialized in one fashion or another,...
An interface for accessing Materials.
virtual const std::unordered_set< unsigned int > & getMatPropDependencies() const
Retrieve the set of material properties that this object depends on.
MaterialBase objects are special in that they have additional objects created automatically (see FEPr...
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.
virtual void updateActive(THREAD_ID tid=0) override
Update the active status of Kernels.
A base storage container for MooseObjects.
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...
void updateVariableDependency(std::set< MooseVariableFieldBase * > &needed_moose_vars, THREAD_ID tid=0) const
Update variable dependency vector.
static void sortHelper(std::vector< std::shared_ptr< T > > &objects)
Helper method for sorting vectors of objects.
bool hasActiveBoundaryObjects(BoundaryID id, THREAD_ID tid=0) const
std::vector< std::vector< std::shared_ptr< T > > > _all_objects
Storage container for the ALL pointers (THREAD_ID on outer vector)
unsigned int size(THREAD_ID tid=0) const
Return how many kernels we store in the current warehouse.
void updateBoundaryMatPropDependency(BoundaryID id, std::unordered_set< unsigned int > &needed_mat_props, THREAD_ID tid=0, const bool producer_only=false) const
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.
static void updateVariableDependencyHelper(std::set< MooseVariableFieldBase * > &needed_moose_vars, const std::vector< std::shared_ptr< T > > &objects)
Helper method for updating variable dependency vector.
const std::map< SubdomainID, std::vector< std::shared_ptr< T > > > & getBlockObjects(THREAD_ID tid=0) const
const std::vector< std::shared_ptr< T > > & getBoundaryObjects(BoundaryID id, THREAD_ID tid=0) const
std::shared_ptr< T > getActiveObject(const std::string &name, THREAD_ID tid=0) const
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.
virtual ~MooseObjectWarehouseBase()
Destructor.
bool hasBoundaryObjects(THREAD_ID tid=0) const
std::set< SubdomainID > getActiveBlocks(THREAD_ID tid=0) const
Return a set of active SubdomainsIDs.
const std::map< SubdomainID, std::vector< std::shared_ptr< T > > > & getActiveBlockObjects(THREAD_ID tid=0) const
std::vector< std::vector< std::shared_ptr< T > > > _active_objects
All active objects (THREAD_ID on outer vector)
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.
void updateBoundaryVariableDependency(BoundaryID id, std::set< MooseVariableFieldBase * > &needed_moose_vars, THREAD_ID tid=0) const
virtual void updateActive(THREAD_ID tid=0)
Updates the active objects storage.
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< BoundaryID, std::vector< std::shared_ptr< T > > > > _all_boundary_objects
bool hasActiveObject(const std::string &name, THREAD_ID tid=0) const
Convenience functions for checking/getting specific objects.
bool hasBoundaryObjectsHelper(const std::vector< std::map< BoundaryID, std::vector< std::shared_ptr< T > > > > &boundary_objects, const THREAD_ID tid=0) const
Helper for determining whether we have boundary objects.
const std::vector< std::shared_ptr< T > > & getActiveBoundaryObjects(BoundaryID id, THREAD_ID tid=0) const
std::vector< std::map< SubdomainID, std::vector< std::shared_ptr< T > > > > _active_block_objects
Active block restricted objects (THREAD_ID on outer vector)
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,...
bool hasActiveBlockObjects(SubdomainID id, THREAD_ID tid=0) const
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.
void sort(THREAD_ID tid=0)
Sort the objects using the DependencyResolver.
void updateBoundaryFEVariableCoupledVectorTagDependency(BoundaryID id, std::set< TagID > &needed_fe_var_vector_tags, THREAD_ID tid=0) const
MooseObjectWarehouseBase(bool threaded=true)
Constructor.
void updateBlockMatPropDependency(SubdomainID id, std::unordered_set< unsigned int > &needed_mat_props, THREAD_ID tid=0, const bool producer_only=false) 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 THREAD_ID _num_threads
Convenience member storing the number of threads used for storage (1 or libMesh::n_threads)
virtual void addObject(std::shared_ptr< T > object, THREAD_ID tid=0, bool recurse=true)
Adds an object to the storage structure.
void updateBlockFEVariableCoupledVectorTagDependency(SubdomainID id, std::set< TagID > &needed_fe_var_vector_tags, THREAD_ID tid=0) const
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.
void updateBoundaryVariableDependency(std::set< MooseVariableFieldBase * > &needed_moose_vars, THREAD_ID tid=0) const
void updateBlockVariableDependency(SubdomainID id, std::set< MooseVariableFieldBase * > &needed_moose_vars, THREAD_ID tid=0) const
bool hasActiveObjects(THREAD_ID tid=0) const
const std::map< BoundaryID, std::vector< std::shared_ptr< T > > > & getActiveBoundaryObjects(THREAD_ID tid=0) const
bool hasActiveBlockObjects(THREAD_ID tid=0) const
std::vector< std::map< SubdomainID, std::vector< std::shared_ptr< T > > > > _all_block_objects
void updateBoundaryMatPropDependency(std::unordered_set< unsigned int > &needed_mat_props, THREAD_ID tid=0, const bool producer_only=false) const
THREAD_ID numThreads() const
Return the number of threads.
bool hasActiveBoundaryObjects(THREAD_ID tid=0) const
static void updateActiveHelper(std::vector< std::shared_ptr< T > > &active, const std::vector< std::shared_ptr< T > > &all)
Helper method for updating active vectors.
bool hasBoundaryObjects(BoundaryID id, THREAD_ID tid=0) const
bool hasObjects(THREAD_ID tid=0) const
Convenience functions for determining if objects exist.
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.
std::shared_ptr< T > getObject(const std::string &name, THREAD_ID tid=0) const
const std::map< BoundaryID, std::vector< std::shared_ptr< T > > > & getBoundaryObjects(THREAD_ID tid=0) const
const std::vector< std::shared_ptr< T > > & getActiveBlockObjects(SubdomainID id, THREAD_ID tid=0) const
bool hasObjectsForVariable(const VariableName &var_name, THREAD_ID tid) const
const std::vector< std::shared_ptr< T > > & getBlockObjects(SubdomainID id, THREAD_ID tid=0) const
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.
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.
void checkThreadID(THREAD_ID tid) const
Calls assert on thread id.
const std::set< MooseVariableFieldBase * > & getMooseVariableDependencies() const
Retrieve the set of MooseVariableFieldBase that this object depends on.
This class provides an interface for common operations on field variables of both FE and FV types wit...
Generic class for solving transient nonlinear problems.
Definition SubProblem.h:79
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::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...
@ VAR_FIELD_ANY
Definition MooseTypes.h:781
@ VAR_ANY
Definition MooseTypes.h:772
The following methods are specializations for using the libMesh::Parallel::packed_range_* routines fo...