From 4546331e810619d700b45bfcde2803310cc2fe31 Mon Sep 17 00:00:00 2001 From: Kyle Benne Date: Fri, 9 Aug 2024 11:30:44 -0500 Subject: [PATCH] WIP: Refactor variables --- cmake/Dependencies.cmake | 1 + energyplus_coroutine/CMakeLists.txt | 3 + energyplus_coroutine/energyplus_helpers.cpp | 2 +- energyplus_coroutine/spawn.cpp | 3 +- energyplus_coroutine/variables.cpp | 208 ++++++++-------- energyplus_coroutine/variables.hpp | 261 +++++++++++--------- epfmi/EPFMI.cpp | 4 +- python/test_python.in.py | 2 +- test/test_spawn_lib.cpp | 14 +- 9 files changed, 266 insertions(+), 232 deletions(-) diff --git a/cmake/Dependencies.cmake b/cmake/Dependencies.cmake index 911c93309..8ea032e0a 100644 --- a/cmake/Dependencies.cmake +++ b/cmake/Dependencies.cmake @@ -15,6 +15,7 @@ find_package(Boost) # Normally, we would use conan to pull in spdlog, but the conan build # is unaware of fmt provided by EnergyPlus set(SPDLOG_FMT_EXTERNAL ON) +set(SPDLOG_BUILD_PIC ON) add_subdirectory(spdlog) # Provides the cmake macro, `catch_discover_tests` diff --git a/energyplus_coroutine/CMakeLists.txt b/energyplus_coroutine/CMakeLists.txt index 82b4612a8..ae449d3d0 100644 --- a/energyplus_coroutine/CMakeLists.txt +++ b/energyplus_coroutine/CMakeLists.txt @@ -22,6 +22,9 @@ add_library( variables.hpp variables.cpp + energyplus_helpers.hpp + energyplus_helpers.cpp + warmup_manager.hpp warmup_manager.cpp diff --git a/energyplus_coroutine/energyplus_helpers.cpp b/energyplus_coroutine/energyplus_helpers.cpp index 5dffe147e..12c2b6763 100644 --- a/energyplus_coroutine/energyplus_helpers.cpp +++ b/energyplus_coroutine/energyplus_helpers.cpp @@ -40,7 +40,7 @@ double ZoneSums::QConSenFlow() const int ZoneNum(EnergyPlus::EnergyPlusData &energyplus_data, const std::string_view zone_name) { - auto upper_zone_name = zone_name; + std::string upper_zone_name(zone_name); std::transform(zone_name.begin(), zone_name.end(), upper_zone_name.begin(), ::toupper); for (int i = 0; i < energyplus_data.dataGlobal->NumOfZones; ++i) { diff --git a/energyplus_coroutine/spawn.cpp b/energyplus_coroutine/spawn.cpp index 203524126..5d5d54bb3 100644 --- a/energyplus_coroutine/spawn.cpp +++ b/energyplus_coroutine/spawn.cpp @@ -2,6 +2,7 @@ #include "../util/config.hpp" #include "../util/conversion.hpp" #include "../util/math.hpp" +#include "energyplus_helpers.hpp" #include "idf_to_json.hpp" #include "idfprep.hpp" #include "input/user_config.hpp" @@ -382,7 +383,7 @@ void Spawn::updateZoneConditions(bool skipConnectedZones) continue; } - const auto zonenum = zoneNum(zone.idfname); + const auto zonenum = energyplus::ZoneNum(sim_state, zone.idfname); updateZoneTemperature(zonenum, dt); updateZoneHumidityRatio(zonenum, dt); } diff --git a/energyplus_coroutine/variables.cpp b/energyplus_coroutine/variables.cpp index c88119afd..6acddff15 100644 --- a/energyplus_coroutine/variables.cpp +++ b/energyplus_coroutine/variables.cpp @@ -25,40 +25,40 @@ namespace spawn::variable { Variables::Variables(const UserConfig &user_config) { - zone::V::create(user_config, *this); - zone::AFlo::create(user_config, *this); - zone::MSenFac::create(user_config, *this); - zone::QConSenFlow::create(user_config, *this); - zone::QLatFlow::create(user_config, *this); - zone::QPeoFlow::create(user_config, *this); - zone::TRad::create(user_config, *this); - zone::QCooSenFlow::create(user_config, *this); - zone::QCooLatFlow::create(user_config, *this); - zone::TOutCoo::create(user_config, *this); - zone::XOutCoo::create(user_config, *this); - zone::MOutCooFlow::create(user_config, *this); - zone::TCoo::create(user_config, *this); - zone::QHeaFlow::create(user_config, *this); - zone::TOutHea::create(user_config, *this); - zone::XOutHea::create(user_config, *this); - zone::MOutHeaFlow::create(user_config, *this); - zone::THea::create(user_config, *this); - zone::MInletsFlow::create(user_config, *this); - zone::TAveInlet::create(user_config, *this); - zone::T::create(user_config, *this); - zone::X::create(user_config, *this); - zone::QGaiRadFlow::create(user_config, *this); - other::Sensor::create(user_config, *this); - other::Actuator::create(user_config, *this); - other::Schedule::create(user_config, *this); - surface::A::create(user_config, *this); - surface::QFlow::create(user_config, *this); - surface::T::create(user_config, *this); - construction::A::create(user_config, *this); - construction::QFrontFlow::create(user_config, *this); - construction::QBackFlow::create(user_config, *this); - construction::TFront::create(user_config, *this); - construction::TBack::create(user_config, *this); + zone::V::CreateAll(user_config, *this); + zone::AFlo::CreateAll(user_config, *this); + zone::MSenFac::CreateAll(user_config, *this); + zone::QConSenFlow::CreateAll(user_config, *this); + zone::QLatFlow::CreateAll(user_config, *this); + zone::QPeoFlow::CreateAll(user_config, *this); + zone::TRad::CreateAll(user_config, *this); + zone::QCooSenFlow::CreateAll(user_config, *this); + zone::QCooLatFlow::CreateAll(user_config, *this); + zone::TOutCoo::CreateAll(user_config, *this); + zone::XOutCoo::CreateAll(user_config, *this); + zone::MOutCooFlow::CreateAll(user_config, *this); + zone::TCoo::CreateAll(user_config, *this); + zone::QHeaFlow::CreateAll(user_config, *this); + zone::TOutHea::CreateAll(user_config, *this); + zone::XOutHea::CreateAll(user_config, *this); + zone::MOutHeaFlow::CreateAll(user_config, *this); + zone::THea::CreateAll(user_config, *this); + zone::MInletsFlow::CreateAll(user_config, *this); + zone::TAveInlet::CreateAll(user_config, *this); + zone::T::CreateAll(user_config, *this); + zone::X::CreateAll(user_config, *this); + zone::QGaiRadFlow::CreateAll(user_config, *this); + other::Sensor::CreateAll(user_config, *this); + other::Actuator::CreateAll(user_config, *this); + other::Schedule::CreateAll(user_config, *this); + surface::A::CreateAll(user_config, *this); + surface::QFlow::CreateAll(user_config, *this); + surface::T::CreateAll(user_config, *this); + construction::A::CreateAll(user_config, *this); + construction::QFrontFlow::CreateAll(user_config, *this); + construction::QBackFlow::CreateAll(user_config, *this); + construction::TFront::CreateAll(user_config, *this); + construction::TBack::CreateAll(user_config, *this); } const VariableVector &Variables::AllVariables() const @@ -113,8 +113,8 @@ int Variables::VariableIndex(const std::string_view variable_name) const void Variables::AddVariable(std::unique_ptr &&variable) { - all_variables_.push_back(std::move(variable)); variable_name_index_[std::string(variable->Name())] = variable->Index(); + all_variables_.push_back(std::move(variable)); } void Variables::AddVariable(Output &variable) @@ -213,13 +213,13 @@ Input::Input(Variables &variables, std::string_view name, units::UnitType ep_uni namespace zone { - void V::create(const UserConfig &user_config, Variables &variables) + void V::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - V(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -246,13 +246,13 @@ namespace zone { SetValue(energyplus::ZoneVolume(energyplus_data, zone_num_.get(energyplus_data)), units::UnitSystem::EP); } - void AFlo::create(const UserConfig &user_config, Variables &variables) + void AFlo::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - AFlo(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -279,13 +279,13 @@ namespace zone { SetValue(energyplus::ZoneFloorArea(energyplus_data, zone_num_.get(energyplus_data)), units::UnitSystem::EP); } - void MSenFac::create(const UserConfig &user_config, Variables &variables) + void MSenFac::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - MSenFac(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -311,13 +311,13 @@ namespace zone { SetValue(energyplus::ZoneVolCapMultpSens(energyplus_data, zone_num_.get(energyplus_data)), units::UnitSystem::EP); } - void QConSenFlow::create(const UserConfig &user_config, Variables &variables) + void QConSenFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - QConSenFlow(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -345,13 +345,13 @@ namespace zone { SetValue(value, units::UnitSystem::EP); } - void QLatFlow::create(const UserConfig &user_config, Variables &variables) + void QLatFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - QLatFlow(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -378,13 +378,13 @@ namespace zone { SetValue(energyplus::ZoneLatentGain(energyplus_data, zone_num_.get(energyplus_data)), units::UnitSystem::EP); } - void QPeoFlow::create(const UserConfig &user_config, Variables &variables) + void QPeoFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - QPeoFlow(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -411,13 +411,13 @@ namespace zone { SetValue(energyplus::ZonePeopleHeatGain(energyplus_data, zone_num_.get(energyplus_data)), units::UnitSystem::EP); } - void TRad::create(const UserConfig &user_config, Variables &variables) + void TRad::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - TRad(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -444,13 +444,13 @@ namespace zone { SetValue(energyplus::ZoneMeanRadiantTemp(energyplus_data, zone_num_.get(energyplus_data)), units::UnitSystem::EP); } - void QCooSenFlow::create(const UserConfig &user_config, Variables &variables) + void QCooSenFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - QCooSenFlow(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -477,13 +477,13 @@ namespace zone { SetValue(energyplus::ZoneDesignCoolingLoad(energyplus_data, zone_num_.get(energyplus_data)), units::UnitSystem::EP); } - void QCooLatFlow::create(const UserConfig &user_config, Variables &variables) + void QCooLatFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - QCooLatFlow(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -511,13 +511,13 @@ namespace zone { units::UnitSystem::EP); } - void TOutCoo::create(const UserConfig &user_config, Variables &variables) + void TOutCoo::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - TOutCoo(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -545,13 +545,13 @@ namespace zone { units::UnitSystem::EP); } - void XOutCoo::create(const UserConfig &user_config, Variables &variables) + void XOutCoo::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - XOutCoo(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -579,13 +579,13 @@ namespace zone { units::UnitSystem::EP); } - void MOutCooFlow::create(const UserConfig &user_config, Variables &variables) + void MOutCooFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - MOutCooFlow(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -614,13 +614,13 @@ namespace zone { SetValue(0.0, units::UnitSystem::EP); } - void TCoo::create(const UserConfig &user_config, Variables &variables) + void TCoo::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - TCoo(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -648,13 +648,13 @@ namespace zone { SetValue(0.0, units::UnitSystem::EP); } - void QHeaFlow::create(const UserConfig &user_config, Variables &variables) + void QHeaFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - QHeaFlow(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -681,13 +681,13 @@ namespace zone { SetValue(energyplus::ZoneDesignHeatingLoad(energyplus_data, zone_num_.get(energyplus_data)), units::UnitSystem::EP); } - void TOutHea::create(const UserConfig &user_config, Variables &variables) + void TOutHea::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - TOutHea(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -715,13 +715,13 @@ namespace zone { units::UnitSystem::EP); } - void XOutHea::create(const UserConfig &user_config, Variables &variables) + void XOutHea::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - XOutHea(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -749,13 +749,13 @@ namespace zone { units::UnitSystem::EP); } - void MOutHeaFlow::create(const UserConfig &user_config, Variables &variables) + void MOutHeaFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - MOutHeaFlow(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -784,13 +784,13 @@ namespace zone { SetValue(0.0, units::UnitSystem::EP); } - void THea::create(const UserConfig &user_config, Variables &variables) + void THea::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - THea(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -818,13 +818,13 @@ namespace zone { SetValue(0.0, units::UnitSystem::EP); } - void MInletsFlow::create(const UserConfig &user_config, Variables &variables) + void MInletsFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - MInletsFlow(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -854,13 +854,13 @@ namespace zone { // Right? } - void TAveInlet::create(const UserConfig &user_config, Variables &variables) + void TAveInlet::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - TAveInlet(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -886,13 +886,13 @@ namespace zone { // TODO: Do something with this value. } - void T::create(const UserConfig &user_config, Variables &variables) + void T::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - T(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -920,13 +920,13 @@ namespace zone { } } - void X::create(const UserConfig &user_config, Variables &variables) + void X::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - X(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -953,13 +953,13 @@ namespace zone { } } - void QGaiRadFlow::create(const UserConfig &user_config, Variables &variables) + void QGaiRadFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto zones = user_config.spawnjson.value("model", json::object()).value("zones", std::vector(0)); for (const auto &zone : zones) { std::string zone_name = zone.value("name", ""); - QGaiRadFlow(variables, zone_name); + Variables::CreateOne(variables, zone_name); } } @@ -992,7 +992,7 @@ namespace zone { } // namespace zone namespace other { - void Sensor::create(const UserConfig &user_config, Variables &variables) + void Sensor::CreateAll(const UserConfig &user_config, Variables &variables) { const auto output_variables = user_config.spawnjson.value("model", json::object()).value("outputVariables", std::vector(0)); @@ -1002,8 +1002,7 @@ namespace other { const auto energyplus_name = variable.value("name", ""); const auto energyplus_key = variable.value("key", ""); - // int handle = energyplus::VariableHandle(energyplus_data, energyplus_name, energyplus_key); - Sensor(variables, sensor_name, energyplus_name, energyplus_key); + Variables::CreateOne(variables, sensor_name, energyplus_name, energyplus_key); } } @@ -1033,7 +1032,7 @@ namespace other { SetValue(energyplus::VariableValue(energyplus_data, sensor_handle_.get(energyplus_data)), units::UnitSystem::EP); } - void Actuator::create(const UserConfig &user_config, Variables &variables) + void Actuator::CreateAll(const UserConfig &user_config, Variables &variables) { const auto actuators = user_config.spawnjson.value("model", json::object()).value("emsActuators", std::vector(0)); @@ -1044,7 +1043,7 @@ namespace other { const auto &component_type = actuator.value("componentType", ""); const auto &component_control_type = actuator.value("controlType", ""); - Actuator(variables, name, component_name, component_type, component_control_type); + Variables::CreateOne(variables, name, component_name, component_type, component_control_type); } } @@ -1079,7 +1078,7 @@ namespace other { } } - void Schedule::create(const UserConfig &user_config, Variables &variables) + void Schedule::CreateAll(const UserConfig &user_config, Variables &variables) { const auto schedules = user_config.spawnjson.value("model", json::object()).value("schedules", std::vector(0)); @@ -1107,8 +1106,7 @@ namespace other { const auto type = schedule_type_map.find(idf_name); if (type != std::end(schedule_type_map)) { - // const auto handle = energyplus::ActuatorHandle(energyplus_data, type->second, "Schedule Value", idf_name); - Schedule(variables, name, idf_name, type->second, "Schedule Value"); + Variables::CreateOne(variables, name, idf_name, type->second, "Schedule Value"); } } } @@ -1144,14 +1142,14 @@ namespace other { } // namespace other namespace surface { - void A::create(const UserConfig &user_config, Variables &variables) + void A::CreateAll(const UserConfig &user_config, Variables &variables) { const auto surfaces = user_config.spawnjson.value("model", json::object()).value("zoneSurfaces", std::vector(0)); for (const auto &surface : surfaces) { const auto surface_name = surface.value("name", ""); - A(variables, surface_name); + Variables::CreateOne(variables, surface_name); } } @@ -1179,14 +1177,14 @@ namespace surface { SetValue(energyplus::SurfaceArea(energyplus_data, surface_num_.get(energyplus_data)), spawn::units::UnitSystem::EP); } - void QFlow::create(const UserConfig &user_config, Variables &variables) + void QFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto surfaces = user_config.spawnjson.value("model", json::object()).value("zoneSurfaces", std::vector(0)); for (const auto &surface : surfaces) { const auto surface_name = surface.value("name", ""); - QFlow(variables, surface_name); + Variables::CreateOne(variables, surface_name); } } @@ -1217,7 +1215,7 @@ namespace surface { spawn::units::UnitSystem::EP); } - void T::create(const UserConfig &user_config, Variables &variables) + void T::CreateAll(const UserConfig &user_config, Variables &variables) { const auto surfaces = user_config.spawnjson.value("model", json::object()).value("zoneSurfaces", std::vector(0)); @@ -1228,7 +1226,7 @@ namespace surface { for (const auto &surface : surfaces) { const auto surface_name = surface.value("name", ""); - T(variables, surface_name); + Variables::CreateOne(variables, surface_name); } } @@ -1259,14 +1257,14 @@ namespace surface { } // namespace surface namespace construction { - void A::create(const UserConfig &user_config, Variables &variables) + void A::CreateAll(const UserConfig &user_config, Variables &variables) { const auto surfaces = user_config.spawnjson.value("model", json::object()).value("buildingSurfaceDetailed", std::vector(0)); for (const auto &surface : surfaces) { const auto surface_name = surface.value("name", ""); - A(variables, surface_name); + Variables::CreateOne(variables, surface_name); } } @@ -1294,14 +1292,14 @@ namespace construction { SetValue(energyplus::SurfaceArea(energyplus_data, surface_num_.get(energyplus_data)), spawn::units::UnitSystem::EP); } - void QFrontFlow::create(const UserConfig &user_config, Variables &variables) + void QFrontFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto surfaces = user_config.spawnjson.value("model", json::object()).value("buildingSurfaceDetailed", std::vector(0)); for (const auto &surface : surfaces) { const auto surface_name = surface.value("name", ""); - QFrontFlow(variables, surface_name); + Variables::CreateOne(variables, surface_name); } } @@ -1333,14 +1331,14 @@ namespace construction { spawn::units::UnitSystem::EP); } - void QBackFlow::create(const UserConfig &user_config, Variables &variables) + void QBackFlow::CreateAll(const UserConfig &user_config, Variables &variables) { const auto surfaces = user_config.spawnjson.value("model", json::object()).value("buildingSurfaceDetailed", std::vector(0)); for (const auto &surface : surfaces) { const auto surface_name = surface.value("name", ""); - QBackFlow(variables, surface_name); + Variables::CreateOne(variables, surface_name); } } @@ -1372,14 +1370,14 @@ namespace construction { spawn::units::UnitSystem::EP); } - void TFront::create(const UserConfig &user_config, Variables &variables) + void TFront::CreateAll(const UserConfig &user_config, Variables &variables) { const auto surfaces = user_config.spawnjson.value("model", json::object()).value("buildingSurfaceDetailed", std::vector(0)); for (const auto &surface : surfaces) { const auto surface_name = surface.value("name", ""); - TFront(variables, surface_name); + Variables::CreateOne(variables, surface_name); } } @@ -1408,14 +1406,14 @@ namespace construction { } } - void TBack::create(const UserConfig &user_config, Variables &variables) + void TBack::CreateAll(const UserConfig &user_config, Variables &variables) { const auto surfaces = user_config.spawnjson.value("model", json::object()).value("buildingSurfaceDetailed", std::vector(0)); for (const auto &surface : surfaces) { const auto surface_name = surface.value("name", ""); - TBack(variables, surface_name); + Variables::CreateOne(variables, surface_name); } } diff --git a/energyplus_coroutine/variables.hpp b/energyplus_coroutine/variables.hpp index 1f36d44ac..e44b9888a 100644 --- a/energyplus_coroutine/variables.hpp +++ b/energyplus_coroutine/variables.hpp @@ -14,11 +14,11 @@ struct EnergyPlusData; namespace spawn { class UserConfig; +} -namespace units { - enum class UnitSystem; -} // namespace units -} // namespace spawn +namespace spawn::units { +enum class UnitSystem; +} namespace spawn::variable { @@ -32,9 +32,9 @@ template class CachedValue; // A variable is a numercial value that is exchanged between EnergyPlus, // and something else (probably Modelica) that is running from a different thread. // The Variable class: -// 1. Buffers the numerical value, which could be either an input or an output to EnergyPlus -// 2. Stores metadata about the value -// 3. Provides a method to synchronize the buffered value with EnergyPlus +// 1. Buffers the numerical value, which could be either an input or an output to EnergyPlus. +// 2. Stores metadata about the value. +// 3. Provides a method to synchronize the buffered value between EnergyPlus and the other thread. class Variable { public: @@ -147,6 +147,15 @@ class Variables Variables(Variables &&) = delete; virtual ~Variables() = default; + // This is used to create a new instance of a particular Variable type. + // The key point is that we want to heap allocate Variable instances. + // The variables container will take ownership of the newly created instance. + template static void CreateOne(Variables &variables, Args &&...args) + { + static_assert(std::is_base_of::value, "CreateOne can only create subclasses of Variable"); + new T(variables, std::forward(args)...); + } + [[nodiscard]] const VariableVector &AllVariables() const; [[nodiscard]] const VariableRefs &Inputs() const; [[nodiscard]] const VariableRefs &Outputs() const; @@ -166,12 +175,11 @@ class Variables void AddVariable(Output &variable); void AddVariable(Parameter &variable); - // This vector owns all of the variables + // This container owns all of the variables // This defines the primary numeric index for accessing a particular variable VariableVector all_variables_; - // It is common to iterate over only the inputs, outputs, or parameters, - // therefore these vectors of references are used as efficient indexes - // for the different types of Variable. + // It is common to iterate over only the inputs, outputs, or parameters. + // These containers hold references to provide efficient access to specific types of variables. VariableRefs input_variables_; VariableRefs output_variables_; VariableRefs parameter_variables_; @@ -187,260 +195,283 @@ class Variables // Begin defining the specific Variable types, which are documented here: // https://lbl-srg.github.io/soep/softwareArchitecture.html#coupling-of-the-envelope-model -// Namespaces are used to disambiguate. -// For example, temperature T of a zone versus a surface +// Namespaces are used to disambiguate variables such as temperature T of a zone versus a surface +// +// All Variable types must have a static CreateAll factory method. +// Constructor and factory are private, because instances are created by the Variables friend class. namespace zone { class V : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit V(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; CachedValue zone_num_; }; class AFlo : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit AFlo(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class MSenFac : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit MSenFac(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class QConSenFlow : public Output { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit QConSenFlow(Variables &variables, std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class QLatFlow : public Output { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit QLatFlow(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class QPeoFlow : public Output { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit QPeoFlow(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class TRad : public Output { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit TRad(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class QCooSenFlow : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit QCooSenFlow(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class QCooLatFlow : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit QCooLatFlow(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class TOutCoo : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit TOutCoo(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class XOutCoo : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit XOutCoo(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class MOutCooFlow : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit MOutCooFlow(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class TCoo : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit TCoo(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class QHeaFlow : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit QHeaFlow(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class TOutHea : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit TOutHea(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class XOutHea : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit XOutHea(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class MOutHeaFlow : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit MOutHeaFlow(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class THea : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit THea(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class MInletsFlow : public Input { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit MInletsFlow(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class TAveInlet : public Input { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit TAveInlet(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class T : public Input { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit T(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class X : public Input { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit X(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + CachedValue zone_num_; }; class QGaiRadFlow : public Input { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit QGaiRadFlow(Variables &variables, const std::string_view zone_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; const std::string zone_name_; const std::string actuator_name_; @@ -453,15 +484,15 @@ namespace zone { namespace other { class Sensor : public Output { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit Sensor(Variables &variables, const std::string_view sensor_name, const std::string_view energyplus_name, const std::string_view energyplus_key); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; const std::string energyplus_name_; const std::string energyplus_key_; @@ -470,9 +501,7 @@ namespace other { class Actuator : public Input { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit Actuator(Variables &variables, @@ -480,6 +509,8 @@ namespace other { const std::string_view component_name_, const std::string_view component_type_, const std::string_view component_controltype_); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; const std::string component_name_; const std::string component_type_; @@ -489,9 +520,7 @@ namespace other { class Schedule : public Input { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit Schedule(Variables &variables, @@ -499,6 +528,8 @@ namespace other { const std::string_view component_name, const std::string_view component_type, const std::string_view component_controltype); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; const std::string component_name_; const std::string component_type_; @@ -510,36 +541,36 @@ namespace other { namespace surface { class A : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit A(Variables &variables, const std::string_view surface_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; CachedValue surface_num_; }; class QFlow : public Output { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit QFlow(Variables &variables, std::string_view surface_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; CachedValue surface_num_; }; class T : public Input { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit T(Variables &variables, const std::string_view surface_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; CachedValue surface_num_; }; @@ -548,60 +579,60 @@ namespace surface { namespace construction { class A : public Parameter { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit A(Variables &variables, const std::string_view surface_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; CachedValue surface_num_; }; class QFrontFlow : public Output { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit QFrontFlow(Variables &variables, const std::string_view surface_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; CachedValue surface_num_; }; class QBackFlow : public Output { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit QBackFlow(Variables &variables, const std::string_view surface_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; CachedValue surface_num_; }; class TFront : public Input { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit TFront(Variables &variables, const std::string_view surface_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; CachedValue surface_num_; }; class TBack : public Input { - public: - static void create(const UserConfig &user_config, Variables &variables); - void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; + friend class variable::Variables; private: explicit TBack(Variables &variables, const std::string_view surface_name); + static void CreateAll(const UserConfig &user_config, Variables &variables); + void Update(EnergyPlus::EnergyPlusData &energyplus_data) final; CachedValue surface_num_; }; diff --git a/epfmi/EPFMI.cpp b/epfmi/EPFMI.cpp index 7baa18375..808eac654 100644 --- a/epfmi/EPFMI.cpp +++ b/epfmi/EPFMI.cpp @@ -185,7 +185,7 @@ EPFMI_API fmi2Status fmi2SetReal(fmi2Component c, const fmi2ValueReference vr[], for (size_t i = 0; i < nvr; ++i) { auto valueRef = vr[i]; // NOLINT auto value = values[i]; // NOLINT - comp.setValue(valueRef, value); + comp.SetValue(valueRef, value); } }; @@ -199,7 +199,7 @@ EPFMI_API fmi2Status fmi2GetReal(fmi2Component c, const fmi2ValueReference vr[], comp.start(); comp.exchange(); std::transform(vr, std::next(vr, static_cast(nvr)), values, [&](const auto valueRef) { - return comp.getValue(valueRef); + return comp.GetValue(valueRef); }); }; diff --git a/python/test_python.in.py b/python/test_python.in.py index e23684e2a..b9bae2bad 100644 --- a/python/test_python.in.py +++ b/python/test_python.in.py @@ -64,7 +64,7 @@ def test_OneSpawn(self): time = libspawn.days_to_seconds(day) spawn1.setTime(time) self.assertEqual(spawn1.currentTime(), time) - lighting_power = spawn1.getValue("Core_Zone_Lights_Output") + lighting_power = spawn1.GetValue("Core_Zone_Lights_Output") print("Time %s, Day %s; Core_Zone_Lights_Output: %d" % (time, day, lighting_power), flush=True) self.assertGreater(lighting_power, 0.0) diff --git a/test/test_spawn_lib.cpp b/test/test_spawn_lib.cpp index 965e9db27..48342a03a 100644 --- a/test/test_spawn_lib.cpp +++ b/test/test_spawn_lib.cpp @@ -97,7 +97,7 @@ TEST_CASE("Test one Spawn") auto time = spawn::days_to_seconds(day); spawn1.setTime(time); CHECK(spawn1.currentTime() == time); - const auto lighting_power = spawn1.getValue("Core_Zone_Lights_Output"); + const auto lighting_power = spawn1.GetValue("Core_Zone_Lights_Output"); CHECK(lighting_power > 0.0); } spawn1.stop(); @@ -124,8 +124,8 @@ TEST_CASE("Test two Spawns") CHECK(spawn1.currentTime() == time); CHECK(spawn2.currentTime() == time); - const auto lighting_power1 = spawn1.getValue("Core_Zone_Lights_Output"); - const auto lighting_power2 = spawn2.getValue("Core_Zone_Lights_Output"); + const auto lighting_power1 = spawn1.GetValue("Core_Zone_Lights_Output"); + const auto lighting_power2 = spawn2.GetValue("Core_Zone_Lights_Output"); const auto all_lighting_power = lighting_power1 + lighting_power2; CHECK(all_lighting_power > 0.0); } @@ -154,12 +154,12 @@ TEST_CASE("Test negative start time") spawn1.setTime(spawn1.currentTime() + seconds_in_day); spawn2.setTime(spawn2.currentTime() + seconds_in_day); - const auto zone_temp_1 = spawn1.getValue("GARAGE ZONE Temp"); - const auto zone_temp_2 = spawn2.getValue("GARAGE ZONE Temp"); + const auto zone_temp_1 = spawn1.GetValue("GARAGE ZONE Temp"); + const auto zone_temp_2 = spawn2.GetValue("GARAGE ZONE Temp"); CHECK_THAT(zone_temp_1, Catch::Matchers::WithinAbs(zone_temp_2, 0.1)); - // const auto zone_heat_1 = spawn1.getValue("LIVING ZONE_QConSen_flow"); - // const auto zone_heat_2 = spawn2.getValue("LIVING ZONE_QConSen_flow"); + // const auto zone_heat_1 = spawn1.GetValue("LIVING ZONE_QConSen_flow"); + // const auto zone_heat_2 = spawn2.GetValue("LIVING ZONE_QConSen_flow"); // CHECK(zone_heat_1 == Approx(zone_heat_2)); }