The warehouse objects (based on MooseObjectWarehouseBase) in MOOSE hold onto the objects that are built by the factory. They are templated so they can hold any of the types of objects the Factory can build.
The main purpose is to accelerate retrieval of sets of objects needed during assembly. To this end, they have many accessors on them such as
getActiveObjects(). Internally, these sets of objects are cached to make retrieval quick.
Work is currently being undertaken to migrate MOOSE to use a new warehouse architecture. UserObjects have already been migrated. In the new architecture there is only a single warehouse instance (TheWarehouse) through which all object queries can be made.
TheWarehouse is a class that holds and manages memory for MooseObjects - allowing flexible querying to select subsets of objects. TheWarehouse stores customizeable meta-data for each object that queries operate on. In general, meta-data is treated as static and not updated after objects have been added. Results are cached and reused for repeated identical queries. For more information on the API and usage, see the doxygen documentation here.
MooseObjectWarehouse is based on
MooseObjectWarehouseBase but adds important functionality for objects that support the SetupInterface. In addition, there is a bit of functionality there for holding sets of Kernels that go with each
MooseVariable to make retrieving them quick for Jacobian calculations.
There is some trickiness in
addObject(). To support
getActiveVariableBlockObjects() we want to have a
Warehouse for each variable Kernel's are acting on. To do that, we have nested
MooseObjectWarehouses which we add to in
addObject(). However, we need the recursion to stop after one level so we can pass
recurse = false to keep it from recursing to death.