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

Last change on this file since 2351 was 2351, checked in by Ehouarn Millour, 9 years ago

More on physics/dynamics separation and cleanup:

  • Set things up so that all physics-related initializations are done via iniphysiq.
  • Created a "geometry_mod.F90" module in phy_common to store information on the loacl grid (i.e. replaces comgeomphy) and moreover give these variables more obvious names (e.g.: rlond => longitude, rlatd => latitude, airephy => cell_area).
  • removed obsolete comgeomphy.h and comgeomphy.F90

EM

  • 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 Author Date Id Revision
File size: 6.3 KB
Line 
1!
2!$Header$
3!
4MODULE mod_phys_lmdz_mpi_data
5!  USE mod_const_mpi
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
37  INTEGER,SAVE :: mpi_master
38!  INTEGER,SAVE :: mpi_root
39  LOGICAL,SAVE :: is_mpi_root
40  LOGICAL,SAVE :: is_using_mpi
41 
42 
43  LOGICAL,SAVE :: is_north_pole
44  LOGICAL,SAVE :: is_south_pole
45  INTEGER,SAVE :: COMM_LMDZ_PHY
46  INTEGER,SAVE :: MPI_REAL_LMDZ   ! MPI_REAL8
47
48CONTAINS
49 
50!  SUBROUTINE Init_phys_lmdz_mpi_data(iim,jjp1,nb_proc,distrib)
51  SUBROUTINE init_phys_lmdz_mpi_data(nbp, nbp_lon, nbp_lat, communicator)
52!  USE mod_const_mpi, ONLY : COMM_LMDZ
53  IMPLICIT NONE
54#ifdef CPP_MPI
55    INCLUDE 'mpif.h'
56#endif
57    INTEGER,INTENT(in) :: nbp
58    INTEGER,INTENT(in) :: nbp_lon
59    INTEGER,INTENT(in) :: nbp_lat
60    INTEGER,INTENT(in) :: communicator
61   
62    INTEGER,ALLOCATABLE :: distrib(:)
63    INTEGER :: ierr
64    INTEGER :: klon_glo
65    INTEGER :: i
66   
67#ifdef CPP_MPI
68    is_using_mpi=.TRUE.
69#else
70    is_using_mpi=.FALSE.
71#endif
72   
73    if ((nbp_lon.eq.1).and.(nbp_lat.eq.1)) then ! running 1D column model
74       klon_glo=1
75    else
76    ! The usual global physics grid: 1 point for each pole and nbp_lon points
77    ! for all other latitudes
78       klon_glo=nbp_lon*(nbp_lat-2)+2
79    endif
80   
81    COMM_LMDZ_PHY=communicator
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    ALLOCATE(distrib(0:mpi_size-1))
95
96    IF (is_using_mpi) THEN   
97#ifdef CPP_MPI
98    CALL MPI_ALLGATHER(nbp,1,MPI_INTEGER,distrib,1,MPI_INTEGER,COMM_LMDZ_PHY,ierr)
99#endif
100    ELSE
101     distrib(:)=nbp
102    ENDIF
103
104
105    IF (mpi_rank == 0) THEN
106      mpi_master = 0
107      is_mpi_root = .true.
108    ENDIF
109   
110    IF (mpi_rank == 0) THEN
111      is_north_pole = .TRUE.
112    ELSE
113      is_north_pole = .FALSE.
114    ENDIF
115   
116    IF (mpi_rank == mpi_size-1) THEN
117      is_south_pole = .TRUE.
118    ELSE
119      is_south_pole = .FALSE.
120    ENDIF
121   
122    ALLOCATE(jj_para_nb(0:mpi_size-1))
123    ALLOCATE(jj_para_begin(0:mpi_size-1))
124    ALLOCATE(jj_para_end(0:mpi_size-1))
125   
126    ALLOCATE(ij_para_nb(0:mpi_size-1))
127    ALLOCATE(ij_para_begin(0:mpi_size-1))
128    ALLOCATE(ij_para_end(0:mpi_size-1))
129   
130    ALLOCATE(ii_para_begin(0:mpi_size-1))
131    ALLOCATE(ii_para_end(0:mpi_size-1))
132
133    ALLOCATE(klon_mpi_para_nb(0:mpi_size-1))
134    ALLOCATE(klon_mpi_para_begin(0:mpi_size-1))
135    ALLOCATE(klon_mpi_para_end(0:mpi_size-1))
136 
137     
138    klon_mpi_para_nb(0:mpi_size-1)=distrib(0:mpi_size-1)
139
140    DO i=0,mpi_size-1
141      IF (i==0) THEN
142        klon_mpi_para_begin(i)=1
143      ELSE
144        klon_mpi_para_begin(i)=klon_mpi_para_end(i-1)+1
145      ENDIF
146        klon_mpi_para_end(i)=klon_mpi_para_begin(i)+klon_mpi_para_nb(i)-1
147    ENDDO
148
149
150    DO i=0,mpi_size-1
151     
152      IF (i==0) THEN
153        ij_para_begin(i) = 1
154      ELSE
155        ij_para_begin(i) = klon_mpi_para_begin(i)+nbp_lon-1
156      ENDIF
157
158      jj_para_begin(i) = (ij_para_begin(i)-1)/nbp_lon + 1
159      ii_para_begin(i) = MOD(ij_para_begin(i)-1,nbp_lon) + 1
160
161     
162      ij_para_end(i) = klon_mpi_para_end(i)+nbp_lon-1
163      jj_para_end(i) = (ij_para_end(i)-1)/nbp_lon + 1
164      ii_para_end(i) = MOD(ij_para_end(i)-1,nbp_lon) + 1
165
166
167      ij_para_nb(i) = ij_para_end(i)-ij_para_begin(i)+1
168      jj_para_nb(i) = jj_para_end(i)-jj_para_begin(i)+1
169         
170    ENDDO
171 
172    ii_begin = ii_para_begin(mpi_rank)
173    ii_end   = ii_para_end(mpi_rank)
174    jj_begin = jj_para_begin(mpi_rank)
175    jj_end   = jj_para_end(mpi_rank)
176    jj_nb    = jj_para_nb(mpi_rank)
177    ij_begin = ij_para_begin(mpi_rank)
178    ij_end   = ij_para_end(mpi_rank)
179    ij_nb    = ij_para_nb(mpi_rank)
180    klon_mpi_begin = klon_mpi_para_begin(mpi_rank)
181    klon_mpi_end   = klon_mpi_para_end(mpi_rank)
182    klon_mpi       = klon_mpi_para_nb(mpi_rank)
183   
184    CALL Print_module_data
185   
186  END SUBROUTINE Init_phys_lmdz_mpi_data
187
188  SUBROUTINE print_module_data
189  USE print_control_mod, ONLY: lunout
190  IMPLICIT NONE
191!  INCLUDE "iniprint.h"
192 
193    WRITE(lunout,*) 'ii_begin =', ii_begin
194    WRITE(lunout,*) 'ii_end =', ii_end
195    WRITE(lunout,*) 'jj_begin =',jj_begin
196    WRITE(lunout,*) 'jj_end =', jj_end
197    WRITE(lunout,*) 'jj_nb =', jj_nb
198    WRITE(lunout,*) 'ij_begin =', ij_begin
199    WRITE(lunout,*) 'ij_end =', ij_end
200    WRITE(lunout,*) 'ij_nb =', ij_nb
201    WRITE(lunout,*) 'klon_mpi_begin =', klon_mpi_begin
202    WRITE(lunout,*) 'klon_mpi_end =', klon_mpi_end
203    WRITE(lunout,*) 'klon_mpi =', klon_mpi
204    WRITE(lunout,*) 'jj_para_nb =', jj_para_nb
205    WRITE(lunout,*) 'jj_para_begin =', jj_para_begin
206    WRITE(lunout,*) 'jj_para_end =', jj_para_end
207    WRITE(lunout,*) 'ii_para_begin =', ii_para_begin
208    WRITE(lunout,*) 'ii_para_end =', ii_para_end
209    WRITE(lunout,*) 'ij_para_nb =', ij_para_nb
210    WRITE(lunout,*) 'ij_para_begin =', ij_para_begin
211    WRITE(lunout,*) 'ij_para_end =', ij_para_end
212    WRITE(lunout,*) 'klon_mpi_para_nb =', klon_mpi_para_nb
213    WRITE(lunout,*) 'klon_mpi_para_begin =', klon_mpi_para_begin
214    WRITE(lunout,*) 'klon_mpi_para_end  =', klon_mpi_para_end
215    WRITE(lunout,*) 'mpi_rank =', mpi_rank
216    WRITE(lunout,*) 'mpi_size =', mpi_size
217    WRITE(lunout,*) 'mpi_master =', mpi_master
218    WRITE(lunout,*) 'is_mpi_root =', is_mpi_root
219    WRITE(lunout,*) 'is_north_pole =', is_north_pole
220    WRITE(lunout,*) 'is_south_pole =', is_south_pole
221    WRITE(lunout,*) 'COMM_LMDZ_PHY =', COMM_LMDZ_PHY
222 
223  END SUBROUTINE print_module_data
224 
225END MODULE mod_phys_lmdz_mpi_data
Note: See TracBrowser for help on using the repository browser.