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.
off_write.F90 in branches/2013/dev_r3987_UKMO4_OBS/NEMOGCM/NEMO/OOO_SRC – NEMO

source: branches/2013/dev_r3987_UKMO4_OBS/NEMOGCM/NEMO/OOO_SRC/off_write.F90 @ 4031

Last change on this file since 4031 was 4031, checked in by djlea, 11 years ago

Updates to fix a reading bug and removal of debug print statements from Andy Ryan.

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