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 2528 for trunk/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90 – NEMO

Ignore:
Timestamp:
2010-12-27T18:33:53+01:00 (13 years ago)
Author:
rblod
Message:

Update NEMOGCM from branch nemo_v3_3_beta

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90

    • Property svn:eol-style deleted
    r2465 r2528  
    77   !!                 ! 1997-07  (G. Madec)  lbc_lnk call 
    88   !!                 ! 1997-04  (J.-O. Beismann)  
    9    !!            8.5  ! 2002-09 (A. Bozec, G. Madec)  F90: Free form and module 
    10    !!             -   ! 2002-09 (A. de Miranda)  rigid-lid + islands 
     9   !!            8.5  ! 2002-09  (A. Bozec, G. Madec)  F90: Free form and module 
     10   !!             -   ! 2002-09  (A. de Miranda)  rigid-lid + islands 
    1111   !!  NEMO      1.0  ! 2003-08  (G. Madec)  F90: Free form and module 
    1212   !!             -   ! 2005-10  (A. Beckmann)  modifications for hybrid s-ccordinates & new stretching function 
     
    1414   !!            3.0  ! 2008-06  (G. Madec)  insertion of domzgr_zps.h90 & conding style 
    1515   !!            3.2  ! 2009-07  (R. Benshila) Suppression of rigid-lid option 
     16   !!            3.3  ! 2010-11  (G. Madec) add mbk. arrays associated to the deepest ocean level 
    1617   !!---------------------------------------------------------------------- 
    1718 
     
    2122   !!       zgr_bat_zoom : modify the bathymetry field if zoom domain 
    2223   !!       zgr_bat_ctl  : check the bathymetry files 
     24   !!       zgr_bot_level: deepest ocean level for t-, u, and v-points 
    2325   !!       zgr_z        : reference z-coordinate  
    2426   !!       zgr_zco      : z-coordinate  
     
    2830   !!       dfssig       : derivative of the sigma coordinate function    !!gm  (currently missing!) 
    2931   !!--------------------------------------------------------------------- 
    30    USE oce             ! ocean dynamics and tracers 
    31    USE dom_oce         ! ocean space and time domain 
    32    USE in_out_manager  ! I/O manager 
    33    USE lib_mpp         ! distributed memory computing library 
    34    USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
    35    USE closea          ! closed seas 
    36    USE c1d             ! 1D configuration 
     32   USE oce               ! ocean variables 
     33   USE dom_oce           ! ocean domain 
     34   USE closea            ! closed seas 
     35   USE c1d               ! 1D vertical configuration 
     36   USE in_out_manager    ! I/O manager 
     37   USE iom               ! I/O library 
     38   USE lbclnk            ! ocean lateral boundary conditions (or mpp link) 
     39   USE lib_mpp           ! distributed memory computing library 
    3740 
    3841   IMPLICIT NONE 
    3942   PRIVATE 
    4043 
    41    PUBLIC   dom_zgr    ! called by dom_init.F90 
    42  
    43 !!gm   DOCTOR name for the namelist parameter... 
    44    !                                    !!! ** Namelist namzgr_sco ** 
    45    REAL(wp) ::   rn_sbot_min =  300.     ! minimum depth of s-bottom surface (>0) (m) 
    46    REAL(wp) ::   rn_sbot_max = 5250.     ! maximum depth of s-bottom surface (= ocean depth) (>0) (m) 
    47    REAL(wp) ::   rn_theta    =    6.0    ! surface control parameter (0<=rn_theta<=20) 
    48    REAL(wp) ::   rn_thetb    =    0.75   ! bottom control parameter  (0<=rn_thetb<= 1) 
    49    REAL(wp) ::   rn_rmax     =    0.15   ! maximum cut-off r-value allowed (0<rn_rmax<1) 
    50    LOGICAL  ::   ln_s_sigma  = .false.   ! use hybrid s-sigma -coordinate & stretching function fssig1 (ln_sco=T) 
    51    REAL(wp) ::   rn_bb       =    0.8    ! stretching parameter for song and haidvogel stretching 
    52    !                                     ! ( rn_bb=0; top only, rn_bb =1; top and bottom) 
    53    REAL(wp) ::   rn_hc       = 150.      ! Critical depth for s-sigma coordinates 
     44   PUBLIC   dom_zgr      ! called by dom_init.F90 
     45 
     46   !                                       !!* Namelist namzgr_sco * 
     47   REAL(wp) ::   rn_sbot_min =  300._wp     ! minimum depth of s-bottom surface (>0) (m) 
     48   REAL(wp) ::   rn_sbot_max = 5250._wp     ! maximum depth of s-bottom surface (= ocean depth) (>0) (m) 
     49   REAL(wp) ::   rn_theta    =    6.00_wp   ! surface control parameter (0<=rn_theta<=20) 
     50   REAL(wp) ::   rn_thetb    =    0.75_wp   ! bottom control parameter  (0<=rn_thetb<= 1) 
     51   REAL(wp) ::   rn_rmax     =    0.15_wp   ! maximum cut-off r-value allowed (0<rn_rmax<1) 
     52   LOGICAL  ::   ln_s_sigma  = .false.      ! use hybrid s-sigma -coordinate & stretching function fssig1 (ln_sco=T) 
     53   REAL(wp) ::   rn_bb       =    0.80_wp   ! stretching parameter for song and haidvogel stretching 
     54   !                                        ! ( rn_bb=0; top only, rn_bb =1; top and bottom) 
     55   REAL(wp) ::   rn_hc       =  150._wp     ! Critical depth for s-sigma coordinates 
    5456  
    5557   !! * Substitutions 
     
    5759#  include "vectopt_loop_substitute.h90" 
    5860   !!---------------------------------------------------------------------- 
    59    !! NEMO/OPA 3.0 , LOCEAN-IPSL (2008)  
     61   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    6062   !! $Id$ 
    61    !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt) 
     63   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    6264   !!---------------------------------------------------------------------- 
    63  
    6465CONTAINS        
    6566 
     
    7576      !!              - vertical coordinate (gdep., e3.) depending on the  
    7677      !!                coordinate chosen : 
    77       !!                   ln_zco=T   z-coordinate   (forced if lk_zco) 
     78      !!                   ln_zco=T   z-coordinate    
    7879      !!                   ln_zps=T   z-coordinate with partial steps 
    7980      !!                   ln_zco=T   s-coordinate  
     
    8283      !!---------------------------------------------------------------------- 
    8384      INTEGER ::   ioptio = 0   ! temporary integer 
    84       !! 
     85      ! 
    8586      NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco 
    8687      !!---------------------------------------------------------------------- 
    8788 
    88       REWIND ( numnam )                ! Read Namelist namzgr : vertical coordinate' 
    89       READ   ( numnam, namzgr ) 
     89      REWIND( numnam )                 ! Read Namelist namzgr : vertical coordinate' 
     90      READ  ( numnam, namzgr ) 
    9091 
    9192      IF(lwp) THEN                     ! Control print 
     
    103104      IF( ln_zps ) ioptio = ioptio + 1 
    104105      IF( ln_sco ) ioptio = ioptio + 1 
    105       IF ( ioptio /= 1 )   CALL ctl_stop( ' none or several vertical coordinate options used' ) 
    106       IF( lk_zco ) THEN 
    107           IF(lwp) WRITE(numout,*) '          z-coordinate with reduced incore memory requirement' 
    108           IF( ln_zps .OR. ln_sco )   CALL ctl_stop( ' reduced memory with zps or sco option is impossible' ) 
    109       ENDIF 
    110  
     106      IF( ioptio /= 1 )   CALL ctl_stop( ' none or several vertical coordinate options used' ) 
     107      ! 
    111108      ! Build the vertical coordinate system 
    112109      ! ------------------------------------ 
    113                      CALL zgr_z        ! Reference z-coordinate system (always called) 
    114                      CALL zgr_bat      ! Bathymetry fields (levels and meters) 
    115       IF( ln_zco )   CALL zgr_zco      ! z-coordinate 
    116       IF( ln_zps )   CALL zgr_zps      ! Partial step z-coordinate 
    117       IF( ln_sco )   CALL zgr_sco      ! s-coordinate or hybrid z-s coordinate 
    118       ! 
    119      ! final adjustment of mbathy & check 
    120      ! ----------------------------------- 
    121      IF( lzoom       )   CALL zgr_bat_zoom     ! correct mbathy in case of zoom subdomain 
    122      IF( .NOT.lk_c1d )   CALL zgr_bat_ctl      ! check bathymetry (mbathy) and suppress isoated ocean points 
    123  
    124  
    125 !!bug gm control print: 
     110                          CALL zgr_z            ! Reference z-coordinate system (always called) 
     111                          CALL zgr_bat          ! Bathymetry fields (levels and meters) 
     112      IF( ln_zco      )   CALL zgr_zco          ! z-coordinate 
     113      IF( ln_zps      )   CALL zgr_zps          ! Partial step z-coordinate 
     114      IF( ln_sco      )   CALL zgr_sco          ! s-coordinate or hybrid z-s coordinate 
     115      ! 
     116      ! final adjustment of mbathy & check  
     117      ! ----------------------------------- 
     118      IF( lzoom       )   CALL zgr_bat_zoom     ! correct mbathy in case of zoom subdomain 
     119      IF( .NOT.lk_c1d )   CALL zgr_bat_ctl      ! check bathymetry (mbathy) and suppress isoated ocean points 
     120                          CALL zgr_bot_level    ! deepest ocean level for t-, u- and v-points 
     121      ! 
     122      ! 
    126123      IF( nprint == 1 .AND. lwp )   THEN 
    127124         WRITE(numout,*) ' MIN val mbathy ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 
     
    140137            &                   ' w ',   MAXVAL( fse3w(:,:,:) ) 
    141138      ENDIF 
    142 !!!bug gm 
    143  
     139      ! 
    144140   END SUBROUTINE dom_zgr 
    145141 
     
    171167      REAL(wp) ::   zacr, zdzmin, zhmax    ! par_CONFIG_Rxx.h90 
    172168      REAL(wp) ::   zrefdep                ! depth of the reference level (~10m) 
     169      REAL(wp) ::   za2, zkth2, zacr2      ! Values for optional double tanh function set from parameters  
    173170      !!---------------------------------------------------------------------- 
    174171 
     
    177174       zkth = ppkth       ;   zacr = ppacr 
    178175       zdzmin = ppdzmin   ;   zhmax = pphmax 
     176       zkth2 = ppkth2     ;   zacr2 = ppacr2   ! optional (ldbletanh=T) double tanh parameters 
    179177 
    180178      ! If ppa1 and ppa0 and ppsur are et to pp_to_be_computed 
    181179      !  za0, za1, zsur are computed from ppdzmin , pphmax, ppkth, ppacr 
    182       ! 
    183180      IF(   ppa1  == pp_to_be_computed  .AND.  & 
    184181         &  ppa0  == pp_to_be_computed  .AND.  & 
     
    192189      ELSE 
    193190         za1 = ppa1 ;       za0 = ppa0 ;          zsur = ppsur 
     191         za2 = ppa2                            ! optional (ldbletanh=T) double tanh parameter 
    194192      ENDIF 
    195193 
     
    198196         WRITE(numout,*) '    zgr_z   : Reference vertical z-coordinates' 
    199197         WRITE(numout,*) '    ~~~~~~~' 
    200          IF(  ppkth == 0. ) THEN               
     198         IF(  ppkth == 0._wp ) THEN               
    201199              WRITE(numout,*) '            Uniform grid with ',jpk-1,' layers' 
    202200              WRITE(numout,*) '            Total depth    :', zhmax 
    203201              WRITE(numout,*) '            Layer thickness:', zhmax/(jpk-1) 
    204202         ELSE 
    205             IF( ppa1 == 0. .AND. ppa0 == 0. .AND. ppsur == 0. ) THEN 
     203            IF( ppa1 == 0._wp .AND. ppa0 == 0._wp .AND. ppsur == 0._wp ) THEN 
    206204               WRITE(numout,*) '         zsur, za0, za1 computed from ' 
    207205               WRITE(numout,*) '                 zdzmin = ', zdzmin 
     
    214212            WRITE(numout,*) '                 zkth = ', zkth 
    215213            WRITE(numout,*) '                 zacr = ', zacr 
     214            IF( ldbletanh ) THEN 
     215               WRITE(numout,*) ' (Double tanh    za2  = ', za2 
     216               WRITE(numout,*) '  parameters)    zkth2= ', zkth2 
     217               WRITE(numout,*) '                 zacr2= ', zacr2 
     218            ENDIF 
    216219         ENDIF 
    217220      ENDIF 
     
    220223      ! Reference z-coordinate (depth - scale factor at T- and W-points) 
    221224      ! ====================== 
    222       IF( ppkth == 0.e0 ) THEN            !  uniform vertical grid        
     225      IF( ppkth == 0._wp ) THEN            !  uniform vertical grid        
    223226         za1 = zhmax / FLOAT(jpk-1)  
    224227         DO jk = 1, jpk 
    225228            zw = FLOAT( jk ) 
    226             zt = FLOAT( jk ) + 0.5 
     229            zt = FLOAT( jk ) + 0.5_wp 
    227230            gdepw_0(jk) = ( zw - 1 ) * za1 
    228231            gdept_0(jk) = ( zt - 1 ) * za1 
     
    231234         END DO 
    232235      ELSE                                ! Madec & Imbard 1996 function 
    233          DO jk = 1, jpk 
    234             zw = FLOAT( jk ) 
    235             zt = FLOAT( jk ) + 0.5 
    236             gdepw_0(jk) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth) / zacr ) )  ) 
    237             gdept_0(jk) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth) / zacr ) )  ) 
    238             e3w_0  (jk) =          za0      + za1        * TANH(       (zw-zkth) / zacr   ) 
    239             e3t_0  (jk) =          za0      + za1        * TANH(       (zt-zkth) / zacr   ) 
    240          END DO 
    241          gdepw_0(1) = 0.e0                     ! force first w-level to be exactly at zero 
     236         IF( .NOT. ldbletanh ) THEN 
     237            DO jk = 1, jpk 
     238               zw = REAL( jk , wp ) 
     239               zt = REAL( jk , wp ) + 0.5_wp 
     240               gdepw_0(jk) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth) / zacr ) )  ) 
     241               gdept_0(jk) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth) / zacr ) )  ) 
     242               e3w_0  (jk) =          za0      + za1        * TANH(       (zw-zkth) / zacr   ) 
     243               e3t_0  (jk) =          za0      + za1        * TANH(       (zt-zkth) / zacr   ) 
     244            END DO 
     245         ELSE 
     246            DO jk = 1, jpk 
     247               zw = FLOAT( jk ) 
     248               zt = FLOAT( jk ) + 0.5_wp 
     249               ! Double tanh function 
     250               gdepw_0(jk) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth ) / zacr  ) )    & 
     251                  &                            + za2 * zacr2* LOG ( COSH( (zw-zkth2) / zacr2 ) )  ) 
     252               gdept_0(jk) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth ) / zacr  ) )    & 
     253                  &                            + za2 * zacr2* LOG ( COSH( (zt-zkth2) / zacr2 ) )  ) 
     254               e3w_0  (jk) =          za0      + za1        * TANH(       (zw-zkth ) / zacr  )    & 
     255                  &                            + za2        * TANH(       (zw-zkth2) / zacr2 ) 
     256               e3t_0  (jk) =          za0      + za1        * TANH(       (zt-zkth ) / zacr  )    & 
     257                  &                            + za2        * TANH(       (zt-zkth2) / zacr2 ) 
     258            END DO 
     259         ENDIF 
     260         gdepw_0(1) = 0._wp                    ! force first w-level to be exactly at zero 
    242261      ENDIF 
    243262 
    244263!!gm BUG in s-coordinate this does not work! 
    245       ! deepest/shallowest W level Above/Bellow ~10m 
    246       zrefdep = 10. - ( 0.1*MINVAL(e3w_0) )                          ! ref. depth with tolerance (10% of minimum layer thickness) 
    247       nlb10 = MINLOC( gdepw_0, mask = gdepw_0 > zrefdep, dim = 1 )   ! shallowest W level Bellow ~10m 
    248       nla10 = nlb10 - 1                                              ! deepest    W level Above  ~10m 
     264      ! deepest/shallowest W level Above/Below ~10m 
     265      zrefdep = 10._wp - 0.1_wp * MINVAL( e3w_0 )                    ! ref. depth with tolerance (10% of minimum layer thickness) 
     266      nlb10 = MINLOC( gdepw_0, mask = gdepw_0 > zrefdep, dim = 1 )   ! shallowest W level Below ~10m 
     267      nla10 = nlb10 - 1                                              ! deepest    W level Above ~10m 
    249268!!gm end bug 
    250269 
     
    256275      ENDIF 
    257276      DO jk = 1, jpk                      ! control positivity 
    258          IF( e3w_0  (jk) <= 0.e0 .OR. e3t_0  (jk) <= 0.e0 )   CALL ctl_stop( ' e3w or e3t =< 0 '    ) 
    259          IF( gdepw_0(jk) <  0.e0 .OR. gdept_0(jk) <  0.e0 )   CALL ctl_stop( ' gdepw or gdept < 0 ' ) 
     277         IF( e3w_0  (jk) <= 0._wp .OR. e3t_0  (jk) <= 0._wp )   CALL ctl_stop( 'dom:zgr_z: e3w or e3t =< 0 '    ) 
     278         IF( gdepw_0(jk) <  0._wp .OR. gdept_0(jk) <  0._wp )   CALL ctl_stop( 'dom:zgr_z: gdepw or gdept < 0 ' ) 
    260279      END DO 
    261280      ! 
     
    289308      !!      ntopo= 1 :   mbathy is read in 'bathy_level.nc' NetCDF file 
    290309      !!                   bathy  is read in 'bathy_meter.nc' NetCDF file 
    291       !!      C A U T I O N : mbathy will be modified during the initializa- 
    292       !!      tion phase to become the number of non-zero w-levels of a water 
    293       !!      column, with a minimum value of 1. 
    294310      !! 
    295311      !! ** Action  : - mbathy: level bathymetry (in level index) 
    296312      !!              - bathy : meter bathymetry (in meters) 
    297313      !!---------------------------------------------------------------------- 
    298       USE iom 
    299       !! 
    300314      INTEGER  ::   ji, jj, jl, jk            ! dummy loop indices 
    301315      INTEGER  ::   inum                      ! temporary logical unit 
    302316      INTEGER  ::   ii_bump, ij_bump, ih      ! bump center position 
    303       INTEGER  ::   ii0, ii1, ij0, ij1        ! indices 
     317      INTEGER  ::   ii0, ii1, ij0, ij1, ik    ! local indices 
    304318      REAL(wp) ::   r_bump , h_bump , h_oce   ! bump characteristics  
    305       REAL(wp) ::   zi     , zj     , zh      ! temporary scalars 
     319      REAL(wp) ::   zi, zj, zh, zhmin         ! local scalars 
    306320      INTEGER , DIMENSION(jpidta,jpjdta) ::   idta   ! global domain integer data 
    307321      REAL(wp), DIMENSION(jpidta,jpjdta) ::   zdta   ! global domain scalar data 
     
    328342            ii_bump = jpidta / 2                           ! i-index of the bump center 
    329343            ij_bump = jpjdta / 2                           ! j-index of the bump center 
    330             r_bump  = 50000.e0                             ! bump radius (meters)        
    331             h_bump  = 2700.e0                              ! bump height (meters) 
     344            r_bump  = 50000._wp                            ! bump radius (meters)        
     345            h_bump  =  2700._wp                            ! bump height (meters) 
    332346            h_oce   = gdepw_0(jpk)                         ! background ocean depth (meters) 
    333347            IF(lwp) WRITE(numout,*) '            bump characteristics: ' 
     
    350364               idta(:,:) = jpkm1 
    351365               DO jk = 1, jpkm1 
    352                   DO jj = 1, jpjdta 
    353                      DO ji = 1, jpidta 
    354                         IF( gdept_0(jk) < zdta(ji,jj) .AND. zdta(ji,jj) <= gdept_0(jk+1) )   idta(ji,jj) = jk 
    355                      END DO 
    356                   END DO 
     366                  WHERE( gdept_0(jk) < zdta(:,:) .AND. zdta(:,:) <= gdept_0(jk+1) )   idta(:,:) = jk 
    357367               END DO 
    358368            ENDIF 
     
    361371         !                                            ! Caution : idta on the global domain: use of jperio, not nperio 
    362372         IF( jperio == 1 .OR. jperio == 4 .OR. jperio == 6 ) THEN 
    363             idta( :    , 1    ) = -1                ;      zdta( :    , 1    ) = -1.e0 
    364             idta( :    ,jpjdta) =  0                ;      zdta( :    ,jpjdta) =  0.e0 
     373            idta( :    , 1    ) = -1                ;      zdta( :    , 1    ) = -1._wp 
     374            idta( :    ,jpjdta) =  0                ;      zdta( :    ,jpjdta) =  0._wp 
    365375         ELSEIF( jperio == 2 ) THEN 
    366376            idta( :    , 1    ) = idta( : ,  3  )   ;      zdta( :    , 1    ) = zdta( : ,  3  ) 
    367             idta( :    ,jpjdta) = 0                 ;      zdta( :    ,jpjdta) =  0.e0 
    368             idta( 1    , :    ) = 0                 ;      zdta( 1    , :    ) =  0.e0 
    369             idta(jpidta, :    ) = 0                 ;      zdta(jpidta, :    ) =  0.e0 
     377            idta( :    ,jpjdta) = 0                 ;      zdta( :    ,jpjdta) =  0._wp 
     378            idta( 1    , :    ) = 0                 ;      zdta( 1    , :    ) =  0._wp 
     379            idta(jpidta, :    ) = 0                 ;      zdta(jpidta, :    ) =  0._wp 
    370380         ELSE 
    371             ih = 0                                  ;      zh = 0.e0 
     381            ih = 0                                  ;      zh = 0._wp 
    372382            IF( ln_sco )   ih = jpkm1               ;      IF( ln_sco )   zh = h_oce 
    373383            idta( :    , 1    ) = ih                ;      zdta( :    , 1    ) =  zh 
     
    379389         !                                            ! local domain level and meter bathymetries (mbathy,bathy) 
    380390         mbathy(:,:) = 0                                   ! set to zero extra halo points 
    381          bathy (:,:) = 0.e0                                ! (require for mpp case) 
     391         bathy (:,:) = 0._wp                               ! (require for mpp case) 
    382392         DO jj = 1, nlcj                                   ! interior values 
    383393            DO ji = 1, nlci 
     
    392402         ! 
    393403         IF( ln_zco )   THEN                          ! zco : read level bathymetry  
    394             CALL iom_open( 'bathy_level.nc', inum )   
    395             CALL iom_get ( inum, jpdom_data, 'Bathy_level', bathy ) 
    396             CALL iom_close (inum) 
     404            CALL iom_open ( 'bathy_level.nc', inum )   
     405            CALL iom_get  ( inum, jpdom_data, 'Bathy_level', bathy ) 
     406            CALL iom_close( inum ) 
    397407            mbathy(:,:) = INT( bathy(:,:) ) 
    398408            !                                                ! ===================== 
    399409            IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN    ! ORCA R2 configuration 
    400410               !                                             ! ===================== 
    401                IF( n_cla == 0 ) THEN 
    402                   ! 
     411               IF( nn_cla == 0 ) THEN 
    403412                  ii0 = 140   ;   ii1 = 140                  ! Gibraltar Strait open  
    404413                  ij0 = 102   ;   ij1 = 102                  ! (Thomson, Ocean Modelling, 1995) 
     
    409418                  END DO 
    410419                  IF(lwp) WRITE(numout,*) 
    411                   IF(lwp) WRITE(numout,*) '             orca_r2: Gibraltar strait open at i=',ii0,' j=',ij0 
     420                  IF(lwp) WRITE(numout,*) '      orca_r2: Gibraltar strait open at i=',ii0,' j=',ij0 
    412421                  ! 
    413422                  ii0 = 160   ;   ii1 = 160                  ! Bab el mandeb Strait open 
     
    419428                  END DO 
    420429                  IF(lwp) WRITE(numout,*) 
    421                   IF(lwp) WRITE(numout,*) '             orca_r2: Bab el Mandeb strait open at i=',ii0,' j=',ij0 
    422                   ! 
     430                  IF(lwp) WRITE(numout,*) '      orca_r2: Bab el Mandeb strait open at i=',ii0,' j=',ij0 
    423431               ENDIF 
    424432               ! 
     
    427435         ENDIF 
    428436         IF( ln_zps .OR. ln_sco )   THEN              ! zps or sco : read meter bathymetry 
    429             CALL iom_open( 'bathy_meter.nc', inum )  
    430             CALL iom_get ( inum, jpdom_data, 'Bathymetry', bathy ) 
    431             CALL iom_close (inum) 
     437            CALL iom_open ( 'bathy_meter.nc', inum )  
     438            CALL iom_get  ( inum, jpdom_data, 'Bathymetry', bathy ) 
     439            CALL iom_close( inum ) 
    432440            !                                                ! ===================== 
    433            IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN    ! ORCA R2 configuration 
    434               !                                             ! ===================== 
    435               IF( n_cla == 0 ) THEN 
    436                  ! 
    437                  ii0 = 140   ;   ii1 = 140                  ! Gibraltar Strait open  
    438                  ij0 = 102   ;   ij1 = 102                  ! (Thomson, Ocean Modelling, 1995) 
     441            IF( cp_cfg == "orca" .AND. jp_cfg == 1 ) THEN    ! ORCA R1 configuration 
     442               ii0 = 142   ;   ii1 = 142                     ! ===================== 
     443               ij0 =  51   ;   ij1 =  53                      
     444               DO ji = mi0(ii0), mi1(ii1)                    ! Close Halmera Strait 
     445                  DO jj = mj0(ij0), mj1(ij1) 
     446                     bathy(ji,jj) = 0._wp 
     447                  END DO 
     448               END DO 
     449               IF(lwp) WRITE(numout,*) 
     450               IF(lwp) WRITE(numout,*) '      orca_r1: Halmera strait closed at i=',ii0,' j=',ij0,'->',ij1 
     451            ENDIF 
     452            !                                                ! ===================== 
     453            IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN    ! ORCA R2 configuration 
     454               !                                             ! ===================== 
     455              IF( nn_cla == 0 ) THEN 
     456                 ii0 = 140   ;   ii1 = 140                   ! Gibraltar Strait open  
     457                 ij0 = 102   ;   ij1 = 102                   ! (Thomson, Ocean Modelling, 1995) 
    439458                 DO ji = mi0(ii0), mi1(ii1) 
    440459                    DO jj = mj0(ij0), mj1(ij1) 
    441                        bathy(ji,jj) = 284.e0 
     460                       bathy(ji,jj) = 284._wp 
    442461                    END DO 
    443462                 END DO 
    444463                 IF(lwp) WRITE(numout,*) 
    445                  IF(lwp) WRITE(numout,*) '             orca_r2: Gibraltar strait open at i=',ii0,' j=',ij0 
     464                 IF(lwp) WRITE(numout,*) '      orca_r2: Gibraltar strait open at i=',ii0,' j=',ij0 
    446465                 ! 
    447                  ii0 = 160   ;   ii1 = 160                  ! Bab el mandeb Strait open 
    448                  ij0 = 88    ;   ij1 = 88                   ! (Thomson, Ocean Modelling, 1995) 
     466                 ii0 = 160   ;   ii1 = 160                   ! Bab el mandeb Strait open 
     467                 ij0 = 88    ;   ij1 = 88                    ! (Thomson, Ocean Modelling, 1995) 
    449468                 DO ji = mi0(ii0), mi1(ii1) 
    450469                    DO jj = mj0(ij0), mj1(ij1) 
    451                        bathy(ji,jj) = 137.e0 
     470                       bathy(ji,jj) = 137._wp 
    452471                    END DO 
    453472                 END DO 
    454473                 IF(lwp) WRITE(numout,*) 
    455474                 IF(lwp) WRITE(numout,*) '             orca_r2: Bab el Mandeb strait open at i=',ii0,' j=',ij0 
    456                  ! 
    457475              ENDIF 
    458476              ! 
     
    473491               DO ji = ncsi1(jl), ncsi2(jl) 
    474492                  mbathy(ji,jj) = 0                   ! suppress closed seas and lakes from bathymetry 
    475                   bathy (ji,jj) = 0.e0                 
     493                  bathy (ji,jj) = 0._wp                
    476494               END DO 
    477495            END DO 
    478496         END DO 
    479497      ENDIF 
    480 #if defined key_orca_lev10 
    481       !                                               ! ================= ! 
    482       mbathy(:,:) = 10 * mbathy(:,:)                  !   key_orca_lev10  ! 
    483       !                                               ! ================= ! 
    484       IF( ln_zps .OR. ln_sco )   CALL ctl_stop( ' CAUTION: 300 levels only with level bathymetry' ) 
    485 #endif 
    486       !                          
     498      ! 
     499      !                                               ! =========================== ! 
     500      !                                               !     set a minimum depth     ! 
     501      !                                               ! =========================== ! 
     502      IF( rn_hmin < 0._wp ) THEN    ;   ik = INT( rn_hmin ) + 1                                    ! from a nb of level 
     503      ELSE                          ;   ik = MINLOC( gdepw_0, mask = gdepw_0 > rn_hmin, dim = 1 )  ! from a depth 
     504      ENDIF 
     505      zhmin = gdepw_0(ik+1)                                                         ! minimum depth = ik+1 w-levels  
     506      WHERE( bathy(:,:) <= 0._wp )   ;   bathy(:,:) = 0._wp                         ! min=0     over the lands 
     507      ELSE WHERE                     ;   bathy(:,:) = MIN(  zhmin , bathy(:,:)  )   ! min=zhmin over the oceans 
     508      END WHERE 
     509      IF(lwp) write(numout,*) 'Minimum ocean depth: ', zhmin, ' minimum number of ocean levels : ', ik 
     510      ! 
    487511   END SUBROUTINE zgr_bat 
    488512 
     
    601625      IF( lk_mpp ) THEN 
    602626         zbathy(:,:) = FLOAT( mbathy(:,:) ) 
    603          CALL lbc_lnk( zbathy, 'T', 1. ) 
     627         CALL lbc_lnk( zbathy, 'T', 1._wp ) 
    604628         mbathy(:,:) = INT( zbathy(:,:) ) 
    605629      ENDIF 
     
    641665         !   ... mono- or macro-tasking: T-point, >0, 2D array, no slab 
    642666         zbathy(:,:) = FLOAT( mbathy(:,:) ) 
    643          CALL lbc_lnk( zbathy, 'T', 1. ) 
     667         CALL lbc_lnk( zbathy, 'T', 1._wp ) 
    644668         mbathy(:,:) = INT( zbathy(:,:) ) 
    645669      ENDIF 
     
    672696 
    673697 
     698   SUBROUTINE zgr_bot_level 
     699      !!---------------------------------------------------------------------- 
     700      !!                    ***  ROUTINE zgr_bot_level  *** 
     701      !! 
     702      !! ** Purpose :   defines the vertical index of ocean bottom (mbk. arrays) 
     703      !! 
     704      !! ** Method  :   computes from mbathy with a minimum value of 1 over land 
     705      !! 
     706      !! ** Action  :   mbkt, mbku, mbkv :   vertical indices of the deeptest  
     707      !!                                     ocean level at t-, u- & v-points 
     708      !!                                     (min value = 1 over land) 
     709      !!---------------------------------------------------------------------- 
     710      INTEGER ::   ji, jj   ! dummy loop indices 
     711      REAL(wp), DIMENSION(jpi,jpj) ::   zmbk   ! 2D workspace  
     712      !!---------------------------------------------------------------------- 
     713      ! 
     714      IF(lwp) WRITE(numout,*) 
     715      IF(lwp) WRITE(numout,*) '    zgr_bot_level : ocean bottom k-index of T-, U-, V- and W-levels ' 
     716      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~~~' 
     717      ! 
     718      mbkt(:,:) = MAX( mbathy(:,:) , 1 )    ! bottom k-index of T-level (=1 over land) 
     719      !                                     ! bottom k-index of W-level = mbkt+1 
     720      DO jj = 1, jpjm1                      ! bottom k-index of u- (v-) level 
     721         DO ji = 1, jpim1 
     722            mbku(ji,jj) = MIN(  mbkt(ji+1,jj  ) , mbkt(ji,jj)  ) 
     723            mbkv(ji,jj) = MIN(  mbkt(ji  ,jj+1) , mbkt(ji,jj)  ) 
     724         END DO 
     725      END DO 
     726      ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk  
     727      zmbk(:,:) = REAL( mbku(:,:), wp )   ;   CALL lbc_lnk(zmbk,'U',1.)   ;   mbku  (:,:) = MAX( INT( zmbk(:,:) ), 1 ) 
     728      zmbk(:,:) = REAL( mbkv(:,:), wp )   ;   CALL lbc_lnk(zmbk,'V',1.)   ;   mbkv  (:,:) = MAX( INT( zmbk(:,:) ), 1 ) 
     729      ! 
     730   END SUBROUTINE zgr_bot_level 
     731 
     732 
    674733   SUBROUTINE zgr_zco 
    675734      !!---------------------------------------------------------------------- 
     
    678737      !! ** Purpose :   define the z-coordinate system 
    679738      !! 
    680       !! ** Method  :   set 3D coord. arrays to reference 1D array if lk_zco=T 
     739      !! ** Method  :   set 3D coord. arrays to reference 1D array  
    681740      !!---------------------------------------------------------------------- 
    682741      INTEGER  ::   jk 
    683742      !!---------------------------------------------------------------------- 
    684743      ! 
    685       IF( .NOT.lk_zco ) THEN 
    686          DO jk = 1, jpk 
    687             fsdept(:,:,jk) = gdept_0(jk) 
    688             fsdepw(:,:,jk) = gdepw_0(jk) 
    689             fsde3w(:,:,jk) = gdepw_0(jk) 
    690             fse3t (:,:,jk) = e3t_0(jk) 
    691             fse3u (:,:,jk) = e3t_0(jk) 
    692             fse3v (:,:,jk) = e3t_0(jk) 
    693             fse3f (:,:,jk) = e3t_0(jk) 
    694             fse3w (:,:,jk) = e3w_0(jk) 
    695             fse3uw(:,:,jk) = e3w_0(jk) 
    696             fse3vw(:,:,jk) = e3w_0(jk) 
    697          END DO 
    698       ENDIF 
     744      DO jk = 1, jpk 
     745         fsdept(:,:,jk) = gdept_0(jk) 
     746         fsdepw(:,:,jk) = gdepw_0(jk) 
     747         fsde3w(:,:,jk) = gdepw_0(jk) 
     748         fse3t (:,:,jk) = e3t_0(jk) 
     749         fse3u (:,:,jk) = e3t_0(jk) 
     750         fse3v (:,:,jk) = e3t_0(jk) 
     751         fse3f (:,:,jk) = e3t_0(jk) 
     752         fse3w (:,:,jk) = e3w_0(jk) 
     753         fse3uw(:,:,jk) = e3w_0(jk) 
     754         fse3vw(:,:,jk) = e3w_0(jk) 
     755      END DO 
    699756      ! 
    700757   END SUBROUTINE zgr_zco 
    701758 
    702 #if defined key_zco 
    703    !!---------------------------------------------------------------------- 
    704    !!   'key_zco' :                                              "pure" zco (gdep & e3 are 1D arrays) 
    705    !!---------------------------------------------------------------------- 
    706    SUBROUTINE zgr_zps      ! Empty routine 
    707    END SUBROUTINE zgr_zps 
    708    SUBROUTINE zgr_sco      ! Empty routine 
    709    END SUBROUTINE zgr_sco 
    710  
    711 #else 
    712    !!---------------------------------------------------------------------- 
    713    !!   Default option :                      zco, zps and/or sco available (gedp & e3 are 3D arrays) 
    714    !!---------------------------------------------------------------------- 
    715759 
    716760   SUBROUTINE zgr_zps 
     
    764808      REAL(wp) ::   ze3tp , ze3wp    ! Last ocean level thickness at T- and W-points 
    765809      REAL(wp) ::   zdepwp, zdepth   ! Ajusted ocean depth to avoid too small e3t 
    766       REAL(wp) ::   zmax, zmin       ! Maximum and minimum depth 
     810      REAL(wp) ::   zmax             ! Maximum depth 
    767811      REAL(wp) ::   zdiff            ! temporary scalar 
     812      REAL(wp) ::   zrefdep          ! temporary scalar 
    768813      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zprt   ! 3D workspace 
    769814      !!--------------------------------------------------------------------- 
     
    774819      IF(lwp) WRITE(numout,*) '              mbathy is recomputed : bathy_level file is NOT used' 
    775820 
    776       ll_print=.FALSE.                     ! Local variable for debugging 
    777 !!    ll_print=.TRUE. 
     821      ll_print = .FALSE.                   ! Local variable for debugging 
     822!!    ll_print = .TRUE. 
    778823       
    779824      IF(lwp .AND. ll_print) THEN          ! control print of the ocean depth 
     
    786831      ! bathymetry in level (from bathy_meter) 
    787832      ! =================== 
    788       zmax = gdepw_0(jpk) + e3t_0(jpk)     ! maximum depth (i.e. the last ocean level thickness <= 2*e3t_0(jpkm1) ) 
    789       zmin = gdepw_0(4)                    ! minimum depth = 3 levels 
    790  
    791       mbathy(:,:) = jpkm1                  ! initialize mbathy to the maximum ocean level available 
    792  
    793       !                                    ! storage of land and island's number (zera and negative values) in mbathy 
    794       WHERE( bathy(:,:) <= 0. )   mbathy(:,:) = INT( bathy(:,:) ) 
    795  
    796       ! bounded value of bathy 
    797 !!gm  bathy(:,:) = MIN(  zmax,  MAX( bathy(:,:), zmin )  )     !!gm : simpler   as zmin is > 0 
    798       DO jj = 1, jpj 
    799          DO ji= 1, jpi 
    800             IF( bathy(ji,jj) <= 0. ) THEN   ;   bathy(ji,jj) = 0.e0 
    801             ELSE                            ;   bathy(ji,jj) = MIN(  zmax,  MAX( bathy(ji,jj), zmin )  ) 
    802             ENDIF 
    803          END DO 
    804       END DO 
     833      zmax = gdepw_0(jpk) + e3t_0(jpk)          ! maximum depth (i.e. the last ocean level thickness <= 2*e3t_0(jpkm1) ) 
     834      bathy(:,:) = MIN( zmax ,  bathy(:,:) )    ! bounded value of bathy (min already set at the end of zgr_bat) 
     835      WHERE( bathy(:,:) == 0._wp )   ;   mbathy(:,:) = 0       ! land  : set mbathy to 0 
     836      ELSE WHERE                     ;   mbathy(:,:) = jpkm1   ! ocean : initialize mbathy to the max ocean level 
     837      END WHERE 
    805838 
    806839      ! Compute mbathy for ocean points (i.e. the number of ocean levels) 
     
    810843      DO jk = jpkm1, 1, -1 
    811844         zdepth = gdepw_0(jk) + MIN( e3zps_min, e3t_0(jk)*e3zps_rat ) 
    812          DO jj = 1, jpj 
    813             DO ji = 1, jpi 
    814                IF( 0. < bathy(ji,jj) .AND. bathy(ji,jj) <= zdepth )   mbathy(ji,jj) = jk-1 
    815             END DO 
    816          END DO 
     845         WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth )   mbathy(:,:) = jk-1 
    817846      END DO 
    818847 
     
    824853         e3w  (:,:,jk) = e3w_0  (jk) 
    825854      END DO 
    826       hdept(:,:) = gdept(:,:,2 ) 
    827       hdepw(:,:) = gdepw(:,:,3 )      
    828855      !  
    829856      DO jj = 1, jpj 
     
    835862                  zdepwp = bathy(ji,jj) 
    836863                  ze3tp  = bathy(ji,jj) - gdepw_0(ik) 
    837                   ze3wp = 0.5 * e3w_0(ik) * ( 1. + ( ze3tp/e3t_0(ik) ) ) 
     864                  ze3wp = 0.5_wp * e3w_0(ik) * ( 1._wp + ( ze3tp/e3t_0(ik) ) ) 
    838865                  e3t(ji,jj,ik  ) = ze3tp 
    839866                  e3t(ji,jj,ik+1) = ze3tp 
     
    855882                  e3t  (ji,jj,ik) = e3t_0  (ik) * ( gdepw  (ji,jj,ik+1) - gdepw_0(ik) )   &  
    856883                     &                          / ( gdepw_0(      ik+1) - gdepw_0(ik) )  
    857                   e3w  (ji,jj,ik) = 0.5 * ( gdepw(ji,jj,ik+1) + gdepw_0(ik+1) - 2.*gdepw_0(ik) )   & 
    858                      &                  * ( e3w_0(ik) / ( gdepw_0(ik+1) - gdepw_0(ik) ) ) 
     884                  e3w  (ji,jj,ik) = 0.5_wp * ( gdepw(ji,jj,ik+1) + gdepw_0(ik+1) - 2._wp * gdepw_0(ik) )   & 
     885                     &                     * ( e3w_0(ik) / ( gdepw_0(ik+1) - gdepw_0(ik) ) ) 
    859886                  !       ... on ik+1 
    860887                  e3w  (ji,jj,ik+1) = e3t  (ji,jj,ik) 
     
    871898            ik = mbathy(ji,jj) 
    872899            IF( ik > 0 ) THEN               ! ocean point only 
    873                hdept(ji,jj) = gdept(ji,jj,ik  ) 
    874                hdepw(ji,jj) = gdepw(ji,jj,ik+1) 
    875900               e3tp (ji,jj) = e3t(ji,jj,ik  ) 
    876901               e3wp (ji,jj) = e3w(ji,jj,ik  ) 
    877902               ! test 
    878903               zdiff= gdepw(ji,jj,ik+1) - gdept(ji,jj,ik  ) 
    879                IF( zdiff <= 0. .AND. lwp ) THEN  
     904               IF( zdiff <= 0._wp .AND. lwp ) THEN  
    880905                  it = it + 1 
    881906                  WRITE(numout,*) ' it      = ', it, ' ik      = ', ik, ' (i,j) = ', ji, jj 
     
    890915      ! Scale factors and depth at U-, V-, UW and VW-points 
    891916      DO jk = 1, jpk                        ! initialisation to z-scale factors 
    892          e3u (:,:,jk)  = e3t_0(jk) 
    893          e3v (:,:,jk)  = e3t_0(jk) 
    894          e3uw(:,:,jk)  = e3w_0(jk) 
    895          e3vw(:,:,jk)  = e3w_0(jk) 
     917         e3u (:,:,jk) = e3t_0(jk) 
     918         e3v (:,:,jk) = e3t_0(jk) 
     919         e3uw(:,:,jk) = e3w_0(jk) 
     920         e3vw(:,:,jk) = e3w_0(jk) 
    896921      END DO 
    897922      DO jk = 1,jpk                         ! Computed as the minimum of neighbooring scale factors 
    898923         DO jj = 1, jpjm1 
    899924            DO ji = 1, fs_jpim1   ! vector opt. 
    900                e3u (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji+1,jj,jk)) 
    901                e3v (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji,jj+1,jk)) 
     925               e3u (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji+1,jj,jk) ) 
     926               e3v (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji,jj+1,jk) ) 
    902927               e3uw(ji,jj,jk) = MIN( e3w(ji,jj,jk), e3w(ji+1,jj,jk) ) 
    903928               e3vw(ji,jj,jk) = MIN( e3w(ji,jj,jk), e3w(ji,jj+1,jk) ) 
     
    905930         END DO 
    906931      END DO 
    907       !                                     ! Boundary conditions 
    908       CALL lbc_lnk( e3u , 'U', 1. )   ;   CALL lbc_lnk( e3uw, 'U', 1. ) 
    909       CALL lbc_lnk( e3v , 'V', 1. )   ;   CALL lbc_lnk( e3vw, 'V', 1. ) 
     932      CALL lbc_lnk( e3u , 'U', 1._wp )   ;   CALL lbc_lnk( e3uw, 'U', 1._wp )   ! lateral boundary conditions 
     933      CALL lbc_lnk( e3v , 'V', 1._wp )   ;   CALL lbc_lnk( e3vw, 'V', 1._wp ) 
    910934      ! 
    911935      DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries) 
    912          WHERE( e3u (:,:,jk) == 0.e0 )   e3u (:,:,jk) = e3t_0(jk) 
    913          WHERE( e3v (:,:,jk) == 0.e0 )   e3v (:,:,jk) = e3t_0(jk) 
    914          WHERE( e3uw(:,:,jk) == 0.e0 )   e3uw(:,:,jk) = e3w_0(jk) 
    915          WHERE( e3vw(:,:,jk) == 0.e0 )   e3vw(:,:,jk) = e3w_0(jk) 
     936         WHERE( e3u (:,:,jk) == 0._wp )   e3u (:,:,jk) = e3t_0(jk) 
     937         WHERE( e3v (:,:,jk) == 0._wp )   e3v (:,:,jk) = e3t_0(jk) 
     938         WHERE( e3uw(:,:,jk) == 0._wp )   e3uw(:,:,jk) = e3w_0(jk) 
     939         WHERE( e3vw(:,:,jk) == 0._wp )   e3vw(:,:,jk) = e3w_0(jk) 
    916940      END DO 
    917941       
    918942      ! Scale factor at F-point 
    919943      DO jk = 1, jpk                        ! initialisation to z-scale factors 
    920          e3f (:,:,jk) = e3t_0(jk) 
     944         e3f(:,:,jk) = e3t_0(jk) 
    921945      END DO 
    922946      DO jk = 1, jpk                        ! Computed as the minimum of neighbooring V-scale factors 
     
    927951         END DO 
    928952      END DO 
    929       CALL lbc_lnk( e3f, 'F', 1. )          ! Boundary conditions 
     953      CALL lbc_lnk( e3f, 'F', 1._wp )       ! Lateral boundary conditions 
    930954      ! 
    931955      DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries) 
    932          WHERE( e3f(:,:,jk) == 0.e0 )   e3f(:,:,jk) = e3t_0(jk) 
     956         WHERE( e3f(:,:,jk) == 0._wp )   e3f(:,:,jk) = e3t_0(jk) 
    933957      END DO 
    934958!!gm  bug ? :  must be a do loop with mj0,mj1 
     
    941965 
    942966      ! Control of the sign 
    943       IF( MINVAL( e3t  (:,:,:) ) <= 0.e0 )   CALL ctl_stop( '    zgr_zps :   e r r o r   e3t   <= 0' ) 
    944       IF( MINVAL( e3w  (:,:,:) ) <= 0.e0 )   CALL ctl_stop( '    zgr_zps :   e r r o r   e3w   <= 0' ) 
    945       IF( MINVAL( gdept(:,:,:) ) <  0.e0 )   CALL ctl_stop( '    zgr_zps :   e r r o r   gdepw <  0' ) 
    946       IF( MINVAL( gdepw(:,:,:) ) <  0.e0 )   CALL ctl_stop( '    zgr_zps :   e r r o r   gdepw <  0' ) 
     967      IF( MINVAL( e3t  (:,:,:) ) <= 0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   e3t   <= 0' ) 
     968      IF( MINVAL( e3w  (:,:,:) ) <= 0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   e3w   <= 0' ) 
     969      IF( MINVAL( gdept(:,:,:) ) <  0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   gdepw <  0' ) 
     970      IF( MINVAL( gdepw(:,:,:) ) <  0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   gdepw <  0' ) 
    947971      
    948972      ! Compute gdep3w (vertical sum of e3w) 
    949       gdep3w(:,:,1) = 0.5 * e3w(:,:,1) 
     973      gdep3w(:,:,1) = 0.5_wp * e3w(:,:,1) 
    950974      DO jk = 2, jpk 
    951975         gdep3w(:,:,jk) = gdep3w(:,:,jk-1) + e3w(:,:,jk)  
    952976      END DO 
    953            
     977         
    954978      !                                               ! ================= ! 
    955979      IF(lwp .AND. ll_print) THEN                     !   Control print   ! 
     
    9791003         WRITE(numout,*) 'domzgr gdep3w(mbathy)'   ;   CALL prihre(zprt(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout) 
    9801004      ENDIF   
    981       !                                      
     1005      ! 
    9821006   END SUBROUTINE zgr_zps 
    9831007 
     
    9931017      !!                T-points at integer values (between 1 and jpk) 
    9941018      !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
    995       !! 
    996       !! Reference  :   ??? 
    997       !!---------------------------------------------------------------------- 
    998       REAL(wp), INTENT(in   ) ::   pk   ! continuous "k" coordinate 
    999       REAL(wp)                ::   pf   ! sigma value 
    1000       !!---------------------------------------------------------------------- 
    1001       ! 
    1002       pf =   (   TANH( rn_theta * ( -(pk-0.5) / REAL(jpkm1) + rn_thetb )  )      & 
     1019      !!---------------------------------------------------------------------- 
     1020      REAL(wp), INTENT(in) ::   pk   ! continuous "k" coordinate 
     1021      REAL(wp)             ::   pf   ! sigma value 
     1022      !!---------------------------------------------------------------------- 
     1023      ! 
     1024      pf =   (   TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1) + rn_thetb )  )   & 
    10031025         &     - TANH( rn_thetb * rn_theta                                )  )   & 
    1004          & * (   COSH( rn_theta                           )                   & 
    1005          &     + COSH( rn_theta * ( 2.e0 * rn_thetb - 1.e0 ) )  )                & 
    1006          & / ( 2.e0 * SINH( rn_theta ) ) 
     1026         & * (   COSH( rn_theta                           )                      & 
     1027         &     + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) )  )              & 
     1028         & / ( 2._wp * SINH( rn_theta ) ) 
    10071029      ! 
    10081030   END FUNCTION fssig 
     
    10191041      !!                T-points at integer values (between 1 and jpk) 
    10201042      !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
    1021       !! 
    1022       !! Reference  :   ??? 
    1023       !!---------------------------------------------------------------------- 
    1024       REAL(wp), INTENT(in   ) ::   pk1   ! continuous "k" coordinate 
    1025       REAL(wp), INTENT(in   ) ::   pbb   ! Stretching coefficient 
    1026       REAL(wp)                ::   pf1   ! sigma value 
     1043      !!---------------------------------------------------------------------- 
     1044      REAL(wp), INTENT(in) ::   pk1   ! continuous "k" coordinate 
     1045      REAL(wp), INTENT(in) ::   pbb   ! Stretching coefficient 
     1046      REAL(wp)             ::   pf1   ! sigma value 
    10271047      !!---------------------------------------------------------------------- 
    10281048      ! 
    10291049      IF ( rn_theta == 0 ) then      ! uniform sigma 
    1030          pf1 = -(pk1-0.5) / REAL( jpkm1 ) 
     1050         pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1 ) 
    10311051      ELSE                        ! stretched sigma 
    1032          pf1 =   (1.0-pbb) * (sinh( rn_theta*(-(pk1-0.5)/REAL(jpkm1)) ) ) / sinh(rn_theta) + & 
    1033             &    pbb * ( (tanh( rn_theta*( (-(pk1-0.5)/REAL(jpkm1)) + 0.5) ) - tanh(0.5*rn_theta) ) / & 
    1034             &    (2*tanh(0.5*rn_theta) ) ) 
     1052         pf1 =   ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1)) ) ) / SINH( rn_theta )              & 
     1053            &  + pbb * (  (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta )  ) & 
     1054            &        / ( 2._wp * TANH( 0.5_wp * rn_theta ) ) ) 
    10351055      ENDIF 
    10361056      ! 
     
    11091129      ENDIF 
    11101130 
    1111       gsigw3  = 0.0d0   ;   gsigt3  = 0.0d0   ; gsi3w3 = 0.0d0 
    1112       esigt3  = 0.0d0   ;   esigw3  = 0.0d0  
    1113       esigtu3 = 0.0d0   ;   esigtv3 = 0.0d0   ; esigtf3 = 0.0d0 
    1114       esigwu3 = 0.0d0   ;   esigwv3 = 0.0d0 
     1131      gsigw3  = 0._wp   ;   gsigt3  = 0._wp   ;   gsi3w3  = 0._wp 
     1132      esigt3  = 0._wp   ;   esigw3  = 0._wp  
     1133      esigtu3 = 0._wp   ;   esigtv3 = 0._wp   ;   esigtf3 = 0._wp 
     1134      esigwu3 = 0._wp   ;   esigwv3 = 0._wp 
    11151135 
    11161136      hift(:,:) = rn_sbot_min                     ! set the minimum depth for the s-coordinate 
     
    11241144      DO jj = 1, jpj 
    11251145         DO ji = 1, jpi 
    1126            IF (bathy(ji,jj) .gt. 0.0) THEN 
     1146           IF( bathy(ji,jj) > 0._wp ) THEN 
    11271147              bathy(ji,jj) = MAX( rn_sbot_min, bathy(ji,jj) ) 
    11281148           ENDIF 
     
    11401160      !  
    11411161      ! Smooth the bathymetry (if required) 
    1142       scosrf(:,:) = 0.e0              ! ocean surface depth (here zero: no under ice-shelf sea) 
     1162      scosrf(:,:) = 0._wp             ! ocean surface depth (here zero: no under ice-shelf sea) 
    11431163      scobot(:,:) = bathy(:,:)        ! ocean bottom  depth 
    11441164      ! 
    11451165      jl = 0 
    1146       zrmax = 1.e0 
     1166      zrmax = 1._wp 
    11471167      !                                                     ! ================ ! 
    1148       DO WHILE ( jl <= 10000 .AND. zrmax > rn_rmax )          !  Iterative loop  ! 
     1168      DO WHILE( jl <= 10000 .AND. zrmax > rn_rmax )         !  Iterative loop  ! 
    11491169         !                                                  ! ================ ! 
    11501170         jl = jl + 1 
    1151          zrmax = 0.e0 
    1152          zmsk(:,:) = 0.e0 
     1171         zrmax = 0._wp 
     1172         zmsk(:,:) = 0._wp 
    11531173         DO jj = 1, nlcj 
    11541174            DO ji = 1, nlci 
     
    11581178               zrj(ji,jj) = ABS( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) ) 
    11591179               zrmax = MAX( zrmax, zri(ji,jj), zrj(ji,jj) ) 
    1160                IF( zri(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1.0 
    1161                IF( zri(ji,jj) > rn_rmax )   zmsk(iip1,jj  ) = 1.0 
    1162                IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1.0 
    1163                IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,ijp1) = 1.0 
     1180               IF( zri(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1._wp 
     1181               IF( zri(ji,jj) > rn_rmax )   zmsk(iip1,jj  ) = 1._wp 
     1182               IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1._wp 
     1183               IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,ijp1) = 1._wp 
    11641184            END DO 
    11651185         END DO 
    11661186         IF( lk_mpp )   CALL mpp_max( zrmax )   ! max over the global domain 
    11671187         ! lateral boundary condition on zmsk: keep 1 along closed boundary (use of MAX) 
    1168          ztmp(:,:) = zmsk(:,:)   ;   CALL lbc_lnk( zmsk, 'T', 1. ) 
     1188         ztmp(:,:) = zmsk(:,:)   ;   CALL lbc_lnk( zmsk, 'T', 1._wp ) 
    11691189         DO jj = 1, nlcj 
    11701190            DO ji = 1, nlci 
     
    11811201               iim1 = MAX( ji-1,  1  )      ! first line (ji=nlci) 
    11821202               ijm1 = MAX( jj-1,  1  )      ! first raw  (jj=nlcj) 
    1183                IF( zmsk(ji,jj) == 1.0 ) THEN 
     1203               IF( zmsk(ji,jj) == 1._wp ) THEN 
    11841204                  ztmp(ji,jj) =   (                                                                                   & 
    11851205             &      zenv(iim1,ijp1)*zmsk(iim1,ijp1) + zenv(ji,ijp1)*zmsk(ji,ijp1) + zenv(iip1,ijp1)*zmsk(iip1,ijp1)   & 
    1186              &    + zenv(iim1,jj  )*zmsk(iim1,jj  ) + zenv(ji,jj  )*    2.e0      + zenv(iip1,jj  )*zmsk(iip1,jj  )   & 
     1206             &    + zenv(iim1,jj  )*zmsk(iim1,jj  ) + zenv(ji,jj  )*    2._wp     + zenv(iip1,jj  )*zmsk(iip1,jj  )   & 
    11871207             &    + zenv(iim1,ijm1)*zmsk(iim1,ijm1) + zenv(ji,ijm1)*zmsk(ji,ijm1) + zenv(iip1,ijm1)*zmsk(iip1,ijm1)   & 
    11881208             &                    ) / (                                                                               & 
    11891209             &                      zmsk(iim1,ijp1) +               zmsk(ji,ijp1) +                 zmsk(iip1,ijp1)   & 
    1190              &    +                 zmsk(iim1,jj  ) +                   2.e0      +                 zmsk(iip1,jj  )   & 
     1210             &    +                 zmsk(iim1,jj  ) +                   2._wp     +                 zmsk(iip1,jj  )   & 
    11911211             &    +                 zmsk(iim1,ijm1) +               zmsk(ji,ijm1) +                 zmsk(iip1,ijm1)   & 
    11921212             &                        ) 
     
    11971217         DO jj = 1, nlcj 
    11981218            DO ji = 1, nlci 
    1199                IF( zmsk(ji,jj) == 1.0 )   zenv(ji,jj) = MAX( ztmp(ji,jj), bathy(ji,jj) ) 
     1219               IF( zmsk(ji,jj) == 1._wp )   zenv(ji,jj) = MAX( ztmp(ji,jj), bathy(ji,jj) ) 
    12001220            END DO 
    12011221         END DO 
    12021222         ! 
    12031223         ! Apply lateral boundary condition   CAUTION: kept the value when the lbc field is zero 
    1204          ztmp(:,:) = zenv(:,:)   ;   CALL lbc_lnk( zenv, 'T', 1. ) 
     1224         ztmp(:,:) = zenv(:,:)   ;   CALL lbc_lnk( zenv, 'T', 1._wp ) 
    12051225         DO jj = 1, nlcj 
    12061226            DO ji = 1, nlci 
    1207                IF( zenv(ji,jj) == 0.e0 )   zenv(ji,jj) = ztmp(ji,jj) 
     1227               IF( zenv(ji,jj) == 0._wp )   zenv(ji,jj) = ztmp(ji,jj) 
    12081228            END DO 
    12091229         END DO 
     
    12141234      !                                        ! envelop bathymetry saved in hbatt 
    12151235      hbatt(:,:) = zenv(:,:)  
    1216       IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0.e0 ) THEN 
     1236      IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0._wp ) THEN 
    12171237         CALL ctl_warn( ' s-coordinates are tapered in vicinity of the Equator' ) 
    12181238         DO jj = 1, jpj 
    12191239            DO ji = 1, jpi 
    1220                ztaper = EXP( -(gphit(ji,jj)/8)**2 ) 
    1221                hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * (1.-ztaper) 
     1240               ztaper = EXP( -(gphit(ji,jj)/8._wp)**2 ) 
     1241               hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * ( 1._wp - ztaper ) 
    12221242            END DO 
    12231243         END DO 
     
    12281248         WRITE(numout,*) ' domzgr: hbatt field; ocean depth in meters' 
    12291249         WRITE(numout,*) 
    1230          CALL prihre( hbatt(1,1), jpi, jpj, 1, jpi, 1, 1, jpj, 1, 0., numout ) 
     1250         CALL prihre( hbatt(1,1), jpi, jpj, 1, jpi, 1, 1, jpj, 1, 0._wp, numout ) 
    12311251         IF( nprint == 1 )   THEN         
    12321252            WRITE(numout,*) ' bathy  MAX ', MAXVAL( bathy(:,:) ), ' MIN ', MINVAL( bathy(:,:) ) 
     
    12471267      DO jj = 1, jpjm1 
    12481268        DO ji = 1, jpim1   ! NO vector opt. 
    1249            hbatu(ji,jj) = 0.5 * ( hbatt(ji  ,jj) + hbatt(ji+1,jj  ) ) 
    1250            hbatv(ji,jj) = 0.5 * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1) ) 
    1251            hbatf(ji,jj) = 0.25* ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1)   & 
    1252               &                 + hbatt(ji+1,jj) + hbatt(ji+1,jj+1) ) 
     1269           hbatu(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji+1,jj  ) ) 
     1270           hbatv(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1) ) 
     1271           hbatf(ji,jj) = 0.25_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1)   & 
     1272              &                     + hbatt(ji+1,jj) + hbatt(ji+1,jj+1) ) 
    12531273        END DO 
    12541274      END DO 
     
    12561276      ! Apply lateral boundary condition 
    12571277!!gm  ! CAUTION: retain non zero value in the initial file this should be OK for orca cfg, not for EEL 
    1258       zhbat(:,:) = hbatu(:,:)   ;   CALL lbc_lnk( hbatu, 'U', 1. ) 
     1278      zhbat(:,:) = hbatu(:,:)   ;   CALL lbc_lnk( hbatu, 'U', 1._wp ) 
    12591279      DO jj = 1, jpj 
    12601280         DO ji = 1, jpi 
    1261             IF( hbatu(ji,jj) == 0.e0 ) THEN 
    1262                IF( zhbat(ji,jj) == 0.e0 )   hbatu(ji,jj) = rn_sbot_min 
    1263                IF( zhbat(ji,jj) /= 0.e0 )   hbatu(ji,jj) = zhbat(ji,jj) 
     1281            IF( hbatu(ji,jj) == 0._wp ) THEN 
     1282               IF( zhbat(ji,jj) == 0._wp )   hbatu(ji,jj) = rn_sbot_min 
     1283               IF( zhbat(ji,jj) /= 0._wp )   hbatu(ji,jj) = zhbat(ji,jj) 
    12641284            ENDIF 
    12651285         END DO 
    12661286      END DO 
    1267       zhbat(:,:) = hbatv(:,:)   ;   CALL lbc_lnk( hbatv, 'V', 1. ) 
     1287      zhbat(:,:) = hbatv(:,:)   ;   CALL lbc_lnk( hbatv, 'V', 1._wp ) 
    12681288      DO jj = 1, jpj 
    12691289         DO ji = 1, jpi 
    1270             IF( hbatv(ji,jj) == 0.e0 ) THEN 
    1271                IF( zhbat(ji,jj) == 0.e0 )   hbatv(ji,jj) = rn_sbot_min 
    1272                IF( zhbat(ji,jj) /= 0.e0 )   hbatv(ji,jj) = zhbat(ji,jj) 
     1290            IF( hbatv(ji,jj) == 0._wp ) THEN 
     1291               IF( zhbat(ji,jj) == 0._wp )   hbatv(ji,jj) = rn_sbot_min 
     1292               IF( zhbat(ji,jj) /= 0._wp )   hbatv(ji,jj) = zhbat(ji,jj) 
    12731293            ENDIF 
    12741294         END DO 
    12751295      END DO 
    1276       zhbat(:,:) = hbatf(:,:)   ;   CALL lbc_lnk( hbatf, 'F', 1. ) 
     1296      zhbat(:,:) = hbatf(:,:)   ;   CALL lbc_lnk( hbatf, 'F', 1._wp ) 
    12771297      DO jj = 1, jpj 
    12781298         DO ji = 1, jpi 
    1279             IF( hbatf(ji,jj) == 0.e0 ) THEN 
    1280                IF( zhbat(ji,jj) == 0.e0 )   hbatf(ji,jj) = rn_sbot_min 
    1281                IF( zhbat(ji,jj) /= 0.e0 )   hbatf(ji,jj) = zhbat(ji,jj) 
     1299            IF( hbatf(ji,jj) == 0._wp ) THEN 
     1300               IF( zhbat(ji,jj) == 0._wp )   hbatf(ji,jj) = rn_sbot_min 
     1301               IF( zhbat(ji,jj) /= 0._wp )   hbatf(ji,jj) = zhbat(ji,jj) 
    12821302            ENDIF 
    12831303         END DO 
     
    13131333            DO jj = 1, jpj 
    13141334 
    1315              IF (hbatt(ji,jj).GT.rn_hc) THEN !deep water, stretched sigma 
     1335               IF( hbatt(ji,jj) > rn_hc ) THEN    !deep water, stretched sigma 
     1336                  DO jk = 1, jpk 
     1337                     gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb ) 
     1338                     gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp)       , rn_bb ) 
     1339                  END DO 
     1340               ELSE ! shallow water, uniform sigma 
     1341                  DO jk = 1, jpk 
     1342                     gsigw3(ji,jj,jk) =   REAL(jk-1,wp)            / REAL(jpk-1,wp) 
     1343                     gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(jpk-1,wp) 
     1344                  END DO 
     1345               ENDIF 
     1346               IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'gsigw3 1 jpk    ', gsigw3(ji,jj,1), gsigw3(ji,jj,jpk) 
     1347               ! 
     1348               DO jk = 1, jpkm1 
     1349                  esigt3(ji,jj,jk  ) = gsigw3(ji,jj,jk+1) - gsigw3(ji,jj,jk) 
     1350                  esigw3(ji,jj,jk+1) = gsigt3(ji,jj,jk+1) - gsigt3(ji,jj,jk) 
     1351               END DO 
     1352               esigw3(ji,jj,1  ) = 2._wp * ( gsigt3(ji,jj,1  ) - gsigw3(ji,jj,1  ) ) 
     1353               esigt3(ji,jj,jpk) = 2._wp * ( gsigt3(ji,jj,jpk) - gsigw3(ji,jj,jpk) ) 
     1354               ! 
     1355               ! Coefficients for vertical depth as the sum of e3w scale factors 
     1356               gsi3w3(ji,jj,1) = 0.5_wp * esigw3(ji,jj,1) 
     1357               DO jk = 2, jpk 
     1358                  gsi3w3(ji,jj,jk) = gsi3w3(ji,jj,jk-1) + esigw3(ji,jj,jk) 
     1359               END DO 
     1360               ! 
    13161361               DO jk = 1, jpk 
    1317                   gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb ) 
    1318                   gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp)       , rn_bb ) 
     1362                  zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 
     1363                  zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 
     1364                  gdept (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsigt3(ji,jj,jk)+rn_hc*zcoeft ) 
     1365                  gdepw (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsigw3(ji,jj,jk)+rn_hc*zcoefw ) 
     1366                  gdep3w(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsi3w3(ji,jj,jk)+rn_hc*zcoeft ) 
    13191367               END DO 
    1320              ELSE ! shallow water, uniform sigma 
     1368               ! 
     1369            END DO   ! for all jj's 
     1370         END DO    ! for all ji's 
     1371 
     1372         DO ji = 1, jpi 
     1373            DO jj = 1, jpj 
    13211374               DO jk = 1, jpk 
    1322                  gsigw3(ji,jj,jk) =  REAL(jk-1,wp)     /REAL(jpk-1,wp) 
    1323                  gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5)/REAL(jpk-1,wp) 
     1375                  esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk) )   & 
     1376                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
     1377                  esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji,jj+1)*esigt3(ji,jj+1,jk) )   & 
     1378                     &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
     1379                  esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk)     & 
     1380                     &                + hbatt(ji,jj+1)*esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*esigt3(ji+1,jj+1,jk) )   & 
     1381                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 
     1382                  esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji+1,jj)*esigw3(ji+1,jj,jk) )   & 
     1383                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
     1384                  esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji,jj+1)*esigw3(ji,jj+1,jk) )   & 
     1385                     &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
     1386                  ! 
     1387                  e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/FLOAT(jpkm1) ) 
     1388                  e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/FLOAT(jpkm1) ) 
     1389                  e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/FLOAT(jpkm1) ) 
     1390                  e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/FLOAT(jpkm1) ) 
     1391                  ! 
     1392                  e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/FLOAT(jpkm1) ) 
     1393                  e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/FLOAT(jpkm1) ) 
     1394                  e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/FLOAT(jpkm1) ) 
    13241395               END DO 
    1325              ENDIF 
    1326              IF( nprint == 1 .AND. lwp ) WRITE(numout,*) 'gsigw3 1 jpk    ', gsigw3(ji,jj,1), gsigw3(ji,jj,jpk) 
    1327  
    1328  
    1329              DO jk = 1, jpkm1 
    1330                 esigt3(ji,jj,jk) = gsigw3(ji,jj,jk+1) - gsigw3(ji,jj,jk) 
    1331                 esigw3(ji,jj,jk+1) = gsigt3(ji,jj,jk+1) - gsigt3(ji,jj,jk) 
    1332              END DO 
    1333              esigw3(ji,jj,1  ) = 2.0_wp * (gsigt3(ji,jj,1  ) - gsigw3(ji,jj,1  )) 
    1334              esigt3(ji,jj,jpk) = 2.0_wp * (gsigt3(ji,jj,jpk) - gsigw3(ji,jj,jpk)) 
    1335  
    1336              ! Coefficients for vertical depth as the sum of e3w scale factors 
    1337              gsi3w3(ji,jj,1) = 0.5 * esigw3(ji,jj,1) 
    1338              DO jk = 2, jpk 
    1339                 gsi3w3(ji,jj,jk) = gsi3w3(ji,jj,jk-1) + esigw3(ji,jj,jk) 
    1340              END DO 
    1341  
    1342              DO jk = 1, jpk 
    1343                 zcoeft = ( REAL(jk,wp) - 0.5 ) / REAL(jpkm1,wp) 
    1344                 zcoefw = ( REAL(jk,wp) - 1.0 ) / REAL(jpkm1,wp) 
    1345                 gdept (ji,jj,jk) = (scosrf(ji,jj)+(hbatt(ji,jj)-rn_hc)*gsigt3(ji,jj,jk)+rn_hc*zcoeft) 
    1346                 gdepw (ji,jj,jk) = (scosrf(ji,jj)+(hbatt(ji,jj)-rn_hc)*gsigw3(ji,jj,jk)+rn_hc*zcoefw) 
    1347                 gdep3w(ji,jj,jk) = (scosrf(ji,jj)+(hbatt(ji,jj)-rn_hc)*gsi3w3(ji,jj,jk)+rn_hc*zcoeft) 
    1348              END DO 
    1349  
    1350            ENDDO   ! for all jj's 
    1351          ENDDO    ! for all ji's 
    1352  
    1353  
    1354          DO ji=1,jpi 
    1355            DO jj=1,jpj 
    1356  
    1357              DO jk = 1, jpk 
    1358                 esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk) ) / & 
    1359                                    ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
    1360                 esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji,jj+1)*esigt3(ji,jj+1,jk) ) / & 
    1361                                    ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    1362                 esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk) +  & 
    1363                                      hbatt(ji,jj+1)*esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*esigt3(ji+1,jj+1,jk) ) / & 
    1364                                    ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 
    1365                 esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji+1,jj)*esigw3(ji+1,jj,jk) ) / & 
    1366                                    ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
    1367                 esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji,jj+1)*esigw3(ji,jj+1,jk) ) / & 
    1368                                    ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    1369  
    1370                 e3t(ji,jj,jk)=((hbatt(ji,jj)-rn_hc)*esigt3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
    1371                 e3u(ji,jj,jk)=((hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
    1372                 e3v(ji,jj,jk)=((hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
    1373                 e3f(ji,jj,jk)=((hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
    1374                 ! 
    1375                 e3w (ji,jj,jk)=((hbatt(ji,jj)-rn_hc)*esigw3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
    1376                 e3uw(ji,jj,jk)=((hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
    1377                 e3vw(ji,jj,jk)=((hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/FLOAT(jpkm1)) 
    1378              END DO 
    1379  
    1380            ENDDO 
    1381          ENDDO 
    1382  
     1396            END DO 
     1397         END DO 
     1398         ! 
    13831399      ELSE   ! not ln_s_sigma 
    1384  
     1400         ! 
    13851401         DO jk = 1, jpk 
    13861402           gsigw(jk) = -fssig( REAL(jk,wp)-0.5_wp ) 
    1387            gsigt(jk) = -fssig( REAL(jk,wp)     ) 
    1388          END DO 
    1389          IF( nprint == 1 .AND. lwp ) WRITE(numout,*) 'gsigw 1 jpk    ', gsigw(1), gsigw(jpk) 
     1403           gsigt(jk) = -fssig( REAL(jk,wp)        ) 
     1404         END DO 
     1405         IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'gsigw 1 jpk    ', gsigw(1), gsigw(jpk) 
    13901406         ! 
    1391      ! Coefficients for vertical scale factors at w-, t- levels 
     1407         ! Coefficients for vertical scale factors at w-, t- levels 
    13921408!!gm bug :  define it from analytical function, not like juste bellow.... 
    13931409!!gm        or betteroffer the 2 possibilities.... 
     
    13961412            esigw(jk+1) = gsigt(jk+1) - gsigt(jk) 
    13971413         END DO 
    1398          esigw( 1 ) = 2.0_wp * (gsigt(1) - gsigw(1))  
    1399          esigt(jpk) = 2.0_wp * (gsigt(jpk) - gsigw(jpk)) 
     1414         esigw( 1 ) = 2._wp * ( gsigt(1  ) - gsigw(1  ) )  
     1415         esigt(jpk) = 2._wp * ( gsigt(jpk) - gsigw(jpk) ) 
    14001416 
    14011417!!gm  original form 
     
    14071423         ! 
    14081424         ! Coefficients for vertical depth as the sum of e3w scale factors 
    1409          gsi3w(1) = 0.5 * esigw(1) 
     1425         gsi3w(1) = 0.5_wp * esigw(1) 
    14101426         DO jk = 2, jpk 
    14111427            gsi3w(jk) = gsi3w(jk-1) + esigw(jk) 
     
    14131429!!gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays) 
    14141430         DO jk = 1, jpk 
    1415             zcoeft = ( FLOAT(jk) - 0.5 ) / FLOAT(jpkm1) 
    1416             zcoefw = ( FLOAT(jk) - 1.0 ) / FLOAT(jpkm1) 
    1417             gdept (:,:,jk) = (scosrf(:,:)+(hbatt(:,:)-hift(:,:))*gsigt(jk)+hift(:,:)*zcoeft) 
    1418             gdepw (:,:,jk) = (scosrf(:,:)+(hbatt(:,:)-hift(:,:))*gsigw(jk)+hift(:,:)*zcoefw) 
    1419             gdep3w(:,:,jk) = (scosrf(:,:)+(hbatt(:,:)-hift(:,:))*gsi3w(jk)+hift(:,:)*zcoeft) 
     1431            zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 
     1432            zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 
     1433            gdept (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsigt(jk) + hift(:,:)*zcoeft ) 
     1434            gdepw (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsigw(jk) + hift(:,:)*zcoefw ) 
     1435            gdep3w(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsi3w(jk) + hift(:,:)*zcoeft ) 
    14201436         END DO 
    14211437!!gm: e3uw, e3vw can be suppressed  (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays) 
     
    14231439            DO ji = 1, jpi 
    14241440               DO jk = 1, jpk 
    1425                  e3t(ji,jj,jk)=((hbatt(ji,jj)-hift(ji,jj))*esigt(jk) + hift(ji,jj)/FLOAT(jpkm1)) 
    1426                  e3u(ji,jj,jk)=((hbatu(ji,jj)-hifu(ji,jj))*esigt(jk) + hifu(ji,jj)/FLOAT(jpkm1)) 
    1427                  e3v(ji,jj,jk)=((hbatv(ji,jj)-hifv(ji,jj))*esigt(jk) + hifv(ji,jj)/FLOAT(jpkm1)) 
    1428                  e3f(ji,jj,jk)=((hbatf(ji,jj)-hiff(ji,jj))*esigt(jk) + hiff(ji,jj)/FLOAT(jpkm1)) 
     1441                 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*esigt(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 
     1442                 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*esigt(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 
     1443                 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*esigt(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 
     1444                 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-hiff(ji,jj))*esigt(jk) + hiff(ji,jj)/REAL(jpkm1,wp) ) 
    14291445                 ! 
    1430                  e3w (ji,jj,jk)=((hbatt(ji,jj)-hift(ji,jj))*esigw(jk) + hift(ji,jj)/FLOAT(jpkm1)) 
    1431                  e3uw(ji,jj,jk)=((hbatu(ji,jj)-hifu(ji,jj))*esigw(jk) + hifu(ji,jj)/FLOAT(jpkm1)) 
    1432                  e3vw(ji,jj,jk)=((hbatv(ji,jj)-hifv(ji,jj))*esigw(jk) + hifv(ji,jj)/FLOAT(jpkm1)) 
     1446                 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*esigw(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 
     1447                 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*esigw(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 
     1448                 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*esigw(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 
    14331449               END DO 
    14341450            END DO 
    14351451         END DO 
    1436  
     1452         ! 
    14371453      ENDIF ! ln_s_sigma 
    14381454 
     
    14571473            DO jk = 1, jpkm1 
    14581474               IF( scobot(ji,jj) >= fsdept(ji,jj,jk) )   mbathy(ji,jj) = MAX( 2, jk ) 
    1459                IF( scobot(ji,jj) == 0.e0             )   mbathy(ji,jj) = 0 
     1475               IF( scobot(ji,jj) == 0._wp            )   mbathy(ji,jj) = 0 
    14601476            END DO 
    14611477         END DO 
     
    14631479      IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ),   & 
    14641480         &                                                       ' MAX ', MAXVAL( mbathy(:,:) ) 
    1465  
    14661481 
    14671482      !                                               ! ============= 
     
    15231538         DO jj = 1, jpj 
    15241539            DO ji = 1, jpi 
    1525                IF( fse3w(ji,jj,jk) <= 0. .OR. fse3t(ji,jj,jk) <= 0. ) THEN 
     1540               IF( fse3w(ji,jj,jk) <= 0._wp .OR. fse3t(ji,jj,jk) <= 0._wp ) THEN 
    15261541                  WRITE(ctmp1,*) 'zgr_sco :   e3w   or e3t   =< 0  at point (i,j,k)= ', ji, jj, jk 
    15271542                  CALL ctl_stop( ctmp1 ) 
    15281543               ENDIF 
    1529                IF( fsdepw(ji,jj,jk) < 0. .OR. fsdept(ji,jj,jk) < 0. ) THEN 
     1544               IF( fsdepw(ji,jj,jk) < 0._wp .OR. fsdept(ji,jj,jk) < 0._wp ) THEN 
    15301545                  WRITE(ctmp1,*) 'zgr_sco :   gdepw or gdept =< 0  at point (i,j,k)= ', ji, jj, jk 
    15311546                  CALL ctl_stop( ctmp1 ) 
     
    15381553   END SUBROUTINE zgr_sco 
    15391554 
    1540 #endif 
    15411555 
    15421556   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.