source: codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/libf/phystd/mod_phys_lmdz_mpi_data.F90 @ 245

Last change on this file since 245 was 245, checked in by ymipsl, 10 years ago
  • One call for initialize physics from dynamico
  • mpi_root renamed into mpi_master due to conflict with an existaing symbol from the mpi library

==> mpi_root => mpi_master, is_mpi_root => is_mpi_master, is_omp_root => is_omp_master

YM

File size: 6.3 KB
Line 
1!
2!$Header$
3!
4MODULE mod_phys_lmdz_mpi_data
5 
6  INTEGER,SAVE :: MPI_REAL_LMDZ
7  INTEGER,SAVE :: ii_begin
8  INTEGER,SAVE :: ii_end
9  INTEGER,SAVE :: jj_begin
10  INTEGER,SAVE :: jj_end
11  INTEGER,SAVE :: jj_nb
12  INTEGER,SAVE :: ij_begin
13  INTEGER,SAVE :: ij_end
14  INTEGER,SAVE :: ij_nb
15  INTEGER,SAVE :: klon_mpi_begin
16  INTEGER,SAVE :: klon_mpi_end
17  INTEGER,SAVE :: klon_mpi
18!!$OMP THREADPRIVATE(ii_begin,ii_end,jj_begin,jj_end,jj_nb,ij_begin,&
19!       !$OMP ij_end,ij_nb,klon_mpi_begin,klon_mpi_end,klon_mpi)
20 
21  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: jj_para_nb
22  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: jj_para_begin
23  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: jj_para_end
24
25  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ii_para_begin
26  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ii_para_end
27
28  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ij_para_nb
29  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ij_para_begin
30  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ij_para_end
31
32  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: klon_mpi_para_nb
33  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: klon_mpi_para_begin
34  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: klon_mpi_para_end 
35!!$OMP THREADPRIVATE(jj_para_nb,jj_para_begin,jj_para_end,ii_para_begin,ii_para_end,&
36!       !$OMP ij_para_nb,ij_para_begin,ij_para_end,klon_mpi_para_nb,klon_mpi_para_begin,&
37!       !$OMP klon_mpi_para_end)
38
39 
40  INTEGER,SAVE :: mpi_rank
41  INTEGER,SAVE :: mpi_size
42  INTEGER,SAVE :: mpi_master
43  LOGICAL,SAVE :: is_mpi_master
44  LOGICAL,SAVE :: is_using_mpi
45!!$OMP THREADPRIVATE(mpi_rank,mpi_size,mpi_master,is_mpi_master,is_using_mpi)
46 
47 
48  LOGICAL,SAVE :: is_north_pole
49  LOGICAL,SAVE :: is_south_pole
50  INTEGER,SAVE :: COMM_LMDZ_PHY
51!!$OMP THREADPRIVATE(is_north_pole,is_south_pole,COMM_LMDZ_PHY)
52
53CONTAINS
54 
55  SUBROUTINE Init_phys_lmdz_mpi_data(iim,jjp1,comm_lmdz, nb_proc,distrib)
56  IMPLICIT NONE
57    INTEGER,INTENT(in) :: iim
58    INTEGER,INTENT(in) :: jjp1
59    INTEGER,INTENT(in) :: comm_lmdz
60    INTEGER,INTENT(in) :: nb_proc
61    INTEGER,INTENT(in) :: distrib(0:nb_proc-1)
62   
63    INTEGER :: ierr
64    INTEGER :: klon_glo
65    INTEGER :: i
66   
67#ifdef CPP_MPI
68    INCLUDE 'mpif.h'
69    is_using_mpi=.TRUE.
70#else
71    is_using_mpi=.FALSE.
72#endif
73   
74    if (iim.eq.1) then
75       klon_glo=1
76    else
77!       klon_glo=iim*(jjp1-2)+2
78       klon_glo=sum(distrib)
79    endif
80   
81    COMM_LMDZ_PHY=comm_lmdz
82
83    IF (is_using_mpi) THEN   
84#ifdef CPP_MPI
85      MPI_REAL_LMDZ = MPI_REAL8 
86      CALL MPI_COMM_SIZE(COMM_LMDZ_PHY,mpi_size,ierr)   
87      CALL MPI_COMM_RANK(COMM_LMDZ_PHY,mpi_rank,ierr)
88#endif
89    ELSE
90      mpi_size=1
91      mpi_rank=0
92    ENDIF
93   
94    IF (mpi_rank == 0) THEN
95      mpi_master = 0
96      is_mpi_master = .true.
97    ENDIF
98   
99    IF (mpi_rank == 0) THEN
100      is_north_pole = .TRUE.
101    ELSE
102      is_north_pole = .FALSE.
103    ENDIF
104   
105    IF (mpi_rank == mpi_size-1) THEN
106      is_south_pole = .TRUE.
107    ELSE
108      is_south_pole = .FALSE.
109    ENDIF
110   
111    ALLOCATE(jj_para_nb(0:mpi_size-1))
112    ALLOCATE(jj_para_begin(0:mpi_size-1))
113    ALLOCATE(jj_para_end(0:mpi_size-1))
114   
115    ALLOCATE(ij_para_nb(0:mpi_size-1))
116    ALLOCATE(ij_para_begin(0:mpi_size-1))
117    ALLOCATE(ij_para_end(0:mpi_size-1))
118   
119    ALLOCATE(ii_para_begin(0:mpi_size-1))
120    ALLOCATE(ii_para_end(0:mpi_size-1))
121
122    ALLOCATE(klon_mpi_para_nb(0:mpi_size-1))
123    ALLOCATE(klon_mpi_para_begin(0:mpi_size-1))
124    ALLOCATE(klon_mpi_para_end(0:mpi_size-1))
125 
126     
127    klon_mpi_para_nb(0:mpi_size-1)=distrib(0:nb_proc-1)
128
129    DO i=0,mpi_size-1
130      IF (i==0) THEN
131        klon_mpi_para_begin(i)=1
132      ELSE
133        klon_mpi_para_begin(i)=klon_mpi_para_end(i-1)+1
134      ENDIF
135        klon_mpi_para_end(i)=klon_mpi_para_begin(i)+klon_mpi_para_nb(i)-1
136    ENDDO
137
138
139    DO i=0,mpi_size-1
140     
141      IF (i==0) THEN
142        ij_para_begin(i) = 1
143      ELSE
144        ij_para_begin(i) = klon_mpi_para_begin(i)+iim-1
145      ENDIF
146
147      jj_para_begin(i) = (ij_para_begin(i)-1)/iim + 1
148      ii_para_begin(i) = MOD(ij_para_begin(i)-1,iim) + 1
149
150     
151      ij_para_end(i) = klon_mpi_para_end(i)+iim-1
152      jj_para_end(i) = (ij_para_end(i)-1)/iim + 1
153      ii_para_end(i) = MOD(ij_para_end(i)-1,iim) + 1
154
155      ! Ehouarn: handle 1D case:
156      if (klon_glo.eq.1) then
157        klon_mpi_para_end(i) = 1
158        klon_mpi_para_nb(i) = 1
159        ij_para_end(i) = 1
160        jj_para_end(i) = 1
161        ii_para_end(i) = 1
162      endif
163
164      ij_para_nb(i) = ij_para_end(i)-ij_para_begin(i)+1
165      jj_para_nb(i) = jj_para_end(i)-jj_para_begin(i)+1
166         
167    ENDDO
168 
169    ii_begin = ii_para_begin(mpi_rank)
170    ii_end   = ii_para_end(mpi_rank)
171    jj_begin = jj_para_begin(mpi_rank)
172    jj_end   = jj_para_end(mpi_rank)
173    jj_nb    = jj_para_nb(mpi_rank)
174    ij_begin = ij_para_begin(mpi_rank)
175    ij_end   = ij_para_end(mpi_rank)
176    ij_nb    = ij_para_nb(mpi_rank)
177    klon_mpi_begin = klon_mpi_para_begin(mpi_rank)
178    klon_mpi_end   = klon_mpi_para_end(mpi_rank)
179    klon_mpi       = klon_mpi_para_nb(mpi_rank)
180   
181    CALL Print_module_data
182   
183  END SUBROUTINE Init_phys_lmdz_mpi_data
184
185  SUBROUTINE print_module_data
186  IMPLICIT NONE
187!  INCLUDE "iniprint.h"
188 
189    WRITE(*,*) 'ii_begin =', ii_begin
190    WRITE(*,*) 'ii_end =', ii_end
191    WRITE(*,*) 'jj_begin =',jj_begin
192    WRITE(*,*) 'jj_end =', jj_end
193    WRITE(*,*) 'jj_nb =', jj_nb
194    WRITE(*,*) 'ij_begin =', ij_begin
195    WRITE(*,*) 'ij_end =', ij_end
196    WRITE(*,*) 'ij_nb =', ij_nb
197    WRITE(*,*) 'klon_mpi_begin =', klon_mpi_begin
198    WRITE(*,*) 'klon_mpi_end =', klon_mpi_end
199    WRITE(*,*) 'klon_mpi =', klon_mpi
200    WRITE(*,*) 'jj_para_nb =', jj_para_nb
201    WRITE(*,*) 'jj_para_begin =', jj_para_begin
202    WRITE(*,*) 'jj_para_end =', jj_para_end 
203    WRITE(*,*) 'ii_para_begin =', ii_para_begin
204    WRITE(*,*) 'ii_para_end =', ii_para_end
205    WRITE(*,*) 'ij_para_nb =', ij_para_nb
206    WRITE(*,*) 'ij_para_begin =', ij_para_begin
207    WRITE(*,*) 'ij_para_end =', ij_para_end
208    WRITE(*,*) 'klon_mpi_para_nb =', klon_mpi_para_nb
209    WRITE(*,*) 'klon_mpi_para_begin =', klon_mpi_para_begin
210    WRITE(*,*) 'klon_mpi_para_end  =', klon_mpi_para_end 
211    WRITE(*,*) 'mpi_rank =', mpi_rank
212    WRITE(*,*) 'mpi_size =', mpi_size
213    WRITE(*,*) 'mpi_master =', mpi_master
214    WRITE(*,*) 'is_mpi_master =', is_mpi_master
215    WRITE(*,*) 'is_north_pole =', is_north_pole
216    WRITE(*,*) 'is_south_pole =', is_south_pole
217    WRITE(*,*) 'COMM_LMDZ_PHY =', COMM_LMDZ_PHY
218 
219  END SUBROUTINE print_module_data
220 
221END MODULE mod_phys_lmdz_mpi_data
Note: See TracBrowser for help on using the repository browser.