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 15556 – NEMO

Changeset 15556


Ignore:
Timestamp:
2021-11-29T16:23:06+01:00 (2 years ago)
Author:
jchanut
Message:

#2638: Add the possibility to read bottom levels at U/V/F points in the mesh file. Store fe3mask (i.e. fmask as it is prior updating it for lateral boundary conditions). All is this is only needed to ensure a correct update of parent grid variables with AgRIF. This also anticipates the possible use of coarsened meshes.

Location:
NEMO/trunk/src/OCE
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/OCE/DOM/dom_oce.F90

    r15267 r15556  
    191191!   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mbk_t, mbk_u, mbk_v   !: bottom last  wet T-, U-, and V-level 
    192192!!gm 
    193    INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mbkt, mbku, mbkv   !: bottom last wet T-, U- and V-level 
    194    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tmask_i            !: interior domain T-point mask 
     193   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mbkt, mbku, mbkv, mbkf   !: bottom last wet T-, U-, V- and F-level 
     194   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tmask_i                  !: interior domain T-point mask 
    195195   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tmask_h            !: internal domain T-point mask (Figure 8.5 NEMO book) 
    196196 
     
    200200   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   tmask, umask, vmask, wmask, fmask   !: land/ocean mask at T-, U-, V-, W- and F-pts 
    201201   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   wumask, wvmask                      !: land/ocean mask at WU- and WV-pts 
    202    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   fe3mask                             !: land/ocean mask at F-pts (qco only) 
     202   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   fe3mask                             !: land/ocean mask at F-pts 
    203203 
    204204   !!---------------------------------------------------------------------- 
     
    306306         ! 
    307307      ii = ii+1 
    308       ALLOCATE( fe3mask(jpi,jpj,jpk) , STAT=ierr(ii) ) 
    309308         ! 
    310309#elif defined key_linssh 
     
    330329      ALLOCATE( tmask_i(jpi,jpj) , tmask_h(jpi,jpj) ,                                           & 
    331330         &      ssmask (jpi,jpj) , ssumask(jpi,jpj) , ssvmask(jpi,jpj) , ssfmask(jpi,jpj) ,     & 
    332          &      mbkt   (jpi,jpj) , mbku   (jpi,jpj) , mbkv   (jpi,jpj)                    , STAT=ierr(ii) ) 
     331         &      mbkt   (jpi,jpj) , mbku   (jpi,jpj) , mbkv   (jpi,jpj) , mbkf(jpi,jpj)    , STAT=ierr(ii) ) 
    333332         ! 
    334333      ii = ii+1 
     
    337336      ii = ii+1 
    338337      ALLOCATE( tmask(jpi,jpj,jpk) , umask(jpi,jpj,jpk) ,     & 
    339          &      vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk) , STAT=ierr(ii) ) 
     338         &      vmask(jpi,jpj,jpk) , fmask(jpi,jpj,jpk) , fe3mask(jpi,jpj,jpk), STAT=ierr(ii) ) 
    340339         ! 
    341340      ii = ii+1 
  • NEMO/trunk/src/OCE/DOM/dommsk.F90

    r15145 r15556  
    157157            &            * tmask(ji,jj+1,jk) * tmask(ji+1,jj+1,jk) 
    158158      END_3D 
     159      ! 
     160      ! In case of a coarsened grid, account her for possibly aditionnal   
     161      ! masked points; these have been read in the mesh file and stored in mbku, mbkv, mbkf 
     162      DO_2D( 0, 0, 0, 0 ) 
     163         IF (mbku(ji,jj)<=1 ) umask(ji,jj,:) = 0._wp 
     164         IF (mbkv(ji,jj)<=1 ) vmask(ji,jj,:) = 0._wp 
     165         IF (mbkf(ji,jj)<=1 ) fmask(ji,jj,:) = 0._wp 
     166         IF ( MAXVAL(umask(ji,jj,:))/=0._wp )  umask(ji,jj,mbku(ji,jj)+1:jpk) = 0._wp 
     167         IF ( MAXVAL(vmask(ji,jj,:))/=0._wp )  vmask(ji,jj,mbkv(ji,jj)+1:jpk) = 0._wp 
     168         IF ( MAXVAL(fmask(ji,jj,:))/=0._wp )  fmask(ji,jj,mbkf(ji,jj)+1:jpk) = 0._wp 
     169      END_2D 
    159170      CALL lbc_lnk( 'dommsk', umask, 'U', 1.0_wp, vmask, 'V', 1.0_wp, fmask, 'F', 1.0_wp )      ! Lateral boundary conditions 
    160171  
     
    183194         CALL lbc_lnk( 'dommsk', ssfmask, 'F', 1.0_wp ) 
    184195      ENDIF 
    185 #if defined key_qco 
    186196      fe3mask(:,:,:) = fmask(:,:,:) 
    187 #endif 
    188197 
    189198      ! Interior domain mask  (used for global sum) 
  • NEMO/trunk/src/OCE/DOM/domzgr.F90

    r15529 r15556  
    7474      INTEGER  ::   ikt, ikb            ! top/bot index 
    7575      INTEGER  ::   ioptio, ibat, ios   ! local integer 
     76      INTEGER  ::   is_mbkuvf           ! ==0 if mbku, mbkv, mbkf to be computed 
    7677      REAL(wp) ::   zrefdep             ! depth of the reference level (~10m) 
    7778      REAL(wp), DIMENSION(jpi,jpj  ) ::   zmsk 
     
    9798            &              e3t_0   , e3u_0   , e3v_0 , e3f_0    ,   &    ! vertical scale factors 
    9899            &              e3w_0   , e3uw_0  , e3vw_0           ,   &    ! vertical scale factors 
    99             &              k_top   , k_bot            )                  ! 1st & last ocean level 
     100            &              k_top   , k_bot                      ,   &    ! 1st & last ocean level 
     101            &              is_mbkuvf, mbku, mbkv, mbkf )                 ! U/V/F points bottom levels 
    100102            ! 
    101103      ELSE                          !==  User defined configuration  ==! 
    102104         IF(lwp) WRITE(numout,*) 
    103105         IF(lwp) WRITE(numout,*) '          User defined vertical mesh (usr_def_zgr)' 
     106         is_mbkuvf = 0 
    104107         ! 
    105108         CALL usr_def_zgr( ln_zco  , ln_zps  , ln_sco, ln_isfcav,   &  
     
    177180 
    178181      !                                ! top/bottom ocean level indices for t-, u- and v-points (f-point also for top) 
    179       CALL zgr_top_bot( k_top, k_bot )      ! with a minimum value set to 1 
     182      CALL zgr_top_bot( k_top, k_bot, is_mbkuvf )      ! with a minimum value set to 1 
    180183      ! 
    181184      !                                ! ice shelf draft and bathymetry 
     
    220223      &                 pe3t  , pe3u  , pe3v   , pe3f ,            &   ! vertical scale factors 
    221224      &                 pe3w  , pe3uw , pe3vw         ,            &   !     -      -      - 
    222       &                 k_top  , k_bot    )                            ! top & bottom ocean level 
     225      &                 k_top  , k_bot  ,                          &   ! top & bottom ocean level 
     226      &                 k_mbkuvf  , k_bot_u  , k_bot_v  , k_bot_f  )   ! U/V/F points bottom levels 
    223227      !!--------------------------------------------------------------------- 
    224228      !!              ***  ROUTINE zgr_read  *** 
     
    235239      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pe3w , pe3uw, pe3vw         !    -       -      - 
    236240      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_top , k_bot               ! first & last ocean level 
     241      INTEGER                   , INTENT(out) ::   k_mbkuvf                    ! ==1 if mbku, mbkv, mbkf are in file 
     242      INTEGER , DIMENSION(:,:)  , INTENT(out) ::   k_bot_u , k_bot_v, k_bot_f  ! bottom levels at U/V/F points 
    237243      ! 
    238244      INTEGER  ::   ji,jj,jk     ! dummy loop index 
     
    322328      ENDIF 
    323329      ! 
     330      IF( iom_varid( inum, 'mbku', ldstop = .FALSE. ) > 0 ) THEN 
     331         IF(lwp) WRITE(numout,*) '          mbku, mbkv & mbkf read in ', TRIM(cn_domcfg), ' file' 
     332         CALL iom_get( inum, jpdom_global, 'mbku', z2d ) 
     333         k_bot_u(:,:) = NINT( z2d(:,:) ) 
     334         CALL iom_get( inum, jpdom_global, 'mbkv', z2d ) 
     335         k_bot_v(:,:) = NINT( z2d(:,:) ) 
     336         CALL iom_get( inum, jpdom_global, 'mbkf', z2d ) 
     337         k_bot_f(:,:) = NINT( z2d(:,:) ) 
     338         k_mbkuvf = 1 
     339      ELSE 
     340         k_mbkuvf = 0 
     341      ENDIF 
     342      ! 
    324343      ! reference depth for negative bathy (wetting and drying only) 
    325344      IF( ll_wd )  CALL iom_get( inum,  'rn_wd_ref_depth' , ssh_ref   ) 
     
    330349 
    331350 
    332    SUBROUTINE zgr_top_bot( k_top, k_bot ) 
     351   SUBROUTINE zgr_top_bot( k_top, k_bot, k_mbkuvf ) 
    333352      !!---------------------------------------------------------------------- 
    334353      !!                    ***  ROUTINE zgr_top_bot  *** 
     
    342361      !!                                     (min value = 1) 
    343362      !! ** Action  :   mbkt, mbku, mbkv :   vertical indices of the deeptest  
    344       !!                                     ocean level at t-, u- & v-points 
     363      !!                mbkf                 ocean level at t-, u-, v- & f-points 
    345364      !!                                     (min value = 1 over land) 
    346365      !!---------------------------------------------------------------------- 
    347366      INTEGER , DIMENSION(:,:), INTENT(in) ::   k_top, k_bot   ! top & bottom ocean level indices 
     367      INTEGER                 , INTENT(in) ::   k_mbkuvf       ! flag to recompute mbku, mbkv, mbkf 
    348368      ! 
    349369      INTEGER ::   ji, jj   ! dummy loop indices 
     
    365385         mikv(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj)  ) 
    366386         mikf(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj), mikt(ji+1,jj  ), mikt(ji+1,jj+1)  ) 
    367          ! 
    368          mbku(ji,jj) = MIN(  mbkt(ji+1,jj  ) , mbkt(ji,jj)  ) 
    369          mbkv(ji,jj) = MIN(  mbkt(ji  ,jj+1) , mbkt(ji,jj)  ) 
    370       END_2D 
    371       ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk  
     387      END_2D 
     388 
     389      IF ( k_mbkuvf==0 ) THEN 
     390         IF(lwp) WRITE(numout,*) '         mbku, mbkv, mbkf computed from mbkt' 
     391         DO_2D( 0, 0, 0, 0 ) 
     392            mbku(ji,jj) = MIN(  mbkt(ji+1,jj  ) , mbkt(ji,jj)  ) 
     393            mbkv(ji,jj) = MIN(  mbkt(ji  ,jj+1) , mbkt(ji,jj)  ) 
     394            mbkf(ji,jj) = MIN(  mbkt(ji  ,jj+1) , mbkt(ji,jj), mbkt(ji+1,jj  ), mbkt(ji+1,jj+1)  ) 
     395         END_2D 
     396      ELSE 
     397         IF(lwp) WRITE(numout,*) '         mbku, mbkv, mbkf read from file' 
     398         ! Use mbku, mbkv, mbkf from file 
     399         ! Ensure these are lower than expected bottom level deduced from mbkt 
     400         DO_2D( 0, 0, 0, 0 ) 
     401            mbku(ji,jj) = MIN(  mbku(ji,jj), mbkt(ji+1,jj  ) , mbkt(ji,jj)  ) 
     402            mbkv(ji,jj) = MIN(  mbkv(ji,jj), mbkt(ji  ,jj+1) , mbkt(ji,jj)  ) 
     403            mbkf(ji,jj) = MIN(  mbkf(ji,jj), mbkt(ji  ,jj+1) , mbkt(ji,jj), mbkt(ji+1,jj  ), mbkt(ji+1,jj+1)  ) 
     404         END_2D 
     405      ENDIF 
     406      ! convert into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk  
    372407      DO_2D( 0, 0, 0, 0 ) 
    373408         zk(ji,jj) = REAL( miku(ji,jj), wp ) 
     
    399434      CALL lbc_lnk( 'domzgr', zk, 'V', 1.0_wp ) 
    400435      mbkv(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
     436 
     437      DO_2D( 0, 0, 0, 0 ) 
     438         zk(ji,jj) = REAL( mbkf(ji,jj), wp ) 
     439      END_2D 
     440      CALL lbc_lnk( 'domzgr', zk, 'F', 1.0_wp ) 
     441      mbkf(:,:) = MAX( NINT( zk(:,:) ), 1 ) 
    401442      ! 
    402443   END SUBROUTINE zgr_top_bot 
  • NEMO/trunk/src/OCE/oce.F90

    r14064 r15556  
    110110         &        hu_e(jpi,jpj),   hur_e(jpi,jpj),   hv_e(jpi,jpj),   hvr_e(jpi,jpj), STAT=ierr(4) ) 
    111111         ! 
    112       ALLOCATE( ub2_b(jpi,jpj), vb2_b(jpi,jpj), un_bf(jpi,jpj), vn_bf(jpi,jpj)      , STAT=ierr(6) ) 
     112      ALLOCATE( ub2_b(jpi,jpj), vb2_b(jpi,jpj), un_bf(jpi,jpj), vn_bf(jpi,jpj)      , STAT=ierr(5) ) 
    113113#if defined key_agrif 
    114114      ALLOCATE( ub2_i_b(jpi,jpj), vb2_i_b(jpi,jpj)                                  , STAT=ierr(6) ) 
Note: See TracChangeset for help on using the changeset viewer.