+
+namespace s4u {
+
+NetZone* create_torus_zone(const std::string& name, const NetZone* parent, const std::vector<unsigned long>& dimensions,
+ const ClusterCallbacks& set_callbacks, double bandwidth, double latency,
+ Link::SharingPolicy sharing_policy)
+{
+ int tot_elements = std::accumulate(dimensions.begin(), dimensions.end(), 1, std::multiplies<>());
+ if (dimensions.empty() || tot_elements <= 0)
+ throw std::invalid_argument("TorusZone: incorrect dimensions parameter, each value must be > 0");
+ if (bandwidth <= 0)
+ throw std::invalid_argument("TorusZone: incorrect bandwidth for internode communication, bw=" +
+ std::to_string(bandwidth));
+ if (latency < 0)
+ throw std::invalid_argument("TorusZone: incorrect latency for internode communication, lat=" +
+ std::to_string(latency));
+
+ auto* zone = new kernel::routing::TorusZone(name);
+ zone->set_topology(dimensions);
+ if (parent)
+ zone->set_parent(parent->get_impl());
+
+ zone->set_link_characteristics(bandwidth, latency, sharing_policy);
+
+ for (int i = 0; i < tot_elements; i++) {
+ kernel::routing::NetPoint* netpoint;
+ Link* limiter;
+ Link* loopback;
+ zone->fill_leaf_from_cb(i, dimensions, set_callbacks, &netpoint, &loopback, &limiter);
+
+ zone->create_torus_links(netpoint->id(), i, zone->node_pos_with_loopback_limiter(netpoint->id()));
+ }
+
+ return zone->get_iface();
+}
+} // namespace s4u
+