diff --git a/io/bufr/ropp2bufr_mod.f90 b/io/bufr/ropp2bufr_mod.f90 index f022f6f..65ee5ea 100644 --- a/io/bufr/ropp2bufr_mod.f90 +++ b/io/bufr/ropp2bufr_mod.f90 @@ -872,7 +872,7 @@ SUBROUTINE ConvertROPPtoBUFR ( ROdata, & ! (in) ROdata%Lev1b%Npoints = 0 END IF - Values(IE+1) = ROdata%Lev1b%Npoints ! [031002] Replication factor + Values(IE+1) = ROdata%Lev1b%Npoints ! [031002] Replication factor nRepFac = nRepFac + 1 RepFac(nRepFac) = NINT(Values(IE+1)) @@ -880,17 +880,17 @@ SUBROUTINE ConvertROPPtoBUFR ( ROdata, & ! (in) ! Coordinates - Values(IE+2) = REAL(ROdata%Lev1b%Lat_tp(in)) ! [005001] Latitude (deg) + Values(IE+2) = REAL(ROdata%Lev1b%Lat_tp(in)) ! [005001] Latitude (deg) IF ( ABS(Values(IE+2)) > 90.0 ) & Values(IE+2) = MISSING - Values(IE+3) = REAL(ROdata%Lev1b%Lon_tp(in)) ! [006001] Longitude (deg) + Values(IE+3) = REAL(ROdata%Lev1b%Lon_tp(in)) ! [006001] Longitude (deg) IF ( Values(IE+3) > 180.0 ) & Values(IE+3) = Values(IE+3) - 360.0 IF ( ABS(Values(IE+3)) > 180.0 ) & Values(IE+3) = MISSING - Values(IE+4) = REAL(ROdata%Lev1b%Azimuth_tp(in)) ! [005021] Line of sight bearing (degT) + Values(IE+4) = REAL(ROdata%Lev1b%Azimuth_tp(in)) ! [005021] Line of sight bearing (degT) IF ( Values(IE+4) < 0.0 .OR. & Values(IE+4) >= 360.0 ) & Values(IE+4) = MISSING @@ -899,84 +899,84 @@ SUBROUTINE ConvertROPPtoBUFR ( ROdata, & ! (in) nRepFac = nRepFac + 1 IF ( CorrOnly ) THEN - Values(IE+5) = 1 ! [031001] Replication factor + Values(IE+5) = 1 ! [031001] Replication factor IE = IE - 12 RepFac(nRepFac) = 1 ELSE - Values(IE+5) = 3 ! [031001] Replication factor + Values(IE+5) = 3 ! [031001] Replication factor RepFac(nRepFac) = 3 ! L1 data - Values(IE+6) = FreqL1 ! [002121] L1=1.5Ghz + Values(IE+6) = FreqL1 ! [002121] L1=1.5Ghz - Values(IE+7) = REAL(ROdata%Lev1b%Impact_L1(in)) ! [007040] Impact parameter (m) + Values(IE+7) = REAL(ROdata%Lev1b%Impact_L1(in), KIND=dp) ! [007040] Impact parameter (m) IF ( Values(IE+7) < 6200000.0_dp .OR. & Values(IE+7) > 6600000.0_dp ) & Values(IE+7) = MISSING - Values(IE+8) = REAL(ROdata%Lev1b%BAngle_L1(in)) ! [015037] B/angle (rad) + Values(IE+8) = REAL(ROdata%Lev1b%BAngle_L1(in)) ! [015037] B/angle (rad) IF ( Values(IE+8) < -0.001 .OR. & Values(IE+8) > 0.08288 ) & Values(IE+8) = MISSING - Values(IE+9) = FOstats ! [008023] 1st order stats (rms) + Values(IE+9) = FOstats ! [008023] 1st order stats (rms) - Values(IE+10) = REAL(ROdata%Lev1b%BAngle_L1_Sigma(in)) ! [015037] B/angle error (rad) + Values(IE+10) = REAL(ROdata%Lev1b%BAngle_L1_Sigma(in)) ! [015037] B/angle error (rad) IF ( Values(IE+10) < 0.0 .OR. & - Values(IE+10) > 0.009485 ) & ! 1/8 (-3 bits) from 015037 + Values(IE+10) > 0.009485 ) & ! 1/8 (-3 bits) from 015037 Values(IE+10) = MISSING - Values(IE+11) = MISSING ! [008023] 1st order stats (off) + Values(IE+11) = MISSING ! [008023] 1st order stats (off) ! L2 data - Values(IE+12) = FreqL2 ! [002121] L2=1.2Ghz + Values(IE+12) = FreqL2 ! [002121] L2=1.2Ghz - Values(IE+13) = REAL(ROdata%Lev1b%Impact_L2(in)) ! [007040] Impact parameter (m) + Values(IE+13) = REAL(ROdata%Lev1b%Impact_L2(in), KIND=dp) ! [007040] Impact parameter (m) IF ( Values(IE+13) < 6200000.0_dp .OR. & Values(IE+13) > 6600000.0_dp ) & Values(IE+13) = MISSING - Values(IE+14) = REAL(ROdata%Lev1b%BAngle_L2(in)) ! [015037] B/angle (rad) + Values(IE+14) = REAL(ROdata%Lev1b%BAngle_L2(in)) ! [015037] B/angle (rad) IF ( Values(IE+14) < -0.001 .OR. & Values(IE+14) > 0.08288 ) & Values(IE+14) = MISSING - Values(IE+15) = FOstats ! [008023] 1st order stats (rms) + Values(IE+15) = FOstats ! [008023] 1st order stats (rms) - Values(IE+16) = REAL(ROdata%Lev1b%BAngle_L2_Sigma(in)) ! [015037] B/angle error (rad) + Values(IE+16) = REAL(ROdata%Lev1b%BAngle_L2_Sigma(in)) ! [015037] B/angle error (rad) IF ( Values(IE+16) < 0.0 .OR. & - Values(IE+16) > 0.009485 ) & ! 1/8 (-3 bits) from 015037 + Values(IE+16) > 0.009485 ) & ! 1/8 (-3 bits) from 015037 Values(IE+16) = MISSING - Values(IE+17) = MISSING ! [008023] 1st order stats (off) + Values(IE+17) = MISSING ! [008023] 1st order stats (off) END IF ! Corrected bending angle (always encoded) - Values(IE+18) = FreqLc ! [002121] corrected + Values(IE+18) = FreqLc ! [002121] corrected - Values(IE+19) = REAL(ROdata%Lev1b%Impact(in)) ! [007040] Impact parameter (m) + Values(IE+19) = REAL(ROdata%Lev1b%Impact(in), KIND=dp) ! [007040] Impact parameter (m) IF ( Values(IE+19) < 6200000.0_dp .OR. & Values(IE+19) > 6600000.0_dp ) & Values(IE+19) = MISSING - Values(IE+20) = REAL(ROdata%Lev1b%BAngle(in)) ! [015037] B/Ang (rad) + Values(IE+20) = REAL(ROdata%Lev1b%BAngle(in)) ! [015037] B/Ang (rad) IF ( Values(IE+20) < -0.001 .OR. & Values(IE+20) > 0.08288 ) & Values(IE+20) = MISSING - Values(IE+21) = FOstats ! [008023] 1st order stats (rms) + Values(IE+21) = FOstats ! [008023] 1st order stats (rms) - Values(IE+22) = REAL(ROdata%Lev1b%BAngle_Sigma(in)) ! [015037] Error in B/Ang (rad) + Values(IE+22) = REAL(ROdata%Lev1b%BAngle_Sigma(in)) ! [015037] Error in B/Ang (rad) IF ( Values(IE+22) < 0.0 .OR. & - Values(IE+22) > 0.009485 ) & ! 1/8 (-3 bits) from 015037 + Values(IE+22) > 0.009485 ) & ! 1/8 (-3 bits) from 015037 Values(IE+22) = MISSING - Values(IE+23) = MISSING ! [008023] 1st order stats (off) + Values(IE+23) = MISSING ! [008023] 1st order stats (off) - Values(IE+24) = REAL(ROdata%Lev1b%Bangle_Qual(in)) ! [033007] Percent confidence + Values(IE+24) = REAL(ROdata%Lev1b%Bangle_Qual(in)) ! [033007] Percent confidence IF ( Values(IE+24) < 0.0 .OR. & Values(IE+24) > 100.0 ) & Values(IE+24) = MISSING diff --git a/io/ropp/ropp_io_read_ncdf_get.f90 b/io/ropp/ropp_io_read_ncdf_get.f90 index 11b09e9..d7a145a 100644 --- a/io/ropp/ropp_io_read_ncdf_get.f90 +++ b/io/ropp/ropp_io_read_ncdf_get.f90 @@ -1697,8 +1697,10 @@ CONTAINS CALL ncdf_getatt('occulting_sat_id', readint) WRITE(data%gns_id,'(A1,I3.3)') 'G', readint readstr = ' ' - CALL ncdf_getatt('fiducial_id', readstr) - IF(readstr /= " ") data%stn_id = readstr(1:4) + IF (ncdf_isatt('fiducial_id')) THEN + CALL ncdf_getatt('fiducial_id', readstr) + IF(readstr /= " ") data%stn_id = readstr(1:4) + ENDIF ! 6.4 Overall quality ! ------------------- @@ -1819,20 +1821,23 @@ CONTAINS CALL ncdf_getvar('Bend_ang', data%Lev1b%bangle) data%Lev1b%units%bangle = "radians" - CALL ncdf_getvar('Opt_bend_ang', data%Lev1b%bangle_opt) - CALL ncdf_getvar('Bend_ang_stdv', data%Lev1b%bangle_sigma) data%Lev1b%units%bangle_sigma = "radians" data%Lev1b%bangle_opt_sigma = data%Lev1b%bangle_sigma ! set the quality for bangle - CALL ncdf_getatt('_FillValue', readreal, 'Opt_bend_ang') +! CALL ncdf_getatt('_FillValue', readreal, 'Opt_bend_ang') ! idx => WHERE( data%Lev1b%bangle > readreal, nidx) ! IF (nidx > 0) data%Lev1b%bangle_qual(idx) = 100.0 WHERE (data%Lev1b%bangle > readreal) & data%Lev1b%bangle_qual = 100.0 - data%Lev1b%bangle_opt_qual = data%Lev1b%bangle_qual + + IF (ncdf_isvar('Opt_bend_ang')) THEN + CALL ncdf_getvar('Opt_bend_ang', data%Lev1b%bangle_opt) + CALL ncdf_getatt('_FillValue', readreal, 'Opt_bend_ang') + data%Lev1b%bangle_opt_qual = data%Lev1b%bangle_qual + ENDIF ENDIF @@ -2268,8 +2273,8 @@ CONTAINS REAL(wp), DIMENSION(:), ALLOCATABLE :: rs_phase_l1_iq ! I/Q contribution Integer, DIMENSION(:), ALLOCATABLE :: tracking_state ! Tracking state - INTEGER :: n, n_cl, n_rs, first_valid, j - INTEGER :: readint, readint2 + INTEGER :: n, n_cl, n_rs, first_valid, i, j + INTEGER :: readint, readint2, readint3 REAL(EightByteReal) :: readreal, readreal2, ts, ts1 CHARACTER (len = 256) :: readstr, readstr2 @@ -2334,11 +2339,9 @@ CONTAINS data%overall_qual = 100.0_wp * readbyte1 data%units%overall_qual = '%' - ! open or closed loop data setting - CALL ncdf_getvar(TRIM(tdir)//'rs_data_available', readbyte1) - CALL ncdf_getvar(TRIM(tdir)//'ol_data_available', readbyte2) -! IF ((readbyte1) .OR. (readbyte2)) data%PCD = IBSET(data%PCD, PCD_open_loop) - right now we only us RS, not OL - IF ((readbyte1 /= 0) .OR. (readbyte2 /= 0)) data%PCD = IBSET(data%PCD, PCD_open_loop) + ! open loop data used? + CALL ncdf_getvar(TRIM(tdir)//'ol_data_used', readbyte1) + IF (readbyte1 /= 0) data%PCD = IBSET(data%PCD, PCD_open_loop) ! setting or rising CALL ncdf_getatt(TRIM(sdir)//'occultation/occultation_type', readstr) @@ -2351,6 +2354,14 @@ CONTAINS IF ((readbyte1 == 0) .AND. (readbyte2 == 0) .AND. (readbyte3 == 0)) & data%PCD = IBSET(data%PCD, PCD_phase) + ! NRT or offline processing? + CALL ncdf_getatt('environment', readstr) + IF (TRIM(readstr) == 'Operational' .OR. & + TRIM(readstr) == 'Validation') THEN + data%PCD = IBCLR(data%PCD, PCD_offline) + ELSE + data%PCD = IBSET(data%PCD, PCD_offline) + ENDIF ! 9.5 Date and time ! ----------------- @@ -2940,6 +2951,8 @@ CONTAINS ENDIF ! Software version is the ROPP software version, in the format 'vnn.mmm'. + ! The last digit of the fractional part (mmm) is reserved for indicating + ! the bending angle processing method in case of bufr encoding. ! At ROPP8.0, a new variable, 'processing_software', has been introduced, ! which can hold information about other software - in this case, the EUM ! processing code that generated the data in the first place. @@ -2947,8 +2960,36 @@ CONTAINS data%software_version = ' ' ; readstr = ' ' ; readstr2 = ' ' CALL ncdf_getatt('/status/processing/processor_name' , readstr) - - CALL ncdf_getatt('/status/processing/processor_version' ,readstr2) + CALL ncdf_getatt('/status/processing/processor_version' , readstr2) + + i = SCAN(readstr2, ".", .FALSE.) + j = SCAN(readstr2, ".", .TRUE.) + + IF (i < 2) THEN + CALL message(msg_warn, "Processor version cannot be decoded") + ELSE + IF (i == j) THEN + j = LEN_TRIM(readstr2) + 1 + READ(readstr2(1:i-1), FMT=*) readint + READ(readstr2(i+1:j-1), FMT=*) readint2 + ELSE + READ(readstr2(1:i-1), FMT=*) readint + READ(readstr2(i+1:j-1), FMT=*) readint2 + ENDIF + IF (getbufr) THEN + SELECT CASE (TRIM(data%bangle_method)) + CASE ("FSI") + readint3 = 1 + CASE ("GO") + readint3 = 0 + CASE DEFAULT + readint3 = 9 + END SELECT + WRITE(data%software_version, '("v",i2.2,".",i2.2,i1)') readint, readint2, readint3 + ELSE + WRITE(data%software_version, '("v",i2.2,".",i2.2)') readint, readint2 + ENDIF + ENDIF data%processing_software = TRIM(readstr) // ' ' // TRIM(readstr2)