Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[DOC] Fixed even more errors.
[simgrid.git] / src / smpi / smpi_f77.c
index a832f33..03e1f24 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2014. The SimGrid Team.
+/* Copyright (c) 2010-2015. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
@@ -60,6 +60,71 @@ static char* get_key_id(char* key, int id) {
   return key;
 }
 
+
+
+static void smpi_init_fortran_types(){
+   if(!comm_lookup){
+     comm_lookup = xbt_dict_new_homogeneous(NULL);
+     smpi_comm_c2f(MPI_COMM_WORLD);
+     group_lookup = xbt_dict_new_homogeneous(NULL);
+     request_lookup = xbt_dict_new_homogeneous(NULL);
+     datatype_lookup = xbt_dict_new_homogeneous(NULL);
+     win_lookup = xbt_dict_new_homogeneous(NULL);
+     info_lookup = xbt_dict_new_homogeneous(NULL);
+     smpi_type_c2f(MPI_BYTE);
+     smpi_type_c2f(MPI_CHAR);
+     #if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__)
+     smpi_type_c2f(MPI_INT);
+     smpi_type_c2f(MPI_INT);
+     #else
+     smpi_type_c2f(MPI_LONG);
+     smpi_type_c2f(MPI_LONG);
+     #endif
+     smpi_type_c2f(MPI_INT8_T);
+     smpi_type_c2f(MPI_INT16_T);
+     smpi_type_c2f(MPI_INT32_T);
+     smpi_type_c2f(MPI_INT64_T);
+     smpi_type_c2f(MPI_FLOAT);
+     smpi_type_c2f(MPI_FLOAT);
+     smpi_type_c2f(MPI_DOUBLE);
+     smpi_type_c2f(MPI_DOUBLE);
+     smpi_type_c2f(MPI_C_FLOAT_COMPLEX);
+     smpi_type_c2f(MPI_C_DOUBLE_COMPLEX);
+     #if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__)
+     smpi_type_c2f(MPI_2INT);
+     #else
+     smpi_type_c2f(MPI_2LONG);
+     #endif
+     smpi_type_c2f(MPI_UINT8_T);
+     smpi_type_c2f(MPI_UINT16_T);
+     smpi_type_c2f(MPI_UINT32_T);
+     smpi_type_c2f(MPI_UINT64_T);
+     smpi_type_c2f(MPI_2FLOAT);
+     smpi_type_c2f(MPI_2DOUBLE);
+     smpi_type_c2f(MPI_DOUBLE);
+     smpi_type_c2f(MPI_DOUBLE);
+     smpi_type_c2f(MPI_INT);
+     smpi_type_c2f(MPI_DATATYPE_NULL);
+     smpi_type_c2f(MPI_DATATYPE_NULL);
+     smpi_type_c2f(MPI_DATATYPE_NULL);
+     smpi_type_c2f(MPI_DATATYPE_NULL);
+     op_lookup = xbt_dict_new_homogeneous(NULL);
+     smpi_op_c2f(MPI_MAX);
+     smpi_op_c2f(MPI_MIN);
+     smpi_op_c2f(MPI_MAXLOC);
+     smpi_op_c2f(MPI_MINLOC);
+     smpi_op_c2f(MPI_SUM);
+     smpi_op_c2f(MPI_PROD);
+     smpi_op_c2f(MPI_LAND);
+     smpi_op_c2f(MPI_LOR);
+     smpi_op_c2f(MPI_LXOR);
+     smpi_op_c2f(MPI_BAND);
+     smpi_op_c2f(MPI_BOR);
+     smpi_op_c2f(MPI_BXOR);
+   }
+}
+
+
 int smpi_comm_c2f(MPI_Comm comm) {
   static int comm_id = 0;
   char key[KEY_SIZE];
@@ -74,6 +139,7 @@ static void free_comm(int comm) {
 }
 
 MPI_Comm smpi_comm_f2c(int comm) {
+  smpi_init_fortran_types();
   if(comm == -2) {
     return MPI_COMM_SELF;
   }else if(comm==0){
@@ -96,6 +162,7 @@ int smpi_group_c2f(MPI_Group group) {
 }
 
 MPI_Group smpi_group_f2c(int group) {
+  smpi_init_fortran_types();
   if(group == -2) {
     return MPI_GROUP_EMPTY;
   } else if(group_lookup && group >= 0) {
@@ -121,6 +188,7 @@ int smpi_request_c2f(MPI_Request req) {
 }
 
 MPI_Request smpi_request_f2c(int req) {
+  smpi_init_fortran_types();
   char key[KEY_SIZE];
   if(req==MPI_FORTRAN_REQUEST_NULL)return MPI_REQUEST_NULL;
   return (MPI_Request)xbt_dict_get(request_lookup, get_key_id(key, req));
@@ -141,6 +209,7 @@ int smpi_type_c2f(MPI_Datatype datatype) {
 }
 
 MPI_Datatype smpi_type_f2c(int datatype) {
+  smpi_init_fortran_types();
   char key[KEY_SIZE];
   return datatype >= 0
          ? (MPI_Datatype)xbt_dict_get_or_null(datatype_lookup, get_key(key, datatype))
@@ -161,6 +230,7 @@ int smpi_op_c2f(MPI_Op op) {
 }
 
 MPI_Op smpi_op_f2c(int op) {
+  smpi_init_fortran_types();
   char key[KEY_SIZE];
    return op >= 0
           ? (MPI_Op)xbt_dict_get_or_null(op_lookup,  get_key(key, op))
@@ -181,6 +251,7 @@ int smpi_win_c2f(MPI_Win win) {
 }
 
 MPI_Win smpi_win_f2c(int win) {
+  smpi_init_fortran_types();
   char key[KEY_SIZE];
    return win >= 0
           ? (MPI_Win)xbt_dict_get_or_null(win_lookup,  get_key(key, win))
@@ -202,6 +273,7 @@ int smpi_info_c2f(MPI_Info info) {
 }
 
 MPI_Info smpi_info_f2c(int info) {
+  smpi_init_fortran_types();
   char key[KEY_SIZE];
    return info >= 0
           ? (MPI_Info)xbt_dict_get_or_null(info_lookup,  get_key(key, info))
@@ -213,68 +285,6 @@ static void free_info(int info) {
   xbt_dict_remove(info_lookup, get_key(key, info));
 }
 
-static void smpi_init_fortran_types(){
-   if(!comm_lookup){
-     comm_lookup = xbt_dict_new_homogeneous(NULL);
-     smpi_comm_c2f(MPI_COMM_WORLD);
-     group_lookup = xbt_dict_new_homogeneous(NULL);
-     request_lookup = xbt_dict_new_homogeneous(NULL);
-     datatype_lookup = xbt_dict_new_homogeneous(NULL);
-     win_lookup = xbt_dict_new_homogeneous(NULL);
-     info_lookup = xbt_dict_new_homogeneous(NULL);
-     smpi_type_c2f(MPI_BYTE);
-     smpi_type_c2f(MPI_CHAR);
-     #if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__)
-     smpi_type_c2f(MPI_INT);
-     smpi_type_c2f(MPI_INT);
-     #else
-     smpi_type_c2f(MPI_LONG);
-     smpi_type_c2f(MPI_LONG);
-     #endif
-     smpi_type_c2f(MPI_INT8_T);
-     smpi_type_c2f(MPI_INT16_T);
-     smpi_type_c2f(MPI_INT32_T);
-     smpi_type_c2f(MPI_INT64_T);
-     smpi_type_c2f(MPI_FLOAT);
-     smpi_type_c2f(MPI_FLOAT);
-     smpi_type_c2f(MPI_DOUBLE);
-     smpi_type_c2f(MPI_DOUBLE);
-     smpi_type_c2f(MPI_C_FLOAT_COMPLEX);
-     smpi_type_c2f(MPI_C_DOUBLE_COMPLEX);
-     #if defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__)
-     smpi_type_c2f(MPI_2INT);
-     #else
-     smpi_type_c2f(MPI_2LONG);
-     #endif
-     smpi_type_c2f(MPI_UINT8_T);
-     smpi_type_c2f(MPI_UINT16_T);
-     smpi_type_c2f(MPI_UINT32_T);
-     smpi_type_c2f(MPI_UINT64_T);
-     smpi_type_c2f(MPI_2FLOAT);
-     smpi_type_c2f(MPI_2DOUBLE);
-     smpi_type_c2f(MPI_DOUBLE);
-     smpi_type_c2f(MPI_DOUBLE);
-     smpi_type_c2f(MPI_INT);
-     smpi_type_c2f(MPI_DATATYPE_NULL);
-     smpi_type_c2f(MPI_DATATYPE_NULL);
-     smpi_type_c2f(MPI_DATATYPE_NULL);
-     smpi_type_c2f(MPI_DATATYPE_NULL);
-     op_lookup = xbt_dict_new_homogeneous(NULL);
-     smpi_op_c2f(MPI_MAX);
-     smpi_op_c2f(MPI_MIN);
-     smpi_op_c2f(MPI_MAXLOC);
-     smpi_op_c2f(MPI_MINLOC);
-     smpi_op_c2f(MPI_SUM);
-     smpi_op_c2f(MPI_PROD);
-     smpi_op_c2f(MPI_LAND);
-     smpi_op_c2f(MPI_LOR);
-     smpi_op_c2f(MPI_LXOR);
-     smpi_op_c2f(MPI_BAND);
-     smpi_op_c2f(MPI_BOR);
-     smpi_op_c2f(MPI_BXOR);
-   }
-}
-
 
 void mpi_init_(int* ierr) {
     smpi_init_fortran_types();
@@ -379,7 +389,7 @@ void mpi_initialized_(int* flag, int* ierr){
 void mpi_send_init_(void *buf, int* count, int* datatype, int* dst, int* tag,
                      int* comm, int* request, int* ierr) {
   MPI_Request req;
-
+  buf = (char *) FORT_BOTTOM(buf);
   *ierr = MPI_Send_init(buf, *count, smpi_type_f2c(*datatype), *dst, *tag,
                         smpi_comm_f2c(*comm), &req);
   if(*ierr == MPI_SUCCESS) {
@@ -411,12 +421,14 @@ void mpi_irsend_(void *buf, int* count, int* datatype, int* dst,
 
 void mpi_send_(void* buf, int* count, int* datatype, int* dst,
                 int* tag, int* comm, int* ierr) {
+  buf = (char *) FORT_BOTTOM(buf);
    *ierr = MPI_Send(buf, *count, smpi_type_f2c(*datatype), *dst, *tag,
                     smpi_comm_f2c(*comm));
 }
 
 void mpi_rsend_(void* buf, int* count, int* datatype, int* dst,
                 int* tag, int* comm, int* ierr) {
+  buf = (char *) FORT_BOTTOM(buf);
    *ierr = MPI_Rsend(buf, *count, smpi_type_f2c(*datatype), *dst, *tag,
                     smpi_comm_f2c(*comm));
 }
@@ -425,6 +437,8 @@ void mpi_sendrecv_(void* sendbuf, int* sendcount, int* sendtype, int* dst,
                 int* sendtag, void *recvbuf, int* recvcount,
                 int* recvtype, int* src, int* recvtag,
                 int* comm, MPI_Status* status, int* ierr) {
+  sendbuf = (char *) FORT_BOTTOM(sendbuf);
+  recvbuf = (char *) FORT_BOTTOM(recvbuf);
    *ierr = MPI_Sendrecv(sendbuf, *sendcount, smpi_type_f2c(*sendtype), *dst,
        *sendtag, recvbuf, *recvcount,smpi_type_f2c(*recvtype), *src, *recvtag,
        smpi_comm_f2c(*comm), FORT_STATUS_IGNORE(status));
@@ -433,7 +447,7 @@ void mpi_sendrecv_(void* sendbuf, int* sendcount, int* sendtype, int* dst,
 void mpi_recv_init_(void *buf, int* count, int* datatype, int* src, int* tag,
                      int* comm, int* request, int* ierr) {
   MPI_Request req;
-
+  buf = (char *) FORT_BOTTOM(buf);
   *ierr = MPI_Recv_init(buf, *count, smpi_type_f2c(*datatype), *src, *tag,
                         smpi_comm_f2c(*comm), &req);
   if(*ierr == MPI_SUCCESS) {
@@ -454,7 +468,8 @@ void mpi_irecv_(void *buf, int* count, int* datatype, int* src, int* tag,
 
 void mpi_recv_(void* buf, int* count, int* datatype, int* src,
                 int* tag, int* comm, MPI_Status* status, int* ierr) {
-   *ierr = MPI_Recv(buf, *count, smpi_type_f2c(*datatype), *src, *tag,
+  buf = (char *) FORT_BOTTOM(buf);
+  *ierr = MPI_Recv(buf, *count, smpi_type_f2c(*datatype), *src, *tag,
                     smpi_comm_f2c(*comm), status);
 }
 
@@ -748,6 +763,22 @@ void mpi_win_create_( int *base, MPI_Aint* size, int* disp_unit, int* info, int*
  }
 }
 
+void mpi_win_post_(int* group, int assert, int* win, int* ierr){
+  *ierr =  MPI_Win_post(smpi_group_f2c(*group), assert, smpi_win_f2c(*win));
+}
+
+void mpi_win_start_(int* group, int assert, int* win, int* ierr){
+  *ierr =  MPI_Win_start(smpi_group_f2c(*group), assert, smpi_win_f2c(*win));
+}
+
+void mpi_win_complete_(int* win, int* ierr){
+  *ierr =  MPI_Win_complete(smpi_win_f2c(*win));
+}
+
+void mpi_win_wait_(int* win, int* ierr){
+  *ierr =  MPI_Win_wait(smpi_win_f2c(*win));
+}
+
 void mpi_win_set_name_ (int*  win, char * name, int* ierr, int size){
  //handle trailing blanks
  while(name[size-1]==' ')size--;
@@ -1341,18 +1372,30 @@ void mpi_type_create_indexed_block_ (int* count, int* blocklength, int* indices,
 
 void mpi_type_struct_ (int* count, int* blocklens, MPI_Aint* indices, int* old_types, int*  newtype, int* ierr) {
   MPI_Datatype tmp;
-  *ierr = MPI_Type_struct(*count, blocklens, indices, (MPI_Datatype*)old_types, &tmp);
+  int i=0;
+  MPI_Datatype* types = (MPI_Datatype*)xbt_malloc(*count*sizeof(MPI_Datatype));
+  for(i=0; i< *count; i++){
+    types[i] = smpi_type_f2c(old_types[i]);
+  }
+  *ierr = MPI_Type_struct(*count, blocklens, indices, types, &tmp);
   if(*ierr == MPI_SUCCESS) {
     *newtype = smpi_type_c2f(tmp);
   }
+  xbt_free(types);
 }
 
 void mpi_type_create_struct_ (int* count, int* blocklens, MPI_Aint* indices, int*  old_types, int*  newtype, int* ierr) {
   MPI_Datatype tmp;
-  *ierr = MPI_Type_create_struct(*count, blocklens, indices, (MPI_Datatype*)old_types, &tmp);
+  int i=0;
+  MPI_Datatype* types = (MPI_Datatype*)xbt_malloc(*count*sizeof(MPI_Datatype));
+  for(i=0; i< *count; i++){
+    types[i] = smpi_type_f2c(old_types[i]);
+  }
+  *ierr = MPI_Type_create_struct(*count, blocklens, indices, types, &tmp);
   if(*ierr == MPI_SUCCESS) {
     *newtype = smpi_type_c2f(tmp);
   }
+  xbt_free(types);
 }
 
 void mpi_ssend_ (void* buf, int* count, int* datatype, int* dest, int* tag, int* comm, int* ierr) {
@@ -1729,3 +1772,4 @@ void mpi_comm_get_parent_ ( int* parent, int* ierr){
     *parent = smpi_comm_c2f(tmp);
   }
 }
+