+static double net_get_link_bandwidth(const void *link)
+{
+ surf_resource_lmm_t lmm = (surf_resource_lmm_t) link;
+ return lmm->power.peak * lmm->power.scale;
+}
+
+static double net_get_link_latency(const void *link)
+{
+ return ((link_CM02_t) link)->lat_current;
+}
+
+static int net_link_shared(const void *link)
+{
+ return lmm_constraint_is_shared(((surf_resource_lmm_t) link)->constraint);
+}
+
+static void net_action_suspend(surf_action_t action)
+{
+ ((surf_action_network_CM02_t) action)->suspended = 1;
+ lmm_update_variable_weight(network_maxmin_system,
+ ((surf_action_network_CM02_t) action)->variable,
+ 0.0);
+}
+
+static void net_action_resume(surf_action_t action)
+{
+ if (((surf_action_network_CM02_t) action)->suspended) {
+ lmm_update_variable_weight(network_maxmin_system,
+ ((surf_action_network_CM02_t)
+ action)->variable,
+ ((surf_action_network_CM02_t) action)->weight);
+ ((surf_action_network_CM02_t) action)->suspended = 0;
+ }
+}
+
+static int net_action_is_suspended(surf_action_t action)
+{
+ return ((surf_action_network_CM02_t) action)->suspended;
+}
+
+void net_action_set_max_duration(surf_action_t action, double duration)
+{
+ action->max_duration = duration;
+}
+
+static void net_finalize(void)
+{
+ surf_model_exit(surf_network_model);
+ surf_network_model = NULL;
+
+ global_routing->finalize();
+
+ lmm_system_free(network_maxmin_system);
+ network_maxmin_system = NULL;
+}
+
+static void surf_network_model_init_internal(void)
+{
+ surf_network_model = surf_model_init();
+
+ surf_network_model->name = "network";
+ surf_network_model->action_unref = net_action_unref;
+ surf_network_model->action_cancel = net_action_cancel;
+ surf_network_model->action_recycle = net_action_recycle;
+ surf_network_model->get_remains = net_action_get_remains;
+#ifdef HAVE_LATENCY_BOUND_TRACKING
+ surf_network_model->get_latency_limited = net_get_link_latency_limited;
+#endif
+
+ surf_network_model->model_private->resource_used = net_resource_used;
+ surf_network_model->model_private->share_resources = net_share_resources;
+ surf_network_model->model_private->update_actions_state =
+ net_update_actions_state;
+ surf_network_model->model_private->update_resource_state =
+ net_update_resource_state;
+ surf_network_model->model_private->finalize = net_finalize;
+
+ surf_network_model->suspend = net_action_suspend;
+ surf_network_model->resume = net_action_resume;
+ surf_network_model->is_suspended = net_action_is_suspended;
+ surf_cpu_model->set_max_duration = net_action_set_max_duration;
+
+ surf_network_model->extension.network.communicate = net_communicate;
+ surf_network_model->extension.network.get_link_bandwidth =
+ net_get_link_bandwidth;
+ surf_network_model->extension.network.get_link_latency =
+ net_get_link_latency;
+ surf_network_model->extension.network.link_shared = net_link_shared;
+ surf_network_model->extension.network.add_traces = net_add_traces;
+ surf_network_model->extension.network.create_resource = net_create_resource;
+
+ if (!network_maxmin_system)
+ network_maxmin_system = lmm_system_new();
+
+ routing_model_create(sizeof(link_CM02_t),
+ net_link_new(xbt_strdup("__loopback__"),
+ 498000000, NULL, 0.000015, NULL,
+ SURF_RESOURCE_ON, NULL, SURF_LINK_FATPIPE,
+ NULL));
+}
+
+
+
+/************************************************************************/
+/* New model based on LV08 and experimental results of MPI ping-pongs */
+/************************************************************************/
+void surf_network_model_init_SMPI(const char *filename)
+{
+
+ if (surf_network_model)
+ return;
+ surf_network_model_init_internal();
+ latency_factor_callback = &smpi_latency_factor;
+ bandwidth_factor_callback = &smpi_bandwidth_factor;
+ bandwidth_constraint_callback = &smpi_bandwidth_constraint;
+ net_define_callbacks(filename);
+ xbt_dynar_push(model_list, &surf_network_model);
+ network_solve = lmm_solve;
+
+ xbt_cfg_setdefault_double(_surf_cfg_set,"network/weight_S", 8775);
+
+ update_model_description(surf_network_model_description,
+ "SMPI", surf_network_model);
+}
+
+/************************************************************************/
+/* New model based on optimizations discussed during this thesis */
+/************************************************************************/
+void surf_network_model_init_LegrandVelho(const char *filename)