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.
domzgr.F90 in branches/nemo_v3_3_beta/NEMOGCM/NEMO/OPA_SRC/DOM – NEMO

source: branches/nemo_v3_3_beta/NEMOGCM/NEMO/OPA_SRC/DOM/domzgr.F90 @ 2443

Last change on this file since 2443 was 2443, checked in by gm, 13 years ago

v3.3beta: #766 share the deepest ocean level indices (mbkt, mbku & mbkv)

  • Property svn:keywords set to Id
File size: 81.1 KB
Line 
1MODULE domzgr
2   !!==============================================================================
3   !!                       ***  MODULE domzgr   ***
4   !! Ocean initialization : domain initialization
5   !!==============================================================================
6   !! History :  OPA  ! 1995-12  (G. Madec)  Original code : s vertical coordinate
7   !!                 ! 1997-07  (G. Madec)  lbc_lnk call
8   !!                 ! 1997-04  (J.-O. Beismann)
9   !!            8.5  ! 2002-09  (A. Bozec, G. Madec)  F90: Free form and module
10   !!             -   ! 2002-09  (A. de Miranda)  rigid-lid + islands
11   !!  NEMO      1.0  ! 2003-08  (G. Madec)  F90: Free form and module
12   !!             -   ! 2005-10  (A. Beckmann)  modifications for hybrid s-ccordinates & new stretching function
13   !!            2.0  ! 2006-04  (R. Benshila, G. Madec)  add zgr_zco
14   !!            3.0  ! 2008-06  (G. Madec)  insertion of domzgr_zps.h90 & conding style
15   !!            3.2  ! 2009-07  (R. Benshila) Suppression of rigid-lid option
16   !!            3.3  ! 2010-11  (G. Madec) add mbk. arrays associated to the deepest ocean level
17   !!----------------------------------------------------------------------
18
19   !!----------------------------------------------------------------------
20   !!   dom_zgr         : defined the ocean vertical coordinate system
21   !!       zgr_bat     : bathymetry fields (levels and meters)
22   !!       zgr_bat_zoom: modify the bathymetry field if zoom domain
23   !!       zgr_bat_ctl : check the bathymetry files
24   !!       zgr_z       : reference z-coordinate
25   !!       zgr_zco     : z-coordinate
26   !!       zgr_zps     : z-coordinate with partial steps
27   !!       zgr_sco     : s-coordinate
28   !!       fssig       : sigma coordinate non-dimensional function
29   !!       dfssig      : derivative of the sigma coordinate function    !!gm  (currently missing!)
30   !!---------------------------------------------------------------------
31   USE oce              ! ocean variables
32   USE dom_oce          ! ocean domain
33   USE closea           ! closed seas
34   USE c1d              ! 1D vertical configuration
35   USE in_out_manager   ! I/O manager
36   USE iom              ! I/O library
37   USE lbclnk           ! ocean lateral boundary conditions (or mpp link)
38   USE lib_mpp          ! distributed memory computing library
39
40   IMPLICIT NONE
41   PRIVATE
42
43   PUBLIC   dom_zgr     ! called by dom_init.F90
44
45   !                                       !!* Namelist namzgr_sco *
46   REAL(wp) ::   rn_sbot_min =  300._wp     ! minimum depth of s-bottom surface (>0) (m)
47   REAL(wp) ::   rn_sbot_max = 5250._wp     ! maximum depth of s-bottom surface (= ocean depth) (>0) (m)
48   REAL(wp) ::   rn_theta    =    6.00_wp   ! surface control parameter (0<=rn_theta<=20)
49   REAL(wp) ::   rn_thetb    =    0.75_wp   ! bottom control parameter  (0<=rn_thetb<= 1)
50   REAL(wp) ::   rn_rmax     =    0.15_wp   ! maximum cut-off r-value allowed (0<rn_rmax<1)
51   LOGICAL  ::   ln_s_sigma  = .false.      ! use hybrid s-sigma -coordinate & stretching function fssig1 (ln_sco=T)
52   REAL(wp) ::   rn_bb       =    0.80_wp   ! stretching parameter for song and haidvogel stretching
53   !                                        ! ( rn_bb=0; top only, rn_bb =1; top and bottom)
54   REAL(wp) ::   rn_hc       =  150._wp     ! Critical depth for s-sigma coordinates
55 
56   !! * Substitutions
57#  include "domzgr_substitute.h90"
58#  include "vectopt_loop_substitute.h90"
59   !!----------------------------------------------------------------------
60   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
61   !! $Id$
62   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
63   !!----------------------------------------------------------------------
64CONTAINS       
65
66   SUBROUTINE dom_zgr
67      !!----------------------------------------------------------------------
68      !!                ***  ROUTINE dom_zgr  ***
69      !!                   
70      !! ** Purpose :  set the depth of model levels and the resulting
71      !!      vertical scale factors.
72      !!
73      !! ** Method  : - reference 1D vertical coordinate (gdep._0, e3._0)
74      !!              - read/set ocean depth and ocean levels (bathy, mbathy)
75      !!              - vertical coordinate (gdep., e3.) depending on the
76      !!                coordinate chosen :
77      !!                   ln_zco=T   z-coordinate   
78      !!                   ln_zps=T   z-coordinate with partial steps
79      !!                   ln_zco=T   s-coordinate
80      !!
81      !! ** Action  :   define gdep., e3., mbathy and bathy
82      !!----------------------------------------------------------------------
83      INTEGER ::   ioptio = 0   ! temporary integer
84      !
85      NAMELIST/namzgr/ ln_zco, ln_zps, ln_sco
86      !!----------------------------------------------------------------------
87
88      REWIND( numnam )                 ! Read Namelist namzgr : vertical coordinate'
89      READ  ( numnam, namzgr )
90
91      IF(lwp) THEN                     ! Control print
92         WRITE(numout,*)
93         WRITE(numout,*) 'dom_zgr : vertical coordinate'
94         WRITE(numout,*) '~~~~~~~'
95         WRITE(numout,*) '          Namelist namzgr : set vertical coordinate'
96         WRITE(numout,*) '             z-coordinate - full steps      ln_zco = ', ln_zco
97         WRITE(numout,*) '             z-coordinate - partial steps   ln_zps = ', ln_zps
98         WRITE(numout,*) '             s- or hybrid z-s-coordinate    ln_sco = ', ln_sco
99      ENDIF
100
101      ioptio = 0                       ! Check Vertical coordinate options
102      IF( ln_zco ) ioptio = ioptio + 1
103      IF( ln_zps ) ioptio = ioptio + 1
104      IF( ln_sco ) ioptio = ioptio + 1
105      IF( ioptio /= 1 )   CALL ctl_stop( ' none or several vertical coordinate options used' )
106
107      ! Build the vertical coordinate system
108      ! ------------------------------------
109                     CALL zgr_z        ! Reference z-coordinate system (always called)
110                     CALL zgr_bat      ! Bathymetry fields (levels and meters)
111      IF( ln_zco )   CALL zgr_zco      ! z-coordinate
112      IF( ln_zps )   CALL zgr_zps      ! Partial step z-coordinate
113      IF( ln_sco )   CALL zgr_sco      ! s-coordinate or hybrid z-s coordinate
114
115      IF( nprint == 1 .AND. lwp )   THEN
116         WRITE(numout,*) ' MIN val mbathy ', MINVAL( mbathy(:,:) ), ' MAX ', MAXVAL( mbathy(:,:) )
117         WRITE(numout,*) ' MIN val depth t ', MINVAL( fsdept(:,:,:) ),   &
118            &                   ' w ',   MINVAL( fsdepw(:,:,:) ), '3w ', MINVAL( fsde3w(:,:,:) )
119         WRITE(numout,*) ' MIN val e3    t ', MINVAL( fse3t(:,:,:) ), ' f ', MINVAL( fse3f(:,:,:) ),  &
120            &                   ' u ',   MINVAL( fse3u(:,:,:) ), ' u ', MINVAL( fse3v(:,:,:) ),  &
121            &                   ' uw',   MINVAL( fse3uw(:,:,:)), ' vw', MINVAL( fse3vw(:,:,:)),   &
122            &                   ' w ',   MINVAL( fse3w(:,:,:) )
123
124         WRITE(numout,*) ' MAX val depth t ', MAXVAL( fsdept(:,:,:) ),   &
125            &                   ' w ',   MAXVAL( fsdepw(:,:,:) ), '3w ', MAXVAL( fsde3w(:,:,:) )
126         WRITE(numout,*) ' MAX val e3    t ', MAXVAL( fse3t(:,:,:) ), ' f ', MAXVAL( fse3f(:,:,:) ),  &
127            &                   ' u ',   MAXVAL( fse3u(:,:,:) ), ' u ', MAXVAL( fse3v(:,:,:) ),  &
128            &                   ' uw',   MAXVAL( fse3uw(:,:,:)), ' vw', MAXVAL( fse3vw(:,:,:)),   &
129            &                   ' w ',   MAXVAL( fse3w(:,:,:) )
130      ENDIF
131      !
132   END SUBROUTINE dom_zgr
133
134
135   SUBROUTINE zgr_z
136      !!----------------------------------------------------------------------
137      !!                   ***  ROUTINE zgr_z  ***
138      !!                   
139      !! ** Purpose :   set the depth of model levels and the resulting
140      !!      vertical scale factors.
141      !!
142      !! ** Method  :   z-coordinate system (use in all type of coordinate)
143      !!        The depth of model levels is defined from an analytical
144      !!      function the derivative of which gives the scale factors.
145      !!        both depth and scale factors only depend on k (1d arrays).
146      !!              w-level: gdepw_0  = fsdep(k)
147      !!                       e3w_0(k) = dk(fsdep)(k)     = fse3(k)
148      !!              t-level: gdept_0  = fsdep(k+0.5)
149      !!                       e3t_0(k) = dk(fsdep)(k+0.5) = fse3(k+0.5)
150      !!
151      !! ** Action  : - gdept_0, gdepw_0 : depth of T- and W-point (m)
152      !!              - e3t_0  , e3w_0   : scale factors at T- and W-levels (m)
153      !!
154      !! Reference : Marti, Madec & Delecluse, 1992, JGR, 97, No8, 12,763-12,766.
155      !!----------------------------------------------------------------------
156      INTEGER  ::   jk                     ! dummy loop indices
157      REAL(wp) ::   zt, zw                 ! temporary scalars
158      REAL(wp) ::   zsur, za0, za1, zkth   ! Values set from parameters in
159      REAL(wp) ::   zacr, zdzmin, zhmax    ! par_CONFIG_Rxx.h90
160      REAL(wp) ::   zrefdep                ! depth of the reference level (~10m)
161      REAL(wp) ::   za2, zkth2, zacr2      ! Values for optional double tanh function set from parameters
162      !!----------------------------------------------------------------------
163
164      ! Set variables from parameters
165      ! ------------------------------
166       zkth = ppkth       ;   zacr = ppacr
167       zdzmin = ppdzmin   ;   zhmax = pphmax
168       zkth2 = ppkth2     ;   zacr2 = ppacr2   ! optional (ldbletanh=T) double tanh parameters
169
170      ! If ppa1 and ppa0 and ppsur are et to pp_to_be_computed
171      !  za0, za1, zsur are computed from ppdzmin , pphmax, ppkth, ppacr
172      IF(   ppa1  == pp_to_be_computed  .AND.  &
173         &  ppa0  == pp_to_be_computed  .AND.  &
174         &  ppsur == pp_to_be_computed           ) THEN
175         !
176         za1  = (  ppdzmin - pphmax / FLOAT(jpkm1)  )                                                      &
177            & / ( TANH((1-ppkth)/ppacr) - ppacr/FLOAT(jpk-1) * (  LOG( COSH( (jpk - ppkth) / ppacr) )      &
178            &                                                   - LOG( COSH( ( 1  - ppkth) / ppacr) )  )  )
179         za0  = ppdzmin - za1 *              TANH( (1-ppkth) / ppacr )
180         zsur =   - za0 - za1 * ppacr * LOG( COSH( (1-ppkth) / ppacr )  )
181      ELSE
182         za1 = ppa1 ;       za0 = ppa0 ;          zsur = ppsur
183         za2 = ppa2                            ! optional (ldbletanh=T) double tanh parameter
184      ENDIF
185
186      IF(lwp) THEN                         ! Parameter print
187         WRITE(numout,*)
188         WRITE(numout,*) '    zgr_z   : Reference vertical z-coordinates'
189         WRITE(numout,*) '    ~~~~~~~'
190         IF(  ppkth == 0._wp ) THEN             
191              WRITE(numout,*) '            Uniform grid with ',jpk-1,' layers'
192              WRITE(numout,*) '            Total depth    :', zhmax
193              WRITE(numout,*) '            Layer thickness:', zhmax/(jpk-1)
194         ELSE
195            IF( ppa1 == 0._wp .AND. ppa0 == 0._wp .AND. ppsur == 0._wp ) THEN
196               WRITE(numout,*) '         zsur, za0, za1 computed from '
197               WRITE(numout,*) '                 zdzmin = ', zdzmin
198               WRITE(numout,*) '                 zhmax  = ', zhmax
199            ENDIF
200            WRITE(numout,*) '           Value of coefficients for vertical mesh:'
201            WRITE(numout,*) '                 zsur = ', zsur
202            WRITE(numout,*) '                 za0  = ', za0
203            WRITE(numout,*) '                 za1  = ', za1
204            WRITE(numout,*) '                 zkth = ', zkth
205            WRITE(numout,*) '                 zacr = ', zacr
206            IF( ldbletanh ) THEN
207               WRITE(numout,*) ' (Double tanh    za2  = ', za2
208               WRITE(numout,*) '  parameters)    zkth2= ', zkth2
209               WRITE(numout,*) '                 zacr2= ', zacr2
210            ENDIF
211         ENDIF
212      ENDIF
213
214
215      ! Reference z-coordinate (depth - scale factor at T- and W-points)
216      ! ======================
217      IF( ppkth == 0._wp ) THEN            !  uniform vertical grid       
218         za1 = zhmax / FLOAT(jpk-1) 
219         DO jk = 1, jpk
220            zw = FLOAT( jk )
221            zt = FLOAT( jk ) + 0.5_wp
222            gdepw_0(jk) = ( zw - 1 ) * za1
223            gdept_0(jk) = ( zt - 1 ) * za1
224            e3w_0  (jk) =  za1
225            e3t_0  (jk) =  za1
226         END DO
227      ELSE                                ! Madec & Imbard 1996 function
228         IF( .NOT. ldbletanh ) THEN
229            DO jk = 1, jpk
230               zw = FLOAT( jk )
231               zt = FLOAT( jk ) + 0.5_wp
232               gdepw_0(jk) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth) / zacr ) )  )
233               gdept_0(jk) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth) / zacr ) )  )
234               e3w_0  (jk) =          za0      + za1        * TANH(       (zw-zkth) / zacr   )
235               e3t_0  (jk) =          za0      + za1        * TANH(       (zt-zkth) / zacr   )
236            END DO
237         ELSE
238            DO jk = 1, jpk
239               zw = FLOAT( jk )
240               zt = FLOAT( jk ) + 0.5_wp
241               ! Double tanh function
242               gdepw_0(jk) = ( zsur + za0 * zw + za1 * zacr * LOG ( COSH( (zw-zkth) / zacr ) )    &
243     &                                         + za2 * zacr2* LOG ( COSH( (zw-zkth2)/zacr2 ) )  )
244               gdept_0(jk) = ( zsur + za0 * zt + za1 * zacr * LOG ( COSH( (zt-zkth) / zacr ) )    &
245     &                                         + za2 * zacr2* LOG ( COSH( (zt-zkth2)/zacr2 ) )  )
246               e3w_0  (jk) =          za0      + za1        * TANH(       (zw-zkth) / zacr   )    &
247     &                                         + za2        * TANH(       (zw-zkth2)/zacr2   )
248               e3t_0  (jk) =          za0      + za1        * TANH(       (zt-zkth) / zacr   )    &
249     &                                         + za2        * TANH(       (zt-zkth2)/zacr2   )
250            END DO
251         ENDIF
252         gdepw_0(1) = 0._wp                    ! force first w-level to be exactly at zero
253      ENDIF
254
255!!gm BUG in s-coordinate this does not work!
256      ! deepest/shallowest W level Above/Below ~10m
257      zrefdep = 10._wp - 0.1_wp * MINVAL( e3w_0 )                    ! ref. depth with tolerance (10% of minimum layer thickness)
258      nlb10 = MINLOC( gdepw_0, mask = gdepw_0 > zrefdep, dim = 1 )   ! shallowest W level Below ~10m
259      nla10 = nlb10 - 1                                              ! deepest    W level Above ~10m
260!!gm end bug
261
262      IF(lwp) THEN                        ! control print
263         WRITE(numout,*)
264         WRITE(numout,*) '              Reference z-coordinate depth and scale factors:'
265         WRITE(numout, "(9x,' level   gdept    gdepw     e3t      e3w  ')" )
266         WRITE(numout, "(10x, i4, 4f9.2)" ) ( jk, gdept_0(jk), gdepw_0(jk), e3t_0(jk), e3w_0(jk), jk = 1, jpk )
267      ENDIF
268      DO jk = 1, jpk                      ! control positivity
269         IF( e3w_0  (jk) <= 0._wp .OR. e3t_0  (jk) <= 0._wp )   CALL ctl_stop( 'dom:zgr_z: e3w or e3t =< 0 '    )
270         IF( gdepw_0(jk) <  0._wp .OR. gdept_0(jk) <  0._wp )   CALL ctl_stop( 'dom:zgr_z: gdepw or gdept < 0 ' )
271      END DO
272      !
273   END SUBROUTINE zgr_z
274
275
276   SUBROUTINE zgr_bat
277      !!----------------------------------------------------------------------
278      !!                    ***  ROUTINE zgr_bat  ***
279      !!
280      !! ** Purpose :   set bathymetry both in levels and meters
281      !!
282      !! ** Method  :   read or define mbathy and bathy arrays
283      !!       * level bathymetry:
284      !!      The ocean basin geometry is given by a two-dimensional array,
285      !!      mbathy, which is defined as follow :
286      !!            mbathy(ji,jj) = 1, ..., jpk-1, the number of ocean level
287      !!                              at t-point (ji,jj).
288      !!                            = 0  over the continental t-point.
289      !!      The array mbathy is checked to verified its consistency with
290      !!      model option. in particular:
291      !!            mbathy must have at least 1 land grid-points (mbathy<=0)
292      !!                  along closed boundary.
293      !!            mbathy must be cyclic IF jperio=1.
294      !!            mbathy must be lower or equal to jpk-1.
295      !!            isolated ocean grid points are suppressed from mbathy
296      !!                  since they are only connected to remaining
297      !!                  ocean through vertical diffusion.
298      !!      ntopo=-1 :   rectangular channel or bassin with a bump
299      !!      ntopo= 0 :   flat rectangular channel or basin
300      !!      ntopo= 1 :   mbathy is read in 'bathy_level.nc' NetCDF file
301      !!                   bathy  is read in 'bathy_meter.nc' NetCDF file
302      !!      C A U T I O N : mbathy will be modified during the initializa-
303      !!      tion phase to become the number of non-zero w-levels of a water
304      !!      column, with a minimum value of 1.
305      !!
306      !! ** Action  : - mbathy: level bathymetry (in level index)
307      !!              - bathy : meter bathymetry (in meters)
308      !!----------------------------------------------------------------------
309      INTEGER  ::   ji, jj, jl, jk            ! dummy loop indices
310      INTEGER  ::   inum                      ! temporary logical unit
311      INTEGER  ::   ii_bump, ij_bump, ih      ! bump center position
312      INTEGER  ::   ii0, ii1, ij0, ij1        ! indices
313      REAL(wp) ::   r_bump , h_bump , h_oce   ! bump characteristics
314      REAL(wp) ::   zi     , zj     , zh      ! temporary scalars
315      INTEGER , DIMENSION(jpidta,jpjdta) ::   idta   ! global domain integer data
316      REAL(wp), DIMENSION(jpidta,jpjdta) ::   zdta   ! global domain scalar data
317      !!----------------------------------------------------------------------
318
319      IF(lwp) WRITE(numout,*)
320      IF(lwp) WRITE(numout,*) '    zgr_bat : defines level and meter bathymetry'
321      IF(lwp) WRITE(numout,*) '    ~~~~~~~'
322
323      !                                               ! ================== !
324      IF( ntopo == 0 .OR. ntopo == -1 ) THEN          !   defined by hand  !
325         !                                            ! ================== !
326         !                                            ! global domain level and meter bathymetry (idta,zdta)
327         !
328         IF( ntopo == 0 ) THEN                        ! flat basin
329            IF(lwp) WRITE(numout,*)
330            IF(lwp) WRITE(numout,*) '         bathymetry field: flat basin'
331            idta(:,:) = jpkm1                            ! before last level
332            zdta(:,:) = gdepw_0(jpk)                     ! last w-point depth
333            h_oce     = gdepw_0(jpk)
334         ELSE                                         ! bump centered in the basin
335            IF(lwp) WRITE(numout,*)
336            IF(lwp) WRITE(numout,*) '         bathymetry field: flat basin with a bump'
337            ii_bump = jpidta / 2                           ! i-index of the bump center
338            ij_bump = jpjdta / 2                           ! j-index of the bump center
339            r_bump  = 50000._wp                            ! bump radius (meters)       
340            h_bump  =  2700._wp                            ! bump height (meters)
341            h_oce   = gdepw_0(jpk)                         ! background ocean depth (meters)
342            IF(lwp) WRITE(numout,*) '            bump characteristics: '
343            IF(lwp) WRITE(numout,*) '               bump center (i,j)   = ', ii_bump, ii_bump
344            IF(lwp) WRITE(numout,*) '               bump height         = ', h_bump , ' meters'
345            IF(lwp) WRITE(numout,*) '               bump radius         = ', r_bump , ' index'
346            IF(lwp) WRITE(numout,*) '            background ocean depth = ', h_oce  , ' meters'
347            !                                       
348            DO jj = 1, jpjdta                              ! zdta :
349               DO ji = 1, jpidta
350                  zi = FLOAT( ji - ii_bump ) * ppe1_m / r_bump
351                  zj = FLOAT( jj - ij_bump ) * ppe2_m / r_bump
352                  zdta(ji,jj) = h_oce - h_bump * EXP( -( zi*zi + zj*zj ) )
353               END DO
354            END DO
355            !                                              ! idta :
356            IF( ln_sco ) THEN                                   ! s-coordinate (zsc       ): idta()=jpk
357               idta(:,:) = jpkm1
358            ELSE                                                ! z-coordinate (zco or zps): step-like topography
359               idta(:,:) = jpkm1
360               DO jk = 1, jpkm1
361                  WHERE( gdept_0(jk) < zdta(:,:) .AND. zdta(:,:) <= gdept_0(jk+1) )   idta(:,:) = jk
362               END DO
363            ENDIF
364         ENDIF
365         !                                            ! set GLOBAL boundary conditions
366         !                                            ! Caution : idta on the global domain: use of jperio, not nperio
367         IF( jperio == 1 .OR. jperio == 4 .OR. jperio == 6 ) THEN
368            idta( :    , 1    ) = -1                ;      zdta( :    , 1    ) = -1._wp
369            idta( :    ,jpjdta) =  0                ;      zdta( :    ,jpjdta) =  0._wp
370         ELSEIF( jperio == 2 ) THEN
371            idta( :    , 1    ) = idta( : ,  3  )   ;      zdta( :    , 1    ) = zdta( : ,  3  )
372            idta( :    ,jpjdta) = 0                 ;      zdta( :    ,jpjdta) =  0._wp
373            idta( 1    , :    ) = 0                 ;      zdta( 1    , :    ) =  0._wp
374            idta(jpidta, :    ) = 0                 ;      zdta(jpidta, :    ) =  0._wp
375         ELSE
376            ih = 0                                  ;      zh = 0._wp
377            IF( ln_sco )   ih = jpkm1               ;      IF( ln_sco )   zh = h_oce
378            idta( :    , 1    ) = ih                ;      zdta( :    , 1    ) =  zh
379            idta( :    ,jpjdta) = ih                ;      zdta( :    ,jpjdta) =  zh
380            idta( 1    , :    ) = ih                ;      zdta( 1    , :    ) =  zh
381            idta(jpidta, :    ) = ih                ;      zdta(jpidta, :    ) =  zh
382         ENDIF
383
384         !                                            ! local domain level and meter bathymetries (mbathy,bathy)
385         mbathy(:,:) = 0                                   ! set to zero extra halo points
386         bathy (:,:) = 0._wp                               ! (require for mpp case)
387         DO jj = 1, nlcj                                   ! interior values
388            DO ji = 1, nlci
389               mbathy(ji,jj) = idta( mig(ji), mjg(jj) )
390               bathy (ji,jj) = zdta( mig(ji), mjg(jj) )
391            END DO
392         END DO
393         !
394         !                                            ! ================ !
395      ELSEIF( ntopo == 1 ) THEN                       !   read in file   ! (over the local domain)
396         !                                            ! ================ !
397         !
398         IF( ln_zco )   THEN                          ! zco : read level bathymetry
399            CALL iom_open ( 'bathy_level.nc', inum ) 
400            CALL iom_get  ( inum, jpdom_data, 'Bathy_level', bathy )
401            CALL iom_close( inum )
402            mbathy(:,:) = INT( bathy(:,:) )
403            !                                                ! =====================
404            IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN    ! ORCA R2 configuration
405               !                                             ! =====================
406               IF( nn_cla == 0 ) THEN
407                  ii0 = 140   ;   ii1 = 140                  ! Gibraltar Strait open
408                  ij0 = 102   ;   ij1 = 102                  ! (Thomson, Ocean Modelling, 1995)
409                  DO ji = mi0(ii0), mi1(ii1)
410                     DO jj = mj0(ij0), mj1(ij1)
411                        mbathy(ji,jj) = 15
412                     END DO
413                  END DO
414                  IF(lwp) WRITE(numout,*)
415                  IF(lwp) WRITE(numout,*) '      orca_r2: Gibraltar strait open at i=',ii0,' j=',ij0
416                  !
417                  ii0 = 160   ;   ii1 = 160                  ! Bab el mandeb Strait open
418                  ij0 = 88    ;   ij1 = 88                   ! (Thomson, Ocean Modelling, 1995)
419                  DO ji = mi0(ii0), mi1(ii1)
420                     DO jj = mj0(ij0), mj1(ij1)
421                        mbathy(ji,jj) = 12
422                     END DO
423                  END DO
424                  IF(lwp) WRITE(numout,*)
425                  IF(lwp) WRITE(numout,*) '      orca_r2: Bab el Mandeb strait open at i=',ii0,' j=',ij0
426               ENDIF
427               !
428            ENDIF
429            !
430         ENDIF
431         IF( ln_zps .OR. ln_sco )   THEN              ! zps or sco : read meter bathymetry
432            CALL iom_open ( 'bathy_meter.nc', inum ) 
433            CALL iom_get  ( inum, jpdom_data, 'Bathymetry', bathy )
434            CALL iom_close( inum )
435            !                                                ! =====================
436            IF( cp_cfg == "orca" .AND. jp_cfg == 1 ) THEN    ! ORCA R1 configuration
437               ii0 = 142   ;   ii1 = 142                     ! =====================
438               ij0 =  51   ;   ij1 =  53                     
439               DO ji = mi0(ii0), mi1(ii1)                    ! Close Halmera Strait
440                  DO jj = mj0(ij0), mj1(ij1)
441                     bathy(ji,jj) = 0._wp
442                  END DO
443               END DO
444               IF(lwp) WRITE(numout,*)
445               IF(lwp) WRITE(numout,*) '      orca_r1: Halmera strait closed at i=',ii0,' j=',ij0,'->',ij1
446            ENDIF
447            !                                                ! =====================
448            IF( cp_cfg == "orca" .AND. jp_cfg == 2 ) THEN    ! ORCA R2 configuration
449               !                                             ! =====================
450              IF( nn_cla == 0 ) THEN
451                 ii0 = 140   ;   ii1 = 140                   ! Gibraltar Strait open
452                 ij0 = 102   ;   ij1 = 102                   ! (Thomson, Ocean Modelling, 1995)
453                 DO ji = mi0(ii0), mi1(ii1)
454                    DO jj = mj0(ij0), mj1(ij1)
455                       bathy(ji,jj) = 284._wp
456                    END DO
457                 END DO
458                 IF(lwp) WRITE(numout,*)
459                 IF(lwp) WRITE(numout,*) '      orca_r2: Gibraltar strait open at i=',ii0,' j=',ij0
460                 !
461                 ii0 = 160   ;   ii1 = 160                   ! Bab el mandeb Strait open
462                 ij0 = 88    ;   ij1 = 88                    ! (Thomson, Ocean Modelling, 1995)
463                 DO ji = mi0(ii0), mi1(ii1)
464                    DO jj = mj0(ij0), mj1(ij1)
465                       bathy(ji,jj) = 137._wp
466                    END DO
467                 END DO
468                 IF(lwp) WRITE(numout,*)
469                 IF(lwp) WRITE(numout,*) '             orca_r2: Bab el Mandeb strait open at i=',ii0,' j=',ij0
470              ENDIF
471              !
472           ENDIF
473            !
474        ENDIF
475         !                                            ! =============== !
476      ELSE                                            !      error      !
477         !                                            ! =============== !
478         WRITE(ctmp1,*) 'parameter , ntopo = ', ntopo
479         CALL ctl_stop( '    zgr_bat : '//trim(ctmp1) )
480      ENDIF
481      !
482      !                                               ! =========================== !
483      IF( nclosea == 0 ) THEN                         !   NO closed seas or lakes   !
484         DO jl = 1, jpncs                             ! =========================== !
485            DO jj = ncsj1(jl), ncsj2(jl)
486               DO ji = ncsi1(jl), ncsi2(jl)
487                  mbathy(ji,jj) = 0                   ! suppress closed seas and lakes from bathymetry
488                  bathy (ji,jj) = 0._wp               
489               END DO
490            END DO
491         END DO
492      ENDIF
493      !                                               ! =============== !
494      IF( lzoom       )   CALL zgr_bat_zoom           !   Zoom domain   !
495      !                                               ! =============== !
496      !
497      !                                               ! =================== !
498      IF( .NOT.lk_c1d )   CALL zgr_bat_ctl            !   Bathymetry check  !
499      !                                               ! =================== !
500      !
501      !                                               ! ========================= !
502                          CALL zgr_bot_level          !   level of ocean bottom   !
503      !                                               ! ========================= !
504   END SUBROUTINE zgr_bat
505
506
507   SUBROUTINE zgr_bat_zoom
508      !!----------------------------------------------------------------------
509      !!                    ***  ROUTINE zgr_bat_zoom  ***
510      !!
511      !! ** Purpose : - Close zoom domain boundary if necessary
512      !!              - Suppress Med Sea from ORCA R2 and R05 arctic zoom
513      !!
514      !! ** Method  :
515      !!
516      !! ** Action  : - update mbathy: level bathymetry (in level index)
517      !!----------------------------------------------------------------------
518      INTEGER ::   ii0, ii1, ij0, ij1   ! temporary integers
519      !!----------------------------------------------------------------------
520      !
521      IF(lwp) WRITE(numout,*)
522      IF(lwp) WRITE(numout,*) '    zgr_bat_zoom : modify the level bathymetry for zoom domain'
523      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~~'
524      !
525      ! Zoom domain
526      ! ===========
527      !
528      ! Forced closed boundary if required
529      IF( lzoom_s )   mbathy(  : , mj0(jpjzoom):mj1(jpjzoom) )      = 0
530      IF( lzoom_w )   mbathy(      mi0(jpizoom):mi1(jpizoom) , :  ) = 0
531      IF( lzoom_e )   mbathy(      mi0(jpiglo+jpizoom-1):mi1(jpiglo+jpizoom-1) , :  ) = 0
532      IF( lzoom_n )   mbathy(  : , mj0(jpjglo+jpjzoom-1):mj1(jpjglo+jpjzoom-1) )      = 0
533      !
534      ! Configuration specific domain modifications
535      ! (here, ORCA arctic configuration: suppress Med Sea)
536      IF( cp_cfg == "orca" .AND. lzoom_arct ) THEN
537         SELECT CASE ( jp_cfg )
538         !                                        ! =======================
539         CASE ( 2 )                               !  ORCA_R2 configuration
540            !                                     ! =======================
541            IF(lwp) WRITE(numout,*) '                   ORCA R2 arctic zoom: suppress the Med Sea'
542            ii0 = 141   ;   ii1 = 162      ! Sea box i,j indices
543            ij0 =  98   ;   ij1 = 110
544            !                                     ! =======================
545         CASE ( 05 )                              !  ORCA_R05 configuration
546            !                                     ! =======================
547            IF(lwp) WRITE(numout,*) '                   ORCA R05 arctic zoom: suppress the Med Sea'
548            ii0 = 563   ;   ii1 = 642      ! zero over the Med Sea boxe
549            ij0 = 314   ;   ij1 = 370 
550         END SELECT
551         !
552         mbathy( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) = 0   ! zero over the Med Sea boxe
553         !
554      ENDIF
555      !
556   END SUBROUTINE zgr_bat_zoom
557
558
559   SUBROUTINE zgr_bat_ctl
560      !!----------------------------------------------------------------------
561      !!                    ***  ROUTINE zgr_bat_ctl  ***
562      !!
563      !! ** Purpose :   check the bathymetry in levels
564      !!
565      !! ** Method  :   The array mbathy is checked to verified its consistency
566      !!      with the model options. in particular:
567      !!            mbathy must have at least 1 land grid-points (mbathy<=0)
568      !!                  along closed boundary.
569      !!            mbathy must be cyclic IF jperio=1.
570      !!            mbathy must be lower or equal to jpk-1.
571      !!            isolated ocean grid points are suppressed from mbathy
572      !!                  since they are only connected to remaining
573      !!                  ocean through vertical diffusion.
574      !!      C A U T I O N : mbathy will be modified during the initializa-
575      !!      tion phase to become the number of non-zero w-levels of a water
576      !!      column, with a minimum value of 1.
577      !!
578      !! ** Action  : - update mbathy: level bathymetry (in level index)
579      !!              - update bathy : meter bathymetry (in meters)
580      !!----------------------------------------------------------------------
581      INTEGER ::   ji, jj, jl                    ! dummy loop indices
582      INTEGER ::   icompt, ibtest, ikmax         ! temporary integers
583      REAL(wp), DIMENSION(jpi,jpj) ::   zbathy   ! temporary workspace
584      !!----------------------------------------------------------------------
585
586      IF(lwp) WRITE(numout,*)
587      IF(lwp) WRITE(numout,*) '    zgr_bat_ctl : check the bathymetry'
588      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~'
589
590      !                                          ! Suppress isolated ocean grid points
591      IF(lwp) WRITE(numout,*)
592      IF(lwp) WRITE(numout,*)'                   suppress isolated ocean grid points'
593      IF(lwp) WRITE(numout,*)'                   -----------------------------------'
594      icompt = 0
595      DO jl = 1, 2
596         IF( nperio == 1 .OR. nperio  ==  4 .OR. nperio  ==  6 ) THEN
597            mbathy( 1 ,:) = mbathy(jpim1,:)           ! local domain is cyclic east-west
598            mbathy(jpi,:) = mbathy(  2  ,:)
599         ENDIF
600         DO jj = 2, jpjm1
601            DO ji = 2, jpim1
602               ibtest = MAX(  mbathy(ji-1,jj), mbathy(ji+1,jj),   &
603                  &           mbathy(ji,jj-1), mbathy(ji,jj+1)  )
604               IF( ibtest < mbathy(ji,jj) ) THEN
605                  IF(lwp) WRITE(numout,*) ' the number of ocean level at ',   &
606                     &   'grid-point (i,j) =  ',ji,jj,' is changed from ', mbathy(ji,jj),' to ', ibtest
607                  mbathy(ji,jj) = ibtest
608                  icompt = icompt + 1
609               ENDIF
610            END DO
611         END DO
612      END DO
613      IF( icompt == 0 ) THEN
614         IF(lwp) WRITE(numout,*)'     no isolated ocean grid points'
615      ELSE
616         IF(lwp) WRITE(numout,*)'    ',icompt,' ocean grid points suppressed'
617      ENDIF
618      IF( lk_mpp ) THEN
619         zbathy(:,:) = FLOAT( mbathy(:,:) )
620         CALL lbc_lnk( zbathy, 'T', 1._wp )
621         mbathy(:,:) = INT( zbathy(:,:) )
622      ENDIF
623
624      !                                          ! East-west cyclic boundary conditions
625      IF( nperio == 0 ) THEN
626         IF(lwp) WRITE(numout,*) ' mbathy set to 0 along east and west boundary: nperio = ', nperio
627         IF( lk_mpp ) THEN
628            IF( nbondi == -1 .OR. nbondi == 2 ) THEN
629               IF( jperio /= 1 )   mbathy(1,:) = 0
630            ENDIF
631            IF( nbondi == 1 .OR. nbondi == 2 ) THEN
632               IF( jperio /= 1 )   mbathy(nlci,:) = 0
633            ENDIF
634         ELSE
635            IF( ln_zco .OR. ln_zps ) THEN
636               mbathy( 1 ,:) = 0
637               mbathy(jpi,:) = 0
638            ELSE
639               mbathy( 1 ,:) = jpkm1
640               mbathy(jpi,:) = jpkm1
641            ENDIF
642         ENDIF
643      ELSEIF( nperio == 1 .OR. nperio == 4 .OR. nperio ==  6 ) THEN
644         IF(lwp) WRITE(numout,*)' east-west cyclic boundary conditions on mbathy: nperio = ', nperio
645         mbathy( 1 ,:) = mbathy(jpim1,:)
646         mbathy(jpi,:) = mbathy(  2  ,:)
647      ELSEIF( nperio == 2 ) THEN
648         IF(lwp) WRITE(numout,*) '   equatorial boundary conditions on mbathy: nperio = ', nperio
649      ELSE
650         IF(lwp) WRITE(numout,*) '    e r r o r'
651         IF(lwp) WRITE(numout,*) '    parameter , nperio = ', nperio
652         !         STOP 'dom_mba'
653      ENDIF
654
655      !  Boundary condition on mbathy
656      IF( .NOT.lk_mpp ) THEN 
657!!gm     !!bug ???  think about it !
658         !   ... mono- or macro-tasking: T-point, >0, 2D array, no slab
659         zbathy(:,:) = FLOAT( mbathy(:,:) )
660         CALL lbc_lnk( zbathy, 'T', 1._wp )
661         mbathy(:,:) = INT( zbathy(:,:) )
662      ENDIF
663
664      ! Number of ocean level inferior or equal to jpkm1
665      ikmax = 0
666      DO jj = 1, jpj
667         DO ji = 1, jpi
668            ikmax = MAX( ikmax, mbathy(ji,jj) )
669         END DO
670      END DO
671!!gm  !!! test to do:   ikmax = MAX( mbathy(:,:) )   ???
672      IF( ikmax > jpkm1 ) THEN
673         IF(lwp) WRITE(numout,*) ' maximum number of ocean level = ', ikmax,' >  jpk-1'
674         IF(lwp) WRITE(numout,*) ' change jpk to ',ikmax+1,' to use the exact ead bathymetry'
675      ELSE IF( ikmax < jpkm1 ) THEN
676         IF(lwp) WRITE(numout,*) ' maximum number of ocean level = ', ikmax,' < jpk-1' 
677         IF(lwp) WRITE(numout,*) ' you can decrease jpk to ', ikmax+1
678      ENDIF
679
680      IF( lwp .AND. nprint == 1 ) THEN      ! control print
681         WRITE(numout,*)
682         WRITE(numout,*) ' bathymetric field :   number of non-zero T-levels '
683         WRITE(numout,*) ' ------------------'
684         CALL prihin( mbathy, jpi, jpj, 1, jpi, 1, 1, jpj, 1, 3, numout )
685         WRITE(numout,*)
686      ENDIF
687      !
688   END SUBROUTINE zgr_bat_ctl
689
690
691   SUBROUTINE zgr_bot_level
692      !!----------------------------------------------------------------------
693      !!                    ***  ROUTINE zgr_bot_level  ***
694      !!
695      !! ** Purpose :   defines the vertical index of ocean bottom (mbk. arrays)
696      !!
697      !! ** Method  :   computes from mbathy with a minimum value of 1 over land
698      !!
699      !! ** Action  :   mbkt, mbku, mbkv :   vertical indices of the deeptest
700      !!                                     ocean level at t-, u- & v-points
701      !!                                     (min value = 1 over land)
702      !!----------------------------------------------------------------------
703      INTEGER ::   ji, jj   ! dummy loop indices
704      REAL(wp), DIMENSION(jpi,jpj) ::   zmbk   ! 2D workspace
705      !!----------------------------------------------------------------------
706      !
707      IF(lwp) WRITE(numout,*)
708      IF(lwp) WRITE(numout,*) '    zgr_bot_level : ocean bottom k-index of T-, U-, V- and W-levels '
709      IF(lwp) WRITE(numout,*) '    ~~~~~~~~~~~~~'
710      !
711      mbkt(:,:) = MAX( mbathy(:,:) , 1 )    ! bottom k-index of T-level (=1 over land)
712      !                                     ! bottom k-index of W-level = mbkt+1
713      DO jj = 1, jpjm1                      ! bottom k-index of u- (v-) level
714         DO ji = 1, jpim1
715            mbku(ji,jj) = MIN(  mbkt(ji+1,jj  ) , mbkt(ji,jj)  )
716            mbkv(ji,jj) = MIN(  mbkt(ji  ,jj+1) , mbkt(ji,jj)  )
717         END DO
718      END DO
719      ! converte into REAL to use lbc_lnk ; impose a min value of 1 as a zero can be set in lbclnk
720      zmbk(:,:) = REAL( mbku(:,:), wp )   ;   CALL lbc_lnk(zmbk,'U',1.)   ;   mbku  (:,:) = MAX( INT( zmbk(:,:) ), 1 )
721      zmbk(:,:) = REAL( mbkv(:,:), wp )   ;   CALL lbc_lnk(zmbk,'V',1.)   ;   mbkv  (:,:) = MAX( INT( zmbk(:,:) ), 1 )
722      !
723   END SUBROUTINE zgr_bot_level
724
725
726   SUBROUTINE zgr_zco
727      !!----------------------------------------------------------------------
728      !!                  ***  ROUTINE zgr_zco  ***
729      !!
730      !! ** Purpose :   define the z-coordinate system
731      !!
732      !! ** Method  :   set 3D coord. arrays to reference 1D array
733      !!----------------------------------------------------------------------
734      INTEGER  ::   jk
735      !!----------------------------------------------------------------------
736      !
737      DO jk = 1, jpk
738         fsdept(:,:,jk) = gdept_0(jk)
739         fsdepw(:,:,jk) = gdepw_0(jk)
740         fsde3w(:,:,jk) = gdepw_0(jk)
741         fse3t (:,:,jk) = e3t_0(jk)
742         fse3u (:,:,jk) = e3t_0(jk)
743         fse3v (:,:,jk) = e3t_0(jk)
744         fse3f (:,:,jk) = e3t_0(jk)
745         fse3w (:,:,jk) = e3w_0(jk)
746         fse3uw(:,:,jk) = e3w_0(jk)
747         fse3vw(:,:,jk) = e3w_0(jk)
748      END DO
749      !
750   END SUBROUTINE zgr_zco
751
752   !!----------------------------------------------------------------------
753   !!   Default option :                      zco, zps and/or sco available (gedp & e3 are 3D arrays)
754   !!----------------------------------------------------------------------
755
756   SUBROUTINE zgr_zps
757      !!----------------------------------------------------------------------
758      !!                  ***  ROUTINE zgr_zps  ***
759      !!                     
760      !! ** Purpose :   the depth and vertical scale factor in partial step
761      !!      z-coordinate case
762      !!
763      !! ** Method  :   Partial steps : computes the 3D vertical scale factors
764      !!      of T-, U-, V-, W-, UW-, VW and F-points that are associated with
765      !!      a partial step representation of bottom topography.
766      !!
767      !!        The reference depth of model levels is defined from an analytical
768      !!      function the derivative of which gives the reference vertical
769      !!      scale factors.
770      !!        From  depth and scale factors reference, we compute there new value
771      !!      with partial steps  on 3d arrays ( i, j, k ).
772      !!
773      !!              w-level: gdepw(i,j,k)  = fsdep(k)
774      !!                       e3w(i,j,k) = dk(fsdep)(k)     = fse3(i,j,k)
775      !!              t-level: gdept(i,j,k)  = fsdep(k+0.5)
776      !!                       e3t(i,j,k) = dk(fsdep)(k+0.5) = fse3(i,j,k+0.5)
777      !!
778      !!        With the help of the bathymetric file ( bathymetry_depth_ORCA_R2.nc),
779      !!      we find the mbathy index of the depth at each grid point.
780      !!      This leads us to three cases:
781      !!
782      !!              - bathy = 0 => mbathy = 0
783      !!              - 1 < mbathy < jpkm1   
784      !!              - bathy > gdepw(jpk) => mbathy = jpkm1 
785      !!
786      !!        Then, for each case, we find the new depth at t- and w- levels
787      !!      and the new vertical scale factors at t-, u-, v-, w-, uw-, vw-
788      !!      and f-points.
789      !!
790      !!        This routine is given as an example, it must be modified
791      !!      following the user s desiderata. nevertheless, the output as
792      !!      well as the way to compute the model levels and scale factors
793      !!      must be respected in order to insure second order accuracy
794      !!      schemes.
795      !!
796      !!         c a u t i o n : gdept_0, gdepw_0 and e3._0 are positives
797      !!         - - - - - - -   gdept, gdepw and e3. are positives
798      !!     
799      !!  Reference :   Pacanowsky & Gnanadesikan 1997, Mon. Wea. Rev., 126, 3248-3270.
800      !!----------------------------------------------------------------------
801      INTEGER  ::   ji, jj, jk       ! dummy loop indices
802      INTEGER  ::   ik, it           ! temporary integers
803      INTEGER  ::   nlbelow          ! temporary integer
804      LOGICAL  ::   ll_print         ! Allow  control print for debugging
805      REAL(wp) ::   ze3tp , ze3wp    ! Last ocean level thickness at T- and W-points
806      REAL(wp) ::   zdepwp, zdepth   ! Ajusted ocean depth to avoid too small e3t
807      REAL(wp) ::   zmax, zmin       ! Maximum and minimum depth
808      REAL(wp) ::   zdiff            ! temporary scalar
809      REAL(wp) ::   zrefdep          ! temporary scalar
810      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zprt   ! 3D workspace
811      !!---------------------------------------------------------------------
812
813      IF(lwp) WRITE(numout,*)
814      IF(lwp) WRITE(numout,*) '    zgr_zps : z-coordinate with partial steps'
815      IF(lwp) WRITE(numout,*) '    ~~~~~~~ '
816      IF(lwp) WRITE(numout,*) '              mbathy is recomputed : bathy_level file is NOT used'
817
818      ll_print = .FALSE.                   ! Local variable for debugging
819!!    ll_print = .TRUE.
820     
821      IF(lwp .AND. ll_print) THEN          ! control print of the ocean depth
822         WRITE(numout,*)
823         WRITE(numout,*) 'dom_zgr_zps:  bathy (in hundred of meters)'
824         CALL prihre( bathy, jpi, jpj, 1,jpi, 1, 1, jpj, 1, 1.e-2, numout )
825      ENDIF
826
827
828      ! bathymetry in level (from bathy_meter)
829      ! ===================
830      zmax = gdepw_0(jpk) + e3t_0(jpk)     ! maximum depth (i.e. the last ocean level thickness <= 2*e3t_0(jpkm1) )
831
832      zrefdep = 25._wp
833      nlbelow = MINLOC( gdepw_0, mask = gdepw_0 > zrefdep, dim = 1 )   ! shallowest W level Below zrefdep
834      IF(lwp) write(numout,*) 'Minimum depth level selected: ', nlbelow
835      zmin = gdepw_0(nlbelow)              ! minimum depth = nlbelow-1 levels
836
837      mbathy(:,:) = jpkm1                  ! initialize mbathy to the maximum ocean level available
838
839      !                                    ! storage of land and island's number (zera and negative values) in mbathy
840      WHERE( bathy(:,:) <= 0._wp )   mbathy(:,:) = INT( bathy(:,:) )
841
842      ! bounded value of bathy
843!!gm  bathy(:,:) = MIN(  zmax,  MAX( bathy(:,:), zmin )  )     !!gm : simpler   as zmin is > 0
844      DO jj = 1, jpj
845         DO ji= 1, jpi
846            IF( bathy(ji,jj) <= 0._wp ) THEN   ;   bathy(ji,jj) = 0._wp
847            ELSE                               ;   bathy(ji,jj) = MIN(  zmax,  MAX( bathy(ji,jj), zmin )  )
848            ENDIF
849         END DO
850      END DO
851
852      ! Compute mbathy for ocean points (i.e. the number of ocean levels)
853      ! find the number of ocean levels such that the last level thickness
854      ! is larger than the minimum of e3zps_min and e3zps_rat * e3t_0 (where
855      ! e3t_0 is the reference level thickness
856      DO jk = jpkm1, 1, -1
857         zdepth = gdepw_0(jk) + MIN( e3zps_min, e3t_0(jk)*e3zps_rat )
858         WHERE( 0._wp < bathy(:,:) .AND. bathy(:,:) <= zdepth )   mbathy(:,:) = jk-1
859      END DO
860
861      ! Scale factors and depth at T- and W-points
862      DO jk = 1, jpk                        ! intitialization to the reference z-coordinate
863         gdept(:,:,jk) = gdept_0(jk)
864         gdepw(:,:,jk) = gdepw_0(jk)
865         e3t  (:,:,jk) = e3t_0  (jk)
866         e3w  (:,:,jk) = e3w_0  (jk)
867      END DO
868      hdept(:,:) = gdept(:,:,2 )
869      hdepw(:,:) = gdepw(:,:,3 )     
870      !
871      DO jj = 1, jpj
872         DO ji = 1, jpi
873            ik = mbathy(ji,jj)
874            IF( ik > 0 ) THEN               ! ocean point only
875               ! max ocean level case
876               IF( ik == jpkm1 ) THEN
877                  zdepwp = bathy(ji,jj)
878                  ze3tp  = bathy(ji,jj) - gdepw_0(ik)
879                  ze3wp = 0.5_wp * e3w_0(ik) * ( 1._wp + ( ze3tp/e3t_0(ik) ) )
880                  e3t(ji,jj,ik  ) = ze3tp
881                  e3t(ji,jj,ik+1) = ze3tp
882                  e3w(ji,jj,ik  ) = ze3wp
883                  e3w(ji,jj,ik+1) = ze3tp
884                  gdepw(ji,jj,ik+1) = zdepwp
885                  gdept(ji,jj,ik  ) = gdept_0(ik-1) + ze3wp
886                  gdept(ji,jj,ik+1) = gdept(ji,jj,ik) + ze3tp
887                  !
888               ELSE                         ! standard case
889                  IF( bathy(ji,jj) <= gdepw_0(ik+1) ) THEN   ;   gdepw(ji,jj,ik+1) = bathy(ji,jj)
890                  ELSE                                       ;   gdepw(ji,jj,ik+1) = gdepw_0(ik+1)
891                  ENDIF
892!gm Bug?  check the gdepw_0
893                  !       ... on ik
894                  gdept(ji,jj,ik) = gdepw_0(ik) + ( gdepw  (ji,jj,ik+1) - gdepw_0(ik) )   &
895                     &                          * ((gdept_0(      ik  ) - gdepw_0(ik) )   &
896                     &                          / ( gdepw_0(      ik+1) - gdepw_0(ik) ))
897                  e3t  (ji,jj,ik) = e3t_0  (ik) * ( gdepw  (ji,jj,ik+1) - gdepw_0(ik) )   & 
898                     &                          / ( gdepw_0(      ik+1) - gdepw_0(ik) ) 
899                  e3w  (ji,jj,ik) = 0.5_wp * ( gdepw(ji,jj,ik+1) + gdepw_0(ik+1) - 2._wp * gdepw_0(ik) )   &
900                     &                     * ( e3w_0(ik) / ( gdepw_0(ik+1) - gdepw_0(ik) ) )
901                  !       ... on ik+1
902                  e3w  (ji,jj,ik+1) = e3t  (ji,jj,ik)
903                  e3t  (ji,jj,ik+1) = e3t  (ji,jj,ik)
904                  gdept(ji,jj,ik+1) = gdept(ji,jj,ik) + e3t(ji,jj,ik)
905               ENDIF
906            ENDIF
907         END DO
908      END DO
909      !
910      it = 0
911      DO jj = 1, jpj
912         DO ji = 1, jpi
913            ik = mbathy(ji,jj)
914            IF( ik > 0 ) THEN               ! ocean point only
915               hdept(ji,jj) = gdept(ji,jj,ik  )
916               hdepw(ji,jj) = gdepw(ji,jj,ik+1)
917               e3tp (ji,jj) = e3t(ji,jj,ik  )
918               e3wp (ji,jj) = e3w(ji,jj,ik  )
919               ! test
920               zdiff= gdepw(ji,jj,ik+1) - gdept(ji,jj,ik  )
921               IF( zdiff <= 0._wp .AND. lwp ) THEN
922                  it = it + 1
923                  WRITE(numout,*) ' it      = ', it, ' ik      = ', ik, ' (i,j) = ', ji, jj
924                  WRITE(numout,*) ' bathy = ', bathy(ji,jj)
925                  WRITE(numout,*) ' gdept = ', gdept(ji,jj,ik), ' gdepw = ', gdepw(ji,jj,ik+1), ' zdiff = ', zdiff
926                  WRITE(numout,*) ' e3tp  = ', e3t  (ji,jj,ik), ' e3wp  = ', e3w  (ji,jj,ik  )
927               ENDIF
928            ENDIF
929         END DO
930      END DO
931
932      ! Scale factors and depth at U-, V-, UW and VW-points
933      DO jk = 1, jpk                        ! initialisation to z-scale factors
934         e3u (:,:,jk)  = e3t_0(jk)
935         e3v (:,:,jk)  = e3t_0(jk)
936         e3uw(:,:,jk)  = e3w_0(jk)
937         e3vw(:,:,jk)  = e3w_0(jk)
938      END DO
939      DO jk = 1,jpk                         ! Computed as the minimum of neighbooring scale factors
940         DO jj = 1, jpjm1
941            DO ji = 1, fs_jpim1   ! vector opt.
942               e3u (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji+1,jj,jk) )
943               e3v (ji,jj,jk) = MIN( e3t(ji,jj,jk), e3t(ji,jj+1,jk) )
944               e3uw(ji,jj,jk) = MIN( e3w(ji,jj,jk), e3w(ji+1,jj,jk) )
945               e3vw(ji,jj,jk) = MIN( e3w(ji,jj,jk), e3w(ji,jj+1,jk) )
946            END DO
947         END DO
948      END DO
949      CALL lbc_lnk( e3u , 'U', 1._wp )   ;   CALL lbc_lnk( e3uw, 'U', 1._wp )   ! lateral boundary conditions
950      CALL lbc_lnk( e3v , 'V', 1._wp )   ;   CALL lbc_lnk( e3vw, 'V', 1._wp )
951      !
952      DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries)
953         WHERE( e3u (:,:,jk) == 0._wp )   e3u (:,:,jk) = e3t_0(jk)
954         WHERE( e3v (:,:,jk) == 0._wp )   e3v (:,:,jk) = e3t_0(jk)
955         WHERE( e3uw(:,:,jk) == 0._wp )   e3uw(:,:,jk) = e3w_0(jk)
956         WHERE( e3vw(:,:,jk) == 0._wp )   e3vw(:,:,jk) = e3w_0(jk)
957      END DO
958     
959      ! Scale factor at F-point
960      DO jk = 1, jpk                        ! initialisation to z-scale factors
961         e3f(:,:,jk) = e3t_0(jk)
962      END DO
963      DO jk = 1, jpk                        ! Computed as the minimum of neighbooring V-scale factors
964         DO jj = 1, jpjm1
965            DO ji = 1, fs_jpim1   ! vector opt.
966               e3f(ji,jj,jk) = MIN( e3v(ji,jj,jk), e3v(ji+1,jj,jk) )
967            END DO
968         END DO
969      END DO
970      CALL lbc_lnk( e3f, 'F', 1._wp )       ! Lateral boundary conditions
971      !
972      DO jk = 1, jpk                        ! set to z-scale factor if zero (i.e. along closed boundaries)
973         WHERE( e3f(:,:,jk) == 0._wp )   e3f(:,:,jk) = e3t_0(jk)
974      END DO
975!!gm  bug ? :  must be a do loop with mj0,mj1
976      !
977      e3t(:,mj0(1),:) = e3t(:,mj0(2),:)     ! we duplicate factor scales for jj = 1 and jj = 2
978      e3w(:,mj0(1),:) = e3w(:,mj0(2),:) 
979      e3u(:,mj0(1),:) = e3u(:,mj0(2),:) 
980      e3v(:,mj0(1),:) = e3v(:,mj0(2),:) 
981      e3f(:,mj0(1),:) = e3f(:,mj0(2),:) 
982
983      ! Control of the sign
984      IF( MINVAL( e3t  (:,:,:) ) <= 0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   e3t   <= 0' )
985      IF( MINVAL( e3w  (:,:,:) ) <= 0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   e3w   <= 0' )
986      IF( MINVAL( gdept(:,:,:) ) <  0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   gdepw <  0' )
987      IF( MINVAL( gdepw(:,:,:) ) <  0._wp )   CALL ctl_stop( '    zgr_zps :   e r r o r   gdepw <  0' )
988     
989      ! Compute gdep3w (vertical sum of e3w)
990      gdep3w(:,:,1) = 0.5_wp * e3w(:,:,1)
991      DO jk = 2, jpk
992         gdep3w(:,:,jk) = gdep3w(:,:,jk-1) + e3w(:,:,jk) 
993      END DO
994         
995      !                                               ! ================= !
996      IF(lwp .AND. ll_print) THEN                     !   Control print   !
997         !                                            ! ================= !
998         DO jj = 1,jpj
999            DO ji = 1, jpi
1000               ik = MAX( mbathy(ji,jj), 1 )
1001               zprt(ji,jj,1) = e3t   (ji,jj,ik)
1002               zprt(ji,jj,2) = e3w   (ji,jj,ik)
1003               zprt(ji,jj,3) = e3u   (ji,jj,ik)
1004               zprt(ji,jj,4) = e3v   (ji,jj,ik)
1005               zprt(ji,jj,5) = e3f   (ji,jj,ik)
1006               zprt(ji,jj,6) = gdep3w(ji,jj,ik)
1007            END DO
1008         END DO
1009         WRITE(numout,*)
1010         WRITE(numout,*) 'domzgr e3t(mbathy)'      ;   CALL prihre(zprt(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout)
1011         WRITE(numout,*)
1012         WRITE(numout,*) 'domzgr e3w(mbathy)'      ;   CALL prihre(zprt(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout)
1013         WRITE(numout,*)
1014         WRITE(numout,*) 'domzgr e3u(mbathy)'      ;   CALL prihre(zprt(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout)
1015         WRITE(numout,*)
1016         WRITE(numout,*) 'domzgr e3v(mbathy)'      ;   CALL prihre(zprt(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout)
1017         WRITE(numout,*)
1018         WRITE(numout,*) 'domzgr e3f(mbathy)'      ;   CALL prihre(zprt(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout)
1019         WRITE(numout,*)
1020         WRITE(numout,*) 'domzgr gdep3w(mbathy)'   ;   CALL prihre(zprt(:,:,1),jpi,jpj,1,jpi,1,1,jpj,1,1.e-3,numout)
1021      ENDIF 
1022      !
1023      !                                               ! =============== !
1024      IF( lzoom )   CALL zgr_bat_zoom                 !   Zoom domain   !
1025      !                                               ! =============== !
1026      !
1027      !                                               ! =================== !
1028      IF( .NOT. lk_c1d )    CALL zgr_bat_ctl          !   Bathymetry check  !
1029      !                                               ! =================== !
1030   END SUBROUTINE zgr_zps
1031
1032
1033   FUNCTION fssig( pk ) RESULT( pf )
1034      !!----------------------------------------------------------------------
1035      !!                 ***  ROUTINE eos_init  ***
1036      !!       
1037      !! ** Purpose :   provide the analytical function in s-coordinate
1038      !!         
1039      !! ** Method  :   the function provide the non-dimensional position of
1040      !!                T and W (i.e. between 0 and 1)
1041      !!                T-points at integer values (between 1 and jpk)
1042      !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5)
1043      !!----------------------------------------------------------------------
1044      REAL(wp), INTENT(in) ::   pk   ! continuous "k" coordinate
1045      REAL(wp)             ::   pf   ! sigma value
1046      !!----------------------------------------------------------------------
1047      !
1048      pf =   (   TANH( rn_theta * ( -(pk-0.5_wp) / REAL(jpkm1) + rn_thetb )  )   &
1049         &     - TANH( rn_thetb * rn_theta                                )  )   &
1050         & * (   COSH( rn_theta                           )                      &
1051         &     + COSH( rn_theta * ( 2._wp * rn_thetb - 1._wp ) )  )              &
1052         & / ( 2._wp * SINH( rn_theta ) )
1053      !
1054   END FUNCTION fssig
1055
1056
1057   FUNCTION fssig1( pk1, pbb ) RESULT( pf1 )
1058      !!----------------------------------------------------------------------
1059      !!                 ***  ROUTINE eos_init  ***
1060      !!
1061      !! ** Purpose :   provide the Song and Haidvogel version of the analytical function in s-coordinate
1062      !!
1063      !! ** Method  :   the function provides the non-dimensional position of
1064      !!                T and W (i.e. between 0 and 1)
1065      !!                T-points at integer values (between 1 and jpk)
1066      !!                W-points at integer values - 1/2 (between 0.5 and jpk-0.5)
1067      !!----------------------------------------------------------------------
1068      REAL(wp), INTENT(in) ::   pk1   ! continuous "k" coordinate
1069      REAL(wp), INTENT(in) ::   pbb   ! Stretching coefficient
1070      REAL(wp)             ::   pf1   ! sigma value
1071      !!----------------------------------------------------------------------
1072      !
1073      IF ( rn_theta == 0 ) then      ! uniform sigma
1074         pf1 = - ( pk1 - 0.5_wp ) / REAL( jpkm1 )
1075      ELSE                        ! stretched sigma
1076         pf1 =   ( 1._wp - pbb ) * ( SINH( rn_theta*(-(pk1-0.5_wp)/REAL(jpkm1)) ) ) / SINH( rn_theta )              &
1077            &  + pbb * (  (TANH( rn_theta*( (-(pk1-0.5_wp)/REAL(jpkm1)) + 0.5_wp) ) - TANH( 0.5_wp * rn_theta )  )  &
1078            &        / ( 2._wp * TANH( 0.5_wp * rn_theta ) )  )
1079      ENDIF
1080      !
1081   END FUNCTION fssig1
1082
1083
1084   SUBROUTINE zgr_sco
1085      !!----------------------------------------------------------------------
1086      !!                  ***  ROUTINE zgr_sco  ***
1087      !!                     
1088      !! ** Purpose :   define the s-coordinate system
1089      !!
1090      !! ** Method  :   s-coordinate
1091      !!         The depth of model levels is defined as the product of an
1092      !!      analytical function by the local bathymetry, while the vertical
1093      !!      scale factors are defined as the product of the first derivative
1094      !!      of the analytical function by the bathymetry.
1095      !!      (this solution save memory as depth and scale factors are not
1096      !!      3d fields)
1097      !!          - Read bathymetry (in meters) at t-point and compute the
1098      !!         bathymetry at u-, v-, and f-points.
1099      !!            hbatu = mi( hbatt )
1100      !!            hbatv = mj( hbatt )
1101      !!            hbatf = mi( mj( hbatt ) )
1102      !!          - Compute gsigt, gsigw, esigt, esigw from an analytical
1103      !!         function and its derivative given as function.
1104      !!            gsigt(k) = fssig (k    )
1105      !!            gsigw(k) = fssig (k-0.5)
1106      !!            esigt(k) = fsdsig(k    )
1107      !!            esigw(k) = fsdsig(k-0.5)
1108      !!      This routine is given as an example, it must be modified
1109      !!      following the user s desiderata. nevertheless, the output as
1110      !!      well as the way to compute the model levels and scale factors
1111      !!      must be respected in order to insure second order a!!uracy
1112      !!      schemes.
1113      !!
1114      !! Reference : Madec, Lott, Delecluse and Crepon, 1996. JPO, 26, 1393-1408.
1115      !!----------------------------------------------------------------------
1116      INTEGER  ::   ji, jj, jk, jl           ! dummy loop argument
1117      INTEGER  ::   iip1, ijp1, iim1, ijm1   ! temporary integers
1118      REAL(wp) ::   zcoeft, zcoefw, zrmax, ztaper   ! temporary scalars
1119      REAL(wp), DIMENSION(jpi,jpj) ::   zenv, ztmp, zmsk    ! 2D workspace
1120      REAL(wp), DIMENSION(jpi,jpj) ::   zri , zrj , zhbat   !  -     -
1121      !!
1122      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   gsigw3
1123      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   gsigt3
1124      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   gsi3w3
1125      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   esigt3
1126      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   esigw3
1127      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   esigtu3
1128      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   esigtv3
1129      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   esigtf3
1130      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   esigwu3
1131      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   esigwv3
1132      !!
1133      NAMELIST/namzgr_sco/ rn_sbot_max, rn_sbot_min, rn_theta, rn_thetb, rn_rmax, ln_s_sigma, rn_bb, rn_hc
1134      !!----------------------------------------------------------------------
1135
1136      REWIND( numnam )                        ! Read Namelist namzgr_sco : sigma-stretching parameters
1137      READ  ( numnam, namzgr_sco )
1138
1139      IF(lwp) THEN                            ! control print
1140         WRITE(numout,*)
1141         WRITE(numout,*) 'dom:zgr_sco : s-coordinate or hybrid z-s-coordinate'
1142         WRITE(numout,*) '~~~~~~~~~~~'
1143         WRITE(numout,*) '   Namelist namzgr_sco'
1144         WRITE(numout,*) '      sigma-stretching coeffs '
1145         WRITE(numout,*) '      maximum depth of s-bottom surface (>0)       rn_sbot_max   = ' ,rn_sbot_max
1146         WRITE(numout,*) '      minimum depth of s-bottom surface (>0)       rn_sbot_min   = ' ,rn_sbot_min
1147         WRITE(numout,*) '      surface control parameter (0<=rn_theta<=20)  rn_theta      = ', rn_theta
1148         WRITE(numout,*) '      bottom  control parameter (0<=rn_thetb<= 1)  rn_thetb      = ', rn_thetb
1149         WRITE(numout,*) '      maximum cut-off r-value allowed              rn_rmax       = ', rn_rmax
1150         WRITE(numout,*) '      Hybrid s-sigma-coordinate                    ln_s_sigma    = ', ln_s_sigma
1151         WRITE(numout,*) '      stretching parameter (song and haidvogel)    rn_bb         = ', rn_bb
1152         WRITE(numout,*) '      Critical depth                               rn_hc         = ', rn_hc
1153      ENDIF
1154
1155      gsigw3  = 0._wp   ;   gsigt3  = 0._wp   ;   gsi3w3  = 0._wp
1156      esigt3  = 0._wp   ;   esigw3  = 0._wp 
1157      esigtu3 = 0._wp   ;   esigtv3 = 0._wp   ;   esigtf3 = 0._wp
1158      esigwu3 = 0._wp   ;   esigwv3 = 0._wp
1159
1160      hift(:,:) = rn_sbot_min                     ! set the minimum depth for the s-coordinate
1161      hifu(:,:) = rn_sbot_min
1162      hifv(:,:) = rn_sbot_min
1163      hiff(:,:) = rn_sbot_min
1164
1165      !                                        ! set maximum ocean depth
1166      bathy(:,:) = MIN( rn_sbot_max, bathy(:,:) )
1167
1168      DO jj = 1, jpj
1169         DO ji = 1, jpi
1170           IF( bathy(ji,jj) > 0._wp ) THEN
1171              bathy(ji,jj) = MAX( rn_sbot_min, bathy(ji,jj) )
1172           ENDIF
1173         END DO
1174      END DO
1175      !                                        ! =============================
1176      !                                        ! Define the envelop bathymetry   (hbatt)
1177      !                                        ! =============================
1178      ! use r-value to create hybrid coordinates
1179      DO jj = 1, jpj
1180         DO ji = 1, jpi
1181            zenv(ji,jj) = MAX( bathy(ji,jj), rn_sbot_min )
1182         END DO
1183      END DO
1184      !
1185      ! Smooth the bathymetry (if required)
1186      scosrf(:,:) = 0._wp             ! ocean surface depth (here zero: no under ice-shelf sea)
1187      scobot(:,:) = bathy(:,:)        ! ocean bottom  depth
1188      !
1189      jl = 0
1190      zrmax = 1._wp
1191      !                                                     ! ================ !
1192      DO WHILE( jl <= 10000 .AND. zrmax > rn_rmax )         !  Iterative loop  !
1193         !                                                  ! ================ !
1194         jl = jl + 1
1195         zrmax = 0._wp
1196         zmsk(:,:) = 0._wp
1197         DO jj = 1, nlcj
1198            DO ji = 1, nlci
1199               iip1 = MIN( ji+1, nlci )      ! force zri = 0 on last line (ji=ncli+1 to jpi)
1200               ijp1 = MIN( jj+1, nlcj )      ! force zrj = 0 on last raw  (jj=nclj+1 to jpj)
1201               zri(ji,jj) = ABS( zenv(iip1,jj  ) - zenv(ji,jj) ) / ( zenv(iip1,jj  ) + zenv(ji,jj) )
1202               zrj(ji,jj) = ABS( zenv(ji  ,ijp1) - zenv(ji,jj) ) / ( zenv(ji  ,ijp1) + zenv(ji,jj) )
1203               zrmax = MAX( zrmax, zri(ji,jj), zrj(ji,jj) )
1204               IF( zri(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1._wp
1205               IF( zri(ji,jj) > rn_rmax )   zmsk(iip1,jj  ) = 1._wp
1206               IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,jj  ) = 1._wp
1207               IF( zrj(ji,jj) > rn_rmax )   zmsk(ji  ,ijp1) = 1._wp
1208            END DO
1209         END DO
1210         IF( lk_mpp )   CALL mpp_max( zrmax )   ! max over the global domain
1211         ! lateral boundary condition on zmsk: keep 1 along closed boundary (use of MAX)
1212         ztmp(:,:) = zmsk(:,:)   ;   CALL lbc_lnk( zmsk, 'T', 1._wp )
1213         DO jj = 1, nlcj
1214            DO ji = 1, nlci
1215                zmsk(ji,jj) = MAX( zmsk(ji,jj), ztmp(ji,jj) )
1216            END DO
1217         END DO
1218         !
1219         IF(lwp)WRITE(numout,*) 'zgr_sco :   iter= ',jl, ' rmax= ', zrmax, ' nb of pt= ', INT( SUM(zmsk(:,:) ) )
1220         !
1221         DO jj = 1, nlcj
1222            DO ji = 1, nlci
1223               iip1 = MIN( ji+1, nlci )     ! last  line (ji=nlci)
1224               ijp1 = MIN( jj+1, nlcj )     ! last  raw  (jj=nlcj)
1225               iim1 = MAX( ji-1,  1  )      ! first line (ji=nlci)
1226               ijm1 = MAX( jj-1,  1  )      ! first raw  (jj=nlcj)
1227               IF( zmsk(ji,jj) == 1._wp ) THEN
1228                  ztmp(ji,jj) =   (                                                                                   &
1229             &      zenv(iim1,ijp1)*zmsk(iim1,ijp1) + zenv(ji,ijp1)*zmsk(ji,ijp1) + zenv(iip1,ijp1)*zmsk(iip1,ijp1)   &
1230             &    + zenv(iim1,jj  )*zmsk(iim1,jj  ) + zenv(ji,jj  )*    2._wp     + zenv(iip1,jj  )*zmsk(iip1,jj  )   &
1231             &    + zenv(iim1,ijm1)*zmsk(iim1,ijm1) + zenv(ji,ijm1)*zmsk(ji,ijm1) + zenv(iip1,ijm1)*zmsk(iip1,ijm1)   &
1232             &                    ) / (                                                                               &
1233             &                      zmsk(iim1,ijp1) +               zmsk(ji,ijp1) +                 zmsk(iip1,ijp1)   &
1234             &    +                 zmsk(iim1,jj  ) +                   2._wp     +                 zmsk(iip1,jj  )   &
1235             &    +                 zmsk(iim1,ijm1) +               zmsk(ji,ijm1) +                 zmsk(iip1,ijm1)   &
1236             &                        )
1237               ENDIF
1238            END DO
1239         END DO
1240         !
1241         DO jj = 1, nlcj
1242            DO ji = 1, nlci
1243               IF( zmsk(ji,jj) == 1._wp )   zenv(ji,jj) = MAX( ztmp(ji,jj), bathy(ji,jj) )
1244            END DO
1245         END DO
1246         !
1247         ! Apply lateral boundary condition   CAUTION: kept the value when the lbc field is zero
1248         ztmp(:,:) = zenv(:,:)   ;   CALL lbc_lnk( zenv, 'T', 1._wp )
1249         DO jj = 1, nlcj
1250            DO ji = 1, nlci
1251               IF( zenv(ji,jj) == 0._wp )   zenv(ji,jj) = ztmp(ji,jj)
1252            END DO
1253         END DO
1254         !                                                  ! ================ !
1255      END DO                                                !     End loop     !
1256      !                                                     ! ================ !
1257      !
1258      !                                        ! envelop bathymetry saved in hbatt
1259      hbatt(:,:) = zenv(:,:) 
1260      IF( MINVAL( gphit(:,:) ) * MAXVAL( gphit(:,:) ) <= 0._wp ) THEN
1261         CALL ctl_warn( ' s-coordinates are tapered in vicinity of the Equator' )
1262         DO jj = 1, jpj
1263            DO ji = 1, jpi
1264               ztaper = EXP( -(gphit(ji,jj)/8._wp)**2 )
1265               hbatt(ji,jj) = rn_sbot_max * ztaper + hbatt(ji,jj) * ( 1._wp - ztaper )
1266            END DO
1267         END DO
1268      ENDIF
1269      !
1270      IF(lwp) THEN                             ! Control print
1271         WRITE(numout,*)
1272         WRITE(numout,*) ' domzgr: hbatt field; ocean depth in meters'
1273         WRITE(numout,*)
1274         CALL prihre( hbatt(1,1), jpi, jpj, 1, jpi, 1, 1, jpj, 1, 0._wp, numout )
1275         IF( nprint == 1 )   THEN       
1276            WRITE(numout,*) ' bathy  MAX ', MAXVAL( bathy(:,:) ), ' MIN ', MINVAL( bathy(:,:) )
1277            WRITE(numout,*) ' hbatt  MAX ', MAXVAL( hbatt(:,:) ), ' MIN ', MINVAL( hbatt(:,:) )
1278         ENDIF
1279      ENDIF
1280
1281      !                                        ! ==============================
1282      !                                        !   hbatu, hbatv, hbatf fields
1283      !                                        ! ==============================
1284      IF(lwp) THEN
1285         WRITE(numout,*)
1286         WRITE(numout,*) ' zgr_sco: minimum depth of the envelop topography set to : ', rn_sbot_min
1287      ENDIF
1288      hbatu(:,:) = rn_sbot_min
1289      hbatv(:,:) = rn_sbot_min
1290      hbatf(:,:) = rn_sbot_min
1291      DO jj = 1, jpjm1
1292        DO ji = 1, jpim1   ! NO vector opt.
1293           hbatu(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji+1,jj  ) )
1294           hbatv(ji,jj) = 0.50_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1) )
1295           hbatf(ji,jj) = 0.25_wp * ( hbatt(ji  ,jj) + hbatt(ji  ,jj+1)   &
1296              &                     + hbatt(ji+1,jj) + hbatt(ji+1,jj+1) )
1297        END DO
1298      END DO
1299      !
1300      ! Apply lateral boundary condition
1301!!gm  ! CAUTION: retain non zero value in the initial file this should be OK for orca cfg, not for EEL
1302      zhbat(:,:) = hbatu(:,:)   ;   CALL lbc_lnk( hbatu, 'U', 1._wp )
1303      DO jj = 1, jpj
1304         DO ji = 1, jpi
1305            IF( hbatu(ji,jj) == 0._wp ) THEN
1306               IF( zhbat(ji,jj) == 0._wp )   hbatu(ji,jj) = rn_sbot_min
1307               IF( zhbat(ji,jj) /= 0._wp )   hbatu(ji,jj) = zhbat(ji,jj)
1308            ENDIF
1309         END DO
1310      END DO
1311      zhbat(:,:) = hbatv(:,:)   ;   CALL lbc_lnk( hbatv, 'V', 1._wp )
1312      DO jj = 1, jpj
1313         DO ji = 1, jpi
1314            IF( hbatv(ji,jj) == 0._wp ) THEN
1315               IF( zhbat(ji,jj) == 0._wp )   hbatv(ji,jj) = rn_sbot_min
1316               IF( zhbat(ji,jj) /= 0._wp )   hbatv(ji,jj) = zhbat(ji,jj)
1317            ENDIF
1318         END DO
1319      END DO
1320      zhbat(:,:) = hbatf(:,:)   ;   CALL lbc_lnk( hbatf, 'F', 1._wp )
1321      DO jj = 1, jpj
1322         DO ji = 1, jpi
1323            IF( hbatf(ji,jj) == 0._wp ) THEN
1324               IF( zhbat(ji,jj) == 0._wp )   hbatf(ji,jj) = rn_sbot_min
1325               IF( zhbat(ji,jj) /= 0._wp )   hbatf(ji,jj) = zhbat(ji,jj)
1326            ENDIF
1327         END DO
1328      END DO
1329
1330!!bug:  key_helsinki a verifer
1331      hift(:,:) = MIN( hift(:,:), hbatt(:,:) )
1332      hifu(:,:) = MIN( hifu(:,:), hbatu(:,:) )
1333      hifv(:,:) = MIN( hifv(:,:), hbatv(:,:) )
1334      hiff(:,:) = MIN( hiff(:,:), hbatf(:,:) )
1335
1336      IF( nprint == 1 .AND. lwp )   THEN
1337         WRITE(numout,*) ' MAX val hif   t ', MAXVAL( hift (:,:) ), ' f ', MAXVAL( hiff (:,:) ),  &
1338            &                        ' u ',   MAXVAL( hifu (:,:) ), ' v ', MAXVAL( hifv (:,:) )
1339         WRITE(numout,*) ' MIN val hif   t ', MINVAL( hift (:,:) ), ' f ', MINVAL( hiff (:,:) ),  &
1340            &                        ' u ',   MINVAL( hifu (:,:) ), ' v ', MINVAL( hifv (:,:) )
1341         WRITE(numout,*) ' MAX val hbat  t ', MAXVAL( hbatt(:,:) ), ' f ', MAXVAL( hbatf(:,:) ),  &
1342            &                        ' u ',   MAXVAL( hbatu(:,:) ), ' v ', MAXVAL( hbatv(:,:) )
1343         WRITE(numout,*) ' MIN val hbat  t ', MINVAL( hbatt(:,:) ), ' f ', MINVAL( hbatf(:,:) ),  &
1344            &                        ' u ',   MINVAL( hbatu(:,:) ), ' v ', MINVAL( hbatv(:,:) )
1345      ENDIF
1346!! helsinki
1347
1348      !                                            ! =======================
1349      !                                            !   s-ccordinate fields     (gdep., e3.)
1350      !                                            ! =======================
1351      !
1352      ! non-dimensional "sigma" for model level depth at w- and t-levels
1353
1354      IF( ln_s_sigma ) THEN        ! Song and Haidvogel style stretched sigma for depths
1355         !                         ! below rn_hc, with uniform sigma in shallower waters
1356         DO ji = 1, jpi
1357            DO jj = 1, jpj
1358
1359               IF( hbatt(ji,jj) > rn_hc ) THEN    !deep water, stretched sigma
1360                  DO jk = 1, jpk
1361                     gsigw3(ji,jj,jk) = -fssig1( REAL(jk,wp)-0.5_wp, rn_bb )
1362                     gsigt3(ji,jj,jk) = -fssig1( REAL(jk,wp)       , rn_bb )
1363                  END DO
1364               ELSE ! shallow water, uniform sigma
1365                  DO jk = 1, jpk
1366                     gsigw3(ji,jj,jk) =   REAL(jk-1,wp)            / REAL(jpk-1,wp)
1367                     gsigt3(ji,jj,jk) = ( REAL(jk-1,wp) + 0.5_wp ) / REAL(jpk-1,wp)
1368                  END DO
1369               ENDIF
1370               IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'gsigw3 1 jpk    ', gsigw3(ji,jj,1), gsigw3(ji,jj,jpk)
1371               !
1372               DO jk = 1, jpkm1
1373                  esigt3(ji,jj,jk  ) = gsigw3(ji,jj,jk+1) - gsigw3(ji,jj,jk)
1374                  esigw3(ji,jj,jk+1) = gsigt3(ji,jj,jk+1) - gsigt3(ji,jj,jk)
1375               END DO
1376               esigw3(ji,jj,1  ) = 2._wp * ( gsigt3(ji,jj,1  ) - gsigw3(ji,jj,1  ) )
1377               esigt3(ji,jj,jpk) = 2._wp * ( gsigt3(ji,jj,jpk) - gsigw3(ji,jj,jpk) )
1378               !
1379               ! Coefficients for vertical depth as the sum of e3w scale factors
1380               gsi3w3(ji,jj,1) = 0.5_wp * esigw3(ji,jj,1)
1381               DO jk = 2, jpk
1382                  gsi3w3(ji,jj,jk) = gsi3w3(ji,jj,jk-1) + esigw3(ji,jj,jk)
1383               END DO
1384               !
1385               DO jk = 1, jpk
1386                  zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp)
1387                  zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp)
1388                  gdept (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsigt3(ji,jj,jk)+rn_hc*zcoeft )
1389                  gdepw (ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsigw3(ji,jj,jk)+rn_hc*zcoefw )
1390                  gdep3w(ji,jj,jk) = ( scosrf(ji,jj) + (hbatt(ji,jj)-rn_hc)*gsi3w3(ji,jj,jk)+rn_hc*zcoeft )
1391               END DO
1392               !
1393            END DO   ! for all jj's
1394         END DO    ! for all ji's
1395
1396         DO ji = 1, jpi
1397            DO jj = 1, jpj
1398               DO jk = 1, jpk
1399                  esigtu3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk) )   &
1400                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) )
1401                  esigtv3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji,jj+1)*esigt3(ji,jj+1,jk) )   &
1402                     &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) )
1403                  esigtf3(ji,jj,jk) = ( hbatt(ji,jj)*esigt3(ji,jj,jk)+hbatt(ji+1,jj)*esigt3(ji+1,jj,jk)     &
1404                     &                + hbatt(ji,jj+1)*esigt3(ji,jj+1,jk)+hbatt(ji+1,jj+1)*esigt3(ji+1,jj+1,jk) )   &
1405                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj)+hbatt(ji,jj+1)+hbatt(ji+1,jj+1) )
1406                  esigwu3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji+1,jj)*esigw3(ji+1,jj,jk) )   &
1407                     &              / ( hbatt(ji,jj)+hbatt(ji+1,jj) )
1408                  esigwv3(ji,jj,jk) = ( hbatt(ji,jj)*esigw3(ji,jj,jk)+hbatt(ji,jj+1)*esigw3(ji,jj+1,jk) )   &
1409                     &              / ( hbatt(ji,jj)+hbatt(ji,jj+1) )
1410                  !
1411                  e3t(ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigt3 (ji,jj,jk) + rn_hc/FLOAT(jpkm1) )
1412                  e3u(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigtu3(ji,jj,jk) + rn_hc/FLOAT(jpkm1) )
1413                  e3v(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigtv3(ji,jj,jk) + rn_hc/FLOAT(jpkm1) )
1414                  e3f(ji,jj,jk) = ( (hbatf(ji,jj)-rn_hc)*esigtf3(ji,jj,jk) + rn_hc/FLOAT(jpkm1) )
1415                  !
1416                  e3w (ji,jj,jk) = ( (hbatt(ji,jj)-rn_hc)*esigw3 (ji,jj,jk) + rn_hc/FLOAT(jpkm1) )
1417                  e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-rn_hc)*esigwu3(ji,jj,jk) + rn_hc/FLOAT(jpkm1) )
1418                  e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-rn_hc)*esigwv3(ji,jj,jk) + rn_hc/FLOAT(jpkm1) )
1419               END DO
1420            END DO
1421         END DO
1422         !
1423      ELSE   ! not ln_s_sigma
1424         !
1425         DO jk = 1, jpk
1426           gsigw(jk) = -fssig( REAL(jk,wp)-0.5_wp )
1427           gsigt(jk) = -fssig( REAL(jk,wp)        )
1428         END DO
1429         IF( nprint == 1 .AND. lwp )   WRITE(numout,*) 'gsigw 1 jpk    ', gsigw(1), gsigw(jpk)
1430         !
1431         ! Coefficients for vertical scale factors at w-, t- levels
1432!!gm bug :  define it from analytical function, not like juste bellow....
1433!!gm        or betteroffer the 2 possibilities....
1434         DO jk = 1, jpkm1
1435            esigt(jk  ) = gsigw(jk+1) - gsigw(jk)
1436            esigw(jk+1) = gsigt(jk+1) - gsigt(jk)
1437         END DO
1438         esigw( 1 ) = 2._wp * ( gsigt(1  ) - gsigw(1  ) ) 
1439         esigt(jpk) = 2._wp * ( gsigt(jpk) - gsigw(jpk) )
1440
1441!!gm  original form
1442!!org DO jk = 1, jpk
1443!!org    esigt(jk)=fsdsig( FLOAT(jk)     )
1444!!org    esigw(jk)=fsdsig( FLOAT(jk)-0.5 )
1445!!org END DO
1446!!gm
1447         !
1448         ! Coefficients for vertical depth as the sum of e3w scale factors
1449         gsi3w(1) = 0.5_wp * esigw(1)
1450         DO jk = 2, jpk
1451            gsi3w(jk) = gsi3w(jk-1) + esigw(jk)
1452         END DO
1453!!gm: depuw, depvw can be suppressed (modif in ldfslp) and depw=dep3w can be set (save 3 3D arrays)
1454         DO jk = 1, jpk
1455            zcoeft = ( REAL(jk,wp) - 0.5_wp ) / REAL(jpkm1,wp)
1456            zcoefw = ( REAL(jk,wp) - 1.0_wp ) / REAL(jpkm1,wp)
1457            gdept (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsigt(jk) + hift(:,:)*zcoeft )
1458            gdepw (:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsigw(jk) + hift(:,:)*zcoefw )
1459            gdep3w(:,:,jk) = ( scosrf(:,:) + (hbatt(:,:)-hift(:,:))*gsi3w(jk) + hift(:,:)*zcoeft )
1460         END DO
1461!!gm: e3uw, e3vw can be suppressed  (modif in dynzdf, dynzdf_iso, zdfbfr) (save 2 3D arrays)
1462         DO jj = 1, jpj
1463            DO ji = 1, jpi
1464               DO jk = 1, jpk
1465                 e3t(ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*esigt(jk) + hift(ji,jj)/REAL(jpkm1,wp) )
1466                 e3u(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*esigt(jk) + hifu(ji,jj)/REAL(jpkm1,wp) )
1467                 e3v(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*esigt(jk) + hifv(ji,jj)/REAL(jpkm1,wp) )
1468                 e3f(ji,jj,jk) = ( (hbatf(ji,jj)-hiff(ji,jj))*esigt(jk) + hiff(ji,jj)/REAL(jpkm1,wp) )
1469                 !
1470                 e3w (ji,jj,jk) = ( (hbatt(ji,jj)-hift(ji,jj))*esigw(jk) + hift(ji,jj)/REAL(jpkm1,wp) )
1471                 e3uw(ji,jj,jk) = ( (hbatu(ji,jj)-hifu(ji,jj))*esigw(jk) + hifu(ji,jj)/REAL(jpkm1,wp) )
1472                 e3vw(ji,jj,jk) = ( (hbatv(ji,jj)-hifv(ji,jj))*esigw(jk) + hifv(ji,jj)/REAL(jpkm1,wp) )
1473               END DO
1474            END DO
1475         END DO
1476         !
1477      ENDIF ! ln_s_sigma
1478
1479
1480      !
1481!!    H. Liu, POL. April 2009. Added for passing the scale check for the new released vvl code.
1482
1483      fsdept(:,:,:) = gdept (:,:,:)
1484      fsdepw(:,:,:) = gdepw (:,:,:)
1485      fsde3w(:,:,:) = gdep3w(:,:,:)
1486      fse3t (:,:,:) = e3t   (:,:,:)
1487      fse3u (:,:,:) = e3u   (:,:,:)
1488      fse3v (:,:,:) = e3v   (:,:,:)
1489      fse3f (:,:,:) = e3f   (:,:,:)
1490      fse3w (:,:,:) = e3w   (:,:,:)
1491      fse3uw(:,:,:) = e3uw  (:,:,:)
1492      fse3vw(:,:,:) = e3vw  (:,:,:)
1493!!
1494      ! HYBRID :
1495      DO jj = 1, jpj
1496         DO ji = 1, jpi
1497            DO jk = 1, jpkm1
1498               IF( scobot(ji,jj) >= fsdept(ji,jj,jk) )   mbathy(ji,jj) = MAX( 2, jk )
1499               IF( scobot(ji,jj) == 0._wp            )   mbathy(ji,jj) = 0
1500            END DO
1501         END DO
1502      END DO
1503      IF( nprint == 1 .AND. lwp ) WRITE(numout,*) ' MIN val mbathy h90 ', MINVAL( mbathy(:,:) ),   &
1504         &                                                       ' MAX ', MAXVAL( mbathy(:,:) )
1505
1506
1507      !                                               ! ===========
1508      IF( lzoom )   CALL zgr_bat_zoom                 ! Zoom domain
1509      !                                               ! ===========
1510      !
1511      !                                               ! =================== !
1512      IF( .NOT. lk_c1d )    CALL zgr_bat_ctl          !   Bathymetry check  !
1513      !                                               ! =================== !
1514      !
1515      !                                               ! =============
1516      IF(lwp) THEN                                    ! Control print
1517         !                                            ! =============
1518         WRITE(numout,*) 
1519         WRITE(numout,*) ' domzgr: vertical coefficients for model level'
1520         WRITE(numout, "(9x,'  level    gsigt      gsigw      esigt      esigw      gsi3w')" )
1521         WRITE(numout, "(10x,i4,5f11.4)" ) ( jk, gsigt(jk), gsigw(jk), esigt(jk), esigw(jk), gsi3w(jk), jk=1,jpk )
1522      ENDIF
1523      IF( nprint == 1  .AND. lwp )   THEN         ! min max values over the local domain
1524         WRITE(numout,*) ' MIN val mbathy  ', MINVAL( mbathy(:,:)   ), ' MAX ', MAXVAL( mbathy(:,:) )
1525         WRITE(numout,*) ' MIN val depth t ', MINVAL( fsdept(:,:,:) ),   &
1526            &                          ' w ', MINVAL( fsdepw(:,:,:) ), '3w '  , MINVAL( fsde3w(:,:,:) )
1527         WRITE(numout,*) ' MIN val e3    t ', MINVAL( fse3t (:,:,:) ), ' f '  , MINVAL( fse3f (:,:,:) ),   &
1528            &                          ' u ', MINVAL( fse3u (:,:,:) ), ' u '  , MINVAL( fse3v (:,:,:) ),   &
1529            &                          ' uw', MINVAL( fse3uw(:,:,:) ), ' vw'  , MINVAL( fse3vw(:,:,:) ),   &
1530            &                          ' w ', MINVAL( fse3w (:,:,:) )
1531
1532         WRITE(numout,*) ' MAX val depth t ', MAXVAL( fsdept(:,:,:) ),   &
1533            &                          ' w ', MAXVAL( fsdepw(:,:,:) ), '3w '  , MAXVAL( fsde3w(:,:,:) )
1534         WRITE(numout,*) ' MAX val e3    t ', MAXVAL( fse3t (:,:,:) ), ' f '  , MAXVAL( fse3f (:,:,:) ),   &
1535            &                          ' u ', MAXVAL( fse3u (:,:,:) ), ' u '  , MAXVAL( fse3v (:,:,:) ),   &
1536            &                          ' uw', MAXVAL( fse3uw(:,:,:) ), ' vw'  , MAXVAL( fse3vw(:,:,:) ),   &
1537            &                          ' w ', MAXVAL( fse3w (:,:,:) )
1538      ENDIF
1539      !
1540      IF(lwp) THEN                                  ! selected vertical profiles
1541         WRITE(numout,*)
1542         WRITE(numout,*) ' domzgr: vertical coordinates : point (1,1,k) bathy = ', bathy(1,1), hbatt(1,1)
1543         WRITE(numout,*) ' ~~~~~~  --------------------'
1544         WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')")
1545         WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(1,1,jk), fsdepw(1,1,jk),     &
1546            &                                 fse3t (1,1,jk), fse3w (1,1,jk), jk=1,jpk )
1547         DO jj = mj0(20), mj1(20)
1548            DO ji = mi0(20), mi1(20)
1549               WRITE(numout,*)
1550               WRITE(numout,*) ' domzgr: vertical coordinates : point (20,20,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj)
1551               WRITE(numout,*) ' ~~~~~~  --------------------'
1552               WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')")
1553               WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     &
1554                  &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk )
1555            END DO
1556         END DO
1557         DO jj = mj0(74), mj1(74)
1558            DO ji = mi0(100), mi1(100)
1559               WRITE(numout,*)
1560               WRITE(numout,*) ' domzgr: vertical coordinates : point (100,74,k)   bathy = ', bathy(ji,jj), hbatt(ji,jj)
1561               WRITE(numout,*) ' ~~~~~~  --------------------'
1562               WRITE(numout,"(9x,' level   gdept    gdepw    gde3w     e3t      e3w  ')")
1563               WRITE(numout,"(10x,i4,4f9.2)") ( jk, fsdept(ji,jj,jk), fsdepw(ji,jj,jk),     &
1564                  &                                 fse3t (ji,jj,jk), fse3w (ji,jj,jk), jk=1,jpk )
1565            END DO
1566         END DO
1567      ENDIF
1568
1569!!gm bug?  no more necessary?  if ! defined key_helsinki
1570      DO jk = 1, jpk
1571         DO jj = 1, jpj
1572            DO ji = 1, jpi
1573               IF( fse3w(ji,jj,jk) <= 0._wp .OR. fse3t(ji,jj,jk) <= 0._wp ) THEN
1574                  WRITE(ctmp1,*) 'zgr_sco :   e3w   or e3t   =< 0  at point (i,j,k)= ', ji, jj, jk
1575                  CALL ctl_stop( ctmp1 )
1576               ENDIF
1577               IF( fsdepw(ji,jj,jk) < 0._wp .OR. fsdept(ji,jj,jk) < 0._wp ) THEN
1578                  WRITE(ctmp1,*) 'zgr_sco :   gdepw or gdept =< 0  at point (i,j,k)= ', ji, jj, jk
1579                  CALL ctl_stop( ctmp1 )
1580               ENDIF
1581            END DO
1582         END DO
1583      END DO
1584!!gm bug    #endif
1585      !
1586   END SUBROUTINE zgr_sco
1587
1588
1589   !!======================================================================
1590END MODULE domzgr
Note: See TracBrowser for help on using the repository browser.