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

source: trunk/NEMO/OPA_SRC/TRD/trdmod.F90 @ 467

Last change on this file since 467 was 462, checked in by opalod, 18 years ago

nemo_v1_update_053:RB: light update of trends part (supppress key_partial_steps)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.3 KB
Line 
1MODULE trdmod
2   !!======================================================================
3   !!                       ***  MODULE  trdmod  ***
4   !! Ocean diagnostics:  ocean tracers and dynamic trends
5   !!=====================================================================
6#if  defined key_trdtra || defined key_trddyn || defined key_trdmld || defined key_trdvor || defined key_esopa
7   !!----------------------------------------------------------------------
8   !!   trd_mod          : Call the trend to be computed
9   !!----------------------------------------------------------------------
10   !! * Modules used
11   USE oce                     ! ocean dynamics and tracers variables
12   USE dom_oce                 ! ocean space and time domain variables
13   USE trdmod_oce              ! ocean variables trends
14   USE trdvor                  ! ocean vorticity trends
15   USE trdicp                  ! ocean bassin integral constraints properties
16   USE trdmld                  ! ocean active mixed layer tracers trends
17   USE trabbl                  ! bottom boundary layer variables
18   USE in_out_manager          ! I/O manager
19
20   IMPLICIT NONE
21   PRIVATE
22
23   !! * Routine accessibility
24   PUBLIC trd_mod        ! called by all dynXX or traXX modules
25
26   !! * Substitutions
27#  include "domzgr_substitute.h90"
28#  include "vectopt_loop_substitute.h90"
29   !!----------------------------------------------------------------------
30   !!   OPA 9.0 , LOCEAN-IPSL (2005)
31   !! $Header$
32   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
33   !!----------------------------------------------------------------------
34
35CONTAINS
36
37   SUBROUTINE trd_mod(ptrdx, ptrdy, ktrd, ctype, kt)
38      !!---------------------------------------------------------------------
39      !!                  ***  ROUTINE trd_mod  ***
40      !!
41      !! ** Purpose : Dispatch all trends computation, e.g. vorticity, mld or
42      !!              integral constrains
43      !!
44      !! ** Method :
45      !!
46      !! History :
47      !!   9.0  !  04-08  (C. Talandier) New trends organization
48      !!----------------------------------------------------------------------
49      !! * Modules used
50#if defined key_trabbl_adv
51      REAL(wp), DIMENSION(jpi,jpj,jpk) ::  &  ! temporary arrays
52         &         zun, zvn
53#else
54      USE oce                , zun => un,  &  ! When no bbl, zun == un
55         &                     zvn => vn      ! When no bbl, zvn == vn
56#endif
57
58      !! * Arguments
59      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( inout ) ::   &
60         ptrdx,                      &   ! Temperature or U trend
61         ptrdy                           ! Salinity    or V trend
62
63      INTEGER, INTENT( in ) ::   &
64         kt  ,                   & ! time step
65         ktrd                      ! tracer trend index
66
67      CHARACTER(len=3), INTENT( in ) ::   &
68         ctype                             ! momentum or tracers trends type
69         !                                 ! 'DYN' or 'TRA'
70
71      !! * Local save
72      REAL(wp), DIMENSION(jpi,jpj), SAVE ::   &
73         zbtr2
74
75      !! * Local declarations
76      INTEGER ::   ji, jj, jk    ! loop indices
77      REAL(wp) ::   &
78         zbtr,            &  ! temporary scalars
79         zfui, zfvj,           &  !    "         "
80         zfui1, zfvj1             !    "         "
81      REAL(wp), DIMENSION(jpi,jpj) ::   &
82         z2dx, z2dy                        ! workspace arrays
83      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
84         z3dx, z3dy                            ! workspace arrays
85      !!----------------------------------------------------------------------
86
87      ! Initialization of workspace arrays
88      z3dx(:,:,:) = 0.e0
89      z3dy(:,:,:) = 0.e0
90      z2dx(:,:) = 0.e0
91      z2dy(:,:) = 0.e0
92
93      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
94      ! I. Bassin averaged properties for momentum and/or tracers trends
95      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
96
97      IF( ( mod(kt,ntrd) == 0 .OR. kt == nit000 .OR. kt == nitend) )   THEN
98
99         ! Active tracers trends
100         IF( lk_trdtra .AND. ctype == 'TRA' )   THEN
101
102            IF( ktrd == jpttdnsr )   THEN
103               ! 2D array tracers surface forcing
104               z2dx(:,:) = ptrdx(:,:,1)
105               z2dy(:,:) = ptrdy(:,:,1)
106
107               CALL trd(z2dx, z2dy, ktrd, ctype)
108            ELSE
109               ! 3D array
110               CALL trd(ptrdx, ptrdy, ktrd, ctype)
111            ENDIF
112
113         ENDIF
114
115         ! Momentum trends
116         IF( lk_trddyn .AND. ctype == 'DYN' )   THEN
117
118            IF( ktrd == jpdtdswf .OR. ktrd == jpdtdbfr )   THEN
119               ! momentum surface forcing/bottom friction  2D array
120               z2dx(:,:) = ptrdx(:,:,1)
121               z2dy(:,:) = ptrdy(:,:,1)
122
123               CALL trd(z2dx, z2dy, ktrd, ctype)
124            ELSE
125               ! 3D array
126               CALL trd(ptrdx, ptrdy, ktrd, ctype)
127            ENDIF
128
129         ENDIF
130
131      ENDIF
132
133      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
134      ! II. Vorticity trends
135      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
136
137      IF( lk_trdvor .AND. ctype == 'DYN' )   THEN
138
139         SELECT CASE ( ktrd )
140
141         ! Pressure Gradient trend
142         CASE ( jpdtdhpg )     
143            CALL trd_vor_zint(ptrdx, ptrdy, jpvorprg)
144
145         ! KE Gradient trend
146         CASE ( jpdtdkeg )     
147            CALL trd_vor_zint(ptrdx, ptrdy, jpvorkeg)
148
149         ! Relative Vorticity trend
150         CASE ( jpdtdrvo )     
151            CALL trd_vor_zint(ptrdx, ptrdy, jpvorrvo)
152
153         ! Planetary Vorticity Term trend
154         CASE ( jpdtdpvo )     
155            CALL trd_vor_zint(ptrdx, ptrdy, jpvorpvo)
156
157         ! Horizontal Diffusion trend
158         CASE ( jpdtdldf )     
159            CALL trd_vor_zint(ptrdx, ptrdy, jpvorldf)
160
161         ! Vertical Advection trend
162         CASE ( jpdtdzad )     
163            CALL trd_vor_zint(ptrdx, ptrdy, jpvorzad)
164
165         ! Vertical Diffusion trend
166         CASE ( jpdtdzdf )     
167            CALL trd_vor_zint(ptrdx, ptrdy, jpvorzdf)
168
169         ! Surface Pressure Grad. trend
170         CASE ( jpdtdspg )     
171            CALL trd_vor_zint(ptrdx, ptrdy, jpvorspg)
172
173         ! Beta V trend
174         CASE ( jpdtddat )     
175            CALL trd_vor_zint(ptrdx, ptrdy, jpvorbev)
176
177         ! Wind stress forcing term
178         CASE ( jpdtdswf )     
179            z2dx(:,:) = ptrdx(:,:,1)
180            z2dy(:,:) = ptrdy(:,:,1)
181
182            CALL trd_vor_zint(z2dx, z2dy, jpvorswf)
183
184         ! Bottom friction term
185         CASE ( jpdtdbfr )     
186            z2dx(:,:) = ptrdx(:,:,1)
187            z2dy(:,:) = ptrdy(:,:,1)
188
189            CALL trd_vor_zint(z2dx, z2dy, jpvorbfr)
190
191         END SELECT
192
193      ENDIF
194
195      !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
196      ! III. Mixed layer trends
197      !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
198
199      IF( lk_trdmld .AND. ctype == 'TRA' )   THEN
200         
201         SELECT CASE ( ktrd )
202
203         ! horizontal advection trends
204         CASE ( jpttdlad )     
205
206#if defined key_trabbl_adv
207            ! Advective bottom boundary layer
208            ! -------------------------------
209            zun(:,:,:) = un(:,:,:) - u_bbl(:,:,:)
210            zvn(:,:,:) = vn(:,:,:) - v_bbl(:,:,:)
211#endif
212            IF( kt == nit000 )   zbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) )
213
214            SELECT CASE ( l_adv )
215
216            CASE ( 'ce2' )
217
218               ! Split horizontal trends into i- and j- compnents for trdmld case
219               ! ----------------------------------------------------------------
220
221               ! i- advective trend computed as Uh gradh(T)
222               DO jk = 1, jpkm1
223                  DO jj = 2, jpjm1
224                     DO ji = fs_2, fs_jpim1   ! vector opt.
225# if defined key_zco
226                        zbtr = zbtr2(ji,jj)
227                        zfui = 0.5 * e2u(ji  ,jj) * zun(ji,  jj,jk)
228                        zfui1= 0.5 * e2u(ji-1,jj) * zun(ji-1,jj,jk)
229# else         
230                        zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk)
231                        zfui = 0.5 * e2u(ji  ,jj) * fse3u(ji,  jj,jk) * zun(ji,  jj,jk)
232                        zfui1= 0.5 * e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * zun(ji-1,jj,jk)
233# endif
234                        ! save i- advective trend
235                        z3dx(ji,jj,jk) = - zbtr * ( zfui  * ( tn(ji+1,jj,jk) - tn(ji  ,jj,jk) )    &
236                            &                     + zfui1 * ( tn(ji  ,jj,jk) - tn(ji-1,jj,jk) ) )
237                        z3dy(ji,jj,jk) = - zbtr * ( zfui  * ( sn(ji+1,jj,jk) - sn(ji  ,jj,jk) )    &
238                            &                     + zfui1 * ( sn(ji  ,jj,jk) - sn(ji-1,jj,jk) ) )
239                     END DO
240                  END DO
241               END DO
242
243               ! save the i- horizontal trends for diagnostic
244               CALL trd_mld_zint(z3dx, z3dy, jpmldxad, '3D')
245
246               ! j- advective trend computed as Uh gradh(T)
247               DO jk = 1, jpkm1
248                  DO jj = 2, jpjm1
249                     DO ji = fs_2, fs_jpim1   ! vector opt.
250# if defined key_zco
251                        zbtr = zbtr2(ji,jj)
252                        zfvj = 0.5 * e1v(ji,jj  ) * zvn(ji,jj  ,jk)
253                        zfvj1= 0.5 * e1v(ji,jj-1) * zvn(ji,jj-1,jk)
254# else         
255                        zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk)
256                        zfvj = 0.5 * e1v(ji,jj  ) * fse3v(ji,jj  ,jk) * zvn(ji,jj  ,jk)
257                        zfvj1= 0.5 * e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * zvn(ji,jj-1,jk)
258# endif
259                        ! save j- advective trend
260                        z3dx(ji,jj,jk) = - zbtr * ( zfvj  * ( tn(ji,jj+1,jk) - tn(ji,jj  ,jk) )   &
261                            &                     + zfvj1 * ( tn(ji,jj  ,jk) - tn(ji,jj-1,jk) ) )
262                        z3dy(ji,jj,jk) = - zbtr * ( zfvj  * ( sn(ji,jj+1,jk) - sn(ji,jj  ,jk) )   &
263                            &                     + zfvj1 * ( sn(ji,jj  ,jk) - sn(ji,jj-1,jk) ) )
264                     END DO
265                  END DO
266               END DO
267
268               ! save the j- horizontal trend for diagnostic
269               CALL trd_mld_zint(z3dx, z3dy, jpmldyad, '3D')
270
271            CASE ( 'tvd' )
272
273               ! Recompute the horizontal advection term Div(Uh.T) term
274               z3dx(:,:,:) = ptrdx(:,:,:) - tn(:,:,:) * hdivn(:,:,:)
275               z3dy(:,:,:) = ptrdy(:,:,:) - sn(:,:,:) * hdivn(:,:,:)
276
277               ! Deduce the i- horizontal advection in substracting the j- one.
278               ! tladj()/sladj() are computed in traadv_tvd.F90 module
279               z3dx(:,:,:) = z3dx(:,:,:) - tladj(:,:,:)
280               z3dy(:,:,:) = z3dy(:,:,:) - sladj(:,:,:)
281
282               DO jk = 1, jpkm1
283                  DO jj = 2, jpjm1
284                     DO ji = fs_2, fs_jpim1
285                        zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk)
286
287                        ! Compute the zonal et meridional divergence
288                        zfui = e2u(ji  ,jj) * fse3u(ji  ,jj,jk) * zun(ji  ,jj,jk)  &
289                             - e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * zun(ji-1,jj,jk)
290                        zfvj = e1v(ji,jj  ) * fse3v(ji,jj  ,jk) * zvn(ji,jj  ,jk)  &
291                             - e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * zvn(ji,jj-1,jk)
292
293                        ! i- advective trend computed as U gradx(T/S)
294                        z3dx(ji,jj,jk) = z3dx(ji,jj,jk) + tn(ji,jj,jk) * zfui * zbtr
295                        z3dy(ji,jj,jk) = z3dy(ji,jj,jk) + sn(ji,jj,jk) * zfui * zbtr
296
297                        ! j- advective trend computed as V grady(T/S)
298                        tladj(ji,jj,jk) = tladj(ji,jj,jk) + tn(ji,jj,jk) * zfvj * zbtr
299                        sladj(ji,jj,jk) = sladj(ji,jj,jk) + sn(ji,jj,jk) * zfvj * zbtr
300
301                     END DO
302                  END DO
303               END DO
304
305               ! save the i- horizontal trend for diagnostic
306               CALL trd_mld_zint(z3dx, z3dy, jpmldxad, '3D')
307
308               ! save the j- horizontal trend for diagnostic
309               CALL trd_mld_zint(tladj, sladi, jpmldyad, '3D')
310
311            CASE ( 'mus', 'mu2' )
312
313               !  Split horizontal trends in i- and j- direction for trdmld case
314               ! ----------------------------------------------------------------
315
316               ! i- advective trend computed as U gradx(T/S)
317               DO jk = 1, jpkm1
318                  DO jj = 2, jpjm1     
319                     DO ji = fs_2, fs_jpim1   ! vector opt.
320# if defined key_zco
321                        zbtr = zbtr2(ji,jj)
322                        zfui = e2u(ji  ,jj) * zun(ji,  jj,jk)   &
323                           & - e2u(ji-1,jj) * zun(ji-1,jj,jk)
324# else     
325                        zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk)
326                        zfui =  e2u(ji  ,jj) * fse3u(ji,  jj,jk) * zun(ji,  jj,jk)   &
327                           & -  e2u(ji-1,jj) * fse3u(ji-1,jj,jk) * zun(ji-1,jj,jk)
328# endif
329                        ! save i- advective trend
330                        z3dx(ji,jj,jk) = - zbtr * ( tladi(ji,jj,jk) - tladi(ji-1,jj,jk) )   &
331                            &                      + tn(ji,jj,jk) * zfui * zbtr
332                        z3dy(ji,jj,jk) = - zbtr * ( sladi(ji,jj,jk) - sladi(ji-1,jj,jk) )  &
333                            &                      + sn(ji,jj,jk) * zfui * zbtr
334                     END DO
335                  END DO
336               END DO       
337
338               ! save the i- horizontal trends for diagnostic
339               CALL trd_mld_zint(z3dx, z3dy, jpmldxad, '3D')
340
341               ! j- advective trend computed as V grady(T/S)
342               DO jk = 1, jpkm1
343                  DO jj = 2, jpjm1     
344                     DO ji = fs_2, fs_jpim1   ! vector opt.
345# if defined key_zco
346                        zbtr = zbtr2(ji,jj)
347                        zfvj = e1v(ji,jj  ) * zvn(ji,jj  ,jk)   &
348                           & - e1v(ji,jj-1) * zvn(ji,jj-1,jk)
349# else     
350                        zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk)
351                        zfvj =  e1v(ji,jj  ) * fse3v(ji,jj  ,jk) * zvn(ji,jj  ,jk)   &
352                           & -  e1v(ji,jj-1) * fse3v(ji,jj-1,jk) * zvn(ji,jj-1,jk)
353# endif
354                        ! save j- advective trend
355                        z3dx(ji,jj,jk) =  - zbtr * ( tladj(ji,jj,jk) - tladj(ji,jj-1,jk) )   &
356                            &                       + tn(ji,jj,jk) * zfvj * zbtr
357                        z3dy(ji,jj,jk) =  - zbtr * ( sladj(ji,jj,jk) - sladj(ji,jj-1,jk) )   &
358                            &                       + sn(ji,jj,jk) * zfvj * zbtr
359                     END DO
360                  END DO
361               END DO       
362
363               ! save the j- horizontal trends for diagnostic
364               CALL trd_mld_zint(z3dx, z3dy, jpmldyad, '3D')
365
366            END SELECT
367
368         ! vertical advection trends
369         CASE ( jpttdzad )     
370            CALL trd_mld_zint(ptrdx, ptrdy, jpmldzad, '3D')
371
372         ! lateral diffusion trends
373         CASE ( jpttdldf )     
374            CALL trd_mld_zint(ptrdx, ptrdy, jpmldldf, '3D')
375# if defined key_traldf_eiv
376            ! Save the i- and j- eddy induce velocity trends
377            CALL trd_mld_zint(tladi, sladi, jpmldxei, '3D')
378            CALL trd_mld_zint(tladj, sladj, jpmldyei, '3D')
379# endif
380            IF( lk_trabbl_dif )   THEN
381               z3dx(:,:,:) = 0.e0
382               z3dy(:,:,:) = 0.e0
383               z3dx(:,:,1) = tldfbbl(:,:)
384               z3dy(:,:,1) = sldfbbl(:,:)
385               CALL trd_mld_zint(z3dx, z3dy, jpmldldf, '2D')
386            ENDIF
387
388         ! vertical diffusion trends
389         CASE ( jpttdzdf )     
390            CALL trd_mld_zint(ptrdx, ptrdy, jpmldzdf, '3D')
391
392         ! vertical diffusion trends
393         CASE ( jpttddoe )     
394            CALL trd_mld_zint(ptrdx, ptrdy, jpmldzei, '3D')
395
396         ! penetrative solar radiation trends
397         CASE ( jpttdqsr )     
398            CALL trd_mld_zint(ptrdx, ptrdy, jpmldfor, '3D')
399
400         ! non penetrative solar radiation trends
401         CASE ( jpttdnsr )
402            ptrdx(:,:,2:jpk) = 0.e0
403            ptrdy(:,:,2:jpk) = 0.e0
404            CALL trd_mld_zint(ptrdx, ptrdy, jpmldfor, '2D')
405
406         END SELECT   
407
408      ENDIF
409
410
411   END SUBROUTINE trd_mod
412
413#   else
414   !!----------------------------------------------------------------------
415   !!   Default case :                                         Empty module
416   !!----------------------------------------------------------------------
417   USE trdmod_oce      ! ocean variables trends
418
419CONTAINS
420   SUBROUTINE trd_mod(ptrd3dx, ptrd3dy, ktrd , ctype, kt)       ! Empty routine
421      REAL, DIMENSION(:,:,:), INTENT( in ) ::   &
422          ptrd3dx,                     &   ! Temperature or U trend
423          ptrd3dy                          ! Salinity    or V trend
424      INTEGER, INTENT( in ) ::   ktrd      ! momentum or tracer trend index
425      INTEGER, INTENT( in ) ::   kt        ! Time step
426      CHARACTER(len=3), INTENT( in ) ::   &
427         ctype                             ! momentum or tracers trends type
428      WRITE(*,*) 'trd_3d: You should not have seen this print! error ?', ptrd3dx(1,1,1)
429      WRITE(*,*) ' "   ": You should not have seen this print! error ?', ptrd3dy(1,1,1)
430      WRITE(*,*) ' "   ": You should not have seen this print! error ?', ktrd
431      WRITE(*,*) ' "   ": You should not have seen this print! error ?', ctype
432      WRITE(*,*) ' "   ": You should not have seen this print! error ?', kt
433   END SUBROUTINE trd_mod
434#   endif
435
436   !!======================================================================
437END MODULE trdmod
Note: See TracBrowser for help on using the repository browser.