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

Ignore:
Timestamp:
2006-05-10T18:47:31+02:00 (18 years ago)
Author:
opalod
Message:

nemo_v1_update_047:RB: re-organization of coordinate definition, scale factors are now 3d by default, include file for partial steps has been removed

File:
1 edited

Legend:

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

    r450 r454  
    1111   !!       zgr_bat_ctl  : check the bathymetry files 
    1212   !!       zgr_z        : reference z-coordinate  
     13   !!       zgr_zco      : z-coordinate  
    1314   !!       zgr_zps      : z-coordinate with partial steps 
    14    !!       zgr_s        : s-coordinate 
     15   !!       zgr_sco      : s-coordinate 
    1516   !!--------------------------------------------------------------------- 
    1617   !! * Modules used 
     
    3031   PUBLIC dom_zgr        ! called by dom_init.F90 
    3132 
     33   !! * Module variables 
     34      REAL(wp) ::          & !!: Namelist nam_zgr_sco 
     35      sbot_min =  300.  ,  &  !: minimum depth of s-bottom surface (>0) (m) 
     36      sbot_max = 5250.  ,  &  !: maximum depth of s-bottom surface (= ocean depth) (>0) (m) 
     37      theta    =    6.0 ,  &  !: surface control parameter (0<=theta<=20) 
     38      thetb    =    0.75,  &  !: bottom control parameter  (0<=thetb<= 1) 
     39      r_max    =    0.15      !: maximum cut-off r-value allowed (0<r_max<1) 
     40 
     41 
     42  
    3243   !! * Substitutions 
    3344#  include "domzgr_substitute.h90" 
     
    3546   !!---------------------------------------------------------------------- 
    3647   !!   OPA 9.0 , LOCEAN-IPSL (2005)  
    37    !! $Header$  
    38    !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    3948   !!---------------------------------------------------------------------- 
    4049 
     
    4958      !! 
    5059      !! ** Method  reference vertical coordinate 
    51       !!        Z-coordinates : The depth of model levels is defined 
    52       !!      from an analytical function the derivative of which gives 
    53       !!      the vertical scale factors. 
    54       !!      both depth and scale factors only depend on k (1d arrays). 
    55       !!              w-level: gdepw  = fsdep(k) 
    56       !!                       e3w(k) = dk(fsdep)(k)     = fse3(k) 
    57       !!              t-level: gdept  = fsdep(k+0.5) 
    58       !!                       e3t(k) = dk(fsdep)(k+0.5) = fse3(k+0.5) 
    59       !! 
    60       !! ** Action : - gdept, gdepw : depth of T- and W-point (m) 
    61       !!             -  e3t, e3w    : scale factors at T- and W-levels (m) 
    62       !! 
    63       !! Reference : 
    64       !!      Marti, Madec & Delecluse, 1992, JGR, 97, No8, 12,763-12,766. 
     60      !! 
     61      !! ** Action :  
    6562      !! 
    6663      !! History : 
    6764      !!   9.0  !  03-08  (G. Madec)  original code 
     65      !!   9.0  !  05-10  (A. Beckmann)  modifications for hybrid s-ccordinates 
    6866      !!---------------------------------------------------------------------- 
    6967      INTEGER ::   ioptio = 0      ! temporary integer 
    70       !!---------------------------------------------------------------------- 
     68 
     69      NAMELIST/nam_zgr/ ln_zco, ln_zps, ln_sco 
     70      !!---------------------------------------------------------------------- 
     71 
     72      ! Read Namelist nam_zgr : vertical coordinate' 
     73      ! --------------------- 
     74      REWIND ( numnam ) 
     75      READ   ( numnam, nam_zgr ) 
     76 
     77      ! Parameter control and print 
     78      ! --------------------------- 
     79      ! Control print 
     80      IF(lwp) THEN 
     81         WRITE(numout,*) 
     82         WRITE(numout,*) 'dom_zgr : vertical coordinate' 
     83         WRITE(numout,*) '~~~~~~~' 
     84         WRITE(numout,*) '          Namelist nam_zgr : set vertical coordinate' 
     85         WRITE(numout,*) '             z-coordinate - full steps      ln_zco = ', ln_zco 
     86         WRITE(numout,*) '             z-coordinate - partial steps   ln_zps = ', ln_zps 
     87         WRITE(numout,*) '             s- or hybrid z-s-coordinate    ln_sco = ', ln_sco 
     88      ENDIF 
    7189 
    7290      ! Check Vertical coordinate options 
    73       ! --------------------------------- 
    7491      ioptio = 0 
    75       IF( lk_sco ) THEN 
    76          IF(lwp) WRITE(numout,*) 
    77          IF(lwp) WRITE(numout,*) 'dom_zgr : s-coordinate' 
    78          IF(lwp) WRITE(numout,*) '~~~~~~~' 
    79          ioptio = ioptio + 1 
    80       ENDIF 
    81       IF( lk_zps ) THEN 
    82          IF(lwp) WRITE(numout,*) 
    83          IF(lwp) WRITE(numout,*) 'dom_zgr : z-coordinate with partial steps' 
    84          IF(lwp) WRITE(numout,*) '~~~~~~~' 
    85          ioptio = ioptio + 1 
    86       ENDIF 
    87       IF( ioptio == 0 ) THEN 
    88          IF(lwp) WRITE(numout,*) 
    89          IF(lwp) WRITE(numout,*) 'dom_zgr : z-coordinate' 
    90          IF(lwp) WRITE(numout,*) '~~~~~~~' 
    91       ENDIF 
    92  
    93       IF ( ioptio > 1 ) THEN 
     92      IF( ln_zco ) ioptio = ioptio + 1 
     93      IF( ln_zps ) ioptio = ioptio + 1 
     94      IF( ln_sco ) ioptio = ioptio + 1 
     95      IF ( ioptio /= 1 ) THEN 
    9496          IF(lwp) WRITE(numout,cform_err) 
    95           IF(lwp) WRITE(numout,*) ' several vertical coordinate options used' 
     97          IF(lwp) WRITE(numout,*) ' none or several vertical coordinate options used' 
    9698          nstop = nstop + 1 
    9799      ENDIF 
     100 
     101      IF( ln_zco ) THEN 
     102          IF(lwp) WRITE(numout,*) '          z-coordinate with reduced incore memory requirement' 
     103          IF( ln_zps .OR. ln_sco ) THEN 
     104             IF(lwp) WRITE(numout,cform_err) 
     105             IF(lwp) WRITE(numout,*) ' reduced memory with zps or sco option is impossible' 
     106             nstop = nstop + 1 
     107          ENDIF 
     108      ENDIF 
     109 
    98110 
    99111      ! Build the vertical coordinate system 
    100112      ! ------------------------------------ 
    101113 
    102       CALL zgr_z                       ! Reference z-coordinate system 
    103  
    104       CALL zgr_bat                     ! Bathymetry fields (levels and meters) 
    105  
    106       CALL zgr_zps                     ! Partial step z-coordinate 
    107  
    108       CALL zgr_s                       ! s-coordinate 
     114                     CALL zgr_z        ! Reference z-coordinate system (always called) 
     115 
     116                     CALL zgr_bat      ! Bathymetry fields (levels and meters) 
     117 
     118      IF( ln_zco )   CALL zgr_zco      ! z-coordinate 
     119 
     120      IF( ln_zps )   CALL zgr_zps      ! Partial step z-coordinate 
     121 
     122      IF( ln_sco )   CALL zgr_sco      ! s-coordinate or hybrid z-s coordinate 
     123 
     124!!bug gm control print: 
     125      write(numout,*) ' MIN val mbathy ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 
     126      write(numout,*) ' MIN val depth t ', MINVAL( fsdept(:,:,:) ),   & 
     127         &                   ' w ',   MINVAL( fsdepw(:,:,:) ), '3w ', MINVAL( fsde3w(:,:,:) ) 
     128      write(numout,*) ' MIN val e3    t ', MINVAL( fse3t(:,:,:) ), ' f ', MINVAL( fse3f(:,:,:) ),  & 
     129         &                   ' u ',   MINVAL( fse3u(:,:,:) ), ' u ', MINVAL( fse3v(:,:,:) ),  & 
     130         &                   ' uw',   MINVAL( fse3uw(:,:,:)), ' vw', MINVAL( fse3vw(:,:,:)),   & 
     131         &                   ' w ',   MINVAL( fse3w(:,:,:) ) 
     132 
     133      write(numout,*) ' MAX val depth t ', MAXVAL( fsdept(:,:,:) ),   & 
     134         &                   ' w ',   MAXVAL( fsdepw(:,:,:) ), '3w ', MAXVAL( fsde3w(:,:,:) ) 
     135      write(numout,*) ' MAX val e3    t ', MAXVAL( fse3t(:,:,:) ), ' f ', MAXVAL( fse3f(:,:,:) ),  & 
     136         &                   ' u ',   MAXVAL( fse3u(:,:,:) ), ' u ', MAXVAL( fse3v(:,:,:) ),  & 
     137         &                   ' uw',   MAXVAL( fse3uw(:,:,:)), ' vw', MAXVAL( fse3vw(:,:,:)),   & 
     138         &                   ' w ',   MAXVAL( fse3w(:,:,:) ) 
     139!!!bug gm 
    109140 
    110141   END SUBROUTINE dom_zgr 
     
    122153      !!      function the derivative of which gives the scale factors. 
    123154      !!        both depth and scale factors only depend on k (1d arrays). 
    124       !!              w-level: gdepw  = fsdep(k) 
    125       !!                       e3w(k) = dk(fsdep)(k)     = fse3(k) 
    126       !!              t-level: gdept  = fsdep(k+0.5) 
    127       !!                       e3t(k) = dk(fsdep)(k+0.5) = fse3(k+0.5) 
    128       !! 
    129       !! ** Action  : - gdept, gdepw : depth of T- and W-point (m) 
    130       !!              -  e3t, e3w    : scale factors at T- and W-levels (m) 
     155      !!              w-level: gdepw_0  = fsdep(k) 
     156      !!                       e3w_0(k) = dk(fsdep)(k)     = fse3(k) 
     157      !!              t-level: gdept_0  = fsdep(k+0.5) 
     158      !!                       e3t_0(k) = dk(fsdep)(k+0.5) = fse3(k+0.5) 
     159      !! 
     160      !! ** Action  : - gdept_0, gdepw_0 : depth of T- and W-point (m) 
     161      !!              -  e3t_0, e3w_0    : scale factors at T- and W-levels (m) 
    131162      !! 
    132163      !! Reference : 
     
    174205         WRITE(numout,*) '    zgr_z   : Reference vertical z-coordinates' 
    175206         WRITE(numout,*) '    ~~~~~~~' 
    176          IF (  ppkth == 0. ) THEN               
     207         IF(  ppkth == 0. ) THEN               
    177208              WRITE(numout,*) '            Uniform grid with ',jpk-1,' layers' 
    178209              WRITE(numout,*) '            Total depth    :', zhmax 
    179210              WRITE(numout,*) '            Layer thickness:', zhmax/(jpk-1) 
    180211         ELSE 
    181             IF ( ppa1 == 0. .AND. ppa0 == 0. .AND. ppsur == 0. ) THEN 
     212            IF( ppa1 == 0. .AND. ppa0 == 0. .AND. ppsur == 0. ) THEN 
    182213               WRITE(numout,*) '         zsur, za0, za1 computed from ' 
    183214               WRITE(numout,*) '                 zdzmin = ', zdzmin 
     
    196227      ! Reference z-coordinate (depth - scale factor at T- and W-points) 
    197228      ! ====================== 
    198       IF (  ppkth == 0. ) THEN            !  uniform vertical grid        
    199  
    200          za1 = zhmax/FLOAT(jpk-1)  
     229      IF( ppkth == 0.e0 ) THEN            !  uniform vertical grid        
     230 
     231         za1 = zhmax / FLOAT(jpk-1)  
    201232         DO jk = 1, jpk 
    202233            zw = FLOAT( jk ) 
    203234            zt = FLOAT( jk ) + 0.5 
    204             gdepw(jk) = ( zw - 1 ) * za1 
    205             gdept(jk) = ( zt - 1 ) * za1 
    206             e3w  (jk) =  za1 
    207             e3t  (jk) =  za1 
     235            gdepw_0(jk) = ( zw - 1 ) * za1 
     236            gdept_0(jk) = ( zt - 1 ) * za1 
     237            e3w_0  (jk) =  za1 
     238            e3t_0  (jk) =  za1 
    208239         END DO 
    209240 
     
    213244            zw = FLOAT( jk ) 
    214245            zt = FLOAT( jk ) + 0.5 
    215             gdepw(jk) = ( zsur + za0 * zw + za1 * zacr * LOG( COSH( (zw-zkth)/zacr ) )  ) 
    216             gdept(jk) = ( zsur + za0 * zt + za1 * zacr * LOG( COSH( (zt-zkth)/zacr ) )  ) 
    217             e3w  (jk) =          za0      + za1        * TANH(      (zw-zkth)/zacr   ) 
    218             e3t  (jk) =          za0      + za1        * TANH(      (zt-zkth)/zacr   ) 
    219          END DO 
    220          gdepw(1) = 0.e0   ! force first w-level to be exactly at zero 
     246            gdepw_0(jk) = ( zsur + za0 * zw + za1 * zacr * LOG( COSH( (zw-zkth)/zacr ) )  ) 
     247            gdept_0(jk) = ( zsur + za0 * zt + za1 * zacr * LOG( COSH( (zt-zkth)/zacr ) )  ) 
     248            e3w_0  (jk) =          za0      + za1        * TANH(      (zw-zkth)/zacr   ) 
     249            e3t_0  (jk) =          za0      + za1        * TANH(      (zt-zkth)/zacr   ) 
     250         END DO 
     251         gdepw_0(1) = 0.e0      ! force first w-level to be exactly at zero 
    221252 
    222253      ENDIF 
     
    229260         WRITE(numout,*) '              Reference z-coordinate depth and scale factors:' 
    230261         WRITE(numout, "(9x,' level   gdept    gdepw     e3t      e3w  ')" ) 
    231          WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, gdept(jk), gdepw(jk), e3t(jk), e3w(jk), jk = 1, jpk ) 
     262         WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, gdept_0(jk), gdepw_0(jk), e3t_0(jk), e3w_0(jk), jk = 1, jpk ) 
    232263      ENDIF 
    233264 
    234265      DO jk = 1, jpk 
    235          IF( e3w(jk) <= 0. .OR. e3t(jk) <= 0. ) THEN 
     266         IF( e3w_0(jk) <= 0. .OR. e3t_0(jk) <= 0. ) THEN 
    236267            IF(lwp) WRITE(numout,cform_err) 
    237268            IF(lwp) WRITE(numout,*) ' e3w or e3t =< 0 ' 
    238269            nstop = nstop + 1 
    239270         ENDIF 
    240          IF( gdepw(jk) < 0. .OR. gdept(jk) < 0.) THEN 
     271         IF( gdepw_0(jk) < 0. .OR. gdept_0(jk) < 0.) THEN 
    241272            IF(lwp) WRITE(numout,cform_err) 
    242273            IF(lwp) WRITE(numout,*) ' gdepw or gdept < 0 ' 
     
    284315      !! History : 
    285316      !!   9.0  !  03-08  (G. Madec)  Original code 
     317      !!   9.0  !  05-10  (A. Beckmann)  modifications for s-ccordinates 
    286318      !!---------------------------------------------------------------------- 
    287319      !! * Modules used 
     
    295327      INTEGER  ::   & 
    296328         ipi, ipj, ipk,              &  ! temporary integers 
    297          itime,                      &  !    "          " 
     329         itime, ih,                  &  !    "          " 
    298330         ii_bump, ij_bump               ! bump center position 
    299331      INTEGER, DIMENSION (1) ::   istep 
     
    302334      REAL(wp) ::   & 
    303335         r_bump, h_bump, h_oce,      &  ! bump characteristics  
    304          zi, zj, zdate0, zdt            ! temporary scalars 
     336         zi, zj, zdate0, zdt, zh        ! temporary scalars 
    305337      REAL(wp), DIMENSION(jpidta,jpjdta) ::   & 
    306          zlamt, zphit,               &  ! temporary workspace (NetCDF read) 
     338         zlamt, zphit,               &  ! 2D workspace (NetCDF read) 
    307339         zdta                           ! global domain scalar data 
    308340      REAL(wp), DIMENSION(jpk) ::   & 
    309          zdept                          ! temporary workspace (NetCDF read) 
     341         zdept                          ! 1D workspace (NetCDF read) 
    310342      !!---------------------------------------------------------------------- 
    311343 
     
    327359 
    328360            idta(:,:) = jpkm1                            ! flat basin  
    329             zdta(:,:) = gdepw(jpk) 
     361            zdta(:,:) = gdepw_0(jpk) 
    330362 
    331363         ELSE                                         ! bump 
     
    335367            ii_bump = jpidta / 3 + 3       ! i-index of the bump center 
    336368            ij_bump = jpjdta / 2           ! j-index of the bump center 
    337             r_bump  =    6              ! bump radius (index)        
    338             h_bump  =  240.e0           ! bump height (meters) 
    339             h_oce   = gdepw(jpk)        ! background ocean depth (meters) 
     369            r_bump  =    6                 ! bump radius (index)        
     370            h_bump  =  240.e0              ! bump height (meters) 
     371            h_oce   = gdepw_0(jpk)         ! background ocean depth (meters) 
    340372            IF(lwp) WRITE(numout,*) '            bump characteristics: ' 
    341373            IF(lwp) WRITE(numout,*) '               bump center (i,j)   = ', ii_bump, ii_bump 
     
    351383               END DO 
    352384            END DO 
     385 
    353386            ! idta : 
    354             idta(:,:) = jpkm1 
    355             DO jk = 1, jpkm1 
    356                DO jj = 1, jpjdta 
    357                   DO ji = 1, jpidta 
    358                      IF( gdept(jk) < zdta(ji,jj) .AND. zdta(ji,jj) <= gdept(jk+1) )   idta(ji,jj) = jk 
     387            IF( ln_sco ) THEN      ! s-coordinate (zsc       ): idta()=jpk 
     388               idta(:,:) = jpkm1 
     389            ELSE                   ! z-coordinate (zco or zps): step-like topography 
     390               idta(:,:) = jpkm1 
     391               DO jk = 1, jpkm1 
     392                  DO jj = 1, jpjdta 
     393                     DO ji = 1, jpidta 
     394                        IF( gdept_0(jk) < zdta(ji,jj) .AND. zdta(ji,jj) <= gdept_0(jk+1) )   idta(ji,jj) = jk 
     395                     END DO 
    359396                  END DO 
    360397               END DO 
    361             END DO 
     398            ENDIF 
    362399         ENDIF 
    363400 
     
    372409            idta(jpidta, :    ) = 0                 ;      zdta(jpidta, :    ) =  0.e0 
    373410         ELSE 
    374             idta( :    , 1    ) = 0                 ;      zdta( :    , 1    ) =  0.e0 
    375             idta( :    ,jpjdta) = 0                 ;      zdta( :    ,jpjdta) =  0.e0 
    376             idta( 1    , :    ) = 0                 ;      zdta( 1    , :    ) =  0.e0 
    377             idta(jpidta, :    ) = 0                 ;      zdta(jpidta, :    ) =  0.e0 
     411            ih = 0                                  ;      zh = 0.e0 
     412            IF( ln_sco )   zh = jpkm1               ;      IF( ln_sco )   zh = h_oce 
     413            idta( :    , 1    ) = ih                ;      zdta( :    , 1    ) =  zh 
     414            idta( :    ,jpjdta) = ih                ;      zdta( :    ,jpjdta) =  zh 
     415            idta( 1    , :    ) = ih                ;      zdta( 1    , :    ) =  zh 
     416            idta(jpidta, :    ) = ih                ;      zdta(jpidta, :    ) =  zh 
    378417         ENDIF 
    379418 
    380419         !  EEL R5 configuration with east and west open boundaries. 
    381420         !  Two rows of zeroes are needed at the south and north for OBCs 
    382          !  This is for compatibility with the rigid lid option.  
    383421           
    384422         IF( cp_cfg == "eel" .AND. jp_cfg == 5 ) THEN 
    385             idta( : , 2      ) = 0                 ;      zdta( : , 2      ) =  0.e0 
    386             idta( : ,jpjdta-1) = 0                 ;      zdta( : ,jpjdta-1) =  0.e0 
     423            ih = 0                                  ;      zh = 0.e0 
     424            IF( ln_sco )   zh = jpkm1               ;      IF( ln_sco )   zh = h_oce 
     425            idta( : , 2      ) = jpkm1              ;      zdta( : , 2      ) =  h_oce 
     426            idta( : ,jpjdta-1) = jpkm1              ;      zdta( : ,jpjdta-1) =  h_oce 
    387427         ENDIF 
    388428 
     
    390430      ELSEIF( ntopo == 1 ) THEN                       !   read in file  ! 
    391431         !                                            ! =============== ! 
    392          IF( lk_zco ) THEN 
    393             clname = 'bathy_level.nc'                       ! Level bathymetry 
     432 
     433         clname = 'bathy_level.nc'                       ! Level bathymetry 
     434#if defined key_agrif 
     435         IF( .NOT. Agrif_Root() ) THEN 
     436            clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname) 
     437         ENDIF 
     438#endif 
     439         INQUIRE( FILE=clname, EXIST=llbon ) 
     440         IF( llbon ) THEN 
     441            IF(lwp) WRITE(numout,*) 
     442            IF(lwp) WRITE(numout,*) '         read level bathymetry in ', clname 
     443            IF(lwp) WRITE(numout,*) 
     444            ipi = jpidta      ;       ipj   = jpjdta 
     445            ipk = 1           ;       itime = 1           ;       zdt = rdt 
     446            CALL flinopen( clname, 1, jpidta, 1, jpjdta, .FALSE.,   & 
     447               &           ipi, ipj, ipk, zlamt, zphit, zdept, itime, istep, zdate0, zdt, inum ) 
     448            CALL flinget( inum, 'Bathy_level', jpidta, jpjdta, 1,   & 
     449               &          itime, 1, 1, 1, jpidta, 1, jpjdta, zdta(:,:) ) 
     450            CALL flinclo( inum ) 
     451            idta(:,:) = zdta(:,:) 
     452         ELSE 
     453            IF( ln_zco ) THEN 
     454               IF(lwp) WRITE(numout,cform_err) 
     455               IF(lwp) WRITE(numout,*)'    zgr_bat : unable to read the file ', clname 
     456               nstop = nstop + 1 
     457            ELSE 
     458               IF(lwp) WRITE(numout,*)'    zgr_bat : bathy_level will be computed from bathy_meter' 
     459               idta(:,:) = jpkm1      ! initialisation 
     460            ENDIF 
     461         ENDIF 
     462 
     463         clname = 'bathy_meter.nc'                       ! meter bathymetry 
    394464#if defined key_agrif 
    395465            IF( .NOT. Agrif_Root() ) THEN 
    396466               clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname) 
    397467            ENDIF 
    398 #endif          
    399             INQUIRE( FILE=clname, EXIST=llbon ) 
    400             IF( llbon ) THEN 
    401                IF(lwp) WRITE(numout,*) 
    402                IF(lwp) WRITE(numout,*) '         read level bathymetry in ', clname 
    403                IF(lwp) WRITE(numout,*) 
    404                itime = 1 
    405                ipi = jpidta 
    406                ipj = jpjdta 
    407                ipk = 1 
    408                zdt = rdt 
    409                CALL flinopen( clname, 1, jpidta, 1, jpjdta, .FALSE.,   & 
    410                               ipi, ipj, ipk, zlamt, zphit, zdept, itime, istep, zdate0, zdt, inum ) 
    411                CALL flinget( inum, 'Bathy_level', jpidta, jpjdta, 1,   & 
    412                              itime, 1, 1, 1, jpidta, 1, jpjdta, zdta(:,:) ) 
    413                idta(:,:) = zdta(:,:) 
    414                CALL flinclo( inum ) 
    415  
    416             ELSE 
    417                IF(lwp) WRITE(numout,cform_err) 
    418                IF(lwp) WRITE(numout,*)'    zgr_bat : unable to read the file', clname 
    419                nstop = nstop + 1 
    420             ENDIF    
    421    
    422          ELSEIF( lk_zps ) THEN 
    423             clname = 'bathy_meter.nc'                       ! meter bathymetry 
    424 #if defined key_agrif 
    425             IF( .NOT. Agrif_Root() ) THEN 
    426                clname = TRIM(Agrif_CFixed())//'_'//TRIM(clname) 
    427             ENDIF 
    428 #endif        
    429             INQUIRE( FILE=clname, EXIST=llbon ) 
    430             IF( llbon ) THEN 
    431                IF(lwp) WRITE(numout,*) 
    432                IF(lwp) WRITE(numout,*) '         read meter bathymetry in ', clname 
    433                IF(lwp) WRITE(numout,*) 
    434                itime = 1 
    435                ipi = jpidta 
    436                ipj = jpjdta 
    437                ipk = 1 
    438                zdt = rdt 
    439                CALL flinopen( clname, 1, jpidta, 1, jpjdta, .FALSE.,   &     
    440                               ipi, ipj, ipk, zlamt, zphit, zdept, itime, istep, zdate0, zdt, inum ) 
    441                CALL flinget( inum, 'Bathymetry', jpidta, jpjdta, 1,   & 
    442                              itime, 1, 1, 1, jpidta, 1, jpjdta, zdta(:,:) )  
    443                CALL flinclo( inum ) 
    444                idta(:,:) = jpkm1      ! initialisation 
    445             ELSE 
     468#endif 
     469         INQUIRE( FILE=clname, EXIST=llbon ) 
     470         IF( llbon ) THEN 
     471            IF(lwp) WRITE(numout,*) 
     472            IF(lwp) WRITE(numout,*) '         read meter bathymetry in ', clname 
     473            IF(lwp) WRITE(numout,*) 
     474            ipi = jpidta      ;       ipj   = jpjdta 
     475            ipk = 1           ;       itime = 1         ;       zdt = rdt 
     476            CALL flinopen( clname, 1, jpidta, 1, jpjdta, .FALSE.,   &     
     477               &           ipi, ipj, ipk, zlamt, zphit, zdept, itime, istep, zdate0, zdt, inum ) 
     478            CALL flinget( inum, 'Bathymetry', jpidta, jpjdta, 1,   & 
     479               &          itime, 1, 1, 1, jpidta, 1, jpjdta, zdta(:,:) )  
     480            CALL flinclo( inum ) 
     481         ELSE 
     482            IF( ln_zps .OR. ln_sco ) THEN 
    446483               IF(lwp) WRITE(numout,cform_err)        
    447484               IF(lwp) WRITE(numout,*)'    zgr_bat : unable to read the file', clname 
    448485               nstop = nstop + 1 
     486            ELSE 
     487               zdta(:,:) = 0.e0 
     488               IF(lwp) WRITE(numout,*)'    zgr_bat : bathy_meter not found, but not used, bathy array set to zero' 
    449489            ENDIF 
    450490         ENDIF 
     
    472512      END DO 
    473513 
     514      write(numout,*) ' MIN val mbathy 2 ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 
     515 
     516 
    474517      ! ======================= 
    475518      ! NO closed seas or lakes 
     
    482525                  mbathy(ji,jj) = 0                   ! suppress closed seas 
    483526                  bathy (ji,jj) = 0.e0                ! and lakes 
     527!!bug gm          bathy (ji,jj) = 300.e0                ! and lakes 
    484528               END DO 
    485529            END DO 
     
    585629      !! History : 
    586630      !!   9.0  !  03-08  (G. Madec)  Original code 
     631      !!   9.0  !  05-10  (A. Beckmann)  modifications for s-ccordinates 
    587632      !!---------------------------------------------------------------------- 
    588633      !! * Local declarations 
     
    621666               DO ji = 2, jpim1 
    622667                  ibtest = MAX( mbathy(ji-1,jj), mbathy(ji+1,jj),   & 
    623                      mbathy(ji,jj-1),mbathy(ji,jj+1) ) 
     668                     &          mbathy(ji,jj-1),mbathy(ji,jj+1) ) 
    624669                  IF( ibtest < mbathy(ji,jj) ) THEN 
    625670                     IF(lwp) WRITE(numout,*) ' the number of ocean level at ',   & 
    626                         'grid-point (i,j) =  ',ji,jj,' is changed from ',   & 
    627                         mbathy(ji,jj),' to ', ibtest 
     671                        &   'grid-point (i,j) =  ',ji,jj,' is changed from ', mbathy(ji,jj),' to ', ibtest 
    628672                     mbathy(ji,jj) = ibtest 
    629673                     icompt = icompt + 1 
     
    657701               ENDIF 
    658702            ELSE 
    659                mbathy( 1 ,:) = 0 
    660                mbathy(jpi,:) = 0 
     703               IF( ln_zco .OR. ln_zps ) THEN 
     704                  mbathy( 1 ,:) = 0 
     705                  mbathy(jpi,:) = 0 
     706               ELSE 
     707                  mbathy( 1 ,:) = jpkm1 
     708                  mbathy(jpi,:) = jpkm1 
     709               ENDIF 
    661710            ENDIF 
    662711         ELSEIF( nperio == 1 .OR. nperio == 4 .OR. nperio ==  6 ) THEN 
     
    684733            !  Boundary condition on mbathy 
    685734            IF( .NOT.lk_mpp ) THEN  
    686                 
    687735               !!bug ???  y reflechir! 
    688736               !   ... mono- or macro-tasking: T-point, >0, 2D array, no slab 
    689                 
    690737               zbathy(:,:) = FLOAT( mbathy(:,:) ) 
    691738               CALL lbc_lnk( zbathy, 'T', 1. ) 
     
    729776 
    730777 
     778   SUBROUTINE zgr_zco 
     779      !!---------------------------------------------------------------------- 
     780      !!                  ***  ROUTINE zgr_zco  *** 
     781      !! 
     782      !! ** Purpose :   define the z-coordinate system 
     783      !! 
     784      !! ** Method  :   set 3D coord. arrays to reference 1D array if lk_zco=T 
     785      !! 
     786      !! History : 
     787      !!        !  06-04  (R. Benshila, G. Madec)  Original code  
     788      !!---------------------------------------------------------------------- 
     789      INTEGER  ::   jk 
     790      !!---------------------------------------------------------------------- 
     791 
     792      IF( .NOT.lk_zco ) THEN 
     793         DO jk = 1, jpk 
     794            fsdept(:,:,jk) = gdept_0(jk) 
     795            fsdepw(:,:,jk) = gdepw_0(jk) 
     796            fsde3w(:,:,jk) = gdepw_0(jk) 
     797            fse3t (:,:,jk) = e3t_0(jk) 
     798            fse3u (:,:,jk) = e3t_0(jk) 
     799            fse3v (:,:,jk) = e3t_0(jk) 
     800            fse3f (:,:,jk) = e3t_0(jk) 
     801            fse3w (:,:,jk) = e3w_0(jk) 
     802            fse3uw(:,:,jk) = e3w_0(jk) 
     803            fse3vw(:,:,jk) = e3w_0(jk) 
     804         END DO 
     805      ENDIF 
     806 
     807   END SUBROUTINE zgr_zco 
     808 
     809 
     810 
    731811#  include "domzgr_zps.h90" 
    732812 
    733813 
    734 #  include "domzgr_s.h90" 
     814#if ! defined key_zco 
     815   !!---------------------------------------------------------------------- 
     816   !!   NOT 'key_zco' :                                    3D gdep. and e3. 
     817   !!---------------------------------------------------------------------- 
     818 
     819   SUBROUTINE zgr_sco 
     820      !!---------------------------------------------------------------------- 
     821      !!                  ***  ROUTINE zgr_sco  *** 
     822      !!                      
     823      !! ** Purpose :   define the s-coordinate system 
     824      !! 
     825      !! ** Method  :   s-coordinate 
     826      !!         The depth of model levels is defined as the product of an 
     827      !!      analytical function by the local bathymetry, while the vertical 
     828      !!      scale factors are defined as the product of the first derivative 
     829      !!      of the analytical function by the bathymetry. 
     830      !!      (this solution save memory as depth and scale factors are not 
     831      !!      3d fields) 
     832      !!          - Read bathymetry (in meters) at t-point and compute the 
     833      !!         bathymetry at u-, v-, and f-points. 
     834      !!            hbatu = mi( hbatt ) 
     835      !!            hbatv = mj( hbatt ) 
     836      !!            hbatf = mi( mj( hbatt ) ) 
     837      !!          - Compute gsigt, gsigw, esigt, esigw from an analytical 
     838      !!         function and its derivative given as statement function. 
     839      !!            gsigt(k) = fssig (k+0.5) 
     840      !!            gsigw(k) = fssig (k    ) 
     841      !!            esigt(k) = fsdsig(k+0.5) 
     842      !!            esigw(k) = fsdsig(k    ) 
     843      !!      This routine is given as an example, it must be modified 
     844      !!      following the user s desiderata. nevertheless, the output as 
     845      !!      well as the way to compute the model levels and scale factors 
     846      !!      must be respected in order to insure second order a!!uracy 
     847      !!      schemes. 
     848      !! 
     849      !! Reference : 
     850      !!      Madec, Lott, Delecluse and Crepon, 1996. JPO, 26, 1393-1408. 
     851      !! 
     852      !! History : 
     853      !!        !  95-12  (G. Madec)  Original code : s vertical coordinate 
     854      !!        !  97-07  (G. Madec)  lbc_lnk call 
     855      !!        !  97-04  (J.-O. Beismann)  
     856      !!   8.5  !  02-06  (G. Madec)  F90: Free form and module 
     857      !!   9.0  !  05-10  (A. Beckmann)  new stretching function 
     858      !!---------------------------------------------------------------------- 
     859      !! * Local declarations 
     860      INTEGER  ::   ji, jj, jk, jl 
     861      REAL(wp) ::   fssig, fsdsig, pfkk 
     862 
     863      INTEGER  ::   iip1, ijp1, iim1, ijm1 
     864      REAL(wp) ::   & 
     865         fssigt, fssigw, zcoeft, zcoefw,   & 
     866         zrmax, ztaper 
     867 
     868      REAL(wp), DIMENSION(jpi,jpj) ::   & 
     869         zenv, ztmp, zmsk, zri, zrj, zhbat 
     870 
     871      NAMELIST/nam_zgr_sco/ sbot_max, sbot_min, theta, thetb, r_max 
     872      !!---------------------------------------------------------------------- 
     873 
     874      ! a. Sigma stretching coefficient 
     875       fssigt(pfkk) = (tanh(theta*(-(pfkk-0.5)/FLOAT(jpkm1)+thetb))-tanh(thetb*theta)) & 
     876                    * (cosh(theta)+cosh(theta*(2.*thetb-1.)))/(2.*sinh(theta)) 
     877       fssigw(pfkk) = (tanh(theta*(-(pfkk-1.0)/FLOAT(jpkm1)+thetb))-tanh(thetb*theta)) & 
     878                    * (cosh(theta)+cosh(theta*(2.*thetb-1.)))/(2.*sinh(theta)) 
     879 
     880      ! b. Vertical derivative of sigma stretching coefficient 
     881  
     882!!bug fsdsig(pfkk)= put here the analytical derivative of fssigt and w ... 
     883      !!---------------------------------------------------------------------- 
     884 
     885      ! Read Namelist nam_zgr_sco : sigma-stretching parameters 
     886      ! ------------------------- 
     887      REWIND( numnam ) 
     888      READ  ( numnam, nam_zgr_sco ) 
     889 
     890      IF(lwp) THEN 
     891         WRITE(numout,*) 
     892         WRITE(numout,*) 'dom:zgr_sco : s-coordinate or hybrid z-s-coordinate' 
     893         WRITE(numout,*) '~~~~~~~~~~~' 
     894         WRITE(numout,*) '         Namelist nam_zgr_sco' 
     895         WRITE(numout,*) '            sigma-stretching coeffs ' 
     896         WRITE(numout,*) '            maximum depth of s-bottom surface (>0)    sbot_max = ' ,sbot_max 
     897         WRITE(numout,*) '            minimum depth of s-bottom surface (>0)    sbot_min = ' ,sbot_min 
     898         WRITE(numout,*) '            surface control parameter (0<=theta<=20)  theta    = ', theta 
     899         WRITE(numout,*) '            bottom control parameter  (0<=thetb<= 1)  thetb    = ', thetb 
     900         WRITE(numout,*) '            maximum cut-off r-value allowed           r_max    = ' , r_max 
     901      ENDIF 
     902 
     903      ! ??? 
     904      ! ------------------ 
     905      hift(:,:) = sbot_min 
     906      hifu(:,:) = sbot_min 
     907      hifv(:,:) = sbot_min 
     908      hiff(:,:) = sbot_min 
     909 
     910 
     911      ! set maximum ocean depth  
     912      ! ----------------------- 
     913       DO jj = 1, jpj 
     914          DO ji = 1, jpi 
     915             bathy(ji,jj) = MIN( sbot_max, bathy(ji,jj) ) 
     916          END DO 
     917       END DO 
     918 
     919      ! Define the envelop bathymetry 
     920      ! ============================= 
     921      ! Smooth the bathymetry (if required)  
     922 
     923      scosrf(:,:) = 0.e0              ! ocean surface depth (here zero: no under ice-shelf sea) 
     924      scobot(:,:) = bathy(:,:)        ! ocean bottom  depth  
     925 
     926  
     927      ! use r-value to create hybrid coordinates 
     928  
     929      DO jj = 1, jpj 
     930         DO ji = 1, jpi 
     931            zenv(ji,jj) = MAX( bathy(ji,jj), sbot_min ) 
     932         END DO 
     933      END DO 
     934 
     935      jl = 0 
     936      zrmax = 1.e0 
     937      !                                                     ! ================ ! 
     938      DO WHILE ( jl <= 10000 .AND. zrmax > r_max )          !  Iterative loop  ! 
     939         !                                                  ! ================ ! 
     940         jl = jl + 1 
     941 
     942         zrmax = 0.e0 
     943         zmsk(:,:) = 0.e0 
     944  
     945         DO jj = 1, nlcj 
     946            DO ji = 1, nlci 
     947               iip1 = MIN( ji+1, nlci )      ! force zri = 0 on last line (ji=ncli+1 to jpi) 
     948               ijp1 = MIN( jj+1, nlcj )      ! force zrj = 0 on last raw  (jj=nclj+1 to jpj) 
     949               zri(ji,jj) = ABS( zenv(iip1,jj  ) - zenv(ji,jj) ) / ( zenv(iip1,jj  ) + zenv(ji,jj) ) 
     950               zrj(ji,jj) = ABS( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) ) 
     951               zrmax = MAX( zrmax, zri(ji,jj), zrj(ji,jj) ) 
     952               IF( zri(ji,jj) > r_max )   zmsk(ji  ,jj  ) = 1.0 
     953               IF( zri(ji,jj) > r_max )   zmsk(iip1,jj  ) = 1.0 
     954               IF( zrj(ji,jj) > r_max )   zmsk(ji  ,jj  ) = 1.0 
     955               IF( zrj(ji,jj) > r_max )   zmsk(ji  ,ijp1) = 1.0 
     956            END DO 
     957         END DO 
     958         IF( lk_mpp )   CALL mpp_max( zrmax )   ! max over the global domain 
     959         ! lateral boundary condition on zmsk: keep 1 along closed boundary (use of MAX) 
     960         ztmp(:,:) = zmsk(:,:) 
     961         CALL lbc_lnk( zmsk, 'T', 1. ) 
     962         DO jj = 1, nlcj 
     963            DO ji = 1, nlci 
     964                zmsk(ji,jj) = MAX( zmsk(ji,jj), ztmp(ji,jj) )     
     965            END DO 
     966         END DO 
     967  
     968         WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) ) 
     969 
     970         DO jj = 1, nlcj 
     971            DO ji = 1, nlci 
     972               iip1 = MIN( ji+1, nlci )     ! last  line (ji=nlci) 
     973               ijp1 = MIN( jj+1, nlcj )     ! last  raw  (jj=nlcj) 
     974               iim1 = MAX( ji-1,  1  )      ! first line (ji=nlci) 
     975               ijm1 = MAX( jj-1,  1  )      ! first raw  (jj=nlcj) 
     976               IF( zmsk(ji,jj) == 1.0 ) THEN 
     977                  ztmp(ji,jj) =   (                                                                                   & 
     978             &      zenv(iim1,ijp1)*zmsk(iim1,ijp1) + zenv(ji,ijp1)*zmsk(ji,ijp1) + zenv(iip1,ijp1)*zmsk(iip1,ijp1)   & 
     979             &    + zenv(iim1,jj  )*zmsk(iim1,jj  ) + zenv(ji,jj  )*    2.e0      + zenv(iip1,jj  )*zmsk(iip1,jj  )   & 
     980             &    + zenv(iim1,ijm1)*zmsk(iim1,ijm1) + zenv(ji,ijm1)*zmsk(ji,ijm1) + zenv(iip1,ijm1)*zmsk(iip1,ijm1)   & 
     981             &                    ) / (                                                                               & 
     982             &                      zmsk(iim1,ijp1) +               zmsk(ji,ijp1) +                 zmsk(iip1,ijp1)   & 
     983             &    +                 zmsk(iim1,jj  ) +                   2.e0      +                 zmsk(iip1,jj  )   & 
     984             &    +                 zmsk(iim1,ijm1) +               zmsk(ji,ijm1) +                 zmsk(iip1,ijm1)   & 
     985             &                        ) 
     986               ENDIF 
     987            END DO 
     988         END DO 
     989  
     990         DO jj = 1, nlcj 
     991            DO ji = 1, nlci 
     992               IF( zmsk(ji,jj) == 1.0 )   zenv(ji,jj) = MAX( ztmp(ji,jj), bathy(ji,jj) ) 
     993            END DO 
     994         END DO 
     995 
     996         ! Apply lateral boundary condition   CAUTION: kept the value when the lbc field is zero 
     997         ztmp(:,:) = zenv(:,:) 
     998         CALL lbc_lnk( zenv, 'T', 1. ) 
     999         DO jj = 1, nlcj 
     1000            DO ji = 1, nlci 
     1001               IF( zenv(ji,jj) == 0.e0 )   zenv(ji,jj) = ztmp(ji,jj) 
     1002            END DO 
     1003         END DO 
     1004         !                                                  ! ================ ! 
     1005      END DO                                                !     End loop     ! 
     1006      !                                                     ! ================ ! 
     1007 
     1008      ! save envelop bathymetry in hbatt 
     1009      hbatt(:,:) = zenv(:,:)  
     1010 
     1011!!bug gm  :   CAUTION:  tapering hard coded !!!!  orca2 only 
     1012!!bug gm                NOT valid in mpp ===> taper have been changed 
     1013 
     1014       DO jj = 1, jpj 
     1015          DO ji = 1, jpi 
     1016!!bug mpp    ztaper = EXP( -(FLOAT(jj-74)/10.)**2 ) 
     1017             ztaper = EXP( -(gphit(ji,jj)/8)**2 ) 
     1018             hbatt(ji,jj) = sbot_max * ztaper + hbatt(ji,jj) * (1.-ztaper) 
     1019          END DO 
     1020       END DO 
     1021 
     1022      DO jj = 1, jpj 
     1023         zrmax  = EXP( -(gphit(10,jj)/8)**2 ) 
     1024         ztaper = EXP( -(FLOAT(jj-74)/10.)**2 ) 
     1025         write(numout,*) jj, (FLOAT(jj-74)/10.), ztaper,(gphit(10,jj)/8), zrmax 
     1026      END DO 
     1027 
     1028      write(numout,*) ' bathy  MAX ', MAXVAL( bathy(:,:) ), ' MIN ', MINVAL( bathy(:,:) ) 
     1029      write(numout,*) ' hbatt  MAX ', MAXVAL( hbatt(:,:) ), ' MIN ', MINVAL( hbatt(:,:) ) 
     1030 
     1031      ! Control print 
     1032      IF(lwp) THEN 
     1033         WRITE(numout,*) 
     1034         WRITE(numout,*) ' domzgr: hbatt field; ocean depth in meters' 
     1035         WRITE(numout,*) 
     1036         CALL prihre( hbatt(1,1), jpi, jpj, 1, jpi, 1, 1, jpj, 1, 0., numout ) 
     1037      ENDIF 
     1038 
     1039      ! 1. computation of hbatu, hbatv, hbatf fields 
     1040      ! -------------------------------------------- 
     1041 
     1042      hbatu(:,:) = sbot_min 
     1043      hbatv(:,:) = sbot_min 
     1044      hbatf(:,:) = sbot_min 
     1045 
     1046      IF(lwp) THEN 
     1047         WRITE(numout,*) 
     1048         WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', sbot_min 
     1049         WRITE(numout,*) 
     1050      ENDIF 
     1051 
     1052      DO jj = 1, jpjm1 
     1053        DO ji = 1, jpim1 
     1054           hbatu(ji,jj)= 0.5 *( hbatt(ji  ,jj)+hbatt(ji+1,jj  ) ) 
     1055           hbatv(ji,jj)= 0.5 *( hbatt(ji  ,jj)+hbatt(ji  ,jj+1) ) 
     1056           hbatf(ji,jj)= 0.25*( hbatt(ji  ,jj)+hbatt(ji  ,jj+1)   & 
     1057                               +hbatt(ji+1,jj)+hbatt(ji+1,jj+1) ) 
     1058        END DO 
     1059      END DO 
     1060  
     1061      ! Apply lateral boundary condition 
     1062      ! CAUTION: retain non zero value in the initial file 
     1063      !          this should be OK for orca cfg, not for EEL 
     1064      zhbat(:,:) = hbatu(:,:) 
     1065      CALL lbc_lnk( hbatu, 'U', 1. ) 
     1066      DO jj = 1, jpj 
     1067         DO ji = 1, jpi 
     1068            IF( hbatu(ji,jj) == 0.e0 ) THEN 
     1069               IF( zhbat(ji,jj) == 0.e0 )   hbatu(ji,jj) = sbot_min 
     1070               IF( zhbat(ji,jj) /= 0.e0 )   hbatu(ji,jj) = zhbat(ji,jj) 
     1071            ENDIF 
     1072         END DO 
     1073      END DO 
     1074 
     1075      zhbat(:,:) = hbatv(:,:) 
     1076      CALL lbc_lnk( hbatv, 'V', 1. ) 
     1077      DO jj = 1, jpj 
     1078         DO ji = 1, jpi 
     1079            IF( hbatv(ji,jj) == 0.e0 ) THEN 
     1080               IF( zhbat(ji,jj) == 0.e0 )   hbatv(ji,jj) = sbot_min 
     1081               IF( zhbat(ji,jj) /= 0.e0 )   hbatv(ji,jj) = zhbat(ji,jj) 
     1082            ENDIF 
     1083         END DO 
     1084      END DO 
     1085 
     1086      zhbat(:,:) = hbatf(:,:) 
     1087      CALL lbc_lnk( hbatf, 'F', 1. ) 
     1088      DO jj = 1, jpj 
     1089         DO ji = 1, jpi 
     1090            IF( hbatf(ji,jj) == 0.e0 ) THEN 
     1091               IF( zhbat(ji,jj) == 0.e0 )   hbatf(ji,jj) = sbot_min 
     1092               IF( zhbat(ji,jj) /= 0.e0 )   hbatf(ji,jj) = zhbat(ji,jj) 
     1093            ENDIF 
     1094         END DO 
     1095      END DO 
     1096 
     1097 
     1098!!bug:  key_helsinki a verifer 
     1099      hift(:,:) = MIN( hift(:,:), hbatt(:,:) ) 
     1100      hifu(:,:) = MIN( hifu(:,:), hbatu(:,:) ) 
     1101      hifv(:,:) = MIN( hifv(:,:), hbatv(:,:) ) 
     1102      hiff(:,:) = MIN( hiff(:,:), hbatf(:,:) ) 
     1103 
     1104      write(numout,*) ' MAX val hif   t ', MAXVAL( hift(:,:) ), ' f ', MAXVAL( hiff(:,:) ),  & 
     1105         &                        ' u ',   MAXVAL( hifu(:,:) ), ' v ', MAXVAL( hifv(:,:) ) 
     1106      write(numout,*) ' MIN val hif   t ', MINVAL( hift(:,:) ), ' f ', MINVAL( hiff(:,:) ),  & 
     1107         &                        ' u ',   MINVAL( hifu(:,:) ), ' v ', MINVAL( hifv(:,:) ) 
     1108      write(numout,*) ' MAX val hbat  t ', MAXVAL( hbatt(:,:) ), ' f ', MAXVAL( hbatf(:,:) ),  & 
     1109         &                        ' u ',   MAXVAL( hbatu(:,:) ), ' v ', MAXVAL( hbatv(:,:) ) 
     1110      write(numout,*) ' MIN val hbat  t ', MINVAL( hbatt(:,:) ), ' f ', MINVAL( hbatf(:,:) ),  & 
     1111         &                        ' u ',   MINVAL( hbatu(:,:) ), ' v ', MINVAL( hbatv(:,:) ) 
     1112!! helsinki 
     1113 
     1114      ! 2. Computation of gsig and esig fields 
     1115      ! -------------------------------------- 
     1116 
     1117      ! 2.1 Coefficients for model level depth at w- and t-levels 
     1118 
     1119!!bug gm : change the def of statment function.... 
     1120      DO jk = 1, jpk 
     1121        gsigw(jk) = -fssigw(FLOAT(jk)) 
     1122        gsigt(jk) = -fssigt(FLOAT(jk)) 
     1123      END DO 
     1124 
     1125      write(numout,*) 'gsigw 1 jpk    ', gsigw(1), gsigw(jpk) 
     1126 
     1127!!org DO jk = 1, jpk 
     1128!!org    gsigw(jk) = -fssig ( FLOAT(jk)    ) 
     1129!!org    gsigt(jk) = -fssig ( FLOAT(jk)+0.5) 
     1130!!org END DO 
     1131 
     1132      ! 2.2 Coefficients for vertical scale factors at w-, t- levels 
     1133 
     1134!!bug gm :  define it from analytical function, not like juste bellow.... 
     1135!!          or betteroffer the 2 possibilities.... 
     1136      DO jk=2,jpk 
     1137        esigw(jk)=gsigt(jk)-gsigt(jk-1) 
     1138      END DO 
     1139      DO jk=1,jpkm1 
     1140        esigt(jk)=gsigw(jk+1)-gsigw(jk) 
     1141      END DO 
     1142        esigw(1)=esigw(2) 
     1143        esigt(jpk)=esigt(jpkm1) 
     1144 
     1145!!org DO jk = 1, jpk 
     1146!!org    esigw(jk)=fsdsig( FLOAT(jk)) 
     1147!!org    esigt(jk)=fsdsig( FLOAT(jk)+0.5) 
     1148!!org END DO 
     1149 
     1150      ! 2.3 Coefficients for vertical depth as the sum of e3w scale factors 
     1151 
     1152      gsi3w(1) = 0.5 * esigw(1) 
     1153      DO jk = 2, jpk 
     1154        gsi3w(jk) = gsi3w(jk-1)+ esigw(jk) 
     1155      END DO 
     1156 
     1157!!bug gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays) 
     1158      DO jk = 1, jpk 
     1159!! change the solver stat.... 
     1160!!       zcoeft = ( FLOAT(jk) - 0.5 ) / FLOAT(jpkm1) 
     1161!!       gdept (:,:,jk) = (scosrf(:,:)+(hbatt(:,:)-hift(:,:))*gsigt(jk)+hift(:,:)*zcoeft) 
     1162         gdept (:,:,jk) = (scosrf(:,:)+(hbatt(:,:)-hift(:,:))*gsigt(jk)+hift(:,:)*(FLOAT(jk)-0.5)/FLOAT(jpkm1)) 
     1163!!       zcoefw = ( FLOAT(jk) - 1.0 ) / FLOAT(jpkm1)  
     1164!!       gdepw (:,:,jk) = (scosrf(:,:)+(hbatt(:,:)-hift(:,:))*gsigw(jk)+hift(:,:)*zcoefw) 
     1165!!       gdep3w(:,:,jk) = (scosrf(:,:)+(hbatt(:,:)-hift(:,:))*gsi3w(jk)+hift(:,:)*zcoefw) 
     1166         gdepw (:,:,jk) = (scosrf(:,:)+(hbatt(:,:)-hift(:,:))*gsigw(jk)+hift(:,:)*FLOAT(jk-1)/FLOAT(jpkm1)) 
     1167         gdep3w(:,:,jk) = (scosrf(:,:)+(hbatt(:,:)-hift(:,:))*gsi3w(jk)+hift(:,:)*FLOAT(jk-1)/FLOAT(jpkm1)) 
     1168      END DO 
     1169 
     1170!!bug gm: e3uw, e3vw can be suppressed  (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays) 
     1171      DO jj = 1, jpj 
     1172         DO ji = 1, jpi 
     1173            DO jk = 1, jpk 
     1174              e3t(ji,jj,jk)=((hbatt(ji,jj)-hift(ji,jj))*esigt(jk) + hift(ji,jj)/FLOAT(jpkm1)) 
     1175              e3u(ji,jj,jk)=((hbatu(ji,jj)-hifu(ji,jj))*esigt(jk) + hifu(ji,jj)/FLOAT(jpkm1)) 
     1176              e3v(ji,jj,jk)=((hbatv(ji,jj)-hifv(ji,jj))*esigt(jk) + hifv(ji,jj)/FLOAT(jpkm1)) 
     1177              e3f(ji,jj,jk)=((hbatf(ji,jj)-hiff(ji,jj))*esigt(jk) + hiff(ji,jj)/FLOAT(jpkm1)) 
     1178 
     1179              e3w (ji,jj,jk)=((hbatt(ji,jj)-hift(ji,jj))*esigw(jk) + hift(ji,jj)/FLOAT(jpkm1)) 
     1180              e3uw(ji,jj,jk)=((hbatu(ji,jj)-hifu(ji,jj))*esigw(jk) + hifu(ji,jj)/FLOAT(jpkm1)) 
     1181              e3vw(ji,jj,jk)=((hbatv(ji,jj)-hifv(ji,jj))*esigw(jk) + hifv(ji,jj)/FLOAT(jpkm1)) 
     1182            END DO 
     1183         END DO 
     1184      END DO 
     1185 
     1186! HYBRID 
     1187      DO jj = 1, jpj 
     1188         DO ji = 1, jpi 
     1189            DO jk = 1, jpkm1 
     1190               IF( scobot(ji,jj) >= fsdept(ji,jj,jk) )   mbathy(ji,jj) = MAX( 2, jk ) 
     1191               IF( scobot(ji,jj) == 0.e0             )   mbathy(ji,jj) = 0 
     1192            END DO 
     1193         END DO 
     1194      END DO 
     1195 
     1196      write(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) ) 
     1197 
     1198 
     1199      ! =========== 
     1200      ! Zoom domain  
     1201      ! =========== 
     1202 
     1203      IF( lzoom )   CALL zgr_bat_zoom 
     1204 
     1205      ! 2.4 Control print 
     1206 
     1207      IF(lwp) THEN 
     1208         WRITE(numout,*)  
     1209         WRITE(numout,*) ' domzgr: vertical coefficients for model level' 
     1210         WRITE(numout,9400) 
     1211         WRITE(numout,9410) (jk,gsigt(jk),gsigw(jk),esigt(jk),esigw(jk),gsi3w(jk),jk=1,jpk) 
     1212      ENDIF 
     1213 9400 FORMAT(9x,'  level    gsigt      gsigw      esigt      esigw      gsi3w') 
     1214 9410 FORMAT(10x,i4,5f11.4) 
     1215 
     1216      IF(lwp) THEN 
     1217         WRITE(numout,*) 
     1218         WRITE(numout,*) ' domzgr: vertical coordinates : point (1,1,k) bathy = ', bathy(1,1), hbatt(1,1) 
     1219         WRITE(numout,*) ' ~~~~~~  --------------------' 
     1220         WRITE(numout,9420) 
     1221         WRITE(numout,9430) (jk,fsdept(1,1,jk),fsdepw(1,1,jk),     & 
     1222                             fse3t (1,1,jk),fse3w (1,1,jk),jk=1,jpk) 
     1223         WRITE(numout,*) 
     1224         WRITE(numout,*) ' domzgr: vertical coordinates : point (20,20,k)   bathy = ', bathy(20,20), hbatt(20,20) 
     1225         WRITE(numout,*) ' ~~~~~~  --------------------' 
     1226         WRITE(numout,9420) 
     1227         WRITE(numout,9430) (jk,fsdept(20,20,jk),fsdepw(20,20,jk),     & 
     1228                             fse3t (20,20,jk),fse3w (20,20,jk),jk=1,jpk) 
     1229         WRITE(numout,*) 
     1230         WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k)   bathy = ', bathy(100,74), hbatt(100,74) 
     1231         WRITE(numout,*) ' ~~~~~~  --------------------' 
     1232         WRITE(numout,9420) 
     1233         WRITE(numout,9430) (jk,fsdept(100,74,jk),fsdepw(100,74,jk),     & 
     1234                             fse3t (100,74,jk),fse3w (100,74,jk),jk=1,jpk) 
     1235      ENDIF 
     1236 
     1237 9420 FORMAT(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ') 
     1238 9430 FORMAT(10x,i4,4f9.2) 
     1239 
     1240!!bug gm   no more necessary?  if ! defined key_helsinki 
     1241      DO jk = 1, jpk 
     1242         DO jj = 1, jpj 
     1243            DO ji = 1, jpi 
     1244               IF( fse3w(ji,jj,jk) <= 0. .OR. fse3t(ji,jj,jk) <= 0. ) THEN 
     1245                  IF(lwp) THEN 
     1246                     WRITE(numout,*) 
     1247                     WRITE(numout,*) ' e r r o r :         e3w or e3t =< 0 ' 
     1248                     WRITE(numout,*) ' =========           --------------- ' 
     1249                     WRITE(numout,*) 
     1250                     WRITE(numout,*) '             point (i,j,k)= ',ji,jj,jk 
     1251                     WRITE(numout,*) 
     1252                  ENDIF 
     1253                  STOP 'domzgr' 
     1254               ENDIF 
     1255               IF( fsdepw(ji,jj,jk) < 0. .OR. fsdept(ji,jj,jk) < 0. ) THEN 
     1256                  IF(lwp) THEN 
     1257                     WRITE(numout,*) 
     1258                     WRITE(numout,*) ' e r r o r :      gdepw or gdept < 0 ' 
     1259                     WRITE(numout,*) ' =========        ------------------ ' 
     1260                     WRITE(numout,*) 
     1261                     WRITE(numout,*) '             point (i,j,k)= ', ji, jj, jk 
     1262                     WRITE(numout,*) 
     1263                  ENDIF 
     1264                  STOP 'domzgr' 
     1265               ENDIF 
     1266            END DO 
     1267         END DO 
     1268      END DO 
     1269!!bug gm    #endif 
     1270 
     1271   END SUBROUTINE zgr_sco 
     1272 
     1273#else 
     1274   !!---------------------------------------------------------------------- 
     1275   !!   Default option :                                      Empty routine 
     1276   !!---------------------------------------------------------------------- 
     1277   SUBROUTINE zgr_sco 
     1278   END SUBROUTINE zgr_sco 
     1279#endif 
    7351280 
    7361281 
Note: See TracChangeset for help on using the changeset viewer.