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

Last change on this file since 3 was 3, checked in by opalod, 20 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.2 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 trdtra_oce      ! ocean active tracer trends
16   USE zdf_oce         ! ocean vertical physics
17   USE zdfddm          ! ocean vertical physics: double diffusion
18   USE in_out_manager  ! I/O manager
19
20   IMPLICIT NONE
21   PRIVATE
22
23   !! * Routine accessibility
24   PUBLIC tra_zdf_exp          ! routine called by step.F90
25
26   !! * Module variable
27   REAL(wp), DIMENSION(jpk) ::   &
28      r2dt                     ! vertical profile of 2 x tracer time-step
29
30   !! * Substitutions
31#  include "domzgr_substitute.h90"
32#  include "zdfddm_substitute.h90"
33   !!----------------------------------------------------------------------
34   !!  OPA 9.0, LODYC-IPSL (2003)
35   !!----------------------------------------------------------------------
36
37CONTAINS
38
39   SUBROUTINE tra_zdf_exp( kt )
40      !!----------------------------------------------------------------------
41      !!                  ***  ROUTINE tra_zdf_exp  ***
42      !!                   
43      !! ** Purpose :   Compute the trend due to the vertical tracer mixing
44      !!      using an explicit time stepping and add it to the general trend
45      !!      of the tracer equations.
46      !!
47      !! ** Method  :   The vertical diffusion of tracers (t & s) is given by:
48      !!         difft = dz( avt dz(tb) ) = 1/e3t dk+1( avt/e3w dk(tb) )
49      !!      It is evaluated with an Euler scheme, using a time splitting
50      !!      technique.
51      !!      Surface and bottom boundary conditions: no diffusive flux on
52      !!      both tracers (bottom, applied through the masked field avt).
53      !!      Add this trend to the general trend ta,sa :
54      !!          ta = ta + dz( avt dz(t) )
55      !!         (sa = sa + dz( avs dz(t) ) if lk_zdfddm= T)
56      !!
57      !! ** Action : - Update (ta,sa) with the before vertical diffusion trend
58      !!             - Save the trends  in (ttrd,strd) ('key_diatrends')
59      !!
60      !! History :
61      !!   6.0  !  90-10  (B. Blanke)  Original code
62      !!   7.0  !  91-11  (G. Madec)
63      !!        !  92-06  (M. Imbard)  correction on tracer trend loops
64      !!        !  96-01  (G. Madec)  statement function for e3
65      !!        !  97-05  (G. Madec)  vertical component of isopycnal
66      !!        !  97-07  (G. Madec)  geopotential diffusion in s-coord
67      !!        !  00-08  (G. Madec)  double diffusive mixing
68      !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
69      !!---------------------------------------------------------------------
70      !! * Arguments
71      INTEGER, INTENT( in ) ::   kt           ! ocean time-step index
72     
73      !! * Local declarations
74      INTEGER ::   ji, jj, jk, jl             ! dummy loop indices
75      REAL(wp) ::   &
76         zlavmr,                 &  ! ???
77         zave3r, ze3tr,          &  ! ???
78         zta, zsa                   !
79      REAL(wp), DIMENSION(jpi,jpk) ::   &
80         zwx, zwy, zwz, zww
81      !!---------------------------------------------------------------------
82
83
84      ! 0. Local constant initialization
85      ! --------------------------------
86      ! time step = 2 rdttra
87      IF( neuler == 0 .AND. kt == nit000 ) THEN
88         r2dt(:) =  rdttra(:)              ! restarting with Euler time stepping
89      ELSEIF( kt <= nit000 + 1) THEN
90         r2dt(:) = 2. * rdttra(:)          ! leapfrog
91      ENDIF
92      zlavmr = 1. / float( n_zdfexp )
93
94      !                                                ! ===============
95      DO jj = 2, jpjm1                                 !  Vertical slab
96         !                                             ! ===============
97         ! 1. Initializations
98         ! ------------------
99
100         ! Surface & bottom boundary conditions: no flux
101         DO ji = 2, jpim1
102            zwy(ji, 1 ) = 0.e0
103            zwy(ji,jpk) = 0.e0
104            zww(ji, 1 ) = 0.e0
105            zww(ji,jpk) = 0.e0
106         END DO
107
108         ! zwx and zwz arrays set to before tracer values
109         DO jk = 1, jpk
110            DO ji = 2, jpim1
111               zwx(ji,jk) = tb(ji,jj,jk)
112               zwz(ji,jk) = sb(ji,jj,jk)
113#if defined key_trdtra
114               ! initialize vertical diffusive tracer trends to zero
115               ttrd(ji,jj,jk,4) = 0.e0
116               strd(ji,jj,jk,4) = 0.e0
117#endif
118            END DO
119         END DO
120
121
122         ! 2. Time splitting loop
123         ! ----------------------
124
125         DO jl = 1, n_zdfexp
126
127            ! first vertical derivative
128            IF( lk_zdfddm ) THEN       ! double diffusion: avs /= avt
129               DO jk = 2, jpk
130                  DO ji = 2, jpim1
131                     zave3r = 1.e0 / fse3w(ji,jj,jk) 
132                     zwy(ji,jk) =   avt(ji,jj,jk) * ( zwx(ji,jk-1) - zwx(ji,jk) ) * zave3r
133                     zww(ji,jk) = fsavs(ji,jj,jk) * ( zwz(ji,jk-1) - zwz(ji,jk) ) * zave3r
134                  END DO
135               END DO
136            ELSE                      ! default : avs = avt
137               DO jk = 2, jpk
138                  DO ji = 2, jpim1
139                     zave3r = avt(ji,jj,jk) / fse3w(ji,jj,jk)
140                     zwy(ji,jk) = zave3r *(zwx(ji,jk-1) - zwx(ji,jk) )
141                     zww(ji,jk) = zave3r *(zwz(ji,jk-1) - zwz(ji,jk) )
142                  END DO
143               END DO
144            ENDIF
145
146            ! trend estimation at kt+l*2*rdt/n_zdfexp
147            DO jk = 1, jpkm1
148               DO ji = 2, jpim1
149                  ze3tr = zlavmr / fse3t(ji,jj,jk)
150                  ! 2nd vertical derivative
151                  zta = ( zwy(ji,jk) - zwy(ji,jk+1) ) * ze3tr
152                  zsa = ( zww(ji,jk) - zww(ji,jk+1) ) * ze3tr
153                  ! update the tracer trends
154                  ta(ji,jj,jk) = ta(ji,jj,jk) + zta
155                  sa(ji,jj,jk) = sa(ji,jj,jk) + zsa
156                  ! update tracer fields at kt+l*2*rdt/n_zdfexp
157                  zwx(ji,jk) = zwx(ji,jk) + r2dt(jk) * zta * tmask(ji,jj,jk)
158                  zwz(ji,jk) = zwz(ji,jk) + r2dt(jk) * zsa * tmask(ji,jj,jk)
159#if defined key_trdtra
160                  ! save tracer trends
161                  ttrd(ji,jj,jk,4) = ttrd(ji,jj,jk,4) + zta
162                  strd(ji,jj,jk,4) = strd(ji,jj,jk,4) + zsa
163#endif
164               END DO
165            END DO
166         END DO
167         !                                             ! ===============
168      END DO                                           !   End of slab
169      !                                                ! ===============
170   END SUBROUTINE tra_zdf_exp
171
172   !!==============================================================================
173END MODULE trazdf_exp
Note: See TracBrowser for help on using the repository browser.