source: trunk/LMDZ.COMMON/libf/phy_common/mod_phys_lmdz_mpi_data.F90 @ 3287

Last change on this file since 3287 was 1682, checked in by emillour, 8 years ago

All GCMs: set things up to enable pluging physics with dynamico

  • dyn3d
  • gcm.F90 : move I/O initialization (dates) to be done before physics

initialization

  • dyn3dpar
  • gcm.F : move I/O initialization (dates) to be done before physics

initialization

  • dynphy_lonlat:
  • inigeomphy_mod.F90 : add ind_cell_glo computation and transfer

to init_geometry

  • phy_common:
  • geometry_mod.F90 : add ind_cell_glo module variable to store global

column index

  • print_control_mod.F90 : make initialization occur via init_print_control_mod

to avoid circular module dependencies

  • init_print_control_mod.F90 : added to initialize print_control_mod module

variables

  • mod_phys_lmdz_mpi_data.F90 : use print_control_mod (rather than iniprint.h)
  • mod_phys_lmdz_para.F90 : use print_control_mod (rather than iniprint.h)
  • mod_phys_lmdz_omp_data.F90 : add is_omp_master (alias of is_omp_root) module

variable and use print_control_mod (rather than
iniprint.h)

  • physics_distribution_mod.F90 : add call to init_dimphy in

init_physics_distribution

  • xios_writefield.F90 : generic routine to output field with XIOS (for debug)
  • misc:
  • handle_err_m.F90 : call abort_physic, rather than abort_gcm
  • wxios.F90 : updates to enable unstructured grids

set module variable g_ctx_name to "LMDZ"
wxios_init(): remove call to wxios_context_init
wxios_context_init(): call xios_context_initialize with COMM_LMDZ_PHY
add routine wxios_set_context() to get handle and set context to XIOS
wxios_domain_param(): change arguments and generate the domain in-place
add wxios_domain_param_unstructured(): generate domain for unstructured case

NB: access is via "domain group" (whereas it is via "domain" in

wxios_domain_param)

  • dynphy_lonlat/phy[std|mars|venus|titan]:
  • iniphysiq_mod.F90 : Remove call to init_dimphy (which is now done in

phy_common/physics_distribution_mod.F90)

EM

File size: 6.2 KB
Line 
1!
2!$Id$
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 
188    WRITE(lunout,*) 'ii_begin =', ii_begin
189    WRITE(lunout,*) 'ii_end =', ii_end
190    WRITE(lunout,*) 'jj_begin =',jj_begin
191    WRITE(lunout,*) 'jj_end =', jj_end
192    WRITE(lunout,*) 'jj_nb =', jj_nb
193    WRITE(lunout,*) 'ij_begin =', ij_begin
194    WRITE(lunout,*) 'ij_end =', ij_end
195    WRITE(lunout,*) 'ij_nb =', ij_nb
196    WRITE(lunout,*) 'klon_mpi_begin =', klon_mpi_begin
197    WRITE(lunout,*) 'klon_mpi_end =', klon_mpi_end
198    WRITE(lunout,*) 'klon_mpi =', klon_mpi
199    WRITE(lunout,*) 'jj_para_nb =', jj_para_nb
200    WRITE(lunout,*) 'jj_para_begin =', jj_para_begin
201    WRITE(lunout,*) 'jj_para_end =', jj_para_end
202    WRITE(lunout,*) 'ii_para_begin =', ii_para_begin
203    WRITE(lunout,*) 'ii_para_end =', ii_para_end
204    WRITE(lunout,*) 'ij_para_nb =', ij_para_nb
205    WRITE(lunout,*) 'ij_para_begin =', ij_para_begin
206    WRITE(lunout,*) 'ij_para_end =', ij_para_end
207    WRITE(lunout,*) 'klon_mpi_para_nb =', klon_mpi_para_nb
208    WRITE(lunout,*) 'klon_mpi_para_begin =', klon_mpi_para_begin
209    WRITE(lunout,*) 'klon_mpi_para_end  =', klon_mpi_para_end
210    WRITE(lunout,*) 'mpi_rank =', mpi_rank
211    WRITE(lunout,*) 'mpi_size =', mpi_size
212    WRITE(lunout,*) 'mpi_master =', mpi_master
213    WRITE(lunout,*) 'is_mpi_root =', is_mpi_root
214    WRITE(lunout,*) 'is_north_pole_dyn =', is_north_pole_dyn
215    WRITE(lunout,*) 'is_south_pole_dyn =', is_south_pole_dyn
216    WRITE(lunout,*) 'COMM_LMDZ_PHY =', COMM_LMDZ_PHY
217 
218  END SUBROUTINE print_module_data
219 
220END MODULE mod_phys_lmdz_mpi_data
Note: See TracBrowser for help on using the repository browser.