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.
dynldf_bilap_tam.F90 in branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN – NEMO

source: branches/TAM_V3_0/NEMOTAM/OPATAM_SRC/DYN/dynldf_bilap_tam.F90 @ 2587

Last change on this file since 2587 was 2587, checked in by vidard, 13 years ago

refer to ticket #798

File size: 21.4 KB
Line 
1MODULE dynldf_bilap_tam
2#ifdef key_tam
3   !!===========================================================================
4   !!                       ***  MODULE  dynldf_bilap_tam  ***
5   !! Ocean dynamics:  lateral viscosity trend
6   !!                  Tangent and Adjoint Module
7   !!===========================================================================
8
9   !!---------------------------------------------------------------------------
10   !!   dyn_ldf_bilap_tan : update the momentum trend with the lateral diffusion
11   !!                       using an iso-level bilaplacian operator (tangent)
12   !!   dyn_ldf_bilap_adj : update the momentum trend with the lateral diffusion
13   !!                       using an iso-level bilaplacian operator (adjoint)
14   !!---------------------------------------------------------------------------
15   !! * Modules used
16   USE par_kind      , ONLY: & ! Precision variables
17      & wp
18   USE lbclnk        , ONLY: & ! Boundary/halo exchange
19      & lbc_lnk
20   USE lbclnk_tam    , ONLY: & ! Boundary/halo exchange (adjoint)
21      & lbc_lnk_adj
22   USE par_oce       , ONLY: & ! Ocean space and time domain variables
23      & jpi,                 &
24      & jpj,                 &
25      & jpk,                 &
26      & jpim1,               &
27      & jpjm1,               &
28      & jpkm1
29   USE oce_tam       , ONLY: &
30      & ua_tl,               &
31      & va_tl,               &
32      & ua_ad,               &
33      & va_ad,               &
34      & rotb_tl,             &
35      & hdivb_tl,            &
36      & rotb_ad,             &
37      & hdivb_ad
38   USE ldfdyn_oce    , ONLY: & ! ocean dynamics: lateral physics
39      & ahm3,                &
40      & ahm4,                &
41      & ahm0   
42   USE dom_oce       , ONLY: & ! Ocean space and time domain
43      & ln_sco,              &
44      & ln_zps,              &
45      & fmask,               &
46      & e1u,                 &
47      & e2u,                 &
48      & e1v,                 &
49      & e2v,                 &
50      & e1t,                 &
51      & e2t,                 &
52      & e1f,                 &
53      & e2f,                 &
54#if defined key_zco
55      & e3t_0
56#else
57      & e3u,                 &
58      & e3v,                 &
59      & e3t,                 &
60      & e3f
61#endif
62   USE in_out_manager, ONLY: & ! I/O manager
63      & lwp,                 &
64      & numout,              & 
65      & nit000,              & 
66      & nitend
67
68   IMPLICIT NONE
69   PRIVATE
70
71   !! * Routine accessibility
72   PUBLIC dyn_ldf_bilap_tan  ! called by dynldf_tam.F90
73   PUBLIC dyn_ldf_bilap_adj  ! called by dynldf_tam.F90
74
75   !! * Substitutions
76#  include "domzgr_substitute.h90"
77#  include "ldfdyn_substitute.h90"
78#  include "vectopt_loop_substitute.h90"
79   !!----------------------------------------------------------------------
80
81CONTAINS
82
83   SUBROUTINE dyn_ldf_bilap_tan( kt )
84      !!----------------------------------------------------------------------
85      !!                     ***  ROUTINE dyn_ldf_bilap_tan  ***
86      !!
87      !! ** Purpose :   Compute the before trend of the lateral momentum
88      !!      diffusion and add it to the general trend of momentum equation.
89      !!
90      !! ** Method  :   The before horizontal momentum diffusion trend is a
91      !!      bi-harmonic operator (bilaplacian type) which separates the
92      !!      divergent and rotational parts of the flow.
93      !!      Its horizontal components are computed as follow:
94      !!      laplacian:
95      !!          zlu = 1/e1u di[ hdivb ] - 1/(e2u*e3u) dj-1[ e3f rotb ]
96      !!          zlv = 1/e2v dj[ hdivb ] + 1/(e1v*e3v) di-1[ e3f rotb ]
97      !!      third derivative:
98      !!       * multiply by the eddy viscosity coef. at u-, v-point, resp.
99      !!          zlu = ahmu * zlu
100      !!          zlv = ahmv * zlv
101      !!       * curl and divergence of the laplacian
102      !!          zuf = 1/(e1f*e2f) ( di[e2v zlv] - dj[e1u zlu] )
103      !!          zut = 1/(e1t*e2t*e3t) ( di[e2u*e3u zlu] + dj[e1v*e3v zlv] )
104      !!      bilaplacian:
105      !!              diffu = 1/e1u di[ zut ] - 1/(e2u*e3u) dj-1[ e3f zuf ]
106      !!              diffv = 1/e2v dj[ zut ] + 1/(e1v*e3v) di-1[ e3f zuf ]
107      !!      If ln_sco=F and ln_zps=F, the vertical scale factors in the
108      !!      rotational part of the diffusion are simplified
109      !!      Add this before trend to the general trend (ua,va):
110      !!            (ua,va) = (ua,va) + (diffu,diffv)
111      !!      'key_trddyn' defined: the two components of the horizontal
112      !!                               diffusion trend are saved.
113      !!
114      !! ** Action : - Update (ua,va) with the before iso-level biharmonic
115      !!               mixing trend.
116      !!
117      !! History :
118      !!        !  90-09  (G. Madec)  Original code
119      !!        !  91-11  (G. Madec)
120      !!        !  93-03  (M. Guyon)  symetrical conditions (M. Guyon)
121      !!        !  96-01  (G. Madec)  statement function for e3
122      !!        !  97-07  (G. Madec)  lbc calls
123      !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
124      !!   9.0  !  04-08  (C. Talandier) New trends organization
125      !! History of the tangent routine
126      !!   9.0  !  09-12 (F. Vigilant) tangent of 9.0
127      !!----------------------------------------------------------------------
128      !! * Arguments
129      INTEGER, INTENT( in ) ::   kt           ! ocean time-step index
130      !! * Local declarations
131      INTEGER  ::   ji, jj, jk                ! dummy loop indices
132      REAL(wp) ::   &
133         zuatl, zvatl, zbt, ze2u, ze2v        ! temporary scalars
134      REAL(wp), DIMENSION(jpi,jpj) ::       &
135         zcutl, zcvtl                         ! temporary workspace
136      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
137         zuftl, zuttl, zlutl, zlvtl           ! temporary workspace
138      !!----------------------------------------------------------------------
139
140      IF( kt == nit000 ) THEN
141         IF(lwp) WRITE(numout,*)
142         IF(lwp) WRITE(numout,*) 'dyn_ldf_bilap_tan: iso-level bilaplacien operator'
143         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~ '
144      ENDIF
145
146      zuftl(:,:,:) = 0.0_wp
147      zuttl(:,:,:) = 0.0_wp
148      zlutl(:,:,:) = 0.0_wp
149      zlvtl(:,:,:) = 0.0_wp
150      !                                                ! ===============
151      DO jk = 1, jpkm1                                 ! Horizontal slab
152         !                                             ! ===============
153         ! Laplacian
154         ! ---------
155
156         IF( ln_sco .OR. ln_zps ) THEN   ! s-coordinate or z-coordinate with partial steps
157            zuftl(:,:,jk) = rotb_tl(:,:,jk) * fse3f(:,:,jk)
158            DO jj = 2, jpjm1
159               DO ji = fs_2, fs_jpim1   ! vector opt.
160                  zlutl(ji,jj,jk) = - ( zuftl(ji,jj,jk) - zuftl(ji,jj-1,jk) ) / ( e2u(ji,jj) * fse3u(ji,jj,jk) )   &
161                     &         + ( hdivb_tl(ji+1,jj,jk) - hdivb_tl(ji,jj,jk) ) / e1u(ji,jj)
162   
163                  zlvtl(ji,jj,jk) = + ( zuftl(ji,jj,jk) - zuftl(ji-1,jj,jk) ) / ( e1v(ji,jj) * fse3v(ji,jj,jk) )   &
164                     &         + ( hdivb_tl(ji,jj+1,jk) - hdivb_tl(ji,jj,jk) ) / e2v(ji,jj)
165               END DO
166            END DO
167         ELSE                            ! z-coordinate - full step
168            DO jj = 2, jpjm1
169               DO ji = fs_2, fs_jpim1   ! vector opt.
170                  zlutl(ji,jj,jk) = - ( rotb_tl (ji  ,jj,jk) - rotb_tl (ji,jj-1,jk) ) / e2u(ji,jj)   &
171                     &         + ( hdivb_tl(ji+1,jj,jk) - hdivb_tl(ji,jj  ,jk) ) / e1u(ji,jj)
172   
173                  zlvtl(ji,jj,jk) = + ( rotb_tl (ji,jj  ,jk) - rotb_tl (ji-1,jj,jk) ) / e1v(ji,jj)   &
174                     &         + ( hdivb_tl(ji,jj+1,jk) - hdivb_tl(ji  ,jj,jk) ) / e2v(ji,jj)
175               END DO 
176            END DO 
177         ENDIF
178      ENDDO
179
180      ! Boundary conditions on the laplacian  (zlu,zlv)
181      CALL lbc_lnk( zlutl, 'U', -1.0_wp )
182      CALL lbc_lnk( zlvtl, 'V', -1.0_wp )
183
184      DO jk = 1, jpkm1
185   
186         ! Third derivative
187         ! ----------------
188         
189         ! Multiply by the eddy viscosity coef. (at u- and v-points)
190         zlutl(:,:,jk) = zlutl(:,:,jk) * fsahmu(:,:,jk)
191         zlvtl(:,:,jk) = zlvtl(:,:,jk) * fsahmv(:,:,jk)
192         
193         ! Contravariant "laplacian"
194         zcutl(:,:) = e1u(:,:) * zlutl(:,:,jk)
195         zcvtl(:,:) = e2v(:,:) * zlvtl(:,:,jk)
196         
197         ! Laplacian curl ( * e3f if s-coordinates or z-coordinate with partial steps)
198         DO jj = 1, jpjm1
199            DO ji = 1, fs_jpim1   ! vector opt.
200               zuftl(ji,jj,jk) = fmask(ji,jj,jk) * (  zcvtl(ji+1,jj  ) - zcvtl(ji,jj)      &
201                  &                            - zcutl(ji  ,jj+1) + zcutl(ji,jj)  )   &
202#if defined key_zco
203                  &                         / ( e1f(ji,jj)*e2f(ji,jj) )
204#else
205                  &       * fse3f(ji,jj,jk) / ( e1f(ji,jj)*e2f(ji,jj) )
206#endif
207            END DO 
208         END DO
209
210         ! Laplacian Horizontal fluxes
211         DO jj = 1, jpjm1
212            DO ji = 1, fs_jpim1   ! vector opt.
213#if defined key_zco
214               zlutl(ji,jj,jk) = e2u(ji,jj) * zlutl(ji,jj,jk)
215               zlvtl(ji,jj,jk) = e1v(ji,jj) * zlvtl(ji,jj,jk)
216#else
217               zlutl(ji,jj,jk) = e2u(ji,jj) * fse3u(ji,jj,jk) * zlutl(ji,jj,jk)
218               zlvtl(ji,jj,jk) = e1v(ji,jj) * fse3v(ji,jj,jk) * zlvtl(ji,jj,jk)
219#endif
220            END DO
221         END DO
222
223         ! Laplacian divergence
224         DO jj = 2, jpj
225            DO ji = fs_2, jpi   ! vector opt.
226#if defined key_zco
227               zbt = e1t(ji,jj) * e2t(ji,jj)
228#else
229               zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk)
230#endif
231               zuttl(ji,jj,jk) = (  zlutl(ji,jj,jk) - zlutl(ji-1,jj  ,jk)   &
232                  &             + zlvtl(ji,jj,jk) - zlvtl(ji  ,jj-1,jk) ) / zbt
233            END DO
234         END DO
235      END DO
236
237      ! boundary conditions on the laplacian curl and div (zuf,zut)
238!!bug gm no need to do this 2 following lbc...
239      CALL lbc_lnk( zuftl, 'F', 1.0_wp )
240      CALL lbc_lnk( zuttl, 'T', 1.0_wp )
241
242      DO jk = 1, jpkm1     
243   
244         ! Bilaplacian
245         ! -----------
246
247         DO jj = 2, jpjm1
248            DO ji = fs_2, fs_jpim1   ! vector opt.
249#if defined key_zco
250               ze2u = e2u(ji,jj)
251               ze2v = e1v(ji,jj)
252#else
253               ze2u = e2u(ji,jj) * fse3u(ji,jj,jk)
254               ze2v = e1v(ji,jj) * fse3v(ji,jj,jk)
255#endif
256               ! horizontal biharmonic diffusive trends
257               zuatl = - ( zuftl(ji  ,jj,jk) - zuftl(ji,jj-1,jk) ) / ze2u   &
258                  &  + ( zuttl(ji+1,jj,jk) - zuttl(ji,jj  ,jk) ) / e1u(ji,jj)
259
260               zvatl = + ( zuftl(ji,jj  ,jk) - zuftl(ji-1,jj,jk) ) / ze2v   &
261                  &  + ( zuttl(ji,jj+1,jk) - zuttl(ji  ,jj,jk) ) / e2v(ji,jj)
262               ! add it to the general momentum trends
263               ua_tl(ji,jj,jk) = ua_tl(ji,jj,jk) + zuatl
264               va_tl(ji,jj,jk) = va_tl(ji,jj,jk) + zvatl
265            END DO
266         END DO
267
268         !                                             ! ===============
269      END DO                                           !   End of slab
270      !                                                ! ===============
271
272   END SUBROUTINE dyn_ldf_bilap_tan
273
274
275   SUBROUTINE dyn_ldf_bilap_adj( kt )
276      !!----------------------------------------------------------------------
277      !!                     ***  ROUTINE dyn_ldf_bilap_adj  ***
278      !!
279      !! ** Purpose :   Compute the before trend of the lateral momentum
280      !!      diffusion and add it to the general trend of momentum equation.
281      !!
282      !! ** Method  :   The before horizontal momentum diffusion trend is a
283      !!      bi-harmonic operator (bilaplacian type) which separates the
284      !!      divergent and rotational parts of the flow.
285      !!      Its horizontal components are computed as follow:
286      !!      laplacian:
287      !!          zlu = 1/e1u di[ hdivb ] - 1/(e2u*e3u) dj-1[ e3f rotb ]
288      !!          zlv = 1/e2v dj[ hdivb ] + 1/(e1v*e3v) di-1[ e3f rotb ]
289      !!      third derivative:
290      !!       * multiply by the eddy viscosity coef. at u-, v-point, resp.
291      !!          zlu = ahmu * zlu
292      !!          zlv = ahmv * zlv
293      !!       * curl and divergence of the laplacian
294      !!          zuf = 1/(e1f*e2f) ( di[e2v zlv] - dj[e1u zlu] )
295      !!          zut = 1/(e1t*e2t*e3t) ( di[e2u*e3u zlu] + dj[e1v*e3v zlv] )
296      !!      bilaplacian:
297      !!              diffu = 1/e1u di[ zut ] - 1/(e2u*e3u) dj-1[ e3f zuf ]
298      !!              diffv = 1/e2v dj[ zut ] + 1/(e1v*e3v) di-1[ e3f zuf ]
299      !!      If ln_sco=F and ln_zps=F, the vertical scale factors in the
300      !!      rotational part of the diffusion are simplified
301      !!      Add this before trend to the general trend (ua,va):
302      !!            (ua,va) = (ua,va) + (diffu,diffv)
303      !!      'key_trddyn' defined: the two components of the horizontal
304      !!                               diffusion trend are saved.
305      !!
306      !! ** Action : - Update (ua,va) with the before iso-level biharmonic
307      !!               mixing trend.
308      !!
309      !! History :
310      !!        !  90-09  (G. Madec)  Original code
311      !!        !  91-11  (G. Madec)
312      !!        !  93-03  (M. Guyon)  symetrical conditions (M. Guyon)
313      !!        !  96-01  (G. Madec)  statement function for e3
314      !!        !  97-07  (G. Madec)  lbc calls
315      !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
316      !!   9.0  !  04-08  (C. Talandier) New trends organization
317      !! History of the adjoint routine
318      !!   9.0  !  09-12 (F. Vigilant) adjoint of 9.0
319      !!----------------------------------------------------------------------
320      !! * Arguments
321      INTEGER, INTENT( in ) ::   kt       ! ocean time-step index
322      !! * Local declarations
323      INTEGER  ::   ji, jj, jk            ! dummy loop indices
324      REAL(wp) ::   &
325         zuaad, zvaad, zbt, ze2u, ze2v        ! temporary scalars
326      REAL(wp), DIMENSION(jpi,jpj) ::       &
327         zcuad, zcvad                         ! temporary workspace
328      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
329         zufad, zutad, zluad, zlvad           ! temporary workspace
330      !!----------------------------------------------------------------------
331
332      IF( kt == nitend ) THEN
333         IF(lwp) WRITE(numout,*)
334         IF(lwp) WRITE(numout,*) 'dyn_ldf_bilap_adj: bilaplacien operator'
335         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~~~~~~ '
336      ENDIF
337
338      zuaad = 0.0_wp
339      zvaad = 0.0_wp
340
341      zufad(:,:,:) = 0.0_wp
342      zutad(:,:,:) = 0.0_wp
343      zluad(:,:,:) = 0.0_wp
344      zlvad(:,:,:) = 0.0_wp
345
346      zcvad(:,:) = 0.0_wp
347      zcuad(:,:) = 0.0_wp
348
349      DO jk = 1, jpkm1     
350   
351         ! Bilaplacian
352         ! -----------
353
354         DO jj = jpjm1, 2, -1
355            DO ji = fs_jpim1, fs_2, -1   ! vector opt.
356#if defined key_zco
357               ze2u = e2u(ji,jj)
358               ze2v = e1v(ji,jj)
359#else
360               ze2u = e2u(ji,jj) * fse3u(ji,jj,jk)
361               ze2v = e1v(ji,jj) * fse3v(ji,jj,jk)
362#endif
363               ! add it to the general momentum trends
364               zvaad = zvaad + va_ad(ji,jj,jk) 
365               zuaad = zuaad + ua_ad(ji,jj,jk)
366
367               ! horizontal biharmonic diffusive trends
368               zufad(ji  ,jj  ,jk) = zufad(ji  ,jj  ,jk) + zvaad / ze2v
369               zufad(ji-1,jj  ,jk) = zufad(ji-1,jj  ,jk) - zvaad / ze2v
370               zutad(ji  ,jj  ,jk) = zutad(ji  ,jj  ,jk) - zvaad / e2v(ji,jj)
371               zutad(ji  ,jj+1,jk) = zutad(ji  ,jj+1,jk) + zvaad / e2v(ji,jj)
372
373               zufad(ji  ,jj  ,jk) = zufad(ji  ,jj  ,jk) - zuaad / ze2u
374               zufad(ji  ,jj-1,jk) = zufad(ji  ,jj-1,jk) + zuaad / ze2u
375               zutad(ji  ,jj  ,jk) = zutad(ji  ,jj  ,jk) - zuaad / e1u(ji,jj)
376               zutad(ji+1,jj  ,jk) = zutad(ji+1,jj  ,jk) + zuaad / e1u(ji,jj)
377
378               zuaad = 0.0_wp
379               zvaad = 0.0_wp
380            END DO
381         END DO
382
383         !                                             ! ===============
384      END DO                                           !   End of slab
385      !                                                ! ===============
386
387      ! boundary conditions on the laplacian curl and div (zuf,zut)
388!!bug gm no need to do this 2 following lbc...
389      CALL lbc_lnk_adj( zutad, 'T', 1.0_wp )
390      CALL lbc_lnk_adj( zufad, 'F', 1.0_wp )
391
392      DO jk = 1, jpkm1
393   
394         ! Third derivative
395         ! ----------------
396
397         ! Laplacian divergence
398         DO jj = jpj, 2, -1
399            DO ji = jpi, fs_2, -1   ! vector opt.
400#if defined key_zco
401               zbt = e1t(ji,jj) * e2t(ji,jj)
402#else
403               zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk)
404#endif
405               zluad(ji  ,jj  ,jk) = zluad(ji  ,jj  ,jk) + zutad(ji,jj,jk) / zbt
406               zluad(ji-1,jj  ,jk) = zluad(ji-1,jj  ,jk) - zutad(ji,jj,jk) / zbt 
407               zlvad(ji  ,jj  ,jk) = zlvad(ji  ,jj  ,jk) + zutad(ji,jj,jk) / zbt
408               zlvad(ji  ,jj-1,jk) = zlvad(ji  ,jj-1,jk) - zutad(ji,jj,jk) / zbt     
409
410               zutad(ji,jj,jk) = 0.0_wp
411            END DO
412         END DO
413
414         ! Laplacian Horizontal fluxes
415         DO jj = jpjm1, 1, -1
416            DO ji = fs_jpim1, 1, -1   ! vector opt.
417#if defined key_zco
418               zluad(ji,jj,jk) = e2u(ji,jj) * zluad(ji,jj,jk)
419               zlvad(ji,jj,jk) = e1v(ji,jj) * zlvad(ji,jj,jk)
420#else
421               zluad(ji,jj,jk) = e2u(ji,jj) * fse3u(ji,jj,jk) * zluad(ji,jj,jk)
422               zlvad(ji,jj,jk) = e1v(ji,jj) * fse3v(ji,jj,jk) * zlvad(ji,jj,jk)
423#endif
424            END DO
425         END DO
426
427         ! Laplacian curl ( * e3f if s-coordinates or z-coordinate with partial steps)
428         DO jj = jpjm1, 1, -1
429            DO ji = fs_jpim1, 1, -1   ! vector opt.
430#if defined key_zco
431               zufad(ji,jj,jk) = fmask(ji,jj,jk) * zufad(ji,jj,jk) / ( e1f(ji,jj)*e2f(ji,jj) )
432#else
433               zufad(ji,jj,jk) = fmask(ji,jj,jk) * zufad(ji,jj,jk) * fse3f(ji,jj,jk) / ( e1f(ji,jj)*e2f(ji,jj) )
434#endif
435               zcvad(ji  ,jj  ) = zcvad(ji  ,jj  ) - zufad(ji,jj,jk)
436               zcvad(ji+1,jj  ) = zcvad(ji+1,jj  ) + zufad(ji,jj,jk)
437               zcuad(ji  ,jj  ) = zcuad(ji  ,jj  ) + zufad(ji,jj,jk)
438               zcuad(ji  ,jj+1) = zcuad(ji  ,jj+1) - zufad(ji,jj,jk)                 
439
440               zufad(ji,jj,jk) = 0.0_wp
441            END DO 
442         END DO
443
444         ! Contravariant "laplacian"
445         DO jj = 1, jpj
446            DO ji = 1, jpi 
447               zlvad(ji,jj,jk) = zlvad(ji,jj,jk) + e2v(ji,jj) * zcvad(ji,jj)
448               zluad(ji,jj,jk) = zluad(ji,jj,jk) + e1u(ji,jj) * zcuad(ji,jj)
449               zcvad(ji,jj) = 0.0_wp
450               zcuad(ji,jj) = 0.0_wp
451            END DO 
452         END DO
453         
454         ! Multiply by the eddy viscosity coef. (at u- and v-points)
455         zluad(:,:,jk) = zluad(:,:,jk) * fsahmu(:,:,jk)
456         zlvad(:,:,jk) = zlvad(:,:,jk) * fsahmv(:,:,jk)
457
458      END DO
459
460      ! Boundary conditions on the laplacian  (zlu,zlv)
461      CALL lbc_lnk_adj( zlvad, 'V', -1.0_wp )
462      CALL lbc_lnk_adj( zluad, 'U', -1.0_wp )
463
464       !                                                ! ===============
465      DO jk = 1, jpkm1                                 ! Horizontal slab
466         !                                             ! ===============
467         ! Laplacian
468         ! ---------
469
470         IF( ln_sco .OR. ln_zps ) THEN   ! s-coordinate or z-coordinate with partial steps
471            DO jj = jpjm1, 2, -1
472               DO ji = fs_jpim1, fs_2, -1   ! vector opt.
473                  zufad   (ji  ,jj  ,jk) = zufad   (ji  ,jj  ,jk) + zlvad(ji  ,jj  ,jk) / ( e1v(ji,jj) * fse3v(ji,jj,jk) ) 
474                  zufad   (ji-1,jj  ,jk) = zufad   (ji-1,jj  ,jk) - zlvad(ji  ,jj  ,jk) / ( e1v(ji,jj) * fse3v(ji,jj,jk) )                   
475                  hdivb_ad(ji  ,jj  ,jk) = hdivb_ad(ji  ,jj  ,jk) - zlvad(ji,jj,jk) / e2v(ji,jj)
476                  hdivb_ad(ji  ,jj+1,jk) = hdivb_ad(ji  ,jj+1,jk) + zlvad(ji,jj,jk) / e2v(ji,jj)
477                  zlvad(ji,jj,jk) = 0.0_wp
478
479                  zufad   (ji  ,jj  ,jk) = zufad   (ji  ,jj  ,jk) - zluad(ji  ,jj  ,jk) / ( e2u(ji,jj) * fse3u(ji,jj,jk) )
480                  zufad   (ji  ,jj-1,jk) = zufad   (ji  ,jj-1,jk) + zluad(ji  ,jj  ,jk) / ( e2u(ji,jj) * fse3u(ji,jj,jk) )
481                  hdivb_ad(ji  ,jj  ,jk) = hdivb_ad(ji  ,jj  ,jk) - zluad(ji,jj,jk) / e1u(ji,jj)
482                  hdivb_ad(ji+1,jj  ,jk) = hdivb_ad(ji+1,jj  ,jk) + zluad(ji,jj,jk) / e1u(ji,jj)
483                  zluad(ji,jj,jk) = 0.0_wp
484               END DO
485            END DO
486            rotb_ad(:,:,jk) = rotb_ad(:,:,jk) + zufad(:,:,jk) * fse3f(:,:,jk)
487         ELSE                            ! z-coordinate - full step
488            DO jj = jpjm1, 2, -1
489               DO ji = fs_jpim1, fs_2, -1   ! vector opt.
490                  rotb_ad (ji  ,jj  ,jk) = rotb_ad (ji  ,jj  ,jk) + zlvad(ji,jj,jk) / e1v(ji,jj)
491                  rotb_ad (ji-1,jj  ,jk) = rotb_ad (ji-1,jj  ,jk) - zlvad(ji,jj,jk) / e1v(ji,jj)
492                  hdivb_ad(ji  ,jj  ,jk) = hdivb_ad(ji  ,jj  ,jk) - zlvad(ji,jj,jk) / e2v(ji,jj)
493                  hdivb_ad(ji  ,jj+1,jk) = hdivb_ad(ji  ,jj+1,jk) + zlvad(ji,jj,jk) / e2v(ji,jj)
494                  zlvad(ji,jj,jk) = 0.0_wp
495
496                  rotb_ad (ji  ,jj  ,jk) = rotb_ad (ji  ,jj  ,jk) - zluad(ji,jj,jk) / e2u(ji,jj)
497                  rotb_ad (ji  ,jj-1,jk) = rotb_ad (ji  ,jj-1,jk) + zluad(ji,jj,jk) / e2u(ji,jj)
498                  hdivb_ad(ji  ,jj  ,jk) = hdivb_ad(ji  ,jj  ,jk) - zluad(ji,jj,jk) / e1u(ji,jj)
499                  hdivb_ad(ji+1,jj  ,jk) = hdivb_ad(ji+1,jj  ,jk) + zluad(ji,jj,jk) / e1u(ji,jj)
500                  zlvad(ji,jj,jk) = 0.0_wp
501               END DO 
502            END DO 
503         ENDIF
504      ENDDO
505
506   END SUBROUTINE dyn_ldf_bilap_adj
507
508   !!======================================================================
509#endif
510END MODULE dynldf_bilap_tam
Note: See TracBrowser for help on using the repository browser.