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.
trczdf_iso_vopt.F90 in branches/dev_005_AWL/NEMO/TOP_SRC/TRP – NEMO

source: branches/dev_005_AWL/NEMO/TOP_SRC/TRP/trczdf_iso_vopt.F90 @ 1804

Last change on this file since 1804 was 1804, checked in by sga, 14 years ago

merge of trunk changes from r1782 to r1802 into NEMO branch dev_005_AWL

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 28.6 KB
Line 
1MODULE trczdf_iso_vopt
2   !!======================================================================
3   !!                 ***  MODULE  trczdf_iso_vopt  ***
4   !! Ocean passive tracers:  vertical component of the tracer mixing trend
5   !!======================================================================
6   !! History :  6.0  !  90-10 (B. Blanke)  Original code
7   !!            7.0  !  91-11 (G. Madec)
8   !!                 !  92-06 (M. Imbard) correction on tracer trend loops
9   !!                 !  96-01 (G. Madec) statement function for e3
10   !!                 !  97-05 (G. Madec) vertical component of isopycnal
11   !!                 !  97-07 (G. Madec) geopotential diffusion in s-coord
12   !!                 !  98-03  (L. Bopp MA Foujols) passive tracer generalisation
13   !!                 !  00-05  (MA Foujols) add lbc for tracer trends
14   !!                 !  00-06  (O Aumont)  correct isopycnal scheme suppress
15   !!                 !                     avt multiple correction
16   !!                 !  00-08  (G. Madec)  double diffusive mixing
17   !!            8.5  !  02-08  (G. Madec)  F90: Free form and module
18   !!            9.0  !  04-03  (C. Ethe )  adapted for passive tracers
19   !!                 !  06-08  (C. Deltel) Diagnose ML trends for passive tracer
20   !!----------------------------------------------------------------------
21#if defined key_top && ( defined key_ldfslp   ||   defined key_esopa )
22   !!----------------------------------------------------------------------
23   !!   'key_ldfslp'                  rotation of the lateral mixing tensor
24   !!----------------------------------------------------------------------
25   !!   trc_zdf_iso_vopt : Update the tracer trend with the vertical part of
26   !!                  the isopycnal or geopotential s-coord. operator and
27   !!                  the vertical diffusion. vector optimization, use
28   !!                  k-j-i loops.
29   !!   trc_zdf_iso  :
30   !!   trc_zdf_zdf  :
31   !!----------------------------------------------------------------------
32   USE oce_trc               ! ocean dynamics and tracers variables
33   USE trp_trc                   ! ocean passive tracers variables
34   USE lbclnk                ! ocean lateral boundary conditions (or mpp link)
35   USE trctrp_lec
36   USE prtctl_trc            ! Print control for debbuging
37   USE trdmld_trc
38   USE trdmld_trc_oce     
39
40   IMPLICIT NONE
41   PRIVATE
42
43   PUBLIC trc_zdf_iso_vopt   !  routine called by step.F90
44
45   REAL(wp), DIMENSION(jpk) ::   rdttrc                    ! vertical profile of 2 x time-step
46   REAL(wp), DIMENSION(:,:,:,:), ALLOCATABLE ::   ztrcavg  ! workspace arrays
47
48   !! * Substitutions
49#  include "top_substitute.h90"
50   !!----------------------------------------------------------------------
51   !!   TOP 1.0 , LOCEAN-IPSL (2005)
52   !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trczdf_iso_vopt.F90,v 1.11 2007/02/21 12:55:33 opalod Exp $
53   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
54   !!----------------------------------------------------------------------
55
56CONTAINS
57   
58   SUBROUTINE trc_zdf_iso_vopt( kt )
59      !!----------------------------------------------------------------------
60      !!                  ***  ROUTINE trc_zdf_iso_vopt  ***
61      !!
62      !! ** Purpose :
63      !! ** Method  :
64      !! ** Action  :
65      !!---------------------------------------------------------------------
66      INTEGER, INTENT( in ) ::   kt      ! ocean time-step index
67      CHARACTER (len=22) :: charout
68      !!---------------------------------------------------------------------
69
70      IF( kt == nittrc000 ) THEN
71         IF(lwp)WRITE(numout,*)
72         IF(lwp)WRITE(numout,*) 'trc_zdf_iso_vopt : vertical mixing computation'
73         IF(lwp)WRITE(numout,*) '~~~~~~~~~~~~~~~~   is  iso-neutral diffusion : implicit vertical time stepping'
74#if defined key_trcldf_eiv && defined key_diaeiv 
75         w_trc_eiv(:,:,:) = 0.e0
76#endif
77      ENDIF
78
79      IF( l_trdtrc ) THEN
80         ALLOCATE( ztrcavg(jpi,jpj,jpk,jptra) )
81         ztrcavg(:,:,:,:) = 0.e0          ! initialisation step
82      ENDIF
83
84      ! I. vertical extra-diagonal part of the rotated tensor
85      ! -----------------------------------------------------
86
87      CALL trc_zdf_iso( kt )
88
89      IF( ln_ctl ) THEN    ! print mean trends (used for debugging)
90         WRITE(charout, FMT="('zdf - 1')")
91         CALL prt_ctl_trc_info( charout )
92         CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm, clinfo2='trd' )
93      ENDIF
94
95      ! II. vertical diffusion (including the vertical diagonal part of the rotated tensor)
96      ! ----------------------
97
98      CALL trc_zdf_zdf( kt )
99
100      IF( ln_ctl ) THEN    ! print mean trends (used for debugging)
101         WRITE(charout, FMT="('zdf - 2')")
102         CALL prt_ctl_trc_info( charout )
103         CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm, clinfo2='trd' )
104      ENDIF
105
106      IF( l_trdtrc ) DEALLOCATE( ztrcavg )
107
108   END SUBROUTINE trc_zdf_iso_vopt
109
110
111   SUBROUTINE trc_zdf_zdf( kt )
112      !!----------------------------------------------------------------------
113      !!                 ***  ROUTINE trc_zdf_zdf  ***
114      !!                   
115      !! ** Purpose :   Compute the trend due to the vertical tracer diffusion
116      !!     including the vertical component of lateral mixing (only for 2nd
117      !!     order operator, for fourth order it is already computed and add
118      !!     to the general trend in traldf.F) and add it to the general trend
119      !!     of the tracer equations.
120      !!
121      !! ** Method  :   The vertical component of the lateral diffusive trends
122      !!      is provided by a 2nd order operator rotated along neural or geo-
123      !!      potential surfaces to which an eddy induced advection can be
124      !!      added. It is computed using before fields (forward in time) and
125      !!      isopycnal or geopotential slopes computed in routine ldfslp.
126      !!
127      !!      Second part: vertical trend associated with the vertical physics
128      !!      ===========  (including the vertical flux proportional to dk[t]
129      !!                  associated with the lateral mixing, through the
130      !!                  update of avt)
131      !!      The vertical diffusion of tracers  is given by:
132      !!             difft = dz( avt dz(t) ) = 1/e3t dk+1( avt/e3w dk(t) )
133      !!      It is computed using a backward time scheme (t=tra).
134      !!      Surface and bottom boundary conditions: no diffusive flux on
135      !!      both tracers (bottom, applied through the masked field avt).
136      !!      Add this trend to the general trend tra :
137      !!         tra = tra + dz( avt dz(t) )
138      !!         (tra = tra + dz( avs dz(t) ) if lk_trc_zdfddm=T )
139      !!
140      !!      Third part: recover avt resulting from the vertical physics
141      !!      ==========  alone, for further diagnostics (for example to
142      !!                  compute the turbocline depth in diamld).
143      !!         avt = zavt
144      !!         (avs = zavs if lk_trc_zdfddm=T )
145      !!
146      !!      'key_trdtra' defined: trend saved for futher diagnostics.
147      !!
148      !!      macro-tasked on vertical slab (jj-loop)
149      !!
150      !! ** Action  : - Update tra with before vertical diffusion trend
151      !!              - Save the trend in trtrd  ('key_trdmld_trc')
152      !!---------------------------------------------------------------------
153      USE oce, ONLY :       zwd   => ua,  &  ! ua, va used as
154                            zws   => va      ! workspace
155      INTEGER, INTENT( in ) ::   kt          ! ocean time-step index
156      INTEGER  ::   ji, jj, jk, jn            ! dummy loop indices
157      REAL(wp) ::   zavi, zrhs               ! temporary scalars
158      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
159         zwi, zwt, zavsi                     ! temporary workspace arrays
160#  if defined key_trc_diatrd
161      REAL(wp) ::   ztra
162      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ztrd
163#  endif
164      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrtrd
165      !!---------------------------------------------------------------------
166
167
168      ! I. Local constant initialization
169      ! --------------------------------
170      ! ... time step = 2 rdttra ex
171      IF( ln_trcadv_cen2 .OR. ln_trcadv_tvd ) THEN
172         ! time step = 2 rdttra with Arakawa or TVD advection scheme
173         IF( neuler == 0 .AND. kt == nittrc000 ) THEN
174            rdttrc(:) =  rdttra(:) * FLOAT(ndttrc)             ! restarting with Euler time stepping
175         ELSEIF( kt <= nittrc000 + ndttrc ) THEN
176            rdttrc(:) = 2. * rdttra(:) * FLOAT(ndttrc)         ! leapfrog
177         ENDIF
178      ELSE
179         rdttrc(:) =  rdttra(:) * FLOAT(ndttrc)     
180      ENDIF
181
182         
183      zwd  ( 1, :, : ) = 0.e0    ;     zwd  ( jpi, :,   : ) = 0.e0
184      zws  ( 1, :, : ) = 0.e0    ;     zws  ( jpi, :,   : ) = 0.e0
185      zwi  ( 1, :, : ) = 0.e0    ;     zwi  ( jpi, :,   : ) = 0.e0
186      zwt  ( 1, :, : ) = 0.e0    ;     zwt  ( jpi, :,   : ) = 0.e0
187      zwt  ( :, :, 1 ) = 0.e0    ;     zwt  (   :, :, jpk ) = 0.e0
188      zavsi( 1, :, : ) = 0.e0    ;     zavsi( jpi, :,   : ) = 0.e0 
189      zavsi( :, :, 1 ) = 0.e0    ;     zavsi(   :, :, jpk ) = 0.e0
190
191
192      ! II. Vertical trend associated with the vertical physics
193      !=======================================================
194      !     (including the vertical flux proportional to dk[t] associated
195      !      with the lateral mixing, through the avt update)
196      !     dk[ avt dk[ (t,s) ] ] diffusive trends
197
198      ! II.0 Matrix construction
199      ! ------------------------       
200      ! update and save of avt (and avs if double diffusive mixing)
201      DO jk = 2, jpkm1
202         DO jj = 2, jpjm1
203            DO ji = fs_2, fs_jpim1   ! vector opt.
204               zavi = fsahtw(ji,jj,jk) * (                 &   ! vertical mixing coef. due to lateral mixing
205                  &                           wslpi(ji,jj,jk) * wslpi(ji,jj,jk)      &
206                  &                         + wslpj(ji,jj,jk) * wslpj(ji,jj,jk)  )
207               zavsi(ji,jj,jk) = fstravs(ji,jj,jk) + zavi        ! dd mixing: zavsi = total vertical mixing coef. on tracer
208            END DO
209         END DO
210      END DO
211
212      ! II.1 Vertical diffusion on tracer
213      ! ---------------------------------
214      ! Rebuild the Matrix as avt /= avs
215
216      ! Diagonal, inferior, superior  (including the bottom boundary condition via avs masked)
217      DO jk = 1, jpkm1
218         DO jj = 2, jpjm1
219            DO ji = fs_2, fs_jpim1   ! vector opt.
220               zwi(ji,jj,jk) = - rdttrc(jk) * zavsi(ji,jj,jk  ) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) )
221               zws(ji,jj,jk) = - rdttrc(jk) * zavsi(ji,jj,jk+1) / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) )
222               zwd(ji,jj,jk) = 1. - zwi(ji,jj,jk) - zws(ji,jj,jk)
223            END DO
224         END DO
225      END DO
226
227      ! Surface boudary conditions
228      DO jj = 2, jpjm1
229         DO ji = fs_2, fs_jpim1   ! vector opt.
230            zwi(ji,jj,1) = 0.e0
231            zwd(ji,jj,1) = 1. - zws(ji,jj,1)
232         END DO
233      END DO
234
235      !! Matrix inversion from the first level
236      !!----------------------------------------------------------------------
237      !   solve m.x = y  where m is a tri diagonal matrix ( jpk*jpk )
238      !
239      !        ( zwd1 zws1   0    0    0  )( zwx1 ) ( zwy1 )
240      !        ( zwi2 zwd2 zws2   0    0  )( zwx2 ) ( zwy2 )
241      !        (  0   zwi3 zwd3 zws3   0  )( zwx3 )=( zwy3 )
242      !        (        ...               )( ...  ) ( ...  )
243      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk )
244      !
245      !   m is decomposed in the product of an upper and lower triangular
246      !   matrix
247      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi
248      !   The second member is in 2d array zwy
249      !   The solution is in 2d array zwx
250      !   The 3d arry zwt is a work space array
251      !   zwy is used and then used as a work space array : its value is modified!
252
253      ! first recurrence:   Tk = Dk - Ik Sk-1 / Tk-1   (increasing k)
254      DO jj = 2, jpjm1
255         DO ji = fs_2, fs_jpim1
256            zwt(ji,jj,1) = zwd(ji,jj,1)
257         END DO
258      END DO
259      DO jk = 2, jpkm1
260         DO jj = 2, jpjm1
261            DO ji = fs_2, fs_jpim1
262               zwt(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1)/zwt(ji,jj,jk-1)
263            END DO
264         END DO
265      END DO
266
267      IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) )
268
269      !                                                          ! ===========
270      DO jn = 1, jptra                                           ! tracer loop
271         !                                                       ! ===========
272         
273         IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn)          ! save trends
274
275#  if defined key_trc_diatrd
276         ! save the tra trend
277         ztrd(:,:,:) = tra(:,:,:,jn)
278#  endif
279
280         ! second recurrence:    Zk = Yk - Ik / Tk-1  Zk-1
281         DO jj = 2, jpjm1
282            DO ji = fs_2, fs_jpim1
283               tra(ji,jj,1,jn) = trb(ji,jj,1,jn) + rdttrc(1) * tra(ji,jj,1,jn)
284            END DO
285         END DO
286         DO jk = 2, jpkm1
287            DO jj = 2, jpjm1
288               DO ji = fs_2, fs_jpim1
289                  zrhs = trb(ji,jj,jk,jn) + rdttrc(jk) * tra(ji,jj,jk,jn)   ! zrhs=right hand side
290                  tra(ji,jj,jk,jn) = zrhs - zwi(ji,jj,jk) / zwt(ji,jj,jk-1) * tra(ji,jj,jk-1,jn)
291               END DO
292            END DO
293         END DO
294
295         ! third recurrence: Xk = (Zk - Sk Xk+1 ) / Tk
296         ! Save the masked passive tracer after in tra
297         ! (c a u t i o n: passive tracer not its trend, Leap-frog scheme done it will not be done in tranxt)
298         DO jj = 2, jpjm1
299            DO ji = fs_2, fs_jpim1
300               tra(ji,jj,jpkm1,jn) = tra(ji,jj,jpkm1,jn) / zwt(ji,jj,jpkm1) * tmask(ji,jj,jpkm1)
301            END DO
302         END DO
303         DO jk = jpk-2, 1, -1
304            DO jj = 2, jpjm1
305               DO ji = fs_2, fs_jpim1
306                  tra(ji,jj,jk,jn) = ( tra(ji,jj,jk,jn) - zws(ji,jj,jk) * tra(ji,jj,jk+1,jn) ) / zwt(ji,jj,jk) * tmask(ji,jj,jk)
307               END DO
308            END DO
309         END DO
310
311#if defined key_trc_diatrd
312         ! Compute and save the vertical diffusive passive tracer trends
313#  if defined key_trcldf_iso
314         DO jk = 1, jpkm1
315            DO jj = 2, jpjm1
316               DO ji = fs_2, fs_jpim1   ! vector opt.
317                  ztra = ( tra(ji,jj,jk,jn) - trb(ji,jj,jk,jn) ) / rdttrc(jk)
318                  IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),6) = ztra - ztrd(ji,jj,jk) + trtrd(ji,jj,jk,ikeep(jn),6)
319               END DO
320            END DO
321         END DO
322#  else
323         DO jk = 1, jpkm1
324            DO jj = 2, jpjm1
325               DO ji = fs_2, fs_jpim1   ! vector opt.
326                  ztra = ( tra(ji,jj,jk,jn) - trb(ji,jj,jk,jn) ) / rdttrc(jk)
327                  IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),6) = ztra - ztrd(ji,jj,jk)
328               END DO
329            END DO
330         END DO
331#  endif
332#endif
333
334
335         ! III. Save vertical trend assoc. with the vertical physics for diagnostics
336         ! =========================================================================
337         IF( l_trdtrc )   THEN
338
339            ! III.1) Deduce the full vertical diff. trend (except for vertical eiv advection)
340            ! N.B. tavg & savg contain the contribution from the extra diagonal part
341            !   of the rotated tensor (from trc_zdf_iso).
342            IF( ln_trcldf_iso ) THEN
343               DO jk = 1, jpkm1
344                  ztrtrd(:,:,jk) = ( (tra(:,:,jk,jn) - trb(:,:,jk,jn))/rdttrc(jk) ) - ztrtrd(:,:,jk)  &
345                       &           + ztrcavg(:,:,jk,jn) 
346               END DO
347            ELSE
348               DO jk = 1, jpkm1
349                  ztrtrd(:,:,jk) = ( (tra(:,:,jk,jn) - trb(:,:,jk,jn))/rdttrc(jk) ) - ztrtrd(:,:,jk)
350               END DO
351            ENDIF
352           
353            ! III.2) save the trends for diagnostic
354            ! N.B. However the purely vertical diffusion "K_z" (included here) will be deduced
355            !   and removed from this trend before storage. It is stored separately, so as to
356            !   clearly distinguish both contributions (see trd_mld)
357            IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_zdf, kt )
358
359         END IF
360         !                                                    ! ===========
361      END DO                                                  ! tracer loop
362      !                                                       ! ===========
363     
364      IF( l_trdtrc ) DEALLOCATE( ztrtrd )
365
366   END SUBROUTINE trc_zdf_zdf
367
368
369   SUBROUTINE trc_zdf_iso ( kt )
370      !!----------------------------------------------------------------------
371      !!                  ***  ROUTINE trc_zdf_iso  ***
372      !!
373      !! ** Purpose :
374      !!     Compute the trend due to the vertical tracer diffusion inclu-
375      !!     ding the vertical component of lateral mixing (only for second
376      !!     order operator, for fourth order it is already computed and
377      !!     add to the general trend in traldf.F) and add it to the general
378      !!     trend of the tracer equations.
379      !!
380      !! ** Method :
381      !!         The vertical component of the lateral diffusive trends is
382      !!      provided by a 2nd order operator rotated along neural or geopo-
383      !!      tential surfaces to which an eddy induced advection can be added
384      !!      It is computed using before fields (forward in time) and isopyc-
385      !!      nal or geopotential slopes computed in routine ldfslp.
386      !!
387      !!      First part: vertical trends associated with the lateral mixing
388      !!      ==========  (excluding the vertical flux proportional to dk[t] )
389      !!      vertical fluxes associated with the rotated lateral mixing:
390      !!         zftw =-aht {  e2t*wslpi di[ mi(mk(trb)) ]
391      !!                     + e1t*wslpj dj[ mj(mk(trb)) ]  }
392      !!      save avt coef. resulting from vertical physics alone in zavt:
393      !!         zavt = avt
394      !!      update and save in zavt the vertical eddy viscosity coefficient:
395      !!         avt = avt + wslpi^2+wslj^2
396      !!      add vertical Eddy Induced advective fluxes (lk_traldf_eiv=T):
397      !!         zftw = zftw + { di[aht e2u mi(wslpi)]
398      !!                    +dj[aht e1v mj(wslpj)] } mk(trb)
399      !!      take the horizontal divergence of the fluxes:
400      !!         difft = 1/(e1t*e2t*e3t) dk[ zftw ]
401      !!      Add this trend to the general trend tra :
402      !!         tra = tra + difft
403      !!
404      !! ** Action :
405      !!         Update tra arrays with the before vertical diffusion trend
406      !!         Save in trtrd arrays the trends if 'key_trdmld_trc' defined
407      !!---------------------------------------------------------------------
408      USE oce, ONLY :   zwx => ua,  &  ! use ua, va as
409                        zwy => va      ! workspace arrays
410      INTEGER, INTENT(in) :: kt
411
412      INTEGER ::   ji, jj, jk, jn                ! dummy loop indices
413      INTEGER ::   iku, ikv                     
414      REAL(wp) ::   ztavg                        ! temporary scalars
415      REAL(wp) ::   zcoef0, zcoef3               !    "         "
416      REAL(wp) ::   zcoef4                       !    "         "
417      REAL(wp) ::   zbtr, zmku, zmkv             !    "         "
418#if defined key_trcldf_eiv                       
419      REAL(wp) ::   zcoeg3, z_hdivn_z            !    "         "
420      REAL(wp) ::   zuwki, zvwki                 !    "         "
421      REAL(wp) ::   zuwk, zvwk                   !    "         "
422#endif
423      REAL(wp) ::   ztav
424      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwz  ! temporary workspace arrays
425      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwt
426      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   ztfw
427      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrtrd
428      !!---------------------------------------------------------------------
429
430
431      IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) )
432
433      !                                                          ! ===========
434      DO jn = 1, jptra                                           ! tracer loop
435         !                                                       ! ===========
436
437         ! 0. Local constant initialization
438         ! --------------------------------
439         zwx (1,:,:) = 0.e0    ;     zwx (jpi,:,:) = 0.e0
440         zwy (1,:,:) = 0.e0    ;     zwy (jpi,:,:) = 0.e0
441         zwz (1,:,:) = 0.e0    ;     zwz (jpi,:,:) = 0.e0
442         zwt (1,:,:) = 0.e0    ;     zwt (jpi,:,:) = 0.e0
443         ztfw(1,:,:) = 0.e0    ;     ztfw(jpi,:,:) = 0.e0
444
445         IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn)          ! save trends
446
447         ztavg = 0.e0
448
449         ! I. Vertical trends associated with lateral mixing
450         ! -------------------------------------------------
451         !    (excluding the vertical flux proportional to dk[t] )
452
453         ! I.1 horizontal tracer gradient
454         ! ------------------------------
455
456         DO jk = 1, jpkm1
457            DO jj = 1, jpjm1
458               DO ji = 1, fs_jpim1   ! vector opt.
459                  ! i-gradient of passive tracer at ji
460                  zwx (ji,jj,jk) = ( trb(ji+1,jj,jk,jn)-trb(ji,jj,jk,jn) ) * umask(ji,jj,jk)
461                  ! j-gradient of passive tracer at jj
462                  zwy (ji,jj,jk) = ( trb(ji,jj+1,jk,jn)-trb(ji,jj,jk,jn) ) * vmask(ji,jj,jk)
463               END DO
464            END DO
465         END DO
466         IF( ln_zps ) THEN
467            ! partial steps correction at the bottom ocean level
468            DO jj = 1, jpjm1
469               DO ji = 1, fs_jpim1   ! vector opt.
470                  ! last ocean level
471                  iku  = MIN( mbathy(ji,jj), mbathy(ji+1,jj  ) ) - 1
472                  ikv  = MIN( mbathy(ji,jj), mbathy(ji  ,jj+1) ) - 1
473                  ! i-gradient of passive tracer
474                  zwx (ji,jj,iku) = gtru(ji,jj,jn)
475                  ! j-gradient of passive tracer
476                  zwy (ji,jj,ikv) = gtrv(ji,jj,jn) 
477               END DO
478            END DO
479         ENDIF
480
481         ! I.2 Vertical fluxes
482         ! -------------------
483
484         ! Surface and bottom vertical fluxes set to zero
485         ztfw(:,:, 1 ) = 0.e0
486         ztfw(:,:,jpk) = 0.e0
487
488         ! interior (2=<jk=<jpk-1)
489         DO jk = 2, jpkm1
490            DO jj = 2, jpjm1
491               DO ji = fs_2, fs_jpim1   ! vector opt.
492                  zcoef0 = - fsahtw(ji,jj,jk) * tmask(ji,jj,jk)
493
494                  zmku = 1./MAX(   umask(ji  ,jj,jk-1) + umask(ji-1,jj,jk)      &
495                     &           + umask(ji-1,jj,jk-1) + umask(ji  ,jj,jk), 1.  )
496
497                  zmkv = 1./MAX(   vmask(ji,jj  ,jk-1) + vmask(ji,jj-1,jk)      &
498                     &           + vmask(ji,jj-1,jk-1) + vmask(ji,jj  ,jk), 1.  )
499
500                  zcoef3 = zcoef0 * e2t(ji,jj) * zmku * wslpi (ji,jj,jk)
501                  zcoef4 = zcoef0 * e1t(ji,jj) * zmkv * wslpj (ji,jj,jk)
502
503                  ztfw(ji,jj,jk) = zcoef3 * (   zwx(ji  ,jj  ,jk-1) + zwx(ji-1,jj  ,jk)      &
504                     &                        + zwx(ji-1,jj  ,jk-1) + zwx(ji  ,jj  ,jk)  )   &
505                     &           + zcoef4 * (   zwy(ji  ,jj  ,jk-1) + zwy(ji  ,jj-1,jk)      &
506                     &                        + zwy(ji  ,jj-1,jk-1) + zwy(ji  ,jj  ,jk)  )
507               END DO
508            END DO
509         END DO
510
511#if defined key_trcldf_eiv
512         !                              ! ---------------------------------------!
513         !                              ! Eddy induced vertical advective fluxes !
514         !                              ! ---------------------------------------!
515         zwx(:,:, 1 ) = 0.e0
516         zwx(:,:,jpk) = 0.e0
517
518         DO jk = 2, jpkm1
519            DO jj = 2, jpjm1
520               DO ji = fs_2, fs_jpim1   ! vector opt.
521#   if defined key_traldf_c2d || defined key_traldf_c3d  || defined key_off_degrad
522                  zuwki = ( wslpi(ji,jj,jk) + wslpi(ji-1,jj,jk) )   &
523                     &  * fsaeitru(ji-1,jj,jk) * e2u(ji-1,jj) * umask(ji-1,jj,jk)
524                  zuwk  = ( wslpi(ji,jj,jk) + wslpi(ji+1,jj,jk) )   &
525                     &  * fsaeitru(ji  ,jj,jk) * e2u(ji  ,jj) * umask(ji  ,jj,jk)
526                  zvwki = ( wslpj(ji,jj,jk) + wslpj(ji,jj-1,jk) )   &
527                     &  * fsaeitrv(ji,jj-1,jk) * e1v(ji,jj-1) * vmask(ji,jj-1,jk)
528                  zvwk  = ( wslpj(ji,jj,jk) + wslpj(ji,jj+1,jk) )   &
529                     &  * fsaeitrv(ji,jj  ,jk) * e1v(ji  ,jj) * vmask(ji  ,jj,jk)
530
531                  zcoeg3 = + 0.25 * tmask(ji,jj,jk) * ( zuwk - zuwki + zvwk - zvwki )
532#   else
533                  zuwki = ( wslpi(ji,jj,jk) + wslpi(ji-1,jj,jk) )   &
534                     &  * e2u(ji-1,jj) * umask(ji-1,jj,jk)
535                  zuwk  = ( wslpi(ji,jj,jk) + wslpi(ji+1,jj,jk) )   &
536                     &  * e2u(ji  ,jj) * umask(ji  ,jj,jk)
537                  zvwki = ( wslpj(ji,jj,jk) + wslpj(ji,jj-1,jk) )   &
538                     &  * e1v(ji,jj-1) * vmask(ji,jj-1,jk)
539                  zvwk  = ( wslpj(ji,jj,jk) + wslpj(ji,jj+1,jk) )   &
540                     &  * e1v(ji  ,jj) * vmask(ji  ,jj,jk)
541
542                  zcoeg3 = + 0.25 * tmask(ji,jj,jk) * fsaeiw(ji,jj,jk)   &
543                     &            * ( zuwk - zuwki + zvwk - zvwki )
544#   endif
545                  zwx(ji,jj,jk) = + zcoeg3 * ( trb(ji,jj,jk,jn) + trb(ji,jj,jk-1,jn) )
546
547                  ztfw(ji,jj,jk) = ztfw(ji,jj,jk) + zwx(ji,jj,jk)
548#   if defined key_diaeiv
549                  w_trc_eiv(ji,jj,jk) = -2. * zcoeg3 / ( e1t(ji,jj)*e2t(ji,jj) )
550#   endif
551               END DO
552            END DO
553         END DO
554#endif
555
556         ! I.3 Divergence of vertical fluxes added to the general tracer trend
557         ! -------------------------------------------------------------------
558
559         DO jk = 1, jpkm1
560            DO jj = 2, jpjm1
561               DO ji = fs_2, fs_jpim1   ! vector opt.
562                  zbtr =  1. / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk) )
563                  ztav = (  ztfw(ji,jj,jk) - ztfw(ji,jj,jk+1)  ) * zbtr
564                  tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztav
565#if defined key_trc_diatrd
566#   if defined key_trcldf_eiv
567                  ztavg = ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) * zbtr
568                  !  WARNING trtrd(ji,jj,jk,7) used for vertical gent velocity trend  not for damping !!!
569                  IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),7) = ztavg
570#   endif
571                  IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),6) = ztav - ztavg
572#endif
573
574               END DO
575            END DO
576         END DO
577
578         ! II. Save the trends for diagnostics
579         ! -----------------------------------
580         IF( l_trdtrc )   THEN
581#if defined key_trcldf_eiv
582
583            ! II.1) Compute the eiv VERTICAL trend
584            DO jk = 1, jpkm1
585               DO jj = 2, jpjm1
586                  DO ji = fs_2, fs_jpim1   ! vector opt.
587                     
588                     !-- Compute the eiv vertical divergence : 1/e3t ( dk[w_eiv] )
589                     !   N.B. This is only possible if key_diaeiv is switched on.
590                     !     Else, the vertical eiv is not diagnosed,
591                     !     so we can only store the flux form trend d_z ( T * w_eiv )
592                     !     instead of w_eiv * d_z( T ). Then, ONLY THE SUM of zonal,
593                     !     meridional, and vertical trends are valid.
594#   if defined key_diaeiv
595                     z_hdivn_z = ( 1. / fse3t(ji,jj,jk) ) * ( w_trc_eiv(ji,jj,jk) - w_trc_eiv(ji,jj,jk+1) )
596#   else
597                     z_hdivn_z = 0.e0
598#   endif
599                     zbtr =  1. / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,jk) )
600                     ztrcavg(ji,jj,jk,jn) = ( zwx(ji,jj,jk) - zwx(ji,jj,jk+1) ) * zbtr &
601                           &                - trn(ji,jj,jk,jn) * z_hdivn_z
602                  END DO
603               END DO
604            END DO
605
606            ! II.2) save the trends for diagnostic
607            !       N.B. The other part of the computed trend is stored below for later
608            !         output (see trc_zdf_zdf) 
609            IF (luttrd(jn)) CALL trd_mod_trc( ztrcavg(:,:,:,jn), jn, jptrc_trd_zei, kt )
610
611#endif
612            !-- Retain only the vertical diff. trends due to the extra diagonal
613            !   part of the rotated tensor (i.e. remove vert. eiv from the trend)
614            !   N.B. ztrcavg is recycled for this purpose
615            ztrcavg(:,:,:,jn) = tra(:,:,:,jn) - ztrtrd(:,:,:) - ztrcavg(:,:,:,jn)
616
617          END IF
618
619         !                                                       ! ===========
620      END DO                                                     ! tracer loop
621      !                                                          ! ===========
622
623      IF( l_trdtrc ) DEALLOCATE( ztrtrd )
624
625   END SUBROUTINE trc_zdf_iso
626
627#else
628   !!----------------------------------------------------------------------
629   !!   Dummy module :             NO rotation of the lateral mixing tensor
630   !!----------------------------------------------------------------------
631CONTAINS
632   SUBROUTINE trc_zdf_iso_vopt( kt )              ! empty routine
633      WRITE(*,*) 'trc_zdf_iso_vopt: You should not have seen this print! error?', kt
634   END SUBROUTINE trc_zdf_iso_vopt
635#endif
636
637   !!==============================================================================
638END MODULE trczdf_iso_vopt
Note: See TracBrowser for help on using the repository browser.