source: LMDZ6/branches/LMDZ-INCA-Dyn/libf/phy_common/mod_phys_lmdz_mpi_data.F90 @ 3841

Last change on this file since 3841 was 3841, checked in by acozic, 3 years ago

add parameters to define unstructured grid on Inca model

  • 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.6 KB
RevLine 
[775]1!
[2429]2!$Id: mod_phys_lmdz_mpi_data.F90 3841 2021-02-11 14:29:29Z acozic $
[775]3!
4MODULE mod_phys_lmdz_mpi_data
5 
6  INTEGER,SAVE :: ii_begin
7  INTEGER,SAVE :: ii_end
8  INTEGER,SAVE :: jj_begin
9  INTEGER,SAVE :: jj_end
10  INTEGER,SAVE :: jj_nb
11  INTEGER,SAVE :: ij_begin
12  INTEGER,SAVE :: ij_end
13  INTEGER,SAVE :: ij_nb
14  INTEGER,SAVE :: klon_mpi_begin
15  INTEGER,SAVE :: klon_mpi_end
16  INTEGER,SAVE :: klon_mpi
17 
18  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: jj_para_nb
19  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: jj_para_begin
20  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: jj_para_end
21
22  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ii_para_begin
23  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ii_para_end
24
25  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ij_para_nb
26  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ij_para_begin
27  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: ij_para_end
28
29  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: klon_mpi_para_nb
30  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: klon_mpi_para_begin
31  INTEGER,SAVE,ALLOCATABLE,DIMENSION(:) :: klon_mpi_para_end
32
33 
34  INTEGER,SAVE :: mpi_rank
35  INTEGER,SAVE :: mpi_size
[2351]36  INTEGER,SAVE :: mpi_master
[775]37  LOGICAL,SAVE :: is_mpi_root
[1001]38  LOGICAL,SAVE :: is_using_mpi
[775]39 
40 
[2429]41  LOGICAL,SAVE :: is_north_pole_dyn
42  LOGICAL,SAVE :: is_south_pole_dyn
[775]43  INTEGER,SAVE :: COMM_LMDZ_PHY
[2351]44  INTEGER,SAVE :: MPI_REAL_LMDZ   ! MPI_REAL8
[775]45
46CONTAINS
47 
[3841]48  SUBROUTINE init_phys_lmdz_mpi_data(nbp, nbp_lon, nbp_lat, nbp_lev, grid_type, nvertex, communicator)
[3820]49
[3841]50!    USE infotrac, ONLY: type_trac
[3820]51
[775]52  IMPLICIT NONE
[2351]53#ifdef CPP_MPI
54    INCLUDE 'mpif.h'
55#endif
[3435]56    INTEGER,INTENT(IN) :: nbp
57    INTEGER,INTENT(IN) :: nbp_lon
58    INTEGER,INTENT(IN) :: nbp_lat
[3820]59    INTEGER,INTENT(IN) :: nbp_lev
[3435]60    INTEGER,INTENT(IN) :: communicator
[3841]61    INTEGER,INTENT(IN) :: grid_type
62    INTEGER,INTENT(IN) :: nvertex
[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
[3820]187
[3841]188!    IF (type_trac == 'inca') THEN
[3820]189#ifdef INCA
190       CALL init_inca_para( &
191            nbp_lon,nbp_lat,nbp_lev,klon_glo,mpi_size, &
[3841]192            distrib,nvertex, grid_type,communicator)
[3820]193#endif
[3841]194!    ENDIF
[775]195   
196  END SUBROUTINE Init_phys_lmdz_mpi_data
197
198  SUBROUTINE print_module_data
[3435]199  USE print_control_mod, ONLY: lunout
[775]200  IMPLICIT NONE
[3435]201!  INCLUDE "iniprint.h"
[775]202 
[1575]203    WRITE(lunout,*) 'ii_begin =', ii_begin
204    WRITE(lunout,*) 'ii_end =', ii_end
205    WRITE(lunout,*) 'jj_begin =',jj_begin
206    WRITE(lunout,*) 'jj_end =', jj_end
207    WRITE(lunout,*) 'jj_nb =', jj_nb
208    WRITE(lunout,*) 'ij_begin =', ij_begin
209    WRITE(lunout,*) 'ij_end =', ij_end
210    WRITE(lunout,*) 'ij_nb =', ij_nb
211    WRITE(lunout,*) 'klon_mpi_begin =', klon_mpi_begin
212    WRITE(lunout,*) 'klon_mpi_end =', klon_mpi_end
213    WRITE(lunout,*) 'klon_mpi =', klon_mpi
214    WRITE(lunout,*) 'jj_para_nb =', jj_para_nb
215    WRITE(lunout,*) 'jj_para_begin =', jj_para_begin
216    WRITE(lunout,*) 'jj_para_end =', jj_para_end
217    WRITE(lunout,*) 'ii_para_begin =', ii_para_begin
218    WRITE(lunout,*) 'ii_para_end =', ii_para_end
219    WRITE(lunout,*) 'ij_para_nb =', ij_para_nb
220    WRITE(lunout,*) 'ij_para_begin =', ij_para_begin
221    WRITE(lunout,*) 'ij_para_end =', ij_para_end
222    WRITE(lunout,*) 'klon_mpi_para_nb =', klon_mpi_para_nb
223    WRITE(lunout,*) 'klon_mpi_para_begin =', klon_mpi_para_begin
224    WRITE(lunout,*) 'klon_mpi_para_end  =', klon_mpi_para_end
225    WRITE(lunout,*) 'mpi_rank =', mpi_rank
226    WRITE(lunout,*) 'mpi_size =', mpi_size
[2351]227    WRITE(lunout,*) 'mpi_master =', mpi_master
[1575]228    WRITE(lunout,*) 'is_mpi_root =', is_mpi_root
[2429]229    WRITE(lunout,*) 'is_north_pole =', is_north_pole_dyn
230    WRITE(lunout,*) 'is_south_pole =', is_south_pole_dyn
[1575]231    WRITE(lunout,*) 'COMM_LMDZ_PHY =', COMM_LMDZ_PHY
[775]232 
233  END SUBROUTINE print_module_data
234 
235END MODULE mod_phys_lmdz_mpi_data
Note: See TracBrowser for help on using the repository browser.