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

Last change on this file since 789 was 789, checked in by rblod, 16 years ago

Suppress jki routines and associated key_mpp_omp

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