diff --git a/include/forcing/ForcingsEngineDataProvider.hpp b/include/forcing/ForcingsEngineDataProvider.hpp index 5dcf8f8f69..ddeba17a98 100644 --- a/include/forcing/ForcingsEngineDataProvider.hpp +++ b/include/forcing/ForcingsEngineDataProvider.hpp @@ -194,16 +194,33 @@ struct ForcingsEngineDataProvider var_output_names_ = bmi_->GetOutputVarNames(); } + std::string ensure_variable(std::string name, const std::string& suffix = "_ELEMENT") const + { + // TODO: use get_available_var_names() once const + auto vars = boost::span{var_output_names_}; + + if (std::find(vars.begin(), vars.end(), name) != vars.end()) { + return name; + } + + auto suffixed_name = std::move(name) + suffix; + if (std::find(vars.begin(), vars.end(), suffixed_name) != vars.end()) { + return suffixed_name; + } + + throw std::runtime_error{ + "ForcingsEngineDataProvider: neither variable `" + + suffixed_name.substr(0, suffixed_name.size() - suffix.size()) + + "` nor `" + suffixed_name + "` exist." + }; + } + //! Forcings Engine instance std::shared_ptr bmi_ = nullptr; //! Output variable names std::vector var_output_names_{}; - private: - //! Initialization config file path - std::string init_; - //! Calendar time for simulation beginning clock_type::time_point time_begin_{}; @@ -212,6 +229,9 @@ struct ForcingsEngineDataProvider //! Duration of a single simulation tick clock_type::duration time_step_{}; + + //! Initialization config file path + std::string init_; }; } // namespace data_access