Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add battery plugin and fix DAG doc
[simgrid.git] / examples / cpp / battery-energy / s4u-battery-energy.cpp
1 /* Copyright (c) 2003-2023. The SimGrid Team. All rights reserved.          */
2
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. */
5
6 #include "simgrid/plugins/battery.hpp"
7 #include "simgrid/plugins/energy.h"
8 #include "simgrid/s4u.hpp"
9
10 #include <iostream>
11
12 XBT_LOG_NEW_DEFAULT_CATEGORY(battery_energy, "Messages specific for this s4u example");
13
14 static void manager()
15 {
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");
19
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));
26
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);
31   exec1->start();
32   simgrid::s4u::ExecPtr exec2 = simgrid::s4u::Exec::init();
33   exec2->set_flops_amount(1e10);
34   exec2->set_host(host2);
35   exec2->start();
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);
47
48   // Battery depleted
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()));
55
56   // Execs finished
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,
59            energy_grid / 3600);
60 }
61
62 int main(int argc, char* argv[])
63 {
64   simgrid::s4u::Engine e(&argc, argv);
65   e.load_platform(argv[1]);
66
67   sg_host_energy_plugin_init();
68   sg_battery_plugin_init();
69
70   simgrid::s4u::Actor::create("manager", e.host_by_name("host1"), manager);
71   e.run();
72   return 0;
73 }