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.
ioncdf.F90 in branches/UKMO/r6232_tracer_advection/NEMOGCM/TOOLS/OBSTOOLS/src – NEMO

source: branches/UKMO/r6232_tracer_advection/NEMOGCM/TOOLS/OBSTOOLS/src/ioncdf.F90 @ 9295

Last change on this file since 9295 was 3000, checked in by djlea, 13 years ago

Updated obstools. Addition of headers to programs which explain what each utility does and how to run it. All the programs now build using the naketools utility.

File size: 189.4 KB
Line 
1#define __MYFILE__ 'ioncdf.F90'
2MODULE ioncdf
3   !!======================================================================
4   !!                       ***  MODULE  ioncdf  ***
5   !! Input/Output: manage netcdf inputs/outputs
6   !!=====================================================================
7
8   !!----------------------------------------------------------------------
9   !!   ioncdf     : manage netcdf inputs/outputs
10   !!       put_map      : write a 2d/3d map
11   !!       put_scalar   : write a scalar
12   !!       test_var     : test if variable exists
13   !!       get_nb_dim   : get dimension number of a variable
14   !!       get_dim_val  : get dimensions values of a variable
15   !!       get_var      : read a 1d/2d/3d/4d array
16   !!       put_coord    : write coordinates
17   !!       create_map   : create map netcdf file
18   !!       put_att      : write CF attributes
19   !!       get_var_info : get CF attributes
20   !!  Original    : Nicolas Daget
21   !!  Modified      : MAB (nf90)
22   !!---------------------------------------------------------------------
23   !! * Modules used
24   USE toolspar_kind
25   USE netcdf
26   USE nctools
27
28   IMPLICIT NONE
29   PRIVATE
30
31   !! * Routine accessibility
32   PUBLIC :: put_coord, put_map, get_var, test_var, put_scalar, get_nb_dim, &
33             get_dim_val, get_scalar
34
35   !! * Substitutions
36
37   !! * Interface
38   INTERFACE put_coord
39     MODULE PROCEDURE put_coord_r, put_coord_d
40   END INTERFACE
41
42   INTERFACE put_map
43     MODULE PROCEDURE put_map_2d_r, put_map_3d_r, put_map_2d_d, put_map_3d_d
44   END INTERFACE
45
46   INTERFACE put_scalar
47     MODULE PROCEDURE put_scalar_i,  put_scalar_r,  put_scalar_d
48   END INTERFACE
49
50   INTERFACE get_var
51     MODULE PROCEDURE get_var_1d_r, get_var_2d_r, get_var_3d_r, get_var_4d_r, &
52                      get_var_1d_d, get_var_2d_d, get_var_3d_d, get_var_4d_d, &
53                      get_var_1d_i, get_var_2d_i, get_var_3d_i, get_var_4d_i
54   END INTERFACE
55
56   INTERFACE get_scalar
57     MODULE PROCEDURE get_scalar_i,  get_scalar_r,  get_scalar_d
58   END INTERFACE
59
60CONTAINS
61
62   SUBROUTINE test_var ( cd_filename, cd_var, k_test )
63      !!----------------------------------------------------------------------
64      !!                ***  ROUTINE test_var  ***
65      !!
66      !! ** Purpose :  test if cd_var exists
67      !!
68      !! ** Method  : use netcdf fortran library
69      !!       
70      !! ** Action : - get variable informations
71      !!
72      !! Reference :
73      !!     
74      !! History :
75      !!    06-05  (N. Daget)  original code
76      !!----------------------------------------------------------------------
77      !! * Modules used
78
79      !! * Library used
80
81
82      !! * arguments
83      CHARACTER(len=80), INTENT(in)               :: &
84         cd_filename                                   ! filename
85      CHARACTER(len=80), OPTIONAL, INTENT(in)     :: &
86         cd_var                                        ! variable name
87      INTEGER, INTENT(out)                        :: &
88         k_test                                        ! test if variable exists
89
90      !! * local declarations
91      INTEGER               ::                     &
92         i_file_id, i_var_id                           ! file and variable identifier
93      !!----------------------------------------------------------------------
94
95      ! Open and test netcdf file
96      ! -------------------------
97      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ),&
98         & __LINE__,__MYFILE__)
99      k_test = nf90_inq_varid( i_file_id, cd_var, i_var_id )
100      CALL nchdlerr( nf90_close( i_file_id ),&
101         & __LINE__,__MYFILE__)
102
103      IF ( k_test .EQ. nf90_noerr  ) THEN
104         k_test = 1
105      ELSE
106         k_test = 0
107      ENDIF
108
109   END SUBROUTINE test_var
110   SUBROUTINE get_nb_dim ( cd_filename, cd_var, k_nb_dim )
111      !!----------------------------------------------------------------------
112      !!                ***  ROUTINE get_nb_dim  ***
113      !!
114      !! ** Purpose :  Get dimension number of variable
115      !!
116      !! ** Method  : use netcdf fortran library
117      !!
118      !! ** Action : - get dimension number of variables
119      !!
120      !! Reference :
121      !!
122      !! History :
123      !!    06-06  (N. Daget)  original code
124      !!----------------------------------------------------------------------
125      !! * Modules used
126
127      !! * Library used
128
129
130      !! * arguments
131      CHARACTER(len=80), INTENT(in)               :: &
132         cd_filename                                   ! filename
133      CHARACTER(len=80), OPTIONAL, INTENT(in)     :: &
134         cd_var                                        ! variable name
135      INTEGER, INTENT(out)                        :: &
136         k_nb_dim                                      ! c$dimension number of variable
137
138      !! * local declarations
139      INTEGER               ::                     &
140         i_file_id, i_var_id                           ! file and variable identifier
141      !!----------------------------------------------------------------------
142
143      ! Open and test netcdf file
144      ! -------------------------
145      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
146         & __LINE__,__MYFILE__)
147      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
148         & __LINE__,__MYFILE__)
149      CALL nchdlerr(nf90_inquire_variable( i_file_id, i_var_id, ndims=k_nb_dim ),&
150         & __LINE__,__MYFILE__)
151      CALL nchdlerr( nf90_close( i_file_id ),&
152         & __LINE__,__MYFILE__) 
153   END SUBROUTINE get_nb_dim
154
155   SUBROUTINE get_dim_val ( cd_filename, cd_var, k_dim )
156      !!----------------------------------------------------------------------
157      !!                ***  ROUTINE get_dim_val  ***
158      !!
159      !! ** Purpose :  Get dimensions values of a variable
160      !!
161      !! ** Method  : use netcdf fortran library
162      !!
163      !! ** Action : - get dimensions values of a variable
164      !!
165      !! Reference :
166      !!
167      !! History :
168      !!    06-06  (N. Daget)  original code
169      !!----------------------------------------------------------------------
170      !! * Modules used
171
172      !! * Library used
173
174
175      !! * arguments
176      CHARACTER(len=80), INTENT(in)               :: &
177         cd_filename                                   ! filename
178      CHARACTER(len=80), OPTIONAL, INTENT(in)     :: &
179         cd_var                                        ! variable name
180      INTEGER, DIMENSION(:), INTENT(out)          :: &
181         k_dim                                         ! dimensions values of a variable
182
183      !! * local declarations
184      INTEGER, DIMENSION(1) :: i_nbdim                 ! dimensions of the variable
185      INTEGER               ::                       &
186         i_file_id, i_var_id,                        & ! file and variable identifier
187         ii                                     ! counter
188      !!----------------------------------------------------------------------
189
190      ! Open and test netcdf file
191      ! -------------------------
192      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
193         & __LINE__,__MYFILE__)
194      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
195         & __LINE__,__MYFILE__)
196      CALL nchdlerr(nf90_inquire_variable( i_file_id, i_var_id, dimids=k_dim ) ,&
197         & __LINE__,__MYFILE__)
198      i_nbdim = SHAPE( k_dim )
199      DO ii =  1, i_nbdim(1)
200         CALL nchdlerr( nf90_inquire_dimension( i_file_id, k_dim(ii), len=k_dim(ii) ),__LINE__,__MYFILE__ )
201      ENDDO
202      CALL nchdlerr( nf90_close( i_file_id ) ,&
203         & __LINE__,__MYFILE__)
204
205   END SUBROUTINE get_dim_val
206
207   !!======================================================================
208
209   SUBROUTINE get_scalar_i ( cd_filename, cd_var, k_var )
210      !!----------------------------------------------------------------------
211      !!                ***  ROUTINE get_scalar_i  ***
212      !!
213      !! ** Purpose :  read integer scalar in a netcdf file
214      !!
215      !! ** Method  : use netcdf fortran library
216      !!
217      !! ** Action : - get variable informations
218      !!             - read variable
219      !!
220      !! Reference :
221      !!
222      !! History :
223      !!    06-09  (N. Daget)  original code
224      !!----------------------------------------------------------------------
225      !! * Modules used
226
227      !! * Library used
228
229      !! * arguments
230      CHARACTER(len=80), INTENT(in)            :: &
231         cd_filename                                   ! filename
232      CHARACTER(len=80), INTENT(in)            :: &
233         cd_var                                        ! variable name
234      INTEGER, INTENT(out)                     :: &
235         k_var                                         ! variable to read in netcdf file
236
237      !! * local declarations
238      INTEGER               ::                     &
239         i_file_id, i_var_id,                      &   ! file and variable identifier
240         i_ndims,                                  &   ! Number of dimensions for this variable
241         i_type                                        ! external data type for this variable
242      !!----------------------------------------------------------------------
243
244      ! Open and test netcdf file
245      ! -------------------------
246      CALL nchdlerr(nf90_open( cd_filename, nf90_nowrite, i_file_id ),&
247         & __LINE__,__MYFILE__)
248      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
249         & __LINE__,__MYFILE__)
250      CALL nchdlerr(nf90_inquire_variable( i_file_id, i_var_id,xtype=i_type,ndims=i_ndims),&
251         & __LINE__,__MYFILE__)
252      IF ( i_type .NE. 4 ) THEN
253         WRITE(*,*)'filename = ',cd_filename
254         WRITE(*,*)'variable = ',cd_var
255         WRITE(*,*)'External type for this variable = ',i_type
256         WRITE(*,*)'The valid external data type is NF_INT : 4'
257         WRITE(*,*)'CALL abort'
258         CALL abort
259      ENDIF
260
261      IF ( i_ndims .NE. 1 ) THEN
262         WRITE(*,*)'filename = ',cd_filename
263         WRITE(*,*)'variable = ',cd_var
264         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
265         WRITE(*,*)'The valid number of dimension is 1'
266         WRITE(*,*)'CALL abort'
267         CALL abort
268      ENDIF
269
270      ! Read variable
271      ! -------------
272      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, k_var ),&
273         & __LINE__,__MYFILE__ )
274
275      CALL nchdlerr( nf90_close( i_file_id ) ,&
276         & __LINE__,__MYFILE__)
277
278   END SUBROUTINE get_scalar_i
279
280   SUBROUTINE get_scalar_r ( cd_filename, cd_var, p_var )
281      !!----------------------------------------------------------------------
282      !!                ***  ROUTINE get_scalar_r  ***
283      !!
284      !! ** Purpose :  read real scalar in a netcdf file
285      !!
286      !! ** Method  : use netcdf fortran library
287      !!
288      !! ** Action : - get variable informations
289      !!             - read variable
290      !!
291      !! Reference :
292      !!
293      !! History :
294      !!    06-09  (N. Daget)  original code
295      !!----------------------------------------------------------------------
296      !! * Modules used
297
298      !! * Library used
299
300      !! * arguments
301      CHARACTER(len=80), INTENT(in)            :: &
302         cd_filename                                   ! filename
303      CHARACTER(len=80), INTENT(in)            :: &
304         cd_var                                        ! variable name
305      REAL(KIND=sp), INTENT(out)                        :: &
306         p_var                                         ! variable to read in netcdf file
307
308      !! * local declarations
309      INTEGER               ::                     &
310         i_file_id, i_var_id,                      &   ! file and variable identifier
311         i_ndims,                                  &   ! Number of dimensions for this variable
312         i_type                                        ! external data type for this variable
313      !!----------------------------------------------------------------------
314
315      ! Open and test netcdf file
316      ! -------------------------
317      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
318         & __LINE__,__MYFILE__)
319      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
320         & __LINE__,__MYFILE__)
321      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type,ndims=i_ndims ),&
322         & __LINE__,__MYFILE__)
323      IF ( i_type .NE. 5 ) THEN
324         WRITE(*,*)'filename = ',cd_filename
325         WRITE(*,*)'variable = ',cd_var
326         WRITE(*,*)'External type for this variable = ',i_type
327         WRITE(*,*)'The valid external data type is NF_FLOAT : 5'
328!         WRITE(*,*)'CALL abort'
329!         CALL abort
330      ENDIF
331      IF ( i_ndims .NE. 1 ) THEN
332         WRITE(*,*)'filename = ',cd_filename
333         WRITE(*,*)'variable = ',cd_var
334         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
335         WRITE(*,*)'The valid number of dimension is 1'
336         WRITE(*,*)'CALL abort'
337         CALL abort
338      ENDIF
339
340      ! Read variable
341      ! -------------
342      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, p_var ) ,__LINE__,__MYFILE__ )
343
344      CALL nchdlerr( nf90_close( i_file_id ),__LINE__,__MYFILE__  )
345
346   END SUBROUTINE get_scalar_r
347
348   SUBROUTINE get_scalar_d ( cd_filename, cd_var, dd_var )
349      !!----------------------------------------------------------------------
350      !!                ***  ROUTINE get_scalar_d  ***
351      !!
352      !! ** Purpose :  read double scalar in a netcdf file
353      !!
354      !! ** Method  : use netcdf fortran library
355      !!
356      !! ** Action : - get variable informations
357      !!             - read variable
358      !!
359      !! Reference :
360      !!
361      !! History :
362      !!    06-09  (N. Daget)  original code
363      !!----------------------------------------------------------------------
364      !! * Modules used
365
366      !! * Library used
367
368      !! * arguments
369      CHARACTER(len=80), INTENT(in)            :: &
370         cd_filename                                   ! filename
371      CHARACTER(len=80), INTENT(in)            :: &
372         cd_var                                        ! variable name
373      REAL(KIND=dp), INTENT(out)            :: &
374         dd_var                                        ! variable to read in netcdf file
375
376      !! * local declarations
377      INTEGER               ::                     &
378         i_file_id, i_var_id,                      &   ! file and variable identifier
379         i_ndims,                                  &   ! Number of dimensions for this variable
380         i_type                                        ! external data type for this variable
381      !!----------------------------------------------------------------------
382
383      ! Open and test netcdf file
384      ! -------------------------
385      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
386         & __LINE__,__MYFILE__)
387      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ),__LINE__,__MYFILE__ )
388      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type,ndims=i_ndims),__LINE__,__MYFILE__ )
389      IF ( i_type .NE. 6 ) THEN
390         WRITE(*,*)'filename = ',cd_filename
391         WRITE(*,*)'variable = ',cd_var
392         WRITE(*,*)'External type for this variable = ',i_type
393         WRITE(*,*)'The valid external data type is NF_DOUBLE : 6'
394!         WRITE(*,*)'CALL abort'
395!         CALL abort
396      ENDIF
397      IF ( i_ndims .NE. 1 ) THEN
398         WRITE(*,*)'filename = ',cd_filename
399         WRITE(*,*)'variable = ',cd_var
400         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
401         WRITE(*,*)'The valid number of dimension is 1'
402         WRITE(*,*)'CALL abort'
403         CALL abort
404      ENDIF
405
406      ! Read variable
407      ! -------------
408      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, dd_var ),__LINE__,__MYFILE__ )
409
410      CALL nchdlerr( nf90_close( i_file_id ),__LINE__,__MYFILE__ )
411
412   END SUBROUTINE get_scalar_d
413
414   !!======================================================================
415
416   SUBROUTINE put_scalar_i ( cd_filename, k_var, cd_var, cd_longname )
417      !!----------------------------------------------------------------------
418      !!                ***  ROUTINE put_scalar_i  ***
419      !!
420      !! ** Purpose :  write an integer scalar in a netcdf file
421      !!
422      !! ** Method  : use netcdf fortran library
423      !!       
424      !! ** Action : - get variable informations
425      !!             - (re)define variable
426      !!             - put variable in netcdf file
427      !!
428      !! Reference :
429      !!     
430      !! History :
431      !!    06-05  (N. Daget)  original code
432      !!----------------------------------------------------------------------
433      !! * Modules used
434
435      !! * Library used
436
437
438      !! * arguments
439      CHARACTER(len=80), INTENT(in)            :: &
440         cd_filename,                             &    ! filename
441         cd_var                                        ! variable name
442      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
443         cd_longname                                   ! variable longname
444      INTEGER, INTENT(in)                      :: &
445        k_var                                          ! variable to write in netcdf file
446
447      !! * local declarations
448      LOGICAL               :: llexist                 ! test
449      INTEGER               ::                     &
450         i_file_id, i_var_id,                      &   ! file and variable identifier
451         i_dim_id,                                 &   ! dimension identifier
452         i_var_exist, i_dim_exist                      ! tests
453      INTEGER, DIMENSION(1) ::                     &
454         i_dim                                          ! netcdf information
455      !!----------------------------------------------------------------------
456
457      !
458      ! Open or create file
459      ! -------------------
460      INQUIRE( FILE=cd_filename, EXIST=llexist )
461      IF ( .NOT. llexist ) THEN
462         CALL nchdlerr( nf90_create( cd_filename, nf90_clobber, i_file_id ) ,&
463            & __LINE__,__MYFILE__)
464         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
465            & __LINE__,__MYFILE__)
466      ELSE
467         CALL nchdlerr( nf90_open( cd_filename, nf90_write, i_file_id ) ,&
468            & __LINE__,__MYFILE__)
469      ENDIF
470
471      i_dim_exist =  nf90_inq_dimid( i_file_id, 'scalar', i_dim_id ) 
472      IF ( i_dim_exist .NE. 0 ) THEN
473         CALL nchdlerr( nf90_redef( i_file_id ) ,&
474            & __LINE__,__MYFILE__)
475         CALL nchdlerr( nf90_def_dim( i_file_id, 'scalar', 1, i_dim_id ) ,&
476            & __LINE__,__MYFILE__)
477         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
478            & __LINE__,__MYFILE__)
479      ENDIF
480
481      i_dim(1) = i_dim_id
482
483      !
484      ! Define variable or find it
485      ! --------------------------
486      i_var_exist = nf90_inq_varid( i_file_id, cd_var, i_var_id )
487      IF ( i_var_exist .NE. 0 ) THEN
488         CALL nchdlerr( nf90_redef( i_file_id ) ,&
489            & __LINE__,__MYFILE__)
490         CALL nchdlerr( nf90_def_var( i_file_id, cd_var, nf90_int, i_dim, i_var_id ) ,&
491            & __LINE__,__MYFILE__)
492         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'standard_name', TRIM(cd_var) ) ,&
493            & __LINE__,__MYFILE__)
494         IF ( PRESENT(cd_longname) ) THEN
495            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'long_name', TRIM(cd_longname) ) ,&
496               & __LINE__,__MYFILE__)
497         ENDIF
498         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
499            & __LINE__,__MYFILE__)
500      ENDIF
501
502      ! Put variable(s)
503      ! --------------
504      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, k_var ) ,&
505         & __LINE__,__MYFILE__)
506
507      CALL nchdlerr( nf90_close( i_file_id ) ,&
508         & __LINE__,__MYFILE__)
509
510   END SUBROUTINE put_scalar_i
511
512   SUBROUTINE put_scalar_r ( cd_filename, p_var, cd_var, cd_longname )
513      !!----------------------------------------------------------------------
514      !!                ***  ROUTINE put_scalar_r  ***
515      !!
516      !! ** Purpose :  write an real scalar in a netcdf file
517      !!
518      !! ** Method  : use netcdf fortran library
519      !!       
520      !! ** Action : - get variable informations
521      !!             - (re)define variable
522      !!             - put variable in netcdf file
523      !!
524      !! Reference :
525      !!     
526      !! History :
527      !!    06-05  (N. Daget)  original code
528      !!----------------------------------------------------------------------
529      !! * Modules used
530
531      !! * Library used
532
533      !! * arguments
534      CHARACTER(len=80), INTENT(in)            :: &
535         cd_filename,                             &    ! filename
536         cd_var                                        ! variable name
537      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
538         cd_longname                                   ! variable longname
539      REAL(KIND=sp), INTENT(in)                         :: &
540        p_var                                          ! variable to write in netcdf file
541
542      !! * local declarations
543      LOGICAL               :: llexist                 ! test
544      INTEGER               ::                     &
545         i_file_id, i_var_id,                      &   ! file and variable identifier
546         i_dim_id,                                 &   ! dimension identifier
547         i_var_exist, i_dim_exist                      ! tests
548      INTEGER, DIMENSION(1) ::                     &
549         i_dim                                          ! netcdf information
550      !!----------------------------------------------------------------------
551
552      !
553      ! Open or create file
554      ! -------------------
555      INQUIRE( FILE=cd_filename, EXIST=llexist )
556      IF ( .NOT. llexist ) THEN
557         CALL nchdlerr( nf90_create( cd_filename, nf90_clobber, i_file_id ) ,&
558            & __LINE__,__MYFILE__)
559         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
560            & __LINE__,__MYFILE__)
561      ELSE
562         CALL nchdlerr( nf90_open( cd_filename, nf90_write, i_file_id ) ,&
563            & __LINE__,__MYFILE__)
564      ENDIF
565
566      i_dim_exist =  nf90_inq_dimid( i_file_id, 'scalar', i_dim_id ) 
567      IF ( i_dim_exist .NE. 0 ) THEN
568         CALL nchdlerr( nf90_redef( i_file_id ) ,&
569            & __LINE__,__MYFILE__)
570         CALL nchdlerr( nf90_def_dim( i_file_id, 'scalar', 1, i_dim_id ) ,&
571            & __LINE__,__MYFILE__)
572         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
573            & __LINE__,__MYFILE__)
574      ENDIF
575
576      i_dim(1) = i_dim_id
577
578      !
579      ! Define variable or find it
580      ! --------------------------
581      i_var_exist = nf90_inq_varid( i_file_id, cd_var, i_var_id )
582      IF ( i_var_exist .NE. 0 ) THEN
583         CALL nchdlerr( nf90_redef( i_file_id ) ,&
584            & __LINE__,__MYFILE__)
585         CALL nchdlerr( nf90_def_var( i_file_id, cd_var, nf90_real, i_dim, i_var_id ) ,&
586            & __LINE__,__MYFILE__)
587         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'standard_name', TRIM(cd_var) ) ,&
588            & __LINE__,__MYFILE__)
589         IF ( PRESENT(cd_longname) ) THEN
590            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'long_name', TRIM(cd_longname) ) ,&
591               & __LINE__,__MYFILE__)
592         ENDIF
593         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
594            & __LINE__,__MYFILE__)
595      ENDIF
596
597      ! Put variable(s)
598      ! --------------
599      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, p_var ) ,&
600         & __LINE__,__MYFILE__)
601
602      CALL nchdlerr( nf90_close( i_file_id ) ,&
603         & __LINE__,__MYFILE__)
604
605   END SUBROUTINE put_scalar_r
606
607   SUBROUTINE put_scalar_d ( cd_filename, dd_var, cd_var, cd_longname )
608      !!----------------------------------------------------------------------
609      !!                ***  ROUTINE put_scalar_d  ***
610      !!
611      !! ** Purpose :  write an integer scalar in a netcdf file
612      !!
613      !! ** Method  : use netcdf fortran library
614      !!       
615      !! ** Action : - get variable informations
616      !!             - (re)define variable
617      !!             - put variable in netcdf file
618      !!
619      !! Reference :
620      !!     
621      !! History :
622      !!    06-05  (N. Daget)  original code
623      !!----------------------------------------------------------------------
624      !! * Modules used
625
626      !! * Library used
627
628
629      !! * arguments
630      CHARACTER(len=80), INTENT(in)            :: &
631         cd_filename,                             &    ! filename
632         cd_var                                        ! variable name
633      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
634         cd_longname                                   ! variable longname
635      REAL(KIND=dp), INTENT(in)             :: &
636        dd_var                                         ! variable to write in netcdf file
637
638      !! * local declarations
639      LOGICAL               :: llexist                 ! test
640      INTEGER               ::                     &
641         i_file_id, i_var_id,                      &   ! file and variable identifier
642         i_dim_id,                                 &   ! dimension identifier
643         i_var_exist, i_dim_exist                      ! tests
644      INTEGER, DIMENSION(1) ::                     &
645         i_dim                                          ! netcdf information
646      !!----------------------------------------------------------------------
647
648      !
649      ! Open or create file
650      ! -------------------
651      INQUIRE( FILE=cd_filename, EXIST=llexist )
652      IF ( .NOT. llexist ) THEN
653         CALL nchdlerr( nf90_create( cd_filename, nf90_clobber, i_file_id ) ,&
654            & __LINE__,__MYFILE__)
655         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
656            & __LINE__,__MYFILE__)
657      ELSE
658         CALL nchdlerr( nf90_open( cd_filename, nf90_write, i_file_id ) ,&
659            & __LINE__,__MYFILE__)
660      ENDIF
661
662      i_dim_exist =  nf90_inq_dimid( i_file_id, 'scalar', i_dim_id ) 
663      IF ( i_dim_exist .NE. 0 ) THEN
664         CALL nchdlerr( nf90_redef( i_file_id ) ,&
665            & __LINE__,__MYFILE__)
666         CALL nchdlerr( nf90_def_dim( i_file_id, 'double', 1, i_dim_id ) ,&
667            & __LINE__,__MYFILE__)
668         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
669            & __LINE__,__MYFILE__)
670      ENDIF
671
672      i_dim(1) = i_dim_id
673
674      !
675      ! Define variable or find it
676      ! --------------------------
677      i_var_exist = nf90_inq_varid( i_file_id, cd_var, i_var_id )
678      IF ( i_var_exist .NE. 0 ) THEN
679         CALL nchdlerr( nf90_redef( i_file_id ) ,&
680            & __LINE__,__MYFILE__)
681         CALL nchdlerr( nf90_def_var( i_file_id, cd_var, nf90_double, i_dim, i_var_id ) ,&
682            & __LINE__,__MYFILE__)
683         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'standard_name', TRIM(cd_var) ) ,&
684            & __LINE__,__MYFILE__)
685         IF ( PRESENT(cd_longname) ) THEN
686            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'long_name', TRIM(cd_longname) ) ,&
687               & __LINE__,__MYFILE__)
688         ENDIF
689         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
690            & __LINE__,__MYFILE__)
691      ENDIF
692
693      ! Put variable(s)
694      ! --------------
695      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, dd_var ) ,&
696         & __LINE__,__MYFILE__)
697
698      CALL nchdlerr( nf90_close( i_file_id ) ,&
699         & __LINE__,__MYFILE__)
700
701   END SUBROUTINE put_scalar_d
702
703   !!======================================================================
704
705   SUBROUTINE put_map_2d_r ( cd_filename, p_var, p_missing, cd_var, k_code, k_time, reftime, leadtime, time_bnd, cd_descr )
706      !!----------------------------------------------------------------------
707      !!                ***  ROUTINE put_map_2d_r  ***
708      !!
709      !! ** Purpose :  write 2d map of reals in a netcdf file
710      !!
711      !! ** Method  : use netcdf fortran library
712      !!       
713      !! ** Action : - get variable informations
714      !!             - (re)define variable
715      !!             - put variable in netcdf file
716      !!
717      !! Reference :
718      !!     
719      !! History :
720      !!    06-05  (N. Daget)  original code
721      !!----------------------------------------------------------------------
722      !! * Modules used
723
724      !! * Library used
725
726      !! * arguments
727      CHARACTER(len=80), INTENT(in)            :: &
728         cd_filename                                   ! filename
729      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
730         cd_var                                        ! variable name
731      INTEGER, OPTIONAL, INTENT(in)            :: &
732        k_code,                                   &    ! CF code
733        k_time,                                   &    ! time of the variable
734        leadtime                                       ! leadtime of the variable
735      INTEGER, DIMENSION(:), OPTIONAL, INTENT(in) :: &
736        time_bnd                                       ! time_bnd
737      REAL(KIND=sp), OPTIONAL, INTENT(in)               :: &
738        p_missing,                                &    ! missing value of the variable
739        reftime                                        ! reftime of the variable
740      REAL(KIND=sp), DIMENSION(:,:), INTENT(in)         :: &
741        p_var                                          ! variable to write in netcdf file
742      CHARACTER(len=80), DIMENSION(6), OPTIONAL, INTENT(in)   :: &
743         cd_descr                                               ! description of file contents
744
745      !! * local declarations
746      LOGICAL               :: llexist                 ! test
747      CHARACTER(len=80)     :: cl_var                  ! new variable name
748      INTEGER               ::                     &
749         i_file_id, i_var_id,                      &   ! file and variable identifier
750         i_dim_x_id, i_dim_y_id, i_time_id,        &   ! dimension identifier
751         i_reftime_id, i_leadtime_id,              &   ! dimension identifier
752         i_time_bnd_id, i_dim_id,                  &   ! dimension identifier
753         i_var_exist, i_pos, ii                        ! test and temporary variable
754      INTEGER, DIMENSION(1) :: i_time_bnd              ! dimensions of the variable
755      INTEGER, DIMENSION(2) :: i_dimxy, i_len          ! dimensions of the variable
756      INTEGER, DIMENSION(3) ::                     &
757         i_tab_start, i_tab_count, i_dim               ! netcdf information
758      INTEGER, DIMENSION(:), ALLOCATABLE        :: &
759         i_time                                        ! time
760      REAL                  ::                     &
761         z_min, z_max, z_min_old, z_max_old            ! Minima and maxima of variable
762      !!----------------------------------------------------------------------
763
764      ! Read dimensions and compute min and max
765      ! ---------------------------------------
766      i_dimxy = SHAPE( p_var)
767      i_tab_start(1) = 1
768      i_tab_count(1) = i_dimxy(1)
769      i_tab_start(2) = 1
770      i_tab_count(2) = i_dimxy(2)
771      i_tab_count(3) = 1
772
773      IF ( PRESENT(p_missing) ) THEN
774         z_min = MINVAL(p_var, mask = p_var .NE. p_missing )
775         z_max = MAXVAL(p_var, mask = p_var .NE. p_missing )
776      ELSE
777         z_min = MINVAL(p_var )
778         z_max = MAXVAL(p_var )
779      ENDIF
780
781      ! Define the name of the variable
782      ! -------------------------------
783      cl_var = "var"
784      IF ( PRESENT(cd_var) ) cl_var = cd_var
785      IF ( PRESENT(k_code) ) CALL get_var_info( k_code, cl_var )
786
787      !
788      ! Open or create file
789      ! -------------------
790      INQUIRE( FILE=cd_filename, EXIST=llexist )
791      IF ( .NOT. llexist ) THEN
792         IF ( PRESENT( cd_descr ) ) THEN
793            CALL create_map ( cd_filename, i_dimxy, cd_descr=cd_descr )
794         ELSE
795            CALL create_map ( cd_filename, i_dimxy )
796         ENDIF
797      ENDIF
798
799      CALL nchdlerr( nf90_open( cd_filename, nf90_write, i_file_id ) ,&
800         & __LINE__,__MYFILE__)
801
802      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'time', i_time_id ) ,&
803         & __LINE__,__MYFILE__)
804      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'x', i_dim_x_id ) ,&
805         & __LINE__,__MYFILE__)
806      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'y', i_dim_y_id ) ,&
807         & __LINE__,__MYFILE__)
808      i_dim(1) = i_dim_x_id
809      i_dim(2) = i_dim_y_id
810      i_dim(3) = i_time_id
811
812      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dim(1), len=i_len(1) ),__LINE__,__MYFILE__ )
813      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dim(2), len=i_len(2) ) ,&
814         & __LINE__,__MYFILE__)
815
816      IF ( (i_len(1) .NE. i_dimxy(1)) .OR. (i_len(2) .NE. i_dimxy(2)) ) THEN
817         WRITE(*,*)'filename = ',cd_filename
818         WRITE(*,*)'variable = ',cl_var
819         WRITE(*,*)'shape of array = ',i_dimxy
820         WRITE(*,*)'Dimension length of variable = ',i_len
821         WRITE(*,*)'Dimensions are different'
822         WRITE(*,*)'CALL abort'
823         CALL abort
824      ENDIF
825
826      ! Define variable or find it
827      ! --------------------------
828      i_var_exist = nf90_inq_varid( i_file_id, cl_var, i_var_id )
829      IF ( i_var_exist .NE. 0 ) THEN
830         CALL nchdlerr( nf90_redef( i_file_id ) ,&
831            & __LINE__,__MYFILE__)
832         CALL nchdlerr( nf90_def_var( i_file_id, cl_var, nf90_real, i_dim, i_var_id ) ,&
833            & __LINE__,__MYFILE__)
834         IF ( PRESENT(k_code) ) CALL put_att( i_file_id, i_var_id, k_code )
835         IF ( PRESENT(p_missing) )   &
836           & CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, '_FillValue', p_missing ) ,&
837           & __LINE__,__MYFILE__)
838         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', z_min ) ,&
839            & __LINE__,__MYFILE__)
840         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', z_max ) ,&
841            & __LINE__,__MYFILE__)
842         i_var_exist = nf90_inq_varid( i_file_id, 'time', i_time_id )
843         IF ( i_var_exist .NE. 0 ) THEN
844            CALL nchdlerr( nf90_def_var( i_file_id, 'time', nf90_int, i_dim(3), i_time_id ) ,&
845               & __LINE__,__MYFILE__)
846         ENDIF
847         IF ( PRESENT(reftime) ) THEN
848            i_var_exist = nf90_inq_varid( i_file_id, 'reftime', i_reftime_id )
849            IF ( i_var_exist .NE. 0 ) THEN
850               CALL nchdlerr( nf90_def_var( i_file_id, 'reftime', nf90_real, i_dim(3), i_reftime_id ) ,&
851                  & __LINE__,__MYFILE__)
852               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'units', 'days since 1950-01-01 00:00:00' ) ,&
853                  & __LINE__,__MYFILE__)
854               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'standard_name', 'forecast_reference_time' ) ,&
855                  & __LINE__,__MYFILE__)
856               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'long_name', 'forecast reference time' ) ,&
857                  & __LINE__,__MYFILE__)
858            ENDIF
859         ENDIF
860         IF ( PRESENT(leadtime) ) THEN
861            i_var_exist = nf90_inq_varid( i_file_id, 'leadtime', i_leadtime_id )
862            IF ( i_var_exist .NE. 0 ) THEN
863               CALL nchdlerr( nf90_def_var( i_file_id, 'leadtime', nf90_int, i_dim(3), i_leadtime_id ) ,&
864                  & __LINE__,__MYFILE__)
865               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'units', 'days' ) ,&
866                  & __LINE__,__MYFILE__)
867               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'standard_name', 'forecast_period' ) ,&
868                  & __LINE__,__MYFILE__)
869               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'long_name', &
870                  &         'Time elapsed since the start of the forecast' ) ,&
871                  & __LINE__,__MYFILE__)
872               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'bounds', 'time_bnd' ) ,&
873                  & __LINE__,__MYFILE__)
874            ENDIF
875         ENDIF
876         IF ( PRESENT(time_bnd) ) THEN
877            i_var_exist = nf90_inq_varid( i_file_id, 'time_bnd', i_time_bnd_id )
878            IF ( i_var_exist .NE. 0 ) THEN
879               i_time_bnd=SHAPE(time_bnd)
880               CALL nchdlerr( nf90_def_dim( i_file_id, 'time_bnd', i_time_bnd(1) , i_dim_id ) ,&
881                  & __LINE__,__MYFILE__)
882               CALL nchdlerr( nf90_def_var( i_file_id, 'time_bnd', nf90_int, (/i_dim_id, i_dim(3)/), i_time_bnd_id ) ,&
883                  & __LINE__,__MYFILE__)
884               CALL nchdlerr( nf90_put_att( i_file_id, i_time_bnd_id, 'units', 'days' ) ,&
885                  & __LINE__,__MYFILE__)
886            ENDIF
887         ENDIF
888         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
889            & __LINE__,__MYFILE__)
890         i_tab_start(3) = 1
891         i_pos = 1
892      ELSE
893         CALL nchdlerr( nf90_get_att( i_file_id, i_var_id, 'valid_min', z_min_old ) ,&
894            & __LINE__,__MYFILE__)
895         CALL nchdlerr( nf90_get_att( i_file_id, i_var_id, 'valid_max', z_max_old ) ,&
896            & __LINE__,__MYFILE__)
897         z_min = MIN( z_min, z_min_old )
898         z_max = MAX( z_max, z_max_old )
899         CALL nchdlerr( nf90_redef( i_file_id ) ,&
900            & __LINE__,__MYFILE__)
901         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', z_min ) ,&
902            & __LINE__,__MYFILE__)
903         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', z_max ) ,&
904            & __LINE__,__MYFILE__)
905         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
906            & __LINE__,__MYFILE__)
907         CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_time_id, len=i_pos ) ,&
908            & __LINE__,__MYFILE__)
909         CALL nchdlerr( nf90_inq_varid( i_file_id, 'time', i_time_id ) ,&
910            & __LINE__,__MYFILE__)
911         IF ( PRESENT(reftime) ) THEN
912            CALL nchdlerr( nf90_inq_varid( i_file_id, 'reftime', i_reftime_id ) ,&
913               & __LINE__,__MYFILE__) 
914         ENDIF
915         IF ( PRESENT(leadtime) ) THEN
916            CALL nchdlerr( nf90_inq_varid( i_file_id, 'leadtime', i_leadtime_id ) ,&
917               & __LINE__,__MYFILE__) 
918         ENDIF
919         IF ( PRESENT(time_bnd) ) THEN
920            i_time_bnd=SHAPE(time_bnd)
921            CALL nchdlerr( nf90_inq_varid( i_file_id, 'time_bnd', i_time_bnd_id ) ,&
922               & __LINE__,__MYFILE__) 
923         ENDIF
924         ALLOCATE( i_time(i_pos) )
925         CALL nchdlerr( nf90_get_var( i_file_id, i_time_id, i_time ) ,&
926            & __LINE__,__MYFILE__)
927         IF ( PRESENT(k_time) ) THEN
928            DO ii =  1, i_pos 
929               IF ( k_time .EQ. i_time(ii) ) THEN
930                  i_pos = ii - 1
931                  EXIT
932               ENDIF
933            ENDDO
934         ENDIF
935         DEALLOCATE( i_time )
936         i_pos = i_pos + 1
937         i_tab_start(3) = i_pos 
938      ENDIF
939
940      ! Put variable(s)
941      ! --------------
942      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, p_var, &
943         & start=i_tab_start, count=i_tab_count ) ,&
944         & __LINE__,__MYFILE__)
945      IF ( PRESENT(k_time) ) THEN
946         CALL nchdlerr( nf90_put_var( i_file_id, i_time_id, (/k_time/), &
947            & start=(/i_tab_start(3)/), count=(/i_tab_count(3)/) ) ,&
948            & __LINE__,__MYFILE__)
949      ELSE
950         CALL nchdlerr( nf90_put_var( i_file_id, i_time_id, (/i_pos/), &
951            & start=(/i_tab_start(3)/), count=(/i_tab_count(3)/) ) ,&
952            & __LINE__,__MYFILE__)
953      ENDIF
954      IF ( PRESENT(reftime) ) THEN
955         CALL nchdlerr( nf90_put_var( i_file_id, i_reftime_id, (/reftime/), &
956            & start=(/i_tab_start(3)/), count=(/i_tab_count(3)/) ) ,&
957            & __LINE__,__MYFILE__)
958      ENDIF
959      IF ( PRESENT(leadtime) ) THEN
960         CALL nchdlerr( nf90_put_var( i_file_id, i_leadtime_id, (/leadtime/), &
961            & start=(/i_tab_start(3)/), count=(/i_tab_count(3)/) ) ,&
962            & __LINE__,__MYFILE__)
963      ENDIF
964      IF ( PRESENT(time_bnd) ) THEN
965         CALL nchdlerr( nf90_put_var( i_file_id, i_time_bnd_id, time_bnd, &
966                                    start=(/1,i_tab_start(3)/), count=(/i_time_bnd(1),i_tab_count(3)/) ) ,&
967                                    & __LINE__,__MYFILE__)
968      ENDIF
969
970      CALL nchdlerr( nf90_close( i_file_id ) ,&
971         & __LINE__,__MYFILE__)
972
973   END SUBROUTINE put_map_2d_r
974
975   SUBROUTINE put_map_2d_d ( cd_filename, dd_var, dd_missing, cd_var, k_code, k_time, reftime, leadtime, time_bnd, cd_descr )
976      !!----------------------------------------------------------------------
977      !!                ***  ROUTINE put_map_2d_d  ***
978      !!
979      !! ** Purpose :  write 2d map of reals in a netcdf file
980      !!
981      !! ** Method  : use netcdf fortran library
982      !!       
983      !! ** Action : - get variable informations
984      !!             - (re)define variable
985      !!             - put variable in netcdf file
986      !!
987      !! Reference :
988      !!     
989      !! History :
990      !!    06-05  (N. Daget)  original code
991      !!----------------------------------------------------------------------
992      !! * Modules used
993
994      !! * Library used
995
996
997      !! * arguments
998      CHARACTER(len=80), INTENT(in)            :: &
999         cd_filename                                   ! filename
1000      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
1001         cd_var                                        ! variable name
1002      INTEGER, OPTIONAL, INTENT(in)            :: &
1003        k_code,                                   &    ! CF code
1004        k_time,                                   &    ! time of the variable
1005        leadtime                                       ! leadtime of the variable
1006      INTEGER, DIMENSION(:), OPTIONAL, INTENT(in) :: &
1007        time_bnd                                       ! time_bnd
1008      REAL(KIND=dp), OPTIONAL, INTENT(in)      :: &
1009        dd_missing,                               &    ! missing value of the variable
1010        reftime                                        ! reftime of the variable
1011      REAL(KIND=dp), DIMENSION(:,:), INTENT(in)  :: &
1012        dd_var                                         ! variable to write in netcdf file
1013      CHARACTER(len=80), DIMENSION(6), OPTIONAL, INTENT(in)   :: &
1014         cd_descr                                               ! description of file contents
1015
1016      !! * local declarations
1017      LOGICAL               :: llexist                 ! test
1018      CHARACTER(len=80)     :: cl_var                  ! new variable name
1019      INTEGER               ::                     &
1020         i_file_id, i_var_id,                      &   ! file and variable identifier
1021         i_dim_x_id, i_dim_y_id, i_time_id,        &   ! dimension identifier
1022         i_reftime_id, i_leadtime_id,              &   ! dimension identifier
1023         i_time_bnd_id, i_dim_id,                  &   ! dimension identifier
1024         i_var_exist, i_pos, ii                        ! test and temporary variable
1025      INTEGER, DIMENSION(1) :: i_time_bnd              ! dimensions of the variable
1026      INTEGER, DIMENSION(2) :: i_dimxy, i_len          ! dimensions of the variable
1027      INTEGER, DIMENSION(3) ::                     &
1028         i_tab_start, i_tab_count, i_dim               ! netcdf information
1029      INTEGER, DIMENSION(:), ALLOCATABLE        :: &
1030         i_time                                        ! time
1031      REAL(KIND=dp)      ::                     &
1032         dl_min, dl_max, dl_min_old, dl_max_old        ! Minima and maxima of variable
1033      !!----------------------------------------------------------------------
1034
1035      ! Read dimensions and compute min and max
1036      ! ---------------------------------------
1037      i_dimxy = SHAPE( dd_var)
1038      i_tab_start(1) = 1
1039      i_tab_count(1) = i_dimxy(1)
1040      i_tab_start(2) = 1
1041      i_tab_count(2) = i_dimxy(2)
1042      i_tab_count(3) = 1
1043
1044      IF ( PRESENT(dd_missing) ) THEN
1045         dl_min = MINVAL( dd_var, mask = dd_var .NE. dd_missing )
1046         dl_max = MAXVAL( dd_var, mask = dd_var .NE. dd_missing )
1047      ELSE
1048         dl_min = MINVAL( dd_var )
1049         dl_max = MAXVAL( dd_var )
1050      ENDIF
1051
1052      ! Define the name of the variable
1053      ! -------------------------------
1054      cl_var = "var"
1055      IF ( PRESENT(cd_var) ) cl_var = cd_var
1056      IF ( PRESENT(k_code) ) CALL get_var_info( k_code, cl_var )
1057
1058      !
1059      ! Open or create file
1060      ! -------------------
1061      INQUIRE( FILE=cd_filename, EXIST=llexist )
1062      IF ( .NOT. llexist ) THEN
1063         IF ( PRESENT( cd_descr ) ) THEN
1064            CALL create_map ( cd_filename, i_dimxy, cd_descr=cd_descr )
1065         ELSE
1066            CALL create_map ( cd_filename, i_dimxy )
1067         ENDIF
1068      ENDIF
1069
1070      CALL nchdlerr( nf90_open( cd_filename, nf90_write, i_file_id ) ,&
1071         & __LINE__,__MYFILE__)
1072
1073      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'time', i_time_id ) ,&
1074         & __LINE__,__MYFILE__)
1075      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'x', i_dim_x_id ) ,&
1076         & __LINE__,__MYFILE__)
1077      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'y', i_dim_y_id ) ,&
1078         & __LINE__,__MYFILE__)
1079      i_dim(1) = i_dim_x_id
1080      i_dim(2) = i_dim_y_id
1081      i_dim(3) = i_time_id
1082
1083      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dim(1), len=i_len(1) ) ,&
1084         & __LINE__,__MYFILE__)
1085      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dim(2), len=i_len(2) ) ,&
1086         & __LINE__,__MYFILE__)
1087
1088      IF ( (i_len(1) .NE. i_dimxy(1)) .OR. (i_len(2) .NE. i_dimxy(2)) ) THEN
1089         WRITE(*,*)'filename = ',cd_filename
1090         WRITE(*,*)'variable = ',cl_var
1091         WRITE(*,*)'shape of array = ',i_dimxy
1092         WRITE(*,*)'Dimension length of variable = ',i_len
1093         WRITE(*,*)'Dimensions are different'
1094         WRITE(*,*)'CALL abort'
1095         CALL abort
1096      ENDIF
1097
1098      ! Define variable or find it
1099      ! --------------------------
1100      i_var_exist = nf90_inq_varid( i_file_id, cl_var, i_var_id )
1101      IF ( i_var_exist .NE. 0 ) THEN
1102         CALL nchdlerr( nf90_redef( i_file_id ) ,&
1103            & __LINE__,__MYFILE__)
1104         CALL nchdlerr( nf90_def_var( i_file_id, cl_var, nf90_double, i_dim, i_var_id ) ,&
1105            & __LINE__,__MYFILE__)
1106         IF ( PRESENT(k_code) ) CALL put_att( i_file_id, i_var_id, k_code )
1107         IF ( PRESENT(dd_missing) )   &
1108            & CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, '_FillValue', dd_missing ),__LINE__,__MYFILE__ )
1109         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', dl_min ) ,&
1110            & __LINE__,__MYFILE__)
1111         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', dl_max ) ,&
1112            & __LINE__,__MYFILE__)
1113         i_var_exist = nf90_inq_varid( i_file_id, 'time', i_time_id )
1114         IF ( i_var_exist .NE. 0 ) THEN
1115            CALL nchdlerr( nf90_def_var( i_file_id, 'time', nf90_int, i_dim(3), i_time_id ) ,&
1116               & __LINE__,__MYFILE__)
1117         ENDIF
1118         IF ( PRESENT(reftime) ) THEN
1119            i_var_exist = nf90_inq_varid( i_file_id, 'reftime', i_reftime_id )
1120            IF ( i_var_exist .NE. 0 ) THEN
1121               CALL nchdlerr( nf90_def_var( i_file_id, 'reftime', nf90_double, i_dim(3), i_reftime_id ) ,&
1122                  & __LINE__,__MYFILE__)
1123               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'units', 'days since 1950-01-01 00:00:00' ) ,&
1124                  & __LINE__,__MYFILE__)
1125               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'standard_name', 'forecast_reference_time' ) ,&
1126                  & __LINE__,__MYFILE__)
1127               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'long_name', 'forecast reference time' ) ,&
1128                  & __LINE__,__MYFILE__)
1129            ENDIF
1130         ENDIF
1131         IF ( PRESENT(leadtime) ) THEN
1132            i_var_exist = nf90_inq_varid( i_file_id, 'leadtime', i_leadtime_id )
1133            IF ( i_var_exist .NE. 0 ) THEN
1134               CALL nchdlerr( nf90_def_var( i_file_id, 'leadtime', nf90_int, i_dim(3), i_leadtime_id ),__LINE__,__MYFILE__ )
1135               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'units', 'days' ) ,&
1136                  & __LINE__,__MYFILE__)
1137               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'standard_name', 'forecast_period' ) ,&
1138                  & __LINE__,__MYFILE__)
1139               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'long_name', &
1140                  & 'Time elapsed since the start of the forecast' ) ,&
1141                  & __LINE__,__MYFILE__)
1142               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'bounds', 'time_bnd' ) ,&
1143                  & __LINE__,__MYFILE__)
1144            ENDIF
1145         ENDIF
1146         IF ( PRESENT(time_bnd) ) THEN
1147            i_var_exist = nf90_inq_varid( i_file_id, 'time_bnd', i_time_bnd_id )
1148            IF ( i_var_exist .NE. 0 ) THEN
1149               i_time_bnd=SHAPE(time_bnd)
1150               CALL nchdlerr( nf90_def_dim( i_file_id, 'time_bnd', i_time_bnd(1) , i_dim_id ) ,&
1151                  & __LINE__,__MYFILE__)
1152               CALL nchdlerr( nf90_def_var( i_file_id, 'time_bnd', nf90_int, (/i_dim_id, i_dim(3)/), i_time_bnd_id ) ,&
1153                  & __LINE__,__MYFILE__)
1154               CALL nchdlerr( nf90_put_att( i_file_id, i_time_bnd_id, 'units', 'days' ) ,&
1155                  & __LINE__,__MYFILE__)
1156            ENDIF
1157         ENDIF
1158         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
1159            & __LINE__,__MYFILE__)
1160         i_tab_start(3) = 1
1161         i_pos = 1
1162      ELSE
1163         CALL nchdlerr( nf90_get_att( i_file_id, i_var_id, 'valid_min', dl_min_old ) ,&
1164            & __LINE__,__MYFILE__)
1165         CALL nchdlerr( nf90_get_att( i_file_id, i_var_id, 'valid_max', dl_max_old ) ,&
1166            & __LINE__,__MYFILE__)
1167         dl_min = MIN( dl_min, dl_min_old )
1168         dl_max = MAX( dl_max, dl_max_old )
1169         CALL nchdlerr( nf90_redef( i_file_id ) ,&
1170            & __LINE__,__MYFILE__)
1171         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', dl_min ) ,&
1172            & __LINE__,__MYFILE__)
1173         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', dl_max ) ,&
1174            & __LINE__,__MYFILE__)
1175         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
1176            & __LINE__,__MYFILE__)
1177         CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_time_id, len=i_pos ) ,&
1178            & __LINE__,__MYFILE__)
1179         CALL nchdlerr( nf90_inq_varid( i_file_id, 'time', i_time_id ) ,&
1180            & __LINE__,__MYFILE__)
1181         IF ( PRESENT(reftime) ) THEN
1182            CALL nchdlerr( nf90_inq_varid( i_file_id, 'reftime', i_reftime_id ) ,&
1183               & __LINE__,__MYFILE__) 
1184         ENDIF
1185         IF ( PRESENT(leadtime) ) THEN
1186            CALL nchdlerr( nf90_inq_varid( i_file_id, 'leadtime', i_leadtime_id ) ,&
1187               & __LINE__,__MYFILE__) 
1188         ENDIF
1189         IF ( PRESENT(time_bnd) ) THEN
1190            i_time_bnd=SHAPE(time_bnd)
1191            CALL nchdlerr( nf90_inq_varid( i_file_id, 'time_bnd', i_time_bnd_id ) ,&
1192               & __LINE__,__MYFILE__) 
1193         ENDIF
1194         ALLOCATE( i_time(i_pos) )
1195         CALL nchdlerr( nf90_get_var( i_file_id, i_time_id, i_time ) ,&
1196            & __LINE__,__MYFILE__)
1197         DO ii =  1, i_pos 
1198            IF ( k_time .EQ. i_time(ii) ) THEN
1199               i_pos = ii - 1
1200               EXIT
1201            ENDIF
1202         ENDDO
1203         DEALLOCATE( i_time )
1204         i_pos = i_pos + 1
1205         i_tab_start(3) = i_pos 
1206      ENDIF
1207
1208      ! Put variable(s)
1209      ! --------------
1210      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, dd_var, &
1211         & start=i_tab_start, count=i_tab_count ) ,&
1212         & __LINE__,__MYFILE__)
1213      IF ( PRESENT(k_time) ) THEN
1214         CALL nchdlerr( nf90_put_var( i_file_id, i_time_id, (/k_time/), &
1215            & start=(/i_tab_start(3)/), count=(/i_tab_count(3)/) ) ,&
1216            & __LINE__,__MYFILE__)
1217      ELSE
1218         CALL nchdlerr( nf90_put_var( i_file_id, i_time_id, (/i_pos/), &
1219            & start=(/i_tab_start(3)/), count=(/i_tab_count(3)/) ) ,&
1220            & __LINE__,__MYFILE__)
1221      ENDIF
1222      IF ( PRESENT(reftime) ) THEN
1223         CALL nchdlerr( nf90_put_var( i_file_id, i_reftime_id, (/reftime/), &
1224            & start=(/i_tab_start(3)/), count=(/i_tab_count(3)/) ) ,&
1225            & __LINE__,__MYFILE__)
1226      ENDIF
1227      IF ( PRESENT(leadtime) ) THEN
1228         CALL nchdlerr( nf90_put_var( i_file_id, i_leadtime_id, (/leadtime/), &
1229            & start=(/i_tab_start(3)/), count=(/i_tab_count(3)/) ) ,&
1230            & __LINE__,__MYFILE__)
1231      ENDIF
1232      IF ( PRESENT(time_bnd) ) THEN
1233         CALL nchdlerr( nf90_put_var( i_file_id, i_time_bnd_id, time_bnd, &
1234            & start=(/1,i_tab_start(3)/), count=(/i_time_bnd(1),i_tab_count(3)/) ) ,&
1235            & __LINE__,__MYFILE__)
1236      ENDIF
1237
1238      CALL nchdlerr( nf90_close( i_file_id ) ,&
1239         & __LINE__,__MYFILE__)
1240
1241   END SUBROUTINE put_map_2d_d
1242
1243   SUBROUTINE put_map_3d_r ( cd_filename, p_var, p_missing, cd_var, k_code, k_time, reftime, leadtime, time_bnd, cd_descr )
1244      !!----------------------------------------------------------------------
1245      !!                ***  ROUTINE put_map_3d_r  ***
1246      !!
1247      !! ** Purpose :  write 3d map of reals in a netcdf file
1248      !!
1249      !! ** Method  : use netcdf fortran library
1250      !!       
1251      !! ** Action : - get variable informations
1252      !!             - (re)define variable
1253      !!             - put variable in netcdf file
1254      !!
1255      !! Reference :
1256      !!     
1257      !! History :
1258      !!    06-05  (N. Daget)  original code
1259      !!----------------------------------------------------------------------
1260      !! * Modules used
1261
1262      !! * Library used
1263
1264      !! * arguments
1265      CHARACTER(len=80), INTENT(in)            :: &
1266         cd_filename                                   ! filename
1267      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
1268         cd_var                                        ! variable name
1269      INTEGER, OPTIONAL, INTENT(in)            :: &
1270        k_code,                                   &    ! CF code
1271        k_time,                                   &    ! time of the variable
1272        leadtime                                       ! leadtime of the variable
1273      INTEGER, DIMENSION(:), OPTIONAL, INTENT(in) :: &
1274        time_bnd                                       ! time_bnd
1275      REAL(KIND=sp), OPTIONAL, INTENT(in)               :: &
1276        p_missing,                                &    ! missing value of the variable
1277        reftime                                        ! reftime of the variable
1278      REAL(KIND=sp), DIMENSION(:,:,:), INTENT(in)       :: &
1279        p_var                                          ! variable to write in netcdf file
1280      CHARACTER(len=80), DIMENSION(6), OPTIONAL, INTENT(in)   :: &
1281         cd_descr                                               ! description of file contents
1282
1283      !! * local declarations
1284      LOGICAL               :: llexist                 ! test
1285      CHARACTER(len=80)     :: cl_var                  ! new variable name
1286      INTEGER               ::                     &
1287         i_file_id, i_var_id,                      &   ! file and variable identifier
1288         i_dim_x_id, i_dim_y_id,                   &   ! dimension identifiers
1289         i_dim_z_id, i_time_id,                    &   ! dimension identifiers
1290         i_reftime_id, i_leadtime_id,              &   ! dimension identifier
1291         i_time_bnd_id, i_dim_id,                  &   ! dimension identifier
1292         i_var_exist, i_pos, ii                        ! test and temporary variable
1293      INTEGER, DIMENSION(1) :: i_time_bnd              ! dimensions of the variable
1294      INTEGER, DIMENSION(3) :: i_dimxy, i_len          ! dimensions of the variable
1295      INTEGER, DIMENSION(4) ::                     &
1296         i_tab_start, i_tab_count, i_dim               ! netcdf information
1297      INTEGER, DIMENSION(:), ALLOCATABLE        :: &
1298         i_time                                        ! time
1299      REAL                  ::                     &
1300         z_min, z_max, z_min_old, z_max_old            ! Minima and maxima of variable
1301      !!----------------------------------------------------------------------
1302
1303      ! Read dimensions and compute min and max
1304      ! ---------------------------------------
1305      i_dimxy = SHAPE( p_var)
1306      i_tab_start(1) = 1
1307      i_tab_count(1) = i_dimxy(1)
1308      i_tab_start(2) = 1
1309      i_tab_count(2) = i_dimxy(2)
1310      i_tab_start(3) = 1
1311      i_tab_count(3) = i_dimxy(3)
1312      i_tab_count(4) = 1
1313
1314      IF ( PRESENT(p_missing) ) THEN
1315         z_min = MINVAL(p_var, mask = p_var .NE. p_missing )
1316         z_max = MAXVAL(p_var, mask = p_var .NE. p_missing )
1317      ELSE
1318         z_min = MINVAL(p_var )
1319         z_max = MAXVAL(p_var )
1320      ENDIF
1321
1322      ! Define the name of the variable
1323      ! -------------------------------
1324      cl_var = "var"
1325      IF ( PRESENT(cd_var) ) cl_var = cd_var
1326      IF ( PRESENT(k_code) ) CALL get_var_info( k_code, cl_var )
1327
1328      !
1329      ! Open or create file
1330      ! -------------------
1331      INQUIRE( FILE=cd_filename, EXIST=llexist )
1332      IF ( .NOT. llexist ) THEN
1333         IF ( PRESENT( cd_descr ) ) THEN
1334            CALL create_map ( cd_filename, i_dimxy, cd_descr=cd_descr )
1335         ELSE
1336            CALL create_map ( cd_filename, i_dimxy )
1337         ENDIF
1338      ENDIF
1339
1340      CALL nchdlerr( nf90_open( cd_filename, nf90_write, i_file_id ) ,&
1341         & __LINE__,__MYFILE__)
1342
1343      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'time', i_time_id ) ,&
1344         & __LINE__,__MYFILE__)
1345      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'x', i_dim_x_id ) ,&
1346         & __LINE__,__MYFILE__)
1347      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'y', i_dim_y_id ) ,&
1348         & __LINE__,__MYFILE__)
1349      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'z', i_dim_z_id ) ,&
1350         & __LINE__,__MYFILE__)
1351      i_dim(1) = i_dim_x_id
1352      i_dim(2) = i_dim_y_id
1353      i_dim(3) = i_dim_z_id
1354      i_dim(4) = i_time_id
1355
1356      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dim(1), len=i_len(1) ) ,&
1357         & __LINE__,__MYFILE__)
1358      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dim(2), len=i_len(2) ) ,&
1359         & __LINE__,__MYFILE__)
1360      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dim(3), len=i_len(3) ) ,&
1361         & __LINE__,__MYFILE__)
1362
1363      IF ( (i_len(1) .NE. i_dimxy(1)) .OR. (i_len(2) .NE. i_dimxy(2)) .OR.  &
1364           (i_len(3) .NE. i_dimxy(3)) ) THEN
1365         WRITE(*,*)'filename = ',cd_filename
1366         WRITE(*,*)'variable = ',cl_var
1367         WRITE(*,*)'shape of array = ',i_dimxy
1368         WRITE(*,*)'Dimension length of variable = ',i_len
1369         WRITE(*,*)'Dimensions are different'
1370         WRITE(*,*)'CALL abort'
1371         CALL abort
1372      ENDIF
1373
1374      ! Define variable or find it
1375      ! --------------------------
1376      i_var_exist = nf90_inq_varid( i_file_id, cl_var, i_var_id )
1377      IF ( i_var_exist .NE. 0 ) THEN
1378         CALL nchdlerr( nf90_redef( i_file_id ) ,&
1379            & __LINE__,__MYFILE__)
1380         CALL nchdlerr( nf90_def_var( i_file_id, cl_var, nf90_real, i_dim, i_var_id ) ,&
1381            & __LINE__,__MYFILE__)
1382         IF ( PRESENT(k_code) ) CALL put_att( i_file_id, i_var_id, k_code )
1383         IF ( PRESENT(p_missing) )   &
1384           & CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, '_FillValue', p_missing ) ,&
1385           & __LINE__,__MYFILE__)
1386         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', z_min ) ,&
1387            & __LINE__,__MYFILE__)
1388         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', z_max ) ,&
1389            & __LINE__,__MYFILE__)
1390         i_var_exist = nf90_inq_varid( i_file_id, 'time', i_time_id )
1391         IF ( i_var_exist .NE. 0 ) THEN
1392            CALL nchdlerr( nf90_def_var( i_file_id, 'time', nf90_int, i_dim(4), i_time_id ) ,&
1393               & __LINE__,__MYFILE__)
1394         ENDIF
1395         IF ( PRESENT(reftime) ) THEN
1396            i_var_exist = nf90_inq_varid( i_file_id, 'reftime', i_reftime_id )
1397            IF ( i_var_exist .NE. 0 ) THEN
1398               CALL nchdlerr( nf90_def_var( i_file_id, 'reftime', nf90_real, i_dim(4), i_reftime_id ) ,&
1399                  & __LINE__,__MYFILE__)
1400               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'units', 'days since 1950-01-01 00:00:00' ) ,&
1401                  & __LINE__,__MYFILE__)
1402               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'standard_name', 'forecast_reference_time' ) ,&
1403                  & __LINE__,__MYFILE__)
1404               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'long_name', 'forecast reference time' ) ,&
1405                  & __LINE__,__MYFILE__)
1406            ENDIF
1407         ENDIF
1408         IF ( PRESENT(leadtime) ) THEN
1409            i_var_exist = nf90_inq_varid( i_file_id, 'leadtime', i_leadtime_id )
1410            IF ( i_var_exist .NE. 0 ) THEN
1411               CALL nchdlerr( nf90_def_var( i_file_id, 'leadtime', nf90_int, i_dim(4), i_leadtime_id ),__LINE__,__MYFILE__ )
1412               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'units', 'days' ) ,&
1413                  & __LINE__,__MYFILE__)
1414               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'standard_name', 'forecast_period' ) ,&
1415                  & __LINE__,__MYFILE__)
1416               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'long_name', &
1417                  & 'Time elapsed since the start of the forecast' ) ,&
1418                  & __LINE__,__MYFILE__)
1419               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'bounds', 'time_bnd' ) ,&
1420                  & __LINE__,__MYFILE__)
1421            ENDIF
1422         ENDIF
1423         IF ( PRESENT(time_bnd) ) THEN
1424            i_var_exist = nf90_inq_varid( i_file_id, 'time_bnd', i_time_bnd_id )
1425            IF ( i_var_exist .NE. 0 ) THEN
1426               i_time_bnd=SHAPE(time_bnd)
1427               CALL nchdlerr( nf90_def_dim( i_file_id, 'time_bnd', i_time_bnd(1) , i_dim_id ) ,&
1428                  & __LINE__,__MYFILE__)
1429               CALL nchdlerr( nf90_def_var( i_file_id, 'time_bnd', nf90_int, (/i_dim_id, i_dim(4)/), i_time_bnd_id ) ,&
1430                  & __LINE__,__MYFILE__)
1431               CALL nchdlerr( nf90_put_att( i_file_id, i_time_bnd_id, 'units', 'days' ) ,&
1432                  & __LINE__,__MYFILE__)
1433            ENDIF
1434         ENDIF
1435         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
1436            & __LINE__,__MYFILE__)
1437         i_tab_start(4) = 1
1438         i_pos = 1
1439      ELSE
1440         CALL nchdlerr( nf90_get_att( i_file_id, i_var_id, 'valid_min', z_min_old ) ,&
1441            & __LINE__,__MYFILE__)
1442         CALL nchdlerr( nf90_get_att( i_file_id, i_var_id, 'valid_max', z_max_old ) ,&
1443            & __LINE__,__MYFILE__)
1444         z_min = MIN( z_min, z_min_old )
1445         z_max = MAX( z_max, z_max_old )
1446         CALL nchdlerr( nf90_redef( i_file_id ) ,&
1447            & __LINE__,__MYFILE__)
1448         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', z_min ) ,&
1449            & __LINE__,__MYFILE__)
1450         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', z_max ) ,&
1451            & __LINE__,__MYFILE__)
1452         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
1453            & __LINE__,__MYFILE__)
1454         CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_time_id, len=i_pos ),__LINE__,__MYFILE__ )
1455         CALL nchdlerr( nf90_inq_varid( i_file_id, 'time', i_time_id ) ,&
1456            & __LINE__,__MYFILE__)
1457         IF ( PRESENT(reftime) ) THEN
1458            CALL nchdlerr( nf90_inq_varid( i_file_id, 'reftime', i_reftime_id ) ,&
1459               & __LINE__,__MYFILE__) 
1460         ENDIF
1461         IF ( PRESENT(leadtime) ) THEN
1462            CALL nchdlerr( nf90_inq_varid( i_file_id, 'leadtime', i_leadtime_id ) ,&
1463               & __LINE__,__MYFILE__) 
1464         ENDIF
1465         IF ( PRESENT(time_bnd) ) THEN
1466            i_time_bnd=SHAPE(time_bnd)
1467            CALL nchdlerr( nf90_inq_varid( i_file_id, 'time_bnd', i_time_bnd_id ) ,&
1468               & __LINE__,__MYFILE__) 
1469         ENDIF
1470         ALLOCATE( i_time(i_pos) )
1471         CALL nchdlerr( nf90_get_var( i_file_id, i_time_id, i_time ) ,&
1472            & __LINE__,__MYFILE__)
1473         DO ii =  1, i_pos 
1474            IF ( k_time .EQ. i_time(ii) ) THEN
1475               i_pos = ii - 1
1476               EXIT
1477            ENDIF
1478         ENDDO
1479         DEALLOCATE( i_time )
1480         i_pos = i_pos + 1
1481         i_tab_start(4) = i_pos 
1482      ENDIF
1483
1484      ! Put variable(s)
1485      ! --------------
1486      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, p_var, &
1487         & start=i_tab_start, count=i_tab_count ) ,&
1488         & __LINE__,__MYFILE__)
1489      IF ( PRESENT(k_time) ) THEN
1490         CALL nchdlerr( nf90_put_var( i_file_id, i_time_id, (/k_time/), &
1491            & start=(/i_tab_start(4)/), count=(/i_tab_count(4)/) ) ,&
1492            & __LINE__,__MYFILE__)
1493      ELSE
1494         CALL nchdlerr( nf90_put_var( i_file_id, i_time_id, (/i_pos/), &
1495            & start=(/i_tab_start(4)/), count=(/i_tab_count(4)/) ) ,&
1496            & __LINE__,__MYFILE__)
1497      ENDIF
1498      IF ( PRESENT(reftime) ) THEN
1499         CALL nchdlerr( nf90_put_var( i_file_id, i_reftime_id, (/reftime/), &
1500            & start=(/i_tab_start(4)/), count=(/i_tab_count(4)/) ) ,&
1501            & __LINE__,__MYFILE__)
1502      ENDIF
1503      IF ( PRESENT(leadtime) ) THEN
1504         CALL nchdlerr( nf90_put_var( i_file_id, i_leadtime_id, (/leadtime/), &
1505            & start=(/i_tab_start(4)/), count=(/i_tab_count(4)/) ) ,&
1506            & __LINE__,__MYFILE__)
1507      ENDIF
1508      IF ( PRESENT(time_bnd) ) THEN
1509         CALL nchdlerr( nf90_put_var( i_file_id, i_time_bnd_id, time_bnd, &
1510            start=(/1,i_tab_start(4)/), count=(/i_time_bnd(1),i_tab_count(4)/) ),__LINE__,__MYFILE__ )
1511      ENDIF
1512
1513      CALL nchdlerr( nf90_close( i_file_id ) ,&
1514         & __LINE__,__MYFILE__)
1515
1516   END SUBROUTINE put_map_3d_r
1517
1518   SUBROUTINE put_map_3d_d ( cd_filename, dd_var, dd_missing, cd_var, k_code, k_time, reftime, leadtime, time_bnd, cd_descr )
1519      !!----------------------------------------------------------------------
1520      !!                ***  ROUTINE put_map_3d_d  ***
1521      !!
1522      !! ** Purpose :  write 3d map of reals in a netcdf file
1523      !!
1524      !! ** Method  : use netcdf fortran library
1525      !!       
1526      !! ** Action : - get variable informations
1527      !!             - (re)define variable
1528      !!             - put variable in netcdf file
1529      !!
1530      !! Reference :
1531      !!     
1532      !! History :
1533      !!    06-05  (N. Daget)  original code
1534      !!----------------------------------------------------------------------
1535      !! * Modules used
1536
1537      !! * Library used
1538
1539      !! * arguments
1540      CHARACTER(len=80), INTENT(in)            :: &
1541         cd_filename                                   ! filename
1542      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
1543         cd_var                                        ! variable name
1544      INTEGER, OPTIONAL, INTENT(in)            :: &
1545        k_code,                                   &    ! CF code
1546        k_time,                                   &    ! time of the variable
1547        leadtime                                       ! leadtime of the variable
1548      INTEGER, DIMENSION(:), OPTIONAL, INTENT(in) :: &
1549        time_bnd                                       ! time_bnd
1550      REAL(KIND=dp), OPTIONAL, INTENT(in)      :: &
1551        dd_missing,                               &    ! missing value of the variable
1552        reftime                                        ! reftime of the variable
1553      REAL(KIND=dp), DIMENSION(:,:,:), INTENT(in)  :: &
1554        dd_var                                         ! variable to write in netcdf file
1555      CHARACTER(len=80), DIMENSION(6), OPTIONAL, INTENT(in)   :: &
1556         cd_descr                                               ! description of file contents
1557
1558      !! * local declarations
1559      LOGICAL               :: llexist                 ! test
1560      CHARACTER(len=80)     :: cl_var                  ! new variable name
1561      INTEGER               ::                     &
1562         i_file_id, i_var_id,                      &   ! file and variable identifier
1563         i_dim_x_id, i_dim_y_id,                   &   ! dimension identifiers
1564         i_dim_z_id, i_time_id,                    &   ! dimension identifiers
1565         i_reftime_id, i_leadtime_id,              &   ! dimension identifier
1566         i_time_bnd_id, i_dim_id,                  &   ! dimension identifier
1567         i_var_exist, i_pos, ii                        ! test and temporary variable
1568      INTEGER, DIMENSION(1) :: i_time_bnd              ! dimensions of the variable
1569      INTEGER, DIMENSION(3) :: i_dimxy, i_len          ! dimensions of the variable
1570      INTEGER, DIMENSION(4) ::                     &
1571         i_tab_start, i_tab_count, i_dim               ! netcdf information
1572      INTEGER, DIMENSION(:), ALLOCATABLE        :: &
1573         i_time                                        ! time
1574      REAL(KIND=dp)      ::                     &
1575         dl_min, dl_max, dl_min_old, dl_max_old        ! Minima and maxima of variable
1576      !!----------------------------------------------------------------------
1577
1578      ! Read dimensions and compute min and max
1579      ! ---------------------------------------
1580      i_dimxy = SHAPE( dd_var)
1581      i_tab_start(1) = 1
1582      i_tab_count(1) = i_dimxy(1)
1583      i_tab_start(2) = 1
1584      i_tab_count(2) = i_dimxy(2)
1585      i_tab_start(3) = 1
1586      i_tab_count(3) = i_dimxy(3)
1587      i_tab_count(4) = 1
1588
1589      IF ( PRESENT(dd_missing) ) THEN
1590         dl_min = MINVAL(dd_var, mask = dd_var .NE. dd_missing )
1591         dl_max = MAXVAL(dd_var, mask = dd_var .NE. dd_missing )
1592      ELSE
1593         dl_min = MINVAL(dd_var )
1594         dl_max = MAXVAL(dd_var )
1595      ENDIF
1596
1597      ! Define the name of the variable
1598      ! -------------------------------
1599      cl_var = "var"
1600      IF ( PRESENT(cd_var) ) cl_var = cd_var
1601      IF ( PRESENT(k_code) ) CALL get_var_info( k_code, cl_var )
1602
1603      !
1604      ! Open or create file
1605      ! -------------------
1606      INQUIRE( FILE=cd_filename, EXIST=llexist )
1607      IF ( .NOT. llexist ) THEN
1608         IF ( PRESENT( cd_descr ) ) THEN
1609            CALL create_map ( cd_filename, i_dimxy, cd_descr=cd_descr )
1610         ELSE
1611            CALL create_map ( cd_filename, i_dimxy )
1612         ENDIF
1613      ENDIF
1614
1615      CALL nchdlerr( nf90_open( cd_filename, nf90_write, i_file_id ) ,&
1616         & __LINE__,__MYFILE__)
1617
1618      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'time', i_time_id ) ,&
1619         & __LINE__,__MYFILE__)
1620      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'x', i_dim_x_id ) ,&
1621         & __LINE__,__MYFILE__)
1622      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'y', i_dim_y_id ) ,&
1623         & __LINE__,__MYFILE__)
1624      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'z', i_dim_z_id ) ,&
1625         & __LINE__,__MYFILE__)
1626      i_dim(1) = i_dim_x_id
1627      i_dim(2) = i_dim_y_id
1628      i_dim(3) = i_dim_z_id
1629      i_dim(4) = i_time_id
1630
1631      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dim(1), len=i_len(1) ) ,&
1632         & __LINE__,__MYFILE__)
1633      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dim(2), len=i_len(2) ) ,&
1634         & __LINE__,__MYFILE__)
1635      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dim(3), len=i_len(3) ) ,&
1636         & __LINE__,__MYFILE__)
1637
1638      IF ( (i_len(1) .NE. i_dimxy(1)) .OR. (i_len(2) .NE. i_dimxy(2)) .OR.  &
1639           (i_len(3) .NE. i_dimxy(3)) ) THEN
1640         WRITE(*,*)'filename = ',cd_filename
1641         WRITE(*,*)'variable = ',cl_var
1642         WRITE(*,*)'shape of array = ',i_dimxy
1643         WRITE(*,*)'Dimension length of variable = ',i_len
1644         WRITE(*,*)'Dimensions are different'
1645         WRITE(*,*)'CALL abort'
1646         CALL abort
1647      ENDIF
1648      ! Define variable or find it
1649      ! --------------------------
1650      i_var_exist = nf90_inq_varid( i_file_id, cl_var, i_var_id )
1651      IF ( i_var_exist .NE. 0 ) THEN
1652         CALL nchdlerr( nf90_redef( i_file_id ) ,&
1653            & __LINE__,__MYFILE__)
1654         CALL nchdlerr( nf90_def_var( i_file_id, cl_var, nf90_double, i_dim, i_var_id ) ,&
1655            & __LINE__,__MYFILE__)
1656         IF ( PRESENT(k_code) ) CALL put_att( i_file_id, i_var_id, k_code )
1657         IF ( PRESENT(dd_missing) )   &
1658           & CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, '_FillValue', dd_missing ) ,&
1659           & __LINE__,__MYFILE__)
1660         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', dl_min ) ,&
1661            & __LINE__,__MYFILE__)
1662         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', dl_max ) ,&
1663            & __LINE__,__MYFILE__)
1664         i_var_exist = nf90_inq_varid( i_file_id, 'time', i_time_id )
1665         IF ( i_var_exist .NE. 0 ) THEN
1666            CALL nchdlerr( nf90_def_var( i_file_id, 'time', nf90_int, i_dim(4), i_time_id ) ,&
1667               & __LINE__,__MYFILE__)
1668         ENDIF
1669         IF ( PRESENT(reftime) ) THEN
1670            i_var_exist = nf90_inq_varid( i_file_id, 'reftime', i_reftime_id )
1671            IF ( i_var_exist .NE. 0 ) THEN
1672               CALL nchdlerr( nf90_def_var( i_file_id, 'reftime', nf90_double, i_dim(4), i_reftime_id ) ,&
1673                  & __LINE__,__MYFILE__)
1674               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'units', 'days since 1950-01-01 00:00:00' ) ,&
1675                  & __LINE__,__MYFILE__)
1676               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'standard_name', 'forecast_reference_time' ) ,&
1677                  & __LINE__,__MYFILE__)
1678               CALL nchdlerr( nf90_put_att( i_file_id, i_reftime_id, 'long_name', 'forecast reference time' ) ,&
1679                  & __LINE__,__MYFILE__)
1680            ENDIF
1681         ENDIF
1682         IF ( PRESENT(leadtime) ) THEN
1683            i_var_exist = nf90_inq_varid( i_file_id, 'leadtime', i_leadtime_id )
1684            IF ( i_var_exist .NE. 0 ) THEN
1685               CALL nchdlerr( nf90_def_var( i_file_id, 'leadtime', nf90_int, i_dim(4), i_leadtime_id ),__LINE__,__MYFILE__ )
1686               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'units', 'days' ) ,&
1687                  & __LINE__,__MYFILE__)
1688               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'standard_name', 'forecast_period' ) ,&
1689                  & __LINE__,__MYFILE__)
1690               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'long_name', &
1691                  & 'Time elapsed since the start of the forecast' ) ,&
1692                  & __LINE__,__MYFILE__)
1693               CALL nchdlerr( nf90_put_att( i_file_id, i_leadtime_id, 'bounds', 'time_bnd' ) ,&
1694                  & __LINE__,__MYFILE__)
1695            ENDIF
1696         ENDIF
1697         IF ( PRESENT(time_bnd) ) THEN
1698            i_var_exist = nf90_inq_varid( i_file_id, 'time_bnd', i_time_bnd_id )
1699            IF ( i_var_exist .NE. 0 ) THEN
1700               i_time_bnd=SHAPE(time_bnd)
1701               CALL nchdlerr( nf90_def_dim( i_file_id, 'time_bnd', i_time_bnd(1) , i_dim_id ) ,&
1702                  & __LINE__,__MYFILE__)
1703               CALL nchdlerr( nf90_def_var( i_file_id, 'time_bnd', nf90_int, (/i_dim_id, i_dim(4)/), i_time_bnd_id ) ,&
1704                  & __LINE__,__MYFILE__)
1705               CALL nchdlerr( nf90_put_att( i_file_id, i_time_bnd_id, 'units', 'days' ) ,&
1706                  & __LINE__,__MYFILE__)
1707            ENDIF
1708         ENDIF
1709         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
1710            & __LINE__,__MYFILE__)
1711         i_tab_start(4) = 1
1712         i_pos = 1
1713      ELSE
1714         CALL nchdlerr( nf90_get_att( i_file_id, i_var_id, 'valid_min', dl_min_old ) ,&
1715            & __LINE__,__MYFILE__)
1716         CALL nchdlerr( nf90_get_att( i_file_id, i_var_id, 'valid_max', dl_max_old ) ,&
1717            & __LINE__,__MYFILE__)
1718         dl_min = MIN( dl_min, dl_min_old )
1719         dl_max = MAX( dl_max, dl_max_old )
1720         CALL nchdlerr( nf90_redef( i_file_id ) ,&
1721            & __LINE__,__MYFILE__)
1722         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', dl_min ) ,&
1723            & __LINE__,__MYFILE__)
1724         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', dl_max ) ,&
1725            & __LINE__,__MYFILE__)
1726         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
1727            & __LINE__,__MYFILE__)
1728         CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_time_id, len=i_pos ),__LINE__,__MYFILE__ )
1729         CALL nchdlerr( nf90_inq_varid( i_file_id, 'time', i_time_id ) ,&
1730            & __LINE__,__MYFILE__)
1731         IF ( PRESENT(reftime) ) THEN
1732            CALL nchdlerr( nf90_inq_varid( i_file_id, 'reftime', i_reftime_id ) ,&
1733               & __LINE__,__MYFILE__) 
1734         ENDIF
1735         IF ( PRESENT(leadtime) ) THEN
1736            CALL nchdlerr( nf90_inq_varid( i_file_id, 'leadtime', i_leadtime_id ) ,&
1737               & __LINE__,__MYFILE__) 
1738         ENDIF
1739         IF ( PRESENT(time_bnd) ) THEN
1740            i_time_bnd=SHAPE(time_bnd)
1741            CALL nchdlerr( nf90_inq_varid( i_file_id, 'time_bnd', i_time_bnd_id ) ,&
1742               & __LINE__,__MYFILE__) 
1743         ENDIF
1744         ALLOCATE( i_time(i_pos) )
1745         CALL nchdlerr( nf90_get_var( i_file_id, i_time_id, i_time ) ,&
1746            & __LINE__,__MYFILE__)
1747         DO ii =  1, i_pos 
1748            IF ( k_time .EQ. i_time(ii) ) THEN
1749               i_pos = ii - 1
1750               EXIT
1751            ENDIF
1752         ENDDO
1753         DEALLOCATE( i_time )
1754         i_pos = i_pos + 1
1755         i_tab_start(4) = i_pos 
1756      ENDIF
1757
1758      ! Put variable(s)
1759      ! --------------
1760      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, dd_var, &
1761         & start=i_tab_start, count=i_tab_count ) ,&
1762         & __LINE__,__MYFILE__)
1763      IF ( PRESENT(k_time) ) THEN
1764         CALL nchdlerr( nf90_put_var( i_file_id, i_time_id, (/k_time/), &
1765            & start=(/i_tab_start(4)/), count=(/i_tab_count(4)/) ) ,&
1766            & __LINE__,__MYFILE__)
1767      ELSE
1768         CALL nchdlerr( nf90_put_var( i_file_id, i_time_id, (/i_pos/), &
1769            & start=(/i_tab_start(4)/), count=(/i_tab_count(4)/) ) ,&
1770            & __LINE__,__MYFILE__)
1771      ENDIF
1772      IF ( PRESENT(reftime) ) THEN
1773         CALL nchdlerr( nf90_put_var( i_file_id, i_reftime_id, (/reftime/), &
1774            & start=(/i_tab_start(4)/), count=(/i_tab_count(4)/) ) ,&
1775            & __LINE__,__MYFILE__)
1776      ENDIF
1777      IF ( PRESENT(leadtime) ) THEN
1778         CALL nchdlerr( nf90_put_var( i_file_id, i_leadtime_id, (/leadtime/), &
1779            & start=(/i_tab_start(4)/), count=(/i_tab_count(4)/) ) ,&
1780            & __LINE__,__MYFILE__)
1781      ENDIF
1782      IF ( PRESENT(time_bnd) ) THEN
1783         CALL nchdlerr( nf90_put_var( i_file_id, i_time_bnd_id, time_bnd, &
1784            & start=(/1,i_tab_start(4)/), count=(/i_time_bnd(1),i_tab_count(4)/) ) ,&
1785            & __LINE__,__MYFILE__)
1786      ENDIF
1787
1788      CALL nchdlerr( nf90_close( i_file_id ) ,&
1789         & __LINE__,__MYFILE__)
1790
1791   END SUBROUTINE put_map_3d_d
1792
1793   !!======================================================================
1794
1795   SUBROUTINE get_var_1d_i ( cd_filename, cd_var, k_var, k_missing )
1796      !!----------------------------------------------------------------------
1797      !!                ***  ROUTINE get_var_1d_i  ***
1798      !!
1799      !! ** Purpose :  read 1d map of integers in a netcdf file
1800      !!
1801      !! ** Method  : use netcdf fortran library
1802      !!       
1803      !! ** Action : - get variable informations
1804      !!             - read variable
1805      !!
1806      !! Reference :
1807      !!     
1808      !! History :
1809      !!    06-05  (N. Daget)  original code
1810      !!----------------------------------------------------------------------
1811      !! * Modules used
1812
1813      !! * Library used
1814
1815      !! * arguments
1816      CHARACTER(len=80), INTENT(in)            :: &
1817         cd_filename                                   ! filename
1818      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
1819         cd_var                                        ! variable name
1820      INTEGER, DIMENSION(:), INTENT(out)       :: &
1821        k_var                                          ! variable to read in netcdf file
1822      INTEGER, OPTIONAL, INTENT(out)           :: &
1823        k_missing                                      ! missing value of the variable
1824
1825      !! * local declarations
1826      INTEGER               ::                     &
1827         i_file_id, i_var_id,                      &   ! file and variable identifier
1828         i_ndims,                                  &   ! Number of dimensions for this variable
1829         i_type,                                   &   ! external data type for this variable
1830         i_exist                                       ! test
1831      INTEGER, DIMENSION(1) :: i_dimid, i_len, i_shape ! dimensions of the variable
1832      INTEGER               :: i_missing2              ! missing value of the variable
1833      !!----------------------------------------------------------------------
1834
1835      ! Open and test netcdf file
1836      ! -------------------------
1837      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
1838         & __LINE__,__MYFILE__)
1839      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
1840         & __LINE__,__MYFILE__)
1841      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
1842         & __LINE__,__MYFILE__)
1843      IF ( i_type .NE. 4 ) THEN
1844         WRITE(*,*)'filename = ',cd_filename
1845         WRITE(*,*)'variable = ',cd_var
1846         WRITE(*,*)'External type for this variable = ',i_type
1847         WRITE(*,*)'The valid external data type is NF_INT : 4'
1848         WRITE(*,*)'CALL abort'
1849         CALL abort
1850      ENDIF
1851      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
1852         & __LINE__,__MYFILE__)
1853      IF ( i_ndims .NE. 1 ) THEN
1854         WRITE(*,*)'filename = ',cd_filename
1855         WRITE(*,*)'variable = ',cd_var
1856         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
1857         WRITE(*,*)'The valid number of dimension is 1'
1858         WRITE(*,*)'CALL abort'
1859         CALL abort
1860      ENDIF
1861      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
1862         & __LINE__,__MYFILE__)
1863      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
1864         & __LINE__,__MYFILE__)
1865      i_shape=SHAPE(k_var)
1866      IF ( i_len(1) .NE. i_shape(1) ) THEN
1867         WRITE(*,*)'filename = ',cd_filename
1868         WRITE(*,*)'variable = ',cd_var
1869         WRITE(*,*)'shape of array = ',SHAPE(k_var)
1870         WRITE(*,*)'Dimension length of variable = ',i_len
1871         WRITE(*,*)'Dimensions are different'
1872         WRITE(*,*)'CALL abort'
1873         CALL abort
1874      ENDIF
1875
1876      ! Read variable
1877      ! -------------
1878      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, k_var ) ,&
1879         & __LINE__,__MYFILE__)
1880
1881      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', i_missing2 )
1882      IF ( i_exist .NE. nf90_noerr  ) THEN
1883         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', i_missing2 )
1884      ENDIF
1885
1886      CALL nchdlerr( nf90_close( i_file_id ) ,&
1887         & __LINE__,__MYFILE__)
1888
1889      IF ( i_exist .NE. nf90_noerr  ) THEN
1890         i_missing2 = MAXVAL(k_var)
1891      ENDIF
1892
1893      IF ( PRESENT(k_missing) ) THEN
1894         k_missing = i_missing2
1895      ELSE
1896         WHERE(k_var .EQ. i_missing2) k_var = 0.0
1897         WHERE((k_var .GT. 0.) .EQV. (k_var .LE. 0.)) k_var = 0.0
1898      ENDIF
1899
1900   END SUBROUTINE get_var_1d_i
1901
1902   SUBROUTINE get_var_2d_i ( cd_filename, cd_var, k_var, k_missing )
1903      !!----------------------------------------------------------------------
1904      !!                ***  ROUTINE get_var_2d_i  ***
1905      !!
1906      !! ** Purpose :  read 2d map of integers in a netcdf file
1907      !!
1908      !! ** Method  : use netcdf fortran library
1909      !!       
1910      !! ** Action : - get variable informations
1911      !!             - read variable
1912      !!
1913      !! Reference :
1914      !!     
1915      !! History :
1916      !!    06-05  (N. Daget)  original code
1917      !!----------------------------------------------------------------------
1918      !! * Modules used
1919
1920      !! * Library used
1921
1922      !! * arguments
1923      CHARACTER(len=80), INTENT(in)            :: &
1924         cd_filename                                   ! filename
1925      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
1926         cd_var                                        ! variable name
1927      INTEGER, DIMENSION(:,:), INTENT(out)        :: &
1928        k_var                                          ! variable to read in netcdf file
1929      INTEGER, OPTIONAL, INTENT(out)              :: &
1930        k_missing                                      ! missing value of the variable
1931
1932      !! * local declarations
1933      INTEGER               ::                     &
1934         i_file_id, i_var_id,                      &   ! file and variable identifier
1935         i_ndims,                                  &   ! Number of dimensions for this variable
1936         i_type,                                   &   ! external data type for this variable
1937         i_exist                                       ! test
1938      INTEGER, DIMENSION(2) :: i_dimid, i_len, i_shape ! dimensions of the variable
1939      INTEGER                  :: i_missing2              ! missing value of the variable
1940      !!----------------------------------------------------------------------
1941
1942      ! Open and test netcdf file
1943      ! -------------------------
1944      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
1945         & __LINE__,__MYFILE__)
1946      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
1947         & __LINE__,__MYFILE__)
1948      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
1949         & __LINE__,__MYFILE__)
1950      IF ( i_type .NE. 4 ) THEN
1951         WRITE(*,*)'filename = ',cd_filename
1952         WRITE(*,*)'variable = ',cd_var
1953         WRITE(*,*)'External type for this variable = ',i_type
1954         WRITE(*,*)'The valid external data type is NF_INT : 4'
1955         WRITE(*,*)'CALL abort'
1956         CALL abort
1957      ENDIF
1958      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
1959         & __LINE__,__MYFILE__)
1960      IF ( i_ndims .NE. 2 ) THEN
1961         WRITE(*,*)'filename = ',cd_filename
1962         WRITE(*,*)'variable = ',cd_var
1963         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
1964         WRITE(*,*)'The valid number of dimension is 2'
1965         WRITE(*,*)'CALL abort'
1966         CALL abort
1967      ENDIF
1968      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
1969         & __LINE__,__MYFILE__)
1970      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
1971         & __LINE__,__MYFILE__)
1972      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(2), len=i_len(2) ) ,&
1973         & __LINE__,__MYFILE__)
1974      i_shape=SHAPE(k_var)
1975      IF ( (i_len(1) .NE. i_shape(1)) .OR. (i_len(2) .NE. i_shape(2)) ) THEN
1976         WRITE(*,*)'filename = ',cd_filename
1977         WRITE(*,*)'variable = ',cd_var
1978         WRITE(*,*)'shape of array = ',SHAPE(k_var)
1979         WRITE(*,*)'Dimension length of variable = ',i_len
1980         WRITE(*,*)'Dimensions are different'
1981         WRITE(*,*)'CALL abort'
1982         CALL abort
1983      ENDIF
1984
1985      ! Read variable
1986      ! -------------
1987      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, k_var ) ,&
1988         & __LINE__,__MYFILE__)
1989
1990      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', i_missing2 )
1991      IF ( i_exist .NE. nf90_noerr  ) THEN
1992         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', i_missing2 )
1993      ENDIF
1994
1995      CALL nchdlerr( nf90_close( i_file_id ) ,&
1996         & __LINE__,__MYFILE__)
1997
1998      IF ( i_exist .NE. nf90_noerr  ) THEN
1999         i_missing2 = MAXVAL(k_var)
2000      ENDIF
2001
2002      IF ( PRESENT(k_missing) ) THEN
2003         k_missing = i_missing2
2004      ELSE
2005         WHERE(k_var .EQ. i_missing2) k_var = 0.0
2006         WHERE((k_var .GT. 0.) .EQV. (k_var .LE. 0.)) k_var = 0.0
2007      ENDIF
2008
2009   END SUBROUTINE get_var_2d_i
2010
2011   SUBROUTINE get_var_3d_i ( cd_filename, cd_var, k_var, k_missing )
2012      !!----------------------------------------------------------------------
2013      !!                ***  ROUTINE get_var_3d_i  ***
2014      !!
2015      !! ** Purpose :  read 3d map of integers in a netcdf file
2016      !!
2017      !! ** Method  : use netcdf fortran library
2018      !!       
2019      !! ** Action : - get variable informations
2020      !!             - read variable
2021      !!
2022      !! Reference :
2023      !!     
2024      !! History :
2025      !!    06-05  (N. Daget)  original code
2026      !!----------------------------------------------------------------------
2027      !! * Modules used
2028
2029      !! * Library used
2030
2031      !! * arguments
2032      CHARACTER(len=80), INTENT(in)            :: &
2033         cd_filename                                   ! filename
2034      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
2035         cd_var                                        ! variable name
2036      INTEGER, DIMENSION(:,:,:), INTENT(out)      :: &
2037        k_var                                          ! variable to read in netcdf file
2038      INTEGER, OPTIONAL, INTENT(out)              :: &
2039        k_missing                                      ! missing value of the variable
2040
2041      !! * local declarations
2042      INTEGER               ::                     &
2043         i_file_id, i_var_id,                      &   ! file and variable identifier
2044         i_ndims,                                  &   ! Number of dimensions for this variable
2045         i_type,                                   &   ! external data type for this variable
2046         i_exist                                       ! test
2047      INTEGER, DIMENSION(3) :: i_dimid, i_len, i_shape ! dimensions of the variable
2048      INTEGER                  :: i_missing2              ! missing value of the variable
2049      !!----------------------------------------------------------------------
2050
2051      ! Open and test netcdf file
2052      ! -------------------------
2053      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
2054         & __LINE__,__MYFILE__)
2055      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
2056         & __LINE__,__MYFILE__)
2057      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
2058         & __LINE__,__MYFILE__)
2059      IF ( i_type .NE. 4 ) THEN
2060         WRITE(*,*)'filename = ',cd_filename
2061         WRITE(*,*)'variable = ',cd_var
2062         WRITE(*,*)'External type for this variable = ',i_type
2063         WRITE(*,*)'The valid external data type is NF_INT : 4'
2064         WRITE(*,*)'CALL abort'
2065         CALL abort
2066      ENDIF
2067      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
2068         & __LINE__,__MYFILE__)
2069      IF ( i_ndims .NE. 3 ) THEN
2070         WRITE(*,*)'filename = ',cd_filename
2071         WRITE(*,*)'variable = ',cd_var
2072         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
2073         WRITE(*,*)'The valid number of dimension is 3'
2074         WRITE(*,*)'CALL abort'
2075         CALL abort
2076      ENDIF
2077      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
2078         & __LINE__,__MYFILE__)
2079      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
2080         & __LINE__,__MYFILE__)
2081      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(2), len=i_len(2) ) ,&
2082         & __LINE__,__MYFILE__)
2083      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(3), len=i_len(3) ) ,&
2084         & __LINE__,__MYFILE__)
2085      i_shape=SHAPE(k_var)
2086      IF ( (i_len(1) .NE. i_shape(1)) .OR. (i_len(2) .NE. i_shape(2)) &
2087          .OR. (i_len(3) .NE. i_shape(3)) ) THEN
2088         WRITE(*,*)'filename = ',cd_filename
2089         WRITE(*,*)'variable = ',cd_var
2090         WRITE(*,*)'shape of array = ',SHAPE(k_var)
2091         WRITE(*,*)'Dimension length of variable = ',i_len
2092         WRITE(*,*)'Dimensions are different'
2093         WRITE(*,*)'CALL abort'
2094         CALL abort
2095      ENDIF
2096
2097      ! Read variable
2098      ! -------------
2099      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, k_var ) ,&
2100         & __LINE__,__MYFILE__)
2101
2102      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', i_missing2 )
2103      IF ( i_exist .NE. nf90_noerr  ) THEN
2104         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', i_missing2 )
2105      ENDIF
2106
2107      CALL nchdlerr( nf90_close( i_file_id ) ,&
2108         & __LINE__,__MYFILE__)
2109
2110      IF ( i_exist .NE. nf90_noerr  ) THEN
2111            i_missing2 = MAXVAL(k_var)
2112      ENDIF
2113
2114      IF ( PRESENT(k_missing) ) THEN
2115         k_missing = i_missing2
2116      ELSE
2117         WHERE(k_var .EQ. i_missing2) k_var = 0.0
2118         WHERE((k_var .GT. 0.) .EQV. (k_var .LE. 0.)) k_var = 0.0
2119      ENDIF
2120
2121   END SUBROUTINE get_var_3d_i
2122
2123   SUBROUTINE get_var_4d_i ( cd_filename, cd_var, k_var, k_missing )
2124      !!----------------------------------------------------------------------
2125      !!                ***  ROUTINE get_var_4d_i  ***
2126      !!
2127      !! ** Purpose :  read 4d map of integers in a netcdf file
2128      !!
2129      !! ** Method  : use netcdf fortran library
2130      !!       
2131      !! ** Action : - get variable informations
2132      !!             - read variable
2133      !!
2134      !! Reference :
2135      !!     
2136      !! History :
2137      !!    06-05  (N. Daget)  original code
2138      !!----------------------------------------------------------------------
2139      !! * Modules used
2140
2141      !! * Library used
2142
2143
2144      !! * arguments
2145      CHARACTER(len=80), INTENT(in)            :: &
2146         cd_filename                                   ! filename
2147      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
2148         cd_var                                        ! variable name
2149      INTEGER, DIMENSION(:,:,:,:), INTENT(out)    :: &
2150        k_var                                          ! variable to read in netcdf file
2151      INTEGER, OPTIONAL, INTENT(out)              :: &
2152        k_missing                                      ! missing value of the variable
2153
2154      !! * local declarations
2155      INTEGER               ::                     &
2156         i_file_id, i_var_id,                      &   ! file and variable identifier
2157         i_ndims,                                  &   ! Number of dimensions for this variable
2158         i_type,                                   &   ! external data type for this variable
2159         i_exist                                       ! test
2160      INTEGER, DIMENSION(4) :: i_dimid, i_len, i_shape ! dimensions of the variable
2161      INTEGER                  :: i_missing2              ! missing value of the variable
2162      !!----------------------------------------------------------------------
2163
2164      ! Open and test netcdf file
2165      ! -------------------------
2166      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
2167         & __LINE__,__MYFILE__)
2168      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
2169         & __LINE__,__MYFILE__)
2170      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
2171         & __LINE__,__MYFILE__)
2172      IF ( i_type .NE. 4 ) THEN
2173         WRITE(*,*)'filename = ',cd_filename
2174         WRITE(*,*)'variable = ',cd_var
2175         WRITE(*,*)'External type for this variable = ',i_type
2176         WRITE(*,*)'The valid external data type is NF_INT : 4'
2177         WRITE(*,*)'CALL abort'
2178         CALL abort
2179      ENDIF
2180      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
2181         & __LINE__,__MYFILE__)
2182      IF ( i_ndims .NE. 4 ) THEN
2183         WRITE(*,*)'filename = ',cd_filename
2184         WRITE(*,*)'variable = ',cd_var
2185         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
2186         WRITE(*,*)'The valid number of dimension is 4'
2187         WRITE(*,*)'CALL abort'
2188         CALL abort
2189      ENDIF
2190      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
2191         & __LINE__,__MYFILE__)
2192      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
2193         & __LINE__,__MYFILE__)
2194      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(2), len=i_len(2) ) ,&
2195         & __LINE__,__MYFILE__)
2196      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(3), len=i_len(3) ) ,&
2197         & __LINE__,__MYFILE__)
2198      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(4), len=i_len(4) ) ,&
2199         & __LINE__,__MYFILE__)
2200      i_shape=SHAPE(k_var)
2201      IF ( (i_len(1) .NE. i_shape(1)) .OR. (i_len(2) .NE. i_shape(2)) &
2202          .OR. (i_len(3) .NE. i_shape(3)) .OR. (i_len(4) .NE. i_shape(4)) ) THEN
2203         WRITE(*,*)'filename = ',cd_filename
2204         WRITE(*,*)'variable = ',cd_var
2205         WRITE(*,*)'shape of array = ',SHAPE(k_var)
2206         WRITE(*,*)'Dimension length of variable = ',i_len
2207         WRITE(*,*)'Dimensions are different'
2208         WRITE(*,*)'CALL abort'
2209         CALL abort
2210      ENDIF
2211
2212      ! Read variable
2213      ! -------------
2214      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, k_var ) ,&
2215         & __LINE__,__MYFILE__)
2216
2217      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', i_missing2 )
2218      IF ( i_exist .NE. nf90_noerr  ) THEN
2219         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', i_missing2 )
2220      ENDIF
2221
2222      CALL nchdlerr( nf90_close( i_file_id ) ,&
2223         & __LINE__,__MYFILE__)
2224
2225      IF ( i_exist .NE. nf90_noerr  ) THEN
2226         i_missing2 = MAXVAL(k_var)
2227      ENDIF
2228
2229      IF ( PRESENT(k_missing) ) THEN
2230         k_missing = i_missing2
2231      ELSE
2232         WHERE(k_var .EQ. i_missing2) k_var = 0.0
2233         WHERE((k_var .GT. 0.) .EQV. (k_var .LE. 0.)) k_var = 0.0
2234      ENDIF
2235
2236   END SUBROUTINE get_var_4d_i
2237
2238   SUBROUTINE get_var_1d_r ( cd_filename, cd_var, p_var, p_missing )
2239      !!----------------------------------------------------------------------
2240      !!                ***  ROUTINE get_var_1d_r  ***
2241      !!
2242      !! ** Purpose :  read 1d map of reals in a netcdf file
2243      !!
2244      !! ** Method  : use netcdf fortran library
2245      !!       
2246      !! ** Action : - get variable informations
2247      !!             - read variable
2248      !!
2249      !! Reference :
2250      !!     
2251      !! History :
2252      !!    06-05  (N. Daget)  original code
2253      !!----------------------------------------------------------------------
2254      !! * Modules used
2255
2256      !! * Library used
2257
2258      !! * arguments
2259      CHARACTER(len=80), INTENT(in)            :: &
2260         cd_filename                                   ! filename
2261      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
2262         cd_var                                        ! variable name
2263      REAL(KIND=sp), DIMENSION(:), INTENT(out)          :: &
2264        p_var                                          ! variable to read in netcdf file
2265      REAL(KIND=sp), OPTIONAL, INTENT(out)              :: &
2266        p_missing                                      ! missing value of the variable
2267
2268      !! * local declarations
2269      INTEGER               ::                     &
2270         i_file_id, i_var_id,                      &   ! file and variable identifier
2271         i_ndims,                                  &   ! Number of dimensions for this variable
2272         i_type,                                   &   ! external data type for this variable
2273         i_exist                                       ! test
2274      INTEGER, DIMENSION(1) :: i_dimid, i_len, i_shape ! dimensions of the variable
2275      REAL                  :: z_missing2              ! missing value of the variable
2276      !!----------------------------------------------------------------------
2277
2278      ! Open and test netcdf file
2279      ! -------------------------
2280      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
2281         & __LINE__,__MYFILE__)
2282      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ),__LINE__,__MYFILE__ )
2283      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
2284         & __LINE__,__MYFILE__)
2285      IF ( i_type .NE. 5 ) THEN
2286         WRITE(*,*)'filename = ',cd_filename
2287         WRITE(*,*)'variable = ',cd_var
2288         WRITE(*,*)'External type for this variable = ',i_type
2289         WRITE(*,*)'The valid external data type is NF_FLOAT : 5'
2290!         WRITE(*,*)'CALL abort'
2291!         CALL abort
2292      ENDIF
2293      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
2294         & __LINE__,__MYFILE__)
2295      IF ( i_ndims .NE. 1 ) THEN
2296         WRITE(*,*)'filename = ',cd_filename
2297         WRITE(*,*)'variable = ',cd_var
2298         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
2299         WRITE(*,*)'The valid number of dimension is 1'
2300         WRITE(*,*)'CALL abort'
2301         CALL abort
2302      ENDIF
2303      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
2304         & __LINE__,__MYFILE__)
2305      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
2306         & __LINE__,__MYFILE__)
2307      i_shape=SHAPE(p_var)
2308      IF ( i_len(1) .NE. i_shape(1) ) THEN
2309         WRITE(*,*)'filename = ',cd_filename
2310         WRITE(*,*)'variable = ',cd_var
2311         WRITE(*,*)'shape of array = ',SHAPE(p_var)
2312         WRITE(*,*)'Dimension length of variable = ',i_len
2313         WRITE(*,*)'Dimensions are different'
2314         WRITE(*,*)'CALL abort'
2315         CALL abort
2316      ENDIF
2317
2318      ! Read variable
2319      ! -------------
2320      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, p_var ) ,&
2321         & __LINE__,__MYFILE__)
2322
2323      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', z_missing2 )
2324      IF ( i_exist .NE. nf90_noerr  ) THEN
2325         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', z_missing2 )
2326      ENDIF
2327
2328      CALL nchdlerr( nf90_close( i_file_id ) ,&
2329         & __LINE__,__MYFILE__)
2330
2331      IF ( i_exist .NE. nf90_noerr  ) THEN
2332         z_missing2 = MAXVAL(p_var)
2333      ENDIF
2334
2335      IF ( PRESENT(p_missing) ) THEN
2336         p_missing = z_missing2
2337      ELSE
2338         WHERE(p_var .EQ. z_missing2) p_var = 0.0
2339         WHERE((p_var .GT. 0.) .EQV. (p_var .LE. 0.)) p_var = 0.0
2340      ENDIF
2341
2342   END SUBROUTINE get_var_1d_r
2343
2344   SUBROUTINE get_var_2d_r ( cd_filename, cd_var, p_var, p_missing )
2345      !!----------------------------------------------------------------------
2346      !!                ***  ROUTINE get_var_2d_r  ***
2347      !!
2348      !! ** Purpose :  read 2d map of reals in a netcdf file
2349      !!
2350      !! ** Method  : use netcdf fortran library
2351      !!       
2352      !! ** Action : - get variable informations
2353      !!             - read variable
2354      !!
2355      !! Reference :
2356      !!     
2357      !! History :
2358      !!    06-05  (N. Daget)  original code
2359      !!----------------------------------------------------------------------
2360      !! * Modules used
2361
2362      !! * Library used
2363
2364      !! * arguments
2365      CHARACTER(len=80), INTENT(in)            :: &
2366         cd_filename                                   ! filename
2367      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
2368         cd_var                                        ! variable name
2369      REAL(KIND=sp), DIMENSION(:,:), INTENT(out)        :: &
2370        p_var                                          ! variable to read in netcdf file
2371      REAL(KIND=sp), OPTIONAL, INTENT(out)              :: &
2372        p_missing                                      ! missing value of the variable
2373
2374      !! * local declarations
2375      INTEGER               ::                     &
2376         i_file_id, i_var_id,                      &   ! file and variable identifier
2377         i_ndims,                                  &   ! Number of dimensions for this variable
2378         i_type,                                   &   ! external data type for this variable
2379         i_exist                                       ! test
2380      INTEGER, DIMENSION(2) :: i_dimid, i_len, i_shape ! dimensions of the variable
2381      REAL                  :: z_missing2              ! missing value of the variable
2382      !!----------------------------------------------------------------------
2383
2384      ! Open and test netcdf file
2385      ! -------------------------
2386      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
2387         & __LINE__,__MYFILE__)
2388      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
2389         & __LINE__,__MYFILE__)
2390      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
2391         & __LINE__,__MYFILE__)
2392      IF ( i_type .NE. 5 ) THEN
2393         WRITE(*,*)'filename = ',cd_filename
2394         WRITE(*,*)'variable = ',cd_var
2395         WRITE(*,*)'External type for this variable = ',i_type
2396         WRITE(*,*)'The valid external data type is NF_FLOAT : 5'
2397!         WRITE(*,*)'CALL abort'
2398!         CALL abort
2399      ENDIF
2400      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
2401         & __LINE__,__MYFILE__)
2402      IF ( i_ndims .NE. 2 ) THEN
2403         WRITE(*,*)'filename = ',cd_filename
2404         WRITE(*,*)'variable = ',cd_var
2405         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
2406         WRITE(*,*)'The valid number of dimension is 2'
2407         WRITE(*,*)'CALL abort'
2408         CALL abort
2409      ENDIF
2410      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
2411         & __LINE__,__MYFILE__)
2412      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
2413         & __LINE__,__MYFILE__)
2414      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(2), len=i_len(2) ) ,&
2415         & __LINE__,__MYFILE__)
2416      i_shape=SHAPE(p_var)
2417      IF ( (i_len(1) .NE. i_shape(1)) .OR. (i_len(2) .NE. i_shape(2)) ) THEN
2418         WRITE(*,*)'filename = ',cd_filename
2419         WRITE(*,*)'variable = ',cd_var
2420         WRITE(*,*)'shape of array = ',SHAPE(p_var)
2421         WRITE(*,*)'Dimension length of variable = ',i_len
2422         WRITE(*,*)'Dimensions are different'
2423         WRITE(*,*)'CALL abort'
2424         CALL abort
2425      ENDIF
2426
2427      ! Read variable
2428      ! -------------
2429      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, p_var ) ,&
2430         & __LINE__,__MYFILE__)
2431
2432      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', z_missing2 )
2433      IF ( i_exist .NE. nf90_noerr  ) THEN
2434         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', z_missing2 )
2435      ENDIF
2436
2437      CALL nchdlerr( nf90_close( i_file_id ) ,&
2438         & __LINE__,__MYFILE__)
2439
2440      IF ( i_exist .NE. nf90_noerr  ) THEN
2441         z_missing2 = MAXVAL(p_var)
2442      ENDIF
2443
2444      IF ( PRESENT(p_missing) ) THEN
2445         p_missing = z_missing2
2446      ELSE
2447         WHERE(p_var .EQ. z_missing2) p_var = 0.0
2448         WHERE((p_var .GT. 0.) .EQV. (p_var .LE. 0.)) p_var = 0.0
2449      ENDIF
2450
2451   END SUBROUTINE get_var_2d_r
2452
2453   SUBROUTINE get_var_3d_r ( cd_filename, cd_var, p_var, p_missing )
2454      !!----------------------------------------------------------------------
2455      !!                ***  ROUTINE get_var_3d_r  ***
2456      !!
2457      !! ** Purpose :  read 3d map of reals in a netcdf file
2458      !!
2459      !! ** Method  : use netcdf fortran library
2460      !!       
2461      !! ** Action : - get variable informations
2462      !!             - read variable
2463      !!
2464      !! Reference :
2465      !!     
2466      !! History :
2467      !!    06-05  (N. Daget)  original code
2468      !!----------------------------------------------------------------------
2469      !! * Modules used
2470
2471      !! * Library used
2472
2473      !! * arguments
2474      CHARACTER(len=80), INTENT(in)            :: &
2475         cd_filename                                   ! filename
2476      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
2477         cd_var                                        ! variable name
2478      REAL(KIND=sp), DIMENSION(:,:,:), INTENT(out)      :: &
2479        p_var                                          ! variable to read in netcdf file
2480      REAL(KIND=sp), OPTIONAL, INTENT(out)              :: &
2481        p_missing                                      ! missing value of the variable
2482
2483      !! * local declarations
2484      INTEGER               ::                     &
2485         i_file_id, i_var_id,                      &   ! file and variable identifier
2486         i_ndims,                                  &   ! Number of dimensions for this variable
2487         i_type,                                   &   ! external data type for this variable
2488         i_exist                                       ! test
2489      INTEGER, DIMENSION(3) :: i_dimid, i_len, i_shape ! dimensions of the variable
2490      REAL                  :: z_missing2              ! missing value of the variable
2491      !!----------------------------------------------------------------------
2492
2493      ! Open and test netcdf file
2494      ! -------------------------
2495      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
2496         & __LINE__,__MYFILE__)
2497      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
2498         & __LINE__,__MYFILE__)
2499      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
2500         & __LINE__,__MYFILE__)
2501      IF ( i_type .NE. 5 ) THEN
2502         WRITE(*,*)'filename = ',cd_filename
2503         WRITE(*,*)'variable = ',cd_var
2504         WRITE(*,*)'External type for this variable = ',i_type
2505         WRITE(*,*)'The valid external data type is NF_FLOAT : 5'
2506!         WRITE(*,*)'CALL abort'
2507!         CALL abort
2508      ENDIF
2509      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
2510         & __LINE__,__MYFILE__)
2511      IF ( i_ndims .NE. 3 ) THEN
2512         WRITE(*,*)'filename = ',cd_filename
2513         WRITE(*,*)'variable = ',cd_var
2514         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
2515         WRITE(*,*)'The valid number of dimension is 3'
2516         WRITE(*,*)'CALL abort'
2517         CALL abort
2518      ENDIF
2519      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
2520         & __LINE__,__MYFILE__)
2521      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
2522         & __LINE__,__MYFILE__)
2523      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(2), len=i_len(2) ) ,&
2524         & __LINE__,__MYFILE__)
2525      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(3), len=i_len(3) ) ,&
2526         & __LINE__,__MYFILE__)
2527      i_shape=SHAPE(p_var)
2528      IF ( (i_len(1) .NE. i_shape(1)) .OR. (i_len(2) .NE. i_shape(2)) &
2529          .OR. (i_len(3) .NE. i_shape(3)) ) THEN
2530         WRITE(*,*)'filename = ',cd_filename
2531         WRITE(*,*)'variable = ',cd_var
2532         WRITE(*,*)'shape of array = ',SHAPE(p_var)
2533         WRITE(*,*)'Dimension length of variable = ',i_len
2534         WRITE(*,*)'Dimensions are different'
2535         WRITE(*,*)'CALL abort'
2536         CALL abort
2537      ENDIF
2538
2539      ! Read variable
2540      ! -------------
2541      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, p_var ) ,&
2542         & __LINE__,__MYFILE__)
2543
2544      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', z_missing2 )
2545      IF ( i_exist .NE. nf90_noerr  ) THEN
2546         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', z_missing2 )
2547      ENDIF
2548
2549      CALL nchdlerr( nf90_close( i_file_id ) ,&
2550         & __LINE__,__MYFILE__)
2551
2552      IF ( i_exist .NE. nf90_noerr  ) THEN
2553            z_missing2 = MAXVAL(p_var)
2554      ENDIF
2555
2556      IF ( PRESENT(p_missing) ) THEN
2557         p_missing = z_missing2
2558      ELSE
2559         WHERE(p_var .EQ. z_missing2) p_var = 0.0
2560         WHERE((p_var .GT. 0.) .EQV. (p_var .LE. 0.)) p_var = 0.0
2561      ENDIF
2562
2563   END SUBROUTINE get_var_3d_r
2564
2565   SUBROUTINE get_var_4d_r ( cd_filename, cd_var, p_var, p_missing )
2566      !!----------------------------------------------------------------------
2567      !!                ***  ROUTINE get_var_4d_r  ***
2568      !!
2569      !! ** Purpose :  read 4d map of reals in a netcdf file
2570      !!
2571      !! ** Method  : use netcdf fortran library
2572      !!       
2573      !! ** Action : - get variable informations
2574      !!             - read variable
2575      !!
2576      !! Reference :
2577      !!     
2578      !! History :
2579      !!    06-05  (N. Daget)  original code
2580      !!----------------------------------------------------------------------
2581      !! * Modules used
2582
2583      !! * Library used
2584
2585      !! * arguments
2586      CHARACTER(len=80), INTENT(in)            :: &
2587         cd_filename                                   ! filename
2588      CHARACTER(len=80), OPTIONAL, INTENT(in)  :: &
2589         cd_var                                        ! variable name
2590      REAL(KIND=sp), DIMENSION(:,:,:,:), INTENT(out)    :: &
2591        p_var                                          ! variable to read in netcdf file
2592      REAL(KIND=sp), OPTIONAL, INTENT(out)              :: &
2593        p_missing                                      ! missing value of the variable
2594
2595      !! * local declarations
2596      INTEGER               ::                     &
2597         i_file_id, i_var_id,                      &   ! file and variable identifier
2598         i_ndims,                                  &   ! Number of dimensions for this variable
2599         i_type,                                   &   ! external data type for this variable
2600         i_exist                                       ! test
2601      INTEGER, DIMENSION(4) :: i_dimid, i_len, i_shape ! dimensions of the variable
2602      REAL                  :: z_missing2              ! missing value of the variable
2603      !!----------------------------------------------------------------------
2604
2605      ! Open and test netcdf file
2606      ! -------------------------
2607      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
2608         & __LINE__,__MYFILE__)
2609      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
2610         & __LINE__,__MYFILE__)
2611      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
2612         & __LINE__,__MYFILE__)
2613      IF ( i_type .NE. 5 ) THEN
2614         WRITE(*,*)'filename = ',cd_filename
2615         WRITE(*,*)'variable = ',cd_var
2616         WRITE(*,*)'External type for this variable = ',i_type
2617         WRITE(*,*)'The valid external data type is NF_FLOAT : 5'
2618!         WRITE(*,*)'CALL abort'
2619!         CALL abort
2620      ENDIF
2621      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
2622         & __LINE__,__MYFILE__)
2623      IF ( i_ndims .NE. 4 ) THEN
2624         WRITE(*,*)'filename = ',cd_filename
2625         WRITE(*,*)'variable = ',cd_var
2626         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
2627         WRITE(*,*)'The valid number of dimension is 4'
2628         WRITE(*,*)'CALL abort'
2629         CALL abort
2630      ENDIF
2631      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
2632         & __LINE__,__MYFILE__)
2633      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
2634         & __LINE__,__MYFILE__)
2635      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(2), len=i_len(2) ) ,&
2636         & __LINE__,__MYFILE__)
2637      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(3), len=i_len(3) ) ,&
2638         & __LINE__,__MYFILE__)
2639      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(4), len=i_len(4) ) ,&
2640         & __LINE__,__MYFILE__)
2641      i_shape=SHAPE(p_var)
2642      IF ( (i_len(1) .NE. i_shape(1)) .OR. (i_len(2) .NE. i_shape(2)) &
2643          .OR. (i_len(3) .NE. i_shape(3)) .OR. (i_len(4) .NE. i_shape(4)) ) THEN
2644         WRITE(*,*)'filename = ',cd_filename
2645         WRITE(*,*)'variable = ',cd_var
2646         WRITE(*,*)'shape of array = ',SHAPE(p_var)
2647         WRITE(*,*)'Dimension length of variable = ',i_len
2648         WRITE(*,*)'Dimensions are different'
2649         WRITE(*,*)'CALL abort'
2650         CALL abort
2651      ENDIF
2652
2653      ! Read variable
2654      ! -------------
2655      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, p_var ) ,&
2656         & __LINE__,__MYFILE__)
2657
2658      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', z_missing2 )
2659      IF ( i_exist .NE. nf90_noerr  ) THEN
2660         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', z_missing2 )
2661      ENDIF
2662
2663      CALL nchdlerr( nf90_close( i_file_id ) ,&
2664         & __LINE__,__MYFILE__)
2665
2666      IF ( i_exist .NE. nf90_noerr  ) THEN
2667         z_missing2 = MAXVAL(p_var)
2668      ENDIF
2669
2670      IF ( PRESENT(p_missing) ) THEN
2671         p_missing = z_missing2
2672      ELSE
2673         WHERE(p_var .EQ. z_missing2) p_var = 0.0
2674         WHERE((p_var .GT. 0.) .EQV. (p_var .LE. 0.)) p_var = 0.0
2675      ENDIF
2676
2677   END SUBROUTINE get_var_4d_r
2678
2679   SUBROUTINE get_var_1d_d ( cd_filename, cd_var, dd_var, dd_missing )
2680      !!----------------------------------------------------------------------
2681      !!                ***  ROUTINE get_var_1d_d  ***
2682      !!
2683      !! ** Purpose :  read 1d map of real(kind=dp) reals in a netcdf file
2684      !!
2685      !! ** Method  : use netcdf fortran library
2686      !!       
2687      !! ** Action : - get variable informations
2688      !!             - read variable
2689      !!
2690      !! Reference :
2691      !!     
2692      !! History :
2693      !!    06-05  (N. Daget)  original code
2694      !!----------------------------------------------------------------------
2695      !! * Modules used
2696
2697      !! * Library used
2698
2699      !! * arguments
2700      CHARACTER(len=80), INTENT(in)               :: &
2701         cd_filename                                   ! filename
2702      CHARACTER(len=80), OPTIONAL, INTENT(in)     :: &
2703         cd_var                                        ! variable name
2704      REAL(KIND=dp), DIMENSION(:), INTENT(out) :: &
2705         dd_var                                        ! variable to read in netcdf file
2706      REAL(KIND=dp), OPTIONAL, INTENT(out)     :: &
2707         dd_missing                                    ! missing value of the variable
2708
2709      !! * local declarations
2710      INTEGER               ::                     &
2711         i_file_id, i_var_id,                      &   ! file and variable identifier
2712         i_ndims,                                  &   ! Number of dimensions for this variable
2713         i_type,                                   &   ! external data type for this variable
2714         i_exist                                       ! test
2715      INTEGER, DIMENSION(1) :: i_dimid, i_len, i_shape ! dimensions of the variable
2716      REAL(KIND=dp)      :: dl_missing2             ! missing value of the variable
2717      !!----------------------------------------------------------------------
2718
2719      ! Open and test netcdf file
2720      ! -------------------------
2721      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
2722         & __LINE__,__MYFILE__)
2723      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
2724         & __LINE__,__MYFILE__)
2725      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
2726         & __LINE__,__MYFILE__)
2727      IF ( i_type .NE. NF90_DOUBLE ) THEN
2728         WRITE(*,*)'filename = ',cd_filename
2729         WRITE(*,*)'variable = ',cd_var
2730         WRITE(*,*)'External type for this variable = ',i_type
2731         WRITE(*,*)'The valid external data type is NF90_DOUBLE : 6'
2732!         WRITE(*,*)'CALL abort'
2733!         CALL abort
2734      ENDIF
2735      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
2736         & __LINE__,__MYFILE__)
2737      IF ( i_ndims .NE. 1 ) THEN
2738         WRITE(*,*)'filename = ',cd_filename
2739         WRITE(*,*)'variable = ',cd_var
2740         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
2741         WRITE(*,*)'The valid number of dimension is 1'
2742         WRITE(*,*)'CALL abort'
2743         CALL abort
2744      ENDIF
2745      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
2746         & __LINE__,__MYFILE__)
2747      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
2748         & __LINE__,__MYFILE__)
2749      i_shape=SHAPE(dd_var)
2750      IF ( i_len(1) .NE. i_shape(1) ) THEN
2751         WRITE(*,*)'filename = ',cd_filename
2752         WRITE(*,*)'variable = ',cd_var
2753         WRITE(*,*)'shape of array = ',SHAPE(dd_var)
2754         WRITE(*,*)'Dimension length of variable = ',i_len
2755         WRITE(*,*)'Dimensions are different'
2756         WRITE(*,*)'CALL abort'
2757         CALL abort
2758      ENDIF
2759
2760      ! Read variable
2761      ! -------------
2762      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, dd_var ) ,&
2763         & __LINE__,__MYFILE__)
2764
2765      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', dl_missing2 )
2766      IF ( i_exist .NE. nf90_noerr  ) THEN
2767         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', dl_missing2 )
2768      ENDIF
2769
2770      CALL nchdlerr( nf90_close( i_file_id ) ,&
2771         & __LINE__,__MYFILE__)
2772
2773      IF ( i_exist .NE. nf90_noerr  ) THEN
2774         dl_missing2 = MAXVAL(dd_var)
2775      ENDIF
2776
2777      IF ( PRESENT(dd_missing) ) THEN
2778         dd_missing = dl_missing2
2779      ELSE
2780         WHERE(dd_var .EQ. dl_missing2) dd_var = 0.0
2781         WHERE((dd_var .GT. 0.) .EQV. (dd_var .LE. 0.)) dd_var = 0.0
2782      ENDIF
2783
2784   END SUBROUTINE get_var_1d_d
2785
2786   SUBROUTINE get_var_2d_d ( cd_filename, cd_var, dd_var, dd_missing )
2787      !!----------------------------------------------------------------------
2788      !!                ***  ROUTINE get_var_2d_d  ***
2789      !!
2790      !! ** Purpose :  read 2d map of real(kind=dp) reals in a netcdf file
2791      !!
2792      !! ** Method  : use netcdf fortran library
2793      !!       
2794      !! ** Action : - get variable informations
2795      !!             - read variable
2796      !!
2797      !! Reference :
2798      !!     
2799      !! History :
2800      !!    06-05  (N. Daget)  original code
2801      !!----------------------------------------------------------------------
2802      !! * Modules used
2803
2804      !! * Library used
2805
2806      !! * arguments
2807      CHARACTER(len=80), INTENT(in)               :: &
2808         cd_filename                                   ! filename
2809      CHARACTER(len=80), OPTIONAL, INTENT(in)     :: &
2810         cd_var                                        ! variable name
2811      REAL(KIND=dp), DIMENSION(:,:), INTENT(out) :: &
2812         dd_var                                        ! variable to read in netcdf file
2813      REAL(KIND=dp), OPTIONAL, INTENT(out)     :: &
2814         dd_missing                                    ! missing value of the variable
2815
2816      !! * local declarations
2817      INTEGER               ::                     &
2818         i_file_id, i_var_id,                      &   ! file and variable identifier
2819         i_ndims,                                  &   ! Number of dimensions for this variable
2820         i_type,                                   &   ! external data type for this variable
2821         i_exist                                       ! test
2822      INTEGER, DIMENSION(2) :: i_dimid, i_len, i_shape ! dimensions of the variable
2823      REAL(KIND=dp)      :: dl_missing2             ! missing value of the variable
2824      !!----------------------------------------------------------------------
2825
2826      ! Open and test netcdf file
2827      ! -------------------------
2828      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
2829         & __LINE__,__MYFILE__)
2830      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
2831         & __LINE__,__MYFILE__)
2832      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
2833         & __LINE__,__MYFILE__)
2834      IF ( i_type .NE. NF90_DOUBLE ) THEN
2835         WRITE(*,*)'filename = ',cd_filename
2836         WRITE(*,*)'variable = ',cd_var
2837         WRITE(*,*)'External type for this variable = ',i_type
2838         WRITE(*,*)'The valid external data type is NF90_DOUBLE : 6'
2839!         WRITE(*,*)'CALL abort'
2840!         CALL abort
2841      ENDIF
2842      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
2843         & __LINE__,__MYFILE__)
2844      IF ( i_ndims .NE. 2 ) THEN
2845         WRITE(*,*)'filename = ',cd_filename
2846         WRITE(*,*)'variable = ',cd_var
2847         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
2848         WRITE(*,*)'The valid number of dimension is 2'
2849         WRITE(*,*)'CALL abort'
2850         CALL abort
2851      ENDIF
2852      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
2853         & __LINE__,__MYFILE__)
2854      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
2855         & __LINE__,__MYFILE__)
2856      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(2), len=i_len(2) ) ,&
2857         & __LINE__,__MYFILE__)
2858      i_shape=SHAPE(dd_var)
2859      IF ( (i_len(1) .NE. i_shape(1)) .OR. (i_len(2) .NE. i_shape(2)) ) THEN
2860         WRITE(*,*)'filename = ',cd_filename
2861         WRITE(*,*)'variable = ',cd_var
2862         WRITE(*,*)'shape of array = ',SHAPE(dd_var)
2863         WRITE(*,*)'Dimension length of variable = ',i_len
2864         WRITE(*,*)'Dimensions are different'
2865         WRITE(*,*)'CALL abort'
2866         CALL abort
2867      ENDIF
2868
2869      ! Read variable
2870      ! -------------
2871      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, dd_var ) ,&
2872         & __LINE__,__MYFILE__)
2873
2874      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', dl_missing2 )
2875      IF ( i_exist .NE. nf90_noerr  ) THEN
2876         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', dl_missing2 )
2877      ENDIF
2878
2879      CALL nchdlerr( nf90_close( i_file_id ) ,&
2880         & __LINE__,__MYFILE__)
2881
2882      IF ( i_exist .NE. nf90_noerr  ) THEN
2883         dl_missing2 = MAXVAL(dd_var)
2884      ENDIF
2885
2886      IF ( PRESENT(dd_missing) ) THEN
2887         dd_missing = dl_missing2
2888      ELSE
2889         WHERE(dd_var .EQ. dl_missing2) dd_var = 0.0
2890         WHERE((dd_var .GT. 0.) .EQV. (dd_var .LE. 0.)) dd_var = 0.0
2891      ENDIF
2892
2893   END SUBROUTINE get_var_2d_d
2894
2895   SUBROUTINE get_var_3d_d ( cd_filename, cd_var, dd_var, dd_missing )
2896      !!----------------------------------------------------------------------
2897      !!                ***  ROUTINE get_var_3d_d  ***
2898      !!
2899      !! ** Purpose :  read 3d map of real(kind=dp) reals in a netcdf file
2900      !!
2901      !! ** Method  : use netcdf fortran library
2902      !!       
2903      !! ** Action : - get variable informations
2904      !!             - read variable
2905      !!
2906      !! Reference :
2907      !!     
2908      !! History :
2909      !!    06-05  (N. Daget)  original code
2910      !!----------------------------------------------------------------------
2911      !! * Modules used
2912
2913      !! * Library used
2914
2915      !! * arguments
2916      CHARACTER(len=80), INTENT(in)               :: &
2917         cd_filename                                   ! filename
2918      CHARACTER(len=80), OPTIONAL, INTENT(in)     :: &
2919         cd_var                                        ! variable name
2920      REAL(KIND=dp), DIMENSION(:,:,:), INTENT(out) :: &
2921         dd_var                                        ! variable to read in netcdf file
2922      REAL(KIND=dp), OPTIONAL, INTENT(out)     :: &
2923         dd_missing                                    ! missing value of the variable
2924
2925      !! * local declarations
2926      INTEGER               ::                     &
2927         i_file_id, i_var_id,                      &   ! file and variable identifier
2928         i_ndims,                                  &   ! Number of dimensions for this variable
2929         i_type,                                   &   ! external data type for this variable
2930         i_exist                                       ! test
2931      INTEGER, DIMENSION(3) :: i_dimid, i_len, i_shape ! dimensions of the variable
2932      REAL(KIND=dp)      :: dl_missing2             ! missing value of the variable
2933      !!----------------------------------------------------------------------
2934
2935      ! Open and test netcdf file
2936      ! -------------------------
2937      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
2938         & __LINE__,__MYFILE__)
2939      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
2940         & __LINE__,__MYFILE__)
2941      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
2942         & __LINE__,__MYFILE__)
2943      IF ( i_type .NE. NF90_DOUBLE ) THEN
2944         WRITE(*,*)'filename = ',cd_filename
2945         WRITE(*,*)'variable = ',cd_var
2946         WRITE(*,*)'External type for this variable = ',i_type
2947         WRITE(*,*)'The valid external data type is NF90_DOUBLE : 6'
2948!         WRITE(*,*)'CALL abort'
2949!         CALL abort
2950      ENDIF
2951      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
2952         & __LINE__,__MYFILE__)
2953      IF ( i_ndims .NE. 3 ) THEN
2954         WRITE(*,*)'filename = ',cd_filename
2955         WRITE(*,*)'variable = ',cd_var
2956         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
2957         WRITE(*,*)'The valid number of dimension is 3'
2958         WRITE(*,*)'CALL abort'
2959         CALL abort
2960      ENDIF
2961      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
2962         & __LINE__,__MYFILE__)
2963      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
2964         & __LINE__,__MYFILE__)
2965      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(2), len=i_len(2) ) ,&
2966         & __LINE__,__MYFILE__)
2967      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(3), len=i_len(3) ) ,&
2968         & __LINE__,__MYFILE__)
2969      i_shape=SHAPE(dd_var)
2970      IF ( (i_len(1) .NE. i_shape(1)) .OR. (i_len(2) .NE. i_shape(2)) &
2971          .OR. (i_len(3) .NE. i_shape(3)) ) THEN
2972         WRITE(*,*)'filename = ',cd_filename
2973         WRITE(*,*)'variable = ',cd_var
2974         WRITE(*,*)'shape of array = ',SHAPE(dd_var)
2975         WRITE(*,*)'Dimension length of variable = ',i_len
2976         WRITE(*,*)'Dimensions are different'
2977         WRITE(*,*)'CALL abort'
2978         CALL abort
2979      ENDIF
2980
2981      ! Read variable
2982      ! -------------
2983      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, dd_var ) ,&
2984         & __LINE__,__MYFILE__)
2985
2986      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', dl_missing2 )
2987      IF ( i_exist .NE. nf90_noerr  ) THEN
2988         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', dl_missing2 )
2989      ENDIF
2990
2991      CALL nchdlerr( nf90_close( i_file_id ) ,&
2992         & __LINE__,__MYFILE__)
2993
2994      IF ( i_exist .NE. nf90_noerr  ) THEN
2995            dl_missing2 = MAXVAL(dd_var)
2996      ENDIF
2997
2998      IF ( PRESENT(dd_missing) ) THEN
2999         dd_missing = dl_missing2
3000      ELSE
3001         WHERE(dd_var .EQ. dl_missing2) dd_var = 0.0
3002         WHERE((dd_var .GT. 0.) .EQV. (dd_var .LE. 0.)) dd_var = 0.0
3003      ENDIF
3004
3005   END SUBROUTINE get_var_3d_d
3006
3007   SUBROUTINE get_var_4d_d ( cd_filename, cd_var, dd_var, dd_missing )
3008      !!----------------------------------------------------------------------
3009      !!                ***  ROUTINE get_var_4d_d  ***
3010      !!
3011      !! ** Purpose :  read 4d map of real(kind=dp) reals in a netcdf file
3012      !!
3013      !! ** Method  : use netcdf fortran library
3014      !!       
3015      !! ** Action : - get variable informations
3016      !!             - read variable
3017      !!
3018      !! Reference :
3019      !!     
3020      !! History :
3021      !!    06-05  (N. Daget)  original code
3022      !!----------------------------------------------------------------------
3023      !! * Modules used
3024
3025      !! * Library used
3026
3027      !! * arguments
3028      CHARACTER(len=80), INTENT(in)               :: &
3029         cd_filename                                   ! filename
3030      CHARACTER(len=80), OPTIONAL, INTENT(in)     :: &
3031         cd_var                                        ! variable name
3032      REAL(KIND=dp), DIMENSION(:,:,:,:), INTENT(out) :: &
3033         dd_var                                        ! variable to read in netcdf file
3034      REAL(KIND=dp), OPTIONAL, INTENT(out)     :: &
3035         dd_missing                                    ! missing value of the variable
3036
3037      !! * local declarations
3038      INTEGER               ::                     &
3039         i_file_id, i_var_id,                      &   ! file and variable identifier
3040         i_ndims,                                  &   ! Number of dimensions for this variable
3041         i_type,                                   &   ! external data type for this variable
3042         i_exist                                       ! test
3043      INTEGER, DIMENSION(4) :: i_dimid, i_len, i_shape ! dimensions of the variable
3044      REAL(KIND=dp)      :: dl_missing2             ! missing value of the variable
3045      !!----------------------------------------------------------------------
3046
3047      ! Open and test netcdf file
3048      ! -------------------------
3049      CALL nchdlerr( nf90_open( cd_filename, nf90_nowrite, i_file_id ) ,&
3050         & __LINE__,__MYFILE__)
3051      CALL nchdlerr( nf90_inq_varid( i_file_id, cd_var, i_var_id ) ,&
3052         & __LINE__,__MYFILE__)
3053      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, xtype=i_type ) ,&
3054         & __LINE__,__MYFILE__)
3055      IF ( i_type .NE. NF90_DOUBLE ) THEN
3056         WRITE(*,*)'filename = ',cd_filename
3057         WRITE(*,*)'variable = ',cd_var
3058         WRITE(*,*)'External type for this variable = ',i_type
3059         WRITE(*,*)'The valid external data type is NF90_DOUBLE : 6'
3060!         WRITE(*,*)'CALL abort'
3061!         CALL abort
3062      ENDIF
3063      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, ndims=i_ndims ) ,&
3064         & __LINE__,__MYFILE__)
3065      IF ( i_ndims .NE. 4 ) THEN
3066         WRITE(*,*)'filename = ',cd_filename
3067         WRITE(*,*)'variable = ',cd_var
3068         WRITE(*,*)'Number of dimensions for this variable = ',i_ndims
3069         WRITE(*,*)'The valid number of dimension is 4'
3070         WRITE(*,*)'CALL abort'
3071         CALL abort
3072      ENDIF
3073      CALL nchdlerr( nf90_inquire_variable( i_file_id, i_var_id, dimids=i_dimid ) ,&
3074         & __LINE__,__MYFILE__)
3075      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(1), len=i_len(1) ) ,&
3076         & __LINE__,__MYFILE__)
3077      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(2), len=i_len(2) ) ,&
3078         & __LINE__,__MYFILE__)
3079      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(3), len=i_len(3) ) ,&
3080         & __LINE__,__MYFILE__)
3081      CALL nchdlerr( nf90_inquire_dimension( i_file_id, i_dimid(4), len=i_len(4) ) ,&
3082         & __LINE__,__MYFILE__)
3083      i_shape=SHAPE(dd_var)
3084      IF ( (i_len(1) .NE. i_shape(1)) .OR. (i_len(2) .NE. i_shape(2)) &
3085          .OR. (i_len(3) .NE. i_shape(3)) .OR. (i_len(4) .NE. i_shape(4)) ) THEN
3086         WRITE(*,*)'filename = ',cd_filename
3087         WRITE(*,*)'variable = ',cd_var
3088         WRITE(*,*)'shape of array = ',SHAPE(dd_var)
3089         WRITE(*,*)'Dimension length of variable = ',i_len
3090         WRITE(*,*)'Dimensions are different'
3091         WRITE(*,*)'CALL abort'
3092         CALL abort
3093      ENDIF
3094
3095      ! Read variable
3096      ! -------------
3097      CALL nchdlerr( nf90_get_var( i_file_id, i_var_id, dd_var ) ,&
3098         & __LINE__,__MYFILE__)
3099
3100      i_exist = nf90_get_att( i_file_id, i_var_id, '_FillValue', dl_missing2 )
3101      IF ( i_exist .NE. nf90_noerr  ) THEN
3102         i_exist = nf90_get_att( i_file_id, i_var_id, 'missing_value', dl_missing2 )
3103      ENDIF
3104
3105      CALL nchdlerr( nf90_close( i_file_id ) ,&
3106         & __LINE__,__MYFILE__)
3107
3108      IF ( i_exist .NE. nf90_noerr  ) THEN
3109         dl_missing2 = MAXVAL(dd_var)
3110      ENDIF
3111
3112      IF ( PRESENT(dd_missing) ) THEN
3113         dd_missing = dl_missing2
3114      ELSE
3115         WHERE(dd_var .EQ. dl_missing2) dd_var = 0.0
3116         WHERE((dd_var .GT. 0.) .EQV. (dd_var .LE. 0.)) dd_var = 0.0
3117      ENDIF
3118
3119   END SUBROUTINE get_var_4d_d
3120
3121   !!======================================================================
3122
3123   SUBROUTINE put_coord_r ( cd_filename, p_lon, p_lat, p_dep, cd_descr )
3124      !!----------------------------------------------------------------------
3125      !!                ***  ROUTINE put_coord_r  ***
3126      !!
3127      !! ** Purpose :  write coordinates as reals in a netcdf file
3128      !!
3129      !! ** Method  : use netcdf fortran library
3130      !!       
3131      !! ** Action : - get variable informations
3132      !!             - (re)define variable
3133      !!             - put variable in netcdf file
3134      !!
3135      !! Reference :
3136      !!     
3137      !! History :
3138      !!    06-05  (N. Daget)  original code
3139      !!----------------------------------------------------------------------
3140      !! * Modules used
3141
3142      !! * Library used
3143
3144      !! * arguments
3145      CHARACTER(len=80), INTENT(in)            :: &
3146         cd_filename                                    ! filename
3147      REAL(KIND=sp), DIMENSION(:,:), INTENT(in)         :: &
3148         p_lon, p_lat                                   ! longitude and latitude
3149      REAL(KIND=sp), DIMENSION(:), OPTIONAL, INTENT(in) :: &
3150         p_dep                                          ! depth
3151      CHARACTER(len=80), DIMENSION(6), OPTIONAL, INTENT(in)   :: &
3152         cd_descr                                               ! description of file contents
3153
3154      !! * local declarations
3155      LOGICAL               :: llexist                  ! test
3156      INTEGER               ::                    &
3157         i_file_id, i_var_id,                     &     ! file and variable identifiers
3158         i_dim_x_id, i_dim_y_id, i_dim_z_id,      &     ! dimension identifiers
3159         i_var_exist                                    ! test
3160      INTEGER, DIMENSION(2) :: i_dimxy                  ! dimensions of longitude and latitude
3161      INTEGER, DIMENSION(1) :: i_dimz                   ! dimension of depth
3162      INTEGER, DIMENSION(3) :: i_dim                    ! dimensions for netcdf file
3163      REAL                  ::                     &
3164         z_minx, z_maxx, z_miny, z_maxy, z_minz, z_maxz ! minima and maxima
3165      !!----------------------------------------------------------------------
3166
3167      ! Read dimensions and compute min and max
3168      ! ---------------------------------------
3169      i_dimxy = SHAPE( p_lon ) 
3170      z_minx = MINVAL( p_lon )
3171      z_maxx = MAXVAL( p_lon )
3172      z_miny = MINVAL( p_lat )
3173      z_maxy = MAXVAL( p_lat )
3174
3175      IF ( PRESENT( p_dep ) ) THEN
3176         i_dimz = SHAPE(  p_dep )
3177         z_minz = MINVAL( p_dep )
3178         z_maxz = MAXVAL( p_dep )
3179      ENDIF
3180   
3181      ! Open or create netcdf file
3182      ! --------------------------
3183      INQUIRE( FILE=TRIM(cd_filename), EXIST=llexist )
3184      IF ( .NOT. llexist ) THEN
3185         IF ( PRESENT( p_dep ) ) THEN
3186            IF ( PRESENT( cd_descr ) ) THEN
3187               CALL create_map ( cd_filename, i_dimxy, i_dimz, cd_descr=cd_descr )
3188            ELSE
3189               CALL create_map ( cd_filename, i_dimxy, i_dimz )
3190            ENDIF
3191         ELSE
3192            IF ( PRESENT( cd_descr ) ) THEN
3193               CALL create_map ( cd_filename, i_dimxy, cd_descr=cd_descr )
3194            ELSE
3195               CALL create_map ( cd_filename, i_dimxy )
3196            ENDIF
3197         ENDIF
3198      ENDIF
3199
3200      CALL nchdlerr( nf90_open( cd_filename, nf90_write, i_file_id ) ,&
3201         & __LINE__,__MYFILE__)
3202
3203      ! Add longitude, latitude and depth
3204      ! ---------------------------------
3205      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'x', i_dim_x_id ) ,&
3206         & __LINE__,__MYFILE__)
3207      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'y', i_dim_y_id ) ,&
3208         & __LINE__,__MYFILE__)
3209      i_dim(1) = i_dim_x_id
3210      i_dim(2) = i_dim_y_id
3211      IF ( PRESENT( p_dep ) ) THEN
3212         i_var_exist = nf90_inq_dimid( i_file_id, 'z', i_dim_z_id ) 
3213         IF ( i_var_exist .NE. 0 ) THEN
3214            CALL nchdlerr( nf90_redef( i_file_id ) ,&
3215               & __LINE__,__MYFILE__)
3216            CALL nchdlerr( nf90_def_dim( i_file_id, 'z', i_dimz(1), i_dim_z_id ) ,&
3217               & __LINE__,__MYFILE__)
3218            CALL nchdlerr( nf90_enddef( i_file_id ) ,&
3219               & __LINE__,__MYFILE__)
3220         ENDIF
3221         CALL nchdlerr( nf90_inq_dimid( i_file_id, 'z', i_dim_z_id ) ,&
3222            & __LINE__,__MYFILE__)
3223         i_dim(3) = i_dim_z_id
3224      ENDIF
3225
3226      i_var_exist = nf90_inq_varid( i_file_id, "longitude", i_var_id )
3227      CALL nchdlerr( nf90_redef( i_file_id ) ,&
3228         & __LINE__,__MYFILE__)
3229      IF ( i_var_exist .NE. 0 ) THEN
3230         CALL nchdlerr( nf90_def_var( i_file_id, "longitude", nf90_real, (/i_dim(1),i_dim(2)/), i_var_id ) ,&
3231            & __LINE__,__MYFILE__)
3232         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'data_type', 'float' ) ,&
3233            & __LINE__,__MYFILE__)
3234         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'standard_name', 'longitude' ) ,&
3235            & __LINE__,__MYFILE__)
3236         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'long_name', 'longitude' ) ,&
3237            & __LINE__,__MYFILE__)
3238         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'units', 'degrees_east' ),__LINE__,__MYFILE__ )
3239         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'axis', 'Y' ) ,&
3240            & __LINE__,__MYFILE__)
3241         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'positive', 'east' ) ,&
3242            & __LINE__,__MYFILE__)
3243         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, '_FillValue', 9.e+19 ) ,&
3244            & __LINE__,__MYFILE__)
3245      ENDIF
3246      CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', z_minx ) ,&
3247         & __LINE__,__MYFILE__)
3248      CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', z_maxx ) ,&
3249         & __LINE__,__MYFILE__)
3250      CALL nchdlerr( nf90_enddef( i_file_id ) ,&
3251         & __LINE__,__MYFILE__)
3252      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, p_lon) ,&
3253         & __LINE__,__MYFILE__)
3254
3255      i_var_exist = nf90_inq_varid( i_file_id, "latitude", i_var_id )
3256      CALL nchdlerr( nf90_redef( i_file_id ) ,&
3257         & __LINE__,__MYFILE__)
3258      IF ( i_var_exist .NE. 0 ) THEN
3259         CALL nchdlerr( nf90_def_var( i_file_id, "latitude", nf90_real, (/i_dim(1),i_dim(2)/), i_var_id ) ,&
3260            & __LINE__,__MYFILE__)
3261         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'data_type', 'float' ) ,&
3262            & __LINE__,__MYFILE__)
3263         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'standard_name', 'latitude' ) ,&
3264            & __LINE__,__MYFILE__)
3265         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'long_name', 'latitude' ) ,&
3266            & __LINE__,__MYFILE__)
3267         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'units', 'degrees_north' ),__LINE__,__MYFILE__ )
3268         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'axis', 'X' ) ,&
3269            & __LINE__,__MYFILE__)
3270         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'positive', 'north' ) ,&
3271            & __LINE__,__MYFILE__)
3272         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, '_FillValue', 9.e+19 ) ,&
3273            & __LINE__,__MYFILE__)
3274      ENDIF
3275      CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', z_miny ) ,&
3276         & __LINE__,__MYFILE__)
3277      CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', z_maxy ) ,&
3278         & __LINE__,__MYFILE__)
3279      CALL nchdlerr( nf90_enddef( i_file_id ) ,&
3280         & __LINE__,__MYFILE__)
3281      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, p_lat),__LINE__,__MYFILE__ )
3282
3283      IF ( PRESENT( p_dep ) ) THEN
3284         i_var_exist = nf90_inq_varid( i_file_id, "depth", i_var_id )
3285         CALL nchdlerr( nf90_redef( i_file_id ) ,&
3286            & __LINE__,__MYFILE__)
3287         IF ( i_var_exist .NE. 0 ) THEN
3288            CALL nchdlerr( nf90_def_var( i_file_id, "depth", nf90_real, i_dim(3), i_var_id ) ,&
3289               & __LINE__,__MYFILE__)
3290            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'data_type', 'float' ) ,&
3291               & __LINE__,__MYFILE__)
3292            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'standard_name', 'depth' ) ,&
3293               & __LINE__,__MYFILE__)
3294            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'long_name', 'depth below the surface') ,&
3295               & __LINE__,__MYFILE__)
3296            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'units', 'm' ) ,&
3297               & __LINE__,__MYFILE__)
3298            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'unit_long', 'meter' ) ,&
3299               & __LINE__,__MYFILE__)
3300            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'axis', 'Z' ) ,&
3301               & __LINE__,__MYFILE__)
3302            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'positive', 'down' ) ,&
3303               & __LINE__,__MYFILE__)
3304            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, '_FillValue', 9.e+19 ),__LINE__,__MYFILE__ )
3305         ENDIF
3306         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', z_minz ) ,&
3307            & __LINE__,__MYFILE__)
3308         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', z_maxz ) ,&
3309            & __LINE__,__MYFILE__)
3310         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
3311            & __LINE__,__MYFILE__)
3312         CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, p_dep) ,&
3313            & __LINE__,__MYFILE__)
3314      ENDIF
3315
3316      CALL nchdlerr( nf90_close( i_file_id ) ,&
3317         & __LINE__,__MYFILE__)
3318
3319   END SUBROUTINE put_coord_r
3320 
3321   SUBROUTINE put_coord_d ( cd_filename, dd_lon, dd_lat, dd_dep, cd_descr )
3322      !!----------------------------------------------------------------------
3323      !!                ***  ROUTINE put_coord_d  ***
3324      !!
3325      !! ** Purpose :  write coordinates as real(kind=dp) in a netcdf file
3326      !!
3327      !! ** Method  : use netcdf fortran library
3328      !!       
3329      !! ** Action : - get variable informations
3330      !!             - (re)define variable
3331      !!             - put variable in netcdf file
3332      !!
3333      !! Reference :
3334      !!     
3335      !! History :
3336      !!    06-05  (N. Daget)  original code
3337      !!----------------------------------------------------------------------
3338      !! * Modules used
3339
3340      !! * Library used
3341
3342      !! * arguments
3343      CHARACTER(len=80), INTENT(in)                        :: &
3344         cd_filename                                            ! filename
3345      REAL(KIND=dp), DIMENSION(:,:), INTENT(in)         :: &
3346         dd_lon, dd_lat                                         ! longitude and latitude
3347      REAL(KIND=dp), DIMENSION(:), OPTIONAL, INTENT(in) :: &
3348         dd_dep                                                 ! depth
3349      CHARACTER(len=80), DIMENSION(6), OPTIONAL, INTENT(in)   :: &
3350         cd_descr                                               ! description of file contents
3351
3352      !! * local declarations
3353      LOGICAL               :: llexist                  ! test
3354      INTEGER               ::                    &
3355         i_file_id, i_var_id,                     &     ! file and variable identifiers
3356         i_dim_x_id, i_dim_y_id, i_dim_z_id,      &     ! dimension identifiers
3357         i_var_exist                                    ! test
3358      INTEGER, DIMENSION(2) :: i_dimxy                  ! dimensions of longitude and latitude
3359      INTEGER, DIMENSION(1) :: i_dimz                   ! dimension of depth
3360      INTEGER, DIMENSION(3) :: i_dim                    ! dimensions for netcdf file
3361      REAL(KIND=dp)      ::                     &
3362         dl_minx, dl_maxx, dl_miny, dl_maxy,       &
3363         dl_minz, dl_maxz,                         &    ! minima and maxima
3364         dl_missing                                     ! missing value
3365      !!----------------------------------------------------------------------
3366
3367      ! Read dimensions and compute min and max
3368      ! ---------------------------------------
3369      i_dimxy = SHAPE( dd_lon ) 
3370      dl_minx = MINVAL( dd_lon )
3371      dl_maxx = MAXVAL( dd_lon )
3372      dl_miny = MINVAL( dd_lat )
3373      dl_maxy = MAXVAL( dd_lat )
3374
3375      IF ( PRESENT( dd_dep ) ) THEN
3376         i_dimz = SHAPE( dd_dep )
3377         dl_minz = MINVAL(dd_dep)
3378         dl_maxz = MAXVAL(dd_dep)
3379      ENDIF
3380
3381      ! Open or create netcdf file
3382      ! --------------------------
3383      INQUIRE( FILE=TRIM(cd_filename), EXIST=llexist )
3384      IF ( .NOT. llexist ) THEN
3385         IF ( PRESENT( dd_dep ) ) THEN
3386            IF ( PRESENT( cd_descr ) ) THEN
3387               CALL create_map ( cd_filename, i_dimxy, i_dimz, cd_descr=cd_descr )
3388            ELSE
3389               CALL create_map ( cd_filename, i_dimxy, i_dimz )
3390            ENDIF
3391         ELSE
3392            IF ( PRESENT( cd_descr ) ) THEN
3393               CALL create_map ( cd_filename, i_dimxy, cd_descr=cd_descr )
3394            ELSE
3395               CALL create_map ( cd_filename, i_dimxy )
3396            ENDIF
3397         ENDIF
3398      ENDIF
3399
3400      CALL nchdlerr( nf90_open( cd_filename, nf90_write, i_file_id ) ,&
3401         & __LINE__,__MYFILE__)
3402
3403      ! Add longitude, latitude and depth
3404      ! ---------------------------------
3405      dl_missing = 9.e+19_8
3406      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'x', i_dim_x_id ) ,&
3407         & __LINE__,__MYFILE__)
3408      CALL nchdlerr( nf90_inq_dimid( i_file_id, 'y', i_dim_y_id ) ,&
3409         & __LINE__,__MYFILE__)
3410      i_dim(1) = i_dim_x_id
3411      i_dim(2) = i_dim_y_id
3412      IF ( PRESENT( dd_dep ) ) THEN
3413         i_var_exist = nf90_inq_dimid( i_file_id, 'z', i_dim_z_id )
3414         IF ( i_var_exist .NE. 0 ) THEN
3415            CALL nchdlerr( nf90_redef( i_file_id ) ,&
3416               & __LINE__,__MYFILE__)
3417            CALL nchdlerr( nf90_def_dim( i_file_id, 'z', i_dimz(1), i_dim_z_id ) ,&
3418               & __LINE__,__MYFILE__)
3419            CALL nchdlerr( nf90_enddef( i_file_id ) ,&
3420               & __LINE__,__MYFILE__)
3421         ENDIF
3422         i_dim(3) = i_dim_z_id
3423      ENDIF
3424
3425      i_var_exist = nf90_inq_varid( i_file_id, "longitude", i_var_id )
3426      CALL nchdlerr( nf90_redef( i_file_id ) ,&
3427         & __LINE__,__MYFILE__)
3428      IF ( i_var_exist .NE. 0 ) THEN
3429         CALL nchdlerr( nf90_def_var( i_file_id, "longitude", nf90_double, (/i_dim(1),i_dim(2)/), i_var_id ) ,&
3430            & __LINE__,__MYFILE__)
3431         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'data_type', 'float' ) ,&
3432            & __LINE__,__MYFILE__)
3433         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'standard_name', 'longitude' ) ,&
3434            & __LINE__,__MYFILE__)
3435         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'long_name', 'longitude' ) ,&
3436            & __LINE__,__MYFILE__)
3437         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'units', 'degrees_east' ),__LINE__,__MYFILE__ )
3438         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'axis', 'Y' ) ,&
3439            & __LINE__,__MYFILE__)
3440         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'positive', 'east' ) ,&
3441            & __LINE__,__MYFILE__)
3442         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, '_FillValue', dl_missing ) ,&
3443            & __LINE__,__MYFILE__)
3444      ENDIF
3445      CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', dl_minx ) ,&
3446         & __LINE__,__MYFILE__)
3447      CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', dl_maxx ) ,&
3448         & __LINE__,__MYFILE__)
3449      CALL nchdlerr( nf90_enddef( i_file_id ) ,&
3450         & __LINE__,__MYFILE__)
3451      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, dd_lon) ,&
3452         & __LINE__,__MYFILE__)
3453
3454      i_var_exist = nf90_inq_varid( i_file_id, "latitude", i_var_id )
3455      CALL nchdlerr( nf90_redef( i_file_id ) ,&
3456         & __LINE__,__MYFILE__)
3457      IF ( i_var_exist .NE. 0 ) THEN
3458         CALL nchdlerr( nf90_def_var( i_file_id, "latitude", nf90_double, (/i_dim(1),i_dim(2)/), i_var_id ) ,&
3459            & __LINE__,__MYFILE__)
3460         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'data_type', 'float' ) ,&
3461            & __LINE__,__MYFILE__)
3462         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'standard_name', 'latitude' ) ,&
3463            & __LINE__,__MYFILE__)
3464         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'long_name', 'latitude' ) ,&
3465            & __LINE__,__MYFILE__)
3466         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'units', 'degrees_north' ),__LINE__,__MYFILE__ )
3467         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'axis', 'X' ) ,&
3468            & __LINE__,__MYFILE__)
3469         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'positive', 'north' ) ,&
3470            & __LINE__,__MYFILE__)
3471         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, '_FillValue', dl_missing ) ,&
3472            & __LINE__,__MYFILE__)
3473      ENDIF
3474      CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', dl_miny ) ,&
3475         & __LINE__,__MYFILE__)
3476      CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', dl_maxy ) ,&
3477         & __LINE__,__MYFILE__)
3478      CALL nchdlerr( nf90_enddef( i_file_id ) ,&
3479         & __LINE__,__MYFILE__)
3480      CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, dd_lat),__LINE__,__MYFILE__ )
3481
3482      IF ( PRESENT( dd_dep ) ) THEN
3483         i_var_exist = nf90_inq_varid( i_file_id, "depth", i_var_id )
3484         CALL nchdlerr( nf90_redef( i_file_id ) ,&
3485            & __LINE__,__MYFILE__)
3486         IF ( i_var_exist .NE. 0 ) THEN
3487            CALL nchdlerr( nf90_def_var( i_file_id, "depth", nf90_double, i_dim(3), i_var_id ),__LINE__,__MYFILE__ )
3488            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'data_type', 'float' ) ,&
3489               & __LINE__,__MYFILE__)
3490            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'standard_name', 'depth' ) ,&
3491               & __LINE__,__MYFILE__)
3492            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'long_name', 'depth below the surface'),__LINE__,__MYFILE__ )
3493            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'units', 'm' ) ,&
3494               & __LINE__,__MYFILE__)
3495            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'unit_long', 'meter' ),__LINE__,__MYFILE__ )
3496            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'axis', 'Z' ) ,&
3497               & __LINE__,__MYFILE__)
3498            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'positive', 'down' ) ,&
3499               & __LINE__,__MYFILE__)
3500            CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, '_FillValue', dl_missing ) ,&
3501               & __LINE__,__MYFILE__)
3502         ENDIF
3503         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_min', dl_minz ) ,&
3504            & __LINE__,__MYFILE__)
3505         CALL nchdlerr( nf90_put_att( i_file_id, i_var_id, 'valid_max', dl_maxz ) ,&
3506            & __LINE__,__MYFILE__)
3507         CALL nchdlerr( nf90_enddef( i_file_id ) ,&
3508            & __LINE__,__MYFILE__)
3509         CALL nchdlerr( nf90_put_var( i_file_id, i_var_id, dd_dep) ,&
3510            & __LINE__,__MYFILE__)
3511      ENDIF
3512
3513      CALL nchdlerr( nf90_close( i_file_id ) ,&
3514         & __LINE__,__MYFILE__)
3515!
3516   END SUBROUTINE put_coord_d
3517
3518   !!======================================================================
3519
3520   SUBROUTINE create_map ( cd_filename, k_dimxy, k_dimz, cd_descr )
3521      !!----------------------------------------------------------------------
3522      !!                ***  ROUTINE create_map  ***
3523      !!
3524      !! ** Purpose :  create netcdf file
3525      !!
3526      !! ** Method  : use netcdf fortran library
3527      !!       
3528      !! ** Action : - define dimension of the netcdf file
3529      !!
3530      !! Reference :
3531      !!     
3532      !! History :
3533      !!    06-05  (N. Daget)  original code
3534      !!----------------------------------------------------------------------
3535      !! * Modules used
3536
3537      !! * Library used
3538
3539      !! * arguments
3540      CHARACTER(len=80), INTENT(in)                 :: &
3541         cd_filename                                            ! filename
3542      INTEGER, DIMENSION(:), INTENT(in)             :: k_dimxy  ! dimensions of longitude and latitude
3543      INTEGER, DIMENSION(1), OPTIONAL, INTENT(in)   :: k_dimz   ! dimension of depth
3544      CHARACTER(len=80), DIMENSION(6), OPTIONAL, INTENT(in)   :: &
3545         cd_descr                                               ! description of file contents
3546
3547      !! * local declarations
3548      INTEGER               ::                    &
3549         i_file_id, i_dim_id                            ! file and dimension identifiers
3550      INTEGER, DIMENSION(1) :: i_dim                    ! dimension of k_dimxy
3551      !!----------------------------------------------------------------------
3552
3553      i_dim = SHAPE(k_dimxy)
3554
3555      ! Create file
3556      ! -----------
3557      CALL nchdlerr( nf90_create( cd_filename, nf90_clobber, i_file_id ) ,&
3558         & __LINE__,__MYFILE__)
3559
3560      ! Define dimensions
3561      ! -----------------
3562      CALL nchdlerr( nf90_def_dim( i_file_id, 'x', k_dimxy(1), i_dim_id ) ,&
3563         & __LINE__,__MYFILE__)
3564      CALL nchdlerr( nf90_def_dim( i_file_id, 'y', k_dimxy(2), i_dim_id ) ,&
3565         & __LINE__,__MYFILE__)
3566      IF ( PRESENT(k_dimz) ) THEN
3567         CALL nchdlerr( nf90_def_dim( i_file_id, 'z', k_dimz(1), i_dim_id ) ,&
3568            & __LINE__,__MYFILE__)
3569      ENDIF
3570      IF ( i_dim(1) .EQ. 3 ) THEN
3571         CALL nchdlerr( nf90_def_dim( i_file_id, 'z', k_dimxy(3), i_dim_id ) ,&
3572            & __LINE__,__MYFILE__)
3573      ENDIF
3574      CALL nchdlerr( nf90_def_dim( i_file_id, 'time', nf90_unlimited, i_dim_id ) ,&
3575         & __LINE__,__MYFILE__)
3576
3577      IF ( PRESENT( cd_descr ) ) THEN
3578         CALL nchdlerr( nf90_put_att( i_file_id, nf90_global, "title", cd_descr(1) ) ,&
3579            & __LINE__,__MYFILE__)
3580         CALL nchdlerr( nf90_put_att( i_file_id, nf90_global, "institution", cd_descr(2) ) ,&
3581            & __LINE__,__MYFILE__)
3582         CALL nchdlerr( nf90_put_att( i_file_id, nf90_global, "source", cd_descr(3) ) ,&
3583            & __LINE__,__MYFILE__)
3584         CALL nchdlerr( nf90_put_att( i_file_id, nf90_global, "history", cd_descr(4) ) ,&
3585            & __LINE__,__MYFILE__)
3586         CALL nchdlerr( nf90_put_att( i_file_id, nf90_global, "references", cd_descr(5) ) ,&
3587            & __LINE__,__MYFILE__)
3588         CALL nchdlerr( nf90_put_att( i_file_id, nf90_global, "comment", cd_descr(6) ) ,&
3589            & __LINE__,__MYFILE__)
3590      ENDIF
3591
3592      CALL nchdlerr( nf90_close( i_file_id ) ,&
3593         & __LINE__,__MYFILE__)
3594
3595   END SUBROUTINE create_map
3596
3597   !!======================================================================
3598
3599   SUBROUTINE put_att( k_file_id, k_var_id, k_code )
3600      !!----------------------------------------------------------------------
3601      !!                ***  ROUTINE put_att  ***
3602      !!
3603      !! ** Purpose :  write CF attributes
3604      !!
3605      !! ** Method  : use netcdf fortran library
3606      !!       
3607      !! ** Action : - write CF attributes
3608      !!
3609      !! Reference :
3610      !!     
3611      !! History :
3612      !!    06-05  (N. Daget)  original code
3613      !!----------------------------------------------------------------------
3614      !! * Modules used
3615
3616      !! * Library used
3617
3618      !! * arguments
3619      INTEGER, INTENT(in)      :: k_file_id, k_var_id,  &       ! file and variable identifiers
3620                                  k_code                        ! CF identifier
3621
3622      !! * local declarations
3623      CHARACTER(len=80)        ::                       &
3624         cl_name, cl_longname,                          &       ! names of variable
3625         cl_unit, cl_longunit                                   ! units of variable
3626      !!----------------------------------------------------------------------
3627
3628      ! Get variable attributes and write them
3629      ! --------------------------------------
3630      CALL get_var_info( k_code, cl_name, cl_longname, cl_unit, cl_longunit )
3631
3632      CALL nchdlerr( nf90_put_att( k_file_id, k_var_id, 'standard_name', TRIM(cl_name) ) ,&
3633         & __LINE__,__MYFILE__)
3634      CALL nchdlerr( nf90_put_att( k_file_id, k_var_id, 'long_name', TRIM(cl_longname) ) ,&
3635         & __LINE__,__MYFILE__)
3636      CALL nchdlerr( nf90_put_att( k_file_id, k_var_id, 'units', TRIM(cl_unit) ) ,&
3637         & __LINE__,__MYFILE__)
3638      CALL nchdlerr( nf90_put_att( k_file_id, k_var_id, 'unit_long', TRIM(cl_longunit) ),__LINE__,__MYFILE__ )
3639
3640   END SUBROUTINE put_att
3641
3642   !!======================================================================
3643
3644   SUBROUTINE get_var_info( k_code, cd_name, cd_longname, cd_unit, cd_longunit )
3645      !!----------------------------------------------------------------------
3646      !!                ***  ROUTINE put_att  ***
3647      !!
3648      !! ** Purpose :  get CF attributes
3649      !!
3650      !! ** Method  : outofcore database
3651      !!       
3652      !! ** Action : - find iCF attributes
3653      !!
3654      !! Reference :
3655      !!     
3656      !! History :
3657      !!    06-05  (N. Daget)  original code
3658      !!----------------------------------------------------------------------
3659      !! * Modules used
3660
3661      !! * Library used
3662
3663      !! * arguments
3664      CHARACTER(len=80), INTENT(out)           :: cd_name       ! name of variable
3665      CHARACTER(len=80), OPTIONAL, INTENT(out) ::       &
3666         cd_longname, cd_unit, cd_longunit                      ! name and units of variable
3667      INTEGER, INTENT(in)                      :: k_code        ! CF identifier
3668
3669      !! * local declarations
3670      !!----------------------------------------------------------------------
3671
3672      ! Get CF attributes
3673      ! -----------------
3674      SELECT CASE ( k_code )
3675         CASE (129)
3676            cd_name="sea_water_potential_temperature"
3677            IF ( PRESENT(cd_longname) ) cd_longname="Potential temperature ref to surface K"
3678            IF ( PRESENT(cd_unit) ) cd_unit="C"
3679            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_Celcius"
3680         CASE (130)
3681            cd_name="sea_water_salinity"
3682            IF ( PRESENT(cd_longname) ) cd_longname="sea water salinity"
3683            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3684            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3685         CASE (131)
3686            cd_name="sea_water_x_velocity"
3687            IF ( PRESENT(cd_longname) ) cd_longname="U zonal current m/s"
3688            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3689            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3690         CASE (132)
3691            cd_name="sea_water_y_velocity"
3692            IF ( PRESENT(cd_longname) ) cd_longname="V meridional current m/s"
3693            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3694            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3695         CASE (133)
3696            cd_name="upward_sea_water_velocity"
3697            IF ( PRESENT(cd_longname) ) cd_longname="W vertical current m/s"
3698            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3699            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3700         CASE (134)
3701            cd_name="mst"
3702            IF ( PRESENT(cd_longname) ) cd_longname="Modulus of strain rate tensor"
3703            IF ( PRESENT(cd_unit) ) cd_unit="s-1"
3704            IF ( PRESENT(cd_longunit) ) cd_longunit="per_second"
3705         CASE (135)
3706            cd_name="vvs"
3707            IF ( PRESENT(cd_longname) ) cd_longname="Vertical viscosity"
3708            IF ( PRESENT(cd_unit) ) cd_unit="m^2/s"
3709            IF ( PRESENT(cd_longunit) ) cd_longunit="square_meter_per_second"
3710         CASE (136)
3711            cd_name="vdf"
3712            IF ( PRESENT(cd_longname) ) cd_longname="Vertical diffusivity"
3713            IF ( PRESENT(cd_unit) ) cd_unit="m^2/s"
3714            IF ( PRESENT(cd_longunit) ) cd_longunit="square_meter_per_second"
3715         CASE (137)
3716            cd_name="depth"
3717            IF ( PRESENT(cd_longname) ) cd_longname="depth"
3718            IF ( PRESENT(cd_unit) ) cd_unit="m"
3719            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
3720         CASE (138)
3721            cd_name="sea_water_sigma_theta"
3722            IF ( PRESENT(cd_longname) ) cd_longname="Sigma theta"
3723            IF ( PRESENT(cd_unit) ) cd_unit="kgm3"
3724            IF ( PRESENT(cd_longunit) ) cd_longunit="kilogramme cubicmeter"
3725         CASE (139)
3726            cd_name="richardson_number"
3727            IF ( PRESENT(cd_longname) ) cd_longname="Richardson number"
3728            IF ( PRESENT(cd_unit) ) cd_unit=""
3729            IF ( PRESENT(cd_longunit) ) cd_longunit=""
3730         CASE (140)
3731            cd_name="UV"
3732            IF ( PRESENT(cd_longname) ) cd_longname="UV product"
3733            IF ( PRESENT(cd_unit) ) cd_unit="m**2 s**-2"
3734            IF ( PRESENT(cd_longunit) ) cd_longunit="m**2 s**-2"
3735         CASE (141)
3736            cd_name="UT"
3737            IF ( PRESENT(cd_longname) ) cd_longname="UT product"
3738            IF ( PRESENT(cd_unit) ) cd_unit="m s**-1 degC"
3739            IF ( PRESENT(cd_longunit) ) cd_longunit="m s**-1 degC"
3740         CASE (142)
3741            cd_name="VT"
3742            IF ( PRESENT(cd_longname) ) cd_longname="VT product"
3743            IF ( PRESENT(cd_unit) ) cd_unit="m s**-1 degC"
3744            IF ( PRESENT(cd_longunit) ) cd_longunit="m s**-1 degC"
3745         CASE (143)
3746            cd_name="UU"
3747            IF ( PRESENT(cd_longname) ) cd_longname="UU product"
3748            IF ( PRESENT(cd_unit) ) cd_unit="m**2 s**-2"
3749            IF ( PRESENT(cd_longunit) ) cd_longunit="m**2 s**-2"
3750         CASE (144)
3751            cd_name="VV"
3752            IF ( PRESENT(cd_longname) ) cd_longname="VV product"
3753            IF ( PRESENT(cd_unit) ) cd_unit="m**2 s**-2"
3754            IF ( PRESENT(cd_longunit) ) cd_longunit="m**2 s**-2"
3755         CASE (145)
3756            cd_name="sea_surface_height_above_geoid"
3757            IF ( PRESENT(cd_longname) ) cd_longname="sea_surface_height_above_geoid"
3758            IF ( PRESENT(cd_unit) ) cd_unit="m"
3759            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
3760         CASE (146)
3761            cd_name="sea_floor_topography"
3762            IF ( PRESENT(cd_longname) ) cd_longname="Sea floor topography"
3763            IF ( PRESENT(cd_unit) ) cd_unit="m"
3764            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
3765         CASE (147)
3766            cd_name="ocean_barotropic_streamfunction"
3767            IF ( PRESENT(cd_longname) ) cd_longname="Barotropic Stream Function"
3768            IF ( PRESENT(cd_unit) ) cd_unit="m3/s"
3769            IF ( PRESENT(cd_longunit) ) cd_longunit="cubic_meter_per_second"
3770         CASE (148)
3771            cd_name="ocean_mixed_layer_thickness"
3772            IF ( PRESENT(cd_longname) ) cd_longname="depth of the ocean mixed layer from the surface"
3773            IF ( PRESENT(cd_unit) ) cd_unit="m"
3774            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
3775         CASE (149)
3776            cd_name="sea_water_bottom_pressure"
3777            IF ( PRESENT(cd_longname) ) cd_longname="sea_water_bottom_pressure"
3778            IF ( PRESENT(cd_unit) ) cd_unit="Pa"
3779            IF ( PRESENT(cd_longunit) ) cd_longunit="Pascal"
3780         CASE (153)
3781            cd_name="surface_downward_eastward_stress"
3782            IF ( PRESENT(cd_longname) ) cd_longname="U-Stress"
3783            IF ( PRESENT(cd_unit) ) cd_unit="Pa"
3784            IF ( PRESENT(cd_longunit) ) cd_longunit="Pascal"
3785         CASE (154)
3786            cd_name="surface_downward_northward_stress"
3787            IF ( PRESENT(cd_longname) ) cd_longname="V-Stress"
3788            IF ( PRESENT(cd_unit) ) cd_unit="Pa"
3789            IF ( PRESENT(cd_longunit) ) cd_longunit="Pascal"
3790         CASE (156)
3791            cd_name="turbulent_kinetic_energy_input"
3792            IF ( PRESENT(cd_longname) ) cd_longname="turbulent kinetic energy input"
3793            IF ( PRESENT(cd_unit) ) cd_unit="W.m^2"
3794            IF ( PRESENT(cd_longunit) ) cd_longunit="watt_per_square_meter"
3795         CASE (157)
3796            cd_name="absorbed_solar_radiation"
3797            IF ( PRESENT(cd_longname) ) cd_longname="Absorbed solar radiation"
3798            IF ( PRESENT(cd_unit) ) cd_unit="W.m^2"
3799            IF ( PRESENT(cd_longunit) ) cd_longunit="watt_per_square_meter"
3800         CASE (158)
3801            cd_name="surface_downward_water_flux"
3802            IF ( PRESENT(cd_longname) ) cd_longname="Precipitation minus Evaporation"
3803            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3804            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3805         CASE (159)
3806            cd_name="sea_surface_temperature"
3807            IF ( PRESENT(cd_longname) ) cd_longname="specified sea surface temperature"
3808            IF ( PRESENT(cd_unit) ) cd_unit="C"
3809            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_Celcius"
3810         CASE (160)
3811            cd_name="surface_downward_heat_flux_in_sea_water"
3812            IF ( PRESENT(cd_longname) ) cd_longname="Specified Surface Heat flux"
3813            IF ( PRESENT(cd_unit) ) cd_unit="W.m^2"
3814            IF ( PRESENT(cd_longunit) ) cd_longunit="watt_per_square_meter"
3815         CASE (161)
3816            cd_name="diagnosed_sst_error"
3817            IF ( PRESENT(cd_longname) ) cd_longname="diagnosed sea surface temperature error"
3818            IF ( PRESENT(cd_unit) ) cd_unit="C"
3819            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
3820         CASE (162)
3821            cd_name="surface_downward_heat_flux_in_sea_water"
3822            IF ( PRESENT(cd_longname) ) cd_longname="Heat flux Correction"
3823            IF ( PRESENT(cd_unit) ) cd_unit="W.m^2"
3824            IF ( PRESENT(cd_longunit) ) cd_longunit="watt_per_square_meter"
3825         CASE (163)
3826            cd_name="d20_isotherm_depth"
3827            IF ( PRESENT(cd_longname) ) cd_longname="depth of the D20 isotherm"
3828            IF ( PRESENT(cd_unit) ) cd_unit="m"
3829            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
3830         CASE (164)
3831            cd_name="ocean_integral_of_sea_water_temperature_wrt_depth"
3832            IF ( PRESENT(cd_longname) ) cd_longname="averaged temperature over the fisrt 300m"
3833            IF ( PRESENT(cd_unit) ) cd_unit="C"
3834            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
3835         CASE (167)
3836            cd_name="barotropic_eastward_sea_water_velocity"
3837            IF ( PRESENT(cd_longname) ) cd_longname="integral of U dz"
3838            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3839            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3840         CASE (168)
3841            cd_name="barotropic_northward_sea_water_velocity"
3842            IF ( PRESENT(cd_longname) ) cd_longname="integral of V dz"
3843            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3844            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3845         CASE (169)
3846            cd_name="product_of_eastward_sea_water_velocity_and_temperature"
3847            IF ( PRESENT(cd_longname) ) cd_longname="integral of Tudz"
3848            IF ( PRESENT(cd_unit) ) cd_unit="Km/s"
3849            IF ( PRESENT(cd_longunit) ) cd_longunit="Kelvin_meter_per_second"
3850         CASE (170)
3851            cd_name="product_of_northward_sea_water_velocity_and_temperature"
3852            IF ( PRESENT(cd_longname) ) cd_longname="integral of Tvdz"
3853            IF ( PRESENT(cd_unit) ) cd_unit="Km/s"
3854            IF ( PRESENT(cd_longunit) ) cd_longunit="Kelvin_meter_per_second"
3855         CASE (171)
3856            cd_name="velocity_maximum"
3857            IF ( PRESENT(cd_longname) ) cd_longname="velocity maximum"
3858            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3859            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3860         CASE (172)
3861            cd_name="depth_of_maximum_velocity"
3862            IF ( PRESENT(cd_longname) ) cd_longname="depth of maximum velocity"
3863            IF ( PRESENT(cd_unit) ) cd_unit="m"
3864            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
3865         CASE (173)
3866            cd_name="salinity_maximum"
3867            IF ( PRESENT(cd_longname) ) cd_longname="salinity maximum"
3868            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3869            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3870         CASE (174)
3871            cd_name="depth_of_maximum_salinity"
3872            IF ( PRESENT(cd_longname) ) cd_longname="depth of maximum salinity"
3873            IF ( PRESENT(cd_unit) ) cd_unit="m"
3874            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
3875         CASE (175)
3876            cd_name="ocean_integral_of_sea_water_salinity_wrt_depth"
3877            IF ( PRESENT(cd_longname) ) cd_longname="averaged salinity over the fisrt 300m"
3878            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3879            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3880         CASE (179)
3881            cd_name="potential_temperature_analysis_error"
3882            IF ( PRESENT(cd_longname) ) cd_longname="Potential temperature analysis error"
3883            IF ( PRESENT(cd_unit) ) cd_unit="C"
3884            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
3885         CASE (180)
3886            cd_name="background_potential_temperature"
3887            IF ( PRESENT(cd_longname) ) cd_longname="background potential temperature"
3888            IF ( PRESENT(cd_unit) ) cd_unit="C"
3889            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
3890         CASE (181)
3891            cd_name="analysed_potential_temperature"
3892            IF ( PRESENT(cd_longname) ) cd_longname="Analysed potential temperature"
3893            IF ( PRESENT(cd_unit) ) cd_unit="C"
3894            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
3895         CASE (182)
3896            cd_name="potential_temperature_background_error"
3897            IF ( PRESENT(cd_longname) ) cd_longname="Potential temperature background error"
3898            IF ( PRESENT(cd_unit) ) cd_unit="C"
3899            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
3900         CASE (183)
3901            cd_name="analysed_salinity_from_soft"
3902            IF ( PRESENT(cd_longname) ) cd_longname="analysed salinity from S(T) balance operator"
3903            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3904            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3905         CASE (184)
3906            cd_name="sea_water_salinity_increment"
3907            IF ( PRESENT(cd_longname) ) cd_longname="salinity increment"
3908            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3909            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3910         CASE (185)
3911            cd_name="temperature_bias"
3912            IF ( PRESENT(cd_longname) ) cd_longname="bias in temperature"
3913            IF ( PRESENT(cd_unit) ) cd_unit="C"
3914            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
3915         CASE (186)
3916            cd_name="salinity_bias"
3917            IF ( PRESENT(cd_longname) ) cd_longname="bias in salinity"
3918            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3919            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3920         CASE (187)
3921            cd_name="eastward_sea_water_velocity_increment_from_balance"
3922            IF ( PRESENT(cd_longname) ) cd_longname="eastward sea water velocity increment from balance operator"
3923            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3924            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3925         CASE (188)
3926            cd_name="northward_sea_water_velocity_increment_from_balance"
3927            IF ( PRESENT(cd_longname) ) cd_longname="northward sea water velocity increment from balance operator"
3928            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3929            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3930         CASE (190)
3931            cd_name="sea_water_salinity_increment_from_soft"
3932            IF ( PRESENT(cd_longname) ) cd_longname="sea water salinity increment from soft"
3933            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3934            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3935         CASE (191)
3936            cd_name="sea_water_salinity_analysis_error"
3937            IF ( PRESENT(cd_longname) ) cd_longname="sea water salinity analysis error"
3938            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3939            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3940         CASE (192)
3941            cd_name="sea_water_background_salinity"
3942            IF ( PRESENT(cd_longname) ) cd_longname="sea water background salinity"
3943            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3944            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3945         CASE (193)
3946            cd_name="sea_water_analysed_salinity"
3947            IF ( PRESENT(cd_longname) ) cd_longname="sea water analysed salinity"
3948            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3949            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3950         CASE (194)
3951            cd_name="sea_water_salinity_background_error"
3952            IF ( PRESENT(cd_longname) ) cd_longname="sea water salinity background error"
3953            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3954            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3955            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3956         CASE (500)
3957            cd_name="bcksta_bal_S"
3958            IF ( PRESENT(cd_longname) ) cd_longname="balanced part of S"
3959            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3960            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3961         CASE (501)
3962            cd_name="bcksta_unbal_S"
3963            IF ( PRESENT(cd_longname) ) cd_longname="unbalanced part of S"
3964            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
3965            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
3966         CASE (502)
3967            cd_name="bcksta_bal_u"
3968            IF ( PRESENT(cd_longname) ) cd_longname="balanced part of u"
3969            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3970            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3971         CASE (503)
3972            cd_name="bcksta_unbal_u"
3973            IF ( PRESENT(cd_longname) ) cd_longname="unbalanced part of u"
3974            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3975            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3976         CASE (504)
3977            cd_name="bcksta_bal_v"
3978            IF ( PRESENT(cd_longname) ) cd_longname="balanced part of v"
3979            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3980            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3981         CASE (505)
3982            cd_name="bcksta_unbal_v"
3983            IF ( PRESENT(cd_longname) ) cd_longname="unbalanced part of v"
3984            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
3985            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
3986         CASE (506)
3987            cd_name="bcksta_bal_e"
3988            IF ( PRESENT(cd_longname) ) cd_longname="balanced part of SSH"
3989            IF ( PRESENT(cd_unit) ) cd_unit="m"
3990            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
3991         CASE (507)
3992            cd_name="bcksta_unbal_e"
3993            IF ( PRESENT(cd_longname) ) cd_longname="unbalanced part of SSH"
3994            IF ( PRESENT(cd_unit) ) cd_unit="m"
3995            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
3996         CASE (510)
3997            cd_name="increm_tot_T"
3998            IF ( PRESENT(cd_longname) ) cd_longname="increment for total part of T"
3999            IF ( PRESENT(cd_unit) ) cd_unit="C"
4000            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
4001         CASE (511)
4002            cd_name="increm_tot_S"
4003            IF ( PRESENT(cd_longname) ) cd_longname="increment for total part of S"
4004            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
4005            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
4006         CASE (512)
4007            cd_name="increm_bal_S"
4008            IF ( PRESENT(cd_longname) ) cd_longname="increment for balanced part of S"
4009            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
4010            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
4011         CASE (513)
4012            cd_name="increm_unbal_S"
4013            IF ( PRESENT(cd_longname) ) cd_longname="increment for unbalanced part of S"
4014            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
4015            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
4016         CASE (514)
4017            cd_name="increm_tot_u"
4018            IF ( PRESENT(cd_longname) ) cd_longname="increment for total part of U"
4019            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4020            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4021         CASE (515)
4022            cd_name="increm_bal_u"
4023            IF ( PRESENT(cd_longname) ) cd_longname="increment for balanced part of U"
4024            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4025            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4026         CASE (516)
4027            cd_name="increm_unbal_u"
4028            IF ( PRESENT(cd_longname) ) cd_longname="increment for unbalanced part of U"
4029            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4030            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4031         CASE (517)
4032            cd_name="increm_tot_v"
4033            IF ( PRESENT(cd_longname) ) cd_longname="increment for total part of V"
4034            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4035            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4036         CASE (518)
4037            cd_name="increm_bal_v"
4038            IF ( PRESENT(cd_longname) ) cd_longname="increment for balanced part of V"
4039            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4040            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4041         CASE (519)
4042            cd_name="increm_unbal_v"
4043            IF ( PRESENT(cd_longname) ) cd_longname="increment for unbalanced part of V"
4044            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4045            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4046         CASE (520)
4047            cd_name="increm_tot_e"
4048            IF ( PRESENT(cd_longname) ) cd_longname="increment for total part of SSH"
4049            IF ( PRESENT(cd_unit) ) cd_unit="m"
4050            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4051         CASE (521)
4052            cd_name="increm_bal_e"
4053            IF ( PRESENT(cd_longname) ) cd_longname="increment for balanced part of SSH"
4054            IF ( PRESENT(cd_unit) ) cd_unit="m"
4055            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4056         CASE (522)
4057            cd_name="increm_unbal_e"
4058            IF ( PRESENT(cd_longname) ) cd_longname="increment for unbalanced part of SSH"
4059            IF ( PRESENT(cd_unit) ) cd_unit="m"
4060            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4061         CASE (530)
4062            cd_name="pbudct"
4063            IF ( PRESENT(cd_longname) ) cd_longname="distance between coastline and model u-points"
4064            IF ( PRESENT(cd_unit) ) cd_unit="m"
4065            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4066         CASE (531)
4067            cd_name="pbvdct"
4068            IF ( PRESENT(cd_longname) ) cd_longname="distance between coastline and model v-points"
4069            IF ( PRESENT(cd_unit) ) cd_unit="m"
4070            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4071         CASE (532)
4072            cd_name="pbtdct"
4073            IF ( PRESENT(cd_longname) ) cd_longname="distance between coastline and model t-points"
4074            IF ( PRESENT(cd_unit) ) cd_unit="m"
4075            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4076         CASE (533)
4077            cd_name="pbfdct"
4078            IF ( PRESENT(cd_longname) ) cd_longname="distance between coastline and model f-points"
4079            IF ( PRESENT(cd_unit) ) cd_unit="m"
4080            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4081         CASE (540)
4082            cd_name="bckenw_wetjc"
4083            IF ( PRESENT(cd_longname) ) cd_longname="energy T weighting coefficient for Jc term"
4084            IF ( PRESENT(cd_unit) ) cd_unit="m^2/s^2/C^2"
4085            IF ( PRESENT(cd_longunit) ) cd_longunit="square_meter_per_square_second_per_square_degre_celcius"
4086         CASE (541)
4087            cd_name="bckenw_wesjc"
4088            IF ( PRESENT(cd_longname) ) cd_longname="energy S weighting coefficient for Jc term"
4089            IF ( PRESENT(cd_unit) ) cd_unit="m^2/s^2/PSU^2"
4090            IF ( PRESENT(cd_longunit) ) cd_longunit="square_meter_per_square_second_per_square_practical_salinity_scale"
4091         CASE (550)
4092            cd_name="bckesd_ana_t"
4093            IF ( PRESENT(cd_longname) ) cd_longname="standard deviations for total part of T"
4094            IF ( PRESENT(cd_unit) ) cd_unit="C"
4095            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
4096         CASE (551)
4097            cd_name="bckesd_ana_s"
4098            IF ( PRESENT(cd_longname) ) cd_longname="standard deviations for unbalanced part of S"
4099            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
4100            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
4101         CASE (552)
4102            cd_name="bckesd_ana_u"
4103            IF ( PRESENT(cd_longname) ) cd_longname="standard deviations for unbalanced part of u"
4104            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4105            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4106         CASE (553)
4107            cd_name="bckesd_ana_v"
4108            IF ( PRESENT(cd_longname) ) cd_longname="standard deviations for unbalanced part of V"
4109            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4110            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4111         CASE (554)
4112            cd_name="bckesd_ana_e"
4113            IF ( PRESENT(cd_longname) ) cd_longname="standard deviations for unbalanced part of SSH"
4114            IF ( PRESENT(cd_unit) ) cd_unit="m"
4115            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4116         CASE (560)
4117            cd_name="bckesd_mod_t"
4118            IF ( PRESENT(cd_longname) ) cd_longname="background error standard deviations for temperature"
4119            IF ( PRESENT(cd_unit) ) cd_unit="C"
4120            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
4121         CASE (561)
4122            cd_name="bckesd_mod_s"
4123            IF ( PRESENT(cd_longname) ) cd_longname="background error standard deviations for salinity"
4124            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
4125            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
4126         CASE (562)
4127            cd_name="bckesd_mod_u"
4128            IF ( PRESENT(cd_longname) ) cd_longname="background error standard deviations for u-velocity"
4129            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4130            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4131         CASE (563)
4132            cd_name="bckesd_mod_v"
4133            IF ( PRESENT(cd_longname) ) cd_longname="background error standard deviations for v-velocity"
4134            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4135            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4136         CASE (564)
4137            cd_name="bckesd_mod_e"
4138            IF ( PRESENT(cd_longname) ) cd_longname="background error standard deviations for SSH"
4139            IF ( PRESENT(cd_unit) ) cd_unit="m"
4140            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4141         CASE (565)
4142            cd_name="bckesd_modf_t"
4143            IF ( PRESENT(cd_longname) ) cd_longname="background error standard deviations for temperature at final time"
4144            IF ( PRESENT(cd_unit) ) cd_unit="C"
4145            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
4146         CASE (566)
4147            cd_name="bckesd_modf_s"
4148            IF ( PRESENT(cd_longname) ) cd_longname="background error standard deviations for salinity at final time"
4149            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
4150            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
4151         CASE (567)
4152            cd_name="bckesd_modf_u"
4153            IF ( PRESENT(cd_longname) ) cd_longname="background error standard deviations for u-velocity at final time"
4154            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4155            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4156         CASE (568)
4157            cd_name="bckesd_modf_v"
4158            IF ( PRESENT(cd_longname) ) cd_longname="background error standard deviations for v-velocity at final time"
4159            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4160            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4161         CASE (569)
4162            cd_name="bckesd_modf_e"
4163            IF ( PRESENT(cd_longname) ) cd_longname="background error standard deviations for SSH at final time"
4164            IF ( PRESENT(cd_unit) ) cd_unit="m"
4165            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4166         CASE (570)
4167            cd_name="bcksal_dSdT"
4168            IF ( PRESENT(cd_longname) ) cd_longname="dS/dT coefficient for the salinity balance"
4169            IF ( PRESENT(cd_unit) ) cd_unit="PSU/C"
4170            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale_per_degree_celcius"
4171         CASE (571)
4172            cd_name="bcksal_dTdz"
4173            IF ( PRESENT(cd_longname) ) cd_longname="dT/dz for the background"
4174            IF ( PRESENT(cd_unit) ) cd_unit="C/m"
4175            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius_per_meter"
4176         CASE (572)
4177            cd_name="bcksal_dSdz"
4178            IF ( PRESENT(cd_longname) ) cd_longname="dS/dz for the background"
4179            IF ( PRESENT(cd_unit) ) cd_unit="PSU/m"
4180            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale_per_meter"
4181         CASE (575)
4182            cd_name="bckssh_alpha"
4183            IF ( PRESENT(cd_longname) ) cd_longname="Thermal expansion coefficient for the SSH balance"
4184            IF ( PRESENT(cd_unit) ) cd_unit=""
4185            IF ( PRESENT(cd_longunit) ) cd_longunit=""
4186         CASE (576)
4187            cd_name="bckssh_beta"
4188            IF ( PRESENT(cd_longname) ) cd_longname="Saline expansion coefficient for the SSH balance"
4189            IF ( PRESENT(cd_unit) ) cd_unit=""
4190            IF ( PRESENT(cd_longunit) ) cd_longunit=""
4191         CASE (580)
4192            cd_name="filnot"
4193            IF ( PRESENT(cd_longname) ) cd_longname="filter normalization factor at T-points"
4194            IF ( PRESENT(cd_unit) ) cd_unit="m^(3/2)"
4195            IF ( PRESENT(cd_longunit) ) cd_longunit="square_root_of_cube_meter"
4196         CASE (581)
4197            cd_name="filnou"
4198            IF ( PRESENT(cd_longname) ) cd_longname="filter normalization factor at u-points"
4199            IF ( PRESENT(cd_unit) ) cd_unit="m^(3/2)"
4200            IF ( PRESENT(cd_longunit) ) cd_longunit="square_root_of_cube_meter"
4201         CASE (582)
4202            cd_name="filnov"
4203            IF ( PRESENT(cd_longname) ) cd_longname="filter normalization factor at v-points"
4204            IF ( PRESENT(cd_unit) ) cd_unit="m^(3/2)"
4205            IF ( PRESENT(cd_longunit) ) cd_longunit="square_root_of_cube_meter"
4206         CASE (583)
4207            cd_name="filnoe"
4208            IF ( PRESENT(cd_longname) ) cd_longname="filter normalization factor at eta-points"
4209            IF ( PRESENT(cd_unit) ) cd_unit="m^(3/2)"
4210            IF ( PRESENT(cd_longunit) ) cd_longunit="square_root_of_cube_meter"
4211         CASE (590)
4212            cd_name="bckint"
4213            IF ( PRESENT(cd_longname) ) cd_longname="increment to background temperature"
4214            IF ( PRESENT(cd_unit) ) cd_unit="C"
4215            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
4216         CASE (591)
4217            cd_name="bckins"
4218            IF ( PRESENT(cd_longname) ) cd_longname="increment to background salinity"
4219            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
4220            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity"
4221         CASE (592)
4222            cd_name="bckinu"
4223            IF ( PRESENT(cd_longname) ) cd_longname="increment to background u-velocity"
4224            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4225            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4226         CASE (593)
4227            cd_name="bckinv"
4228            IF ( PRESENT(cd_longname) ) cd_longname="increment to background v-velocity"
4229            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4230            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4231         CASE (594)
4232            cd_name="bckineta"
4233            IF ( PRESENT(cd_longname) ) cd_longname="increment to background SSH"
4234            IF ( PRESENT(cd_unit) ) cd_unit="m"
4235            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4236         CASE (610)
4237            cd_name="tangent_T"
4238            IF ( PRESENT(cd_longname) ) cd_longname="tangent potential temperature field"
4239            IF ( PRESENT(cd_unit) ) cd_unit="C"
4240            IF ( PRESENT(cd_longunit) ) cd_longunit="degree_celcius"
4241         CASE (611)
4242            cd_name="tangent_S"
4243            IF ( PRESENT(cd_longname) ) cd_longname="tangent salinity field"
4244            IF ( PRESENT(cd_unit) ) cd_unit="PSU"
4245            IF ( PRESENT(cd_longunit) ) cd_longunit="practical_salinity_scale"
4246         CASE (612)
4247            cd_name="tangent_u"
4248            IF ( PRESENT(cd_longname) ) cd_longname="tangent U zonal current"
4249            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4250            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4251         CASE (613)
4252            cd_name="tangent_v"
4253            IF ( PRESENT(cd_longname) ) cd_longname="tangent V meridional current"
4254            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4255            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4256         CASE (614)
4257            cd_name="tangent_w"
4258            IF ( PRESENT(cd_longname) ) cd_longname="tangent W vertical current"
4259            IF ( PRESENT(cd_unit) ) cd_unit="m/s"
4260            IF ( PRESENT(cd_longunit) ) cd_longunit="meter_per_second"
4261         CASE (615)
4262            cd_name="tangent_SSH"
4263            IF ( PRESENT(cd_longname) ) cd_longname="tangent sea surface height above geoid"
4264            IF ( PRESENT(cd_unit) ) cd_unit="m"
4265            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4266         CASE (616)
4267            cd_name="tangent BSF"
4268            IF ( PRESENT(cd_longname) ) cd_longname="tangent barotropic stream function"
4269            IF ( PRESENT(cd_unit) ) cd_unit="m3/s"
4270            IF ( PRESENT(cd_longunit) ) cd_longunit="cubic_meter_per_second"
4271         CASE (620)
4272            cd_name="d28_isotherm_depth"
4273            IF ( PRESENT(cd_longname) ) cd_longname="depth of the D28 isotherm"
4274            IF ( PRESENT(cd_unit) ) cd_unit="m"
4275            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4276         CASE (621)
4277            cd_name="ocean_mixed_layer_thickness_bn2_criterion"
4278            IF ( PRESENT(cd_longname) ) cd_longname="depth of the ocean mixed layer from the surface with bn2 citerion"
4279            IF ( PRESENT(cd_unit) ) cd_unit="m"
4280            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4281         CASE (622)
4282            cd_name="thermocline_depth"
4283            IF ( PRESENT(cd_longname) ) cd_longname="depth of the strongest vertical temperature gradient"
4284            IF ( PRESENT(cd_unit) ) cd_unit="m"
4285            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4286         CASE (623)
4287            cd_name="heat_content_of_first_300m"
4288            IF ( PRESENT(cd_longname) ) cd_longname="heat content of first 300 m"
4289            IF ( PRESENT(cd_unit) ) cd_unit="J"
4290            IF ( PRESENT(cd_longunit) ) cd_longunit="joules"
4291         CASE (624)
4292            cd_name="turbocline_depth"
4293            IF ( PRESENT(cd_longname) ) cd_longname="turbocline depth"
4294            IF ( PRESENT(cd_unit) ) cd_unit="m"
4295            IF ( PRESENT(cd_longunit) ) cd_longunit="meter"
4296         CASE (625)
4297            cd_name="U-energy_transport"
4298            IF ( PRESENT(cd_longname) ) cd_longname="U-energy transport"
4299            IF ( PRESENT(cd_unit) ) cd_unit="J/s/m^2"
4300            IF ( PRESENT(cd_longunit) ) cd_longunit="joules_per_second_per_square_meter"
4301         CASE (626)
4302            cd_name="V-energy_transport"
4303            IF ( PRESENT(cd_longname) ) cd_longname="V-energy transport"
4304            IF ( PRESENT(cd_unit) ) cd_unit="J/s/m^2"
4305            IF ( PRESENT(cd_longunit) ) cd_longunit="joules_per_second_per_square_meter"
4306         CASE default
4307            cd_name="varname"
4308            IF ( PRESENT(cd_longname) ) cd_longname="long_varname"
4309            IF ( PRESENT(cd_unit) ) cd_unit="varunit"
4310            IF ( PRESENT(cd_longunit) ) cd_longunit="long_varunit"
4311      END SELECT
4312
4313   END SUBROUTINE get_var_info
4314
4315END MODULE ioncdf
Note: See TracBrowser for help on using the repository browser.