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

Last change on this file since 3632 was 3435, checked in by Laurent Fairhead, 6 years ago

"Historic" :-) commit merging the physics branch used for DYNAMICO with the LMDZ trunk.
The same physics branch can now be used seamlessly with the traditional lon-lat LMDZ
dynamical core and DYNAMICO.
Testing consisted in running a lon-lat LMDZ bucket simulation with the NPv6.1 physics package
with the original trunk sources and the merged sources. Tests were succesful in the sense that
numeric continuity was preserved in the restart files from both simulation. Further tests
included running both versions of the physics codes for one year in a LMDZOR setting in which
the restart files also came out identical.

Caution:

  • as the physics package now manages unstructured grids, grid information needs to be transmitted

to the surface scheme ORCHIDEE. This means that the interface defined in surf_land_orchidee_mod.F90
is only compatible with ORCHIDEE version orchidee2.1 and later versions. If previous versions of
ORCHIDEE need to be used, the CPP key ORCHIDEE_NOUNSTRUCT needs to be set at compilation time.
This is done automatically if makelmdz/makelmdz_fcm are called with the veget orchidee2.0 switch

  • due to a limitation in XIOS, the time at which limit conditions will be read in by DYNAMICO will be

delayed by one physic timestep with respect to the time it is read in by the lon-lat model. This is caused
by the line

IF (MOD(itime-1, lmt_pas) == 0 .OR. (jour_lu /= jour .AND. grid_type /= unstructured)) THEN ! time to read

in limit_read_mod.F90

Work still needed on COSP integration and XML files for DYNAMICO

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