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/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM – NEMO

source: NEMO/branches/2020/dev_r13327_KERNEL-06_2_techene_e3/src/OCE/DOM/domain.F90 @ 13914

Last change on this file since 13914 was 13914, checked in by techene, 3 years ago

#2574 l_1st_euler management in the restart case at a single location : dom_nam

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