source: LMDZ6/trunk/libf/phy_common/mod_phys_lmdz_mpi_data.F90 @ 4600

Last change on this file since 4600 was 4600, checked in by yann meurdesoif, 11 months ago

Suppress CPP_MPI key usage in source code. MPI wrappers is used to supress missing symbol if the mpi library is not linked

YM

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