Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
bufr.pm:bufrdump [2018-04-25 08:40:56] pals |
bufr.pm:bufrdump [2022-05-31 09:29:31] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | Use this in Makefile, with $(FC) set to your Fortran compiler (e.g. gfortran or g77), $(LDIR) set to the directory where libbufr.a is located, and $(FCFLAGS) set to -fbackslash for gfortran | + | Use this in Makefile, with $(FC) set to your Fortran compiler (e.g. gfortran or g77), $(LDIR) set to the directory where libbufr.a is located, and $(FCFLAGS) set to -fbackslash for gfortran. Note that code for comfilter.f is found at the end of this page (below the code for bufrdump.F). |
| < | < | ||
| Line 7: | Line 7: | ||
| <code fortran bufrdump.F> | <code fortran bufrdump.F> | ||
| - | C (C) Copyright 2010-2018 MET Norway | + | C (C) Copyright 2010-2016 MET Norway |
| C | C | ||
| C This program is free software; you can redistribute it and/or modify | C This program is free software; you can redistribute it and/or modify | ||
| Line 161: | Line 161: | ||
| INTEGER verbose | INTEGER verbose | ||
| + | LOGICAL metar ! Set to TRUE if metar (data subcategory 5) | ||
| + | | ||
| INTEGER kelem, | INTEGER kelem, | ||
| INTEGER kvals ! expected (max) number of data values | INTEGER kvals ! expected (max) number of data values | ||
| Line 208: | Line 209: | ||
| kerr = 0 | kerr = 0 | ||
| + | metar = .FALSE. | ||
| + | | ||
| C Do a partial expansion without quality control | C Do a partial expansion without quality control | ||
| kreq(1) = 1 ! All original elements without quality control | kreq(1) = 1 ! All original elements without quality control | ||
| Line 226: | Line 228: | ||
| C | C | ||
| - | C Using parameter kelem in call to BUFREX might be too big for | + | C Using parameter kelem in call to BUFREX might be too big for some |
| - | C | + | C |
| - | C in libbufr, first calling BUS012 in order to get number of subsets | + | C copied the method used in decode_bufr.F in libbufr, first calling |
| - | C ksup(6) | + | C BUS012 in order to get number of subsets ksup(6) |
| CALL BUS012(ilen, | CALL BUS012(ilen, | ||
| IF (kerr.NE.0) THEN | IF (kerr.NE.0) THEN | ||
| Line 238: | Line 240: | ||
| END IF | END IF | ||
| kxelem = kvals/ | kxelem = kvals/ | ||
| - | | + | C The second IF-condition is not in decode_bufr.F, |
| + | C | ||
| + | | ||
| CALL BUFREX (ilen, | CALL BUFREX (ilen, | ||
| Line 259: | Line 263: | ||
| IF (ksec1(6).GT.2 .AND. ksec1(6).NE.4 .AND. ksec1(6).NE.6 | IF (ksec1(6).GT.2 .AND. ksec1(6).NE.4 .AND. ksec1(6).NE.6 | ||
| | | ||
| + | |||
| + | C MET (and perhaps also other ECMWF based software?) uses local | ||
| + | C | ||
| + | IF (KSEC1(2).EQ.3 .AND. KSEC1(6).EQ.0 .AND. KSEC1(7).EQ.5) THEN | ||
| + | metar = .TRUE. | ||
| + | END IF | ||
| IF (filter) THEN | IF (filter) THEN | ||
| Line 294: | Line 304: | ||
| IF (obstype.EQ.' | IF (obstype.EQ.' | ||
| CALL print_surface_values(ksub, | CALL print_surface_values(ksub, | ||
| - | | + | |
| ELSE IF (obstype(1: | ELSE IF (obstype(1: | ||
| CALL print_sounding_values(ksub, | CALL print_sounding_values(ksub, | ||
| Line 306: | Line 316: | ||
| ELSE IF (ksec1(6).LE.1) THEN | ELSE IF (ksec1(6).LE.1) THEN | ||
| CALL print_surface_values(ksub, | CALL print_surface_values(ksub, | ||
| - | | + | |
| ELSE IF (ksec1(6).EQ.2) THEN | ELSE IF (ksec1(6).EQ.2) THEN | ||
| CALL print_sounding_values(ksub, | CALL print_sounding_values(ksub, | ||
| Line 334: | Line 344: | ||
| IF (obstype.EQ.' | IF (obstype.EQ.' | ||
| CALL print_surface_values(ksub, | CALL print_surface_values(ksub, | ||
| - | | + | |
| ELSE IF (obstype(1: | ELSE IF (obstype(1: | ||
| CALL print_sounding_values(ksub, | CALL print_sounding_values(ksub, | ||
| Line 346: | Line 356: | ||
| ELSE IF (ksec1(6).LE.1) THEN | ELSE IF (ksec1(6).LE.1) THEN | ||
| CALL print_surface_values(ksub, | CALL print_surface_values(ksub, | ||
| - | | + | |
| ELSE IF (ksec1(6).EQ.2) THEN | ELSE IF (ksec1(6).EQ.2) THEN | ||
| CALL print_sounding_values(ksub, | CALL print_sounding_values(ksub, | ||
| Line 832: | Line 842: | ||
| REAL*8 value | REAL*8 value | ||
| INTEGER idx, | INTEGER idx, | ||
| - | PARAMETER(maxlevel=10000) | + | PARAMETER(maxlevel=100000) |
| REAL*8 P(maxlevel), | REAL*8 P(maxlevel), | ||
| Line 1343: | Line 1353: | ||
| SUBROUTINE print_surface_values(ksub, | SUBROUTINE print_surface_values(ksub, | ||
| - | | + | |
| C | C | ||
| IMPLICIT NONE | IMPLICIT NONE | ||
| Line 1354: | Line 1364: | ||
| CHARACTER*80 cvals(*) | CHARACTER*80 cvals(*) | ||
| LOGICAL rectangle | LOGICAL rectangle | ||
| + | LOGICAL metar ! Input: TRUE if metar (data subcategory 5) | ||
| INTEGER verbose | INTEGER verbose | ||
| Line 1381: | Line 1392: | ||
| INTEGER idx,cidx | INTEGER idx,cidx | ||
| INTEGER cloud_type_count | INTEGER cloud_type_count | ||
| - | ! (cloud type) encountered (0 initially) | + | ! (cloud type) encountered (0 initially). |
| - | INTEGER num_cloud_layers | + | ! Not used for metar |
| - | ! set to value of 031001 (delayed | + | INTEGER num_cloud_layers |
| - | ! descriptor) if this is met immediately | + | ! to value of 031001 (delayed |
| - | ! after a 020012 descriptor (-1 initially) | + | ! replication factor) if this is met immediately |
| + | ! after a 020012 descriptor (-1 initially). | ||
| + | ! For metar num_cloud_layers is increased | ||
| + | ! by one for each new 020011 | ||
| LOGICAL bad_cloud_data | LOGICAL bad_cloud_data | ||
| ! found in cloud data. No more cloud | ! found in cloud data. No more cloud | ||
| Line 1839: | Line 1853: | ||
| C | C | ||
| C type, according to all WMO recommended templates | C type, according to all WMO recommended templates | ||
| + | C (but DNMI metar is an exception!) | ||
| IF (ktdexp(idx - 1).EQ.20012) THEN | IF (ktdexp(idx - 1).EQ.20012) THEN | ||
| IF (NINT(value).LE.4) THEN | IF (NINT(value).LE.4) THEN | ||
| Line 1866: | Line 1881: | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20011 .AND. .NOT.bad_cloud_data) THEN ! Cloud amount | ELSE IF (desc.EQ.20011 .AND. .NOT.bad_cloud_data) THEN ! Cloud amount | ||
| - | IF (cloud_type_count.EQ.0) THEN ! First occurrence | + | |
| + | IF (num_cloud_layers.GT.-1) THEN | ||
| + | num_cloud_layers = num_cloud_layers + 1 | ||
| + | | ||
| + | num_cloud_layers = 1 | ||
| + | END IF | ||
| + | | ||
| + | ELSE IF (cloud_type_count.EQ.0) THEN ! First occurrence | ||
| IF (NH.EQ.rvind) THEN | IF (NH.EQ.rvind) THEN | ||
| NH = value | NH = value | ||
| Line 1885: | Line 1907: | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20012 .AND. .NOT.bad_cloud_data) THEN ! Cloud type | ELSE IF (desc.EQ.20012 .AND. .NOT.bad_cloud_data) THEN ! Cloud type | ||
| - | cloud_type_count = cloud_type_count + 1 | + | |
| - | IF (cloud_type_count.GT.3) THEN | + | |
| - | | + | ELSE |
| - | | + | cloud_type_count = cloud_type_count + 1 |
| - | IF (value < 10.0 ! Accept one digit values only | + | |
| - | | + | cloud_layer = cloud_type_count - 3 |
| + | IF (num_cloud_layers .GT.-1) THEN | ||
| + | | ||
| + | | ||
| + | CC(cloud_layer) = value | ||
| + | END IF | ||
| + | ELSE IF (cloud_layer.LT.5) THEN ! rdb-files always have 0 or 4 cloud layers | ||
| | | ||
| END IF | END IF | ||
| - | | + | |
| - | | + | IF (cloud_type_count.EQ.1) THEN |
| - | END IF | + | |
| - | ELSE | + | CL = value |
| - | IF (cloud_type_count.EQ.1) THEN | + | |
| - | IF (CL.EQ.rvind) THEN | + | ELSE IF (cloud_type_count.EQ.2) THEN |
| - | | + | |
| - | END IF | + | CM = value |
| - | | + | |
| - | IF (CM.EQ.rvind) THEN | + | ELSE IF (cloud_type_count.EQ.3) THEN |
| - | | + | |
| - | END IF | + | CH = value |
| - | | + | END IF |
| - | IF (CH.EQ.rvind) THEN | + | |
| - | | + | |
| END IF | END IF | ||
| END IF | END IF | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20013 .AND. .NOT.bad_cloud_data) THEN ! Height of base of cloud | ELSE IF (desc.EQ.20013 .AND. .NOT.bad_cloud_data) THEN ! Height of base of cloud | ||
| - | IF (cloud_type_count.EQ.0) THEN ! First occurrence | + | |
| + | | ||
| + | ELSE IF (cloud_type_count.EQ.0) THEN ! First occurrence | ||
| IF (HL.EQ.rvind) THEN | IF (HL.EQ.rvind) THEN | ||
| HL = value | HL = value | ||