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.
sao_write.F90 in branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/SAO_SRC – NEMO

source: branches/2014/dev_r4650_UKMO14.12_STAND_ALONE_OBSOPER/NEMOGCM/NEMO/SAO_SRC/sao_write.F90 @ 4851

Last change on this file since 4851 was 4851, checked in by andrewryan, 9 years ago

moved ooo_utils.F90 to sao_utils.F90 along with renaming its internal subroutines appropriately

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