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 [2010-08-12 11:59:01] 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 | + | 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). |
| < | < | ||
| bufrdump: bufrdump.F comfilter.f | bufrdump: bufrdump.F comfilter.f | ||
| - | $(FC) -o bufrdump | + | $(FC) $(FCFLAGS) -o bufrdump |
| </ | </ | ||
| - | + | <code fortran | |
| - | bufrdump.F: | + | C (C) Copyright 2010-2016 MET Norway |
| - | <file> | + | |
| - | C (C) Copyright 2010, met.no | + | |
| 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 27: | Line 25: | ||
| - | C Extract BUFR messages from bufr file(s) | + | C Extract BUFR messages from bufr file(s) and print the data as |
| - | C bufrdump | + | C ' |
| - | C usage_verbose for explanation of the options allowed. | + | C options allowed. |
| C | C | ||
| C Usage: bufrdump <bufr file> | C Usage: bufrdump <bufr file> | ||
| C [--help] | C [--help] | ||
| C [--filter <filter file>] | C [--filter <filter file>] | ||
| + | C [--obstype] < | ||
| + | C [--stop_on_error] | ||
| C [--rectangle x1 y1 x2 y2] | C [--rectangle x1 y1 x2 y2] | ||
| C or one or more of | C or one or more of | ||
| Line 49: | Line 49: | ||
| C export BUFR_TABLES=/ | C export BUFR_TABLES=/ | ||
| C | C | ||
| - | C Author: P.Sannes | + | C Author: P.Sannes, MET Norway |
| Line 56: | Line 56: | ||
| IMPLICIT NONE | IMPLICIT NONE | ||
| - | CHARACTER(LEN=80) bufr_file | + | CHARACTER(LEN=200) bufr_file |
| LOGICAL data_only | LOGICAL data_only | ||
| LOGICAL filter | LOGICAL filter | ||
| LOGICAL rectangle | LOGICAL rectangle | ||
| - | CHARACTER(LEN=80) filter_file | + | |
| - | CHARACTER(LEN=80) descriptor_file | + | |
| + | CHARACTER(LEN=200) filter_file | ||
| + | CHARACTER(LEN=200) descriptor_file ! File containing the descriptors requested for partial expansion | ||
| INTEGER verbose | INTEGER verbose | ||
| INTEGER nlibbufr_errors | INTEGER nlibbufr_errors | ||
| Line 82: | Line 84: | ||
| verbose = 1 | verbose = 1 | ||
| - | CALL get_arguments(bufr_file, | + | CALL get_arguments(bufr_file, |
| + | | ||
| IF (filter) CALL read_filter(filter, | IF (filter) CALL read_filter(filter, | ||
| Line 104: | Line 107: | ||
| ! but copy how it is done in decode_bufr in libbufr | ! but copy how it is done in decode_bufr in libbufr | ||
| CALL BUFRdecode(ibuff, | CALL BUFRdecode(ibuff, | ||
| - | | + | |
| END DO | END DO | ||
| | | ||
| Line 147: | Line 150: | ||
| SUBROUTINE BUFRdecode(ibuff, | SUBROUTINE BUFRdecode(ibuff, | ||
| - | | + | |
| IMPLICIT NONE | IMPLICIT NONE | ||
| INTEGER ibuff(*) | INTEGER ibuff(*) | ||
| Line 153: | Line 156: | ||
| LOGICAL filter | LOGICAL filter | ||
| LOGICAL rectangle | LOGICAL rectangle | ||
| + | LOGICAL stop_on_error | ||
| + | CHARACTER(LEN=*) obstype | ||
| INTEGER nlibbufr_errors | INTEGER nlibbufr_errors | ||
| 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 203: | 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 212: | Line 219: | ||
| CALL BUSRQ(kreq, | CALL BUSRQ(kreq, | ||
| IF (kerr.NE.0) THEN | IF (kerr.NE.0) THEN | ||
| + | IF (stop_on_error) STOP 1 | ||
| | | ||
| | | ||
| Line 220: | 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 | ||
| + | IF (stop_on_error) STOP 1 | ||
| | | ||
| | | ||
| Line 231: | 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 238: | Line 249: | ||
| IF (kerr.EQ.45) RETURN | IF (kerr.EQ.45) RETURN | ||
| IF (kerr.NE.0) THEN | IF (kerr.NE.0) THEN | ||
| + | IF (stop_on_error) STOP 1 | ||
| | | ||
| | | ||
| Line 245: | Line 257: | ||
| | | ||
| - | C | + | C |
| - | C | + | C 0 = Surface data - land, 1 = Surface data - sea, 2 = Vertical |
| - | C | + | C sounding |
| - | IF (ksec1(6).GT.2) RETURN | + | C |
| + | IF (ksec1(6).GT.2 | ||
| + | | ||
| + | |||
| + | 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 259: | Line 279: | ||
| CALL BUSEL(ktdlen, | CALL BUSEL(ktdlen, | ||
| IF (kerr .GT. 0) THEN | IF (kerr .GT. 0) THEN | ||
| + | IF (stop_on_error) STOP 1 | ||
| WRITE(*,*) 'ERROR IN BUSEL: KERR= ',kerr | WRITE(*,*) 'ERROR IN BUSEL: KERR= ',kerr | ||
| nlibbufr_errors = nlibbufr_errors + 1 | nlibbufr_errors = nlibbufr_errors + 1 | ||
| Line 275: | Line 296: | ||
| | | ||
| IF (kerr.NE.0) THEN | IF (kerr.NE.0) THEN | ||
| + | IF (stop_on_error) STOP 1 | ||
| | | ||
| | | ||
| Line 280: | Line 302: | ||
| END IF | END IF | ||
| - | IF (ksec1(6).LE.1) THEN | + | IF (obstype.EQ.' |
| CALL print_surface_values(ksub, | CALL print_surface_values(ksub, | ||
| + | | ||
| + | ELSE IF (obstype(1: | ||
| + | CALL print_sounding_values(ksub, | ||
| + | | ||
| + | ELSE IF (obstype.EQ.' | ||
| + | CALL print_amdar_values(ksub, | ||
| | | ||
| + | ELSE IF (obstype.EQ.' | ||
| + | CALL print_oceanographic_values(ksub, | ||
| + | | ||
| + | ELSE IF (ksec1(6).LE.1) THEN | ||
| + | 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, | ||
| + | | ||
| + | ELSE IF (ksec1(6).EQ.4) THEN | ||
| + | CALL print_amdar_values(ksub, | ||
| | | ||
| + | ELSE IF (ksec1(6).EQ.6) THEN | ||
| + | CALL print_radar_profiler_values(ksub, | ||
| + | | ||
| + | ELSE IF (ksec1(6).EQ.31) THEN | ||
| + | CALL print_oceanographic_values(ksub, | ||
| + | | ||
| END IF | END IF | ||
| ENDDO | ENDDO | ||
| Line 293: | Line 336: | ||
| | | ||
| IF (kerr.NE.0) THEN | IF (kerr.NE.0) THEN | ||
| + | IF (stop_on_error) STOP 1 | ||
| | | ||
| | | ||
| Line 298: | Line 342: | ||
| END IF | END IF | ||
| - | IF (ksec1(6).LE.1) THEN | + | IF (obstype.EQ.' |
| CALL print_surface_values(ksub, | CALL print_surface_values(ksub, | ||
| + | | ||
| + | ELSE IF (obstype(1: | ||
| + | CALL print_sounding_values(ksub, | ||
| + | | ||
| + | ELSE IF (obstype.EQ.' | ||
| + | CALL print_amdar_values(ksub, | ||
| | | ||
| + | ELSE IF (obstype.EQ.' | ||
| + | CALL print_oceanographic_values(ksub, | ||
| + | | ||
| + | ELSE IF (ksec1(6).LE.1) THEN | ||
| + | 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, | ||
| + | | ||
| + | ELSE IF (ksec1(6).EQ.4) THEN | ||
| + | CALL print_amdar_values(ksub, | ||
| | | ||
| + | ELSE IF (ksec1(6).EQ.6) THEN | ||
| + | CALL print_radar_profiler_values(ksub, | ||
| + | | ||
| + | ELSE IF (ksec1(6).EQ.31) THEN | ||
| + | C For ocea files at met.no data category is 31. But note that IOB | ||
| + | C | ||
| + | C so for these we end up calling print_surface_values (unless | ||
| + | C | ||
| + | CALL print_oceanographic_values(ksub, | ||
| + | | ||
| END IF | END IF | ||
| END DO | END DO | ||
| Line 313: | Line 382: | ||
| SUBROUTINE get_arguments(bufr_file, | SUBROUTINE get_arguments(bufr_file, | ||
| - | | + | |
| IMPLICIT NONE | IMPLICIT NONE | ||
| Line 321: | Line 390: | ||
| LOGICAL filter | LOGICAL filter | ||
| LOGICAL rectangle | LOGICAL rectangle | ||
| + | LOGICAL stop_on_error | ||
| CHARACTER(LEN=*) filter_file ! File containing the filter criteria | CHARACTER(LEN=*) filter_file ! File containing the filter criteria | ||
| + | CHARACTER(LEN=*) obstype | ||
| - | CHARACTER(LEN=80) argument ! Buffer for next argument | + | CHARACTER(LEN=200) argument ! Buffer for next argument |
| - | CHARACTER(LEN=850) Usage | + | CHARACTER(LEN=1350) Usage |
| - | CHARACTER(LEN=800) Help | + | CHARACTER(LEN=950) Help |
| INTEGER iargc,iarg | INTEGER iargc,iarg | ||
| Line 345: | Line 416: | ||
| | | ||
| | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| | | ||
| | | ||
| Line 376: | Line 457: | ||
| | | ||
| | | ||
| - | | + | |
| | | ||
| + | | ||
| + | | ||
| | | ||
| | | ||
| | | ||
| - | | + | |
| + | | ||
| + | | ||
| + | | ||
| C | C | ||
| filter = .FALSE. | filter = .FALSE. | ||
| + | obstype = '' | ||
| rectangle = .FALSE. | rectangle = .FALSE. | ||
| + | stop_on_error = .FALSE. | ||
| bufr_file = '' | bufr_file = '' | ||
| iarg = 0 | iarg = 0 | ||
| Line 408: | Line 496: | ||
| iarg = iarg + 1 | iarg = iarg + 1 | ||
| CALL getarg(iarg, | CALL getarg(iarg, | ||
| + | ELSE IF (argument .EQ. ' | ||
| + | | ||
| + | iarg = iarg + 1 | ||
| + | CALL getarg(iarg, | ||
| + | ELSE IF (argument .EQ. ' | ||
| + | | ||
| ELSE IF (argument .EQ. ' | ELSE IF (argument .EQ. ' | ||
| | | ||
| Line 456: | Line 550: | ||
| IF (bufr_file .EQ. '' | IF (bufr_file .EQ. '' | ||
| | | ||
| + | CALL EXIT(1) | ||
| + | END IF | ||
| + | |||
| + | IF (obstype.NE.'' | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| CALL EXIT(1) | CALL EXIT(1) | ||
| END IF | END IF | ||
| Line 465: | Line 567: | ||
| SUBROUTINE err_msg(msg) | SUBROUTINE err_msg(msg) | ||
| IMPLICIT NONE | IMPLICIT NONE | ||
| - | CHARACTER*80 msg | + | CHARACTER(LEN=*) msg |
| WRITE(*,*) msg | WRITE(*,*) msg | ||
| STOP | STOP | ||
| Line 474: | Line 576: | ||
| SUBROUTINE err_msg1(msg, | SUBROUTINE err_msg1(msg, | ||
| IMPLICIT NONE | IMPLICIT NONE | ||
| - | CHARACTER*80 msg | + | CHARACTER(LEN=*) msg |
| INTEGER kerr | INTEGER kerr | ||
| WRITE(*,*) msg,kerr | WRITE(*,*) msg,kerr | ||
| Line 493: | Line 595: | ||
| LOGICAL filter | LOGICAL filter | ||
| ! if no filter condition is found in filter file | ! if no filter condition is found in filter file | ||
| - | CHARACTER(LEN=80) filter_file | + | CHARACTER(LEN=200) filter_file |
| INTEGER verbose, | INTEGER verbose, | ||
| CHARACTER*100 inpline, | CHARACTER*100 inpline, | ||
| Line 515: | Line 617: | ||
| | | ||
| IF (inplen.EQ.0) EXIT filter_loop | IF (inplen.EQ.0) EXIT filter_loop | ||
| - | C Allow comment line | ||
| - | IF (inpline(1: | ||
| i1 = 0 | i1 = 0 | ||
| i2 = 0 | i2 = 0 | ||
| CALL advance_word(inpline, | CALL advance_word(inpline, | ||
| IF (i1 .EQ. 0) EXIT filter_loop | IF (i1 .EQ. 0) EXIT filter_loop | ||
| - | IF (inpline(1:2).EQ.' | + | IF (inpline(i1:i1).EQ.'#' |
| + | |||
| + | IF (inpline(i1: | ||
| C | C | ||
| ifid = ifid + 1 | ifid = ifid + 1 | ||
| Line 576: | Line 678: | ||
| CLOSE(11) | CLOSE(11) | ||
| + | IF (verbose.GT.2) WRITE(*,*) ' | ||
| IF (nfivlines.EQ.0) filter = .FALSE. | IF (nfivlines.EQ.0) filter = .FALSE. | ||
| Line 648: | Line 751: | ||
| num_found = 0 | num_found = 0 | ||
| - | ifiv = 0 | ||
| C loop through all subsets: | C loop through all subsets: | ||
| DO nsub = 1, | DO nsub = 1, | ||
| C loop through all different conditions: | C loop through all different conditions: | ||
| + | ifiv = 0 | ||
| DO i1 = 1,nfidlines | DO i1 = 1,nfidlines | ||
| - | C loop through all filter | + | C loop through all filter |
| DO ifvl = 1, | DO ifvl = 1, | ||
| ifiv = ifiv + 1 | ifiv = ifiv + 1 | ||
| Line 672: | Line 775: | ||
| IF (values(iv).EQ.rvind) | IF (values(iv).EQ.rvind) | ||
| | | ||
| - | ! other filter | + | ! other filter |
| IF (int_fid) THEN | IF (int_fid) THEN | ||
| IF (nint(values(iv)).EQ.fivI(ifiv, | IF (nint(values(iv)).EQ.fivI(ifiv, | ||
| Line 686: | Line 789: | ||
| END IF | END IF | ||
| END IF | END IF | ||
| - | END DO ! all data in subset | + | END DO |
| IF (.NOT.match) ! there is one descriptor in condition which | IF (.NOT.match) ! there is one descriptor in condition which | ||
| - | | + | |
| - | END DO | + | |
| + | END DO ! all descriptors in condition | ||
| IF (match) THEN | IF (match) THEN | ||
| | | ||
| | | ||
| GO TO 500 ! next subset | GO TO 500 ! next subset | ||
| - | END IF | + | |
| - | | + | END DO ! all filter |
| - | END DO ! all filter | + | |
| | | ||
| END DO ! all different conditions | END DO ! all different conditions | ||
| Line 707: | Line 810: | ||
| C | C | ||
| - | C | + | C |
| - | C 7002 HEIGHT OR ALTITUDE | + | C ALTITUDE |
| - | C 7004 PRESSURE (10004 was used for pressure). Not able to handle | + | C used as vertical coordinate instead of 7004 PRESSURE (10004 was |
| - | C that in present code. | + | C used for pressure |
| + | C | ||
| SUBROUTINE print_sounding_values(ksub, | SUBROUTINE print_sounding_values(ksub, | ||
| - | | + | |
| IMPLICIT NONE | IMPLICIT NONE | ||
| Line 722: | Line 826: | ||
| CHARACTER*80 cvals(*) | CHARACTER*80 cvals(*) | ||
| LOGICAL rectangle | LOGICAL rectangle | ||
| + | CHARACTER(LEN=*) obstype | ||
| INTEGER verbose | INTEGER verbose | ||
| Line 728: | Line 833: | ||
| REAL*8 II, | REAL*8 II, | ||
| - | | + | |
| + | CHARACTER*5 wigos_issuer, | ||
| CHARACTER*9 call_sign, | CHARACTER*9 call_sign, | ||
| + | CHARACTER*8 flight_number, | ||
| + | CHARACTER*16 wigos_localid, | ||
| + | |||
| CHARACTER one_bits | CHARACTER one_bits | ||
| REAL*8 value | REAL*8 value | ||
| - | INTEGER idx, | + | INTEGER idx, |
| - | PARAMETER(maxlevel=1000) | + | PARAMETER(maxlevel=100000) |
| REAL*8 P(maxlevel), | REAL*8 P(maxlevel), | ||
| | | ||
| | | ||
| - | | + | |
| CHARACTER*8 vss(maxlevel) ! Vertical sounding significance | CHARACTER*8 vss(maxlevel) ! Vertical sounding significance | ||
| + | CHARACTER*8 vss_missing | ||
| + | LOGICAL reduce ! Set to TRUE if we should skip levels with | ||
| + | ! vertical sounding significance missing or equal | ||
| + | ! to 0 | ||
| C | C | ||
| REAL*8 x1,y1,x2,y2 | REAL*8 x1,y1,x2,y2 | ||
| COMMON / | COMMON / | ||
| + | |||
| + | C | ||
| + | INTEGER lenstr | ||
| + | CHARACTER*9 ctrim ! length must be >= longest variable ctrim is used for | ||
| + | |||
| + | IF (obstype.EQ.' | ||
| + | | ||
| + | ELSE | ||
| + | | ||
| + | END IF | ||
| one_bits = CHAR(255) | one_bits = CHAR(255) | ||
| - | WRITE(missing9,'(9A)') one_bits, | + | WRITE(missing5,'(5A)') one_bits, |
| - | | + | |
| + | WRITE(missing8,' | ||
| + | | ||
| + | missing9 = missing8 // one_bits | ||
| + | missing16 = missing8 // missing8 | ||
| + | vss_missing = ' | ||
| C | C | ||
| call_sign = missing9 | call_sign = missing9 | ||
| + | flight_number = missing8 | ||
| + | wigos_issuer = missing5 | ||
| + | wigos_issueno = missing5 | ||
| + | wigos_localid = missing16 | ||
| + | wigos_series = rvind | ||
| II = rvind | II = rvind | ||
| iii= rvind | iii= rvind | ||
| Line 771: | Line 904: | ||
| lo(n) = rvind | lo(n) = rvind | ||
| tp(n) = rvind | tp(n) = rvind | ||
| - | | + | |
| | | ||
| | | ||
| Line 781: | Line 914: | ||
| desc = ktdexp(idx) | desc = ktdexp(idx) | ||
| value = values(idx + (ksub-1)*kxelem) | value = values(idx + (ksub-1)*kxelem) | ||
| + | |||
| + | C | ||
| + | C | ||
| + | IF (ABS(value - rvind)/ | ||
| + | CYCLE | ||
| + | END IF | ||
| + | |||
| IF (desc.EQ.1001) THEN ! WMO block number | IF (desc.EQ.1001) THEN ! WMO block number | ||
| II = value | II = value | ||
| ELSE IF (desc.EQ.1002) THEN ! WMO station number | ELSE IF (desc.EQ.1002) THEN ! WMO station number | ||
| iii = value | iii = value | ||
| - | ELSE IF (desc.EQ.1011) THEN | + | ELSE IF (desc.EQ.1011.OR. ! Ship or mobile land station identifier |
| - | IF (value.NE.rvind) THEN | + | + desc.EQ.1195) THEN ! Mobil land station identifier |
| cidx = int(value/ | cidx = int(value/ | ||
| | | ||
| - | END IF | + | |
| + | | ||
| + | cidx = int(value/ | ||
| + | flight_number = cvals(cidx) ! CCITTIA5 data | ||
| + | flight_number = ctrim(flight_number, | ||
| + | ELSE IF (desc.EQ.1125) THEN ! WIGOS identifier series | ||
| + | wigos_series = value | ||
| + | ELSE IF (desc.EQ.1126) THEN ! WIGOS issuer of identifier | ||
| + | i = NINT(value) | ||
| + | WRITE(wigos_issuer,' | ||
| + | wigos_issuer = ADJUSTL(wigos_issuer) | ||
| + | ELSE IF (desc.EQ.1127) THEN ! WIGOS issue number | ||
| + | i = NINT(value) | ||
| + | WRITE(wigos_issueno,' | ||
| + | wigos_issueno = ADJUSTL(wigos_issueno) | ||
| + | ELSE IF (desc.EQ.1128) THEN ! WIGOS local identifier | ||
| + | cidx = int(value/ | ||
| + | wigos_localid = cvals(cidx) ! CCITTIA5 data | ||
| + | wigos_localid = ctrim(wigos_localid, | ||
| ELSE IF (desc.EQ.2001) THEN ! Type of station | ELSE IF (desc.EQ.2001) THEN ! Type of station | ||
| ix = value | ix = value | ||
| Line 802: | Line 960: | ||
| ELSE IF (desc.EQ.4005) THEN ! Minute | ELSE IF (desc.EQ.4005) THEN ! Minute | ||
| minute = value | minute = value | ||
| - | ELSE IF (desc.EQ.5001) THEN ! Latitude (high accuracy) | + | C Seen 5002 and 6002 used for each level in high resolution data |
| + | ELSE IF (desc.EQ.5001 | ||
| latitude = value | latitude = value | ||
| - | ELSE IF (desc.EQ.5002) THEN ! Latitude (coarse accuracy) | + | ELSE IF (desc.EQ.5002 |
| latitude = value | latitude = value | ||
| - | ELSE IF (desc.EQ.6001) THEN ! Longitude (high accuracy) | + | ELSE IF (desc.EQ.6001 |
| longitude = value | longitude = value | ||
| - | ELSE IF (desc.EQ.6002) THEN ! Longitude (coarse accuracy) | + | ELSE IF (desc.EQ.6002 |
| longitude = value | longitude = value | ||
| - | ELSE IF (desc.EQ.7001) THEN ! Height of station | + | ELSE IF (desc.EQ.7001.OR. ! Height of station |
| - | height = value | + | |
| + | | ||
| + | | ||
| + | | ||
| + | height = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.4086.AND.n.LT.maxlevel) THEN ! Long time period or displacement [second] | ||
| + | C In WMO template (309052) descriptors 004086 and 008042 comes BEFORE 7004 pressure | ||
| + | tp(n+1) = value | ||
| + | ELSE IF (desc.EQ.8042.AND.n.LT.maxlevel) THEN ! Extended vertical sounding significance | ||
| + | CALL vss_8042(NINT(value), | ||
| ELSE IF (desc.EQ.7004) THEN ! Pressure | ELSE IF (desc.EQ.7004) THEN ! Pressure | ||
| n = n + 1 ! new level | n = n + 1 ! new level | ||
| IF (n.GT.maxlevel) THEN | IF (n.GT.maxlevel) THEN | ||
| + | n = maxlevel | ||
| | | ||
| GOTO 110 | GOTO 110 | ||
| END IF | END IF | ||
| P(n) = value | P(n) = value | ||
| - | ELSE IF (desc.EQ.11001) THEN ! Wind direction | + | C All following descriptors come after pressure in 309052 (or Hirlam template) |
| - | D(n) = value | + | ELSE IF (n.GT.0 .AND. n.LE.maxlevel) THEN |
| - | | + | |
| - | F(n) = value | + | |
| - | | + | ELSE IF (desc.EQ.11002) THEN ! Wind speed |
| - | T(n) = value | + | |
| - | | + | ELSE IF (desc.EQ.12101) THEN ! Temperature/ |
| - | T(n) = value | + | |
| - | | + | ELSE IF (desc.EQ.12001) THEN ! Temperature/ |
| - | TD(n) = value | + | |
| - | | + | ELSE IF (desc.EQ.12103) THEN ! Dew-point temperature (16 bits) |
| - | TD(n) = value | + | |
| - | | + | ELSE IF (desc.EQ.12003) THEN ! Dew-point temperature (12 bits) |
| - | h(n) = value/ | + | |
| - | | + | ELSE IF (desc.EQ.10003.AND.value.NE.rvind) THEN ! Geopotential |
| - | h(n) = value | + | |
| - | | + | ELSE IF (desc.EQ.10009) THEN ! Geopotential height |
| - | la(n) = value | + | |
| - | | + | ELSE IF (desc.EQ.5015) THEN ! Latitude displacement |
| - | lo(n) = value | + | |
| - | ELSE IF (desc.EQ.4086) THEN ! Long time period or displacement [second] | + | ELSE IF (desc.EQ.6015) THEN ! Longitude displacement |
| - | C In WMO templates 004086 comes before 7004 pressure | + | |
| - | | + | ELSE IF (desc.EQ.8001 .AND. value.NE.rvind) THEN ! Vertical sounding significance |
| - | ELSE IF (desc.EQ.8001 .AND. value.NE.rvind) THEN ! Vertical sounding significance | + | C In HIRLAM |
| - | C In HIRLAM | + | |
| - | CALL vss_8001(NINT(value), | + | ELSE IF (desc.EQ.11061) THEN ! Absolute wind shear in 1 km layer below |
| - | ELSE IF (desc.EQ.8042 .AND. value.NE.rvind) THEN ! Extended vertical sounding significance | + | |
| - | C In WMO templates 008042 comes BEFORE 7004 pressure | + | ELSE IF (desc.EQ.11062) THEN ! Absolute wind shear in 1 km layer above |
| - | | + | |
| - | ELSE IF (desc.EQ.11061) THEN ! Absolute wind shear in 1 km layer below | + | END IF |
| - | wsb(n) = value | + | |
| - | | + | |
| - | wsa(n) = value | + | |
| END IF | END IF | ||
| END DO | END DO | ||
| Line 863: | Line 1030: | ||
| END IF | END IF | ||
| - | WRITE(*,*) | + | |
| IF (II.NE.rvind .AND. iii.NE.rvind) THEN | IF (II.NE.rvind .AND. iii.NE.rvind) THEN | ||
| + | | ||
| | | ||
| + | ELSE IF (wigos_series.NE.rvind .AND. wigos_issuer.NE.missing5 | ||
| + | | ||
| + | | ||
| + | ind = index(wigos_issuer,' | ||
| + | IF (ind.EQ.-1) ind = 5 | ||
| + | ind2 = index(wigos_issueno,' | ||
| + | IF (ind2.EQ.-1) ind2 = 5 | ||
| + | ind3 = index(wigos_localid,' | ||
| + | IF (ind3.EQ.-1) ind3 = 16 | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| ELSE IF (call_sign.NE.missing9) THEN | ELSE IF (call_sign.NE.missing9) THEN | ||
| - | | + | WRITE(*, |
| - | | + | WRITE(*,' |
| + | ELSE IF (flight_number.NE.missing8) THEN | ||
| + | | ||
| + | | ||
| + | | ||
| ELSE | ELSE | ||
| IF (verbose .GT. 1) THEN | IF (verbose .GT. 1) THEN | ||
| - | WRITE(*,*) 'Both wmonr and call sign are missing!!!' | + | |
| + | | ||
| + | | ||
| END IF | END IF | ||
| | | ||
| Line 887: | Line 1076: | ||
| END IF | END IF | ||
| ENDIF | ENDIF | ||
| - | IF (NINT(ix).EQ.0) THEN | + | |
| - | | + | IF (NINT(ix).EQ.0) THEN |
| - | ELSE IF (NINT(ix).EQ.1) THEN | + | WRITE(*,' |
| - | | + | |
| - | ELSE IF (NINT(ix).EQ.2) THEN | + | WRITE(*,' |
| - | | + | |
| + | WRITE(*,' | ||
| + | END IF | ||
| END IF | END IF | ||
| IF (latitude.NE.rvind) THEN | IF (latitude.NE.rvind) THEN | ||
| Line 905: | Line 1096: | ||
| DO n=1, | DO n=1, | ||
| + | IF (reduce .AND. vss(n).EQ.vss_missing) CYCLE | ||
| | | ||
| C The following 3 parameters are not found in TAC TEMP | C The following 3 parameters are not found in TAC TEMP | ||
| Line 945: | Line 1137: | ||
| END SUBROUTINE print_sounding_values | END SUBROUTINE print_sounding_values | ||
| + | |||
| + | C | ||
| + | |||
| + | C | ||
| + | C | ||
| + | SUBROUTINE print_radar_profiler_values(ksub, | ||
| + | | ||
| + | IMPLICIT NONE | ||
| + | |||
| + | INTEGER ksub ! Input: number of subset currently processed | ||
| + | INTEGER kxelem | ||
| + | INTEGER ktdexl | ||
| + | INTEGER ktdexp(*) | ||
| + | REAL*8 values(*) | ||
| + | CHARACTER*80 cvals(*) | ||
| + | LOGICAL rectangle | ||
| + | INTEGER verbose | ||
| + | |||
| + | REAL*8 rvind ! missing value for real*8 data | ||
| + | PARAMETER (rvind=1.7E38) | ||
| + | |||
| + | REAL*8 II, | ||
| + | | ||
| + | CHARACTER*9 call_sign, | ||
| + | CHARACTER one_bits | ||
| + | REAL*8 value | ||
| + | INTEGER idx, | ||
| + | PARAMETER(maxlevel=1000) | ||
| + | |||
| + | REAL*8 HH(maxlevel), | ||
| + | | ||
| + | |||
| + | C | ||
| + | REAL*8 x1,y1,x2,y2 | ||
| + | COMMON / | ||
| + | |||
| + | C | ||
| + | INTEGER lenstr | ||
| + | CHARACTER*9 ctrim ! length must be >= longest variable ctrim is used for | ||
| + | |||
| + | one_bits = CHAR(255) | ||
| + | WRITE(missing9,' | ||
| + | | ||
| + | |||
| + | C | ||
| + | call_sign = missing9 | ||
| + | II = rvind | ||
| + | iii= rvind | ||
| + | year = rvind | ||
| + | month = rvind | ||
| + | day = rvind | ||
| + | hour = rvind | ||
| + | minute = rvind | ||
| + | latitude = rvind | ||
| + | longitude = rvind | ||
| + | height = rvind | ||
| + | DO n=1, | ||
| + | HH(n) = rvind | ||
| + | D(n) = rvind | ||
| + | F(n) = rvind | ||
| + | Q1(n) = rvind | ||
| + | WC(n) = rvind | ||
| + | Q2(n) = rvind | ||
| + | END DO | ||
| + | |||
| + | C Loop through all expanded descriptors | ||
| + | n = 0 ! Numbering the pressure levels | ||
| + | DO idx=1, | ||
| + | desc = ktdexp(idx) | ||
| + | value = values(idx + (ksub-1)*kxelem) | ||
| + | |||
| + | C | ||
| + | C | ||
| + | IF (ABS(value - rvind)/ | ||
| + | CYCLE | ||
| + | END IF | ||
| + | |||
| + | IF (desc.EQ.1001) THEN ! WMO block number | ||
| + | II = value | ||
| + | ELSE IF (desc.EQ.1002) THEN ! WMO station number | ||
| + | iii = value | ||
| + | ELSE IF (desc.EQ.1011.OR. | ||
| + | | ||
| + | cidx = int(value/ | ||
| + | | ||
| + | | ||
| + | ELSE IF (desc.EQ.2001) THEN ! Type of station | ||
| + | ix = value | ||
| + | ELSE IF (desc.EQ.4001) THEN ! Year | ||
| + | year = value | ||
| + | ELSE IF (desc.EQ.4002) THEN ! Month | ||
| + | month = value | ||
| + | ELSE IF (desc.EQ.4003) THEN ! Day | ||
| + | day = value | ||
| + | ELSE IF (desc.EQ.4004) THEN ! Hour | ||
| + | hour = value | ||
| + | ELSE IF (desc.EQ.4005) THEN ! Minute | ||
| + | minute = value | ||
| + | C Seen 5002 and 6002 used for each level in high resolution data | ||
| + | ELSE IF (desc.EQ.5001 .AND. latitude.EQ.rvind) THEN ! Latitude (high accuracy) | ||
| + | latitude = value | ||
| + | ELSE IF (desc.EQ.5002 .AND. latitude.EQ.rvind) THEN ! Latitude (coarse accuracy) | ||
| + | latitude = value | ||
| + | ELSE IF (desc.EQ.6001 .AND. longitude.EQ.rvind) THEN ! Longitude (high accuracy) | ||
| + | longitude = value | ||
| + | ELSE IF (desc.EQ.6002 .AND. longitude.EQ.rvind) THEN ! Longitude (coarse accuracy) | ||
| + | longitude = value | ||
| + | ELSE IF (desc.EQ.7001) THEN ! Height of station | ||
| + | IF (height.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.7007) THEN ! Height | ||
| + | n = n + 1 ! new level | ||
| + | IF (n.GT.maxlevel) THEN | ||
| + | n = maxlevel | ||
| + | | ||
| + | GOTO 110 | ||
| + | END IF | ||
| + | HH(n) = value | ||
| + | C All following descriptors come after 7007 height | ||
| + | ELSE IF (n.GT.0 .AND. n.LE.maxlevel) THEN | ||
| + | IF (desc.EQ.11001) THEN ! Wind direction | ||
| + | D(n) = value | ||
| + | ELSE IF (desc.EQ.11002) THEN ! Wind speed | ||
| + | F(n) = value | ||
| + | ELSE IF (desc.EQ.11006) THEN ! W-component | ||
| + | WC(n) = value | ||
| + | ELSE IF (desc.EQ.33002) THEN ! Quality information, | ||
| + | IF (ktdexp(idx-1).EQ.11002) THEN | ||
| + | Q1(n) = value | ||
| + | ELSE | ||
| + | Q2(n) = value | ||
| + | END IF | ||
| + | END IF | ||
| + | END IF | ||
| + | END DO | ||
| + | | ||
| + | numlevels = n | ||
| + | |||
| + | IF (rectangle) THEN | ||
| + | IF (longitude.EQ.rvind .OR. latitude.EQ.rvind | ||
| + | | ||
| + | | ||
| + | END IF | ||
| + | |||
| + | IF (II.NE.rvind .AND. iii.NE.rvind) THEN | ||
| + | | ||
| + | | ||
| + | ELSE IF (call_sign.NE.missing9) THEN | ||
| + | | ||
| + | | ||
| + | ELSE | ||
| + | IF (verbose .GT. 1) THEN | ||
| + | WRITE(*,*) | ||
| + | WRITE(*,*) 'Both wmonr and call sign are missing!!!' | ||
| + | END IF | ||
| + | | ||
| + | END IF | ||
| + | |||
| + | IF (year.NE.rvind.AND.month.NE.rvind.AND.day.NE.rvind | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | ELSE | ||
| + | IF (verbose .GT. 1) THEN | ||
| + | WRITE(*,*) ' | ||
| + | RETURN | ||
| + | END IF | ||
| + | ENDIF | ||
| + | IF (ix.NE.rvind) THEN | ||
| + | IF (NINT(ix).EQ.0) THEN | ||
| + | WRITE(*,' | ||
| + | ELSE IF (NINT(ix).EQ.1) THEN | ||
| + | WRITE(*,' | ||
| + | ELSE IF (NINT(ix).EQ.2) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | END IF | ||
| + | IF (latitude.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (longitude.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (height.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | |||
| + | DO n=1, | ||
| + | | ||
| + | IF (HH(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | IF (D(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | IF (F(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | IF (Q1(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | IF (WC(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | IF (Q2(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | END DO | ||
| + | |||
| + | END SUBROUTINE print_radar_profiler_values | ||
| C | C | ||
| SUBROUTINE print_surface_values(ksub, | SUBROUTINE print_surface_values(ksub, | ||
| - | | + | |
| C | C | ||
| IMPLICIT NONE | IMPLICIT NONE | ||
| Line 960: | 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 965: | Line 1370: | ||
| PARAMETER (rvind=1.7E38) | PARAMETER (rvind=1.7E38) | ||
| - | CHARACTER*8 icao_id, | + | |
| - | CHARACTER*9 call_sign, | + | |
| - | CHARACTER*20 name, | + | CHARACTER*9 call_sign, |
| + | CHARACTER*16 wigos_localid,missing16 | ||
| + | CHARACTER*20 name, | ||
| + | CHARACTER*32 long_name,missing32 | ||
| C | C | ||
| - | REAL*8 AA, | + | REAL*8 AA, |
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| + | | ||
| C Other parameters | C Other parameters | ||
| - | | + | |
| - | | + | |
| | | ||
| - | | + | |
| + | | ||
| REAL*8 vert_sign(4), | REAL*8 vert_sign(4), | ||
| 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 994: | Line 1407: | ||
| ! surface' | ! surface' | ||
| ! from 0 | ! from 0 | ||
| + | LOGICAL time_of_last_position ! Set to true if 008021 time significance is | ||
| + | ! included with value 26 | ||
| CHARACTER one_bits | CHARACTER one_bits | ||
| REAL*8 value | REAL*8 value | ||
| - | INTEGER desc, | + | INTEGER desc, |
| - | INTEGER degree2dir, | + | INTEGER degree2dir, |
| C | C | ||
| Line 1003: | Line 1418: | ||
| REAL*8 x1,y1,x2,y2 | REAL*8 x1,y1,x2,y2 | ||
| COMMON / | COMMON / | ||
| + | |||
| + | C | ||
| + | CHARACTER*32 ctrim ! length must be >= longest variable ctrim is used for | ||
| + | INTEGER lenstr | ||
| one_bits = CHAR(255) | one_bits = CHAR(255) | ||
| + | WRITE(missing5,' | ||
| + | | ||
| WRITE(missing8,' | WRITE(missing8,' | ||
| | | ||
| missing9 = missing8 // one_bits | missing9 = missing8 // one_bits | ||
| + | missing16 = missing8 // missing8 | ||
| missing20 = missing9 // missing9 // one_bits // one_bits | missing20 = missing9 // missing9 // one_bits // one_bits | ||
| - | | + | |
| - | spc9 = ' | + | |
| - | spc20 = ' | + | |
| cloud_type_count = 0 | cloud_type_count = 0 | ||
| Line 1017: | Line 1437: | ||
| num_cloud_layers = -1 | num_cloud_layers = -1 | ||
| surface_data = .TRUE. | surface_data = .TRUE. | ||
| + | time_of_last_position = .FALSE. | ||
| C | C | ||
| Line 1023: | Line 1444: | ||
| icao_id = missing8 | icao_id = missing8 | ||
| call_sign = missing9 | call_sign = missing9 | ||
| + | wigos_issuer = missing5 | ||
| + | wigos_issueno = missing5 | ||
| + | wigos_localid = missing16 | ||
| name = missing20 | name = missing20 | ||
| + | long_name = missing32 | ||
| AA = rvind | AA = rvind | ||
| BI = rvind | BI = rvind | ||
| Line 1034: | Line 1459: | ||
| DG_010 = rvind | DG_010 = rvind | ||
| DG_1 = rvind | DG_1 = rvind | ||
| + | DG_X = rvind | ||
| DI = rvind | DI = rvind | ||
| - | ds = rvind | ||
| DW1 = rvind | DW1 = rvind | ||
| DW2 = rvind | DW2 = rvind | ||
| + | EE = rvind | ||
| ES = rvind | ES = rvind | ||
| - | E = rvind | ||
| - | EM = rvind | ||
| EV_1 = rvind | EV_1 = rvind | ||
| EV_24 = rvind | EV_24 = rvind | ||
| Line 1047: | Line 1471: | ||
| FG_010 = rvind | FG_010 = rvind | ||
| FG_1 = rvind | FG_1 = rvind | ||
| + | FG_X = rvind | ||
| FX = rvind | FX = rvind | ||
| + | FX_1 = rvind | ||
| + | FX_X = rvind | ||
| HL = rvind | HL = rvind | ||
| HW = rvind | HW = rvind | ||
| HW1 = rvind | HW1 = rvind | ||
| HW2 = rvind | HW2 = rvind | ||
| + | HWA = rvind | ||
| NH = rvind | NH = rvind | ||
| NN = rvind | NN = rvind | ||
| Line 1064: | Line 1492: | ||
| PW1 = rvind | PW1 = rvind | ||
| PW2 = rvind | PW2 = rvind | ||
| + | PWA = rvind | ||
| + | QD = rvind | ||
| + | QE = rvind | ||
| + | QK = rvind | ||
| + | QL = rvind | ||
| + | QO = rvind | ||
| + | QS = rvind | ||
| + | QD_24 = rvind | ||
| + | QE_24 = rvind | ||
| + | QK_24 = rvind | ||
| + | QL_24 = rvind | ||
| + | QO_24 = rvind | ||
| + | QS_24 = rvind | ||
| RR_1 = rvind | RR_1 = rvind | ||
| RR_3 = rvind | RR_3 = rvind | ||
| Line 1073: | Line 1514: | ||
| SG = rvind | SG = rvind | ||
| SI = rvind | SI = rvind | ||
| + | SS_24 = rvind | ||
| TA = rvind | TA = rvind | ||
| TAN_12 = rvind | TAN_12 = rvind | ||
| TAX_12 = rvind | TAX_12 = rvind | ||
| + | TAN = rvind | ||
| + | TAX = rvind | ||
| TD = rvind | TD = rvind | ||
| TGN_12 = rvind | TGN_12 = rvind | ||
| Line 1081: | Line 1525: | ||
| UU = rvind | UU = rvind | ||
| VV = rvind | VV = rvind | ||
| - | vs = rvind | ||
| W1 = rvind | W1 = rvind | ||
| W2 = rvind | W2 = rvind | ||
| Line 1095: | Line 1538: | ||
| longitude = rvind | longitude = rvind | ||
| height = rvind | height = rvind | ||
| + | hp = rvind | ||
| vert_sign_first = rvind | vert_sign_first = rvind | ||
| II = rvind | II = rvind | ||
| Line 1104: | Line 1548: | ||
| vs = rvind | vs = rvind | ||
| TbTbTb = rvind | TbTbTb = rvind | ||
| - | | + | |
| + | buoy_id7 | ||
| wmo_region_number = rvind | wmo_region_number = rvind | ||
| wmo_region_subarea = rvind | wmo_region_subarea = rvind | ||
| + | state_id = rvind | ||
| + | national_number = rvind | ||
| + | wigos_series = rvind | ||
| DO i=1,4 | DO i=1,4 | ||
| Line 1119: | Line 1567: | ||
| desc = ktdexp(idx) | desc = ktdexp(idx) | ||
| value = values(idx + (ksub-1)*kxelem) | value = values(idx + (ksub-1)*kxelem) | ||
| + | |||
| + | IF (ABS(value - rvind)/ | ||
| + | C | ||
| + | C | ||
| + | C | ||
| + | IF (desc.EQ.4024) THEN ! Time period or displacement [hour] | ||
| + | | ||
| + | ELSE IF (desc.EQ.4025) THEN ! Time period or displacement [minute] | ||
| + | | ||
| + | C | ||
| + | ELSE IF (desc.EQ.31001) THEN | ||
| + | IF (idx.GT.1 .AND. ktdexp(idx - 1).EQ.20012) THEN | ||
| + | WRITE(*,*) ' | ||
| + | | ||
| + | bad_cloud_data = .TRUE. | ||
| + | ELSE | ||
| + | WRITE(*,*) ' | ||
| + | | ||
| + | END IF | ||
| + | C Some counting needed for clouds even for missing values | ||
| + | ELSE IF (desc.EQ.20012 .AND. .NOT.bad_cloud_data) THEN ! Cloud type | ||
| + | | ||
| + | IF (cloud_type_count.GT.3) THEN | ||
| + | cloud_layer = cloud_type_count - 3 | ||
| + | END IF | ||
| + | END IF | ||
| + | CYCLE | ||
| + | END IF | ||
| + | |||
| + | C | ||
| + | C | ||
| + | C | ||
| + | C the first occurrence is the ' | ||
| + | C while the later occurrence(s) might for example be due to data | ||
| + | C | ||
| + | C a standard WMO template | ||
| IF (desc.EQ.4024) THEN ! Time period or displacement [hour] | IF (desc.EQ.4024) THEN ! Time period or displacement [hour] | ||
| hour_p = value | hour_p = value | ||
| ELSE IF (desc.EQ.4025) THEN ! Time period or displacement [minute] | ELSE IF (desc.EQ.4025) THEN ! Time period or displacement [minute] | ||
| minute_p = value | minute_p = value | ||
| - | ELSE IF (desc.EQ.1001) THEN ! WMO block number | + | ELSE IF (desc.EQ.8021) THEN ! Time significance |
| - | IF (value.NE.rvind .AND. II.EQ.rvind) THEN | + | IF (NINT(value).EQ.26) THEN |
| - | II = value | + | time_of_last_position |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.1002) THEN ! WMO station number | + | time_of_last_position |
| - | | + | |
| - | iii = value | + | |
| END IF | END IF | ||
| + | ELSE IF (desc.EQ.1001 .AND. II.EQ.rvind) THEN ! WMO block number | ||
| + | IF (value.GE.0 .AND. value.LT.100) II = value | ||
| + | ELSE IF (desc.EQ.1002 .AND. iii.EQ.rvind) THEN ! WMO station number | ||
| + | IF (value.GE.0 .AND. value.LT.1000) iii = value | ||
| + | ELSE IF (desc.EQ.1101 .AND. state_id.EQ.rvind) THEN ! WMO member state identifier | ||
| + | IF (value.GE.0 .AND. value.LT.1000) state_id = value | ||
| + | ELSE IF (desc.EQ.1102 .AND. national_number.EQ.rvind) THEN ! National station number | ||
| + | IF (value.GE.0) national_number = value | ||
| ELSE IF (desc.EQ.1015) THEN ! Station or site name | ELSE IF (desc.EQ.1015) THEN ! Station or site name | ||
| - | | + | |
| - | | + | name = cvals(cidx) |
| - | IF (cvals(cidx).NE.spc20) THEN | + | name = ctrim(name, |
| - | | + | ELSE IF (desc.EQ.1019) THEN ! Long station or site name |
| - | END IF | + | cidx = int(value/ |
| - | | + | |
| + | long_name = ctrim(long_name, | ||
| + | ELSE IF (desc.EQ.1125) THEN ! WIGOS identifier series | ||
| + | | ||
| + | ELSE IF (desc.EQ.1126) THEN ! WIGOS issuer of identifier | ||
| + | i = NINT(value) | ||
| + | WRITE(wigos_issuer,' | ||
| + | wigos_issuer = ADJUSTL(wigos_issuer) | ||
| + | ELSE IF (desc.EQ.1127) THEN ! WIGOS issue number | ||
| + | i = NINT(value) | ||
| + | WRITE(wigos_issueno,' | ||
| + | wigos_issueno = ADJUSTL(wigos_issueno) | ||
| + | ELSE IF (desc.EQ.1128) THEN ! WIGOS local identifier | ||
| + | cidx = int(value/ | ||
| + | wigos_localid | ||
| + | | ||
| ELSE IF (desc.EQ.2001) THEN ! Type of station | ELSE IF (desc.EQ.2001) THEN ! Type of station | ||
| - | IF (value.NE.rvind .AND. ix.EQ.rvind) THEN | + | IF (ix.EQ.rvind) THEN |
| ix = value | ix = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.4001) THEN ! Year | ELSE IF (desc.EQ.4001) THEN ! Year | ||
| - | IF (value.NE.rvind .AND. year.EQ.rvind) THEN | + | IF (year.EQ.rvind.AND..NOT.time_of_last_position) THEN |
| year = value | year = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.4002) THEN ! Month | ELSE IF (desc.EQ.4002) THEN ! Month | ||
| - | IF (value.NE.rvind .AND. month.EQ.rvind) THEN | + | IF (month.EQ.rvind.AND..NOT.time_of_last_position) THEN |
| month = value | month = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.4003) THEN ! Day | ELSE IF (desc.EQ.4003) THEN ! Day | ||
| - | IF (value.NE.rvind .AND. day.EQ.rvind) THEN | + | IF (day.EQ.rvind.AND..NOT.time_of_last_position) THEN |
| day = value | day = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.4004) THEN ! Hour | ELSE IF (desc.EQ.4004) THEN ! Hour | ||
| - | IF (value.NE.rvind .AND. hour.EQ.rvind) THEN | + | IF (hour.EQ.rvind.AND..NOT.time_of_last_position) THEN |
| hour = value | hour = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.4005) THEN ! Minute | ELSE IF (desc.EQ.4005) THEN ! Minute | ||
| - | IF (value.NE.rvind .AND. minute.EQ.rvind) THEN | + | IF (minute.EQ.rvind.AND..NOT.time_of_last_position) THEN |
| | | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.5001) THEN ! Latitude (high accuracy) | + | ELSE IF (desc.EQ.5001.OR. ! Latitude (high accuracy) |
| - | IF (value.NE.rvind .AND. latitude.EQ.rvind) THEN | + | |
| + | IF (latitude.EQ.rvind) THEN | ||
| | | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.5002) THEN ! Latitude | + | ELSE IF (desc.EQ.6001.OR. |
| - | IF (value.NE.rvind .AND. latitude.EQ.rvind) THEN | + | + desc.EQ.6002) THEN ! Longitude (coarse |
| - | | + | IF (longitude.EQ.rvind) THEN |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.6001) THEN ! Longitude (high accuracy) | + | |
| - | IF (value.NE.rvind .AND. longitude.EQ.rvind) THEN | + | |
| | | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.6002) THEN ! Longitude (coarse accuracy) | + | ELSE IF (desc.EQ.7001.OR. ! Height of station |
| - | IF (value.NE.rvind .AND. longitude.EQ.rvind) THEN | + | + desc.EQ.7030) THEN ! Height of station |
| - | longitude = value | + | IF (height.EQ.rvind) THEN |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.7001) THEN ! Height of station | + | |
| - | IF (value.NE.rvind .AND. height.EQ.rvind) THEN | + | |
| | | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.7030) THEN ! Height of station ground above mean sea level | + | ELSE IF (desc.EQ.7031) THEN ! Hp |
| - | IF (value.NE.rvind .AND. height.EQ.rvind) THEN | + | IF (hp.EQ.rvind) THEN |
| - | height | + | hp = value |
| END IF | END IF | ||
| ELSE IF (desc.EQ.10004) THEN ! Pressure | ELSE IF (desc.EQ.10004) THEN ! Pressure | ||
| - | IF (value.NE.rvind .AND. PO.EQ.rvind) THEN | + | IF (PO.EQ.rvind) THEN |
| PO = value | PO = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.10051) THEN ! Pressure reduced to mean sea level | ELSE IF (desc.EQ.10051) THEN ! Pressure reduced to mean sea level | ||
| - | IF (value.NE.rvind .AND. PR.EQ.rvind) THEN | + | IF (PR.EQ.rvind) THEN |
| PR = value | PR = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.10061) THEN ! 3-hour pressure change | ELSE IF (desc.EQ.10061) THEN ! 3-hour pressure change | ||
| - | IF (value.NE.rvind .AND. PP.EQ.rvind) THEN | + | IF (PP.EQ.rvind) THEN |
| PP = value | PP = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.10063) THEN ! Characteristic of pressure tendency | ELSE IF (desc.EQ.10063) THEN ! Characteristic of pressure tendency | ||
| - | IF (value.NE.rvind .AND. AA.EQ.rvind) THEN | + | IF (AA.EQ.rvind) THEN |
| AA = value | AA = value | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.11011) THEN ! Wind direction at 10 m | + | ELSE IF (desc.EQ.11011.OR. |
| - | IF (value.NE.rvind .AND. DD.EQ.rvind) THEN | + | |
| + | IF (DD.EQ.rvind) THEN | ||
| DD = value | DD = value | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.11001) THEN ! Wind direction | + | ELSE IF (desc.EQ.11012.OR. ! Wind speed at 10 m |
| - | IF (value.NE.rvind .AND. DD.EQ.rvind) THEN | + | + desc.EQ.11002) THEN ! Wind speed |
| - | DD = value | + | IF (FF.EQ.rvind) THEN |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.11012) THEN ! Wind speed at 10 m | + | |
| - | IF (value.NE.rvind .AND. FF.EQ.rvind) THEN | + | |
| - | FF = value | + | |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.11002) THEN ! Wind speed | + | |
| - | IF (value.NE.rvind .AND. FF.EQ.rvind) THEN | + | |
| FF = value | FF = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.11043) THEN ! Maximum wind gust direction | ELSE IF (desc.EQ.11043) THEN ! Maximum wind gust direction | ||
| - | | + | C DG is treated same way as FG |
| + | | ||
| mm = NINT(minute_p) | mm = NINT(minute_p) | ||
| - | IF ((NINT(hour).EQ.0 .OR. NINT(hour).EQ.6 | + | hh = NINT(hour) |
| - | + | + | IF (mm.EQ.-10) THEN |
| - | + .AND. mm.EQ.-360) | + | IF (DG_010.EQ.rvind) DG_010 = value |
| - | | + | ELSE IF (mm.GE.-70 .AND. mm.LE.-50) THEN |
| - | DG = value | + | IF (DG_1.EQ.rvind) DG_1 = value |
| - | ELSE IF (mm.EQ.-10) THEN | + | ELSE IF (mm.EQ.-360 |
| - | | + | |
| - | ELSE IF (mm.EQ.-60) THEN | + | ELSE IF (mm.EQ.-180 .AND. MOD(hh, |
| - | DG_1 = value | + | |
| + | | ||
| + | ELSE | ||
| + | C | ||
| + | | ||
| END IF | END IF | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.11041) THEN ! Maximum wind gust speed | ELSE IF (desc.EQ.11041) THEN ! Maximum wind gust speed | ||
| - | IF (value.NE.rvind .AND. minute_p.NE.rvind) THEN | + | IF (minute_p.NE.rvind .AND. hour.NE.rvind) THEN |
| mm = NINT(minute_p) | mm = NINT(minute_p) | ||
| - | IF ((NINT(hour).EQ.0 .OR. NINT(hour).EQ.6 | + | hh = NINT(hour) |
| - | + | + | IF (mm.EQ.-10) THEN |
| - | + | + | IF (FG_010.EQ.rvind) FG_010 = value |
| - | | + | ELSE IF (mm.GE.-70 .AND. mm.LE.-50) THEN |
| - | FG = value | + | IF (FG_1.EQ.rvind) FG_1 = value |
| - | ELSE IF (mm.EQ.-10) THEN | + | C For time periods > 1 hour, we choose to decode this as FG for |
| - | | + | C |
| - | ELSE IF (mm.EQ.-60) THEN | + | C |
| - | FG_1 = value | + | C gust since last synoptic termin (0,6,12,18) and it is unlikely to |
| + | C | ||
| + | ELSE IF (mm.EQ.-360 | ||
| + | | ||
| + | ELSE IF (mm.EQ.-180 .AND. MOD(hh, | ||
| + | | ||
| + | | ||
| + | ELSE | ||
| + | C All other periods are put in FG_X (arbitrary period) | ||
| + | | ||
| END IF | END IF | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.11042) THEN ! Maximum wind speed (10-min mean wind) | ELSE IF (desc.EQ.11042) THEN ! Maximum wind speed (10-min mean wind) | ||
| - | IF (value.NE.rvind .AND. FX.EQ.rvind | + | IF (minute_p.NE.rvind .AND. hour.NE.rvind) THEN |
| - | + .AND. (NINT(hour).EQ.0 .OR. NINT(hour).EQ.6 | + | C |
| - | | + | C |
| - | | + | C |
| - | + FX = value | + | mm = NINT(minute_p) |
| - | | + | hh = NINT(hour) |
| - | IF (value.NE.rvind | + | IF ((mm.EQ.-360 .AND. MOD(hh,6).EQ.0) |
| - | | + | |
| + | | ||
| + | IF (FX.EQ.rvind) | ||
| + | | ||
| + | IF (FX_1.EQ.rvind) FX_1 = value | ||
| + | | ||
| + | C All other periods are put in FX_X (arbitrary period) | ||
| + | IF (FX_X.EQ.rvind) | ||
| + | END IF | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.12004) THEN ! Dry bulb temperature at 2m (12 bits) | + | ELSE IF (desc.EQ.12104.OR. ! Dry bulb temperature at 2m (data width 16 bits) |
| - | IF (value.NE.rvind .AND. TA.EQ.rvind) THEN | + | |
| + | + desc.EQ.12101.OR. ! Temperature/ | ||
| + | | ||
| + | IF (TA.EQ.rvind) THEN | ||
| TA = value | TA = value | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.12101) THEN ! Temperature/ | + | ELSE IF (desc.EQ.12106.OR. ! Dew-point temperature at 2m (16 bits) |
| - | IF (value.NE.rvind .AND. TA.EQ.rvind) THEN | + | + desc.EQ.12006.OR. |
| - | TA = value | + | + desc.EQ.12103.OR. |
| - | END IF | + | + desc.EQ.12003) THEN ! Dew-point temperature (12 bits) |
| - | ELSE IF (desc.EQ.12001) THEN ! Temperature/ | + | IF (TD.EQ.rvind) THEN |
| - | IF (value.NE.rvind .AND. TA.EQ.rvind) THEN | + | |
| - | TA = value | + | |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.12106) THEN ! Dew-point temperature at 2m (16 bits) | + | |
| - | IF (value.NE.rvind .AND. TD.EQ.rvind) THEN | + | |
| - | TD = value | + | |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.12006) THEN ! Dew-point temperature at 2m (12 bits) | + | |
| - | IF (value.NE.rvind .AND. TD.EQ.rvind) THEN | + | |
| - | TD = value | + | |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.12103) THEN ! Dew-point temperature (16 bits) | + | |
| - | IF (value.NE.rvind .AND. TD.EQ.rvind) THEN | + | |
| - | TD = value | + | |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.12003) THEN ! Dew-point temperature (12 bits) | + | |
| - | IF (value.NE.rvind .AND. TD.EQ.rvind) THEN | + | |
| TD = value | TD = value | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.12113) THEN ! Ground minimum temperature at 2m (data width 16 bits) | + | ELSE IF (desc.EQ.12113.OR. |
| - | IF (value.NE.rvind .AND. TGN_12.EQ.rvind) THEN | + | |
| + | IF (TGN_12.EQ.rvind) THEN | ||
| | | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.12013) THEN ! Ground minimum temperature at 2m (12 bits) | + | ELSE IF (desc.EQ.12114.OR. ! Maximum temperature at 2m, past 12 hours (16 bits) |
| - | IF (value.NE.rvind .AND. TGN_12.EQ.rvind) THEN | + | + desc.EQ.12014) THEN ! Maximum temperature at 2m, past 12 hours (12 bits) |
| - | | + | IF (TAX_12.EQ.rvind) THEN |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.12114) THEN ! Maximum temperature at 2m, past 12 hours (16 bits) | + | |
| - | IF (value.NE.rvind .AND. TAX_12.EQ.rvind) THEN | + | |
| - | | + | |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.12014) THEN ! Maximum temperature at 2m, past 12 hours (12 bits) | + | |
| - | IF (value.NE.rvind .AND. TAX_12.EQ.rvind) THEN | + | |
| | | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.12111) THEN ! Maximum temperature at height and over period specified | ELSE IF (desc.EQ.12111) THEN ! Maximum temperature at height and over period specified | ||
| - | IF (value.NE.rvind .AND. TAX_12.EQ.rvind .AND. idx.GT.2 | + | IF (TAX_12.EQ.rvind .AND. idx.GT.2 |
| | | ||
| | | ||
| - | | + | |
| - | | + | IF (NINT(values(idx-2 |
| - | TAX_12 | + | IF (TAX_12.EQ.rvind) TAX_12 = value |
| + | ELSE IF (NINT(values(idx-2 + (ksub-1)*kxelem)).EQ.-1)THEN | ||
| + | IF (TAX.EQ.rvind) TAX = value | ||
| + | END IF | ||
| END IF | END IF | ||
| - | C For TAX_12: do we also need to consider 12021 ' | + | C Do we also need to consider 12021 ' |
| - | ELSE IF (desc.EQ.12115) THEN ! Minimum temperature at 2m, past 12 hours (16 bits) | + | ELSE IF (desc.EQ.12115.OR. |
| - | IF (value.NE.rvind .AND. TAN_12.EQ.rvind) THEN | + | + desc.EQ.12015) THEN ! Minimum temperature at 2m, past 12 hours (12 bits) |
| - | | + | IF (TAN_12.EQ.rvind) THEN |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.12015) THEN ! Minimum temperature at 2m, past 12 hours (12 bits) | + | |
| - | IF (value.NE.rvind .AND. TAN_12.EQ.rvind) THEN | + | |
| | | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.12112) THEN ! Minimum temperature at height and over period specified | ELSE IF (desc.EQ.12112) THEN ! Minimum temperature at height and over period specified | ||
| - | IF (value.NE.rvind .AND. TAN_12.EQ.rvind .AND. idx.GT.2 | + | IF (TAN_12.EQ.rvind .AND. idx.GT.2 |
| | | ||
| | | ||
| - | | + | |
| - | | + | IF (NINT(values(idx-2 |
| - | TAN_12 | + | IF (TAN_12.EQ.rvind) TAN_12 = value |
| + | ELSE IF (NINT(values(idx-2 + (ksub-1)*kxelem)).EQ.-1)THEN | ||
| + | IF (TAN.EQ.rvind) TAN = value | ||
| + | END IF | ||
| END IF | END IF | ||
| - | C For TAN_12: do we also need to consider 12022 ' | + | C Do we also need to consider 12022 ' |
| ELSE IF (desc.EQ.13003) THEN ! Relative humidity | ELSE IF (desc.EQ.13003) THEN ! Relative humidity | ||
| - | IF (value.NE.rvind .AND. UU.EQ.rvind) THEN | + | IF (UU.EQ.rvind) THEN |
| UU = value | UU = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20001) THEN ! Horizontal visibility | ELSE IF (desc.EQ.20001) THEN ! Horizontal visibility | ||
| - | IF (value.NE.rvind .AND. VV.EQ.rvind) THEN | + | IF (VV.EQ.rvind) THEN |
| VV = value | VV = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20003) THEN ! Present weather | ELSE IF (desc.EQ.20003) THEN ! Present weather | ||
| - | IF (value.NE.rvind .AND. WW.EQ.rvind) THEN | + | IF (WW.EQ.rvind) THEN |
| WW = value | WW = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20004) THEN ! Past weather (1) | ELSE IF (desc.EQ.20004) THEN ! Past weather (1) | ||
| - | IF (value.NE.rvind .AND. W1.EQ.rvind) THEN | + | IF (W1.EQ.rvind) THEN |
| W1 = value | W1 = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20005) THEN ! Past weather (2) | ELSE IF (desc.EQ.20005) THEN ! Past weather (2) | ||
| - | IF (value.NE.rvind .AND. W2.EQ.rvind) THEN | + | IF (W2.EQ.rvind) THEN |
| W2 = value | W2 = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20010) THEN ! Cloud cover (total) | ELSE IF (desc.EQ.20010) THEN ! Cloud cover (total) | ||
| - | IF (value.NE.rvind .AND. NN.EQ.rvind) THEN | + | IF (NN.EQ.rvind) THEN |
| NN = value | NN = value | ||
| END IF | END IF | ||
| Line 1354: | 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 (value.EQ.rvind) THEN | + | |
| - | | + | |
| - | + // ' factor after 020012 undefined!!!' | + | ELSE |
| bad_cloud_data = .TRUE. | bad_cloud_data = .TRUE. | ||
| - | ELSE | ||
| - | num_cloud_layers = NINT(value) | ||
| END IF | END IF | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.8002 .AND. .NOT.bad_cloud_data) THEN ! Vertical significance (surface observations) | ELSE IF (desc.EQ.8002 .AND. .NOT.bad_cloud_data) THEN ! Vertical significance (surface observations) | ||
| IF (cloud_type_count.EQ.0) THEN ! First occurrence | IF (cloud_type_count.EQ.0) THEN ! First occurrence | ||
| - | IF (value.NE.rvind .AND. vert_sign_first.EQ.rvind) THEN | + | IF (vert_sign_first.EQ.rvind) THEN |
| vert_sign_first = value | vert_sign_first = value | ||
| END IF | END IF | ||
| Line 1374: | Line 1872: | ||
| | | ||
| IF (cloud_layer.LE.num_cloud_layers) THEN | IF (cloud_layer.LE.num_cloud_layers) THEN | ||
| - | | + | vert_sign(cloud_layer) = value |
| - | vert_sign(cloud_layer) = value | + | |
| - | END IF | + | |
| END IF | END IF | ||
| ELSE ! rdb-files always have 0 or 4 cloud layers | ELSE ! rdb-files always have 0 or 4 cloud layers | ||
| | | ||
| IF (cloud_layer.LT.5) THEN | IF (cloud_layer.LT.5) THEN | ||
| - | | + | vert_sign(cloud_layer) = value |
| - | vert_sign(cloud_layer) = value | + | |
| - | END IF | + | |
| END IF | END IF | ||
| 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 (value.NE.rvind .AND. NH.EQ.rvind) THEN | + | 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 | ||
| NH = value | NH = value | ||
| END IF | END IF | ||
| Line 1397: | Line 1898: | ||
| | | ||
| IF (cloud_layer.LE.num_cloud_layers) THEN | IF (cloud_layer.LE.num_cloud_layers) THEN | ||
| - | | + | NS(cloud_layer) = value |
| - | NS(cloud_layer) = value | + | |
| - | END IF | + | |
| END IF | END IF | ||
| ELSE ! rdb-files always have 0 or 4 cloud layers | ELSE ! rdb-files always have 0 or 4 cloud layers | ||
| | | ||
| IF (cloud_layer.LT.5) THEN | IF (cloud_layer.LT.5) THEN | ||
| - | | + | NS(cloud_layer) = value |
| - | NS(cloud_layer) = value | + | |
| - | END IF | + | |
| END IF | END IF | ||
| 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 (cloud_layer.LE.num_cloud_layers) THEN | + | |
| - | IF (value.NE.rvind) THEN | + | cloud_layer = cloud_type_count - 3 |
| + | IF (num_cloud_layers .GT.-1) THEN | ||
| + | | ||
| + | | ||
| CC(cloud_layer) = value | CC(cloud_layer) = value | ||
| END IF | END IF | ||
| - | | + | ELSE IF (cloud_layer.LT.5) THEN ! rdb-files always have 0 or 4 cloud layers |
| - | ELSE IF (cloud_layer.LT.5) THEN ! rdb-files always have 0 or 4 cloud layers | + | |
| - | IF (value.NE.rvind) THEN | + | |
| | | ||
| END IF | END IF | ||
| - | END IF | + | |
| - | | + | IF (cloud_type_count.EQ.1) THEN |
| - | | + | |
| - | IF (value.NE.rvind .AND. CL.EQ.rvind) THEN | + | CL = value |
| - | | + | |
| - | END IF | + | ELSE IF (cloud_type_count.EQ.2) THEN |
| - | | + | |
| - | IF (value.NE.rvind .AND. CM.EQ.rvind) THEN | + | CM = value |
| - | | + | |
| - | END IF | + | ELSE IF (cloud_type_count.EQ.3) THEN |
| - | | + | |
| - | IF (value.NE.rvind .AND. CH.EQ.rvind) THEN | + | CH = value |
| - | | + | END IF |
| 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 | + | |
| - | IF (value.NE.rvind .AND. HL.EQ.rvind) THEN | + | |
| + | ELSE IF (cloud_type_count.EQ.0) THEN ! First occurrence | ||
| + | IF (HL.EQ.rvind) THEN | ||
| HL = value | HL = value | ||
| END IF | END IF | ||
| Line 1453: | Line 1953: | ||
| | | ||
| IF (cloud_layer.LE.num_cloud_layers) THEN | IF (cloud_layer.LE.num_cloud_layers) THEN | ||
| - | | + | HS(cloud_layer) = value |
| - | HS(cloud_layer) = value | + | |
| - | END IF | + | |
| END IF | END IF | ||
| ELSE ! rdb-files always have 0 or 4 cloud layers | ELSE ! rdb-files always have 0 or 4 cloud layers | ||
| - | IF (value.NE.rvind) THEN | + | |
| - | | + | |
| - | IF (cloud_layer.LT.5) THEN | + | HS(cloud_layer) = value |
| - | IF (value.NE.rvind) THEN | + | |
| - | | + | |
| - | END IF | + | |
| - | END IF | + | |
| END IF | END IF | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.13023) THEN ! Total precipitation past 24 hours | ELSE IF (desc.EQ.13023) THEN ! Total precipitation past 24 hours | ||
| - | IF (value.NE.rvind .AND. RR_24.EQ.rvind) THEN | + | IF (RR_24.EQ.rvind) THEN |
| RR_24 = value | RR_24 = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.13022) THEN ! Total precipitation past 12 hours | ELSE IF (desc.EQ.13022) THEN ! Total precipitation past 12 hours | ||
| - | IF (value.NE.rvind .AND. RR_12.EQ.rvind) THEN | + | IF (RR_12.EQ.rvind) THEN |
| RR_12 = value | RR_12 = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.13021) THEN ! Total precipitation past 6 hours | ELSE IF (desc.EQ.13021) THEN ! Total precipitation past 6 hours | ||
| - | IF (value.NE.rvind .AND. RR_6.EQ.rvind) THEN | + | IF (RR_6.EQ.rvind) THEN |
| RR_6 = value | RR_6 = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.13020) THEN ! Total precipitation past 3 hours | ELSE IF (desc.EQ.13020) THEN ! Total precipitation past 3 hours | ||
| - | IF (value.NE.rvind .AND. RR_3.EQ.rvind) THEN | + | IF (RR_3.EQ.rvind) THEN |
| RR_3 = value | RR_3 = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.13019) THEN ! Total precipitation past 1 hour | ELSE IF (desc.EQ.13019) THEN ! Total precipitation past 1 hour | ||
| - | IF (value.NE.rvind .AND. RR_1.EQ.rvind) THEN | + | IF (RR_1.EQ.rvind) THEN |
| RR_1 = value | RR_1 = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.13011) THEN ! Total precipitation/ | ELSE IF (desc.EQ.13011) THEN ! Total precipitation/ | ||
| - | IF (value.NE.rvind .AND. hour_p.NE.rvind) THEN | + | IF (hour_p.NE.rvind) THEN |
| hh = NINT(hour_p) | hh = NINT(hour_p) | ||
| IF (hh.EQ.-24) THEN | IF (hh.EQ.-24) THEN | ||
| Line 1503: | Line 1997: | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.13013) THEN ! Total snow depth | ELSE IF (desc.EQ.13013) THEN ! Total snow depth | ||
| - | IF (value.NE.rvind .AND. SA.EQ.rvind) THEN | + | C |
| - | SA = value | + | C EE < 10, which probably means that 20062 has been wrongly encoded, not 13013 |
| + | SA = value | ||
| + | ELSE IF (desc.EQ.20062) THEN ! State of the ground (with or without snow) | ||
| + | IF (EE.EQ.rvind) THEN | ||
| + | EE = value | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.20062) THEN ! State of the ground (with or without snow) | + | |
| - | IF (value.NE.rvind) THEN | + | |
| - | IF (NINT(value).LE.10) THEN ! E in TAC (3Ejjj) | + | END IF |
| - | E = value | + | C |
| - | IF (SA.EQ.rvind) THEN | + | C SS_24 is encoded in kvalobs for Norwegian avalanche stations (and |
| - | | + | C we have no better kvalobs parameter for depth of fresh snow anyway) |
| - | END IF | + | ELSE IF (desc.EQ.13012) THEN ! Depth of fresh snow |
| - | | + | IF (SS_24.EQ.rvind) THEN |
| - | | + | SS_24 = value |
| - | END IF | + | |
| END IF | END IF | ||
| ELSE IF (desc.EQ.14031) THEN ! Total sunshine | ELSE IF (desc.EQ.14031) THEN ! Total sunshine | ||
| - | IF (value.NE.rvind .AND. hour_p.NE.rvind) THEN | + | IF (hour_p.NE.rvind) THEN |
| hh = NINT(hour_p) | hh = NINT(hour_p) | ||
| IF (hh.EQ.-1) THEN | IF (hh.EQ.-1) THEN | ||
| Line 1527: | Line 2024: | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.13033) THEN ! Evaporation/ | ELSE IF (desc.EQ.13033) THEN ! Evaporation/ | ||
| - | IF (value.NE.rvind .AND. hour_p.NE.rvind) THEN | + | IF (hour_p.NE.rvind) THEN |
| hh = NINT(hour_p) | hh = NINT(hour_p) | ||
| IF (hh.EQ.-1) THEN | IF (hh.EQ.-1) THEN | ||
| Line 1533: | Line 2030: | ||
| ELSE IF (hh.EQ.-24) THEN | ELSE IF (hh.EQ.-24) THEN | ||
| EV_24 = value | EV_24 = value | ||
| + | END IF | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.14002) THEN ! Long-wave radiation | ||
| + | IF (hour_p.NE.rvind) THEN | ||
| + | hh = NINT(hour_p) | ||
| + | IF (hh.EQ.-1) THEN | ||
| + | QL = value | ||
| + | ELSE IF (hh.EQ.-24) THEN | ||
| + | QL_24 = value | ||
| + | END IF | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.14004) THEN ! Short-wave radiation | ||
| + | IF (hour_p.NE.rvind) THEN | ||
| + | hh = NINT(hour_p) | ||
| + | IF (hh.EQ.-1) THEN | ||
| + | QK = value | ||
| + | ELSE IF (hh.EQ.-24) THEN | ||
| + | QK_24 = value | ||
| + | END IF | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.14016) THEN ! Net radiation | ||
| + | IF (hour_p.NE.rvind) THEN | ||
| + | hh = NINT(hour_p) | ||
| + | IF (hh.EQ.-1) THEN | ||
| + | QE = value | ||
| + | ELSE IF (hh.EQ.-24) THEN | ||
| + | QE_24 = value | ||
| + | END IF | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.14028) THEN ! Global solar radiation | ||
| + | IF (hour_p.NE.rvind) THEN | ||
| + | hh = NINT(hour_p) | ||
| + | IF (hh.EQ.-1) THEN | ||
| + | QO = value | ||
| + | ELSE IF (hh.EQ.-24) THEN | ||
| + | QO_24 = value | ||
| + | END IF | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.14029) THEN ! Diffuse solar radiation | ||
| + | IF (hour_p.NE.rvind) THEN | ||
| + | hh = NINT(hour_p) | ||
| + | IF (hh.EQ.-1) THEN | ||
| + | QD = value | ||
| + | ELSE IF (hh.EQ.-24) THEN | ||
| + | QD_24 = value | ||
| + | END IF | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.14030) THEN ! Direct solar radiation | ||
| + | IF (hour_p.NE.rvind) THEN | ||
| + | hh = NINT(hour_p) | ||
| + | IF (hh.EQ.-1) THEN | ||
| + | QS = value | ||
| + | ELSE IF (hh.EQ.-24) THEN | ||
| + | QS_24 = value | ||
| END IF | END IF | ||
| END IF | END IF | ||
| C | C | ||
| ELSE IF (desc.EQ.7004) THEN ! Pressure (location class) | ELSE IF (desc.EQ.7004) THEN ! Pressure (location class) | ||
| - | IF (value.NE.rvind .AND. a3.EQ.rvind) THEN | + | IF (a3.EQ.rvind) THEN |
| a3 = value | a3 = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.10009) THEN ! Geopotential height | ELSE IF (desc.EQ.10009) THEN ! Geopotential height | ||
| - | IF (value.NE.rvind .AND. hhh.EQ.rvind) THEN | + | IF (hhh.EQ.rvind) THEN |
| hhh = value | hhh = value | ||
| - | END IF | ||
| - | ELSE IF (desc.EQ.10008) THEN ! Geopotential (20 bits) | ||
| - | IF (value.NE.rvind .AND. hhh.EQ.rvind) THEN | ||
| - | hhh = value * 9.8 | ||
| - | END IF | ||
| - | ELSE IF (desc.EQ.10003) THEN ! Geopotential (17 bits) | ||
| - | IF (value.NE.rvind .AND. hhh.EQ.rvind) THEN | ||
| - | hhh = value * 9.8 | ||
| END IF | END IF | ||
| C | C | ||
| ELSE IF (desc.EQ.1011) THEN ! Ship or mobile land station identifier | ELSE IF (desc.EQ.1011) THEN ! Ship or mobile land station identifier | ||
| - | | + | cidx = int(value/ |
| - | cidx = int(value/ | + | IF (cidx.GT.0) THEN |
| - | | + | |
| - | call_sign = cvals(cidx) ! CCITTIA5 data | + | call_sign = ctrim(call_sign, |
| - | END IF | + | |
| END IF | END IF | ||
| ELSE IF (desc.EQ.1012) THEN ! Direction of motion of moving observing platform | ELSE IF (desc.EQ.1012) THEN ! Direction of motion of moving observing platform | ||
| - | IF (value.NE.rvind .AND. ds.EQ.rvind) THEN | + | IF (ds.EQ.rvind) THEN |
| ds = value | ds = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.1013) THEN ! Speed of motion of moving observing platform | ELSE IF (desc.EQ.1013) THEN ! Speed of motion of moving observing platform | ||
| - | IF (value.NE.rvind .AND. vs.EQ.rvind) THEN | + | IF (vs.EQ.rvind) THEN |
| vs = value | vs = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.7062) THEN ! Depth below sea/water surface | ELSE IF (desc.EQ.7062) THEN ! Depth below sea/water surface | ||
| - | IF (value.NE.rvind) THEN | ||
| C Some buoy reports starts with depth 1.5 m, others starts with 0 m | C Some buoy reports starts with depth 1.5 m, others starts with 0 m | ||
| C then 1.5 m and always have same sea/water temperature for these 2 | C then 1.5 m and always have same sea/water temperature for these 2 | ||
| C | C | ||
| - | IF (value.LT.1.6) THEN | + | |
| - | surface_data = .TRUE. | + | |
| - | | + | ELSE |
| - | surface_data = .FALSE. | + | |
| - | END IF | + | |
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.22043) THEN ! Sea/water temperature (15 bits) | + | ELSE IF (desc.EQ.22043.OR. |
| - | IF (value.NE.rvind .AND. TW.EQ.rvind .AND. surface_data)THEN | + | + desc.EQ.22042.OR. ! Sea/water temperature (12 bits) |
| + | | ||
| + | IF (TW.EQ.rvind .AND. surface_data)THEN | ||
| TW = value | TW = value | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.22042) THEN ! Sea/ | + | ELSE IF (desc.EQ.12102.OR. |
| - | IF (value.NE.rvind .AND. TW.EQ.rvind | + | |
| - | | + | IF (TbTbTb.EQ.rvind) THEN |
| - | TW = value | + | |
| - | END IF | + | |
| - | ELSE IF (desc.EQ.12102) THEN ! Wet-bulb temperature (16 bits) | + | |
| - | IF (value.NE.rvind .AND. TbTbTb.EQ.rvind) THEN | + | |
| | | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.12005) THEN ! Wet-bulb temperature | + | ELSE IF (desc.EQ.22011) THEN ! |
| - | IF (value.NE.rvind .AND. TbTbTb.EQ.rvind) THEN | + | IF (PWA.EQ.rvind) THEN |
| - | TbTbTb | + | PWA = value |
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.22011) THEN ! Period of waves (BUFR doesn' | + | ELSE IF (desc.EQ.22012) THEN ! Period of wind waves (visually measured) |
| - | IF (value.NE.rvind .AND. PW.EQ.rvind) THEN | + | IF (PW.EQ.rvind) THEN |
| PW = value | PW = value | ||
| END IF | END IF | ||
| - | ELSE IF (desc.EQ.22021) THEN ! Heigth of waves (BUFR doesn' | + | ELSE IF (desc.EQ.22021) THEN ! Heigth of waves |
| - | IF (value.NE.rvind .AND. HW.EQ.rvind) THEN | + | IF (HWA.EQ.rvind) THEN |
| + | HWA = value | ||
| + | | ||
| + | | ||
| + | IF (HW.EQ.rvind) THEN | ||
| HW = value | HW = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.22003) THEN ! Direction of swell waves | ELSE IF (desc.EQ.22003) THEN ! Direction of swell waves | ||
| - | | + | IF (DW1.EQ.rvind) THEN |
| - | IF (DW1.EQ.rvind) THEN | + | |
| - | DW1 = value | + | ELSE |
| - | | + | |
| - | DW2 = value | + | |
| - | END IF | + | |
| END IF | END IF | ||
| ELSE IF (desc.EQ.22013) THEN ! Period of swell waves | ELSE IF (desc.EQ.22013) THEN ! Period of swell waves | ||
| - | | + | IF (PW1.EQ.rvind) THEN |
| - | IF (PW1.EQ.rvind) THEN | + | |
| - | PW1 = value | + | ELSE |
| - | | + | |
| - | PW2 = value | + | |
| - | END IF | + | |
| END IF | END IF | ||
| ELSE IF (desc.EQ.22023) THEN ! Height of swell waves | ELSE IF (desc.EQ.22023) THEN ! Height of swell waves | ||
| - | | + | IF (HW1.EQ.rvind) THEN |
| - | IF (HW1.EQ.rvind) THEN | + | |
| - | HW1 = value | + | ELSE |
| - | | + | |
| - | HW2 = value | + | |
| - | END IF | + | |
| END IF | END IF | ||
| ELSE IF (desc.EQ.22061) THEN ! State of the sea | ELSE IF (desc.EQ.22061) THEN ! State of the sea | ||
| - | IF (value.NE.rvind .AND. SG.EQ.rvind) THEN | + | IF (SG.EQ.rvind) THEN |
| SG = value | SG = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20033) THEN ! Cause of ice accretion | ELSE IF (desc.EQ.20033) THEN ! Cause of ice accretion | ||
| - | IF (value.NE.rvind .AND. XIS.EQ.rvind) THEN | + | IF (XIS.EQ.rvind) THEN |
| XIS = value | XIS = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20031) THEN ! Ice deposit (thickness) | ELSE IF (desc.EQ.20031) THEN ! Ice deposit (thickness) | ||
| - | IF (value.NE.rvind .AND. ES.EQ.rvind) THEN | + | IF (ES.EQ.rvind) THEN |
| ES = value | ES = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20032) THEN ! Rate of ice accretion | ELSE IF (desc.EQ.20032) THEN ! Rate of ice accretion | ||
| - | IF (value.NE.rvind .AND. RS.EQ.rvind) THEN | + | IF (RS.EQ.rvind) THEN |
| RS = value | RS = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20034) THEN ! Sea ice concentration | ELSE IF (desc.EQ.20034) THEN ! Sea ice concentration | ||
| - | IF (value.NE.rvind .AND. CI.EQ.rvind) THEN | + | IF (CI.EQ.rvind) THEN |
| CI = value | CI = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20037) THEN ! Ice development | ELSE IF (desc.EQ.20037) THEN ! Ice development | ||
| - | IF (value.NE.rvind .AND. SI.EQ.rvind) THEN | + | IF (SI.EQ.rvind) THEN |
| SI = value | SI = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20035) THEN ! Amount and type of ice | ELSE IF (desc.EQ.20035) THEN ! Amount and type of ice | ||
| - | IF (value.NE.rvind .AND. BI.EQ.rvind) THEN | + | IF (BI.EQ.rvind) THEN |
| BI = value | BI = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20038) THEN ! Bearing of ice edge | ELSE IF (desc.EQ.20038) THEN ! Bearing of ice edge | ||
| - | IF (value.NE.rvind .AND. DI.EQ.rvind) THEN | + | IF (DI.EQ.rvind) THEN |
| DI = value | DI = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.20036) THEN ! Ice situation | ELSE IF (desc.EQ.20036) THEN ! Ice situation | ||
| - | IF (value.NE.rvind .AND. ZI.EQ.rvind) THEN | + | IF (ZI.EQ.rvind) THEN |
| ZI = value | ZI = value | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.1005) THEN ! Buoy/ | ELSE IF (desc.EQ.1005) THEN ! Buoy/ | ||
| - | IF (value.NE.rvind .AND. buoy_id.EQ.rvind) THEN | + | IF (buoy_id5.EQ.rvind) THEN |
| - | buoy_id | + | buoy_id5 |
| END IF | END IF | ||
| ELSE IF (desc.EQ.1003) THEN ! WMO region number/ | ELSE IF (desc.EQ.1003) THEN ! WMO region number/ | ||
| - | IF (value.NE.rvind .AND. wmo_region_number.EQ.rvind) THEN | + | IF (wmo_region_number.EQ.rvind) THEN |
| | | ||
| END IF | END IF | ||
| ELSE IF (desc.EQ.1020) THEN ! WMO region sub-area | ELSE IF (desc.EQ.1020) THEN ! WMO region sub-area | ||
| - | IF (value.NE.rvind .AND. wmo_region_subarea.EQ.rvind) THEN | + | IF (wmo_region_subarea.EQ.rvind) THEN |
| | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.1087) THEN ! WMO Marine observing platform extended identifier | ||
| + | IF (buoy_id7.EQ.rvind) THEN | ||
| + | | ||
| END IF | END IF | ||
| C | C | ||
| ELSE IF (desc.EQ.1063) THEN ! ICAO location indicator | ELSE IF (desc.EQ.1063) THEN ! ICAO location indicator | ||
| - | | + | cidx = int(value/ |
| - | cidx = int(value/ | + | icao_id = cvals(cidx) ! CCITTIA5 data |
| - | IF (cvals(cidx).NE.spc8) THEN | + | |
| - | | + | |
| - | END IF | + | |
| - | | + | |
| ELSE IF (desc.EQ.10052) THEN ! Altimeter setting (QNH) | ELSE IF (desc.EQ.10052) THEN ! Altimeter setting (QNH) | ||
| - | IF (value.NE.rvind .AND. PH.EQ.rvind) THEN | + | IF (PH.EQ.rvind) THEN |
| PH = value | PH = value | ||
| END IF | END IF | ||
| Line 1697: | Line 2234: | ||
| END IF | END IF | ||
| - | WRITE(*,*) | ||
| IF (II.NE.rvind .AND. iii.NE.rvind) THEN | IF (II.NE.rvind .AND. iii.NE.rvind) THEN | ||
| + | | ||
| | | ||
| + | ELSE IF (wigos_series.NE.rvind .AND. wigos_issuer.NE.missing5 | ||
| + | | ||
| + | | ||
| + | ind = index(wigos_issuer,' | ||
| + | IF (ind.EQ.-1) ind = 5 | ||
| + | ind2 = index(wigos_issueno,' | ||
| + | IF (ind2.EQ.-1) ind2 = 5 | ||
| + | ind3 = index(wigos_localid,' | ||
| + | IF (ind3.EQ.-1) ind3 = 16 | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | ELSE IF (state_id.NE.rvind .AND. national_number.NE.rvind) THEN | ||
| + | | ||
| + | | ||
| + | | ||
| ELSE IF (call_sign.NE.missing9) THEN | ELSE IF (call_sign.NE.missing9) THEN | ||
| + | ind = index(call_sign,' | ||
| + | IF (ind.EQ.-1) ind = 9 | ||
| + | C | ||
| + | C | ||
| + | DO WHILE (IACHAR(call_sign(ind: | ||
| + | ind = ind - 1 | ||
| + | END DO | ||
| + | | ||
| | | ||
| - | | + | |
| - | ELSE IF (buoy_id.NE.rvind.AND.wmo_region_number.NE.rvind | + | ELSE IF (buoy_id7.NE.rvind) THEN |
| + | C New templates introduced in 2014 for data category 1 use 001087 | ||
| + | C WMO Marine observing platform extended identifier, 7 digits | ||
| + | | ||
| + | WRITE(*,'(A,I7)' | ||
| + | ELSE IF (buoy_id5.NE.rvind) THEN | ||
| + | | ||
| + | IF (wmo_region_number.EQ.rvind | ||
| + | | ||
| + | C Old drau files (wrongly) includes | ||
| + | C | ||
| + | C | ||
| + | WRITE(*,' | ||
| + | ELSE IF (wmo_region_number.EQ.rvind | ||
| | | ||
| - | WRITE(*,' | + | C Some BUFR BUOYS on GTS have ' |
| - | | + | C but not for wmo_region_subarea |
| - | ELSE IF (buoy_id.NE.rvind.AND.buoy_id.GT.1000) | + | |
| - | C | + | |
| - | C | + | |
| - | | + | |
| + | C Not easy to know how to display this case, but then I have never | ||
| + | C seen this in practice | ||
| + | WRITE(*,' | ||
| + | ELSE IF (buoy_id5.GT.10000.AND. | ||
| + | | ||
| + | + NINT(wmo_region_number)*10000 | ||
| + | | ||
| + | C If first 2 digits of 5 digit buoy_id equals | ||
| + | C | ||
| + | C | ||
| + | | ||
| + | | ||
| + | | ||
| + | ELSE | ||
| + | WRITE(*,' | ||
| + | | ||
| + | END IF | ||
| ELSE | ELSE | ||
| IF (verbose .GT. 1) THEN | IF (verbose .GT. 1) THEN | ||
| - | WRITE(*,*) 'Both wmonr, call_sign | + | |
| - | | + | |
| + | | ||
| + | C | ||
| + | C | ||
| END IF | END IF | ||
| | | ||
| Line 1731: | Line 2328: | ||
| ENDIF | ENDIF | ||
| IF (icao_id.NE.missing8) THEN | IF (icao_id.NE.missing8) THEN | ||
| - | | + | |
| END IF | END IF | ||
| IF (name.NE.missing20) THEN | IF (name.NE.missing20) THEN | ||
| - | | + | |
| END IF | END IF | ||
| - | IF (NINT(ix).EQ.0) THEN | + | |
| - | | + | |
| - | ELSE IF (NINT(ix).EQ.1) THEN | + | END IF |
| - | | + | IF (ix.NE.rvind) THEN |
| - | ELSE IF (NINT(ix).EQ.2) THEN | + | IF (NINT(ix).EQ.0) THEN |
| - | | + | WRITE(*,' |
| + | | ||
| + | WRITE(*,' | ||
| + | | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| END IF | END IF | ||
| IF (longitude.NE.rvind) THEN | IF (longitude.NE.rvind) THEN | ||
| Line 1752: | Line 2354: | ||
| ! so display as integer | ! so display as integer | ||
| | | ||
| + | END IF | ||
| + | IF (hp.NE.rvind) THEN | ||
| + | | ||
| END IF | END IF | ||
| IF (vs.NE.rvind) THEN | IF (vs.NE.rvind) THEN | ||
| Line 1758: | Line 2363: | ||
| IF (ds.NE.rvind) THEN | IF (ds.NE.rvind) THEN | ||
| | | ||
| + | END IF | ||
| + | IF (a3.NE.rvind) THEN ! Standard isobaric surface for which the | ||
| + | ! geopotential is reported, no Kvalobs code exists | ||
| + | | ||
| END IF | END IF | ||
| IF (hhh.NE.rvind) THEN ! Geopotential height, no Kvalobs code exists | IF (hhh.NE.rvind) THEN ! Geopotential height, no Kvalobs code exists | ||
| Line 1770: | Line 2379: | ||
| IF (FX.NE.rvind) THEN | IF (FX.NE.rvind) THEN | ||
| | | ||
| + | END IF | ||
| + | IF (FX_1.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (FX_X.NE.rvind) THEN | ||
| + | | ||
| END IF | END IF | ||
| IF (DG.NE.rvind) THEN | IF (DG.NE.rvind) THEN | ||
| Line 1788: | Line 2403: | ||
| IF (FG_1.NE.rvind) THEN | IF (FG_1.NE.rvind) THEN | ||
| | | ||
| + | END IF | ||
| + | IF (DG_X.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (FG_X.NE.rvind) THEN | ||
| + | | ||
| END IF | END IF | ||
| IF (TA.NE.rvind) THEN | IF (TA.NE.rvind) THEN | ||
| Line 1800: | Line 2421: | ||
| IF (TAN_12.NE.rvind) THEN | IF (TAN_12.NE.rvind) THEN | ||
| | | ||
| + | END IF | ||
| + | IF (TAX.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (TAN.NE.rvind) THEN | ||
| + | | ||
| END IF | END IF | ||
| IF (TGN_12.NE.rvind) THEN | IF (TGN_12.NE.rvind) THEN | ||
| Line 1828: | Line 2455: | ||
| | | ||
| END IF | END IF | ||
| - | C Precipitation = -0.1 means "trace" | + | C Use the BUFR some special values for precipitation, |
| - | C represented | + | C |
| + | C showed | ||
| IF (RR_24.NE.rvind) THEN | IF (RR_24.NE.rvind) THEN | ||
| - | IF (NINT(RR_24*10).EQ.-1) THEN | + | |
| - | WRITE(*,' | + | |
| - | | + | |
| - | | + | |
| - | END IF | + | |
| END IF | END IF | ||
| IF (RR_12.NE.rvind) THEN | IF (RR_12.NE.rvind) THEN | ||
| - | IF (NINT(RR_12*10).EQ.-1) THEN | + | |
| - | WRITE(*,' | + | |
| - | | + | |
| - | | + | |
| - | END IF | + | |
| END IF | END IF | ||
| IF (RR_6.NE.rvind) THEN | IF (RR_6.NE.rvind) THEN | ||
| - | IF (NINT(RR_6*10).EQ.-1) THEN | + | |
| - | WRITE(*,' | + | |
| - | | + | |
| - | | + | |
| - | END IF | + | |
| END IF | END IF | ||
| IF (RR_3.NE.rvind) THEN | IF (RR_3.NE.rvind) THEN | ||
| - | IF (NINT(RR_3*10).EQ.-1) THEN | + | |
| - | WRITE(*,' | + | |
| - | | + | |
| - | | + | |
| - | END IF | + | |
| END IF | END IF | ||
| IF (RR_1.NE.rvind) THEN | IF (RR_1.NE.rvind) THEN | ||
| - | IF (NINT(RR_1*10).EQ.-1) THEN | + | |
| - | WRITE(*,' | + | |
| - | | + | |
| - | | + | |
| - | END IF | + | |
| END IF | END IF | ||
| IF (WW.NE.rvind.AND.WW.LT.200) THEN ! 508-511 and w1w1 (in 333 9 group) ignored here | IF (WW.NE.rvind.AND.WW.LT.200) THEN ! 508-511 and w1w1 (in 333 9 group) ignored here | ||
| Line 1886: | Line 2494: | ||
| END IF | END IF | ||
| END IF | END IF | ||
| - | IF (E.NE.rvind) THEN | + | IF (EE.NE.rvind) THEN |
| - | | + | |
| END IF | END IF | ||
| - | IF (EM.NE.rvind) THEN | + | C Use the BUFR some special values |
| - | | + | C So ' |
| - | END IF | + | |
| - | C SA has some special values | + | |
| C Note that conversion from synop to BUFR normally will set SA=0 if E < 10 | C Note that conversion from synop to BUFR normally will set SA=0 if E < 10 | ||
| - | c$$$ IF (E.NE.rvind .AND. NINT(E).LE.10 | ||
| - | c$$$ | ||
| - | c$$$ | ||
| IF (SA.NE.rvind) THEN | IF (SA.NE.rvind) THEN | ||
| - | IF (NINT(SA*100).EQ.-1) THEN ! Trace: less than 0.5 cm snow | + | |
| - | | + | END IF |
| - | ELSE IF (NINT(SA*100).EQ.-2) THEN ! Snow cover not continuos | + | IF (SS_24.NE.rvind) THEN |
| - | | + | |
| - | ELSE IF (NINT(SA*100).EQ.0) THEN ! 0 snow coded as -1 in Kvalobs. Stupid but true | + | |
| - | WRITE(*,' | + | |
| - | ELSE | + | |
| - | | + | |
| - | END IF | + | |
| END IF | END IF | ||
| IF (VV.NE.rvind) THEN | IF (VV.NE.rvind) THEN | ||
| Line 1918: | Line 2516: | ||
| END IF | END IF | ||
| IF (NH.NE.rvind) THEN | IF (NH.NE.rvind) THEN | ||
| - | | + | |
| END IF | END IF | ||
| C | C | ||
| Line 1928: | Line 2526: | ||
| END IF | END IF | ||
| IF (CM.NE.rvind) THEN | IF (CM.NE.rvind) THEN | ||
| - | IF (NINT(CM).GE.20.AND.NINT(CL).LT.30) THEN | + | IF (NINT(CM).GE.20.AND.NINT(CM).LT.30) THEN |
| WRITE(*,' | WRITE(*,' | ||
| END IF | END IF | ||
| Line 1940: | Line 2538: | ||
| DO i=1, | DO i=1, | ||
| IF (NS(i).NE.rvind) THEN | IF (NS(i).NE.rvind) THEN | ||
| - | WRITE(*,' | + | WRITE(*,' |
| END IF | END IF | ||
| IF (CC(i).NE.rvind) THEN | IF (CC(i).NE.rvind) THEN | ||
| Line 1946: | Line 2544: | ||
| END IF | END IF | ||
| IF (HS(i).NE.rvind) THEN | IF (HS(i).NE.rvind) THEN | ||
| - | WRITE(*,' | + | WRITE(*,' |
| END IF | END IF | ||
| END DO | END DO | ||
| IF (SG.NE.rvind) THEN | IF (SG.NE.rvind) THEN | ||
| | | ||
| + | END IF | ||
| + | IF (PWA.NE.rvind) THEN | ||
| + | | ||
| END IF | END IF | ||
| IF (PW.NE.rvind) THEN | IF (PW.NE.rvind) THEN | ||
| | | ||
| + | END IF | ||
| + | IF (HWA.NE.rvind) THEN | ||
| + | | ||
| END IF | END IF | ||
| IF (HW.NE.rvind) THEN | IF (HW.NE.rvind) THEN | ||
| Line 2005: | Line 2609: | ||
| IF (OT_24.NE.rvind) THEN | IF (OT_24.NE.rvind) THEN | ||
| | | ||
| + | END IF | ||
| + | IF (QE.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QO.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QL.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QK.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QD.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QS.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QE_24.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QO_24.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QL_24.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QK_24.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QD_24.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (QS_24.NE.rvind) THEN | ||
| + | | ||
| END IF | END IF | ||
| IF (EV_1.NE.rvind) THEN | IF (EV_1.NE.rvind) THEN | ||
| Line 2017: | Line 2657: | ||
| C | C | ||
| - | C Convert | + | SUBROUTINE print_oceanographic_values(ksub, |
| - | INTEGER FUNCTION HStoWMO_HSHS(HS) | + | |
| + | C Identify pressure, temperature etc and print parameter=value to screen | ||
| IMPLICIT NONE | IMPLICIT NONE | ||
| - | REAL*8 HS | ||
| - | INTEGER HSHS | ||
| - | IF (NINT(HS).LT.1800) THEN | + | |
| - | HSHS=NINT(HS/30)-1 | + | INTEGER kxelem |
| - | ELSE IF (NINT(HS).LT.10500) THEN | + | INTEGER ktdexl |
| - | HSHS=NINT((HS-1800)/300)+55 | + | INTEGER ktdexp(*) |
| - | ELSE IF (NINT(HS).LE.21000) THEN | + | REAL*8 values(*) |
| - | HSHS=NINT((HS-10500)/1500)+80 | + | CHARACTER*80 cvals(*) |
| + | LOGICAL rectangle | ||
| + | INTEGER verbose | ||
| + | |||
| + | REAL*8 rvind ! missing value for real*8 data | ||
| + | PARAMETER (rvind=1.7E38) | ||
| + | |||
| + | C | ||
| + | REAL*8 HW,PW,TW, | ||
| + | C Other parameters | ||
| + | | ||
| + | | ||
| + | | ||
| + | INTEGER idx, | ||
| + | PARAMETER(maxlevel=2000) ! Largest number seen was 499 in a bathy | ||
| + | CHARACTER*9 call_sign, | ||
| + | CHARACTER one_bits | ||
| + | REAL*8 value | ||
| + | REAL*8 d(maxlevel), | ||
| + | REAL*8 w(maxlevel) | ||
| + | |||
| + | C | ||
| + | C | ||
| + | REAL*8 x1, | ||
| + | COMMON / | ||
| + | |||
| + | C | ||
| + | CHARACTER*9 ctrim ! length must be >= longest variable ctrim is used for | ||
| + | |||
| + | one_bits = CHAR(255) | ||
| + | WRITE(missing9,' | ||
| + | | ||
| + | |||
| + | C | ||
| + | call_sign = missing9 | ||
| + | HW = rvind | ||
| + | PW = rvind | ||
| + | TW = rvind | ||
| + | year = rvind | ||
| + | month = rvind | ||
| + | day = rvind | ||
| + | hour = rvind | ||
| + | minute = rvind | ||
| + | latitude = rvind | ||
| + | longitude = rvind | ||
| + | buoy_id = rvind | ||
| + | sal = rvind | ||
| + | wmo_region_number = rvind | ||
| + | wmo_region_subarea = rvind | ||
| + | DO n=1, | ||
| + | z(n) = rvind | ||
| + | w(n) = rvind | ||
| + | T(n) = rvind | ||
| + | s(n) = rvind | ||
| + | d(n) = rvind | ||
| + | v(n) = rvind | ||
| + | END DO | ||
| + | |||
| + | C Loop through all expanded descriptors | ||
| + | n = 0 ! Numbering the subsurface levels | ||
| + | DO idx=1, | ||
| + | desc = ktdexp(idx) | ||
| + | value = values(idx + (ksub-1)*kxelem) | ||
| + | |||
| + | IF (ABS(value - rvind)/ | ||
| + | C | ||
| + | CYCLE | ||
| + | END IF | ||
| + | |||
| + | C | ||
| + | IF (desc.EQ.4001) THEN ! Year | ||
| + | IF (year.EQ.rvind) THEN | ||
| + | year = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.4002) THEN ! Month | ||
| + | IF (month.EQ.rvind) THEN | ||
| + | month = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.4003) THEN ! Day | ||
| + | IF (day.EQ.rvind) THEN | ||
| + | day = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.4004) THEN ! Hour | ||
| + | IF (hour.EQ.rvind) THEN | ||
| + | hour = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.4005) THEN ! Minute | ||
| + | IF (minute.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.5001.OR. | ||
| + | | ||
| + | IF (latitude.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.6001.OR. | ||
| + | | ||
| + | IF (longitude.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.31001) THEN | ||
| + | C | ||
| + | C | ||
| + | IF (value.EQ.rvind) THEN | ||
| + | | ||
| + | | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.7062) THEN ! Depth below sea/water surface | ||
| + | n = n + 1 ! new level | ||
| + | IF (n.GT.maxlevel) THEN | ||
| + | n = maxlevel | ||
| + | | ||
| + | GOTO 120 | ||
| + | END IF | ||
| + | z(n) = value | ||
| + | ELSE IF (desc.EQ.7065) THEN ! Water pressure | ||
| + | n = n + 1 ! new level | ||
| + | IF (n.GT.maxlevel) THEN | ||
| + | n = maxlevel | ||
| + | | ||
| + | GOTO 120 | ||
| + | END IF | ||
| + | w(n) = value | ||
| + | ELSE IF (desc.EQ.22045.OR. | ||
| + | | ||
| + | | ||
| + | IF (n.GT.0 .AND. n.LE.maxlevel) THEN | ||
| + | t(n) = value | ||
| + | ELSE IF (n.EQ.0 .AND. TW.EQ.rvind) THEN | ||
| + | TW = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.22064.OR. | ||
| + | | ||
| + | IF (n.GT.0 .AND. n.LE.maxlevel) THEN | ||
| + | s(n) = value | ||
| + | ELSE IF (n.EQ.0 .AND. sal.EQ.rvind) THEN | ||
| + | sal = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.22004) THEN ! Direction of current | ||
| + | IF (n.GT.0 .AND. n.LE.maxlevel) THEN | ||
| + | d(n) = value | ||
| + | ELSE IF (n.EQ.0 .AND. verbose.GT.1) THEN | ||
| + | WRITE(*,*) 'Find 22004 (dc) before first 7062 (zz)!' | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.22031) THEN ! Speed of current | ||
| + | IF (n.GT.0 .AND. n.LE.maxlevel) THEN | ||
| + | v(n) = value | ||
| + | ELSE IF (n.EQ.0 .AND. verbose.GT.1) THEN | ||
| + | WRITE(*,*) 'Find 22031 (vc) before first 7062 (zz)!' | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.22062) THEN ! Salinity [part per thousand] | ||
| + | IF (n.GT.0 .AND. n.LE.maxlevel) THEN | ||
| + | s(n) = value | ||
| + | ELSE IF (n.EQ.0 .AND. sal.EQ.rvind) THEN | ||
| + | sal = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.22011) THEN ! Period of waves (BUFR doesn' | ||
| + | IF (PW.EQ.rvind) THEN | ||
| + | PW = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.22021) THEN ! Heigth of waves (BUFR doesn' | ||
| + | IF (HW.EQ.rvind) THEN | ||
| + | HW = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.1005) THEN ! Buoy/ | ||
| + | IF (buoy_id.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.1003) THEN ! WMO region number/ | ||
| + | IF (wmo_region_number.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.1020) THEN ! WMO region sub-area | ||
| + | IF (wmo_region_subarea.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.1011) THEN ! Ship or mobile land station identifier | ||
| + | IF (value.NE.rvind) THEN | ||
| + | cidx = int(value/ | ||
| + | | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.1087) THEN ! WMO marine observing platform extended identifier | ||
| + | IF (buoy_id.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | END IF | ||
| + | END DO | ||
| + | | ||
| + | numlevels = n | ||
| + | |||
| + | IF (rectangle) THEN | ||
| + | IF (longitude.EQ.rvind .OR. latitude.EQ.rvind | ||
| + | | ||
| + | | ||
| + | END IF | ||
| + | |||
| + | IF (buoy_id.NE.rvind.AND.wmo_region_number.NE.rvind | ||
| + | | ||
| + | | ||
| + | IF (buoy_id.LT.1000) THEN | ||
| + | WRITE(*,' | ||
| + | | ||
| + | | ||
| + | C This is an error in encoding. We choose to show buoy_id only (and | ||
| + | C in all cases I have seen of this error, first 2 digits of buoy_id | ||
| + | C is wmo_region_number and wmo_region_subarea respectively). | ||
| + | IF (buoy_id.LT.10000) THEN | ||
| + | | ||
| + | ELSE IF (buoy_id.LT.100000) THEN | ||
| + | | ||
| + | ELSE IF (buoy_id.LT.1000000) THEN | ||
| + | | ||
| + | ELSE | ||
| + | | ||
| + | END IF | ||
| + | END IF | ||
| + | ELSE IF (buoy_id.NE.rvind.AND.buoy_id.GT.1000) THEN | ||
| + | C Old drau files (wrongly) includes wmo_region_number and | ||
| + | C | ||
| + | | ||
| + | IF (buoy_id.LT.10000) THEN ! 001005 | ||
| + | WRITE(*,' | ||
| + | | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | ELSE IF (call_sign.NE.missing9) THEN | ||
| + | ind = index(call_sign,' | ||
| + | IF (ind.EQ.-1) ind = 9 | ||
| + | C | ||
| + | C | ||
| + | DO WHILE (IACHAR(call_sign(ind: | ||
| + | ind = ind - 1 | ||
| + | END DO | ||
| + | | ||
| + | | ||
| + | | ||
| + | ELSE | ||
| + | IF (verbose .GT. 1) THEN | ||
| + | WRITE(*, | ||
| + | WRITE(*,*) 'Both buoy_id and call_sign are missing!!!' | ||
| + | END IF | ||
| + | | ||
| + | END IF | ||
| + | |||
| + | IF (year.NE.rvind.AND.month.NE.rvind.AND.day.NE.rvind | ||
| + | | ||
| + | | ||
| + | | ||
| + | | ||
| + | ELSE | ||
| + | IF (verbose .GT. 1) THEN | ||
| + | WRITE(*,*) ' | ||
| + | RETURN | ||
| + | END IF | ||
| + | ENDIF | ||
| + | IF (longitude.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (latitude.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (PW.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (HW.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (TW.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (sal.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | |||
| + | DO n=1, | ||
| + | C Do not print level if empty (might happen with last levels in | ||
| + | C | ||
| + | C | ||
| + | C not quite uncommon) | ||
| + | IF (z(n).EQ.rvind .AND. t(n).EQ.rvind .AND. s(n).EQ.rvind | ||
| + | | ||
| + | | ||
| + | CYCLE | ||
| + | END IF | ||
| + | | ||
| + | IF (z(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | IF (w(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | IF (t(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | IF (s(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | IF (d(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | IF (v(n).NE.rvind) THEN | ||
| + | WRITE(*,' | ||
| + | END IF | ||
| + | END DO | ||
| + | |||
| + | END SUBROUTINE print_oceanographic_values | ||
| + | |||
| + | C | ||
| + | |||
| + | SUBROUTINE print_amdar_values(ksub, | ||
| + | | ||
| + | C | ||
| + | IMPLICIT NONE | ||
| + | |||
| + | INTEGER ksub ! Input: number of subset currently processed | ||
| + | INTEGER kxelem | ||
| + | INTEGER ktdexl | ||
| + | INTEGER ktdexp(*) | ||
| + | REAL*8 values(*) | ||
| + | CHARACTER*80 cvals(*) | ||
| + | LOGICAL rectangle | ||
| + | INTEGER verbose | ||
| + | |||
| + | REAL*8 rvind ! missing value for real*8 data | ||
| + | PARAMETER (rvind=1.7E38) | ||
| + | |||
| + | CHARACTER*8 aircraft, | ||
| + | C | ||
| + | REAL*8 DD, | ||
| + | C Other parameters | ||
| + | | ||
| + | | ||
| + | CHARACTER*3 cphase, | ||
| + | INTEGER idx, | ||
| + | CHARACTER one_bits | ||
| + | REAL*8 value | ||
| + | INTEGER desc | ||
| + | |||
| + | C | ||
| + | C | ||
| + | REAL*8 x1, | ||
| + | COMMON | ||
| + | |||
| + | C | ||
| + | INTEGER lenstr | ||
| + | CHARACTER*8 ctrim ! length must be >= longest variable ctrim is used for | ||
| + | CHARACTER*3 phase_8004, | ||
| + | |||
| + | one_bits = CHAR(255) | ||
| + | WRITE(missing3,' | ||
| + | WRITE(missing8,' | ||
| + | + one_bits, | ||
| + | |||
| + | C | ||
| + | | ||
| + | flight_number = missing8 | ||
| + | cphase = missing3 | ||
| + | osn = rvind | ||
| + | DD = rvind | ||
| + | FF = rvind | ||
| + | TT = rvind | ||
| + | PP = rvind | ||
| + | year = rvind | ||
| + | month = rvind | ||
| + | day = rvind | ||
| + | hour = rvind | ||
| + | minute = rvind | ||
| + | second = rvind | ||
| + | latitude = rvind | ||
| + | longitude = rvind | ||
| + | flight_level = rvind | ||
| + | phase = rvind | ||
| + | mixing_ratio = rvind | ||
| + | |||
| + | C Loop through all expanded descriptors | ||
| + | DO idx=1, | ||
| + | desc = ktdexp(idx) | ||
| + | value = values(idx + (ksub-1)*kxelem) | ||
| + | |||
| + | IF (ABS(value - rvind)/ | ||
| + | C | ||
| + | CYCLE | ||
| + | END IF | ||
| + | |||
| + | C | ||
| + | IF (desc.EQ.1008) THEN ! Aircraft registration number or other identification | ||
| + | cidx = int(value/ | ||
| + | aircraft = cvals(cidx) ! CCITTIA5 data | ||
| + | aircraft = ctrim(aircraft, | ||
| + | ELSE IF (desc.EQ.1006) THEN ! Aircraft flight number | ||
| + | cidx = int(value/ | ||
| + | flight_number = cvals(cidx) ! CCITTIA5 data | ||
| + | flight_number = ctrim(flight_number, | ||
| + | ELSE IF (desc.EQ.1023) THEN ! Observation sequence number | ||
| + | IF (osn.EQ.rvind) osn = value | ||
| + | ELSE IF (desc.EQ.4001) THEN ! Year | ||
| + | IF (year.EQ.rvind) THEN | ||
| + | year = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.4002) THEN ! Month | ||
| + | IF (month.EQ.rvind) THEN | ||
| + | month = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.4003) THEN ! Day | ||
| + | IF (day.EQ.rvind) THEN | ||
| + | day = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.4004) THEN ! Hour | ||
| + | IF (hour.EQ.rvind) THEN | ||
| + | hour = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.4005) THEN ! Minute | ||
| + | IF (minute.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.4006) THEN ! Second | ||
| + | IF (second.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.5001.OR. | ||
| + | | ||
| + | IF (latitude.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.6001.OR. | ||
| + | | ||
| + | IF (longitude.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.7010.OR. | ||
| + | | ||
| + | | ||
| + | IF (flight_level.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.8009.OR. | ||
| + | | ||
| + | IF (phase.EQ.rvind) THEN | ||
| + | phase = value | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.8004) THEN ! Phase of aircraft flight | ||
| + | IF (phase.EQ.rvind) THEN | ||
| + | phase = value | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.12104.OR. ! Dry bulb temperature at 2m (data width 16 bits) | ||
| + | | ||
| + | | ||
| + | | ||
| + | IF (TT.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.11011.OR. | ||
| + | | ||
| + | IF (DD.EQ.rvind) THEN | ||
| + | DD = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.11012.OR. | ||
| + | | ||
| + | IF (FF.EQ.rvind) THEN | ||
| + | FF = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.7004) THEN ! Pressure | ||
| + | IF (PP.EQ.rvind) THEN | ||
| + | PP = value | ||
| + | END IF | ||
| + | ELSE IF (desc.EQ.13002) THEN ! Mixing ratio | ||
| + | IF (mixing_ratio.EQ.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | END IF | ||
| + | END DO | ||
| + | |||
| + | IF (rectangle) THEN | ||
| + | IF (longitude.EQ.rvind .OR. latitude.EQ.rvind | ||
| + | | ||
| + | | ||
| + | END IF | ||
| + | |||
| + | IF (aircraft.NE.missing8) THEN | ||
| + | | ||
| + | | ||
| + | ELSE IF (flight_number.NE.missing8) THEN | ||
| + | | ||
| + | | ||
| + | | ||
| + | ELSE | ||
| + | IF (verbose .GT. 1) THEN | ||
| + | WRITE(*, | ||
| + | WRITE(*,*) ' | ||
| + | END IF | ||
| + | | ||
| + | END IF | ||
| + | |||
| + | | ||
| + | | ||
| + | |||
| + | IF (year.NE.rvind.AND.month.NE.rvind.AND.day.NE.rvind | ||
| + | | ||
| + | IF (second.NE.rvind) THEN | ||
| + | WRITE(*, | ||
| + | | ||
| + | | ||
| + | WRITE(*, | ||
| + | | ||
| + | END IF | ||
| + | ELSE IF (verbose .GT. 1) THEN | ||
| + | | ||
| + | | ||
| + | END IF | ||
| + | IF (longitude.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (latitude.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (osn.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (flight_level.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (phase.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (DD.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (FF.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (TT.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (PP.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | IF (mixing_ratio.NE.rvind) THEN | ||
| + | | ||
| + | END IF | ||
| + | |||
| + | END SUBROUTINE print_amdar_values | ||
| + | |||
| + | C | ||
| + | |||
| + | C | ||
| + | C | ||
| + | CHARACTER*(*) FUNCTION ctrim(string, | ||
| + | IMPLICIT NONE | ||
| + | CHARACTER*(*) string, | ||
| + | INTEGER dim, | ||
| + | |||
| + | ind = dim | ||
| + | ascii = IACHAR(string(ind: | ||
| + | DO WHILE (ind.GT.1 .AND. (ascii.EQ.32 .OR. ascii.EQ.0)) | ||
| + | ind = ind - 1 | ||
| + | ascii = IACHAR(string(ind: | ||
| + | END DO | ||
| + | IF (ind.EQ.1) THEN | ||
| + | ascii = IACHAR(string(1: | ||
| + | IF (ascii.EQ.32 .OR. ascii.EQ.0) THEN | ||
| + | ctrim = missing | ||
| + | | ||
| + | ctrim = string(1: | ||
| + | END IF | ||
| + | ELSE IF (ind.GT.1) THEN | ||
| + | ctrim = string(1: | ||
| + | ELSE | ||
| + | ctrim = missing | ||
| + | END IF | ||
| + | |||
| + | RETURN | ||
| + | END FUNCTION ctrim | ||
| + | |||
| + | |||
| + | C | ||
| + | |||
| + | CHARACTER*3 FUNCTION phase_8004(phase, | ||
| + | IMPLICIT NONE | ||
| + | INTEGER phase | ||
| + | CHARACTER*3 missing3, | ||
| + | |||
| + | DATA indicator/' | ||
| + | C 1 | ||
| + | |||
| + | IF (phase.LE.1 .OR. phase.GT.6) THEN | ||
| + | | ||
| + | ELSE | ||
| + | | ||
| + | END IF | ||
| + | |||
| + | RETURN | ||
| + | END FUNCTION phase_8004 | ||
| + | |||
| + | C | ||
| + | |||
| + | CHARACTER*3 FUNCTION phase_8009(phase, | ||
| + | IMPLICIT NONE | ||
| + | INTEGER phase | ||
| + | CHARACTER*3 missing3, | ||
| + | |||
| + | C 0 | ||
| + | DATA indicator/' | ||
| + | + 4*' | ||
| + | C 7-10 11-14 | ||
| + | |||
| + | IF (phase.LE.0 .OR. phase.GT.14) THEN | ||
| + | | ||
| ELSE | ELSE | ||
| - | HSHS=89 | + | phase_8009 |
| END IF | END IF | ||
| - | HStoWMO_HSHS = HSHS | ||
| RETURN | RETURN | ||
| - | END FUNCTION | + | END FUNCTION |
| C | C | ||
| Line 2045: | Line 3293: | ||
| IF (NN.EQ.0) THEN | IF (NN.EQ.0) THEN | ||
| N = 0 | N = 0 | ||
| - | ELSE IF (NN.LE.10) THEN ! 1/10 or less | + | ELSE IF (NN.LE.15) THEN ! 1/10 or less |
| N = 1 | N = 1 | ||
| ELSE IF (NN.LE.30) THEN ! 2/10 - 3/10 | ELSE IF (NN.LE.30) THEN ! 2/10 - 3/10 | ||
| Line 2162: | Line 3410: | ||
| significance = ' | significance = ' | ||
| jj = 8 | jj = 8 | ||
| - | IF (btest(vss, | + | IF (btest(vss, |
| | | ||
| jj = jj-1 | jj = jj-1 | ||
| Line 2196: | Line 3444: | ||
| END SUBROUTINE vss_8042 | END SUBROUTINE vss_8042 | ||
| - | | + | |
| C | C | ||
| Line 2232: | Line 3480: | ||
| c | c | ||
| character*(*) text | character*(*) text | ||
| - | integer | + | integer |
| c | c | ||
| lt=len(text) | lt=len(text) | ||
| Line 2246: | Line 3494: | ||
| return | return | ||
| end | end | ||
| - | </file> | + | </code> |
| + | <code fortran comfilter.f> | ||
| + | C (C) Copyright 2010, met.no | ||
| + | C | ||
| + | C This program is free software; you can redistribute it and/or modify | ||
| + | C it under the terms of the GNU General Public License as published by | ||
| + | C the Free Software Foundation; either version 2 of the License, or | ||
| + | C (at your option) any later version. | ||
| + | C | ||
| + | C This program is distributed in the hope that it will be useful, but | ||
| + | C WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| + | C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| + | C General Public License for more details. | ||
| + | C | ||
| + | C You should have received a copy of the GNU General Public License | ||
| + | C along with this program; if not, write to the Free Software | ||
| + | C Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | ||
| + | C 02110-1301, USA. | ||
| + | |||
| + | C | ||
| + | C in bufrread or bufrdump) | ||
| + | |||
| + | INTEGER dim1_fid, dim2_fid, dim_fiv | ||
| + | PARAMETER (dim1_fid=10, | ||
| + | |||
| + | INTEGER fid(1: | ||
| + | ! filter descriptors arrays. fid(i,j) is descriptor | ||
| + | ! j in filter criterium i | ||
| + | CHARACTER*10 fidformat(1: | ||
| + | ! filter descriptor format (I2.2, A9 etc) | ||
| + | ! for fid(i,j) | ||
| + | INTEGER nd_fid(1: | ||
| + | ! (max value of j for fid(i,j)) | ||
| + | INTEGER nvl_fid(1: | ||
| + | ! values described by filter descriptor line i | ||
| + | INTEGER nfidlines | ||
| + | ! (max value of i for fid(i,j)) | ||
| + | |||
| + | INTEGER fivI(1: | ||
| + | CHARACTER*32 fivC(1: | ||
| + | |||
| + | INTEGER nfivlines | ||
| + | |||
| + | COMMON / | ||
| + | |||
| + | COMMON / | ||
| + | </code> | ||