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 13024 for utils/tools_dev_r12970_AGRIF_CMEMS/DOMAINcfg/src/domzgr.F90 – NEMO

Ignore:
Timestamp:
2020-06-03T16:26:23+02:00 (4 years ago)
Author:
rblod
Message:

First version of new nesting tools merged with domaincfg, see ticket #2129

File:
1 edited

Legend:

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

    r12414 r13024  
    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 
     
    9293CONTAINS        
    9394 
    94    SUBROUTINE dom_zgr 
     95   SUBROUTINE dom_zgr( k_top, k_bot ) 
    9596      !!---------------------------------------------------------------------- 
    9697      !!                ***  ROUTINE dom_zgr  *** 
     
    109110      !! ** Action  :   define gdep., e3., mbathy and bathy 
    110111      !!---------------------------------------------------------------------- 
     112      INTEGER, DIMENSION(:,:), INTENT(out) ::   k_top, k_bot   ! ocean first and last level indices 
     113      ! 
    111114      INTEGER ::   ioptio, ibat   ! local integer 
    112115      INTEGER ::   ios 
    113116      ! 
     117      INTEGER :: jk 
     118      REAL(wp) ::   zrefdep             ! depth of the reference level (~10m) 
     119 
     120 
    114121      NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco, ln_isfcav, ln_linssh 
    115122      !!---------------------------------------------------------------------- 
     
    124131902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzgr in configuration namelist', lwp ) 
    125132      IF(lwm) WRITE ( numond, namzgr ) 
     133 
     134      IF(ln_read_cfg) THEN 
     135         IF(lwp) WRITE(numout,*) 
     136         IF(lwp) WRITE(numout,*) '   ==>>>   Read vertical mesh in ', TRIM( cn_domcfg ), ' file' 
     137         ! 
     138         CALL zgr_read   ( ln_zco  , ln_zps  , ln_sco, ln_isfcav,   & 
     139            &              gdept_1d, gdepw_1d, e3t_1d, e3w_1d   ,   &    ! 1D gridpoints depth 
     140            &              gdept_0 , gdepw_0                    ,   &    ! gridpoints depth 
     141            &              e3t_0   , e3u_0   , e3v_0 , e3f_0    ,   &    ! vertical scale factors 
     142            &              e3w_0   , e3uw_0  , e3vw_0           ,   &    ! vertical scale factors 
     143            &              k_top   , k_bot            )                  ! 1st & last ocean level 
     144            ! 
     145!!gm to be remove when removing the OLD definition of e3 scale factors so that gde3w disappears 
     146!      ! Compute gde3w_0 (vertical sum of e3w) 
     147!      gde3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 
     148!      DO jk = 2, jpk 
     149!         gde3w_0(:,:,jk) = gde3w_0(:,:,jk-1) + e3w_0(:,:,jk) 
     150!      END DO 
     151      ! 
     152 
     153      !                                ! top/bottom ocean level indices for t-, u- and v-points (f-point also for top) 
     154      CALL zgr_top_bot( k_top, k_bot )      ! with a minimum value set to 1 
     155 
     156      !                                ! deepest/shallowest W level Above/Below ~10m 
     157!!gm BUG in s-coordinate this does not work! 
     158      zrefdep = 10._wp - 0.1_wp * MINVAL( e3w_1d )                   ! ref. depth with tolerance (10% of minimum layer thickness) 
     159      nlb10 = MINLOC( gdepw_1d, mask = gdepw_1d > zrefdep, dim = 1 ) ! shallowest W level Below ~10m 
     160      nla10 = nlb10 - 1                                              ! deepest    W level Above ~10m 
     161!!gm end bug 
     162 
     163      ENDIF         
    126164 
    127165      IF(lwp) THEN                     ! Control print 
     
    150188      IF ( ln_sco .AND. ln_isfcav ) ioptio = ioptio + 1 
    151189      IF( ioptio > 0 )   CALL ctl_stop( ' Cavity not tested/compatible with full step (zco) and sigma (ln_sco) ' ) 
     190 
     191      IF(.NOT.ln_read_cfg) THEN 
    152192      ! 
    153193      ! Build the vertical coordinate system 
     
    163203      ! ----------------------------------- 
    164204                          CALL zgr_bot_level    ! deepest ocean level for t-, u- and v-points 
     205                          k_bot = mbkt 
    165206                          CALL zgr_top_level    ! shallowest ocean level for T-, U-, V- points 
     207                          k_top = mikt 
     208 
     209      ENDIF 
    166210      ! 
    167211      IF( nprint == 1 .AND. lwp )   THEN 
    168          WRITE(numout,*) ' MIN val mbathy  ', MINVAL(  mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 
     212         WRITE(numout,*) ' MIN val k_top   ', MINVAL(   k_top(:,:) ), ' MAX ', MAXVAL( k_top(:,:) ) 
     213         WRITE(numout,*) ' MIN val k_bot   ', MINVAL(   k_bot(:,:) ), ' MAX ', MAXVAL( k_bot(:,:) ) 
    169214         WRITE(numout,*) ' MIN val depth t ', MINVAL( gdept_0(:,:,:) ),   & 
    170215            &                          ' w ', MINVAL( gdepw_0(:,:,:) ) 
     
    181226            &                          ' w ', MAXVAL(   e3w_0(:,:,:) ) 
    182227      ENDIF 
     228 
    183229      ! 
    184230   END SUBROUTINE dom_zgr 
    185231 
     232   SUBROUTINE zgr_read( ld_zco  , ld_zps  , ld_sco  , ld_isfcav,   &   ! type of vertical coordinate 
     233      &                 pdept_1d, pdepw_1d, pe3t_1d , pe3w_1d  ,   &   ! 1D reference vertical coordinate 
     234      &                 pdept , pdepw ,                            &   ! 3D t & w-points depth 
     235      &                 pe3t  , pe3u  , pe3v   , pe3f ,            &   ! vertical scale factors 
     236      &                 pe3w  , pe3uw , pe3vw         ,            &   !     -      -      - 
     237      &                 k_top  , k_bot    )                            ! top & bottom ocean level 
     238      !!--------------------------------------------------------------------- 
     239      !!              ***  ROUTINE zgr_read  *** 
     240      !! 
     241      !! ** Purpose :   Read the vertical information in the domain configuration file 
     242      !! 
     243      !!---------------------------------------------------------------------- 
     244      LOGICAL                   , INTENT(out) ::   ld_zco, ld_zps, ld_sco      ! vertical coordinate flags 
     245      LOGICAL                   , INTENT(out) ::   ld_isfcav                   ! under iceshelf cavity flag 
     246      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pdept_1d, pdepw_1d          ! 1D grid-point depth       [m] 
     247      REAL(wp), DIMENSION(:)    , INTENT(out) ::   pe3t_1d , pe3w_1d           ! 1D vertical scale factors [m] 
     248      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pdept, pdepw                ! grid-point depth          [m] 
     249      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3t , pe3u , pe3v , pe3f   ! vertical scale factors    [m] 
     250      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         !    -       -      - 
     251      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top , k_bot               ! first & last ocean level 
     252      ! 
     253      INTEGER  ::   jk     ! dummy loop index 
     254      INTEGER  ::   inum   ! local logical unit 
     255      REAL(WP) ::   z_zco, z_zps, z_sco, z_cav 
     256      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! 2D workspace 
     257      !!---------------------------------------------------------------------- 
     258      ! 
     259      IF(lwp) THEN 
     260         WRITE(numout,*) 
     261         WRITE(numout,*) '   zgr_read : read the vertical coordinates in ', TRIM( cn_domcfg ), ' file' 
     262         WRITE(numout,*) '   ~~~~~~~~' 
     263      ENDIF 
     264      ! 
     265      CALL iom_open( cn_domcfg, inum ) 
     266      ! 
     267      !                          !* type of vertical coordinate 
     268      CALL iom_get( inum, 'ln_zco'   , z_zco ) 
     269      CALL iom_get( inum, 'ln_zps'   , z_zps ) 
     270      CALL iom_get( inum, 'ln_sco'   , z_sco ) 
     271      IF( z_zco == 0._wp ) THEN   ;   ld_zco = .false.   ;   ELSE   ;   ld_zco = .true.   ;   ENDIF 
     272      IF( z_zps == 0._wp ) THEN   ;   ld_zps = .false.   ;   ELSE   ;   ld_zps = .true.   ;   ENDIF 
     273      IF( z_sco == 0._wp ) THEN   ;   ld_sco = .false.   ;   ELSE   ;   ld_sco = .true.   ;   ENDIF 
     274      ! 
     275      !                          !* ocean cavities under iceshelves 
     276      CALL iom_get( inum, 'ln_isfcav', z_cav ) 
     277      IF( z_cav == 0._wp ) THEN   ;   ld_isfcav = .false.   ;   ELSE   ;   ld_isfcav = .true.   ;   ENDIF 
     278      ! 
     279      !                          !* vertical scale factors 
     280      CALL iom_get( inum, jpdom_unknown, 'e3t_1d'  , pe3t_1d  )                     ! 1D reference coordinate 
     281      CALL iom_get( inum, jpdom_unknown, 'e3w_1d'  , pe3w_1d  ) 
     282      ! 
     283      CALL iom_get( inum, jpdom_data, 'e3t_0'  , pe3t  , lrowattr=ln_use_jattr )    ! 3D coordinate 
     284      CALL iom_get( inum, jpdom_data, 'e3u_0'  , pe3u  , lrowattr=ln_use_jattr ) 
     285      CALL iom_get( inum, jpdom_data, 'e3v_0'  , pe3v  , lrowattr=ln_use_jattr ) 
     286      CALL iom_get( inum, jpdom_data, 'e3f_0'  , pe3f  , lrowattr=ln_use_jattr ) 
     287      CALL iom_get( inum, jpdom_data, 'e3w_0'  , pe3w  , lrowattr=ln_use_jattr ) 
     288      CALL iom_get( inum, jpdom_data, 'e3uw_0' , pe3uw , lrowattr=ln_use_jattr ) 
     289      CALL iom_get( inum, jpdom_data, 'e3vw_0' , pe3vw , lrowattr=ln_use_jattr ) 
     290      ! 
     291      !                          !* depths 
     292      !                                   !- old depth definition (obsolescent feature) 
     293      IF(  iom_varid( inum, 'gdept_1d', ldstop = .FALSE. ) > 0  .AND.  & 
     294         & iom_varid( inum, 'gdepw_1d', ldstop = .FALSE. ) > 0  .AND.  & 
     295         & iom_varid( inum, 'gdept_0' , ldstop = .FALSE. ) > 0  .AND.  & 
     296         & iom_varid( inum, 'gdepw_0' , ldstop = .FALSE. ) > 0    ) THEN 
     297         CALL ctl_warn( 'zgr_read : old definition of depths and scale factors used ', &  
     298            &           '           depths at t- and w-points read in the domain configuration file') 
     299         CALL iom_get( inum, jpdom_unknown, 'gdept_1d', pdept_1d )    
     300         CALL iom_get( inum, jpdom_unknown, 'gdepw_1d', pdepw_1d ) 
     301         CALL iom_get( inum, jpdom_data   , 'gdept_0' , pdept , lrowattr=ln_use_jattr ) 
     302         CALL iom_get( inum, jpdom_data   , 'gdepw_0' , pdepw , lrowattr=ln_use_jattr ) 
     303         ! 
     304      ELSE                                !- depths computed from e3. scale factors 
     305         CALL e3_to_depth( pe3t_1d, pe3w_1d, pdept_1d, pdepw_1d )    ! 1D reference depth 
     306         CALL e3_to_depth( pe3t   , pe3w   , pdept   , pdepw    )    ! 3D depths 
     307         IF(lwp) THEN 
     308            WRITE(numout,*) 
     309            WRITE(numout,*) '              Reference 1D z-coordinate depth and scale factors:' 
     310            WRITE(numout, "(9x,' level  gdept_1d  gdepw_1d  e3t_1d   e3w_1d  ')" ) 
     311            WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, pdept_1d(jk), pdepw_1d(jk), pe3t_1d(jk), pe3w_1d(jk), jk = 1, jpk ) 
     312         ENDIF 
     313      ENDIF 
     314      ! 
     315      !                          !* ocean top and bottom level 
     316      CALL iom_get( inum, jpdom_data, 'top_level'    , z2d  , lrowattr=ln_use_jattr )   ! 1st wet T-points (ISF) 
     317      k_top(:,:) = NINT( z2d(:,:) ) 
     318      CALL iom_get( inum, jpdom_data, 'bottom_level' , z2d  , lrowattr=ln_use_jattr )   ! last wet T-points 
     319      k_bot(:,:) = NINT( z2d(:,:) ) 
     320      ! 
     321      ! reference depth for negative bathy (wetting and drying only) 
     322      ! IF( ll_wd )  CALL iom_get( inum,  'rn_wd_ref_depth' , ssh_ref   ) 
     323      ! 
     324      CALL iom_close( inum ) 
     325      ! 
     326   END SUBROUTINE zgr_read 
     327 
     328   SUBROUTINE zgr_top_bot( k_top, k_bot ) 
     329      !!---------------------------------------------------------------------- 
     330      !!                    ***  ROUTINE zgr_top_bot  *** 
     331      !! 
     332      !! ** Purpose :   defines the vertical index of ocean bottom (mbk. arrays) 
     333      !! 
     334      !! ** Method  :   computes from k_top and k_bot with a minimum value of 1 over land 
     335      !! 
     336      !! ** Action  :   mikt, miku, mikv :   vertical indices of the shallowest  
     337      !!                                     ocean level at t-, u- & v-points 
     338      !!                                     (min value = 1) 
     339      !! ** Action  :   mbkt, mbku, mbkv :   vertical indices of the deeptest  
     340      !!                                     ocean level at t-, u- & v-points 
     341      !!                                     (min value = 1 over land) 
     342      !!---------------------------------------------------------------------- 
     343      INTEGER , DIMENSION(:,:), INTENT(in) ::   k_top, k_bot   ! top & bottom ocean level indices 
     344      ! 
     345      INTEGER ::   ji, jj   ! dummy loop indices 
     346      REAL(wp), DIMENSION(jpi,jpj) ::   zk   ! workspace 
     347      !!---------------------------------------------------------------------- 
     348      ! 
     349      IF(lwp) WRITE(numout,*) 
     350      IF(lwp) WRITE(numout,*) '    zgr_top_bot : ocean top and bottom k-index of T-, U-, V- and W-levels ' 
     351      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~' 
     352      ! 
     353      mikt(:,:) = MAX( k_top(:,:) , 1 )    ! top    ocean k-index of T-level (=1 over land) 
     354      ! 
     355      mbkt(:,:) = MAX( k_bot(:,:) , 1 )    ! bottom ocean k-index of T-level (=1 over land) 
     356  
     357      !                                    ! N.B.  top     k-index of W-level = mikt 
     358      !                                    !       bottom  k-index of W-level = mbkt+1 
     359      DO jj = 1, jpjm1 
     360         DO ji = 1, jpim1 
     361            miku(ji,jj) = MAX(  mikt(ji+1,jj  ) , mikt(ji,jj)  ) 
     362            mikv(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj)  ) 
     363            mikf(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj), mikt(ji+1,jj  ), mikt(ji+1,jj+1)  ) 
     364            ! 
     365            mbku(ji,jj) = MIN(  mbkt(ji+1,jj  ) , mbkt(ji,jj)  ) 
     366            mbkv(ji,jj) = MIN(  mbkt(ji  ,jj+1) , mbkt(ji,jj)  ) 
     367         END DO 
     368      END DO 
     369      ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk  
     370      zk(:,:) = REAL( miku(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'U', 1. )   ;   miku(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     371      zk(:,:) = REAL( mikv(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'V', 1. )   ;   mikv(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     372      zk(:,:) = REAL( mikf(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'F', 1. )   ;   mikf(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     373      ! 
     374      zk(:,:) = REAL( mbku(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'U', 1. )   ;   mbku(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     375      zk(:,:) = REAL( mbkv(:,:), wp )   ;   CALL lbc_lnk( 'domzgr', zk, 'V', 1. )   ;   mbkv(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     376      ! 
     377   END SUBROUTINE zgr_top_bot 
    186378 
    187379   SUBROUTINE zgr_z 
     
    665857      ENDIF 
    666858 
    667       zbathy(:,:) = FLOAT( mbathy(:,:) ) 
    668       CALL lbc_lnk( 'domzgr',zbathy, 'T', 1._wp ) 
    669       mbathy(:,:) = INT( zbathy(:,:) ) 
    670  
     859      IF( lk_mpp ) THEN 
     860         zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     861         CALL lbc_lnk( 'toto',zbathy, 'T', 1._wp ) 
     862         mbathy(:,:) = INT( zbathy(:,:) ) 
     863      ENDIF 
    671864      !                                          ! East-west cyclic boundary conditions 
    672865      IF( jperio == 0 ) THEN 
     
    10611254   END SUBROUTINE zgr_zps 
    10621255 
     1256 
    10631257   SUBROUTINE zgr_sco 
    10641258      !!---------------------------------------------------------------------- 
     
    12621456         END DO 
    12631457         ! apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
    1264          CALL lbc_lnk( 'domzgr',zenv, 'T', 1._wp, 'no0' ) 
     1458         CALL lbc_lnk( 'toto',zenv, 'T', 1._wp, 'no0' ) 
    12651459         !                                                  ! ================ ! 
    12661460      END DO                                                !     End loop     ! 
Note: See TracChangeset for help on using the changeset viewer.