New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
lbclnk_tam.F90 in branches/TAM_V3_0/NEMOTAM/OPATAM_SRC – NEMO

source: branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/lbclnk_tam.F90 @ 1885

Last change on this file since 1885 was 1885, checked in by rblod, 14 years ago

add TAM sources

File size: 34.1 KB
Line 
1MODULE lbclnk_tam
2   !!======================================================================
3   !!                       ***  MODULE  lbclnk_tam  ***
4   !! Ocean        : adjoint of lateral boundary conditions
5   !!=====================================================================
6#if   defined key_mpp_mpi   ||   defined key_mpp_shmem
7   !!----------------------------------------------------------------------
8   !!   'key_mpp_mpi'     OR      MPI massively parallel processing library
9   !!   'key_mpp_shmem'         SHMEM massively parallel processing library
10   !!----------------------------------------------------------------------
11   !!----------------------------------------------------------------------
12   !!   lbc_lnk_adj     : generic interface for mpp_lnk_3d_adj and
13   !!                     mpp_lnkadj_2d routines defined in lib_mpp_tam
14   !!   lbc_lnk_adj_e   : generic interface for mpp_lnk_2d_e_adj
15   !!                     routine defined in lib_mpp_tam
16   !!----------------------------------------------------------------------
17   !! * Modules used
18   USE lib_mpp_tam          ! distributed memory computing library
19
20   INTERFACE lbc_lnk_adj
21      MODULE PROCEDURE mpp_lnk_3d_gather_adj, mpp_lnk_3d_adj, mpp_lnk_2d_adj
22   END INTERFACE
23
24   INTERFACE lbc_lnk_e_adj
25      MODULE PROCEDURE mpp_lnk_2d_e_adj
26   END INTERFACE
27
28   PUBLIC lbc_lnk_adj       ! ocean lateral boundary conditions
29   PUBLIC lbc_lnk_e_adj     ! ocean lateral boundary conditions
30   !!----------------------------------------------------------------------
31
32#else
33   !!----------------------------------------------------------------------
34   !!   Default option                              shared memory computing
35   !!----------------------------------------------------------------------
36   !!   lbc_lnk_adj     : generic interface for lbc_lnkadj_3d and lbc_lnkadj_2d
37   !!   lbc_lnk_3d_adj  : set the lateral boundary condition on a 3D variable
38   !!                  on OPA ocean mesh
39   !!   lbc_lnk_2d_adj  : set the lateral boundary condition on a 2D variable
40   !!                  on OPA ocean mesh
41   !!----------------------------------------------------------------------
42   !! * Modules used
43   USE oce             ! ocean dynamics and tracers   
44   USE dom_oce         ! ocean space and time domain
45   USE in_out_manager  ! I/O manager
46
47   IMPLICIT NONE
48   PRIVATE
49
50   INTERFACE lbc_lnk_adj
51      MODULE PROCEDURE lbc_lnk_3d_gather_adj, lbc_lnk_3d_adj, lbc_lnk_2d_adj
52   END INTERFACE
53
54   INTERFACE lbc_lnk_e_adj
55      MODULE PROCEDURE lbc_lnk_2d_adj
56   END INTERFACE
57
58   PUBLIC lbc_lnk_adj       ! ocean/ice  lateral boundary conditions
59   PUBLIC lbc_lnk_e_adj     ! ocean/ice  lateral boundary conditions
60   !!----------------------------------------------------------------------
61
62CONTAINS
63
64   SUBROUTINE lbc_lnk_3d_gather_adj( pt3d1, cd_type1, pt3d2, cd_type2, psgn )
65      !!---------------------------------------------------------------------
66      !!                  ***  ROUTINE lbc_lnkadj_3d_gather  ***
67      !!
68      !! ** Purpose : Adjoint of set lateral boundary conditions (non mpp case)
69      !!
70      !! ** Method  :
71      !!
72      !! History :
73      !!        !  07-08  (K. Mogensen) Original code
74      !!----------------------------------------------------------------------
75      !! * Arguments
76      CHARACTER(len=1), INTENT( in ) ::   &
77         cd_type1, cd_type2       ! nature of pt3d grid-points
78         !             !   = T ,  U , V , F or W  gridpoints
79      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) ::   &
80         pt3d1, pt3d2          ! 3D array on which the boundary condition is applied
81      REAL(wp), INTENT( in ) ::   &
82         psgn          ! control of the sign change
83         !             !   =-1 , the sign is changed if north fold boundary
84         !             !   = 1 , no sign change
85         !             !   = 0 , no sign change and > 0 required (use the inner
86         !             !         row/column if closed boundary)
87      !! * Local declarations
88      INTEGER  ::   ji, jk
89      INTEGER  ::   ijt, iju
90
91      !                                                      ! ===============
92      DO jk = jpk, 1, -1                                     ! Horizontal slab
93         !                                                   ! ===============
94
95         !                                     ! North-South boundaries
96         !                                     ! ======================
97         SELECT CASE ( nperio )
98
99         CASE ( 2 )                            ! *  south symmetric
100
101            SELECT CASE ( cd_type1 )
102            CASE ( 'T' , 'U' , 'W' )                   ! T-, U-, W-points
103               pt3d1(:,jpj,jk) = 0.e0
104               pt3d1(:, 3 ,jk) = pt3d1(:,3,jk) + pt3d1(:,1,jk)
105               pt3d1(:, 1 ,jk) = 0.e0
106            CASE ( 'V' , 'F' )                         ! V-, F-points
107               pt3d1(:,jpj,jk) = 0.e0
108               pt3d1(:, 2 ,jk) = pt3d1(:,2,jk) + psgn * pt3d1(:,1,jk)
109               pt3d1(:, 1 ,jk) = 0.e0
110            END SELECT
111            SELECT CASE ( cd_type2 )
112            CASE ( 'T' , 'U' , 'W' )                   ! T-, U-, W-points
113               pt3d2(:,jpj,jk) = 0.e0
114               pt3d2(:, 3 ,jk) = pt3d2(:,3,jk) + pt3d2(:,1,jk)
115               pt3d2(:, 1 ,jk) = 0.e0
116            CASE ( 'V' , 'F' )                         ! V-, F-points
117               pt3d2(:,jpj,jk) = 0.e0
118               pt3d2(:, 2 ,jk) = pt3d2(:,2,jk) + psgn * pt3d2(:,1,jk)
119               pt3d2(:, 1 ,jk) = 0.e0
120            END SELECT
121
122         CASE ( 3 , 4 )                        ! *  North fold  T-point pivot
123
124            SELECT CASE ( cd_type1 )
125            CASE ( 'T' , 'W' )                         ! T-, W-point
126               DO ji = jpi, jpi/2+1, -1
127                  ijt = jpi-ji+2
128                  pt3d1(ijt,jpjm1,jk) =        pt3d1(ijt,jpjm1,jk) &
129                     &                + psgn * pt3d1(ji ,jpjm1,jk)
130                  pt3d1(ji, jpjm1,jk) = 0.0e0
131               END DO
132               DO ji = jpi, 2, -1
133                  ijt = jpi-ji+2
134                  pt3d1(ji,jpj-2,jk) =        pt3d1(ijt,jpj-2,jk) &
135                     &               + psgn * pt3d1(ji ,jpj  ,jk)
136                  pt3d1(ji, jpj ,jk) = 0.e0
137                  pt3d1(ji,  1  ,jk) = 0.e0
138               END DO
139            CASE ( 'U' )                               ! U-point
140               DO ji = jpi-1, jpi/2, -1
141                  iju = jpi-ji+1
142                  pt3d1(iju,jpjm1,jk) =        pt3d1(iju,jpjm1,jk) &
143                     &                + psgn * pt3d1(ji ,jpjm1,jk)
144                  pt3d1(ji ,jpjm1,jk) = 0.0e0
145               END DO
146               DO ji = jpi-1, 1, -1
147                  iju = jpi-ji+1
148                  pt3d1(iju,jpj-2,jk) =         pt3d1(iju,jpj-2,jk) &
149                     &                +  psgn * pt3d1(ji ,jpj  ,jk)
150                  pt3d1(ji ,jpj  ,jk) = 0.e0
151                  pt3d1(ji , 1   ,jk) = 0.e0
152               END DO
153            CASE ( 'V' )                               ! V-point
154                  DO ji = jpi, 2, -1
155                     ijt = jpi-ji+2
156                     pt3d1(ijt,jpj-3,jk) =        pt3d1(ijt,jpj-3,jk) & 
157                        &                + psgn * pt3d1(ji ,jpj  ,jk)
158                     pt3d1(ji ,jpj  ,jk) = 0.e0
159                     pt3d1(ijt,jpj-2,jk) =        pt3d1(ijt,jpj-2,jk) &
160                        &                + psgn * pt3d1(ji, jpj-1,jk)
161                     pt3d1(ji ,jpj-1,jk) = 0.e0
162                     pt3d1(ji , 1   ,jk) = 0.e0
163                  END DO
164            CASE ( 'F' )                               ! F-point
165                  DO ji = jpi-1, 1, -1
166                     iju = jpi-ji+1
167                     pt3d1(iju,jpj-3,jk) =        pt3d1(iju,jpj-3,jk) &
168                        &                + psgn * pt3d1(ji ,jpj  ,jk)
169                     pt3d1(ji ,jpj  ,jk) = 0.e0
170                     pt3d1(iju,jpj-2,jk) =        pt3d1(iju,jpj-2,jk) &
171                        &                + psgn * pt3d1(ji ,jpj-1,jk) 
172                     pt3d1(ji ,jpj-1,jk) = 0.e0
173                  END DO
174            END SELECT
175            SELECT CASE ( cd_type2 )
176            CASE ( 'T' , 'W' )                         ! T-, W-point
177               DO ji = jpi, jpi/2+1, -1
178                  ijt = jpi-ji+2
179                  pt3d2(ijt,jpjm1,jk) =        pt3d2(ijt,jpjm1,jk) &
180                     &                + psgn * pt3d2(ji ,jpjm1,jk)
181                  pt3d2(ji ,jpjm1,jk) = 0.0e0
182               END DO
183               DO ji = jpi, 2, -1
184                  ijt = jpi-ji+2
185                  pt3d2(ji,jpj-2,jk) =        pt3d2(ijt,jpj-2,jk) &
186                     &               + psgn * pt3d2(ji ,jpj  ,jk)
187                  pt3d2(ji, jpj ,jk) = 0.e0
188                  pt3d2(ji,  1  ,jk) = 0.e0
189               END DO
190            CASE ( 'U' )                               ! U-point
191               DO ji = jpi-1, jpi/2, -1
192                  iju = jpi-ji+1
193                  pt3d2(iju,jpjm1,jk) =        pt3d2(iju,jpjm1,jk) &
194                     &                + psgn * pt3d2(ji ,jpjm1,jk)
195                  pt3d2(ji ,jpjm1,jk) = 0.0e0
196               END DO
197               DO ji = jpi-1, 1, -1
198                  iju = jpi-ji+1
199                  pt3d2(iju,jpj-2,jk) =         pt3d2(iju,jpj-2,jk) &
200                     &                +  psgn * pt3d2(ji ,jpj  ,jk)
201                  pt3d2(ji ,jpj  ,jk) = 0.e0
202                  pt3d2(ji , 1   ,jk) = 0.e0
203               END DO
204            CASE ( 'V' )                               ! V-point
205                  DO ji = jpi, 2, -1
206                     ijt = jpi-ji+2
207                     pt3d2(ijt,jpj-3,jk) =        pt3d2(ijt,jpj-3,jk) & 
208                        &                + psgn * pt3d2(ji ,jpj  ,jk)
209                     pt3d2(ji ,jpj  ,jk) = 0.e0
210                     pt3d2(ijt,jpj-2,jk) =        pt3d2(ijt,jpj-2,jk) &
211                        &                + psgn * pt3d2(ji, jpj-1,jk)
212                     pt3d2(ji ,jpj-1,jk) = 0.e0
213                     pt3d2(ji , 1   ,jk) = 0.e0
214                  END DO
215            CASE ( 'F' )                               ! F-point
216                  DO ji = jpi-1, 1, -1
217                     iju = jpi-ji+1
218                     pt3d2(iju,jpj-3,jk) =        pt3d2(iju,jpj-3,jk) &
219                        &                + psgn * pt3d2(ji ,jpj  ,jk)
220                     pt3d2(ji ,jpj  ,jk) = 0.e0
221                     pt3d2(iju,jpj-2,jk) =        pt3d2(iju,jpj-2,jk) &
222                        &                + psgn * pt3d2(ji ,jpj-1,jk) 
223                     pt3d2(ji ,jpj-1,jk) = 0.e0
224                  END DO
225            END SELECT
226
227            pt3d1(jpi,jpj,jk) = 0.e0
228            pt3d1( 1 ,jpj,jk) = 0.e0
229            pt3d2(jpi,jpj,jk) = 0.e0
230            pt3d2( 1 ,jpj,jk) = 0.e0
231
232         CASE ( 5 , 6 )                        ! *  North fold  F-point pivot
233
234            SELECT CASE ( cd_type1 )
235            CASE ( 'T' , 'W' )                         ! T-, W-point
236               DO ji = jpi, 1, -1
237                  ijt = jpi-ji+1
238                  pt3d1(ijt,jpj-1,jk) =        pt3d1(ijt,jpj-1,jk) &
239                     &                + psgn * pt3d1(ji ,jpj  ,jk) 
240                  pt3d1(ji ,jpj  ,jk) = 0.e0
241                  pt3d1(ji , 1   ,jk) = 0.e0
242               END DO
243            CASE ( 'U' )                               ! U-point
244               DO ji = jpi-1, 1, -1
245                  iju = jpi-ji
246                  pt3d1(iju,jpj-1,jk) =        pt3d1(iju,jpj-1,jk) &
247                     &                + psgn * pt3d1(ji ,jpj,jk) 
248                  pt3d1(ji ,jpj  ,jk) = 0.e0
249                  pt3d1(ji , 1   ,jk) = 0.e0
250               END DO
251            CASE ( 'V' )                               ! V-point
252               DO ji = jpi, jpi/2+1, -1
253                  ijt = jpi-ji+1
254                  pt3d1(ijt,jpjm1,jk) =         pt3d1(ijt,jpjm1,jk) &
255                     &                +  psgn * pt3d1(ji ,jpjm1,jk)
256                  pt3d1(ji ,jpjm1,jk) = 0.e0
257               END DO
258               DO ji = jpi, 1, -1
259                  ijt = jpi-ji+1
260                  pt3d1(ijt,jpj-2,jk) =        pt3d1(ijt,jpj-2,jk)&
261                     &                + psgn * pt3d1(ji ,jpj  ,jk)
262                  pt3d1(ji ,jpj  ,jk) = 0.e0
263                  pt3d1(ji , 1   ,jk) = 0.e0
264               END DO
265            CASE ( 'F' )                               ! F-point
266               DO ji = jpi-1, jpi/2+1, -1
267                  iju = jpi-ji
268                  pt3d1(iju,jpjm1,jk) =        pt3d1(iju,jpjm1,jk) &
269                     &                + psgn * pt3d1(ji ,jpjm1,jk)
270                  pt3d1(ji ,jpjm1,jk) = 0.e0
271               END DO
272               DO ji = jpi-1, 1, -1
273                  iju = jpi-ji
274                  pt3d1(iju,jpj-2,jk) =        pt3d1(iju,jpj-2,jk) &
275                     &                + psgn * pt3d1(ji ,jpj  ,jk)
276                 
277                  pt3d1(ji ,jpj  ,jk) = 0.e0
278               END DO
279            END SELECT
280            SELECT CASE ( cd_type2 )
281            CASE ( 'T' , 'W' )                         ! T-, W-point
282               DO ji = jpi, 1, -1
283                  ijt = jpi-ji+1
284                  pt3d2(ijt,jpj-1,jk) =        pt3d2(ijt,jpj-1,jk) &
285                     &                + psgn * pt3d2(ji ,jpj  ,jk) 
286                  pt3d2(ji ,jpj  ,jk) = 0.e0
287                  pt3d2(ji , 1   ,jk) = 0.e0
288               END DO
289            CASE ( 'U' )                               ! U-point
290                  DO ji = jpi-1, 1, -1
291                     iju = jpi-ji
292                     pt3d2(iju,jpj-1,jk) =        pt3d2(iju,jpj-1,jk) &
293                        &                + psgn * pt3d2(ji ,jpj,jk) 
294                     pt3d2(ji ,jpj  ,jk) = 0.e0
295                     pt3d2(ji , 1   ,jk) = 0.e0
296                  END DO
297            CASE ( 'V' )                               ! V-point
298                  DO ji = jpi, jpi/2+1, -1
299                     ijt = jpi-ji+1
300                     pt3d2(ijt,jpjm1,jk) =         pt3d2(ijt,jpjm1,jk) &
301                        &                +  psgn * pt3d2(ji ,jpjm1,jk)
302                     pt3d2(ji ,jpjm1,jk) = 0.e0
303                  END DO
304                  DO ji = jpi, 1, -1
305                     ijt = jpi-ji+1
306                     pt3d2(ijt,jpj-2,jk) =        pt3d2(ijt,jpj-2,jk)&
307                        &                + psgn * pt3d2(ji ,jpj  ,jk)
308                     pt3d2(ji ,jpj  ,jk) = 0.e0
309                     pt3d2(ji , 1   ,jk) = 0.e0
310                  END DO
311            CASE ( 'F' )                               ! F-point
312                  DO ji = jpi-1, jpi/2+1, -1
313                     iju = jpi-ji
314                     pt3d2(iju,jpjm1,jk) =        pt3d2(iju,jpjm1,jk) &
315                        &                + psgn * pt3d2(ji ,jpjm1,jk)
316                     pt3d2(ji ,jpjm1,jk) = 0.e0
317                  END DO
318                  DO ji = jpi-1, 1, -1
319                     iju = jpi-ji
320                     pt3d2(iju,jpj-2,jk) =        pt3d2(iju,jpj-2,jk) &
321                        &                + psgn * pt3d2(ji ,jpj  ,jk)
322
323                     pt3d2(ji ,jpj  ,jk) = 0.e0
324                  END DO
325            END SELECT
326
327            pt3d1(jpi,jpj,jk) = 0.e0
328            pt3d1( 1 ,jpj,jk) = 0.e0
329            pt3d2(jpi,jpj,jk) = 0.e0
330            pt3d2( 1 ,jpj,jk) = 0.e0
331
332
333         CASE DEFAULT                          ! *  closed
334
335            SELECT CASE ( cd_type1 )
336            CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points
337               pt3d1(:,jpj,jk) = 0.e0
338               pt3d1(:, 1 ,jk) = 0.e0
339            CASE ( 'F' )                               ! F-point
340               pt3d1(:,jpj,jk) = 0.e0
341            END SELECT
342            SELECT CASE ( cd_type2 )
343            CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points
344               pt3d2(:,jpj,jk) = 0.e0
345               pt3d2(:, 1 ,jk) = 0.e0
346            CASE ( 'F' )                               ! F-point
347               pt3d2(:,jpj,jk) = 0.e0
348            END SELECT
349
350         END SELECT
351
352         !                                     ! East-West boundaries
353         !                                     ! ====================
354         SELECT CASE ( nperio )
355
356         CASE ( 1 , 4 , 6 )                    ! * cyclic east-west
357                                               ! all points
358            pt3d1(  2  ,:,jk) = pt3d1(  2  ,:,jk) &
359               &              + pt3d1( jpi ,:,jk)
360            pt3d1( jpi ,:,jk) = 0.0e0
361            pt3d1(jpim1,:,jk) = pt3d1(jpim1,:,jk) &
362               &              + pt3d1( 1 ,:,jk)
363            pt3d1(  1  ,:,jk) = 0.0e0         
364            pt3d2(  2  ,:,jk) = pt3d2(  2  ,:,jk) &
365               &              + pt3d2( jpi ,:,jk)
366            pt3d2( jpi ,:,jk) = 0.0e0
367            pt3d2(jpim1,:,jk) = pt3d2(jpim1,:,jk) &
368               &               + pt3d2( 1 ,:,jk)
369            pt3d2(  1  ,:,jk) = 0.0e0         
370
371         CASE DEFAULT                          ! * closed
372            SELECT CASE ( cd_type1 )
373            CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points
374               pt3d1(jpi,:,jk) = 0.e0
375               pt3d1( 1 ,:,jk) = 0.e0
376            CASE ( 'F' )                               ! F-point
377               pt3d1(jpi,:,jk) = 0.e0
378            END SELECT
379            SELECT CASE ( cd_type2 )
380            CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points
381               pt3d2(jpi,:,jk) = 0.e0
382               pt3d2( 1 ,:,jk) = 0.e0
383            CASE ( 'F' )                               ! F-point
384               pt3d2(jpi,:,jk) = 0.e0
385            END SELECT
386
387         END SELECT
388
389
390         !                                                   ! ===============
391      END DO                                                 !   End of slab
392      !                                                      ! ===============
393
394   END SUBROUTINE lbc_lnk_3d_gather_adj
395
396   SUBROUTINE lbc_lnk_3d_adj( pt3d, cd_type, psgn, cd_mpp )
397      !!---------------------------------------------------------------------
398      !!                  ***  ROUTINE lbc_lnkadj_3d  ***
399      !!
400      !! ** Purpose : Adjoint of set lateral boundary conditions (non mpp case)
401      !!
402      !! ** Method  :
403      !!
404      !! History :
405      !!        !  07-08  (K. Mogensen) Original code
406      !!----------------------------------------------------------------------
407      !! * Arguments
408      CHARACTER(len=1), INTENT( in ) ::   &
409         cd_type       ! nature of pt3d grid-points
410         !             !   = T ,  U , V , F or W  gridpoints
411      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) ::   &
412         pt3d          ! 3D array on which the boundary condition is applied
413      REAL(wp), INTENT( in ) ::   &
414         psgn          ! control of the sign change
415         !             !   =-1 , the sign is changed if north fold boundary
416         !             !   = 1 , no sign change
417         !             !   = 0 , no sign change and > 0 required (use the inner
418         !             !         row/column if closed boundary)
419      CHARACTER(len=3), INTENT( in ), OPTIONAL ::    &
420         cd_mpp        ! fill the overlap area only (here do nothing)
421      !! * Local declarations
422      INTEGER  ::   ji, jk
423      INTEGER  ::   ijt, iju
424
425      IF (PRESENT(cd_mpp)) THEN
426         ! only fill the overlap area and extra allows
427         ! this is in mpp case. In this module, just do nothing
428      ELSE
429      !                                                      ! ===============
430      DO jk = jpk, 1, -1                                     ! Horizontal slab
431         !                                                   ! ===============
432
433         !                                     ! North-South boundaries
434         !                                     ! ======================
435         SELECT CASE ( nperio )
436
437         CASE ( 2 )                            ! *  south symmetric
438
439            SELECT CASE ( cd_type )
440            CASE ( 'T' , 'U' , 'W' )                   ! T-, U-, W-points
441               pt3d(:,jpj,jk) = 0.e0
442               pt3d(:, 3 ,jk) = pt3d(:,3,jk) + pt3d(:,1,jk)
443               pt3d(:, 1 ,jk) = 0.e0
444            CASE ( 'V' , 'F' )                         ! V-, F-points
445               pt3d(:,jpj,jk) = 0.e0
446               pt3d(:, 2 ,jk) = pt3d(:,2,jk) + psgn * pt3d(:,1,jk)
447               pt3d(:, 1 ,jk) = 0.e0
448            END SELECT
449
450         CASE ( 3 , 4 )                        ! *  North fold  T-point pivot
451
452            SELECT CASE ( cd_type )
453            CASE ( 'T' , 'W' )                         ! T-, W-point
454               DO ji = jpi, jpi/2+1, -1
455                  ijt = jpi-ji+2
456                  pt3d(ijt,jpjm1,jk) =        pt3d(ijt,jpjm1,jk) &
457                     &               + psgn * pt3d(ji ,jpjm1,jk)
458                  pt3d(ji,jpjm1,jk) = 0.0e0
459               END DO
460               DO ji = jpi, 2, -1
461                  ijt = jpi-ji+2
462                  pt3d(ijt,jpj-2,jk) =        pt3d(ijt,jpj-2,jk) &
463                     &               + psgn * pt3d(ji ,jpj  ,jk)
464                  pt3d(ji, jpj ,jk) = 0.e0
465                  pt3d(ji,  1  ,jk) = 0.e0
466               END DO
467            CASE ( 'U' )                               ! U-point
468               DO ji = jpi-1, jpi/2, -1
469                  iju = jpi-ji+1
470                  pt3d(iju,jpjm1,jk) =        pt3d(iju,jpjm1,jk) &
471                     &               + psgn * pt3d(ji ,jpjm1,jk)
472                  pt3d(ji ,jpjm1,jk) = 0.0e0
473               END DO
474               DO ji = jpi-1, 1, -1
475                  iju = jpi-ji+1
476                  pt3d(iju,jpj-2,jk) =         pt3d(iju,jpj-2,jk) &
477                     &               +  psgn * pt3d(ji ,jpj  ,jk)
478                  pt3d(ji ,jpj  ,jk) = 0.e0
479                  pt3d(ji , 1   ,jk) = 0.e0
480               END DO
481            CASE ( 'V' )                               ! V-point
482                  DO ji = jpi, 2, -1
483                     ijt = jpi-ji+2
484                     pt3d(ijt,jpj-3,jk) =        pt3d(ijt,jpj-3,jk) & 
485                        &               + psgn * pt3d(ji ,jpj  ,jk)
486                     pt3d(ji ,jpj  ,jk) = 0.e0
487                     pt3d(ijt,jpj-2,jk) =        pt3d(ijt,jpj-2,jk) &
488                        &               + psgn * pt3d(ji, jpj-1,jk)
489                     pt3d(ji ,jpj-1,jk) = 0.e0
490                     pt3d(ji , 1   ,jk) = 0.e0
491                  END DO
492            CASE ( 'F' )                               ! F-point
493                  DO ji = jpi-1, 1, -1
494                     iju = jpi-ji+1
495                     pt3d(iju,jpj-3,jk) =        pt3d(iju,jpj-3,jk) &
496                        &               + psgn * pt3d(ji ,jpj  ,jk)
497                     pt3d(ji ,jpj  ,jk) = 0.e0
498                     pt3d(iju,jpj-2,jk) =        pt3d(iju,jpj-2,jk) &
499                        &               + psgn * pt3d(ji ,jpj-1,jk) 
500                     pt3d(ji ,jpj-1,jk) = 0.e0
501                  END DO
502            END SELECT
503
504            pt3d(jpi,jpj,jk) = 0.e0
505            pt3d( 1 ,jpj,jk) = 0.e0
506
507         CASE ( 5 , 6 )                        ! *  North fold  F-point pivot
508
509
510            SELECT CASE ( cd_type )
511            CASE ( 'T' , 'W' )                         ! T-, W-point
512               DO ji = jpi, 1, -1
513                  ijt = jpi-ji+1
514                  pt3d(ijt,jpj-1,jk) =        pt3d(ijt,jpj-1,jk) &
515                     &               + psgn * pt3d(ji ,jpj  ,jk) 
516                  pt3d(ji ,jpj  ,jk) = 0.e0
517                  pt3d(ji , 1   ,jk) = 0.e0
518               END DO
519            CASE ( 'U' )                               ! U-point
520                  DO ji = jpi-1, 1, -1
521                     iju = jpi-ji
522                     pt3d(iju,jpj-1,jk) =        pt3d(iju,jpj-1,jk) &
523                        &               + psgn * pt3d(ji ,jpj,jk) 
524                     pt3d(ji ,jpj  ,jk) = 0.e0
525                     pt3d(ji , 1   ,jk) = 0.e0
526                  END DO
527            CASE ( 'V' )                               ! V-point
528                  DO ji = jpi, jpi/2+1, -1
529                     ijt = jpi-ji+1
530                     pt3d(ijt,jpjm1,jk) =         pt3d(ijt,jpjm1,jk) &
531                        &               +  psgn * pt3d(ji ,jpjm1,jk)
532                     pt3d(ji ,jpjm1,jk) = 0.e0
533                  END DO
534                  DO ji = jpi, 1, -1
535                     ijt = jpi-ji+1
536                     pt3d(ijt,jpj-2,jk) =        pt3d(ijt,jpj-2,jk)&
537                        &               + psgn * pt3d(ji ,jpj  ,jk)
538                     pt3d(ji ,jpj  ,jk) = 0.e0
539                     pt3d(ji , 1   ,jk) = 0.e0
540                  END DO
541            CASE ( 'F' )                               ! F-point
542                  DO ji = jpi-1, jpi/2+1, -1
543                     iju = jpi-ji
544                     pt3d(iju,jpjm1,jk) =        pt3d(iju,jpjm1,jk) &
545                        &               + psgn * pt3d(ji ,jpjm1,jk)
546                     pt3d(ji ,jpjm1,jk) = 0.e0
547                  END DO
548                  DO ji = jpi-1, 1, -1
549                     iju = jpi-ji
550                     pt3d(iju,jpj-2,jk) =        pt3d(iju,jpj-2,jk) &
551                        &               + psgn * pt3d(ji ,jpj  ,jk)
552
553                     pt3d(ji ,jpj  ,jk) = 0.e0
554                  END DO
555            END SELECT
556
557            pt3d(jpi,jpj,jk) = 0.e0
558            pt3d( 1 ,jpj,jk) = 0.e0
559
560
561         CASE DEFAULT                          ! *  closed
562
563            SELECT CASE ( cd_type )
564            CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points
565               pt3d(:,jpj,jk) = 0.e0
566               pt3d(:, 1 ,jk) = 0.e0
567            CASE ( 'F' )                               ! F-point
568               pt3d(:,jpj,jk) = 0.e0
569            END SELECT
570
571         END SELECT
572
573         !                                     ! East-West boundaries
574         !                                     ! ====================
575         SELECT CASE ( nperio )
576
577         CASE ( 1 , 4 , 6 )                    ! * cyclic east-west
578                                               ! all points
579            pt3d(  2  ,:,jk) = pt3d(  2  ,:,jk) &
580               &             + pt3d( jpi ,:,jk)
581            pt3d( jpi ,:,jk) = 0.0e0
582            pt3d(jpim1,:,jk) = pt3d(jpim1,:,jk) &
583               &             + pt3d( 1 ,:,jk)
584            pt3d(  1  ,:,jk) = 0.0e0         
585
586         CASE DEFAULT                          ! * closed
587            SELECT CASE ( cd_type )
588            CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points
589               pt3d(jpi,:,jk) = 0.e0
590               pt3d( 1 ,:,jk) = 0.e0
591            CASE ( 'F' )                               ! F-point
592               pt3d(jpi,:,jk) = 0.e0
593            END SELECT
594
595         END SELECT
596
597
598         !                                                   ! ===============
599      END DO                                                 !   End of slab
600      !                                                      ! ===============
601      ENDIF
602
603   END SUBROUTINE lbc_lnk_3d_adj
604
605   SUBROUTINE lbc_lnk_2d_adj( pt2d, cd_type, psgn, cd_mpp )
606      !!---------------------------------------------------------------------
607      !!                 ***  ROUTINE lbc_lnkadj_2d  ***
608      !!
609      !! ** Purpose : Adjoint of set lateral boundary conditions (non mpp case)
610      !!
611      !! ** Method  :
612      !!
613      !! History :
614      !!        !  07-08  (K. Mogensen) Original code
615      !!----------------------------------------------------------------------
616      !! * Arguments
617      CHARACTER(len=1), INTENT( in ) ::   &
618         cd_type       ! nature of pt2d grid-point
619         !             !   = T , U , V , F or W  gridpoints
620         !             !   = I sea-ice U-V gridpoint (= F ocean grid point with indice shift)
621      REAL(wp), INTENT( in ) ::   &
622         psgn          ! control of the sign change
623         !             !   =-1 , the sign is modified following the type of b.c. used
624         !             !   = 1 , no sign change
625      REAL(wp), DIMENSION(jpi,jpj), INTENT( inout ) ::   &
626         pt2d          ! 2D array on which the boundary condition is applied
627      CHARACTER(len=3), INTENT( in ), OPTIONAL ::    &
628         cd_mpp        ! fill the overlap area only (here do nothing)
629      !! * Local declarations
630      INTEGER  ::   ji
631      INTEGER  ::   ijt, iju
632     
633      IF (PRESENT(cd_mpp)) THEN
634         ! only fill the overlap area and extra allows
635         ! this is in mpp case. In this module, just do nothing
636      ELSE
637
638      !                                     ! North-South boundaries
639      !                                     ! ======================
640      SELECT CASE ( nperio )
641
642      CASE ( 2 )                            ! *  south symmetric
643         
644         SELECT CASE ( cd_type )
645         CASE ( 'T' , 'U' , 'W' )                   ! T-, U-, W-points
646            pt2d(:,jpj) = 0.e0
647            pt2d(:, 3 ) = pt2d(:,3) + pt2d(:,1)
648            pt2d(:, 1 ) = 0.e0
649         CASE ( 'V' , 'F' )                         ! V-, F-points
650            pt2d(:,jpj) = 0.e0
651            pt2d(:, 2 ) = pt2d(:,2) + psgn * pt2d(:,1)
652            pt2d(:, 1 ) = 0.e0
653         END SELECT
654         
655      CASE ( 3 , 4 )                        ! *  North fold  T-point pivot
656         
657         SELECT CASE ( cd_type )
658         CASE ( 'T' , 'W' )                         ! T-, W-point
659            DO ji = jpi, jpi/2+1, -1
660               ijt = jpi-ji+2
661               pt2d(ijt,jpjm1) =        pt2d(ijt,jpjm1) &
662                  &               + psgn * pt2d(ji ,jpjm1)
663               pt2d(ji,jpjm1) = 0.0e0
664            END DO
665            DO ji = jpi, 2, -1
666               ijt = jpi-ji+2
667               pt2d(ijt,jpj-2) =        pt2d(ijt,jpj-2) &
668                  &              + psgn * pt2d(ji ,jpj  )
669               pt2d(ji, jpj ) = 0.e0
670               pt2d(ji,  1  ) = 0.e0
671            END DO
672         CASE ( 'U' )                               ! U-point
673            DO ji = jpi-1, jpi/2, -1
674               iju = jpi-ji+1
675               pt2d(iju,jpjm1) =        pt2d(iju,jpjm1) &
676                  &               + psgn * pt2d(ji ,jpjm1)
677               pt2d(ji ,jpjm1) = 0.0e0
678            END DO
679            DO ji = jpi-1, 1, -1
680               iju = jpi-ji+1
681               pt2d(iju,jpj-2) =         pt2d(iju,jpj-2) &
682                  &               +  psgn * pt2d(ji ,jpj  )
683               pt2d(ji ,jpj  ) = 0.e0
684               pt2d(ji , 1   ) = 0.e0
685            END DO
686         CASE ( 'V' )                               ! V-point
687            DO ji = jpi, 2, -1
688               ijt = jpi-ji+2
689               pt2d(ijt,jpj-3) =        pt2d(ijt,jpj-3) & 
690                  &               + psgn * pt2d(ji ,jpj  )
691               pt2d(ji ,jpj  ) = 0.e0
692               pt2d(ijt,jpj-2) =        pt2d(ijt,jpj-2) &
693                  &               + psgn * pt2d(ji, jpj-1)
694               pt2d(ji ,jpj-1) = 0.e0
695               pt2d(ji , 1   ) = 0.e0
696            END DO
697         CASE ( 'F' )                               ! F-point
698            DO ji = jpi-1, 1, -1
699               iju = jpi-ji+1
700               pt2d(iju,jpj-3) =        pt2d(iju,jpj-3) &
701                  &               + psgn * pt2d(ji ,jpj  )
702               pt2d(ji ,jpj  ) = 0.e0
703               pt2d(iju,jpj-2) =        pt2d(iju,jpj-2) &
704                  &               + psgn * pt2d(ji ,jpj-1) 
705               pt2d(ji ,jpj-1) = 0.e0
706            END DO
707         END SELECT
708         
709         pt2d(jpi,jpj) = 0.e0
710         pt2d( 1 ,jpj) = 0.e0
711         pt2d( 1 , 1 ) = 0.e0   ! Is this a bug?
712         
713      CASE ( 5 , 6 )                        ! *  North fold  F-point pivot
714         
715         
716         SELECT CASE ( cd_type )
717         CASE ( 'T' , 'W' )                         ! T-, W-point
718            DO ji = jpi, 1, -1
719               ijt = jpi-ji+1
720               pt2d(ijt,jpj-1) =        pt2d(ijt,jpj-1) &
721                  &               + psgn * pt2d(ji ,jpj  ) 
722               pt2d(ji ,jpj  ) = 0.e0
723               pt2d(ji , 1   ) = 0.e0
724            END DO
725         CASE ( 'U' )                               ! U-point
726            DO ji = jpi-1, 1, -1
727               iju = jpi-ji
728               pt2d(iju,jpj-1) =        pt2d(iju,jpj-1) &
729                  &               + psgn * pt2d(ji ,jpj  ) 
730               pt2d(ji ,jpj  ) = 0.e0
731               pt2d(ji , 1   ) = 0.e0
732            END DO
733         CASE ( 'V' )                               ! V-point
734            DO ji = jpi, jpi/2+1, -1
735               ijt = jpi-ji+1
736               pt2d(ijt,jpjm1) =         pt2d(ijt,jpjm1) &
737                  &               +  psgn * pt2d(ji ,jpjm1)
738               pt2d(ji ,jpjm1) = 0.e0
739            END DO
740            DO ji = jpi, 1, -1
741               ijt = jpi-ji+1
742               pt2d(ijt,jpj-2) =           pt2d(ijt,jpj-2) &
743                  &               + psgn * pt2d(ji ,jpj  )
744               pt2d(ji ,jpj  ) = 0.e0
745               pt2d(ji , 1   ) = 0.e0
746            END DO
747         CASE ( 'F' )                               ! F-point
748            DO ji = jpi-1, jpi/2+1, -1
749               iju = jpi-ji
750               pt2d(iju,jpjm1) =        pt2d(iju,jpjm1) &
751                  &               + psgn * pt2d(ji ,jpjm1)
752               pt2d(ji ,jpjm1) = 0.e0
753            END DO
754            DO ji = jpi-1, 1, -1
755               iju = jpi-ji
756               pt2d(iju,jpj-2) =        pt2d(iju,jpj-2) &
757                  &               + psgn * pt2d(ji ,jpj  )
758               
759               pt2d(ji ,jpj  ) = 0.e0
760            END DO
761         END SELECT
762         
763         pt2d(jpi,jpj) = 0.e0
764         pt2d( 1 ,jpj) = 0.e0
765         pt2d( 1 , 1 ) = 0.e0   ! Is this a bug?
766         
767      CASE DEFAULT                          ! *  closed
768         
769         SELECT CASE ( cd_type )
770         CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points
771            pt2d(:,jpj) = 0.e0
772            pt2d(:, 1 ) = 0.e0
773         CASE ( 'F' )                               ! F-point
774            pt2d(:,jpj) = 0.e0
775         END SELECT
776         
777      END SELECT
778
779      !                                     ! East-West boundaries
780      !                                     ! ====================
781      SELECT CASE ( nperio )
782         
783      CASE ( 1 , 4 , 6 )                    ! * cyclic east-west
784         ! all points
785         pt2d(  2  ,:) = pt2d(  2  ,:) &
786            &          + pt2d( jpi ,:)
787         pt2d( jpi ,:) = 0.0e0
788         pt2d(jpim1,:) = pt2d(jpim1,:) &
789            &          + pt2d( 1 ,:)
790         pt2d(  1  ,:) = 0.0e0         
791           
792      CASE DEFAULT                          ! * closed
793         SELECT CASE ( cd_type )
794         CASE ( 'T' , 'U' , 'V' , 'W' )             ! T-, U-, V-, W-points
795            pt2d(jpi,:) = 0.e0
796            pt2d( 1 ,:) = 0.e0
797         CASE ( 'F' )                               ! F-point
798            pt2d(jpi,:) = 0.e0
799         END SELECT
800         
801      END SELECT
802     
803      ENDIF
804     
805   END SUBROUTINE lbc_lnk_2d_adj
806
807#endif
808
809END MODULE lbclnk_tam
Note: See TracBrowser for help on using the repository browser.