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

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

CT : BUGFIX004 : Compilation error is solved

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.7 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 ldftra_oce      ! ???
16   USE zdfddm          ! ocean vertical physics: double diffusion
17   USE trdtra_oce      ! tracers trends diagnostics
18   USE in_out_manager  ! I/O manager
19
20
21   IMPLICIT NONE
22   PRIVATE
23
24   !! * Routine accessibility
25   PUBLIC tra_zdf_imp          ! 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 , LODYC-IPSL (2003)
36   !!----------------------------------------------------------------------
37
38CONTAINS
39
40   SUBROUTINE tra_zdf_imp( kt )
41      !!----------------------------------------------------------------------
42      !!                  ***  ROUTINE tra_zdf_imp  ***
43      !!
44      !! ** Purpose :   Compute the trend due to the vertical tracer mixing
45      !!      using an implicit time stepping and add it to the general trend
46      !!      of the tracer equations.
47      !!
48      !! ** Method  :   The vertical diffusion of tracers (t & s) is given by:
49      !!          difft = dz( avt dz(t) ) = 1/e3t dk+1( avt/e3w dk(ta) )
50      !!      It is thus evaluated using a backward time scheme
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_trdtra')
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                 ! dummy loop indices
75      INTEGER ::   ikst, ikenm2, ikstp1
76      REAL(wp), DIMENSION(jpi,jpk) ::   &
77         zwd, zws, zwi,          &  ! ???
78         zwx, zwy, zwz, zwt         ! ???
79#if defined key_trdtra   ||   defined key_trdmld
80      REAL(wp) ::   zta, zsa        ! temporary scalars
81#endif
82      !!---------------------------------------------------------------------
83
84
85      ! 0. Local constant initialization
86      ! --------------------------------
87
88      ! time step = 2 rdttra ex
89      IF( neuler == 0 .AND. kt == nit000 ) THEN
90         r2dt(:) =  rdttra(:)              ! restarting with Euler time stepping
91      ELSEIF( kt <= nit000 + 1) THEN
92         r2dt(:) = 2. * rdttra(:)          ! leapfrog
93      ENDIF
94
95      !                                                ! ===============
96      DO jj = 2, jpjm1                                 !  Vertical slab
97         !                                             ! ===============
98         ! 0. Matrix construction
99         ! ----------------------
100
101         ! Diagonal, inferior, superior (including the bottom boundary condition via avt masked)
102         DO jk = 1, jpkm1
103            DO ji = 2, jpim1
104               zwi(ji,jk) = - r2dt(jk) * avt(ji,jj,jk  )   &
105                                       / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) )
106               zws(ji,jk) = - r2dt(jk) * avt(ji,jj,jk+1)   &
107                                       / ( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) )
108               zwd(ji,jk) = 1. - zwi(ji,jk) - zws(ji,jk)
109            END DO
110         END DO
111
112         ! Surface boudary conditions
113         DO ji = 2, jpim1
114            zwi(ji,1) = 0.e0
115            zwd(ji,1) = 1. - zws(ji,1)
116         END DO
117
118         ! 1. Vertical diffusion on temperature
119         ! -------------------------===========
120
121         ! Second member construction
122         DO jk = 1, jpkm1
123            DO ji = 2, jpim1
124               zwy(ji,jk) = tb(ji,jj,jk) + r2dt(jk) * ta(ji,jj,jk)
125            END DO
126         END DO
127
128         ! Matrix inversion from the first level
129         ikst = 1
130
131#   include "zdf.matrixsolver.h90"
132
133#if defined key_trdtra   ||   defined key_trdmld
134         ! Compute and save the vertical diffusive temperature trends
135         IF( l_traldf_iso ) THEN
136            DO jk = 1, jpkm1
137               DO ji = 2, jpim1
138                  zta = ( zwx(ji,jk) - tb(ji,jj,jk) ) / r2dt(jk)
139                  ttrd(ji,jj,jk,4) = zta - ta(ji,jj,jk) + ttrd(ji,jj,jk,4)
140               END DO
141            END DO
142         ELSE
143            DO jk = 1, jpkm1
144               DO ji = 2, jpim1
145                  zta = ( zwx(ji,jk) - tb(ji,jj,jk) ) / r2dt(jk)
146                  ttrd(ji,jj,jk,4) = zta - ta(ji,jj,jk)
147               END DO
148            END DO
149         ENDIF
150
151#endif
152
153         ! Save the masked temperature after in ta
154         ! (c a u t i o n:  temperature not its trend, Leap-frog scheme done
155         !                  it will not be done in tranxt)
156         DO jk = 1, jpkm1
157            DO ji = 2, jpim1
158               ta(ji,jj,jk) = zwx(ji,jk) * tmask(ji,jj,jk)
159            END DO
160         END DO
161
162
163         ! 2. Vertical diffusion on salinity
164         ! -------------------------========
165
166#if defined key_zdfddm
167         ! Rebuild the Matrix as avt /= avs
168
169         ! Diagonal, inferior, superior
170         ! (including the bottom boundary condition via avs masked)
171         DO jk = 1, jpkm1
172            DO ji = 2, jpim1
173               zwi(ji,jk) = - r2dt(jk) * fsavs(ji,jj,jk  )   &
174                  /( fse3t(ji,jj,jk) * fse3w(ji,jj,jk  ) )
175               zws(ji,jk) = - r2dt(jk) * fsavs(ji,jj,jk+1)   &
176                  /( fse3t(ji,jj,jk) * fse3w(ji,jj,jk+1) )
177               zwd(ji,jk) = 1. - zwi(ji,jk) - zws(ji,jk)
178            END DO
179         END DO
180
181         ! Surface boudary conditions
182         DO ji = 2, jpim1
183            zwi(ji,1) = 0.e0
184            zwd(ji,1) = 1. - zws(ji,1)
185         END DO
186#endif
187         ! Second member construction
188         DO jk = 1, jpkm1
189            DO ji = 2, jpim1
190               zwy(ji,jk) = sb(ji,jj,jk) + r2dt(jk) * sa(ji,jj,jk)
191            END DO
192         END DO
193
194         ! Matrix inversion from the first level
195         ikst = 1
196
197#   include "zdf.matrixsolver.h90"
198
199#if defined key_trdtra   ||   defined key_trdmld
200         ! Compute and save the vertical diffusive salinity trends
201         IF( l_traldf_iso ) THEN
202            DO jk = 1, jpkm1
203               DO ji = 2, jpim1
204                  zsa = ( zwx(ji,jk) - sb(ji,jj,jk) ) / r2dt(jk)
205                  strd(ji,jj,jk,4) = zsa - sa(ji,jj,jk) + strd(ji,jj,jk,4)
206               END DO
207            END DO
208         ELSE
209            DO jk = 1, jpkm1
210               DO ji = 2, jpim1
211                  zsa = ( zwx(ji,jk) - sb(ji,jj,jk) ) / r2dt(jk)
212                  strd(ji,jj,jk,4) = zsa - sa(ji,jj,jk)
213               END DO
214            END DO
215         ENDIF
216#endif
217
218         ! Save the masked salinity after in sa
219         ! (c a u t i o n:  salinity not its trend, Leap-frog scheme done
220         !                  it will not be done in tranxt)
221         DO jk = 1, jpkm1
222            DO ji = 2, jpim1
223               sa(ji,jj,jk) = zwx(ji,jk)  * tmask(ji,jj,jk)
224            END DO
225         END DO
226
227         !                                             ! ===============
228      END DO                                           !   End of slab
229      !                                                ! ===============
230
231   END SUBROUTINE tra_zdf_imp
232
233   !!==============================================================================
234END MODULE trazdf_imp
Note: See TracBrowser for help on using the repository browser.