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.
trdglo.F90 in branches/2012/dev_r3309_LOCEAN12_Ediag/NEMOGCM/NEMO/OPA_SRC/TRD – NEMO

source: branches/2012/dev_r3309_LOCEAN12_Ediag/NEMOGCM/NEMO/OPA_SRC/TRD/trdglo.F90 @ 3318

Last change on this file since 3318 was 3318, checked in by gm, 12 years ago

Ediag branche: #927 split TRA/DYN trd computation

  • Property svn:keywords set to Id
File size: 28.4 KB
RevLine 
[3318]1MODULE trdglo
[215]2   !!======================================================================
[3318]3   !!                       ***  MODULE  trdglo  ***
4   !! Ocean diagnostics:  global domain averaged tracer and momentum trends
[215]5   !!=====================================================================
[2528]6   !! History :  1.0  !  2004-08 (C. Talandier) New trends organization
[3316]7   !!            3.5  !  2012-02 (G. Madec)  add 3D tracer zdf trend output using iom
[503]8   !!----------------------------------------------------------------------
[3317]9
[215]10   !!----------------------------------------------------------------------
[3318]11   !!   trd_glo      : domain averaged budget of trends (including kinetic energy and T^2 trends)
12   !!   glo_dyn_wri  : print dynamic trends in ocean.output file
13   !!   glo_tra_wri  : print global T & T^2 trends in ocean.output file
14   !!   trd_glo_init : initialization step
[215]15   !!----------------------------------------------------------------------
16   USE oce             ! ocean dynamics and tracers variables
17   USE dom_oce         ! ocean space and time domain variables
[3317]18   USE sbc_oce         ! surface boundary condition: ocean
[3318]19   USE trd_oce         ! trends: ocean variables
[3317]20   USE phycst          ! physical constants
[215]21   USE ldftra_oce      ! ocean active tracers: lateral physics
22   USE ldfdyn_oce      ! ocean dynamics: lateral physics
23   USE zdf_oce         ! ocean vertical physics
[3317]24   USE zdfbfr          ! bottom friction
[3316]25   USE zdfddm          ! ocean vertical physics: double diffusion
[215]26   USE eosbn2          ! equation of state
27   USE phycst          ! physical constants
[3316]28   USE lib_mpp         ! distibuted memory computing library
29   USE in_out_manager  ! I/O manager
30   USE iom             ! I/O manager library
[3294]31   USE wrk_nemo        ! Memory allocation
[215]32
33   IMPLICIT NONE
34   PRIVATE
35
[3318]36   PUBLIC   trd_glo       ! called by trdtra and trddyn modules
37   PUBLIC   trd_glo_init  ! called by trdini module
[215]38
[3317]39   !                     !!! Variables used for diagnostics
40   REAL(wp) ::   tvolt    ! volume of the whole ocean computed at t-points
41   REAL(wp) ::   tvolu    ! volume of the whole ocean computed at u-points
42   REAL(wp) ::   tvolv    ! volume of the whole ocean computed at v-points
43   REAL(wp) ::   rpktrd   ! potential to kinetic energy conversion
44   REAL(wp) ::   peke     ! conversion potential energy - kinetic energy trend
45
46   !                     !!! domain averaged trends
47   REAL(wp), DIMENSION(jptot_tra) ::   tmo, smo   ! temperature and salinity trends
48   REAL(wp), DIMENSION(jptot_tra) ::   t2 , s2    ! T^2 and S^2 trends
49   REAL(wp), DIMENSION(jptot_dyn) ::   umo, vmo   ! momentum trends
50   REAL(wp), DIMENSION(jptot_dyn) ::   hke        ! kinetic energy trends (u^2+v^2)
51
[215]52   !! * Substitutions
53#  include "domzgr_substitute.h90"
54#  include "vectopt_loop_substitute.h90"
[3316]55#  include "zdfddm_substitute.h90"
[215]56   !!----------------------------------------------------------------------
[2528]57   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
58   !! $Id$
[2715]59   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[215]60   !!----------------------------------------------------------------------
61CONTAINS
62
[3318]63   SUBROUTINE trd_glo( ptrdx, ptrdy, ktrd, ctype, kt )
[215]64      !!---------------------------------------------------------------------
[3318]65      !!                  ***  ROUTINE trd_glo  ***
[215]66      !!
[3318]67      !! ** Purpose :   compute and print global domain averaged trends for
68      !!              T, T^2, momentum, KE, and KE<->PE
69      !!
[503]70      !!----------------------------------------------------------------------
[3317]71      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdx   ! Temperature or U trend
72      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   ptrdy   ! Salinity    or V trend
73      INTEGER                   , INTENT(in   ) ::   ktrd    ! tracer trend index
[3318]74      CHARACTER(len=3)          , INTENT(in   ) ::   ctype   ! momentum or tracers trends type (='DYN'/'TRA')
[3317]75      INTEGER                   , INTENT(in   ) ::   kt      ! time step
[215]76      !!
[3317]77      INTEGER ::   ji, jj, jk      ! dummy loop indices
78      INTEGER ::   ikbu, ikbv      ! local integers
79      REAL(wp)::   zvm, zvt, zvs, z1_2rau0   ! local scalars
80      REAL(wp), POINTER, DIMENSION(:,:)  :: ztswu, ztswv, z2dx, z2dy   ! 2D workspace
[215]81      !!----------------------------------------------------------------------
82
[3317]83      CALL wrk_alloc( jpi, jpj, ztswu, ztswv, z2dx, z2dy )
84
85      IF( MOD(kt,nn_trd) == 0 .OR. kt == nit000 .OR. kt == nitend ) THEN
[503]86         !
[3317]87         SELECT CASE( ctype )
88         !
89         CASE( 'TRA' )          !==  Tracers (T & S)  ==!
90            DO jk = 1, jpkm1       ! global sum of mask volume trend and trend*T (including interior mask)
91               DO jj = 1, jpj
92                  DO ji = 1, jpi       
93                     zvm = e1e2t(ji,jj) * fse3t(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj)
94                     zvt = ptrdx(ji,jj,jk) * zvm
95                     zvs = ptrdy(ji,jj,jk) * zvm
96                     tmo(ktrd) = tmo(ktrd) + zvt   
97                     smo(ktrd) = smo(ktrd) + zvs
98                     t2 (ktrd) = t2(ktrd)  + zvt * tsn(ji,jj,jk,jp_tem)
99                     s2 (ktrd) = s2(ktrd)  + zvs * tsn(ji,jj,jk,jp_sal)
100                  END DO
[503]101               END DO
102            END DO
[3317]103            !                       ! linear free surface: diagnose advective flux trough the fixed k=1 w-surface
[3318]104            IF( .NOT.lk_vvl .AND. ktrd == jptra_zad ) THEN 
105               tmo(jptra_sad) = SUM( wn(:,:,1) * tsn(:,:,1,jp_tem) * e1e2t(:,:) )
106               smo(jptra_sad) = SUM( wn(:,:,1) * tsn(:,:,1,jp_sal) * e1e2t(:,:)  )
107               t2 (jptra_sad) = SUM( wn(:,:,1) * tsn(:,:,1,jp_tem) * tsn(:,:,1,jp_tem) * e1e2t(:,:)  )
108               s2 (jptra_sad) = SUM( wn(:,:,1) * tsn(:,:,1,jp_sal) * tsn(:,:,1,jp_sal) * e1e2t(:,:)  )
[3317]109            ENDIF
110            !
[3318]111            IF( ktrd == jptra_atf ) THEN     ! last trend (asselin time filter)
[3317]112               !
[3318]113               CALL glo_tra_wri( kt )             ! print the results in ocean.output
[3317]114               !               
[3318]115               tmo(:) = 0._wp                     ! prepare the next time step (domain averaged array reset to zero)
[3317]116               smo(:) = 0._wp
117               t2 (:) = 0._wp
118               s2 (:) = 0._wp
119               !
120            ENDIF
121            !
122         CASE( 'DYN' )          !==  Momentum and KE  ==!       
123            DO jk = 1, jpkm1
124               DO jj = 1, jpjm1
125                  DO ji = 1, jpim1
126                     zvt = ptrdx(ji,jj,jk) * tmask_i(ji+1,jj  ) * tmask_i(ji,jj) * umask(ji,jj,jk)   &
127                        &                  * e1u    (ji  ,jj  ) * e2u    (ji,jj) * fse3u(ji,jj,jk)
128                     zvs = ptrdy(ji,jj,jk) * tmask_i(ji  ,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk)   &
129                        &                  * e1v    (ji  ,jj  ) * e2v    (ji,jj) * fse3u(ji,jj,jk)
130                     umo(ktrd) = umo(ktrd) + zvt
131                     vmo(ktrd) = vmo(ktrd) + zvs
132                     hke(ktrd) = hke(ktrd) + un(ji,jj,jk) * zvt + vn(ji,jj,jk) * zvs
133                  END DO
134               END DO
135            END DO
136            !                 
[3318]137            IF( ktrd == jpdyn_zdf ) THEN      ! zdf trend: compute separately the surface forcing trend
[3317]138               z1_2rau0 = 0.5_wp / rau0
139               DO jj = 1, jpjm1
140                  DO ji = 1, jpim1
141                     zvt = ( utau_b(ji,jj) + utau(ji,jj) ) * tmask_i(ji+1,jj  ) * tmask_i(ji,jj) * umask(ji,jj,jk)   &
142                        &                       * z1_2rau0 * e1u    (ji  ,jj  ) * e2u    (ji,jj)
143                     zvs = ( vtau_b(ji,jj) + vtau(ji,jj) ) * tmask_i(ji  ,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk)   &
144                        &                       * z1_2rau0 * e1v    (ji  ,jj  ) * e2v    (ji,jj) * fse3u(ji,jj,jk)
[3318]145                     umo(jpdyn_tau) = umo(jpdyn_tau) + zvt
146                     vmo(jpdyn_tau) = vmo(jpdyn_tau) + zvs
147                     hke(jpdyn_tau) = hke(jpdyn_tau) + un(ji,jj,1) * zvt + vn(ji,jj,1) * zvs
[3317]148                  END DO
149               END DO
150            ENDIF
151            !                       
[3318]152            IF( ktrd == jpdyn_atf ) THEN     ! last trend (asselin time filter)
[3317]153               !
154               IF( ln_bfrimp ) THEN                   ! implicit bfr case: compute separately the bottom friction
155                  z1_2rau0 = 0.5_wp / rau0
156                  DO jj = 1, jpjm1
157                     DO ji = 1, jpim1
158                        ikbu = mbku(ji,jj)                  ! deepest ocean u- & v-levels
159                        ikbv = mbkv(ji,jj)
160                        zvt = bfrua(ji,jj) * un(ji,jj,ikbu) * e1u(ji,jj) * e2v(ji,jj)
161                        zvs = bfrva(ji,jj) * vn(ji,jj,ikbv) * e1v(ji,jj) * e2v(ji,jj)
[3318]162                        umo(jpdyn_bfr) = umo(jpdyn_bfr) + zvt
163                        vmo(jpdyn_bfr) = vmo(jpdyn_bfr) + zvs
164                        hke(jpdyn_bfr) = hke(jpdyn_bfr) + un(ji,jj,ikbu) * zvt + vn(ji,jj,ikbv) * zvs
[3317]165                     END DO
166                  END DO
167               ENDIF
168               !
[3318]169               CALL glo_dyn_wri( kt )                 ! print the results in ocean.output
[3317]170               !               
171               umo(:) = 0._wp                         ! reset for the next time step
172               vmo(:) = 0._wp
173               hke(:) = 0._wp
174               !
175            ENDIF
176            !
177         END SELECT
[503]178         !
[3317]179      ENDIF
[503]180      !
[3317]181      CALL wrk_dealloc( jpi, jpj, ztswu, ztswv, z2dx, z2dy )
[503]182      !
[3318]183   END SUBROUTINE trd_glo
[215]184
185
[3318]186   SUBROUTINE trd_glo_init
[215]187      !!---------------------------------------------------------------------
[3318]188      !!                  ***  ROUTINE trd_glo_init  ***
[215]189      !!
[503]190      !! ** Purpose :   Read the namtrd namelist
[215]191      !!----------------------------------------------------------------------
[2715]192      INTEGER  ::   ji, jj, jk   ! dummy loop indices
[215]193      !!----------------------------------------------------------------------
194
195      IF(lwp) THEN
196         WRITE(numout,*)
[3318]197         WRITE(numout,*) 'trd_glo_init : integral constraints properties trends'
[215]198         WRITE(numout,*) '~~~~~~~~~~~~~'
199      ENDIF
200
201      ! Total volume at t-points:
[2715]202      tvolt = 0._wp
[215]203      DO jk = 1, jpkm1
[2715]204         tvolt = SUM( e1e2t(:,:) * fse3t(:,:,jk) * tmask(:,:,jk) * tmask_i(:,:) )
[215]205      END DO
206      IF( lk_mpp )   CALL mpp_sum( tvolt )   ! sum over the global domain
207
[503]208      IF(lwp) WRITE(numout,*) '                total ocean volume at T-point   tvolt = ',tvolt
[215]209
210      ! Initialization of potential to kinetic energy conversion
[2715]211      rpktrd = 0._wp
[215]212
213      ! Total volume at u-, v- points:
[2715]214      tvolu = 0._wp
215      tvolv = 0._wp
[215]216
217      DO jk = 1, jpk
218         DO jj = 2, jpjm1
219            DO ji = fs_2, fs_jpim1   ! vector opt.
[2715]220               tvolu = tvolu + e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) * tmask_i(ji+1,jj  ) * tmask_i(ji,jj) * umask(ji,jj,jk)
221               tvolv = tvolv + e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) * tmask_i(ji  ,jj+1) * tmask_i(ji,jj) * vmask(ji,jj,jk)
[215]222            END DO
223         END DO
224      END DO
225      IF( lk_mpp )   CALL mpp_sum( tvolu )   ! sums over the global domain
226      IF( lk_mpp )   CALL mpp_sum( tvolv )
227
228      IF(lwp) THEN
[503]229         WRITE(numout,*) '                total ocean volume at U-point   tvolu = ',tvolu
230         WRITE(numout,*) '                total ocean volume at V-point   tvolv = ',tvolv
[215]231      ENDIF
[503]232      !
[3318]233   END SUBROUTINE trd_glo_init
[215]234
235
[3318]236   SUBROUTINE glo_dyn_wri( kt )
[215]237      !!---------------------------------------------------------------------
[3318]238      !!                  ***  ROUTINE glo_dyn_wri  ***
[215]239      !!
[3318]240      !! ** Purpose :  write global averaged U, KE, PE<->KE trends in ocean.output
[503]241      !!----------------------------------------------------------------------
[2715]242      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
243      !
244      INTEGER  ::   ji, jj, jk   ! dummy loop indices
245      REAL(wp) ::   zcof         ! local scalar
[3294]246      REAL(wp), POINTER, DIMENSION(:,:,:)  ::  zkx, zky, zkz, zkepe 
[215]247      !!----------------------------------------------------------------------
248
[3294]249      CALL wrk_alloc( jpi, jpj, jpk, zkx, zky, zkz, zkepe )
[2715]250
[215]251      ! I. Momentum trends
252      ! -------------------
253
[3316]254      IF( MOD( kt, nn_trd ) == 0 .OR. kt == nit000 .OR. kt == nitend ) THEN
[215]255
256         ! I.1 Conversion potential energy - kinetic energy
257         ! --------------------------------------------------
258         ! c a u t i o n here, trends are computed at kt+1 (now , but after the swap)
[2715]259         zkx  (:,:,:) = 0._wp
260         zky  (:,:,:) = 0._wp
261         zkz  (:,:,:) = 0._wp
262         zkepe(:,:,:) = 0._wp
[215]263   
[2528]264         CALL eos( tsn, rhd, rhop )       ! now potential and in situ densities
[215]265
[2715]266         zcof = 0.5_wp / rau0             ! Density flux at w-point
267         zkz(:,:,1) = 0._wp
[215]268         DO jk = 2, jpk
[2715]269            zkz(:,:,jk) = e1e2t(:,:) * wn(:,:,jk) * ( rhop(:,:,jk) + rhop(:,:,jk-1) ) * tmask_i(:,:)
[215]270         END DO
271         
[2715]272         zcof   = 0.5_wp / rau0           ! Density flux at u and v-points
273         DO jk = 1, jpkm1
[215]274            DO jj = 1, jpjm1
275               DO ji = 1, jpim1
[2715]276                  zkx(ji,jj,jk) = zcof * e2u(ji,jj) * fse3u(ji,jj,jk) * un(ji,jj,jk) * ( rhop(ji,jj,jk) + rhop(ji+1,jj,jk) )
277                  zky(ji,jj,jk) = zcof * e1v(ji,jj) * fse3v(ji,jj,jk) * vn(ji,jj,jk) * ( rhop(ji,jj,jk) + rhop(ji,jj+1,jk) )
[215]278               END DO
279            END DO
280         END DO
281         
[2715]282         DO jk = 1, jpkm1                 ! Density flux divergence at t-point
[215]283            DO jj = 2, jpjm1
284               DO ji = 2, jpim1
[2715]285                  zkepe(ji,jj,jk) = - (  zkz(ji,jj,jk) - zkz(ji  ,jj  ,jk+1)               &
286                     &                 + zkx(ji,jj,jk) - zkx(ji-1,jj  ,jk  )               &
287                     &                 + zky(ji,jj,jk) - zky(ji  ,jj-1,jk  )   )           &
288                     &              / ( e1e2t(ji,jj) * fse3t(ji,jj,jk) ) * tmask(ji,jj,jk) * tmask_i(ji,jj)
[215]289               END DO
290            END DO
291         END DO
292
293         ! I.2 Basin averaged kinetic energy trend
294         ! ----------------------------------------
[2715]295         peke = 0._wp
296         DO jk = 1, jpkm1
297            peke = peke + SUM( zkepe(:,:,jk) * fsdept(:,:,jk) * e1e2t(:,:) * fse3t(:,:,jk) )
[215]298         END DO
[2715]299         peke = grav * peke
[215]300
301         ! I.3 Sums over the global domain
302         ! ---------------------------------
303         IF( lk_mpp ) THEN
[503]304            CALL mpp_sum( peke )
305            CALL mpp_sum( umo , jptot_dyn )
306            CALL mpp_sum( vmo , jptot_dyn )
307            CALL mpp_sum( hke , jptot_dyn )
308         ENDIF
[215]309
310         ! I.2 Print dynamic trends in the ocean.output file
311         ! --------------------------------------------------
312
313         IF(lwp) THEN
314            WRITE (numout,*)
315            WRITE (numout,*)
316            WRITE (numout,9500) kt
[3318]317            WRITE (numout,9501) umo(jpdyn_hpg) / tvolu, vmo(jpdyn_hpg) / tvolv
318            WRITE (numout,9509) umo(jpdyn_spg) / tvolu, vmo(jpdyn_spg) / tvolv
319            WRITE (numout,9502) umo(jpdyn_keg) / tvolu, vmo(jpdyn_keg) / tvolv
320            WRITE (numout,9503) umo(jpdyn_rvo) / tvolu, vmo(jpdyn_rvo) / tvolv
321            WRITE (numout,9504) umo(jpdyn_pvo) / tvolu, vmo(jpdyn_pvo) / tvolv
322            WRITE (numout,9507) umo(jpdyn_zad) / tvolu, vmo(jpdyn_zad) / tvolv
323            WRITE (numout,9505) umo(jpdyn_ldf) / tvolu, vmo(jpdyn_ldf) / tvolv
324            WRITE (numout,9508) umo(jpdyn_zdf) / tvolu, vmo(jpdyn_zdf) / tvolv
325            WRITE (numout,9510) umo(jpdyn_tau) / tvolu, vmo(jpdyn_tau) / tvolv
326            WRITE (numout,9511) umo(jpdyn_bfr) / tvolu, vmo(jpdyn_bfr) / tvolv
327            WRITE (numout,9512) umo(jpdyn_atf) / tvolu, vmo(jpdyn_atf) / tvolv
[1129]328            WRITE (numout,9513)
329            WRITE (numout,9514)                                                 &
[3318]330            &     (  umo(jpdyn_hpg) + umo(jpdyn_spg) + umo(jpdyn_keg) + umo(jpdyn_rvo)   &
331            &      + umo(jpdyn_pvo) + umo(jpdyn_zad) + umo(jpdyn_ldf) + umo(jpdyn_zdf)   &
332            &      + umo(jpdyn_tau) + umo(jpdyn_bfr) + umo(jpdyn_atf) ) / tvolu,   &
333            &     (  vmo(jpdyn_hpg) + vmo(jpdyn_spg) + vmo(jpdyn_keg) + vmo(jpdyn_rvo)   &
334            &      + vmo(jpdyn_pvo) + vmo(jpdyn_zad) + vmo(jpdyn_ldf) + vmo(jpdyn_zdf)   &
335            &      + vmo(jpdyn_tau) + vmo(jpdyn_bfr) + vmo(jpdyn_atf) ) / tvolv
[215]336         ENDIF
337
338 9500    FORMAT(' momentum trend at it= ', i6, ' :', /' ==============================')
339 9501    FORMAT(' pressure gradient          u= ', e20.13, '    v= ', e20.13)
340 9502    FORMAT(' ke gradient                u= ', e20.13, '    v= ', e20.13)
341 9503    FORMAT(' relative vorticity term    u= ', e20.13, '    v= ', e20.13)
342 9504    FORMAT(' coriolis term              u= ', e20.13, '    v= ', e20.13)
343 9505    FORMAT(' horizontal diffusion       u= ', e20.13, '    v= ', e20.13)
[1129]344 9507    FORMAT(' vertical advection         u= ', e20.13, '    v= ', e20.13)
345 9508    FORMAT(' vertical diffusion         u= ', e20.13, '    v= ', e20.13)
346 9509    FORMAT(' surface pressure gradient  u= ', e20.13, '    v= ', e20.13)
[3317]347 9510    FORMAT(' surface wind stress        u= ', e20.13, '    v= ', e20.13)
348 9511    FORMAT(' bottom friction            u= ', e20.13, '    v= ', e20.13)
349 9512    FORMAT(' Asselin time filter        u= ', e20.13, '    v= ', e20.13)
[1129]350 9513    FORMAT(' -----------------------------------------------------------------------------')
351 9514    FORMAT(' total trend                u= ', e20.13, '    v= ', e20.13)
[215]352
353         IF(lwp) THEN
354            WRITE (numout,*)
355            WRITE (numout,*)
356            WRITE (numout,9520) kt
[3318]357            WRITE (numout,9521) hke(jpdyn_hpg) / tvolt
358            WRITE (numout,9529) hke(jpdyn_spg) / tvolt
359            WRITE (numout,9522) hke(jpdyn_keg) / tvolt
360            WRITE (numout,9523) hke(jpdyn_rvo) / tvolt
361            WRITE (numout,9524) hke(jpdyn_pvo) / tvolt
362            WRITE (numout,9527) hke(jpdyn_zad) / tvolt
363            WRITE (numout,9525) hke(jpdyn_ldf) / tvolt
364            WRITE (numout,9528) hke(jpdyn_zdf) / tvolt
365            WRITE (numout,9530) hke(jpdyn_tau) / tvolt
366            WRITE (numout,9531) hke(jpdyn_bfr) / tvolt
367            WRITE (numout,9532) hke(jpdyn_atf) / tvolt
[1708]368            WRITE (numout,9533)
369            WRITE (numout,9534)   &
[3318]370            &     (  hke(jpdyn_hpg) + hke(jpdyn_spg) + hke(jpdyn_keg) + hke(jpdyn_rvo)   &
371            &      + hke(jpdyn_pvo) + hke(jpdyn_zad) + hke(jpdyn_ldf) + hke(jpdyn_zdf)   &
372            &      + hke(jpdyn_tau) + hke(jpdyn_bfr) + hke(jpdyn_atf)  ) / tvolt
[215]373         ENDIF
374
375 9520    FORMAT(' kinetic energy trend at it= ', i6, ' :', /' ====================================')
376 9521    FORMAT(' pressure gradient         u2= ', e20.13)
[3317]377 9529    FORMAT(' surface pressure gradient u2= ', e20.13)
[215]378 9522    FORMAT(' ke gradient               u2= ', e20.13)
379 9523    FORMAT(' relative vorticity term   u2= ', e20.13)
380 9524    FORMAT(' coriolis term             u2= ', e20.13)
[3317]381 9527    FORMAT(' vertical advection        u2= ', e20.13)
[215]382 9525    FORMAT(' horizontal diffusion      u2= ', e20.13)
[1129]383 9528    FORMAT(' vertical diffusion        u2= ', e20.13)
[3317]384 9530    FORMAT(' surface wind stress       u2= ', e20.13)
385 9531    FORMAT(' bottom friction           u2= ', e20.13)
386 9532    FORMAT(' Asselin time filter       u2= ', e20.13)
[1708]387 9533    FORMAT(' --------------------------------------------------')
388 9534    FORMAT(' total trend               u2= ', e20.13)
[215]389
390         IF(lwp) THEN
391            WRITE (numout,*)
392            WRITE (numout,*)
393            WRITE (numout,9540) kt
[3318]394            WRITE (numout,9541) ( hke(jpdyn_keg) + hke(jpdyn_rvo) + hke(jpdyn_zad) ) / tvolt
395            WRITE (numout,9542) ( hke(jpdyn_keg) + hke(jpdyn_zad) ) / tvolt
396            WRITE (numout,9543) ( hke(jpdyn_pvo) ) / tvolt
397            WRITE (numout,9544) ( hke(jpdyn_rvo) ) / tvolt
398            WRITE (numout,9545) ( hke(jpdyn_spg) ) / tvolt
399            WRITE (numout,9546) ( hke(jpdyn_ldf) ) / tvolt
400            WRITE (numout,9547) ( hke(jpdyn_zdf) ) / tvolt
401            WRITE (numout,9548) ( hke(jpdyn_hpg) ) / tvolt, rpktrd / tvolt
[503]402            WRITE (numout,*)
403            WRITE (numout,*)
[215]404         ENDIF
405
406 9540    FORMAT(' energetic consistency at it= ', i6, ' :', /' =========================================')
[3317]407 9541    FORMAT(' 0 = non linear term (true if KE conserved)                : ', e20.13)
408 9542    FORMAT(' 0 = ke gradient + vertical advection                      : ', e20.13)
409 9543    FORMAT(' 0 = coriolis term  (true if KE conserving scheme)         : ', e20.13)
410 9544    FORMAT(' 0 = vorticity term (true if KE conserving scheme)         : ', e20.13)
411 9545    FORMAT(' 0 = surface pressure gradient  ???                        : ', e20.13)
412 9546    FORMAT(' 0 < horizontal diffusion                                  : ', e20.13)
413 9547    FORMAT(' 0 < vertical diffusion                                    : ', e20.13)
[503]414 9548    FORMAT(' pressure gradient u2 = - 1/rau0 u.dz(rhop)                : ', e20.13, '  u.dz(rhop) =', e20.13)
415         !
[215]416         ! Save potential to kinetic energy conversion for next time step
417         rpktrd = peke
[503]418         !
[215]419      ENDIF
[503]420      !
[3294]421      CALL wrk_dealloc( jpi, jpj, jpk, zkx, zky, zkz, zkepe )
[2715]422      !
[3318]423   END SUBROUTINE glo_dyn_wri
[215]424
425
[3318]426   SUBROUTINE glo_tra_wri( kt )
[215]427      !!---------------------------------------------------------------------
[3318]428      !!                  ***  ROUTINE glo_tra_wri  ***
[215]429      !!
[3318]430      !! ** Purpose :  write global domain averaged of T and T^2 trends in ocean.output
[215]431      !!----------------------------------------------------------------------
[503]432      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
[3316]433      !
434      INTEGER  ::   jk   ! loop indices
[215]435      !!----------------------------------------------------------------------
436
437      ! I. Tracers trends
438      ! -----------------
439
[1601]440      IF( MOD(kt,nn_trd) == 0 .OR. kt == nit000 .OR. kt == nitend ) THEN
[215]441
442         ! I.1 Sums over the global domain
443         ! -------------------------------
444         IF( lk_mpp ) THEN
[503]445            CALL mpp_sum( tmo, jptot_tra )   
446            CALL mpp_sum( smo, jptot_tra )
447            CALL mpp_sum( t2 , jptot_tra )
448            CALL mpp_sum( s2 , jptot_tra )
[215]449         ENDIF
450
451         ! I.2 Print tracers trends in the ocean.output file
452         ! --------------------------------------------------
453         
454         IF(lwp) THEN
455            WRITE (numout,*)
456            WRITE (numout,*)
457            WRITE (numout,9400) kt
[3318]458            WRITE (numout,9401)  tmo(jptra_xad) / tvolt, smo(jptra_xad) / tvolt
459            WRITE (numout,9411)  tmo(jptra_yad) / tvolt, smo(jptra_yad) / tvolt
460            WRITE (numout,9402)  tmo(jptra_zad) / tvolt, smo(jptra_zad) / tvolt
461            WRITE (numout,9403)  tmo(jptra_ldf) / tvolt, smo(jptra_ldf) / tvolt
462            WRITE (numout,9404)  tmo(jptra_zdf) / tvolt, smo(jptra_zdf) / tvolt
463            WRITE (numout,9405)  tmo(jptra_npc) / tvolt, smo(jptra_npc) / tvolt
464            WRITE (numout,9406)  tmo(jptra_dmp) / tvolt, smo(jptra_dmp) / tvolt
465            WRITE (numout,9407)  tmo(jptra_qsr) / tvolt
466            WRITE (numout,9408)  tmo(jptra_nsr) / tvolt, smo(jptra_nsr) / tvolt
[503]467            WRITE (numout,9409) 
[3318]468            WRITE (numout,9410) (  tmo(jptra_xad) + tmo(jptra_yad) + tmo(jptra_zad) + tmo(jptra_ldf) + tmo(jptra_zdf)   &
469            &                    + tmo(jptra_npc) + tmo(jptra_dmp) + tmo(jptra_qsr) + tmo(jptra_nsr) ) / tvolt,   &
470            &                   (  smo(jptra_xad) + smo(jptra_yad) + smo(jptra_zad) + smo(jptra_ldf) + smo(jptra_zdf)   &
471            &                    + smo(jptra_npc) + smo(jptra_dmp)                   + smo(jptra_nsr) ) / tvolt
[215]472         ENDIF
473
4749400     FORMAT(' tracer trend at it= ',i6,' :     temperature',   &
475              '              salinity',/' ============================')
[2528]4769401     FORMAT(' zonal      advection        ',e20.13,'     ',e20.13)
4779411     FORMAT(' meridional advection        ',e20.13,'     ',e20.13)
[215]4789402     FORMAT(' vertical advection          ',e20.13,'     ',e20.13)
4799403     FORMAT(' horizontal diffusion        ',e20.13,'     ',e20.13)
4809404     FORMAT(' vertical diffusion          ',e20.13,'     ',e20.13)
[503]4819405     FORMAT(' static instability mixing   ',e20.13,'     ',e20.13)
[215]4829406     FORMAT(' damping term                ',e20.13,'     ',e20.13)
[503]4839407     FORMAT(' penetrative qsr             ',e20.13)
4849408     FORMAT(' non solar radiation         ',e20.13,'     ',e20.13)
[215]4859409     FORMAT(' -------------------------------------------------------------------------')
4869410     FORMAT(' total trend                 ',e20.13,'     ',e20.13)
487
488
489         IF(lwp) THEN
490            WRITE (numout,*)
491            WRITE (numout,*)
492            WRITE (numout,9420) kt
[3318]493            WRITE (numout,9421)   t2(jptra_xad) / tvolt, s2(jptra_xad) / tvolt
494            WRITE (numout,9431)   t2(jptra_yad) / tvolt, s2(jptra_yad) / tvolt
495            WRITE (numout,9422)   t2(jptra_zad) / tvolt, s2(jptra_zad) / tvolt
496            WRITE (numout,9423)   t2(jptra_ldf) / tvolt, s2(jptra_ldf) / tvolt
497            WRITE (numout,9424)   t2(jptra_zdf) / tvolt, s2(jptra_zdf) / tvolt
498            WRITE (numout,9425)   t2(jptra_npc) / tvolt, s2(jptra_npc) / tvolt
499            WRITE (numout,9426)   t2(jptra_dmp) / tvolt, s2(jptra_dmp) / tvolt
500            WRITE (numout,9427)   t2(jptra_qsr) / tvolt
501            WRITE (numout,9428)   t2(jptra_nsr) / tvolt, s2(jptra_nsr) / tvolt
[215]502            WRITE (numout,9429)
[3318]503            WRITE (numout,9430) (  t2(jptra_xad) + t2(jptra_yad) + t2(jptra_zad) + t2(jptra_ldf) + t2(jptra_zdf)   &
504            &                    + t2(jptra_npc) + t2(jptra_dmp) + t2(jptra_qsr) + t2(jptra_nsr) ) / tvolt,   &
505            &                   (  s2(jptra_xad) + s2(jptra_yad) + s2(jptra_zad) + s2(jptra_ldf) + s2(jptra_zdf)   &
506            &                    + s2(jptra_npc) + s2(jptra_dmp)                  + s2(jptra_nsr) ) / tvolt
[215]507         ENDIF
508
5099420     FORMAT(' tracer**2 trend at it= ', i6, ' :      temperature',   &
510            '               salinity', /, ' ===============================')
[2528]5119421     FORMAT(' zonal      advection      * t   ', e20.13, '     ', e20.13)
5129431     FORMAT(' meridional advection      * t   ', e20.13, '     ', e20.13)
[215]5139422     FORMAT(' vertical advection        * t   ', e20.13, '     ', e20.13)
5149423     FORMAT(' horizontal diffusion      * t   ', e20.13, '     ', e20.13)
5159424     FORMAT(' vertical diffusion        * t   ', e20.13, '     ', e20.13)
[503]5169425     FORMAT(' static instability mixing * t   ', e20.13, '     ', e20.13)
[215]5179426     FORMAT(' damping term              * t   ', e20.13, '     ', e20.13)
[503]5189427     FORMAT(' penetrative qsr           * t   ', e20.13)
5199428     FORMAT(' non solar radiation       * t   ', e20.13, '     ', e20.13)
[215]5209429     FORMAT(' -----------------------------------------------------------------------------')
5219430     FORMAT(' total trend                *t = ', e20.13, '  *s = ', e20.13)
522
523
524         IF(lwp) THEN
525            WRITE (numout,*)
526            WRITE (numout,*)
527            WRITE (numout,9440) kt
[3318]528            WRITE (numout,9441) ( tmo(jptra_xad)+tmo(jptra_yad)+tmo(jptra_zad) )/tvolt,   &
529            &                   ( smo(jptra_xad)+smo(jptra_yad)+smo(jptra_zad) )/tvolt
530            WRITE (numout,9442)   tmo(jptra_sad)/tvolt,  smo(jptra_sad)/tvolt
531            WRITE (numout,9443)   tmo(jptra_ldf)/tvolt,  smo(jptra_ldf)/tvolt
532            WRITE (numout,9444)   tmo(jptra_zdf)/tvolt,  smo(jptra_zdf)/tvolt
533            WRITE (numout,9445)   tmo(jptra_npc)/tvolt,  smo(jptra_npc)/tvolt
534            WRITE (numout,9446) ( t2(jptra_xad)+t2(jptra_yad)+t2(jptra_zad) )/tvolt,    &
535            &                   ( s2(jptra_xad)+s2(jptra_yad)+s2(jptra_zad) )/tvolt
536            WRITE (numout,9447)   t2(jptra_ldf)/tvolt,   s2(jptra_ldf)/tvolt
537            WRITE (numout,9448)   t2(jptra_zdf)/tvolt,   s2(jptra_zdf)/tvolt
538            WRITE (numout,9449)   t2(jptra_npc)/tvolt,   s2(jptra_npc)/tvolt
[215]539         ENDIF
540
5419440     FORMAT(' tracer consistency at it= ',i6,   &
542            ' :         temperature','                salinity',/,   &
543            ' ==================================')
[503]5449441     FORMAT(' 0 = horizontal+vertical advection +    ',e20.13,'       ',e20.13)
5459442     FORMAT('     1st lev vertical advection         ',e20.13,'       ',e20.13)
5469443     FORMAT(' 0 = horizontal diffusion               ',e20.13,'       ',e20.13)
5479444     FORMAT(' 0 = vertical diffusion                 ',e20.13,'       ',e20.13)
5489445     FORMAT(' 0 = static instability mixing          ',e20.13,'       ',e20.13)
5499446     FORMAT(' 0 = horizontal+vertical advection * t  ',e20.13,'       ',e20.13)
5509447     FORMAT(' 0 > horizontal diffusion          * t  ',e20.13,'       ',e20.13)
5519448     FORMAT(' 0 > vertical diffusion            * t  ',e20.13,'       ',e20.13)
5529449     FORMAT(' 0 > static instability mixing     * t  ',e20.13,'       ',e20.13)
553         !
[215]554      ENDIF
[503]555      !
[3318]556   END SUBROUTINE glo_tra_wri
[215]557
558   !!======================================================================
[3318]559END MODULE trdglo
Note: See TracBrowser for help on using the repository browser.