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 6092 for branches/2015/dev_agrif_v3_6_STABLE/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90 – NEMO

Ignore:
Timestamp:
2015-12-17T15:19:01+01:00 (9 years ago)
Author:
timgraham
Message:

Merged in trunk at r5518 (branch point of 3.6 stable)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_agrif_v3_6_STABLE/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90

    r4982 r6092  
    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 capabilitye   
    1920   !!---------------------------------------------------------------------- 
    2021 
     
    101102      INTEGER ::   ios 
    102103      ! 
    103       NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco 
     104      NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco, ln_isfcav 
    104105      !!---------------------------------------------------------------------- 
    105106      ! 
     
    120121         WRITE(numout,*) '~~~~~~~' 
    121122         WRITE(numout,*) '          Namelist namzgr : set vertical coordinate' 
    122          WRITE(numout,*) '             z-coordinate - full steps      ln_zco = ', ln_zco 
    123          WRITE(numout,*) '             z-coordinate - partial steps   ln_zps = ', ln_zps 
    124          WRITE(numout,*) '             s- or hybrid z-s-coordinate    ln_sco = ', ln_sco 
     123         WRITE(numout,*) '             z-coordinate - full steps      ln_zco    = ', ln_zco 
     124         WRITE(numout,*) '             z-coordinate - partial steps   ln_zps    = ', ln_zps 
     125         WRITE(numout,*) '             s- or hybrid z-s-coordinate    ln_sco    = ', ln_sco 
     126         WRITE(numout,*) '             ice shelf cavities             ln_isfcav = ', ln_isfcav 
    125127      ENDIF 
    126128 
     
    145147      IF( .NOT.lk_c1d )   CALL zgr_bat_ctl      ! check bathymetry (mbathy) and suppress isolated ocean points 
    146148                          CALL zgr_bot_level    ! deepest ocean level for t-, u- and v-points 
     149                          CALL zgr_top_level    ! shallowest ocean level for T-, U-, V- points 
    147150      ! 
    148151      IF( lk_c1d ) THEN                         ! 1D config.: same mbathy value over the 3x3 domain 
     
    309312      ENDIF 
    310313 
     314      IF ( ln_isfcav ) THEN 
     315! need to be like this to compute the pressure gradient with ISF. If not, level beneath the ISF are not aligned (sum(e3t) /= depth) 
     316! define e3t_0 and e3w_0 as the differences between gdept and gdepw respectively 
     317         DO jk = 1, jpkm1 
     318            e3t_1d(jk) = gdepw_1d(jk+1)-gdepw_1d(jk)  
     319         END DO 
     320         e3t_1d(jpk) = e3t_1d(jpk-1)   ! we don't care because this level is masked in NEMO 
     321 
     322         DO jk = 2, jpk 
     323            e3w_1d(jk) = gdept_1d(jk) - gdept_1d(jk-1)  
     324         END DO 
     325         e3w_1d(1  ) = 2._wp * (gdept_1d(1) - gdepw_1d(1))  
     326      END IF 
     327 
    311328!!gm BUG in s-coordinate this does not work! 
    312329      ! deepest/shallowest W level Above/Below ~10m 
     
    364381      INTEGER  ::   ji, jj, jl, jk            ! dummy loop indices 
    365382      INTEGER  ::   inum                      ! temporary logical unit 
     383      INTEGER  ::   ierror                    ! error flag 
    366384      INTEGER  ::   ii_bump, ij_bump, ih      ! bump center position 
    367385      INTEGER  ::   ii0, ii1, ij0, ij1, ik    ! local indices 
    368386      REAL(wp) ::   r_bump , h_bump , h_oce   ! bump characteristics  
    369387      REAL(wp) ::   zi, zj, zh, zhmin         ! local scalars 
    370       INTEGER , POINTER, DIMENSION(:,:) ::   idta   ! global domain integer data 
    371       REAL(wp), POINTER, DIMENSION(:,:) ::   zdta   ! global domain scalar data 
     388      INTEGER , ALLOCATABLE, DIMENSION(:,:) ::   idta   ! global domain integer data 
     389      REAL(wp), ALLOCATABLE, DIMENSION(:,:) ::   zdta   ! global domain scalar data 
    372390      !!---------------------------------------------------------------------- 
    373391      ! 
    374392      IF( nn_timing == 1 )  CALL timing_start('zgr_bat') 
    375       ! 
    376       CALL wrk_alloc( jpidta, jpjdta, idta ) 
    377       CALL wrk_alloc( jpidta, jpjdta, zdta ) 
    378393      ! 
    379394      IF(lwp) WRITE(numout,*) 
     
    384399         !                                            ! ================== ! 
    385400         !                                            ! global domain level and meter bathymetry (idta,zdta) 
     401         ! 
     402         ALLOCATE( idta(jpidta,jpjdta), STAT=ierror ) 
     403         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'zgr_bat: unable to allocate idta array' ) 
     404         ALLOCATE( zdta(jpidta,jpjdta), STAT=ierror ) 
     405         IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'zgr_bat: unable to allocate zdta array' ) 
    386406         ! 
    387407         IF( ntopo == 0 ) THEN                        ! flat basin 
     
    464484            END DO 
    465485         END DO 
     486         risfdep(:,:)=0.e0 
     487         misfdep(:,:)=1 
     488         ! 
     489         DEALLOCATE( idta, zdta ) 
    466490         ! 
    467491         !                                            ! ================ ! 
     
    504528         IF( ln_zps .OR. ln_sco )   THEN              ! zps or sco : read meter bathymetry 
    505529            CALL iom_open ( 'bathy_meter.nc', inum )  
    506             CALL iom_get  ( inum, jpdom_data, 'Bathymetry', bathy ) 
     530            IF ( ln_isfcav ) THEN 
     531               CALL iom_get  ( inum, jpdom_data, 'Bathymetry_isf', bathy, lrowattr=.false. ) 
     532            ELSE 
     533               CALL iom_get  ( inum, jpdom_data, 'Bathymetry'    , bathy, lrowattr=ln_use_jattr  ) 
     534            END IF 
    507535            CALL iom_close( inum ) 
    508536            !                                                 
     537            risfdep(:,:)=0._wp          
     538            misfdep(:,:)=1              
     539            IF ( ln_isfcav ) THEN 
     540               CALL iom_open ( 'isf_draft_meter.nc', inum )  
     541               CALL iom_get  ( inum, jpdom_data, 'isf_draft', risfdep ) 
     542               CALL iom_close( inum ) 
     543               WHERE( bathy(:,:) <= 0._wp )  risfdep(:,:) = 0._wp 
     544            END IF 
     545            !        
    509546            IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN    ! ORCA R2 configuration 
    510547               ! 
     
    544581      !                        
    545582      IF ( .not. ln_sco ) THEN                                !==  set a minimum depth  ==! 
     583         ! patch to avoid case bathy = ice shelf draft and bathy between 0 and zhmin 
     584         IF ( ln_isfcav ) THEN 
     585            WHERE (bathy == risfdep) 
     586               bathy   = 0.0_wp ; risfdep = 0.0_wp 
     587            END WHERE 
     588         END IF 
     589         ! end patch 
    546590         IF( rn_hmin < 0._wp ) THEN    ;   ik = - INT( rn_hmin )                                      ! from a nb of level 
    547591         ELSE                          ;   ik = MINLOC( gdepw_1d, mask = gdepw_1d > rn_hmin, dim = 1 )  ! from a depth 
     
    553597         IF(lwp) write(numout,*) 'Minimum ocean depth: ', zhmin, ' minimum number of ocean levels : ', ik 
    554598      ENDIF 
    555       ! 
    556       CALL wrk_dealloc( jpidta, jpjdta, idta ) 
    557       CALL wrk_dealloc( jpidta, jpjdta, zdta ) 
    558599      ! 
    559600      IF( nn_timing == 1 )  CALL timing_stop('zgr_bat') 
     
    797838   END SUBROUTINE zgr_bot_level 
    798839 
     840      SUBROUTINE zgr_top_level 
     841      !!---------------------------------------------------------------------- 
     842      !!                    ***  ROUTINE zgr_bot_level  *** 
     843      !! 
     844      !! ** Purpose :   defines the vertical index of ocean top (mik. arrays) 
     845      !! 
     846      !! ** Method  :   computes from misfdep with a minimum value of 1 
     847      !! 
     848      !! ** Action  :   mikt, miku, mikv :   vertical indices of the shallowest  
     849      !!                                     ocean level at t-, u- & v-points 
     850      !!                                     (min value = 1) 
     851      !!---------------------------------------------------------------------- 
     852      !! 
     853      INTEGER ::   ji, jj   ! dummy loop indices 
     854      REAL(wp), POINTER, DIMENSION(:,:) ::  zmik 
     855      !!---------------------------------------------------------------------- 
     856      ! 
     857      IF( nn_timing == 1 )  CALL timing_start('zgr_top_level') 
     858      ! 
     859      CALL wrk_alloc( jpi, jpj, zmik ) 
     860      ! 
     861      IF(lwp) WRITE(numout,*) 
     862      IF(lwp) WRITE(numout,*) '    zgr_top_level : ocean top k-index of T-, U-, V- and W-levels ' 
     863      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~~~' 
     864      ! 
     865      mikt(:,:) = MAX( misfdep(:,:) , 1 )    ! top k-index of T-level (=1) 
     866      !                                      ! top k-index of W-level (=mikt) 
     867      DO jj = 1, jpjm1                       ! top k-index of U- (U-) level 
     868         DO ji = 1, jpim1 
     869            miku(ji,jj) = MAX(  mikt(ji+1,jj  ) , mikt(ji,jj)  ) 
     870            mikv(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj)  ) 
     871            mikf(ji,jj) = MAX(  mikt(ji  ,jj+1) , mikt(ji,jj), mikt(ji+1,jj  ), mikt(ji+1,jj+1)  ) 
     872         END DO 
     873      END DO 
     874 
     875      ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk  
     876      zmik(:,:) = REAL( miku(:,:), wp )   ;   CALL lbc_lnk(zmik,'U',1.)   ;   miku  (:,:) = MAX( INT( zmik(:,:) ), 1 ) 
     877      zmik(:,:) = REAL( mikv(:,:), wp )   ;   CALL lbc_lnk(zmik,'V',1.)   ;   mikv  (:,:) = MAX( INT( zmik(:,:) ), 1 ) 
     878      zmik(:,:) = REAL( mikf(:,:), wp )   ;   CALL lbc_lnk(zmik,'F',1.)   ;   mikf  (:,:) = MAX( INT( zmik(:,:) ), 1 ) 
     879      ! 
     880      CALL wrk_dealloc( jpi, jpj, zmik ) 
     881      ! 
     882      IF( nn_timing == 1 )  CALL timing_stop('zgr_top_level') 
     883      ! 
     884   END SUBROUTINE zgr_top_level 
    799885 
    800886   SUBROUTINE zgr_zco 
     
    876962      !! 
    877963      INTEGER  ::   ji, jj, jk       ! dummy loop indices 
    878       INTEGER  ::   ik, it          ! temporary integers 
     964      INTEGER  ::   ik, it, ikb, ikt ! temporary integers 
    879965      LOGICAL  ::   ll_print         ! Allow  control print for debugging 
    880966      REAL(wp) ::   ze3tp , ze3wp    ! Last ocean level thickness at T- and W-points 
     
    9201006         WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth )   mbathy(:,:) = jk-1 
    9211007      END DO 
     1008 
     1009      IF ( ln_isfcav ) CALL zgr_isf 
    9221010 
    9231011      ! Scale factors and depth at T- and W-points 
     
    9521040!gm Bug?  check the gdepw_1d 
    9531041                  !       ... on ik 
    954                   gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0   (ji,jj,ik+1) - gdepw_1d(ik) )   & 
    955                      &                           * ((gdept_1d(      ik  ) - gdepw_1d(ik) )   & 
    956                      &                           / ( gdepw_1d(      ik+1) - gdepw_1d(ik) )) 
    957                   e3t_0(ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) )   &  
    958                      &                          / ( gdepw_1d(      ik+1) - gdepw_1d(ik) )  
     1042                  gdept_0(ji,jj,ik) = gdepw_1d(ik) + ( gdepw_0(ji,jj,ik+1) - gdepw_1d(ik) )   & 
     1043                     &                             * ((gdept_1d(     ik  ) - gdepw_1d(ik) )   & 
     1044                     &                             / ( gdepw_1d(     ik+1) - gdepw_1d(ik) )) 
     1045                  e3t_0  (ji,jj,ik) = e3t_1d (ik) * ( gdepw_0 (ji,jj,ik+1) - gdepw_1d(ik) )   &  
     1046                     &                             / ( gdepw_1d(      ik+1) - gdepw_1d(ik) )  
    9591047                  e3w_0(ji,jj,ik) = 0.5_wp * ( gdepw_0(ji,jj,ik+1) + gdepw_1d(ik+1) - 2._wp * gdepw_1d(ik) )   & 
    9601048                     &                     * ( e3w_1d(ik) / ( gdepw_1d(ik+1) - gdepw_1d(ik) ) ) 
     
    9871075         END DO 
    9881076      END DO 
     1077      ! 
     1078      IF ( ln_isfcav ) THEN 
     1079      ! (ISF) Definition of e3t, u, v, w for ISF case 
     1080         DO jj = 1, jpj  
     1081            DO ji = 1, jpi  
     1082               ik = misfdep(ji,jj)  
     1083               IF( ik > 1 ) THEN               ! ice shelf point only  
     1084                  IF( risfdep(ji,jj) < gdepw_1d(ik) )  risfdep(ji,jj)= gdepw_1d(ik)  
     1085                  gdepw_0(ji,jj,ik) = risfdep(ji,jj)  
     1086!gm Bug?  check the gdepw_0  
     1087               !       ... on ik  
     1088                  gdept_0(ji,jj,ik) = gdepw_1d(ik+1) - ( gdepw_1d(ik+1) - gdepw_0(ji,jj,ik) )   &  
     1089                     &                               * ( gdepw_1d(ik+1) - gdept_1d(ik)      )   &  
     1090                     &                               / ( gdepw_1d(ik+1) - gdepw_1d(ik)      )  
     1091                  e3t_0  (ji,jj,ik  ) = gdepw_1d(ik+1) - gdepw_0(ji,jj,ik)  
     1092                  e3w_0  (ji,jj,ik+1) = gdept_1d(ik+1) - gdept_0(ji,jj,ik) 
     1093 
     1094                  IF( ik + 1 == mbathy(ji,jj) ) THEN               ! ice shelf point only (2 cell water column)  
     1095                     e3w_0  (ji,jj,ik+1) = gdept_0(ji,jj,ik+1) - gdept_0(ji,jj,ik)  
     1096                  ENDIF  
     1097               !       ... on ik / ik-1  
     1098                  e3w_0  (ji,jj,ik  ) = 2._wp * (gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik))  
     1099                  e3t_0  (ji,jj,ik-1) = gdepw_0(ji,jj,ik) - gdepw_1d(ik-1) 
     1100! The next line isn't required and doesn't affect results - included for consistency with bathymetry code  
     1101                  gdept_0(ji,jj,ik-1) = gdept_1d(ik-1) 
     1102               ENDIF  
     1103            END DO  
     1104         END DO  
     1105      !  
     1106         it = 0  
     1107         DO jj = 1, jpj  
     1108            DO ji = 1, jpi  
     1109               ik = misfdep(ji,jj)  
     1110               IF( ik > 1 ) THEN               ! ice shelf point only  
     1111                  e3tp (ji,jj) = e3t_0(ji,jj,ik  )  
     1112                  e3wp (ji,jj) = e3w_0(ji,jj,ik+1 )  
     1113               ! test  
     1114                  zdiff= gdept_0(ji,jj,ik) - gdepw_0(ji,jj,ik  )  
     1115                  IF( zdiff <= 0. .AND. lwp ) THEN   
     1116                     it = it + 1  
     1117                     WRITE(numout,*) ' it      = ', it, ' ik      = ', ik, ' (i,j) = ', ji, jj  
     1118                     WRITE(numout,*) ' risfdep = ', risfdep(ji,jj)  
     1119                     WRITE(numout,*) ' gdept = ', gdept_0(ji,jj,ik), ' gdepw = ', gdepw_0(ji,jj,ik+1), ' zdiff = ', zdiff  
     1120                     WRITE(numout,*) ' e3tp  = ', e3tp(ji,jj), ' e3wp  = ', e3wp(ji,jj)  
     1121                  ENDIF  
     1122               ENDIF  
     1123            END DO  
     1124         END DO  
     1125      END IF 
     1126      ! END (ISF) 
    9891127 
    9901128      ! Scale factors and depth at U-, V-, UW and VW-points 
     
    10051143         END DO 
    10061144      END DO 
     1145      IF ( ln_isfcav ) THEN 
     1146      ! (ISF) define e3uw (adapted for 2 cells in the water column) 
     1147         DO jj = 2, jpjm1  
     1148            DO ji = 2, fs_jpim1   ! vector opt.  
     1149               ikb = MAX(mbathy (ji,jj),mbathy (ji+1,jj)) 
     1150               ikt = MAX(misfdep(ji,jj),misfdep(ji+1,jj)) 
     1151               IF (ikb == ikt+1) e3uw_0(ji,jj,ikb) =  MIN( gdept_0(ji,jj,ikb  ), gdept_0(ji+1,jj  ,ikb  ) ) & 
     1152                                       &            - MAX( gdept_0(ji,jj,ikb-1), gdept_0(ji+1,jj  ,ikb-1) ) 
     1153               ikb = MAX(mbathy (ji,jj),mbathy (ji,jj+1)) 
     1154               ikt = MAX(misfdep(ji,jj),misfdep(ji,jj+1)) 
     1155               IF (ikb == ikt+1) e3vw_0(ji,jj,ikb) =  MIN( gdept_0(ji,jj,ikb  ), gdept_0(ji  ,jj+1,ikb  ) ) & 
     1156                                       &            - MAX( gdept_0(ji,jj,ikb-1), gdept_0(ji  ,jj+1,ikb-1) ) 
     1157            END DO 
     1158         END DO 
     1159      END IF 
     1160 
    10071161      CALL lbc_lnk( e3u_0 , 'U', 1._wp )   ;   CALL lbc_lnk( e3uw_0, 'U', 1._wp )   ! lateral boundary conditions 
    10081162      CALL lbc_lnk( e3v_0 , 'V', 1._wp )   ;   CALL lbc_lnk( e3vw_0, 'V', 1._wp ) 
     
    10461200      
    10471201      ! Compute gdep3w_0 (vertical sum of e3w) 
    1048       gdep3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 
    1049       DO jk = 2, jpk 
    1050          gdep3w_0(:,:,jk) = gdep3w_0(:,:,jk-1) + e3w_0(:,:,jk)  
    1051       END DO 
    1052          
     1202      IF ( ln_isfcav ) THEN ! if cavity 
     1203         WHERE (misfdep == 0) misfdep = 1 
     1204         DO jj = 1,jpj 
     1205            DO ji = 1,jpi 
     1206               gdep3w_0(ji,jj,1) = 0.5_wp * e3w_0(ji,jj,1) 
     1207               DO jk = 2, misfdep(ji,jj) 
     1208                  gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)  
     1209               END DO 
     1210               IF (misfdep(ji,jj) .GE. 2) gdep3w_0(ji,jj,misfdep(ji,jj)) = risfdep(ji,jj) + 0.5_wp * e3w_0(ji,jj,misfdep(ji,jj)) 
     1211               DO jk = misfdep(ji,jj) + 1, jpk 
     1212                  gdep3w_0(ji,jj,jk) = gdep3w_0(ji,jj,jk-1) + e3w_0(ji,jj,jk)  
     1213               END DO 
     1214            END DO 
     1215         END DO 
     1216      ELSE ! no cavity 
     1217         gdep3w_0(:,:,1) = 0.5_wp * e3w_0(:,:,1) 
     1218         DO jk = 2, jpk 
     1219            gdep3w_0(:,:,jk) = gdep3w_0(:,:,jk-1) + e3w_0(:,:,jk) 
     1220         END DO 
     1221      END IF 
    10531222      !                                               ! ================= ! 
    10541223      IF(lwp .AND. ll_print) THEN                     !   Control print   ! 
     
    10841253      ! 
    10851254   END SUBROUTINE zgr_zps 
     1255 
     1256   SUBROUTINE zgr_isf 
     1257      !!---------------------------------------------------------------------- 
     1258      !!                    ***  ROUTINE zgr_isf  *** 
     1259      !!    
     1260      !! ** Purpose :   check the bathymetry in levels 
     1261      !!    
     1262      !! ** Method  :   THe water column have to contained at least 2 cells 
     1263      !!                Bathymetry and isfdraft are modified (dig/close) to respect 
     1264      !!                this criterion. 
     1265      !!                  
     1266      !!    
     1267      !! ** Action  : - test compatibility between isfdraft and bathy  
     1268      !!              - bathy and isfdraft are modified 
     1269      !!---------------------------------------------------------------------- 
     1270      !!    
     1271      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices 
     1272      INTEGER  ::   ik, it           ! temporary integers 
     1273      INTEGER  ::   id, jd, nprocd 
     1274      INTEGER  ::   icompt, ibtest, ibtestim1, ibtestip1, ibtestjm1, ibtestjp1   ! (ISF) 
     1275      LOGICAL  ::   ll_print         ! Allow  control print for debugging 
     1276      REAL(wp) ::   ze3tp , ze3wp    ! Last ocean level thickness at T- and W-points 
     1277      REAL(wp) ::   zdepwp, zdepth   ! Ajusted ocean depth to avoid too small e3t 
     1278      REAL(wp) ::   zmax, zmin       ! Maximum and minimum depth 
     1279      REAL(wp) ::   zdiff            ! temporary scalar 
     1280      REAL(wp) ::   zrefdep          ! temporary scalar 
     1281      REAL(wp) ::   zbathydiff, zrisfdepdiff  ! isf temporary scalar 
     1282      REAL(wp), POINTER, DIMENSION(:,:)   ::   zrisfdep, zbathy, zmask   ! 2D workspace (ISH) 
     1283      INTEGER , POINTER, DIMENSION(:,:)   ::   zmbathy, zmisfdep         ! 2D workspace (ISH) 
     1284      !!--------------------------------------------------------------------- 
     1285      ! 
     1286      IF( nn_timing == 1 )  CALL timing_start('zgr_isf') 
     1287      ! 
     1288      CALL wrk_alloc( jpi, jpj, zbathy, zmask, zrisfdep) 
     1289      CALL wrk_alloc( jpi, jpj, zmisfdep, zmbathy ) 
     1290 
     1291 
     1292      ! (ISF) compute misfdep 
     1293      WHERE( risfdep(:,:) == 0._wp .AND. bathy(:,:) .NE. 0) ;   misfdep(:,:) = 1   ! open water : set misfdep to 1   
     1294      ELSEWHERE                      ;                          misfdep(:,:) = 2   ! iceshelf : initialize misfdep to second level  
     1295      END WHERE   
     1296 
     1297      ! Compute misfdep for ocean points (i.e. first wet level)  
     1298      ! find the first ocean level such that the first level thickness  
     1299      ! is larger than the bot_level of e3zps_min and e3zps_rat * e3t_0 (where  
     1300      ! e3t_0 is the reference level thickness  
     1301      DO jk = 2, jpkm1  
     1302         zdepth = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat )  
     1303         WHERE( 0._wp < risfdep(:,:) .AND. risfdep(:,:) >= zdepth )   misfdep(:,:) = jk+1  
     1304      END DO  
     1305      WHERE (risfdep(:,:) <= e3t_1d(1) .AND. risfdep(:,:) .GT. 0._wp) 
     1306         risfdep(:,:) = 0. ; misfdep(:,:) = 1 
     1307      END WHERE 
     1308  
     1309! basic check for the compatibility of bathy and risfdep. I think it should be offline because it is not perfect and cannot solved all the situation 
     1310      icompt = 0  
     1311! run the bathy check 10 times to be sure all the modif in the bathy or iceshelf draft are compatible together 
     1312      DO jl = 1, 10      
     1313         WHERE (bathy(:,:) .EQ. risfdep(:,:) ) 
     1314            misfdep(:,:) = 0 ; risfdep(:,:) = 0._wp 
     1315            mbathy (:,:) = 0 ; bathy  (:,:) = 0._wp 
     1316         END WHERE 
     1317         WHERE (mbathy(:,:) <= 0)  
     1318            misfdep(:,:) = 0; risfdep(:,:) = 0._wp  
     1319            mbathy (:,:) = 0; bathy  (:,:) = 0._wp 
     1320         ENDWHERE 
     1321         IF( lk_mpp ) THEN 
     1322            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1323            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1324            misfdep(:,:) = INT( zbathy(:,:) ) 
     1325            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1326            CALL lbc_lnk( bathy, 'T', 1. ) 
     1327            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1328            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1329            mbathy(:,:) = INT( zbathy(:,:) ) 
     1330         ENDIF 
     1331         IF( nperio == 1 .OR. nperio  ==  4 .OR. nperio  ==  6 ) THEN  
     1332            misfdep( 1 ,:) = misfdep(jpim1,:)           ! local domain is cyclic east-west  
     1333            misfdep(jpi,:) = misfdep(  2  ,:)  
     1334         ENDIF 
     1335 
     1336         IF( nperio == 1 .OR. nperio  ==  4 .OR. nperio  ==  6 ) THEN 
     1337            mbathy( 1 ,:) = mbathy(jpim1,:)             ! local domain is cyclic east-west 
     1338            mbathy(jpi,:) = mbathy(  2  ,:) 
     1339         ENDIF 
     1340 
     1341         ! split last cell if possible (only where water column is 2 cell or less) 
     1342         DO jk = jpkm1, 1, -1 
     1343            zmax = gdepw_1d(jk) + MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 
     1344            WHERE( gdepw_1d(jk) < bathy(:,:) .AND. bathy(:,:) <= zmax .AND. misfdep + 1 >= mbathy) 
     1345               mbathy(:,:) = jk 
     1346               bathy(:,:)  = zmax 
     1347            END WHERE 
     1348         END DO 
     1349  
     1350         ! split top cell if possible (only where water column is 2 cell or less) 
     1351         DO jk = 2, jpkm1 
     1352            zmax = gdepw_1d(jk+1) - MIN( e3zps_min, e3t_1d(jk)*e3zps_rat ) 
     1353            WHERE( gdepw_1d(jk+1) > risfdep(:,:) .AND. risfdep(:,:) >= zmax .AND. misfdep + 1 >= mbathy) 
     1354               misfdep(:,:) = jk 
     1355               risfdep(:,:) = zmax 
     1356            END WHERE 
     1357         END DO 
     1358 
     1359  
     1360 ! Case where bathy and risfdep compatible but not the level variable mbathy/misfdep because of partial cell condition 
     1361         DO jj = 1, jpj 
     1362            DO ji = 1, jpi 
     1363               ! find the minimum change option: 
     1364               ! test bathy 
     1365               IF (risfdep(ji,jj) .GT. 1) THEN 
     1366               zbathydiff =ABS(bathy(ji,jj)   - (gdepw_1d(mbathy (ji,jj)+1) & 
     1367                 &   + MIN( e3zps_min, e3t_1d(mbathy (ji,jj)+1)*e3zps_rat ))) 
     1368               zrisfdepdiff=ABS(risfdep(ji,jj) - (gdepw_1d(misfdep(ji,jj)  ) & 
     1369                 &   - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ))) 
     1370  
     1371                  IF (bathy(ji,jj) .GT. risfdep(ji,jj) .AND. mbathy(ji,jj) .LT. misfdep(ji,jj)) THEN 
     1372                     IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1373                        bathy(ji,jj) = gdepw_1d(mbathy(ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj)+1)*e3zps_rat ) 
     1374                        mbathy(ji,jj)= mbathy(ji,jj) + 1 
     1375                     ELSE 
     1376                        risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ) 
     1377                        misfdep(ji,jj) = misfdep(ji,jj) - 1 
     1378                     END IF 
     1379                  END IF 
     1380               END IF 
     1381            END DO 
     1382         END DO 
     1383  
     1384          ! At least 2 levels for water thickness at T, U, and V point. 
     1385         DO jj = 1, jpj 
     1386            DO ji = 1, jpi 
     1387               ! find the minimum change option: 
     1388               ! test bathy 
     1389               IF( misfdep(ji,jj) == mbathy(ji,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1390                  zbathydiff  =ABS(bathy(ji,jj)  - (gdepw_1d(mbathy (ji,jj)+1)& 
     1391                    & + MIN( e3zps_min,e3t_1d(mbathy (ji,jj)+1)*e3zps_rat ))) 
     1392                  zrisfdepdiff=ABS(risfdep(ji,jj) - (gdepw_1d(misfdep(ji,jj)  )  & 
     1393                    & - MIN( e3zps_min,e3t_1d(misfdep(ji,jj)-1)*e3zps_rat ))) 
     1394                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1395                     mbathy(ji,jj) = mbathy(ji,jj) + 1 
     1396                     bathy(ji,jj)  = gdepw_1d(mbathy (ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj) +1)*e3zps_rat ) 
     1397                  ELSE 
     1398                     misfdep(ji,jj)= misfdep(ji,jj) - 1 
     1399                     risfdep(ji,jj) = gdepw_1d(misfdep(ji,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj))*e3zps_rat ) 
     1400                  END IF 
     1401               ENDIF 
     1402            END DO 
     1403         END DO 
     1404  
     1405 ! point V mbathy(ji,jj) EQ misfdep(ji,jj+1)  
     1406         DO jj = 1, jpjm1 
     1407            DO ji = 1, jpim1 
     1408               IF( misfdep(ji,jj+1) == mbathy(ji,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1409                  zbathydiff =ABS(bathy(ji,jj    ) - (gdepw_1d(mbathy (ji,jj)+1)   & 
     1410                    &   + MIN( e3zps_min, e3t_1d(mbathy (ji,jj  )+1)*e3zps_rat ))) 
     1411                  zrisfdepdiff=ABS(risfdep(ji,jj+1) - (gdepw_1d(misfdep(ji,jj+1))  & 
     1412                    &  - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1)-1)*e3zps_rat ))) 
     1413                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1414                     mbathy(ji,jj) = mbathy(ji,jj) + 1 
     1415                     bathy(ji,jj)  = gdepw_1d(mbathy (ji,jj  )) & 
     1416                   &    + MIN( e3zps_min, e3t_1d(mbathy(ji,jj   )+1)*e3zps_rat ) 
     1417                  ELSE 
     1418                     misfdep(ji,jj+1)  = misfdep(ji,jj+1) - 1 
     1419                     risfdep (ji,jj+1) = gdepw_1d(misfdep(ji,jj+1)+1) & 
     1420                   &   - MIN( e3zps_min, e3t_1d(misfdep(ji,jj+1))*e3zps_rat ) 
     1421                  END IF 
     1422               ENDIF 
     1423            END DO 
     1424         END DO 
     1425  
     1426         IF( lk_mpp ) THEN 
     1427            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1428            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1429            misfdep(:,:) = INT( zbathy(:,:) ) 
     1430            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1431            CALL lbc_lnk( bathy, 'T', 1. ) 
     1432            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1433            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1434            mbathy(:,:) = INT( zbathy(:,:) ) 
     1435         ENDIF 
     1436 ! point V misdep(ji,jj) EQ mbathy(ji,jj+1)  
     1437         DO jj = 1, jpjm1 
     1438            DO ji = 1, jpim1 
     1439               IF( misfdep(ji,jj) == mbathy(ji,jj+1) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1440                  zbathydiff =ABS(  bathy(ji,jj+1) - (gdepw_1d(mbathy (ji,jj+1)+1) & 
     1441                   &   + MIN( e3zps_min, e3t_1d(mbathy (ji,jj+1)+1)*e3zps_rat ))) 
     1442                  zrisfdepdiff=ABS(risfdep(ji,jj  ) - (gdepw_1d(misfdep(ji,jj  )  )  & 
     1443                   &   - MIN( e3zps_min, e3t_1d(misfdep(ji,jj  )-1)*e3zps_rat ))) 
     1444                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1445                     mbathy (ji,jj+1) = mbathy(ji,jj+1) + 1 
     1446                     bathy  (ji,jj+1) = gdepw_1d(mbathy (ji,jj+1)  ) + MIN( e3zps_min, e3t_1d(mbathy (ji,jj+1)+1)*e3zps_rat ) 
     1447                  ELSE 
     1448                     misfdep(ji,jj)   = misfdep(ji,jj) - 1 
     1449                     risfdep(ji,jj)   = gdepw_1d(misfdep(ji,jj  )+1) - MIN( e3zps_min, e3t_1d(misfdep(ji,jj  )  )*e3zps_rat ) 
     1450                  END IF 
     1451               ENDIF 
     1452            END DO 
     1453         END DO 
     1454  
     1455  
     1456         IF( lk_mpp ) THEN  
     1457            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1458            CALL lbc_lnk( zbathy, 'T', 1. )  
     1459            misfdep(:,:) = INT( zbathy(:,:) )  
     1460            CALL lbc_lnk( risfdep, 'T', 1. )  
     1461            CALL lbc_lnk( bathy, 'T', 1. ) 
     1462            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1463            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1464            mbathy(:,:) = INT( zbathy(:,:) ) 
     1465         ENDIF  
     1466  
     1467 ! point U mbathy(ji,jj) EQ misfdep(ji,jj+1)  
     1468         DO jj = 1, jpjm1 
     1469            DO ji = 1, jpim1 
     1470               IF( misfdep(ji+1,jj) == mbathy(ji,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1471                  zbathydiff =ABS(  bathy(ji  ,jj) - (gdepw_1d(mbathy (ji,jj)+1) & 
     1472                    &   + MIN( e3zps_min, e3t_1d(mbathy (ji  ,jj)+1)*e3zps_rat ))) 
     1473                  zrisfdepdiff=ABS(risfdep(ji+1,jj) - (gdepw_1d(misfdep(ji+1,jj)) & 
     1474                    &  - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj)-1)*e3zps_rat ))) 
     1475                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1476                     mbathy(ji,jj) = mbathy(ji,jj) + 1 
     1477                     bathy(ji,jj)  = gdepw_1d(mbathy (ji,jj)) + MIN( e3zps_min, e3t_1d(mbathy(ji,jj) +1)*e3zps_rat ) 
     1478                  ELSE 
     1479                     misfdep(ji+1,jj)= misfdep(ji+1,jj) - 1 
     1480                     risfdep(ji+1,jj) = gdepw_1d(misfdep(ji+1,jj)+1) - MIN( e3zps_min, e3t_1d(misfdep(ji+1,jj))*e3zps_rat ) 
     1481                  END IF 
     1482               ENDIF 
     1483            ENDDO 
     1484         ENDDO 
     1485  
     1486         IF( lk_mpp ) THEN  
     1487            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1488            CALL lbc_lnk( zbathy, 'T', 1. )  
     1489            misfdep(:,:) = INT( zbathy(:,:) )  
     1490            CALL lbc_lnk( risfdep, 'T', 1. )  
     1491            CALL lbc_lnk( bathy, 'T', 1. ) 
     1492            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1493            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1494            mbathy(:,:) = INT( zbathy(:,:) ) 
     1495         ENDIF  
     1496  
     1497 ! point U misfdep(ji,jj) EQ bathy(ji,jj+1)  
     1498         DO jj = 1, jpjm1 
     1499            DO ji = 1, jpim1 
     1500               IF( misfdep(ji,jj) == mbathy(ji+1,jj) .AND. mbathy(ji,jj) .GT. 1) THEN 
     1501                  zbathydiff =ABS(  bathy(ji+1,jj) - (gdepw_1d(mbathy (ji+1,jj)+1) & 
     1502                      &   + MIN( e3zps_min, e3t_1d(mbathy (ji+1,jj)+1)*e3zps_rat ))) 
     1503                  zrisfdepdiff=ABS(risfdep(ji  ,jj) - (gdepw_1d(misfdep(ji  ,jj)  )  & 
     1504                      &  - MIN( e3zps_min, e3t_1d(misfdep(ji  ,jj)-1)*e3zps_rat ))) 
     1505                  IF (zbathydiff .LE. zrisfdepdiff) THEN 
     1506                     mbathy(ji+1,jj)  = mbathy (ji+1,jj) + 1 
     1507                     bathy (ji+1,jj)  = gdepw_1d(mbathy (ji+1,jj)  )  & 
     1508                      &   + MIN( e3zps_min, e3t_1d(mbathy (ji+1,jj) +1)*e3zps_rat ) 
     1509                  ELSE 
     1510                     misfdep(ji,jj)   = misfdep(ji  ,jj) - 1 
     1511                     risfdep(ji,jj)   = gdepw_1d(misfdep(ji  ,jj)+1) & 
     1512                      &   - MIN( e3zps_min, e3t_1d(misfdep(ji  ,jj)   )*e3zps_rat ) 
     1513                  END IF 
     1514               ENDIF 
     1515            ENDDO 
     1516         ENDDO 
     1517  
     1518         IF( lk_mpp ) THEN 
     1519            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1520            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1521            misfdep(:,:) = INT( zbathy(:,:) ) 
     1522            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1523            CALL lbc_lnk( bathy, 'T', 1. ) 
     1524            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1525            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1526            mbathy(:,:) = INT( zbathy(:,:) ) 
     1527         ENDIF 
     1528      END DO 
     1529      ! end dig bathy/ice shelf to be compatible 
     1530      ! now fill single point in "coastline" of ice shelf, bathy, hole, and test again one cell tickness 
     1531      DO jl = 1,20 
     1532  
     1533 ! remove single point "bay" on isf coast line in the ice shelf draft' 
     1534         DO jk = 2, jpk 
     1535            WHERE (misfdep==0) misfdep=jpk 
     1536            zmask=0 
     1537            WHERE (misfdep .LE. jk) zmask=1 
     1538            DO jj = 2, jpjm1 
     1539               DO ji = 2, jpim1 
     1540                  IF (misfdep(ji,jj) .EQ. jk) THEN 
     1541                     ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1) 
     1542                     IF (ibtest .LE. 1) THEN 
     1543                        risfdep(ji,jj)=gdepw_1d(jk+1) ; misfdep(ji,jj)=jk+1 
     1544                        IF (misfdep(ji,jj) .GT. mbathy(ji,jj)) misfdep(ji,jj) = jpk 
     1545                     END IF 
     1546                  END IF 
     1547               END DO 
     1548            END DO 
     1549         END DO 
     1550         WHERE (misfdep==jpk) 
     1551             misfdep=0 ; risfdep=0. ; mbathy=0 ; bathy=0. 
     1552         END WHERE 
     1553         IF( lk_mpp ) THEN 
     1554            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1555            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1556            misfdep(:,:) = INT( zbathy(:,:) ) 
     1557            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1558            CALL lbc_lnk( bathy, 'T', 1. ) 
     1559            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1560            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1561            mbathy(:,:) = INT( zbathy(:,:) ) 
     1562         ENDIF 
     1563  
     1564 ! remove single point "bay" on bathy coast line beneath an ice shelf' 
     1565         DO jk = jpk,1,-1 
     1566            zmask=0 
     1567            WHERE (mbathy .GE. jk ) zmask=1 
     1568            DO jj = 2, jpjm1 
     1569               DO ji = 2, jpim1 
     1570                  IF (mbathy(ji,jj) .EQ. jk .AND. misfdep(ji,jj) .GE. 2) THEN 
     1571                     ibtest = zmask(ji-1,jj) + zmask(ji+1,jj) + zmask(ji,jj-1) + zmask(ji,jj+1) 
     1572                     IF (ibtest .LE. 1) THEN 
     1573                        bathy(ji,jj)=gdepw_1d(jk) ; mbathy(ji,jj)=jk-1 
     1574                        IF (misfdep(ji,jj) .GT. mbathy(ji,jj)) mbathy(ji,jj) = 0 
     1575                     END IF 
     1576                  END IF 
     1577               END DO 
     1578            END DO 
     1579         END DO 
     1580         WHERE (mbathy==0) 
     1581             misfdep=0 ; risfdep=0. ; mbathy=0 ; bathy=0. 
     1582         END WHERE 
     1583         IF( lk_mpp ) THEN 
     1584            zbathy(:,:) = FLOAT( misfdep(:,:) ) 
     1585            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1586            misfdep(:,:) = INT( zbathy(:,:) ) 
     1587            CALL lbc_lnk( risfdep, 'T', 1. ) 
     1588            CALL lbc_lnk( bathy, 'T', 1. ) 
     1589            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1590            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1591            mbathy(:,:) = INT( zbathy(:,:) ) 
     1592         ENDIF 
     1593  
     1594 ! fill hole in ice shelf 
     1595         zmisfdep = misfdep 
     1596         zrisfdep = risfdep 
     1597         WHERE (zmisfdep .LE. 1) zmisfdep=jpk 
     1598         DO jj = 2, jpjm1 
     1599            DO ji = 2, jpim1 
     1600               ibtestim1 = zmisfdep(ji-1,jj  ) ; ibtestip1 = zmisfdep(ji+1,jj  ) 
     1601               ibtestjm1 = zmisfdep(ji  ,jj-1) ; ibtestjp1 = zmisfdep(ji  ,jj+1) 
     1602               IF( zmisfdep(ji,jj) .GE. mbathy(ji-1,jj  ) ) ibtestim1 = jpk!MAX(0, mbathy(ji-1,jj  ) - 1) 
     1603               IF( zmisfdep(ji,jj) .GE. mbathy(ji+1,jj  ) ) ibtestip1 = jpk!MAX(0, mbathy(ji+1,jj  ) - 1) 
     1604               IF( zmisfdep(ji,jj) .GE. mbathy(ji  ,jj-1) ) ibtestjm1 = jpk!MAX(0, mbathy(ji  ,jj-1) - 1) 
     1605               IF( zmisfdep(ji,jj) .GE. mbathy(ji  ,jj+1) ) ibtestjp1 = jpk!MAX(0, mbathy(ji  ,jj+1) - 1) 
     1606               ibtest=MIN(ibtestim1, ibtestip1, ibtestjm1, ibtestjp1) 
     1607               IF( ibtest == jpk .AND. misfdep(ji,jj) .GE. 2) THEN 
     1608                  mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0.0_wp ; misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0.0_wp 
     1609               END IF 
     1610               IF( zmisfdep(ji,jj) < ibtest .AND. misfdep(ji,jj) .GE. 2) THEN 
     1611                  misfdep(ji,jj) = ibtest 
     1612                  risfdep(ji,jj) = gdepw_1d(ibtest) 
     1613               ENDIF 
     1614            ENDDO 
     1615         ENDDO 
     1616  
     1617         IF( lk_mpp ) THEN  
     1618            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1619            CALL lbc_lnk( zbathy, 'T', 1. )  
     1620            misfdep(:,:) = INT( zbathy(:,:) )  
     1621            CALL lbc_lnk( risfdep, 'T', 1. )  
     1622            CALL lbc_lnk( bathy, 'T', 1. ) 
     1623            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1624            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1625            mbathy(:,:) = INT( zbathy(:,:) ) 
     1626         ENDIF  
     1627 ! 
     1628 !! fill hole in bathymetry 
     1629         zmbathy (:,:)=mbathy (:,:) 
     1630         DO jj = 2, jpjm1 
     1631            DO ji = 2, jpim1 
     1632               ibtestim1 = zmbathy(ji-1,jj  ) ; ibtestip1 = zmbathy(ji+1,jj  ) 
     1633               ibtestjm1 = zmbathy(ji  ,jj-1) ; ibtestjp1 = zmbathy(ji  ,jj+1) 
     1634               IF( zmbathy(ji,jj) .LT. misfdep(ji-1,jj  ) ) ibtestim1 = 0!MIN(jpk-1, misfdep(ji-1,jj  ) + 1) 
     1635               IF( zmbathy(ji,jj) .LT. misfdep(ji+1,jj  ) ) ibtestip1 = 0 
     1636               IF( zmbathy(ji,jj) .LT. misfdep(ji  ,jj-1) ) ibtestjm1 = 0 
     1637               IF( zmbathy(ji,jj) .LT. misfdep(ji  ,jj+1) ) ibtestjp1 = 0 
     1638               ibtest=MAX(ibtestim1, ibtestip1, ibtestjm1, ibtestjp1) 
     1639               IF( ibtest == 0 .AND. misfdep(ji,jj) .GE. 2) THEN 
     1640                  mbathy(ji,jj) = 0 ; bathy(ji,jj) = 0.0_wp ; misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0.0_wp ; 
     1641               END IF 
     1642               IF( ibtest < zmbathy(ji,jj) .AND. misfdep(ji,jj) .GE. 2) THEN 
     1643                  mbathy(ji,jj) = ibtest 
     1644                  bathy(ji,jj)  = gdepw_1d(ibtest+1)  
     1645               ENDIF 
     1646            END DO 
     1647         END DO 
     1648         IF( lk_mpp ) THEN  
     1649            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1650            CALL lbc_lnk( zbathy, 'T', 1. )  
     1651            misfdep(:,:) = INT( zbathy(:,:) )  
     1652            CALL lbc_lnk( risfdep, 'T', 1. )  
     1653            CALL lbc_lnk( bathy, 'T', 1. ) 
     1654            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1655            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1656            mbathy(:,:) = INT( zbathy(:,:) ) 
     1657         ENDIF  
     1658 ! if not compatible after all check (ie U point water column less than 2 cells), mask U 
     1659         DO jj = 1, jpjm1 
     1660            DO ji = 1, jpim1 
     1661               IF (mbathy(ji,jj) == misfdep(ji+1,jj) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji+1,jj) .GE. 1) THEN 
     1662                  mbathy(ji,jj)  = mbathy(ji,jj) - 1 ; bathy(ji,jj)   = gdepw_1d(mbathy(ji,jj)+1) ; 
     1663               END IF 
     1664            END DO 
     1665         END DO 
     1666         IF( lk_mpp ) THEN  
     1667            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1668            CALL lbc_lnk( zbathy, 'T', 1. )  
     1669            misfdep(:,:) = INT( zbathy(:,:) )  
     1670            CALL lbc_lnk( risfdep, 'T', 1. )  
     1671            CALL lbc_lnk( bathy, 'T', 1. ) 
     1672            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1673            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1674            mbathy(:,:) = INT( zbathy(:,:) ) 
     1675         ENDIF  
     1676 ! if not compatible after all check (ie U point water column less than 2 cells), mask U 
     1677         DO jj = 1, jpjm1 
     1678            DO ji = 1, jpim1 
     1679               IF (misfdep(ji,jj) == mbathy(ji+1,jj) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji+1,jj) .GE. 1) THEN 
     1680                  mbathy(ji+1,jj)  = mbathy(ji+1,jj) - 1;   bathy(ji+1,jj)   = gdepw_1d(mbathy(ji+1,jj)+1) ; 
     1681               END IF 
     1682            END DO 
     1683         END DO 
     1684         IF( lk_mpp ) THEN  
     1685            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1686            CALL lbc_lnk( zbathy, 'T', 1. )  
     1687            misfdep(:,:) = INT( zbathy(:,:) )  
     1688            CALL lbc_lnk( risfdep, 'T', 1. )  
     1689            CALL lbc_lnk( bathy, 'T', 1. ) 
     1690            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1691            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1692            mbathy(:,:) = INT( zbathy(:,:) ) 
     1693         ENDIF  
     1694 ! if not compatible after all check (ie V point water column less than 2 cells), mask V 
     1695         DO jj = 1, jpjm1 
     1696            DO ji = 1, jpi 
     1697               IF (mbathy(ji,jj) == misfdep(ji,jj+1) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji,jj+1) .GE. 1) THEN 
     1698                  mbathy(ji,jj)  = mbathy(ji,jj) - 1 ; bathy(ji,jj)   = gdepw_1d(mbathy(ji,jj)+1) ; 
     1699               END IF 
     1700            END DO 
     1701         END DO 
     1702         IF( lk_mpp ) THEN  
     1703            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1704            CALL lbc_lnk( zbathy, 'T', 1. )  
     1705            misfdep(:,:) = INT( zbathy(:,:) )  
     1706            CALL lbc_lnk( risfdep, 'T', 1. )  
     1707            CALL lbc_lnk( bathy, 'T', 1. ) 
     1708            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1709            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1710            mbathy(:,:) = INT( zbathy(:,:) ) 
     1711         ENDIF  
     1712 ! if not compatible after all check (ie V point water column less than 2 cells), mask V 
     1713         DO jj = 1, jpjm1 
     1714            DO ji = 1, jpi 
     1715               IF (misfdep(ji,jj) == mbathy(ji,jj+1) .AND. mbathy(ji,jj) .GE. 1 .AND. mbathy(ji,jj+1) .GE. 1) THEN 
     1716                  mbathy(ji,jj+1)  = mbathy(ji,jj+1) - 1 ; bathy(ji,jj+1)   = gdepw_1d(mbathy(ji,jj+1)+1) ; 
     1717               END IF 
     1718            END DO 
     1719         END DO 
     1720         IF( lk_mpp ) THEN  
     1721            zbathy(:,:) = FLOAT( misfdep(:,:) )  
     1722            CALL lbc_lnk( zbathy, 'T', 1. )  
     1723            misfdep(:,:) = INT( zbathy(:,:) )  
     1724            CALL lbc_lnk( risfdep, 'T', 1. )  
     1725            CALL lbc_lnk( bathy, 'T', 1. ) 
     1726            zbathy(:,:) = FLOAT( mbathy(:,:) ) 
     1727            CALL lbc_lnk( zbathy, 'T', 1. ) 
     1728            mbathy(:,:) = INT( zbathy(:,:) ) 
     1729         ENDIF  
     1730 ! if not compatible after all check, mask T 
     1731         DO jj = 1, jpj 
     1732            DO ji = 1, jpi 
     1733               IF (mbathy(ji,jj) <= misfdep(ji,jj)) THEN 
     1734                  misfdep(ji,jj) = 0 ; risfdep(ji,jj) = 0._wp ; mbathy(ji,jj)  = 0 ; bathy(ji,jj)   = 0._wp ; 
     1735               END IF 
     1736            END DO 
     1737         END DO 
     1738  
     1739         WHERE (mbathy(:,:) == 1) 
     1740            mbathy = 0; bathy = 0.0_wp ; misfdep = 0 ; risfdep = 0.0_wp 
     1741         END WHERE 
     1742      END DO  
     1743! end check compatibility ice shelf/bathy 
     1744      ! remove very shallow ice shelf (less than ~ 10m if 75L) 
     1745      WHERE (misfdep(:,:) <= 5) 
     1746         misfdep = 1; risfdep = 0.0_wp; 
     1747      END WHERE 
     1748 
     1749      IF( icompt == 0 ) THEN  
     1750         IF(lwp) WRITE(numout,*)'     no points with ice shelf too close to bathymetry'  
     1751      ELSE  
     1752         IF(lwp) WRITE(numout,*)'    ',icompt,' ocean grid points with ice shelf thickness reduced to avoid bathymetry'  
     1753      ENDIF  
     1754 
     1755      CALL wrk_dealloc( jpi, jpj, zmask, zbathy, zrisfdep ) 
     1756      CALL wrk_dealloc( jpi, jpj, zmisfdep, zmbathy ) 
     1757 
     1758      IF( nn_timing == 1 )  CALL timing_stop('zgr_isf') 
     1759       
     1760   END SUBROUTINE 
    10861761 
    10871762   SUBROUTINE zgr_sco 
Note: See TracChangeset for help on using the changeset viewer.