[4106] | 1 | MODULE ooo_write |
---|
[4030] | 2 | !!====================================================================== |
---|
[4106] | 3 | !! *** MODULE ooo_write *** |
---|
[4030] | 4 | !!====================================================================== |
---|
[4110] | 5 | |
---|
[4108] | 6 | USE in_out_manager |
---|
[4030] | 7 | USE netcdf |
---|
| 8 | USE obs_utils, ONLY: chkerr |
---|
[4109] | 9 | USE ooo_utils, ONLY: date_format, inst_converter, yyyymmdd_to_ref_date |
---|
[4106] | 10 | USE ooo_data |
---|
[4110] | 11 | |
---|
[4030] | 12 | IMPLICIT NONE |
---|
| 13 | PRIVATE |
---|
| 14 | |
---|
[4106] | 15 | PUBLIC ooo_wri_init |
---|
| 16 | PUBLIC ooo_wri_default |
---|
| 17 | PUBLIC ooo_wri_extra |
---|
[4030] | 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 | |
---|
[4106] | 27 | INTERFACE ooo_wri_extra |
---|
| 28 | MODULE PROCEDURE ooo_wri_extra_3d_index, ooo_wri_extra_4d, ooo_wri_extra_4d_index |
---|
[4030] | 29 | END INTERFACE |
---|
| 30 | |
---|
| 31 | CONTAINS |
---|
| 32 | |
---|
[4106] | 33 | SUBROUTINE ooo_wri_extra_3d_index(cdfilename, cdvarname, ndeps, nvars, & |
---|
[4048] | 34 | & nobs, kstart, kcount, pdata) |
---|
[4030] | 35 | !!---------------------------------------------------------------------- |
---|
[4106] | 36 | !! *** ROUTINE ooo_wri_extra_3d *** |
---|
[4030] | 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 |
---|
[4048] | 48 | INTEGER, DIMENSION(3), INTENT(IN) :: & |
---|
| 49 | & kstart, & !: start indices |
---|
| 50 | & kcount !: count indices |
---|
[4030] | 51 | REAL(KIND=cldp), DIMENSION(ndeps, nvars, nobs), INTENT(IN) :: & |
---|
| 52 | & pdata !: 3d data |
---|
| 53 | INTEGER :: & |
---|
| 54 | & ncid, & !: |
---|
| 55 | & dimid, & !: |
---|
| 56 | & varid !: |
---|
[4106] | 57 | CHARACTER(len=16), PARAMETER :: cpname = 'ooo_wri_extra_3d' |
---|
[4030] | 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__ ) |
---|
[4048] | 62 | CALL chkerr(nf90_put_var(ncid, varid, pdata, kstart, kcount),cpname, __LINE__ ) |
---|
[4030] | 63 | ! Close netcdf file |
---|
| 64 | CALL chkerr(nf90_close(ncid), cpname, __LINE__ ) |
---|
[4106] | 65 | END SUBROUTINE ooo_wri_extra_3d_index |
---|
[4030] | 66 | |
---|
[4106] | 67 | SUBROUTINE ooo_wri_extra_4d_index(cdfilename, cdvarname, ndeps, nfcst, & |
---|
[4030] | 68 | & nvars, nobs, kstart, kcount, pdata) |
---|
| 69 | !!---------------------------------------------------------------------- |
---|
[4106] | 70 | !! *** ROUTINE ooo_wri_extra_4d *** |
---|
[4030] | 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 !: |
---|
[4106] | 92 | CHARACTER(len=22), PARAMETER :: cpname = 'ooo_wri_extra_4d_index' |
---|
[4030] | 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__ ) |
---|
[4106] | 100 | END SUBROUTINE ooo_wri_extra_4d_index |
---|
[4030] | 101 | |
---|
[4106] | 102 | SUBROUTINE ooo_wri_extra_4d(cdfilename, cdvarname, ndeps, nfcst, & |
---|
[4030] | 103 | & nvars, nobs, pdata) |
---|
| 104 | !!---------------------------------------------------------------------- |
---|
[4106] | 105 | !! *** ROUTINE ooo_wri_extra_4d *** |
---|
[4030] | 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 !: |
---|
[4106] | 124 | CHARACTER(len=16), PARAMETER :: cpname = 'ooo_wri_extra_4d' |
---|
[4030] | 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__ ) |
---|
[4106] | 132 | END SUBROUTINE ooo_wri_extra_4d |
---|
[4030] | 133 | |
---|
[4106] | 134 | SUBROUTINE ooo_wri_default(cdfilename, nobs, nvars, nfcst, ndeps, & |
---|
[4030] | 135 | & cdtyp, cdwmo, cunit, cvnam, & |
---|
| 136 | & plam, pphi, pdep, ptim, pob, plead, & |
---|
| 137 | & kqc, pmjuld) |
---|
| 138 | !!---------------------------------------------------------------------- |
---|
[4106] | 139 | !! *** ROUTINE ooo_wri_default *** |
---|
[4030] | 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 !: |
---|
[4106] | 194 | CHARACTER(len=15), PARAMETER :: cpname = 'ooo_wri_default' |
---|
[4030] | 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__ ) |
---|
[4106] | 244 | END SUBROUTINE ooo_wri_default |
---|
[4030] | 245 | |
---|
[4106] | 246 | SUBROUTINE ooo_wri_init(cconf, csys, ckind, cversion, ccont, & |
---|
[4048] | 247 | & cinst, cdate, nproc, nobs, nvars, & |
---|
| 248 | & ndeps, nfcst, cdfilename) |
---|
[4030] | 249 | !!---------------------------------------------------------------------- |
---|
[4106] | 250 | !! *** ROUTINE ooo_wri_init *** |
---|
[4030] | 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 |
---|
[4048] | 262 | & ccont, & !: contact email |
---|
| 263 | & cinst, & !: institution description |
---|
[4030] | 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 |
---|
[4106] | 304 | CHARACTER(len=12), PARAMETER :: cpname = 'ooo_wri_init' |
---|
[4030] | 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.' |
---|
[4094] | 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.' |
---|
[4030] | 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 |
---|
[4108] | 340 | IF (lwp) WRITE(numout, *) TRIM(cdfilename), ' opened successfully.' |
---|
[4030] | 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', & |
---|
[4048] | 358 | & TRIM(ccont) ), cpname, __LINE__ ) |
---|
[4030] | 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__ ) |
---|
[4048] | 365 | CALL chkerr( nf90_put_att(ncid, nf90_global, 'institution', & |
---|
| 366 | & TRIM(cinst) ), cpname, __LINE__ ) |
---|
[4030] | 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 |
---|
[4108] | 584 | IF (lwp) WRITE(numout, *) TRIM(cdfilename), 'already exists.' |
---|
[4030] | 585 | ! Close netcdf file |
---|
| 586 | CALL chkerr(nf90_close(ncid), cpname, __LINE__ ) |
---|
| 587 | END IF |
---|
[4106] | 588 | END SUBROUTINE ooo_wri_init |
---|
[4030] | 589 | |
---|
| 590 | |
---|
[4106] | 591 | END MODULE ooo_write |
---|