GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/rrtm/sumplatb_mod.F90 Lines: 0 69 0.0 %
Date: 2023-06-30 12:56:34 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