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

source: trunk/NEMO/OPA_SRC/TRA/trazdf_imp.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: 8.6 KB
Line 
1MODULE trazdf_imp
2   !!==============================================================================
3   !!                    ***  MODULE  trazdf_imp  ***
4   !! Ocean active tracers:  vertical component of the tracer mixing trend
5   !!==============================================================================
6
7   !!----------------------------------------------------------------------
8   !!   tra_zdf_imp  : update the tracer trend with the vertical diffusion
9   !!                  using an implicit time-stepping.
10   !!----------------------------------------------------------------------
11   !! * Modules used
12   USE oce             ! ocean dynamics and active tracers
13   USE dom_oce         ! ocean space and time domain
14   USE zdf_oce         ! ocean vertical physics
15   USE zdfddm          ! ocean vertical physics: double diffusion
16   USE trdtra_oce     ! tracers trends diagnostics
17   USE in_out_manager  ! I/O manager
18
19
20   IMPLICIT NONE
21   PRIVATE
22
23   !! * Routine accessibility
24   PUBLIC tra_zdf_imp          ! 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_imp( kt )
40      !!----------------------------------------------------------------------
41      !!                  ***  ROUTINE tra_zdf_imp  ***
42      !!
43      !! ** Purpose :   Compute the trend due to the vertical tracer mixing
44      !!      using an implicit 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(t) ) = 1/e3t dk+1( avt/e3w dk(ta) )
49      !!      It is thus evaluated using a backward time scheme
50      !!      Surface and bottom boundary conditions: no diffusive flux on
51      !!      both tracers (bottom, applied through the masked field avt).
52      !!      Add this trend to the general trend ta,sa :
53      !!          ta = ta + dz( avt dz(t) )
54      !!         (sa = sa + dz( avs dz(t) ) if lk_zdfddm=T)
55      !!
56      !! ** Action  : - Update (ta,sa) with the before vertical diffusion trend
57      !!              - save the trends in (ttrd,strd) ('key_trdtra')
58      !!
59      !! History :
60      !!   6.0  !  90-10  (B. Blanke)  Original code
61      !!   7.0  !  91-11  (G. Madec)
62      !!        !  92-06  (M. Imbard)  correction on tracer trend loops
63      !!        !  96-01  (G. Madec)  statement function for e3
64      !!        !  97-05  (G. Madec)  vertical component of isopycnal
65      !!        !  97-07  (G. Madec)  geopotential diffusion in s-coord
66      !!        !  00-08  (G. Madec)  double diffusive mixing
67      !!   8.5  !  02-08  (G. Madec)  F90: Free form and module
68      !!---------------------------------------------------------------------
69      !! * Arguments
70      INTEGER, INTENT( in ) ::   kt           ! ocean time-step index
71
72      !! * Local declarations
73      INTEGER ::   ji, jj, jk                 ! dummy loop indices
74      INTEGER ::   ikst, ikenm2, ikstp1
75      REAL(wp), DIMENSION(jpi,jpk) ::   &
76         zwd, zws, zwi,          &  ! ???
77         zwx, zwy, zwz, zwt         ! ???
78#if defined key_trdtra   ||   defined key_trdmld
79      REAL(wp) ::   zta, zsa        ! temporary scalars
80#endif
81      !!---------------------------------------------------------------------
82
83
84      ! 0. Local constant initialization
85      ! --------------------------------
86
87      ! time step = 2 rdttra ex
88      IF( neuler == 0 .AND. kt == nit000 ) THEN
89         r2dt(:) =  rdttra(:)              ! restarting with Euler time stepping
90      ELSEIF( kt <= nit000 + 1) THEN
91         r2dt(:) = 2. * rdttra(:)          ! leapfrog
92      ENDIF
93
94      !                                                ! ===============
95      DO jj = 2, jpjm1                                 !  Vertical slab
96         !                                             ! ===============
97         ! 0. Matrix construction
98         ! ----------------------
99
100         ! Diagonal, inferior, superior (including the bottom boundary condition via avt masked)
101         DO jk = 1, jpkm1
102            DO ji = 2, jpim1
103               zwi(ji,jk) = - r2dt(jk) * avt(ji,jj,jk  )   &
104                                       / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) )
105               zws(ji,jk) = - r2dt(jk) * avt(ji,jj,jk+1)   &
106                                       / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) )
107               zwd(ji,jk) = 1. - zwi(ji,jk) - zws(ji,jk)
108            END DO
109         END DO
110
111         ! Surface boudary conditions
112         DO ji = 2, jpim1
113            zwi(ji,1) = 0.e0
114            zwd(ji,1) = 1. - zws(ji,1)
115         END DO
116
117         ! 1. Vertical diffusion on temperature
118         ! -------------------------===========
119
120         ! Second member construction
121         DO jk = 1, jpkm1
122            DO ji = 2, jpim1
123               zwy(ji,jk) = tb(ji,jj,jk) + r2dt(jk) * ta(ji,jj,jk)
124            END DO
125         END DO
126
127         ! Matrix inversion from the first level
128         ikst = 1
129
130#   include "zdf.matrixsolver.h90"
131
132#if defined key_trdtra   ||   defined key_trdmld
133         ! Compute and save the vertical diffusive temperature trends
134         IF( l_traldf_iso ) THEN
135            DO jk = 1, jpkm1
136               DO ji = 2, jpim1
137                  zta = ( zwx(ji,jk) - tb(ji,jj,jk) ) / r2dt(jk)
138                  ttrd(ji,jj,jk,4) = zta - ta(ji,jj,jk) + ttrd(ji,jj,jk,4)
139               END DO
140            END DO
141         ELSE
142            DO jk = 1, jpkm1
143               DO ji = 2, jpim1
144                  zta = ( zwx(ji,jk) - tb(ji,jj,jk) ) / r2dt(jk)
145                  ttrd(ji,jj,jk,4) = zta - ta(ji,jj,jk)
146               END DO
147            END DO
148         ENDIF
149
150#endif
151
152         ! Save the masked temperature after in ta
153         ! (c a u t i o n:  temperature not its trend, Leap-frog scheme done
154         !                  it will not be done in tranxt)
155         DO jk = 1, jpkm1
156            DO ji = 2, jpim1
157               ta(ji,jj,jk) = zwx(ji,jk) * tmask(ji,jj,jk)
158            END DO
159         END DO
160
161
162         ! 2. Vertical diffusion on salinity
163         ! -------------------------========
164
165#if defined key_zdfddm
166         ! Rebuild the Matrix as avt /= avs
167
168         ! Diagonal, inferior, superior
169         ! (including the bottom boundary condition via avs masked)
170         DO jk = 1, jpkm1
171            DO ji = 2, jpim1
172               zwi(ji,jk) = - r2dt(jk) * fsavs(ji,jj,jk  )   &
173                  /( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) )
174               zws(ji,jk) = - r2dt(jk) * fsavs(ji,jj,jk+1)   &
175                  /( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) )
176               zwd(ji,jk) = 1. - zwi(ji,jk) - zws(ji,jk)
177            END DO
178         END DO
179
180         ! Surface boudary conditions
181         DO ji = 2, jpim1
182            zwi(ji,1) = 0.e0
183            zwd(ji,1) = 1. - zws(ji,1)
184         END DO
185#endif
186         ! Second member construction
187         DO jk = 1, jpkm1
188            DO ji = 2, jpim1
189               zwy(ji,jk) = sb(ji,jj,jk) + r2dt(jk) * sa(ji,jj,jk)
190            END DO
191         END DO
192
193         ! Matrix inversion from the first level
194         ikst = 1
195
196#   include "zdf.matrixsolver.h90"
197
198#if defined key_trdtra   ||   defined key_trdmld
199         ! Compute and save the vertical diffusive salinity trends
200         IF( l_traldf_iso ) THEN
201            DO jk = 1, jpkm1
202               DO ji = 2, jpim1
203                  zsa = ( zwx(ji,jk) - sb(ji,jj,jk) ) / r2dt(jk)
204                  strd(ji,jj,jk,4) = zsa - sa(ji,jj,jk) + strd(ji,jj,jk,4)
205               END DO
206            END DO
207         ELSE
208            DO jk = 1, jpkm1
209               DO ji = 2, jpim1
210                  zsa = ( zwx(ji,jk) - sb(ji,jj,jk) ) / r2dt(jk)
211                  strd(ji,jj,jk,4) = zsa - sa(ji,jj,jk)
212               END DO
213            END DO
214         ENDIF
215#endif
216
217         ! Save the masked salinity after in sa
218         ! (c a u t i o n:  salinity not its trend, Leap-frog scheme done
219         !                  it will not be done in tranxt)
220         DO jk = 1, jpkm1
221            DO ji = 2, jpim1
222               sa(ji,jj,jk) = zwx(ji,jk)  * tmask(ji,jj,jk)
223            END DO
224         END DO
225
226         !                                             ! ===============
227      END DO                                           !   End of slab
228      !                                                ! ===============
229
230   END SUBROUTINE tra_zdf_imp
231
232   !!==============================================================================
233END MODULE trazdf_imp
Note: See TracBrowser for help on using the repository browser.