source: LMDZ5/trunk/libf/phy_common/mod_phys_lmdz_mpi_data.F90 @ 2429

Last change on this file since 2429 was 2429, checked in by Laurent Fairhead, 8 years ago

Correction on the calculation of the surface of the grid at the poles (problem was introduced
in r2222).
Due to the different distribution of OMP tasks in the dynamics and the physics, had to
introduce 2 new logical variables, is_pole_north_phy and is_pole_south_phy, and so decided
to rename the old is_north_pole/is_south_pole to is_north_pole_dyn/is_south_pole_dyn to
stay coherent and, hopefully, clear things up a bit.
LF

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 6.4 KB
RevLine 
[775]1!
[2429]2!$Id: mod_phys_lmdz_mpi_data.F90 2429 2016-01-27 12:43:09Z fairhead $
[775]3!
4MODULE mod_phys_lmdz_mpi_data
[2351]5!  USE mod_const_mpi
[775]6 
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 
19  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: jj_para_nb
20  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: jj_para_begin
21  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: jj_para_end
22
23  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ii_para_begin
24  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ii_para_end
25
26  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ij_para_nb
27  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ij_para_begin
28  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ij_para_end
29
30  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: klon_mpi_para_nb
31  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: klon_mpi_para_begin
32  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: klon_mpi_para_end
33
34 
35  INTEGER,SAVE :: mpi_rank
36  INTEGER,SAVE :: mpi_size
[2351]37  INTEGER,SAVE :: mpi_master
38!  INTEGER,SAVE :: mpi_root
[775]39  LOGICAL,SAVE :: is_mpi_root
[1001]40  LOGICAL,SAVE :: is_using_mpi
[775]41 
42 
[2429]43!  LOGICAL,SAVE :: is_north_pole
44!  LOGICAL,SAVE :: is_south_pole
45  LOGICAL,SAVE :: is_north_pole_dyn
46  LOGICAL,SAVE :: is_south_pole_dyn
[775]47  INTEGER,SAVE :: COMM_LMDZ_PHY
[2351]48  INTEGER,SAVE :: MPI_REAL_LMDZ   ! MPI_REAL8
[775]49
50CONTAINS
51 
[2351]52!  SUBROUTINE Init_phys_lmdz_mpi_data(iim,jjp1,nb_proc,distrib)
53  SUBROUTINE init_phys_lmdz_mpi_data(nbp, nbp_lon, nbp_lat, communicator)
54!  USE mod_const_mpi, ONLY : COMM_LMDZ
[775]55  IMPLICIT NONE
[2351]56#ifdef CPP_MPI
57    INCLUDE 'mpif.h'
58#endif
59    INTEGER,INTENT(in) :: nbp
60    INTEGER,INTENT(in) :: nbp_lon
61    INTEGER,INTENT(in) :: nbp_lat
62    INTEGER,INTENT(in) :: communicator
[775]63   
[2351]64    INTEGER,ALLOCATABLE :: distrib(:)
[775]65    INTEGER :: ierr
66    INTEGER :: klon_glo
67    INTEGER :: i
68   
[1001]69#ifdef CPP_MPI
70    is_using_mpi=.TRUE.
[775]71#else
[1001]72    is_using_mpi=.FALSE.
[775]73#endif
74   
[2351]75    if ((nbp_lon.eq.1).and.(nbp_lat.eq.1)) then ! running 1D column model
[879]76       klon_glo=1
77    else
[2351]78    ! The usual global physics grid: 1 point for each pole and nbp_lon points
79    ! for all other latitudes
80       klon_glo=nbp_lon*(nbp_lat-2)+2
[879]81    endif
[775]82   
[2351]83    COMM_LMDZ_PHY=communicator
[775]84
[1001]85    IF (is_using_mpi) THEN   
86#ifdef CPP_MPI
[2351]87      MPI_REAL_LMDZ=MPI_REAL8
[775]88      CALL MPI_COMM_SIZE(COMM_LMDZ_PHY,mpi_size,ierr)   
89      CALL MPI_COMM_RANK(COMM_LMDZ_PHY,mpi_rank,ierr)
90#endif
91    ELSE
92      mpi_size=1
93      mpi_rank=0
94    ENDIF
95   
[2351]96    ALLOCATE(distrib(0:mpi_size-1))
97
98    IF (is_using_mpi) THEN   
99#ifdef CPP_MPI
100    CALL MPI_ALLGATHER(nbp,1,MPI_INTEGER,distrib,1,MPI_INTEGER,COMM_LMDZ_PHY,ierr)
101#endif
102    ELSE
103     distrib(:)=nbp
104    ENDIF
105
106
[775]107    IF (mpi_rank == 0) THEN
[2351]108      mpi_master = 0
[775]109      is_mpi_root = .true.
110    ENDIF
111   
112    IF (mpi_rank == 0) THEN
[2429]113      is_north_pole_dyn = .TRUE.
[775]114    ELSE
[2429]115      is_north_pole_dyn = .FALSE.
[775]116    ENDIF
117   
118    IF (mpi_rank == mpi_size-1) THEN
[2429]119      is_south_pole_dyn = .TRUE.
[775]120    ELSE
[2429]121      is_south_pole_dyn = .FALSE.
[775]122    ENDIF
123   
124    ALLOCATE(jj_para_nb(0:mpi_size-1))
125    ALLOCATE(jj_para_begin(0:mpi_size-1))
126    ALLOCATE(jj_para_end(0:mpi_size-1))
127   
128    ALLOCATE(ij_para_nb(0:mpi_size-1))
129    ALLOCATE(ij_para_begin(0:mpi_size-1))
130    ALLOCATE(ij_para_end(0:mpi_size-1))
131   
132    ALLOCATE(ii_para_begin(0:mpi_size-1))
133    ALLOCATE(ii_para_end(0:mpi_size-1))
134
135    ALLOCATE(klon_mpi_para_nb(0:mpi_size-1))
136    ALLOCATE(klon_mpi_para_begin(0:mpi_size-1))
137    ALLOCATE(klon_mpi_para_end(0:mpi_size-1))
138 
139     
[2351]140    klon_mpi_para_nb(0:mpi_size-1)=distrib(0:mpi_size-1)
[775]141
142    DO i=0,mpi_size-1
143      IF (i==0) THEN
144        klon_mpi_para_begin(i)=1
145      ELSE
146        klon_mpi_para_begin(i)=klon_mpi_para_end(i-1)+1
147      ENDIF
148        klon_mpi_para_end(i)=klon_mpi_para_begin(i)+klon_mpi_para_nb(i)-1
149    ENDDO
150
151
152    DO i=0,mpi_size-1
153     
154      IF (i==0) THEN
155        ij_para_begin(i) = 1
156      ELSE
[2351]157        ij_para_begin(i) = klon_mpi_para_begin(i)+nbp_lon-1
[775]158      ENDIF
159
[2351]160      jj_para_begin(i) = (ij_para_begin(i)-1)/nbp_lon + 1
161      ii_para_begin(i) = MOD(ij_para_begin(i)-1,nbp_lon) + 1
[775]162
163     
[2351]164      ij_para_end(i) = klon_mpi_para_end(i)+nbp_lon-1
165      jj_para_end(i) = (ij_para_end(i)-1)/nbp_lon + 1
166      ii_para_end(i) = MOD(ij_para_end(i)-1,nbp_lon) + 1
[775]167
168
169      ij_para_nb(i) = ij_para_end(i)-ij_para_begin(i)+1
170      jj_para_nb(i) = jj_para_end(i)-jj_para_begin(i)+1
171         
172    ENDDO
173 
174    ii_begin = ii_para_begin(mpi_rank)
175    ii_end   = ii_para_end(mpi_rank)
176    jj_begin = jj_para_begin(mpi_rank)
177    jj_end   = jj_para_end(mpi_rank)
178    jj_nb    = jj_para_nb(mpi_rank)
179    ij_begin = ij_para_begin(mpi_rank)
180    ij_end   = ij_para_end(mpi_rank)
181    ij_nb    = ij_para_nb(mpi_rank)
182    klon_mpi_begin = klon_mpi_para_begin(mpi_rank)
183    klon_mpi_end   = klon_mpi_para_end(mpi_rank)
184    klon_mpi       = klon_mpi_para_nb(mpi_rank)
185   
186    CALL Print_module_data
187   
188  END SUBROUTINE Init_phys_lmdz_mpi_data
189
190  SUBROUTINE print_module_data
[2352]191!  USE print_control_mod, ONLY: lunout
[775]192  IMPLICIT NONE
[2352]193  INCLUDE "iniprint.h"
[775]194 
[1575]195    WRITE(lunout,*) 'ii_begin =', ii_begin
196    WRITE(lunout,*) 'ii_end =', ii_end
197    WRITE(lunout,*) 'jj_begin =',jj_begin
198    WRITE(lunout,*) 'jj_end =', jj_end
199    WRITE(lunout,*) 'jj_nb =', jj_nb
200    WRITE(lunout,*) 'ij_begin =', ij_begin
201    WRITE(lunout,*) 'ij_end =', ij_end
202    WRITE(lunout,*) 'ij_nb =', ij_nb
203    WRITE(lunout,*) 'klon_mpi_begin =', klon_mpi_begin
204    WRITE(lunout,*) 'klon_mpi_end =', klon_mpi_end
205    WRITE(lunout,*) 'klon_mpi =', klon_mpi
206    WRITE(lunout,*) 'jj_para_nb =', jj_para_nb
207    WRITE(lunout,*) 'jj_para_begin =', jj_para_begin
208    WRITE(lunout,*) 'jj_para_end =', jj_para_end
209    WRITE(lunout,*) 'ii_para_begin =', ii_para_begin
210    WRITE(lunout,*) 'ii_para_end =', ii_para_end
211    WRITE(lunout,*) 'ij_para_nb =', ij_para_nb
212    WRITE(lunout,*) 'ij_para_begin =', ij_para_begin
213    WRITE(lunout,*) 'ij_para_end =', ij_para_end
214    WRITE(lunout,*) 'klon_mpi_para_nb =', klon_mpi_para_nb
215    WRITE(lunout,*) 'klon_mpi_para_begin =', klon_mpi_para_begin
216    WRITE(lunout,*) 'klon_mpi_para_end  =', klon_mpi_para_end
217    WRITE(lunout,*) 'mpi_rank =', mpi_rank
218    WRITE(lunout,*) 'mpi_size =', mpi_size
[2351]219    WRITE(lunout,*) 'mpi_master =', mpi_master
[1575]220    WRITE(lunout,*) 'is_mpi_root =', is_mpi_root
[2429]221    WRITE(lunout,*) 'is_north_pole =', is_north_pole_dyn
222    WRITE(lunout,*) 'is_south_pole =', is_south_pole_dyn
[1575]223    WRITE(lunout,*) 'COMM_LMDZ_PHY =', COMM_LMDZ_PHY
[775]224 
225  END SUBROUTINE print_module_data
226 
227END MODULE mod_phys_lmdz_mpi_data
Note: See TracBrowser for help on using the repository browser.