X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/122a5a2813fd6d64d4db8ee7f1fdb5a62b7e0d6a..cc96213b38543567f85c88be37be5c50c1f9e6e9:/examples/cpp/battery-energy/s4u-battery-energy.cpp diff --git a/examples/cpp/battery-energy/s4u-battery-energy.cpp b/examples/cpp/battery-energy/s4u-battery-energy.cpp index 558cbc263f..6db88125a4 100644 --- a/examples/cpp/battery-energy/s4u-battery-energy.cpp +++ b/examples/cpp/battery-energy/s4u-battery-energy.cpp @@ -6,68 +6,59 @@ #include "simgrid/plugins/battery.hpp" #include "simgrid/plugins/energy.h" #include "simgrid/s4u.hpp" - -#include +#include +#include XBT_LOG_NEW_DEFAULT_CATEGORY(battery_energy, "Messages specific for this s4u example"); static void manager() { - const auto* battery = simgrid::s4u::Engine::get_instance()->host_by_name("battery"); - auto* host1 = simgrid::s4u::Engine::get_instance()->host_by_name("host1"); - auto* host2 = simgrid::s4u::Engine::get_instance()->host_by_name("host2"); + auto battery = simgrid::plugins::Battery::init("Battery", 0.8, -300, 300, 0.9, 0.9, 10, 1000); + + auto* host1 = simgrid::s4u::Engine::get_instance()->host_by_name("MyHost1"); + auto* host2 = simgrid::s4u::Engine::get_instance()->host_by_name("MyHost2"); + auto* host3 = simgrid::s4u::Engine::get_instance()->host_by_name("MyHost3"); - XBT_INFO("Initial Battery: SoC: %f SoH: %f Capacity (Total): %fWh Capacity (Usable): %fWh P: %fW", - sg_battery_get_state_of_charge(battery), sg_battery_get_state_of_health(battery), - sg_battery_get_capacity(battery), - sg_battery_get_capacity(battery) * - (sg_battery_get_state_of_charge_max(battery) - sg_battery_get_state_of_charge_min(battery)), - sg_battery_get_power(battery)); + battery->schedule_handler( + 0.2, simgrid::plugins::Battery::DISCHARGE, simgrid::plugins::Battery::Handler::PERSISTANT, + [&battery, &host1, &host2, &host3]() { + XBT_INFO("Handler -> Battery low: SoC: %f SoH: %f Energy stored: %fJ Energy provided: %fJ Energy consumed %fJ", + battery->get_state_of_charge(), battery->get_state_of_health(), battery->get_energy_stored(), + battery->get_energy_provided(), battery->get_energy_consumed()); + XBT_INFO("Disconnecting hosts %s and %s", host1->get_cname(), host2->get_cname()); + battery->connect_host(host1, false); + battery->connect_host(host2, false); + XBT_INFO("Energy consumed this far by: %s: %fJ, %s: %fJ, %s: %fJ", host1->get_cname(), + sg_host_get_consumed_energy(host1), host2->get_cname(), sg_host_get_consumed_energy(host2), + host3->get_cname(), sg_host_get_consumed_energy(host3)); + }); - // Start execs on each host - simgrid::s4u::ExecPtr exec1 = simgrid::s4u::Exec::init(); - exec1->set_flops_amount(1e10); - exec1->set_host(host1); - exec1->start(); - simgrid::s4u::ExecPtr exec2 = simgrid::s4u::Exec::init(); - exec2->set_flops_amount(1e10); - exec2->set_host(host2); - exec2->start(); - // Set power generation from the battery - double total_power_w = - sg_host_get_wattmax_at(host1, host1->get_pstate()) + sg_host_get_wattmax_at(host2, host2->get_pstate()); - sg_battery_set_power(battery, total_power_w); - XBT_INFO("Battery power set to: %fW (host1) + %fW (host2)", sg_host_get_wattmax_at(host1, host1->get_pstate()), - sg_host_get_wattmax_at(host2, host2->get_pstate())); - double end = sg_battery_get_next_event_date(battery); - XBT_INFO("The battery will be depleted at: %f", end); - XBT_INFO("Exec1 will be finished in: %f", exec1->get_remaining() / host1->get_speed()); - XBT_INFO("Exec2 will be finished in: %f", exec2->get_remaining() / host2->get_speed()); - simgrid::s4u::this_actor::sleep_until(end); + XBT_INFO("Battery state: SoC: %f SoH: %f Energy stored: %fJ Energy provided: %fJ Energy consumed %fJ", + battery->get_state_of_charge(), battery->get_state_of_health(), battery->get_energy_stored(), + battery->get_energy_provided(), battery->get_energy_consumed()); + XBT_INFO("Connecting hosts %s and %s to the battery", host1->get_cname(), host2->get_cname()); + battery->connect_host(host1); + battery->connect_host(host2); - // Battery depleted - XBT_INFO("Battery depleted: SoC: %f SoH: %f P: %fW", sg_battery_get_state_of_charge(battery), - sg_battery_get_state_of_health(battery), sg_battery_get_power(battery)); - double energy_battery = sg_host_get_consumed_energy(host1) + sg_host_get_consumed_energy(host2); - XBT_INFO("Pursuing with power from the grid until both execs are finished"); - simgrid::s4u::this_actor::sleep_for( - std::max(exec1->get_remaining() / host1->get_speed(), exec2->get_remaining() / host2->get_speed())); + double flops = 1e9; + XBT_INFO("Host %s will now execute %f flops", host1->get_cname(), flops); + host2->execute(flops); - // Execs finished - double energy_grid = sg_host_get_consumed_energy(host1) + sg_host_get_consumed_energy(host2) - energy_battery; - XBT_INFO("Energy consumed: Battery: %fJ (%fWh) Grid: %fJ (%fWh)", energy_battery, energy_battery / 3600, energy_grid, - energy_grid / 3600); + simgrid::s4u::this_actor::sleep_until(200); + XBT_INFO("Battery state: SoC: %f SoH: %f Energy stored: %fJ Energy provided: %fJ Energy consumed %fJ", + battery->get_state_of_charge(), battery->get_state_of_health(), battery->get_energy_stored(), + battery->get_energy_provided(), battery->get_energy_consumed()); } int main(int argc, char* argv[]) { simgrid::s4u::Engine e(&argc, argv); + // if you plan to use Battery::connect_host you have to init the energy plugin at start. + sg_host_energy_plugin_init(); e.load_platform(argv[1]); - sg_host_energy_plugin_init(); - sg_battery_plugin_init(); + simgrid::s4u::Actor::create("manager", e.host_by_name("MyHost1"), manager); - simgrid::s4u::Actor::create("manager", e.host_by_name("host1"), manager); e.run(); return 0; }