Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add MPI_Win_get_group, and activate some tests using *c2f and *f2c calls
[simgrid.git] / src / smpi / smpi_pmpi.c
index d6c2616..e75d645 100644 (file)
@@ -478,30 +478,14 @@ int PMPI_Group_difference(MPI_Group group1, MPI_Group group2, MPI_Group * newgro
 
 int PMPI_Group_incl(MPI_Group group, int n, int *ranks, MPI_Group * newgroup)
 {
-  int retval, i, index;
+  int retval;
 
   if (group == MPI_GROUP_NULL) {
     retval = MPI_ERR_GROUP;
   } else if (newgroup == NULL) {
     retval = MPI_ERR_ARG;
   } else {
-    if (n == 0) {
-      *newgroup = MPI_GROUP_EMPTY;
-    } else if (n == smpi_group_size(group)) {
-      *newgroup = group;
-      if(group!= smpi_comm_group(MPI_COMM_WORLD)
-                && group != MPI_GROUP_NULL
-                && group != smpi_comm_group(MPI_COMM_SELF)
-                && group != MPI_GROUP_EMPTY)
-      smpi_group_use(group);
-    } else {
-      *newgroup = smpi_group_new(n);
-      for (i = 0; i < n; i++) {
-        index = smpi_group_index(group, ranks[i]);
-        smpi_group_set_mapping(*newgroup, index, i);
-      }
-    }
-    retval = MPI_SUCCESS;
+    retval = smpi_group_incl(group, n, ranks, newgroup);
   }
   return retval;
 }
@@ -567,10 +551,12 @@ int PMPI_Group_range_incl(MPI_Group group, int n, int ranges[][3],
       size = 0;
       for (i = 0; i < n; i++) {
         for (rank = ranges[i][0];       /* First */
-             rank >= 0; /* Last */
+             rank >= 0 && rank < smpi_group_size(group); /* Last */
               ) {
           size++;
-
+          if(rank == ranges[i][1]){/*already last ?*/
+            break;
+          }
           rank += ranges[i][2]; /* Stride */
          if (ranges[i][0]<ranges[i][1]){
              if(rank > ranges[i][1])
@@ -586,11 +572,14 @@ int PMPI_Group_range_incl(MPI_Group group, int n, int ranges[][3],
       j = 0;
       for (i = 0; i < n; i++) {
         for (rank = ranges[i][0];     /* First */
-             rank >= 0; /* Last */
+             rank >= 0 && rank < smpi_group_size(group); /* Last */
              ) {
           index = smpi_group_index(group, rank);
           smpi_group_set_mapping(*newgroup, index, j);
           j++;
+          if(rank == ranges[i][1]){/*already last ?*/
+            break;
+          }
           rank += ranges[i][2]; /* Stride */
          if (ranges[i][0]<ranges[i][1]){
            if(rank > ranges[i][1])
@@ -628,10 +617,12 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3],
       size = smpi_group_size(group);
       for (i = 0; i < n; i++) {
         for (rank = ranges[i][0];       /* First */
-             rank >= 0; /* Last */
+             rank >= 0 && rank < smpi_group_size(group); /* Last */
               ) {
           size--;
-
+          if(rank == ranges[i][1]){/*already last ?*/
+            break;
+          }
           rank += ranges[i][2]; /* Stride */
          if (ranges[i][0]<ranges[i][1]){
              if(rank > ranges[i][1])
@@ -651,14 +642,17 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3],
         while (newrank < size) {
           add=1;
           for (i = 0; i < n; i++) {
-            for (rank = ranges[i][0];rank >= 0;){
+            for (rank = ranges[i][0];
+                rank >= 0 && rank < smpi_group_size(group);
+                ){
               if(rank==oldrank){
                   add=0;
                   break;
               }
-
+              if(rank == ranges[i][1]){/*already last ?*/
+                break;
+              }
               rank += ranges[i][2]; /* Stride */
-
               if (ranges[i][0]<ranges[i][1]){
                   if(rank > ranges[i][1])
                     break;
@@ -2751,15 +2745,24 @@ int PMPI_Win_set_name(MPI_Win  win, char * name)
 
 int PMPI_Win_get_name(MPI_Win  win, char * name, int* len)
 {
-  int retval = 0;
+  int retval = MPI_SUCCESS;
 
   if (win == MPI_WIN_NULL)  {
-    retval = MPI_ERR_TYPE;
+    retval = MPI_ERR_WIN;
   } else if (name == NULL)  {
     retval = MPI_ERR_ARG;
   } else {
     smpi_mpi_win_get_name(win, name, len);
-    retval = MPI_SUCCESS;
+  }
+  return retval;
+}
+
+int PMPI_Win_get_group(MPI_Win  win, MPI_Group * group){
+  int retval = MPI_SUCCESS;
+  if (win == MPI_WIN_NULL)  {
+    retval = MPI_ERR_WIN;
+  }else {
+    smpi_mpi_win_get_group(win, group);
   }
   return retval;
 }
@@ -2903,6 +2906,56 @@ int PMPI_Type_get_name(MPI_Datatype  datatype, char * name, int* len)
   return retval;
 }
 
+
+MPI_Datatype PMPI_Type_f2c(MPI_Fint datatype){
+  return smpi_type_f2c(datatype);
+}
+
+MPI_Fint PMPI_Type_c2f(MPI_Datatype datatype){
+  return smpi_type_c2f( datatype);
+}
+
+MPI_Group PMPI_Group_f2c(MPI_Fint group){
+  return smpi_group_f2c( group);
+}
+
+MPI_Fint PMPI_Group_c2f(MPI_Group group){
+  return smpi_group_c2f(group);
+}
+
+MPI_Request PMPI_Request_f2c(MPI_Fint request){
+  return smpi_request_f2c(request);
+}
+
+MPI_Fint PMPI_Request_c2f(MPI_Request request) {
+  return smpi_request_c2f(request);
+}
+
+MPI_Win PMPI_Win_f2c(MPI_Fint win){
+  return smpi_win_f2c(win);
+}
+
+MPI_Fint PMPI_Win_c2f(MPI_Win win){
+  return smpi_win_c2f(win);
+}
+
+MPI_Op PMPI_Op_f2c(MPI_Fint op){
+  return smpi_op_f2c(op);
+}
+
+MPI_Fint PMPI_Op_c2f(MPI_Op op){
+  return smpi_op_c2f(op);
+}
+
+MPI_Comm PMPI_Comm_f2c(MPI_Fint comm){
+  return smpi_comm_f2c(comm);
+}
+
+MPI_Fint PMPI_Comm_c2f(MPI_Comm comm){
+  return smpi_comm_c2f(comm);
+}
+
+
 /* The following calls are not yet implemented and will fail at runtime. */
 /* Once implemented, please move them above this notice. */
 
@@ -2912,6 +2965,21 @@ int PMPI_Type_get_name(MPI_Datatype  datatype, char * name, int* len)
   }
 
 
+MPI_Info PMPI_Info_f2c(MPI_Fint info){
+  NOT_YET_IMPLEMENTED
+}
+
+MPI_Fint PMPI_Info_c2f(MPI_Info info){
+  NOT_YET_IMPLEMENTED
+}
+
+MPI_Errhandler PMPI_Errhandler_f2c(MPI_Fint errhandler){
+  NOT_YET_IMPLEMENTED
+}
+
+MPI_Fint PMPI_Errhandler_c2f(MPI_Errhandler errhandler){
+  NOT_YET_IMPLEMENTED
+}
 
 int PMPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int* size) {
   NOT_YET_IMPLEMENTED