source: XMLIO_V2/dev/dev_rv/src/xmlio/fortran/impi_interface.f90 @ 185

Last change on this file since 185 was 185, checked in by hozdoba, 10 years ago
File size: 8.3 KB
Line 
1MODULE IMPI_INTERFACE
2   USE ISO_C_BINDING
3
4include "mpif.h"
5
6   INTEGER (kind = C_INT ), BIND(C, NAME = "mpi_success" )     :: xios_mpi_success     = MPI_SUCCESS
7   INTEGER (kind = C_INT ), BIND(C, NAME = "mpi_comm_world" )  :: xios_mpi_comm_world  = MPI_COMM_WORLD
8   INTEGER (kind = C_INT ), BIND(C, NAME = "mpi_char" )        :: xios_mpi_char        = MPI_CHARACTER
9   INTEGER (kind = C_INT ), BIND(C, NAME = "mpi_status_size" ) :: xios_mpi_status_size = MPI_STATUS_SIZE
10   INTEGER (kind = C_INT ), BIND(C, NAME = "mpi_any_tag" )     :: xios_mpi_any_tag     = MPI_ANY_TAG
11
12   CONTAINS
13
14   ! Initialiser MPI
15   SUBROUTINE xios_mpi_init(err) BIND(C, NAME ="mpi_init")
16      INTEGER  (kind = C_INT) :: err
17      CALL MPI_INIT(err)
18   END SUBROUTINE xios_mpi_init
19
20   ! Quitter MPI
21   SUBROUTINE xios_mpi_finalize(err) BIND(C, NAME ="mpi_finalize")
22      INTEGER  (kind = C_INT) :: err
23      CALL MPI_FINALIZE(err)
24   END SUBROUTINE xios_mpi_finalize
25
26   ! Quitter brutalement MPI
27   SUBROUTINE xios_mpi_abort(comm, errcode, err) BIND(C, NAME ="mpi_abort")
28      INTEGER  (kind = C_INT) :: comm, errcode, err
29      CALL MPI_ABORT(comm, errcode, err)
30   END SUBROUTINE xios_mpi_abort
31
32   ! Savoir si un processus à fait un MPI_INIT
33   SUBROUTINE xios_mpi_initialized(flag, err) BIND(C, NAME ="mpi_initialized")
34      LOGICAL (kind = C_BOOL) :: flag
35      INTEGER (kind = C_INT)  :: err
36      LOGICAL                 :: cflag
37      cflag = flag
38      CALL MPI_INITIALIZED(cflag, err)
39   END SUBROUTINE xios_mpi_initialized
40
41   ! Récupérer la chaine de caractÚres associée au code d'erreur err
42   SUBROUTINE xios_mpi_error_string(errcode, chaine, taille_chaine, err) &
43                                    BIND(C, NAME ="mpi_error_string")
44      INTEGER (kind = C_INT)                 :: errcode, taille_chaine, err
45      CHARACTER(kind = C_CHAR), DIMENSION(*) :: chaine
46      CHARACTER(len = taille_chaine)         :: cchaine
47      CALL MPI_ERROR_STRING(errcode, cchaine, taille_chaine, err)
48      chaine(taille_chaine) = cchaine
49   END SUBROUTINE xios_mpi_error_string
50
51   ! Envoyer un message à un processus
52   SUBROUTINE xios_mpi_send(buf, count, datatype, dest, tag, comm, err) &
53                            BIND(C, NAME ="mpi_send")
54      CHARACTER(kind = C_CHAR), DIMENSION(*) :: buf
55      INTEGER (kind = C_INT)                 :: dest, count, datatype, tag, comm, err
56      CALL MPI_SEND(buf, count, datatype, dest, tag, comm, err)
57   END SUBROUTINE xios_mpi_send
58
59   ! Recevoir un message d'un processus
60   SUBROUTINE xios_mpi_recv(buf, count, datatype, source, &
61                            tag, comm, status, err)       &
62                            BIND(C, NAME ="mpi_recv")
63      CHARACTER(kind = C_CHAR), DIMENSION(*)              :: buf
64      INTEGER (kind = C_INT)                              :: count, datatype, source, tag, comm, err
65      INTEGER (kind = C_INT) , DIMENSION(mpi_status_size) :: status
66      CALL MPI_RECV(buf, count, datatype, source, tag, comm, status, err)
67   END SUBROUTINE xios_mpi_recv
68
69   ! Envoyer et recevoir un message
70   SUBROUTINE xios_mpi_sendrecv(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, recvcount, &
71                                recvtype, source, recvtag, comm, status, err) &
72                                BIND(C, NAME ="mpi_sendrecv")
73      CHARACTER(kind = C_CHAR), DIMENSION(*) :: sendbuf, recvbuf
74      INTEGER (kind = C_INT)                 :: sendcount, sendtype, dest, sendtag, recvcount, &
75                                                recvtype, source, recvtag, comm, err
76      INTEGER (kind = C_INT) , DIMENSION(mpi_status_size) :: status
77      CALL MPI_SENDRECV(sendbuf, sendcount, sendtype, dest, sendtag, recvbuf, &
78                        recvcount, recvtype, source, recvtag, comm, status, err)
79   END SUBROUTINE xios_mpi_sendrecv
80
81   ! Compter le nombre d'éléments reçus
82   SUBROUTINE xios_mpi_get_count(status, datatype, count, err) BIND(C, NAME ="mpi_get_count")
83      INTEGER (kind = C_INT)                 :: datatype, count, err
84      INTEGER (kind = C_INT) , DIMENSION(mpi_status_size) :: status
85     
86      ! ATTTENTION GROS BUG ICI  SOUS GNU MAIS PAS INTEL ???????? voir datatype
87      ! PRINT *, datatype, MPI_CHARACTER, xios_mpi_char
88      CALL MPI_GET_COUNT(status, MPI_CHARACTER, count, err)
89   END SUBROUTINE xios_mpi_get_count
90
91   ! Tester l'arrivée d'un message
92   SUBROUTINE xios_mpi_iprobe(source, tag, comm, flag, status, err) BIND(C, NAME ="mpi_iprobe")
93      INTEGER (kind = C_INT) :: source, tag, comm, err
94      INTEGER (kind = C_INT) , DIMENSION(mpi_status_size) :: status
95      LOGICAL (kind = C_BOOL) :: flag
96      CALL MPI_IPROBE(source, tag, comm, flag, status, err)
97   END SUBROUTINE xios_mpi_iprobe
98
99   ! Nombre de processus dans un intracommunicateur
100   SUBROUTINE xios_mpi_comm_size(comm, nbre, err) BIND(C, NAME ="mpi_comm_size")
101      INTEGER (kind = C_INT)  :: comm, nbre, err
102      CALL MPI_COMM_SIZE(comm, nbre, err)
103   END SUBROUTINE xios_mpi_comm_size
104
105   ! Rang d'un processus dans un intracommunicateur
106   SUBROUTINE xios_mpi_comm_rank(comm, rang, err) BIND(C, NAME ="mpi_comm_rank")
107      INTEGER (kind = C_INT)  :: comm, rang, err
108      CALL MPI_COMM_RANK(comm, rang, err )
109   END SUBROUTINE xios_mpi_comm_rank
110
111   ! Partage d'un communicateur
112   SUBROUTINE xios_mpi_comm_split(comm, couleur, cle, newcomm, err) BIND(C, NAME ="mpi_comm_split")
113      INTEGER (kind = C_INT)  :: comm, couleur, cle, newcomm, err
114      CALL MPI_COMM_SPLIT(comm, couleur, cle, newcomm, err)
115   END SUBROUTINE xios_mpi_comm_split
116
117   ! Commencer à envoyer un message
118   SUBROUTINE xios_mpi_issend(buf, count, datatype, dest, tag, comm, request, err) &
119                            BIND(C, NAME ="mpi_issend")
120      CHARACTER(kind = C_CHAR), DIMENSION(*) :: buf
121      INTEGER (kind = C_INT)                 :: count, datatype, tag, comm, request, err, dest
122      CALL MPI_ISSEND(buf, count, datatype, dest, tag, comm, request, err)
123   END SUBROUTINE xios_mpi_issend
124
125   ! Commencer à recevoir un message
126   SUBROUTINE xios_mpi_irecv(buf, count, datatype, source, &
127                            tag, comm, request, err)       &
128                            BIND(C, NAME ="mpi_irecv")
129      CHARACTER(kind = C_CHAR), DIMENSION(*)              :: buf
130      INTEGER (kind = C_INT)                              :: count, datatype, source, tag, &
131                                                             comm, request, err
132      CALL MPI_IRECV(buf, count, datatype, source, tag, comm, request, err)
133   END SUBROUTINE xios_mpi_irecv
134
135   ! Compléter une opération non bloquante
136   SUBROUTINE xios_mpi_wait(request, status, err) BIND(C, NAME ="mpi_wait")
137      INTEGER (kind = C_INT)                              :: request, err
138      INTEGER (kind = C_INT) , DIMENSION(mpi_status_size) :: status
139      CALL MPI_WAIT(request, status, err)
140   END SUBROUTINE xios_mpi_wait
141
142   ! Tester une opération non bloquante
143   SUBROUTINE xios_mpi_test(request, flag, status, err) BIND(C, NAME ="mpi_test")
144      INTEGER (kind = C_INT)                              :: request, err
145      INTEGER (kind = C_INT) , DIMENSION(mpi_status_size) :: status
146      LOGICAL (kind = C_BOOL)                             :: flag
147      LOGICAL                                             :: cflag
148      cflag = flag
149      CALL MPI_TEST(request, cflag, status, err)
150   END SUBROUTINE xios_mpi_test
151
152   ! Création d'un communicateur à partir d'un groupe
153   SUBROUTINE xios_mpi_comm_create(comm, group, newcomm, err) BIND(C, NAME ="mpi_comm_create")
154      INTEGER (kind = C_INT) :: comm, group, newcomm, err
155      CALL MPI_COMM_CREATE(comm, group, newcomm, err)
156   END SUBROUTINE xios_mpi_comm_create
157
158   ! Obtention d'une groupe à partir d'un communicateur
159   SUBROUTINE xios_mpi_comm_group(comm, group, err) BIND(C, NAME ="mpi_comm_group")
160      INTEGER (kind = C_INT) :: comm, group, err
161      CALL MPI_COMM_GROUP(comm, group, err)
162   END SUBROUTINE xios_mpi_comm_group
163
164   ! Création de sous-groupe
165   SUBROUTINE xios_mpi_group_incl(group, n, rank, newgroup, err) BIND(C, NAME ="mpi_group_incl")
166      INTEGER (kind = C_INT) :: group, n,  newgroup, err
167      INTEGER (kind = C_INT) , DIMENSION(*) :: rank
168      CALL MPI_GROUP_INCL(group, n, rank, newgroup, err)
169   END SUBROUTINE xios_mpi_group_incl
170
171   ! BarriÚre
172   SUBROUTINE xios_mpi_barrier (comm, err) BIND (C, NAME ="mpi_barrier")
173      INTEGER (kind = C_INT) :: comm, err
174      CALL MPI_BARRIER(comm, err)
175   END SUBROUTINE xios_mpi_barrier
176
177END MODULE IMPI_INTERFACE
Note: See TracBrowser for help on using the repository browser.