GCC Code Coverage Report


Directory: ./
File: rad/suecradi15.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 20 0.0%
Branches: 0 36 0.0%

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