GCC Code Coverage Report


Directory: ./
File: rad/sumplatb_mod.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 69 0.0%
Branches: 0 68 0.0%

Line Branch Exec Source
1 MODULE SUMPLATB_MOD
2 CONTAINS
3 ✗ SUBROUTINE SUMPLATB(KDGSA,KDGL,KPROCA,KLOENG,LDSPLIT,&
4 ✗ &KMEDIAP,KRESTM,KINDIC,KLAST)
5
6 !**** *SUMPLATB * - Routine to initialize parallel environment
7
8 ! Purpose.
9 ! --------
10
11
12 !** Interface.
13 ! ----------
14 ! *CALL* *SUMPLATB *
15
16 ! Explicit arguments - input :
17 ! --------------------
18 ! KDGSA -first latitude (grid-space)
19 ! (may be different from NDGSAG)
20 ! KDGL -last latitude
21 ! KPROCA -number of processors in A direction
22 ! KLOENG -actual number of longitudes per latitude.
23 ! LDSPLIT -true for latitudes shared between sets
24
25 ! Explicit arguments - output:
26 ! --------------------
27 ! KMEDIAP -mean number of grid points per PE
28 ! KRESTM -number of PEs with one extra point
29 ! KINDIC -intermediate quantity for 'sumplat'
30 ! KLAST -intermediate quantity for 'sumplat'
31
32 ! Implicit arguments :
33 ! --------------------
34
35
36 ! Method.
37 ! -------
38 ! See documentation
39
40 ! Externals. NONE.
41 ! ----------
42
43 ! Reference.
44 ! ----------
45 ! ECMWF Research Department documentation of the IFS
46
47 ! Author.
48 ! -------
49 ! K. YESSAD (after old version of sumplat.F).
50
51 ! Modifications.
52 ! --------------
53 ! Original : 98-12-07
54 ! ------------------------------------------------------------------
55
56
57 USE PARKIND1 ,ONLY : JPIM ,JPRB
58
59 USE ABORT_TRANS_MOD
60
61 IMPLICIT NONE
62
63
64 ! * DUMMY:
65 INTEGER(KIND=JPIM),INTENT(IN) :: KDGSA
66 INTEGER(KIND=JPIM),INTENT(IN) :: KDGL
67 INTEGER(KIND=JPIM),INTENT(IN) :: KPROCA
68 INTEGER(KIND=JPIM),INTENT(IN) :: KLOENG(KDGSA:KDGL)
69 LOGICAL,INTENT(IN) :: LDSPLIT
70 INTEGER(KIND=JPIM),INTENT(OUT) :: KMEDIAP
71 INTEGER(KIND=JPIM),INTENT(OUT) :: KRESTM
72 INTEGER(KIND=JPIM),INTENT(OUT) :: KINDIC(KPROCA)
73 INTEGER(KIND=JPIM),INTENT(OUT) :: KLAST(KPROCA)
74
75 ! * LOCAL:
76 ✗ INTEGER(KIND=JPIM) :: IPP1(KPROCA),ILAST1(KPROCA)
77 ✗ INTEGER(KIND=JPIM) :: IPP(KPROCA)
78 ✗ INTEGER(KIND=JPIM) :: IFIRST(KPROCA)
79
80 ! LOCAL INTEGER SCALARS
81 INTEGER(KIND=JPIM) :: ICOMP, IGL, IMAXI, IMAXIOL, IMEDIA, ITOT, JA, JGL,&
82 &ILAST,IREST,ILIMIT,IFRST
83 LOGICAL :: LLDONE
84
85 ! -----------------------------------------------------------------
86
87 !* 1. COMPUTATION OF KMEDIAP, KRESTM, KINDIC, KLAST.
88 ! ----------------------------------------------
89
90 ! * Computation of KMEDIAP and KRESTM.
91
92 ✗ IMEDIA = SUM(KLOENG(KDGSA:KDGL))
93 ✗ KMEDIAP = IMEDIA / KPROCA
94 ✗ IF (KMEDIAP < KLOENG(KDGL/2)) THEN
95 ✗ CALL ABORT_TRANS ('SUMPLATB: KPROCA TOO BIG FOR THIS RESOLUTION')
96 ENDIF
97 ✗ KRESTM = IMEDIA - KMEDIAP * KPROCA
98 ✗ IF (KRESTM > 0) KMEDIAP = KMEDIAP + 1
99
100 ! * Computation of intermediate quantities KINDIC and KLAST
101
102 ✗ IF (LDSPLIT) THEN
103
104 IREST = 0
105 ILAST =0
106 ✗ DO JA=1,KPROCA
107 ✗ IF (JA <= KRESTM .OR. KRESTM == 0) THEN
108 ✗ ICOMP = KMEDIAP
109 ELSE
110 ✗ ICOMP = KMEDIAP - 1
111 ENDIF
112 ITOT = IREST
113 ✗ IGL = ILAST+1
114 ✗ DO JGL=IGL,KDGL
115 ILAST = JGL
116 ✗ IF(ITOT+KLOENG(JGL) < ICOMP) THEN
117 ITOT = ITOT+KLOENG(JGL)
118 ✗ ELSEIF(ITOT+KLOENG(JGL) == ICOMP) THEN
119 IREST = 0
120 ✗ KLAST(JA) = JGL
121 ✗ KINDIC(JA) = 0
122 ✗ EXIT
123 ELSE
124 ✗ IREST = KLOENG(JGL) -(ICOMP-ITOT)
125 ✗ KLAST(JA) = JGL
126 ✗ KINDIC(JA) = JGL
127 ✗ EXIT
128 ENDIF
129 ENDDO
130 ENDDO
131
132 ELSE
133
134 ✗ KINDIC(:) = 0
135
136 ✗ IMAXI = KMEDIAP-1
137 IMAXIOL = HUGE(IMAXIOL)
138 DO
139 ILIMIT = IMAXI
140 IMAXI = 0
141 IFRST = KDGL
142 ✗ ILAST1(:) = 0
143 ✗ IPP1(:) = 0
144 ✗ DO JA=KPROCA,1,-1
145 IGL = IFRST
146 ✗ LATS:DO JGL=IGL,1,-1
147 ✗ IF (IPP1(JA) < ILIMIT .OR. JA == 1) THEN
148 ✗ IFRST = JGL-1
149 ✗ IPP1(JA) = IPP1(JA) + KLOENG(JGL)
150 ✗ IF(ILAST1(JA) == 0) ILAST1(JA) = JGL
151 ELSE
152 EXIT LATS
153 ENDIF
154 ENDDO LATS
155 ✗ IMAXI = MAX (IMAXI,IPP1(JA))
156 ENDDO
157 ✗ IF(IMAXI >= IMAXIOL) EXIT
158 ✗ KLAST(:) = ILAST1(:)
159 ✗ IPP(:) = IPP1(:)
160 ✗ IMAXIOL = IMAXI
161 ENDDO
162
163 ! make the distribution more uniform
164 ! ----------------------------------
165
166 ✗ IFIRST(1) = 0
167 ✗ IF (KLAST(1) > 0) IFIRST(1) = 1
168 ✗ DO JA=2,KPROCA
169 ✗ IF (IPP(JA) > 0) THEN
170 ✗ IFIRST(JA) = KLAST(JA-1)+1
171 ELSE
172 ✗ IFIRST(JA) = 0
173 ENDIF
174 ENDDO
175
176 LLDONE = .FALSE.
177 ✗ DO WHILE( .NOT.LLDONE )
178 LLDONE = .TRUE.
179
180 ✗ DO JA=1,KPROCA-1
181 ✗ IF (IPP(JA) > IPP(JA+1)) THEN
182 ✗ IF (IPP(JA)-IPP(JA+1) > IPP(JA+1) + 2 *&
183 &KLOENG(KLAST(JA)) -IPP(JA) ) THEN
184 ✗ IPP(JA) = IPP(JA) - KLOENG(KLAST(JA))
185 ✗ IPP(JA+1) = IPP(JA+1) + KLOENG(KLAST(JA))
186 ✗ IF (KLAST(JA+1) == 0) KLAST(JA+1) = KLAST(JA)
187 ✗ IFIRST(JA+1) = KLAST(JA)
188 ✗ KLAST(JA) = KLAST(JA) - 1
189 ✗ IF (KLAST(JA) == 0) IFIRST(JA) = 0
190 LLDONE = .FALSE.
191 ENDIF
192 ELSE
193 ✗ IF( IFIRST(JA+1) > 0 )THEN
194 ✗ IF (IPP(JA+1)-IPP(JA) >= IPP(JA) + 2 *&
195 &KLOENG(IFIRST(JA+1)) -IPP(JA+1) ) THEN
196 ✗ IPP(JA) = IPP(JA) + KLOENG(IFIRST(JA+1))
197 ✗ IPP(JA+1) = IPP(JA+1) - KLOENG(IFIRST(JA+1))
198 ✗ KLAST(JA) = IFIRST(JA+1)
199 ✗ IF (IFIRST(JA) == 0) IFIRST(JA) = KLAST(JA)
200 ✗ IF (KLAST(JA+1) == KLAST(JA)) THEN
201 ✗ KLAST(JA+1) = 0
202 ✗ IFIRST(JA+1) = 0
203 ELSE
204 ✗ IFIRST(JA+1) = IFIRST(JA+1) + 1
205 ENDIF
206 LLDONE = .FALSE.
207 ENDIF
208 ENDIF
209 ENDIF
210 ENDDO
211 ENDDO
212
213 ENDIF
214
215 ✗ END SUBROUTINE SUMPLATB
216 END MODULE SUMPLATB_MOD
217