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.
dynzdf.F90 in NEMO/branches/UKMO/dev_r10037_GPU/src/OCE/DYN – NEMO

source: NEMO/branches/UKMO/dev_r10037_GPU/src/OCE/DYN/dynzdf.F90 @ 11467

Last change on this file since 11467 was 11467, checked in by andmirek, 5 years ago

Ticket #2197 allocate arrays at the beggining of the run

File size: 19.9 KB
Line 
1MODULE dynzdf
2   !!==============================================================================
3   !!                 ***  MODULE  dynzdf  ***
4   !! Ocean dynamics :  vertical component of the momentum mixing trend
5   !!==============================================================================
6   !! History :  1.0  !  2005-11  (G. Madec)  Original code
7   !!            3.3  !  2010-10  (C. Ethe, G. Madec) reorganisation of initialisation phase
8   !!            4.0  !  2017-06  (G. Madec) remove the explicit time-stepping option + avm at t-point
9   !!----------------------------------------------------------------------
10
11   !!----------------------------------------------------------------------
12   !!   dyn_zdf       : compute the after velocity through implicit calculation of vertical mixing
13   !!----------------------------------------------------------------------
14   USE oce            ! ocean dynamics and tracers variables
15   USE phycst         ! physical constants
16   USE dom_oce        ! ocean space and time domain variables
17   USE sbc_oce        ! surface boundary condition: ocean
18   USE zdf_oce        ! ocean vertical physics variables
19   USE zdfdrg         ! vertical physics: top/bottom drag coef.
20   USE dynadv    ,ONLY: ln_dynadv_vec    ! dynamics: advection form
21   USE dynldf_iso,ONLY: akzu, akzv       ! dynamics: vertical component of rotated lateral mixing
22   USE ldfdyn         ! lateral diffusion: eddy viscosity coef. and type of operator
23   USE trd_oce        ! trends: ocean variables
24   USE trddyn         ! trend manager: dynamics
25   !
26   USE in_out_manager ! I/O manager
27   USE lib_mpp        ! MPP library
28   USE prtctl         ! Print control
29   USE timing         ! Timing
30
31   IMPLICIT NONE
32   PRIVATE
33
34   PUBLIC   dyn_zdf   !  routine called by step.F90
35
36   REAL(wp) ::  r_vvl     ! non-linear free surface indicator: =0 if ln_linssh=T, =1 otherwise
37
38   !! * Substitutions
39#  include "vectopt_loop_substitute.h90"
40   !!----------------------------------------------------------------------
41   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
42   !! $Id$
43   !! Software governed by the CeCILL license (see ./LICENSE)
44   !!----------------------------------------------------------------------
45CONTAINS
46   
47   SUBROUTINE dyn_zdf( kt )
48      !!----------------------------------------------------------------------
49      !!                  ***  ROUTINE dyn_zdf  ***
50      !!
51      !! ** Purpose :   compute the trend due to the vert. momentum diffusion
52      !!              together with the Leap-Frog time stepping using an
53      !!              implicit scheme.
54      !!
55      !! ** Method  :  - Leap-Frog time stepping on all trends but the vertical mixing
56      !!         ua =         ub + 2*dt *       ua             vector form or linear free surf.
57      !!         ua = ( e3u_b*ub + 2*dt * e3u_n*ua ) / e3u_a   otherwise
58      !!               - update the after velocity with the implicit vertical mixing.
59      !!      This requires to solver the following system:
60      !!         ua = ua + 1/e3u_a dk+1[ mi(avm) / e3uw_a dk[ua] ]
61      !!      with the following surface/top/bottom boundary condition:
62      !!      surface: wind stress input (averaged over kt-1/2 & kt+1/2)
63      !!      top & bottom : top stress (iceshelf-ocean) & bottom stress (cf zdfdrg.F90)
64      !!
65      !! ** Action :   (ua,va)   after velocity
66      !!---------------------------------------------------------------------
67      USE scoce, ONLY : zwi => scr1, zwd => scr2, zws => scr3, &    ! 3D workspace
68                       ztrdu => scr3 , ztrdv => scr4
69      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
70      !
71      INTEGER  ::   ji, jj, jk         ! dummy loop indices
72      INTEGER  ::   iku, ikv           ! local integers
73      REAL(wp) ::   zzwi, ze3ua, zdt   ! local scalars
74      REAL(wp) ::   zzws, ze3va        !   -      -
75      !!---------------------------------------------------------------------
76      !
77      IF( ln_timing )   CALL timing_start('dyn_zdf')
78      !
79      IF( kt == nit000 ) THEN       !* initialization
80         IF(lwp) WRITE(numout,*)
81         IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator'
82         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
83         !
84         If( ln_linssh ) THEN   ;    r_vvl = 0._wp    ! non-linear free surface indicator
85         ELSE                   ;    r_vvl = 1._wp
86         ENDIF
87      ENDIF
88      !                             !* set time step
89      IF( neuler == 0 .AND. kt == nit000     ) THEN   ;   r2dt =      rdt   ! = rdt (restart with Euler time stepping)
90      ELSEIF(               kt <= nit000 + 1 ) THEN   ;   r2dt = 2. * rdt   ! = 2 rdt (leapfrog)
91      ENDIF
92      !
93      !                             !* explicit top/bottom drag case
94      IF( .NOT.ln_drgimp )   CALL zdf_drg_exp( kt, ub, vb, ua, va )  ! add top/bottom friction trend to (ua,va)
95      !
96      !
97      IF( l_trddyn )   THEN         !* temporary save of ta and sa trends
98         ztrdu(:,:,:) = ua(:,:,:)
99         ztrdv(:,:,:) = va(:,:,:)
100      ENDIF
101      !
102      !              !==  RHS: Leap-Frog time stepping on all trends but the vertical mixing  ==!   (put in ua,va)
103      !
104      !                    ! time stepping except vertical diffusion
105      IF( ln_dynadv_vec .OR. ln_linssh ) THEN   ! applied on velocity
106         DO jk = 1, jpkm1
107            ua(:,:,jk) = ( ub(:,:,jk) + r2dt * ua(:,:,jk) ) * umask(:,:,jk)
108            va(:,:,jk) = ( vb(:,:,jk) + r2dt * va(:,:,jk) ) * vmask(:,:,jk)
109         END DO
110      ELSE                                      ! applied on thickness weighted velocity
111         DO jk = 1, jpkm1
112            ua(:,:,jk) = (         e3u_b(:,:,jk) * ub(:,:,jk)  &
113               &          + r2dt * e3u_n(:,:,jk) * ua(:,:,jk)  ) / e3u_a(:,:,jk) * umask(:,:,jk)
114            va(:,:,jk) = (         e3v_b(:,:,jk) * vb(:,:,jk)  &
115               &          + r2dt * e3v_n(:,:,jk) * va(:,:,jk)  ) / e3v_a(:,:,jk) * vmask(:,:,jk)
116         END DO
117      ENDIF
118      !                    ! add top/bottom friction
119      !     With split-explicit free surface, barotropic stress is treated explicitly Update velocities at the bottom.
120      !     J. Chanut: The bottom stress is computed considering after barotropic velocities, which does
121      !                not lead to the effective stress seen over the whole barotropic loop.
122      !     G. Madec : in linear free surface, e3u_a = e3u_n = e3u_0, so systematic use of e3u_a
123      IF( ln_drgimp .AND. ln_dynspg_ts ) THEN
124         DO jk = 1, jpkm1        ! remove barotropic velocities
125            ua(:,:,jk) = ( ua(:,:,jk) - ua_b(:,:) ) * umask(:,:,jk)
126            va(:,:,jk) = ( va(:,:,jk) - va_b(:,:) ) * vmask(:,:,jk)
127         END DO
128         DO jj = 2, jpjm1        ! Add bottom/top stress due to barotropic component only
129            DO ji = fs_2, fs_jpim1   ! vector opt.
130               iku = mbku(ji,jj)         ! ocean bottom level at u- and v-points
131               ikv = mbkv(ji,jj)         ! (deepest ocean u- and v-points)
132               ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku)
133               ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv)
134               ua(ji,jj,iku) = ua(ji,jj,iku) + r2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * ua_b(ji,jj) / ze3ua
135               va(ji,jj,ikv) = va(ji,jj,ikv) + r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * va_b(ji,jj) / ze3va
136            END DO
137         END DO
138         IF( ln_isfcav ) THEN    ! Ocean cavities (ISF)
139            DO jj = 2, jpjm1       
140               DO ji = fs_2, fs_jpim1   ! vector opt.
141                  iku = miku(ji,jj)         ! top ocean level at u- and v-points
142                  ikv = mikv(ji,jj)         ! (first wet ocean u- and v-points)
143                  ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku)
144                  ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv)
145                  ua(ji,jj,iku) = ua(ji,jj,iku) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * ua_b(ji,jj) / ze3ua
146                  va(ji,jj,ikv) = va(ji,jj,ikv) + r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * va_b(ji,jj) / ze3va
147               END DO
148            END DO
149         END IF
150      ENDIF
151      !
152      !              !==  Vertical diffusion on u  ==!
153      !
154      !                    !* Matrix construction
155      zdt = r2dt * 0.5
156      SELECT CASE( nldf_dyn )
157      CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu)
158         DO jk = 1, jpkm1
159            DO jj = 2, jpjm1 
160               DO ji = fs_2, fs_jpim1   ! vector opt.
161                  ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk)   ! after scale factor at T-point
162                  zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) + akzu(ji,jj,jk  ) )   &
163                     &         / ( ze3ua * e3uw_n(ji,jj,jk  ) ) * wumask(ji,jj,jk  )
164                  zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) + akzu(ji,jj,jk+1) )   &
165                     &         / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1)
166                  zwi(ji,jj,jk) = zzwi
167                  zws(ji,jj,jk) = zzws
168                  zwd(ji,jj,jk) = 1._wp - zzwi - zzws
169               END DO
170            END DO
171         END DO
172      CASE DEFAULT               ! iso-level lateral mixing
173         DO jk = 1, jpkm1
174            DO jj = 2, jpjm1 
175               DO ji = fs_2, fs_jpim1   ! vector opt.
176                  ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk)   ! after scale factor at T-point
177                  zzwi = - zdt * ( avm(ji+1,jj,jk  ) + avm(ji,jj,jk  ) ) / ( ze3ua * e3uw_n(ji,jj,jk  ) ) * wumask(ji,jj,jk  )
178                  zzws = - zdt * ( avm(ji+1,jj,jk+1) + avm(ji,jj,jk+1) ) / ( ze3ua * e3uw_n(ji,jj,jk+1) ) * wumask(ji,jj,jk+1)
179                  zwi(ji,jj,jk) = zzwi
180                  zws(ji,jj,jk) = zzws
181                  zwd(ji,jj,jk) = 1._wp - zzwi - zzws
182               END DO
183            END DO
184         END DO
185      END SELECT
186      !
187      DO jj = 2, jpjm1     !* Surface boundary conditions
188         DO ji = fs_2, fs_jpim1   ! vector opt.
189            zwi(ji,jj,1) = 0._wp
190            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1)
191         END DO
192      END DO
193      !
194      !              !==  Apply semi-implicit bottom friction  ==!
195      !
196      !     Only needed for semi-implicit bottom friction setup. The explicit
197      !     bottom friction has been included in "u(v)a" which act as the R.H.S
198      !     column vector of the tri-diagonal matrix equation
199      !
200      IF ( ln_drgimp ) THEN      ! implicit bottom friction
201         DO jj = 2, jpjm1
202            DO ji = 2, jpim1
203               iku = mbku(ji,jj)       ! ocean bottom level at u- and v-points
204               ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku)   ! after scale factor at T-point
205               zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / ze3ua
206            END DO
207         END DO
208         IF ( ln_isfcav ) THEN   ! top friction (always implicit)
209            DO jj = 2, jpjm1
210               DO ji = 2, jpim1
211                  !!gm   top Cd is masked (=0 outside cavities) no need of test on mik>=2  ==>> it has been suppressed
212                  iku = miku(ji,jj)       ! ocean top level at u- and v-points
213                  ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,iku) + r_vvl * e3u_a(ji,jj,iku)   ! after scale factor at T-point
214                  zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3ua
215               END DO
216            END DO
217         END IF
218      ENDIF
219      !
220      ! Matrix inversion starting from the first level
221      !-----------------------------------------------------------------------
222      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
223      !
224      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
225      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
226      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
227      !        (        ...               )( ...  ) ( ...  )
228      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
229      !
230      !   m is decomposed in the product of an upper and a lower triangular matrix
231      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
232      !   The solution (the after velocity) is in ua
233      !-----------------------------------------------------------------------
234      !
235      DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  ==
236         DO jj = 2, jpjm1   
237            DO ji = fs_2, fs_jpim1   ! vector opt.
238               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
239            END DO
240         END DO
241      END DO
242      !
243      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==!
244         DO ji = fs_2, fs_jpim1   ! vector opt.
245            ze3ua =  ( 1._wp - r_vvl ) * e3u_n(ji,jj,1) + r_vvl * e3u_a(ji,jj,1) 
246            ua(ji,jj,1) = ua(ji,jj,1) + r2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   &
247               &                                      / ( ze3ua * rau0 ) * umask(ji,jj,1) 
248         END DO
249      END DO
250      DO jk = 2, jpkm1
251         DO jj = 2, jpjm1
252            DO ji = fs_2, fs_jpim1
253               ua(ji,jj,jk) = ua(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1)
254            END DO
255         END DO
256      END DO
257      !
258      DO jj = 2, jpjm1        !==  thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk  ==!
259         DO ji = fs_2, fs_jpim1   ! vector opt.
260            ua(ji,jj,jpkm1) = ua(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
261         END DO
262      END DO
263      DO jk = jpk-2, 1, -1
264         DO jj = 2, jpjm1
265            DO ji = fs_2, fs_jpim1
266               ua(ji,jj,jk) = ( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk)
267            END DO
268         END DO
269      END DO
270      !
271      !              !==  Vertical diffusion on v  ==!
272      !
273      !                       !* Matrix construction
274      zdt = r2dt * 0.5
275      SELECT CASE( nldf_dyn )
276      CASE( np_lap_i )           ! rotated lateral mixing: add its vertical mixing (akzu)
277         DO jk = 1, jpkm1
278            DO jj = 2, jpjm1   
279               DO ji = fs_2, fs_jpim1   ! vector opt.
280                  ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk)   ! after scale factor at T-point
281                  zzwi = - zdt * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) + akzv(ji,jj,jk  ) )   &
282                     &         / ( ze3va * e3vw_n(ji,jj,jk  ) ) * wvmask(ji,jj,jk  )
283                  zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) + akzv(ji,jj,jk+1) )   &
284                     &         / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1)
285                  zwi(ji,jj,jk) = zzwi * wvmask(ji,jj,jk  )
286                  zws(ji,jj,jk) = zzws * wvmask(ji,jj,jk+1)
287                  zwd(ji,jj,jk) = 1._wp - zzwi - zzws
288               END DO
289            END DO
290         END DO
291      CASE DEFAULT               ! iso-level lateral mixing
292         DO jk = 1, jpkm1
293            DO jj = 2, jpjm1   
294               DO ji = fs_2, fs_jpim1   ! vector opt.
295                  ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk)   ! after scale factor at T-point
296                  zzwi = - zdt * ( avm(ji,jj+1,jk  ) + avm(ji,jj,jk  ) ) / ( ze3va * e3vw_n(ji,jj,jk  ) ) * wvmask(ji,jj,jk  )
297                  zzws = - zdt * ( avm(ji,jj+1,jk+1) + avm(ji,jj,jk+1) ) / ( ze3va * e3vw_n(ji,jj,jk+1) ) * wvmask(ji,jj,jk+1)
298                  zwi(ji,jj,jk) = zzwi * wvmask(ji,jj,jk  )
299                  zws(ji,jj,jk) = zzws * wvmask(ji,jj,jk+1)
300                  zwd(ji,jj,jk) = 1._wp - zzwi - zzws
301               END DO
302            END DO
303         END DO
304      END SELECT
305      !
306      DO jj = 2, jpjm1        !* Surface boundary conditions
307         DO ji = fs_2, fs_jpim1   ! vector opt.
308            zwi(ji,jj,1) = 0._wp
309            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1)
310         END DO
311      END DO
312      !              !==  Apply semi-implicit top/bottom friction  ==!
313      !
314      !     Only needed for semi-implicit bottom friction setup. The explicit
315      !     bottom friction has been included in "u(v)a" which act as the R.H.S
316      !     column vector of the tri-diagonal matrix equation
317      !
318      IF( ln_drgimp ) THEN
319         DO jj = 2, jpjm1
320            DO ji = 2, jpim1
321               ikv = mbkv(ji,jj)       ! (deepest ocean u- and v-points)
322               ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv)   ! after scale factor at T-point
323               zwd(ji,jj,ikv) = zwd(ji,jj,ikv) - r2dt * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / ze3va           
324            END DO
325         END DO
326         IF ( ln_isfcav ) THEN
327            DO jj = 2, jpjm1
328               DO ji = 2, jpim1
329                  ikv = mikv(ji,jj)       ! (first wet ocean u- and v-points)
330                  ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikv) + r_vvl * e3v_a(ji,jj,ikv)   ! after scale factor at T-point
331                  zwd(ji,jj,iku) = zwd(ji,jj,iku) - r2dt * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / ze3va
332               END DO
333            END DO
334         ENDIF
335      ENDIF
336
337      ! Matrix inversion
338      !-----------------------------------------------------------------------
339      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
340      !
341      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
342      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
343      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
344      !        (        ...               )( ...  ) ( ...  )
345      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
346      !
347      !   m is decomposed in the product of an upper and lower triangular matrix
348      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
349      !   The solution (after velocity) is in 2d array va
350      !-----------------------------------------------------------------------
351      !
352      DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  ==
353         DO jj = 2, jpjm1   
354            DO ji = fs_2, fs_jpim1   ! vector opt.
355               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1)
356            END DO
357         END DO
358      END DO
359      !
360      DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  ==!
361         DO ji = fs_2, fs_jpim1   ! vector opt.         
362            ze3va =  ( 1._wp - r_vvl ) * e3v_n(ji,jj,1) + r_vvl * e3v_a(ji,jj,1) 
363            va(ji,jj,1) = va(ji,jj,1) + r2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   &
364               &                                      / ( ze3va * rau0 ) * vmask(ji,jj,1) 
365         END DO
366      END DO
367      DO jk = 2, jpkm1
368         DO jj = 2, jpjm1
369            DO ji = fs_2, fs_jpim1   ! vector opt.
370               va(ji,jj,jk) = va(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1)
371            END DO
372         END DO
373      END DO
374      !
375      DO jj = 2, jpjm1        !==  third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk  ==!
376         DO ji = fs_2, fs_jpim1   ! vector opt.
377            va(ji,jj,jpkm1) = va(ji,jj,jpkm1) / zwd(ji,jj,jpkm1)
378         END DO
379      END DO
380      DO jk = jpk-2, 1, -1
381         DO jj = 2, jpjm1
382            DO ji = fs_2, fs_jpim1
383               va(ji,jj,jk) = ( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk)
384            END DO
385         END DO
386      END DO
387      !
388      IF( l_trddyn )   THEN                      ! save the vertical diffusive trends for further diagnostics
389         ztrdu(:,:,:) = ( ua(:,:,:) - ub(:,:,:) ) / r2dt - ztrdu(:,:,:)
390         ztrdv(:,:,:) = ( va(:,:,:) - vb(:,:,:) ) / r2dt - ztrdv(:,:,:)
391         CALL trd_dyn( ztrdu, ztrdv, jpdyn_zdf, kt )
392      ENDIF
393      !                                          ! print mean trends (used for debugging)
394      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' zdf  - Ua: ', mask1=umask,               &
395         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
396         !
397      IF( ln_timing )   CALL timing_stop('dyn_zdf')
398      !
399   END SUBROUTINE dyn_zdf
400
401   !!==============================================================================
402END MODULE dynzdf
Note: See TracBrowser for help on using the repository browser.