MODULE usrdef_zgr !!====================================================================== !! *** MODULE usrdef_zgr *** !! !! === LOCK_EXCHANGE case === !! !! Ocean domain : user defined vertical coordinate system !!====================================================================== !! History : 4.0 ! 2016-08 (G. Madec, S. Flavoni) Original code !!---------------------------------------------------------------------- !!---------------------------------------------------------------------- !! usr_def_zgr : user defined vertical coordinate system (required) !! zgr_z1d : reference 1D z-coordinate !!--------------------------------------------------------------------- USE oce ! ocean variables USE dom_oce , ONLY: ln_zco, ln_zps, ln_sco ! ocean space and time domain USE usrdef_nam ! User defined : namelist variables ! USE in_out_manager ! I/O manager USE lbclnk ! ocean lateral boundary conditions (or mpp link) USE lib_mpp ! distributed memory computing library USE wrk_nemo ! Memory allocation USE timing ! Timing IMPLICIT NONE PRIVATE PUBLIC usr_def_zgr ! called by domzgr.F90 !! * Substitutions # include "vectopt_loop_substitute.h90" !!---------------------------------------------------------------------- !! NEMO/OPA 4.0 , NEMO Consortium (2016) !! $Id$ !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) !!---------------------------------------------------------------------- CONTAINS SUBROUTINE usr_def_zgr( ld_zco , ld_zps , ld_sco , ld_isfcav, & ! type of vertical coordinate & pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d , & ! 1D reference vertical coordinate & pdept , pdepw , & ! 3D t & w-points depth & pe3t , pe3u , pe3v , pe3f , & ! vertical scale factors & pe3w , pe3uw , pe3vw, & ! - - - & k_top , k_bot ) ! top & bottom ocean level !!--------------------------------------------------------------------- !! *** ROUTINE usr_def_zgr *** !! !! ** Purpose : User defined the vertical coordinates !! !!---------------------------------------------------------------------- LOGICAL , INTENT(out) :: ld_zco, ld_zps, ld_sco ! vertical coordinate flags LOGICAL , INTENT(out) :: ld_isfcav ! under iceshelf cavity flag REAL(wp), DIMENSION(:) , INTENT(out) :: pdept_1d, pdepw_1d ! 1D grid-point depth [m] REAL(wp), DIMENSION(:) , INTENT(out) :: pe3t_1d , pe3w_1d ! 1D grid-point depth [m] REAL(wp), DIMENSION(:,:,:), INTENT(out) :: pdept, pdepw ! grid-point depth [m] REAL(wp), DIMENSION(:,:,:), INTENT(out) :: pe3t , pe3u , pe3v , pe3f ! vertical scale factors [m] REAL(wp), DIMENSION(:,:,:), INTENT(out) :: pe3w , pe3uw, pe3vw ! i-scale factors INTEGER , DIMENSION(:,:) , INTENT(out) :: k_top, k_bot ! first & last ocean level ! INTEGER :: jk ! dummy indices REAL(wp), DIMENSION(jpi,jpj) :: z2d ! 2D workspace !!---------------------------------------------------------------------- ! IF(lwp) WRITE(numout,*) IF(lwp) WRITE(numout,*) 'usr_def_zgr : LOCK_EXCHANGE configuration (z-coordinate closed box ocean without cavities)' IF(lwp) WRITE(numout,*) '~~~~~~~~~~~' ! ! ! type of vertical coordinate ! --------------------------- ! set in usrdef_nam.F90 by reading the namusr_def namelist only ln_zco ln_zco = .TRUE. ! z-partial-step coordinate ln_zps = .FALSE. ! z-partial-step coordinate ln_sco = .FALSE. ! s-coordinate ld_isfcav = .FALSE. ! ISF Ice Shelves Flag ! ! ! Build the vertical coordinate system ! ------------------------------------ ! ! !== UNmasked meter bathymetry ==! ! ! flat bassin (20m deep and 64000m wide, set through the jpk and jpi (see userdef_nam.F90)) CALL zgr_z1d( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d ) ! Reference z-coordinate system ! ! ! !== top masked level bathymetry ==! (all coordinates) ! ! no ocean cavities : top ocean level is ONE, except over land ! the ocean basin surrounded by land (1 grid-point) set through lbc_lnk call as jperio=0 z2d(:,:) = 1._wp ! surface ocean is the 1st level CALL lbc_lnk( z2d, 'T', 1. ) ! closed basin since jperio = 0 (see userdef_nam.F90) k_top(:,:) = NINT( z2d(:,:) ) ! ! ! !== z-coordinate ==! (step-like topography) ! ! !* bottom ocean compute from the depth of grid-points k_bot(:,:) = jpkm1 * k_top(:,:) ! here use k_top as a land mask ! !* horizontally uniform coordinate (reference z-co everywhere) DO jk = 1, jpk pdept(:,:,jk) = pdept_1d(jk) pdepw(:,:,jk) = pdepw_1d(jk) pe3t (:,:,jk) = pe3t_1d (jk) pe3u (:,:,jk) = pe3t_1d (jk) pe3v (:,:,jk) = pe3t_1d (jk) pe3f (:,:,jk) = pe3t_1d (jk) pe3w (:,:,jk) = pe3w_1d (jk) pe3uw(:,:,jk) = pe3w_1d (jk) pe3vw(:,:,jk) = pe3w_1d (jk) END DO ! END SUBROUTINE usr_def_zgr SUBROUTINE zgr_z1d( pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d ) ! 1D reference vertical coordinate !!---------------------------------------------------------------------- !! *** ROUTINE zgr_z1d *** !! !! ** Purpose : set the depth of model levels and the resulting !! vertical scale factors. !! !! ** Method : z-coordinate system (use in all type of coordinate) !! The depth of model levels is defined from an analytical !! function the derivative of which gives the scale factors. !! both depth and scale factors only depend on k (1d arrays). !! w-level: pdepw_1d = pdep(k) !! pe3w_1d(k) = dk(pdep)(k) = e3(k) !! t-level: pdept_1d = pdep(k+0.5) !! pe3t_1d(k) = dk(pdep)(k+0.5) = e3(k+0.5) !! !! === Here constant vertical resolution === !! !! ** Action : - pdept_1d, pdepw_1d : depth of T- and W-point (m) !! - pe3t_1d , pe3w_1d : scale factors at T- and W-levels (m) !!---------------------------------------------------------------------- REAL(wp), DIMENSION(:), INTENT(out) :: pdept_1d, pdepw_1d ! 1D grid-point depth [m] REAL(wp), DIMENSION(:), INTENT(out) :: pe3t_1d , pe3w_1d ! 1D vertical scale factors [m] ! INTEGER :: jk ! dummy loop indices REAL(wp) :: zt, zw ! local scalar !!---------------------------------------------------------------------- ! IF(lwp) THEN ! Parameter print WRITE(numout,*) WRITE(numout,*) ' zgr_z1d : Reference vertical z-coordinates: uniform dz = ', rn_dz WRITE(numout,*) ' ~~~~~~~' ENDIF ! ! Reference z-coordinate (depth - scale factor at T- and W-points) ! Madec & Imbard 1996 function ! ---------------------- DO jk = 1, jpk zw = REAL( jk , wp ) zt = REAL( jk , wp ) + 0.5_wp pdepw_1d(jk) = rn_dz * REAL( jk-1 , wp ) pdept_1d(jk) = rn_dz * ( REAL( jk-1 , wp ) + 0.5_wp ) pe3w_1d (jk) = rn_dz pe3t_1d (jk) = rn_dz END DO ! IF(lwp) THEN ! control print WRITE(numout,*) WRITE(numout,*) ' Reference 1D z-coordinate depth and scale factors:' WRITE(numout, "(9x,' level gdept_1d gdepw_1d e3t_1d e3w_1d ')" ) WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, pdept_1d(jk), pdepw_1d(jk), pe3t_1d(jk), pe3w_1d(jk), jk = 1, jpk ) ENDIF ! END SUBROUTINE zgr_z1d !!====================================================================== END MODULE usrdef_zgr