source: XMLIO_SERVER/trunk/src/IOSERVER/mod_ioclient_para.f90 @ 27

Last change on this file since 27 was 27, checked in by ymipsl, 15 years ago

Correction : utilisation d'OASIS par le server

File size: 2.3 KB
Line 
1  MODULE mod_ioclient_para
2    INTEGER,PARAMETER :: color_client=1
3    INTEGER,PARAMETER :: color_server=2 
4    INTEGER,SAVE      :: iocomm
5    INTEGER,SAVE      :: iosize
6    INTEGER,SAVE      :: iorank
7    INTEGER,SAVE      :: server_rank
8    INTEGER,SAVE      :: intracomm 
9  CONTAINS
10 
11 
12  SUBROUTINE Init_parallel
13  USE mpitrace
14  USE mod_ioserver_namelist
15  USE mod_prism_get_comm 
16  IMPLICIT NONE
17    INCLUDE 'mpif.h'
18    INTEGER :: NEW_COMM
19    INTEGER :: ierr
20    INTEGER :: global_rank
21    INTEGER :: global_size
22    INTEGER :: mpi_rank
23    INTEGER :: mpi_size
24    INTEGER :: nb_server_io 
25    INTEGER,ALLOCATABLE :: proc_color(:) 
26    INTEGER :: i
27    INTEGER :: div,remain
28    INTEGER :: group_color
29    INTEGER :: Comm_client_server
30    CHARACTER(LEN=6) :: oasis_server_id
31   
32    IF (using_oasis) THEN
33      oasis_server_id=server_id
34      PRINT *,'prism_get_intracomm'
35      CALL prism_get_intracomm(Comm_client_server,oasis_server_id,ierr)
36    ELSE
37      CALL MPI_INIT(ierr)
38      Comm_client_server=MPI_COMM_WORLD
39    ENDIF
40
41    CALL MPI_COMM_RANK(Comm_client_server,global_rank,ierr)
42    CALL MPI_COMM_SIZE(Comm_client_server,global_size,ierr)
43
44    CALL MPI_COMM_SPLIT(Comm_client_server,color_client,global_rank,intracomm,ierr)
45    CALL MPI_COMM_SIZE(intracomm,mpi_size,ierr)
46    CALL MPI_COMM_RANK(intracomm,mpi_rank,ierr)
47
48    nb_server_io=global_size-mpi_size
49    div=mpi_size/nb_server_io
50    remain=MOD(mpi_size,nb_server_io)
51   
52    IF (mpi_rank<remain*(div+1)) THEN
53      group_color=mpi_rank/(div+1)
54    ELSE
55      group_color=(nb_server_io-1)-(mpi_size-1-mpi_rank)/div
56    ENDIF
57
58    CALL MPI_COMM_SPLIT(Comm_client_server,group_color,global_rank,iocomm,ierr)
59   
60    CALL MPI_COMM_SIZE(iocomm,iosize,ierr)
61    CALL MPI_COMM_RANK(iocomm,iorank,ierr)
62
63    ALLOCATE(proc_color(0:iosize-1))
64    CALL MPI_ALLGATHER(color_client,1,MPI_INTEGER,proc_color,1,MPI_INTEGER,iocomm,ierr)
65   
66    DO i=0,iosize-1
67      IF (proc_color(i)==color_server) THEN
68        server_rank=i
69        EXIT
70      ENDIF
71    ENDDO
72   
73    PRINT *,"Proces No",mpi_rank,"--> server",server_rank
74  END SUBROUTINE Init_parallel
75 
76  SUBROUTINE Finalize_parallel
77  IMPLICIT NONE
78    include 'mpif.h'
79    INTEGER :: ierr
80   
81    CALL MPI_FINALIZE(ierr)
82
83  END SUBROUTINE Finalize_parallel
84 
85  END MODULE mod_ioclient_para
Note: See TracBrowser for help on using the repository browser.