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 6736 for branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM – NEMO

Ignore:
Timestamp:
2016-06-24T09:50:27+02:00 (8 years ago)
Author:
jamesharle
Message:

FASTNEt code modifications

Location:
branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/closea.F90

    r3632 r6736  
    1919   USE oce             ! dynamics and tracers 
    2020   USE dom_oce         ! ocean space and time domain 
    21    USE phycst          ! physical constants 
    2221   USE in_out_manager  ! I/O manager 
    2322   USE sbc_oce         ! ocean surface boundary conditions 
     
    185184      !!      put as run-off in open ocean. 
    186185      !! 
    187       !! ** Action  :   emp updated surface freshwater fluxes and associated heat content at kt 
     186      !! ** Action  :   emp, emps   updated surface freshwater fluxes at kt 
    188187      !!---------------------------------------------------------------------- 
    189188      INTEGER, INTENT(in) ::   kt   ! ocean model time step 
     
    192191      REAL(wp), PARAMETER ::   rsmall = 1.e-20_wp    ! Closed sea correction epsilon 
    193192      REAL(wp)            ::   zze2, ztmp, zcorr     !  
    194       REAL(wp)            ::   zcoef, zcoef1         !  
    195193      COMPLEX(wp)         ::   ctmp  
    196194      REAL(wp), DIMENSION(jpncs) ::   zfwf   ! 1D workspace 
     
    245243      ENDIF 
    246244      !                                                   !--------------------! 
    247       !                                                   !  update emp        ! 
     245      !                                                   !  update emp, emps  ! 
    248246      zfwf = 0.e0_wp                                      !--------------------! 
    249247      IF( lk_mpp_rep ) THEN                         ! MPP reproductible calculation 
     
    284282            ! 
    285283            IF( ncstt(jc) == 0 ) THEN           ! water/evap excess is shared by all open ocean 
    286                zcoef    = zfwf(jc) / surf(jpncs+1) 
    287                zcoef1   = rcp * zcoef 
    288                emp(:,:) = emp(:,:) + zcoef 
    289                qns(:,:) = qns(:,:) - zcoef1 * sst_m(:,:) 
     284               emp (:,:) = emp (:,:) + zfwf(jc) / surf(jpncs+1) 
     285               emps(:,:) = emps(:,:) + zfwf(jc) / surf(jpncs+1) 
    290286               ! accumulate closed seas correction 
    291                zcorr    = zcorr    + zcoef 
     287               zcorr     = zcorr     + zfwf(jc) / surf(jpncs+1) 
    292288               ! 
    293289            ELSEIF( ncstt(jc) == 1 ) THEN       ! Excess water in open sea, at outflow location, excess evap shared 
     
    298294                     IF (      ji > 1 .AND. ji < jpi   & 
    299295                         .AND. jj > 1 .AND. jj < jpj ) THEN  
    300                          zcoef      = zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 
    301                          zcoef1     = rcp * zcoef 
    302                          emp(ji,jj) = emp(ji,jj) + zcoef 
    303                          qns(ji,jj) = qns(ji,jj) - zcoef1 * sst_m(ji,jj) 
     296                         emp (ji,jj) = emp (ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 
     297                         emps(ji,jj) = emps(ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) * e1e2t(ji,jj) ) 
    304298                     ENDIF  
    305299                   END DO  
    306300               ELSE  
    307                    zcoef    = zfwf(jc) / surf(jpncs+1) 
    308                    zcoef1   = rcp * zcoef 
    309                    emp(:,:) = emp(:,:) + zcoef 
    310                    qns(:,:) = qns(:,:) - zcoef1 * sst_m(:,:) 
     301                   emp (:,:) = emp (:,:) + zfwf(jc) / surf(jpncs+1) 
     302                   emps(:,:) = emps(:,:) + zfwf(jc) / surf(jpncs+1) 
    311303                   ! accumulate closed seas correction 
    312                    zcorr    = zcorr    + zcoef 
     304                   zcorr     = zcorr     + zfwf(jc) / surf(jpncs+1) 
    313305               ENDIF 
    314306            ELSEIF( ncstt(jc) == 2 ) THEN       ! Excess e-p-r (either sign) goes to open ocean, at outflow location 
     
    318310                  IF(      ji > 1 .AND. ji < jpi    & 
    319311                     .AND. jj > 1 .AND. jj < jpj ) THEN  
    320                      zcoef      = zfwf(jc) / ( REAL(ncsnr(jc)) *  e1e2t(ji,jj) ) 
    321                      zcoef1     = rcp * zcoef 
    322                      emp(ji,jj) = emp(ji,jj) + zcoef 
    323                      qns(ji,jj) = qns(ji,jj) - zcoef1 * sst_m(ji,jj) 
     312                     emp (ji,jj) = emp (ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) *  e1e2t(ji,jj) ) 
     313                     emps(ji,jj) = emps(ji,jj) + zfwf(jc) / ( REAL(ncsnr(jc)) *  e1e2t(ji,jj) ) 
    324314                  ENDIF  
    325315               END DO  
     
    328318            DO jj = ncsj1(jc), ncsj2(jc) 
    329319               DO ji = ncsi1(jc), ncsi2(jc) 
    330                   zcoef      = zfwf(jc) / surf(jc) 
    331                   zcoef1     = rcp * zcoef 
    332                   emp(ji,jj) = emp(ji,jj) - zcoef 
    333                   qns(ji,jj) = qns(ji,jj) + zcoef1 * sst_m(ji,jj) 
     320                  emp (ji,jj) = emp (ji,jj) - zfwf(jc) / surf(jc) 
     321                  emps(ji,jj) = emps(ji,jj) - zfwf(jc) / surf(jc) 
    334322               END DO   
    335323            END DO  
     
    342330            DO jj = ncsj1(jc), ncsj2(jc) 
    343331               DO ji = ncsi1(jc), ncsi2(jc) 
    344                   emp(ji,jj) = emp(ji,jj) - zcorr 
    345                   qns(ji,jj) = qns(ji,jj) + rcp * zcorr * sst_m(ji,jj) 
     332                  emp (ji,jj) = emp (ji,jj) - zcorr 
     333                  emps(ji,jj) = emps(ji,jj) - zcorr 
    346334               END DO   
    347335             END DO  
     
    350338      ! 
    351339      emp (:,:) = emp (:,:) * tmask(:,:,1) 
     340      emps(:,:) = emps(:,:) * tmask(:,:,1) 
    352341      ! 
    353342      CALL lbc_lnk( emp , 'T', 1._wp ) 
     343      CALL lbc_lnk( emps, 'T', 1._wp ) 
    354344      ! 
    355345      IF( nn_timing == 1 )  CALL timing_stop('sbc_clo') 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/daymod.F90

    r3851 r6736  
    3232   USE ioipsl, ONLY :   ymds2ju   ! for calendar 
    3333   USE prtctl          ! Print control 
     34   USE restart         ! 
    3435   USE trc_oce, ONLY : lk_offline ! offline flag 
    3536   USE timing          ! Timing 
    36    USE restart         ! restart 
    3737 
    3838   IMPLICIT NONE 
     
    153153         IF ( nleapy == 1 ) THEN   ! we are using calandar with leap years 
    154154            IF ( MOD(nyear-1, 4) == 0 .AND. ( MOD(nyear-1, 400) == 0 .OR. MOD(nyear-1, 100) /= 0 ) ) THEN 
    155                nyear_len(0)  = 366 
    156             ENDIF 
    157             IF ( MOD(nyear  , 4) == 0 .AND. ( MOD(nyear  , 400) == 0 .OR. MOD(nyear  , 100) /= 0 ) ) THEN 
     155               nyear_len(0) = 366 
     156            ENDIF 
     157            IF ( MOD(nyear, 4) == 0 .AND. ( MOD(nyear, 400) == 0 .OR. MOD(nyear, 100) /= 0 ) ) THEN 
    158158               nmonth_len(2) = 29 
    159                nyear_len(1)  = 366 
    160             ENDIF 
    161             IF ( MOD(nyear+1, 4) == 0 .AND. ( MOD(nyear+1, 400) == 0 .OR. MOD(nyear+1, 100) /= 0 ) ) THEN 
    162                nyear_len(2)  = 366 
     159               nyear_len(1) = 366 
    163160            ENDIF 
    164161         ENDIF 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/dom_oce.F90

    r3851 r6736  
    88   !!            3.3  ! 2010-11  (G. Madec) add mbk. arrays associated to the deepest ocean level 
    99   !!            4.0  ! 2011-01  (A. R. Porter, STFC Daresbury) dynamical allocation 
    10    !!            3.5  ! 2012     (S. Mocavero, I. Epicoco) Add arrays associated 
    11    !!                             to the optimization of BDY communications 
    1210   !!---------------------------------------------------------------------- 
    1311 
     
    8280   INTEGER, PUBLIC ::   narea             !: number for local area 
    8381   INTEGER, PUBLIC ::   nbondi, nbondj    !: mark of i- and j-direction local boundaries 
    84    INTEGER, ALLOCATABLE, PUBLIC ::   nbondi_bdy(:)    !: mark i-direction local boundaries for BDY open boundaries 
    85    INTEGER, ALLOCATABLE, PUBLIC ::   nbondj_bdy(:)    !: mark j-direction local boundaries for BDY open boundaries 
    86    INTEGER, ALLOCATABLE, PUBLIC ::   nbondi_bdy_b(:)  !: mark i-direction of neighbours local boundaries for BDY open boundaries   
    87    INTEGER, ALLOCATABLE, PUBLIC ::   nbondj_bdy_b(:)  !: mark j-direction of neighbours local boundaries for BDY open boundaries   
    88  
    8982   INTEGER, PUBLIC ::   npolj             !: north fold mark (0, 3 or 4) 
    9083   INTEGER, PUBLIC ::   nlci, nldi, nlei  !: i-dimensions of the local subdomain and its first and last indoor indices 
     
    131124   LOGICAL, PUBLIC ::   ln_zps     =  .FALSE.   !: z-coordinate - partial step 
    132125   LOGICAL, PUBLIC ::   ln_sco     =  .FALSE.   !: s-coordinate or hybrid z-s coordinate 
    133  
     126   LOGICAL, PUBLIC ::   ln_s_sigma  = .FALSE.   ! use hybrid s-sigma -coordinate & stretching function 
     127   LOGICAL, PUBLIC ::   ln_hyb     =  .FALSE.   !: MANE1 s-coordinate or hybrid z-s coordinate 
    134128   !! All coordinates 
    135129   !! --------------- 
     
    172166   !! =----------------======--------------- 
    173167   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   gsigt, gsigw   !: model level depth coefficient at t-, w-levels (analytic) 
     168#if defined key_smsh 
     169   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   gsigt3, gsigw3  !: model level depth coefficient for sigma_s levels  
     170#endif 
    174171   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   gsi3w          !: model level depth coefficient at w-level (sum of gsigw) 
     172#if defined key_smsh 
     173   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   gsi3w3          !: model level depth coefficient for sigma_s levels  
     174#endif 
     175    
    175176   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   esigt, esigw   !: vertical scale factor coef. at t-, w-levels 
    176177 
     178#if defined key_smsh 
     179   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   esigt3, esigw3  !: vertical scale factor coef. for sigma_S levels  
     180#endif 
    177181   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hbatv , hbatf    !: ocean depth at the vertical of  V--F 
    178182   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hbatt , hbatu    !:                                 T--U  points (m) 
     
    181185   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hifv  , hiff     !: interface depth between stretching at  V--F 
    182186   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hift  , hifu     !: and quasi-uniform spacing              T--U  points (m) 
    183    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rx1              !: Maximum grid stiffness ratio 
    184187 
    185188   !!---------------------------------------------------------------------- 
     
    218221   REAL(wp), PUBLIC ::   adatrj        !: number of elapsed days since the begining of the whole simulation 
    219222   !                                   !: (cumulative duration of previous runs that may have used different time-step size) 
    220    INTEGER , PUBLIC, DIMENSION(0: 2) ::   nyear_len     !: length in days of the previous/current/next year 
     223   INTEGER , PUBLIC, DIMENSION(0: 1) ::   nyear_len     !: length in days of the previous/current year 
    221224   INTEGER , PUBLIC, DIMENSION(0:13) ::   nmonth_len    !: length in days of the months of the current year 
    222225   INTEGER , PUBLIC, DIMENSION(0:13) ::   nmonth_half   !: second since Jan 1st 0h of the current year and the half of the months 
     
    293296         &      hv(jpi,jpj) , hvr(jpi,jpj) , hv_0(jpi,jpj) , STAT=ierr(6) ) 
    294297         ! 
    295       ALLOCATE( gdept_0(jpk) , gdepw_0(jpk) ,                                     & 
    296          &      e3t_0  (jpk) , e3w_0  (jpk) , e3tp (jpi,jpj), e3wp(jpi,jpj) ,     & 
    297          &      gsigt  (jpk) , gsigw  (jpk) , gsi3w(jpk)    ,                     & 
    298          &      esigt  (jpk) , esigw  (jpk)                                 , STAT=ierr(7) ) 
     298      ALLOCATE( gdept_0(jpk)         , gdepw_0(jpk)         ,                                     & 
     299         &      e3t_0  (jpk)         , e3w_0  (jpk)         , e3tp (jpi,jpj), e3wp(jpi,jpj) ,     & 
     300         &      gsigt  (jpk)         , gsigw  (jpk)         , gsi3w(jpk)    ,                     & 
     301#if defined key_smsh 
     302         &      gsigt3 (jpi,jpj,jpk) , gsigw3 (jpi,jpj,jpk) ,                                     & 
     303         &      esigt3 (jpi,jpj,jpk) , esigw3 (jpi,jpj,jpk) ,                                     & 
     304         &      gsi3w3 (jpi,jpj,jpk) ,                                                            & 
     305#endif 
     306         &      esigt  (jpk)         , esigw  (jpk)                                 , STAT=ierr(7) ) 
    299307         ! 
    300308      ALLOCATE( hbatv (jpi,jpj) , hbatf (jpi,jpj) ,     & 
     
    302310         &      scosrf(jpi,jpj) , scobot(jpi,jpj) ,     & 
    303311         &      hifv  (jpi,jpj) , hiff  (jpi,jpj) ,     & 
    304          &      hift  (jpi,jpj) , hifu  (jpi,jpj) , rx1 (jpi,jpj) , STAT=ierr(8) ) 
     312         &      hift  (jpi,jpj) , hifu  (jpi,jpj) , STAT=ierr(8) ) 
    305313 
    306314      ALLOCATE( mbathy(jpi,jpj) , bathy(jpi,jpj) ,                     & 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domain.F90

    r3764 r6736  
    3636   USE dyncor_c1d      ! Coriolis term (c1d case)         (cor_c1d routine) 
    3737   USE timing          ! Timing 
    38    USE lbclnk          ! ocean lateral boundary condition (or mpp link) 
    3938 
    4039   IMPLICIT NONE 
     
    8584                             CALL dom_zgr      ! Vertical mesh and bathymetry 
    8685                             CALL dom_msk      ! Masks 
    87       IF( ln_sco )           CALL dom_stiff    ! Maximum stiffness ratio/hydrostatic consistency 
    8886      IF( lk_vvl         )   CALL dom_vvl      ! Vertical variable mesh 
    8987      ! 
     
    123121      NAMELIST/namrun/ nn_no   , cn_exp    , cn_ocerst_in, cn_ocerst_out, ln_rstart , nn_rstctl,   & 
    124122         &             nn_it000, nn_itend  , nn_date0    , nn_leapy     , nn_istate , nn_stock ,   & 
    125          &             nn_write, ln_dimgnnn, ln_mskland  , ln_clobber   , nn_chunksz 
     123         &             nn_write, ln_dimgnnn, ln_mskland  , ln_clobber   , nn_chunksz, ln_fse3t_b 
    126124      NAMELIST/namdom/ nn_bathy , rn_e3zps_min, rn_e3zps_rat, nn_msh    , rn_hmin,   & 
    127125         &             nn_acc   , rn_atfp     , rn_rdt      , rn_rdtmin ,            & 
     
    156154         WRITE(numout,*) '      overwrite an existing file      ln_clobber = ', ln_clobber 
    157155         WRITE(numout,*) '      NetCDF chunksize (bytes)        nn_chunksz = ', nn_chunksz 
     156         WRITE(numout,*) '      fse3t_b in restart?             ln_fse3t_b = ', ln_fse3t_b 
    158157      ENDIF 
    159158 
     
    320319   END SUBROUTINE dom_ctl 
    321320 
    322    SUBROUTINE dom_stiff 
    323       !!---------------------------------------------------------------------- 
    324       !!                  ***  ROUTINE dom_stiff  *** 
    325       !!                      
    326       !! ** Purpose :   Diagnose maximum grid stiffness/hydrostatic consistency 
    327       !! 
    328       !! ** Method  :   Compute Haney (1991) hydrostatic condition ratio 
    329       !!                Save the maximum in the vertical direction 
    330       !!                (this number is only relevant in s-coordinates) 
    331       !! 
    332       !!                Haney, R. L., 1991: On the pressure gradient force 
    333       !!                over steep topography in sigma coordinate ocean models.  
    334       !!                J. Phys. Oceanogr., 21, 610???619. 
    335       !!---------------------------------------------------------------------- 
    336       INTEGER  ::   ji, jj, jk  
    337       REAL(wp) ::   zrxmax 
    338       REAL(wp), DIMENSION(4) :: zr1 
    339       !!---------------------------------------------------------------------- 
    340       rx1(:,:) = 0.e0 
    341       zrxmax   = 0.e0 
    342       zr1(:)   = 0.e0 
    343        
    344       DO ji = 2, jpim1 
    345          DO jj = 2, jpjm1 
    346             DO jk = 1, jpkm1 
    347                zr1(1) = umask(ji-1,jj  ,jk) *abs( (gdepw(ji  ,jj  ,jk  )-gdepw(ji-1,jj  ,jk  )  &  
    348                     &                         +gdepw(ji  ,jj  ,jk+1)-gdepw(ji-1,jj  ,jk+1)) & 
    349                     &                        /(gdepw(ji  ,jj  ,jk  )+gdepw(ji-1,jj  ,jk  )  & 
    350                     &                         -gdepw(ji  ,jj  ,jk+1)-gdepw(ji-1,jj  ,jk+1) + rsmall) ) 
    351                zr1(2) = umask(ji  ,jj  ,jk) *abs( (gdepw(ji+1,jj  ,jk  )-gdepw(ji  ,jj  ,jk  )  & 
    352                     &                         +gdepw(ji+1,jj  ,jk+1)-gdepw(ji  ,jj  ,jk+1)) & 
    353                     &                        /(gdepw(ji+1,jj  ,jk  )+gdepw(ji  ,jj  ,jk  )  & 
    354                     &                         -gdepw(ji+1,jj  ,jk+1)-gdepw(ji  ,jj  ,jk+1) + rsmall) ) 
    355                zr1(3) = vmask(ji  ,jj  ,jk) *abs( (gdepw(ji  ,jj+1,jk  )-gdepw(ji  ,jj  ,jk  )  & 
    356                     &                         +gdepw(ji  ,jj+1,jk+1)-gdepw(ji  ,jj  ,jk+1)) & 
    357                     &                        /(gdepw(ji  ,jj+1,jk  )+gdepw(ji  ,jj  ,jk  )  & 
    358                     &                         -gdepw(ji  ,jj+1,jk+1)-gdepw(ji  ,jj  ,jk+1) + rsmall) ) 
    359                zr1(4) = vmask(ji  ,jj-1,jk) *abs( (gdepw(ji  ,jj  ,jk  )-gdepw(ji  ,jj-1,jk  )  & 
    360                     &                         +gdepw(ji  ,jj  ,jk+1)-gdepw(ji  ,jj-1,jk+1)) & 
    361                     &                        /(gdepw(ji  ,jj  ,jk  )+gdepw(ji  ,jj-1,jk  )  & 
    362                     &                         -gdepw(ji,  jj  ,jk+1)-gdepw(ji  ,jj-1,jk+1) + rsmall) ) 
    363                zrxmax = MAXVAL(zr1(1:4)) 
    364                rx1(ji,jj) = MAX(rx1(ji,jj), zrxmax) 
    365             END DO 
    366          END DO 
    367       END DO 
    368  
    369       CALL lbc_lnk( rx1, 'T', 1. ) 
    370  
    371       zrxmax = MAXVAL(rx1) 
    372  
    373       IF( lk_mpp )   CALL mpp_max( zrxmax ) ! max over the global domain 
    374  
    375       IF(lwp) THEN 
    376          WRITE(numout,*) 
    377          WRITE(numout,*) 'dom_stiff : maximum grid stiffness ratio: ', zrxmax 
    378          WRITE(numout,*) '~~~~~~~~~' 
    379       ENDIF 
    380  
    381    END SUBROUTINE dom_stiff 
    382  
    383  
    384  
    385321   !!====================================================================== 
    386322END MODULE domain 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domhgr.F90

    r3294 r6736  
    2626   USE lib_mpp        ! MPP library 
    2727   USE timing         ! Timing 
    28  
     28   !! test - delete this line 
    2929   IMPLICIT NONE 
    3030   PRIVATE 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domvvl.F90

    r3294 r6736  
    443443      ! End of individual corrections to scale factors 
    444444 
     445#if ! defined key_melange 
    445446      IF( ln_zps ) THEN          ! minimum of the e3t at partial cell level 
     447#endif 
    446448         DO jj = 2, jpjm1 
    447449            DO ji = fs_2, fs_jpim1 
    448450               iku = mbku(ji,jj) 
     451#if defined key_melange 
     452               IF(iku>39) THEN 
     453#endif 
     454               pe3u_b(ji,jj,iku) = MIN( fse3t_b(ji,jj,iku), fse3t_b(ji+1,jj  ,iku) )  
     455#if defined key_melange 
     456               ENDIF 
     457#endif 
    449458               ikv = mbkv(ji,jj) 
    450                pe3u_b(ji,jj,iku) = MIN( fse3t_b(ji,jj,iku), fse3t_b(ji+1,jj  ,iku) )  
     459#if defined key_melange 
     460               IF(ikv>39) THEN 
     461#endif 
    451462               pe3v_b(ji,jj,ikv) = MIN( fse3t_b(ji,jj,ikv), fse3t_b(ji  ,jj+1,ikv) )  
    452             END DO 
    453          END DO 
    454       ENDIF 
     463#if defined key_melange 
     464               ENDIF 
     465#endif 
     466            END DO 
     467         END DO 
     468#if ! defined key_melange 
     469      ENDIF 
     470#endif 
    455471 
    456472      pe3u_b(:,:,:) = pe3u_b(:,:,:) - fse3u_0(:,:,:)      ! anomaly to avoid zero along closed boundary/extra halos 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domwri.F90

    r3680 r6736  
    172172             
    173173      IF( ln_sco ) THEN                                         ! s-coordinate 
    174          CALL iom_rstput( 0, 0, inum4, 'hbatt', hbatt ) 
    175          CALL iom_rstput( 0, 0, inum4, 'hbatu', hbatu ) 
     174         CALL iom_rstput( 0, 0, inum4, 'hbatt', hbatt )         !    ! depth 
     175         CALL iom_rstput( 0, 0, inum4, 'hbatu', hbatu )  
    176176         CALL iom_rstput( 0, 0, inum4, 'hbatv', hbatv ) 
    177177         CALL iom_rstput( 0, 0, inum4, 'hbatf', hbatf ) 
    178178         ! 
    179          CALL iom_rstput( 0, 0, inum4, 'gsigt', gsigt )         !    ! scaling coef. 
    180          CALL iom_rstput( 0, 0, inum4, 'gsigw', gsigw )   
    181          CALL iom_rstput( 0, 0, inum4, 'gsi3w', gsi3w ) 
    182          CALL iom_rstput( 0, 0, inum4, 'esigt', esigt ) 
    183          CALL iom_rstput( 0, 0, inum4, 'esigw', esigw ) 
     179#if defined key_smsh 
     180          CALL iom_rstput( 0, 0, inum4, 'gsigt', gsigt3 )         !    ! scaling coef.  
     181          CALL iom_rstput( 0, 0, inum4, 'gsigw', gsigw3 ) 
     182          CALL iom_rstput( 0, 0, inum4, 'gsi3w', gsi3w3 ) 
     183          CALL iom_rstput( 0, 0, inum4, 'esigt', esigt3 ) 
     184          CALL iom_rstput( 0, 0, inum4, 'esigw', esigw3 ) 
     185#else 
     186          CALL iom_rstput( 0, 0, inum4, 'gsigt', gsigt )         !    ! scaling coef. 
     187          CALL iom_rstput( 0, 0, inum4, 'gsigw', gsigw ) 
     188          CALL iom_rstput( 0, 0, inum4, 'gsi3w', gsi3w ) 
     189          CALL iom_rstput( 0, 0, inum4, 'esigt', esigt ) 
     190          CALL iom_rstput( 0, 0, inum4, 'esigw', esigw ) 
     191#endif 
     192 
    184193         ! 
    185194         CALL iom_rstput( 0, 0, inum4, 'e3t', e3t )             !    ! scale factors 
     
    187196         CALL iom_rstput( 0, 0, inum4, 'e3v', e3v ) 
    188197         CALL iom_rstput( 0, 0, inum4, 'e3w', e3w ) 
    189          CALL iom_rstput( 0, 0, inum4, 'rx1', rx1 )             !    ! Max. grid stiffness ratio 
    190          ! 
    191          CALL iom_rstput( 0, 0, inum4, 'gdept' , gdept )    !    ! stretched system 
    192          CALL iom_rstput( 0, 0, inum4, 'gdepw' , gdepw ) 
     198         ! 
     199#if defined key_smsh 
     200            CALL iom_rstput( 0, 0, inum4, 'gdept', gdept, ktype = jp_r4 )      
     201            DO jk = 1,jpk    
     202               DO jj = 1, jpjm1    
     203                  DO ji = 1, fs_jpim1   ! vector opt. 
     204                     zdepu(ji,jj,jk) = MIN( gdept(ji,jj,jk) , gdept(ji+1,jj  ,jk) ) 
     205                     zdepv(ji,jj,jk) = MIN( gdept(ji,jj,jk) , gdept(ji  ,jj+1,jk) ) 
     206                  END DO    
     207               END DO    
     208            END DO 
     209            CALL lbc_lnk( zdepu, 'U', 1. )   ;   CALL lbc_lnk( zdepv, 'V', 1. )  
     210            CALL iom_rstput( 0, 0, inum4, 'gdepu', zdepu, ktype = jp_r4 ) 
     211            CALL iom_rstput( 0, 0, inum4, 'gdepv', zdepv, ktype = jp_r4 ) 
     212            CALL iom_rstput( 0, 0, inum4, 'gdepw', gdepw, ktype = jp_r4 ) 
     213            DO jj = 1,jpj    
     214               DO ji = 1,jpi 
     215                  zprt(ji,jj) = gdept(ji,jj,mbkt(ji,jj)  ) * tmask(ji,jj,1) 
     216                  zprw(ji,jj) = gdepw(ji,jj,mbkt(ji,jj)+1) * tmask(ji,jj,1) 
     217               END DO 
     218            END DO 
     219            CALL iom_rstput( 0, 0, inum4, 'hdept', zprt, ktype = jp_r4 )      
     220            CALL iom_rstput( 0, 0, inum4, 'hdepw', zprw, ktype = jp_r4 )  
     221#endif 
     222         CALL iom_rstput( 0, 0, inum4, 'gdept_0' , gdept_0 )    !    ! stretched system 
     223         CALL iom_rstput( 0, 0, inum4, 'gdepw_0' , gdepw_0 ) 
    193224      ENDIF 
    194225       
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90

    r3764 r6736  
    1515   !!            3.2  ! 2009-07  (R. Benshila) Suppression of rigid-lid option 
    1616   !!            3.3  ! 2010-11  (G. Madec) add mbk. arrays associated to the deepest ocean level 
    17    !!            3.4  ! 2012-08  (J. Siddorn) added Siddorn and Furner stretching function 
    1817   !!            3.4  ! 2012-12  (R. Bourdalle-Badie and G. Reffray)  modify C1D case   
    19    !!---------------------------------------------------------------------- 
     18  !!---------------------------------------------------------------------- 
    2019 
    2120   !!---------------------------------------------------------------------- 
     
    2928   !!       zgr_zps      : z-coordinate with partial steps 
    3029   !!       zgr_sco      : s-coordinate 
    31    !!       fssig        : tanh stretch function 
    32    !!       fssig1       : Song and Haidvogel 1994 stretch function 
    33    !!       fgamma       : Siddorn and Furner 2012 stretching function 
     30   !!       fssig        : sigma coordinate non-dimensional function 
     31   !!       dfssig       : derivative of the sigma coordinate function    !!gm  (currently missing!) 
    3432   !!--------------------------------------------------------------------- 
    3533   USE oce               ! ocean variables 
     
    5048 
    5149   !                                       !!* Namelist namzgr_sco * 
    52    LOGICAL  ::   ln_s_sh94   = .false.      ! use hybrid s-sig Song and Haidvogel 1994 stretching function fssig1 (ln_sco=T) 
    53    LOGICAL  ::   ln_s_sf12   = .true.       ! use hybrid s-z-sig Siddorn and Furner 2012 stretching function fgamma (ln_sco=T) 
    54    ! 
    5550   REAL(wp) ::   rn_sbot_min =  300._wp     ! minimum depth of s-bottom surface (>0) (m) 
    5651   REAL(wp) ::   rn_sbot_max = 5250._wp     ! maximum depth of s-bottom surface (= ocean depth) (>0) (m) 
    57    REAL(wp) ::   rn_rmax     =    0.15_wp   ! maximum cut-off r-value allowed (0<rn_rmax<1) 
    58    REAL(wp) ::   rn_hc       =  150._wp     ! Critical depth for transition from sigma to stretched coordinates 
    59    ! Song and Haidvogel 1994 stretching parameters 
    6052   REAL(wp) ::   rn_theta    =    6.00_wp   ! surface control parameter (0<=rn_theta<=20) 
    6153   REAL(wp) ::   rn_thetb    =    0.75_wp   ! bottom control parameter  (0<=rn_thetb<= 1) 
    62    REAL(wp) ::   rn_bb       =    0.80_wp   ! stretching parameter  
     54   REAL(wp) ::   rn_rmax     =    0.15_wp   ! maximum cut-off r-value allowed (0<rn_rmax<1) 
     55!  LOGICAL  ::   ln_s_sigma  = .false.      ! use hybrid s-sigma -coordinate & stretching function fssig1 (ln_sco=T) 
     56   REAL(wp) ::   rn_bb       =    0.80_wp   ! stretching parameter for song and haidvogel stretching 
    6357   !                                        ! ( rn_bb=0; top only, rn_bb =1; top and bottom) 
    64    ! Siddorn and Furner stretching parameters 
    65    LOGICAL  ::   ln_sigcrit  = .false.      ! use sigma coordinates below critical depth (T) or Z coordinates (F) for Siddorn & Furner stretch  
    66    REAL(wp) ::   rn_alpha    =    4.4_wp    ! control parameter ( > 1 stretch towards surface, < 1 towards seabed) 
    67    REAL(wp) ::   rn_efold    =    0.0_wp    !  efold length scale for transition to stretched coord 
    68    REAL(wp) ::   rn_zs       =    1.0_wp    !  depth of surface grid box 
    69                            !  bottom cell depth (Zb) is a linear function of water depth Zb = H*a + b 
    70    REAL(wp) ::   rn_zb_a     =    0.024_wp  !  bathymetry scaling factor for calculating Zb 
    71    REAL(wp) ::   rn_zb_b     =   -0.2_wp    !  offset for calculating Zb 
     58   REAL(wp) ::   rn_hc       =  150._wp     ! Critical depth for s-sigma coordinates 
     59   REAL(wp) ::   rn_zsigma   =  300._wp     ! Maximum  depth for s-sigma layer 
     60   INTEGER  ::   nn_sig_lev  =  10          ! Maximum number of levels of s-sigma layer 
     61   REAL(wp) ::   rn_kth      = 15._wp    ! Approximate layer number, beyond which streching will be maximum  
     62   REAL(wp) ::   rn_acr      = 9.00_wp   ! 
    7263 
    7364  !! * Substitutions 
     
    10091      INTEGER ::   ioptio, ibat   ! local integer 
    10192      ! 
    102       NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco 
     93      NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco , ln_hyb 
    10394      !!---------------------------------------------------------------------- 
    10495      ! 
     
    116107         WRITE(numout,*) '             z-coordinate - partial steps   ln_zps = ', ln_zps 
    117108         WRITE(numout,*) '             s- or hybrid z-s-coordinate    ln_sco = ', ln_sco 
     109         WRITE(numout,*) '             hybrid s-z-coordinates,s at shelf ln_hyb = ', ln_hyb 
     110 
    118111      ENDIF 
    119112 
     
    131124      IF( ln_zco      )   CALL zgr_zco          ! z-coordinate 
    132125      IF( ln_zps      )   CALL zgr_zps          ! Partial step z-coordinate 
    133       IF( ln_sco      )   CALL zgr_sco          ! s-coordinate or hybrid z-s coordinate 
     126      IF( ln_sco.AND. .NOT. ln_hyb )   CALL zgr_sco          ! s-coordinate or hybrid z-s coordinate (z at upper levels ) 
     127      IF( ln_sco  .AND.     ln_hyb )   CALL zgr_hyb          ! hybrid s-sigma z      ( s- at shel 
    134128      ! 
    135129      ! final adjustment of mbathy & check  
     
    520514      ENDIF 
    521515      ! 
     516      !  
    522517      CALL wrk_dealloc( jpidta, jpjdta, idta ) 
    523518      CALL wrk_dealloc( jpidta, jpjdta, zdta ) 
     
    639634         END DO 
    640635      END DO 
     636      IF( lk_mpp )   CALL mpp_sum( icompt ) 
    641637      IF( icompt == 0 ) THEN 
    642638         IF(lwp) WRITE(numout,*)'     no isolated ocean grid points' 
     
    10531049   END SUBROUTINE zgr_zps 
    10541050 
     1051 
     1052   FUNCTION fssig( pk ) RESULT( pf ) 
     1053      !!---------------------------------------------------------------------- 
     1054      !!                 ***  ROUTINE eos_init  *** 
     1055      !!        
     1056      !! ** Purpose :   provide the analytical function in s-coordinate 
     1057      !!           
     1058      !! ** Method  :   the function provide the non-dimensional position of 
     1059      !!                T and W (i.e. between 0 and 1) 
     1060      !!                T-points at integer values (between 1 and jpk) 
     1061      !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
     1062      !!---------------------------------------------------------------------- 
     1063      REAL(wp), INTENT(in) ::   pk   ! continuous "k" coordinate 
     1064      REAL(wp)             ::   pf   ! sigma value 
     1065      !!---------------------------------------------------------------------- 
     1066      ! 
     1067      pf =   (   TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1) + rn_thetb )  )   & 
     1068         &     - TANH( rn_thetb * rn_theta                                )  )   & 
     1069         & * (   COSH( rn_theta                           )                      & 
     1070         &     + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) )  )              & 
     1071         & / ( 2._wp * SINH( rn_theta ) ) 
     1072      ! 
     1073   END FUNCTION fssig 
     1074 
     1075 
     1076   FUNCTION fssig1( pk1, pbb ) RESULT( pf1 ) 
     1077      !!---------------------------------------------------------------------- 
     1078      !!                 ***  ROUTINE eos_init  *** 
     1079      !! 
     1080      !! ** Purpose :   provide the Song and Haidvogel version of the analytical function in s-coordinate 
     1081      !! 
     1082      !! ** Method  :   the function provides the non-dimensional position of 
     1083      !!                T and W (i.e. between 0 and 1) 
     1084      !!                T-points at integer values (between 1 and jpk) 
     1085      !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
     1086      !!---------------------------------------------------------------------- 
     1087      REAL(wp), INTENT(in) ::   pk1   ! continuous "k" coordinate 
     1088      REAL(wp), INTENT(in) ::   pbb   ! Stretching coefficient 
     1089      REAL(wp)             ::   pf1   ! sigma value 
     1090      !!---------------------------------------------------------------------- 
     1091      ! 
     1092      IF ( rn_theta == 0._wp ) then      ! uniform sigma 
     1093         pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1 ) 
     1094      ELSE                        ! stretched sigma 
     1095         pf1 =   ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1)) ) ) / SINH( rn_theta )              & 
     1096            &  + pbb * (  (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta )  )  & 
     1097            &        / ( 2._wp * TANH( 0.5_wp * rn_theta ) )  ) 
     1098      ENDIF 
     1099      ! 
     1100   END FUNCTION fssig1 
     1101   FUNCTION fssig2 ( pk, kmax ) RESULT( pf2 ) 
     1102      !!---------------------------------------------------------------------- 
     1103      !!                 ***  ROUTINE eos_init  *** 
     1104      !!        
     1105      !! ** Purpose :   provide the analytical function in s-coordinate 
     1106      !!           
     1107      !! ** Method  :   the function provide the non-dimensional position of 
     1108      !!                T and W (i.e. between 0 and 1) 
     1109      !!                T-points at integer values (between 1 and kmax ) 
     1110      !!                W-points at integer values - 1/2 (between 0.5 and kmax-0.5) 
     1111      !! 
     1112      !! Reference  :   ??? 
     1113      !!---------------------------------------------------------------------- 
     1114      REAL(wp), INTENT(in   ) ::   pk   ! continuous "k" coordinate 
     1115      REAL(wp)                ::   pf2   ! sigma value 
     1116      INTEGER, INTENT (in)    ::   kmax ! max of sigma)level  
     1117      !!---------------------------------------------------------------------- 
     1118      ! 
     1119      pf2 =   (   TANH( rn_theta * ( -(pk-0.5) / REAL(kmax-1,wp) + rn_thetb )  )      & 
     1120         &     - TANH( rn_thetb * rn_theta                                )  )   & 
     1121         & * (   COSH( rn_theta                           )                   & 
     1122         &     + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) )  )                & 
     1123         & / ( 2._wp * SINH( rn_theta ) ) 
     1124      ! 
     1125   END FUNCTION fssig2 
     1126 
     1127   FUNCTION fssig3( pk1, pbb ,kmax ) RESULT( pf3 ) 
     1128      !!---------------------------------------------------------------------- 
     1129      !!                 ***  ROUTINE eos_init  *** 
     1130      !! 
     1131      !! ** Purpose :   provide the Song and Haidvogel version of the analytical function in s-coordinate 
     1132      !! 
     1133      !! ** Method  :   the function provides the non-dimensional position of 
     1134      !!                T and W (i.e. between 0 and 1) 
     1135      !!                T-points at integer values (between 1 and jpk) 
     1136      !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
     1137      !! 
     1138      !! Reference  :   ??? 
     1139      !!---------------------------------------------------------------------- 
     1140      REAL(wp), INTENT(in   ) ::   pk1   ! continuous "k" coordinate 
     1141      REAL(wp), INTENT(in   ) ::   pbb   ! Stretching coefficient 
     1142      REAL(wp)                ::   pf3   ! sigma value 
     1143      INTEGER, INTENT (in)    ::   kmax  ! max number of s-sigma levels 
     1144      !!---------------------------------------------------------------------- 
     1145      ! 
     1146      IF ( rn_theta == 0 ) then      ! uniform sigma 
     1147         pf3 = -(pk1-0.5_wp) / REAL( kmax-1,wp ) 
     1148      ELSE                        ! stretched sigma 
     1149         pf3 =   (1.0-pbb) * (sinh( rn_theta*(-(pk1-0.5_wp)/REAL(kmax-1,wp)) ) ) / sinh(rn_theta) + & 
     1150            &    pbb * ( (tanh( rn_theta*( (-(pk1-0.5_wp)/REAL(kmax-1,wp)) + 0.5_wp) ) - tanh(0.5*rn_theta) ) / & 
     1151            &    (2._wp*tanh(0.5_wp*rn_theta) ) ) 
     1152      ENDIF 
     1153   END FUNCTION fssig3 
     1154    
     1155    SUBROUTINE fszref (zkth, zdzmin, zacr, zhmax,jpup,zhsigm ) 
     1156      INTEGER  ::   jk                             ! dummy loop indices 
     1157      REAL(wp) ::   zt, zw                         ! temporary scalars 
     1158      REAL(wp) ::   zsur, za0, za1, zkth           ! Values set from parameters in 
     1159      REAL(wp) ::   zacr, zdzmin, zhmax, zhmax_r    ! read from namelist or par_XXX.h90 
     1160      REAL(wp) ::   zhsigm                         ! depth of sigma layer 
     1161      INTEGER  ::   jpup, jpkmax                   ! the last sigma level and number of z-levels 
     1162      !!---------------------------------------------------------------------- 
     1163! compute reference  depth  leveles   
     1164      ! Set variables from parameters 
     1165      ! ------------------------------ 
     1166      ! zkth = rn_kth       ;   zacr = rn_acr 
     1167      ! zdzmin = rn_dzmin   ;   zhmax_r = rn_hmax 
     1168 
     1169      !  za0, za1, zsur are computed from zdzmin , zhmax, zkth, zacr 
     1170      ! 
     1171       jpkmax= jpk - jpup 
     1172       zhmax_r = zhmax - zhsigm 
     1173 
     1174         za1  = (  zdzmin - zhmax_r / REAL(jpkmax,wp)  )                                                      & 
     1175            & / ( TANH((1-zkth)/zacr) - zacr/REAL(jpkmax,wp) * (  LOG( COSH( (jpkmax + 1 - zkth) / zacr) )      & 
     1176            &                                                   - LOG( COSH( ( 1  - zkth) / zacr) )  )  ) 
     1177         za0  =     zdzmin - za1 *              TANH( (1-zkth) / zacr ) 
     1178         zsur =   - za0 - za1 * zacr * LOG( COSH( (1-zkth) / zacr )  ) 
     1179      ! Reference z-coordinate (depth - scale factor at T- and W-points) 
     1180      ! ====================== 
     1181      IF( zkth == 0.e0 ) THEN            !  uniform vertical grid 
     1182         za1 = zhmax_r / REAL(jpkmax-1,wp) 
     1183         DO jk = 1, jpkmax+1 
     1184            zw = REAL( jk,wp ) 
     1185            zt = REAL( jk,wp ) + 0.5_wp 
     1186            gdepw_0(jk+jpup-1 ) = ( zw - 1 ) * za1 + zhsigm 
     1187            gdept_0(jk+jpup-1 ) = ( zt - 1 ) * za1 + zhsigm 
     1188            e3w_0  (jk+jpup-1 ) =  za1 
     1189            e3t_0  (jk+jpup-1 ) =  za1 
     1190 
     1191         END DO 
     1192      ELSE                                ! Madec & Imbard 1996 function 
     1193         DO jk = 1, jpkmax+1 
     1194            zw = REAL( jk,wp) 
     1195            zt = REAL( jk,wp ) + 0.5_wp 
     1196            gdepw_0(jk+jpup-1) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth) / zacr ) )  )+zhsigm 
     1197            gdept_0(jk+jpup-1) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth) / zacr ) )  )+zhsigm 
     1198            e3w_0  (jk+jpup-1) =          za0      + za1        * TANH(       (zw-zkth) / zacr   ) 
     1199            e3t_0  (jk+jpup-1) =          za0      + za1        * TANH(       (zt-zkth) / zacr   ) 
     1200 
     1201         END DO 
     1202         gdepw_0(jpup) = zhsigm                     ! force first w-level to be exactly at zhsigm 
     1203      ENDIF 
     1204      IF(lwp) WRITE (numout,*) " max and min z-vertical level",jpkmax+1,jpup 
     1205 
     1206   END SUBROUTINE  fszref 
     1207 
     1208 
    10551209   SUBROUTINE zgr_sco 
    10561210      !!---------------------------------------------------------------------- 
     
    10711225      !!            hbatv = mj( hbatt ) 
    10721226      !!            hbatf = mi( mj( hbatt ) ) 
    1073       !!          - Compute z_gsigt, z_gsigw, z_esigt, z_esigw from an analytical 
     1227      !!          - Compute gsigt, gsigw, esigt, esigw from an analytical 
    10741228      !!         function and its derivative given as function. 
    1075       !!            z_gsigt(k) = fssig (k    ) 
    1076       !!            z_gsigw(k) = fssig (k-0.5) 
    1077       !!            z_esigt(k) = fsdsig(k    ) 
    1078       !!            z_esigw(k) = fsdsig(k-0.5) 
    1079       !!      Three options for stretching are give, and they can be modified 
    1080       !!      following the users requirements. Nevertheless, the output as 
     1229      !!            gsigt(k) = fssig (k    ) 
     1230      !!            gsigw(k) = fssig (k-0.5) 
     1231      !!            esigt(k) = fsdsig(k    ) 
     1232      !!            esigw(k) = fsdsig(k-0.5) 
     1233      !!      This routine is given as an example, it must be modified 
     1234      !!      following the user s desiderata. nevertheless, the output as 
    10811235      !!      well as the way to compute the model levels and scale factors 
    1082       !!      must be respected in order to insure second order accuracy 
     1236      !!      must be respected in order to insure second order a!!uracy 
    10831237      !!      schemes. 
    10841238      !! 
    1085       !!      The three methods for stretching available are: 
    1086       !!  
    1087       !!           s_sh94 (Song and Haidvogel 1994) 
    1088       !!                a sinh/tanh function that allows sigma and stretched sigma 
    1089       !! 
    1090       !!           s_sf12 (Siddorn and Furner 2012?) 
    1091       !!                allows the maintenance of fixed surface and or 
    1092       !!                bottom cell resolutions (cf. geopotential coordinates)  
    1093       !!                within an analytically derived stretched S-coordinate framework. 
    1094       !!  
    1095       !!          s_tanh  (Madec et al 1996) 
    1096       !!                a cosh/tanh function that gives stretched coordinates         
    1097       !! 
     1239      !! Reference : Madec, Lott, Delecluse and Crepon, 1996. JPO, 26, 1393-1408. 
    10981240      !!---------------------------------------------------------------------- 
    10991241      ! 
    11001242      INTEGER  ::   ji, jj, jk, jl           ! dummy loop argument 
    1101       INTEGER  ::   iip1, ijp1, iim1, ijm1   ! temporary integers 
    1102       REAL(wp) ::   zrmax, ztaper   ! temporary scalars 
    1103       ! 
    1104       REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, ztmp, zmsk, zri, zrj, zhbat 
    1105  
    1106       NAMELIST/namzgr_sco/ln_s_sh94, ln_s_sf12, ln_sigcrit, rn_sbot_min, rn_sbot_max, rn_hc, rn_rmax,rn_theta, & 
    1107                            rn_thetb, rn_bb, rn_alpha, rn_efold, rn_zs, rn_zb_a, rn_zb_b 
    1108      !!---------------------------------------------------------------------- 
     1243      INTEGER  ::   inum                      ! temporary logical unit 
     1244      INTEGER  ::   iip1, ijp1, iim1, ijm1, kdep   ! temporary integers 
     1245      REAL(wp) ::   zcoeft, zcoefw, zrmax, ztaper, maxzenv   ! temporary scalars 
     1246#if defined key_melange 
     1247      REAL(wp) ::   rn_hc_bak   ! temporary scalars 
     1248#endif 
     1249      REAL(wp) ::   zrfact   ! temporary scalars 
     1250      REAL(wp), POINTER, DIMENSION(:,:  ) :: ztmpi1, ztmpi2, ztmpj1, ztmpj2 
     1251      ! 
     1252#if defined key_fudge 
     1253      REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, zri, zrj, zhbat, fenv 
     1254#else 
     1255      REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, zri, zrj, zhbat 
     1256#endif 
     1257#if defined key_smsh 
     1258      REAL(wp), POINTER, DIMENSION(:,:,:) :: esigtu3, esigtv3, esigtf3, esigwu3, esigwv3            
     1259#else 
     1260      REAL(wp), POINTER, DIMENSION(:,:,:) :: gsigw3, gsigt3, gsi3w3 
     1261      REAL(wp), POINTER, DIMENSION(:,:,:) :: esigt3, esigw3, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3            
     1262#endif 
     1263      NAMELIST/namzgr_sco/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, ln_s_sigma, rn_bb, rn_hc 
     1264#if defined key_melange 
     1265      NAMELIST/namzgr_sco/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, ln_s_sigma, rn_bb, rn_hc, nn_sig_lev 
     1266#endif 
     1267      !!---------------------------------------------------------------------- 
    11091268      ! 
    11101269      IF( nn_timing == 1 )  CALL timing_start('zgr_sco') 
    11111270      ! 
    1112       CALL wrk_alloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat                           ) 
    1113       ! 
     1271      CALL wrk_alloc( jpi, jpj,      ztmpi1, ztmpi2, ztmpj1, ztmpj2         ) 
     1272#if defined key_fudge 
     1273      CALL wrk_alloc( jpi, jpj,      zenv, zri, zrj, zhbat, fenv     ) 
     1274#else 
     1275      CALL wrk_alloc( jpi, jpj,      zenv, zri, zrj, zhbat           ) 
     1276#endif 
     1277#if defined key_smsh 
     1278      CALL wrk_alloc( jpi, jpj, jpk, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 
     1279#else 
     1280      CALL wrk_alloc( jpi, jpj, jpk, gsigw3, gsigt3, gsi3w3                                      ) 
     1281      CALL wrk_alloc( jpi, jpj, jpk, esigt3, esigw3, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 
     1282#endif       
    11141283      REWIND( numnam )                       ! Read Namelist namzgr_sco : sigma-stretching parameters 
    11151284      READ  ( numnam, namzgr_sco ) 
     
    11201289         WRITE(numout,*) '~~~~~~~~~~~' 
    11211290         WRITE(numout,*) '   Namelist namzgr_sco' 
    1122          WRITE(numout,*) '     stretching coeffs ' 
    1123          WRITE(numout,*) '        maximum depth of s-bottom surface (>0)       rn_sbot_max   = ',rn_sbot_max 
    1124          WRITE(numout,*) '        minimum depth of s-bottom surface (>0)       rn_sbot_min   = ',rn_sbot_min 
    1125          WRITE(numout,*) '        Critical depth                               rn_hc         = ',rn_hc 
    1126          WRITE(numout,*) '        maximum cut-off r-value allowed              rn_rmax       = ',rn_rmax 
    1127          WRITE(numout,*) '     Song and Haidvogel 1994 stretching              ln_s_sh94     = ',ln_s_sh94 
    1128          WRITE(numout,*) '        Song and Haidvogel 1994 stretching coefficients' 
    1129          WRITE(numout,*) '        surface control parameter (0<=rn_theta<=20)  rn_theta      = ',rn_theta 
    1130          WRITE(numout,*) '        bottom  control parameter (0<=rn_thetb<= 1)  rn_thetb      = ',rn_thetb 
    1131          WRITE(numout,*) '        stretching parameter (song and haidvogel)    rn_bb         = ',rn_bb 
    1132          WRITE(numout,*) '     Siddorn and Furner 2012 stretching              ln_s_sf12     = ',ln_s_sf12 
    1133          WRITE(numout,*) '        switching to sigma (T) or Z (F) at H<Hc      ln_sigcrit    = ',ln_sigcrit 
    1134          WRITE(numout,*) '        Siddorn and Furner 2012 stretching coefficients' 
    1135          WRITE(numout,*) '        stretchin parameter ( >1 surface; <1 bottom) rn_alpha      = ',rn_alpha 
    1136          WRITE(numout,*) '        e-fold length scale for transition region    rn_efold      = ',rn_efold 
    1137          WRITE(numout,*) '        Surface cell depth (Zs) (m)                  rn_zs         = ',rn_zs 
    1138          WRITE(numout,*) '        Bathymetry multiplier for Zb                 rn_zb_a       = ',rn_zb_a 
    1139          WRITE(numout,*) '        Offset for Zb                                rn_zb_b       = ',rn_zb_b 
    1140          WRITE(numout,*) '        Bottom cell (Zb) (m) = H*rn_zb_a + rn_zb_b' 
    1141       ENDIF 
     1291         WRITE(numout,*) '      sigma-stretching coeffs ' 
     1292         WRITE(numout,*) '      maximum depth of s-bottom surface (>0)       rn_sbot_max   = ' ,rn_sbot_max 
     1293         WRITE(numout,*) '      minimum depth of s-bottom surface (>0)       rn_sbot_min   = ' ,rn_sbot_min 
     1294         WRITE(numout,*) '      surface control parameter (0<=rn_theta<=20)  rn_theta      = ', rn_theta 
     1295         WRITE(numout,*) '      bottom  control parameter (0<=rn_thetb<= 1)  rn_thetb      = ', rn_thetb 
     1296         WRITE(numout,*) '      maximum cut-off r-value allowed              rn_rmax       = ', rn_rmax 
     1297         WRITE(numout,*) '      Hybrid s-sigma-coordinate                    ln_s_sigma    = ', ln_s_sigma 
     1298         WRITE(numout,*) '      stretching parameter (song and haidvogel)    rn_bb         = ', rn_bb 
     1299         WRITE(numout,*) '      Critical depth                               rn_hc         = ', rn_hc 
     1300      ENDIF 
     1301       
     1302#if defined key_melange 
     1303      CALL zgr_zps          ! Partial step z-coordinate 
     1304      ! Scale factors and depth at U-, V-, UW and VW-points 
     1305      DO jk = 1, nn_sig_lev                        ! initialisation to z-scale factors above ln_s_sigma to remove any zps 
     1306         e3u (:,:,jk) = e3t_0(jk) 
     1307         e3v (:,:,jk) = e3t_0(jk) 
     1308         e3uw(:,:,jk) = e3w_0(jk) 
     1309         e3vw(:,:,jk) = e3w_0(jk) 
     1310      END DO 
     1311#endif 
     1312 
     1313      gsigw3  = 0._wp   ;   gsigt3  = 0._wp   ;   gsi3w3  = 0._wp 
     1314      esigt3  = 0._wp   ;   esigw3  = 0._wp  
     1315      esigtu3 = 0._wp   ;   esigtv3 = 0._wp   ;   esigtf3 = 0._wp 
     1316      esigwu3 = 0._wp   ;   esigwv3 = 0._wp 
    11421317 
    11431318      hift(:,:) = rn_sbot_min                     ! set the minimum depth for the s-coordinate 
     
    11581333      !                                        ! ============================= 
    11591334      ! use r-value to create hybrid coordinates 
     1335      zenv(:,:) = bathy(:,:) 
     1336#if defined key_melange 
     1337      DO jj = 1, jpj 
     1338         DO ji = 1, jpi 
     1339           zenv(ji,jj) = MIN( bathy(ji,jj), gdepw_0(nn_sig_lev + 1) ) 
     1340         ENDDO 
     1341      ENDDO 
     1342#endif 
     1343#if defined key_fudge 
     1344            CALL iom_open ( 'fudge.nc', inum )   
     1345            CALL iom_get  ( inum, jpdom_data, 'zenv', fenv ) 
     1346            CALL iom_close( inum ) 
     1347      DO jj = 1, jpj 
     1348         DO ji = 1, jpi 
     1349              zenv(ji,jj) = MAX( zenv(ji,jj), fenv(ji,jj) ) 
     1350         ENDDO 
     1351      ENDDO 
     1352#endif 
     1353      ! 
     1354      ! set first land point adjacent to a wet cell to sbot_min as this needs to be included in smoothing 
     1355      DO jj = 1, jpj 
     1356         DO ji = 1, jpi 
     1357           IF( bathy(ji,jj) == 0._wp ) THEN 
     1358             iip1 = MIN( ji+1, jpi ) 
     1359             ijp1 = MIN( jj+1, jpj ) 
     1360             iim1 = MAX( ji-1, 1 ) 
     1361             ijm1 = MAX( jj-1, 1 ) 
     1362             IF( (bathy(iip1,jj) + bathy(iim1,jj) + bathy(ji,ijp1) + bathy(ji,ijm1) +              & 
     1363        &         bathy(iip1,ijp1) + bathy(iim1,ijm1) + bathy(iip1,ijp1) + bathy(iim1,ijm1)) > 0._wp ) THEN 
     1364               zenv(ji,jj) = rn_sbot_min 
     1365             ENDIF 
     1366           ENDIF 
     1367         END DO 
     1368      END DO 
     1369      ! apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
     1370      CALL lbc_lnk( zenv, 'T', 1._wp, 'no0' ) 
     1371      !  
     1372      ! smooth the bathymetry (if required) 
     1373      scosrf(:,:) = 0._wp             ! ocean surface depth (here zero: no under ice-shelf sea) 
     1374      scobot(:,:) = bathy(:,:)        ! ocean bottom  depth 
     1375      ! 
     1376      jl = 0 
     1377      zrmax = 1._wp 
     1378      !      
     1379      ! set scaling factor used in reducing vertical gradients 
     1380      zrfact = ( 1._wp - rn_rmax ) / ( 1._wp + rn_rmax )  
     1381      ! 
     1382      ! initialise temporary evelope depth arrays 
     1383      ztmpi1(:,:) = zenv(:,:) 
     1384      ztmpi2(:,:) = zenv(:,:) 
     1385      ztmpj1(:,:) = zenv(:,:) 
     1386      ztmpj2(:,:) = zenv(:,:) 
     1387      ! 
     1388      ! initialise temporary r-value arrays 
     1389      zri(:,:) = 1._wp 
     1390      zrj(:,:) = 1._wp 
     1391      !                                                            ! ================ ! 
     1392      DO WHILE( jl <= 10000 .AND. ( zrmax - rn_rmax ) > 1.e-8_wp ) !  Iterative loop  ! 
     1393         !                                                         ! ================ ! 
     1394         jl = jl + 1 
     1395         zrmax = 0._wp 
     1396         ! we set zrmax from previous r-values (zri and zrj) first 
     1397         ! if set after current r-value calculation (as previously) 
     1398         ! we could exit DO WHILE prematurely before checking r-value 
     1399         ! of current zenv 
     1400         DO jj = 1, nlcj 
     1401            DO ji = 1, nlci 
     1402               zrmax = MAX( zrmax, ABS(zri(ji,jj)), ABS(zrj(ji,jj)) ) 
     1403            END DO 
     1404         END DO 
     1405         zri(:,:) = 0._wp 
     1406         zrj(:,:) = 0._wp 
     1407         DO jj = 1, nlcj 
     1408            DO ji = 1, nlci 
     1409               iip1 = MIN( ji+1, nlci )      ! force zri = 0 on last line (ji=ncli+1 to jpi) 
     1410               ijp1 = MIN( jj+1, nlcj )      ! force zrj = 0 on last raw  (jj=nclj+1 to jpj) 
     1411               IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(iip1,jj) > 0._wp)) THEN 
     1412                  zri(ji,jj) = ( zenv(iip1,jj  ) - zenv(ji,jj) ) / ( zenv(iip1,jj  ) + zenv(ji,jj) ) 
     1413               END IF 
     1414               IF( (zenv(ji,jj) > 0._wp) .AND. (zenv(ji,ijp1) > 0._wp)) THEN 
     1415                  zrj(ji,jj) = ( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) ) 
     1416               END IF 
     1417               IF( zri(ji,jj) >  rn_rmax )   ztmpi1(ji  ,jj  ) = zenv(iip1,jj  ) * zrfact 
     1418               IF( zri(ji,jj) < -rn_rmax )   ztmpi2(iip1,jj  ) = zenv(ji  ,jj  ) * zrfact  
     1419               IF( zrj(ji,jj) >  rn_rmax )   ztmpj1(ji  ,jj  ) = zenv(ji  ,ijp1) * zrfact 
     1420               IF( zrj(ji,jj) < -rn_rmax )   ztmpj2(ji  ,ijp1) = zenv(ji  ,jj  ) * zrfact 
     1421            END DO 
     1422         END DO 
     1423         IF( lk_mpp )   CALL mpp_max( zrmax )   ! max over the global domain 
     1424         ! 
     1425         IF(lwp)WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax 
     1426         ! 
     1427         DO jj = 1, nlcj 
     1428            DO ji = 1, nlci 
     1429               zenv(ji,jj) = MAX(zenv(ji,jj), ztmpi1(ji,jj), ztmpi2(ji,jj), ztmpj1(ji,jj), ztmpj2(ji,jj) ) 
     1430            END DO 
     1431         END DO 
     1432         ! apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
     1433         CALL lbc_lnk( zenv, 'T', 1._wp, 'no0' ) 
     1434         !                                                  ! ================ ! 
     1435      END DO                                                !     End loop     ! 
     1436      !                                                     ! ================ ! 
     1437      DO jj = 1, jpj 
     1438         DO ji = 1, jpi 
     1439            zenv(ji,jj) = MAX( zenv(ji,jj), rn_sbot_min ) ! set all points to avoid undefined scale value warnings 
     1440         END DO 
     1441      END DO 
     1442      ! 
     1443      ! Envelope bathymetry saved in hbatt 
     1444      hbatt(:,:) = zenv(:,:)  
     1445 
     1446      IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0._wp ) THEN 
     1447         CALL ctl_warn( ' s-coordinates are tapered in vicinity of the Equator' ) 
     1448         DO jj = 1, jpj 
     1449            DO ji = 1, jpi 
     1450               ztaper = EXP( -(gphit(ji,jj)/8._wp)**2._wp ) 
     1451               hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * ( 1._wp - ztaper ) 
     1452            END DO 
     1453         END DO 
     1454      ENDIF 
     1455      ! 
     1456      IF(lwp) THEN                             ! Control print 
     1457         WRITE(numout,*) 
     1458         WRITE(numout,*) ' domzgr: hbatt field; ocean depth in meters' 
     1459         WRITE(numout,*) 
     1460         CALL prihre( hbatt(1,1), jpi, jpj, 1, jpi, 1, 1, jpj, 1, 0._wp, numout ) 
     1461         IF( nprint == 1 )   THEN         
     1462            WRITE(numout,*) ' bathy  MAX ', MAXVAL( bathy(:,:) ), ' MIN ', MINVAL( bathy(:,:) ) 
     1463            WRITE(numout,*) ' hbatt  MAX ', MAXVAL( hbatt(:,:) ), ' MIN ', MINVAL( hbatt(:,:) ) 
     1464         ENDIF 
     1465      ENDIF 
     1466 
     1467      !                                        ! ============================== 
     1468      !                                        !   hbatu, hbatv, hbatf fields 
     1469      !                                        ! ============================== 
     1470      IF(lwp) THEN 
     1471         WRITE(numout,*) 
     1472         WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', rn_sbot_min 
     1473      ENDIF 
     1474      hbatu(:,:) = rn_sbot_min 
     1475      hbatv(:,:) = rn_sbot_min 
     1476      hbatf(:,:) = rn_sbot_min 
     1477      DO jj = 1, jpjm1 
     1478        DO ji = 1, jpim1   ! NO vector opt. 
     1479           hbatu(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji+1,jj  ) ) 
     1480           hbatv(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1) ) 
     1481           hbatf(ji,jj) = 0.25_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1)   & 
     1482              &                     + hbatt(ji+1,jj) + hbatt(ji+1,jj+1) ) 
     1483        END DO 
     1484      END DO 
     1485      !  
     1486      ! Apply lateral boundary condition 
     1487!!gm  ! CAUTION: retain non zero value in the initial file this should be OK for orca cfg, not for EEL 
     1488      zhbat(:,:) = hbatu(:,:)   ;   CALL lbc_lnk( hbatu, 'U', 1._wp ) 
     1489      DO jj = 1, jpj 
     1490         DO ji = 1, jpi 
     1491            IF( hbatu(ji,jj) == 0._wp ) THEN 
     1492               IF( zhbat(ji,jj) == 0._wp )   hbatu(ji,jj) = rn_sbot_min 
     1493               IF( zhbat(ji,jj) /= 0._wp )   hbatu(ji,jj) = zhbat(ji,jj) 
     1494            ENDIF 
     1495         END DO 
     1496      END DO 
     1497      zhbat(:,:) = hbatv(:,:)   ;   CALL lbc_lnk( hbatv, 'V', 1._wp ) 
     1498      DO jj = 1, jpj 
     1499         DO ji = 1, jpi 
     1500            IF( hbatv(ji,jj) == 0._wp ) THEN 
     1501               IF( zhbat(ji,jj) == 0._wp )   hbatv(ji,jj) = rn_sbot_min 
     1502               IF( zhbat(ji,jj) /= 0._wp )   hbatv(ji,jj) = zhbat(ji,jj) 
     1503            ENDIF 
     1504         END DO 
     1505      END DO 
     1506      zhbat(:,:) = hbatf(:,:)   ;   CALL lbc_lnk( hbatf, 'F', 1._wp ) 
     1507      DO jj = 1, jpj 
     1508         DO ji = 1, jpi 
     1509            IF( hbatf(ji,jj) == 0._wp ) THEN 
     1510               IF( zhbat(ji,jj) == 0._wp )   hbatf(ji,jj) = rn_sbot_min 
     1511               IF( zhbat(ji,jj) /= 0._wp )   hbatf(ji,jj) = zhbat(ji,jj) 
     1512            ENDIF 
     1513         END DO 
     1514      END DO 
     1515 
     1516!!bug:  key_helsinki a verifer 
     1517      hift(:,:) = MIN( hift(:,:), hbatt(:,:) ) 
     1518      hifu(:,:) = MIN( hifu(:,:), hbatu(:,:) ) 
     1519      hifv(:,:) = MIN( hifv(:,:), hbatv(:,:) ) 
     1520      hiff(:,:) = MIN( hiff(:,:), hbatf(:,:) ) 
     1521 
     1522      IF( nprint == 1 .AND. lwp )   THEN 
     1523         WRITE(numout,*) ' MAX val hif   t ', MAXVAL( hift (:,:) ), ' f ', MAXVAL( hiff (:,:) ),  & 
     1524            &                        ' u ',   MAXVAL( hifu (:,:) ), ' v ', MAXVAL( hifv (:,:) ) 
     1525         WRITE(numout,*) ' MIN val hif   t ', MINVAL( hift (:,:) ), ' f ', MINVAL( hiff (:,:) ),  & 
     1526            &                        ' u ',   MINVAL( hifu (:,:) ), ' v ', MINVAL( hifv (:,:) ) 
     1527         WRITE(numout,*) ' MAX val hbat  t ', MAXVAL( hbatt(:,:) ), ' f ', MAXVAL( hbatf(:,:) ),  & 
     1528            &                        ' u ',   MAXVAL( hbatu(:,:) ), ' v ', MAXVAL( hbatv(:,:) ) 
     1529         WRITE(numout,*) ' MIN val hbat  t ', MINVAL( hbatt(:,:) ), ' f ', MINVAL( hbatf(:,:) ),  & 
     1530            &                        ' u ',   MINVAL( hbatu(:,:) ), ' v ', MINVAL( hbatv(:,:) ) 
     1531      ENDIF 
     1532!! helsinki 
     1533 
     1534      !                                            ! ======================= 
     1535      !                                            !   s-ccordinate fields     (gdep., e3.) 
     1536      !                                            ! ======================= 
     1537      ! 
     1538      ! non-dimensional "sigma" for model level depth at w- and t-levels 
     1539 
     1540      IF( ln_s_sigma ) THEN        ! Song and Haidvogel style stretched sigma for depths 
     1541         !                         ! below rn_hc, with uniform sigma in shallower waters 
     1542         DO ji = 1, jpi 
     1543            DO jj = 1, jpj 
     1544 
     1545               IF( hbatt(ji,jj) > rn_hc ) THEN    !deep water, stretched sigma 
     1546                  DO jk = 1, jpk 
     1547#if defined key_melange 
     1548                     gsigw3(ji,jj,jk) = gdepw_0(jk)/gdepw_0(nn_sig_lev + 1) 
     1549                     gsigt3(ji,jj,jk) = gdept_0(jk)/gdepw_0(nn_sig_lev + 1) 
     1550#else 
     1551                     gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb ) 
     1552                     gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp)       , rn_bb ) 
     1553#endif 
     1554                  END DO 
     1555               ELSE ! shallow water, uniform sigma 
     1556                  DO jk = 1, jpk 
     1557#if defined key_melange 
     1558                     gsigw3(ji,jj,jk) =   REAL(jk-1,wp)            / REAL(nn_sig_lev,wp) 
     1559                     gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(nn_sig_lev,wp) 
     1560#else 
     1561                     gsigw3(ji,jj,jk) =   REAL(jk-1,wp)            / REAL(jpk-1,wp) 
     1562                     gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(jpk-1,wp) 
     1563#endif 
     1564                  END DO 
     1565               ENDIF 
     1566               IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'gsigw3 1 jpk    ', gsigw3(ji,jj,1), gsigw3(ji,jj,jpk) 
     1567               ! 
     1568               DO jk = 1, jpkm1 
     1569                  esigt3(ji,jj,jk  ) = gsigw3(ji,jj,jk+1) - gsigw3(ji,jj,jk) 
     1570                  esigw3(ji,jj,jk+1) = gsigt3(ji,jj,jk+1) - gsigt3(ji,jj,jk) 
     1571               END DO 
     1572               esigw3(ji,jj,1  ) = 2._wp * ( gsigt3(ji,jj,1  ) - gsigw3(ji,jj,1  ) ) 
     1573               esigt3(ji,jj,jpk) = 2._wp * ( gsigt3(ji,jj,jpk) - gsigw3(ji,jj,jpk) ) 
     1574               ! 
     1575               ! Coefficients for vertical depth as the sum of e3w scale factors 
     1576               gsi3w3(ji,jj,1) = 0.5_wp * esigw3(ji,jj,1) 
     1577               DO jk = 2, jpk 
     1578                  gsi3w3(ji,jj,jk) = gsi3w3(ji,jj,jk-1) + esigw3(ji,jj,jk) 
     1579               END DO 
     1580               ! 
     1581#if defined key_melange 
     1582               DO jk = 1, nn_sig_lev+1 
     1583!              DO jk = 1, jpk 
     1584               IF( bathy(ji,jj) < gdepw_0(nn_sig_lev + 1) ) THEN ! should this be bathy or hbatt? 
     1585#else 
     1586               DO jk = 1, jpk 
     1587#endif 
     1588#if defined key_melange 
     1589                  zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(nn_sig_lev,wp) 
     1590                  zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(nn_sig_lev,wp) 
     1591!                 zcoeft = ( REAL(MIN(jk,nn_sig_lev),wp) - 0.5_wp ) / REAL(nn_sig_lev-1,wp) 
     1592!                 zcoefw = ( REAL(MIN(jk,nn_sig_lev),wp) - 1.0_wp ) / REAL(nn_sig_lev-1,wp) 
     1593#else 
     1594                  zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 
     1595                  zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 
     1596#endif 
     1597#if defined key_melange 
     1598                  rn_hc_bak = rn_hc 
     1599                  rn_hc = MIN( MAX ( & 
     1600                &            (hbatt(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc)) & 
     1601                &                   ,0._wp) ,rn_hc) 
     1602#endif 
     1603                  gdept (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsigt3(ji,jj,jk)+rn_hc*zcoeft ) 
     1604                  gdepw (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsigw3(ji,jj,jk)+rn_hc*zcoefw ) 
     1605                  gdep3w(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsi3w3(ji,jj,jk)+rn_hc*zcoeft ) 
     1606#if defined key_melange 
     1607                  rn_hc = rn_hc_bak 
     1608#endif 
     1609               IF( gdepw(ji,jj,jk) < 0._wp ) THEN 
     1610                  WRITE(*,*) 'zgr_sco :   gdepw  at point (i,j,k)= ', ji, jj, jk, (gsigw3(ji,jj,jk)*10000._wp-zcoefw*10000._wp) 
     1611               ENDIF 
     1612#if defined key_melange 
     1613               ENDIF 
     1614#endif 
     1615               END DO 
     1616               ! 
     1617            END DO   ! for all jj's 
     1618         END DO    ! for all ji's 
     1619 
     1620         DO ji = 1, jpim1 
     1621            DO jj = 1, jpjm1 
     1622#if defined key_melange 
     1623               IF( bathy(ji,jj) < gdepw_0(nn_sig_lev + 1) ) THEN ! should this be bathy or hbatt? 
     1624               DO jk = 1, nn_sig_lev+1      ! scale factors should be the same in both zps and sco when H > Hcrit?? 
     1625!              DO jk = 1, jpk 
     1626#else 
     1627               DO jk = 1, jpk 
     1628#endif 
     1629                  esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk) )   & 
     1630                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
     1631                  esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji,jj+1)*esigt3(ji,jj+1,jk) )   & 
     1632                     &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
     1633                  esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk)     & 
     1634                     &                + hbatt(ji,jj+1)*esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*esigt3(ji+1,jj+1,jk) )   & 
     1635                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 
     1636                  esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji+1,jj)*esigw3(ji+1,jj,jk) )   & 
     1637                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
     1638                  esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji,jj+1)*esigw3(ji,jj+1,jk) )   & 
     1639                     &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
     1640                  ! 
     1641#if defined key_melange 
     1642                  rn_hc_bak = rn_hc 
     1643                  rn_hc = MIN( MAX( & 
     1644                &            (hbatt(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc)) & 
     1645                &                   ,0._wp) ,rn_hc) 
     1646!                 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1647!                 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1648                  e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1649                  e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1650#else 
     1651                  e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1652                  e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1653#endif 
     1654#if defined key_melange 
     1655                  rn_hc = MIN( MAX( & 
     1656                &            (hbatu(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc_bak)) & 
     1657                &                   ,0._wp) ,rn_hc_bak) 
     1658!                 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1659!                 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1660                  e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1661                  e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1662#else 
     1663                  e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1664                  e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1665#endif 
     1666#if defined key_melange 
     1667                  rn_hc = MIN( MAX( & 
     1668                &            (hbatv(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc_bak)) & 
     1669                &                   ,0._wp) ,rn_hc_bak) 
     1670!                 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1671!                 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1672                  e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1673                  e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1674#else 
     1675                  e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1676                  e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
     1677#endif 
     1678#if defined key_melange 
     1679                  rn_hc = MIN( MAX( & 
     1680                &            (hbatf(ji,jj)-gdepw_0(nn_sig_lev + 1)) / (1._wp - (gdepw_0(nn_sig_lev + 1)/rn_hc_bak)) & 
     1681                &                   ,0._wp), rn_hc_bak) 
     1682!                 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev - 1,wp) ) 
     1683                  e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/REAL(nn_sig_lev ,wp) ) 
     1684#else 
     1685                  e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp)) 
     1686#endif 
     1687                  ! 
     1688#if defined key_melange 
     1689                  rn_hc = rn_hc_bak 
     1690#endif 
     1691               END DO 
     1692#if defined key_melange 
     1693               ENDIF 
     1694#endif 
     1695            END DO 
     1696         END DO 
     1697 
     1698         CALL lbc_lnk( e3t , 'T', 1._wp ) 
     1699         CALL lbc_lnk( e3u , 'U', 1._wp ) 
     1700         CALL lbc_lnk( e3v , 'V', 1._wp ) 
     1701         CALL lbc_lnk( e3f , 'F', 1._wp ) 
     1702         CALL lbc_lnk( e3w , 'W', 1._wp ) 
     1703         CALL lbc_lnk( e3uw, 'U', 1._wp ) 
     1704         CALL lbc_lnk( e3vw, 'V', 1._wp ) 
     1705 
     1706         ! 
     1707      ELSE   ! not ln_s_sigma 
     1708         ! 
     1709         DO jk = 1, jpk 
     1710           gsigw(jk) = -fssig( REAL(jk,wp)-0.5_wp ) 
     1711           gsigt(jk) = -fssig( REAL(jk,wp)        ) 
     1712         END DO 
     1713         IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'gsigw 1 jpk    ', gsigw(1), gsigw(jpk) 
     1714         ! 
     1715         ! Coefficients for vertical scale factors at w-, t- levels 
     1716!!gm bug :  define it from analytical function, not like juste bellow.... 
     1717!!gm        or betteroffer the 2 possibilities.... 
     1718         DO jk = 1, jpkm1 
     1719            esigt(jk  ) = gsigw(jk+1) - gsigw(jk) 
     1720            esigw(jk+1) = gsigt(jk+1) - gsigt(jk) 
     1721         END DO 
     1722         esigw( 1 ) = 2._wp * ( gsigt(1  ) - gsigw(1  ) )  
     1723         esigt(jpk) = 2._wp * ( gsigt(jpk) - gsigw(jpk) ) 
     1724 
     1725!!gm  original form 
     1726!!org DO jk = 1, jpk 
     1727!!org    esigt(jk)=fsdsig( FLOAT(jk)     ) 
     1728!!org    esigw(jk)=fsdsig( FLOAT(jk)-0.5 ) 
     1729!!org END DO 
     1730!!gm 
     1731         ! 
     1732         ! Coefficients for vertical depth as the sum of e3w scale factors 
     1733         gsi3w(1) = 0.5_wp * esigw(1) 
     1734         DO jk = 2, jpk 
     1735            gsi3w(jk) = gsi3w(jk-1) + esigw(jk) 
     1736         END DO 
     1737!!gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays) 
     1738         DO jk = 1, jpk 
     1739            zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 
     1740            zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 
     1741            gdept (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsigt(jk) + hift(:,:)*zcoeft ) 
     1742            gdepw (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsigw(jk) + hift(:,:)*zcoefw ) 
     1743            gdep3w(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsi3w(jk) + hift(:,:)*zcoeft ) 
     1744         END DO 
     1745!!gm: e3uw, e3vw can be suppressed  (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays) 
     1746         DO jj = 1, jpj 
     1747            DO ji = 1, jpi 
     1748               DO jk = 1, jpk 
     1749                 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*esigt(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 
     1750                 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*esigt(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 
     1751                 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*esigt(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 
     1752                 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-hiff(ji,jj))*esigt(jk) + hiff(ji,jj)/REAL(jpkm1,wp) ) 
     1753                 ! 
     1754                 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*esigw(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 
     1755                 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*esigw(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 
     1756                 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*esigw(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 
     1757               END DO 
     1758            END DO 
     1759         END DO 
     1760         ! 
     1761      ENDIF ! ln_s_sigma 
     1762 
     1763      where (e3t   (:,:,:).eq.0._wp)  e3t(:,:,:) = 1._wp 
     1764      where (e3u   (:,:,:).eq.0._wp)  e3u(:,:,:) = 1._wp 
     1765      where (e3v   (:,:,:).eq.0._wp)  e3v(:,:,:) = 1._wp 
     1766      where (e3f   (:,:,:).eq.0._wp)  e3f(:,:,:) = 1._wp 
     1767      where (e3w   (:,:,:).eq.0._wp)  e3w(:,:,:) = 1._wp 
     1768      where (e3uw  (:,:,:).eq.0._wp)  e3uw(:,:,:) = 1._wp 
     1769      where (e3vw  (:,:,:).eq.0._wp)  e3vw(:,:,:) = 1._wp 
     1770 
     1771 
     1772      fsdept(:,:,:) = gdept (:,:,:) 
     1773      fsdepw(:,:,:) = gdepw (:,:,:) 
     1774      fsde3w(:,:,:) = gdep3w(:,:,:) 
     1775      fse3t (:,:,:) = e3t   (:,:,:) 
     1776      fse3u (:,:,:) = e3u   (:,:,:) 
     1777      fse3v (:,:,:) = e3v   (:,:,:) 
     1778      fse3f (:,:,:) = e3f   (:,:,:) 
     1779      fse3w (:,:,:) = e3w   (:,:,:) 
     1780      fse3uw(:,:,:) = e3uw  (:,:,:) 
     1781      fse3vw(:,:,:) = e3vw  (:,:,:) 
     1782!! 
     1783      ! HYBRID :  
     1784      DO jj = 1, jpj 
     1785         DO ji = 1, jpi 
     1786#if defined key_melange 
     1787               IF( bathy(ji,jj) < gdepw_0(nn_sig_lev + 1) ) THEN ! should this be hbatt or bathy 
     1788               DO jk = 1, nn_sig_lev   
     1789!              DO jk = 1, jpkm1 
     1790#else 
     1791               DO jk = 1, jpkm1 
     1792#endif 
     1793                   IF( scobot(ji,jj) >= fsdept(ji,jj,jk) )   mbathy(ji,jj) = MAX(  2, jk ) 
     1794               END DO 
     1795#if defined key_melange 
     1796               ENDIF 
     1797#endif 
     1798               IF( scobot(ji,jj) == 0._wp            )   mbathy(ji,jj) = 0 
     1799         END DO 
     1800      END DO 
     1801      IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ),   & 
     1802         &                                                       ' MAX ', MAXVAL( mbathy(:,:) ) 
     1803 
     1804      !                                               ! ============= 
     1805      IF(lwp) THEN                                    ! Control print 
     1806         !                                            ! ============= 
     1807         WRITE(numout,*)  
     1808         WRITE(numout,*) ' domzgr: vertical coefficients for model level' 
     1809         WRITE(numout, "(9x,'  level    gsigt      gsigw      esigt      esigw      gsi3w')" ) 
     1810         WRITE(numout, "(10x,i4,5f11.4)" ) ( jk, gsigt(jk), gsigw(jk), esigt(jk), esigw(jk), gsi3w(jk), jk=1,jpk ) 
     1811      ENDIF 
     1812      IF( nprint == 1  .AND. lwp )   THEN         ! min max values over the local domain 
     1813         WRITE(numout,*) ' MIN val mbathy  ', MINVAL( mbathy(:,:)   ), ' MAX ', MAXVAL( mbathy(:,:) ) 
     1814         WRITE(numout,*) ' MIN val depth t ', MINVAL( fsdept(:,:,:) ),   & 
     1815            &                          ' w ', MINVAL( fsdepw(:,:,:) ), '3w '  , MINVAL( fsde3w(:,:,:) ) 
     1816         WRITE(numout,*) ' MIN val e3    t ', MINVAL( fse3t (:,:,:) ), ' f '  , MINVAL( fse3f (:,:,:) ),   & 
     1817            &                          ' u ', MINVAL( fse3u (:,:,:) ), ' u '  , MINVAL( fse3v (:,:,:) ),   & 
     1818            &                          ' uw', MINVAL( fse3uw(:,:,:) ), ' vw'  , MINVAL( fse3vw(:,:,:) ),   & 
     1819            &                          ' w ', MINVAL( fse3w (:,:,:) ) 
     1820 
     1821         WRITE(numout,*) ' MAX val depth t ', MAXVAL( fsdept(:,:,:) ),   & 
     1822            &                          ' w ', MAXVAL( fsdepw(:,:,:) ), '3w '  , MAXVAL( fsde3w(:,:,:) ) 
     1823         WRITE(numout,*) ' MAX val e3    t ', MAXVAL( fse3t (:,:,:) ), ' f '  , MAXVAL( fse3f (:,:,:) ),   & 
     1824            &                          ' u ', MAXVAL( fse3u (:,:,:) ), ' u '  , MAXVAL( fse3v (:,:,:) ),   & 
     1825            &                          ' uw', MAXVAL( fse3uw(:,:,:) ), ' vw'  , MAXVAL( fse3vw(:,:,:) ),   & 
     1826            &                          ' w ', MAXVAL( fse3w (:,:,:) ) 
     1827      ENDIF 
     1828      ! 
     1829      IF(lwp) THEN                                  ! selected vertical profiles 
     1830         WRITE(numout,*) 
     1831         WRITE(numout,*) ' domzgr: vertical coordinates : point (1,1,k) bathy = ', bathy(1,1), hbatt(1,1) 
     1832         WRITE(numout,*) ' ~~~~~~  --------------------' 
     1833         WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
     1834         WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(1,1,jk), fsdepw(1,1,jk),     & 
     1835            &                                 fse3t (1,1,jk), fse3w (1,1,jk), jk=1,jpk ) 
     1836         DO jj = mj0(20), mj1(20) 
     1837            DO ji = mi0(20), mi1(20) 
     1838               WRITE(numout,*) 
     1839               WRITE(numout,*) ' domzgr: vertical coordinates : point (20,20,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
     1840               WRITE(numout,*) ' ~~~~~~  --------------------' 
     1841               WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
     1842               WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     & 
     1843                  &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 
     1844            END DO 
     1845         END DO 
     1846         DO jj = mj0(74), mj1(74) 
     1847            DO ji = mi0(100), mi1(100) 
     1848               WRITE(numout,*) 
     1849               WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
     1850               WRITE(numout,*) ' ~~~~~~  --------------------' 
     1851               WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
     1852               WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     & 
     1853                  &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 
     1854            END DO 
     1855         END DO 
     1856      ENDIF 
     1857 
     1858!!gm bug?  no more necessary?  if ! defined key_helsinki 
     1859      DO jk = 1, jpk 
     1860         DO jj = 1, jpj 
     1861            DO ji = 1, jpi 
     1862               IF( fse3w(ji,jj,jk) <= 0._wp .OR. fse3t(ji,jj,jk) <= 0._wp ) THEN 
     1863                  WRITE(*,*) 'zgr_sco :   e3w   or e3t   =< 0  at point (i,j,k)= ', ji, jj, jk, fse3w(ji,jj,jk), fse3t(ji,jj,jk) 
     1864!                 WRITE(ctmp1,*) 'zgr_sco :   e3w   or e3t   =< 0  at point (i,j,k)= ', ji, jj, jk 
     1865!                 CALL ctl_stop( ctmp1 ) 
     1866               ENDIF 
     1867               IF( fsdepw(ji,jj,jk) < 0._wp .OR. fsdept(ji,jj,jk) < 0._wp ) THEN 
     1868                  WRITE(*,*) 'zgr_sco :   gdepw or gdept =< 0  at point (i,j,k)= ', ji, jj, jk, fsdepw(ji,jj,jk), fsdept(ji,jj,jk) 
     1869!                 WRITE(ctmp1,*) 'zgr_sco :   gdepw or gdept =< 0  at point (i,j,k)= ', ji, jj, jk 
     1870!                 CALL ctl_stop( ctmp1 ) 
     1871               ENDIF 
     1872            END DO 
     1873         END DO 
     1874      END DO 
     1875!!gm bug    #endif 
     1876      ! 
     1877 
     1878      CALL wrk_dealloc( jpi, jpj,      zenv, ztmpi1, ztmpi2, ztmpj1, ztmpj2, zri, zrj, zhbat                           ) 
     1879 
     1880#if defined key_smsh 
     1881      CALL wrk_dealloc( jpi, jpj, jpk, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 
     1882#else 
     1883      CALL wrk_dealloc( jpi, jpj, jpk, gsigw3, gsigt3, gsi3w3                                      ) 
     1884      CALL wrk_dealloc( jpi, jpj, jpk, esigt3, esigw3, esigtu3, esigtv3, esigtf3, esigwu3, esigwv3 ) 
     1885#endif 
     1886     ! 
     1887      IF( nn_timing == 1 )  CALL timing_stop('zgr_sco') 
     1888      ! 
     1889   END SUBROUTINE zgr_sco 
     1890      SUBROUTINE zgr_hyb 
     1891      !!---------------------------------------------------------------------- 
     1892      !!                  ***  ROUTINE zgr_sco  *** 
     1893      !!    Combination of zgr_sco in upper layers ( shelf ) and zgr_zps in abyss      !!                      
     1894      !! ** Purpose :   define the s-z coordinate system 
     1895      !! 
     1896      !! ** Method  :   s-coordinate in upper layers and z-coordinates below 
     1897      !!         The depth of model levels is defined as the product of an 
     1898      !!      analytical function by the local bathymetry, while the vertical 
     1899      !!      scale factors are defined as the product of the first derivative 
     1900      !!      of the analytical function by the bathymetry. 
     1901      !!      (this solution save memory as depth and scale factors are not 
     1902      !!      3d fields) 
     1903      !!          - Read bathymetry (in meters) at t-point and compute the 
     1904      !!         bathymetry at u-, v-, and f-points. 
     1905      !!            hbatu = mi( hbatt ) 
     1906      !!            hbatv = mj( hbatt ) 
     1907      !!            hbatf = mi( mj( hbatt ) ) 
     1908      !!          - Compute gsigt, gsigw, esigt, esigw from an analytical 
     1909      !!         function  
     1910      !!            gsigt(k) = fssig (k    ) 
     1911      !!            gsigw(k) = fssig (k-0.5) 
     1912      !!      This routine is given as an example, it must be modified 
     1913      !!      following the user s desiderata. nevertheless, the output as 
     1914      !!      well as the way to compute the model levels and scale factors 
     1915      !!      must be respected in order to insure second order a!!uracy 
     1916      !!      schemes. 
     1917      !! 
     1918 
     1919  !!====================================================================== 
     1920      INTEGER  ::   ji, jj, jk, jl, ik           ! dummy loop argument 
     1921      INTEGER  ::   iip1, ijp1, iim1, ijm1       ! temporary integers 
     1922      INTEGER  ::   jpksigm                      ! temporary integer for maxnumber of s-levels 
     1923      REAL(wp) ::   zcoeft, zcoefw, zrmax, ztaper,zrmin,e3t_t,e3w_t  ! temporary scalars 
     1924      REAL(wp) ::   ze3tp , ze3wp           ! Last ocean level thickness at T- and W-points 
     1925      REAL(wp) ::   zdepwp, zdepth          ! Ajusted ocean depth to avoid too small e3t 
     1926      REAL(wp) ::   zmax, zmin ,zsigma      ! Maximum and minimum depth and depth of sigma layer 
     1927      REAL(wp) ::   zacr , zkth ,za1         ! parameters for z- layer (as ppacr , ppzkth ) 
     1928 
     1929 
     1930      ! 
     1931      REAL(wp), POINTER, DIMENSION(:,:  ) :: zenv, ztmp, zmsk, zri, zrj, zhbat ,zrpt 
     1932 
     1933      NAMELIST/namzgr_hyb/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, & 
     1934                 ln_s_sigma, rn_bb, rn_hc,rn_zsigma , nn_sig_lev , rn_kth , rn_acr 
     1935 
     1936 
     1937      !!---------------------------------------------------------------------- 
     1938      ! 
     1939      IF( nn_timing == 1 )  CALL timing_start('zgr_hyb') 
     1940      ! 
     1941      CALL wrk_alloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat                           ) 
     1942 
     1943!      CALL wrk_alloc( jpi, jpj, jpk, gsigw3, gsigt3                                              ) 
     1944      ! 
     1945      REWIND( numnam )                       ! Read Namelist namzgr_sco : sigma-stretching parameters 
     1946      READ  ( numnam, namzgr_hyb ) 
     1947      IF(lwp) THEN                           ! control print 
     1948         WRITE(numout,*) 
     1949         WRITE(numout,*) 'dom:zgr_hyb : s-coordinate or hybrid z-s-coordinate' 
     1950         WRITE(numout,*) '~~~~~~~~~~~' 
     1951         WRITE(numout,*) '   Namelist namzgr_hyb' 
     1952         WRITE(numout,*) '      sigma-stretching coeffs ' 
     1953         WRITE(numout,*) '      maximum depth of s-bottom surface (>0)       rn_sbot_max   = ' ,rn_sbot_max 
     1954         WRITE(numout,*) '      minimum depth of s-bottom surface (>0)       rn_sbot_min   = ' ,rn_sbot_min 
     1955         WRITE(numout,*) '      surface control parameter (0<=rn_theta<=20)  rn_theta      = ', rn_theta 
     1956         WRITE(numout,*) '      bottom  control parameter (0<=rn_thetb<= 1)  rn_thetb      = ', rn_thetb 
     1957         WRITE(numout,*) '      maximum cut-off r-value allowed              rn_rmax       = ', rn_rmax 
     1958         WRITE(numout,*) '      Hybrid s-sigma-coordinate                    ln_s_sigma    = ', ln_s_sigma 
     1959         WRITE(numout,*) '      stretching parameter (song and haidvogel)    rn_bb         = ', rn_bb 
     1960         WRITE(numout,*) '      Critical depth                               rn_hc         = ', rn_hc 
     1961         WRITE(numout,*) '      Sigma  depth                                rn_zsigma     = ', rn_zsigma 
     1962         WRITE(numout,*) '      The same as pp_arc                           rn_arc        = ', rn_acr 
     1963         WRITE(numout,*) '      Number of sigma levels                       rn_arc        = ', nn_sig_lev 
     1964         WRITE(numout,*) '      Number of levels for stretching z-coord      rn_kth        = ', rn_kth 
     1965 
     1966 
     1967      ENDIF 
     1968      zsigma   =    rn_zsigma 
     1969      jpksigm =  nn_sig_lev 
     1970      zmax    =  rn_sbot_max 
     1971      zacr    =  rn_acr 
     1972      zkth    =  rn_kth 
     1973      e3t(:,:,:) = 1._wp      
     1974      e3w(:,:,:) = 1._wp 
     1975      e3u(:,:,:) = 1._wp 
     1976      e3v(:,:,:) = 1._wp 
     1977      e3f(:,:,:) = 1._wp 
     1978      e3uw(:,:,:)= 1._wp 
     1979      e3vw(:,:,:)= 1._wp 
     1980 
     1981 
     1982 
     1983 
     1984 
     1985      DO jj = 1, jpj 
     1986         DO ji= 1, jpi 
     1987            IF( bathy(ji,jj) <= 0._wp ) THEN   ;   bathy(ji,jj) = 0.e0_wp 
     1988            ELSE                               ;   bathy(ji,jj) = MIN( rn_sbot_max,  MAX( bathy(ji,jj),rn_sbot_min )  ) 
     1989            ENDIF 
     1990         END DO 
     1991      END DO 
     1992 
     1993! create bathymetry for enveloping 
    11601994      DO jj = 1, jpj 
    11611995         DO ji = 1, jpi 
    11621996            zenv(ji,jj) = MAX( bathy(ji,jj), rn_sbot_min ) 
    1163          END DO 
    1164       END DO 
    1165       !  
    1166       ! Smooth the bathymetry (if required) 
     1997            zenv(ji,jj) = MIN (zenv(ji,jj),  zsigma ) 
     1998            hbatt(ji,jj) = zenv(ji,jj) 
     1999         END DO 
     2000      END DO 
    11672001      scosrf(:,:) = 0._wp             ! ocean surface depth (here zero: no under ice-shelf sea) 
    11682002      scobot(:,:) = bathy(:,:)        ! ocean bottom  depth 
    1169       ! 
    11702003      jl = 0 
    11712004      zrmax = 1._wp 
     
    11972030            END DO 
    11982031         END DO 
    1199          ! 
    1200          IF(lwp)WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) ) 
     2032         IF(lwp)WRITE(numout,*) 'zgr_hyb :   iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) ) 
    12012033         ! 
    12022034         DO jj = 1, nlcj 
     
    12222054         DO jj = 1, nlcj 
    12232055            DO ji = 1, nlci 
    1224                IF( zmsk(ji,jj) == 1._wp )   zenv(ji,jj) = MAX( ztmp(ji,jj), bathy(ji,jj) ) 
     2056               IF( zmsk(ji,jj) == 1._wp )   zenv(ji,jj) = MAX( ztmp(ji,jj), hbatt(ji,jj) ) 
    12252057            END DO 
    12262058         END DO 
    12272059         ! 
    1228          ! Apply lateral boundary condition   CAUTION: keep the value when the lbc field is zero 
     2060         ! Apply lateral boundary condition   CAUTION: kept the value when the lbc field is zero 
    12292061         ztmp(:,:) = zenv(:,:)   ;   CALL lbc_lnk( zenv, 'T', 1._wp ) 
    12302062         DO jj = 1, nlcj 
     
    12372069      !                                                     ! ================ ! 
    12382070      ! 
    1239       ! Fill ghost rows with appropriate values to avoid undefined e3 values with some mpp decompositions 
    1240       DO ji = nlci+1, jpi  
    1241          zenv(ji,1:nlcj) = zenv(nlci,1:nlcj) 
    1242       END DO 
    1243       ! 
    1244       DO jj = nlcj+1, jpj 
    1245          zenv(:,jj) = zenv(:,nlcj) 
    1246       END DO 
    1247       ! 
    1248       ! Envelope bathymetry saved in hbatt 
     2071      !                                        ! envelop bathymetry saved in hbatt 
    12492072      hbatt(:,:) = zenv(:,:)  
    1250       IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0._wp ) THEN 
    1251          CALL ctl_warn( ' s-coordinates are tapered in vicinity of the Equator' ) 
    1252          DO jj = 1, jpj 
    1253             DO ji = 1, jpi 
    1254                ztaper = EXP( -(gphit(ji,jj)/8._wp)**2 ) 
    1255                hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * ( 1._wp - ztaper ) 
    1256             END DO 
    1257          END DO 
    1258       ENDIF 
    1259       ! 
    1260       IF(lwp) THEN                             ! Control print 
     2073   IF( lk_mpp )   CALL mpp_max( nstop ) 
     2074   IF (lwp) write(numout,*)"after envelope", nstop 
     2075 
     2076! define new reference levels  
     2077! for s- levels, allows stretching at surface and bottom layer  
     2078IF( jpksigm > 1 )THEN 
     2079    IF(ln_s_sigma)THEN 
     2080           DO jk = 1, jpksigm 
     2081            gsigw(jk) = -fssig3( REAL(jk,wp)-0.5_wp     , rn_bb,jpksigm ) 
     2082            gsigt(jk) = -fssig3( REAL(jk,wp)            , rn_bb,jpksigm ) 
     2083           END DO 
     2084    ELSE 
     2085          DO jk = 1, jpksigm 
     2086           gsigw(jk) = -fssig2( REAL(jk,wp)-0.5_wp ,jpksigm ) 
     2087           gsigt(jk) = -fssig2( REAL(jk,wp)        ,jpksigm ) 
     2088 
     2089          END DO 
     2090   ENDIF   
     2091    gsigw(1)=0._wp   ! set gsigw exactly to zero      
     2092    IF( lk_mpp )   CALL mpp_max( nstop ) 
     2093    IF (lwp) THEN 
     2094    write(numout,*)"after fssig", nstop,"gsigw,gsigt=" 
     2095    do jk=1,jpksigm 
     2096    write(numout,*)jk,gsigw(jk),gsigt(jk) 
     2097    enddo 
     2098    ENDIF     
     2099       
     2100       DO jk=1,jpksigm 
     2101          DO jj=1,jpj 
     2102            DO ji=1,jpi 
     2103                 zrmin= min( hbatt(ji,jj), zsigma ) 
     2104                   IF(hbatt(ji,jj).lt.rn_hc)THEN 
     2105                   zcoefw=REAL(jk-1,wp)      / REAL(jpksigm-1,wp) 
     2106                   zcoeft=(REAL(jk-1,wp)+0.5)/ REAL(jpksigm-1,wp) 
     2107                   ELSE 
     2108                   zcoefw=gsigw(jk) 
     2109                   zcoeft=gsigt(jk) 
     2110 
     2111                   ENDIF 
     2112 
     2113                   gdept(ji,jj,jk)=scosrf(ji,jj)+(zrmin-rn_hc)*zcoeft & 
     2114                       +rn_hc* (REAL(jk,wp)- 0.5_wp)  / REAL(jpksigm-1,wp) 
     2115                   gdepw(ji,jj,jk)=scosrf(ji,jj)+(zrmin-rn_hc)*zcoefw & 
     2116                       +rn_hc*( REAL(jk,wp)- 1.0_wp ) / REAL(jpksigm-1,wp) 
     2117 
     2118           ENDDO 
     2119          ENDDO 
     2120        ENDDO 
     2121        gdepw(:,:,1)= scosrf(:,:) 
     2122 ! redefine gdept_0, gdepw_0 which will be used in diawri.F90 
     2123    DO jk=1,jpksigm 
     2124                   IF(zsigma.lt.rn_hc)THEN 
     2125                   zcoefw=REAL(jk-1,wp)      / REAL(jpksigm-1,wp) 
     2126                   zcoeft=(REAL(jk-1,wp)+0.5)/ REAL(jpksigm-1,wp) 
     2127                   ELSE 
     2128                   zcoefw=gsigw(jk) 
     2129                   zcoeft=gsigt(jk) 
     2130                   ENDIF 
     2131 
     2132         gdept_0(jk)=  zcoeft * (zsigma-rn_hc)+rn_hc* (REAL(jk,wp)- 0.5_wp )/REAL(jpksigm-1,wp) 
     2133         gdepw_0(jk)=  zcoefw * (zsigma-rn_hc)+rn_hc* (REAL(jk,wp)- 1.0_wp )/REAL(jpksigm-1,wp) 
     2134    ENDDO 
     2135 
     2136    DO jk=1,jpksigm-1 
     2137         e3t_0(jk)  = gdepw_0(jk+1)-gdepw_0(jk) 
     2138         e3w_0(jk+1)= gdept_0(jk+1)-gdept_0(jk) 
     2139    ENDDO 
     2140         e3w_0(1) = 2._wp * ( gdept_0(1  ) - gdepw_0(1  ) )  
     2141 
     2142 
     2143 ! now for lower z-levels : 
     2144         zmin = e3t_0 (jpksigm -1 ) ! min layer width in z- zone is the same as lowest in s- layer 
     2145 ELSE 
     2146  zsigma = 0._wp 
     2147  hbatt(:,:) = zsigma 
     2148  zmin = 5._wp           
     2149 ENDIF 
     2150 IF(lwp) write(numout,*) ": last vertical level of sigma-coordinates",zmin 
     2151        CALL fszref (  zkth, zmin, zacr, zmax, jpksigm , zsigma  ) 
     2152 
     2153 
     2154    DO jk=jpksigm,jpkm1 
     2155          
     2156         e3t_0(jk)  = gdepw_0(jk+1)-gdepw_0(jk) 
     2157         e3w_0(jk+1)= gdept_0(jk+1)-gdept_0(jk) 
     2158    ENDDO 
     2159         e3w_0(1) = 2._wp * ( gdept_0(1  ) - gdepw_0(1  ) ) 
     2160         e3t_0(jpk) = 2._wp * ( gdept_0(jpk) - gdepw_0(jpk) ) 
     2161          
     2162   IF( lk_mpp )   CALL mpp_max( nstop ) 
     2163   IF (lwp) write(numout,*)"e3t0" ,nstop 
     2164 
     2165      IF(lwp) THEN                        ! control print 
    12612166         WRITE(numout,*) 
    1262          WRITE(numout,*) ' domzgr: hbatt field; ocean depth in meters' 
     2167         WRITE(numout,*) '  zhyb          Reference z-coordinate depth and scale factors:' 
     2168         WRITE(numout, "(9x,' level   gdept    gdepw     e3t      e3w  ')" ) 
     2169         WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, gdept_0(jk), gdepw_0(jk), e3t_0(jk), e3w_0(jk), jk = 1, jpk ) 
     2170         open(333,file='zmesh.dat') 
     2171         WRITE(333,*)'initial zsigma  =', zsigma, jpk 
     2172         WRITE(333,*)'initial jpksigm =', jpksigm 
     2173         WRITE(333,*)'rn_bb =', rn_bb,'rn_theta=',rn_theta 
     2174         do jk=1,jpk 
     2175         WRITE(333,'(i4,1x,4(1x,e13.6))') jk, gdept_0(jk), gdepw_0(jk), e3t_0(jk),e3w_0(jk)  
     2176         enddo 
     2177         close(333) 
     2178      ENDIF 
     2179 
     2180        DO jk=jpksigm,jpk 
     2181          DO jj=1,jpj 
     2182           DO ji=1,jpi 
     2183           IF(jpksigm>1)THEN 
     2184                   gdept(ji,jj,jk)=scosrf(ji,jj) + gdept_0(jk) *hbatt(ji,jj)/zsigma ! differ from gdept0+scorf only at land 
     2185                   gdepw(ji,jj,jk)=scosrf(ji,jj) + gdepw_0(jk) *hbatt(ji,jj)/zsigma ! as hbatt=zsigma over deep part of basin 
     2186            ELSE 
     2187                   gdept(ji,jj,jk)=scosrf(ji,jj) + gdept_0(jk)  
     2188                   gdepw(ji,jj,jk)=scosrf(ji,jj) + gdepw_0(jk)  
     2189             
     2190            ENDIF 
     2191           ENDDO 
     2192          ENDDO 
     2193        ENDDO 
     2194 
     2195! define e3t, e3w for general levels 
     2196        DO jk=1,jpkm1 
     2197            e3t(:,:,jk)  = gdepw(:,:,jk+1)-gdepw(:,:,jk) 
     2198            e3w(:,:,jk+1)= gdept(:,:,jk+1)-gdept(:,:,jk) 
     2199        ENDDO 
     2200        e3w(:,:,1)   = 2._wp * ( gdept(:,:,1  ) - gdepw(:,:,1  ) ) 
     2201        e3t(:,:,jpk) = 2._wp * ( gdept(:,:,jpk) - gdepw(:,:,jpk) ) 
     2202 
     2203! and surface : 
     2204!      ! HYBRID mbathy :  
     2205       
     2206      IF(lwp) THEN                        ! control print 
    12632207         WRITE(numout,*) 
    1264          CALL prihre( hbatt(1,1), jpi, jpj, 1, jpi, 1, 1, jpj, 1, 0._wp, numout ) 
    1265          IF( nprint == 1 )   THEN         
    1266             WRITE(numout,*) ' bathy  MAX ', MAXVAL( bathy(:,:) ), ' MIN ', MINVAL( bathy(:,:) ) 
    1267             WRITE(numout,*) ' hbatt  MAX ', MAXVAL( hbatt(:,:) ), ' MIN ', MINVAL( hbatt(:,:) ) 
    1268          ENDIF 
    1269       ENDIF 
    1270  
    1271       !                                        ! ============================== 
    1272       !                                        !   hbatu, hbatv, hbatf fields 
    1273       !                                        ! ============================== 
    1274       IF(lwp) THEN 
    1275          WRITE(numout,*) 
    1276          WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', rn_sbot_min 
    1277       ENDIF 
    1278       hbatu(:,:) = rn_sbot_min 
    1279       hbatv(:,:) = rn_sbot_min 
    1280       hbatf(:,:) = rn_sbot_min 
    1281       DO jj = 1, jpjm1 
    1282         DO ji = 1, jpim1   ! NO vector opt. 
    1283            hbatu(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji+1,jj  ) ) 
    1284            hbatv(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1) ) 
    1285            hbatf(ji,jj) = 0.25_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1)   & 
    1286               &                     + hbatt(ji+1,jj) + hbatt(ji+1,jj+1) ) 
    1287         END DO 
    1288       END DO 
    1289       !  
    1290       ! Apply lateral boundary condition 
    1291 !!gm  ! CAUTION: retain non zero value in the initial file this should be OK for orca cfg, not for EEL 
    1292       zhbat(:,:) = hbatu(:,:)   ;   CALL lbc_lnk( hbatu, 'U', 1._wp ) 
     2208         WRITE(numout,*) '  zhyb          centre of basin s-z-coordinate depth and scale factors:' 
     2209         WRITE(numout, "(9x,' level   gdept    gdepw     e3t      e3w  ')" ) 
     2210         write(numout,*)"bathy" ,"min e3t" 
     2211         do jk=1,jpk 
     2212         WRITE(numout, "(10x, i4, 4f9.2)" )  jk, gdept(20,20,jk), gdepw(20,20,jk), & 
     2213  &       e3t(20,20,jk), e3w(20,20,jk)  
     2214         enddo 
     2215      ENDIF 
     2216 
     2217      mbathy(:,:)=0 
     2218!      WHERE( 0._wp < bathy(:,:)) mbathy(:,:)=jpkm1 
    12932219      DO jj = 1, jpj 
    12942220         DO ji = 1, jpi 
    1295             IF( hbatu(ji,jj) == 0._wp ) THEN 
    1296                IF( zhbat(ji,jj) == 0._wp )   hbatu(ji,jj) = rn_sbot_min 
    1297                IF( zhbat(ji,jj) /= 0._wp )   hbatu(ji,jj) = zhbat(ji,jj) 
     2221             DO jk = 1, jpkm1 
     2222                IF( bathy(ji,jj) >= gdept(ji,jj,jk) ) mbathy(ji,jj) = MAX( 2, jk ) 
     2223                
     2224         END DO 
     2225        END DO 
     2226      END DO 
     2227 
     2228 !     DO jk = jpkm1, jpksigm+1, -1 
     2229 !        zdepth = gdepw_0(jk) + MIN( e3zps_min, e3t_0(jk)*e3zps_rat ) 
     2230 !        WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth )   mbathy(:,:) = jk-1 
     2231 !     END DO 
     2232 
     2233 
     2234 
     2235      ! z-partial steps :goto 20      
     2236       DO jj = 1, jpj 
     2237         DO ji = 1, jpi 
     2238            ik = mbathy(ji,jj) 
     2239            IF( ik > jpksigm ) THEN               ! ocean point only 
     2240               ! max ocean level case 
     2241               IF( ik == jpkm1 ) THEN 
     2242                  zdepwp = bathy(ji,jj) 
     2243                  ze3tp  = bathy(ji,jj) - gdepw_0(ik) 
     2244                  ze3wp = 0.5_wp * e3w_0(ik) * ( 1._wp + ( ze3tp/e3t_0(ik) ) ) 
     2245                  e3t(ji,jj,ik  ) = ze3tp 
     2246                  e3t(ji,jj,ik+1) = ze3tp 
     2247                  e3w(ji,jj,ik  ) = ze3wp 
     2248                  e3w(ji,jj,ik+1) = ze3tp 
     2249                  gdepw(ji,jj,ik+1) = zdepwp 
     2250                  gdept(ji,jj,ik  ) = gdept_0(ik-1) + ze3wp 
     2251                  gdept(ji,jj,ik+1) = gdept(ji,jj,ik) + ze3tp 
     2252                  ! 
     2253               ELSE                         ! standard case 
     2254                  IF( bathy(ji,jj) <= gdepw_0(ik+1) ) THEN   ;   gdepw(ji,jj,ik+1) = bathy(ji,jj) 
     2255                  ELSE                                       ;   gdepw(ji,jj,ik+1) = gdepw_0(ik+1) 
     2256                  ENDIF 
     2257!gm Bug?  check the gdepw_0 
     2258                  !       ... on ik 
     2259                  gdept(ji,jj,ik) = gdepw_0(ik) + ( gdepw  (ji,jj,ik+1) - gdepw_0(ik) )   & 
     2260                     &                          * ((gdept_0(      ik  ) - gdepw_0(ik) )   & 
     2261                     &                          / ( gdepw_0(      ik+1) - gdepw_0(ik) )) 
     2262                  e3t  (ji,jj,ik) = e3t_0  (ik) * ( gdepw  (ji,jj,ik+1) - gdepw_0(ik) )   &  
     2263                     &                          / ( gdepw_0(      ik+1) - gdepw_0(ik) )  
     2264                  e3w  (ji,jj,ik) = 0.5_wp * ( gdepw(ji,jj,ik+1) + gdepw_0(ik+1) - 2._wp * gdepw_0(ik) )   & 
     2265                     &                     * ( e3w_0(ik) / ( gdepw_0(ik+1) - gdepw_0(ik) ) ) 
     2266                  !       ... on ik+1 
     2267                  e3w  (ji,jj,ik+1) = e3t  (ji,jj,ik) 
     2268                  e3t  (ji,jj,ik+1) = e3t  (ji,jj,ik) 
     2269                  gdept(ji,jj,ik+1) = gdept(ji,jj,ik) + e3t(ji,jj,ik) 
     2270               ENDIF 
    12982271            ENDIF 
    12992272         END DO 
    13002273      END DO 
    1301       zhbat(:,:) = hbatv(:,:)   ;   CALL lbc_lnk( hbatv, 'V', 1._wp ) 
     2274      ! 
     2275      jl = 0 
    13022276      DO jj = 1, jpj 
    13032277         DO ji = 1, jpi 
    1304             IF( hbatv(ji,jj) == 0._wp ) THEN 
    1305                IF( zhbat(ji,jj) == 0._wp )   hbatv(ji,jj) = rn_sbot_min 
    1306                IF( zhbat(ji,jj) /= 0._wp )   hbatv(ji,jj) = zhbat(ji,jj) 
     2278            ik = mbathy(ji,jj) 
     2279            IF( ik > jpksigm ) THEN               ! ocean point only 
     2280               e3tp (ji,jj) = e3t(ji,jj,ik  ) 
     2281               e3wp (ji,jj) = e3w(ji,jj,ik  ) 
     2282               ! test 
     2283               zmin= gdepw(ji,jj,ik+1) - gdept(ji,jj,ik  ) 
     2284               IF( zmin <= 0._wp .AND. lwp ) THEN  
     2285                  jl = jl + 1 
     2286                  WRITE(numout,*) ' it      = ', jl, ' ik      = ', ik, ' (i,j) = ', ji, jj 
     2287                  WRITE(numout,*) ' bathy = ', bathy(ji,jj) 
     2288                  WRITE(numout,*) ' gdept = ', gdept(ji,jj,ik), ' gdepw = ', gdepw(ji,jj,ik+1), ' zdiff = ', zmin 
     2289                  WRITE(numout,*) ' e3tp  = ', e3t  (ji,jj,ik), ' e3wp  = ', e3w  (ji,jj,ik  ) 
     2290               ENDIF 
    13072291            ENDIF 
    13082292         END DO 
    13092293      END DO 
    1310       zhbat(:,:) = hbatf(:,:)   ;   CALL lbc_lnk( hbatf, 'F', 1._wp ) 
    1311       DO jj = 1, jpj 
    1312          DO ji = 1, jpi 
    1313             IF( hbatf(ji,jj) == 0._wp ) THEN 
    1314                IF( zhbat(ji,jj) == 0._wp )   hbatf(ji,jj) = rn_sbot_min 
    1315                IF( zhbat(ji,jj) /= 0._wp )   hbatf(ji,jj) = zhbat(ji,jj) 
    1316             ENDIF 
    1317          END DO 
    1318       END DO 
    1319  
    1320 !!bug:  key_helsinki a verifer 
    1321       hift(:,:) = MIN( hift(:,:), hbatt(:,:) ) 
    1322       hifu(:,:) = MIN( hifu(:,:), hbatu(:,:) ) 
    1323       hifv(:,:) = MIN( hifv(:,:), hbatv(:,:) ) 
    1324       hiff(:,:) = MIN( hiff(:,:), hbatf(:,:) ) 
    1325  
    1326       IF( nprint == 1 .AND. lwp )   THEN 
    1327          WRITE(numout,*) ' MAX val hif   t ', MAXVAL( hift (:,:) ), ' f ', MAXVAL( hiff (:,:) ),  & 
    1328             &                        ' u ',   MAXVAL( hifu (:,:) ), ' v ', MAXVAL( hifv (:,:) ) 
    1329          WRITE(numout,*) ' MIN val hif   t ', MINVAL( hift (:,:) ), ' f ', MINVAL( hiff (:,:) ),  & 
    1330             &                        ' u ',   MINVAL( hifu (:,:) ), ' v ', MINVAL( hifv (:,:) ) 
    1331          WRITE(numout,*) ' MAX val hbat  t ', MAXVAL( hbatt(:,:) ), ' f ', MAXVAL( hbatf(:,:) ),  & 
    1332             &                        ' u ',   MAXVAL( hbatu(:,:) ), ' v ', MAXVAL( hbatv(:,:) ) 
    1333          WRITE(numout,*) ' MIN val hbat  t ', MINVAL( hbatt(:,:) ), ' f ', MINVAL( hbatf(:,:) ),  & 
    1334             &                        ' u ',   MINVAL( hbatu(:,:) ), ' v ', MINVAL( hbatv(:,:) ) 
    1335       ENDIF 
    1336 !! helsinki 
    1337  
    1338       !                                            ! ======================= 
    1339       !                                            !   s-ccordinate fields     (gdep., e3.) 
    1340       !                                            ! ======================= 
    1341       ! 
    1342       ! non-dimensional "sigma" for model level depth at w- and t-levels 
    1343  
    1344  
    1345 !======================================================================== 
    1346 ! Song and Haidvogel  1994 (ln_s_sh94=T) 
    1347 ! Siddorn and Furner 2012 (ln_sf12=T) 
    1348 ! or  tanh function       (both false)                     
    1349 !======================================================================== 
    1350       IF      ( ln_s_sh94 ) THEN  
    1351                            CALL s_sh94() 
    1352       ELSE IF ( ln_s_sf12 ) THEN 
    1353                            CALL s_sf12() 
    1354       ELSE                  
    1355                            CALL s_tanh() 
    1356       ENDIF  
    1357  
    1358       CALL lbc_lnk( e3t , 'T', 1._wp ) 
    1359       CALL lbc_lnk( e3u , 'U', 1._wp ) 
    1360       CALL lbc_lnk( e3v , 'V', 1._wp ) 
    1361       CALL lbc_lnk( e3f , 'F', 1._wp ) 
    1362       CALL lbc_lnk( e3w , 'W', 1._wp ) 
    1363       CALL lbc_lnk( e3uw, 'U', 1._wp ) 
    1364       CALL lbc_lnk( e3vw, 'V', 1._wp ) 
    1365  
    1366       fsdepw(:,:,:) = gdepw (:,:,:) 
    1367       fsde3w(:,:,:) = gdep3w(:,:,:) 
    1368       ! 
    1369       where (e3t   (:,:,:).eq.0.0)  e3t(:,:,:) = 1.0 
    1370       where (e3u   (:,:,:).eq.0.0)  e3u(:,:,:) = 1.0 
    1371       where (e3v   (:,:,:).eq.0.0)  e3v(:,:,:) = 1.0 
    1372       where (e3f   (:,:,:).eq.0.0)  e3f(:,:,:) = 1.0 
    1373       where (e3w   (:,:,:).eq.0.0)  e3w(:,:,:) = 1.0 
    1374       where (e3uw  (:,:,:).eq.0.0)  e3uw(:,:,:) = 1.0 
    1375       where (e3vw  (:,:,:).eq.0.0)  e3vw(:,:,:) = 1.0 
    1376  
    1377  
    1378       fsdept(:,:,:) = gdept (:,:,:) 
    1379       fsdepw(:,:,:) = gdepw (:,:,:) 
    1380       fsde3w(:,:,:) = gdep3w(:,:,:) 
    1381       fse3t (:,:,:) = e3t   (:,:,:) 
    1382       fse3u (:,:,:) = e3u   (:,:,:) 
    1383       fse3v (:,:,:) = e3v   (:,:,:) 
    1384       fse3f (:,:,:) = e3f   (:,:,:) 
    1385       fse3w (:,:,:) = e3w   (:,:,:) 
    1386       fse3uw(:,:,:) = e3uw  (:,:,:) 
    1387       fse3vw(:,:,:) = e3vw  (:,:,:) 
    1388 !! 
    1389       ! HYBRID :  
    1390       DO jj = 1, jpj 
    1391          DO ji = 1, jpi 
    1392             DO jk = 1, jpkm1 
    1393                IF( scobot(ji,jj) >= fsdept(ji,jj,jk) )   mbathy(ji,jj) = MAX( 2, jk ) 
    1394                IF( scobot(ji,jj) == 0._wp            )   mbathy(ji,jj) = 0 
     2294 
     2295      ! Scale factors and depth at U-, V-, UW and VW-points 
     2296      DO jk = 1, jpk                        ! initialisation to z-scale factors 
     2297         e3u (:,:,jk) = e3t(:,:,jk) 
     2298         e3v (:,:,jk) = e3t(:,:,jk) 
     2299         e3uw(:,:,jk) = e3w(:,:,jk) 
     2300         e3vw(:,:,jk) = e3w(:,:,jk) 
     2301         e3f (:,:,jk) = e3t(:,:,jk) 
     2302      END DO 
     2303          DO jk = 1, jpksigm-1 
     2304           DO jj = 1, jpjm1 
     2305            DO ji = 1, fs_jpim1 
     2306                e3u(ji,jj,jk)=( REAL(MIN(1,mbathy(ji,jj)),wp)* e3t(ji,jj,jk)     +          & 
     2307                                REAL(MIN(1,mbathy(ji+1,jj)),wp)*e3t(ji+1,jj,jk) )           & 
     2308                /MAX(  1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji+1,jj))   ) 
     2309 
     2310                e3uw(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3w(ji,jj,jk)    +          & 
     2311                                REAL(MIN(1,mbathy(ji+1,jj)),wp)*e3w(ji+1,jj,jk) )           & 
     2312                  /REAL(MAX(  1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji+1,jj))),wp) 
     2313 
     2314                e3v(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3t(ji,jj,jk)     +          & 
     2315                               REAL(MIN(1,mbathy(ji,jj+1)),wp)*e3t(ji,jj+1,jk) )           & 
     2316                /REAL (MAX(  1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji,jj+1))),wp) 
     2317 
     2318                e3vw(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3w(ji,jj,jk)    +          & 
     2319                                REAL(MIN(1,mbathy(ji,jj+1)),wp)*e3w(ji,jj+1,jk) )                 & 
     2320                /REAL(MAX(  1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji,jj+1))),wp) 
     2321                 
     2322                e3f(ji,jj,jk)=(REAL(MIN(1,mbathy(ji,jj)),wp)* e3t(ji,jj,jk)     +          & 
     2323                               REAL(MIN(1,mbathy(ji+1,jj)),wp)*e3t(ji+1,jj,jk)  +          & 
     2324                               REAL(MIN(1,mbathy(ji+1,jj+1)),wp)* e3t(ji+1,jj+1,jk)+       & 
     2325                               REAL(MIN(1,mbathy(ji,jj+1)),wp)*e3t(ji,jj+1,jk) )           & 
     2326                /REAL(MAX(  1, MIN(1,mbathy(ji,jj))+MIN(1,mbathy(ji,jj+1))             & 
     2327                      +   MIN(1,mbathy(ji+1,jj))+MIN(1,mbathy(ji+1,jj+1))),wp) 
     2328 
     2329               ENDDO 
    13952330            END DO 
    13962331         END DO 
    1397       END DO 
    1398       IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ),   & 
    1399          &                                                       ' MAX ', MAXVAL( mbathy(:,:) ) 
    1400  
    1401       IF( nprint == 1  .AND. lwp )   THEN         ! min max values over the local domain 
    1402          WRITE(numout,*) ' MIN val mbathy  ', MINVAL( mbathy(:,:)   ), ' MAX ', MAXVAL( mbathy(:,:) ) 
    1403          WRITE(numout,*) ' MIN val depth t ', MINVAL( fsdept(:,:,:) ),   & 
    1404             &                          ' w ', MINVAL( fsdepw(:,:,:) ), '3w '  , MINVAL( fsde3w(:,:,:) ) 
    1405          WRITE(numout,*) ' MIN val e3    t ', MINVAL( fse3t (:,:,:) ), ' f '  , MINVAL( fse3f (:,:,:) ),   & 
    1406             &                          ' u ', MINVAL( fse3u (:,:,:) ), ' u '  , MINVAL( fse3v (:,:,:) ),   & 
    1407             &                          ' uw', MINVAL( fse3uw(:,:,:) ), ' vw'  , MINVAL( fse3vw(:,:,:) ),   & 
    1408             &                          ' w ', MINVAL( fse3w (:,:,:) ) 
    1409  
    1410          WRITE(numout,*) ' MAX val depth t ', MAXVAL( fsdept(:,:,:) ),   & 
    1411             &                          ' w ', MAXVAL( fsdepw(:,:,:) ), '3w '  , MAXVAL( fsde3w(:,:,:) ) 
    1412          WRITE(numout,*) ' MAX val e3    t ', MAXVAL( fse3t (:,:,:) ), ' f '  , MAXVAL( fse3f (:,:,:) ),   & 
    1413             &                          ' u ', MAXVAL( fse3u (:,:,:) ), ' u '  , MAXVAL( fse3v (:,:,:) ),   & 
    1414             &                          ' uw', MAXVAL( fse3uw(:,:,:) ), ' vw'  , MAXVAL( fse3vw(:,:,:) ),   & 
    1415             &                          ' w ', MAXVAL( fse3w (:,:,:) ) 
    1416       ENDIF 
    1417       !  END DO 
    1418       IF(lwp) THEN                                  ! selected vertical profiles 
    1419          WRITE(numout,*) 
    1420          WRITE(numout,*) ' domzgr: vertical coordinates : point (1,1,k) bathy = ', bathy(1,1), hbatt(1,1) 
    1421          WRITE(numout,*) ' ~~~~~~  --------------------' 
    1422          WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
    1423          WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(1,1,jk), fsdepw(1,1,jk),     & 
    1424             &                                 fse3t (1,1,jk), fse3w (1,1,jk), jk=1,jpk ) 
    1425          DO jj = mj0(20), mj1(20) 
    1426             DO ji = mi0(20), mi1(20) 
    1427                WRITE(numout,*) 
    1428                WRITE(numout,*) ' domzgr: vertical coordinates : point (20,20,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
    1429                WRITE(numout,*) ' ~~~~~~  --------------------' 
    1430                WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
    1431                WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     & 
    1432                   &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 
     2332 
     2333      DO jk = jpksigm,jpk                         ! Computed as the minimum of neighbooring scale factors 
     2334               DO jj = 1, jpjm1 
     2335            DO ji = 1, fs_jpim1   ! vector opt. 
     2336               e3u (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji+1,jj,jk) ) 
     2337               e3v (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji,jj+1,jk) ) 
     2338               e3uw(ji,jj,jk) = MIN( e3w(ji,jj,jk), e3w(ji+1,jj,jk) ) 
     2339               e3vw(ji,jj,jk) = MIN( e3w(ji,jj,jk), e3w(ji,jj+1,jk) ) 
    14332340            END DO 
    14342341         END DO 
    1435          DO jj = mj0(74), mj1(74) 
    1436             DO ji = mi0(100), mi1(100) 
    1437                WRITE(numout,*) 
    1438                WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj) 
    1439                WRITE(numout,*) ' ~~~~~~  --------------------' 
    1440                WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')") 
    1441                WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     & 
    1442                   &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk ) 
     2342      END DO 
     2343       
     2344      CALL lbc_lnk( e3u , 'U', 1._wp )   ;   CALL lbc_lnk( e3uw, 'U', 1._wp )   ! lateral boundary conditions 
     2345      CALL lbc_lnk( e3v , 'V', 1._wp )   ;   CALL lbc_lnk( e3vw, 'V', 1._wp ) 
     2346      ! 
     2347      DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries) 
     2348         WHERE( e3u (:,:,jk) == 0._wp )   e3u (:,:,jk) = e3t_0(jk) 
     2349         WHERE( e3v (:,:,jk) == 0._wp )   e3v (:,:,jk) = e3t_0(jk) 
     2350         WHERE( e3uw(:,:,jk) == 0._wp )   e3uw(:,:,jk) = e3w_0(jk) 
     2351         WHERE( e3vw(:,:,jk) == 0._wp )   e3vw(:,:,jk) = e3w_0(jk) 
     2352      END DO 
     2353 
     2354      DO jk = jpksigm, jpk                        ! Computed as the minimum of neighbooring V-scale factors 
     2355         DO jj = 1, jpjm1 
     2356            DO ji = 1, fs_jpim1   ! vector opt. 
     2357               e3f(ji,jj,jk) = MIN( e3v(ji,jj,jk), e3v(ji+1,jj,jk) ) 
    14432358            END DO 
    14442359         END DO 
    1445       ENDIF 
    1446  
    1447 !================================================================================ 
    1448 ! check the coordinate makes sense 
    1449 !================================================================================ 
    1450       DO ji = 1, jpi 
    1451          DO jj = 1, jpj 
    1452  
    1453             IF( hbatt(ji,jj) > 0._wp) THEN 
    1454                DO jk = 1, mbathy(ji,jj) 
    1455                  ! check coordinate is monotonically increasing 
    1456                  IF (fse3w(ji,jj,jk) <= 0._wp .OR. fse3t(ji,jj,jk) <= 0._wp ) THEN 
    1457                     WRITE(ctmp1,*) 'ERROR zgr_sco :   e3w   or e3t   =< 0  at point (i,j,k)= ', ji, jj, jk 
    1458                     WRITE(numout,*) 'ERROR zgr_sco :   e3w   or e3t   =< 0  at point (i,j,k)= ', ji, jj, jk 
    1459                     WRITE(numout,*) 'e3w',fse3w(ji,jj,:) 
    1460                     WRITE(numout,*) 'e3t',fse3t(ji,jj,:) 
    1461                     CALL ctl_stop( ctmp1 ) 
    1462                  ENDIF 
    1463                  ! and check it has never gone negative 
    1464                  IF( fsdepw(ji,jj,jk) < 0._wp .OR. fsdept(ji,jj,jk) < 0._wp ) THEN 
    1465                     WRITE(ctmp1,*) 'ERROR zgr_sco :   gdepw or gdept =< 0  at point (i,j,k)= ', ji, jj, jk 
    1466                     WRITE(numout,*) 'ERROR zgr_sco :   gdepw   or gdept   =< 0  at point (i,j,k)= ', ji, jj, jk 
    1467                     WRITE(numout,*) 'gdepw',fsdepw(ji,jj,:) 
    1468                     WRITE(numout,*) 'gdept',fsdept(ji,jj,:) 
    1469                     CALL ctl_stop( ctmp1 ) 
    1470                  ENDIF 
    1471                  ! and check it never exceeds the total depth 
    1472                  IF( fsdepw(ji,jj,jk) > hbatt(ji,jj) ) THEN 
    1473                     WRITE(ctmp1,*) 'ERROR zgr_sco :   gdepw > hbatt  at point (i,j,k)= ', ji, jj, jk 
    1474                     WRITE(numout,*) 'ERROR zgr_sco :   gdepw > hbatt  at point (i,j,k)= ', ji, jj, jk 
    1475                     WRITE(numout,*) 'gdepw',fsdepw(ji,jj,:) 
    1476                     CALL ctl_stop( ctmp1 ) 
    1477                  ENDIF 
    1478                END DO 
    1479  
    1480                DO jk = 1, mbathy(ji,jj)-1 
    1481                  ! and check it never exceeds the total depth 
    1482                 IF( fsdept(ji,jj,jk) > hbatt(ji,jj) ) THEN 
    1483                     WRITE(ctmp1,*) 'ERROR zgr_sco :   gdept > hbatt  at point (i,j,k)= ', ji, jj, jk 
    1484                     WRITE(numout,*) 'ERROR zgr_sco :   gdept > hbatt  at point (i,j,k)= ', ji, jj, jk 
    1485                     WRITE(numout,*) 'gdept',fsdept(ji,jj,:) 
    1486                     CALL ctl_stop( ctmp1 ) 
    1487                  ENDIF 
    1488                END DO 
    1489  
    1490             ENDIF 
    1491  
    1492          END DO 
    1493       END DO 
    1494       ! 
    1495       CALL wrk_dealloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat                           ) 
    1496       ! 
    1497       IF( nn_timing == 1 )  CALL timing_stop('zgr_sco') 
    1498       ! 
    1499    END SUBROUTINE zgr_sco 
    1500  
    1501 !!====================================================================== 
    1502    SUBROUTINE s_sh94() 
    1503  
    1504       !!---------------------------------------------------------------------- 
    1505       !!                  ***  ROUTINE s_sh94  *** 
    1506       !!                      
    1507       !! ** Purpose :   stretch the s-coordinate system 
    1508       !! 
    1509       !! ** Method  :   s-coordinate stretch using the Song and Haidvogel 1994 
    1510       !!                mixed S/sigma coordinate 
    1511       !! 
    1512       !! Reference : Song and Haidvogel 1994.  
    1513       !!---------------------------------------------------------------------- 
    1514       ! 
    1515       INTEGER  ::   ji, jj, jk           ! dummy loop argument 
    1516       REAL(wp) ::   zcoeft, zcoefw   ! temporary scalars 
    1517       ! 
    1518       REAL(wp), POINTER, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3, z_gsi3w3 
    1519       REAL(wp), POINTER, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3            
    1520  
    1521       CALL wrk_alloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3                                      ) 
    1522       CALL wrk_alloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 
    1523  
    1524       z_gsigw3  = 0._wp   ;   z_gsigt3  = 0._wp   ;   z_gsi3w3  = 0._wp 
    1525       z_esigt3  = 0._wp   ;   z_esigw3  = 0._wp  
    1526       z_esigtu3 = 0._wp   ;   z_esigtv3 = 0._wp   ;   z_esigtf3 = 0._wp 
    1527       z_esigwu3 = 0._wp   ;   z_esigwv3 = 0._wp 
    1528  
    1529       DO ji = 1, jpi 
    1530          DO jj = 1, jpj 
    1531  
    1532             IF( hbatt(ji,jj) > rn_hc ) THEN    !deep water, stretched sigma 
    1533                DO jk = 1, jpk 
    1534                   z_gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb ) 
    1535                   z_gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp)       , rn_bb ) 
    1536                END DO 
    1537             ELSE ! shallow water, uniform sigma 
    1538                DO jk = 1, jpk 
    1539                   z_gsigw3(ji,jj,jk) =   REAL(jk-1,wp)            / REAL(jpk-1,wp) 
    1540                   z_gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(jpk-1,wp) 
    1541                   END DO 
    1542             ENDIF 
    1543             ! 
    1544             DO jk = 1, jpkm1 
    1545                z_esigt3(ji,jj,jk  ) = z_gsigw3(ji,jj,jk+1) - z_gsigw3(ji,jj,jk) 
    1546                z_esigw3(ji,jj,jk+1) = z_gsigt3(ji,jj,jk+1) - z_gsigt3(ji,jj,jk) 
    1547             END DO 
    1548             z_esigw3(ji,jj,1  ) = 2._wp * ( z_gsigt3(ji,jj,1  ) - z_gsigw3(ji,jj,1  ) ) 
    1549             z_esigt3(ji,jj,jpk) = 2._wp * ( z_gsigt3(ji,jj,jpk) - z_gsigw3(ji,jj,jpk) ) 
    1550             ! 
    1551             ! Coefficients for vertical depth as the sum of e3w scale factors 
    1552             z_gsi3w3(ji,jj,1) = 0.5_wp * z_esigw3(ji,jj,1) 
    1553             DO jk = 2, jpk 
    1554                z_gsi3w3(ji,jj,jk) = z_gsi3w3(ji,jj,jk-1) + z_esigw3(ji,jj,jk) 
    1555             END DO 
    1556             ! 
    1557             DO jk = 1, jpk 
    1558                zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 
    1559                zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 
    1560                gdept (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsigt3(ji,jj,jk)+rn_hc*zcoeft ) 
    1561                gdepw (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsigw3(ji,jj,jk)+rn_hc*zcoefw ) 
    1562                gdep3w(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*z_gsi3w3(ji,jj,jk)+rn_hc*zcoeft ) 
    1563             END DO 
    1564            ! 
    1565          END DO   ! for all jj's 
    1566       END DO    ! for all ji's 
    1567  
    1568       DO ji = 1, jpim1 
    1569          DO jj = 1, jpjm1 
    1570             DO jk = 1, jpk 
    1571                z_esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) )   & 
    1572                   &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
    1573                z_esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk) )   & 
    1574                   &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    1575                z_esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk)     & 
    1576                   &                + hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*z_esigt3(ji+1,jj+1,jk) )   & 
    1577                   &              / ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 
    1578                z_esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigw3(ji+1,jj,jk) )   & 
    1579                   &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
    1580                z_esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigw3(ji,jj+1,jk) )   & 
    1581                   &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    1582                ! 
    1583                e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*z_esigt3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1584                e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*z_esigtu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1585                e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*z_esigtv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1586                e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*z_esigtf3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1587                ! 
    1588                e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*z_esigw3 (ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1589                e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*z_esigwu3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1590                e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*z_esigwv3(ji,jj,jk) + rn_hc/REAL(jpkm1,wp) ) 
    1591             END DO 
    1592         END DO 
    1593       END DO 
    1594  
    1595       CALL wrk_dealloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3                                      ) 
    1596       CALL wrk_dealloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 
    1597  
    1598    END SUBROUTINE s_sh94 
    1599  
    1600    SUBROUTINE s_sf12 
    1601  
    1602       !!---------------------------------------------------------------------- 
    1603       !!                  ***  ROUTINE s_sf12 ***  
    1604       !!                      
    1605       !! ** Purpose :   stretch the s-coordinate system 
    1606       !! 
    1607       !! ** Method  :   s-coordinate stretch using the Siddorn and Furner 2012? 
    1608       !!                mixed S/sigma/Z coordinate 
    1609       !! 
    1610       !!                This method allows the maintenance of fixed surface and or 
    1611       !!                bottom cell resolutions (cf. geopotential coordinates)  
    1612       !!                within an analytically derived stretched S-coordinate framework. 
    1613       !! 
    1614       !! 
    1615       !! Reference : Siddorn and Furner 2012 (submitted Ocean modelling). 
    1616       !!---------------------------------------------------------------------- 
    1617       ! 
    1618       INTEGER  ::   ji, jj, jk           ! dummy loop argument 
    1619       REAL(wp) ::   zsmth               ! smoothing around critical depth 
    1620       REAL(wp) ::   zzs, zzb           ! Surface and bottom cell thickness in sigma space 
    1621       ! 
    1622       REAL(wp), POINTER, DIMENSION(:,:,:) :: z_gsigw3, z_gsigt3, z_gsi3w3 
    1623       REAL(wp), POINTER, DIMENSION(:,:,:) :: z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3            
    1624  
    1625       ! 
    1626       CALL wrk_alloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3                                      ) 
    1627       CALL wrk_alloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 
    1628  
    1629       z_gsigw3  = 0._wp   ;   z_gsigt3  = 0._wp   ;   z_gsi3w3  = 0._wp 
    1630       z_esigt3  = 0._wp   ;   z_esigw3  = 0._wp  
    1631       z_esigtu3 = 0._wp   ;   z_esigtv3 = 0._wp   ;   z_esigtf3 = 0._wp 
    1632       z_esigwu3 = 0._wp   ;   z_esigwv3 = 0._wp 
    1633  
    1634       DO ji = 1, jpi 
    1635          DO jj = 1, jpj 
    1636  
    1637           IF (hbatt(ji,jj)>rn_hc) THEN !deep water, stretched sigma 
    1638                
    1639               zzb = hbatt(ji,jj)*rn_zb_a + rn_zb_b   ! this forces a linear bottom cell depth relationship with H,. 
    1640                                                      ! could be changed by users but care must be taken to do so carefully 
    1641               zzb = 1.0_wp-(zzb/hbatt(ji,jj)) 
    1642              
    1643               zzs = rn_zs / hbatt(ji,jj)  
    1644                
    1645               IF (rn_efold /= 0.0_wp) THEN 
    1646                 zsmth   = tanh( (hbatt(ji,jj)- rn_hc ) / rn_efold ) 
    1647               ELSE 
    1648                 zsmth = 1.0_wp  
    1649               ENDIF 
    1650                 
    1651               DO jk = 1, jpk 
    1652                 z_gsigw3(ji,jj,jk) =  REAL(jk-1,wp)        /REAL(jpk-1,wp) 
    1653                 z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5_wp)/REAL(jpk-1,wp) 
    1654               ENDDO 
    1655               z_gsigw3(ji,jj,:) = fgamma( z_gsigw3(ji,jj,:), zzb, zzs, zsmth  ) 
    1656               z_gsigt3(ji,jj,:) = fgamma( z_gsigt3(ji,jj,:), zzb, zzs, zsmth  ) 
    1657   
    1658           ELSE IF (ln_sigcrit) THEN ! shallow water, uniform sigma 
    1659  
    1660             DO jk = 1, jpk 
    1661               z_gsigw3(ji,jj,jk) =  REAL(jk-1,wp)     /REAL(jpk-1,wp) 
    1662               z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5)/REAL(jpk-1,wp) 
    1663             END DO 
    1664  
    1665           ELSE  ! shallow water, z coordinates 
    1666  
    1667             DO jk = 1, jpk 
    1668               z_gsigw3(ji,jj,jk) =  REAL(jk-1,wp)        /REAL(jpk-1,wp)*(rn_hc/hbatt(ji,jj)) 
    1669               z_gsigt3(ji,jj,jk) = (REAL(jk-1,wp)+0.5_wp)/REAL(jpk-1,wp)*(rn_hc/hbatt(ji,jj)) 
    1670             END DO 
    1671  
    1672           ENDIF 
    1673  
    1674           DO jk = 1, jpkm1 
    1675              z_esigt3(ji,jj,jk) = z_gsigw3(ji,jj,jk+1) - z_gsigw3(ji,jj,jk) 
    1676              z_esigw3(ji,jj,jk+1) = z_gsigt3(ji,jj,jk+1) - z_gsigt3(ji,jj,jk) 
    1677           END DO 
    1678           z_esigw3(ji,jj,1  ) = 2.0_wp * (z_gsigt3(ji,jj,1  ) - z_gsigw3(ji,jj,1  )) 
    1679           z_esigt3(ji,jj,jpk) = 2.0_wp * (z_gsigt3(ji,jj,jpk) - z_gsigw3(ji,jj,jpk)) 
    1680  
    1681           ! Coefficients for vertical depth as the sum of e3w scale factors 
    1682           z_gsi3w3(ji,jj,1) = 0.5 * z_esigw3(ji,jj,1) 
    1683           DO jk = 2, jpk 
    1684              z_gsi3w3(ji,jj,jk) = z_gsi3w3(ji,jj,jk-1) + z_esigw3(ji,jj,jk) 
    1685           END DO 
    1686  
    1687           DO jk = 1, jpk 
    1688              gdept (ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsigt3(ji,jj,jk) 
    1689              gdepw (ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsigw3(ji,jj,jk) 
    1690              gdep3w(ji,jj,jk) = (scosrf(ji,jj)+hbatt(ji,jj))*z_gsi3w3(ji,jj,jk) 
    1691           END DO 
    1692  
    1693         ENDDO   ! for all jj's 
    1694       ENDDO    ! for all ji's 
    1695  
    1696       DO ji=1,jpi-1 
    1697         DO jj=1,jpj-1 
    1698  
    1699           DO jk = 1, jpk 
    1700                 z_esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) ) / & 
    1701                                     ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
    1702                 z_esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk) ) / & 
    1703                                     ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    1704                 z_esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigt3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigt3(ji+1,jj,jk) +  & 
    1705                                       hbatt(ji,jj+1)*z_esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*z_esigt3(ji+1,jj+1,jk) ) / & 
    1706                                     ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) ) 
    1707                 z_esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji+1,jj)*z_esigw3(ji+1,jj,jk) ) / & 
    1708                                     ( hbatt(ji,jj)+hbatt(ji+1,jj) ) 
    1709                 z_esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*z_esigw3(ji,jj,jk)+hbatt(ji,jj+1)*z_esigw3(ji,jj+1,jk) ) / & 
    1710                                     ( hbatt(ji,jj)+hbatt(ji,jj+1) ) 
    1711  
    1712              e3t(ji,jj,jk)=(scosrf(ji,jj)+hbatt(ji,jj))*z_esigt3(ji,jj,jk) 
    1713              e3u(ji,jj,jk)=(scosrf(ji,jj)+hbatu(ji,jj))*z_esigtu3(ji,jj,jk) 
    1714              e3v(ji,jj,jk)=(scosrf(ji,jj)+hbatv(ji,jj))*z_esigtv3(ji,jj,jk) 
    1715              e3f(ji,jj,jk)=(scosrf(ji,jj)+hbatf(ji,jj))*z_esigtf3(ji,jj,jk) 
    1716              ! 
    1717              e3w(ji,jj,jk)=hbatt(ji,jj)*z_esigw3(ji,jj,jk) 
    1718              e3uw(ji,jj,jk)=hbatu(ji,jj)*z_esigwu3(ji,jj,jk) 
    1719              e3vw(ji,jj,jk)=hbatv(ji,jj)*z_esigwv3(ji,jj,jk) 
    1720           END DO 
    1721  
    1722         ENDDO 
    1723       ENDDO 
    1724       ! 
    1725       CALL lbc_lnk(e3t ,'T',1.) ; CALL lbc_lnk(e3u ,'T',1.) 
    1726       CALL lbc_lnk(e3v ,'T',1.) ; CALL lbc_lnk(e3f ,'T',1.) 
    1727       CALL lbc_lnk(e3w ,'T',1.) 
    1728       CALL lbc_lnk(e3uw,'T',1.) ; CALL lbc_lnk(e3vw,'T',1.) 
    1729       ! 
    1730       !                                               ! ============= 
    1731  
    1732       CALL wrk_dealloc( jpi, jpj, jpk, z_gsigw3, z_gsigt3, z_gsi3w3                                      ) 
    1733       CALL wrk_dealloc( jpi, jpj, jpk, z_esigt3, z_esigw3, z_esigtu3, z_esigtv3, z_esigtf3, z_esigwu3, z_esigwv3 ) 
    1734  
    1735    END SUBROUTINE s_sf12 
    1736  
    1737    SUBROUTINE s_tanh() 
    1738  
    1739       !!---------------------------------------------------------------------- 
    1740       !!                  ***  ROUTINE s_tanh***  
    1741       !!                      
    1742       !! ** Purpose :   stretch the s-coordinate system 
    1743       !! 
    1744       !! ** Method  :   s-coordinate stretch  
    1745       !! 
    1746       !! Reference : Madec, Lott, Delecluse and Crepon, 1996. JPO, 26, 1393-1408. 
    1747       !!---------------------------------------------------------------------- 
    1748  
    1749       INTEGER  ::   ji, jj, jk           ! dummy loop argument 
    1750       REAL(wp) ::   zcoeft, zcoefw   ! temporary scalars 
    1751  
    1752       REAL(wp), POINTER, DIMENSION(:) :: z_gsigw, z_gsigt, z_gsi3w 
    1753       REAL(wp), POINTER, DIMENSION(:) :: z_esigt, z_esigw 
    1754  
    1755       CALL wrk_alloc( jpk, z_gsigw, z_gsigt, z_gsi3w                                      ) 
    1756       CALL wrk_alloc( jpk, z_esigt, z_esigw                                               ) 
    1757  
    1758       z_gsigw  = 0._wp   ;   z_gsigt  = 0._wp   ;   z_gsi3w  = 0._wp 
    1759       z_esigt  = 0._wp   ;   z_esigw  = 0._wp  
    1760  
    1761       DO jk = 1, jpk 
    1762         z_gsigw(jk) = -fssig( REAL(jk,wp)-0.5_wp ) 
    1763         z_gsigt(jk) = -fssig( REAL(jk,wp)        ) 
    1764       END DO 
    1765       IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'z_gsigw 1 jpk    ', z_gsigw(1), z_gsigw(jpk) 
    1766       ! 
    1767       ! Coefficients for vertical scale factors at w-, t- levels 
    1768 !!gm bug :  define it from analytical function, not like juste bellow.... 
    1769 !!gm        or betteroffer the 2 possibilities.... 
    1770       DO jk = 1, jpkm1 
    1771          z_esigt(jk  ) = z_gsigw(jk+1) - z_gsigw(jk) 
    1772          z_esigw(jk+1) = z_gsigt(jk+1) - z_gsigt(jk) 
    1773       END DO 
    1774       z_esigw( 1 ) = 2._wp * ( z_gsigt(1  ) - z_gsigw(1  ) )  
    1775       z_esigt(jpk) = 2._wp * ( z_gsigt(jpk) - z_gsigw(jpk) ) 
    1776       ! 
    1777       ! Coefficients for vertical depth as the sum of e3w scale factors 
    1778       z_gsi3w(1) = 0.5_wp * z_esigw(1) 
     2360      END DO 
     2361      CALL lbc_lnk( e3f, 'F', 1._wp )       ! Lateral boundary conditions 
     2362      ! 
     2363      DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries) 
     2364         WHERE( e3f(:,:,jk) == 0._wp )   e3f(:,:,jk) = e3t_0(jk) 
     2365      END DO 
     2366!!gm  bug ? :  must be a do loop with mj0,mj1 
     2367      !  
     2368      e3t(:,mj0(1),:) = e3t(:,mj0(2),:)     ! we duplicate factor scales for jj = 1 and jj = 2 
     2369      e3w(:,mj0(1),:) = e3w(:,mj0(2),:)  
     2370      e3u(:,mj0(1),:) = e3u(:,mj0(2),:)  
     2371      e3v(:,mj0(1),:) = e3v(:,mj0(2),:)  
     2372      e3f(:,mj0(1),:) = e3f(:,mj0(2),:)  
     2373 
     2374      ! Control of the sign 
     2375      Do jk=1,jpk 
     2376       do jj=1,jpj 
     2377        do ji=1,jpi 
     2378      IF( ( e3t  (ji,jj,jk) ) <= 0._wp )then 
     2379      write(numout,*)'    zgr_hyb :   e r r o r   e3t   <= 0',ji,jj,jk,e3t  (ji,jj,jk); endif 
     2380      IF( ( e3w  (ji,jj,jk) ) <= 0._wp )then 
     2381      write(numout,*)'    zgr_hyb :   e r r o r   e3t   <= 0',ji,jj,jk,e3w  (ji,jj,jk); endif 
     2382       
     2383       
     2384      IF( ( gdept(ji,jj,jk) ) <  0._wp )THEN 
     2385       write (numout,*)'   zgr_hyb :   e r r o r   gdept <  0',ji,jj,jk ,gdept(ji,jj,jj);    endif 
     2386      IF( ( gdepw(ji,jj,jk) ) <  0._wp )then 
     2387      write (numout,*)'   zgr_hyb :   e r r o r   gdepw <  0',ji,jj,jk , gdepw(ji,jj,jj);   endif 
     2388        enddo 
     2389        enddo 
     2390        enddo 
     2391      
     2392      ! Compute gdep3w (vertical sum of e3w) 
     2393      gdep3w(:,:,1) = 0.5_wp * e3w(:,:,1) 
    17792394      DO jk = 2, jpk 
    1780          z_gsi3w(jk) = z_gsi3w(jk-1) + z_esigw(jk) 
    1781       END DO 
    1782 !!gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays) 
    1783       DO jk = 1, jpk 
    1784          zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp) 
    1785          zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp) 
    1786          gdept (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsigt(jk) + hift(:,:)*zcoeft ) 
    1787          gdepw (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsigw(jk) + hift(:,:)*zcoefw ) 
    1788          gdep3w(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*z_gsi3w(jk) + hift(:,:)*zcoeft ) 
    1789       END DO 
    1790 !!gm: e3uw, e3vw can be suppressed  (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays) 
    1791       DO jj = 1, jpj 
    1792          DO ji = 1, jpi 
    1793             DO jk = 1, jpk 
    1794               e3t(ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*z_esigt(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 
    1795               e3u(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*z_esigt(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 
    1796               e3v(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*z_esigt(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 
    1797               e3f(ji,jj,jk) = ( (hbatf(ji,jj)-hiff(ji,jj))*z_esigt(jk) + hiff(ji,jj)/REAL(jpkm1,wp) ) 
    1798               ! 
    1799               e3w (ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*z_esigw(jk) + hift(ji,jj)/REAL(jpkm1,wp) ) 
    1800               e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*z_esigw(jk) + hifu(ji,jj)/REAL(jpkm1,wp) ) 
    1801               e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*z_esigw(jk) + hifv(ji,jj)/REAL(jpkm1,wp) ) 
    1802             END DO 
    1803          END DO 
    1804       END DO 
    1805  
    1806       CALL wrk_dealloc( jpk, z_gsigw, z_gsigt, z_gsi3w                                      ) 
    1807       CALL wrk_dealloc( jpk, z_esigt, z_esigw                                               ) 
    1808  
    1809    END SUBROUTINE s_tanh 
    1810  
    1811    FUNCTION fssig( pk ) RESULT( pf ) 
    1812       !!---------------------------------------------------------------------- 
    1813       !!                 ***  ROUTINE fssig *** 
    1814       !!        
    1815       !! ** Purpose :   provide the analytical function in s-coordinate 
    1816       !!           
    1817       !! ** Method  :   the function provide the non-dimensional position of 
    1818       !!                T and W (i.e. between 0 and 1) 
    1819       !!                T-points at integer values (between 1 and jpk) 
    1820       !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
    1821       !!---------------------------------------------------------------------- 
    1822       REAL(wp), INTENT(in) ::   pk   ! continuous "k" coordinate 
    1823       REAL(wp)             ::   pf   ! sigma value 
    1824       !!---------------------------------------------------------------------- 
    1825       ! 
    1826       pf =   (   TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1) + rn_thetb )  )   & 
    1827          &     - TANH( rn_thetb * rn_theta                                )  )   & 
    1828          & * (   COSH( rn_theta                           )                      & 
    1829          &     + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) )  )              & 
    1830          & / ( 2._wp * SINH( rn_theta ) ) 
    1831       ! 
    1832    END FUNCTION fssig 
    1833  
    1834  
    1835    FUNCTION fssig1( pk1, pbb ) RESULT( pf1 ) 
    1836       !!---------------------------------------------------------------------- 
    1837       !!                 ***  ROUTINE fssig1 *** 
    1838       !! 
    1839       !! ** Purpose :   provide the Song and Haidvogel version of the analytical function in s-coordinate 
    1840       !! 
    1841       !! ** Method  :   the function provides the non-dimensional position of 
    1842       !!                T and W (i.e. between 0 and 1) 
    1843       !!                T-points at integer values (between 1 and jpk) 
    1844       !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
    1845       !!---------------------------------------------------------------------- 
    1846       REAL(wp), INTENT(in) ::   pk1   ! continuous "k" coordinate 
    1847       REAL(wp), INTENT(in) ::   pbb   ! Stretching coefficient 
    1848       REAL(wp)             ::   pf1   ! sigma value 
    1849       !!---------------------------------------------------------------------- 
    1850       ! 
    1851       IF ( rn_theta == 0 ) then      ! uniform sigma 
    1852          pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1 ) 
    1853       ELSE                        ! stretched sigma 
    1854          pf1 =   ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1)) ) ) / SINH( rn_theta )              & 
    1855             &  + pbb * (  (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta )  )  & 
    1856             &        / ( 2._wp * TANH( 0.5_wp * rn_theta ) )  ) 
    1857       ENDIF 
    1858       ! 
    1859    END FUNCTION fssig1 
    1860  
    1861  
    1862    FUNCTION fgamma( pk1, pzb, pzs, psmth) RESULT( p_gamma ) 
    1863       !!---------------------------------------------------------------------- 
    1864       !!                 ***  ROUTINE fgamma  *** 
    1865       !! 
    1866       !! ** Purpose :   provide analytical function for the s-coordinate 
    1867       !! 
    1868       !! ** Method  :   the function provides the non-dimensional position of 
    1869       !!                T and W (i.e. between 0 and 1) 
    1870       !!                T-points at integer values (between 1 and jpk) 
    1871       !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5) 
    1872       !! 
    1873       !!                This method allows the maintenance of fixed surface and or 
    1874       !!                bottom cell resolutions (cf. geopotential coordinates)  
    1875       !!                within an analytically derived stretched S-coordinate framework. 
    1876       !! 
    1877       !! Reference  :   Siddorn and Furner, in prep 
    1878       !!---------------------------------------------------------------------- 
    1879       REAL(wp), INTENT(in   ) ::   pk1(jpk)       ! continuous "k" coordinate 
    1880       REAL(wp)                ::   p_gamma(jpk)   ! stretched coordinate 
    1881       REAL(wp), INTENT(in   ) ::   pzb           ! Bottom box depth 
    1882       REAL(wp), INTENT(in   ) ::   pzs           ! surface box depth 
    1883       REAL(wp), INTENT(in   ) ::   psmth       ! Smoothing parameter 
    1884       REAL(wp)                ::   za1,za2,za3    ! local variables 
    1885       REAL(wp)                ::   zn1,zn2        ! local variables 
    1886       REAL(wp)                ::   za,zb,zx       ! local variables 
    1887       integer                 ::   jk 
    1888       !!---------------------------------------------------------------------- 
    1889       ! 
    1890  
    1891       zn1  =  1./(jpk-1.) 
    1892       zn2  =  1. -  zn1 
    1893  
    1894       za1 = (rn_alpha+2.0_wp)*zn1**(rn_alpha+1.0_wp)-(rn_alpha+1.0_wp)*zn1**(rn_alpha+2.0_wp)  
    1895       za2 = (rn_alpha+2.0_wp)*zn2**(rn_alpha+1.0_wp)-(rn_alpha+1.0_wp)*zn2**(rn_alpha+2.0_wp) 
    1896       za3 = (zn2**3.0_wp - za2)/( zn1**3.0_wp - za1) 
     2395         gdep3w(:,:,jk) = gdep3w(:,:,jk-1) + e3w(:,:,jk)  
     2396      END DO 
     2397 
     2398 
     2399     IF( lk_mpp )   CALL mpp_max( nstop ) 
     2400   IF (lwp) write(numout,*)"zpartial" ,nstop 
     2401 
     2402 
     2403 
     2404      CALL lbc_lnk( e3f, 'F', 1._wp )       ! Lateral boundary conditions 
     2405 
    18972406      
    1898       za = pzb - za3*(pzs-za1)-za2 
    1899       za = za/( zn2-0.5_wp*(za2+zn2**2.0_wp) - za3*(zn1-0.5_wp*(za1+zn1**2.0_wp) ) ) 
    1900       zb = (pzs - za1 - za*( zn1-0.5_wp*(za1+zn1**2.0_wp ) ) ) / (zn1**3.0_wp - za1) 
    1901       zx = 1.0_wp-za/2.0_wp-zb 
    1902   
    1903       DO jk = 1, jpk 
    1904         p_gamma(jk) = za*(pk1(jk)*(1.0_wp-pk1(jk)/2.0_wp))+zb*pk1(jk)**3.0_wp +  & 
    1905                     & zx*( (rn_alpha+2.0_wp)*pk1(jk)**(rn_alpha+1.0_wp)- & 
    1906                     &      (rn_alpha+1.0_wp)*pk1(jk)**(rn_alpha+2.0_wp) ) 
    1907         p_gamma(jk) = p_gamma(jk)*psmth+pk1(jk)*(1.0_wp-psmth) 
    1908       ENDDO  
    1909  
    1910       ! 
    1911    END FUNCTION fgamma 
     2407 
     2408 
     2409      CALL wrk_dealloc( jpi, jpj,      zenv, ztmp, zmsk, zri, zrj, zhbat ) 
     2410      ! 
     2411      IF( nn_timing == 1 )  CALL timing_stop('zgr_hyb') 
     2412 
     2413   END SUBROUTINE zgr_hyb 
     2414 
    19122415 
    19132416   !!====================================================================== 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr_substitute.h90

    r2528 r6736  
    3232#   define  fse3vw(i,j,k)  e3vw_1(i,j,k) 
    3333 
     34#if defined key_jth_fix 
     35#   define  fsdept_b(i,j,k)  (fsdept_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
     36#   define  fsdepw_b(i,j,k)  (fsdepw_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
     37#   define  fsde3w_b(i,j,k)  (fsde3w_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))-sshb(i,j)) 
     38#   define  fse3t_b(i,j,k)   (fse3t_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
     39#   define  fse3u_b(i,j,k)   (fse3u_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 
     40#   define  fse3v_b(i,j,k)   (fse3v_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 
     41#   define  fse3f_b(i,j,k)   (fse3f_0(i,j,k)*(1.+sshf_b(i,j)*muf(i,j,k))) 
     42#   define  fse3w_b(i,j,k)   (fse3w_0(i,j,k)*(1.+sshb(i,j)*mut(i,j,k))) 
     43#   define  fse3uw_b(i,j,k)  (fse3uw_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 
     44#   define  fse3vw_b(i,j,k)  (fse3vw_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 
     45#else 
    3446#   define  fse3t_b(i,j,k)   e3t_b(i,j,k) 
    3547#   define  fse3u_b(i,j,k)   e3u_b(i,j,k) 
     
    3749#   define  fse3uw_b(i,j,k)  (fse3uw_0(i,j,k)*(1.+sshu_b(i,j)*muu(i,j,k))) 
    3850#   define  fse3vw_b(i,j,k)  (fse3vw_0(i,j,k)*(1.+sshv_b(i,j)*muv(i,j,k))) 
     51#endif 
    3952 
    4053#   define  fsdept_n(i,j,k)  (fsdept_0(i,j,k)*(1.+sshn(i,j)*mut(i,j,k))) 
     
    5164#   define  fse3t_m(i,j,k)   (fse3t_0(i,j,k)*(1.+ssh_m(i,j)*mut(i,j,k))) 
    5265 
     66#if defined key_jth_fix 
     67#   define  fsdept_a(i,j,k)  (fsdept_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
     68#   define  fsdepw_a(i,j,k)  (fsdepw_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
     69#   define  fsde3w_a(i,j,k)  (fsde3w_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))-ssha(i,j)) 
     70#endif 
    5371#   define  fse3t_a(i,j,k)   (fse3t_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
    5472#   define  fse3u_a(i,j,k)   (fse3u_0(i,j,k)*(1.+sshu_a(i,j)*muu(i,j,k))) 
    5573#   define  fse3v_a(i,j,k)   (fse3v_0(i,j,k)*(1.+sshv_a(i,j)*muv(i,j,k))) 
     74#if defined key_jth_fix 
     75#   define  fse3f_a(i,j,k)   (fse3f_0(i,j,k)*(1.+sshf_a(i,j)*muf(i,j,k))) 
     76#   define  fse3w_a(i,j,k)   (fse3w_0(i,j,k)*(1.+ssha(i,j)*mut(i,j,k))) 
     77#   define  fse3uw_a(i,j,k)  (fse3uw_0(i,j,k)*(1.+sshu_a(i,j)*muu(i,j,k))) 
     78#   define  fse3vw_a(i,j,k)  (fse3vw_0(i,j,k)*(1.+sshv_a(i,j)*muv(i,j,k))) 
     79#endif 
    5680 
    5781#else 
     
    6892#   define  fse3vw(i,j,k)  fse3vw_0(i,j,k) 
    6993 
     94#if defined key_jth_fix 
     95#   define  fsdept_b(i,j,k)  fsdept_0(i,j,k) 
     96#   define  fsdepw_b(i,j,k)  fsdepw_0(i,j,k) 
     97#   define  fsde3w_b(i,j,k)  fsde3w_0(i,j,k) 
     98#endif 
    7099#   define  fse3t_b(i,j,k)   fse3t_0(i,j,k) 
    71100#   define  fse3u_b(i,j,k)   fse3u_0(i,j,k) 
    72101#   define  fse3v_b(i,j,k)   fse3v_0(i,j,k) 
     102#if defined key_jth_fix 
     103#   define  fse3f_b(i,j,k)   fse3f_0(i,j,k) 
     104#   define  fse3w_b(i,j,k)   fse3w_0(i,j,k) 
     105#endif 
    73106#   define  fse3uw_b(i,j,k)  fse3uw_0(i,j,k) 
    74107#   define  fse3vw_b(i,j,k)  fse3vw_0(i,j,k) 
     
    87120#   define  fse3t_m(i,j,k)   fse3t_0(i,j,k) 
    88121 
     122#if defined key_jth_fix 
     123#   define  fsdept_a(i,j,k)  fsdept_0(i,j,k) 
     124#   define  fsdepw_a(i,j,k)  fsdepw_0(i,j,k) 
     125#   define  fsde3w_a(i,j,k)  fsde3w_0(i,j,k) 
     126#endif 
    89127#   define  fse3t_a(i,j,k)   fse3t_0(i,j,k) 
    90128#   define  fse3u_a(i,j,k)   fse3u_0(i,j,k) 
    91129#   define  fse3v_a(i,j,k)   fse3v_0(i,j,k) 
     130#if defined key_jth_fix 
     131#   define  fse3f_a(i,j,k)   fse3f_0(i,j,k) 
     132#   define  fse3w_a(i,j,k)   fse3w_0(i,j,k) 
     133#   define  fse3uw_a(i,j,k)  fse3uw_0(i,j,k) 
     134#   define  fse3vw_a(i,j,k)  fse3vw_0(i,j,k) 
     135#endif 
    92136#endif 
    93137   !!---------------------------------------------------------------------- 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/dtatsd.F90

    r3294 r6736  
    1818   USE dom_oce         ! ocean space and time domain 
    1919   USE fldread         ! read input fields 
    20    USE in_out_manager  ! I/O manager 
    2120   USE phycst          ! physical constants 
    2221   USE lib_mpp         ! MPP library 
    2322   USE wrk_nemo        ! Memory allocation 
    2423   USE timing          ! Timing 
     24   USE in_out_manager  ! I/O manager 
     25   USE iom 
    2526 
    2627   IMPLICIT NONE 
     
    3435 
    3536   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tsd   ! structure of input SST (file informations, fields read) 
     37#if defined key_jdha_init 
     38   REAL(wp), ALLOCATABLE, DIMENSION(:,:,: ) ::   gdept_init  
     39#endif 
    3640 
    3741   !! * Substitutions 
     
    146150      INTEGER                              , INTENT(in   ) ::   kt     ! ocean time-step 
    147151      REAL(wp), DIMENSION(jpi,jpj,jpk,jpts), INTENT(  out) ::   ptsd   ! T & S data 
     152!     REAL(wp), DIMENSION(jpi,jpj,jpk) ::   gdept_init   ! T & S data 
    148153      ! 
    149154      INTEGER ::   ji, jj, jk, jl, jkk   ! dummy loop indicies 
     
    156161      ! 
    157162      CALL fld_read( kt, 1, sf_tsd )      !==   read T & S data at kt time step   ==! 
     163 
     164#if defined key_jdha_init 
     165      ALLOCATE( gdept_init(jpi,jpj,jpk) ) 
     166      CALL iom_open ( sf_tsd(jp_tem)%clname, sf_tsd(jp_tem)%num )  
     167      CALL iom_get ( sf_tsd(jp_tem)%num, jpdom_data, 'deptht', gdept_init,1) 
     168      CALL iom_close( sf_tsd(jp_tem)%num )   ! Close the input file 
     169#endif 
    158170      ! 
    159171      ! 
     
    223235               DO jk = 1, jpk                        ! determines the intepolated T-S profiles at each (i,j) points 
    224236                  zl = fsdept_0(ji,jj,jk) 
     237#if defined key_jdha_init 
     238                  IF(     zl < gdept_init(ji,jj,1  ) ) THEN          ! above the first level of data 
     239#else 
    225240                  IF(     zl < gdept_0(1  ) ) THEN          ! above the first level of data 
     241#endif 
    226242                     ztp(jk) =  ptsd(ji,jj,1    ,jp_tem) 
    227243                     zsp(jk) =  ptsd(ji,jj,1    ,jp_sal) 
     244#if defined key_jdha_init 
     245                  ELSEIF( zl > gdept_init(ji,jj,jpk) ) THEN          ! below the last level of data 
     246#else 
    228247                  ELSEIF( zl > gdept_0(jpk) ) THEN          ! below the last level of data 
     248#endif 
    229249                     ztp(jk) =  ptsd(ji,jj,jpkm1,jp_tem) 
    230250                     zsp(jk) =  ptsd(ji,jj,jpkm1,jp_sal) 
    231251                  ELSE                                      ! inbetween : vertical interpolation between jkk & jkk+1 
    232252                     DO jkk = 1, jpkm1                                  ! when  gdept(jkk) < zl < gdept(jkk+1) 
     253#if defined key_jdha_init 
     254                        IF( (zl-gdept_init(ji,jj,jkk)) * (zl-gdept_init(ji,jj,jkk+1)) <= 0._wp ) THEN 
     255                           zi = ( zl - gdept_init(ji,jj,jkk) ) / (gdept_init(ji,jj,jkk+1)-gdept_init(ji,jj,jkk)) 
     256#else 
    233257                        IF( (zl-gdept_0(jkk)) * (zl-gdept_0(jkk+1)) <= 0._wp ) THEN 
    234258                           zi = ( zl - gdept_0(jkk) ) / (gdept_0(jkk+1)-gdept_0(jkk)) 
     259#endif 
    235260                           ztp(jk) = ptsd(ji,jj,jkk,jp_tem) + ( ptsd(ji,jj,jkk+1,jp_tem) - ptsd(ji,jj,jkk,jp_tem) ) * zi  
    236261                           zsp(jk) = ptsd(ji,jj,jkk,jp_sal) + ( ptsd(ji,jj,jkk+1,jp_sal) - ptsd(ji,jj,jkk,jp_sal) ) * zi 
     
    299324         IF( sf_tsd(jp_sal)%ln_tint )   DEALLOCATE( sf_tsd(jp_sal)%fdta ) 
    300325                                        DEALLOCATE( sf_tsd              )     ! the structure itself 
     326#if defined key_jdha_init 
     327         DEALLOCATE( gdept_init ) 
     328#endif 
    301329      ENDIF 
    302330      ! 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/istate.F90

    r3764 r6736  
    3232   USE phycst          ! physical constants 
    3333   USE dtatsd          ! data temperature and salinity   (dta_tsd routine) 
     34   USE restart         ! ocean restart                   (rst_read routine) 
    3435   USE in_out_manager  ! I/O manager 
    3536   USE iom             ! I/O library 
     
    4344   USE sol_oce         ! ocean solver variables 
    4445   USE lib_mpp         ! MPP library 
    45    USE restart         ! restart 
    4646   USE wrk_nemo        ! Memory allocation 
    4747   USE timing          ! Timing 
     
    7070      ! - ML - needed for initialization of e3t_b 
    7171      INTEGER  ::  jk     ! dummy loop indice 
     72      INTEGER  ::   inum              ! temporary logical unit 
    7273      !!---------------------------------------------------------------------- 
    7374      ! 
     
    9192         CALL rst_read                           ! Read the restart file 
    9293         !                                       ! define e3u_b, e3v_b from e3t_b read in restart file 
     94#if ! defined key_jth_fix 
    9395         CALL dom_vvl_2( nit000, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 
     96#endif 
    9497         CALL day_init                           ! model calendar (using both namelist and restart infos) 
    9598      ELSE 
     
    114117            CALL dta_tsd( nit000, tsb )                  ! read 3D T and S data at nit000 
    115118            tsn(:,:,:,:) = tsb(:,:,:,:) 
     119#if defined key_jdha_ssh_init 
     120      CALL iom_open ( 'initcd_ssh.nc', inum )  
     121      CALL iom_get ( inum, jpdom_data, 'sossheig', sshb(:,:)) 
     122      CALL iom_close( inum )   ! Close the input file 
     123      sshn(:,:) = sshb(:,:) 
     124#endif 
    116125            ! 
    117126         ELSE                                    ! Initial T-S fields defined analytically 
     
    126135         !    
    127136         ! - ML - sshn could be modified by istate_eel, so that initialization of fse3t_b is done here 
     137#if ! defined key_jth_fix 
    128138         IF( lk_vvl ) THEN 
    129139            DO jk = 1, jpk 
     
    133143         !                                       ! define e3u_b, e3v_b from e3t_b initialized in domzgr 
    134144         CALL dom_vvl_2( nit000, fse3u_b(:,:,:), fse3v_b(:,:,:) ) 
     145#endif 
    135146         !  
    136147      ENDIF 
     
    164175      INTEGER  :: ji, jj, jk 
    165176      REAL(wp) ::   zsal = 35.50 
     177#if defined key_istate_fixed 
     178      REAL(wp) ::   ztem = 25.50 
     179#endif 
    166180      !!---------------------------------------------------------------------- 
    167181      ! 
     
    170184      IF(lwp) WRITE(numout,*) '~~~~~~~~~~   and constant salinity (',zsal,' psu)' 
    171185      ! 
     186#if ! defined key_istate_fixed 
    172187      DO jk = 1, jpk 
    173188         tsn(:,:,jk,jp_tem) = (  ( ( 7.5 - 0. * ABS( gphit(:,:) )/30. ) * ( 1.-TANH((fsdept(:,:,jk)-80.)/30.) )   & 
     
    175190         tsb(:,:,jk,jp_tem) = tsn(:,:,jk,jp_tem) 
    176191      END DO 
     192#else 
     193      tsn(:,:,:,jp_tem) = ztem * tmask(:,:,:) 
     194      tsb(:,:,:,jp_tem) = tsn(:,:,:,jp_tem) 
     195#endif 
    177196      tsn(:,:,:,jp_sal) = zsal * tmask(:,:,:) 
    178197      tsb(:,:,:,jp_sal) = tsn(:,:,:,jp_sal) 
  • branches/NERC/dev_r3874_FASTNEt/NEMOGCM/NEMO/OPA_SRC/DOM/phycst.F90

    r3625 r6736  
    2727   REAL(wp), PUBLIC ::   rsmall = 0.5 * EPSILON( 1.e0 )         !: smallest real computer value 
    2828    
    29    REAL(wp), PUBLIC ::   rday = 24.*60.*60.     !: day                                [s] 
    30    REAL(wp), PUBLIC ::   rsiyea                 !: sideral year                       [s] 
    31    REAL(wp), PUBLIC ::   rsiday                 !: sideral day                        [s] 
    32    REAL(wp), PUBLIC ::   raamo =  12._wp        !: number of months in one year 
    33    REAL(wp), PUBLIC ::   rjjhh =  24._wp        !: number of hours in one day 
    34    REAL(wp), PUBLIC ::   rhhmm =  60._wp        !: number of minutes in one hour 
    35    REAL(wp), PUBLIC ::   rmmss =  60._wp        !: number of seconds in one minute 
    36    REAL(wp), PUBLIC ::   omega                  !: earth rotation parameter           [s-1] 
    37    REAL(wp), PUBLIC ::   ra    = 6371229._wp    !: earth radius                       [m] 
    38    REAL(wp), PUBLIC ::   grav  = 9.80665_wp     !: gravity                            [m/s2] 
     29   REAL(wp), PUBLIC ::   rday = 24.*60.*60.       !: day (s) 
     30   REAL(wp), PUBLIC ::   rsiyea                   !: sideral year (s) 
     31   REAL(wp), PUBLIC ::   rsiday                   !: sideral day (s) 
     32   REAL(wp), PUBLIC ::   raamo =  12._wp          !: number of months in one year 
     33   REAL(wp), PUBLIC ::   rjjhh =  24._wp          !: number of hours in one day 
     34   REAL(wp), PUBLIC ::   rhhmm =  60._wp          !: number of minutes in one hour 
     35   REAL(wp), PUBLIC ::   rmmss =  60._wp          !: number of seconds in one minute 
     36!! REAL(wp), PUBLIC ::   omega = 7.292115083046061e-5_wp ,  &  !: change the last digit! 
     37   REAL(wp), PUBLIC ::   omega                    !: earth rotation parameter 
     38   REAL(wp), PUBLIC ::   ra    = 6371229._wp      !: earth radius (meter) 
     39   REAL(wp), PUBLIC ::   grav  = 9.80665_wp       !: gravity (m/s2) 
    3940    
    40    REAL(wp), PUBLIC ::   rtt      = 273.16_wp        !: triple point of temperature   [Kelvin] 
    41    REAL(wp), PUBLIC ::   rt0      = 273.15_wp        !: freezing point of fresh water [Kelvin] 
     41   REAL(wp), PUBLIC ::   rtt      = 273.16_wp     !: triple point of temperature (Kelvin) 
     42   REAL(wp), PUBLIC ::   rt0      = 273.15_wp     !: freezing point of water (Kelvin) 
    4243#if defined key_lim3 
    43    REAL(wp), PUBLIC ::   rt0_snow = 273.16_wp        !: melting point of snow         [Kelvin] 
    44    REAL(wp), PUBLIC ::   rt0_ice  = 273.16_wp        !: melting point of ice          [Kelvin] 
     44   REAL(wp), PUBLIC ::   rt0_snow = 273.16_wp     !: melting point of snow  (Kelvin) 
     45   REAL(wp), PUBLIC ::   rt0_ice  = 273.16_wp     !: melting point of ice   (Kelvin) 
    4546#else 
    46    REAL(wp), PUBLIC ::   rt0_snow = 273.15_wp        !: melting point of snow         [Kelvin] 
    47    REAL(wp), PUBLIC ::   rt0_ice  = 273.05_wp        !: melting point of ice          [Kelvin] 
     47   REAL(wp), PUBLIC ::   rt0_snow = 273.15_wp     !: melting point of snow  (Kelvin) 
     48   REAL(wp), PUBLIC ::   rt0_ice  = 273.05_wp     !: melting point of ice   (Kelvin) 
    4849#endif 
     50 
    4951#if defined key_cice 
    50    REAL(wp), PUBLIC ::   rau0     = 1026._wp         !: volumic mass of reference     [kg/m3] 
     52   REAL(wp), PUBLIC ::   rau0     = 1026._wp      !: reference volumic mass (density)  (kg/m3) 
    5153#else 
    52    REAL(wp), PUBLIC ::   rau0     = 1035._wp         !: volumic mass of reference     [kg/m3] 
     54   REAL(wp), PUBLIC ::   rau0     = 1035._wp      !: reference volumic mass (density)  (kg/m3) 
    5355#endif 
    54    REAL(wp), PUBLIC ::   r1_rau0                     !: = 1. / rau0                   [m3/kg] 
    55    REAL(wp), PUBLIC ::   rauw     = 1000._wp         !: volumic mass of pure water    [m3/kg] 
    56    REAL(wp), PUBLIC ::   rcp      =    4.e3_wp       !: ocean specific heat           [J/Kelvin] 
    57    REAL(wp), PUBLIC ::   r1_rcp                      !: = 1. / rcp                    [Kelvin/J] 
    58    REAL(wp), PUBLIC ::   r1_rau0_rcp                 !: = 1. / ( rau0 * rcp ) 
    59  
    60    REAL(wp), PUBLIC ::   rhosn    =  330._wp         !: volumic mass of snow          [kg/m3] 
    61    REAL(wp), PUBLIC ::   emic     =    0.97_wp       !: emissivity of snow or ice 
    62    REAL(wp), PUBLIC ::   sice     =    6.0_wp        !: salinity of ice               [psu] 
    63    REAL(wp), PUBLIC ::   soce     =   34.7_wp        !: salinity of sea               [psu] 
    64    REAL(wp), PUBLIC ::   cevap    =    2.5e+6_wp     !: latent heat of evaporation (water) 
    65    REAL(wp), PUBLIC ::   srgamma  =    0.9_wp        !: correction factor for solar radiation (Oberhuber, 1974) 
    66    REAL(wp), PUBLIC ::   vkarmn   =    0.4_wp        !: von Karman constant 
    67    REAL(wp), PUBLIC ::   stefan   =    5.67e-8_wp    !: Stefan-Boltzmann constant  
     56   REAL(wp), PUBLIC ::   rau0r                    !: reference specific volume         (m3/kg) 
     57   REAL(wp), PUBLIC ::   rcp      =    4.e+3_wp   !: ocean specific heat 
     58   REAL(wp), PUBLIC ::   ro0cpr                   !: = 1. / ( rau0 * rcp ) 
    6859 
    6960#if defined key_lim3 || defined key_cice 
    70    REAL(wp), PUBLIC ::   rhoic    =  917._wp         !: volumic mass of sea ice                               [kg/m3] 
    71    REAL(wp), PUBLIC ::   rcdic    =    2.034396_wp   !: thermal conductivity of fresh ice 
    72    REAL(wp), PUBLIC ::   rcdsn    =    0.31_wp       !: thermal conductivity of snow 
    73    REAL(wp), PUBLIC ::   cpic     = 2067.0_wp        !: specific heat for ice  
    74    REAL(wp), PUBLIC ::   lsub     =    2.834e+6_wp   !: pure ice latent heat of sublimation                   [J/kg] 
    75    REAL(wp), PUBLIC ::   lfus     =    0.334e+6_wp   !: latent heat of fusion of fresh ice                    [J/kg] 
    76    REAL(wp), PUBLIC ::   tmut     =    0.054_wp      !: decrease of seawater meltpoint with salinity 
    77    REAL(wp), PUBLIC ::   xlsn                        !: = lfus*rhosn (volumetric latent heat fusion of snow)  [J/m3] 
     61   REAL(wp), PUBLIC ::   rcdsn   =   0.31_wp      !: thermal conductivity of snow 
     62   REAL(wp), PUBLIC ::   rcdic   =   2.034396_wp  !: thermal conductivity of fresh ice 
     63   REAL(wp), PUBLIC ::   cpic    = 2067.0         !: specific heat of sea ice 
     64   REAL(wp), PUBLIC ::   lsub    = 2.834e+6       !: pure ice latent heat of sublimation (J.kg-1) 
     65   REAL(wp), PUBLIC ::   lfus    = 0.334e+6       !: latent heat of fusion of fresh ice   (J.kg-1) 
     66   REAL(wp), PUBLIC ::   rhoic   = 917._wp        !: volumic mass of sea ice (kg/m3) 
     67   REAL(wp), PUBLIC ::   tmut    =   0.054        !: decrease of seawater meltpoint with salinity 
    7868#else 
    79    REAL(wp), PUBLIC ::   rhoic    =  900._wp         !: volumic mass of sea ice                               [kg/m3] 
    80    REAL(wp), PUBLIC ::   rcdic    =    2.034396_wp   !: conductivity of the ice                               [W/m/K] 
    81    REAL(wp), PUBLIC ::   rcpic    =    1.8837e+6_wp  !: volumetric specific heat for ice                      [J/m3/K] 
    82    REAL(wp), PUBLIC ::   cpic                        !: = rcpic / rhoic  (specific heat for ice)              [J/Kg/K] 
    83    REAL(wp), PUBLIC ::   rcdsn    =    0.22_wp       !: conductivity of the snow                              [W/m/K] 
    84    REAL(wp), PUBLIC ::   rcpsn    =    6.9069e+5_wp  !: volumetric specific heat for snow                     [J/m3/K] 
    85    REAL(wp), PUBLIC ::   xlsn     =  110.121e+6_wp   !: volumetric latent heat fusion of snow                 [J/m3] 
    86    REAL(wp), PUBLIC ::   lfus                        !: = xlsn / rhosn   (latent heat of fusion of fresh ice) [J/Kg] 
    87    REAL(wp), PUBLIC ::   xlic     =  300.33e+6_wp    !: volumetric latent heat fusion of ice                  [J/m3] 
    88    REAL(wp), PUBLIC ::   xsn      =    2.8e+6_wp     !: volumetric latent heat of sublimation of snow         [J/m3] 
     69   REAL(wp), PUBLIC ::   rcdsn   =   0.22_wp      !: conductivity of the snow 
     70   REAL(wp), PUBLIC ::   rcdic   =   2.034396_wp  !: conductivity of the ice 
     71   REAL(wp), PUBLIC ::   rcpsn   =   6.9069e+5_wp !: density times specific heat for snow 
     72   REAL(wp), PUBLIC ::   rcpic   =   1.8837e+6_wp !: volumetric latent heat fusion of sea ice 
     73   REAL(wp), PUBLIC ::   lfus    =   0.3337e+6    !: latent heat of fusion of fresh ice   (J.kg-1)     
     74   REAL(wp), PUBLIC ::   xlsn    = 110.121e+6_wp  !: volumetric latent heat fusion of snow 
     75   REAL(wp), PUBLIC ::   xlic    = 300.33e+6_wp   !: volumetric latent heat fusion of ice 
     76   REAL(wp), PUBLIC ::   xsn     =   2.8e+6       !: latent heat of sublimation of snow 
     77   REAL(wp), PUBLIC ::   rhoic   = 900._wp        !: volumic mass of sea ice (kg/m3) 
    8978#endif 
     79   REAL(wp), PUBLIC ::   rhosn   = 330._wp        !: volumic mass of snow (kg/m3) 
     80   REAL(wp), PUBLIC ::   emic    =   0.97_wp      !: emissivity of snow or ice 
     81   REAL(wp), PUBLIC ::   sice    =   6.0_wp       !: reference salinity of ice (psu) 
     82   REAL(wp), PUBLIC ::   soce    =  34.7_wp       !: reference salinity of sea (psu) 
     83   REAL(wp), PUBLIC ::   cevap   =   2.5e+6_wp    !: latent heat of evaporation (water) 
     84   REAL(wp), PUBLIC ::   srgamma =   0.9_wp       !: correction factor for solar radiation (Oberhuber, 1974) 
     85   REAL(wp), PUBLIC ::   vkarmn  =   0.4_wp       !: von Karman constant 
     86   REAL(wp), PUBLIC ::   stefan  =   5.67e-8_wp   !: Stefan-Boltzmann constant  
    9087   !!---------------------------------------------------------------------- 
    9188   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
     
    105102      !!---------------------------------------------------------------------- 
    106103 
    107       IF(lwp) WRITE(numout,*) 
    108       IF(lwp) WRITE(numout,*) ' phy_cst : initialization of ocean parameters and constants' 
    109       IF(lwp) WRITE(numout,*) ' ~~~~~~~' 
     104      !                                   ! Define additional parameters 
     105      rsiyea = 365.25 * rday * 2. * rpi / 6.283076 
     106      rsiday = rday / ( 1. + rday / rsiyea ) 
     107#if defined key_cice 
     108      omega =  7.292116e-05 
     109#else 
     110      omega  = 2. * rpi / rsiday  
     111#endif 
    110112 
    111       ! Ocean Parameters 
    112       ! ---------------- 
    113       IF(lwp) THEN 
     113      rau0r  = 1. /   rau0   
     114      ro0cpr = 1. / ( rau0 * rcp ) 
     115 
     116 
     117      IF(lwp) THEN                        ! control print 
     118         WRITE(numout,*) 
     119         WRITE(numout,*) ' phy_cst : initialization of ocean parameters and constants' 
     120         WRITE(numout,*) ' ~~~~~~~' 
    114121         WRITE(numout,*) '       Domain info' 
    115122         WRITE(numout,*) '          dimension of model' 
     
    124131         WRITE(numout,*) '             jpnij   : ', jpnij 
    125132         WRITE(numout,*) '          lateral domain boundary condition type : jperio  = ', jperio 
    126       ENDIF 
    127  
    128       ! Define constants 
    129       ! ---------------- 
    130       IF(lwp) WRITE(numout,*) 
    131       IF(lwp) WRITE(numout,*) '       Constants' 
    132  
    133       IF(lwp) WRITE(numout,*) 
    134       IF(lwp) WRITE(numout,*) '          mathematical constant                 rpi = ', rpi 
    135  
    136       rsiyea = 365.25_wp * rday * 2._wp * rpi / 6.283076_wp 
    137       rsiday = rday / ( 1._wp + rday / rsiyea ) 
    138 #if defined key_cice 
    139       omega  = 7.292116e-05 
    140 #else 
    141       omega  = 2._wp * rpi / rsiday  
    142 #endif 
    143       IF(lwp) WRITE(numout,*) 
    144       IF(lwp) WRITE(numout,*) '          day                                rday   = ', rday,   ' s' 
    145       IF(lwp) WRITE(numout,*) '          sideral year                       rsiyea = ', rsiyea, ' s' 
    146       IF(lwp) WRITE(numout,*) '          sideral day                        rsiday = ', rsiday, ' s' 
    147       IF(lwp) WRITE(numout,*) '          omega                              omega  = ', omega,  ' s^-1' 
    148  
    149       IF(lwp) WRITE(numout,*) 
    150       IF(lwp) WRITE(numout,*) '          nb of months per year               raamo = ', raamo, ' months' 
    151       IF(lwp) WRITE(numout,*) '          nb of hours per day                 rjjhh = ', rjjhh, ' hours' 
    152       IF(lwp) WRITE(numout,*) '          nb of minutes per hour              rhhmm = ', rhhmm, ' mn' 
    153       IF(lwp) WRITE(numout,*) '          nb of seconds per minute            rmmss = ', rmmss, ' s' 
    154  
    155       IF(lwp) WRITE(numout,*) 
    156       IF(lwp) WRITE(numout,*) '          earth radius                         ra   = ', ra, ' m' 
    157       IF(lwp) WRITE(numout,*) '          gravity                              grav = ', grav , ' m/s^2' 
    158  
    159       IF(lwp) WRITE(numout,*) 
    160       IF(lwp) WRITE(numout,*) '          triple point of temperature      rtt      = ', rtt     , ' K' 
    161       IF(lwp) WRITE(numout,*) '          freezing point of water          rt0      = ', rt0     , ' K' 
    162       IF(lwp) WRITE(numout,*) '          melting point of snow            rt0_snow = ', rt0_snow, ' K' 
    163       IF(lwp) WRITE(numout,*) '          melting point of ice             rt0_ice  = ', rt0_ice , ' K' 
    164  
    165       r1_rau0     = 1._wp / rau0 
    166       r1_rcp      = 1._wp / rcp 
    167       r1_rau0_rcp = 1._wp / ( rau0 * rcp ) 
    168       IF(lwp) WRITE(numout,*) 
    169       IF(lwp) WRITE(numout,*) '          volumic mass of pure water          rauw  = ', rauw   , ' kg/m^3' 
    170       IF(lwp) WRITE(numout,*) '          volumic mass of reference           rau0  = ', rau0   , ' kg/m^3' 
    171       IF(lwp) WRITE(numout,*) '          1. / rau0                        r1_rau0  = ', r1_rau0, ' m^3/kg' 
    172       IF(lwp) WRITE(numout,*) '          ocean specific heat                 rcp   = ', rcp    , ' J/Kelvin' 
    173       IF(lwp) WRITE(numout,*) '          1. / ( rau0 * rcp )           r1_rau0_rcp = ', r1_rau0_rcp 
    174  
    175  
    176 #if defined key_lim3 || defined key_cice 
    177       xlsn = lfus * rhosn        ! volumetric latent heat fusion of snow [J/m3] 
    178 #else 
    179       cpic = rcpic / rhoic       ! specific heat for ice   [J/Kg/K] 
    180       lfus = xlsn / rhosn        ! latent heat of fusion of fresh ice 
    181 #endif 
    182  
    183       IF(lwp) THEN 
     133         WRITE(numout,*) 
     134         WRITE(numout,*) '       Constants' 
     135         WRITE(numout,*) 
     136         WRITE(numout,*) '          mathematical constant                 rpi = ', rpi 
     137         WRITE(numout,*) '          day                                rday   = ', rday,   ' s' 
     138         WRITE(numout,*) '          sideral year                       rsiyea = ', rsiyea, ' s' 
     139         WRITE(numout,*) '          sideral day                        rsiday = ', rsiday, ' s' 
     140         WRITE(numout,*) '          omega                              omega  = ', omega,  ' s-1' 
     141         WRITE(numout,*) 
     142         WRITE(numout,*) '          nb of months per year               raamo = ', raamo, ' months' 
     143         WRITE(numout,*) '          nb of hours per day                 rjjhh = ', rjjhh, ' hours' 
     144         WRITE(numout,*) '          nb of minutes per hour              rhhmm = ', rhhmm, ' mn' 
     145         WRITE(numout,*) '          nb of seconds per minute            rmmss = ', rmmss, ' s' 
     146         WRITE(numout,*) 
     147         WRITE(numout,*) '          earth radius                         ra   = ', ra, ' m' 
     148         WRITE(numout,*) '          gravity                              grav = ', grav , ' m/s^2' 
     149         WRITE(numout,*) 
     150         WRITE(numout,*) '          triple point of temperature      rtt      = ', rtt     , ' K' 
     151         WRITE(numout,*) '          freezing point of water          rt0      = ', rt0     , ' K' 
     152         WRITE(numout,*) '          melting point of snow            rt0_snow = ', rt0_snow, ' K' 
     153         WRITE(numout,*) '          melting point of ice             rt0_ice  = ', rt0_ice , ' K' 
     154         WRITE(numout,*) 
     155         WRITE(numout,*) '          ocean reference volumic mass       rau0   = ', rau0 , ' kg/m^3' 
     156         WRITE(numout,*) '          ocean reference specific volume    rau0r  = ', rau0r, ' m^3/Kg' 
     157         WRITE(numout,*) '          ocean specific heat                rcp    = ', rcp 
     158         WRITE(numout,*) '                       1. / ( rau0 * rcp ) = ro0cpr = ', ro0cpr 
    184159         WRITE(numout,*) 
    185160         WRITE(numout,*) '          thermal conductivity of the snow          = ', rcdsn   , ' J/s/m/K' 
    186161         WRITE(numout,*) '          thermal conductivity of the ice           = ', rcdic   , ' J/s/m/K' 
     162#if defined key_lim3 
    187163         WRITE(numout,*) '          fresh ice specific heat                   = ', cpic    , ' J/kg/K' 
    188164         WRITE(numout,*) '          latent heat of fusion of fresh ice / snow = ', lfus    , ' J/kg' 
    189 #if defined key_lim3 || defined key_cice 
    190165         WRITE(numout,*) '          latent heat of subl.  of fresh ice / snow = ', lsub    , ' J/kg' 
     166#elif defined key_cice 
     167         WRITE(numout,*) '          latent heat of fusion of fresh ice / snow = ', lfus    , ' J/kg' 
    191168#else 
    192169         WRITE(numout,*) '          density times specific heat for snow      = ', rcpsn   , ' J/m^3/K'  
    193170         WRITE(numout,*) '          density times specific heat for ice       = ', rcpic   , ' J/m^3/K' 
    194171         WRITE(numout,*) '          volumetric latent heat fusion of sea ice  = ', xlic    , ' J/m'  
     172         WRITE(numout,*) '          volumetric latent heat fusion of snow     = ', xlsn    , ' J/m'  
    195173         WRITE(numout,*) '          latent heat of sublimation of snow        = ', xsn     , ' J/kg'  
    196174#endif 
    197          WRITE(numout,*) '          volumetric latent heat fusion of snow     = ', xlsn    , ' J/m^3'  
    198175         WRITE(numout,*) '          density of sea ice                        = ', rhoic   , ' kg/m^3' 
    199176         WRITE(numout,*) '          density of snow                           = ', rhosn   , ' kg/m^3' 
Note: See TracChangeset for help on using the changeset viewer.