MODULE trdtra !!====================================================================== !! *** MODULE trdtra *** !! Ocean diagnostics: ocean tracer trends !!===================================================================== #if defined key_trdtra || defined key_esopa !!---------------------------------------------------------------------- !! 'key_trdtra' or tracer trend diagnostics !! 'key_trdmld' mixed layer trend diagnostics !!---------------------------------------------------------------------- !!---------------------------------------------------------------------- !! trd_tra : verify the basin averaged properties for tracers !! trd_tra_init : ??? !!---------------------------------------------------------------------- !! * Modules used USE oce ! ocean dynamics and tracers variables USE dom_oce ! ocean space and time domain variables USE trdtra_oce ! ocean active tracer trend variables USE trddyn_oce ! ocean dynamics trend variables USE ldftra_oce ! ocean active tracers: lateral physics USE ldfdyn_oce ! ocean dynamics: lateral physics USE zdf_oce ! ocean vertical physics USE in_out_manager ! I/O manager USE lib_mpp ! distibuted memory computing library IMPLICIT NONE PRIVATE !! * Routine accessibility PUBLIC trd_tra ! called by step.F90 PUBLIC trd_tra_init ! called by opa.F90 !! * Shared module variables LOGICAL, PUBLIC, PARAMETER :: lk_trdtra = .TRUE. !: momentum trend flag !! * Substitutions # include "domzgr_substitute.h90" # include "vectopt_loop_substitute.h90" !!---------------------------------------------------------------------- !! OPA 9.0 , LODYC-IPSL (2003) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE trd_tra( kt ) !!--------------------------------------------------------------------- !! *** ROUTINE trd_tra *** !! !! ** Purpose : verify the basin averaged properties of the tracers !! equations at every time step frequency ntrd. !! !! Method : !! !! History : !! ! 91-12 (G. Madec) !! ! 92-06 (M. Imbard) add time step frequency !! ! 96-01 (G. Madec) terrain following coordinates !! 8.5 ! 02-06 (G. Madec) F90: Free form and module !!---------------------------------------------------------------------- !! * Arguments INTEGER, INTENT( in ) :: kt ! ocean time-step index !! * Local declarations INTEGER :: ji, jj, jk, jn REAL(wp) :: zbt REAL(wp), DIMENSION(10) :: ztmo, zsmo, zt2, zs2 NAMELIST/namtrd/ ntrd, nctls !!---------------------------------------------------------------------- ! 0. Initialization ! ----------------- IF( kt == nit000 ) THEN ! namelist namtrd : trend diagnostic REWIND( numnam ) READ ( numnam, namtrd ) IF(lwp) THEN WRITE(numout,*) 'trd_tra : read namelist namtrd' WRITE(numout,*) '~~~~~~~' WRITE(numout,*) ' time step frequency trend ntrd = ', ntrd WRITE(numout,*) ' ' ENDIF ! Total volume at t-points: tvolt = 0. DO jk = 1, jpkm1 DO jj = 2, jpjm1 DO ji = fs_2, fs_jpim1 ! vector opt. tvolt = tvolt + e1t(ji,jj) *e2t(ji,jj) * fse3t(ji,jj,jk)* tmask(ji,jj,jk) * tmask_i(ji,jj) END DO END DO END DO IF( lk_mpp ) CALL mpp_sum( tvolt ) ! sum over the global domain IF(lwp) THEN WRITE(numout,*) WRITE(numout,*) '***trd_tra' WRITE(numout,*) ' frequency ntrd = ',ntrd WRITE(numout,*) ' ' WRITE(numout,*) ' tvolt = ',tvolt WRITE(numout,*) ' ' ENDIF ENDIF ! 1. Advective trends and forcing trend ! ------------------------------------- IF( MOD(kt,ntrd) == 0 .OR. kt == nit000 .OR. kt == nitend ) THEN ! 1.1 Mask the forcing trend and substract it from the vertical diffusion trend flxtrd(:,:,1) = flxtrd(:,:,1) * tmask_i(:,:) flxtrd(:,:,2) = flxtrd(:,:,2) * tmask_i(:,:) ! 1.2 Mask the trends DO jn = 1, 6 DO jk = 1, jpk ttrd(:,:,jk,jn) = ttrd(:,:,jk,jn)* tmask(:,:,jk) * tmask_i(:,:) strd(:,:,jk,jn) = strd(:,:,jk,jn)* tmask(:,:,jk) * tmask_i(:,:) END DO END DO DO jk = 1, jpk ttrd(:,:,jk,7) = ttrd(:,:,jk,7) * tmask(:,:,jk) * tmask_i(:,:) END DO ! 2. Basin averaged tracer trend ! ------------------------------ DO jn = 1, 6 ztmo(jn) = 0. zsmo(jn) = 0. DO jk = 1, jpkm1 DO jj = 1, jpj DO ji = 1, jpi zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ztmo(jn) = ztmo(jn) + ttrd(ji,jj,jk,jn) * zbt zsmo(jn) = zsmo(jn) + strd(ji,jj,jk,jn) * zbt END DO END DO END DO END DO ztmo(7) = 0. DO jk = 1, jpk DO jj = 1, jpj DO ji = 1, jpi zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) ztmo(7) = ztmo(7) + ttrd(ji,jj,jk,7) * zbt END DO END DO END DO ztmo(8) = 0. zsmo(8) = 0. DO jj = 1, jpj DO ji = 1, jpi zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,1) ztmo(8) = ztmo(8) + flxtrd(ji,jj,1) * zbt zsmo(8) = zsmo(8) + flxtrd(ji,jj,2) * zbt END DO END DO ! 3. Basin averaged tracer square trend ! ------------------------------------- ! c a u t i o n: field before, because after the array swap DO jn = 1, 6 zt2(jn) = 0.e0 zs2(jn) = 0.e0 DO jk = 1, jpk DO jj = 1, jpj DO ji = 1, jpi zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) zt2(jn) = zt2(jn) + ttrd(ji,jj,jk,jn) * zbt * tb(ji,jj,jk) zs2(jn) = zs2(jn) + strd(ji,jj,jk,jn) * zbt * sb(ji,jj,jk) END DO END DO END DO END DO zt2(7) = 0.e0 DO jk = 1, jpk DO jj = 1, jpj DO ji = 1, jpi zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,jk) zt2(7) = zt2(7) + ttrd(ji,jj,jk,7) * zbt * tb(ji,jj,jk) END DO END DO END DO zt2(8) = 0.e0 zs2(8) = 0.e0 DO jj = 1, jpj DO ji = 1, jpi zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,1) zt2(8) = zt2(8) + flxtrd(ji,jj,1) * zbt * tb(ji,jj,1) zs2(8) = zs2(8) + flxtrd(ji,jj,2) * zbt * sb(ji,jj,1) END DO END DO IF( lk_mpp ) THEN CALL mpp_sum( ztmo, 10 ) ! sums over the global domain CALL mpp_sum( zsmo, 10 ) CALL mpp_sum( zt2 , 10 ) CALL mpp_sum( zs2 , 10 ) ENDIF ! 4. Print ! -------- IF(lwp) THEN WRITE (numout,*) WRITE (numout,*) WRITE (numout,9400) kt WRITE (numout,9401) ztmo(1) / tvolt, zsmo(1) / tvolt WRITE (numout,9402) ztmo(2) / tvolt, zsmo(2) / tvolt WRITE (numout,9403) ztmo(3) / tvolt, zsmo(3) / tvolt WRITE (numout,9404) ztmo(4) / tvolt, zsmo(4) / tvolt WRITE (numout,9405) ztmo(5) / tvolt, zsmo(5) / tvolt WRITE (numout,9406) ztmo(6) / tvolt, zsmo(6) / tvolt WRITE (numout,9407) ztmo(7) / tvolt WRITE (numout,9408) ztmo(8) / tvolt, zsmo(8) / tvolt WRITE (numout,9409) WRITE (numout,9410) ( ztmo(1) + ztmo(2) + ztmo(3) + ztmo(4) & & + ztmo(5) + ztmo(6) + ztmo(7) + ztmo(8) ) / tvolt, & & ( zsmo(1) + zsmo(2) + zsmo(3) + zsmo(4) & & + zsmo(5) + zsmo(6) + zsmo(8) ) / tvolt ENDIF 9400 FORMAT(' tracer trend at it= ',i6,' : temperature', & ' salinity',/' ============================') 9401 FORMAT(' horizontal advection ',e20.13,' ',e20.13) 9402 FORMAT(' vertical advection ',e20.13,' ',e20.13) 9403 FORMAT(' horizontal diffusion ',e20.13,' ',e20.13) 9404 FORMAT(' vertical diffusion ',e20.13,' ',e20.13) 9405 FORMAT(' STATIC instability mixing ',e20.13,' ',e20.13) 9406 FORMAT(' damping term ',e20.13,' ',e20.13) 9407 FORMAT(' penetrative qsr ',e20.13,' ',e20.13) 9408 FORMAT(' forcing term ',e20.13,' ',e20.13) 9409 FORMAT(' -------------------------------------------------------------------------') 9410 FORMAT(' total trend ',e20.13,' ',e20.13) IF(lwp) THEN WRITE (numout,*) WRITE (numout,*) WRITE (numout,9420) kt WRITE (numout,9421) zt2(1) / tvolt, zs2(1) / tvolt WRITE (numout,9422) zt2(2) / tvolt, zs2(2) / tvolt WRITE (numout,9423) zt2(3) / tvolt, zs2(3) / tvolt WRITE (numout,9424) zt2(4) / tvolt, zs2(4) / tvolt WRITE (numout,9425) zt2(5) / tvolt, zs2(5) / tvolt WRITE (numout,9426) zt2(6) / tvolt, zs2(6) / tvolt WRITE (numout,9427) zt2(7) / tvolt WRITE (numout,9428) zt2(8) / tvolt, zs2(8) / tvolt WRITE (numout,9429) WRITE (numout,9430) ( zt2(1) + zt2(2) + zt2(3) + zt2(4) & & + zt2(5) + zt2(6) + zt2(7) + zt2(8) ) / tvolt, & & ( zs2(1) + zs2(2) + zs2(3) + zs2(4) & & + zs2(5) + zs2(6) + zs2(8) ) / tvolt ENDIF 9420 FORMAT(' tracer**2 trend at it= ', i6, ' : temperature', & ' salinity', /, ' ===============================') 9421 FORMAT(' horizontal advection * t ', e20.13, ' ', e20.13) 9422 FORMAT(' vertical advection * t ', e20.13, ' ', e20.13) 9423 FORMAT(' horizontal diffusion * t ', e20.13, ' ', e20.13) 9424 FORMAT(' vertical diffusion * t ', e20.13, ' ', e20.13) 9425 FORMAT(' STATIC instability mixing * t ', e20.13, ' ', e20.13) 9426 FORMAT(' damping term * t ', e20.13, ' ', e20.13) 9427 FORMAT(' penetrative qsr * t ', e20.13, ' ', e20.13) 9428 FORMAT(' forcing term * t ', e20.13, ' ', e20.13) 9429 FORMAT(' -----------------------------------------------------------------------------') 9430 FORMAT(' total trend *t = ', e20.13, ' *s = ', e20.13) IF(lwp) THEN WRITE (numout,*) WRITE (numout,*) WRITE (numout,9440) kt WRITE (numout,9441) ( ztmo(1)+ztmo(2) )/tvolt, ( zsmo(1)+zsmo(2) )/tvolt WRITE (numout,9442) ztmo(3)/tvolt, zsmo(3)/tvolt WRITE (numout,9443) ztmo(4)/tvolt, zsmo(4)/tvolt WRITE (numout,9444) ztmo(5)/tvolt, zsmo(5)/tvolt WRITE (numout,9445) ( zt2(1)+zt2(2) )/tvolt, ( zs2(1)+zs2(2) )/tvolt WRITE (numout,9446) zt2(3)/tvolt, zs2(3)/tvolt WRITE (numout,9447) zt2(4)/tvolt, zs2(4)/tvolt WRITE (numout,9448) zt2(5)/tvolt, zs2(5)/tvolt ENDIF 9440 FORMAT(' tracer consistency at it= ',i6, & ' : temperature',' salinity',/, & ' ==================================') 9441 FORMAT(' 0 = horizontal+vertical advection ',e20.13,' ',e20.13) 9442 FORMAT(' 0 = horizontal diffusion ',e20.13,' ',e20.13) 9443 FORMAT(' 0 = vertical diffusion ',e20.13,' ',e20.13) 9444 FORMAT(' 0 = static instability mixing ',e20.13,' ',e20.13) 9445 FORMAT(' 0 = horizontal+vertical advection * t ',e20.13,' ',e20.13) 9446 FORMAT(' 0 > horizontal diffusion * t ',e20.13,' ',e20.13) 9447 FORMAT(' 0 > vertical diffusion * t ',e20.13,' ',e20.13) 9448 FORMAT(' 0 > static instability mixing * t ',e20.13,' ',e20.13) ENDIF END SUBROUTINE trd_tra SUBROUTINE trd_tra_init !!--------------------------------------------------------------------- !! *** ROUTINE trd_tra_init *** !! !! ** Purpose : !! !! ** Method : !! !! History : !! 9.0 ! 03-09 (G. Madec) Original code !!---------------------------------------------------------------------- !! * Local declarations INTEGER :: ji, jj, jk NAMELIST/namtrd/ ntrd, nctls !!---------------------------------------------------------------------- ! set to zero the tracers trends ttrd (:,:,:,:) = 0.e0 strd (:,:,:,:) = 0.e0 ttrdh (:,:,:,:) = 0.e0 strdh (:,:,:,:) = 0.e0 flxtrd(:,:, :) = 0.e0 ! namelist namtrd : trend diagnostic REWIND( numnam ) READ ( numnam, namtrd ) IF(lwp) THEN WRITE(numout,*) WRITE(numout,*) 'trd_tra : read namelist namtrd' WRITE(numout,*) '~~~~~~~' WRITE(numout,*) ' time step frequency trend ntrd = ', ntrd ENDIF ! Total volume at t-points: tvolt = 0. DO jk = 1, jpkm1 DO jj = 2, jpjm1 DO ji = fs_2, fs_jpim1 ! vector opt. tvolt = tvolt + e1t(ji,jj) *e2t(ji,jj) * fse3t(ji,jj,jk)* tmask(ji,jj,jk) * tmask_i(ji,jj) END DO END DO END DO IF( lk_mpp ) CALL mpp_sum( tvolt ) ! sum over the global domain IF(lwp) WRITE(numout,*) ' total ocean volume at T-point tvolt = ',tvolt END SUBROUTINE trd_tra_init # else !!---------------------------------------------------------------------- !! Default case : Empty module !!---------------------------------------------------------------------- LOGICAL, PUBLIC, PARAMETER :: lk_trdtra = .FALSE. !: momentum trend flag CONTAINS SUBROUTINE trd_tra( kt ) ! Empty routine WRITE(*,*) 'trd_tra: You should not have seen this print! error?', kt END SUBROUTINE trd_tra SUBROUTINE trd_tra_init ! Empty routine END SUBROUTINE trd_tra_init #endif !!====================================================================== END MODULE trdtra