| 1 | ! $Id: convertcodes.f90 5560 2018-08-07 08:03:52Z idculv $
|
|---|
| 2 |
|
|---|
| 3 | SUBROUTINE ConvertCodes ( ROdata, & ! (inout)
|
|---|
| 4 | Gclass, & ! (inout)
|
|---|
| 5 | Gcode, & ! (inout)
|
|---|
| 6 | Lcode, & ! (inout)
|
|---|
| 7 | Icode, & ! (inout)
|
|---|
| 8 | Ocode, & ! (inout)
|
|---|
| 9 | Scode, & ! (inout)
|
|---|
| 10 | Ccode, & ! (inout)
|
|---|
| 11 | Bcode, & ! (inout)
|
|---|
| 12 | ind ) ! (in)
|
|---|
| 13 |
|
|---|
| 14 | !****s* ropp2bufr/ConvertCodes *
|
|---|
| 15 | !
|
|---|
| 16 | ! NAME
|
|---|
| 17 | ! ConvertCodes
|
|---|
| 18 | !
|
|---|
| 19 | ! SYNOPSIS
|
|---|
| 20 | ! Convert header codes between ROPP and BUFR
|
|---|
| 21 | !
|
|---|
| 22 | ! USE ropp_io_types
|
|---|
| 23 | ! TYPE (roprof) rodata
|
|---|
| 24 | ! INTEGER :: gclass,gcode,lcode,icode,ocode,scode,bcode,ind
|
|---|
| 25 | ! CHARACTER (LEN=4) :: ccode
|
|---|
| 26 | ! ind = 1 ! to convert ROPP-->BUFR, ind = -1 for BUFR-->ROPP
|
|---|
| 27 | ! CALL convertcodes(rodata,&
|
|---|
| 28 | ! gclass,gcode,lcode,icode,ocode,scode,ccode,bcode,&
|
|---|
| 29 | ! ind)
|
|---|
| 30 | !
|
|---|
| 31 | ! INPUTS
|
|---|
| 32 | ! ROdata dtyp RO data structure [ind>0]
|
|---|
| 33 | ! Gclass int GNSS code (Satellite Class) [ind<=0]
|
|---|
| 34 | ! Gcode int GNSS PRN (Platform Tx ID) [ind<=0]
|
|---|
| 35 | ! Lcode int LEO code (Satellite ID) [ind<=0]
|
|---|
| 36 | ! Icode int Instrument code (Instrument ID) [ind<=0]
|
|---|
| 37 | ! Ocode int Originating (processing) Centre code [ind<=0]
|
|---|
| 38 | ! Scode int Originating Sub-centre code [ind<=0]
|
|---|
| 39 | ! Ccode chr Originating (GTS) centre ICAO code [ind<=0]
|
|---|
| 40 | ! Bcode int Background generating centre code [ind<=0]
|
|---|
| 41 | ! ind int ROPP-->BUFR if >0, else BUFR-->ROPP
|
|---|
| 42 | !
|
|---|
| 43 | ! OUTPUTS
|
|---|
| 44 | ! ROdata dtyp RO data structure [ind<=0]
|
|---|
| 45 | ! Gclass int GNSS code (Satellite Class) [ind>0]
|
|---|
| 46 | ! Gcode int GNSS PRN (Platform Tx ID) [ind>0]
|
|---|
| 47 | ! Lcode int LEO code (Satellite ID) [ind>0]
|
|---|
| 48 | ! Icode int Instrument code (Instrument ID) [ind>0]
|
|---|
| 49 | ! Ocode int Originating (processing) Centre code [ind>0]
|
|---|
| 50 | ! Scode int Originating Sub-centre code [ind>0]
|
|---|
| 51 | ! Ccode chr Originating (GTS) centre ICAO code [ind>0]
|
|---|
| 52 | ! Bcode int Background generating centre code [ind>0]
|
|---|
| 53 | !
|
|---|
| 54 | ! MODULES
|
|---|
| 55 | ! messages - ROPP message library
|
|---|
| 56 | ! ropp_utils - ROPP utilities
|
|---|
| 57 | ! ropp_io - ROPP file I/O support
|
|---|
| 58 | !
|
|---|
| 59 | ! CALLS
|
|---|
| 60 | ! GETENV
|
|---|
| 61 | ! Get_IO_Unit
|
|---|
| 62 | ! message
|
|---|
| 63 | ! message_get_routine
|
|---|
| 64 | ! message_set_routine
|
|---|
| 65 | !
|
|---|
| 66 | ! CALLED BY
|
|---|
| 67 | ! ConvertBUFRtoROPP
|
|---|
| 68 | ! ConvertROPPtoBUFR
|
|---|
| 69 | !
|
|---|
| 70 | ! FILES
|
|---|
| 71 | ! roppbufrcodes.nl - in path BUFR_TABLES, BUFR_LIBRARY or PWD
|
|---|
| 72 | !
|
|---|
| 73 | ! ENVIRONMENT
|
|---|
| 74 | ! BUFR_LIBRARY - when using MetDB BUFR library
|
|---|
| 75 | ! BUFR_TABLES - when using ECMWF BUFR library
|
|---|
| 76 | !
|
|---|
| 77 | ! DESCRIPTION
|
|---|
| 78 | ! Converts from character-based codes (as defined for ROPP) to numeric codes
|
|---|
| 79 | ! suitable for BUFR encoding, if ind>0, else vice-versa.
|
|---|
| 80 | ! The code conversion is driven by a set of look-up tables, which are read
|
|---|
| 81 | ! from a NAMELIST file 'roppbufrcodes.nl' which is expected in the directory
|
|---|
| 82 | ! path defined by at least one of the environment variables BUFR_TABLES
|
|---|
| 83 | ! (ECMWF), BUFR_LIBRARY (MetDB) or PWD (searched in that order).
|
|---|
| 84 | ! If this file cannot be found or opened, a warning is issued and an in-built
|
|---|
| 85 | ! default set of tables is used instead.
|
|---|
| 86 | !
|
|---|
| 87 | ! REFERENCES
|
|---|
| 88 | ! 1. Manual on Codes: International Codes, Part B & Part C.
|
|---|
| 89 | ! WMO-No. 306, World Meteorological Organisation, Geneva.
|
|---|
| 90 | ! http://www.wmo.int/pages/prog/www/WMOCodes/WMO306_vI2/VolumeI.2.html
|
|---|
| 91 | ! 2. Location Indicators. ICAO Document 7910/138
|
|---|
| 92 | ! ISBN 978-92-9231-677-8, Ed.138, December 2010.
|
|---|
| 93 | !
|
|---|
| 94 | ! AUTHOR
|
|---|
| 95 | ! Met Office, Exeter, UK.
|
|---|
| 96 | ! Any comments on this software should be given via the ROM SAF
|
|---|
| 97 | ! Helpdesk at http://www.romsaf.org
|
|---|
| 98 | !
|
|---|
| 99 | ! COPYRIGHT
|
|---|
| 100 | ! (c) EUMETSAT. All rights reserved.
|
|---|
| 101 | ! For further details please refer to the file COPYRIGHT
|
|---|
| 102 | ! which you should have received as part of this distribution.
|
|---|
| 103 | !
|
|---|
| 104 | !****
|
|---|
| 105 |
|
|---|
| 106 | ! Modules
|
|---|
| 107 |
|
|---|
| 108 | USE messages
|
|---|
| 109 | USE ropp_utils, ONLY: Get_IO_Unit
|
|---|
| 110 | USE ropp_io_types
|
|---|
| 111 |
|
|---|
| 112 | IMPLICIT NONE
|
|---|
| 113 |
|
|---|
| 114 | ! Fixed values
|
|---|
| 115 |
|
|---|
| 116 | INTEGER, PARAMETER :: NVIND = 2147483647 ! Missing data flag value
|
|---|
| 117 |
|
|---|
| 118 | ! NB: no. of elements given in NAMELIST file parameters must not
|
|---|
| 119 | ! exceed these values - increase values below if necessary.
|
|---|
| 120 |
|
|---|
| 121 | INTEGER, PARAMETER :: ntx = 6 ! Max. no. of GNSS Tx types
|
|---|
| 122 | INTEGER, PARAMETER :: nrx = 42 ! Max. no. of LEO Rx types
|
|---|
| 123 | INTEGER, PARAMETER :: noc = 11 ! Max. no. of orig. centre types
|
|---|
| 124 | INTEGER, PARAMETER :: nbg = 11 ! Max. no. of b/g centre types
|
|---|
| 125 |
|
|---|
| 126 | INTEGER, PARAMETER :: nep = 3 ! No. of environment paths
|
|---|
| 127 | CHARACTER (LEN=*), PARAMETER :: NLenv(nep) = (/"BUFR_TABLES ", & ! N/L paths
|
|---|
| 128 | "BUFR_LIBRARY", &
|
|---|
| 129 | "PWD " /)
|
|---|
| 130 | CHARACTER (LEN=*), PARAMETER :: NLdsn = "roppbufrcodes.nl" ! N/L file name
|
|---|
| 131 |
|
|---|
| 132 | ! Argument list parameters
|
|---|
| 133 |
|
|---|
| 134 | TYPE ( ROprof ), INTENT(INOUT) :: Rodata ! ROPP data structure
|
|---|
| 135 | INTEGER, INTENT(INOUT) :: Gclass ! GNSS class value
|
|---|
| 136 | INTEGER, INTENT(INOUT) :: Gcode ! GNSS PRN
|
|---|
| 137 | INTEGER, INTENT(INOUT) :: Lcode ! LEO code value
|
|---|
| 138 | INTEGER, INTENT(INOUT) :: Icode ! Instrument code value
|
|---|
| 139 | INTEGER, INTENT(INOUT) :: Ocode ! Origin. centre code value
|
|---|
| 140 | INTEGER, INTENT(INOUT) :: Scode ! Sub-centre code value
|
|---|
| 141 | CHARACTER (LEN=*), INTENT(INOUT) :: Ccode ! ICAO code
|
|---|
| 142 | INTEGER, INTENT(INOUT) :: Bcode ! B/G generator code value
|
|---|
| 143 | INTEGER, INTENT(IN) :: ind ! RO->code if >1 else code->RO
|
|---|
| 144 |
|
|---|
| 145 | ! Define arrays for chararacter (ROPP) & numeric (BUFR code) lists.
|
|---|
| 146 | ! Set some defaults in case the NAMELISTs can't be read. NAMELIST
|
|---|
| 147 | ! values will overwrite these defaults. Include some dummy spares so
|
|---|
| 148 | ! that extra ones can be defined in the NAMELIST _without_ having to
|
|---|
| 149 | ! change the array sizes (up to the max. values) and rebuilding
|
|---|
| 150 | ! the program.
|
|---|
| 151 |
|
|---|
| 152 | ! Satellite Classification (GNSS Tx constellation) (Code Table 002020)
|
|---|
| 153 |
|
|---|
| 154 | CHARACTER (LEN=1), DIMENSION(ntx) :: GNSlist = &
|
|---|
| 155 | (/ "U", "G", "R", "E", "C", "U" /)
|
|---|
| 156 | INTEGER, DIMENSION(ntx) :: GNScode = &
|
|---|
| 157 | (/ NVIND, 401, 402, 403, 404, NVIND /)
|
|---|
| 158 |
|
|---|
| 159 | ! Satellite Identifier (LEO Rx mission) (Code Table 001007 or CCT C-5)
|
|---|
| 160 | ! and associated Instrument Type (Code Table 002019 or CCT C-8)
|
|---|
| 161 | ! NB: instrument code 104 (Tri-G) for COSMIC-2 and GRACE-FO is provisional
|
|---|
| 162 |
|
|---|
| 163 | CHARACTER (LEN=4), DIMENSION(nrx) :: LEOlist = &
|
|---|
| 164 | (/ "UNKN", "OERS", "CHMP", "SUNS", "SACC", &
|
|---|
| 165 | "GRAA", "GRAB", "GRAC", "GRAD", &
|
|---|
| 166 | "C001", "C002", "C003", &
|
|---|
| 167 | "C004", "C005", "C006", &
|
|---|
| 168 | "META", "METB", "METC", "TSRX", &
|
|---|
| 169 | "TDMX", "PAZE", "OSAT", "CNOF", &
|
|---|
| 170 | "MGTP", "FY3C", "FY3D", "KOM5", &
|
|---|
| 171 | "C2E1", "C2E2", "C2E3", &
|
|---|
| 172 | "C2E4", "C2E5", "C2E6", &
|
|---|
| 173 | "C2P1", "C2P2", "C2P3", &
|
|---|
| 174 | "C2P4", "C2P5", "C2P6", &
|
|---|
| 175 | "UNKN", "UNKN", "UNKN" /)
|
|---|
| 176 | INTEGER, DIMENSION(nrx) :: LEOcode = &
|
|---|
| 177 | (/ NVIND, 040, 041, 800, 820, &
|
|---|
| 178 | 722, 723, 803, 804, &
|
|---|
| 179 | 740, 741, 742, &
|
|---|
| 180 | 743, 744, 745, &
|
|---|
| 181 | 004, 003, 005, 042, &
|
|---|
| 182 | 043, 044, 421, 786, &
|
|---|
| 183 | 440, 522, 523, 825, &
|
|---|
| 184 | 750, 751, 752, &
|
|---|
| 185 | 753, 754, 755, &
|
|---|
| 186 | 724, 725, 726, &
|
|---|
| 187 | 727, 728, 729, &
|
|---|
| 188 | NVIND, NVIND, NVIND /)
|
|---|
| 189 | INTEGER, DIMENSION(nrx) :: Inscode = &
|
|---|
| 190 | (/ NVIND, 102, 102, 102, 102, &
|
|---|
| 191 | 102, 102, 104, 104, &
|
|---|
| 192 | 102, 102, 102, &
|
|---|
| 193 | 102, 102, 102, &
|
|---|
| 194 | 202, 202, 202, 103, &
|
|---|
| 195 | 103, 103, 287, 102, &
|
|---|
| 196 | 287, 958, 958, 103, &
|
|---|
| 197 | 104, 104, 104, &
|
|---|
| 198 | 104, 104, 104, &
|
|---|
| 199 | 104, 104, 104, &
|
|---|
| 200 | 104, 104, 104, &
|
|---|
| 201 | NVIND, NVIND, NVIND /)
|
|---|
| 202 |
|
|---|
| 203 | ! List of (BUFR) Originating Centre IDs & their BUFR codes
|
|---|
| 204 | ! (Code Table 001033, CCT C-1, or 001035, CCT C-11)
|
|---|
| 205 | ! The (Processing) Sub-centre code should be valid for the
|
|---|
| 206 | ! associated Originating Centre code (for which Sub-Centre is 0).
|
|---|
| 207 | ! (Code Table 001034, CCT C-12)
|
|---|
| 208 | ! plus associated ICAO Location Indicator codes (for GTS routing headers)
|
|---|
| 209 | ! (ICAO Document 7910: Location Indicators)
|
|---|
| 210 | ! NB: Origin code 'CMA' for FY-3C/D is provisional
|
|---|
| 211 | ! NB: Origin code 'ISRO' for Megha-Tropiques is provisional
|
|---|
| 212 | !
|
|---|
| 213 | CHARACTER (LEN=8), DIMENSION(noc) :: ORGlist = &
|
|---|
| 214 | (/ "UNKNOWN ", "DMI ", "GFZ ", &
|
|---|
| 215 | "METO ", "UCAR ", &
|
|---|
| 216 | "NESDIS ", "EUMETSAT", &
|
|---|
| 217 | "CMA ", "ISRO ", &
|
|---|
| 218 | "UNKNOWN ", "UNKNOWN " /)
|
|---|
| 219 | INTEGER, DIMENSION(noc) :: ORGcode = &
|
|---|
| 220 | (/ NVIND, 094, 078, &
|
|---|
| 221 | 074, 060, &
|
|---|
| 222 | 160, 254, &
|
|---|
| 223 | 038, 028, &
|
|---|
| 224 | NVIND, NVIND /)
|
|---|
| 225 | INTEGER, DIMENSION(noc) :: Subcode = &
|
|---|
| 226 | (/ NVIND, 000, 173, &
|
|---|
| 227 | 000, 000, &
|
|---|
| 228 | 000, 000, &
|
|---|
| 229 | 000, 000, &
|
|---|
| 230 | 000, 000 /)
|
|---|
| 231 | CHARACTER (LEN=35), DIMENSION(noc) :: ORGname = &
|
|---|
| 232 | (/ " ", &
|
|---|
| 233 | "(ROM SAF) ", &
|
|---|
| 234 | "Helmholtz Centre, Potsdam ", &
|
|---|
| 235 | "Met Office, Exeter ", &
|
|---|
| 236 | "Boulder ", &
|
|---|
| 237 | "Washington ", &
|
|---|
| 238 | "Darmstadt ", &
|
|---|
| 239 | "Beijing ", &
|
|---|
| 240 | "New Delhi ", &
|
|---|
| 241 | " ", &
|
|---|
| 242 | " " /)
|
|---|
| 243 | CHARACTER (LEN=4), DIMENSION(noc) :: ICAOcode = &
|
|---|
| 244 | (/ "ZZZZ", "EKMI", "EDZW", &
|
|---|
| 245 | "EGRR", "KWBC", &
|
|---|
| 246 | "KNES", "EUMS", &
|
|---|
| 247 | "BAWX", "DEMS", &
|
|---|
| 248 | "ZZZZ", "ZZZZ" /)
|
|---|
| 249 |
|
|---|
| 250 | ! Orginating Centre (background profile)
|
|---|
| 251 | ! (Code Table 001033, CCT C-1, or 001035, CCT C-11)
|
|---|
| 252 |
|
|---|
| 253 | CHARACTER (LEN=8), DIMENSION(nbg) :: BGDlist = &
|
|---|
| 254 | (/ "UNKNOWN ", "ECMWF ", "DMI ", &
|
|---|
| 255 | "METO ", "NCEP ", &
|
|---|
| 256 | "CMA ", "ISRO ", &
|
|---|
| 257 | "NONE ", "UNKNOWN ", &
|
|---|
| 258 | "UNKNOWN ", "UNKNOWN " /)
|
|---|
| 259 | INTEGER, DIMENSION(nbg) :: BGDcode = &
|
|---|
| 260 | (/ NVIND, 98, 94, &
|
|---|
| 261 | 74, 7, &
|
|---|
| 262 | 38, 28, &
|
|---|
| 263 | NVIND, NVIND, &
|
|---|
| 264 | NVIND, NVIND /)
|
|---|
| 265 |
|
|---|
| 266 | ! Local variables
|
|---|
| 267 |
|
|---|
| 268 | CHARACTER (LEN=235) :: dir = " " ! Translated BUFR directory (path)
|
|---|
| 269 | CHARACTER (LEN=255) :: FileSpec ! Full sequence file name
|
|---|
| 270 | CHARACTER (LEN=50) :: routine ! Saved routine name
|
|---|
| 271 | INTEGER :: NLunit ! NAMELIST file unit no.
|
|---|
| 272 | INTEGER :: i, j, l ! loop counter/indices
|
|---|
| 273 | INTEGER :: ierr ! I/O error
|
|---|
| 274 | LOGICAL :: exists ! File exists flag
|
|---|
| 275 | LOGICAL :: first = .TRUE. ! First call flag
|
|---|
| 276 |
|
|---|
| 277 | ! Namelist parameters
|
|---|
| 278 |
|
|---|
| 279 | NAMELIST /GNScodes/ GNSlist, GNScode
|
|---|
| 280 | NAMELIST /LEOcodes/ LEOlist, LEOcode, Inscode
|
|---|
| 281 | NAMELIST /ORGcodes/ ORGlist, ORGcode, Subcode, ORGname, ICAOcode
|
|---|
| 282 | NAMELIST /BGDcodes/ BGDlist, BGDcode
|
|---|
| 283 |
|
|---|
| 284 | SAVE first
|
|---|
| 285 |
|
|---|
| 286 | CALL message_get_routine ( routine )
|
|---|
| 287 | CALL message_set_routine ( "ConvertCodes" )
|
|---|
| 288 |
|
|---|
| 289 | !---------------------------------------------------
|
|---|
| 290 | ! 1. Find & open codes NAMELIST file, read lists
|
|---|
| 291 | !---------------------------------------------------
|
|---|
| 292 |
|
|---|
| 293 | IF ( first ) THEN
|
|---|
| 294 | NLunit = Get_IO_Unit()
|
|---|
| 295 | DO i = 1, nep
|
|---|
| 296 | CALL GETENV ( TRIM(NLenv(i)), dir )
|
|---|
| 297 | l = LEN_TRIM(dir)
|
|---|
| 298 | IF ( l > 0 .AND. TRIM(dir) /= TRIM(NLenv(i)) ) THEN
|
|---|
| 299 | IF ( dir(l:l) /= "/" ) dir(l+1:l+1) = "/"
|
|---|
| 300 | FileSpec = ADJUSTL(TRIM(dir)//NLdsn)
|
|---|
| 301 | INQUIRE ( FILE=FileSpec, EXIST=exists )
|
|---|
| 302 | IF ( exists ) EXIT
|
|---|
| 303 | END IF
|
|---|
| 304 | END DO
|
|---|
| 305 |
|
|---|
| 306 | IF ( exists ) THEN
|
|---|
| 307 | OPEN ( UNIT=NLunit, FILE=FileSpec, ACTION="READ", IOSTAT=ierr )
|
|---|
| 308 | IF ( ierr == 0 ) THEN
|
|---|
| 309 | READ ( UNIT=NLunit, NML=GNScodes, IOSTAT=ierr )
|
|---|
| 310 | IF ( ierr /= 0 ) &
|
|---|
| 311 | CALL message ( msg_warn, "Error loading NAMELIST GNScodes" )
|
|---|
| 312 | READ ( UNIT=NLunit, NML=LEOcodes, IOSTAT=ierr )
|
|---|
| 313 | IF ( ierr /= 0 ) &
|
|---|
| 314 | CALL message ( msg_warn, "Error loading NAMELIST LEOcodes" )
|
|---|
| 315 | READ ( UNIT=NLunit, NML=ORGcodes, IOSTAT=ierr )
|
|---|
| 316 | IF ( ierr /= 0 ) &
|
|---|
| 317 | CALL message ( msg_warn, "Error loading NAMELIST ORGcodes" )
|
|---|
| 318 | READ ( UNIT=NLunit, NML=BGDcodes, IOSTAT=ierr )
|
|---|
| 319 | IF ( ierr /= 0 ) &
|
|---|
| 320 | CALL message ( msg_warn, "Error loading NAMELIST BGDcodes" )
|
|---|
| 321 | CLOSE ( UNIT=NLunit )
|
|---|
| 322 | IF ( ierr == 0 ) THEN
|
|---|
| 323 | CALL message ( msg_diag, "Loaded "//TRIM(FileSpec) )
|
|---|
| 324 | ELSE
|
|---|
| 325 | CALL message ( msg_warn, "Error loading ROPP-BUFR codes "// &
|
|---|
| 326 | "NAMELIST file" )
|
|---|
| 327 | CALL message ( msg_cont, " ("//TRIM(FileSpec)//")" )
|
|---|
| 328 | CALL message ( msg_cont, " Using default look-up tables for items "// &
|
|---|
| 329 | " not loaded" )
|
|---|
| 330 | END IF
|
|---|
| 331 | ELSE
|
|---|
| 332 | CALL message ( msg_warn, "ROPP-BUFR codes NAMELIST file"// &
|
|---|
| 333 | " could not be opened." )
|
|---|
| 334 | CALL message ( msg_cont, " ("//TRIM(FileSpec)//")" )
|
|---|
| 335 | CALL message ( msg_cont, " Using default look-up tables" )
|
|---|
| 336 | END IF
|
|---|
| 337 | ELSE
|
|---|
| 338 | CALL message ( msg_warn, "ROPP-BUFR codes NAMELIST file "// &
|
|---|
| 339 | TRIM(NLdsn)//" could not be found." )
|
|---|
| 340 | CALL message ( msg_cont, " Using default look-up tables" )
|
|---|
| 341 | END IF
|
|---|
| 342 |
|
|---|
| 343 | first = .FALSE.
|
|---|
| 344 | END IF
|
|---|
| 345 |
|
|---|
| 346 | !---------------------------------------------------
|
|---|
| 347 | ! 2. Look up numeric (BUFR) code from character (ROPP)
|
|---|
| 348 | !---------------------------------------------------
|
|---|
| 349 |
|
|---|
| 350 | IF ( ind >= 1 ) THEN
|
|---|
| 351 |
|
|---|
| 352 | ! Defaults
|
|---|
| 353 |
|
|---|
| 354 | Lcode = NVIND
|
|---|
| 355 | Icode = NVIND
|
|---|
| 356 | Gclass = NVIND
|
|---|
| 357 | Gcode = NVIND
|
|---|
| 358 | Ocode = NVIND
|
|---|
| 359 | Scode = NVIND
|
|---|
| 360 | Ccode = "ZZZZ"
|
|---|
| 361 | Bcode = NVIND
|
|---|
| 362 |
|
|---|
| 363 | ! LEO Rx ID code (satellite & hence instrument)
|
|---|
| 364 |
|
|---|
| 365 | i = nrx
|
|---|
| 366 | DO
|
|---|
| 367 | IF (i .EQ. 0) EXIT
|
|---|
| 368 | IF (LEOlist(i) .EQ. ROdata%LEO_id) EXIT
|
|---|
| 369 | i = i - 1
|
|---|
| 370 | END DO
|
|---|
| 371 |
|
|---|
| 372 | IF ( i > 0 ) THEN
|
|---|
| 373 | Lcode = LEOcode(i)
|
|---|
| 374 | Icode = Inscode(i)
|
|---|
| 375 | END IF
|
|---|
| 376 |
|
|---|
| 377 | ! GNSS Tx ID code (satellite class) & separate PRN
|
|---|
| 378 |
|
|---|
| 379 | i = ntx
|
|---|
| 380 | DO
|
|---|
| 381 | IF (i .EQ. 0) EXIT
|
|---|
| 382 | IF (GNSlist(i) .EQ. ROdata%GNS_id(1:1)) EXIT
|
|---|
| 383 | i = i - 1
|
|---|
| 384 | END DO
|
|---|
| 385 |
|
|---|
| 386 | IF ( i > 0 ) Gclass = GNScode(i)
|
|---|
| 387 | READ ( ROdata%GNS_id(2:4), FMT=*, IOSTAT=ierr ) Gcode
|
|---|
| 388 | IF ( ierr /= 0 .OR. &
|
|---|
| 389 | Gcode < 0 .OR. &
|
|---|
| 390 | Gcode > 32 ) Gcode = NVIND
|
|---|
| 391 |
|
|---|
| 392 | ! Originating (encoding) centre code and associated
|
|---|
| 393 | ! sub-centre (processing) & ICAO (GTS node) codes
|
|---|
| 394 |
|
|---|
| 395 | i = noc
|
|---|
| 396 | DO
|
|---|
| 397 | IF (i .EQ. 0) EXIT
|
|---|
| 398 | IF (ORGlist(i)(1:3) .EQ. ROdata%Processing_Centre(1:3)) EXIT
|
|---|
| 399 | i = i - 1
|
|---|
| 400 | END DO
|
|---|
| 401 |
|
|---|
| 402 | Ocode = ORGcode(i)
|
|---|
| 403 | Scode = SUBcode(i)
|
|---|
| 404 | Ccode = ICAOcode(i)
|
|---|
| 405 |
|
|---|
| 406 | ! Look up background generator centre code
|
|---|
| 407 |
|
|---|
| 408 | i = nbg
|
|---|
| 409 | DO
|
|---|
| 410 | IF (i .EQ. 0) EXIT
|
|---|
| 411 | IF (BGDlist(i)(1:3) .EQ. ROdata%BG%Source(1:3)) EXIT
|
|---|
| 412 | i = i - 1
|
|---|
| 413 | END DO
|
|---|
| 414 |
|
|---|
| 415 | Bcode = BGDcode(i)
|
|---|
| 416 |
|
|---|
| 417 | !---------------------------------------------------
|
|---|
| 418 | ! 3. Look up character (ROPP) code from numeric (BUFR)
|
|---|
| 419 | !---------------------------------------------------
|
|---|
| 420 |
|
|---|
| 421 | ELSE
|
|---|
| 422 |
|
|---|
| 423 | ! Defaults
|
|---|
| 424 |
|
|---|
| 425 | ROdata%LEO_id = "UNKN"
|
|---|
| 426 | ROdata%GNS_id = "U999"
|
|---|
| 427 | ROdata%Processing_Centre = "UNKNOWN"
|
|---|
| 428 | ROdata%BG%Source = "UNKNOWN"
|
|---|
| 429 |
|
|---|
| 430 | ! LEO Rx ID code (Satellite)
|
|---|
| 431 |
|
|---|
| 432 | i = nrx
|
|---|
| 433 | DO
|
|---|
| 434 | IF (i .EQ. 0) EXIT
|
|---|
| 435 | IF (Lcode .EQ. LEOcode(i)) EXIT
|
|---|
| 436 | i = i - 1
|
|---|
| 437 | END DO
|
|---|
| 438 |
|
|---|
| 439 | IF ( i > 0 ) ROdata%LEO_id = LEOlist(i)
|
|---|
| 440 |
|
|---|
| 441 | ! GNSS Tx ID code (from satellite class) & add PRN
|
|---|
| 442 |
|
|---|
| 443 | i = ntx
|
|---|
| 444 | DO
|
|---|
| 445 | IF (i .EQ. 0) EXIT
|
|---|
| 446 | IF (Gclass .EQ. GNScode(i)) EXIT
|
|---|
| 447 | i = i - 1
|
|---|
| 448 | END DO
|
|---|
| 449 |
|
|---|
| 450 | IF ( i > 0 ) ROdata%GNS_id(1:1) = GNSlist(i)
|
|---|
| 451 | IF ( Gcode < 0 .OR. Gcode > 999 ) Gcode = 999
|
|---|
| 452 | WRITE ( ROdata%GNS_id(2:4), &
|
|---|
| 453 | FMT="(I3.3)", &
|
|---|
| 454 | IOSTAT=ierr ) Gcode
|
|---|
| 455 |
|
|---|
| 456 | ! Originating (RO processing) centre code
|
|---|
| 457 |
|
|---|
| 458 | i = noc
|
|---|
| 459 | DO
|
|---|
| 460 | IF (i .EQ. 0) EXIT
|
|---|
| 461 | IF (Ocode .EQ. ORGcode(i)) EXIT
|
|---|
| 462 | i = i - 1
|
|---|
| 463 | END DO
|
|---|
| 464 |
|
|---|
| 465 | IF ( i > 0 ) THEN
|
|---|
| 466 | j = MAX ( LEN_TRIM ( ORGlist(i) ), 4 )
|
|---|
| 467 | ROdata%Processing_Centre = ORGlist(i)(1:j) &
|
|---|
| 468 | // " " // ORGname(i)
|
|---|
| 469 | Ccode = ICAOcode(i)
|
|---|
| 470 | END IF
|
|---|
| 471 |
|
|---|
| 472 | ! Background generating centre code
|
|---|
| 473 |
|
|---|
| 474 | i = nbg
|
|---|
| 475 | DO
|
|---|
| 476 | IF (i .EQ. 0) EXIT
|
|---|
| 477 | IF (Bcode .EQ. BGDcode(i)) EXIT
|
|---|
| 478 | i = i - 1
|
|---|
| 479 | END DO
|
|---|
| 480 |
|
|---|
| 481 | IF ( i > 0 ) ROdata%BG%Source = BGDlist(i)
|
|---|
| 482 |
|
|---|
| 483 | ENDIF
|
|---|
| 484 |
|
|---|
| 485 | CALL message_set_routine ( routine )
|
|---|
| 486 |
|
|---|
| 487 | END SUBROUTINE ConvertCodes
|
|---|