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.
Changeset 13204 for utils/tools/DOMAINcfg/src/domzgr.F90 – NEMO

Ignore:
Timestamp:
2020-07-02T10:38:35+02:00 (4 years ago)
Author:
smasson
Message:

tools: update with tools_dev_r12970_AGRIF_CMEMS

File:
1 edited

Legend:

Unmodified
Added
Removed
  • utils/tools/DOMAINcfg/src/domzgr.F90

    r12414 r13204  
    1717   !!            3.4  ! 2012-08  (J. Siddorn) added Siddorn and Furner stretching function 
    1818   !!            3.4  ! 2012-12  (R. Bourdalle-Badie and G. Reffray)  modify C1D case   
    19    !!            3.6  ! 2014-11  (P. Mathiot and C. Harris) add ice shelf capability 
     19   !!            3.6  ! 2014-11  (P. Mathiot and C. Harris) add ice shelf capabilitye 
    2020   !!            3.?  ! 2015-11  (H. Liu) Modifications for Wetting/Drying 
    2121   !!---------------------------------------------------------------------- 
     
    3636   !!--------------------------------------------------------------------- 
    3737   USE dom_oce           ! ocean domain 
     38   USE depth_e3       ! depth <=> e3 
    3839   ! 
    3940   USE in_out_manager    ! I/O manager 
     
    4445   USE dombat 
    4546   USE domisf 
     47   USE agrif_domzgr 
    4648 
    4749   IMPLICIT NONE 
     
    9294CONTAINS        
    9395 
    94    SUBROUTINE dom_zgr 
     96   SUBROUTINE dom_zgr( k_top, k_bot ) 
    9597      !!---------------------------------------------------------------------- 
    9698      !!                ***  ROUTINE dom_zgr  *** 
     
    109111      !! ** Action  :   define gdep., e3., mbathy and bathy 
    110112      !!---------------------------------------------------------------------- 
     113      INTEGER, DIMENSION(:,:), INTENT(out) ::   k_top, k_bot   ! ocean first and last level indices 
     114      ! 
    111115      INTEGER ::   ioptio, ibat   ! local integer 
    112116      INTEGER ::   ios 
    113117      ! 
    114       NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco, ln_isfcav, ln_linssh 
     118      INTEGER :: jk 
     119      REAL(wp) ::   zrefdep             ! depth of the reference level (~10m) 
     120 
     121 
     122      NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco, ln_isfcav 
    115123      !!---------------------------------------------------------------------- 
    116124      ! 
     
    124132902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzgr in configuration namelist', lwp ) 
    125133      IF(lwm) WRITE ( numond, namzgr ) 
     134 
     135      IF(ln_read_cfg) THEN 
     136         IF(lwp) WRITE(numout,*) 
     137         IF(lwp) WRITE(numout,*) '   ==>>>   Read vertical mesh in ', TRIM( cn_domcfg ), ' file' 
     138         ! 
     139         CALL zgr_read   ( ln_zco  , ln_zps  , ln_sco, ln_isfcav,   & 
     140            &              gdept_1d, gdepw_1d, e3t_1d, e3w_1d   ,   &    ! 1D gridpoints depth 
     141            &              gdept_0 , gdepw_0                    ,   &    ! gridpoints depth 
     142            &              e3t_0   , e3u_0   , e3v_0 , e3f_0    ,   &    ! vertical scale factors 
     143            &              e3w_0   , e3uw_0  , e3vw_0           ,   &    ! vertical scale factors 
     144            &              k_top   , k_bot            )                  ! 1st & last ocean level 
     145            ! 
     146!!gm to be remove when removing the OLD definition of e3 scale factors so that gde3w disappears 
     147!      ! Compute gde3w_0 (vertical sum of e3w) 
     148!      gde3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 
     149!      DO jk = 2, jpk 
     150!         gde3w_0(:,:,jk) = gde3w_0(:,:,jk-1) + e3w_0(:,:,jk) 
     151!      END DO 
     152      ! 
     153 
     154      !                                ! top/bottom ocean level indices for t-, u- and v-points (f-point also for top) 
     155      CALL zgr_top_bot( k_top, k_bot )      ! with a minimum value set to 1 
     156 
     157      !                                ! deepest/shallowest W level Above/Below ~10m 
     158!!gm BUG in s-coordinate this does not work! 
     159      zrefdep = 10._wp - 0.1_wp * MINVAL( e3w_1d )                   ! ref. depth with tolerance (10% of minimum layer thickness) 
     160      nlb10 = MINLOC( gdepw_1d, mask = gdepw_1d > zrefdep, dim = 1 ) ! shallowest W level Below ~10m 
     161      nla10 = nlb10 - 1                                              ! deepest    W level Above ~10m 
     162!!gm end bug 
     163 
     164      ENDIF         
    126165 
    127166      IF(lwp) THEN                     ! Control print 
     
    134173         WRITE(numout,*) '      s- or hybrid z-s-coordinate    ln_sco    = ', ln_sco 
    135174         WRITE(numout,*) '      ice shelf cavities             ln_isfcav = ', ln_isfcav 
    136          WRITE(numout,*) '      linear free surface            ln_linssh = ', ln_linssh 
    137       ENDIF 
    138  
    139       IF( ln_linssh .AND. lwp) WRITE(numout,*) '   linear free surface: the vertical mesh does not change in time' 
     175      ENDIF 
    140176 
    141177      ioptio = 0                       ! Check Vertical coordinate options 
     
    150186      IF ( ln_sco .AND. ln_isfcav ) ioptio = ioptio + 1 
    151187      IF( ioptio > 0 )   CALL ctl_stop( ' Cavity not tested/compatible with full step (zco) and sigma (ln_sco) ' ) 
     188 
     189      IF(.NOT.ln_read_cfg) THEN 
    152190      ! 
    153191      ! Build the vertical coordinate system 
     
    163201      ! ----------------------------------- 
    164202                          CALL zgr_bot_level    ! deepest ocean level for t-, u- and v-points 
     203                          k_bot = mbkt 
    165204                          CALL zgr_top_level    ! shallowest ocean level for T-, U-, V- points 
    166       ! 
    167       IF( nprint == 1 .AND. lwp )   THEN 
    168          WRITE(numout,*) ' MIN val mbathy  ', MINVAL(  mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 
     205                          k_top = mikt 
     206                          WHERE( bathy(:,:) <= 0._wp )  k_top(:,:) = 0  ! set k_top to zero over land 
     207      ENDIF 
     208      ! 
     209      IF( lwp )   THEN 
     210         WRITE(numout,*) ' MIN val k_top   ', MINVAL(   k_top(:,:) ), ' MAX ', MAXVAL( k_top(:,:) ) 
     211         WRITE(numout,*) ' MIN val k_bot   ', MINVAL(   k_bot(:,:) ), ' MAX ', MAXVAL( k_bot(:,:) ) 
    169212         WRITE(numout,*) ' MIN val depth t ', MINVAL( gdept_0(:,:,:) ),   & 
    170213            &                          ' w ', MINVAL( gdepw_0(:,:,:) ) 
     
    181224            &                          ' w ', MAXVAL(   e3w_0(:,:,:) ) 
    182225      ENDIF 
     226 
    183227      ! 
    184228   END SUBROUTINE dom_zgr 
    185229 
     230   SUBROUTINE zgr_read( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,   &   ! type of vertical coordinate 
     231      &                 pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,   &   ! 1D reference vertical coordinate 
     232      &                 pdept , pdepw ,                            &   ! 3D t & w-points depth 
     233      &                 pe3t  , pe3u  , pe3v   , pe3f ,            &   ! vertical scale factors 
     234      &                 pe3w  , pe3uw , pe3vw         ,            &   !     -      -      - 
     235      &                 k_top  , k_bot    )                            ! top & bottom ocean level 
     236      !!--------------------------------------------------------------------- 
     237      !!              ***  ROUTINE zgr_read  *** 
     238      !! 
     239      !! ** Purpose :   Read the vertical information in the domain configuration file 
     240      !! 
     241      !!---------------------------------------------------------------------- 
     242      LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags 
     243      LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag 
     244      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth       [m] 
     245      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D vertical scale factors [m] 
     246      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth          [m] 
     247      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors    [m] 
     248      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         !    -       -      - 
     249      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top , k_bot               ! first & last ocean level 
     250      ! 
     251      INTEGER  ::   jk     ! dummy loop index 
     252      INTEGER  ::   inum   ! local logical unit 
     253      REAL(WP) ::   z_zco, z_zps, z_sco, z_cav 
     254      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! 2D workspace 
     255      !!---------------------------------------------------------------------- 
     256      ! 
     257      IF(lwp) THEN 
     258         WRITE(numout,*) 
     259         WRITE(numout,*) '   zgr_read : read the vertical coordinates in ', TRIM( cn_domcfg ), ' file' 
     260         WRITE(numout,*) '   ~~~~~~~~' 
     261      ENDIF 
     262      ! 
     263      CALL iom_open( cn_domcfg, inum ) 
     264      ! 
     265      !                          !* type of vertical coordinate 
     266      CALL iom_get( inum, 'ln_zco'   , z_zco ) 
     267      CALL iom_get( inum, 'ln_zps'   , z_zps ) 
     268      CALL iom_get( inum, 'ln_sco'   , z_sco ) 
     269      IF( z_zco == 0._wp ) THEN   ;   ld_zco = .false.   ;   ELSE   ;   ld_zco = .true.   ;   ENDIF 
     270      IF( z_zps == 0._wp ) THEN   ;   ld_zps = .false.   ;   ELSE   ;   ld_zps = .true.   ;   ENDIF 
     271      IF( z_sco == 0._wp ) THEN   ;   ld_sco = .false.   ;   ELSE   ;   ld_sco = .true.   ;   ENDIF 
     272      ! 
     273      !                          !* ocean cavities under iceshelves 
     274      CALL iom_get( inum, 'ln_isfcav', z_cav ) 
     275      IF( z_cav == 0._wp ) THEN   ;   ld_isfcav = .false.   ;   ELSE   ;   ld_isfcav = .true.   ;   ENDIF 
     276      ! 
     277      !                          !* vertical scale factors 
     278      CALL iom_get( inum, jpdom_unknown, 'e3t_1d'  , pe3t_1d  )                     ! 1D reference coordinate 
     279      CALL iom_get( inum, jpdom_unknown, 'e3w_1d'  , pe3w_1d  ) 
     280      ! 
     281      CALL iom_get( inum, jpdom_data, 'e3t_0'  , pe3t  , lrowattr=ln_use_jattr )    ! 3D coordinate 
     282      CALL iom_get( inum, jpdom_data, 'e3u_0'  , pe3u  , lrowattr=ln_use_jattr ) 
     283      CALL iom_get( inum, jpdom_data, 'e3v_0'  , pe3v  , lrowattr=ln_use_jattr ) 
     284      CALL iom_get( inum, jpdom_data, 'e3f_0'  , pe3f  , lrowattr=ln_use_jattr ) 
     285      CALL iom_get( inum, jpdom_data, 'e3w_0'  , pe3w  , lrowattr=ln_use_jattr ) 
     286      CALL iom_get( inum, jpdom_data, 'e3uw_0' , pe3uw , lrowattr=ln_use_jattr ) 
     287      CALL iom_get( inum, jpdom_data, 'e3vw_0' , pe3vw , lrowattr=ln_use_jattr ) 
     288      ! 
     289      !                          !* depths 
     290      !                                   !- old depth definition (obsolescent feature) 
     291      IF(  iom_varid( inum, 'gdept_1d', ldstop = .FALSE. ) > 0  .AND.  & 
     292         & iom_varid( inum, 'gdepw_1d', ldstop = .FALSE. ) > 0  .AND.  & 
     293         & iom_varid( inum, 'gdept_0' , ldstop = .FALSE. ) > 0  .AND.  & 
     294         & iom_varid( inum, 'gdepw_0' , ldstop = .FALSE. ) > 0    ) THEN 
     295         CALL ctl_warn( 'zgr_read : old definition of depths and scale factors used ', &  
     296            &           '           depths at t- and w-points read in the domain configuration file') 
     297         CALL iom_get( inum, jpdom_unknown, 'gdept_1d', pdept_1d )    
     298         CALL iom_get( inum, jpdom_unknown, 'gdepw_1d', pdepw_1d ) 
     299         CALL iom_get( inum, jpdom_data   , 'gdept_0' , pdept , lrowattr=ln_use_jattr ) 
     300         CALL iom_get( inum, jpdom_data   , 'gdepw_0' , pdepw , lrowattr=ln_use_jattr ) 
     301         ! 
     302      ELSE                                !- depths computed from e3. scale factors 
     303         CALL e3_to_depth( pe3t_1d, pe3w_1d, pdept_1d, pdepw_1d )    ! 1D reference depth 
     304         CALL e3_to_depth( pe3t   , pe3w   , pdept   , pdepw    )    ! 3D depths 
     305         IF(lwp) THEN 
     306            WRITE(numout,*) 
     307            WRITE(numout,*) '              Reference 1D z-coordinate depth and scale factors:' 
     308            WRITE(numout, "(9x,' level  gdept_1d  gdepw_1d  e3t_1d   e3w_1d  ')" ) 
     309            WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, pdept_1d(jk), pdepw_1d(jk), pe3t_1d(jk), pe3w_1d(jk), jk = 1, jpk ) 
     310         ENDIF 
     311      ENDIF 
     312      ! 
     313      !                          !* ocean top and bottom level 
     314      CALL iom_get( inum, jpdom_data, 'top_level'    , z2d  , lrowattr=ln_use_jattr )   ! 1st wet T-points (ISF) 
     315      k_top(:,:) = NINT( z2d(:,:) ) 
     316      CALL iom_get( inum, jpdom_data, 'bottom_level' , z2d  , lrowattr=ln_use_jattr )   ! last wet T-points 
     317      k_bot(:,:) = NINT( z2d(:,:) ) 
     318      ! 
     319      ! reference depth for negative bathy (wetting and drying only) 
     320      ! IF( ll_wd )  CALL iom_get( inum,  'rn_wd_ref_depth' , ssh_ref   ) 
     321      ! 
     322      CALL iom_close( inum ) 
     323      ! 
     324   END SUBROUTINE zgr_read 
     325 
     326   SUBROUTINE zgr_top_bot( k_top, k_bot ) 
     327      !!---------------------------------------------------------------------- 
     328      !!                    ***  ROUTINE zgr_top_bot  *** 
     329      !! 
     330      !! ** Purpose :   defines the vertical index of ocean bottom (mbk. arrays) 
     331      !! 
     332      !! ** Method  :   computes from k_top and k_bot with a minimum value of 1 over land 
     333      !! 
     334      !! ** Action  :   mikt, miku, mikv :   vertical indices of the shallowest  
     335      !!                                     ocean level at t-, u- & v-points 
     336      !!                                     (min value = 1) 
     337      !! ** Action  :   mbkt, mbku, mbkv :   vertical indices of the deeptest  
     338      !!                                     ocean level at t-, u- & v-points 
     339      !!                                     (min value = 1 over land) 
     340      !!---------------------------------------------------------------------- 
     341      INTEGER , DIMENSION(:,:), INTENT(in) ::   k_top, k_bot   ! top & bottom ocean level indices 
     342      ! 
     343      INTEGER ::   ji, jj   ! dummy loop indices 
     344      REAL(wp), DIMENSION(jpi,jpj) ::   zk   ! workspace 
     345      !!---------------------------------------------------------------------- 
     346      ! 
     347      IF(lwp) WRITE(numout,*) 
     348      IF(lwp) WRITE(numout,*) '    zgr_top_bot : ocean top and bottom k-index of T-, U-, V- and W-levels ' 
     349      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~' 
     350      ! 
     351      mikt(:,:) = MAX( k_top(:,:) , 1 )    ! top    ocean k-index of T-level (=1 over land) 
     352      ! 
     353      mbkt(:,:) = MAX( k_bot(:,:) , 1 )    ! bottom ocean k-index of T-level (=1 over land) 
     354  
     355      !                                    ! N.B.  top     k-index of W-level = mikt 
     356      !                                    !       bottom  k-index of W-level = mbkt+1 
     357      DO jj = 1, jpjm1 
     358         DO ji = 1, jpim1 
     359            miku(ji,jj) = MAX(  mikt(ji+1,jj  ) , mikt(ji,jj)  ) 
     360            mikv(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj)  ) 
     361            mikf(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj), mikt(ji+1,jj  ), mikt(ji+1,jj+1)  ) 
     362            ! 
     363            mbku(ji,jj) = MIN(  mbkt(ji+1,jj  ) , mbkt(ji,jj)  ) 
     364            mbkv(ji,jj) = MIN(  mbkt(ji  ,jj+1) , mbkt(ji,jj)  ) 
     365         END DO 
     366      END DO 
     367      ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk  
     368      zk(:,:) = REAL( miku(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'U', 1. )   ;   miku(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     369      zk(:,:) = REAL( mikv(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'V', 1. )   ;   mikv(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     370      zk(:,:) = REAL( mikf(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'F', 1. )   ;   mikf(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     371      ! 
     372      zk(:,:) = REAL( mbku(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'U', 1. )   ;   mbku(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     373      zk(:,:) = REAL( mbkv(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'V', 1. )   ;   mbkv(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     374      ! 
     375   END SUBROUTINE zgr_top_bot 
    186376 
    187377   SUBROUTINE zgr_z 
     
    665855      ENDIF 
    666856 
    667       zbathy(:,:) = FLOAT( mbathy(:,:) ) 
    668       CALL lbc_lnk( 'domzgr',zbathy, 'T', 1._wp ) 
    669       mbathy(:,:) = INT( zbathy(:,:) ) 
    670  
     857      IF( lk_mpp ) THEN 
     858         zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     859         CALL lbc_lnk( 'toto',zbathy, 'T', 1._wp ) 
     860         mbathy(:,:) = INT( zbathy(:,:) ) 
     861      ENDIF 
    671862      !                                          ! East-west cyclic boundary conditions 
    672863      IF( jperio == 0 ) THEN 
     
    10611252   END SUBROUTINE zgr_zps 
    10621253 
     1254 
    10631255   SUBROUTINE zgr_sco 
    10641256      !!---------------------------------------------------------------------- 
     
    12621454         END DO 
    12631455         ! apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
    1264          CALL lbc_lnk( 'domzgr',zenv, 'T', 1._wp, 'no0' ) 
     1456         CALL lbc_lnk( 'toto',zenv, 'T', 1._wp, 'no0' ) 
    12651457         !                                                  ! ================ ! 
    12661458      END DO                                                !     End loop     ! 
     
    13411533        hiff(:,:) = MIN( hiff(:,:), hbatf(:,:) ) 
    13421534 
    1343       IF( nprint == 1 .AND. lwp )   THEN 
     1535      IF( lwp )   THEN 
    13441536         WRITE(numout,*) ' MAX val hif   t ', MAXVAL( hift (:,:) ), ' f ', MAXVAL( hiff (:,:) ),  & 
    13451537            &                        ' u ',   MAXVAL( hifu (:,:) ), ' v ', MAXVAL( hifv (:,:) ) 
     
    13971589         END DO 
    13981590      END DO 
    1399       IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ),   & 
     1591      IF(lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ),   & 
    14001592         &                                                       ' MAX ', MAXVAL( mbathy(:,:) ) 
    14011593 
    1402       IF( nprint == 1  .AND. lwp )   THEN         ! min max values over the local domain 
     1594      IF( lwp )   THEN         ! min max values over the local domain 
    14031595         WRITE(numout,*) ' MIN val mbathy  ', MINVAL( mbathy(:,:)    ), ' MAX ', MAXVAL( mbathy(:,:) ) 
    14041596         WRITE(numout,*) ' MIN val depth t ', MINVAL( gdept_0(:,:,:) ),   & 
     
    17881980        z_gsigt(jk) = -fssig( REAL(jk,wp)        ) 
    17891981      END DO 
    1790       IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'z_gsigw 1 jpk    ', z_gsigw(1), z_gsigw(jpk) 
     1982      IF( lwp )   WRITE(numout,*) 'z_gsigw 1 jpk    ', z_gsigw(1), z_gsigw(jpk) 
    17911983      ! 
    17921984      ! Coefficients for vertical scale factors at w-, t- levels 
Note: See TracChangeset for help on using the changeset viewer.