source: NEMO/branches/2020/dev_12905_xios_ancil/src/OCE/DOM/domain.F90 @ 13016

Last change on this file since 13016 was 13016, checked in by andmirek, 5 months ago

Ticket #2475 implementation of new interface

  • Property svn:keywords set to Id
File size: 36.0 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   !!----------------------------------------------------------------------
18   
19   !!----------------------------------------------------------------------
20   !!   dom_init      : initialize the space and time domain
21   !!   dom_glo       : initialize global domain <--> local domain indices
22   !!   dom_nam       : read and contral domain namelists
23   !!   dom_ctl       : control print for the ocean domain
24   !!   domain_cfg    : read the global domain size in domain configuration file
25   !!   cfg_write     : create the domain configuration file
26   !!----------------------------------------------------------------------
27   USE oce            ! ocean variables
28   USE dom_oce        ! domain: ocean
29   USE sbc_oce        ! surface boundary condition: ocean
30   USE trc_oce        ! shared ocean & passive tracers variab
31   USE phycst         ! physical constants
32   USE domhgr         ! domain: set the horizontal mesh
33   USE domzgr         ! domain: set the vertical mesh
34   USE dommsk         ! domain: set the mask system
35   USE domwri         ! domain: write the meshmask file
36   USE domvvl         ! variable volume
37   USE c1d            ! 1D configuration
38   USE dyncor_c1d     ! 1D configuration: Coriolis term    (cor_c1d routine)
39   USE wet_dry, ONLY : ll_wd
40   USE closea , ONLY : dom_clo ! closed seas
41   !
42   USE in_out_manager ! I/O manager
43   USE iom            ! I/O library
44   USE lbclnk         ! ocean lateral boundary condition (or mpp link)
45   USE lib_mpp        ! distributed memory computing library
46
47   IMPLICIT NONE
48   PRIVATE
49
50   PUBLIC   dom_init     ! called by nemogcm.F90
51   PUBLIC   domain_cfg   ! called by nemogcm.F90
52
53   !!-------------------------------------------------------------------------
54   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
55   !! $Id$
56   !! Software governed by the CeCILL license (see ./LICENSE)
57   !!-------------------------------------------------------------------------
58CONTAINS
59
60   SUBROUTINE dom_init( Kbb, Kmm, Kaa, cdstr )
61      !!----------------------------------------------------------------------
62      !!                  ***  ROUTINE dom_init  ***
63      !!                   
64      !! ** Purpose :   Domain initialization. Call the routines that are
65      !!              required to create the arrays which define the space
66      !!              and time domain of the ocean model.
67      !!
68      !! ** Method  : - dom_msk: compute the masks from the bathymetry file
69      !!              - dom_hgr: compute or read the horizontal grid-point position
70      !!                         and scale factors, and the coriolis factor
71      !!              - dom_zgr: define the vertical coordinate and the bathymetry
72      !!              - dom_wri: create the meshmask file (ln_meshmask=T)
73      !!              - 1D configuration, move Coriolis, u and v at T-point
74      !!----------------------------------------------------------------------
75      INTEGER          , INTENT(in) :: Kbb, Kmm, Kaa          ! ocean time level indices
76      CHARACTER (len=*), INTENT(in) :: cdstr                  ! model: NEMO or SAS. Determines core restart variables
77      !
78      INTEGER ::   ji, jj, jk, ik   ! dummy loop indices
79      INTEGER ::   iconf = 0    ! local integers
80      CHARACTER (len=64) ::   cform = "(A12, 3(A13, I7))" 
81      INTEGER , DIMENSION(jpi,jpj) ::   ik_top , ik_bot       ! top and bottom ocean level
82      REAL(wp), DIMENSION(jpi,jpj) ::   z1_hu_0, z1_hv_0
83      !!----------------------------------------------------------------------
84      !
85      IF(lwp) THEN         ! Ocean domain Parameters (control print)
86         WRITE(numout,*)
87         WRITE(numout,*) 'dom_init : domain initialization'
88         WRITE(numout,*) '~~~~~~~~'
89         !
90         WRITE(numout,*)     '   Domain info'
91         WRITE(numout,*)     '      dimension of model:'
92         WRITE(numout,*)     '             Local domain      Global domain       Data domain '
93         WRITE(numout,cform) '        ','   jpi     : ', jpi, '   jpiglo  : ', jpiglo
94         WRITE(numout,cform) '        ','   jpj     : ', jpj, '   jpjglo  : ', jpjglo
95         WRITE(numout,cform) '        ','   jpk     : ', jpk, '   jpkglo  : ', jpkglo
96         WRITE(numout,cform) '       ' ,'   jpij    : ', jpij
97         WRITE(numout,*)     '      mpp local domain info (mpp):'
98         WRITE(numout,*)     '              jpni    : ', jpni, '   nn_hls  : ', nn_hls
99         WRITE(numout,*)     '              jpnj    : ', jpnj, '   nn_hls  : ', nn_hls
100         WRITE(numout,*)     '              jpnij   : ', jpnij
101         WRITE(numout,*)     '      lateral boundary of the Global domain : jperio  = ', jperio
102         SELECT CASE ( jperio )
103         CASE( 0 )   ;   WRITE(numout,*) '         (i.e. closed)'
104         CASE( 1 )   ;   WRITE(numout,*) '         (i.e. cyclic east-west)'
105         CASE( 2 )   ;   WRITE(numout,*) '         (i.e. cyclic north-south)'
106         CASE( 3 )   ;   WRITE(numout,*) '         (i.e. north fold with T-point pivot)'
107         CASE( 4 )   ;   WRITE(numout,*) '         (i.e. cyclic east-west and north fold with T-point pivot)'
108         CASE( 5 )   ;   WRITE(numout,*) '         (i.e. north fold with F-point pivot)'
109         CASE( 6 )   ;   WRITE(numout,*) '         (i.e. cyclic east-west and north fold with F-point pivot)'
110         CASE( 7 )   ;   WRITE(numout,*) '         (i.e. cyclic east-west and north-south)'
111         CASE DEFAULT
112            CALL ctl_stop( 'jperio is out of range' )
113         END SELECT
114         WRITE(numout,*)     '      Ocean model configuration used:'
115         WRITE(numout,*)     '         cn_cfg = ', TRIM( cn_cfg ), '   nn_cfg = ', nn_cfg
116      ENDIF
117      lwxios = .FALSE.
118      ln_xios_read = .FALSE.
119      !
120      !           !==  Reference coordinate system  ==!
121      !
122      CALL dom_glo                     ! global domain versus local domain
123      CALL dom_nam                     ! read namelist ( namrun, namdom )
124
125      lcfg_xios = ln_xios_cfg .AND. (.NOT. ln_use_jattr)
126      !
127      IF( lwxios ) THEN
128!define names for restart write and set core output (restart.F90)
129         CALL iom_set_rst_vars(rst_wfields)
130         CALL iom_set_rstw_core(cdstr)
131      ENDIF
132!reset namelist for SAS
133      IF(cdstr == 'SAS') THEN
134         IF(lrxios) THEN
135               IF(lwp) write(numout,*) 'Disable reading restart file using XIOS for SAS'
136               lrxios = .FALSE.
137         ENDIF
138      ENDIF
139      !
140      CALL dom_hgr                      ! Horizontal mesh
141
142      IF( ln_closea ) CALL dom_clo      ! Read in masks to define closed seas and lakes
143
144      CALL dom_zgr( ik_top, ik_bot )    ! Vertical mesh and bathymetry
145
146      CALL dom_msk( ik_top, ik_bot )    ! Masks
147      !
148      ht_0(:,:) = 0._wp  ! Reference ocean thickness
149      hu_0(:,:) = 0._wp
150      hv_0(:,:) = 0._wp
151      DO jk = 1, jpk
152         ht_0(:,:) = ht_0(:,:) + e3t_0(:,:,jk) * tmask(:,:,jk)
153         hu_0(:,:) = hu_0(:,:) + e3u_0(:,:,jk) * umask(:,:,jk)
154         hv_0(:,:) = hv_0(:,:) + e3v_0(:,:,jk) * vmask(:,:,jk)
155      END DO
156      !
157      !           !==  time varying part of coordinate system  ==!
158      !
159      IF( ln_linssh ) THEN       != Fix in time : set to the reference one for all
160      !
161         !       before        !          now          !       after         !
162            gdept(:,:,:,Kbb) = gdept_0  ;   gdept(:,:,:,Kmm) = gdept_0   ;   gdept(:,:,:,Kaa) = gdept_0   ! depth of grid-points
163            gdepw(:,:,:,Kbb) = gdepw_0  ;   gdepw(:,:,:,Kmm) = gdepw_0   ;   gdepw(:,:,:,Kaa) = gdepw_0   !
164                                   gde3w = gde3w_0   !        ---          !
165         !                                                                 
166              e3t(:,:,:,Kbb) =   e3t_0  ;     e3t(:,:,:,Kmm) =   e3t_0   ;   e3t(:,:,:,Kaa) =  e3t_0    ! scale factors
167              e3u(:,:,:,Kbb) =   e3u_0  ;     e3u(:,:,:,Kmm) =   e3u_0   ;   e3u(:,:,:,Kaa) =  e3u_0    !
168              e3v(:,:,:,Kbb) =   e3v_0  ;     e3v(:,:,:,Kmm) =   e3v_0   ;   e3v(:,:,:,Kaa) =  e3v_0    !
169                                     e3f =   e3f_0   !        ---          !
170              e3w(:,:,:,Kbb) =   e3w_0  ;     e3w(:,:,:,Kmm) =   e3w_0   ;    e3w(:,:,:,Kaa) =   e3w_0   !
171             e3uw(:,:,:,Kbb) =  e3uw_0  ;    e3uw(:,:,:,Kmm) =  e3uw_0   ;   e3uw(:,:,:,Kaa) =  e3uw_0   
172             e3vw(:,:,:,Kbb) =  e3vw_0  ;    e3vw(:,:,:,Kmm) =  e3vw_0   ;   e3vw(:,:,:,Kaa) =  e3vw_0   !
173         !
174         z1_hu_0(:,:) = ssumask(:,:) / ( hu_0(:,:) + 1._wp - ssumask(:,:) )     ! _i mask due to ISF
175         z1_hv_0(:,:) = ssvmask(:,:) / ( hv_0(:,:) + 1._wp - ssvmask(:,:) )
176         !
177         !        before       !          now          !       after         !
178                                      ht =    ht_0   !                     ! water column thickness
179               hu(:,:,Kbb) =    hu_0  ;      hu(:,:,Kmm) =    hu_0   ;    hu(:,:,Kaa) =    hu_0   !
180               hv(:,:,Kbb) =    hv_0  ;      hv(:,:,Kmm) =    hv_0   ;    hv(:,:,Kaa) =    hv_0   !
181            r1_hu(:,:,Kbb) = z1_hu_0  ;   r1_hu(:,:,Kmm) = z1_hu_0   ; r1_hu(:,:,Kaa) = z1_hu_0   ! inverse of water column thickness
182            r1_hv(:,:,Kbb) = z1_hv_0  ;   r1_hv(:,:,Kmm) = z1_hv_0   ; r1_hv(:,:,Kaa) = z1_hv_0   !
183         !
184         !
185      ELSE                       != time varying : initialize before/now/after variables
186         !
187         IF( .NOT.l_offline )  CALL dom_vvl_init( Kbb, Kmm, Kaa )
188         !
189      ENDIF
190      !
191      IF( lk_c1d         )   CALL cor_c1d       ! 1D configuration: Coriolis set at T-point
192      !
193      IF( ln_meshmask    )   CALL dom_wri       ! Create a domain file
194      IF( .NOT.ln_rstart )   CALL dom_ctl       ! Domain control
195      !
196      IF( ln_write_cfg   )   CALL cfg_write     ! create the configuration file
197      !
198      IF(lwp) THEN
199         WRITE(numout,*)
200         WRITE(numout,*) 'dom_init :   ==>>>   END of domain initialization'
201         WRITE(numout,*) '~~~~~~~~'
202         WRITE(numout,*) 
203      ENDIF
204      !
205   END SUBROUTINE dom_init
206
207
208   SUBROUTINE dom_glo
209      !!----------------------------------------------------------------------
210      !!                     ***  ROUTINE dom_glo  ***
211      !!
212      !! ** Purpose :   initialization of global domain <--> local domain indices
213      !!
214      !! ** Method  :   
215      !!
216      !! ** Action  : - mig , mjg : local  domain indices ==> global domain indices
217      !!              - mi0 , mi1 : global domain indices ==> local  domain indices
218      !!              - mj0,, mj1   (global point not in the local domain ==> mi0>mi1 and/or mj0>mj1)
219      !!----------------------------------------------------------------------
220      INTEGER ::   ji, jj   ! dummy loop argument
221      !!----------------------------------------------------------------------
222      !
223      DO ji = 1, jpi                 ! local domain indices ==> global domain indices
224        mig(ji) = ji + nimpp - 1
225      END DO
226      DO jj = 1, jpj
227        mjg(jj) = jj + njmpp - 1
228      END DO
229      !                              ! global domain indices ==> local domain indices
230      !                                   ! (return (m.0,m.1)=(1,0) if data domain gridpoint is to the west/south of the
231      !                                   ! local domain, or (m.0,m.1)=(jp.+1,jp.) to the east/north of local domain.
232      DO ji = 1, jpiglo
233        mi0(ji) = MAX( 1 , MIN( ji - nimpp + 1, jpi+1 ) )
234        mi1(ji) = MAX( 0 , MIN( ji - nimpp + 1, jpi   ) )
235      END DO
236      DO jj = 1, jpjglo
237        mj0(jj) = MAX( 1 , MIN( jj - njmpp + 1, jpj+1 ) )
238        mj1(jj) = MAX( 0 , MIN( jj - njmpp + 1, jpj   ) )
239      END DO
240      IF(lwp) THEN                   ! control print
241         WRITE(numout,*)
242         WRITE(numout,*) 'dom_glo : domain: global <<==>> local '
243         WRITE(numout,*) '~~~~~~~ '
244         WRITE(numout,*) '   global domain:   jpiglo = ', jpiglo, ' jpjglo = ', jpjglo, ' jpkglo = ', jpkglo
245         WRITE(numout,*) '   local  domain:   jpi    = ', jpi   , ' jpj    = ', jpj   , ' jpk    = ', jpk
246         WRITE(numout,*)
247         WRITE(numout,*) '   conversion from local to global domain indices (and vise versa) done'
248         IF( nn_print >= 1 ) THEN
249            WRITE(numout,*)
250            WRITE(numout,*) '          conversion local  ==> global i-index domain (mig)'
251            WRITE(numout,25)              (mig(ji),ji = 1,jpi)
252            WRITE(numout,*)
253            WRITE(numout,*) '          conversion global ==> local  i-index domain'
254            WRITE(numout,*) '             starting index (mi0)'
255            WRITE(numout,25)              (mi0(ji),ji = 1,jpiglo)
256            WRITE(numout,*) '             ending index (mi1)'
257            WRITE(numout,25)              (mi1(ji),ji = 1,jpiglo)
258            WRITE(numout,*)
259            WRITE(numout,*) '          conversion local  ==> global j-index domain (mjg)'
260            WRITE(numout,25)              (mjg(jj),jj = 1,jpj)
261            WRITE(numout,*)
262            WRITE(numout,*) '          conversion global ==> local  j-index domain'
263            WRITE(numout,*) '             starting index (mj0)'
264            WRITE(numout,25)              (mj0(jj),jj = 1,jpjglo)
265            WRITE(numout,*) '             ending index (mj1)'
266            WRITE(numout,25)              (mj1(jj),jj = 1,jpjglo)
267         ENDIF
268      ENDIF
269 25   FORMAT( 100(10x,19i4,/) )
270      !
271   END SUBROUTINE dom_glo
272
273
274   SUBROUTINE dom_nam
275      !!----------------------------------------------------------------------
276      !!                     ***  ROUTINE dom_nam  ***
277      !!                   
278      !! ** Purpose :   read domaine namelists and print the variables.
279      !!
280      !! ** input   : - namrun namelist
281      !!              - namdom namelist
282      !!              - namnc4 namelist   ! "key_netcdf4" only
283      !!----------------------------------------------------------------------
284      USE ioipsl
285      !!
286      INTEGER  ::   ios   ! Local integer
287      !
288      NAMELIST/namrun/ cn_ocerst_indir, cn_ocerst_outdir, nn_stocklist, ln_rst_list,                 &
289         &             nn_no   , cn_exp   , cn_ocerst_in, cn_ocerst_out, ln_rstart , nn_rstctl ,     &
290         &             nn_it000, nn_itend , nn_date0    , nn_time0     , nn_leapy  , nn_istate ,     &
291         &             nn_stock, nn_write , ln_mskland  , ln_clobber   , nn_chunksz, ln_1st_euler  , &
292         &             ln_cfmeta, ln_xios_read, nn_wxios
293      NAMELIST/namdom/ ln_linssh, rn_Dt, rn_atfp, ln_crs, ln_meshmask
294#if defined key_netcdf4
295      NAMELIST/namnc4/ nn_nchunks_i, nn_nchunks_j, nn_nchunks_k, ln_nc4zip
296#endif
297      !!----------------------------------------------------------------------
298      !
299      IF(lwp) THEN
300         WRITE(numout,*)
301         WRITE(numout,*) 'dom_nam : domain initialization through namelist read'
302         WRITE(numout,*) '~~~~~~~ '
303      ENDIF
304      !
305      READ  ( numnam_ref, namrun, IOSTAT = ios, ERR = 901)
306901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namrun in reference namelist' )
307      READ  ( numnam_cfg, namrun, IOSTAT = ios, ERR = 902 )
308902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namrun in configuration namelist' )
309      IF(lwm) WRITE ( numond, namrun )
310      !
311      IF(lwp) THEN                  ! control print
312         WRITE(numout,*) '   Namelist : namrun   ---   run parameters'
313         WRITE(numout,*) '      Assimilation cycle              nn_no           = ', nn_no
314         WRITE(numout,*) '      experiment name for output      cn_exp          = ', TRIM( cn_exp           )
315         WRITE(numout,*) '      file prefix restart input       cn_ocerst_in    = ', TRIM( cn_ocerst_in     )
316         WRITE(numout,*) '      restart input directory         cn_ocerst_indir = ', TRIM( cn_ocerst_indir  )
317         WRITE(numout,*) '      file prefix restart output      cn_ocerst_out   = ', TRIM( cn_ocerst_out    )
318         WRITE(numout,*) '      restart output directory        cn_ocerst_outdir= ', TRIM( cn_ocerst_outdir )
319         WRITE(numout,*) '      restart logical                 ln_rstart       = ', ln_rstart
320         WRITE(numout,*) '      start with forward time step    ln_1st_euler    = ', ln_1st_euler
321         WRITE(numout,*) '      control of time step            nn_rstctl       = ', nn_rstctl
322         WRITE(numout,*) '      number of the first time step   nn_it000        = ', nn_it000
323         WRITE(numout,*) '      number of the last time step    nn_itend        = ', nn_itend
324         WRITE(numout,*) '      initial calendar date aammjj    nn_date0        = ', nn_date0
325         WRITE(numout,*) '      initial time of day in hhmm     nn_time0        = ', nn_time0
326         WRITE(numout,*) '      leap year calendar (0/1)        nn_leapy        = ', nn_leapy
327         WRITE(numout,*) '      initial state output            nn_istate       = ', nn_istate
328         IF( ln_rst_list ) THEN
329            WRITE(numout,*) '      list of restart dump times      nn_stocklist    =', nn_stocklist
330         ELSE
331            WRITE(numout,*) '      frequency of restart file       nn_stock        = ', nn_stock
332         ENDIF
333#if ! defined key_iomput
334         WRITE(numout,*) '      frequency of output file        nn_write        = ', nn_write
335#endif
336         WRITE(numout,*) '      mask land points                ln_mskland      = ', ln_mskland
337         WRITE(numout,*) '      additional CF standard metadata ln_cfmeta       = ', ln_cfmeta
338         WRITE(numout,*) '      overwrite an existing file      ln_clobber      = ', ln_clobber
339         WRITE(numout,*) '      NetCDF chunksize (bytes)        nn_chunksz      = ', nn_chunksz
340         IF( TRIM(Agrif_CFixed()) == '0' ) THEN
341            WRITE(numout,*) '      READ restart for a single file using XIOS ln_xios_read =', ln_xios_read
342            WRITE(numout,*) '      Write restart using XIOS        nn_wxios   = ', nn_wxios
343            WRITE(numout,*) '      READ config using XIOS          ln_xios_cfg  = ', ln_xios_cfg
344         ELSE
345            WRITE(numout,*) "      AGRIF: nn_wxios will be ingored. See setting for parent"
346            WRITE(numout,*) "      AGRIF: ln_xios_read will be ingored. See setting for parent"
347         ENDIF
348      ENDIF
349
350      cexper = cn_exp         ! conversion DOCTOR names into model names (this should disappear soon)
351      nrstdt = nn_rstctl
352      nit000 = nn_it000
353      nitend = nn_itend
354      ndate0 = nn_date0
355      nleapy = nn_leapy
356      ninist = nn_istate
357      l_1st_euler = ln_1st_euler
358      IF( .NOT. l_1st_euler .AND. .NOT. ln_rstart ) THEN
359         IF(lwp) WRITE(numout,*) 
360         IF(lwp) WRITE(numout,*)'   ==>>>   Start from rest (ln_rstart=F)'
361         IF(lwp) WRITE(numout,*)'           an Euler initial time step is used : l_1st_euler is forced to .true. '   
362         l_1st_euler = .true.
363      ENDIF
364      !                             ! control of output frequency
365      IF( .NOT. ln_rst_list ) THEN     ! we use nn_stock
366         IF( nn_stock == -1 )   CALL ctl_warn( 'nn_stock = -1 --> no restart will be done' )
367         IF( nn_stock == 0 .OR. nn_stock > nitend ) THEN
368            WRITE(ctmp1,*) 'nn_stock = ', nn_stock, ' it is forced to ', nitend
369            CALL ctl_warn( ctmp1 )
370            nn_stock = nitend
371         ENDIF
372      ENDIF
373#if ! defined key_iomput
374      IF( nn_write == -1 )   CALL ctl_warn( 'nn_write = -1 --> no output files will be done' )
375      IF ( nn_write == 0 ) THEN
376         WRITE(ctmp1,*) 'nn_write = ', nn_write, ' it is forced to ', nitend
377         CALL ctl_warn( ctmp1 )
378         nn_write = nitend
379      ENDIF
380#endif
381
382#if defined key_agrif
383      IF( Agrif_Root() ) THEN
384#endif
385      IF(lwp) WRITE(numout,*)
386      SELECT CASE ( nleapy )        ! Choose calendar for IOIPSL
387      CASE (  1 ) 
388         CALL ioconf_calendar('gregorian')
389         IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "gregorian", i.e. leap year'
390      CASE (  0 )
391         CALL ioconf_calendar('noleap')
392         IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "noleap", i.e. no leap year'
393      CASE ( 30 )
394         CALL ioconf_calendar('360d')
395         IF(lwp) WRITE(numout,*) '   ==>>>   The IOIPSL calendar is "360d", i.e. 360 days in a year'
396      END SELECT
397#if defined key_agrif
398      ENDIF
399#endif
400
401      READ  ( numnam_ref, namdom, IOSTAT = ios, ERR = 903)
402903   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namdom in reference namelist' )
403      READ  ( numnam_cfg, namdom, IOSTAT = ios, ERR = 904 )
404904   IF( ios >  0 )   CALL ctl_nam ( ios , 'namdom in configuration namelist' )
405      IF(lwm) WRITE( numond, namdom )
406      !
407      IF(lwp) THEN
408         WRITE(numout,*)
409         WRITE(numout,*) '   Namelist : namdom   ---   space & time domain'
410         WRITE(numout,*) '      linear free surface (=T)                ln_linssh   = ', ln_linssh
411         WRITE(numout,*) '      create mesh/mask file                   ln_meshmask = ', ln_meshmask
412         WRITE(numout,*) '      ocean time step                         rn_Dt       = ', rn_Dt
413         WRITE(numout,*) '      asselin time filter parameter           rn_atfp     = ', rn_atfp
414         WRITE(numout,*) '      online coarsening of dynamical fields   ln_crs      = ', ln_crs
415      ENDIF
416      !
417      !! Initialise current model timestep rDt = 2*rn_Dt if MLF or rDt = rn_Dt if RK3
418      rDt  = 2._wp * rn_Dt
419      r1_Dt = 1._wp / rDt
420
421      IF( TRIM(Agrif_CFixed()) == '0' ) THEN
422         lrxios = ln_xios_read.AND.ln_rstart
423!set output file type for XIOS based on NEMO namelist
424         IF (nn_wxios > 0) lwxios = .TRUE. 
425         nxioso = nn_wxios
426      ENDIF
427
428#if defined key_netcdf4
429      !                             ! NetCDF 4 case   ("key_netcdf4" defined)
430      READ  ( numnam_ref, namnc4, IOSTAT = ios, ERR = 907)
431907   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namnc4 in reference namelist' )
432      READ  ( numnam_cfg, namnc4, IOSTAT = ios, ERR = 908 )
433908   IF( ios >  0 )   CALL ctl_nam ( ios , 'namnc4 in configuration namelist' )
434      IF(lwm) WRITE( numond, namnc4 )
435
436      IF(lwp) THEN                        ! control print
437         WRITE(numout,*)
438         WRITE(numout,*) '   Namelist namnc4 - Netcdf4 chunking parameters'
439         WRITE(numout,*) '      number of chunks in i-dimension             nn_nchunks_i = ', nn_nchunks_i
440         WRITE(numout,*) '      number of chunks in j-dimension             nn_nchunks_j = ', nn_nchunks_j
441         WRITE(numout,*) '      number of chunks in k-dimension             nn_nchunks_k = ', nn_nchunks_k
442         WRITE(numout,*) '      apply netcdf4/hdf5 chunking & compression   ln_nc4zip    = ', ln_nc4zip
443      ENDIF
444
445      ! Put the netcdf4 settings into a simple structure (snc4set, defined in in_out_manager module)
446      ! Note the chunk size in the unlimited (time) dimension will be fixed at 1
447      snc4set%ni   = nn_nchunks_i
448      snc4set%nj   = nn_nchunks_j
449      snc4set%nk   = nn_nchunks_k
450      snc4set%luse = ln_nc4zip
451#else
452      snc4set%luse = .FALSE.        ! No NetCDF 4 case
453#endif
454      !
455   END SUBROUTINE dom_nam
456
457
458   SUBROUTINE dom_ctl
459      !!----------------------------------------------------------------------
460      !!                     ***  ROUTINE dom_ctl  ***
461      !!
462      !! ** Purpose :   Domain control.
463      !!
464      !! ** Method  :   compute and print extrema of masked scale factors
465      !!----------------------------------------------------------------------
466      INTEGER, DIMENSION(2) ::   imi1, imi2, ima1, ima2
467      INTEGER, DIMENSION(2) ::   iloc   !
468      REAL(wp) ::   ze1min, ze1max, ze2min, ze2max
469      !!----------------------------------------------------------------------
470      !
471      IF(lk_mpp) THEN
472         CALL mpp_minloc( 'domain', e1t(:,:), tmask_i(:,:), ze1min, imi1 )
473         CALL mpp_minloc( 'domain', e2t(:,:), tmask_i(:,:), ze2min, imi2 )
474         CALL mpp_maxloc( 'domain', e1t(:,:), tmask_i(:,:), ze1max, ima1 )
475         CALL mpp_maxloc( 'domain', e2t(:,:), tmask_i(:,:), ze2max, ima2 )
476      ELSE
477         ze1min = MINVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp )   
478         ze2min = MINVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp )   
479         ze1max = MAXVAL( e1t(:,:), mask = tmask_i(:,:) == 1._wp )   
480         ze2max = MAXVAL( e2t(:,:), mask = tmask_i(:,:) == 1._wp )   
481         !
482         iloc  = MINLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp )
483         imi1(1) = iloc(1) + nimpp - 1
484         imi1(2) = iloc(2) + njmpp - 1
485         iloc  = MINLOC( e2t(:,:), mask = tmask_i(:,:) == 1._wp )
486         imi2(1) = iloc(1) + nimpp - 1
487         imi2(2) = iloc(2) + njmpp - 1
488         iloc  = MAXLOC( e1t(:,:), mask = tmask_i(:,:) == 1._wp )
489         ima1(1) = iloc(1) + nimpp - 1
490         ima1(2) = iloc(2) + njmpp - 1
491         iloc  = MAXLOC( e2t(:,:), mask = tmask_i(:,:) == 1._wp )
492         ima2(1) = iloc(1) + nimpp - 1
493         ima2(2) = iloc(2) + njmpp - 1
494      ENDIF
495      IF(lwp) THEN
496         WRITE(numout,*)
497         WRITE(numout,*) 'dom_ctl : extrema of the masked scale factors'
498         WRITE(numout,*) '~~~~~~~'
499         WRITE(numout,"(14x,'e1t maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") ze1max, ima1(1), ima1(2)
500         WRITE(numout,"(14x,'e1t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze1min, imi1(1), imi1(2)
501         WRITE(numout,"(14x,'e2t maxi: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2max, ima2(1), ima2(2)
502         WRITE(numout,"(14x,'e2t mini: ',1f10.2,' at i = ',i5,' j= ',i5)") ze2min, imi2(1), imi2(2)
503      ENDIF
504      !
505   END SUBROUTINE dom_ctl
506
507
508   SUBROUTINE domain_cfg( cd_cfg, kk_cfg, kpi, kpj, kpk, kperio )
509      !!----------------------------------------------------------------------
510      !!                     ***  ROUTINE dom_nam  ***
511      !!                   
512      !! ** Purpose :   read the domain size in domain configuration file
513      !!
514      !! ** Method  :   read the cn_domcfg NetCDF file
515      !!----------------------------------------------------------------------
516      CHARACTER(len=*)              , INTENT(out) ::   cd_cfg          ! configuration name
517      INTEGER                       , INTENT(out) ::   kk_cfg          ! configuration resolution
518      INTEGER                       , INTENT(out) ::   kpi, kpj, kpk   ! global domain sizes
519      INTEGER                       , INTENT(out) ::   kperio          ! lateral global domain b.c.
520      !
521      INTEGER ::   inum   ! local integer
522      REAL(wp) ::   zorca_res                     ! local scalars
523      REAL(wp) ::   zperio                        !   -      -
524      INTEGER, DIMENSION(4) ::   idvar, idimsz    ! size   of dimensions
525      !!----------------------------------------------------------------------
526      !
527      IF(lwp) THEN
528         WRITE(numout,*) '           '
529         WRITE(numout,*) 'domain_cfg : domain size read in ', TRIM( cn_domcfg ), ' file'
530         WRITE(numout,*) '~~~~~~~~~~ '
531      ENDIF
532      !
533      CALL iom_open( cn_domcfg, inum )
534      !
535      !                                   !- ORCA family specificity
536      IF(  iom_varid( inum, 'ORCA'       , ldstop = .FALSE. ) > 0  .AND.  &
537         & iom_varid( inum, 'ORCA_index' , ldstop = .FALSE. ) > 0    ) THEN
538         !
539         cd_cfg = 'ORCA'
540         CALL iom_get( inum, 'ORCA_index', zorca_res )   ;   kk_cfg = NINT( zorca_res )
541         !
542         IF(lwp) THEN
543            WRITE(numout,*) '   .'
544            WRITE(numout,*) '   ==>>>   ORCA configuration '
545            WRITE(numout,*) '   .'
546         ENDIF
547         !
548      ELSE                                !- cd_cfg & k_cfg are not used
549         cd_cfg = 'UNKNOWN'
550         kk_cfg = -9999999
551                                          !- or they may be present as global attributes
552                                          !- (netcdf only) 
553         CALL iom_getatt( inum, 'cn_cfg', cd_cfg )  ! returns   !  if not found
554         CALL iom_getatt( inum, 'nn_cfg', kk_cfg )  ! returns -999 if not found
555         IF( TRIM(cd_cfg) == '!') cd_cfg = 'UNKNOWN'
556         IF( kk_cfg == -999     ) kk_cfg = -9999999
557         !
558      ENDIF
559       !
560      idvar = iom_varid( inum, 'e3t_0', kdimsz = idimsz )   ! use e3t_0, that must exist, to get jp(ijk)glo
561      kpi = idimsz(1)
562      kpj = idimsz(2)
563      kpk = idimsz(3)
564      CALL iom_get( inum, 'jperio', zperio )   ;   kperio = NINT( zperio )
565      CALL iom_close( inum )
566      !
567      IF(lwp) THEN
568         WRITE(numout,*) '      cn_cfg = ', TRIM(cd_cfg), '   nn_cfg = ', kk_cfg
569         WRITE(numout,*) '      jpiglo = ', kpi
570         WRITE(numout,*) '      jpjglo = ', kpj
571         WRITE(numout,*) '      jpkglo = ', kpk
572         WRITE(numout,*) '      type of global domain lateral boundary   jperio = ', kperio
573      ENDIF
574      !       
575   END SUBROUTINE domain_cfg
576   
577   
578   SUBROUTINE cfg_write
579      !!----------------------------------------------------------------------
580      !!                  ***  ROUTINE cfg_write  ***
581      !!                   
582      !! ** Purpose :   Create the "cn_domcfg_out" file, a NetCDF file which
583      !!              contains all the ocean domain informations required to
584      !!              define an ocean configuration.
585      !!
586      !! ** Method  :   Write in a file all the arrays required to set up an
587      !!              ocean configuration.
588      !!
589      !! ** output file :   domcfg_out.nc : domain size, characteristics, horizontal
590      !!                       mesh, Coriolis parameter, and vertical scale factors
591      !!                    NB: also contain ORCA family information
592      !!----------------------------------------------------------------------
593      INTEGER           ::   ji, jj, jk   ! dummy loop indices
594      INTEGER           ::   izco, izps, isco, icav
595      INTEGER           ::   inum     ! local units
596      CHARACTER(len=21) ::   clnam    ! filename (mesh and mask informations)
597      REAL(wp), DIMENSION(jpi,jpj) ::   z2d   ! workspace
598      !!----------------------------------------------------------------------
599      !
600      IF(lwp) WRITE(numout,*)
601      IF(lwp) WRITE(numout,*) 'cfg_write : create the domain configuration file (', TRIM(cn_domcfg_out),'.nc)'
602      IF(lwp) WRITE(numout,*) '~~~~~~~~~'
603      !
604      !                       ! ============================= !
605      !                       !  create 'domcfg_out.nc' file  !
606      !                       ! ============================= !
607      !         
608      clnam = cn_domcfg_out  ! filename (configuration information)
609      CALL iom_open( TRIM(clnam), inum, ldwrt = .TRUE. )
610     
611      !
612      !                             !==  ORCA family specificities  ==!
613      IF( cn_cfg == "ORCA" ) THEN
614         CALL iom_rstput( 0, 0, inum, 'ORCA'      , 1._wp            , ktype = jp_i4 )
615         CALL iom_rstput( 0, 0, inum, 'ORCA_index', REAL( nn_cfg, wp), ktype = jp_i4 )         
616      ENDIF
617      !
618      !                             !==  global domain size  ==!
619      !
620      CALL iom_rstput( 0, 0, inum, 'jpiglo', REAL( jpiglo, wp), ktype = jp_i4 )
621      CALL iom_rstput( 0, 0, inum, 'jpjglo', REAL( jpjglo, wp), ktype = jp_i4 )
622      CALL iom_rstput( 0, 0, inum, 'jpkglo', REAL( jpk   , wp), ktype = jp_i4 )
623      !
624      !                             !==  domain characteristics  ==!
625      !
626      !                                   ! lateral boundary of the global domain
627      CALL iom_rstput( 0, 0, inum, 'jperio', REAL( jperio, wp), ktype = jp_i4 )
628      !
629      !                                   ! type of vertical coordinate
630      IF( ln_zco    ) THEN   ;   izco = 1   ;   ELSE   ;   izco = 0   ;   ENDIF
631      IF( ln_zps    ) THEN   ;   izps = 1   ;   ELSE   ;   izps = 0   ;   ENDIF
632      IF( ln_sco    ) THEN   ;   isco = 1   ;   ELSE   ;   isco = 0   ;   ENDIF
633      CALL iom_rstput( 0, 0, inum, 'ln_zco'   , REAL( izco, wp), ktype = jp_i4 )
634      CALL iom_rstput( 0, 0, inum, 'ln_zps'   , REAL( izps, wp), ktype = jp_i4 )
635      CALL iom_rstput( 0, 0, inum, 'ln_sco'   , REAL( isco, wp), ktype = jp_i4 )
636      !
637      !                                   ! ocean cavities under iceshelves
638      IF( ln_isfcav ) THEN   ;   icav = 1   ;   ELSE   ;   icav = 0   ;   ENDIF
639      CALL iom_rstput( 0, 0, inum, 'ln_isfcav', REAL( icav, wp), ktype = jp_i4 )
640      !
641      !                             !==  horizontal mesh  !
642      !
643      CALL iom_rstput( 0, 0, inum, 'glamt', glamt, ktype = jp_r8 )   ! latitude
644      CALL iom_rstput( 0, 0, inum, 'glamu', glamu, ktype = jp_r8 )
645      CALL iom_rstput( 0, 0, inum, 'glamv', glamv, ktype = jp_r8 )
646      CALL iom_rstput( 0, 0, inum, 'glamf', glamf, ktype = jp_r8 )
647      !                               
648      CALL iom_rstput( 0, 0, inum, 'gphit', gphit, ktype = jp_r8 )   ! longitude
649      CALL iom_rstput( 0, 0, inum, 'gphiu', gphiu, ktype = jp_r8 )
650      CALL iom_rstput( 0, 0, inum, 'gphiv', gphiv, ktype = jp_r8 )
651      CALL iom_rstput( 0, 0, inum, 'gphif', gphif, ktype = jp_r8 )
652      !                               
653      CALL iom_rstput( 0, 0, inum, 'e1t'  , e1t  , ktype = jp_r8 )   ! i-scale factors (e1.)
654      CALL iom_rstput( 0, 0, inum, 'e1u'  , e1u  , ktype = jp_r8 )
655      CALL iom_rstput( 0, 0, inum, 'e1v'  , e1v  , ktype = jp_r8 )
656      CALL iom_rstput( 0, 0, inum, 'e1f'  , e1f  , ktype = jp_r8 )
657      !
658      CALL iom_rstput( 0, 0, inum, 'e2t'  , e2t  , ktype = jp_r8 )   ! j-scale factors (e2.)
659      CALL iom_rstput( 0, 0, inum, 'e2u'  , e2u  , ktype = jp_r8 )
660      CALL iom_rstput( 0, 0, inum, 'e2v'  , e2v  , ktype = jp_r8 )
661      CALL iom_rstput( 0, 0, inum, 'e2f'  , e2f  , ktype = jp_r8 )
662      !
663      CALL iom_rstput( 0, 0, inum, 'ff_f' , ff_f , ktype = jp_r8 )   ! coriolis factor
664      CALL iom_rstput( 0, 0, inum, 'ff_t' , ff_t , ktype = jp_r8 )
665      !
666      !                             !==  vertical mesh  ==!
667      !                                                     
668      CALL iom_rstput( 0, 0, inum, 'e3t_1d'  , e3t_1d , ktype = jp_r8 )   ! reference 1D-coordinate
669      CALL iom_rstput( 0, 0, inum, 'e3w_1d'  , e3w_1d , ktype = jp_r8 )
670      !
671      CALL iom_rstput( 0, 0, inum, 'e3t_0'   , e3t_0  , ktype = jp_r8 )   ! vertical scale factors
672      CALL iom_rstput( 0, 0, inum, 'e3u_0'   , e3u_0  , ktype = jp_r8 )
673      CALL iom_rstput( 0, 0, inum, 'e3v_0'   , e3v_0  , ktype = jp_r8 )
674      CALL iom_rstput( 0, 0, inum, 'e3f_0'   , e3f_0  , ktype = jp_r8 )
675      CALL iom_rstput( 0, 0, inum, 'e3w_0'   , e3w_0  , ktype = jp_r8 )
676      CALL iom_rstput( 0, 0, inum, 'e3uw_0'  , e3uw_0 , ktype = jp_r8 )
677      CALL iom_rstput( 0, 0, inum, 'e3vw_0'  , e3vw_0 , ktype = jp_r8 )
678      !                                         
679      !                             !==  wet top and bottom level  ==!   (caution: multiplied by ssmask)
680      !
681      CALL iom_rstput( 0, 0, inum, 'top_level'    , REAL( mikt, wp )*ssmask , ktype = jp_i4 )   ! nb of ocean T-points (ISF)
682      CALL iom_rstput( 0, 0, inum, 'bottom_level' , REAL( mbkt, wp )*ssmask , ktype = jp_i4 )   ! nb of ocean T-points
683      !
684      IF( ln_sco ) THEN             ! s-coordinate: store grid stiffness ratio  (Not required anyway)
685         CALL dom_stiff( z2d )
686         CALL iom_rstput( 0, 0, inum, 'stiffness', z2d )        !    ! Max. grid stiffness ratio
687      ENDIF
688      !
689      IF( ll_wd ) THEN              ! wetting and drying domain
690         CALL iom_rstput( 0, 0, inum, 'ht_0'   , ht_0   , ktype = jp_r8 )
691      ENDIF
692      !
693      ! Add some global attributes ( netcdf only )
694      CALL iom_putatt( inum, 'nn_cfg', nn_cfg )
695      CALL iom_putatt( inum, 'cn_cfg', TRIM(cn_cfg) )
696      !
697      !                                ! ============================
698      !                                !        close the files
699      !                                ! ============================
700      CALL iom_close( inum )
701      !
702   END SUBROUTINE cfg_write
703
704   !!======================================================================
705END MODULE domain
Note: See TracBrowser for help on using the repository browser.