- task->surf_action = surf_workstation_resource->extension_public->
- execute_parallel_task(task->workstation_nb,
- surf_workstations,
- task->computation_amount,
- task->communication_amount,
- task->amount,
- task->rate);
- surf_workstation_resource->common_public->action_set_data(task->surf_action, task);
+ task->surf_action = NULL;
+ if((task->workstation_nb==1) &&
+ (task->communication_amount[0]==0.0)) {
+ task->surf_action = surf_workstation_model->extension_public->
+ execute(surf_workstations[0], task->computation_amount[0]);
+ } else if((task->workstation_nb==1) &&
+ (task->computation_amount[0]==0.0)) {
+ task->surf_action = surf_workstation_model->extension_public->
+ communicate(surf_workstations[0], surf_workstations[0],
+ task->communication_amount[0],task->rate);
+ } else if((task->workstation_nb==2) &&
+ (task->computation_amount[0]==0.0)&&
+ (task->computation_amount[1]==0.0)) {
+ int nb=0;
+ double value=0.0;
+
+ for (i = 0; i < task->workstation_nb*task->workstation_nb; i++) {
+ if(task->communication_amount[i]>0.0) {
+ nb++;
+ value = task->communication_amount[i];
+ }
+ }
+ if(nb==1) {
+ task->surf_action = surf_workstation_model->extension_public->
+ communicate(surf_workstations[0], surf_workstations[1],
+ value, task->rate);
+ }
+ }
+ if(!task->surf_action) {
+ double *computation_amount = xbt_new(double, task->workstation_nb);
+ double *communication_amount = xbt_new(double, task->workstation_nb *
+ task->workstation_nb);
+
+ memcpy(computation_amount, task->computation_amount, sizeof(double) *
+ task->workstation_nb);
+ memcpy(communication_amount, task->communication_amount,
+ sizeof(double) * task->workstation_nb * task->workstation_nb);
+
+ task->surf_action = surf_workstation_model->extension_public->
+ execute_parallel_task(task->workstation_nb,
+ surf_workstations,
+ computation_amount,
+ communication_amount,
+ task->amount,
+ task->rate);
+ } else {
+ xbt_free(surf_workstations);
+ }
+
+ surf_workstation_model->common_public->action_set_data(task->surf_action, task);