ROMS
Loading...
Searching...
No Matches
ad_exchange_2d.F
Go to the documentation of this file.
1#include "cppdefs.h"
3#ifdef ADJOINT
4!
5!git $Id$
6!================================================== Hernan G. Arango ===
7! Copyright (c) 2002-2025 The ROMS Group !
8! Licensed under a MIT/X style license !
9! See License_ROMS.md !
10!=======================================================================
11! !
12! These routines apply periodic boundary conditions to generic !
13! 2D adjoint fields. !
14! !
15! On Input: !
16! !
17! ng Nested grid number. !
18! tile Domain partition. !
19! LBi I-dimension Lower bound. !
20! UBi I-dimension Upper bound. !
21! LBj J-dimension Lower bound. !
22! UBj J-dimension Upper bound. !
23! ad_A 2D adjoint field. !
24! !
25! On Output: !
26! !
27! ad_A Processed 2D adjoint field !
28! !
29! Routines: !
30! !
31! ad_exchange_p2d_tile periodic conditions at PSI-points !
32! ad_exchange_r2d_tile periodic conditions at RHO-points !
33! ad_exchange_u2d_tile periodic conditions at U-points !
34! ad_exchange_v2d_tile periodic conditions at V-points !
35! !
36!=======================================================================
37!
38 implicit none
39!
40 CONTAINS
41!
42!***********************************************************************
43 SUBROUTINE ad_exchange_p2d_tile (ng, tile, &
44 & LBi, UBi, LBj, UBj, &
45 & ad_A)
46!***********************************************************************
47!
48 USE mod_param
49 USE mod_scalars
50!
51! Imported variable declarations.
52!
53 integer, intent(in) :: ng, tile
54 integer, intent(in) :: LBi, UBi, LBj, UBj
55!
56# ifdef ASSUMED_SHAPE
57 real(r8), intent(inout) :: ad_A(LBi:,LBj:)
58# else
59 real(r8), intent(inout) :: ad_A(LBi:UBi,LBj:UBj)
60# endif
61!
62! Local variable declarations.
63!
64 logical :: EW_exchange
65 logical :: NS_exchange
66
67 integer :: Imin, Imax, Jmin, Jmax
68 integer :: i, j
69
70# include "set_bounds.h"
71!
72!-----------------------------------------------------------------------
73! Determine processing switches.
74!-----------------------------------------------------------------------
75!
76 IF (ewperiodic(ng)) THEN
77# ifdef DISTRIBUTE
78 ew_exchange=ntilei(ng).eq.1
79# else
80 ew_exchange=.true.
81# endif
82 ELSE
83 ew_exchange=.false.
84 END IF
85
86 IF (nsperiodic(ng)) THEN
87# ifdef DISTRIBUTE
88 ns_exchange=ntilej(ng).eq.1
89# else
90 ns_exchange=.true.
91# endif
92 ELSE
93 ns_exchange=.false.
94 END IF
95!
96!-----------------------------------------------------------------------
97! Boundary corners.
98!-----------------------------------------------------------------------
99!
100 IF (ewperiodic(ng).and.nsperiodic(ng)) THEN
101 IF (ew_exchange.and.ns_exchange) THEN
102 IF (domain(ng)%NorthEast_Corner(tile)) THEN
103!^ tl_A(-2,-2)=tl_A(Lm(ng)-2,Mm(ng)-2)
104!^
105 ad_a(lm(ng)-2,mm(ng)-2)=ad_a(lm(ng)-2,mm(ng)-2)+ &
106 & ad_a(-2,-2)
107 ad_a(-2,-2)=0.0_r8
108!^ tl_A(-2,-1)=tl_A(Lm(ng)-2,Mm(ng)-1)
109!^
110 ad_a(lm(ng)-2,mm(ng)-1)=ad_a(lm(ng)-2,mm(ng)-1)+ &
111 & ad_a(-2,-1)
112 ad_a(-2,-1)=0.0_r8
113!^ tl_A(-2, 0)=tl_A(Lm(ng)-2,Mm(ng) )
114!^
115 ad_a(lm(ng)-2,mm(ng) )=ad_a(lm(ng)-2,mm(ng) )+ &
116 & ad_a(-2, 0)
117 ad_a(-2, 0)=0.0_r8
118!^ tl_A(-1,-2)=tl_A(Lm(ng)-1,Mm(ng)-2)
119!^
120 ad_a(lm(ng)-1,mm(ng)-2)=ad_a(lm(ng)-1,mm(ng)-2)+ &
121 & ad_a(-1,-2)
122 ad_a(-1,-2)=0.0_r8
123!^ tl_A(-1,-1)=tl_A(Lm(ng)-1,Mm(ng)-1)
124!^
125 ad_a(lm(ng)-1,mm(ng)-1)=ad_a(lm(ng)-1,mm(ng)-1)+ &
126 & ad_a(-1,-1)
127 ad_a(-1,-1)=0.0_r8
128!^ tl_A(-1, 0)=tl_A(Lm(ng)-1,Mm(ng) )
129!^
130 ad_a(lm(ng)-1,mm(ng) )=ad_a(lm(ng)-1,mm(ng) )+ &
131 & ad_a(-1, 0)
132 ad_a(-1, 0)=0.0_r8
133!^ tl_A( 0,-2)=tl_A(Lm(ng) ,Mm(ng)-2)
134!^
135 ad_a(lm(ng) ,mm(ng)-2)=ad_a(lm(ng) ,mm(ng)-2)+ &
136 & ad_a( 0,-2)
137 ad_a( 0,-2)=0.0_r8
138!^ tl_A( 0,-1)=tl_A(Lm(ng) ,Mm(ng)-1)
139!^
140 ad_a(lm(ng) ,mm(ng)-1)=ad_a(lm(ng) ,mm(ng)-1)+ &
141 & ad_a( 0,-1)
142 ad_a( 0,-1)=0.0_r8
143!^ tl_A( 0, 0)=tl_A(Lm(ng) ,Mm(ng) )
144!^
145 ad_a(lm(ng) ,mm(ng) )=ad_a(lm(ng) ,mm(ng) )+ &
146 & ad_a( 0, 0)
147 ad_a( 0, 0)=0.0_r8
148 END IF
149
150 IF (domain(ng)%NorthWest_Corner(tile)) THEN
151!^ tl_A(Lm(ng)+1,-2)=tl_A(1 ,Mm(ng)-2)
152!^
153 ad_a(1 ,mm(ng)-2)=ad_a(1 ,mm(ng)-2)+ &
154 & ad_a(lm(ng)+1,-2)
155 ad_a(lm(ng)+1,-2)=0.0_r8
156!^ tl_A(Lm(ng)+1,-1)=tl_A(1 ,Mm(ng)-1)
157!^
158 ad_a(1 ,mm(ng)-1)=ad_a(1 ,mm(ng)-1)+ &
159 & ad_a(lm(ng)+1,-1)
160 ad_a(lm(ng)+1,-1)=0.0_r8
161!^ tl_A(Lm(ng)+1, 0)=tl_A(1 ,Mm(ng) )
162!^
163 ad_a(1 ,mm(ng) )=ad_a(1 ,mm(ng) )+ &
164 & ad_a(lm(ng)+1, 0)
165 ad_a(lm(ng)+1, 0)=0.0_r8
166!^ tl_A(Lm(ng)+2,-2)=tl_A(2 ,Mm(ng)-2)
167!^
168 ad_a(2 ,mm(ng)-2)=ad_a(2 ,mm(ng)-2)+ &
169 & ad_a(lm(ng)+2,-2)
170 ad_a(lm(ng)+2,-2)=0.0_r8
171!^ tl_A(Lm(ng)+2,-1)=tl_A(2 ,Mm(ng)-1)
172!^
173 ad_a(2 ,mm(ng)-1)=ad_a(2 ,mm(ng)-1)+ &
174 & ad_a(lm(ng)+2,-1)
175 ad_a(lm(ng)+2,-1)=0.0_r8
176!^ tl_A(Lm(ng)+2, 0)=tl_A(2 ,Mm(ng) )
177!^
178 ad_a(2 ,mm(ng) )=ad_a(2 ,mm(ng) )+ &
179 & ad_a(lm(ng)+2, 0)
180 ad_a(lm(ng)+2, 0)=0.0_r8
181 IF (nghostpoints.eq.3) THEN
182!^ tl_A(Lm(ng)+3,-2)=tl_A(3 ,Mm(ng)-2)
183!^
184 ad_a(3 ,mm(ng)-2)=ad_a(3 ,mm(ng)-2)+ &
185 & ad_a(lm(ng)+3,-2)
186 ad_a(lm(ng)+3,-2)=0.0_r8
187!^ tl_A(Lm(ng)+3,-1)=tl_A(3 ,Mm(ng)-1)
188!^
189 ad_a(3 ,mm(ng)-1)=ad_a(3 ,mm(ng)-1)+ &
190 & ad_a(lm(ng)+3,-1)
191 ad_a(lm(ng)+3,-1)=0.0_r8
192!^ tl_A(Lm(ng)+3, 0)=tl_A(3 ,Mm(ng) )
193!^
194 ad_a(3 ,mm(ng) )=ad_a(3 ,mm(ng) )+ &
195 & ad_a(lm(ng)+3, 0)
196 ad_a(lm(ng)+3, 0)=0.0_r8
197 END IF
198 END IF
199
200 IF (domain(ng)%SouthEast_Corner(tile)) THEN
201!^ tl_A(-2,Mm(ng)+1)=tl_A(Lm(ng)-2, 1)
202!^
203 ad_a(lm(ng)-2, 1)=ad_a(lm(ng)-2, 1)+ &
204 & ad_a(-2,mm(ng)+1)
205 ad_a(-2,mm(ng)+1)=0.0_r8
206!^ tl_A(-1,Mm(ng)+1)=tl_A(Lm(ng)-1, 1)
207!^
208 ad_a(lm(ng)-1, 1)=ad_a(lm(ng)-1, 1)+ &
209 & ad_a(-1,mm(ng)+1)
210 ad_a(-1,mm(ng)+1)=0.0_r8
211!^ tl_A( 0,Mm(ng)+1)=tl_A(Lm(ng) , 1)
212!^
213 ad_a(lm(ng) , 1)=ad_a(lm(ng) , 1)+ &
214 & ad_a( 0,mm(ng)+1)
215 ad_a( 0,mm(ng)+1)=0.0_r8
216!^ tl_A(-2,Mm(ng)+2)=tl_A(Lm(ng)-2, 2)
217!^
218 ad_a(lm(ng)-2, 2)=ad_a(lm(ng)-2, 2)+ &
219 & ad_a(-2,mm(ng)+2)
220 ad_a(-2,mm(ng)+2)=0.0_r8
221!^ tl_A(-1,Mm(ng)+2)=tl_A(Lm(ng)-1, 2)
222!^
223 ad_a(lm(ng)-1, 2)=ad_a(lm(ng)-1, 2)+ &
224 & ad_a(-1,mm(ng)+2)
225 ad_a(-1,mm(ng)+2)=0.0_r8
226!^ tl_A( 0,Mm(ng)+2)=tl_A(Lm(ng) , 2)
227!^
228 ad_a(lm(ng) , 2)=ad_a(lm(ng) , 2)+ &
229 & ad_a( 0,mm(ng)+2)
230 ad_a( 0,mm(ng)+2)=0.0_r8
231 IF (nghostpoints.eq.3) THEN
232!^ tl_A(-2,Mm(ng)+3)=tl_A(Lm(ng)-2, 3)
233!^
234 ad_a(lm(ng)-2, 3)=ad_a(lm(ng)-2, 3)+ &
235 & ad_a(-2,mm(ng)+3)
236 ad_a(-2,mm(ng)+3)=0.0_r8
237!^ tl_A(-1,Mm(ng)+3)=tl_A(Lm(ng)-1, 3)
238!^
239 ad_a(lm(ng)-1, 3)=ad_a(lm(ng)-1, 3)+ &
240 & ad_a(-1,mm(ng)+3)
241 ad_a(-1,mm(ng)+3)=0.0_r8
242!^ tl_A( 0,Mm(ng)+3)=tl_A(Lm(ng) , 3)
243!^
244 ad_a(lm(ng) , 3)=ad_a(lm(ng) , 3)+ &
245 & ad_a( 0,mm(ng)+3)
246 ad_a( 0,mm(ng)+3)=0.0_r8
247 END IF
248 END IF
249
250 IF (domain(ng)%SouthWest_Corner(tile)) THEN
251!^ tl_A(Lm(ng)+1,Mm(ng)+1)=tl_A( 1, 1)
252!^
253 ad_a( 1, 1)=ad_a( 1, 1)+ &
254 & ad_a(lm(ng)+1,mm(ng)+1)
255 ad_a(lm(ng)+1,mm(ng)+1)=0.0_r8
256!^ tl_A(Lm(ng)+1,Mm(ng)+2)=tl_A( 1, 2)
257!^
258 ad_a( 1, 2)=ad_a( 1, 2)+ &
259 & ad_a(lm(ng)+1,mm(ng)+2)
260 ad_a(lm(ng)+1,mm(ng)+2)=0.0_r8
261!^ tl_A(Lm(ng)+2,Mm(ng)+1)=tl_A( 2, 1)
262!^
263 ad_a( 2, 1)=ad_a( 2, 1)+ &
264 & ad_a(lm(ng)+2,mm(ng)+1)
265 ad_a(lm(ng)+2,mm(ng)+1)=0.0_r8
266!^ tl_A(Lm(ng)+2,Mm(ng)+2)=tl_A( 2, 2)
267!^
268 ad_a( 2, 2)=ad_a( 2, 2)+ &
269 & ad_a(lm(ng)+2,mm(ng)+2)
270 ad_a(lm(ng)+2,mm(ng)+2)=0.0_r8
271 IF (nghostpoints.eq.3) THEN
272!^ tl_A(Lm(ng)+1,Mm(ng)+3)=tl_A( 1, 3)
273!^
274 ad_a( 1, 3)=ad_a( 1, 3)+ &
275 & ad_a(lm(ng)+1,mm(ng)+3)
276 ad_a(lm(ng)+1,mm(ng)+3)=0.0_r8
277
278!^ tl_A(Lm(ng)+2,Mm(ng)+3)=tl_A( 2, 3)
279!^
280 ad_a( 2, 3)=ad_a( 2, 3)+ &
281 & ad_a(lm(ng)+2,mm(ng)+3)
282 ad_a(lm(ng)+2,mm(ng)+3)=0.0_r8
283!^ tl_A(Lm(ng)+3,Mm(ng)+1)=tl_A( 3, 1)
284!^
285 ad_a( 3, 1)=ad_a( 3, 1)+ &
286 & ad_a(lm(ng)+3,mm(ng)+1)
287 ad_a(lm(ng)+3,mm(ng)+1)=0.0_r8
288!^ tl_A(Lm(ng)+3,Mm(ng)+2)=tl_A( 3, 2)
289!^
290 ad_a( 3, 2)=ad_a( 3, 2)+ &
291 & ad_a(lm(ng)+3,mm(ng)+2)
292 ad_a(lm(ng)+3,mm(ng)+2)=0.0_r8
293!^ tl_A(Lm(ng)+3,Mm(ng)+3)=tl_A( 3, 3)
294!^
295 ad_a( 3, 3)=ad_a( 3, 3)+ &
296 & ad_a(lm(ng)+3,mm(ng)+3)
297 ad_a(lm(ng)+3,mm(ng)+3)=0.0_r8
298 END IF
299 END IF
300 END IF
301 END IF
302!
303!-----------------------------------------------------------------------
304! North-South periodic boundary conditions.
305!-----------------------------------------------------------------------
306!
307 IF (nsperiodic(ng)) THEN
308 IF (ewperiodic(ng)) THEN
309 imin=istr
310 imax=iend
311 ELSE
312 imin=istr
313 imax=iendr
314 END IF
315!
316 IF (ns_exchange) THEN
317 IF (domain(ng)%Northern_Edge(tile)) THEN
318 DO i=imin,imax
319!^ tl_A(i,-2)=tl_A(i,Mm(ng)-2)
320!^
321 ad_a(i,mm(ng)-2)=ad_a(i,mm(ng)-2)+ &
322 & ad_a(i,-2)
323 ad_a(i,-2)=0.0_r8
324!^ tl_A(i,-1)=tl_A(i,Mm(ng)-1)
325!^
326 ad_a(i,mm(ng)-1)=ad_a(i,mm(ng)-1)+ &
327 & ad_a(i,-1)
328 ad_a(i,-1)=0.0_r8
329!^ tl_A(i, 0)=tl_A(i,Mm(ng) )
330!^
331 ad_a(i,mm(ng) )=ad_a(i,mm(ng) )+ &
332 & ad_a(i, 0)
333 ad_a(i, 0)=0.0_r8
334 END DO
335 END IF
336 IF (domain(ng)%Southern_Edge(tile)) THEN
337 DO i=imin,imax
338!^ tl_A(i,Mm(ng)+1)=tl_A(i,1)
339!^
340 ad_a(i,1)=ad_a(i,1)+ &
341 & ad_a(i,mm(ng)+1)
342 ad_a(i,mm(ng)+1)=0.0_r8
343!^ tl_A(i,Mm(ng)+2)=tl_A(i,2)
344!^
345 ad_a(i,2)=ad_a(i,2)+ &
346 & ad_a(i,mm(ng)+2)
347 ad_a(i,mm(ng)+2)=0.0_r8
348 END DO
349 IF (nghostpoints.eq.3) THEN
350 DO i=imin,imax
351!^ tl_A(i,Mm(ng)+3)=tl_A(i,3)
352!^
353 ad_a(i,3)=ad_a(i,3)+ &
354 & ad_a(i,mm(ng)+3)
355 ad_a(i,mm(ng)+3)=0.0_r8
356 END DO
357 END IF
358 END IF
359 END IF
360 END IF
361!
362!-----------------------------------------------------------------------
363! East-West periodic boundary conditions.
364!-----------------------------------------------------------------------
365!
366 IF (ewperiodic(ng)) THEN
367 IF (nsperiodic(ng)) THEN
368 jmin=jstr
369 jmax=jend
370 ELSE
371 jmin=jstr
372 jmax=jendr
373 END IF
374!
375 IF (ew_exchange) THEN
376 IF (domain(ng)%Eastern_Edge(tile)) THEN
377 DO j=jmin,jmax
378!^ tl_A(-2,j)=tl_A(Lm(ng)-2,j)
379!^
380 ad_a(lm(ng)-2,j)=ad_a(lm(ng)-2,j)+ &
381 & ad_a(-2,j)
382 ad_a(-2,j)=0.0_r8
383!^ tl_A(-1,j)=tl_A(Lm(ng)-1,j)
384!^
385 ad_a(lm(ng)-1,j)=ad_a(lm(ng)-1,j)+ &
386 & ad_a(-1,j)
387 ad_a(-1,j)=0.0_r8
388!^ tl_A( 0,j)=tl_A(Lm(ng) ,j)
389!^
390 ad_a(lm(ng) ,j)=ad_a(lm(ng) ,j)+ &
391 & ad_a( 0,j)
392 ad_a( 0,j)=0.0_r8
393 END DO
394 END IF
395
396 IF (domain(ng)%Western_Edge(tile)) THEN
397 DO j=jmin,jmax
398!^ tl_A(Lm(ng)+1,j)=tl_A(1,j)
399!^
400 ad_a(1,j)=ad_a(1,j)+ &
401 & ad_a(lm(ng)+1,j)
402 ad_a(lm(ng)+1,j)=0.0_r8
403!^ tl_A(Lm(ng)+2,j)=tl_A(2,j)
404!^
405 ad_a(2,j)=ad_a(2,j)+ &
406 & ad_a(lm(ng)+2,j)
407 ad_a(lm(ng)+2,j)=0.0_r8
408 END DO
409 IF (nghostpoints.eq.3) THEN
410 DO j=jmin,jmax
411
412!^ tl_A(Lm(ng)+3,j)=tl_A(3,j)
413!^
414 ad_a(3,j)=ad_a(3,j)+ &
415 & ad_a(lm(ng)+3,j)
416 ad_a(lm(ng)+3,j)=0.0_r8
417 END DO
418 END IF
419 END IF
420 END IF
421 END IF
422
423 RETURN
424 END SUBROUTINE ad_exchange_p2d_tile
425
426!
427!***********************************************************************
428 SUBROUTINE ad_exchange_r2d_tile (ng, tile, &
429 & LBi, UBi, LBj, UBj, &
430 & ad_A)
431!***********************************************************************
432!
433 USE mod_param
434 USE mod_scalars
435!
436! Imported variable declarations.
437!
438 integer, intent(in) :: ng, tile
439 integer, intent(in) :: LBi, UBi, LBj, UBj
440!
441# ifdef ASSUMED_SHAPE
442 real(r8), intent(inout) :: ad_A(LBi:,LBj:)
443# else
444 real(r8), intent(inout) :: ad_A(LBi:UBi,LBj:UBj)
445# endif
446!
447! Local variable declarations.
448!
449 logical :: EW_exchange
450 logical :: NS_exchange
451
452 integer :: Imin, Imax, Jmin, Jmax
453 integer :: i, j
454
455# include "set_bounds.h"
456!
457!-----------------------------------------------------------------------
458! Determine processing switches.
459!-----------------------------------------------------------------------
460!
461 IF (ewperiodic(ng)) THEN
462# ifdef DISTRIBUTE
463 ew_exchange=ntilei(ng).eq.1
464# else
465 ew_exchange=.true.
466# endif
467 ELSE
468 ew_exchange=.false.
469 END IF
470
471 IF (nsperiodic(ng)) THEN
472# ifdef DISTRIBUTE
473 ns_exchange=ntilej(ng).eq.1
474# else
475 ns_exchange=.true.
476# endif
477 ELSE
478 ns_exchange=.false.
479 END IF
480!
481!-----------------------------------------------------------------------
482! Boundary corners.
483!-----------------------------------------------------------------------
484!
485 IF (ewperiodic(ng).and.nsperiodic(ng)) THEN
486 IF (ew_exchange.and.ns_exchange) THEN
487 IF (domain(ng)%NorthEast_Corner(tile)) THEN
488!^ tl_A(-2,-2)=tl_A(Lm(ng)-2,Mm(ng)-2)
489!^
490 ad_a(lm(ng)-2,mm(ng)-2)=ad_a(lm(ng)-2,mm(ng)-2)+ &
491 & ad_a(-2,-2)
492 ad_a(-2,-2)=0.0_r8
493!^ tl_A(-2,-1)=tl_A(Lm(ng)-2,Mm(ng)-1)
494!^
495 ad_a(lm(ng)-2,mm(ng)-1)=ad_a(lm(ng)-2,mm(ng)-1)+ &
496 & ad_a(-2,-1)
497 ad_a(-2,-1)=0.0_r8
498!^ tl_A(-2, 0)=tl_A(Lm(ng)-2,Mm(ng) )
499!^
500 ad_a(lm(ng)-2,mm(ng) )=ad_a(lm(ng)-2,mm(ng) )+ &
501 & ad_a(-2, 0)
502 ad_a(-2, 0)=0.0_r8
503!^ tl_A(-1,-2)=tl_A(Lm(ng)-1,Mm(ng)-2)
504!^
505 ad_a(lm(ng)-1,mm(ng)-2)=ad_a(lm(ng)-1,mm(ng)-2)+ &
506 & ad_a(-1,-2)
507 ad_a(-1,-2)=0.0_r8
508!^ tl_A(-1,-1)=tl_A(Lm(ng)-1,Mm(ng)-1)
509!^
510 ad_a(lm(ng)-1,mm(ng)-1)=ad_a(lm(ng)-1,mm(ng)-1)+ &
511 & ad_a(-1,-1)
512 ad_a(-1,-1)=0.0_r8
513!^ tl_A(-1, 0)=tl_A(Lm(ng)-1,Mm(ng) )
514!^
515 ad_a(lm(ng)-1,mm(ng) )=ad_a(lm(ng)-1,mm(ng) )+ &
516 & ad_a(-1, 0)
517 ad_a(-1, 0)=0.0_r8
518!^ tl_A( 0,-2)=tl_A(Lm(ng) ,Mm(ng)-2)
519!^
520 ad_a(lm(ng) ,mm(ng)-2)=ad_a(lm(ng) ,mm(ng)-2)+ &
521 & ad_a( 0,-2)
522 ad_a( 0,-2)=0.0_r8
523!^ tl_A( 0,-1)=tl_A(Lm(ng) ,Mm(ng)-1)
524!^
525 ad_a(lm(ng) ,mm(ng)-1)=ad_a(lm(ng) ,mm(ng)-1)+ &
526 & ad_a( 0,-1)
527 ad_a( 0,-1)=0.0_r8
528!^ tl_A( 0, 0)=tl_A(Lm(ng) ,Mm(ng) )
529!^
530 ad_a(lm(ng) ,mm(ng) )=ad_a(lm(ng) ,mm(ng) )+ &
531 & ad_a( 0, 0)
532 ad_a( 0, 0)=0.0_r8
533 END IF
534
535 IF (domain(ng)%NorthWest_Corner(tile)) THEN
536!^ tl_A(Lm(ng)+1,-2)=tl_A( 1,Mm(ng)-2)
537!^
538 ad_a( 1,mm(ng)-2)=ad_a( 1,mm(ng)-2)+ &
539 & ad_a(lm(ng)+1,-2)
540 ad_a(lm(ng)+1,-2)=0.0_r8
541!^ tl_A(Lm(ng)+1,-1)=tl_A( 1,Mm(ng)-1)
542!^
543 ad_a( 1,mm(ng)-1)=ad_a( 1,mm(ng)-1)+ &
544 & ad_a(lm(ng)+1,-1)
545 ad_a(lm(ng)+1,-1)=0.0_r8
546!^ tl_A(Lm(ng)+1, 0)=tl_A( 1,Mm(ng) )
547!^
548 ad_a( 1,mm(ng) )=ad_a( 1,mm(ng) )+ &
549 & ad_a(lm(ng)+1, 0)
550 ad_a(lm(ng)+1, 0)=0.0_r8
551!^ tl_A(Lm(ng)+2,-2)=tl_A( 2,Mm(ng)-2)
552!^
553 ad_a( 2,mm(ng)-2)=ad_a( 2,mm(ng)-2)+ &
554 & ad_a(lm(ng)+2,-2)
555 ad_a(lm(ng)+2,-2)=0.0_r8
556!^ tl_A(Lm(ng)+2,-1)=tl_A( 2,Mm(ng)-1)
557!^
558 ad_a( 2,mm(ng)-1)=ad_a( 2,mm(ng)-1)+ &
559 & ad_a(lm(ng)+2,-1)
560 ad_a(lm(ng)+2,-1)=0.0_r8
561!^ tl_A(Lm(ng)+2, 0)=tl_A( 2,Mm(ng) )
562!^
563 ad_a( 2,mm(ng) )=ad_a( 2,mm(ng) )+ &
564 & ad_a(lm(ng)+2, 0)
565 ad_a(lm(ng)+2, 0)=0.0_r8
566 IF (nghostpoints.eq.3) THEN
567!^ tl_A(Lm(ng)+3,-2)=tl_A(3 ,Mm(ng)-2)
568!^
569 ad_a(3 ,mm(ng)-2)=ad_a(3 ,mm(ng)-2)+ &
570 & ad_a(lm(ng)+3,-2)
571 ad_a(lm(ng)+3,-2)=0.0_r8
572!^ tl_A(Lm(ng)+3,-1)=tl_A(3 ,Mm(ng)-1)
573!^
574 ad_a(3 ,mm(ng)-1)=ad_a(3 ,mm(ng)-1)+ &
575 & ad_a(lm(ng)+3,-1)
576 ad_a(lm(ng)+3,-1)=0.0_r8
577!^ tl_A(Lm(ng)+3, 0)=tl_A(3 ,Mm(ng) )
578!^
579 ad_a(3 ,mm(ng) )=ad_a(3 ,mm(ng) )+ &
580 & ad_a(lm(ng)+3, 0)
581 ad_a(lm(ng)+3, 0)=0.0_r8
582 END IF
583 END IF
584
585 IF (domain(ng)%SouthEast_Corner(tile)) THEN
586!^ tl_A(-2,Mm(ng)+1)=tl_A(Lm(ng)-2, 1)
587!^
588 ad_a(lm(ng)-2, 1)=ad_a(lm(ng)-2, 1)+ &
589 & ad_a(-2,mm(ng)+1)
590 ad_a(-2,mm(ng)+1)=0.0_r8
591!^ tl_A(-1,Mm(ng)+1)=tl_A(Lm(ng)-1, 1)
592!^
593 ad_a(lm(ng)-1, 1)=ad_a(lm(ng)-1, 1)+ &
594 & ad_a(-1,mm(ng)+1)
595 ad_a(-1,mm(ng)+1)=0.0_r8
596!^ tl_A( 0,Mm(ng)+1)=tl_A(Lm(ng) , 1)
597!^
598 ad_a(lm(ng) , 1)=ad_a(lm(ng) , 1)+ &
599 & ad_a( 0,mm(ng)+1)
600 ad_a( 0,mm(ng)+1)=0.0_r8
601!^ tl_A(-2,Mm(ng)+2)=tl_A(Lm(ng)-2, 2)
602!^
603 ad_a(lm(ng)-2, 2)=ad_a(lm(ng)-2, 2)+ &
604 & ad_a(-2,mm(ng)+2)
605 ad_a(-2,mm(ng)+2)=0.0_r8
606!^ tl_A(-1,Mm(ng)+2)=tl_A(Lm(ng)-1, 2)
607!^
608 ad_a(lm(ng)-1, 2)=ad_a(lm(ng)-1, 2)+ &
609 & ad_a(-1,mm(ng)+2)
610 ad_a(-1,mm(ng)+2)=0.0_r8
611!^ tl_A( 0,Mm(ng)+2)=tl_A(Lm(ng) , 2)
612!^
613 ad_a(lm(ng) , 2)=ad_a(lm(ng) , 2)+ &
614 & ad_a( 0,mm(ng)+2)
615 ad_a( 0,mm(ng)+2)=0.0_r8
616 IF (nghostpoints.eq.3) THEN
617!^ tl_A(-2,Mm(ng)+3)=tl_A(Lm(ng)-2, 3)
618!^
619 ad_a(lm(ng)-2, 3)=ad_a(lm(ng)-2, 3)+ &
620 & ad_a(-2,mm(ng)+3)
621 ad_a(-2,mm(ng)+3)=0.0_r8
622!^ tl_A(-1,Mm(ng)+3)=tl_A(Lm(ng)-1, 3)
623!^
624 ad_a(lm(ng)-1, 3)=ad_a(lm(ng)-1, 3)+ &
625 & ad_a(-1,mm(ng)+3)
626 ad_a(-1,mm(ng)+3)=0.0_r8
627!^ tl_A( 0,Mm(ng)+3)=tl_A(Lm(ng) , 3)
628!^
629 ad_a(lm(ng) , 3)=ad_a(lm(ng) , 3)+ &
630 & ad_a( 0,mm(ng)+3)
631 ad_a( 0,mm(ng)+3)=0.0_r8
632 END IF
633 END IF
634
635 IF (domain(ng)%SouthWest_Corner(tile)) THEN
636!^ tl_A(Lm(ng)+1,Mm(ng)+1)=tl_A(1 ,1 )
637!^
638 ad_a(1 ,1 )=ad_a(1 ,1 )+ &
639 & ad_a(lm(ng)+1,mm(ng)+1)
640 ad_a(lm(ng)+1,mm(ng)+1)=0.0_r8
641!^ tl_A(Lm(ng)+1,Mm(ng)+2)=tl_A(1 ,2)
642!^
643 ad_a(1 ,2)=ad_a(1 ,2)+ &
644 & ad_a(lm(ng)+1,mm(ng)+2)
645 ad_a(lm(ng)+1,mm(ng)+2)=0.0_r8
646!^ tl_A(Lm(ng)+2,Mm(ng)+1)=tl_A(2,1 )
647!^
648 ad_a(2,1 )=ad_a(2,1 )+ &
649 & ad_a(lm(ng)+2,mm(ng)+1)
650 ad_a(lm(ng)+2,mm(ng)+1)=0.0_r8
651!^ A(Lm(ng)+2,Mm(ng)+2)=A(2,2)
652!^
653 ad_a(2,2)=ad_a(2,2)+ &
654 & ad_a(lm(ng)+2,mm(ng)+2)
655 ad_a(lm(ng)+2,mm(ng)+2)=0.0_r8
656 IF (nghostpoints.eq.3) THEN
657!^ tl_A(Lm(ng)+1,Mm(ng)+3)=tl_A( 1, 3)
658!^
659 ad_a( 1, 3)=ad_a( 1, 3)+ &
660 & ad_a(lm(ng)+1,mm(ng)+3)
661 ad_a(lm(ng)+1,mm(ng)+3)=0.0_r8
662
663!^ tl_A(Lm(ng)+2,Mm(ng)+3)=tl_A( 2, 3)
664!^
665 ad_a( 2, 3)=ad_a( 2, 3)+ &
666 & ad_a(lm(ng)+2,mm(ng)+3)
667 ad_a(lm(ng)+2,mm(ng)+3)=0.0_r8
668!^ tl_A(Lm(ng)+3,Mm(ng)+1)=tl_A( 3, 1)
669!^
670 ad_a( 3, 1)=ad_a( 3, 1)+ &
671 & ad_a(lm(ng)+3,mm(ng)+1)
672 ad_a(lm(ng)+3,mm(ng)+1)=0.0_r8
673!^ tl_A(Lm(ng)+3,Mm(ng)+2)=tl_A( 3, 2)
674!^
675 ad_a( 3, 2)=ad_a( 3, 2)+ &
676 & ad_a(lm(ng)+3,mm(ng)+2)
677 ad_a(lm(ng)+3,mm(ng)+2)=0.0_r8
678!^ tl_A(Lm(ng)+3,Mm(ng)+3)=tl_A( 3, 3)
679!^
680 ad_a( 3, 3)=ad_a( 3, 3)+ &
681 & ad_a(lm(ng)+3,mm(ng)+3)
682 ad_a(lm(ng)+3,mm(ng)+3)=0.0_r8
683 END IF
684 END IF
685 END IF
686 END IF
687!
688!-----------------------------------------------------------------------
689! North-South periodic boundary conditions.
690!-----------------------------------------------------------------------
691!
692 IF (nsperiodic(ng)) THEN
693 IF (ewperiodic(ng)) THEN
694 imin=istr
695 imax=iend
696 ELSE
697 imin=istrr
698 imax=iendr
699 END IF
700!
701 IF (ns_exchange) THEN
702 IF (domain(ng)%Northern_Edge(tile)) THEN
703 DO i=imin,imax
704!^ tl_A(i,-2)=tl_A(i,Mm(ng)-2)
705!^
706 ad_a(i,mm(ng)-2)=ad_a(i,mm(ng)-2)+ &
707 & ad_a(i,-2)
708 ad_a(i,-2)=0.0_r8
709!^ tl_A(i,-1)=tl_A(i,Mm(ng)-1)
710!^
711 ad_a(i,mm(ng)-1)=ad_a(i,mm(ng)-1)+ &
712 & ad_a(i,-1)
713 ad_a(i,-1)=0.0_r8
714!^ tl_A(i, 0)=tl_A(i,Mm(ng) )
715!^
716 ad_a(i,mm(ng) )=ad_a(i,mm(ng) )+ &
717 & ad_a(i, 0)
718 ad_a(i, 0)=0.0_r8
719 END DO
720 END IF
721
722 IF (domain(ng)%Southern_Edge(tile)) THEN
723 DO i=imin,imax
724!^ tl_A(i,Mm(ng)+1)=tl_A(i,1)
725!^
726 ad_a(i,1)=ad_a(i,1)+ &
727 & ad_a(i,mm(ng)+1)
728 ad_a(i,mm(ng)+1)=0.0_r8
729!^ tl_A(i,Mm(ng)+2)=tl_A(i,2)
730!^
731 ad_a(i,2)=ad_a(i,2)+ &
732 & ad_a(i,mm(ng)+2)
733 ad_a(i,mm(ng)+2)=0.0_r8
734 END DO
735 IF (nghostpoints.eq.3) THEN
736 DO i=imin,imax
737!^ tl_A(i,Mm(ng)+3)=tl_A(i,3)
738!^
739 ad_a(i,3)=ad_a(i,3)+ &
740 & ad_a(i,mm(ng)+3)
741 ad_a(i,mm(ng)+3)=0.0_r8
742 END DO
743 END IF
744 END IF
745 END IF
746 END IF
747!
748!-----------------------------------------------------------------------
749! East-West periodic boundary conditions.
750!-----------------------------------------------------------------------
751!
752 IF (ewperiodic(ng)) THEN
753 IF (nsperiodic(ng)) THEN
754 jmin=jstr
755 jmax=jend
756 ELSE
757 jmin=jstrr
758 jmax=jendr
759 END IF
760!
761 IF (ew_exchange) THEN
762 IF (domain(ng)%Eastern_Edge(tile)) THEN
763 DO j=jmin,jmax
764!^ tl_A(-2,j)=tl_A(Lm(ng)-2,j)
765!^
766 ad_a(lm(ng)-2,j)=ad_a(lm(ng)-2,j)+ &
767 & ad_a(-2,j)
768 ad_a(-2,j)=0.0_r8
769!^ tl_A(-1,j)=tl_A(Lm(ng)-1,j)
770!^
771 ad_a(lm(ng)-1,j)=ad_a(lm(ng)-1,j)+ &
772 & ad_a(-1,j)
773 ad_a(-1,j)=0.0_r8
774!^ tl_A( 0,j)=tl_A(Lm(ng) ,j)
775!^
776 ad_a(lm(ng) ,j)=ad_a(lm(ng) ,j)+ &
777 & ad_a( 0,j)
778 ad_a( 0,j)=0.0_r8
779 END DO
780 END IF
781
782 IF (domain(ng)%Western_Edge(tile)) THEN
783 DO j=jmin,jmax
784!^ tl_A(Lm(ng)+1,j)=tl_A(1,j)
785!^
786 ad_a(1,j)=ad_a(1,j)+ &
787 & ad_a(lm(ng)+1,j)
788 ad_a(lm(ng)+1,j)=0.0_r8
789!^ tl_A(Lm(ng)+2,j)=tl_A(2,j)
790!^
791 ad_a(2,j)=ad_a(2,j)+ &
792 & ad_a(lm(ng)+2,j)
793 ad_a(lm(ng)+2,j)=0.0_r8
794 END DO
795 IF (nghostpoints.eq.3) THEN
796 DO j=jmin,jmax
797!^ tl_A(Lm(ng)+3,j)=tl_A(3,j)
798!^
799 ad_a(3,j)=ad_a(3,j)+ &
800 & ad_a(lm(ng)+3,j)
801 ad_a(lm(ng)+3,j)=0.0_r8
802 END DO
803 END IF
804 END IF
805 END IF
806 END IF
807
808 RETURN
809 END SUBROUTINE ad_exchange_r2d_tile
810
811!
812!***********************************************************************
813 SUBROUTINE ad_exchange_u2d_tile (ng, tile, &
814 & LBi, UBi, LBj, UBj, &
815 & ad_A)
816!***********************************************************************
817!
818 USE mod_param
819 USE mod_scalars
820!
821! Imported variable declarations.
822!
823 integer, intent(in) :: ng, tile
824 integer, intent(in) :: LBi, UBi, LBj, UBj
825!
826# ifdef ASSUMED_SHAPE
827 real(r8), intent(inout) :: ad_A(LBi:,LBj:)
828# else
829 real(r8), intent(inout) :: ad_A(LBi:UBi,LBj:UBj)
830# endif
831!
832! Local variable declarations.
833!
834 logical :: EW_exchange
835 logical :: NS_exchange
836
837 integer :: Imin, Imax, Jmin, Jmax
838 integer :: i, j
839
840# include "set_bounds.h"
841!
842!-----------------------------------------------------------------------
843! Determine processing switches.
844!-----------------------------------------------------------------------
845!
846 IF (ewperiodic(ng)) THEN
847# ifdef DISTRIBUTE
848 ew_exchange=ntilei(ng).eq.1
849# else
850 ew_exchange=.true.
851# endif
852 ELSE
853 ew_exchange=.false.
854 END IF
855
856 IF (nsperiodic(ng)) THEN
857# ifdef DISTRIBUTE
858 ns_exchange=ntilej(ng).eq.1
859# else
860 ns_exchange=.true.
861# endif
862 ELSE
863 ns_exchange=.false.
864 END IF
865!
866!-----------------------------------------------------------------------
867! Boundary corners.
868!-----------------------------------------------------------------------
869!
870 IF (ewperiodic(ng).and.nsperiodic(ng)) THEN
871 IF (ew_exchange.and.ns_exchange) THEN
872 IF (domain(ng)%NorthEast_Corner(tile)) THEN
873!^ tl_A(-2,-2)=tl_A(Lm(ng)-2,Mm(ng)-2)
874!^
875 ad_a(lm(ng)-2,mm(ng)-2)=ad_a(lm(ng)-2,mm(ng)-2)+ &
876 & ad_a(-2,-2)
877 ad_a(-2,-2)=0.0_r8
878!^ tl_A(-2,-1)=tl_A(Lm(ng)-2,Mm(ng)-1)
879!^
880 ad_a(lm(ng)-2,mm(ng)-1)=ad_a(lm(ng)-2,mm(ng)-1)+ &
881 & ad_a(-2,-1)
882 ad_a(-2,-1)=0.0_r8
883!^ tl_A(-2, 0)=tl_A(Lm(ng)-2,Mm(ng) )
884!^
885 ad_a(lm(ng)-2,mm(ng) )=ad_a(lm(ng)-2,mm(ng) )+ &
886 & ad_a(-2, 0)
887 ad_a(-2, 0)=0.0_r8
888!^ tl_A(-1,-2)=tl_A(Lm(ng)-1,Mm(ng)-2)
889!^
890 ad_a(lm(ng)-1,mm(ng)-2)=ad_a(lm(ng)-1,mm(ng)-2)+ &
891 & ad_a(-1,-2)
892 ad_a(-1,-2)=0.0_r8
893!^ tl_A(-1,-1)=tl_A(Lm(ng)-1,Mm(ng)-1)
894!^
895 ad_a(lm(ng)-1,mm(ng)-1)=ad_a(lm(ng)-1,mm(ng)-1)+ &
896 & ad_a(-1,-1)
897 ad_a(-1,-1)=0.0_r8
898!^ tl_A(-1, 0)=tl_A(Lm(ng)-1,Mm(ng) )
899!^
900 ad_a(lm(ng)-1,mm(ng) )=ad_a(lm(ng)-1,mm(ng) )+ &
901 & ad_a(-1, 0)
902 ad_a(-1, 0)=0.0_r8
903!^ tl_A( 0,-2)=tl_A(Lm(ng) ,Mm(ng)-2)
904!^
905 ad_a(lm(ng) ,mm(ng)-2)=ad_a(lm(ng) ,mm(ng)-2)+ &
906 & ad_a( 0,-2)
907 ad_a( 0,-2)=0.0_r8
908!^ tl_A( 0,-1)=tl_A(Lm(ng) ,Mm(ng)-1)
909!^
910 ad_a(lm(ng) ,mm(ng)-1)=ad_a(lm(ng) ,mm(ng)-1)+ &
911 & ad_a( 0,-1)
912 ad_a( 0,-1)=0.0_r8
913!^ tl_A( 0, 0)=tl_A(Lm(ng) ,Mm(ng) )
914!^
915 ad_a(lm(ng) ,mm(ng) )=ad_a(lm(ng) ,mm(ng) )+ &
916 & ad_a( 0, 0)
917 ad_a( 0, 0)=0.0_r8
918 END IF
919
920 IF (domain(ng)%NorthWest_Corner(tile)) THEN
921!^ tl_A(Lm(ng)+1,-2)=tl_A( 1,Mm(ng)-2)
922!^
923 ad_a( 1,mm(ng)-2)=ad_a( 1,mm(ng)-2)+ &
924 & ad_a(lm(ng)+1,-2)
925 ad_a(lm(ng)+1,-2)=0.0_r8
926!^ tl_A(Lm(ng)+1,-1)=tl_A( 1,Mm(ng)-1)
927!^
928 ad_a( 1,mm(ng)-1)=ad_a( 1,mm(ng)-1)+ &
929 & ad_a(lm(ng)+1,-1)
930 ad_a(lm(ng)+1,-1)=0.0_r8
931!^ tl_A(Lm(ng)+1, 0)=tl_A( 1,Mm(ng) )
932!^
933 ad_a( 1,mm(ng) )=ad_a( 1,mm(ng) )+ &
934 & ad_a(lm(ng)+1, 0)
935 ad_a(lm(ng)+1, 0)=0.0_r8
936!^ tl_A(Lm(ng)+2,-2)=tl_A( 2,Mm(ng)-2)
937!^
938 ad_a( 2,mm(ng)-2)=ad_a( 2,mm(ng)-2)+ &
939 & ad_a(lm(ng)+2,-2)
940 ad_a(lm(ng)+2,-2)=0.0_r8
941!^ tl_A(Lm(ng)+2,-1)=tl_A( 2,Mm(ng)-1)
942!^
943 ad_a( 2,mm(ng)-1)=ad_a( 2,mm(ng)-1)+ &
944 & ad_a(lm(ng)+2,-1)
945 ad_a(lm(ng)+2,-1)=0.0_r8
946!^ tl_A(Lm(ng)+2, 0)=tl_A( 2,Mm(ng) )
947!^
948 ad_a( 2,mm(ng) )=ad_a( 2,mm(ng) )+ &
949 & ad_a(lm(ng)+2, 0)
950 ad_a(lm(ng)+2, 0)=0.0_r8
951 IF (nghostpoints.eq.3) THEN
952!^ tl_A(Lm(ng)+3,-2)=tl_A(3 ,Mm(ng)-2)
953!^
954 ad_a(3 ,mm(ng)-2)=ad_a(3 ,mm(ng)-2)+ &
955 & ad_a(lm(ng)+3,-2)
956 ad_a(lm(ng)+3,-2)=0.0_r8
957!^ tl_A(Lm(ng)+3,-1)=tl_A(3 ,Mm(ng)-1)
958!^
959 ad_a(3 ,mm(ng)-1)=ad_a(3 ,mm(ng)-1)+ &
960 & ad_a(lm(ng)+3,-1)
961 ad_a(lm(ng)+3,-1)=0.0_r8
962!^ tl_A(Lm(ng)+3, 0)=tl_A(3 ,Mm(ng) )
963!^
964 ad_a(3 ,mm(ng) )=ad_a(3 ,mm(ng) )+ &
965 & ad_a(lm(ng)+3, 0)
966 ad_a(lm(ng)+3, 0)=0.0_r8
967 END IF
968 END IF
969
970 IF (domain(ng)%SouthEast_Corner(tile)) THEN
971!^ tl_A(-2,Mm(ng)+1)=tl_A(Lm(ng)-2, 1)
972!^
973 ad_a(lm(ng)-2, 1)=ad_a(lm(ng)-2, 1)+ &
974 & ad_a(-2,mm(ng)+1)
975 ad_a(-2,mm(ng)+1)=0.0_r8
976!^ tl_A(-1,Mm(ng)+1)=tl_A(Lm(ng)-1, 1)
977!^
978 ad_a(lm(ng)-1, 1)=ad_a(lm(ng)-1, 1)+ &
979 & ad_a(-1,mm(ng)+1)
980 ad_a(-1,mm(ng)+1)=0.0_r8
981!^ tl_A( 0,Mm(ng)+1)=tl_A(Lm(ng) , 1)
982!^
983 ad_a(lm(ng) , 1)=ad_a(lm(ng) , 1)+ &
984 & ad_a( 0,mm(ng)+1)
985 ad_a( 0,mm(ng)+1)=0.0_r8
986!^ tl_A(-2,Mm(ng)+2)=tl_A(Lm(ng)-2, 2)
987!^
988 ad_a(lm(ng)-2, 2)=ad_a(lm(ng)-2, 2)+ &
989 & ad_a(-2,mm(ng)+2)
990 ad_a(-2,mm(ng)+2)=0.0_r8
991!^ tl_A(-1,Mm(ng)+2)=tl_A(Lm(ng)-1, 2)
992!^
993 ad_a(lm(ng)-1, 2)=ad_a(lm(ng)-1, 2)+ &
994 & ad_a(-1,mm(ng)+2)
995 ad_a(-1,mm(ng)+2)=0.0_r8
996!^ tl_A( 0,Mm(ng)+2)=tl_A(Lm(ng) , 2)
997!^
998 ad_a(lm(ng) , 2)=ad_a(lm(ng) , 2)+ &
999 & ad_a( 0,mm(ng)+2)
1000 ad_a( 0,mm(ng)+2)=0.0_r8
1001 IF (nghostpoints.eq.3) THEN
1002!^ tl_A(-2,Mm(ng)+3)=tl_A(Lm(ng)-2, 3)
1003!^
1004 ad_a(lm(ng)-2, 3)=ad_a(lm(ng)-2, 3)+ &
1005 & ad_a(-2,mm(ng)+3)
1006 ad_a(-2,mm(ng)+3)=0.0_r8
1007!^ tl_A(-1,Mm(ng)+3)=tl_A(Lm(ng)-1, 3)
1008!^
1009 ad_a(lm(ng)-1, 3)=ad_a(lm(ng)-1, 3)+ &
1010 & ad_a(-1,mm(ng)+3)
1011 ad_a(-1,mm(ng)+3)=0.0_r8
1012!^ tl_A( 0,Mm(ng)+3)=tl_A(Lm(ng) , 3)
1013!^
1014 ad_a(lm(ng) , 3)=ad_a(lm(ng) , 3)+ &
1015 & ad_a( 0,mm(ng)+3)
1016 ad_a( 0,mm(ng)+3)=0.0_r8
1017 END IF
1018 END IF
1019
1020 IF (domain(ng)%SouthWest_Corner(tile)) THEN
1021!^ tl_A(Lm(ng)+1,Mm(ng)+1)=tl_A( 1, 1)
1022!^
1023 ad_a( 1, 1)=ad_a( 1, 1)+ &
1024 & ad_a(lm(ng)+1,mm(ng)+1)
1025 ad_a(lm(ng)+1,mm(ng)+1)=0.0_r8
1026!^ tl_A(Lm(ng)+1,Mm(ng)+2)=tl_A( 1, 2)
1027!^
1028 ad_a( 1, 2)=ad_a( 1, 2)+ &
1029 & ad_a(lm(ng)+1,mm(ng)+2)
1030 ad_a(lm(ng)+1,mm(ng)+2)=0.0_r8
1031!^ tl_A(Lm(ng)+2,Mm(ng)+1)=tl_A( 2, 1)
1032!^
1033 ad_a( 2, 1)=ad_a( 2, 1)+ &
1034 & ad_a(lm(ng)+2,mm(ng)+1)
1035 ad_a(lm(ng)+2,mm(ng)+1)=0.0_r8
1036!^ tl_A(Lm(ng)+2,Mm(ng)+2)=tl_A( 2, 2)
1037!^
1038 ad_a( 2, 2)=ad_a( 2, 2)+ &
1039 & ad_a(lm(ng)+2,mm(ng)+2)
1040 ad_a(lm(ng)+2,mm(ng)+2)=0.0_r8
1041 IF (nghostpoints.eq.3) THEN
1042!^ tl_A(Lm(ng)+1,Mm(ng)+3)=tl_A( 1, 3)
1043!^
1044 ad_a( 1, 3)=ad_a( 1, 3)+ &
1045 & ad_a(lm(ng)+1,mm(ng)+3)
1046 ad_a(lm(ng)+1,mm(ng)+3)=0.0_r8
1047
1048!^ tl_A(Lm(ng)+2,Mm(ng)+3)=tl_A( 2, 3)
1049!^
1050 ad_a( 2, 3)=ad_a( 2, 3)+ &
1051 & ad_a(lm(ng)+2,mm(ng)+3)
1052 ad_a(lm(ng)+2,mm(ng)+3)=0.0_r8
1053!^ tl_A(Lm(ng)+3,Mm(ng)+1)=tl_A( 3, 1)
1054!^
1055 ad_a( 3, 1)=ad_a( 3, 1)+ &
1056 & ad_a(lm(ng)+3,mm(ng)+1)
1057 ad_a(lm(ng)+3,mm(ng)+1)=0.0_r8
1058!^ tl_A(Lm(ng)+3,Mm(ng)+2)=tl_A( 3, 2)
1059!^
1060 ad_a( 3, 2)=ad_a( 3, 2)+ &
1061 & ad_a(lm(ng)+3,mm(ng)+2)
1062 ad_a(lm(ng)+3,mm(ng)+2)=0.0_r8
1063!^ tl_A(Lm(ng)+3,Mm(ng)+3)=tl_A( 3, 3)
1064!^
1065 ad_a( 3, 3)=ad_a( 3, 3)+ &
1066 & ad_a(lm(ng)+3,mm(ng)+3)
1067 ad_a(lm(ng)+3,mm(ng)+3)=0.0_r8
1068 END IF
1069 END IF
1070 END IF
1071 END IF
1072!
1073!-----------------------------------------------------------------------
1074! North-South periodic boundary conditions.
1075!-----------------------------------------------------------------------
1076!
1077 IF (nsperiodic(ng)) THEN
1078 IF (ewperiodic(ng)) THEN
1079 imin=istr
1080 imax=iend
1081 ELSE
1082 imin=istr
1083 imax=iendr
1084 END IF
1085!
1086 IF (ns_exchange) THEN
1087 IF (domain(ng)%Northern_Edge(tile)) THEN
1088 DO i=imin,imax
1089!^ tl_A(i,-2)=tl_A(i,Mm(ng)-2)
1090!^
1091 ad_a(i,mm(ng)-2)=ad_a(i,mm(ng)-2)+ &
1092 & ad_a(i,-2)
1093 ad_a(i,-2)=0.0_r8
1094!^ tl_A(i,-1)=tl_A(i,Mm(ng)-1)
1095!^
1096 ad_a(i,mm(ng)-1)=ad_a(i,mm(ng)-1)+ &
1097 & ad_a(i,-1)
1098 ad_a(i,-1)=0.0_r8
1099!^ tl_A(i, 0)=tl_A(i,Mm(ng) )
1100!^
1101 ad_a(i,mm(ng) )=ad_a(i,mm(ng) )+ &
1102 & ad_a(i, 0)
1103 ad_a(i, 0)=0.0_r8
1104 END DO
1105 END IF
1106
1107 IF (domain(ng)%Southern_Edge(tile)) THEN
1108 DO i=imin,imax
1109!^ tl_A(i,Mm(ng)+1)=tl_A(i,1)
1110!^
1111 ad_a(i,1)=ad_a(i,1)+ &
1112 & ad_a(i,mm(ng)+1)
1113 ad_a(i,mm(ng)+1)=0.0_r8
1114!^ tl_A(i,Mm(ng)+2)=tl_A(i,2)
1115!^
1116 ad_a(i,2)=ad_a(i,2)+ &
1117 & ad_a(i,mm(ng)+2)
1118 ad_a(i,mm(ng)+2)=0.0_r8
1119 END DO
1120 IF (nghostpoints.eq.3) THEN
1121 DO i=imin,imax
1122!^ tl_A(i,Mm(ng)+3)=tl_A(i,3)
1123!^
1124 ad_a(i,3)=ad_a(i,3)+ &
1125 & ad_a(i,mm(ng)+3)
1126 ad_a(i,mm(ng)+3)=0.0_r8
1127 END DO
1128 END IF
1129 END IF
1130 END IF
1131 END IF
1132!
1133!-----------------------------------------------------------------------
1134! East-West periodic boundary conditions.
1135!-----------------------------------------------------------------------
1136!
1137 IF (ewperiodic(ng)) THEN
1138 IF (nsperiodic(ng)) THEN
1139 jmin=jstr
1140 jmax=jend
1141 ELSE
1142 jmin=jstrr
1143 jmax=jendr
1144 END IF
1145!
1146 IF (ew_exchange) THEN
1147 IF (domain(ng)%Eastern_Edge(tile)) THEN
1148 DO j=jmin,jmax
1149!^ tl_A(-2,j)=tl_A(Lm(ng)-2,j)
1150!^
1151 ad_a(lm(ng)-2,j)=ad_a(lm(ng)-2,j)+ &
1152 & ad_a(-2,j)
1153 ad_a(-2,j)=0.0_r8
1154!^ tl_A(-1,j)=tl_A(Lm(ng)-1,j)
1155!^
1156 ad_a(lm(ng)-1,j)=ad_a(lm(ng)-1,j)+ &
1157 & ad_a(-1,j)
1158 ad_a(-1,j)=0.0_r8
1159!^ tl_A( 0,j)=tl_A(Lm(ng) ,j)
1160!^
1161 ad_a(lm(ng) ,j)=ad_a(lm(ng) ,j)+ &
1162 & ad_a( 0,j)
1163 ad_a( 0,j)=0.0_r8
1164 END DO
1165 END IF
1166
1167 IF (domain(ng)%Western_Edge(tile)) THEN
1168 DO j=jmin,jmax
1169!^ tl_A(Lm(ng)+1,j)=tl_A(1,j)
1170!^
1171 ad_a(1,j)=ad_a(1,j)+ &
1172 & ad_a(lm(ng)+1,j)
1173 ad_a(lm(ng)+1,j)=0.0_r8
1174!^ tl_A(Lm(ng)+2,j)=tl_A(2,j)
1175!^
1176 ad_a(2,j)=ad_a(2,j)+ &
1177 & ad_a(lm(ng)+2,j)
1178 ad_a(lm(ng)+2,j)=0.0_r8
1179 END DO
1180 IF (nghostpoints.eq.3) THEN
1181 DO j=jmin,jmax
1182!^ tl_A(Lm(ng)+3,j)=tl_A(3,j)
1183!^
1184 ad_a(3,j)=ad_a(3,j)+ &
1185 & ad_a(lm(ng)+3,j)
1186 ad_a(lm(ng)+3,j)=0.0_r8
1187 END DO
1188 END IF
1189 END IF
1190 END IF
1191 END IF
1192
1193 RETURN
1194 END SUBROUTINE ad_exchange_u2d_tile
1195
1196!
1197!***********************************************************************
1198 SUBROUTINE ad_exchange_v2d_tile (ng, tile, &
1199 & LBi, UBi, LBj, UBj, &
1200 & ad_A)
1201!***********************************************************************
1202!
1203 USE mod_param
1204 USE mod_scalars
1205!
1206! Imported variable declarations.
1207!
1208 integer, intent(in) :: ng, tile
1209 integer, intent(in) :: LBi, UBi, LBj, UBj
1210!
1211# ifdef ASSUMED_SHAPE
1212 real(r8), intent(inout) :: ad_A(LBi:,LBj:)
1213# else
1214 real(r8), intent(inout) :: ad_A(LBi:UBi,LBj:UBj)
1215# endif
1216!
1217! Local variable declarations.
1218!
1219 logical :: EW_exchange
1220 logical :: NS_exchange
1221
1222 integer :: Imin, Imax, Jmin, Jmax
1223 integer :: i, j
1224
1225# include "set_bounds.h"
1226!
1227!-----------------------------------------------------------------------
1228! Determine processing switches.
1229!-----------------------------------------------------------------------
1230!
1231 IF (ewperiodic(ng)) THEN
1232# ifdef DISTRIBUTE
1233 ew_exchange=ntilei(ng).eq.1
1234# else
1235 ew_exchange=.true.
1236# endif
1237 ELSE
1238 ew_exchange=.false.
1239 END IF
1240
1241 IF (nsperiodic(ng)) THEN
1242# ifdef DISTRIBUTE
1243 ns_exchange=ntilej(ng).eq.1
1244# else
1245 ns_exchange=.true.
1246# endif
1247 ELSE
1248 ns_exchange=.false.
1249 END IF
1250!
1251!-----------------------------------------------------------------------
1252! Boundary corners.
1253!-----------------------------------------------------------------------
1254!
1255 IF (ewperiodic(ng).and.nsperiodic(ng)) THEN
1256 IF (ew_exchange.and.ns_exchange) THEN
1257 IF (domain(ng)%NorthEast_Corner(tile)) THEN
1258!^ tl_A(-2,-2)=tl_A(Lm(ng)-2,Mm(ng)-2)
1259!^
1260 ad_a(lm(ng)-2,mm(ng)-2)=ad_a(lm(ng)-2,mm(ng)-2)+ &
1261 & ad_a(-2,-2)
1262 ad_a(-2,-2)=0.0_r8
1263!^ tl_A(-2,-1)=tl_A(Lm(ng)-2,Mm(ng)-1)
1264!^
1265 ad_a(lm(ng)-2,mm(ng)-1)=ad_a(lm(ng)-2,mm(ng)-1)+ &
1266 & ad_a(-2,-1)
1267 ad_a(-2,-1)=0.0_r8
1268!^ tl_A(-2, 0)=tl_A(Lm(ng)-2,Mm(ng) )
1269!^
1270 ad_a(lm(ng)-2,mm(ng) )=ad_a(lm(ng)-2,mm(ng) )+ &
1271 & ad_a(-2, 0)
1272 ad_a(-2, 0)=0.0_r8
1273!^ tl_A(-1,-2)=tl_A(Lm(ng)-1,Mm(ng)-2)
1274!^
1275 ad_a(lm(ng)-1,mm(ng)-2)=ad_a(lm(ng)-1,mm(ng)-2)+ &
1276 & ad_a(-1,-2)
1277 ad_a(-1,-2)=0.0_r8
1278!^ tl_A(-1,-1)=tl_A(Lm(ng)-1,Mm(ng)-1)
1279!^
1280 ad_a(lm(ng)-1,mm(ng)-1)=ad_a(lm(ng)-1,mm(ng)-1)+ &
1281 & ad_a(-1,-1)
1282 ad_a(-1,-1)=0.0_r8
1283!^ tl_A(-1, 0)=tl_A(Lm(ng)-1,Mm(ng) )
1284!^
1285 ad_a(lm(ng)-1,mm(ng) )=ad_a(lm(ng)-1,mm(ng) )+ &
1286 & ad_a(-1, 0)
1287 ad_a(-1, 0)=0.0_r8
1288!^ tl_A( 0,-2)=tl_A(Lm(ng) ,Mm(ng)-2)
1289!^
1290 ad_a(lm(ng) ,mm(ng)-2)=ad_a(lm(ng) ,mm(ng)-2)+ &
1291 & ad_a( 0,-2)
1292 ad_a( 0,-2)=0.0_r8
1293!^ tl_A( 0,-1)=tl_A(Lm(ng) ,Mm(ng)-1)
1294!^
1295 ad_a(lm(ng) ,mm(ng)-1)=ad_a(lm(ng) ,mm(ng)-1)+ &
1296 & ad_a( 0,-1)
1297 ad_a( 0,-1)=0.0_r8
1298!^ tl_A( 0, 0)=tl_A(Lm(ng) ,Mm(ng) )
1299!^
1300 ad_a(lm(ng) ,mm(ng) )=ad_a(lm(ng) ,mm(ng) )+ &
1301 & ad_a( 0, 0)
1302 ad_a( 0, 0)=0.0_r8
1303 END IF
1304
1305 IF (domain(ng)%NorthWest_Corner(tile)) THEN
1306!^ tl_A(Lm(ng)+1,-2)=tl_A( 1,Mm(ng)-2)
1307!^
1308 ad_a( 1,mm(ng)-2)=ad_a( 1,mm(ng)-2)+ &
1309 & ad_a(lm(ng)+1,-2)
1310 ad_a(lm(ng)+1,-2)=0.0_r8
1311!^ tl_A(Lm(ng)+1,-1)=tl_A( 1,Mm(ng)-1)
1312!^
1313 ad_a( 1,mm(ng)-1)=ad_a( 1,mm(ng)-1)+ &
1314 & ad_a(lm(ng)+1,-1)
1315 ad_a(lm(ng)+1,-1)=0.0_r8
1316!^ tl_A(Lm(ng)+1, 0)=tl_A( 1,Mm(ng) )
1317!^
1318 ad_a( 1,mm(ng) )=ad_a( 1,mm(ng) )+ &
1319 & ad_a(lm(ng)+1, 0)
1320 ad_a(lm(ng)+1, 0)=0.0_r8
1321!^ tl_A(Lm(ng)+2,-2)=tl_A( 2,Mm(ng)-2)
1322!^
1323 ad_a( 2,mm(ng)-2)=ad_a( 2,mm(ng)-2)+ &
1324 & ad_a(lm(ng)+2,-2)
1325 ad_a(lm(ng)+2,-2)=0.0_r8
1326!^ tl_A(Lm(ng)+2,-1)=tl_A( 2,Mm(ng)-1)
1327!^
1328 ad_a( 2,mm(ng)-1)=ad_a( 2,mm(ng)-1)+ &
1329 & ad_a(lm(ng)+2,-1)
1330 ad_a(lm(ng)+2,-1)=0.0_r8
1331!^ tl_A(Lm(ng)+2, 0)=tl_A( 2,Mm(ng) )
1332!^
1333 ad_a( 2,mm(ng) )=ad_a( 2,mm(ng) )+ &
1334 & ad_a(lm(ng)+2, 0)
1335 ad_a(lm(ng)+2, 0)=0.0_r8
1336 IF (nghostpoints.eq.3) THEN
1337!^ tl_A(Lm(ng)+3,-2)=tl_A(3 ,Mm(ng)-2)
1338!^
1339 ad_a(3 ,mm(ng)-2)=ad_a(3 ,mm(ng)-2)+ &
1340 & ad_a(lm(ng)+3,-2)
1341 ad_a(lm(ng)+3,-2)=0.0_r8
1342!^ tl_A(Lm(ng)+3,-1)=tl_A(3 ,Mm(ng)-1)
1343!^
1344 ad_a(3 ,mm(ng)-1)=ad_a(3 ,mm(ng)-1)+ &
1345 & ad_a(lm(ng)+3,-1)
1346 ad_a(lm(ng)+3,-1)=0.0_r8
1347!^ tl_A(Lm(ng)+3, 0)=tl_A(3 ,Mm(ng) )
1348!^
1349 ad_a(3 ,mm(ng) )=ad_a(3 ,mm(ng) )+ &
1350 & ad_a(lm(ng)+3, 0)
1351 ad_a(lm(ng)+3, 0)=0.0_r8
1352 END IF
1353 END IF
1354
1355 IF (domain(ng)%SouthEast_Corner(tile)) THEN
1356!^ tl_A(-2,Mm(ng)+1)=tl_A(Lm(ng)-2, 1)
1357!^
1358 ad_a(lm(ng)-2, 1)=ad_a(lm(ng)-2, 1)+ &
1359 & ad_a(-2,mm(ng)+1)
1360 ad_a(-2,mm(ng)+1)=0.0_r8
1361!^ tl_A(-1,Mm(ng)+1)=tl_A(Lm(ng)-1, 1)
1362!^
1363 ad_a(lm(ng)-1, 1)=ad_a(lm(ng)-1, 1)+ &
1364 & ad_a(-1,mm(ng)+1)
1365 ad_a(-1,mm(ng)+1)=0.0_r8
1366!^ tl_A( 0,Mm(ng)+1)=tl_A(Lm(ng) , 1)
1367!^
1368 ad_a(lm(ng) , 1)=ad_a(lm(ng) , 1)+ &
1369 & ad_a( 0,mm(ng)+1)
1370 ad_a( 0,mm(ng)+1)=0.0_r8
1371!^ tl_A(-2,Mm(ng)+2)=tl_A(Lm(ng)-2, 2)
1372!^
1373 ad_a(lm(ng)-2, 2)=ad_a(lm(ng)-2, 2)+ &
1374 & ad_a(-2,mm(ng)+2)
1375 ad_a(-2,mm(ng)+2)=0.0_r8
1376!^ tl_A(-1,Mm(ng)+2)=tl_A(Lm(ng)-1, 2)
1377!^
1378 ad_a(lm(ng)-1, 2)=ad_a(lm(ng)-1, 2)+ &
1379 & ad_a(-1,mm(ng)+2)
1380 ad_a(-1,mm(ng)+2)=0.0_r8
1381!^ tl_A( 0,Mm(ng)+2)=tl_A(Lm(ng) , 2)
1382!^
1383 ad_a(lm(ng) , 2)=ad_a(lm(ng) , 2)+ &
1384 & ad_a( 0,mm(ng)+2)
1385 ad_a( 0,mm(ng)+2)=0.0_r8
1386 IF (nghostpoints.eq.3) THEN
1387!^ tl_A(-2,Mm(ng)+3)=tl_A(Lm(ng)-2, 3)
1388!^
1389 ad_a(lm(ng)-2, 3)=ad_a(lm(ng)-2, 3)+ &
1390 & ad_a(-2,mm(ng)+3)
1391 ad_a(-2,mm(ng)+3)=0.0_r8
1392!^ tl_A(-1,Mm(ng)+3)=tl_A(Lm(ng)-1, 3)
1393!^
1394 ad_a(lm(ng)-1, 3)=ad_a(lm(ng)-1, 3)+ &
1395 & ad_a(-1,mm(ng)+3)
1396 ad_a(-1,mm(ng)+3)=0.0_r8
1397!^ tl_A( 0,Mm(ng)+3)=tl_A(Lm(ng) , 3)
1398!^
1399 ad_a(lm(ng) , 3)=ad_a(lm(ng) , 3)+ &
1400 & ad_a( 0,mm(ng)+3)
1401 ad_a( 0,mm(ng)+3)=0.0_r8
1402 END IF
1403 END IF
1404
1405 IF (domain(ng)%SouthWest_Corner(tile)) THEN
1406!^ tl_A(Lm(ng)+1,Mm(ng)+1)=tl_A( 1, 1)
1407!^
1408 ad_a( 1, 1)=ad_a( 1, 1)+ &
1409 & ad_a(lm(ng)+1,mm(ng)+1)
1410 ad_a(lm(ng)+1,mm(ng)+1)=0.0_r8
1411!^ tl_A(Lm(ng)+1,Mm(ng)+2)=tl_A( 1 , 2)
1412!^
1413 ad_a( 1, 2)=ad_a( 1, 2)+ &
1414 & ad_a(lm(ng)+1,mm(ng)+2)
1415 ad_a(lm(ng)+1,mm(ng)+2)=0.0_r8
1416!^ tl_A(Lm(ng)+2,Mm(ng)+1)=tl_A(2,1 )
1417!^
1418 ad_a( 2, 1)=ad_a( 2, 1 )+ &
1419 & ad_a(lm(ng)+2,mm(ng)+1)
1420 ad_a(lm(ng)+2,mm(ng)+1)=0.0_r8
1421!^ tl_A(Lm(ng)+2,Mm(ng)+2)=tl_A( 2, 2)
1422!^
1423 ad_a( 2, 2)=ad_a( 2, 2)+ &
1424 & ad_a(lm(ng)+2,mm(ng)+2)
1425 ad_a(lm(ng)+2,mm(ng)+2)=0.0_r8
1426 IF (nghostpoints.eq.3) THEN
1427!^ tl_A(Lm(ng)+1,Mm(ng)+3)=tl_A( 1, 3)
1428!^
1429 ad_a( 1, 3)=ad_a( 1, 3)+ &
1430 & ad_a(lm(ng)+1,mm(ng)+3)
1431 ad_a(lm(ng)+1,mm(ng)+3)=0.0_r8
1432!^ tl_A(Lm(ng)+2,Mm(ng)+3)=tl_A( 2, 3)
1433!^
1434 ad_a( 2, 3)=ad_a( 2, 3)+ &
1435 & ad_a(lm(ng)+2,mm(ng)+3)
1436 ad_a(lm(ng)+2,mm(ng)+3)=0.0_r8
1437!^ tl_A(Lm(ng)+3,Mm(ng)+1)=tl_A( 3, 1)
1438!^
1439 ad_a( 3, 1)=ad_a( 3, 1)+ &
1440 & ad_a(lm(ng)+3,mm(ng)+1)
1441 ad_a(lm(ng)+3,mm(ng)+1)=0.0_r8
1442!^ tl_A(Lm(ng)+3,Mm(ng)+2)=tl_A( 3, 2)
1443!^
1444 ad_a( 3, 2)=ad_a( 3, 2)+ &
1445 & ad_a(lm(ng)+3,mm(ng)+2)
1446 ad_a(lm(ng)+3,mm(ng)+2)=0.0_r8
1447!^ tl_A(Lm(ng)+3,Mm(ng)+3)=tl_A( 3, 3)
1448!^
1449 ad_a( 3, 3)=ad_a( 3, 3)+ &
1450 & ad_a(lm(ng)+3,mm(ng)+3)
1451 ad_a(lm(ng)+3,mm(ng)+3)=0.0_r8
1452 END IF
1453 END IF
1454 END IF
1455 END IF
1456!
1457!-----------------------------------------------------------------------
1458! North-South periodic boundary conditions.
1459!-----------------------------------------------------------------------
1460!
1461 IF (nsperiodic(ng)) THEN
1462 IF (ewperiodic(ng)) THEN
1463 imin=istr
1464 imax=iend
1465 ELSE
1466 imin=istrr
1467 imax=iendr
1468 END IF
1469!
1470 IF (ns_exchange) THEN
1471 IF (domain(ng)%Northern_Edge(tile)) THEN
1472 DO i=imin,imax
1473!^ tl_A(i,-2)=tl_A(i,Mm(ng)-2)
1474!^
1475 ad_a(i,mm(ng)-2)=ad_a(i,mm(ng)-2)+ &
1476 & ad_a(i,-2)
1477 ad_a(i,-2)=0.0_r8
1478!^ tl_A(i,-1)=tl_A(i,Mm(ng)-1)
1479!^
1480 ad_a(i,mm(ng)-1)=ad_a(i,mm(ng)-1)+ &
1481 & ad_a(i,-1)
1482 ad_a(i,-1)=0.0_r8
1483!^ tl_A(i, 0)=tl_A(i,Mm(ng) )
1484!^
1485 ad_a(i,mm(ng) )=ad_a(i,mm(ng) )+ &
1486 & ad_a(i, 0)
1487 ad_a(i, 0)=0.0_r8
1488 END DO
1489 END IF
1490
1491 IF (domain(ng)%Southern_Edge(tile)) THEN
1492 DO i=imin,imax
1493!^ tl_A(i,Mm(ng)+1)=tl_A(i,1)
1494!^
1495 ad_a(i,1)=ad_a(i,1)+ &
1496 & ad_a(i,mm(ng)+1)
1497 ad_a(i,mm(ng)+1)=0.0_r8
1498!^ tl_A(i,Mm(ng)+2)=tl_A(i,2)
1499!^
1500 ad_a(i,2)=ad_a(i,2)+ &
1501 & ad_a(i,mm(ng)+2)
1502 ad_a(i,mm(ng)+2)=0.0_r8
1503 END DO
1504 IF (nghostpoints.eq.3) THEN
1505 DO i=imin,imax
1506!^ tl_A(i,Mm(ng)+3)=tl_A(i,3)
1507!^
1508 ad_a(i,3)=ad_a(i,3)+ &
1509 & ad_a(i,mm(ng)+3)
1510 ad_a(i,mm(ng)+3)=0.0_r8
1511 END DO
1512 END IF
1513 END IF
1514 END IF
1515 END IF
1516!
1517!-----------------------------------------------------------------------
1518! East-West periodic boundary conditions.
1519!-----------------------------------------------------------------------
1520!
1521 IF (ewperiodic(ng)) THEN
1522 IF (nsperiodic(ng)) THEN
1523 jmin=jstr
1524 jmax=jend
1525 ELSE
1526 jmin=jstr
1527 jmax=jendr
1528 END IF
1529!
1530 IF (ew_exchange) THEN
1531 IF (domain(ng)%Eastern_Edge(tile)) THEN
1532 DO j=jmin,jmax
1533!^ tl_A(-2,j)=tl_A(Lm(ng)-2,j)
1534!^
1535 ad_a(lm(ng)-2,j)=ad_a(lm(ng)-2,j)+ &
1536 & ad_a(-2,j)
1537 ad_a(-2,j)=0.0_r8
1538!^ tl_A(-1,j)=tl_A(Lm(ng)-1,j)
1539!^
1540 ad_a(lm(ng)-1,j)=ad_a(lm(ng)-1,j)+ &
1541 & ad_a(-1,j)
1542 ad_a(-1,j)=0.0_r8
1543!^ tl_A( 0,j)=tl_A(Lm(ng) ,j)
1544!^
1545 ad_a(lm(ng) ,j)=ad_a(lm(ng) ,j)+ &
1546 & ad_a( 0,j)
1547 ad_a( 0,j)=0.0_r8
1548 END DO
1549 END IF
1550
1551 IF (domain(ng)%Western_Edge(tile)) THEN
1552 DO j=jmin,jmax
1553!^ tl_A(Lm(ng)+1,j)=tl_A(1 ,j)
1554!^
1555 ad_a(1 ,j)=ad_a(1 ,j)+ &
1556 & ad_a(lm(ng)+1,j)
1557 ad_a(lm(ng)+1,j)=0.0_r8
1558!^ tl_A(Lm(ng)+2,j)=tl_A(2,j)
1559!^
1560 ad_a(2,j)=ad_a(2,j)+ &
1561 & ad_a(lm(ng)+2,j)
1562 ad_a(lm(ng)+2,j)=0.0_r8
1563 END DO
1564 IF (nghostpoints.eq.3) THEN
1565 DO j=jmin,jmax
1566!^ tl_A(Lm(ng)+3,j)=tl_A(3,j)
1567!^
1568 ad_a(3,j)=ad_a(3,j)+ &
1569 & ad_a(lm(ng)+3,j)
1570 ad_a(lm(ng)+3,j)=0.0_r8
1571 END DO
1572 END IF
1573 END IF
1574 END IF
1575 END IF
1576
1577 RETURN
1578 END SUBROUTINE ad_exchange_v2d_tile
1579#endif
1580 END MODULE ad_exchange_2d_mod
subroutine ad_exchange_u2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine ad_exchange_v2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine ad_exchange_r2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
subroutine ad_exchange_p2d_tile(ng, tile, lbi, ubi, lbj, ubj, ad_a)
integer nghostpoints
Definition mod_param.F:710
type(t_domain), dimension(:), allocatable domain
Definition mod_param.F:329
integer, dimension(:), allocatable lm
Definition mod_param.F:455
integer, dimension(:), allocatable ntilei
Definition mod_param.F:677
integer, dimension(:), allocatable mm
Definition mod_param.F:456
integer, dimension(:), allocatable ntilej
Definition mod_param.F:678
logical, dimension(:), allocatable ewperiodic
logical, dimension(:), allocatable nsperiodic