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.
trazdf_exp.F90 in trunk/NEMO/OPA_SRC/TRA – NEMO

source: trunk/NEMO/OPA_SRC/TRA/trazdf_exp.F90 @ 1110

Last change on this file since 1110 was 1110, checked in by ctlod, 16 years ago

trunk: remove a bug related to the combination of key_vvl and ln_trazdf_exp options, see ticket: #202

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.6 KB
Line 
1MODULE trazdf_exp
2   !!==============================================================================
3   !!                    ***  MODULE  trazdf_exp  ***
4   !! Ocean active tracers:  vertical component of the tracer mixing trend using
5   !!                        a split-explicit time-stepping
6   !!==============================================================================
7   !! History :  OPA  !  1990-10  (B. Blanke)  Original code
8   !!            7.0  !  1991-11  (G. Madec)
9   !!                 !  1992-06  (M. Imbard)  correction on tracer trend loops
10   !!                 !  1996-01  (G. Madec)  statement function for e3
11   !!                 !  1997-05  (G. Madec)  vertical component of isopycnal
12   !!                 !  1997-07  (G. Madec)  geopotential diffusion in s-coord
13   !!                 !  2000-08  (G. Madec)  double diffusive mixing
14   !!   NEMO     1.0  !  2002-08  (G. Madec)  F90: Free form and module
15   !!             -   !  2004-08  (C. Talandier) New trends organisation
16   !!             -   !  2005-11  (G. Madec)  New organisation
17   !!            3.0  !  2008-04  (G. Madec)  leap-frog time stepping done in trazdf
18   !!----------------------------------------------------------------------
19
20   !!----------------------------------------------------------------------
21   !!   tra_zdf_exp  : compute the tracer the vertical diffusion trend using a
22   !!                  split-explicit time stepping and provide the after tracer
23   !!----------------------------------------------------------------------
24   USE oce             ! ocean dynamics and active tracers
25   USE dom_oce         ! ocean space and time domain
26   USE domvvl          ! variablevolume levels
27   USE trdmod          ! ocean active tracers trends
28   USE trdmod_oce      ! ocean variables trends
29   USE zdf_oce         ! ocean vertical physics
30   USE zdfddm          ! ocean vertical physics: double diffusion
31   USE in_out_manager  ! I/O manager
32   USE prtctl          ! Print control
33
34   IMPLICIT NONE
35   PRIVATE
36
37   PUBLIC   tra_zdf_exp   ! routine called by step.F90
38
39   !! * Substitutions
40#  include "domzgr_substitute.h90"
41#  include "zdfddm_substitute.h90"
42#  include "vectopt_loop_substitute.h90"
43   !!----------------------------------------------------------------------
44   !! NEMO/OPA  3.0 , LOCEAN-IPSL (2008)
45   !! $Id:$
46   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
47   !!----------------------------------------------------------------------
48
49CONTAINS
50
51   SUBROUTINE tra_zdf_exp( kt, p2dt )
52      !!----------------------------------------------------------------------
53      !!                  ***  ROUTINE tra_zdf_exp  ***
54      !!                   
55      !! ** Purpose :   Compute the after tracer fields due to the vertical
56      !!      tracer mixing alone, and then due to the whole tracer trend.
57      !!
58      !! ** Method  : - The after tracer fields due to the vertical diffusion
59      !!      of tracers alone is given by:
60      !!                zwx = tb + p2dt difft
61      !!      where difft = dz( avt dz(tb) ) = 1/e3t dk+1( avt/e3w dk(tb) )
62      !!           (if lk_zdfddm=T use avs on salinity instead of avt)
63      !!      difft is evaluated with an Euler split-explit scheme using a
64      !!      no flux boundary condition at both surface and bottomi boundaries.
65      !!      (N.B. bottom condition is applied through the masked field avt).
66      !!              - the after tracer fields due to the whole trend is
67      !!      obtained in leap-frog environment by :
68      !!          ta = zwx + p2dt ta
69      !!              - in case of variable level thickness (lk_vvl=T) the
70      !!     the leap-frog is applied on thickness weighted tracer. That is:
71      !!          ta = [ tb*e3tb + e3tn*( zwx - tb + p2dt ta ) ] / e3tn
72      !!
73      !! ** Action : - after tracer fields (ta,sa)
74      !!---------------------------------------------------------------------
75      INTEGER , INTENT(in)                 ::   kt     ! ocean time-step index
76      REAL(wp), INTENT(in), DIMENSION(jpk) ::   p2dt   ! vertical profile of tracer time-step
77      !!
78      INTEGER  ::   ji, jj, jk, jl            ! dummy loop indices
79      REAL(wp) ::   zlavmr, zave3r, ze3tr     ! temporary scalars
80      REAL(wp) ::   zta, zsa, ze3tb, zcoef    ! temporary scalars
81      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwx, zwy, zwz, zww   ! 3D workspace
82      !!---------------------------------------------------------------------
83
84      IF( kt == nit000 ) THEN
85         IF(lwp) WRITE(numout,*)
86         IF(lwp) WRITE(numout,*) 'tra_zdf_exp : explicit vertical mixing'
87         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~'
88      ENDIF
89
90      ! Initializations
91      ! ---------------
92      zlavmr = 1. / float( n_zdfexp )                           ! Local constant
93      !
94      zwy(:,:, 1 ) = 0.e0        ;   zww(:,:, 1 ) = 0.e0        ! surface boundary conditions: no flux
95      zwy(:,:,jpk) = 0.e0        ;   zww(:,:,jpk) = 0.e0        ! bottom  boundary conditions: no flux
96      !
97      zwx(:,:,:)   = tb(:,:,:)   ;   zwz(:,:,:)   = sb(:,:,:)   ! zwx and zwz arrays set to before tracer values
98
99      ! Split-explicit loop  (after tracer due to the vertical diffusion alone)
100      ! -------------------
101      !
102      DO jl = 1, n_zdfexp
103         !                     ! first vertical derivative
104         DO jk = 2, jpk
105            DO jj = 2, jpjm1 
106               DO ji = fs_2, fs_jpim1   ! vector opt.
107                  zave3r = 1.e0 / fse3w(ji,jj,jk) 
108                  zwy(ji,jj,jk) =   avt(ji,jj,jk) * ( zwx(ji,jj,jk-1) - zwx(ji,jj,jk) ) * zave3r
109                  zww(ji,jj,jk) = fsavs(ji,jj,jk) * ( zwz(ji,jj,jk-1) - zwz(ji,jj,jk) ) * zave3r
110               END DO
111            END DO
112         END DO
113         !
114         DO jk = 1, jpkm1      ! second vertical derivative   ==> tracer at kt+l*2*rdt/n_zdfexp
115            DO jj = 2, jpjm1 
116               DO ji = fs_2, fs_jpim1   ! vector opt.
117                  ze3tr = zlavmr / fse3t(ji,jj,jk)
118                  zwx(ji,jj,jk) = zwx(ji,jj,jk) + p2dt(jk) * ( zwy(ji,jj,jk) - zwy(ji,jj,jk+1) ) * ze3tr
119                  zwz(ji,jj,jk) = zwz(ji,jj,jk) + p2dt(jk) * ( zww(ji,jj,jk) - zww(ji,jj,jk+1) ) * ze3tr
120               END DO
121            END DO
122         END DO
123         !
124      END DO
125
126      ! After tracer due to all trends
127      ! ------------------------------
128      IF( lk_vvl ) THEN          ! variable level thickness : leap-frog on tracer*e3t
129         DO jk = 1, jpkm1
130            DO jj = 2, jpjm1 
131               DO ji = fs_2, fs_jpim1   ! vector opt.
132                  ze3tb = fsve3t(ji,jj,jk) * ( 1 + sshb(ji,jj) * mut(ji,jj,jk) )       ! before e3t
133                  zta   = zwx(ji,jj,jk) - tb(ji,jj,jk) + p2dt(jk) * ta(ji,jj,jk)       ! total trends * 2*rdt
134                  zsa   = zwz(ji,jj,jk) - sb(ji,jj,jk) + p2dt(jk) * sa(ji,jj,jk)     
135                  zcoef = 1.e0 / fse3t(ji,jj,jk) * tmask(ji,jj,jk)
136                  ta(ji,jj,jk) = (  ze3tb * tb(ji,jj,jk) + fse3t(ji,jj,jk) * zta  ) * zcoef
137                  sa(ji,jj,jk) = (  ze3tb * sb(ji,jj,jk) + fse3t(ji,jj,jk) * zsa  ) * zcoef
138               END DO
139            END DO
140         END DO
141      ELSE                       ! fixed level thickness : leap-frog on tracers
142         DO jk = 1, jpkm1
143            DO jj = 2, jpjm1 
144               DO ji = fs_2, fs_jpim1   ! vector opt.
145                  ta(ji,jj,jk) = ( zwx(ji,jj,jk) + p2dt(jk) * ta(ji,jj,jk) ) *tmask(ji,jj,jk)
146                  sa(ji,jj,jk) = ( zwz(ji,jj,jk) + p2dt(jk) * sa(ji,jj,jk) ) *tmask(ji,jj,jk)
147               END DO
148            END DO
149         END DO
150      ENDIF
151      !
152   END SUBROUTINE tra_zdf_exp
153
154   !!==============================================================================
155END MODULE trazdf_exp
Note: See TracBrowser for help on using the repository browser.