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 |
---|