X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/eb0c02dd955faf07077c381f0aaf262081d61c77..30e0627bbfc12ce4ebeacfda720bc52e95feb22c:/src/plugins/solar_panel.cpp diff --git a/src/plugins/solar_panel.cpp b/src/plugins/solar_panel.cpp index d4d37ca3f3..c6f2581f80 100644 --- a/src/plugins/solar_panel.cpp +++ b/src/plugins/solar_panel.cpp @@ -11,7 +11,6 @@ #include "src/kernel/resource/CpuImpl.hpp" #include "src/simgrid/module.hpp" - SIMGRID_REGISTER_PLUGIN(solar_panel, "Solar Panel management", nullptr) /** @defgroup plugin_solar_panel Plugin Solar Panel @@ -24,13 +23,14 @@ This plugin allows the use of solar panels to generate power during simulation d irradiance and conversion factor. The power model is taken from the paper `"Reinforcement Learning Based Load Balancing for -Geographically Distributed Data Centres" `_ by Max Mackie et. al. +Geographically Distributed Data Centres" `_ by Max Mackie +et. al. Solar Panel .................... -A solar panel has an area :math:`A` in m², a conversion efficiency :math:`\eta` and a solar irradiance :math:`S` in W/m². -The power generated :math:`P` in W by a solar panel is given by the following equation: +A solar panel has an area :math:`A` in m², a conversion efficiency :math:`\eta` and a solar irradiance :math:`S` in +W/m². The power generated :math:`P` in W by a solar panel is given by the following equation: .. math:: @@ -43,54 +43,29 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(SolarPanel, kernel, "Logging specific to the sol namespace simgrid::plugins { -/* SolarPanelModel */ - -SolarPanelModel::SolarPanelModel() : Model("SolarPanelModel") {} - -void SolarPanelModel::add_solar_panel(SolarPanelPtr b) -{ - solar_panels_.push_back(b); -} - -void SolarPanelModel::update_actions_state(double now, double delta) -{ - for (auto solar_panel : solar_panels_) - solar_panel->update(); -} - -double SolarPanelModel::next_occurring_event(double now) -{ - return -1; -} +xbt::signal SolarPanel::on_power_change; /* SolarPanel */ -std::shared_ptr SolarPanel::solar_panel_model_; - -void SolarPanel::init_plugin() -{ - auto model = std::make_shared(); - simgrid::s4u::Engine::get_instance()->add_model(model); - SolarPanel::solar_panel_model_ = model; -} - void SolarPanel::update() { simgrid::kernel::actor::simcall_answered([this] { - double now = simgrid::s4u::Engine::get_clock(); - if (now <= last_updated_) - return; double power_w = conversion_efficiency_ * area_m2_ * solar_irradiance_w_per_m2_; - if (power_w_ < min_power_w_) + if (power_w < min_power_w_) power_w = 0; - if (power_w_ > max_power_w_) + if (power_w > max_power_w_) power_w = max_power_w_; - power_w_ = power_w; - last_updated_ = now; + auto previous_power_w = power_w_; + power_w_ = power_w; + if (previous_power_w != power_w_) { + on_this_power_change(this); + on_power_change(this); + } }); } -SolarPanel::SolarPanel(std::string name, double area_m2, double conversion_efficiency, double solar_irradiance_w_per_m2, double min_power_w, double max_power_w) +SolarPanel::SolarPanel(std::string name, double area_m2, double conversion_efficiency, double solar_irradiance_w_per_m2, + double min_power_w, double max_power_w) : name_(name) , area_m2_(area_m2) , conversion_efficiency_(conversion_efficiency) @@ -99,11 +74,14 @@ SolarPanel::SolarPanel(std::string name, double area_m2, double conversion_effic , max_power_w_(max_power_w) { xbt_assert(area_m2 >= 0, " : area must be >= 0 (provided: %f)", area_m2); - xbt_assert(conversion_efficiency >= 0 and conversion_efficiency <= 1, " : conversion efficiency must be in [0,1] (provided: %f)", conversion_efficiency); - xbt_assert(solar_irradiance_w_per_m2 >= 0, " : solar irradiance must be >= 0 (provided: %f)", solar_irradiance_w_per_m2); + xbt_assert(conversion_efficiency >= 0 and conversion_efficiency <= 1, + " : conversion efficiency must be in [0,1] (provided: %f)", conversion_efficiency); + xbt_assert(solar_irradiance_w_per_m2 >= 0, " : solar irradiance must be >= 0 (provided: %f)", + solar_irradiance_w_per_m2); xbt_assert(min_power_w >= 0, " : minimal power must be >= 0 (provided: %f)", min_power_w); xbt_assert(max_power_w > 0, " : maximal power must be > 0 (provided: %f)", max_power_w); - xbt_assert(max_power_w > min_power_w, " : maximal power must be above minimal power (provided: %f, %f)", max_power_w, min_power_w); + xbt_assert(max_power_w > min_power_w, " : maximal power must be above minimal power (provided: %f, %f)", max_power_w, + min_power_w); } /** @ingroup plugin_solar_panel @@ -115,15 +93,12 @@ SolarPanel::SolarPanel(std::string name, double area_m2, double conversion_effic * @param max_power_w The maximal power delivered by the Solar Panel in W (> 0 and > min_power_w). * @return A SolarPanelPtr pointing to the new SolarPanel. */ -SolarPanelPtr SolarPanel::init(const std::string& name, double area_m2, double conversion_efficiency, double solar_irradiance_w_per_m2, double min_power_w, double max_power_w) +SolarPanelPtr SolarPanel::init(const std::string& name, double area_m2, double conversion_efficiency, + double solar_irradiance_w_per_m2, double min_power_w, double max_power_w) { - static bool plugin_inited = false; - if (not plugin_inited) { - init_plugin(); - plugin_inited = true; - } - auto solar_panel = SolarPanelPtr(new SolarPanel(name, area_m2, conversion_efficiency, solar_irradiance_w_per_m2, min_power_w, max_power_w)); - solar_panel_model_->add_solar_panel(solar_panel); + auto solar_panel = SolarPanelPtr( + new SolarPanel(name, area_m2, conversion_efficiency, solar_irradiance_w_per_m2, min_power_w, max_power_w)); + solar_panel->update(); return solar_panel; } @@ -133,7 +108,7 @@ SolarPanelPtr SolarPanel::init(const std::string& name, double area_m2, double c */ SolarPanelPtr SolarPanel::set_name(std::string name) { - kernel::actor::simcall_answered([this, name] {name_ = name;}); + kernel::actor::simcall_answered([this, name] { name_ = name; }); return this; } @@ -144,7 +119,8 @@ SolarPanelPtr SolarPanel::set_name(std::string name) SolarPanelPtr SolarPanel::set_area(double area_m2) { xbt_assert(area_m2 >= 0, " : area must be > 0 (provided: %f)", area_m2); - kernel::actor::simcall_answered([this, area_m2] {area_m2_ = area_m2;}); + kernel::actor::simcall_answered([this, area_m2] { area_m2_ = area_m2; }); + update(); return this; } @@ -155,7 +131,8 @@ SolarPanelPtr SolarPanel::set_area(double area_m2) SolarPanelPtr SolarPanel::set_conversion_efficiency(double e) { xbt_assert(e >= 0 and e <= 1, " : conversion efficiency must be in [0,1] (provided: %f)", e); - kernel::actor::simcall_answered([this, e] {conversion_efficiency_ = e;}); + kernel::actor::simcall_answered([this, e] { conversion_efficiency_ = e; }); + update(); return this; } @@ -165,8 +142,11 @@ SolarPanelPtr SolarPanel::set_conversion_efficiency(double e) */ SolarPanelPtr SolarPanel::set_solar_irradiance(double solar_irradiance_w_per_m2) { - xbt_assert(solar_irradiance_w_per_m2 >= 0, " : solar irradiance must be >= 0 (provided: %f)", solar_irradiance_w_per_m2); - kernel::actor::simcall_answered([this, solar_irradiance_w_per_m2] {solar_irradiance_w_per_m2_ = solar_irradiance_w_per_m2;}); + xbt_assert(solar_irradiance_w_per_m2 >= 0, " : solar irradiance must be >= 0 (provided: %f)", + solar_irradiance_w_per_m2); + kernel::actor::simcall_answered( + [this, solar_irradiance_w_per_m2] { solar_irradiance_w_per_m2_ = solar_irradiance_w_per_m2; }); + update(); return this; } @@ -177,8 +157,10 @@ SolarPanelPtr SolarPanel::set_solar_irradiance(double solar_irradiance_w_per_m2) SolarPanelPtr SolarPanel::set_min_power(double power_w) { xbt_assert(power_w >= 0, " : minimal power must be >= 0 (provided: %f)", power_w); - xbt_assert(max_power_w_ > power_w, " : maximal power must be above minimal power (provided: %f, max: %f)", power_w, max_power_w_); - kernel::actor::simcall_answered([this, power_w] {min_power_w_ = power_w;}); + xbt_assert(max_power_w_ > power_w, " : maximal power must be above minimal power (provided: %f, max: %f)", power_w, + max_power_w_); + kernel::actor::simcall_answered([this, power_w] { min_power_w_ = power_w; }); + update(); return this; } @@ -189,8 +171,10 @@ SolarPanelPtr SolarPanel::set_min_power(double power_w) SolarPanelPtr SolarPanel::set_max_power(double power_w) { xbt_assert(power_w > 0, " : maximal power must be > 0 (provided: %f)", power_w); - xbt_assert(min_power_w_ < power_w, " : maximal power must be above minimal power (provided: %f, min: %f)", power_w, min_power_w_); - kernel::actor::simcall_answered([this, power_w] {max_power_w_ = power_w;}); + xbt_assert(min_power_w_ < power_w, " : maximal power must be above minimal power (provided: %f, min: %f)", power_w, + min_power_w_); + kernel::actor::simcall_answered([this, power_w] { max_power_w_ = power_w; }); + update(); return this; }