LMDZ
sustaonl_mod.F90
Go to the documentation of this file.
2 CONTAINS
3 SUBROUTINE sustaonl(KMEDIAP,KRESTM)
4 
5 !**** *SUSTAONL * - Routine to initialize parallel environment
6 
7 ! Purpose.
8 ! --------
9 ! Initialize D%NSTA and D%NONL.
10 ! Calculation of distribution of grid points to processors :
11 ! Splitting of grid in B direction
12 
13 !** Interface.
14 ! ----------
15 ! *CALL* *SUSTAONL *
16 
17 ! Explicit arguments : KMEDIAP - mean number of grid points per PE
18 ! -------------------- KRESTM - number of PEs with one extra point
19 
20 ! Implicit arguments :
21 ! --------------------
22 
23 
24 ! Method.
25 ! -------
26 ! See documentation
27 
28 ! Externals. NONE.
29 ! ----------
30 
31 ! Reference.
32 ! ----------
33 ! ECMWF Research Department documentation of the IFS
34 
35 ! Author.
36 ! -------
37 ! MPP Group *ECMWF*
38 
39 ! Modifications.
40 ! --------------
41 ! Original : 95-10-01
42 ! Modified 98-08-10 by K. YESSAD: removal of LRPOLE option.
43 ! - removal of LRPOLE in YOMCT0.
44 ! - removal of code under LRPOLE.
45 ! Modified 98-12-04 C. Fischer: merge with SUESTAONL (Aladin)
46 ! ------------------------------------------------------------------
47 
48 USE parkind1 ,ONLY : jpim ,jprb
49 !USE MPL_MODULE ! MPL 4.12.08
50 
51 USE tpm_gen
52 USE tpm_dim
53 USE tpm_geometry
54 USE tpm_distr
55 
56 USE set2pe_mod
59 
60 IMPLICIT NONE
61 
62 
63 ! DUMMY
64 INTEGER(KIND=JPIM),INTENT(IN) :: KMEDIAP
65 INTEGER(KIND=JPIM),INTENT(IN) :: KRESTM
66 
67 ! LOCAL
68 
69 INTEGER(KIND=JPIM) :: IXPTLAT(r%ndgl), ILSTPTLAT(r%ndgl)
70 INTEGER(KIND=JPIM) :: ICHK(r%ndlon,r%ndgl), ICOMBUF(r%ndgl*n_regions_ew*2)
71 INTEGER(KIND=JPIM) :: I1, I2, IBUFLEN, IDGLG, IDWIDE,&
72  &IGL, IGL1, IGL2, IGLOFF, IGPTA, IGPTOT, &
73  &IGPTPRSETS, IGPTS, IGPTSP, ILEN, ILRECV, &
74  &ILSEND, INPLAT, INXLAT, IPART, IPOS, &
75  &IPROCB, IPTSRE, IRECV, IPE, &
76  &IREST, ISEND, ITAG, JA, JB, JGL, JL, JNPTSRE
77 
78 LOGICAL :: LLABORT, LLALLAT
79 LOGICAL :: LLP1,LLP2
80 
81 REAL(KIND=JPRB) :: ZLAT, ZLAT1
82 REAL(KIND=JPRB) :: ZDIVID(r%ndgl),ZXPTLAT(r%ndgl)
83 
84 ! -----------------------------------------------------------------
85 
86 llp1 = nprintlev>0
87 llp2 = nprintlev>1
88 
89 idwide = r%NDGL/2
90 ibuflen = r%NDGL*n_regions_ew*2
91 idglg = r%NDGL
92 
93 i1 = max( 1,d%NFRSTLAT(my_region_ns)-d%NFRSTLOFF)
94 i2 = min(idglg,d%NLSTLAT (my_region_ns)-d%NFRSTLOFF)
95 
96 ilen = d%NLSTLAT(my_region_ns) - d%NFRSTLAT(my_region_ns)+1
97 
98 igptprsets = sum(g%NLOEN(1:d%NFRSTLAT(my_region_ns)-1))
99 
100 igptot = sum(g%NLOEN(1:r%NDGL))
101 
102 IF (d%LSPLIT) THEN
103  IF( leq_regions )THEN
104  ipe=0
105  igpta=0
106  DO ja=1,my_region_ns-1
107  DO jb=1,n_regions(ja)
108  ipe=ipe+1
109  IF( ipe <= krestm .OR. krestm == 0)THEN
110  igpta = igpta + kmediap
111  ELSE
112  igpta = igpta + (kmediap-1)
113  ENDIF
114  ENDDO
115  ENDDO
116  igpts=0
117  DO jb=1,n_regions(my_region_ns)
118  ipe=ipe+1
119  IF( ipe <= krestm .OR. krestm == 0 )THEN
120  igpts = igpts + kmediap
121  ELSE
122  igpts = igpts + (kmediap-1)
123  ENDIF
124  ENDDO
125  ELSE
126  IF (my_region_ns <= krestm.OR.krestm == 0) THEN
127  igpts = kmediap
128  igpta = kmediap*(my_region_ns-1)
129  ELSE
130  igpts = kmediap-1
131  igpta = kmediap*krestm+igpts*(my_region_ns-1-krestm)
132  ENDIF
133  ENDIF
134 ELSE
135  igpta = igptprsets
136  igpts = sum(g%NLOEN(d%NFRSTLAT(my_region_ns):d%NLSTLAT(my_region_ns)))
137 ENDIF
138 
139 igptsp = igpts/n_regions(my_region_ns)
140 irest = igpts-n_regions(my_region_ns)*igptsp
141 ixptlat(1) = igpta-igptprsets+1
142 zxptlat(1) = REAL(ixptlat(1))
143 ilstptlat(1) = g%NLOEN(d%NFRSTLAT(my_region_ns))
144 inplat = g%NLOEN(d%NFRSTLAT(my_region_ns))-ixptlat(1)+1
145 DO jgl=2,ilen
146  ixptlat(jgl) = 1
147  zxptlat(jgl) = 1.0_jprb
148  ilstptlat(jgl) = g%NLOEN(d%NFRSTLAT(my_region_ns)+jgl-1)
149  inplat = inplat+g%NLOEN(d%NFRSTLAT(my_region_ns)+jgl-1)
150 ENDDO
151 ilstptlat(ilen) = g%NLOEN(d%NLSTLAT(my_region_ns))-inplat+igpts
152 
153 DO jb=1,n_regions_ew
154  DO jgl=1,r%NDGL+n_regions_ns-1
155  d%NSTA(jgl,jb) = 0
156  d%NONL(jgl,jb) = 0
157  ENDDO
158 ENDDO
159 
160 
161 ! grid point decomposition
162 ! ---------------------------------------
163 llallat = (n_regions_ns == 1)
164 DO jgl=1,ilen
165  zdivid(jgl)=REAL(G%NLOEN(D%NFRSTLAT(MY_REGION_NS)+JGL-1),JPRB)
166 ENDDO
167 DO jb=1,n_regions(my_region_ns)
168 
169  IF (jb <= irest) THEN
170  iptsre = igptsp+1
171  ELSE
172  iptsre = igptsp
173  ENDIF
174 
175  ipart=0
176  DO jnptsre=1,iptsre
177  zlat = 1._jprb
178  zlat1 = 1._jprb
179  IF (my_region_ns <= d%NAPSETS .AND.(ipart /= 2.OR.llallat)) THEN
180 !cdir novector
181  DO jgl=1,ilen
182  IF (ixptlat(jgl) <= ilstptlat(jgl)) THEN
183  zlat1 = (zxptlat(jgl)-1.0_jprb)/zdivid(jgl)
184  zlat = min(zlat1,zlat)
185  inxlat = jgl
186  ipart = 1
187  EXIT
188  ENDIF
189  ENDDO
190  ELSEIF (my_region_ns > n_regions_ns-d%NAPSETS.AND.(ipart /= 1.OR.llallat)) THEN
191 !cdir novector
192  DO jgl=1,ilen
193  IF (ixptlat(jgl) <= ilstptlat(jgl)) THEN
194  zlat1 = (zxptlat(jgl)-1.0_jprb)/zdivid(jgl)
195  zlat = min(zlat1,zlat)
196  inxlat = jgl
197  ipart = 2
198  EXIT
199  ENDIF
200  ENDDO
201  ELSE
202 !cdir novector
203  DO jgl=1,ilen
204  IF (ixptlat(jgl) <= ilstptlat(jgl)) THEN
205  zlat1 = (zxptlat(jgl)-1.0_jprb)/zdivid(jgl)
206  IF (zlat1 < zlat) THEN
207  zlat = zlat1
208  inxlat = jgl
209  ENDIF
210  ENDIF
211  ENDDO
212  ENDIF
213 
214  IF (inxlat >= i1 .AND. inxlat <= i2) THEN
215  IF (d%NSTA(d%NPTRFLOFF+inxlat,jb) == 0) THEN
216  d%NSTA(d%NPTRFLOFF+inxlat,jb) = ixptlat(inxlat)
217  ENDIF
218  d%NONL(d%NPTRFLOFF+inxlat,jb) = d%NONL(d%NPTRFLOFF+inxlat,jb)+1
219  ENDIF
220  ixptlat(inxlat) = ixptlat(inxlat)+1
221  zxptlat(inxlat) = REAL(IXPTLAT(INXLAT),JPRB)
222  ENDDO
223 ENDDO
224 
225 
226 ! Exchange local partitioning info to produce global view
227 !
228 
229 IF( nproc > 1 )THEN
230 
231  IF( leq_regions )THEN
232 
233  itag = mtagpart
234  ipos = 0
235  DO jgl=1,d%NLSTLAT(my_region_ns)-d%NFRSTLAT(my_region_ns)+1
236  ipos = ipos+1
237  icombuf(ipos) = d%NSTA(d%NPTRFLOFF+jgl,my_region_ew)
238  ipos = ipos+1
239  icombuf(ipos) = d%NONL(d%NPTRFLOFF+jgl,my_region_ew)
240  ENDDO
241  IF( ipos > ibuflen )THEN
242  CALL abort_trans(' SUSTAONL: SEND BUFFER TOO SMALL FOR GLOBAL INFO')
243  ENDIF
244  ilsend = ipos
245 
246  DO ja=1,n_regions_ns
247  DO jb=1,n_regions(ja)
248  CALL set2pe(isend,ja,jb,0,0)
249  IF(isend /= myproc) THEN
250 ! CALL MPL_SEND(ICOMBUF(1:ILSEND),KDEST=NPRCIDS(ISEND),KTAG=ITAG, &
251 ! & CDSTRING='SUSTAONL:')
252 ! MPL 4.12.08
253  CALL abor1(' SUSTAONL: JUSTE APRES MPL_SEND')
254  ENDIF
255  ENDDO
256  ENDDO
257 
258  DO ja=1,n_regions_ns
259  igl1 = d%NFRSTLAT(ja)
260  igl2 = d%NLSTLAT(ja)
261  DO jb=1,n_regions(ja)
262  CALL set2pe(irecv,ja,jb,0,0)
263  IF(irecv /= myproc) THEN
264  ilen = (d%NLSTLAT(ja)-d%NFRSTLAT(ja)+1)*2
265 ! CALL MPL_RECV(ICOMBUF(1:ILEN),KSOURCE=NPRCIDS(IRECV),KTAG=ITAG, &
266 ! & KOUNT=ILRECV,CDSTRING='SUSTAONL:')
267 ! MPL 4.12.08
268  CALL abor1(' SUSTAONL: JUSTE APRES MPL_RCV')
269  ipos = 0
270  DO jgl=igl1,igl2
271  igl = d%NPTRFRSTLAT(ja)+jgl-igl1
272  ipos = ipos+1
273  d%NSTA(igl,jb) = icombuf(ipos)
274  ipos = ipos+1
275  d%NONL(igl,jb) = icombuf(ipos)
276  ENDDO
277  ENDIF
278  ENDDO
279  ENDDO
280 
281  ELSE
282 
283  itag = mtagpart
284  ipos = 0
285  DO jb=1,n_regions(my_region_ns)
286  DO jgl=1,d%NLSTLAT(my_region_ns)-d%NFRSTLAT(my_region_ns)+1
287  ipos = ipos+1
288  icombuf(ipos) = d%NSTA(d%NPTRFLOFF+jgl,jb)
289  ipos = ipos+1
290  icombuf(ipos) = d%NONL(d%NPTRFLOFF+jgl,jb)
291  ENDDO
292  ENDDO
293  IF( ipos > ibuflen )THEN
294  CALL abort_trans(' SUSTAONL: SEND BUFFER TOO SMALL FOR GLOBAL INFO')
295  ENDIF
296  ilsend = ipos
297  DO ja=1,n_regions_ns
298  CALL set2pe(isend,ja,my_region_ew,0,0)
299  IF(isend /= myproc) THEN
300 ! CALL MPL_SEND(ICOMBUF(1:ILSEND),KDEST=NPRCIDS(ISEND),KTAG=ITAG, &
301 ! & CDSTRING='SUSTAONL:')
302 ! MPL 4.12.08
303  CALL abor1(' SUSTAONL: JUSTE APRES MPL_SEND')
304  ENDIF
305  ENDDO
306 
307  DO ja=1,n_regions_ns
308  CALL set2pe(irecv,ja,my_region_ew,0,0)
309  IF(irecv /= myproc) THEN
310  ilen = (d%NLSTLAT(ja)-d%NFRSTLAT(ja)+1)*n_regions(ja)*2
311 ! CALL MPL_RECV(ICOMBUF(1:ILEN),KSOURCE=NPRCIDS(IRECV),KTAG=ITAG, &
312 ! & KOUNT=ILRECV,CDSTRING='SUSTAONL:')
313 ! MPL 4.12.08
314  CALL abor1(' SUSTAONL: JUSTE APRES MPL_RCV')
315  igl1 = d%NFRSTLAT(ja)
316  igl2 = d%NLSTLAT(ja)
317  ipos = 0
318  DO jb=1,n_regions(ja)
319  DO jgl=igl1,igl2
320  igl = d%NPTRFRSTLAT(ja)+jgl-igl1
321  ipos = ipos+1
322  d%NSTA(igl,jb) = icombuf(ipos)
323  ipos = ipos+1
324  d%NONL(igl,jb) = icombuf(ipos)
325  ENDDO
326  ENDDO
327  ENDIF
328  ENDDO
329 
330  ENDIF
331 
332 ENDIF
333 
334 ! Confirm consistency of global partitioning, specifically testing for
335 ! multiple assignments of same grid point and unassigned grid points
336 
337 llabort = .false.
338 DO jgl=1,r%NDGL
339  DO jl=1,g%NLOEN(jgl)
340  ichk(jl,jgl) = 1
341  ENDDO
342 ENDDO
343 DO ja=1,n_regions_ns
344  igloff = d%NPTRFRSTLAT(ja)
345  DO jb=1,n_regions(ja)
346  igl1 = d%NFRSTLAT(ja)
347  igl2 = d%NLSTLAT(ja)
348  DO jgl=igl1,igl2
349  igl = igloff+jgl-igl1
350  DO jl=d%NSTA(igl,jb),d%NSTA(igl,jb)+d%NONL(igl,jb)-1
351  IF( ichk(jl,jgl) /= 1 )THEN
352  WRITE(nout,'(" SUSTAONL : seta=",i4," setb=",i4,&
353  &" row=",I4," sta=",I4," INVALID GRID POINT")')&
354  &ja,jb,jgl,jl
355  WRITE(0,'(" SUSTAONL : seta=",i4," setb=",i4,&
356  &" ROW=",I4," sta=",I4," INVALID GRID POINT")')&
357  &ja,jb,jgl,jl
358  llabort = .true.
359  ENDIF
360  ichk(jl,jgl) = 2
361  ENDDO
362  ENDDO
363  ENDDO
364 ENDDO
365 DO jgl=1,r%NDGL
366  DO jl=1,g%NLOEN(jgl)
367  IF( ichk(jl,jgl) /= 2 )THEN
368  WRITE(nout,'(" SUSTAONL : row=",i4," sta=",i4,&
369  &" GRID POINT NOT ASSIGNED")') jgl,jl
370  llabort = .true.
371  ENDIF
372  ENDDO
373 ENDDO
374 IF( llabort )THEN
375  WRITE(nout,'(" SUSTAONL : inconsistent partitioning")')
376  CALL abort_trans(' SUSTAONL: inconsistent partitioning')
377 ENDIF
378 
379 
380 IF (llp1) THEN
381  WRITE(unit=nout,fmt='('' OUTPUT FROM ROUTINE SUSTAONL '')')
382  WRITE(unit=nout,fmt='('' '')')
383  WRITE(unit=nout,fmt='('' PARTITIONING INFORMATION '')')
384  WRITE(unit=nout,fmt='('' '')')
385  iprocb = min(32,n_regions_ew)
386  WRITE(unit=nout,fmt='(17X," SETB=",32(1X,I3))') (jb,jb=1,iprocb)
387  DO ja=1,n_regions_ns
388  iprocb = min(32,n_regions(ja))
389  WRITE(unit=nout,fmt='('' '')')
390  igloff = d%NPTRFRSTLAT(ja)
391  igl1 = d%NFRSTLAT(ja)
392  igl2 = d%NLSTLAT(ja)
393  DO jgl=igl1,igl2
394  igl=igloff+jgl-igl1
395  WRITE(unit=nout,fmt='(" SETA=",I3," LAT=",I3," NSTA=",&
396  &32(1X,I3))') ja,jgl,(d%NSTA(igl,jb),jb=1,iprocb)
397  WRITE(unit=nout,fmt='(" SETA=",I3," LAT=",I3," D%NONL=",&
398  &32(1X,I3))') ja,jgl,(d%NONL(igl,jb),jb=1,iprocb)
399  WRITE(unit=nout,fmt='('' '')')
400  ENDDO
401  WRITE(unit=nout,fmt='('' '')')
402  ENDDO
403  WRITE(unit=nout,fmt='('' '')')
404  WRITE(unit=nout,fmt='('' '')')
405 ENDIF
406 
407 ! ------------------------------------------------------------------
408 
409 END SUBROUTINE sustaonl
410 END MODULE sustaonl_mod
411 
!$Id mode_top_bound COMMON comconstr r
Definition: comconst.h:7
integer(kind=jpim) mtagpart
Definition: tpm_distr.F90:29
!$Id mode_top_bound COMMON comconstr g
Definition: comconst.h:7
integer(kind=jpim), public n_regions_ns
type(distr_type), pointer d
Definition: tpm_distr.F90:152
subroutine abor1(CDTEXT)
Definition: abor1.F90:2
integer(kind=jpim), public my_region_ns
integer(kind=jpim) myproc
Definition: tpm_distr.F90:20
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
integer(kind=jpim), public my_region_ew
integer, parameter jprb
Definition: parkind1.F90:31
integer(kind=jpim) nproc
Definition: tpm_distr.F90:11
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
integer(kind=jpim), public n_regions_ew
subroutine sustaonl(KMEDIAP, KRESTM)
Definition: sustaonl_mod.F90:4
subroutine set2pe(KPE, KPRGPNS, KPRGPEW, KPRTRW, KPRTRV)
Definition: set2pe_mod.F90:4
integer, parameter jpim
Definition: parkind1.F90:13
integer(kind=jpim) nout
Definition: tpm_gen.F90:9
integer(kind=jpim), dimension(:), allocatable, public n_regions
logical leq_regions
Definition: tpm_distr.F90:18
subroutine abort_trans(CDTEXT)
!$Header!integer nvarmx s s unit
Definition: gradsdef.h:20
integer(kind=jpim) nprintlev
Definition: tpm_gen.F90:11