+/**
+* \brief This function calcules the exactly value of integral between a and b. It uses directly the tmgr_trace_t strucure.
+* It works only if the two points are in the same timestep.
+* \param trace Trace structure
+* \param index Index of timestep where the points are located
+* \param a First point of interval
+* \param b Second point
+* \return the integral value
+*/
+static double surf_cpu_integrate_exactly(surf_cpu_ti_tgmr_t trace, int index,
+ double a, double b)
+{
+ int tmgr_index;
+ double integral = 0.0;
+ double time = a;
+ double tmgr_date;
+ s_tmgr_event_t elem;
+
+ tmgr_index = trace->levels[0]->trace_index[index];
+ tmgr_date = trace->levels[0]->trace_value[index];
+
+ DEBUG6
+ ("Start time: %lf End time: %lf index %d tmgr_index %d tmgr_date %lf value %lf",
+ a, b, index, tmgr_index, tmgr_date, trace->levels[0]->values[index]);
+
+ if (tmgr_index < 0)
+ return (b - a) * (trace->levels[0]->values[index]);
+
+ while (a > tmgr_date) {
+ xbt_dynar_get_cpy(trace->levels[0]->power_trace->event_list, tmgr_index,
+ &elem);
+ tmgr_date += elem.delta;
+ if (a <= tmgr_date)
+ break;
+ tmgr_index++;
+ }
+ /* sum first slice [a, tmgr_date[ */
+ if (a < tmgr_date) {
+ xbt_dynar_get_cpy(trace->levels[0]->power_trace->event_list,
+ tmgr_index - 1, &elem);
+ if (b < tmgr_date) {
+ return (b - a) * elem.value;
+ }
+
+ integral = (tmgr_date - a) * elem.value;
+ time = tmgr_date;
+ }
+
+ while (tmgr_index <
+ xbt_dynar_length(trace->levels[0]->power_trace->event_list)) {
+ xbt_dynar_get_cpy(trace->levels[0]->power_trace->event_list, tmgr_index,
+ &elem);
+ if (b <= time + elem.delta) {
+ integral += (b - time) * elem.value;
+ break;
+ }
+ integral += elem.delta * elem.value;
+ time += elem.delta;
+ tmgr_index++;
+ }
+
+ return integral;
+}
+
+/**
+* \brief This function calcules the exactly time needed to compute amount flops. It uses directly the tmgr_trace_t structure.
+* It works only if the two points are in the same timestep.
+* \param trace Trace structure
+* \param index Index of timestep where the points are located
+* \param a Start time
+* \param amount Total amount
+* \return number of seconds needed to compute amount flops
+*/
+static double surf_cpu_solve_exactly(surf_cpu_ti_tgmr_t trace, int index,
+ double a, double amount)
+{
+ int tmgr_index;
+ double remains;
+ double time, tmgr_date;
+ double slice_amount;
+ s_tmgr_event_t elem;
+
+
+ tmgr_index = trace->levels[0]->trace_index[index];
+ tmgr_date = trace->levels[0]->trace_value[index];
+ remains = amount;
+ time = a;
+
+ DEBUG6
+ ("Start time: %lf Amount: %lf index %d tmgr_index %d tmgr_date %lf value %lf",
+ a, amount, index, tmgr_index, tmgr_date,
+ trace->levels[0]->values[index]);
+ if (tmgr_index < 0)
+ return amount / (trace->levels[0]->values[index]);
+
+ while (a > tmgr_date) {
+ xbt_dynar_get_cpy(trace->levels[0]->power_trace->event_list, tmgr_index,
+ &elem);
+ tmgr_date += elem.delta;
+ if (a <= tmgr_date)
+ break;
+ tmgr_index++;
+ }
+ /* sum first slice [a, tmgr_date[ */
+ if (a < tmgr_date) {
+ xbt_dynar_get_cpy(trace->levels[0]->power_trace->event_list,
+ tmgr_index - 1, &elem);
+ slice_amount = (tmgr_date - a) * elem.value;
+ DEBUG5("slice amount %lf a %lf tmgr_date %lf elem_value %lf delta %lf",
+ slice_amount, a, tmgr_date, elem.value, elem.delta);
+ if (remains <= slice_amount) {
+ return (remains / elem.value);
+ }
+
+ remains -= (tmgr_date - a) * elem.value;
+ time = tmgr_date;
+ }
+
+ while (1) {
+ xbt_dynar_get_cpy(trace->levels[0]->power_trace->event_list, tmgr_index,
+ &elem);
+ slice_amount = elem.delta * elem.value;
+ DEBUG5("slice amount %lf a %lf tmgr_date %lf elem_value %lf delta %lf",
+ slice_amount, a, tmgr_date, elem.value, elem.delta);
+ if (remains <= slice_amount) {
+ time += remains / elem.value;
+ break;
+ }
+ time += elem.delta;
+ remains -= elem.delta * elem.value;
+ tmgr_index++;
+ }
+
+ return time - a;
+}
+