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.
ooo_write.F90 in branches/UKMO/restart_datestamp/NEMOGCM/NEMO/OOO_SRC – NEMO

source: branches/UKMO/restart_datestamp/NEMOGCM/NEMO/OOO_SRC/ooo_write.F90 @ 5462

Last change on this file since 5462 was 5462, checked in by davestorkey, 9 years ago

Update UKMO/restart_datestamp branch to revision 5442 of trunk. Also clear the SVN keywords again - necessary after the update step.

File size: 29.0 KB
Line 
1MODULE ooo_write
2   !!======================================================================
3   !!                       ***  MODULE ooo_write  ***
4   !!======================================================================
5
6   USE in_out_manager
7   USE netcdf
8   USE obs_utils, ONLY: chkerr
9   USE ooo_utils, ONLY: date_format, inst_converter, yyyymmdd_to_ref_date
10   USE ooo_data
11
12   IMPLICIT NONE
13   PRIVATE
14
15   PUBLIC ooo_wri_init
16   PUBLIC ooo_wri_default
17   PUBLIC ooo_wri_extra
18
19   ! Type kinds for class 4 data.
20   INTEGER, PARAMETER :: clsp = SELECTED_REAL_KIND( 6, 37) !: single precision
21   INTEGER, PARAMETER :: cldp = SELECTED_REAL_KIND(12,307) !: double precision
22
23   ! Missinge data indicators
24   INTEGER, PARAMETER    :: climdi = -99999   !: Integers
25   REAL(clsp), PARAMETER :: clrmdi =  99999   !: Reals
26
27   INTERFACE ooo_wri_extra
28      MODULE PROCEDURE ooo_wri_extra_3d_index, ooo_wri_extra_4d, ooo_wri_extra_4d_index
29   END INTERFACE
30
31   !! $Id$
32   CONTAINS
33
34      SUBROUTINE ooo_wri_extra_3d_index(cdfilename, cdvarname, ndeps, nvars, &
35                               &  nobs, kstart, kcount, pdata)
36         !!----------------------------------------------------------------------
37         !!                    ***  ROUTINE ooo_wri_extra_3d  ***
38         !!
39         !! ** Purpose : Write 3d variables to class 4 file.
40         !!
41         !!----------------------------------------------------------------------
42         INTEGER, INTENT(IN) :: &
43                 & nobs, &       !: number of observations/profiles
44                 & nvars, &      !: number of physical parameters
45                 & ndeps         !: number of depths
46         CHARACTER(len=*), INTENT(IN) :: &
47                 & cdfilename, & !: netcdf file name
48                 & cdvarname     !: netcdf variable name
49         INTEGER, DIMENSION(3), INTENT(IN) :: &
50                 & kstart, &     !: start indices
51                 & kcount        !: count indices
52         REAL(KIND=cldp), DIMENSION(ndeps, nvars, nobs), INTENT(IN) :: &
53                 & pdata         !: 3d data
54         INTEGER :: &
55                 & ncid, &       !:
56                 & dimid, &      !:
57                 & varid         !:
58         CHARACTER(len=16), PARAMETER :: cpname = 'ooo_wri_extra_3d'
59         ! Open netcdf file
60         CALL chkerr(nf90_open(trim(cdfilename), nf90_write, ncid), cpname, __LINE__ )
61         ! Write data
62         CALL chkerr(nf90_inq_varid(ncid,TRIM(cdvarname), varid),cpname, __LINE__ )
63         CALL chkerr(nf90_put_var(ncid, varid, pdata, kstart, kcount),cpname, __LINE__ )
64         ! Close netcdf file
65         CALL chkerr(nf90_close(ncid), cpname, __LINE__ )
66      END SUBROUTINE ooo_wri_extra_3d_index
67
68      SUBROUTINE ooo_wri_extra_4d_index(cdfilename, cdvarname, ndeps, nfcst, &
69                               &  nvars, nobs, kstart, kcount, pdata)
70         !!----------------------------------------------------------------------
71         !!                    ***  ROUTINE ooo_wri_extra_4d  ***
72         !!
73         !! ** Purpose : Write 4d variables to class 4 file.
74         !!
75         !!----------------------------------------------------------------------
76         INTEGER, INTENT(IN) :: &
77                 & nobs, &       !: number of observations/profiles
78                 & nvars, &      !: number of physical parameters
79                 & ndeps, &      !: number of depths
80                 & nfcst         !: number of forecasts
81         CHARACTER(len=*), INTENT(IN) :: &
82                 & cdfilename, & !: netcdf file name
83                 & cdvarname     !: netcdf variable name
84         INTEGER, DIMENSION(4), INTENT(IN) :: &
85                 & kstart, &     !: start indices
86                 & kcount        !: count indices
87         REAL(KIND=cldp), DIMENSION(ndeps, nvars, nobs), INTENT(IN) :: &
88                 & pdata         !: slice of 4d data
89         INTEGER :: &
90                 & ncid, &       !:
91                 & dimid, &      !:
92                 & varid         !:
93         CHARACTER(len=22), PARAMETER :: cpname = 'ooo_wri_extra_4d_index'
94         ! Open netcdf file
95         CALL chkerr(nf90_open(trim(cdfilename), nf90_write, ncid), cpname, __LINE__ )
96         ! Write data
97         CALL chkerr(nf90_inq_varid(ncid,TRIM(cdvarname), varid),cpname, __LINE__ )
98         CALL chkerr(nf90_put_var(ncid, varid, pdata, kstart, kcount),cpname, __LINE__ )
99         ! Close netcdf file
100         CALL chkerr(nf90_close(ncid), cpname, __LINE__ )
101      END SUBROUTINE ooo_wri_extra_4d_index
102
103      SUBROUTINE ooo_wri_extra_4d(cdfilename, cdvarname, ndeps, nfcst, &
104                               &  nvars, nobs, pdata)
105         !!----------------------------------------------------------------------
106         !!                    ***  ROUTINE ooo_wri_extra_4d  ***
107         !!
108         !! ** Purpose : Write 4d variables to class 4 file.
109         !!
110         !!----------------------------------------------------------------------
111         INTEGER, INTENT(IN) :: &
112                 & nobs, &       !: number of observations/profiles
113                 & nvars, &      !: number of physical parameters
114                 & ndeps, &      !: number of depths
115                 & nfcst         !: number of forecasts
116         CHARACTER(len=*), INTENT(IN) :: &
117                 & cdfilename, & !: netcdf file name
118                 & cdvarname     !: netcdf variable name
119         REAL(KIND=cldp), DIMENSION(ndeps, nfcst, nvars, nobs), INTENT(IN) :: &
120                 & pdata         !: 4d data
121         INTEGER :: &
122                 & ncid, &       !:
123                 & dimid, &      !:
124                 & varid         !:
125         CHARACTER(len=16), PARAMETER :: cpname = 'ooo_wri_extra_4d'
126         ! Open netcdf file
127         CALL chkerr(nf90_open(trim(cdfilename), nf90_write, ncid), cpname, __LINE__ )
128         ! Write data
129         CALL chkerr(nf90_inq_varid(ncid,TRIM(cdvarname), varid),cpname, __LINE__ )
130         CALL chkerr(nf90_put_var(ncid, varid, pdata),cpname, __LINE__ )
131         ! Close netcdf file
132         CALL chkerr(nf90_close(ncid), cpname, __LINE__ )
133      END SUBROUTINE ooo_wri_extra_4d
134
135      SUBROUTINE ooo_wri_default(cdfilename, nobs, nvars, nfcst, ndeps, & 
136                             &   cdtyp, cdwmo, cunit, cvnam, &
137                             &   plam, pphi, pdep, ptim, pob, plead, &
138                             &   kqc, pmjuld)
139         !!----------------------------------------------------------------------
140         !!                    ***  ROUTINE ooo_wri_default  ***
141         !!
142         !! ** Purpose : Write standard variables to class 4 file.
143         !! ** Method  : Write the following variables;
144         !!                 observation type
145         !!                 observation wmo id
146         !!                 variable units
147         !!                 variable names
148         !!                 observation latitudes
149         !!                 observation longitudes
150         !!                 observation depths
151         !!                 observation times
152         !!                 observation values
153         !!                 observation qc flags
154         !!                 model julian days
155         !!                 
156         !! ** Returns :
157         !!----------------------------------------------------------------------
158         INTEGER, INTENT(IN) :: &
159                 & nfcst, &      !: number of forecasts
160                 & nobs, &       !: number of observations/profiles
161                 & nvars, &      !: number of physical parameters
162                 & ndeps         !: number of depths
163         CHARACTER(len=*), INTENT(IN) :: &
164                 & cdfilename    !: file name
165         CHARACTER(LEN=128), DIMENSION(nobs), INTENT(IN) :: &
166                 & cdtyp         !: Instrument type
167         CHARACTER(LEN=8), DIMENSION(nobs), INTENT(IN) :: &
168                 & cdwmo         ! WMO number
169         CHARACTER(LEN=128), DIMENSION(nobs) :: &
170                 & cdpad         !: Instrument type (padded)
171         CHARACTER(LEN=8), DIMENSION(nvars), INTENT(IN) :: &
172                 & cunit, &      !: variable units (e.g. psu)
173                 & cvnam         !: variable names (e.g. vosaline)
174         REAL(KIND=cldp), DIMENSION(nfcst), INTENT(IN) :: &
175                 & plead         !: Leadtime
176         REAL(KIND=cldp), DIMENSION(nobs), INTENT(IN) :: &
177                 & pphi, &       !: Latitude
178                 & plam          !: Longitude
179         REAL(KIND=cldp), DIMENSION(ndeps, nobs), INTENT(IN) :: &
180                 & pdep          !: Depth               
181         REAL(KIND=cldp), DIMENSION(ndeps, nvars, nobs), INTENT(IN) :: &
182                 & pob           !: T observation
183         REAL(KIND=cldp), DIMENSION(nobs), INTENT(IN) :: &
184                 & ptim          !: Time
185         INTEGER(KIND=2), DIMENSION(ndeps, nvars, nobs), INTENT(IN) :: &
186                 & kqc           !: Observation QC
187         REAL, INTENT(IN) :: &
188                 & pmjuld        !: Model Julian Day
189         CHARACTER(len=128) :: &
190                 & cvar          !: variable name placeholder
191         INTEGER :: &
192                 & ncid, &  !:
193                 & dimid, & !:
194                 & varid    !:
195         CHARACTER(len=15), PARAMETER :: cpname = 'ooo_wri_default'
196         ! Open netcdf file
197         CALL chkerr(nf90_open(trim(cdfilename), nf90_write, ncid), cpname, __LINE__ )
198         ! longitude
199         cvar = 'longitude'
200         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
201         CALL chkerr(nf90_put_var(ncid, varid, plam),cpname, __LINE__ )
202         ! latitude
203         cvar = 'latitude'
204         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
205         CALL chkerr(nf90_put_var(ncid, varid, pphi),cpname, __LINE__ )
206         ! depth
207         cvar = 'depth'
208         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
209         CALL chkerr(nf90_put_var(ncid, varid, pdep),cpname, __LINE__ )
210         ! varname
211         cvar = 'varname'
212         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
213         CALL chkerr(nf90_put_var(ncid, varid, cvnam),cpname, __LINE__ )
214         ! unitname
215         cvar = 'unitname'
216         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
217         CALL chkerr(nf90_put_var(ncid, varid, cunit),cpname, __LINE__ )
218         ! leadtime
219         cvar = 'leadtime'
220         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
221         CALL chkerr(nf90_put_var(ncid, varid, plead),cpname, __LINE__ )
222         ! observation
223         cvar = 'observation'
224         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
225         CALL chkerr(nf90_put_var(ncid, varid, pob),cpname, __LINE__ )
226         ! qc
227         cvar = 'qc'
228         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
229         CALL chkerr(nf90_put_var(ncid, varid, kqc),cpname, __LINE__ )
230         ! juld
231         cvar = 'juld'
232         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
233         CALL chkerr(nf90_put_var(ncid, varid, ptim),cpname, __LINE__ )
234         ! type
235         cvar = 'type'
236         CALL inst_converter(cdtyp,nobs,cdpad)
237         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
238         CALL chkerr(nf90_put_var(ncid, varid, cdpad),cpname, __LINE__ )
239         ! id
240         cvar = 'id'
241         CALL chkerr(nf90_inq_varid(ncid,TRIM(cvar), varid),cpname, __LINE__ )
242         CALL chkerr(nf90_put_var(ncid, varid, cdwmo),cpname, __LINE__ )
243         ! Close netcdf file
244         CALL chkerr(nf90_close(ncid), cpname, __LINE__ )
245      END SUBROUTINE ooo_wri_default
246
247      SUBROUTINE ooo_wri_init(cconf, csys, ckind, cversion, ccont, &
248                            & cinst, cdate, nproc, nobs, nvars, &
249                            & ndeps, nfcst, cdfilename)
250         !!----------------------------------------------------------------------
251         !!                    ***  ROUTINE ooo_wri_init  ***
252         !!
253         !! ** Purpose : Initialise a class 4 file.
254         !!
255         !! ** Method  :
256         !! ** Returns : cdfilename
257         !!----------------------------------------------------------------------
258         CHARACTER(len=*), INTENT(IN) :: &
259                 & cconf, &      !: model configuration e.g. orca025
260                 & csys, &       !: model system e.g. FOAM
261                 & ckind, &      !: observation kind e.g. profile
262                 & cversion, &   !: model version e.g. 12.0
263                 & ccont, &      !: contact email
264                 & cinst, &      !: institution description
265                 & cdate         !: e.g. yyyymmdd
266         INTEGER, INTENT(IN) :: &
267                 & nproc, &      !: processor number
268                 & nobs, &       !: number of observations/profiles
269                 & nvars, &      !: number of physical parameters
270                 & ndeps, &      !: number of depths
271                 & nfcst         !: number of forecast days
272         CHARACTER(len=128), INTENT(OUT) :: &
273                 & cdfilename    !: e.g. orca025
274         CHARACTER(len=4) :: &
275                 & cproc         !: character representation of nproc
276         CHARACTER(len=128) :: &
277                 & cattnam, &    !: attribute placeholder
278                 & cattval, &    !: attribute placeholder
279                 & cvar, &       !: variable name placeholder
280                 & cqcdes, &     !: quality control description
281                 & cqcval        !: quality control values
282         INTEGER :: &
283                 & istat, &      !: status of netcdf operation
284                 & ncid, &       !: netcdf file id placeholder
285                 & dimid_d, &    !: netcdf dimension id placeholder
286                 & dimid_f, &    !: netcdf dimension id placeholder
287                 & dimid_o, &    !: netcdf dimension id placeholder
288                 & dimid_v, &    !: netcdf dimension id placeholder
289                 & dimid_s, &    !: netcdf dimension id placeholder
290                 & dimid_l, &    !: netcdf dimension id placeholder
291                 & varid         !: netcdf variable id placeholder
292         INTEGER, DIMENSION(2) :: &
293                 & qc_flags      !: quality control flags
294         CHARACTER(len=23) :: &
295                 & ref_date      !: reference date holder
296         INTEGER, DIMENSION(2) :: &
297                 & dim2a, &      !: 2 dimensional settings
298                 & dim2b, &      !:
299                 & dim2c, &      !:
300                 & dim2d         !:
301         INTEGER, DIMENSION(3) :: &
302                 & dim3a         !: 3 dimensional settings
303         INTEGER, DIMENSION(4) :: &
304                 & dim4a         !: 4 dimensional settings
305         CHARACTER(len=12), PARAMETER :: cpname = 'ooo_wri_init'
306         ! Global att variables
307         CHARACTER(len=40) :: date_str
308         CHARACTER(len=6)  :: noon
309
310         WRITE(cproc, FMT="(I4.4)") nproc
311         cdfilename = 'class4'
312         cdfilename = TRIM(cdfilename)//'_'//TRIM(cdate)
313         cdfilename = TRIM(cdfilename)//'_'//TRIM(csys)
314         cdfilename = TRIM(cdfilename)//'_'//TRIM(cconf)
315         cdfilename = TRIM(cdfilename)//'_'//TRIM(cversion)
316         cdfilename = TRIM(cdfilename)//'_'//TRIM(ckind)
317         cdfilename = TRIM(cdfilename)//'_'//TRIM(cproc)
318         cdfilename = TRIM(cdfilename)//'.nc'
319         ! QC attribute string settings
320         IF (ckind .EQ. 'profile') THEN
321            cqcval = '0 - good data. 9 - bad data.'
322            cqcdes = ''
323            qc_flags = (/0, 9/)
324         ELSE IF (ckind .EQ. 'SST') THEN
325            cqcval = '0 - good data. 1 - bad data.'
326            cqcdes = 'In situ qc flag set to 0 if prob. of gross error < 0.5, &
327                     &1 otherwise. AATSR qc flag set to 0 for best_quality, 1 otherwise.'
328            qc_flags = (/0, 1/)
329         ELSE IF (ckind .EQ. 'SLA') THEN
330            cqcval = '0 - good data. 9 - bad data.'
331            cqcdes = ''
332            qc_flags = (/0, 9/)
333         ELSE
334            cqcval = ''
335            cqcdes = ''
336            qc_flags = (/0, 9/)
337         END IF
338         ! Check cdfilename exists
339         istat = nf90_open(TRIM(cdfilename), nf90_nowrite, ncid)
340         IF (istat /= nf90_noerr) THEN
341            IF (lwp) WRITE(numout, *) TRIM(cdfilename), ' opened successfully.'
342            CALL chkerr( nf90_create(TRIM(cdfilename), nf90_clobber, ncid), cpname, __LINE__ )
343            !! Global Dimension section
344            !  Partially hardwired for now
345            CALL date_format(date_str)
346            noon = '120000' ! hhmmss
347            ref_date = ''
348            CALL yyyymmdd_to_ref_date(TRIM(cdate), noon, ref_date)
349
350            CALL chkerr( nf90_put_att(ncid, nf90_global, 'title', &
351               & 'Forecast class 4 file'), cpname, __LINE__ )
352            CALL chkerr( nf90_put_att(ncid, nf90_global, 'version', &
353               & TRIM(cversion)), cpname, __LINE__ )
354            CALL chkerr( nf90_put_att(ncid, nf90_global, 'creation_date', &
355               & TRIM(date_str) ), cpname, __LINE__ )
356            CALL chkerr( nf90_put_att(ncid, nf90_global, 'validity_time', &
357               & TRIM(ref_date) ), cpname, __LINE__ )
358            CALL chkerr( nf90_put_att(ncid, nf90_global, 'contact', &
359               & TRIM(ccont) ), cpname, __LINE__ )
360            CALL chkerr( nf90_put_att(ncid, nf90_global, 'obs_type', &
361               & TRIM(ckind) ), cpname, __LINE__ )
362            CALL chkerr( nf90_put_att(ncid, nf90_global, 'system', &
363               & TRIM(csys)), cpname, __LINE__ )
364            CALL chkerr( nf90_put_att(ncid, nf90_global, 'configuration', &
365               & TRIM(cconf) ), cpname, __LINE__ ) 
366            CALL chkerr( nf90_put_att(ncid, nf90_global, 'institution', &
367               & TRIM(cinst) ), cpname, __LINE__ ) 
368
369            !! Define Dimensions
370            CALL chkerr(nf90_def_dim(ncid, 'numdeps', ndeps, dimid_d), cpname, __LINE__ )
371            CALL chkerr(nf90_def_dim(ncid, 'numfcsts', nfcst, dimid_f), cpname, __LINE__ )
372            CALL chkerr(nf90_def_dim(ncid, 'numvars', nvars, dimid_v), cpname, __LINE__ )
373            CALL chkerr(nf90_def_dim(ncid, 'numobs', nobs, dimid_o), cpname, __LINE__ )
374            CALL chkerr(nf90_def_dim(ncid, 'string_length8', 8, dimid_s), cpname, __LINE__ )
375            CALL chkerr(nf90_def_dim(ncid, 'string_length128', 128, dimid_l), cpname, __LINE__ )
376            !! Define possible dimension permutations
377            ! 2d
378            dim2a(:) = (/ dimid_d, dimid_o /) !: (/ ndeps, nobs  /)
379            dim2b(:) = (/ dimid_s, dimid_o /) !: (/ 8, nobs  /)
380            dim2c(:) = (/ dimid_s, dimid_v /) !: (/ 8, nvars /)
381            dim2d(:) = (/ dimid_l, dimid_o /) !: (/ 128, nobs  /)
382            ! 3d
383            dim3a(:) = (/ dimid_d, dimid_v, dimid_o/) !: (/ ndeps, nvars, nobs /)
384            ! 4d
385            dim4a(:) = (/ dimid_d, dimid_f, dimid_v, dimid_o /) !: (/ ndeps, nfcst, nvars, nobs /)
386
387            !! Create the variables
388            !  Forecast day
389            cvar = 'leadtime'
390            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dimid_f, varid), cpname, __LINE__ )
391            cattnam = 'long_name'
392            cattval = 'Model forecast day offset'
393            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
394            cattnam = 'units'
395            cattval = 'Hours'
396            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
397            cattnam = 'comment'
398            cattval = 'Hours between forecast production and validity time'
399            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
400
401            !  longitude
402            cvar = 'longitude'
403            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dimid_o, varid), cpname, __LINE__ )
404            cattnam = 'long_name'
405            cattval = 'Longitudes'
406            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
407            cattnam = 'units'
408            cattval = 'Degrees'
409            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
410
411            !  latitude
412            cvar = 'latitude'
413            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dimid_o, varid), cpname, __LINE__ )
414            cattnam = 'long_name'
415            cattval = 'Latitudes'
416            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
417            cattnam = 'units'
418            cattval = 'Degrees'
419
420            !  depth
421            cvar = 'depth'
422            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dim2a, varid), cpname, __LINE__ )
423            CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', clrmdi), cpname, __LINE__ )
424            cattnam = 'long_name'
425            cattval = 'Depths'
426            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
427            cattnam = 'units'
428            cattval = 'metre'
429            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
430
431            !  varname
432            cvar = 'varname'
433            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_char, dim2c, varid), cpname, __LINE__ )
434            cattnam = 'long_name'
435            cattval = 'Variable name'
436            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
437
438            !  unitname
439            cvar = 'unitname'
440            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_char, dim2c, varid), cpname, __LINE__ )
441            cattnam = 'long_name'
442            cattval = 'Unit name'
443            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
444
445            !  observation
446            cvar = 'observation'
447            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dim3a, varid), cpname, __LINE__ )
448            CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', clrmdi), cpname, __LINE__ )
449            cattnam = 'long_name'
450            cattval = 'Observation value'
451            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
452
453            !  forecast
454            cvar = 'forecast'
455            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dim4a, varid), cpname, __LINE__ )
456            CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', clrmdi), cpname, __LINE__ )
457            cattnam = 'long_name'
458            cattval = 'Model forecast counterpart of obs. value'
459            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
460            cattnam = 'comment'
461            cattval = 'Model daily mean valid at noon used for calculation'
462            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
463
464            !  persistence
465            cvar = 'persistence'
466            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dim4a, varid), cpname, __LINE__ )
467            CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', clrmdi), cpname, __LINE__ )
468            cattnam = 'long_name'
469            cattval = 'Model persistence counterpart of obs. value'
470            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
471            cattnam = 'comment'
472            cattval = 'Model daily mean valid at noon used for calculation'
473            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
474
475            !  climatology
476            cvar = 'climatology'
477            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dim3a, varid), cpname, __LINE__ )
478            CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', clrmdi), cpname, __LINE__ )
479            cattnam = 'long_name'
480            cattval = 'Climatological value'
481            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
482            cattnam = 'comment'
483            cattval = 'Levitus monthly fields interpolated to the correct day'
484            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
485
486            !  daym2
487            cvar = 'best_estimate'
488            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dim3a, varid), cpname, __LINE__ )
489            CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', clrmdi), cpname, __LINE__ )
490            cattnam = 'long_name'
491            cattval = 'Best estimate'
492            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
493            cattnam = 'comment'
494            cattval = 'FOAM daym2 field'
495            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
496
497            !  daym1
498            cvar = 'nrt_analysis'
499            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dim3a, varid), cpname, __LINE__ )
500            CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', clrmdi), cpname, __LINE__ )
501            cattnam = 'long_name'
502            cattval = 'Near real time analysis'
503            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
504            cattnam = 'comment'
505            cattval = 'FOAM daym1 field'
506            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
507         
508            !  optional fields
509            IF (TRIM(ckind) .EQ. 'SLA') THEN
510               !  mdt
511               cvar = 'mdt_reference'
512               CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dim3a, varid), cpname, __LINE__ )
513               CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', clrmdi), cpname, __LINE__ )
514               cattnam = 'long_name'
515               cattval = 'Mean dynamic topography'
516               CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
517               cattnam = 'comment'
518               cattval = 'MDT reference field'
519               CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
520
521               !  altbias
522               cvar = 'altimeter_bias'
523               CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dim3a, varid), cpname, __LINE__ )
524               CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', clrmdi), cpname, __LINE__ )
525               cattnam = 'long_name'
526               cattval = 'Altimeter bias'
527               CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
528            ENDIF
529         
530            !  qc
531            cvar = 'qc'
532            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_short, dim3a, varid), cpname, __LINE__ )
533            CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', NF90_FILL_SHORT), cpname, __LINE__ )
534            cattnam = 'long_name'
535            cattval = 'Quality flags'
536            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
537            cattnam = 'flag_value'
538            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), qc_flags), cpname, __LINE__ )
539            cattnam = 'flag_meaning'
540            cattval = cqcval
541            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
542            cattnam = 'comment'
543            cattval = cqcdes
544            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
545
546!            !  juld
547            cvar = 'juld'
548            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_double, dimid_o, varid), cpname, __LINE__ )
549!            CALL chkerr(nf90_put_att(ncid, varid, '_FillValue', clrmdi), cpname, __LINE__ )
550            cattnam = 'long_name'
551            cattval = 'Observation time in Julian days'
552            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
553            cattnam = 'units'
554            CALL yyyymmdd_to_ref_date('19500101', '000000', ref_date)
555            cattval = 'Days since '//ref_date
556            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
557
558            !  modeljuld
559            cvar = 'modeljuld'
560            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_float, dimid_f, varid), cpname, __LINE__ )
561            cattnam = 'long_name'
562            cattval = 'Model field date in Julian days'
563            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
564            cattnam = 'units'
565            cattval = 'Days since '//ref_date
566            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
567
568            !  type
569            cvar = 'type'
570            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_char, dim2d, varid), cpname, __LINE__ )
571            cattnam = 'long_name'
572            cattval = 'Observation type'
573            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
574
575            !  id
576            cvar = 'id'
577            CALL chkerr(nf90_def_var(ncid, TRIM(cvar), nf90_char, dim2b, varid), cpname, __LINE__ )
578            cattnam = 'long_name'
579            cattval = 'Observation id'
580            CALL chkerr(nf90_put_att(ncid, varid, TRIM(cattnam), TRIM(cattval)), cpname, __LINE__ )
581
582            ! Close netcdf file
583            CALL chkerr(nf90_close(ncid), cpname, __LINE__ )
584         ELSE
585            IF (lwp) WRITE(numout, *) TRIM(cdfilename), 'already exists.'
586            ! Close netcdf file
587            CALL chkerr(nf90_close(ncid), cpname, __LINE__ )
588         END IF
589      END SUBROUTINE ooo_wri_init
590
591
592END MODULE ooo_write
Note: See TracBrowser for help on using the repository browser.