LMDZ
sumplatbeq_mod.F90
Go to the documentation of this file.
2 CONTAINS
3 SUBROUTINE sumplatbeq(KDGSA,KDGL,KPROC,KPROCA,KLOENG,LDSPLIT,LDEQ_REGIONS,&
4  &kmediap,krestm,kindic,klast)
5 
6 !**** *SUMPLATBEQ * - Routine to initialize parallel environment
7 ! (latitude partitioning for LEQ_REGIONS=T)
8 
9 ! Purpose.
10 ! --------
11 
12 
13 !** Interface.
14 ! ----------
15 ! *CALL* *SUMPLATBEQ *
16 
17 ! Explicit arguments - input :
18 ! --------------------
19 ! KDGSA -first latitude (grid-space)
20 ! (may be different from NDGSAG)
21 ! KDGL -last latitude
22 ! KPROC -total number of processors
23 ! KPROCA -number of processors in A direction
24 ! KLOENG -actual number of longitudes per latitude.
25 ! LDSPLIT -true for latitudes shared between sets
26 ! LDEQ_REGIONS -true if eq_regions partitioning
27 
28 ! Explicit arguments - output:
29 ! --------------------
30 ! KMEDIAP -mean number of grid points per PE
31 ! KRESTM -number of PEs with one extra point
32 ! KINDIC -intermediate quantity for 'sumplat'
33 ! KLAST -intermediate quantity for 'sumplat'
34 
35 ! Implicit arguments :
36 ! --------------------
37 
38 
39 ! Method.
40 ! -------
41 ! See documentation
42 
43 ! Externals. NONE.
44 ! ----------
45 
46 ! Reference.
47 ! ----------
48 ! ECMWF Research Department documentation of the IFS
49 
50 ! Author.
51 ! -------
52 ! G. Mozdzynski
53 
54 ! Modifications.
55 ! --------------
56 ! Original : April 2006
57 ! ------------------------------------------------------------------
58 
59 
60 USE parkind1 ,ONLY : jpim ,jprb
61 
62 USE tpm_distr
65 
66 IMPLICIT NONE
67 
68 
69 ! * DUMMY:
70 INTEGER(KIND=JPIM),INTENT(IN) :: KDGSA
71 INTEGER(KIND=JPIM),INTENT(IN) :: KDGL
72 INTEGER(KIND=JPIM),INTENT(IN) :: KPROC
73 INTEGER(KIND=JPIM),INTENT(IN) :: KPROCA
74 INTEGER(KIND=JPIM),INTENT(IN) :: KLOENG(kdgsa:kdgl)
75 LOGICAL,INTENT(IN) :: LDSPLIT
76 LOGICAL,INTENT(IN) :: LDEQ_REGIONS
77 INTEGER(KIND=JPIM),INTENT(OUT) :: KMEDIAP
78 INTEGER(KIND=JPIM),INTENT(OUT) :: KRESTM
79 INTEGER(KIND=JPIM),INTENT(OUT) :: KINDIC(kproca)
80 INTEGER(KIND=JPIM),INTENT(OUT) :: KLAST(kproca)
81 
82 ! * LOCAL:
83 
84 ! LOCAL INTEGER SCALARS
85 INTEGER(KIND=JPIM) :: ICOMP, IGL, IMAXI, IMEDIA, IMEDIAP, ITOT, JA, JB, IA, JGL,&
86  &ILAST,IREST,IPE,I2REGIONS
87 LOGICAL :: LLDONE
88 
89 ! -----------------------------------------------------------------
90 
91 !* 1. COMPUTATION OF KMEDIAP, KRESTM, KINDIC, KLAST.
92 ! ----------------------------------------------
93 
94 ! * Computation of KMEDIAP and KRESTM.
95 
96 imedia = sum(kloeng(kdgsa:kdgl))
97 kmediap = imedia / kproc
98 
99 IF( kproc > 1 )THEN
100 ! test if KMEDIAP is too small and no more than 2 asets would be required
101 ! for the first latitude
102  IF( ldsplit )THEN
103  i2regions=n_regions(1)+n_regions(2)
104  IF( kmediap < (kloeng(kdgsa)-1)/i2regions+1 )THEN
105  WRITE(0,'("SUMPLATBEQ: KMEDIAP=",I6," I2REGIONS=",I3," KLOENG(KDGSA)=",I3)')&
106  &kmediap,i2regions,kloeng(kdgsa)
107  CALL abort_trans ('SUMPLATBEQ: NPROC TOO BIG FOR THIS RESOLUTION, LDSPLIT=T')
108  ENDIF
109  ELSE
110 ! test for number asets too large for the number of latitudes
111  IF( kproca > kdgl )THEN
112  WRITE(0,'("SUMPLATBEQ: KMEDIAP=",I6," KPROCA=",I4," KDGL=",I4)')&
113  &kmediap,kproca,kdgl
114  CALL abort_trans ('SUMPLATBEQ: NPROC TOO BIG FOR THIS RESOLUTION, LDSPLIT=F')
115  ENDIF
116  ENDIF
117 ENDIF
118 
119 krestm = imedia - kmediap * kproc
120 IF (krestm > 0) kmediap = kmediap + 1
121 
122 ! * Computation of intermediate quantities KINDIC and KLAST
123 
124 IF (ldsplit) THEN
125 
126  irest = 0
127  ilast =0
128  ipe=0
129  DO ja=1,kproca
130  icomp=0
131  DO jb=1,n_regions(ja)
132  ipe=ipe+1
133  IF (ipe <= krestm .OR. krestm == 0) THEN
134  icomp = icomp + kmediap
135  ELSE
136  icomp = icomp + (kmediap-1)
137  ENDIF
138  ENDDO
139  itot = irest
140  igl = ilast+1
141  DO jgl=igl,kdgl
142  ilast = jgl
143  IF(itot+kloeng(jgl) < icomp) THEN
144  itot = itot+kloeng(jgl)
145  ELSEIF(itot+kloeng(jgl) == icomp) THEN
146  irest = 0
147  klast(ja) = jgl
148  kindic(ja) = 0
149  EXIT
150  ELSE
151  irest = kloeng(jgl) -(icomp-itot)
152  klast(ja) = jgl
153  kindic(ja) = jgl
154  EXIT
155  ENDIF
156  ENDDO
157  ENDDO
158 
159 ELSE
160 
161  kindic(:) = 0
162  lldone=.false.
163  imediap=kmediap
164  IF( myproc == 1 )THEN
165  WRITE(0,'("SUMPLATBEQ: IMEDIAP=",I6)')imediap
166  ENDIF
167  DO WHILE(.NOT.lldone)
168 ! loop until a satisfactory distribution can be found
169  ia=1
170  imaxi=imediap*n_regions(ia)
171  DO jgl=1,kdgl
172  klast(ia)=jgl
173  imaxi=imaxi-kloeng(jgl)
174  IF( ia == kproca .AND. jgl == kdgl )THEN
175  IF( myproc == 1 )THEN
176  WRITE(0,'("SUMPLATBEQ: EXIT 1")')
177  ENDIF
178  EXIT
179  ENDIF
180  IF( ia == kproca .AND. jgl < kdgl )THEN
181  IF( myproc == 1 )THEN
182  WRITE(0,'("SUMPLATBEQ: EXIT 2")')
183  ENDIF
184  klast(kproca)=kdgl
185  EXIT
186  ENDIF
187  IF( ia < kproca .AND. jgl == kdgl )THEN
188  DO ja=kproca,ia+1,-1
189  klast(ja)=kdgl+ja-kproca
190  ENDDO
191  DO ja=kproca,2,-1
192  IF( klast(ja) <= klast(ja-1) )THEN
193  klast(ja-1)=klast(ja)-1
194  ENDIF
195  ENDDO
196  IF( myproc == 1 )THEN
197  WRITE(0,'("SUMPLATBEQ: EXIT 3")')
198  ENDIF
199  EXIT
200  ENDIF
201  IF( imaxi <= 0 )THEN
202  ia=ia+1
203  imaxi=imaxi+imediap*n_regions(ia)
204  ENDIF
205  ENDDO
206  IF( kproca > 1 .AND. klast(kproca) == klast(kproca-1) )THEN
207  imediap=imediap-1
208  IF( myproc == 1 )THEN
209  WRITE(0,'("SUMPLATBEQ: REDUCING IMEDIAP=",I6)')imediap
210  ENDIF
211  IF( imediap <= 0 )THEN
212  CALL abort_trans ('SUMPLATBEQ: PROBLEM PARTITIONING WITH LSPLIT=F, IMEDIAP <= 0')
213  ENDIF
214  ELSE
215  lldone=.true.
216  ENDIF
217  ENDDO
218 
219 ENDIF
220 
221 END SUBROUTINE sumplatbeq
222 END MODULE sumplatbeq_mod
subroutine sumplatbeq(KDGSA, KDGL, KPROC, KPROCA, KLOENG, LDSPLIT, LDEQ_REGIONS, KMEDIAP, KRESTM, KINDIC, KLAST)
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, parameter jprb
Definition: parkind1.F90:31
!$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, parameter jpim
Definition: parkind1.F90:13
integer(kind=jpim), dimension(:), allocatable, public n_regions
subroutine abort_trans(CDTEXT)