source: XMLIO_V2/dev/common/src/xmlio/fortran/impi_interface.f90 @ 219

Last change on this file since 219 was 219, checked in by hozdoba, 13 years ago

Préparation nouvelle arborescence

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