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.
domain.F90 in NEMO/trunk/src/OCE/DOM – NEMO

source: NEMO/trunk/src/OCE/DOM/domain.F90 @ 14072

Last change on this file since 14072 was 14072, checked in by laurent, 3 years ago

Merging branch "2020/dev_r13648_ASINTER-04_laurent_bulk_ice", ticket #2369

  • Property svn:keywords set to Id
File size: 42.7 KB
Line 
1MODULE domain
2   !!==============================================================================
3   !!                       ***  MODULE domain   ***
4   !! Ocean initialization : domain initialization
5   !!==============================================================================
6   !! History :  OPA  !  1990-10  (C. Levy - G. Madec)  Original code
7   !!                 !  1992-01  (M. Imbard) insert time step initialization
8   !!                 !  1996-06  (G. Madec) generalized vertical coordinate
9   !!                 !  1997-02  (G. Madec) creation of domwri.F
10   !!                 !  2001-05  (E.Durand - G. Madec) insert closed sea
11   !!   NEMO     1.0  !  2002-08  (G. Madec)  F90: Free form and module
12   !!            2.0  !  2005-11  (V. Garnier) Surface pressure gradient organization
13   !!            3.3  !  2010-11  (G. Madec)  initialisation in C1D configuration
14   !!            3.6  !  2013     ( J. Simeon, C. Calone, G. Madec, C. Ethe ) Online coarsening of outputs
15   !!            3.7  !  2015-11  (G. Madec, A. Coward)  time varying zgr by default
16   !!            4.0  !  2016-10  (G. Madec, S. Flavoni)  domain configuration / user defined interface
17   !!            4.1  !  2020-02  (G. Madec, S. Techene)  introduce ssh to h0 ratio
18   !!----------------------------------------------------------------------
19
20   !!----------------------------------------------------------------------
21   !!   dom_init      : initialize the space and time domain
22   !!   dom_glo       : initialize global domain <--> local domain indices
23   !!   dom_nam       : read and contral domain namelists
24   !!   dom_ctl       : control print for the ocean domain
25   !!   domain_cfg    : read the global domain size in domain configuration file
26   !!   cfg_write     : create the domain configuration file
27   !!----------------------------------------------------------------------
28   USE oce            ! ocean variables
29   USE dom_oce        ! domain: ocean
30#if defined key_qco
31   USE domqco         ! quasi-eulerian
32#else
33   USE domvvl         ! variable volume
34#endif
35   USE sshwzv  , ONLY : ssh_init_rst   ! set initial ssh
36   USE sbc_oce        ! surface boundary condition: ocean
37   USE trc_oce        ! shared ocean & passive tracers variab
38   USE phycst         ! physical constants
39   USE domhgr         ! domain: set the horizontal mesh
40   USE domzgr         ! domain: set the vertical mesh
41   USE dommsk         ! domain: set the mask system
42   USE domwri         ! domain: write the meshmask file
43   USE c1d            ! 1D configuration
44   USE dyncor_c1d     ! 1D configuration: Coriolis term    (cor_c1d routine)
45   USE wet_dry , ONLY : ll_wd     ! wet & drying flag
46   USE closea  , ONLY : dom_clo   ! closed seas routine
47   !
48   USE prtctl         ! Print control (prt_ctl_info routine)
49   USE in_out_manager ! I/O manager
50   USE iom            ! I/O library
51   USE lbclnk         ! ocean lateral boundary condition (or mpp link)
52   USE lib_mpp        ! distributed memory computing library
53   USE restart        ! only for lrst_oce
54
55   IMPLICIT NONE
56   PRIVATE
57
58   PUBLIC   dom_init     ! called by nemogcm.F90
59   PUBLIC   domain_cfg   ! called by nemogcm.F90
60   PUBLIC   dom_tile     ! called by step.F90
61
62   !! * Substitutions
63#  include "do_loop_substitute.h90"
64   !!-------------------------------------------------------------------------
65   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
66   !! $Id$
67   !! Software governed by the CeCILL license (see ./LICENSE)
68   !!-------------------------------------------------------------------------
69CONTAINS
70
71   SUBROUTINE dom_init( Kbb, Kmm, Kaa )
72      !!----------------------------------------------------------------------
73      !!                  ***  ROUTINE dom_init  ***
74      !!
75      !! ** Purpose :   Domain initialization. Call the routines that are
76      !!              required to create the arrays which define the space
77      !!              and time domain of the ocean model.
78      !!
79      !! ** Method  : - dom_msk: compute the masks from the bathymetry file
80      !!              - dom_hgr: compute or read the horizontal grid-point position
81      !!                         and scale factors, and the coriolis factor
82      !!              - dom_zgr: define the vertical coordinate and the bathymetry
83      !!              - dom_wri: create the meshmask file (ln_meshmask=T)
84      !!              - 1D configuration, move Coriolis, u and v at T-point
85      !!----------------------------------------------------------------------
86      INTEGER          , INTENT(in) :: Kbb, Kmm, Kaa          ! ocean time level indices
87      !
88      INTEGER ::   ji, jj, jk, jt   ! dummy loop indices
89      INTEGER ::   iconf = 0    ! local integers
90      REAL(wp)::   zrdt
91      CHARACTER (len=64) ::   cform = "(A12, 3(A13, I7))"
92      INTEGER , DIMENSION(jpi,jpj) ::   ik_top , ik_bot       ! top and bottom ocean level
93      REAL(wp), DIMENSION(jpi,jpj) ::   z1_hu_0, z1_hv_0
94      !!----------------------------------------------------------------------
95      !
96      IF(lwp) THEN         ! Ocean domain Parameters (control print)
97         WRITE(numout,*)
98         WRITE(numout,*) 'dom_init : domain initialization'
99         WRITE(numout,*) '~~~~~~~~'
100         !
101         WRITE(numout,*)     '   Domain info'
102         WRITE(numout,*)     '      dimension of model:'
103         WRITE(numout,*)     '             Local domain      Global domain       Data domain '
104         WRITE(numout,cform) '        ','   jpi     : ', jpi, '   jpiglo  : ', jpiglo
105         WRITE(numout,cform) '        ','   jpj     : ', jpj, '   jpjglo  : ', jpjglo
106         WRITE(numout,cform) '        ','   jpk     : ', jpk, '   jpkglo  : ', jpkglo
107         WRITE(numout,cform) '       ' ,'   jpij    : ', jpij
108         WRITE(numout,*)     '      mpp local domain info (mpp):'
109         WRITE(numout,*)     '              jpni    : ', jpni, '   nn_hls  : ', nn_hls
110         WRITE(numout,*)     '              jpnj    : ', jpnj, '   nn_hls  : ', nn_hls
111         WRITE(numout,*)     '              jpnij   : ', jpnij
112         WRITE(numout,*)     '      lateral boundary of the Global domain : jperio  = ', jperio
113         SELECT CASE ( jperio )
114         CASE( 0 )   ;   WRITE(numout,*) '         (i.e. closed)'
115         CASE( 1 )   ;   WRITE(numout,*) '         (i.e. cyclic east-west)'
116         CASE( 2 )   ;   WRITE(numout,*) '         (i.e. cyclic north-south)'
117         CASE( 3 )   ;   WRITE(numout,*) '         (i.e. north fold with T-point pivot)'
118         CASE( 4 )   ;   WRITE(numout,*) '         (i.e. cyclic east-west and north fold with T-point pivot)'
119         CASE( 5 )   ;   WRITE(numout,*) '         (i.e. north fold with F-point pivot)'
120         CASE( 6 )   ;   WRITE(numout,*) '         (i.e. cyclic east-west and north fold with F-point pivot)'
121         CASE( 7 )   ;   WRITE(numout,*) '         (i.e. cyclic east-west and north-south)'
122         CASE DEFAULT
123            CALL ctl_stop( 'dom_init:   jperio is out of range' )
124         END SELECT
125         WRITE(numout,*)     '      Ocean model configuration used:'
126         WRITE(numout,*)     '         cn_cfg = ', TRIM( cn_cfg ), '   nn_cfg = ', nn_cfg
127      ENDIF
128
129      !
130      !           !==  Reference coordinate system  ==!
131      !
132      CALL dom_glo                            ! global domain versus local domain
133      CALL dom_nam                            ! read namelist ( namrun, namdom )
134      CALL dom_tile( ntsi, ntsj, ntei, ntej ) ! Tile domain
135
136      !
137      CALL dom_hgr                      ! Horizontal mesh
138
139      IF( ln_closea ) CALL dom_clo      ! Read in masks to define closed seas and lakes
140
141      CALL dom_zgr( ik_top, ik_bot )    ! Vertical mesh and bathymetry (return top and bottom ocean t-level indices)
142
143      CALL dom_msk( ik_top, ik_bot )    ! Masks
144      !
145      ht_0(:,:) = 0._wp  ! Reference ocean thickness
146      hu_0(:,:) = 0._wp
147      hv_0(:,:) = 0._wp
148      hf_0(:,:) = 0._wp
149      DO jk = 1, jpkm1
150         ht_0(:,:) = ht_0(:,:) + e3t_0(:,:,jk) * tmask(:,:,jk)
151         hu_0(:,:) = hu_0(:,:) + e3u_0(:,:,jk) * umask(:,:,jk)
152         hv_0(:,:) = hv_0(:,:) + e3v_0(:,:,jk) * vmask(:,:,jk)
153      END DO
154      !
155      DO jk = 1, jpkm1
156         hf_0(1:jpim1,:) = hf_0(1:jpim1,:) + e3f_0(1:jpim1,:,jk)*vmask(1:jpim1,:,jk)*vmask(2:jpi,:,jk)
157      END DO
158      CALL lbc_lnk('domain', hf_0, 'F', 1._wp)
159      !
160      IF( lk_SWE ) THEN      ! SWE case redefine hf_0
161         hf_0(:,:) = hf_0(:,:) + e3f_0(:,:,1) * ssfmask(:,:)
162      ENDIF
163      !
164      r1_ht_0(:,:) = ssmask (:,:) / ( ht_0(:,:) + 1._wp -  ssmask (:,:) )
165      r1_hu_0(:,:) = ssumask(:,:) / ( hu_0(:,:) + 1._wp -  ssumask(:,:) )
166      r1_hv_0(:,:) = ssvmask(:,:) / ( hv_0(:,:) + 1._wp -  ssvmask(:,:) )
167      r1_hf_0(:,:) = ssfmask(:,:) / ( hf_0(:,:) + 1._wp -  ssfmask(:,:) )
168      !
169      IF( ll_wd ) THEN       ! wet and drying (check ht_0 >= 0)
170         DO_2D( 1, 1, 1, 1 )
171            IF( ht_0(ji,jj) < 0._wp .AND. ssmask(ji,jj) == 1._wp ) THEN
172               CALL ctl_stop( 'ssh_init_rst : ht_0 must be positive at potentially wet points' )
173            ENDIF
174         END_2D
175      ENDIF
176      !
177      !           !==  initialisation of time varying coordinate  ==!
178      !
179      !                                 != ssh initialization
180      IF( .NOT.l_offline .AND. .NOT.l_SAS ) THEN
181         CALL ssh_init_rst( Kbb, Kmm, Kaa )
182      ELSE
183         ssh(:,:,:) = 0._wp
184      ENDIF
185      !
186#if defined key_qco
187      !                                 != Quasi-Euerian coordinate case
188      !
189      IF( .NOT.l_offline )   CALL dom_qco_init( Kbb, Kmm, Kaa )
190#else
191      !
192      IF( ln_linssh ) THEN              != Fix in time : set to the reference one for all
193         !
194         DO jt = 1, jpt                         ! depth of t- and w-grid-points
195            gdept(:,:,:,jt) = gdept_0(:,:,:)
196            gdepw(:,:,:,jt) = gdepw_0(:,:,:)
197         END DO
198            gde3w(:,:,:)    = gde3w_0(:,:,:)    ! = gdept as the sum of e3t
199         !
200         DO jt = 1, jpt                         ! vertical scale factors
201            e3t (:,:,:,jt) =  e3t_0(:,:,:)
202            e3u (:,:,:,jt) =  e3u_0(:,:,:)
203            e3v (:,:,:,jt) =  e3v_0(:,:,:)
204            e3w (:,:,:,jt) =  e3w_0(:,:,:)
205            e3uw(:,:,:,jt) = e3uw_0(:,:,:)
206            e3vw(:,:,:,jt) = e3vw_0(:,:,:)
207         END DO
208            e3f (:,:,:)    =  e3f_0(:,:,:)
209         !
210         DO jt = 1, jpt                         ! water column thickness and its inverse
211               hu(:,:,jt) =    hu_0(:,:)
212               hv(:,:,jt) =    hv_0(:,:)
213            r1_hu(:,:,jt) = r1_hu_0(:,:)
214            r1_hv(:,:,jt) = r1_hv_0(:,:)
215         END DO
216               ht   (:,:) =    ht_0(:,:)
217         !
218      ELSE                              != Time varying : initialize before/now/after variables
219         !
220         IF( .NOT.l_offline )   CALL dom_vvl_init( Kbb, Kmm, Kaa )
221         !
222      ENDIF
223#endif
224
225      !
226
227      IF( lk_c1d         )   CALL cor_c1d       ! 1D configuration: Coriolis set at T-point
228      !
229
230#if defined key_agrif
231      IF( .NOT. Agrif_Root() ) CALL Agrif_Init_Domain( Kbb, Kmm, Kaa )
232#endif
233      IF( ln_meshmask    )   CALL dom_wri       ! Create a domain file
234      IF( .NOT.ln_rstart )   CALL dom_ctl       ! Domain control
235      !
236      IF( ln_write_cfg   )   CALL cfg_write     ! create the configuration file
237      !
238      IF(lwp) THEN
239         WRITE(numout,*)
240         WRITE(numout,*) 'dom_init :   ==>>>   END of domain initialization'
241         WRITE(numout,*) '~~~~~~~~'
242         WRITE(numout,*)
243      ENDIF
244      !
245   END SUBROUTINE dom_init
246
247
248   SUBROUTINE dom_glo
249      !!----------------------------------------------------------------------
250      !!                     ***  ROUTINE dom_glo  ***
251      !!
252      !! ** Purpose :   initialization of global domain <--> local domain indices
253      !!
254      !! ** Method  :
255      !!
256      !! ** Action  : - mig , mjg : local  domain indices ==> global domain, including halos, indices
257      !!              - mig0, mjg0: local  domain indices ==> global domain, excluding halos, indices
258      !!              - mi0 , mi1 : global domain indices ==> local  domain indices
259      !!              - mj0 , mj1   (if global point not in the local domain ==> mi0>mi1 and/or mj0>mj1)
260      !!----------------------------------------------------------------------
261      INTEGER ::   ji, jj   ! dummy loop argument
262      !!----------------------------------------------------------------------
263      !
264      DO ji = 1, jpi                 ! local domain indices ==> global domain indices, including halos
265        mig(ji) = ji + nimpp - 1
266      END DO
267      DO jj = 1, jpj
268        mjg(jj) = jj + njmpp - 1
269      END DO
270      !                              ! local domain indices ==> global domain indices, excluding halos
271      !
272      mig0(:) = mig(:) - nn_hls
273      mjg0(:) = mjg(:) - nn_hls
274      ! WARNING: to keep compatibility with the trunk that was including periodocity into the input data,
275      ! we must define mig0 and mjg0 as bellow.
276      ! Once we decide to forget trunk compatibility, we must simply define mig0 and mjg0 as:
277      mig0_oldcmp(:) = mig0(:) + COUNT( (/ jperio == 1 .OR. jperio == 4 .OR. jperio == 6 .OR. jperio == 7 /) )
278      mjg0_oldcmp(:) = mjg0(:) + COUNT( (/ jperio == 2 .OR. jperio == 7 /) )
279      !
280      !                              ! global domain, including halos, indices ==> local domain indices
281      !                                   ! (return (m.0,m.1)=(1,0) if data domain gridpoint is to the west/south of the
282      !                                   ! local domain, or (m.0,m.1)=(jp.+1,jp.) to the east/north of local domain.
283      DO ji = 1, jpiglo
284        mi0(ji) = MAX( 1 , MIN( ji - nimpp + 1, jpi+1 ) )
285        mi1(ji) = MAX( 0 , MIN( ji - nimpp + 1, jpi   ) )
286      END DO
287      DO jj = 1, jpjglo
288        mj0(jj) = MAX( 1 , MIN( jj - njmpp + 1, jpj+1 ) )
289        mj1(jj) = MAX( 0 , MIN( jj - njmpp + 1, jpj   ) )
290      END DO
291      IF(lwp) THEN                   ! control print
292         WRITE(numout,*)
293         WRITE(numout,*) 'dom_glo : domain: global <<==>> local '
294         WRITE(numout,*) '~~~~~~~ '
295         WRITE(numout,*) '   global domain:   jpiglo = ', jpiglo, ' jpjglo = ', jpjglo, ' jpkglo = ', jpkglo
296         WRITE(numout,*) '   local  domain:   jpi    = ', jpi   , ' jpj    = ', jpj   , ' jpk    = ', jpk
297         WRITE(numout,*)
298      ENDIF
299      !
300   END SUBROUTINE dom_glo
301
302
303   SUBROUTINE dom_tile( ktsi, ktsj, ktei, ktej, ktile )
304      !!----------------------------------------------------------------------
305      !!                     ***  ROUTINE dom_tile  ***
306      !!
307      !! ** Purpose :   Set tile domain variables
308      !!
309      !! ** Action  : - ktsi, ktsj     : start of internal part of domain
310      !!              - ktei, ktej     : end of internal part of domain
311      !!              - ntile          : current tile number
312      !!              - nijtile        : total number of tiles
313      !!----------------------------------------------------------------------
314      INTEGER, INTENT(out) :: ktsi, ktsj, ktei, ktej      ! Tile domain indices
315      INTEGER, INTENT(in), OPTIONAL :: ktile              ! Tile number
316      INTEGER ::   jt                                     ! dummy loop argument
317      INTEGER ::   iitile, ijtile                         ! Local integers
318      CHARACTER (len=11) ::   charout
319      !!----------------------------------------------------------------------
320      IF( PRESENT(ktile) .AND. ln_tile ) THEN
321         ntile = ktile                 ! Set domain indices for tile
322         ktsi = ntsi_a(ktile)
323         ktsj = ntsj_a(ktile)
324         ktei = ntei_a(ktile)
325         ktej = ntej_a(ktile)
326
327         IF(sn_cfctl%l_prtctl) THEN
328            WRITE(charout, FMT="('ntile =', I4)") ktile
329            CALL prt_ctl_info( charout )
330         ENDIF
331      ELSE
332         ntile = 0                     ! Initialise to full domain
333         nijtile = 1
334         ktsi = Nis0
335         ktsj = Njs0
336         ktei = Nie0
337         ktej = Nje0
338
339         IF( ln_tile ) THEN            ! Calculate tile domain indices
340            iitile = Ni_0 / nn_ltile_i       ! Number of tiles
341            ijtile = Nj_0 / nn_ltile_j
342            IF( MOD( Ni_0, nn_ltile_i ) /= 0 ) iitile = iitile + 1
343            IF( MOD( Nj_0, nn_ltile_j ) /= 0 ) ijtile = ijtile + 1
344
345            nijtile = iitile * ijtile
346            ALLOCATE( ntsi_a(0:nijtile), ntsj_a(0:nijtile), ntei_a(0:nijtile), ntej_a(0:nijtile) )
347
348            ntsi_a(0) = ktsi                 ! Full domain
349            ntsj_a(0) = ktsj
350            ntei_a(0) = ktei
351            ntej_a(0) = ktej
352
353            DO jt = 1, nijtile               ! Tile domains
354               ntsi_a(jt) = Nis0 + nn_ltile_i * MOD(jt - 1, iitile)
355               ntsj_a(jt) = Njs0 + nn_ltile_j * ((jt - 1) / iitile)
356               ntei_a(jt) = MIN(ntsi_a(jt) + nn_ltile_i - 1, Nie0)
357               ntej_a(jt) = MIN(ntsj_a(jt) + nn_ltile_j - 1, Nje0)
358            ENDDO
359         ENDIF
360
361         IF(lwp) THEN                  ! control print
362            WRITE(numout,*)
363            WRITE(numout,*) 'dom_tile : Domain tiling decomposition'
364            WRITE(numout,*) '~~~~~~~~'
365            IF( ln_tile ) THEN
366               WRITE(numout,*) iitile, 'tiles in i'
367               WRITE(numout,*) '    Starting indices'
368               WRITE(numout,*) '        ', (ntsi_a(jt), jt=1, iitile)
369               WRITE(numout,*) '    Ending indices'
370               WRITE(numout,*) '        ', (ntei_a(jt), jt=1, iitile)
371               WRITE(numout,*) ijtile, 'tiles in j'
372               WRITE(numout,*) '    Starting indices'
373               WRITE(numout,*) '        ', (ntsj_a(jt), jt=1, nijtile, iitile)
374               WRITE(numout,*) '    Ending indices'
375               WRITE(numout,*) '        ', (ntej_a(jt), jt=1, nijtile, iitile)
376            ELSE
377               WRITE(numout,*) 'No domain tiling'
378               WRITE(numout,*) '    i indices =', ktsi, ':', ktei
379               WRITE(numout,*) '    j indices =', ktsj, ':', ktej
380            ENDIF
381         ENDIF
382      ENDIF
383   END SUBROUTINE dom_tile
384
385
386   SUBROUTINE dom_nam
387      !!----------------------------------------------------------------------
388      !!                     ***  ROUTINE dom_nam  ***
389      !!
390      !! ** Purpose :   read domaine namelists and print the variables.
391      !!
392      !! ** input   : - namrun namelist
393      !!              - namdom namelist
394      !!              - namtile namelist
395      !!              - namnc4 namelist   ! "key_netcdf4" only
396      !!----------------------------------------------------------------------
397      USE ioipsl
398      !!
399      INTEGER ::   ios   ! Local integer
400      REAL(wp)::   zrdt
401      !!----------------------------------------------------------------------
402      !
403      NAMELIST/namrun/ cn_ocerst_indir, cn_ocerst_outdir, nn_stocklist, ln_rst_list,                 &
404         &             nn_no   , cn_exp   , cn_ocerst_in, cn_ocerst_out, ln_rstart , nn_rstctl ,     &
405         &             nn_it000, nn_itend , nn_date0    , nn_time0     , nn_leapy  , nn_istate ,     &
406         &             nn_stock, nn_write , ln_mskland  , ln_clobber   , nn_chunksz, ln_1st_euler  , &
407         &             ln_cfmeta, ln_xios_read, nn_wxios
408      NAMELIST/namdom/ ln_linssh, rn_Dt, rn_atfp, ln_crs, ln_meshmask
409      NAMELIST/namtile/ ln_tile, nn_ltile_i, nn_ltile_j
410#if defined key_netcdf4
411      NAMELIST/namnc4/ nn_nchunks_i, nn_nchunks_j, nn_nchunks_k, ln_nc4zip
412#endif
413      !!----------------------------------------------------------------------
414      !
415      IF(lwp) THEN
416         WRITE(numout,*)
417         WRITE(numout,*) 'dom_nam : domain initialization through namelist read'
418         WRITE(numout,*) '~~~~~~~ '
419      ENDIF
420      !
421      !                       !=======================!
422      !                       !==  namelist namdom  ==!
423      !                       !=======================!
424      !
425      READ  ( numnam_ref, namdom, IOSTAT = ios, ERR = 903)
426903   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdom in reference namelist' )
427      READ  ( numnam_cfg, namdom, IOSTAT = ios, ERR = 904 )
428904   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdom in configuration namelist' )
429      IF(lwm) WRITE( numond, namdom )
430      !
431#if defined key_agrif
432      IF( .NOT. Agrif_Root() ) THEN    ! AGRIF child, subdivide the Parent timestep
433         rn_Dt = Agrif_Parent (rn_Dt ) / Agrif_Rhot()
434      ENDIF
435#endif
436      !
437      IF(lwp) THEN
438         WRITE(numout,*)
439         WRITE(numout,*) '   Namelist : namdom   ---   space & time domain'
440         WRITE(numout,*) '      linear free surface (=T)                ln_linssh   = ', ln_linssh
441         WRITE(numout,*) '      create mesh/mask file                   ln_meshmask = ', ln_meshmask
442         WRITE(numout,*) '      ocean time step                         rn_Dt       = ', rn_Dt
443         WRITE(numout,*) '      asselin time filter parameter           rn_atfp     = ', rn_atfp
444         WRITE(numout,*) '      online coarsening of dynamical fields   ln_crs      = ', ln_crs
445      ENDIF
446      !
447      ! set current model timestep rDt = 2*rn_Dt if MLF or rDt = rn_Dt if RK3
448      rDt   = 2._wp * rn_Dt
449      r1_Dt = 1._wp / rDt
450      !
451      IF( l_SAS .AND. .NOT.ln_linssh ) THEN
452         CALL ctl_warn( 'SAS requires linear ssh : force ln_linssh = T' )
453         ln_linssh = .TRUE.
454      ENDIF
455      !
456#if defined key_qco
457      IF( ln_linssh )   CALL ctl_stop( 'STOP','domain: key_qco and ln_linssh = T are incompatible' )
458#endif
459      !
460      !                       !=======================!
461      !                       !==  namelist namrun  ==!
462      !                       !=======================!
463      !
464      READ  ( numnam_ref, namrun, IOSTAT = ios, ERR = 901)
465901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namrun in reference namelist' )
466      READ  ( numnam_cfg, namrun, IOSTAT = ios, ERR = 902 )
467902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namrun in configuration namelist' )
468      IF(lwm) WRITE ( numond, namrun )
469
470#if defined key_agrif
471      IF( .NOT. Agrif_Root() ) THEN
472            nn_it000 = (Agrif_Parent(nn_it000)-1)*Agrif_IRhot() + 1
473            nn_itend =  Agrif_Parent(nn_itend)   *Agrif_IRhot()
474      ENDIF
475#endif
476      !
477      IF(lwp) THEN                  ! control print
478         WRITE(numout,*) '   Namelist : namrun   ---   run parameters'
479         WRITE(numout,*) '      Assimilation cycle              nn_no           = ', nn_no
480         WRITE(numout,*) '      experiment name for output      cn_exp          = ', TRIM( cn_exp           )
481         WRITE(numout,*) '      file prefix restart input       cn_ocerst_in    = ', TRIM( cn_ocerst_in     )
482         WRITE(numout,*) '      restart input directory         cn_ocerst_indir = ', TRIM( cn_ocerst_indir  )
483         WRITE(numout,*) '      file prefix restart output      cn_ocerst_out   = ', TRIM( cn_ocerst_out    )
484         WRITE(numout,*) '      restart output directory        cn_ocerst_outdir= ', TRIM( cn_ocerst_outdir )
485         WRITE(numout,*) '      restart logical                 ln_rstart       = ', ln_rstart
486         WRITE(numout,*) '      start with forward time step    ln_1st_euler    = ', ln_1st_euler
487         WRITE(numout,*) '      control of time step            nn_rstctl       = ', nn_rstctl
488         WRITE(numout,*) '      number of the first time step   nn_it000        = ', nn_it000
489         WRITE(numout,*) '      number of the last time step    nn_itend        = ', nn_itend
490         WRITE(numout,*) '      initial calendar date aammjj    nn_date0        = ', nn_date0
491         WRITE(numout,*) '      initial time of day in hhmm     nn_time0        = ', nn_time0
492         WRITE(numout,*) '      leap year calendar (0/1)        nn_leapy        = ', nn_leapy
493         WRITE(numout,*) '      initial state output            nn_istate       = ', nn_istate
494         IF( ln_rst_list ) THEN
495            WRITE(numout,*) '      list of restart dump times      nn_stocklist    =', nn_stocklist
496         ELSE
497            WRITE(numout,*) '      frequency of restart file       nn_stock        = ', nn_stock
498         ENDIF
499#if ! defined key_iomput
500         WRITE(numout,*) '      frequency of output file        nn_write        = ', nn_write
501#endif
502         WRITE(numout,*) '      mask land points                ln_mskland      = ', ln_mskland
503         WRITE(numout,*) '      additional CF standard metadata ln_cfmeta       = ', ln_cfmeta
504         WRITE(numout,*) '      overwrite an existing file      ln_clobber      = ', ln_clobber
505         WRITE(numout,*) '      NetCDF chunksize (bytes)        nn_chunksz      = ', nn_chunksz
506         IF( TRIM(Agrif_CFixed()) == '0' ) THEN
507            WRITE(numout,*) '      READ restart for a single file using XIOS ln_xios_read =', ln_xios_read
508            WRITE(numout,*) '      Write restart using XIOS        nn_wxios   = ', nn_wxios
509         ELSE
510            WRITE(numout,*) "      AGRIF: nn_wxios will be ingored. See setting for parent"
511            WRITE(numout,*) "      AGRIF: ln_xios_read will be ingored. See setting for parent"
512         ENDIF
513      ENDIF
514
515      cexper = cn_exp         ! conversion DOCTOR names into model names (this should disappear soon)
516      nrstdt = nn_rstctl
517      nit000 = nn_it000
518      nitend = nn_itend
519      ndate0 = nn_date0
520      nleapy = nn_leapy
521      ninist = nn_istate
522      !
523      !                                        !==  Set parameters for restart reading using xIOS  ==!
524      !
525      IF( TRIM(Agrif_CFixed()) == '0' ) THEN
526         lrxios = ln_xios_read .AND. ln_rstart
527         IF( nn_wxios > 0 )   lwxios = .TRUE.           !* set output file type for XIOS based on NEMO namelist
528         nxioso = nn_wxios
529      ENDIF
530      !                                        !==  Check consistency between ln_rstart and ln_1st_euler  ==!   (i.e. set l_1st_euler)
531      l_1st_euler = ln_1st_euler
532      !
533      IF( ln_rstart ) THEN                              !*  Restart case
534         !
535         IF(lwp) WRITE(numout,*)
536         IF(lwp) WRITE(numout,*) '   open the restart file'
537         CALL rst_read_open                                              !- Open the restart file
538         !
539         IF( iom_varid( numror, 'rdt', ldstop = .FALSE. ) > 0 ) THEN     !- Check time-step consistency and force Euler restart if changed
540            CALL iom_get( numror, 'rdt', zrdt )
541            IF( zrdt /= rn_Dt ) THEN
542               IF(lwp) WRITE( numout,*)
543               IF(lwp) WRITE( numout,*) '   rn_Dt = ', rn_Dt,' not equal to the READ one rdt = ', zrdt
544               IF(lwp) WRITE( numout,*)
545               IF(lwp) WRITE( numout,*) '      ==>>>   forced euler first time-step'
546               l_1st_euler =  .TRUE.
547            ENDIF
548         ENDIF
549         !
550         IF( .NOT.l_SAS .AND. iom_varid( numror, 'sshb', ldstop = .FALSE. ) <= 0 ) THEN   !- Check absence of one of the Kbb field (here sshb)
551            !                                                                             !  (any Kbb field is missing ==> all Kbb fields are missing)
552            IF( .NOT.l_1st_euler ) THEN
553               CALL ctl_warn('dom_nam : ssh at Kbb not found in restart files ',   &
554                  &                        'l_1st_euler forced to .true. and ' ,   &
555                  &                        'ssh(Kbb) = ssh(Kmm) '                  )
556               l_1st_euler = .TRUE.
557            ENDIF
558         ENDIF
559      ELSEIF( .NOT.l_1st_euler ) THEN                   !*  Initialization case
560         IF(lwp) WRITE(numout,*)
561         IF(lwp) WRITE(numout,*)'   ==>>>   Start from rest (ln_rstart=F)'
562         IF(lwp) WRITE(numout,*)'           an Euler initial time step is used : l_1st_euler is forced to .true. '
563         l_1st_euler = .TRUE.
564      ENDIF
565      !
566      !                                        !==  control of output frequency  ==!
567      !
568      IF( .NOT. ln_rst_list ) THEN   ! we use nn_stock
569         IF( nn_stock == -1 )   CALL ctl_warn( 'nn_stock = -1 --> no restart will be done' )
570         IF( nn_stock == 0 .OR. nn_stock > nitend ) THEN
571            WRITE(ctmp1,*) 'nn_stock = ', nn_stock, ' it is forced to ', nitend
572            CALL ctl_warn( ctmp1 )
573            nn_stock = nitend
574         ENDIF
575      ENDIF
576#if ! defined key_iomput
577      IF( nn_write == -1 )   CALL ctl_warn( 'nn_write = -1 --> no output files will be done' )
578      IF ( nn_write == 0 ) THEN
579         WRITE(ctmp1,*) 'nn_write = ', nn_write, ' it is forced to ', nitend
580         CALL ctl_warn( ctmp1 )
581         nn_write = nitend
582      ENDIF
583#endif
584
585      IF( Agrif_Root() ) THEN
586         IF(lwp) WRITE(numout,*)
587         SELECT CASE ( nleapy )                !==  Choose calendar for IOIPSL  ==!
588         CASE (  1 )
589            CALL ioconf_calendar('gregorian')
590            IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "gregorian", i.e. leap year'
591         CASE (  0 )
592            CALL ioconf_calendar('noleap')
593            IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "noleap", i.e. no leap year'
594         CASE ( 30 )
595            CALL ioconf_calendar('360d')
596            IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "360d", i.e. 360 days in a year'
597         END SELECT
598      ENDIF
599      !
600      !                       !========================!
601      !                       !==  namelist namtile  ==!
602      !                       !========================!
603      !
604      READ  ( numnam_ref, namtile, IOSTAT = ios, ERR = 905 )
605905   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namtile in reference namelist' )
606      READ  ( numnam_cfg, namtile, IOSTAT = ios, ERR = 906 )
607906   IF( ios >  0 )   CALL ctl_nam ( ios , 'namtile in configuration namelist' )
608      IF(lwm) WRITE( numond, namtile )
609
610      IF(lwp) THEN
611         WRITE(numout,*)
612         WRITE(numout,*)    '   Namelist : namtile   ---   Domain tiling decomposition'
613         WRITE(numout,*)    '      Tiling (T) or not (F)                ln_tile    = ', ln_tile
614         WRITE(numout,*)    '      Length of tile in i                  nn_ltile_i = ', nn_ltile_i
615         WRITE(numout,*)    '      Length of tile in j                  nn_ltile_j = ', nn_ltile_j
616         WRITE(numout,*)
617         IF( ln_tile ) THEN
618            WRITE(numout,*) '      The domain will be decomposed into tiles of size', nn_ltile_i, 'x', nn_ltile_j
619         ELSE
620            WRITE(numout,*) '      Domain tiling will NOT be used'
621         ENDIF
622      ENDIF
623      !
624#if defined key_netcdf4
625      !                       !=======================!
626      !                       !==  namelist namnc4  ==!   NetCDF 4 case   ("key_netcdf4" defined)
627      !                       !=======================!
628      !
629      READ  ( numnam_ref, namnc4, IOSTAT = ios, ERR = 907)
630907   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namnc4 in reference namelist' )
631      READ  ( numnam_cfg, namnc4, IOSTAT = ios, ERR = 908 )
632908   IF( ios >  0 )   CALL ctl_nam ( ios , 'namnc4 in configuration namelist' )
633      IF(lwm) WRITE( numond, namnc4 )
634
635      IF(lwp) THEN                        ! control print
636         WRITE(numout,*)
637         WRITE(numout,*) '   Namelist namnc4 - Netcdf4 chunking parameters ("key_netcdf4" defined)'
638         WRITE(numout,*) '      number of chunks in i-dimension             nn_nchunks_i = ', nn_nchunks_i
639         WRITE(numout,*) '      number of chunks in j-dimension             nn_nchunks_j = ', nn_nchunks_j
640         WRITE(numout,*) '      number of chunks in k-dimension             nn_nchunks_k = ', nn_nchunks_k
641         WRITE(numout,*) '      apply netcdf4/hdf5 chunking & compression   ln_nc4zip    = ', ln_nc4zip
642      ENDIF
643
644      ! Put the netcdf4 settings into a simple structure (snc4set, defined in in_out_manager module)
645      ! Note the chunk size in the unlimited (time) dimension will be fixed at 1
646      snc4set%ni   = nn_nchunks_i
647      snc4set%nj   = nn_nchunks_j
648      snc4set%nk   = nn_nchunks_k
649      snc4set%luse = ln_nc4zip
650#else
651      snc4set%luse = .FALSE.        ! No NetCDF 4 case
652#endif
653      !
654   END SUBROUTINE dom_nam
655
656
657   SUBROUTINE dom_ctl
658      !!----------------------------------------------------------------------
659      !!                     ***  ROUTINE dom_ctl  ***
660      !!
661      !! ** Purpose :   Domain control.
662      !!
663      !! ** Method  :   compute and print extrema of masked scale factors
664      !!----------------------------------------------------------------------
665      LOGICAL, DIMENSION(jpi,jpj) ::   llmsk
666      INTEGER, DIMENSION(2)       ::   imil, imip, imi1, imi2, imal, imap, ima1, ima2
667      REAL(wp)                    ::   zglmin, zglmax, zgpmin, zgpmax, ze1min, ze1max, ze2min, ze2max
668      !!----------------------------------------------------------------------
669      !
670      llmsk = tmask_h(:,:) == 1._wp
671      !
672      CALL mpp_minloc( 'domain', glamt(:,:), llmsk, zglmin, imil )
673      CALL mpp_minloc( 'domain', gphit(:,:), llmsk, zgpmin, imip )
674      CALL mpp_minloc( 'domain',   e1t(:,:), llmsk, ze1min, imi1 )
675      CALL mpp_minloc( 'domain',   e2t(:,:), llmsk, ze2min, imi2 )
676      CALL mpp_maxloc( 'domain', glamt(:,:), llmsk, zglmax, imal )
677      CALL mpp_maxloc( 'domain', gphit(:,:), llmsk, zgpmax, imap )
678      CALL mpp_maxloc( 'domain',   e1t(:,:), llmsk, ze1max, ima1 )
679      CALL mpp_maxloc( 'domain',   e2t(:,:), llmsk, ze2max, ima2 )
680      !
681      IF(lwp) THEN
682         WRITE(numout,*)
683         WRITE(numout,*) 'dom_ctl : extrema of the masked scale factors'
684         WRITE(numout,*) '~~~~~~~'
685         WRITE(numout,"(14x,'glamt mini: ',1f10.2,' at i = ',i5,' j= ',i5)") zglmin, imil(1), imil(2)
686         WRITE(numout,"(14x,'glamt maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") zglmax, imal(1), imal(2)
687         WRITE(numout,"(14x,'gphit mini: ',1f10.2,' at i = ',i5,' j= ',i5)") zgpmin, imip(1), imip(2)
688         WRITE(numout,"(14x,'gphit maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") zgpmax, imap(1), imap(2)
689         WRITE(numout,"(14x,'  e1t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze1min, imi1(1), imi1(2)
690         WRITE(numout,"(14x,'  e1t maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") ze1max, ima1(1), ima1(2)
691         WRITE(numout,"(14x,'  e2t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2min, imi2(1), imi2(2)
692         WRITE(numout,"(14x,'  e2t maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2max, ima2(1), ima2(2)
693      ENDIF
694      !
695   END SUBROUTINE dom_ctl
696
697
698   SUBROUTINE domain_cfg( cd_cfg, kk_cfg, kpi, kpj, kpk, kperio )
699      !!----------------------------------------------------------------------
700      !!                     ***  ROUTINE domain_cfg  ***
701      !!
702      !! ** Purpose :   read the domain size in domain configuration file
703      !!
704      !! ** Method  :   read the cn_domcfg NetCDF file
705      !!----------------------------------------------------------------------
706      CHARACTER(len=*)              , INTENT(out) ::   cd_cfg          ! configuration name
707      INTEGER                       , INTENT(out) ::   kk_cfg          ! configuration resolution
708      INTEGER                       , INTENT(out) ::   kpi, kpj, kpk   ! global domain sizes
709      INTEGER                       , INTENT(out) ::   kperio          ! lateral global domain b.c.
710      !
711      INTEGER ::   inum   ! local integer
712      REAL(wp) ::   zorca_res                     ! local scalars
713      REAL(wp) ::   zperio                        !   -      -
714      INTEGER, DIMENSION(4) ::   idvar, idimsz    ! size   of dimensions
715      !!----------------------------------------------------------------------
716      !
717      IF(lwp) THEN
718         WRITE(numout,*) '           '
719         WRITE(numout,*) 'domain_cfg : domain size read in ', TRIM( cn_domcfg ), ' file'
720         WRITE(numout,*) '~~~~~~~~~~ '
721      ENDIF
722      !
723      CALL iom_open( cn_domcfg, inum )
724      !
725      !                                   !- ORCA family specificity
726      IF(  iom_varid( inum, 'ORCA'       , ldstop = .FALSE. ) > 0  .AND.  &
727         & iom_varid( inum, 'ORCA_index' , ldstop = .FALSE. ) > 0    ) THEN
728         !
729         cd_cfg = 'ORCA'
730         CALL iom_get( inum, 'ORCA_index', zorca_res )   ;   kk_cfg = NINT( zorca_res )
731         !
732         IF(lwp) THEN
733            WRITE(numout,*) '   .'
734            WRITE(numout,*) '   ==>>>   ORCA configuration '
735            WRITE(numout,*) '   .'
736         ENDIF
737         !
738      ELSE                                !- cd_cfg & k_cfg are not used
739         cd_cfg = 'UNKNOWN'
740         kk_cfg = -9999999
741                                          !- or they may be present as global attributes
742                                          !- (netcdf only)
743         CALL iom_getatt( inum, 'cn_cfg', cd_cfg )  ! returns   !  if not found
744         CALL iom_getatt( inum, 'nn_cfg', kk_cfg )  ! returns -999 if not found
745         IF( TRIM(cd_cfg) == '!') cd_cfg = 'UNKNOWN'
746         IF( kk_cfg == -999     ) kk_cfg = -9999999
747         !
748      ENDIF
749       !
750      idvar = iom_varid( inum, 'e3t_0', kdimsz = idimsz )   ! use e3t_0, that must exist, to get jp(ijk)glo
751      kpi = idimsz(1)
752      kpj = idimsz(2)
753      kpk = idimsz(3)
754      CALL iom_get( inum, 'jperio', zperio )   ;   kperio = NINT( zperio )
755      CALL iom_close( inum )
756      !
757      IF(lwp) THEN
758         WRITE(numout,*) '      cn_cfg = ', TRIM(cd_cfg), '   nn_cfg = ', kk_cfg
759         WRITE(numout,*) '      Ni0glo = ', kpi
760         WRITE(numout,*) '      Nj0glo = ', kpj
761         WRITE(numout,*) '      jpkglo = ', kpk
762         WRITE(numout,*) '      type of global domain lateral boundary   jperio = ', kperio
763      ENDIF
764      !
765   END SUBROUTINE domain_cfg
766
767
768   SUBROUTINE cfg_write
769      !!----------------------------------------------------------------------
770      !!                  ***  ROUTINE cfg_write  ***
771      !!
772      !! ** Purpose :   Create the "cn_domcfg_out" file, a NetCDF file which
773      !!              contains all the ocean domain informations required to
774      !!              define an ocean configuration.
775      !!
776      !! ** Method  :   Write in a file all the arrays required to set up an
777      !!              ocean configuration.
778      !!
779      !! ** output file :   domcfg_out.nc : domain size, characteristics, horizontal
780      !!                       mesh, Coriolis parameter, and vertical scale factors
781      !!                    NB: also contain ORCA family information
782      !!----------------------------------------------------------------------
783      INTEGER           ::   ji, jj, jk   ! dummy loop indices
784      INTEGER           ::   inum     ! local units
785      CHARACTER(len=21) ::   clnam    ! filename (mesh and mask informations)
786      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! workspace
787      !!----------------------------------------------------------------------
788      !
789      IF(lwp) WRITE(numout,*)
790      IF(lwp) WRITE(numout,*) 'cfg_write : create the domain configuration file (', TRIM(cn_domcfg_out),'.nc)'
791      IF(lwp) WRITE(numout,*) '~~~~~~~~~'
792      !
793      !                       ! ============================= !
794      !                       !  create 'domcfg_out.nc' file  !
795      !                       ! ============================= !
796      !
797      clnam = cn_domcfg_out  ! filename (configuration information)
798      CALL iom_open( TRIM(clnam), inum, ldwrt = .TRUE. )
799      !
800      !                             !==  ORCA family specificities  ==!
801      IF( TRIM(cn_cfg) == "orca" .OR. TRIM(cn_cfg) == "ORCA" ) THEN
802         CALL iom_rstput( 0, 0, inum, 'ORCA'      , 1._wp            , ktype = jp_i4 )
803         CALL iom_rstput( 0, 0, inum, 'ORCA_index', REAL( nn_cfg, wp), ktype = jp_i4 )
804      ENDIF
805      !
806      !                             !==  domain characteristics  ==!
807      !
808      !                                   ! lateral boundary of the global domain
809      CALL iom_rstput( 0, 0, inum, 'jperio', REAL( jperio, wp), ktype = jp_i4 )
810      !
811      !                                   ! type of vertical coordinate
812      CALL iom_rstput( 0, 0, inum, 'ln_zco', REAL(COUNT((/ln_zco/)), wp), ktype = jp_i4 )
813      CALL iom_rstput( 0, 0, inum, 'ln_zps', REAL(COUNT((/ln_zps/)), wp), ktype = jp_i4 )
814      CALL iom_rstput( 0, 0, inum, 'ln_sco', REAL(COUNT((/ln_sco/)), wp), ktype = jp_i4 )
815      !
816      !                                   ! ocean cavities under iceshelves
817      CALL iom_rstput( 0, 0, inum, 'ln_isfcav', REAL(COUNT((/ln_isfcav/)), wp), ktype = jp_i4 )
818      !
819      !                             !==  horizontal mesh  !
820      !
821      CALL iom_rstput( 0, 0, inum, 'glamt', glamt, ktype = jp_r8 )   ! latitude
822      CALL iom_rstput( 0, 0, inum, 'glamu', glamu, ktype = jp_r8 )
823      CALL iom_rstput( 0, 0, inum, 'glamv', glamv, ktype = jp_r8 )
824      CALL iom_rstput( 0, 0, inum, 'glamf', glamf, ktype = jp_r8 )
825      !
826      CALL iom_rstput( 0, 0, inum, 'gphit', gphit, ktype = jp_r8 )   ! longitude
827      CALL iom_rstput( 0, 0, inum, 'gphiu', gphiu, ktype = jp_r8 )
828      CALL iom_rstput( 0, 0, inum, 'gphiv', gphiv, ktype = jp_r8 )
829      CALL iom_rstput( 0, 0, inum, 'gphif', gphif, ktype = jp_r8 )
830      !
831      CALL iom_rstput( 0, 0, inum, 'e1t'  , e1t  , ktype = jp_r8 )   ! i-scale factors (e1.)
832      CALL iom_rstput( 0, 0, inum, 'e1u'  , e1u  , ktype = jp_r8 )
833      CALL iom_rstput( 0, 0, inum, 'e1v'  , e1v  , ktype = jp_r8 )
834      CALL iom_rstput( 0, 0, inum, 'e1f'  , e1f  , ktype = jp_r8 )
835      !
836      CALL iom_rstput( 0, 0, inum, 'e2t'  , e2t  , ktype = jp_r8 )   ! j-scale factors (e2.)
837      CALL iom_rstput( 0, 0, inum, 'e2u'  , e2u  , ktype = jp_r8 )
838      CALL iom_rstput( 0, 0, inum, 'e2v'  , e2v  , ktype = jp_r8 )
839      CALL iom_rstput( 0, 0, inum, 'e2f'  , e2f  , ktype = jp_r8 )
840      !
841      CALL iom_rstput( 0, 0, inum, 'ff_f' , ff_f , ktype = jp_r8 )   ! coriolis factor
842      CALL iom_rstput( 0, 0, inum, 'ff_t' , ff_t , ktype = jp_r8 )
843      !
844      !                             !==  vertical mesh  ==!
845      !
846      CALL iom_rstput( 0, 0, inum, 'e3t_1d'  , e3t_1d , ktype = jp_r8 )   ! reference 1D-coordinate
847      CALL iom_rstput( 0, 0, inum, 'e3w_1d'  , e3w_1d , ktype = jp_r8 )
848      !
849      CALL iom_rstput( 0, 0, inum, 'e3t_0'   , e3t_0  , ktype = jp_r8 )   ! vertical scale factors
850      CALL iom_rstput( 0, 0, inum, 'e3u_0'   , e3u_0  , ktype = jp_r8 )
851      CALL iom_rstput( 0, 0, inum, 'e3v_0'   , e3v_0  , ktype = jp_r8 )
852      CALL iom_rstput( 0, 0, inum, 'e3f_0'   , e3f_0  , ktype = jp_r8 )
853      CALL iom_rstput( 0, 0, inum, 'e3w_0'   , e3w_0  , ktype = jp_r8 )
854      CALL iom_rstput( 0, 0, inum, 'e3uw_0'  , e3uw_0 , ktype = jp_r8 )
855      CALL iom_rstput( 0, 0, inum, 'e3vw_0'  , e3vw_0 , ktype = jp_r8 )
856      !
857      !                             !==  wet top and bottom level  ==!   (caution: multiplied by ssmask)
858      !
859      CALL iom_rstput( 0, 0, inum, 'top_level'    , REAL( mikt, wp )*ssmask , ktype = jp_i4 )   ! nb of ocean T-points (ISF)
860      CALL iom_rstput( 0, 0, inum, 'bottom_level' , REAL( mbkt, wp )*ssmask , ktype = jp_i4 )   ! nb of ocean T-points
861      !
862      IF( ln_sco ) THEN             ! s-coordinate: store grid stiffness ratio  (Not required anyway)
863         CALL dom_stiff( z2d )
864         CALL iom_rstput( 0, 0, inum, 'stiffness', z2d )        !    ! Max. grid stiffness ratio
865      ENDIF
866      !
867      IF( ll_wd ) THEN              ! wetting and drying domain
868         CALL iom_rstput( 0, 0, inum, 'ht_0'   , ht_0   , ktype = jp_r8 )
869      ENDIF
870      !
871      ! Add some global attributes ( netcdf only )
872      CALL iom_putatt( inum, 'nn_cfg', nn_cfg )
873      CALL iom_putatt( inum, 'cn_cfg', TRIM(cn_cfg) )
874      !
875      !                                ! ============================
876      !                                !        close the files
877      !                                ! ============================
878      CALL iom_close( inum )
879      !
880   END SUBROUTINE cfg_write
881
882   !!======================================================================
883END MODULE domain
Note: See TracBrowser for help on using the repository browser.