GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: phylmd/rrtm/suecradi.F90 Lines: 0 281 0.0 %
Date: 2023-06-30 12:51:15 Branches: 0 412 0.0 %

Line Branch Exec Source
1
SUBROUTINE SUECRADI
2
3
!**** *SUECRADI*   - INITIALIZE DATA STRUCTURES FOR RADIATION INTERPOLATION
4
5
!     PURPOSE.
6
!     --------
7
!           INITIALIZE DATA STRUCTURES FOR RADIATION INTERPOLATION
8
9
!**   INTERFACE.
10
!     ----------
11
!        CALL *SUECRADI* FROM *SUECRAD*
12
!              --------        -------
13
14
!        EXPLICIT ARGUMENTS :
15
!        --------------------
16
!        NONE
17
18
!        IMPLICIT ARGUMENTS :
19
!        --------------------
20
21
!     METHOD.
22
!     -------
23
!        SEE DOCUMENTATION
24
25
!     EXTERNALS.
26
!     ----------
27
!        NONE
28
29
!     REFERENCE.
30
!     ----------
31
!        ECMWF Research Department documentation of the IFS
32
33
!     AUTHOR.
34
!     -------
35
!        GEORGE MOZDZYNSKI 95-03-13
36
37
!     MODIFICATIONS.
38
!     --------------
39
!        980317: JJMorcrette clean-up (NRAD, NFLUX)
40
!        990907: JJMorcrette clean-up RRTM
41
!        010129: JJMorcrette clean-up LERAD1H, NLNGR1H
42
!        M.Hamrud      01-Oct-2003 CY28 Cleaning
43
!     ------------------------------------------------------------------
44
45
USE PARKIND1  ,ONLY : JPIM     ,JPRB
46
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
47
48
USE PARRINT  , ONLY : JPRADCW  ,JPRADCE
49
USE YOMDIM   , ONLY : NDGSAG   ,NDGSAL   ,NDGENG   ,NDGENL   ,NDLON
50
USE YOMCT0   , ONLY :   NPRGPEW  ,NPRINTLEV,LALLOPR
51
USE YOMLUN   , ONLY : NULOUT
52
USE YOMGEM   , ONLY : NLOENG
53
USE YOERAD   , ONLY :      &
54
 & NRINT
55
USE YOMMP    , ONLY :    MY_REGION_NS   ,MY_REGION_EW   ,NSTA     ,&
56
 & NONL     ,NPTRFRSTLAT,NPTRLSTLAT,NFRSTLAT ,NLSTLAT  ,&
57
 & LSPLITLAT
58
USE YOMPRAD  , ONLY : LODBGRADI,LODBGRADL,NRIRINT  ,NRFRSTOFF,&
59
 & NRLASTOFF,NRIMAX   ,NRIMAXT  ,NRCNEEDW ,NRCNEEDE ,&
60
 & NRCSNDW  ,NRCSNDE  ,NRCRCVW  ,NRCRCVE  ,NRCSNDT  ,&
61
 & NRCRCVT  ,NRCRCVWO ,NRCRCVEO
62
63
IMPLICIT NONE
64
65
INTEGER(KIND=JPIM) :: ILWA (2*NPRGPEW)
66
INTEGER(KIND=JPIM) :: ILWB (2*NPRGPEW)
67
INTEGER(KIND=JPIM) :: ILWBI(2*NPRGPEW)
68
INTEGER(KIND=JPIM) :: ILEA (2*NPRGPEW)
69
INTEGER(KIND=JPIM) :: ILEB (2*NPRGPEW)
70
INTEGER(KIND=JPIM) :: ILEBI(2*NPRGPEW)
71
INTEGER(KIND=JPIM) :: ISTA(NDGENL,2*NPRGPEW)
72
INTEGER(KIND=JPIM) :: IONL(NDGENL,2*NPRGPEW)
73
CHARACTER (LEN = 14) ::  CLDBG
74
75
INTEGER(KIND=JPIM) :: IAO, IAOFF, IB, IB1, IB2, IB3, IB4, IB5,&
76
 & IB6, ICNEED, ICTAKE, IGL, IJBXBOFF, &
77
 & IJBXSETA, ILE, ILONS, ILW, IMAX, IMAXC, &
78
 & IMAXT, IOTHBOFF, IOTHSETA, IPROCB, IRINT, &
79
 & IU, IUNIT, JA, JB, JBE, JBW, JBX, JF, JGL, &
80
 & JGLGLO, JL
81
82
LOGICAL :: LLMYSETAISWEST, LLP
83
REAL(KIND=JPRB) :: ZHOOK_HANDLE
84
85
#include "abor1.intfb.h"
86
87
!      ----------------------------------------------------------------
88
89
IF (LHOOK) CALL DR_HOOK('SUECRADI',0,ZHOOK_HANDLE)
90
LLP = NPRINTLEV >= 1.OR. LALLOPR
91
IU = NULOUT
92
ALLOCATE(NRIRINT  (NDGSAG:NDGENG))
93
IF(LLP)WRITE(IU,9) 'NRIRINT   ',SIZE(NRIRINT),SHAPE(NRIRINT)
94
ALLOCATE(NRIMAX   (NDGSAG:NDGENG,2*NPRGPEW))
95
IF(LLP)WRITE(IU,9) 'NRIMAX    ',SIZE(NRIMAX),SHAPE(NRIMAX)
96
ALLOCATE(NRFRSTOFF(NDGSAG:NDGENG,2*NPRGPEW))
97
IF(LLP)WRITE(IU,9) 'NRFRSTOFF ',SIZE(NRFRSTOFF),SHAPE(NRFRSTOFF)
98
ALLOCATE(NRLASTOFF(NDGSAG:NDGENG,2*NPRGPEW))
99
IF(LLP)WRITE(IU,9) 'NRLASTOFF ',SIZE(NRLASTOFF),SHAPE(NRLASTOFF)
100
ALLOCATE(NRCNEEDW (NDGSAG:NDGENG,2*NPRGPEW))
101
IF(LLP)WRITE(IU,9) 'NRCNEEDW  ',SIZE(NRCNEEDW),SHAPE(NRCNEEDW)
102
ALLOCATE(NRCNEEDE (NDGSAG:NDGENG,2*NPRGPEW))
103
IF(LLP)WRITE(IU,9) 'NRCNEEDE  ',SIZE(NRCNEEDE),SHAPE(NRCNEEDE)
104
ALLOCATE(NRCSNDW  (NDGSAG:NDGENG,NPRGPEW,-1:1))
105
IF(LLP)WRITE(IU,9) 'NRCSNDW   ',SIZE(NRCSNDW),SHAPE(NRCSNDW)
106
ALLOCATE(NRCSNDE  (NDGSAG:NDGENG,NPRGPEW,-1:1))
107
IF(LLP)WRITE(IU,9) 'NRCSNDE   ',SIZE(NRCSNDE),SHAPE(NRCSNDE)
108
ALLOCATE(NRCRCVW  (NDGSAG:NDGENG,NPRGPEW,-1:1))
109
IF(LLP)WRITE(IU,9) 'NRCRCVW   ',SIZE(NRCRCVW),SHAPE(NRCRCVW)
110
ALLOCATE(NRCRCVE  (NDGSAG:NDGENG,NPRGPEW,-1:1))
111
IF(LLP)WRITE(IU,9) 'NRCRCVE   ',SIZE(NRCRCVE),SHAPE(NRCRCVE)
112
ALLOCATE(NRCSNDT  (NPRGPEW,-1:1))
113
IF(LLP)WRITE(IU,9) 'NRCSNDT   ',SIZE(NRCSNDT),SHAPE(NRCSNDT)
114
ALLOCATE(NRCRCVT  (NPRGPEW,-1:1))
115
IF(LLP)WRITE(IU,9) 'NRCRCVT   ',SIZE(NRCRCVT),SHAPE(NRCRCVT)
116
ALLOCATE(NRCRCVWO (NDGSAG:NDGENG,NPRGPEW,-1:1))
117
IF(LLP)WRITE(IU,9) 'NRCRCVWO  ',SIZE(NRCRCVWO),SHAPE(NRCRCVWO)
118
ALLOCATE(NRCRCVEO (NDGSAG:NDGENG,NPRGPEW,-1:1))
119
IF(LLP)WRITE(IU,9) 'NRCRCVEO  ',SIZE(NRCRCVEO),SHAPE(NRCRCVEO)
120
121
9 FORMAT(1X,'ARRAY ',A10,' ALLOCATED ',8I8)
122
123
! INITIALISE GENERAL DATA STRUCTURES REQUIRED FOR RADIATION INTERPOLATION
124
125
DO JGL=NDGSAG,NDGENG
126
  NRIRINT(JGL)=0
127
ENDDO
128
DO JB=1,2*NPRGPEW
129
  DO JGL=NDGSAG,NDGENG
130
    NRFRSTOFF(JGL,JB)=0
131
    NRLASTOFF(JGL,JB)=0
132
    NRIMAX   (JGL,JB)=0
133
    NRCNEEDW (JGL,JB)=0
134
    NRCNEEDE (JGL,JB)=0
135
  ENDDO
136
ENDDO
137
NRIMAXT=0
138
DO JA=-1,1
139
  DO JB=1,NPRGPEW
140
    DO JGL=NDGSAG,NDGENG
141
      NRCSNDW(JGL,JB,JA)=0
142
      NRCSNDE(JGL,JB,JA)=0
143
      NRCRCVW(JGL,JB,JA)=0
144
      NRCRCVE(JGL,JB,JA)=0
145
      NRCRCVWO(JGL,JB,JA)=0
146
      NRCRCVEO(JGL,JB,JA)=0
147
    ENDDO
148
  ENDDO
149
ENDDO
150
DO JA=-1,1
151
  DO JB=1,NPRGPEW
152
    NRCSNDT(JB,JA)=0
153
    NRCRCVT(JB,JA)=0
154
  ENDDO
155
ENDDO
156
157
DO JB=1,2*NPRGPEW
158
  DO JGL=1,NDGENL
159
    ISTA(JGL,JB)=0
160
    IONL(JGL,JB)=0
161
  ENDDO
162
ENDDO
163
DO JB=1,NPRGPEW
164
  DO JGL=1,NDGENL
165
    IGL=NPTRFRSTLAT(MY_REGION_NS)-1+JGL
166
    ISTA(JGL,JB)=NSTA(IGL,JB)
167
    IONL(JGL,JB)=NONL(IGL,JB)
168
  ENDDO
169
ENDDO
170
IF( LSPLITLAT(NFRSTLAT(MY_REGION_NS)) )THEN
171
  LLMYSETAISWEST=.FALSE.
172
  DO JB=1,NPRGPEW
173
    IF( NSTA(NPTRFRSTLAT(MY_REGION_NS),JB) == 1 )THEN
174
      LLMYSETAISWEST=.TRUE.
175
    ENDIF
176
  ENDDO
177
  IF( LLMYSETAISWEST )THEN
178
    DO JB=1,NPRGPEW
179
      IGL=NPTRFRSTLAT(MY_REGION_NS+1)
180
      ISTA(1,JB+NPRGPEW)=NSTA(IGL,JB)
181
      IONL(1,JB+NPRGPEW)=NONL(IGL,JB)
182
    ENDDO
183
  ELSE
184
    DO JB=1,NPRGPEW
185
      IGL=NPTRFRSTLAT(MY_REGION_NS)-1
186
      ISTA(1,JB+NPRGPEW)=NSTA(IGL,JB)
187
      IONL(1,JB+NPRGPEW)=NONL(IGL,JB)
188
    ENDDO
189
  ENDIF
190
ENDIF
191
IF( LSPLITLAT(NLSTLAT(MY_REGION_NS)) )THEN
192
  LLMYSETAISWEST=.FALSE.
193
  DO JB=1,NPRGPEW
194
    IF( NSTA(NPTRLSTLAT(MY_REGION_NS),JB) == 1 )THEN
195
      LLMYSETAISWEST=.TRUE.
196
    ENDIF
197
  ENDDO
198
  IF( LLMYSETAISWEST )THEN
199
    DO JB=1,NPRGPEW
200
      IGL=NPTRFRSTLAT(MY_REGION_NS+1)
201
      ISTA(NDGENL,JB+NPRGPEW)=NSTA(IGL,JB)
202
      IONL(NDGENL,JB+NPRGPEW)=NONL(IGL,JB)
203
    ENDDO
204
  ELSE
205
    DO JB=1,NPRGPEW
206
      IGL=NPTRFRSTLAT(MY_REGION_NS)-1
207
      ISTA(NDGENL,JB+NPRGPEW)=NSTA(IGL,JB)
208
      IONL(NDGENL,JB+NPRGPEW)=NONL(IGL,JB)
209
    ENDDO
210
  ENDIF
211
ENDIF
212
213
IMAXC=NDLON/NRINT+6
214
IMAXC=IMAXC+(1-MOD(IMAXC,2))
215
216
IF( LODBGRADI )THEN
217
  IUNIT=10
218
  WRITE(CLDBG,'("debug_a",I3.3,"b",I3.3)')MY_REGION_NS,MY_REGION_EW
219
  OPEN(UNIT=IUNIT,FILE=CLDBG)
220
  WRITE(IUNIT,'("SUECRADI: MY_REGION_NS=",I4," MY_REGION_EW=",I4)')MY_REGION_NS,MY_REGION_EW
221
  WRITE(IUNIT,'("SUECRADI: NDGSAL=",I4," NDGENL=",I4)') NDGSAL,NDGENL
222
  WRITE(IUNIT,'("SUECRADI: ")')
223
ENDIF
224
225
! LOOP OVER OUR PARTITION LATITUDES, TO INITIALISE SIMPLE ITEMS
226
227
IMAXT=0
228
229
DO JGL=1,NDGENL
230
231
  JGLGLO=NFRSTLAT(MY_REGION_NS)+JGL-1
232
  ILONS=NLOENG(JGLGLO)
233
234
  IRINT=1
235
  DO JF=1,NRINT
236
    IF( MOD(ILONS,JF) == 0.AND.ILONS/JF <= IMAXC )THEN
237
      IRINT=JF
238
      EXIT
239
    ENDIF
240
  ENDDO
241
  NRIRINT  (JGL)=IRINT
242
243
  IF( LODBGRADI )THEN
244
    WRITE(IUNIT,'("SUECRADI: JGLGLO=",I4," JGL=",I4,&
245
     & " NLOENG=",I4," NRIRINT=",I1," LSPLITLAT=",L2)')&
246
     & JGLGLO,JGL,NLOENG(JGLGLO),NRIRINT(JGL),LSPLITLAT(JGLGLO)
247
  ENDIF
248
249
  IF( LSPLITLAT(JGLGLO) )THEN
250
    IPROCB=2*NPRGPEW
251
  ELSE
252
    IPROCB=NPRGPEW
253
  ENDIF
254
255
  DO JB=1,IPROCB
256
    IF( IONL(JGL,JB) == 0 ) CYCLE
257
    NRFRSTOFF(JGL,JB)=MOD(IRINT-MOD(ISTA(JGL,JB)-1,IRINT),IRINT)
258
    NRLASTOFF(JGL,JB)=&
259
     & MOD(IRINT-MOD(ISTA(JGL,JB)+IONL(JGL,JB)-2,IRINT),&
260
     & IRINT)
261
    IMAX=0
262
    DO JL=1+NRFRSTOFF(JGL,JB),IONL(JGL,JB),IRINT
263
      IMAX=IMAX+1
264
    ENDDO
265
    NRIMAX(JGL,JB)=IMAX
266
    IF( NRFRSTOFF(JGL,JB) == 0 )THEN
267
      NRCNEEDW (JGL,JB)=JPRADCW-1
268
    ELSE
269
      NRCNEEDW (JGL,JB)=JPRADCW
270
    ENDIF
271
    IF( NRLASTOFF(JGL,JB) == 0 )THEN
272
      NRCNEEDE (JGL,JB)=JPRADCE-1
273
    ELSE
274
      NRCNEEDE (JGL,JB)=JPRADCE
275
    ENDIF
276
    IF( LODBGRADI )THEN
277
      WRITE(IUNIT,'("SUECRADI: JB=",I4," ISTA=",I4,&
278
       & " IONL=",I4," NRFRSTOFF=",I1," NRIMAX=",I3,&
279
       & " NRLASTOFF=",I1," CNEEDW=",I1," CNEEDE=",I1)')&
280
       & JB,ISTA(JGL,JB),IONL(JGL,JB),NRFRSTOFF(JGL,JB),&
281
       & NRIMAX(JGL,JB),NRLASTOFF(JGL,JB),&
282
       & NRCNEEDW(JGL,JB),NRCNEEDE(JGL,JB)
283
    ENDIF
284
  ENDDO
285
286
  IF( LODBGRADI )THEN
287
    WRITE(IUNIT,'("SUECRADI: ")')
288
  ENDIF
289
290
  IMAXT=IMAXT+NRIMAX(JGL,MY_REGION_EW)
291
292
ENDDO
293
294
NRIMAXT=IMAXT
295
IF( LODBGRADI )THEN
296
  WRITE(IUNIT,'("SUECRADI: NRIMAXT=",I6)') NRIMAXT
297
ENDIF
298
299
! NOW LOOP OVER OUR PARTITION LATITUDES, TO DETERMINE SEND AND RECEIVE
300
! INFORMATION
301
302
DO JGL=1,NDGENL
303
304
! TEST IF WE HAVE ANY FINE POINTS
305
! IF WE HAVEN'T, THEN WE DON'T HAVE TO SEND OR RECEIVE ANYTHING
306
307
  IF( IONL(JGL,MY_REGION_EW) == 0 ) CYCLE
308
  JGLGLO=NFRSTLAT(MY_REGION_NS)+JGL-1
309
310
! TEST IF CURRENT LATITUDE IS SPLIT ACROSS SET A's
311
! TO SET IPROCB TO THE MAXIMUM NUMBER OF SETB's WE MUST CONSIDER IN
312
! THE FOLLOWING CODE FOR THIS LATITUDE
313
314
  IF( LSPLITLAT(JGLGLO) )THEN
315
    IPROCB=2*NPRGPEW
316
  ELSE
317
    IPROCB=NPRGPEW
318
  ENDIF
319
320
! NOW CONSIDER EACH PARTITION (ON THIS LATITUDE) IN TURN TO SEE WHO
321
! WILL BE SENDING TO AND RECEIVING FROM IT, AND OBVIOUSLY NOTING
322
! PERTINENT INFO IF OUR PARTITION IS SENDING OR RECEIVING
323
324
  DO JBX=1,IPROCB
325
326
! LET'S START BY BUILDING UP A LIST OF WESTERLY AND EASTERLY PARTITIONS
327
! CONTAINING ONE OR MORE FINE POINTS, SO THAT WE CAN SUBSEQUENTLY IGNORE
328
! ISSUES ABOUT WHETHER THIS IS A SPLIT LATITUDE AND THAT THE EARTH IS
329
! ROUND. ALSO THE PARTITION BEING CONSIDERED (JBX) ALWAYS APPEARS AT THE
330
! END OF EACH OF THESE LISTS, BECAUSE JBX MAY NEED TO 'LOGICALLY' SEND/RECEIVE
331
! COURSE POINTS TO/FROM ITS OWN PARTITION FOR THIS LATITUDE.
332
333
    ILW=0
334
    ILE=0
335
    IF( LSPLITLAT(JGLGLO) )THEN
336
337
! DETERMINE WHETHER THE SET A SHARING THIS LATITUDE IS (ABOVE,LEFT) OR
338
! (BELOW,RIGHT). WE DETERMINE THIS BY TESTING IF ANY SETB ON THIS LATITUDE
339
! STARTS AT 1.
340
341
      IAOFF=-1
342
      DO JB=1,NPRGPEW
343
        IF( ISTA(JGL,JB) == 1 )THEN
344
          IAOFF=1
345
          EXIT
346
        ENDIF
347
      ENDDO
348
349
      IF( JBX <= NPRGPEW )THEN
350
        IJBXSETA=MY_REGION_NS
351
        IOTHSETA=MY_REGION_NS+IAOFF
352
        IJBXBOFF=0
353
        IOTHBOFF=NPRGPEW
354
      ELSE
355
        IJBXSETA=MY_REGION_NS+IAOFF
356
        IOTHSETA=MY_REGION_NS
357
        IJBXBOFF=NPRGPEW
358
        IOTHBOFF=0
359
      ENDIF
360
! INITIALISE WEST LIST, SPLIT LAT
361
      IF( JBX <= NPRGPEW )THEN
362
        IB1=JBX-1
363
        IB2=1
364
        IB3=2*NPRGPEW
365
        IB4=NPRGPEW+1
366
        IB5=NPRGPEW
367
        IB6=JBX
368
      ELSE
369
        IB1=JBX-1
370
        IB2=NPRGPEW+1
371
        IB3=NPRGPEW
372
        IB4=1
373
        IB5=2*NPRGPEW
374
        IB6=JBX
375
      ENDIF
376
      DO JB=IB1,IB2,-1
377
        IF( IONL(JGL,JB) > 0 )THEN
378
          ILW=ILW+1
379
          ILWA (ILW)=IJBXSETA
380
          ILWB (ILW)=JB-IJBXBOFF
381
          ILWBI(ILW)=JB
382
        ENDIF
383
      ENDDO
384
      DO JB=IB3,IB4,-1
385
        IF( IONL(JGL,JB) > 0 )THEN
386
          ILW=ILW+1
387
          ILWA (ILW)=IOTHSETA
388
          ILWB (ILW)=JB-IOTHBOFF
389
          ILWBI(ILW)=JB
390
        ENDIF
391
      ENDDO
392
      DO JB=IB5,IB6,-1
393
        IF( IONL(JGL,JB) > 0 )THEN
394
          ILW=ILW+1
395
          ILWA (ILW)=IJBXSETA
396
          ILWB (ILW)=JB-IJBXBOFF
397
          ILWBI(ILW)=JB
398
        ENDIF
399
      ENDDO
400
! INITIALISE EAST LIST, SPLIT LAT
401
      IF( JBX <= NPRGPEW )THEN
402
        IB1=JBX+1
403
        IB2=NPRGPEW
404
        IB3=NPRGPEW+1
405
        IB4=2*NPRGPEW
406
        IB5=1
407
        IB6=JBX
408
      ELSE
409
        IB1=JBX+1
410
        IB2=2*NPRGPEW
411
        IB3=1
412
        IB4=NPRGPEW
413
        IB5=NPRGPEW+1
414
        IB6=JBX
415
      ENDIF
416
      DO JB=IB1,IB2
417
        IF( IONL(JGL,JB) > 0 )THEN
418
          ILE=ILE+1
419
          ILEA (ILE)=IJBXSETA
420
          ILEB (ILE)=JB-IJBXBOFF
421
          ILEBI(ILE)=JB
422
        ENDIF
423
      ENDDO
424
      DO JB=IB3,IB4
425
        IF( IONL(JGL,JB) > 0 )THEN
426
          ILE=ILE+1
427
          ILEA (ILE)=IOTHSETA
428
          ILEB (ILE)=JB-IOTHBOFF
429
          ILEBI(ILE)=JB
430
        ENDIF
431
      ENDDO
432
      DO JB=IB5,IB6
433
        IF( IONL(JGL,JB) > 0 )THEN
434
          ILE=ILE+1
435
          ILEA (ILE)=IJBXSETA
436
          ILEB (ILE)=JB-IJBXBOFF
437
          ILEBI(ILE)=JB
438
        ENDIF
439
      ENDDO
440
    ELSE
441
      IAOFF=0
442
! INITIALISE WEST LIST, NOT SPLIT LAT
443
      DO JB=JBX-1,1,-1
444
        IF( IONL(JGL,JB) > 0 )THEN
445
          ILW=ILW+1
446
          ILWA (ILW)=MY_REGION_NS
447
          ILWB (ILW)=JB
448
          ILWBI(ILW)=JB
449
        ENDIF
450
      ENDDO
451
      DO JB=NPRGPEW,JBX,-1
452
        IF( IONL(JGL,JB) > 0 )THEN
453
          ILW=ILW+1
454
          ILWA (ILW)=MY_REGION_NS
455
          ILWB (ILW)=JB
456
          ILWBI(ILW)=JB
457
        ENDIF
458
      ENDDO
459
! INITIALISE EAST LIST, NOT SPLIT LAT
460
      DO JB=JBX+1,NPRGPEW
461
        IF( IONL(JGL,JB) > 0 )THEN
462
          ILE=ILE+1
463
          ILEA (ILE)=MY_REGION_NS
464
          ILEB (ILE)=JB
465
          ILEBI(ILE)=JB
466
        ENDIF
467
      ENDDO
468
      DO JB=1,JBX
469
        IF( IONL(JGL,JB) > 0 )THEN
470
          ILE=ILE+1
471
          ILEA (ILE)=MY_REGION_NS
472
          ILEB (ILE)=JB
473
          ILEBI(ILE)=JB
474
        ENDIF
475
      ENDDO
476
    ENDIF
477
    IF( ILW > 2*NPRGPEW .OR. ILE > 2*NPRGPEW )THEN
478
      WRITE(NULOUT,'("SUECRAD: ILW > 2*NPRGPEW .OR. ",&
479
       & "ILE > 2*NPRGPEW, ILW=",I6," ILE=",I6)') ILW,ILE
480
      CALL ABOR1('SUECRADI:ILW/E > 2*NPRGPEW')
481
    ENDIF
482
483
! DETERMINE FOR PARTITION JBX THOSE PARTITIONS THAT IT HAS TO RECEIVE
484
! COURSE POINTS FROM.
485
! DO THIS BY SEARCHING DOWN THE WESTERN LIST OF PARTITIONS FIRST AND THEN
486
! FOR THE EASTERN LIST OF PARTITIONS.
487
! THE SEND AND RECEIVE INFO FOR THIS (MY_REGION_NS,MY_REGION_EW) IS DETERMINED BY
488
! SIMPLY NOTING WHETHER (MY_REGION_NS,MY_REGION_EW) IS A SENDER OR RECEIVER IN THE
489
! ABOVE LIST SEARCH PROCESS.
490
491
    ICNEED=NRCNEEDW(JGL,JBX)
492
493
    DO JBW=1,ILW
494
      IF( ICNEED == 0 ) EXIT
495
496
! DOES THIS PARTITION HAVE ANY COURSE POINTS
497
498
      IF( NRIMAX(JGL,ILWBI(JBW)) > 0 )THEN
499
500
! YES, IT DOES
501
! THEN TEST IF IT HAS ENOUGH TO SATISFY OUR NEED
502
503
        IF( NRIMAX(JGL,ILWBI(JBW)) >= ICNEED )THEN
504
          ICTAKE=ICNEED
505
        ELSE
506
          ICTAKE=NRIMAX(JGL,ILWBI(JBW))
507
        ENDIF
508
        IF( MY_REGION_NS == ILWA(JBW).AND.MY_REGION_EW == ILWB(JBW) )THEN
509
! WE (MY_REGION_NS,MY_REGION_EW) ARE THE SENDER (SENDING EAST COURSE POINTS)
510
          IF( JBX <= NPRGPEW )THEN
511
            IB =JBX
512
            IAO=0
513
          ELSE
514
            IB =JBX-NPRGPEW
515
            IAO=IAOFF
516
          ENDIF
517
          NRCSNDE(JGL,IB,IAO)=ICTAKE
518
          NRCSNDT(IB,IAO)=NRCSNDT(IB,IAO)+ICTAKE
519
        ENDIF
520
        IF( JBX == MY_REGION_EW )THEN
521
! WE (MY_REGION_NS,MY_REGION_EW) ARE THE RECEIVER
522
          IB =ILWB(JBW)
523
          IAO=ILWA(JBW)-MY_REGION_NS
524
          NRCRCVW (JGL,IB,IAO)=ICTAKE
525
          NRCRCVWO(JGL,IB,IAO)=ICNEED-ICTAKE
526
          NRCRCVT (IB,IAO)=NRCRCVT(IB,IAO)+ICTAKE
527
        ENDIF
528
        ICNEED=ICNEED-ICTAKE
529
      ENDIF
530
    ENDDO
531
532
    ICNEED=NRCNEEDE(JGL,JBX)
533
534
    DO JBE=1,ILE
535
      IF( ICNEED == 0 ) EXIT
536
537
! DOES THIS PARTITION HAVE ANY COURSE POINTS
538
539
      IF( NRIMAX(JGL,ILEBI(JBE)) > 0 )THEN
540
541
! YES, IT DOES
542
! THEN TEST IF IT HAS ENOUGH TO SATISFY OUR NEED
543
544
        IF( NRIMAX(JGL,ILEBI(JBE)) >= ICNEED )THEN
545
          ICTAKE=ICNEED
546
        ELSE
547
          ICTAKE=NRIMAX(JGL,ILEBI(JBE))
548
        ENDIF
549
        IF( MY_REGION_NS == ILEA(JBE).AND.MY_REGION_EW == ILEB(JBE) )THEN
550
! WE (MY_REGION_NS,MY_REGION_EW) ARE THE SENDER (SENDING WEST COURSE POINTS)
551
          IF( JBX <= NPRGPEW )THEN
552
            IB =JBX
553
            IAO=0
554
          ELSE
555
            IB =JBX-NPRGPEW
556
            IAO=IAOFF
557
          ENDIF
558
          NRCSNDW(JGL,IB,IAO)=ICTAKE
559
          NRCSNDT(IB,IAO)=NRCSNDT(IB,IAO)+ICTAKE
560
        ENDIF
561
        IF( JBX == MY_REGION_EW )THEN
562
! WE (MY_REGION_NS,MY_REGION_EW) ARE THE RECEIVER
563
          IB =ILEB(JBE)
564
          IAO=ILEA(JBE)-MY_REGION_NS
565
          NRCRCVE (JGL,IB,IAO)=ICTAKE
566
          NRCRCVEO(JGL,IB,IAO)=NRCNEEDW(JGL,JBX)+NRCNEEDE(JGL,JBX)-ICNEED
567
          NRCRCVT (IB,IAO)=NRCRCVT(IB,IAO)+ICTAKE
568
        ENDIF
569
        ICNEED=ICNEED-ICTAKE
570
      ENDIF
571
    ENDDO
572
573
  ENDDO
574
575
! END OF JBX LOOP OVER PARTITIONS
576
577
ENDDO
578
579
! END OF JGL LOOP OVER LATITUDES
580
581
! WRITE OUT SEND/RECEIVE TABLES IF DEBUGGING
582
583
IF( LODBGRADI )THEN
584
  DO JA=-1,1
585
    WRITE(IUNIT,'("SUECRADI: ")')
586
    DO JB=1,NPRGPEW
587
      IF( NRCSNDT(JB,JA) > 0.OR. NRCRCVT(JB,JA) > 0 )THEN
588
        WRITE(IUNIT,'("SUECRADI: SETA=",I4," SETB=",I4,&
589
         & " NRCSNDT=",I6," NRCRCVT=",I6)')&
590
         & JA+MY_REGION_NS,JB,NRCSNDT(JB,JA),NRCRCVT(JB,JA)
591
      ENDIF
592
    ENDDO
593
  ENDDO
594
595
  WRITE(IUNIT,'("SUECRADI: ")')
596
597
  DO JA=-1,1
598
    WRITE(IUNIT,'("SUECRADI: ")')
599
    DO JB=1,NPRGPEW
600
      DO JGL=1,NDGENL
601
        JGLGLO=NFRSTLAT(MY_REGION_NS)+JGL-1
602
        IF( NRCSNDW(JGL,JB,JA) > 0.OR.&
603
           & NRCSNDE(JGL,JB,JA) > 0.OR.&
604
           & NRCRCVW(JGL,JB,JA) > 0.OR.&
605
           & NRCRCVE(JGL,JB,JA) > 0 )THEN
606
          WRITE(IUNIT,'("SUECRADI: JGLGLO=",I4," JGL=",I4,&
607
           & " SETA=",I4," SETB=",I4,&
608
           & " CSNDW=",I6," CSNDE=",I6,&
609
           & " CRCVW=",I6," CRCVE=",I6,&
610
           & " CRCVWO=",I1," CRCVEO=",I1)')&
611
           & JGLGLO,JGL,JA+MY_REGION_NS,JB,&
612
           & NRCSNDW(JGL,JB,JA),NRCSNDE(JGL,JB,JA),&
613
           & NRCRCVW(JGL,JB,JA),NRCRCVE(JGL,JB,JA),&
614
           & NRCRCVWO(JGL,JB,JA),NRCRCVEO(JGL,JB,JA)
615
        ENDIF
616
      ENDDO
617
    ENDDO
618
  ENDDO
619
  IF( .NOT.LODBGRADL )THEN
620
    CLOSE(UNIT=IUNIT)
621
  ENDIF
622
ENDIF
623
624
!     ------------------------------------------------------------------
625
626
IF (LHOOK) CALL DR_HOOK('SUECRADI',1,ZHOOK_HANDLE)
627
END SUBROUTINE SUECRADI