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
|
---|