MODULE trddyn !!====================================================================== !! *** MODULE trddyn *** !! Ocean diagnostics: ocean dynamic trends !!===================================================================== !! History : 3.5 ! 2012-02 (G. Madec) creation from trdmod: split DYN and TRA trends !! and manage 3D trends output for U, V, and KE !!---------------------------------------------------------------------- !!---------------------------------------------------------------------- !! trd_dyn : manage the type of momentum trend diagnostics (3D I/O, domain averaged, KE) !! trd_dyn_iom : output 3D momentum and/or tracer trends using IOM !! trd_dyn_init : initialization step !!---------------------------------------------------------------------- USE oce ! ocean dynamics and tracers variables USE dom_oce ! ocean space and time domain variables USE phycst ! physical constants USE sbc_oce ! surface boundary condition: ocean USE zdf_oce ! ocean vertical physics: variables USE trd_oce ! trends: ocean variables USE trdken ! trends: Kinetic ENergy USE trdglo ! trends: global domain averaged USE trdvor ! trends: vertical averaged vorticity USE trdmxl ! trends: mixed layer averaged ! USE in_out_manager ! I/O manager USE lbclnk ! lateral boundary condition USE iom ! I/O manager library USE lib_mpp ! MPP library IMPLICIT NONE PRIVATE PUBLIC trd_dyn ! called by all dynXXX modules INTERFACE trd_dyn module procedure trd_dyn_3d, trd_dyn_2d END INTERFACE REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_hpg, zvtrd_hpg REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_pvo, zvtrd_pvo REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_tfr, zvtrd_tfr REAL(wp), ALLOCATABLE, DIMENSION(:,:,:), SAVE :: zutrd_bfr, zvtrd_bfr REAL(wp), ALLOCATABLE, DIMENSION(:,:) , SAVE :: zutrd_tau, zvtrd_tau REAL(wp), ALLOCATABLE, DIMENSION(:,:) , SAVE :: zutrd_tfr2d, zvtrd_tfr2d REAL(wp), ALLOCATABLE, DIMENSION(:,:) , SAVE :: zutrd_bfr2d, zvtrd_bfr2d !! * Substitutions # include "do_loop_substitute.h90" # include "domzgr_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/OCE 4.0 , NEMO Consortium (2018) !! $Id$ !! Software governed by the CeCILL license (see ./LICENSE) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE trd_dyn_3d( putrd, pvtrd, ktrd, kt, Kmm, Kaa ) !!--------------------------------------------------------------------- !! *** ROUTINE trd_dyn_3d *** !! !! ** Purpose : Dispatch momentum trend computation, e.g. 3D output, !! integral constraints, barotropic vorticity, kinetic enrgy, !! and/or mixed layer budget. !!---------------------------------------------------------------------- REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: putrd, pvtrd ! U and V trends INTEGER , INTENT(in ) :: ktrd ! trend index INTEGER , INTENT(in ) :: kt ! time step INTEGER , INTENT(in ) :: Kmm ! time level index INTEGER , INTENT(in ), OPTIONAL :: Kaa ! " " " REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zue, zve ! temporary 2D arrays INTEGER :: ji, jj, jk ! loop indices LOGICAL, SAVE :: l_drgexp ! local logical to flag explicit friction !!---------------------------------------------------------------------- ! DO_3D(0,0,0,0,1,jpk) putrd(ji,jj,jk) = putrd(ji,jj,jk) * umask(ji,jj,jk) ! mask the trends pvtrd(ji,jj,jk) = pvtrd(ji,jj,jk) * vmask(ji,jj,jk) END_3D ! !!gm NB : here a lbc_lnk should probably be added SELECT CASE( ktrd ) CASE( jpdyn_hpg_save ) ! ! save 3D HPG trends to have SPG added later. ALLOCATE( zutrd_hpg(jpi,jpj,jpk), zvtrd_hpg(jpi,jpj,jpk) ) DO_3D(0,0,0,0,1,jpk) zutrd_hpg(ji,jj,jk) = putrd(ji,jj,jk) zvtrd_hpg(ji,jj,jk) = pvtrd(ji,jj,jk) END_3D CASE( jpdyn_pvo_save ) ! ! save 3D coriolis trends to possibly have barotropic part corrected later before writing out ALLOCATE( zutrd_pvo(jpi,jpj,jpk), zvtrd_pvo(jpi,jpj,jpk) ) DO_3D(0,0,0,0,1,jpk) zutrd_pvo(ji,jj,jk) = putrd(ji,jj,jk) zvtrd_pvo(ji,jj,jk) = pvtrd(ji,jj,jk) END_3D CASE( jpdyn_spg ) ! For explicit scheme SPG trends come here as 3D fields ! Add SPG trend to 3D HPG trend and also output as 2D diagnostic in own right. CALL trd_dyn_iom_2d( putrd(:,:,1), pvtrd(:,:,1), jpdyn_spg, kt ) DO_3D(0,0,0,0,1,jpk) putrd(ji,jj,jk) = putrd(ji,jj,jk) + zutrd_hpg(ji,jj,jk) pvtrd(ji,jj,jk) = pvtrd(ji,jj,jk) + zvtrd_hpg(ji,jj,jk) END_3D DEALLOCATE( zutrd_hpg, zvtrd_hpg ) CASE( jpdyn_tfre, jpdyn_tfre_bt, jpdyn_tfri ) ! ! Add various top friction terms for baroclinic trend to saved quantity. ! Any barotropic component removed later when TFR diagnostic finalised (on ZDF call). IF( .NOT. ALLOCATED(zutrd_tfr) ) THEN ALLOCATE( zutrd_tfr(jpi,jpj,jpk), zvtrd_tfr(jpi,jpj,jpk) ) DO_3D(0,0,0,0,1,jpk) zutrd_tfr(ji,jj,jk) = 0.0 zvtrd_tfr(ji,jj,jk) = 0.0 END_3D ENDIF DO_3D(0,0,0,0,1,jpk) zutrd_tfr(ji,jj,jk) = zutrd_tfr(ji,jj,jk) + putrd(ji,jj,jk) zvtrd_tfr(ji,jj,jk) = zvtrd_tfr(ji,jj,jk) + pvtrd(ji,jj,jk) END_3D CASE( jpdyn_bfre ) ! ! Save explicit bottom friction for baroclinic trend to later add to ZDF and BFR trends l_drgexp = .true. ALLOCATE( zutrd_bfr(jpi,jpj,jpk), zvtrd_bfr(jpi,jpj,jpk) ) DO_3D(0,0,0,0,1,jpk) zutrd_bfr(ji,jj,jk) = putrd(ji,jj,jk) zvtrd_bfr(ji,jj,jk) = pvtrd(ji,jj,jk) END_3D CASE( jpdyn_bfre_bt, jpdyn_bfri ) ! ! Add various bottom friction terms for baroclinic trend to saved quantity. l_drgexp = .false. IF( .NOT. ALLOCATED(zutrd_bfr) ) THEN ALLOCATE( zutrd_bfr(jpi,jpj,jpk), zvtrd_bfr(jpi,jpj,jpk) ) DO_3D(0,0,0,0,1,jpk) zutrd_bfr(ji,jj,jk) = 0.0 zvtrd_bfr(ji,jj,jk) = 0.0 END_3D ENDIF DO_3D(0,0,0,0,1,jpk) zutrd_bfr(ji,jj,jk) = zutrd_bfr(ji,jj,jk) + putrd(ji,jj,jk) zvtrd_bfr(ji,jj,jk) = zvtrd_bfr(ji,jj,jk) + pvtrd(ji,jj,jk) END_3D CASE( jpdyn_zdf ) ! ZDF trend: Add explicit bottom friction if necessary. If ln_dynspg_ts, remove barotropic component and add wind stress, ! and top and bottom friction trends from dynspg_ts. ! IF( l_drgexp ) THEN ! In this case zutrd_t/bfr is the explicit top/bottom friction and needs to be added to the ZDF trend. DO_3D(0,0,0,0,1,jpkm1) putrd(ji,jj,jk) = ( putrd(ji,jj,jk) + zutrd_bfr(ji,jj,jk) ) * umask(ji,jj,jk) pvtrd(ji,jj,jk) = ( pvtrd(ji,jj,jk) + zvtrd_bfr(ji,jj,jk) ) * vmask(ji,jj,jk) END_3D IF( ALLOCATED( zutrd_tfr ) )THEN DO_3D(0,0,0,0,1,jpkm1) putrd(ji,jj,jk) = ( putrd(ji,jj,jk) + zutrd_tfr(ji,jj,jk) ) * umask(ji,jj,jk) pvtrd(ji,jj,jk) = ( pvtrd(ji,jj,jk) + zvtrd_tfr(ji,jj,jk) ) * vmask(ji,jj,jk) END_3D ENDIF ENDIF IF( ln_dynspg_ts ) THEN ALLOCATE( zue(jpi,jpj), zve(jpi,jpj) ) zue(:,:) = e3u(:,:,1,Kaa) * putrd(:,:,1) * umask(:,:,1) zve(:,:) = e3v(:,:,1,Kaa) * pvtrd(:,:,1) * vmask(:,:,1) DO_3D(0,0,0,0,2,jpkm1) zue(ji,jj) = zue(ji,jj) + e3u(ji,jj,jk,Kaa) * putrd(ji,jj,jk) * umask(ji,jj,jk) zve(ji,jj) = zve(ji,jj) + e3v(ji,jj,jk,Kaa) * pvtrd(ji,jj,jk) * vmask(ji,jj,jk) END_3D DO_3D(0,0,0,0,1,jpkm1) putrd(ji,jj,jk) = ( zutrd_tau(ji,jj) + zutrd_bfr2d(ji,jj) + putrd(ji,jj,jk) - zue(ji,jj) * r1_hu(ji,jj,Kaa) ) * umask(ji,jj,jk) pvtrd(ji,jj,jk) = ( zvtrd_tau(ji,jj) + zvtrd_bfr2d(ji,jj) + pvtrd(ji,jj,jk) - zve(ji,jj) * r1_hv(ji,jj,Kaa) ) * vmask(ji,jj,jk) END_3D IF( ALLOCATED( zutrd_tfr2d ) ) THEN DO_3D(0,0,0,0,1,jpkm1) putrd(ji,jj,jk) = ( putrd(ji,jj,jk) + zutrd_tfr2d(ji,jj) ) * umask(ji,jj,jk) pvtrd(ji,jj,jk) = ( pvtrd(ji,jj,jk) + zvtrd_tfr2d(ji,jj) ) * vmask(ji,jj,jk) END_3D ENDIF ! ENDIF ! ! Finalise top and bottom friction trends ! IF( ln_dynspg_ts ) THEN IF( ALLOCATED( zutrd_tfr ) ) THEN ! Finalise total top friction trend : remove any barotropic component from baroclinic trends ! and add bfr2d trend zue(:,:) = e3u(:,:,1,Kaa) * zutrd_tfr(:,:,1) * umask(:,:,1) zve(:,:) = e3v(:,:,1,Kaa) * zvtrd_tfr(:,:,1) * vmask(:,:,1) DO_3D(0,0,0,0,2,jpkm1) zue(ji,jj) = zue(ji,jj) + e3u(ji,jj,jk,Kaa) * zutrd_tfr(ji,jj,jk) * umask(ji,jj,jk) zve(ji,jj) = zve(ji,jj) + e3v(ji,jj,jk,Kaa) * zvtrd_tfr(ji,jj,jk) * vmask(ji,jj,jk) END_3D DO_3D(0,0,0,0,1,jpkm1) zutrd_tfr(ji,jj,jk) = ( zutrd_tfr2d(ji,jj) + zutrd_tfr(ji,jj,jk) - zue(ji,jj) * r1_hu(ji,jj,Kaa) ) * umask(ji,jj,jk) zvtrd_tfr(ji,jj,jk) = ( zvtrd_tfr2d(ji,jj) + zvtrd_tfr(ji,jj,jk) - zve(ji,jj) * r1_hv(ji,jj,Kaa) ) * vmask(ji,jj,jk) END_3D DEALLOCATE( zutrd_tfr2d, zvtrd_tfr2d ) ENDIF ! ! Finalise total bottom friction trend : remove any barotropic component from baroclinic trends ! and add bfr2d trend zue(:,:) = e3u(:,:,1,Kaa) * zutrd_bfr(:,:,1) * umask(:,:,1) zve(:,:) = e3v(:,:,1,Kaa) * zvtrd_bfr(:,:,1) * vmask(:,:,1) DO_3D(0,0,0,0,2,jpkm1) zue(ji,jj) = zue(ji,jj) + e3u(ji,jj,jk,Kaa) * zutrd_bfr(ji,jj,jk) * umask(ji,jj,jk) zve(ji,jj) = zve(ji,jj) + e3v(ji,jj,jk,Kaa) * zvtrd_bfr(ji,jj,jk) * vmask(ji,jj,jk) END_3D DO_3D(0,0,0,0,1,jpkm1) zutrd_bfr(ji,jj,jk) = ( zutrd_bfr2d(ji,jj) + zutrd_bfr(ji,jj,jk) - zue(ji,jj) * r1_hu(ji,jj,Kaa) ) * umask(ji,jj,jk) zvtrd_bfr(ji,jj,jk) = ( zvtrd_bfr2d(ji,jj) + zvtrd_bfr(ji,jj,jk) - zve(ji,jj) * r1_hv(ji,jj,Kaa) ) * vmask(ji,jj,jk) END_3D ! DEALLOCATE( zue, zve, zutrd_tau, zvtrd_tau, zutrd_bfr2d, zvtrd_bfr2d ) ENDIF ! Write out total top and bottom friction trends. IF( ALLOCATED( zutrd_tfr ) ) THEN CALL trd_dyn_iom_3d( zutrd_tfr, zvtrd_tfr, jpdyn_tfr, kt, Kmm ) DEALLOCATE( zutrd_tfr, zvtrd_tfr ) ENDIF CALL trd_dyn_iom_3d( zutrd_bfr, zvtrd_bfr, jpdyn_bfr, kt, Kmm ) DEALLOCATE( zutrd_bfr, zvtrd_bfr ) END SELECT IF ( ktrd /= jpdyn_pvo_save .and. ktrd /= jpdyn_bfre .and. ktrd /= jpdyn_bfre_bt .and. ktrd /= jpdyn_bfri ) THEN ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! 3D output of momentum and/or tracers trends using IOM interface !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< IF( ln_dyn_trd ) CALL trd_dyn_iom_3d( putrd, pvtrd, ktrd, kt, Kmm ) !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! Integral Constraints Properties for momentum and/or tracers trends !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< IF( ln_glo_trd ) CALL trd_glo( putrd, pvtrd, ktrd, 'DYN', kt, Kmm ) !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! Kinetic Energy trends !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IF( ln_KE_trd ) CALL trd_ken( putrd, pvtrd, ktrd, kt, Kmm ) !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! Vorticity trends !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> IF( ln_vor_trd ) CALL trd_vor( putrd, pvtrd, ktrd, kt, Kmm ) !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ! Mixed layer trends for active tracers !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< !!gm IF( ln_dyn_mxl ) CALL trd_mxl_dyn ! ENDIF ! END SUBROUTINE trd_dyn_3d SUBROUTINE trd_dyn_2d( putrd, pvtrd, ktrd, kt, Kmm, Kaa ) !!--------------------------------------------------------------------- !! *** ROUTINE trd_mod *** !! !! ** Purpose : Dispatch momentum trend computation, e.g. 2D output, !! integral constraints, barotropic vorticity, kinetic enrgy, !! and/or mixed layer budget. !!---------------------------------------------------------------------- REAL(wp), DIMENSION(:,:), INTENT(inout) :: putrd, pvtrd ! U and V trends INTEGER , INTENT(in ) :: ktrd ! trend index INTEGER , INTENT(in ) :: kt ! time step INTEGER , INTENT(in ) :: Kmm ! time level index INTEGER , INTENT(in ), OPTIONAL :: Kaa ! " " " INTEGER :: ji, jj, jk ! loop indices !!---------------------------------------------------------------------- ! DO_2D(0,0,0,0) putrd(ji,jj) = putrd(ji,jj) * umask(ji,jj,1) ! mask the trends pvtrd(ji,jj) = pvtrd(ji,jj) * vmask(ji,jj,1) END_2D ! !!gm NB : here a lbc_lnk should probably be added SELECT CASE(ktrd) CASE( jpdyn_pvo_corr ) ! ! Remove "first-guess" barotropic coriolis trend from 3D PVO trend. DO_3D(0,0,0,0,1,jpkm1) zutrd_pvo(ji,jj,jk) = zutrd_pvo(ji,jj,jk) - putrd(ji,jj) zvtrd_pvo(ji,jj,jk) = zvtrd_pvo(ji,jj,jk) - pvtrd(ji,jj) END_3D CASE( jpdyn_spg ) ! ! For split-explicit scheme SPG trends come here as 2D fields ! Add SPG trend to 3D HPG trend and also output as 2D diagnostic in own right. DO_3D(0,0,0,0,1,jpkm1) zutrd_hpg(ji,jj,jk) = zutrd_hpg(ji,jj,jk) + putrd(ji,jj) zvtrd_hpg(ji,jj,jk) = zvtrd_hpg(ji,jj,jk) + pvtrd(ji,jj) END_3D CALL trd_dyn_3d( zutrd_hpg, zvtrd_hpg, jpdyn_hpg, kt, Kmm ) DEALLOCATE( zutrd_hpg, zvtrd_hpg ) CASE( jpdyn_pvo ) ! ! Add 2D PVO trend to 3D PVO trend and also output as diagnostic in own right. DO_3D(0,0,0,0,1,jpkm1) zutrd_pvo(ji,jj,jk) = zutrd_pvo(ji,jj,jk) + putrd(ji,jj) zvtrd_pvo(ji,jj,jk) = zvtrd_pvo(ji,jj,jk) + pvtrd(ji,jj) END_3D CALL trd_dyn_3d( zutrd_pvo, zvtrd_pvo, jpdyn_pvo, kt, Kmm ) DEALLOCATE( zutrd_pvo, zvtrd_pvo ) CASE( jpdyn_tau ) ! ! Save 2D wind forcing trend locally (to be added to ZDF trend) ! and output as a trend in its own right. ALLOCATE( zutrd_tau(jpi,jpj), zvtrd_tau(jpi,jpj) ) DO_2D(0,0,0,0) zutrd_tau(ji,jj) = putrd(ji,jj) zvtrd_tau(ji,jj) = pvtrd(ji,jj) END_2D CASE( jpdyn_tfr ) ! ! Save 2D field to add to ZDF trend (and also output 2D field as diagnostic in own right below). ALLOCATE( zutrd_tfr2d(jpi,jpj), zvtrd_tfr2d(jpi,jpj) ) DO_2D(0,0,0,0) zutrd_tfr2d(ji,jj) = putrd(ji,jj) zvtrd_tfr2d(ji,jj) = pvtrd(ji,jj) END_2D CASE( jpdyn_bfr ) ! ! Save 2D field to add to ZDF trend (and also output 2D field as diagnostic in own right below). ALLOCATE( zutrd_bfr2d(jpi,jpj), zvtrd_bfr2d(jpi,jpj) ) DO_2D(0,0,0,0) zutrd_bfr2d(ji,jj) = putrd(ji,jj) zvtrd_bfr2d(ji,jj) = pvtrd(ji,jj) END_2D END SELECT !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ! 2D output of momentum and/or tracers trends using IOM interface !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< IF( ln_dyn_trd ) CALL trd_dyn_iom_2d( putrd, pvtrd, ktrd, kt ) !!$ CALLS TO THESE ROUTINES FOR 2D DIAGOSTICS NOT CODED YET !!$ !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< !!$ ! Integral Constraints Properties for momentum and/or tracers trends !!$ !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< !!$ IF( ln_glo_trd ) CALL trd_glo( putrd, pvtrd, ktrd, 'DYN', kt ) !!$ !!$ !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< !!$ ! Kinetic Energy trends !!$ !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> !!$ IF( ln_KE_trd ) CALL trd_ken( putrd, pvtrd, ktrd, kt ) !!$ !!$ !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< !!$ ! Vorticity trends !!$ !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> !!$ IF( ln_vor_trd ) CALL trd_vor( putrd, pvtrd, ktrd, kt ) !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ! Mixed layer trends for active tracers !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< !!gm IF( ln_dyn_mxl ) CALL trd_mxl_dyn ! END SUBROUTINE trd_dyn_2d SUBROUTINE trd_dyn_iom_3d( putrd, pvtrd, ktrd, kt, Kmm ) !!--------------------------------------------------------------------- !! *** ROUTINE trd_dyn_iom *** !! !! ** Purpose : output 3D trends using IOM !!---------------------------------------------------------------------- REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: putrd, pvtrd ! U and V trends INTEGER , INTENT(in ) :: ktrd ! trend index INTEGER , INTENT(in ) :: kt ! time step INTEGER , INTENT(in ) :: Kmm ! time level index ! INTEGER :: ji, jj, jk ! dummy loop indices INTEGER :: ikbu, ikbv ! local integers REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: z2dx, z2dy ! 2D workspace REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: z3dx, z3dy ! 3D workspace !!---------------------------------------------------------------------- ! SELECT CASE( ktrd ) CASE( jpdyn_hpg ) ; CALL iom_put( "utrd_hpg", putrd ) ! hydrostatic pressure gradient CALL iom_put( "vtrd_hpg", pvtrd ) CASE( jpdyn_pvo ) ; CALL iom_put( "utrd_pvo", putrd ) ! planetary vorticity CALL iom_put( "vtrd_pvo", pvtrd ) CASE( jpdyn_rvo ) ; CALL iom_put( "utrd_rvo", putrd ) ! relative vorticity (or metric term) CALL iom_put( "vtrd_rvo", pvtrd ) CASE( jpdyn_keg ) ; CALL iom_put( "utrd_keg", putrd ) ! Kinetic Energy gradient (or had) CALL iom_put( "vtrd_keg", pvtrd ) ALLOCATE( z3dx(jpi,jpj,jpk) , z3dy(jpi,jpj,jpk) ) z3dx(:,:,:) = 0._wp ! U.dxU & V.dyV (approximation) z3dy(:,:,:) = 0._wp DO_3D( 0, 0, 0, 0, 1, jpkm1 ) ! no mask as un,vn are masked z3dx(ji,jj,jk) = uu(ji,jj,jk,Kmm) * ( uu(ji+1,jj,jk,Kmm) - uu(ji-1,jj,jk,Kmm) ) / ( 2._wp * e1u(ji,jj) ) z3dy(ji,jj,jk) = vv(ji,jj,jk,Kmm) * ( vv(ji,jj+1,jk,Kmm) - vv(ji,jj-1,jk,Kmm) ) / ( 2._wp * e2v(ji,jj) ) END_3D CALL lbc_lnk( 'trddyn', z3dx, 'U', -1., z3dy, 'V', -1. ) CALL iom_put( "utrd_udx", z3dx ) CALL iom_put( "vtrd_vdy", z3dy ) DEALLOCATE( z3dx , z3dy ) CASE( jpdyn_zad ) ; CALL iom_put( "utrd_zad", putrd ) ! vertical advection CALL iom_put( "vtrd_zad", pvtrd ) CASE( jpdyn_ldf ) ; CALL iom_put( "utrd_ldf", putrd ) ! lateral diffusion CALL iom_put( "vtrd_ldf", pvtrd ) CASE( jpdyn_zdf ) ; CALL iom_put( "utrd_zdf", putrd ) ! vertical diffusion CALL iom_put( "vtrd_zdf", pvtrd ) ! ! ! wind stress trends ALLOCATE( z2dx(jpi,jpj) , z2dy(jpi,jpj) ) z2dx(:,:) = ( utau_b(:,:) + utau(:,:) ) / ( e3u(:,:,1,Kmm) * rho0 ) z2dy(:,:) = ( vtau_b(:,:) + vtau(:,:) ) / ( e3v(:,:,1,Kmm) * rho0 ) CALL iom_put( "utrd_tau", z2dx ) CALL iom_put( "vtrd_tau", z2dy ) DEALLOCATE( z2dx , z2dy ) CASE( jpdyn_bfr ) ; CALL iom_put( "utrd_bfr", putrd ) ! total bottom friction CALL iom_put( "vtrd_bfr", pvtrd ) CASE( jpdyn_atf ) ; CALL iom_put( "utrd_atf", putrd ) ! asselin filter trends CALL iom_put( "vtrd_atf", pvtrd ) END SELECT ! END SUBROUTINE trd_dyn_iom_3d SUBROUTINE trd_dyn_iom_2d( putrd, pvtrd, ktrd, kt ) !!--------------------------------------------------------------------- !! *** ROUTINE trd_dyn_iom *** !! !! ** Purpose : output 2D trends using IOM !!---------------------------------------------------------------------- REAL(wp), DIMENSION(:,:), INTENT(inout) :: putrd, pvtrd ! U and V trends INTEGER , INTENT(in ) :: ktrd ! trend index INTEGER , INTENT(in ) :: kt ! time step ! INTEGER :: ji, jj, jk ! dummy loop indices INTEGER :: ikbu, ikbv ! local integers REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: z2dx, z2dy ! 2D workspace REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: z3dx, z3dy ! 3D workspace !!---------------------------------------------------------------------- ! SELECT CASE( ktrd ) CASE( jpdyn_spg ) ; CALL iom_put( "utrd_spg2d", putrd ) ! surface pressure gradient CALL iom_put( "vtrd_spg2d", pvtrd ) CASE( jpdyn_pvo ) ; CALL iom_put( "utrd_pvo2d", putrd ) ! planetary vorticity (barotropic part) CALL iom_put( "vtrd_pvo2d", pvtrd ) CASE( jpdyn_pvo_corr ) ; CALL iom_put( "utrd_pvo_corr", putrd ) ! planetary vorticity correction CALL iom_put( "vtrd_pvo_corr", pvtrd ) CASE( jpdyn_tfr ) ; CALL iom_put( "utrd_tfr2d", putrd ) ! top friction trend for barotropic currents CALL iom_put( "vtrd_tfr2d", pvtrd ) CASE( jpdyn_bfr ) ; CALL iom_put( "utrd_bfr2d", putrd ) ! bottom friction trend for barotropic currents CALL iom_put( "vtrd_bfr2d", pvtrd ) END SELECT ! END SUBROUTINE trd_dyn_iom_2d !!====================================================================== END MODULE trddyn