From fd6d56549ddf7d4322c5fc0b258c01f9e4916c63 Mon Sep 17 00:00:00 2001 From: jdolence Date: Fri, 11 Aug 2023 10:25:57 -0600 Subject: [PATCH 01/35] add the ability to get a list of vars given constraints --- src/interface/data_collection.cpp | 8 +-- src/interface/metadata.cpp | 15 ++++++ src/interface/metadata.hpp | 12 +++++ src/interface/state_descriptor.cpp | 80 ++++++++++++++++++++++++++++++ src/interface/state_descriptor.hpp | 27 +++++++++- tst/unit/test_metadata.cpp | 5 +- tst/unit/test_state_descriptor.cpp | 74 +++++++++++++++++++++++++++ 7 files changed, 213 insertions(+), 8 deletions(-) diff --git a/src/interface/data_collection.cpp b/src/interface/data_collection.cpp index 6a1d72c9ce0b..7d8cb08258ee 100644 --- a/src/interface/data_collection.cpp +++ b/src/interface/data_collection.cpp @@ -24,17 +24,17 @@ namespace parthenon { template std::shared_ptr DataCollection::Add(const std::string &name, const std::shared_ptr &src, - const std::vector &flags) { + const std::vector &field_names) { auto it = containers_.find(name); if (it != containers_.end()) { - if (!(it->second)->Contains(flags)) { - PARTHENON_THROW(name + "already exists in collection but does not contain flags"); + if (!(it->second)->Contains(field_names)) { + PARTHENON_THROW(name + "already exists in collection but does not contain field names"); } return it->second; } auto c = std::make_shared(); - c->Copy(src, flags); + c->Copy(src, field_names); containers_[name] = c; return containers_[name]; diff --git a/src/interface/metadata.cpp b/src/interface/metadata.cpp index ee355c1773ed..38466b2f4ed1 100644 --- a/src/interface/metadata.cpp +++ b/src/interface/metadata.cpp @@ -37,6 +37,8 @@ namespace parthenon { PARTHENON_INTERNAL_FOREACH_BUILTIN_FLAG #undef PARTHENON_INTERNAL_FOR_FLAG +int Metadata::num_flags = static_cast(internal::MetadataInternal::Max); + namespace internal { class UserMetadataState { @@ -85,6 +87,7 @@ class UserMetadataState { parthenon::internal::UserMetadataState metadata_state; MetadataFlag Metadata::AddUserFlag(const std::string &name) { + num_flags++; return metadata_state.AllocateNewFlag(name); } @@ -256,4 +259,16 @@ Metadata::GetArrayDims(std::weak_ptr wpmb, bool coarse) const { return arrDims; } +namespace MetadataUtils { +bool MatchFlags(const Metadata::FlagCollection &flags, Metadata m) { + const auto &intersections = flags.GetIntersections(); + const auto &unions = flags.GetUnions(); + const auto &exclusions = flags.GetExclusions(); + + return m.AllFlagsSet(intersections) && + (unions.empty() || m.AnyFlagsSet(unions)) && + m.NoFlagsSet(exclusions); +} +} // namespace MetadataUtils + } // namespace parthenon diff --git a/src/interface/metadata.hpp b/src/interface/metadata.hpp index fabfc083cbe8..755a0778d237 100644 --- a/src/interface/metadata.hpp +++ b/src/interface/metadata.hpp @@ -331,6 +331,7 @@ class Metadata { static MetadataFlag AddUserFlag(const std::string &name); static bool FlagNameExists(const std::string &flagname); static MetadataFlag GetUserFlag(const std::string &flagname); + static int num_flags; // Sparse threshold routines void SetSparseThresholds(parthenon::Real alloc, parthenon::Real dealloc, @@ -510,6 +511,16 @@ class Metadata { return AllFlagsSet(FlagVec{flag, std::forward(args)...}); } + template