14 vtable_gribfile_type_ecmwf_grib1, &
15 vtable_gribfile_type_ecmwf_grib2, &
16 vtable_gribfile_type_ecmwf_grib1_2, &
17 vtable_gribfile_type_ncep_grib1, &
18 vtable_gribfile_type_ncep_grib2, &
19 vtable_gribfile_type_unknown
22 integer,
parameter :: VTABLE_MISSING_ENTRY = -9999
26 integer,
parameter :: Vtable_GRIBFILE_TYPE_ECMWF_GRIB1 = 1, &
27 Vtable_GRIBFILE_TYPE_ECMWF_GRIB2 = 2, &
28 Vtable_GRIBFILE_TYPE_ECMWF_GRIB1_2 = 3, &
29 Vtable_GRIBFILE_TYPE_NCEP_GRIB1 = 4, &
30 Vtable_GRIBFILE_TYPE_NCEP_GRIB2 = 5, &
31 Vtable_GRIBFILE_TYPE_UNKNOWN = -99
34 integer,
parameter :: GRIB_CENTRE_NCEP = 7, &
35 GRIB_CENTRE_ECMWF = 98
38 character(len=15) :: fpname
40 integer :: indicator_of_parameter
44 integer :: typesurface
45 character(len=25) :: typelevel
46 character(len=15) :: units
47 character(len=10) :: shortname
48 character(len=25) :: description
49 integer :: grib_version
50 character(len=10) :: center
54 logical :: initialized=.FALSE.
55 character(len=255) :: path_to_vtable_file
56 integer :: num_entries = 0
72 character(len=255),
intent(in) :: gribfilename
74 integer :: ifile, iret, igrib, grib_centre, grib_edition
75 logical :: end_of_file
76 logical :: grib1_detected = .false., grib2_detected = .false.
78 call grib_open_file(ifile, gribfilename,
'r', iret)
83 call grib_new_from_file(ifile, igrib, iret)
84 call grib_get(igrib,
'centre', grib_centre)
85 call grib_get(igrib,
'edition', grib_edition)
87 if (grib_edition .eq. 1) grib1_detected = .true.
88 if (grib_edition .eq. 2) grib2_detected = .true.
92 do while (.NOT. end_of_file)
93 call grib_new_from_file(ifile, igrib, iret)
94 if (iret .eq. grib_end_of_file)
then
99 call grib_get(igrib,
'edition', grib_edition)
100 if (grib_edition .eq. 1) grib1_detected = .true.
101 if (grib_edition .eq. 2) grib2_detected = .true.
105 call grib_close_file(ifile)
109 if (grib_centre .eq. grib_centre_ecmwf)
then
110 if (grib1_detected .and. grib2_detected)
then
112 else if (grib1_detected .and. .not. grib2_detected)
then
114 else if (.not. grib1_detected .and. grib2_detected)
then
119 else if (grib_centre .eq. grib_centre_ncep)
then
120 if (grib1_detected .and. .not. grib2_detected)
then
122 else if (.not. grib1_detected .and. grib2_detected)
then
138 character(len=255),
intent(in) :: vtable_name
142 integer :: num_vrecs = 0
144 character(len=255) :: file_line =
' '
146 type(vtable),
intent(out) :: the_vtable_data
151 inquire(file=trim(vtable_name), exist=lexist)
152 if (.not. lexist)
then
153 print *,
'file: ', trim(vtable_name),
' does not exist...'
158 open(10, file=trim(vtable_name), status=
'old', form=
'formatted', iostat=ierr)
159 if (ierr .ne. 0)
then
160 print *,
'file: ', trim(vtable_name),
' open failed...'
167 do while(file_line(1:1) .ne.
'-')
168 read(10,
'(A255)', iostat=ierr) file_line
176 do while(file_line(1:1) .ne.
'-')
177 read(10,
'(A255)', iostat=ierr) file_line
179 num_vrecs = num_vrecs + 1
181 num_vrecs = num_vrecs - 1
190 print *,
'Ready to allocate the_vtable_data'
191 allocate(the_vtable_data%the_entries(num_vrecs))
192 print *,
'Allocated the_vtable_data'
193 the_vtable_data%num_entries = num_vrecs
198 do while(file_line(1:1) .ne.
'-')
199 read(10,
'(A255)', iostat=ierr) file_line
208 do while(file_line(1:1) .ne.
'-')
209 read(10,
'(A255)', iostat=ierr) file_line
210 if (file_line(1:1) .ne.
'-')
then
212 vrec_idx = vrec_idx + 1
222 num_vrecs = num_vrecs - 1
228 the_vtable_data%initialized = .true.
242 character(LEN=255),
intent(in) :: vtable_line
254 character(25) :: token_fpname=
'',&
256 token_indofparam=
'', &
257 token_discipline=
'', &
260 token_typesurface=
'', &
261 token_typelevel=
'', &
263 token_shortname=
'', &
264 token_description=
'', &
265 token_gribversion=
'', &
269 integer :: delim_fpname_idx, &
271 delim_indofparam_idx, &
275 delim_typesurf_idx, &
276 delim_typelevel_idx, &
278 delim_shortname_idx, &
288 delim_fpname_idx = index(vtable_line,
'|')
289 delim_paramid_idx = index(vtable_line(delim_fpname_idx+1:),
'|') &
291 delim_indofparam_idx = index(vtable_line(delim_paramid_idx+1:),
'|') &
293 delim_disc_idx = index(vtable_line(delim_indofparam_idx+1:),
'|') &
294 + delim_indofparam_idx
295 delim_cat_idx = index(vtable_line(delim_disc_idx+1:),
'|') &
297 delim_numb_idx = index(vtable_line(delim_cat_idx+1:),
'|') &
299 delim_typesurf_idx = index(vtable_line(delim_numb_idx+1:),
'|') &
301 delim_typelevel_idx = index(vtable_line(delim_typesurf_idx+1:),
'|') &
303 delim_units_idx = index(vtable_line(delim_typelevel_idx+1:),
'|') &
304 + delim_typelevel_idx
305 delim_shortname_idx = index(vtable_line(delim_units_idx+1:),
'|') &
307 delim_descr_idx = index(vtable_line(delim_shortname_idx+1:),
'|') &
308 + delim_shortname_idx
309 delim_version_idx = index(vtable_line(delim_descr_idx+1:),
'|') &
311 delim_center_idx = index(vtable_line(delim_version_idx+1:),
'|') &
315 token_fpname = vtable_line(:delim_fpname_idx-1)
316 token_paramid = vtable_line(delim_fpname_idx+1:delim_paramid_idx-1)
317 token_indofparam = vtable_line(delim_paramid_idx+1:delim_indofparam_idx-1)
318 token_discipline = vtable_line(delim_indofparam_idx+1:delim_disc_idx-1)
319 token_category = vtable_line(delim_disc_idx+1:delim_cat_idx-1)
320 token_number = vtable_line(delim_cat_idx+1:delim_numb_idx-1)
321 token_typesurface = vtable_line(delim_numb_idx+1:delim_typesurf_idx-1)
322 token_typelevel = vtable_line(delim_typesurf_idx+1:delim_typelevel_idx-1)
323 token_units = vtable_line(delim_typelevel_idx+1:delim_units_idx-1)
324 token_shortname = vtable_line(delim_units_idx+1:delim_shortname_idx-1)
325 token_description = vtable_line(delim_shortname_idx+1:delim_descr_idx-1)
326 token_gribversion = vtable_line(delim_descr_idx+1:delim_version_idx-1)
327 token_center = vtable_line(delim_version_idx+1:delim_center_idx-1)
330 vrecord%fpname = token_fpname
332 read(token_paramid, *, iostat=istat) vrecord%paramid
333 if (istat .ne. 0) vrecord%paramid = vtable_missing_entry
335 read(token_indofparam, *, iostat=istat) vrecord%indicator_of_parameter
336 if (istat .ne. 0) vrecord%indicator_of_parameter = vtable_missing_entry
339 read(token_discipline, *, iostat=istat) vrecord%discipline
340 if (istat .ne. 0) vrecord%discipline = vtable_missing_entry
342 read(token_category, *, iostat=istat) vrecord%category
343 if (istat .ne. 0) vrecord%category = vtable_missing_entry
345 read(token_number, *, iostat=istat) vrecord%number
346 if (istat .ne. 0) vrecord%number = vtable_missing_entry
348 read(token_typesurface, *, iostat=istat) vrecord%typesurface
349 if (istat .ne. 0) vrecord%typesurface = vtable_missing_entry
351 vrecord%typelevel = token_typelevel
352 vrecord%units = token_units
353 vrecord%shortname = token_shortname
354 vrecord%description = token_description
356 read(token_gribversion, *, iostat=istat) vrecord%grib_version
357 if (istat .ne. 0) vrecord%grib_version = vtable_missing_entry
359 vrecord%center = token_center
379 integer,
intent(in) :: igrib
380 type(vtable),
intent(in) :: vtable_object
382 integer :: parameter_id, category, number, discipline, edition, surface_type, &
383 level, indicator_of_parameter
384 character(len=10) :: center
387 logical :: record_match
389 call grib_get(igrib,
'editionNumber', edition)
390 call grib_get(igrib,
'level', level)
392 if (edition .eq. 1)
then
393 call grib_get(igrib,
'indicatorOfParameter', indicator_of_parameter)
394 call grib_get(igrib,
'indicatorOfTypeOfLevel', surface_type)
397 else if (edition .eq. 2)
then
398 call grib_get(igrib,
'parameterNumber', number)
399 call grib_get(igrib,
'parameterCategory', category)
400 call grib_get(igrib,
'discipline', discipline)
401 call grib_get(igrib,
'typeOfFirstFixedSurface', surface_type)
405 print *,
'Illegal edition: ', edition
411 record_match = .false.
413 do while (.NOT. record_match .AND. idx .LE. vtable_object%num_entries)
417 if (edition .eq. 1)
then
418 if (vtable_object%the_entries(idx)%indicator_of_parameter .eq. indicator_of_parameter .and. &
419 vtable_object%the_entries(idx)%typesurface .eq. surface_type)
then
421 record_match = .true.
423 else if (edition .eq. 2)
then
424 if (vtable_object%the_entries(idx)%discipline .eq. discipline .and. &
425 vtable_object%the_entries(idx)%number .eq. number .and. &
426 vtable_object%the_entries(idx)%category .eq. category .and. &
427 vtable_object%the_entries(idx)%typesurface .eq. surface_type)
then
430 record_match = .true.
433 print *,
'Illegal edition: ', edition
character(len=15) function, public vtable_get_fpname(igrib, vtable_object)
type(vtable_record) function vtable_parse_record(vtable_line)
subroutine, public vtable_load_by_name(vtable_name, the_vtable_data)
integer function, public vtable_detect_gribfile_type(gribfilename)