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 @ 247

Last change on this file since 247 was 247, checked in by opalod, 19 years ago

CL : Add CVS Header and CeCILL licence information

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.0 KB
Line 
1MODULE trazdf_exp
2   !!==============================================================================
3   !!                    ***  MODULE  trazdf_exp  ***
4   !! Ocean active tracers:  vertical component of the tracer mixing trend using
5   !!                        an explicit time-stepping (time spllitting scheme)
6   !!==============================================================================
7
8   !!----------------------------------------------------------------------
9   !!   tra_zdf_exp  : update the tracer trend with the vertical diffusion
10   !!                  using an explicit time stepping
11   !!----------------------------------------------------------------------
12   !! * Modules used
13   USE oce             ! ocean dynamics and active tracers
14   USE dom_oce         ! ocean space and time domain
15   USE trdmod          ! ocean active tracers trends
16   USE trdmod_oce      ! ocean variables trends
17   USE zdf_oce         ! ocean vertical physics
18   USE zdfddm          ! ocean vertical physics: double diffusion
19   USE in_out_manager  ! I/O manager
20
21   IMPLICIT NONE
22   PRIVATE
23
24   !! * Routine accessibility
25   PUBLIC tra_zdf_exp          ! routine called by step.F90
26
27   !! * Module variable
28   REAL(wp), DIMENSION(jpk) ::   &
29      r2dt                     ! vertical profile of 2 x tracer time-step
30
31   !! * Substitutions
32#  include "domzgr_substitute.h90"
33#  include "zdfddm_substitute.h90"
34   !!----------------------------------------------------------------------
35   !!  OPA 9.0 , LOCEAN-IPSL (2005)
36   !! $Header$
37   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
38   !!----------------------------------------------------------------------
39
40CONTAINS
41
42   SUBROUTINE tra_zdf_exp( kt )
43      !!----------------------------------------------------------------------
44      !!                  ***  ROUTINE tra_zdf_exp  ***
45      !!                   
46      !! ** Purpose :   Compute the trend due to the vertical tracer mixing
47      !!      using an explicit time stepping and add it to the general trend
48      !!      of the tracer equations.
49      !!
50      !! ** Method  :   The vertical diffusion of tracers (t & s) is given by:
51      !!         difft = dz( avt dz(tb) ) = 1/e3t dk+1( avt/e3w dk(tb) )
52      !!      It is evaluated with an Euler scheme, using a time splitting
53      !!      technique.
54      !!      Surface and bottom boundary conditions: no diffusive flux on
55      !!      both tracers (bottom, applied through the masked field avt).
56      !!      Add this trend to the general trend ta,sa :
57      !!          ta = ta + dz( avt dz(t) )
58      !!         (sa = sa + dz( avs dz(t) ) if lk_zdfddm= T)
59      !!
60      !! ** Action : - Update (ta,sa) with the before vertical diffusion trend
61      !!             - Save the trends  in (ztdta,ztdsa) ('key_trdtra')
62      !!
63      !! History :
64      !!   6.0  !  90-10  (B. Blanke)  Original code
65      !!   7.0  !  91-11  (G. Madec)
66      !!        !  92-06  (M. Imbard)  correction on tracer trend loops
67      !!        !  96-01  (G. Madec)  statement function for e3
68      !!        !  97-05  (G. Madec)  vertical component of isopycnal
69      !!        !  97-07  (G. Madec)  geopotential diffusion in s-coord
70      !!        !  00-08  (G. Madec)  double diffusive mixing
71      !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
72      !!   9.0  !  04-08  (C. Talandier) New trends organization
73      !!---------------------------------------------------------------------
74      !! * Modules used     
75      USE oce, ONLY :    ztdta => ua,       & ! use ua as 3D workspace   
76                         ztdsa => va          ! use va as 3D workspace   
77
78      !! * Arguments
79      INTEGER, INTENT( in ) ::   kt           ! ocean time-step index
80     
81      !! * Local declarations
82      INTEGER ::   ji, jj, jk, jl             ! dummy loop indices
83      REAL(wp) ::   &
84         zlavmr,                            & ! temporary scalars
85         zave3r, ze3tr,                     & !    "         "
86         zta, zsa                             !    "         "
87      REAL(wp), DIMENSION(jpi,jpk) ::   &
88         zwx, zwy, zwz, zww
89      !!---------------------------------------------------------------------
90
91
92      ! 0. Local constant initialization
93      ! --------------------------------
94      ! time step = 2 rdttra
95      IF( neuler == 0 .AND. kt == nit000 ) THEN
96         r2dt(:) =  rdttra(:)              ! restarting with Euler time stepping
97      ELSEIF( kt <= nit000 + 1) THEN
98         r2dt(:) = 2. * rdttra(:)          ! leapfrog
99      ENDIF
100      zlavmr = 1. / float( n_zdfexp )
101
102      ! Save ta and sa trends
103      IF( l_trdtra )   THEN
104         ztdta(:,:,:) = ta(:,:,:) 
105         ztdsa(:,:,:) = sa(:,:,:) 
106      ENDIF
107
108      !                                                ! ===============
109      DO jj = 2, jpjm1                                 !  Vertical slab
110         !                                             ! ===============
111         ! 1. Initializations
112         ! ------------------
113
114         ! Surface & bottom boundary conditions: no flux
115         DO ji = 2, jpim1
116            zwy(ji, 1 ) = 0.e0
117            zwy(ji,jpk) = 0.e0
118            zww(ji, 1 ) = 0.e0
119            zww(ji,jpk) = 0.e0
120         END DO
121
122         ! zwx and zwz arrays set to before tracer values
123         DO jk = 1, jpk
124            DO ji = 2, jpim1
125               zwx(ji,jk) = tb(ji,jj,jk)
126               zwz(ji,jk) = sb(ji,jj,jk)
127            END DO
128         END DO
129
130
131         ! 2. Time splitting loop
132         ! ----------------------
133
134         DO jl = 1, n_zdfexp
135
136            ! first vertical derivative
137            IF( lk_zdfddm ) THEN       ! double diffusion: avs /= avt
138               DO jk = 2, jpk
139                  DO ji = 2, jpim1
140                     zave3r = 1.e0 / fse3w(ji,jj,jk) 
141                     zwy(ji,jk) =   avt(ji,jj,jk) * ( zwx(ji,jk-1) - zwx(ji,jk) ) * zave3r
142                     zww(ji,jk) = fsavs(ji,jj,jk) * ( zwz(ji,jk-1) - zwz(ji,jk) ) * zave3r
143                  END DO
144               END DO
145            ELSE                      ! default : avs = avt
146               DO jk = 2, jpk
147                  DO ji = 2, jpim1
148                     zave3r = avt(ji,jj,jk) / fse3w(ji,jj,jk)
149                     zwy(ji,jk) = zave3r *(zwx(ji,jk-1) - zwx(ji,jk) )
150                     zww(ji,jk) = zave3r *(zwz(ji,jk-1) - zwz(ji,jk) )
151                  END DO
152               END DO
153            ENDIF
154
155            ! trend estimation at kt+l*2*rdt/n_zdfexp
156            DO jk = 1, jpkm1
157               DO ji = 2, jpim1
158                  ze3tr = zlavmr / fse3t(ji,jj,jk)
159                  ! 2nd vertical derivative
160                  zta = ( zwy(ji,jk) - zwy(ji,jk+1) ) * ze3tr
161                  zsa = ( zww(ji,jk) - zww(ji,jk+1) ) * ze3tr
162                  ! update the tracer trends
163                  ta(ji,jj,jk) = ta(ji,jj,jk) + zta
164                  sa(ji,jj,jk) = sa(ji,jj,jk) + zsa
165                  ! update tracer fields at kt+l*2*rdt/n_zdfexp
166                  zwx(ji,jk) = zwx(ji,jk) + r2dt(jk) * zta * tmask(ji,jj,jk)
167                  zwz(ji,jk) = zwz(ji,jk) + r2dt(jk) * zsa * tmask(ji,jj,jk)
168               END DO
169            END DO
170         END DO
171         !                                             ! ===============
172      END DO                                           !   End of slab
173      !                                                ! ===============
174      ! save the trends for diagnostic
175      ! vertical diffusive tracers trends
176      IF( l_trdtra )   THEN
177         ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:)
178         ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:)
179         CALL trd_mod(ztdta, ztdsa, jpttdzdf, 'TRA', kt)
180      ENDIF
181
182      IF(l_ctl) THEN         ! print mean trends (used for debugging)
183         zta = SUM( ta(2:nictl,2:njctl,1:jpkm1) * tmask(2:nictl,2:njctl,1:jpkm1) )
184         zsa = SUM( sa(2:nictl,2:njctl,1:jpkm1) * tmask(2:nictl,2:njctl,1:jpkm1) )
185         WRITE(numout,*) ' zdf  - Ta: ', zta-t_ctl, ' Sa: ', zsa-s_ctl
186         t_ctl = zta   ;   s_ctl = zsa
187      ENDIF
188
189   END SUBROUTINE tra_zdf_exp
190
191   !!==============================================================================
192END MODULE trazdf_exp
Note: See TracBrowser for help on using the repository browser.