1 /* Copyright (c) 2003-2023. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
6 #include "simgrid/plugins/battery.hpp"
7 #include "simgrid/plugins/energy.h"
8 #include "simgrid/s4u.hpp"
12 XBT_LOG_NEW_DEFAULT_CATEGORY(battery_energy, "Messages specific for this s4u example");
16 auto battery = simgrid::s4u::Engine::get_instance()->host_by_name("battery");
17 auto host1 = simgrid::s4u::Engine::get_instance()->host_by_name("host1");
18 auto host2 = simgrid::s4u::Engine::get_instance()->host_by_name("host2");
20 XBT_INFO("Initial Battery: SoC: %f SoH: %f Capacity (Total): %fWh Capacity (Usable): %fWh P: %fW",
21 sg_battery_get_state_of_charge(battery), sg_battery_get_state_of_health(battery),
22 sg_battery_get_capacity(battery),
23 sg_battery_get_capacity(battery) *
24 (sg_battery_get_state_of_charge_max(battery) - sg_battery_get_state_of_charge_min(battery)),
25 sg_battery_get_power(battery));
27 // Start execs on each host
28 simgrid::s4u::ExecPtr exec1 = simgrid::s4u::Exec::init();
29 exec1->set_flops_amount(1e10);
30 exec1->set_host(host1);
32 simgrid::s4u::ExecPtr exec2 = simgrid::s4u::Exec::init();
33 exec2->set_flops_amount(1e10);
34 exec2->set_host(host2);
36 // Set power generation from the battery
37 double total_power_w =
38 sg_host_get_wattmax_at(host1, host1->get_pstate()) + sg_host_get_wattmax_at(host2, host2->get_pstate());
39 sg_battery_set_power(battery, total_power_w);
40 XBT_INFO("Battery power set to: %fW (host1) + %fW (host2)", sg_host_get_wattmax_at(host1, host1->get_pstate()),
41 sg_host_get_wattmax_at(host2, host2->get_pstate()));
42 double end = sg_battery_get_next_event_date(battery);
43 XBT_INFO("The battery will be depleted at: %f", end);
44 XBT_INFO("Exec1 will be finished in: %f", exec1->get_remaining() / host1->get_speed());
45 XBT_INFO("Exec2 will be finished in: %f", exec2->get_remaining() / host2->get_speed());
46 simgrid::s4u::this_actor::sleep_until(end);
49 XBT_INFO("Battery depleted: SoC: %f SoH: %f P: %fW", sg_battery_get_state_of_charge(battery),
50 sg_battery_get_state_of_health(battery), sg_battery_get_power(battery));
51 double energy_battery = sg_host_get_consumed_energy(host1) + sg_host_get_consumed_energy(host2);
52 XBT_INFO("Pursuing with power from the grid until both execs are finished");
53 simgrid::s4u::this_actor::sleep_for(
54 std::max(exec1->get_remaining() / host1->get_speed(), exec2->get_remaining() / host2->get_speed()));
57 double energy_grid = sg_host_get_consumed_energy(host1) + sg_host_get_consumed_energy(host2) - energy_battery;
58 XBT_INFO("Energy consumed: Battery: %fJ (%fWh) Grid: %fJ (%fWh)", energy_battery, energy_battery / 3600, energy_grid,
62 int main(int argc, char* argv[])
64 simgrid::s4u::Engine e(&argc, argv);
65 e.load_platform(argv[1]);
67 sg_host_energy_plugin_init();
68 sg_battery_plugin_init();
70 simgrid::s4u::Actor::create("manager", e.host_by_name("host1"), manager);