MODULE trdvor !!====================================================================== !! *** MODULE trdvor *** !! Ocean diagnostics: momentum trends !!===================================================================== #if defined key_trd_vor || defined key_esopa !!---------------------------------------------------------------------- !! 'key_trd_vor' : momentum trend diagnostics !!---------------------------------------------------------------------- !! trd_vor : momentum trends averaged over the depth !!---------------------------------------------------------------------- !! * Modules used USE oce ! ocean dynamics and tracers variables USE dom_oce ! ocean space and time domain variables USE trddyn_oce ! ocean active tracer trend variables USE zdf_oce ! ocean vertical physics USE in_out_manager ! I/O manager USE phycst ! Define parameters for the routines USE ldfdyn_oce ! ocean active tracers: lateral physics USE daymod ! calandar USE dianam ! build the name of file (routine) USE ldfslp ! iso-neutral slopes USE zdfmxl USE ioipsl USE lbclnk IMPLICIT NONE PRIVATE !! * Accessibility PUBLIC trd_vor ! routine called by step.F90 !! * Shared module variables LOGICAL, PUBLIC :: lk_trdvor = .TRUE. ! momentum trend flag !! * Module variables INTEGER,PARAMETER :: jplvor=11 INTEGER :: & nh_t, nmoydpvor , & nidvor, nhoridvor, & ndexvor1(jpi*jpj), & ndimvor1 REAL(wp), DIMENSION(jpi,jpj) :: & vor_avr , & ! average vor_avrb , & ! before vorticity (kt-1) vor_avrbb , & ! vorticity at begining of the nwrite-1 timestep averaging period vor_avrbn , & ! after vorticity at time step after the rotot , & ! begining of the NWRITE-1 timesteps udpvor , & ! total cumulative trends vdpvor ! " " " REAL(wp), DIMENSION(jpi,jpj,jplvor):: & !: curl of trends vortrd !! * Substitutions # include "domzgr_substitute.h90" # include "ldfdyn_substitute.h90" # include "vectopt_loop_substitute.h90" !!---------------------------------------------------------------------- !! OPA 9.0 , LODYC-IPS (2004) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE trd_vor( kt ) !!---------------------------------------------------------------------------- !! *** ROUTINE trd_vor *** !! !! ** Purpose : computation of vertically integrated vorticity budgets !! from ocean surface down to control surface (NetCDF output) !! !! ** Method/usage : !! integration done over nwrite-1 time steps !! !! !! ** Action : !! /commld/ : !! vor_avr average !! vor_avrb vorticity at kt-1 !! vor_avrbb vorticity at begining of the NWRITE-1 !! time steps averaging period !! vor_avrbn vorticity at time step after the !! begining of the NWRITE-1 time !! steps averaging period !! !! trends : !! !! vortrd (,,1) = Pressure Gradient Trend !! vortrd (,,2) = KE Gradient Trend !! vortrd (,,3) = Relative Vorticity Trend !! vortrd (,,4) = Coriolis Term Trend !! vortrd (,,5) = Horizontal Diffusion Trend !! vortrd (,,6) = Vertical Advection Trend !! vortrd (,,7) = Vertical Diffusion Trend !! vortrd (,,8) = Surface Pressure Grad. Trend !! vortrd (,,9) = Beta V !! vortrd (,,10) = forcing term !! vortrd (,,11) = bottom friction term !! rotot(,) : total cumulative trends over nwrite-1 time steps !! vor_avrtot(,) : first membre of vrticity equation !! vor_avrres(,) : residual = dh/dt entrainment !! !! trends output in netCDF format using ioipsl !!---------------------------------------------------------------------- !! * Arguments INTEGER, INTENT( in ) :: kt ! ocean time-step index !! * Local declarations INTEGER ilseq INTEGER ji, jj, jk, jl, idebug, it REAL(wp) :: zmean REAL(wp) :: zun(jpi,jpj), zvn(jpi,jpj) REAL(wp) :: zjulian, zsto, zout REAL(wp) :: vor_avrtot(jpi,jpj), vor_avrres(jpi,jpj) INTEGER(wp) :: ikbu,ikbum1,ikbv,ikbvm1 CHARACTER (len=12) :: cvort CHARACTER (len=40) :: clhstnam CHARACTER (len=40) :: clop NAMELIST/namtrd/ ntrd,nctls !!---------------------------------------------------------------------- ! =================== ! 0. initialization ! =================== cvort='averaged-vor' ! Open specifier ilseq = 1 idebug = 0 ! set it to 1 in case of problem to have more Print IF( kt == nit000 ) THEN ! namelist namtrd : trend diagnostic REWIND( numnam ) READ ( numnam, namtrd ) IF(lwp) THEN WRITE(numout,*) 'namtrd' WRITE(numout,*) ' ' WRITE(numout,*) ' time step frequency trend ntrd = ',ntrd WRITE(numout,*) ' ' ENDIF ! cumulated trends array init nmoydpvor = 0 rotot(:,:)=0 vor_avrtot(:,:)=0 vor_avrres(:,:)=0 ENDIF ! set before values of vertically average u and v IF( kt > nit000 ) THEN vor_avrb(:,:) = vor_avr(:,:) ENDIF IF( idebug /= 0 ) THEN WRITE(numout,*) ' debuging trd_vor: 0. done ' CALL FLUSH(numout) ENDIF ! ================================= ! I. vertically integrated vorticity ! ================================= vor_avr(:,:) = 0. zun(:,:)=0 zvn(:,:)=0 vor_avrtot(:,:)=0 vor_avrres(:,:)=0 ! vertically averaged velocity DO jk = 1, jpk - 1 zun(:,:)=zun(:,:) + e1u(:,:)*un(:,:,jk)*fse3u(:,:,jk) zvn(:,:)=zvn(:,:) + e2v(:,:)*vn(:,:,jk)*fse3v(:,:,jk) END DO zun(:,:)=zun(:,:)*hur(:,:) zvn(:,:)=zvn(:,:)*hvr(:,:) !Curl DO ji=1,jpim1 DO jj=1,jpjm1 vor_avr(ji,jj) = ((zvn(ji+1,jj)-zvn(ji,jj))- & (zun(ji,jj+1)-zun(ji,jj))) & /( e1f(ji,jj) * e2f(ji,jj) ) vor_avr(ji,jj) = vor_avr(ji,jj)*fmask(ji,jj,1) END DO END DO IF(idebug /= 0) THEN WRITE(numout,*) ' debuging trd_vor: I done' CALL FLUSH(numout) ENDIF ! ================================= ! II. netCDF output initialization ! ================================= # include "trdvor_ncinit.h90" IF( idebug /= 0 ) THEN WRITE(numout,*) ' debuging trd_vor: II. done' CALL FLUSH(numout) ENDIF ! ===================================== ! III vertical integration of 3D trends ! ===================================== ! Beta.V : intergration, no average utrd(:,:,:,9)=utrd(:,:,:,4) vtrd(:,:,:,9)=vtrd(:,:,:,4) DO jl=1,jplvor udpvor(:,:)=0 vdpvor(:,:)=0 !bottom friction IF( jl == jplvor ) THEN CALL lbc_lnk( tautrd(:,:,3), 'U' , -1. ) CALL lbc_lnk( tautrd(:,:,4), 'V' , -1. ) DO jj = 2, jpjm1 DO ji = fs_2, fs_jpim1 ikbu = min( mbathy(ji+1,jj), mbathy(ji,jj) ) ikbum1 = max( ikbu-1, 1 ) ikbv = min( mbathy(ji,jj+1), mbathy(ji,jj) ) ikbvm1 = max( ikbv-1, 1 ) udpvor(ji,jj)=tautrd(ji,jj,3)*fse3u(ji,jj,ikbum1)*e1u(ji,jj)*umask(ji,jj,ikbum1) vdpvor(ji,jj)=tautrd(ji,jj,4)*fse3v(ji,jj,ikbvm1)*e2v(ji,jj)*vmask(ji,jj,ikbvm1) END DO END DO !wind stress ELSE IF( jl == (jplvor-1) ) THEN CALL lbc_lnk( tautrd(:,:,1), 'U' , -1. ) CALL lbc_lnk( tautrd(:,:,2), 'V' , -1. ) udpvor(:,:)=tautrd(:,:,1)*fse3u(:,:,1)*e1u(:,:)*umask(:,:,1) vdpvor(:,:)=tautrd(:,:,2)*fse3v(:,:,1)*e2v(:,:)*vmask(:,:,1) ELSE CALL lbc_lnk( utrd(:,:,:,jl), 'U' , -1. ) CALL lbc_lnk( vtrd(:,:,:,jl), 'V' , -1. ) !utrd and vtrd terms DO jk = 1,jpk udpvor(:,:)=udpvor(:,:)+utrd(:,:,jk,jl)*fse3u(:,:,jk)*e1u(:,:)*umask(:,:,jk) vdpvor(:,:)=vdpvor(:,:)+vtrd(:,:,jk,jl)*fse3v(:,:,jk)*e2v(:,:)*vmask(:,:,jk) END DO ENDIF !average except for Beta.V IF (jl/=9) THEN udpvor(:,:) = udpvor(:,:) * hur(:,:) vdpvor(:,:) = vdpvor(:,:) * hvr(:,:) ENDIF !Curl DO ji=1,jpim1 DO jj=1,jpjm1 vortrd(ji,jj,jl)=( vdpvor(ji+1,jj)-vdpvor(ji,jj) & - ( udpvor(ji,jj+1)-udpvor(ji,jj) ) ) & / ( e1f(ji,jj) * e2f(ji,jj) ) END DO END DO vortrd(:,:,9)=vortrd(:,:,9)*hur(:,:) !surface mask DO ji=1,jpi DO jj=1,jpj vortrd(ji,jj,jl)=vortrd(ji,jj,jl)*fmask(ji,jj,1) !surface mask END DO END DO END DO IF( idebug /= 0 ) THEN IF(lwp) WRITE(numout,*) ' debuging trd_vor: III done' CALL FLUSH(numout) ENDIF ! ================================= ! IV. Cumulated trends ! ================================= ! IV.1 set `before' mixed layer values for kt = nit000+1 ! -------------------------------------------------------- IF( kt == nit000+1 ) THEN vor_avrbb(:,:) = vor_avrb(:,:) vor_avrbn(:,:) = vor_avr (:,:) ENDIF IF( idebug /= 0 ) THEN WRITE(numout,*) ' debuging trd_vor: IV.1 done' CALL FLUSH(numout) ENDIF ! IV.2 cumulated trends over analysis period (kt=2 to nwrite) ! ---------------------- ! trends cumulated over nwrite-2 time steps IF( kt >= nit000+2 ) THEN nmoydpvor = nmoydpvor + 1 DO jl = 1, jplvor IF( jl /= 9 ) THEN rotot(:,:) = rotot(:,:) + vortrd(:,:,jl) ENDIF END DO ENDIF IF( idebug /= 0 ) THEN WRITE(numout,*) ' debuging trd_vor: IV.2 done' CALL FLUSH(numout) ENDIF ! ============================================= ! V. Output in netCDF + residual computation ! ============================================= IF( MOD( kt - nit000+1, ntrd ) == 0 ) THEN ! V.1 compute total trend ! ------------------------ zmean = float(nmoydpvor) vor_avrtot(:,:) = ( vor_avr(:,:) - vor_avrbn(:,:) + vor_avrb(:,:) - & vor_avrbb(:,:) ) / (zmean * 2. * rdt) IF( idebug /= 0 ) THEN WRITE(numout,*) ' zmean = ',zmean WRITE(numout,*) ' debuging trd_vor: V.1 done' CALL FLUSH(numout) ENDIF ! V.2 compute residual ! --------------------- vor_avrres(:,:) = vor_avrtot(:,:) - rotot(:,:) / zmean ! Boundary conditions CALL lbc_lnk( vor_avrtot, 'F', 1. ) CALL lbc_lnk( vor_avrres, 'F', 1. ) IF( idebug /= 0 ) THEN WRITE(numout,*) ' debuging trd_vor: V.2 done' CALL FLUSH(numout) ENDIF ! V.3 time evolution array swap ! ------------------------------ vor_avrbb(:,:) = vor_avrb(:,:) vor_avrbn(:,:) = vor_avr(:,:) IF( idebug /= 0 ) THEN WRITE(numout,*) ' debuging trd_vor: V.3 done' CALL FLUSH(numout) ENDIF nmoydpvor=0 ENDIF ! V.5 write trends to output ! --------------------------- IF( kt >= nit000+1 ) THEN #include "trdvor_ncwrite.h90" IF( idebug /= 0 ) THEN WRITE(numout,*) ' debuging trd_vor: IV.5 done' CALL FLUSH(numout) ENDIF ENDIF IF( MOD( kt - nit000+1, ntrd ) == 0 ) THEN rotot(:,:)=0 ENDIF IF( kt == nitend ) THEN CALL histclo( nidvor ) ENDIF END SUBROUTINE trd_vor #else !!---------------------------------------------------------------------- !! Default option : Empty module !!---------------------------------------------------------------------- LOGICAL, PUBLIC :: lk_trdvor = .FALSE. ! momentum trend flag CONTAINS SUBROUTINE trd_vor( kt ) ! Empty routine WRITE(*,*) 'trd_vor: You should not have seen this print! error?', kt END SUBROUTINE trd_vor #endif !!====================================================================== END MODULE trdvor