diff --git a/framework/include/base/FEProblemBase.h b/framework/include/base/FEProblemBase.h index ba7ab5ae57a5..b8be70cdc0b8 100644 --- a/framework/include/base/FEProblemBase.h +++ b/framework/include/base/FEProblemBase.h @@ -753,7 +753,7 @@ class FEProblemBase : public SubProblem, public Restartable * Get the vectors for a specific VectorPostprocessor. * @param vpp_name The name of the VectorPostprocessor */ - const std::map & + const std::vector> & getVectorPostprocessorVectors(const std::string & vpp_name); // Dampers ///// diff --git a/framework/include/vectorpostprocessors/VectorPostprocessorData.h b/framework/include/vectorpostprocessors/VectorPostprocessorData.h index 7fa4f80c14ce..a3c73dc0d543 100644 --- a/framework/include/vectorpostprocessors/VectorPostprocessorData.h +++ b/framework/include/vectorpostprocessors/VectorPostprocessorData.h @@ -71,12 +71,6 @@ class VectorPostprocessorData : public Restartable getVectorPostprocessorValueOld(const VectorPostprocessorName & vpp_name, const std::string & vector_name); - /** - * Get the map of names -> VectorPostprocessor values. Exposed for error checking. - */ - // const std::map > & values() - // const { return _values; } - /** * Check to see if a VPP has any vectors at all */ @@ -86,7 +80,7 @@ class VectorPostprocessorData : public Restartable * Get the map of vectors for a particular VectorPostprocessor * @param vpp_name The name of the VectorPostprocessor */ - const std::map & + const std::vector> & vectors(const std::string & vpp_name) const; /** @@ -100,7 +94,7 @@ class VectorPostprocessorData : public Restartable bool get_current); /// Values of the vector post-processor - std::map> _values; + std::map>> _values; std::set _requested_items; std::set _supplied_items; diff --git a/framework/src/base/FEProblemBase.C b/framework/src/base/FEProblemBase.C index 6757d4eaea9e..c030a65b86cf 100644 --- a/framework/src/base/FEProblemBase.C +++ b/framework/src/base/FEProblemBase.C @@ -2569,7 +2569,7 @@ FEProblemBase::declareVectorPostprocessorVector(const VectorPostprocessorName & return _vpps_data.declareVector(name, vector_name); } -const std::map & +const std::vector> & FEProblemBase::getVectorPostprocessorVectors(const std::string & vpp_name) { return _vpps_data.vectors(vpp_name); diff --git a/framework/src/vectorpostprocessors/VectorPostprocessorData.C b/framework/src/vectorpostprocessors/VectorPostprocessorData.C index 6260055d7ed6..1547c55b1933 100644 --- a/framework/src/vectorpostprocessors/VectorPostprocessorData.C +++ b/framework/src/vectorpostprocessors/VectorPostprocessorData.C @@ -58,9 +58,24 @@ VectorPostprocessorData::getVectorPostprocessorHelper(const VectorPostprocessorN const std::string & vector_name, bool get_current) { - // Intentional use of RHS brackets on a std::map to do a multilevel retrieve or insert - auto & vec_struct = _values[vpp_name][vector_name]; + // Intentional use of RHS brackets on a std::map to do a retrieve or insert + auto & vec_storage = _values[vpp_name]; + // lambda for doing compairison on name (i.e., first item in pair) + auto comp = [&vector_name](std::pair & pair) { + return pair.first == vector_name; + }; + + // Search for the vector, if it is not located create the entry in the storage + auto iter = std::find_if(vec_storage.begin(), vec_storage.end(), comp); + if (iter == vec_storage.end()) + { + vec_storage.emplace_back( + std::pair(vector_name, VectorPostprocessorState())); + iter = vec_storage.end() - 1; // can't use rbegin() because we need a forward iterator + } + + auto & vec_struct = iter->second; if (!vec_struct.current) { mooseAssert(!vec_struct.old, "Uninitialized pointers in VectorPostprocessor Data"); @@ -79,7 +94,7 @@ VectorPostprocessorData::hasVectors(const std::string & vpp_name) const return _values.find(vpp_name) != _values.end(); } -const std::map & +const std::vector> & VectorPostprocessorData::vectors(const std::string & vpp_name) const { auto vec_pair = _values.find(vpp_name);