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

Last change on this file since 215 was 215, checked in by opalod, 19 years ago

CT : UPDATE151 : New trends organization

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