NCEPLIBS-w3emc  2.11.0
w3unpk77.f
Go to the documentation of this file.
1 C> @file
2 C> @brief Decodes single report from bufr messages
3 C> @author Dennis Keyser @date 2002-03-05
4 
5 C> This subroutine decodes a single report from bufr messages
6 C> in a jbufr-type data file. Currently wind profiler, nexrad (vad)
7 C> wind and goes sounding/radiance data types are valid. Report is
8 C> returned in quasi-office note 29 unpacked format (see remarks 4.).
9 C>
10 C> ### Program History Log:
11 C> Date | Programmer | Comment
12 C> -----|------------|--------
13 C> 1996-12-16 | Dennis Keyser | Original author (based on w3lib routine w3fi77)
14 C> 1997-06-02 | Dennis Keyser | Added nexrad (vad) wind data type
15 C> 1997-06-16 | Dennis Keyser | Added goes sounding/radiance data type
16 C> 1997-09-18 | Dennis Keyser | Added instrument data used in processing,
17 C> solar zenith angle, and satellite zenith angle
18 C> to list of parameters returned from goes
19 C> sounding/radiance data type
20 C> 1998-07-09 | Dennis Keyser | Modified wind profiler cat. 11 (height, horiz.
21 C> significance, vert. significance) to account
22 C> for updates to bufrtable mnemonics in /dcom;
23 C> changed char. 6 of goes stnid to be unique for
24 C> two different even or odd satellite id's
25 C> (every other even or odd sat. id now gets same
26 C> char. 6 tag)
27 C> 1998-08-19 | Dennis Keyser | Subroutine now y2k and fortran 90 compliant
28 C> 1999-03-16 | Dennis Keyser | Incorporated bob kistler's changes needed
29 C> to port the code to the ibm sp
30 C> 1999-05-17 | Dennis Keyser | Made changes necessary to port this routine to
31 C> the ibm sp
32 C> 1999-09-26 | Dennis Keyser | Changes to make code more portable
33 C> 2002-03-05 | Dennis Keyser | Accounts for changes in input proflr (wind
34 C> profiler) bufr dump file after 3/2002: cat. 10
35 C> surface data now all missing (mnemonics "pmsl",
36 C> "wdir1","wspd1", "tmdb", "rehu", "reqv" no
37 C> longer available); cat. 11 mnemonics "acavh",
38 C> "acavv", "spp0", and "nphl" no longer
39 C> available; header mnemonic "npsm" is no longer
40 C> available, header mnemonic "tpse" replaces
41 C> "tpmi" (avg. time in minutes still output);
42 C> number of upper-air levels incr. from 43 to up
43 C> to 64 (size of output "rdata" array incr. from
44 C> 600 to 1200 to account for this) (will still
45 C> work properly for input proflr dump files prior
46 C> to 3/2002)
47 C>
48 C> @param[in] IDATE 4-word array holding "central" date to process (yyyy, mm, dd, hh)
49 C> @param[in] IHE Number of whole hours relative to "idate" for date of
50 C> earliest bufr message that is to be decoded; earliest date is "idate" +
51 C> "ihe" hours (if "ihe" is positive, latest message date is after "idate";
52 C> if "ihe" is negative latest message date is prior to "idate") example:
53 C> if ihe=1, then earliest date is 1-hr after idate; if ihe=-3, then earliest
54 C> date is 3-hr prior to idate
55 C> @param[in] IHL Number of whole hours relative to "idate" for date of
56 C> latest bufr message that is to be decoded; latest date is "idate" + ("ihl"
57 C> hours plus 59 min) if "ihl" is positive (latest message date is after
58 C> "idate"), and "idate" + ("ihl"+1 hours minus 1 min) if "ihl" is negative
59 C> (latest message date is prior to "idate") example: if ihl=3, then latest
60 C> date is 3-hr 59-min after idate; if ihl=-2, then latest date is 1-hr 1-min
61 C> prior to idate
62 C> @param[in] LUNIT Fortran unit number for input data file
63 C> @param[out] RDATA Single report returned an a quasi-office note 29 unpacked
64 C> format (see remarks 4.) (minimum size is 1200 words)
65 C> @param[inout] IRET [in] Controls degree of unit 6 printout (.ge. 0 -limited
66 C> printout; = -1 some additional diagnostic printout; = .lt. -1 -extensive
67 C> printout) (see remarks 3.)
68 C> [out] Return code as follows:
69 C> - IRET = 0 ---> Report successfully returned
70 C> - IRET > 0 ---> No report returned due to:
71 C> - = 1 ---> All reports read in, end
72 C> - = 2 ---> Lat and/or lon data missing
73 C> - = 3 ---> Reserved
74 C> - = 4 ---> Some/all date information missing
75 C> - = 5 ---> No data levels processed (all levels are missing)
76 C> - = 6 ---> Number of levels in report header is not 1
77 C> - = 7 ---> Number of levels in another single level sequence is not 1
78 C>
79 C> @remark
80 C> - 1 A condition code (stop) of 15 will occur if the input
81 C> dates for start and/or stop time are specified incorrectly.
82 C> - 2 A condition code (stop) of 22 will occur if the
83 C> characters on this machine are neither ascii nor ebcdic.
84 C> - 3 The input argument "iret" should be set prior to each
85 C> call to this subroutine.
86 C>
87 C> ***************************************************************
88 C> 4)
89 C> BELOW IS THE FORMAT OF AN UNPACKED REPORT IN OUTPUT ARRAY RDATA
90 C> (EACH WORD REPRESENTS A FULL-WORD ACCORDING TO THE MACHINE)
91 C> N O T E : THIS IS THE SAME FORMAT AS FOR W3LIB ROUTINE W3FI77
92 C> EXCEPT WHERE NOTED
93 C> ***************************************************************
94 C>
95 C> #### FORMAT FOR WIND PROFILER REPORTS
96 C> WORD | CONTENT | UNIT | FORMAT
97 C> ---- | --------------------- | ------------------- | ---------
98 C> 1 | LATITUDE | 0.01 DEGREES | REAL
99 C> 2 | LONGITUDE | 0.01 DEGREES WEST | REAL
100 C> 3 | TIME SIGNIFICANCE | (BUFR CODE TABLE "0 08 021") | INTEGER
101 C> 4 | OBSERVATION TIME | 0.01 HOURS (UTC) | REAL
102 C> 5 | YEAR/MONTH | 4-CHAR. 'YYMM' LEFT-JUSTIFIED | CHARACTER
103 C> 6 | DAY/HOUR | 4-CHARACTERS 'DDHH' | CHARACTER
104 C> 7 | STATION ELEVATION | METERS | REAL
105 C> 8 | SUBMODE/EDITION NO. | (SM X 10) + ED. NO. (ED. NO.=2, CONSTANT; SEE &,~) | INTEGER
106 C> 9 | REPORT TYPE | 71 (CONSTANT) | INTEGER
107 C> 10 | AVERAGING TIME | MINUTES (NEGATIVE MEANS PRIOR TO OBS. TIME) | INTEGER
108 C> 11 | STN. ID. (FIRST 4 CHAR.) | 4-CHARACTERS LEFT-JUSTIFIED| CHARACTER
109 C> 12 | STN. ID. (LAST 2 CHAR.) | 2-CHARACTERS LEFT-JUSTIFIED| CHARACTER
110 C> 13-34 | ZEROED OUT - NOT USED | | INTEGER
111 C> 35 | CATEGORY 10, NO. LEVELS | COUNT | INTEGER
112 C> 36 | CATEGORY 10, DATA INDEX | COUNT | INTEGER
113 C> 37 | CATEGORY 11, NO. LEVELS | COUNT | INTEGER
114 C> 38 | CATEGORY 11, DATA INDEX | COUNT | INTEGER
115 C> 39-42 | ZEROED OUT - NOT USED | | INTEGER
116 C> 43-END | UNPACKED DATA GROUPS | (FOLLOWS) | REAL
117 C>
118 C> #### CATEGORY 10 - WIND PROFILER SFC DATA (EACH LEVEL, SEE WORD 35 ABOVE)
119 C> WORD | PARAMETER | UNITS | FORMAT
120 C> ---- | --------- | ----------------- | -------------
121 C>(SEE @)1 | SEA-LEVEL PRESSURE | 0.1 MILLIBARS | REAL
122 C>(SEE *)2 | STATION PRESSURE | 0.1 MILLIBARS | REAL
123 C>(SEE @)3 | HORIZ. WIND DIR. | DEGREES | REAL
124 C>(SEE @)4 | HORIZ. WIND SPEED | 0.1 M/S | REAL
125 C>(SEE @)5 | AIR TEMPERATURE | 0.1 DEGREES K | REAL
126 C>(SEE @)6 | RELATIVE HUMIDITY | PERCENT | REAL
127 C>(SEE @)7 | RAINFALL RATE | 0.0000001 M/S | REAL
128 C>
129 C> #### CATEGORY 11 - WIND PROFILER UPPER-AIR DATA (FIRST LEVEL IS SURFACE) (EACH LEVEL, SEE WORD 37 ABOVE)
130 C> WORD | PARAMETER | UNITS | FORMAT
131 C> ---- | --------- | ----------------- | -------------
132 C> 1 | HEIGHT ABOVE SEA-LVL | METERS | REAL
133 C> 2 | HORIZ. WIND DIR. | DEGREES | REAL
134 C> 3 | HORIZ. WIND SPEED | 0.1 M/S | REAL
135 C> 4 | QUALITY CODE | (SEE %) | INTEGER
136 C> 5 | VERT. WIND COMP. (W) | 0.01 M/S | REAL
137 C>(SEE @)6 | HORIZ. CONSENSUS NO. | (SEE $) | INTEGER
138 C>(SEE @)7 | VERT. CONSENSUS NO. | (SEE $) | INTEGER
139 C>(SEE @)8 | SPECTRAL PEAK POWER | DB | REAL
140 C> 9 | HORIZ. WIND SPEED | 0.1 M/S | REAL
141 C> | STANDARD DEVIATION | 0.1 M/S | REAL
142 C> 10 | VERT. WIND COMPONENT | 0.1 M/S | REAL
143 C> | STANDARD DEVIATION | 0.1 M/S | REAL
144 C>(SEE @)11 | MODE | (SEE #) | INTEGER
145 C>
146 C> ##### SEE:
147 C> - *- ALWAYS MISSING
148 C> - &- THIS IS A CHANGE FROM FORMAT IN W3LIB ROUTINE W3FI77
149 C> - %- 0 - MEDIAN AND SHEAR CHECKS BOTH PASSED
150 C> - 2 - MEDIAN AND SHEAR CHECK RESULTS INCONCLUSIVE
151 C> - 4 - MEDIAN CHECK PASSED; SHEAR CHECK FAILED
152 C> - 8 - MEDIAN CHECK FAILED; SHEAR CHECK PASSED
153 C> - 12 - MEDIAN AND SHEAR CHECKS BOTH FAILED
154 C> - $- NO. OF INDIVIDUAL 6-MINUTE AVERAGE MEASUREMENTS THAT WERE
155 C> INCLUDED IN FINAL ESTIMATE OF AVERAGED WIND (RANGE: 0, 2-10)
156 C> (BASED ON A ONE-HOUR AVERAGE)
157 C> - #- 1 - DATA FROM LOW MODE
158 C> 2 - DATA FROM HIGH MODE
159 C> 3 - MISSING
160 C> - @- THIS PARAMETER IS NO LONGER AVAILABLE AFTER 3/2002 AND IS SET
161 C> TO MISSING (99999 FOR INTEGER OR 99999. FOR REAL)
162 C> - ~- SUBMODE IS NO LONGER AVAILABLE AFTER 3/2002 AND IS SET TO 3
163 C> (ITS MISSING VALUE)
164 C>
165 C>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
166 C> FORMAT FOR GOES SOUNDING/RADIANCE REPORTS
167 C>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
168 C> HEADER
169 C> WORD CONTENT UNIT FORMAT
170 C> ---- ---------------------- ------------------- ---------
171 C> 1 LATITUDE 0.01 DEGREES REAL
172 C> 2 LONGITUDE 0.01 DEGREES WEST REAL
173 C> 3 FIELD OF VIEW NUMBER NUMERIC INTEGER
174 C> 4 OBSERVATION TIME 0.01 HOURS (UTC) REAL
175 c>vvvvvdak port
176 C> 5 YEAR/MONTH 4-CHAR. 'YYMM' CHARACTER
177 c>aaaaadak port
178 C> LEFT-JUSTIFIED
179 C> 6 DAY/HOUR 4-CHARACTERS 'DDHH' CHARACTER
180 C> 7 STATION ELEVATION METERS REAL
181 C> 8 PROCESS. TECHNIQUE (=21-CLEAR; INTEGER
182 C> 8 PROCESS. TECHNIQUE =23-CLOUD-CORRECTED)
183 C> 9 REPORT TYPE 61 (CONSTANT) INTEGER
184 C> 10 QUALITY FLAG (BUFR CODE TABLE "0 33 002") INTEGER
185 C> 11 STN. ID. (FIRST 4 CHAR.) 4-CHARACTERS CHARACTER
186 C> LEFT-JUSTIFIED
187 C> 12 STN. ID. (LAST 2 CHAR.) 2-CHARACTERS CHARACTER
188 C> LEFT-JUSTIFIED (SEE %)
189 C>
190 C> 13-26 ZEROED OUT - NOT USED
191 C> 27 CATEGORY 08, NO. LEVELS COUNT INTEGER
192 C> 28 CATEGORY 08, DATA INDEX COUNT INTEGER
193 C> 29-38 ZEROED OUT - NOT USED
194 C> 39 CATEGORY 12, NO. LEVELS COUNT INTEGER
195 C> 40 CATEGORY 12, DATA INDEX COUNT INTEGER
196 C> 41 CATEGORY 13, NO. LEVELS COUNT INTEGER
197 C> 42 CATEGORY 13, DATA INDEX COUNT INTEGER
198 C>
199 C> 43-END UNPACKED DATA GROUPS (FOLLOWS) REAL
200 C>
201 C> CATEGORY 12 - SATELLITE SOUNDING LEVEL DATA (FIRST LEVEL IS SURFACE;
202 C> EACH LEVEL, SEE 39 ABOVE)
203 C> WORD PARAMETER UNITS FORMAT
204 C> ---- --------- ----------------- -------------
205 C> 1 PRESSURE 0.1 MILLIBARS REAL
206 C> 2 GEOPOTENTIAL METERS REAL
207 C> 3 TEMPERATURE 0.1 DEGREES C REAL
208 C> 4 DEWPOINT TEMPERATURE 0.1 DEGREES C REAL
209 C> 5 NOT USED SET TO MISSING REAL
210 C> 6 NOT USED SET TO MISSING REAL
211 C> 7 QUALITY MARKERS 4-CHARACTERS CHARACTER
212 C> LEFT-JUSTIFIED (SEE &)
213 C>
214 C> CATEGORY 13 - SATELLITE RADIANCE "LEVEL" DATA (EACH "LEVEL", SEE
215 C> 41 ABOVE)
216 C> WORD PARAMETER UNITS FORMAT
217 C> ---- --------- ----------------- -------------
218 C> 1 CHANNEL NUMBER NUMERIC INTEGER
219 C> 2 BRIGHTNESS TEMP. 0.01 DEG. KELVIN REAL
220 C> 3 QUALITY MARKERS 4-CHARACTERS CHARACTER
221 C> LEFT-JUSTIFIED (SEE &&)
222 C>
223 C> CATEGORY 08 - ADDITIONAL (MISCELLANEOUS) DATA (EACH LEVEL, SEE @
224 C> BELOW)
225 C> WORD PARAMETER UNITS FORMAT
226 C> ---- --------- ----------------- -------------
227 C> 1 VARIABLE SEE @ BELOW REAL
228 C> 2 CODE FIGURE SEE @ BELOW REAL
229 C> 3 MARKERS 2-CHARACTERS CHARACTER
230 C> LEFT-JUSTIFIED (SEE #)
231 C>
232 C> %- SIXTH CHARACTER OF STATION ID IS A TAGGED AS FOLLOWS:
233 C> "I" - GOES-EVEN-1 (252, 256, ...) SAT. , CLEAR COLUMN RETR.
234 C> "J" - GOES-EVEN-1 (252, 256, ...) SAT. , CLD-CORRECTED RETR.
235 
236 C> "L" - GOES-ODD-1 (253, 257, ...) SAT. , CLEAR COLUMN RETR.
237 C> "M" - GOES-ODD-1 (253, 257, ...) SAT. , CLD-CORRECTED RETR.
238 
239 C> "O" - GOES-EVEN-2 (254, 258, ...) SAT. , CLEAR COLUMN RETR.
240 C> "P" - GOES-EVEN-2 (254, 258, ...) SAT. , CLD-CORRECTED RETR.
241 
242 C> "Q" - GOES-ODD-2 (251, 255, ...) SAT. , CLEAR COLUMN RETR.
243 C> "R" - GOES-ODD-2 (251, 255, ...) SAT. , CLD-CORRECTED RETR.
244 
245 C> "?" - EITHER SATELLITE AND/OR RETRIEVAL TYPE UNKNOWN
246 
247 C> &- FIRST CHARACTER IS Q.M. FOR GEOPOTENTIAL
248 C> SECOND CHARACTER IS Q.M. FOR TEMPERATURE
249 C> THIRD CHARACTER IS Q.M. FOR DEWPOINT TEMPERATURE
250 C> FOURTH CHARACTER IS NOT USED
251 C> " " - INDICATES DATA NOT SUSPECT
252 C> "Q" - INDICATES DATA ARE SUSPECT
253 C> "F" - INDICATES DATA ARE BAD
254 C> &&- FIRST CHARACTER IS Q.M. FOR BRIGHTNESS TEMPERATURE
255 C> SECOND-FOURTH CHARACTERS ARE NOT USED
256 C> " " - INDICATES DATA NOT SUSPECT
257 C> "Q" - INDICATES DATA ARE SUSPECT
258 C> "F" - INDICATES DATA ARE BAD
259 C> @- NUMBER OF "LEVELS" FROM WORD 27. MAXIMUM IS 12, AND ARE ORDERED
260 C> AS FOLLOWS (IF A DATUM ARE MISSING THAT LEVEL NOT STORED)
261 C> 1 - LIFTED INDEX ---------- .01 DEG. KELVIN -- C. FIG. 250.
262 C> 2 - TOTAL PRECIP. WATER -- .01 MILLIMETERS -- C. FIG. 251.
263 C> 3 - 1. TO .9 SIGMA P.WATER- .01 MILLIMETERS -- C. FIG. 252.
264 C> 4 - .9 TO .7 SIGMA P.WATER- .01 MILLIMETERS -- C. FIG. 253.
265 C> 5 - .7 TO .3 SIGMA P.WATER- .01 MILLIMETERS -- C. FIG. 254.
266 C> 6 - SKIN TEMPERATURE ----- .01 DEG. KELVIN -- C. FIG. 255.
267 C> 7 - CLOUD TOP TEMPERATURE- .01 DEG. KELVIN -- C. FIG. 256.
268 C> 8 - CLOUD TOP PRESSURE --- .1 MILLIBARS ----- C. FIG. 257.
269 C> 9 - CLOUD AMOUNT (BUFR TBL. C.T. 0-20-011) -- C. FIG. 258.
270 C> 10 - INSTR. DATA USED IN PROC.
271 C> (BUFR TBL. C.T. 0-02-021) -- C. FIG. 259.
272 C> 11 - SOLAR ZENITH ANGLE --- .01 DEGREE ------- C. FIG. 260.
273 C> 12 - SAT. ZENITH ANGLE ---- .01 DEGREE ------- C. FIG. 261.
274 C> #- FIRST CHARACTER IS Q.M. FOR THE DATUM
275 C> " " - INDICATES DATA NOT SUSPECT
276 C> "Q" - INDICATES DATA ARE SUSPECT
277 C> "F" - INDICATES DATA ARE BAD
278 C> SECOND CHARACTER IS NOT USED
279 C>
280 C>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
281 C> FORMAT FOR NEXRAD (VAD) WIND REPORTS
282 C>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
283 C> HEADER
284 C> WORD CONTENT UNIT FORMAT
285 C> ---- ---------------------- ------------------- ---------
286 C> 1 LATITUDE 0.01 DEGREES REAL
287 C> 2 LONGITUDE 0.01 DEGREES WEST REAL
288 C> 3 ** RESERVED ** SET TO 99999 INTEGER
289 C> 4 OBSERVATION TIME 0.01 HOURS (UTC) REAL
290 c>vvvvvdak port
291 C> 5 YEAR/MONTH 4-CHAR. 'YYMM' CHARACTER
292 c>aaaaadak port
293 C> LEFT-JUSTIFIED
294 C> 6 DAY/HOUR 4-CHARACTERS 'DDHH' CHARACTER
295 C> 7 STATION ELEVATION METERS REAL
296 C> 8 ** RESERVED ** SET TO 99999 INTEGER
297 C>
298 C> 9 REPORT TYPE 72 (CONSTANT) INTEGER
299 C> 10 ** RESERVED ** SET TO 99999 INTEGER
300 C> 11 STN. ID. (FIRST 4 CHAR.) 4-CHARACTERS CHARACTER
301 C> LEFT-JUSTIFIED
302 C> 12 STN. ID. (LAST 2 CHAR.) 2-CHARACTERS CHARACTER
303 C> LEFT-JUSTIFIED
304 C>
305 C> 13-18 ZEROED OUT - NOT USED INTEGER
306 C> 19 CATEGORY 04, NO. LEVELS COUNT INTEGER
307 C> 20 CATEGORY 04, DATA INDEX COUNT INTEGER
308 C> 21-42 ZEROED OUT - NOT USED INTEGER
309 C>
310 C> 43-END UNPACKED DATA GROUPS (FOLLOWS) REAL
311 C>
312 C> CATEGORY 04 - UPPER-AIR WINDS-BY-HEIGHT DATA(FIRST LEVEL IS SURFACE)
313 C> (EACH LEVEL, SEE WORD 19 ABOVE)
314 C> WORD PARAMETER UNITS FORMAT
315 C> ---- --------- ----------------- -------------
316 C> 1 HEIGHT ABOVE SEA-LVL METERS REAL
317 C> 2 HORIZ. WIND DIR. DEGREES REAL
318 C> 3 HORIZ. WIND SPEED 0.1 M/S (SEE *) REAL
319 C> 4 QUALITY MARKERS 4-CHARACTERS CHARACTER
320 C> LEFT-JUSTIFIED (SEE %)
321 C>
322 C> *- UNITS HERE DIFFER FROM THOSE IN TRUE UNPACKED OFFICE NOTE 29
323 C> (WHERE UNITS ARE KNOTS)
324 C> %- THE FIRST THREE CHARACTERS ARE ALWAYS BLANK, THE FOURTH
325 C> CHARACTER IS A "CONFIDENCE LEVEL" WHICH IS RELATED TO THE ROOT-
326 C> MEAN-SQUARE VECTOR ERROR FOR THE HORIZONTAL WIND. IT IS
327 C> DEFINED AS FOLLOWS:
328 C> 'A' = RMS OF 1.9 KNOTS
329 C> 'B' = RMS OF 3.9 KNOTS
330 C> 'C' = RMS OF 5.8 KNOTS
331 C> 'D' = RMS OF 7.8 KNOTS
332 C> 'E' = RMS OF 9.7 KNOTS
333 C> 'F' = RMS OF 11.7 KNOTS
334 C> 'G' = RMS > 13.6 KNOTS
335 C>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
336 C>
337 C> FOR ALL REPORT TYPES, MISSING VALUES ARE:
338 C> 99999. FOR REAL
339 C> 99999 FOR INTEGER
340 C> 9'S FOR CHARACTERS IN WORD 5, 6 OF HEADER
341 C> BLANK FOR CHARACTERS IN WORD 11, 12 OF HEADER
342 C> AND FOR CHARACTERS IN ANY CATEGORY LEVEL
343 C>
344 C> @author Dennis Keyser @date 2002-03-05
345  SUBROUTINE w3unpk77(IDATE,IHE,IHL,LUNIT,RDATA,IRET)
346  CHARACTER*4 CBUFR
347  INTEGER IDATE(4),LSDATE(4),jdate(8),IDATA(1200)
348  dimension rinc(5)
349  REAL RDATA(*),RDATX(1200)
350  COMMON /pk77bb/kdate(8),ldate(8),iprint
351  COMMON /pk77cc/index
352  COMMON /pk77dd/lshe,lshl,icdate(5),iddate(5)
353  COMMON /pk77ff/ifov(3),kntsat(250:260)
354 
355  SAVE
356 
357  equivalence(rdatx,idata)
358  DATA itm/0/,lunitl/-99/,kount/0/
359  iprint = 0
360  IF(iret.LT.0) iprint = iabs(iret)
361  iret = 0
362  IF(itm.EQ.0) THEN
363 C-----------------------------------------------------------------------
364 
365 C FIRST AND ONLY TIME INTO THIS SUBROUTINE DO A FEW THINGS....
366 
367  itm = 1
368  ifov = 0
369  kntsat = 0
370 C DETERMINE MACHINE WORD LENGTH IN BYTES (=8 FOR CRAY) AND TYPE OF
371 C CHARACTER SET {ASCII(ICHTP=0) OR EBCDIC(ICHTP=1)}
372  CALL w3fi04(iendn,ichtp,lw)
373  print 2213, lw, ichtp, iendn
374  2213 FORMAT(/' ---> W3UNPK77: CALL TO W3FI04 RETURNS: LW = ',i3,
375  $ ', ICHTP = ',i3,', IENDN = ',i3/)
376  IF(ichtp.GT.1) THEN
377 C CHARACTERS ON THIS MACHINE ARE NEITHER ASCII OR EBCDIC!! -- STOP 22
378  print 217
379  217 FORMAT(' *** W3UNPK77 ERROR: CHARACTERS ON THIS MACHINE ',
380  $ 'ARE NEITHER ASCII NOR EBCDIC - STOP 22'/)
381  CALL errexit(22)
382  END IF
383 C-----------------------------------------------------------------------
384  END IF
385  IF(lunit.NE.lunitl) THEN
386 C-----------------------------------------------------------------------
387 
388 C IF THE INPUT DATA UNIT NUMBER ARGUMENT IS DIFFERENT THAT THE LAST TIME
389 C THIS SUBR. WAS CALLED, PRINT NEW HEADER, SET JRET = 1
390 
391  lunitl = lunit
392  jret = 1
393  print 101, lunit
394  101 FORMAT(//' ---> W3UNPK77: VERSION 03/05/2002: JBUFR DATA SET ',
395  $ 'READ FROM UNIT ',i4/)
396 C-----------------------------------------------------------------------
397  ELSE
398 
399 C FOR SUBSEQUENT TIMES INTO THIS SUBR. W/ SAME LUNIT AS LAST TIME,
400 C TEST INPUT DATE & HR RANGE ARGUMENTS AGAINST THEIR VALUES THE LAST
401 C TIME SUBR. CALLED -- IF THEY ARE DIFFERENT, SET JRET = 1 (ELSE
402 C JRET = 0), WILL TEST JRET SOON
403 
404  jret = 1
405  DO i = 4,1,-1
406  IF(idate(i).NE.lsdate(i)) GO TO 88
407  ENDDO
408  IF(ihe.NE.lshe.OR.ihl.NE.lshl) GO TO 88
409  jret = 0
410  88 CONTINUE
411 C-----------------------------------------------------------------------
412  END IF
413  IF(jret.EQ.1) THEN
414  print 6680
415  6680 FORMAT(/' JRET = 1 - REWIND DATA FILE & SET-UP TO DO DATE CHECK'/)
416 C-----------------------------------------------------------------------
417 
418 C COME HERE IF FIRST CALL TO SUBROUTINE OR IF INPUT DATA UNIT NUMBER OR
419 C IF INPUT DATE/TIME OR RANGE IN TIME HAS BEEN CHANGED FROM LAST CALL
420 
421 C CLOSE BUFR DATA SET (IN CASE OPEN FROM PREVIOUS RUN)
422 C REWIND INPUT BUFR DATA SET, GET CENTER TIME AND DUMP TIME,
423 C OPEN BUFR DATA SET
424 
425 C SET-UP TO DETERMINE IF BUFR MESSAGE IS WITHIN REQUESTED DATES
426 
427 C (ALSO SET INDEX=0, FORCES BUFR MSG TO BE READ BEFORE RPTS ARE DECODED)
428 
429 C-----------------------------------------------------------------------
430 
431  CALL closbf(lunit)
432 
433  rewind lunit
434 
435  READ(lunit,END=9999,ERR=9999) cbufr
436  IF(cbufr.NE.'BUFR') GO TO 9999
437 
438  call datelen(10)
439 
440  CALL dumpbf(lunit,icdate,iddate)
441 cppppp
442  print *,'CENTER DATE (ICDATE) = ',icdate
443  print *,'DUMP DATE (IDDATE) = ',iddate
444 cppppp
445 
446  if(icdate(1).le.0) then
447 C COME HERE IF CENTER DATE COULD NOT BE READ FROM FIRST DUMMY MESSAGE
448 C - RETURN WITH IRET = 1
449  print *, ' *** W3UNPK77 ERROR: CENTER DATE COULD NOT BE ',
450  $ 'OBTAINED FROM INPUT FILE ON UNIT ',lunit
451  go to 9998
452  end if
453  if(iddate(1).le.0) then
454 C COME HERE IF DUMP DATE COULD NOT BE READ FROM SECOND DUMMY MESSAGE
455 C - RETURN WITH IRET = 1
456  print *, ' *** W3UNPK77 ERROR: DUMP DATE COULD NOT BE ',
457  $ 'OBTAINED FROM INPUT FILE ON UNIT ',lunit
458  go to 9998
459  end if
460  IF(icdate(1).LT.100) THEN
461 
462 C If 2-digit year returned in ICDATE(1), must use "windowing" technique
463 C to create a 4-digit year
464 
465 C IMPORTANT: IF DATELEN(10) IS CALLED, THE DATE HERE SHOULD ALWAYS
466 C CONTAIN A 4-DIGIT YEAR, EVEN IF INPUT FILE IS NOT
467 C Y2K COMPLIANT (BUFRLIB DOES THE WINDOWING HERE)
468 
469  print *, '##W3UNPK77 - THE FOLLOWING SHOULD NEVER ',
470  $ 'HAPPEN!!!!!'
471  print *, '##W3UNPK77 - 2-DIGIT YEAR IN ICDATE(1) ',
472  $ 'RETURNED FROM DUMPBF (ICDATE IS: ',icdate,') - USE ',
473  $ 'WINDOWING TECHNIQUE TO OBTAIN 4-DIGIT YEAR'
474  IF(icdate(1).GT.20) THEN
475  icdate(1) = 1900 + icdate(1)
476  ELSE
477  icdate(1) = 2000 + icdate(1)
478  ENDIF
479  print *, '##WW3UNPK77 - CORRECTED ICDATE(1) WITH 4-DIGIT ',
480  $ 'YEAR, ICDATE NOW IS: ',icdate
481  ENDIF
482 
483  IF(iddate(1).LT.100) THEN
484 
485 C If 2-digit year returned in IDDATE(1), must use "windowing" technique
486 C to create a 4-digit year
487 
488 C IMPORTANT: IF DATELEN(10) IS CALLED, THE DATE HERE SHOULD ALWAYS
489 C CONTAIN A 4-DIGIT YEAR, EVEN IF INPUT FILE IS NOT
490 C Y2K COMPLIANT (BUFRLIB DOES THE WINDOWING HERE)
491 
492  print *, '##W3UNPK77 - THE FOLLOWING SHOULD NEVER ',
493  $ 'HAPPEN!!!!!'
494  print *, '##W3UNPK77 - 2-DIGIT YEAR IN IDDATE(1) ',
495  $ 'RETURNED FROM DUMPBF (IDDATE IS: ',iddate,') - USE ',
496  $ 'WINDOWING TECHNIQUE TO OBTAIN 4-DIGIT YEAR'
497  IF(iddate(1).GT.20) THEN
498  iddate(1) = 1900 + iddate(1)
499  ELSE
500  iddate(1) = 2000 + iddate(1)
501  ENDIF
502  print *, '##W3UNPK77 - CORRECTED IDDATE(1) WITH 4-DIGIT ',
503  $ 'YEAR, IDDATE NOW IS: ',iddate
504  END IF
505 
506 C OPEN BUFR FILE - READ IN DICTIONARY MESSAGES (TABLE A, B, D ENTRIES)
507 
508  CALL openbf(lunit,'IN',lunit)
509  print 100, lunit
510  100 FORMAT(/5x,'===> BUFR DATA SET IN UNIT',i3,' SUCCESSFULLY ',
511  $ 'OPENED FOR INPUT; DCTNY MESSAGES CONTAIN BUFR TABLES A,B,D'/)
512  index = 0
513  kount = 0
514  jdate(1:3) = idate(1:3)
515  jdate(4) = 0
516  jdate(5) = idate(4)
517  jdate(6:8) = 0
518  print 6681, idate
519  6681 FORMAT(/' %%% REQUESTED "CENTRAL" DATE IS :',i5,3i3,' 0'/)
520 C DETERMINE EARLIEST DATE FOR ACCEPTING BUFR MESSAGES FOR DECODING
521  call w3movdat((/0.,real(ihe),0.,0.,0./),jdate,kdate)
522  print 6682, (kdate(i),i=1,3),kdate(5),kdate(6)
523  6682 FORMAT(/' --> EARLIEST DATE FOR ACCEPTING BUFR MSGS IS:',i5,4i3/)
524 C DETERMINE LATEST DATE FOR ACCEPTING BUFR MESSAGES FOR DECODING
525  if(ihl.ge.0) then
526  xminl = (ihl * 60) + 59
527  else
528  xminl = ((ihl + 1) * 60) - 1
529  end if
530  call w3movdat((/0.,0.,xminl,0.,0./),jdate,ldate)
531  print 6683, (ldate(i),i=1,3),ldate(5),ldate(6)
532  6683 FORMAT(/' --> LATEST DATE FOR ACCEPTING BUFR MSGS IS:',i5,4i3/)
533  call w3difdat(ldate,kdate,3,rinc)
534  IF(rinc(3).LT.0) THEN
535  print 104
536  104 FORMAT(' *** W3UNPK77 ERROR: DATES SPECIFIED INCORRECTLY -',
537  $ ' STOP 15'/)
538  CALL errexit(15)
539  END IF
540 C-----------------------------------------------------------------------
541  END IF
542 C SUBR. UNPK7701 RETURNS A SINGLE DECODED REPORT FROM BUFR MESSAGE
543  CALL unpk7701(lunit,itp,iret)
544 C IRET=1 MEANS ALL DATA HAVE BEEN DECODED FOR SPECIFIED TIME PERIOD
545 C (REWIND DATA FILE AND RETURN W/ IRET=1)
546 C IRET.GE.2 MEANS REPORT NOT RETURNED DUE TO ERROR IN DECODING (RETURN)
547 C (ACTUALLY IRET.GE.2 CURRENTLY CANNOT HAPPEN OUT OF UNPK7701)
548  IF(iret.GE.1) THEN
549  IF(iret.EQ.1) THEN
550  rewind lunit
551  IF(itp.EQ.2) THEN
552  print 8101, ifov
553  8101 FORMAT(/' ---> W3UNPK77: SUMMARY OF GOES REPORT COUNTS GROUPED',
554  $ ' BY F-O-V NO. (PRIOR TO ANY FILTERING BY CALLING PROGRAM)'/15x,
555  $ '# WITH F-O-V NO. 00 TO 02:',i6,' - GET "BAD" Q.MARK'/15x,
556  $ '# WITH F-O-V NO. 03 TO 09:',i6,' - GET "SUSPECT" Q.MARK'/15x,
557  $ '# WITH F-O-V NO. 10 TO 25:',i6,' - GET "NEUTRAL" Q.MARK'/20x,
558  $ '(NOTE: RADIANCES ALWAYS HAVE NEUTRAL Q.MARK)'/)
559  print 8102
560  8102 FORMAT(/' ---> W3UNPK77: SUMMARY OF GOES REPORT COUNTS GROUPED',
561  $ ' BY SATELLITE ID (PRIOR TO ANY FILTERING BY CALLING PROGRAM)'/)
562  DO idsat = 250,259
563  IF(kntsat(idsat).GT.0) print 8103, idsat,kntsat(idsat)
564  ENDDO
565  8103 FORMAT(15x,'NUMBER FROM SAT. ID',i4,4x,':',i6)
566  IF(kntsat(260).GT.0) print 8104
567  8104 FORMAT(15x,'NUMBER FROM UNKNOWN SAT. ID:',i6)
568  print 8105
569  8105 FORMAT(/)
570  END IF
571  END IF
572  GO TO 99
573  END IF
574  kount = kount + 1
575 C INITIALIZE THE OUTPUT ON29 ARRAY
576  CALL unpk7702(rdata,itp)
577  IF(itp.EQ.1) THEN
578 C-----------------------------------------------------------------------
579 C THE FOLLOWING PERTAINS TO WIND PROFILER REPORTS
580 C-----------------------------------------------------------------------
581 C STORE THE HEADER INFORMATION INTO ON29 FORMAT
582  CALL unpk7703(lunit,rdata,iret)
583 C IRET.GE.2 MEANS RPT NOT RETURNED DUE TO MSG DATA IN HDR (RETURN)
584  IF(iret.GE.2) GO TO 99
585 C STORE THE SURFACE DATA INTO ON29 FORMAT (CATEGORY 10)
586  CALL unpk7704(lunit,rdata)
587 C STORE THE UPPER-AIR DATA INTO ON29 FORMAT (CATEGORY 11)
588  CALL unpk7705(lunit,rdata)
589  rdatx(1:1200) = rdata(1:1200)
590  IF(idata(35)+idata(37).EQ.0) iret = 5
591  ELSE IF(itp.EQ.2) THEN
592 C-----------------------------------------------------------------------
593 C THE FOLLOWING PERTAINS TO GOES SOUNDING/RADIANCE REPORTS
594 C-----------------------------------------------------------------------
595 C STORE THE HEADER INFORMATION INTO ON29 FORMAT
596  CALL unpk7708(lunit,rdata,kount,iret)
597 C IRET.GE.2 MEANS RPT NOT RETURNED DUE TO MSG DATA IN HDR (RETURN)
598  IF(iret.GE.2) GO TO 99
599 C STORE THE UPPER-AIR DATA/RADIANCE INTO ON29 FORMAT (CATEGORY 12, 13)
600  CALL unpk7709(lunit,rdata,iret)
601  ELSE IF(itp.EQ.3) THEN
602 C-----------------------------------------------------------------------
603 C THE FOLLOWING PERTAINS TO NEXRAD (VAD) WIND REPORTS
604 C-----------------------------------------------------------------------
605 C STORE THE HEADER INFORMATION INTO ON29 FORMAT
606  CALL unpk7706(lunit,rdata,iret)
607 C IRET.GE.2 MEANS RPT NOT RETURNED DUE TO MSG DATA IN HDR (RETURN)
608  IF(iret.GE.2) GO TO 99
609 C STORE THE UPPER-AIR DATA INTO ON29 FORMAT (CATEGORY 4)
610  CALL unpk7707(lunit,rdata,iret)
611 C-----------------------------------------------------------------------
612  END IF
613  99 CONTINUE
614 C PRIOR TO RETURNING SAVE INPUT DATE & HR RANGE ARGUMENTS FROM THIS CALL
615  lsdate = idate
616  lshe = ihe
617  lshl = ihl
618  RETURN
619 C-----------------------------------------------------------------------
620  9999 CONTINUE
621 C COME HERE IF NULL OR NON-BUFR FILE IS INPUT - RETURN WITH IRET = 1
622  print *, ' *** W3UNPK77 ERROR: INPUT FILE IN UNIT ',lunit,' IS ',
623  $ 'EITHER A NULL OR NON-BUFR FILE'
624  9998 continue
625  rewind lunit
626  iret = 1
627  lsdate = idate
628  lshe = ihe
629  lshl = ihl
630  END
631 C> @brief Reads a single report out of bufr dataset
632 C> @author Dennis Keyser @date 1996-12-16
633 
634 C> Calls bufrlib routines to read in a bufr message and then read a single
635 C> report (subset) out of the message.
636 C>
637 C> ### Program History Log:
638 C> Date | Programmer | Comment
639 C> -----|------------|--------
640 C> 1996-12-16 | Dennis Keyser NP22 | Initial.
641 C>
642 C> @param[in] LUNIT Fortran unit number for input data file.
643 C> @param[out] ITP The type of report that has been decoded {=1 - wind profiler,
644 C> =2 - goes sndg, =3 - nexrad(vad) wind}
645 C> @param[out] IRET Return code as described in w3unpk77 docblock
646 C>
647 C> @author Dennis Keyser @date 1996-12-16
648  SUBROUTINE unpk7701(LUNIT,ITP,IRET)
649  CHARACTER*8 SUBSET
650  integer mdate(4),ndate(8)
651  dimension rinc(5)
652  COMMON /pk77bb/kdate(8),ldate(8),iprint
653  COMMON /pk77cc/index
654  COMMON /pk77dd/lshe,lshl,icdate(5),iddate(5)
655 
656  SAVE
657 
658  DATA irec/0/
659 
660  10 CONTINUE
661 C=======================================================================
662  IF(index.EQ.0) THEN
663 
664 C READ IN NEXT BUFR MESSAGE
665 
666  CALL readmg(lunit,subset,ibdate,jret)
667  IF(jret.NE.0) THEN
668 C-----------------------------------------------------------------------
669  print 101
670  101 FORMAT(' ---> W3UNPK77: ALL BUFR MESSAGES READ IN AND DECODED'/)
671  iret = 1
672  RETURN
673 C-----------------------------------------------------------------------
674  END IF
675  if(ibdate.lt.100000000) then
676 c If input BUFR file does not return messages with a 4-digit year,
677 c something is wrong (even non-compliant BUFR messages should
678 c construct a 4-digit year as long as datelen(10) has been called
679  print *, '##W3UNP777/UNPK7701 - A 10-digit Sect. 1 BUFR ',
680  $ 'message date was not returned in unit ',lunit,' - ',
681  $ 'problem with BUFR file - ier = 1'
682  iret = 1
683  return
684  end if
685  CALL ufbcnt(lunit,irec,isub)
686  mdate(1) = ibdate/1000000
687  mdate(2) = mod((ibdate/10000),100)
688  mdate(3) = mod((ibdate/100),100)
689  mdate(4) = mod(ibdate,100)
690 C ALL JBUFR MESSAGES CURRENTLY HAVE "00" FOR MINUTES IN SECTION 1
691  ndate(1:3) = mdate(1:3)
692  ndate(4) = 0
693  ndate(5) = mdate(4)
694  ndate(6:8) = 0
695  IF(iprint.GE.1) THEN
696  print *,'HAVE SUCCESSFULLY READ IN A BUFR MESSAGE'
697  print 103
698  103 FORMAT(' BUFR FOUND BEGINNING AT BYTE 1 OF MESSAGE')
699  print 105, irec,mdate,subset
700  105 FORMAT(8x,'HAVE READ IN A BUFR MESSAGE NO.',i3,', DATE: ',
701  $ i6,3i4,' 0; TABLE A ENTRY = ',a8,' AND EDIT. NO. = 2'/)
702  END IF
703  IF(subset.EQ.'NC002007') THEN
704  IF(iprint.GE.1) print *, 'THIS MESSAGE CONTAINS WIND ',
705  $ 'PROFILER REPORTS'
706  itp = 1
707  ELSE IF(subset.EQ.'NC002008') THEN
708  IF(iprint.GE.1) print *, 'THIS MESSAGE CONTAINS NEXRAD ',
709  $ '(VAD) WIND REPORTS'
710  itp = 3
711  ELSE IF(subset.EQ.'NC003001') THEN
712  IF(iprint.GE.1) print *, 'THIS MESSAGE CONTAINS GOES ',
713  $ 'SOUNDING/RADIANCE REPORTS'
714  itp = 2
715  ELSE
716  print 107, irec
717  107 FORMAT(' *** W3UNPK77 WARNING: BUFR MESSAGE NO.',i3,' CONTAINS ',
718  $ 'REPORTS THAT CANNOT BE DECODED BY W3UNPK77, TRY READING NEXT ',
719  $ 'MSG'/)
720  index = 0
721  GO TO 10
722  END IF
723  call w3difdat(kdate,ndate,3,rinc)
724  kmin = rinc(3)
725  call w3difdat(ldate,ndate,3,rinc)
726  lmin = rinc(3)
727 C CHECK DATE OF MESSAGE AGAINST SPECIFIED TIME RANGES
728  if((kmin.gt.0.or.lmin.lt.0).AND.irec.GT.2) then
729  print 106, irec,mdate
730  106 FORMAT(' BUFR MESSAGE NO.',i3,' WITH DATE:',i5,3i3,' 0 NOT W/I',
731  $ ' REQ. TIME RANGE, TRY READING NEXT MSG'/)
732  index = 0
733  GO TO 10
734  END IF
735  END IF
736 C=======================================================================
737 C READ NEXT SUBSET (REPORT) IN MESSAGE
738 
739  IF(iprint.GT.1) print *,'CALL READSB'
740  CALL readsb(lunit,jret)
741  IF(iprint.GT.1) print *,'BACK FROM READSB'
742  IF(jret.NE.0) THEN
743  IF(index.GT.0) THEN
744 
745 C ALL SUBSETS IN THIS MESSAGE PROCESSED, READ IN NEXT MESSAGE (IF ALL
746 C MESSAGES READ IN NO MORE DATA TO PROCESS)
747 
748  IF(iprint.GT.1) print *, 'ALL REPORTS IN THIS MESSAGE ',
749  $ 'DECODED, GO ON TO NEXT MESSAGE'
750  ELSE
751 
752 C THERE WERE NO SUBSETS FOUND IN THIS BUFR MESSAGE, GOOD CHANCE IT IS
753 C ONE OF TWO DUMMY MESSAGES AT TOP OF FILE INDICATING CENTER TIME AND
754 C DATA DUMP TIME ONLY; READ IN NEXT MESSAGE
755 
756  IF(irec.EQ.1) THEN
757  print 4567, icdate
758  4567 FORMAT(/'===> BUFR MESSAGE NO. 1 IS A DUMMY MESSAGE CONTAINING ',
759  $ 'ONLY CENTER DATE (',i5,4i3,') - NO DATA - GO ON TO NEXT ',
760  $ 'MESSAGE'/)
761  ELSE IF(irec.EQ.2) THEN
762  print 4568, iddate
763  4568 FORMAT(/'===> BUFR MESSAGE NO. 2 IS A DUMMY MESSAGE CONTAINING ',
764  $ 'ONLY DUMP DATE (',i5,4i3,') - NO DATA - GO ON TO NEXT ',
765  $ 'MESSAGE'/)
766  ELSE
767  print 4569, irec,mdate
768  4569 FORMAT(/'===> BUFR MESSAGE NO.',i3,' (DATE:',i5,3i3,' 0) ',
769  $ 'CONTAINS ZERO REPORTS FOR SOME UNEXPLAINED REASON - GO ON TO ',
770  $ 'NEXT MESSAGE'/)
771  END IF
772  END IF
773  index = 0
774  GO TO 10
775  END IF
776 C-----------------------------------------------------------------------
777  IF(iprint.GT.1) print *, 'READY TO PROCESS NEW DECODED REPORT'
778 C***********************************************************************
779 C A SINGLE REPORT HAS BEEN SUCCESSFULLY DECODED
780 C***********************************************************************
781  index = index + 1
782  IF(iprint.GE.1) print *, 'WORKING WITH SUBSET NUMBER ',index
783  RETURN
784  END
785 C> @brief Initializes the output array for a report.
786 C> @author Dennis Keyser @date 1996-12-16
787 
788 C> Initializes the output array which holds a single report in the quasi-office
789 C> note 29 unpacked format to all missing.
790 C>
791 C> ### Program History Log:
792 C> Date | Programmer | Comment
793 C> -----|------------|--------
794 C> 1996-12-16 | Dennis Keyser NP22 | Initial.
795 C> @param[in] ITP the type of report that has been decoded {=1 - wind profiler, =2 - goes sndg, =3 - nexrad(vad) wind}
796 C> @param[out] RDATA single report returned an a quasi-office note 29 unpacked format; all data are missing
797 C>
798 C> @author Dennis Keyser @date 1996-12-16
799  SUBROUTINE unpk7702(RDATA,ITP)
800  REAL RDATA(*),RDATX(1200)
801  INTEGER IDATA(1200),IRTYP(3)
802  CHARACTER*8 COB
803 C
804  SAVE
805 C
806  equivalence(rdatx,idata),(cob,iob)
807  DATA xmsg/99999./,imsg/99999/,irtyp/71,61,72/
808  rdatx(1) = xmsg
809  rdatx(2) = xmsg
810  idata(3) = imsg
811  rdatx(4) = xmsg
812  cob = '999999 '
813  idata(5) = iob
814  cob = '9999 '
815  idata(6) = iob
816  rdatx(7) = xmsg
817  idata(8) = imsg
818  idata(9) = irtyp(itp)
819  idata(10) = imsg
820  cob = ' '
821  idata(11) = iob
822  idata(12) = iob
823 C
824 C ALL TYPES -- LOAD ZEROS INTO THE DEFINING WORD PAIRS
825 C
826  idata(13:42) = 0
827 C
828 C ALL TYPES -- LOAD MISSINGS INTO THE DATA PORTION
829 C
830  rdatx(43:1200) = xmsg
831  IF(itp.EQ.1) THEN
832 C
833 C PROFILER -- LOAD INTEGER MISSING WHERE APPROPRIATE
834 C (Current limit of 104 Cat. 11 levels)
835 C
836  idata(53:1200:11) = imsg
837  idata(55:1200:11) = imsg
838  idata(56:1200:11) = imsg
839  idata(60:1200:11) = imsg
840  ELSE IF(itp.EQ.2) THEN
841 C
842 C GOES -- LOAD DEFAULT OF BLANK CHARACTERS INTO CAT. 12
843 C LEVEL QUALITY MARKERS
844 C (Current limit of 50 Cat. 12 levels)
845 C (could be expanded if need be)
846 C
847  idata(49:392:7) = iob
848 C
849 C GOES -- LOAD DEFAULT OF BLANK CHARACTER INTO FIRST CAT. 08
850 C LEVEL QUALITY MARKER
851 C (Current limit of 9 Cat. 08 levels)
852 C (could be expanded if need be)
853 C
854  idata(395:419:3) = iob
855 C GOES -- LOAD INTEGER MISSING INTO CAT. 13 LEVEL CHANNEL NUMBER
856 C -- LOAD DEFAULT OF BLANK CHARACTER INTO CAT. 13 LEVEL
857 C QUALITY MARKER
858 C (Current limit of 60 Cat. 13 levels)
859 C (could be expanded if need be)
860 C
861  idata(420:599:3) = imsg
862  idata(422:599:3) = iob
863  ELSE IF(itp.EQ.3) THEN
864 C
865 C VADWND -- LOAD DEFAULT OF BLANK CHARACTER INTO HGHT CAT. 04
866 C LEVEL QUALITY MARKER
867 C (Current limit of 70 Cat. 04 levels)
868 C (could be expanded if need be)
869 C
870  idata(46:1200:4) = iob
871  END IF
872  rdata(1:1200) = rdatx(1:1200)
873  RETURN
874  END
875 C> @brief Fills in header in o-put array - pflr rpt.
876 C> @author Dennis Keyser @date 2002-03-05
877 
878 C> For report (subset) read out of bufr message (passed in
879 C> internally via bufrlib storage), calls bufrlib routine to decode
880 C> header data for wind profiler report. header is then filled into
881 C> the output array which holds a single wind profiler report in the
882 C> quasi-office note 29 unpacked format.
883 C>
884 C> ### Program History Log:
885 C> Date | Programmer | Comment
886 C> -----|------------|--------
887 C> 1996-12-16 | Dennis Keyser NP22 | Initial.
888 C> 2002-03-05 | Dennis Keyser | Accounts for changes in input proflr (wind profiler) bufr dump file after 3/2002: mnemonic "npsm" is no longer available, mnemonic "tpse" replaces "tpmi" (avg. time in minutes still output) (will still work properly for input proflr dump files prior to 3/2002)
889 C>
890 C> @param[in] LUNIT Fortran unit number for input data file
891 C> @param[inout] RDATA Single wind profiler report in a quasi-office note 29 unpacked format with [out] header information filled in [in] all data initialized as missing
892 C> @param[out] IRET Return code as described in w3unpk77 docblock
893 C>
894 C> @author Dennis Keyser @date 2002-03-05
895  SUBROUTINE unpk7703(LUNIT,RDATA,IRET)
896  CHARACTER*6 STNID
897  CHARACTER*8 COB
898  CHARACTER*35 HDR1,HDR2
899  INTEGER IDATA(1200)
900  REAL(8) HDR_8(16)
901  REAL HDR(16),RDATA(*),RDATX(1200)
902  COMMON /pk77bb/kdate(8),ldate(8),iprint
903 
904  SAVE
905 
906  equivalence(rdatx,idata),(cob,iob)
907  DATA xmsg/99999./,imsg/99999/
908  DATA hdr1/'CLAT CLON TSIG SELV NPSM TPSE WMOB '/
909  DATA hdr2/'WMOS YEAR MNTH DAYS HOUR MINU TPMI '/
910  rdatx(1:1200) = rdata(1:1200)
911  hdr_8 = 10.0e10
912  CALL ufbint(lunit,hdr_8,16,1,nlev,hdr1//hdr2);hdr=hdr_8
913  IF(nlev.NE.1) THEN
914 C.......................................................................
915 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS NOT WHAT IS EXPECTED --
916 C SET IRET = 6 AND RETURN
917  print 217, nlev
918  217 FORMAT(/' ##W3UNPK77: THE NUMBER OF DECODED "LEVELS" (=',i5,') ',
919  $ 'IS NOT WHAT IS EXPECTED (1) - IRET = 6'/)
920  iret = 6
921  RETURN
922 C.......................................................................
923  END IF
924 
925 C LATITUDE (STORED AS REAL)
926 
927  m = 1
928  IF(iprint.GT.1) print 199, hdr(1),m
929  199 FORMAT(5x,'HDR HERE IS: ',f17.4,'; INDEX IS: ',i3)
930  IF(hdr(1).LT.xmsg) THEN
931  rdatx(1) = nint(hdr(1) * 100.)
932  nnnnn = 1
933  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
934  198 FORMAT(5x,'DATA(',i5,') STORED AS: ',f10.2)
935  ELSE
936  iret = 2
937  print 102
938  102 FORMAT(' *** W3UNPK77 ERROR: LAT MISSING FOR WIND PROFILER ',
939  $ 'REPORT'/)
940  RETURN
941  END IF
942 
943 C LONGITUDE (STORED AS REAL)
944 
945  m = 2
946  IF(iprint.GT.1) print 199, hdr(2),m
947  IF(hdr(2).LT.xmsg) THEN
948  rdatx(2) = nint(mod((36000.-(hdr(2)*100.)),36000.))
949  nnnnn = 2
950  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
951  ELSE
952  iret = 2
953  print 104
954  104 FORMAT(' *** W3UNPK77 ERROR: LON MISSING FOR WIND PROFILER ',
955  $ 'REPORT'/)
956  RETURN
957  END IF
958 
959 C TIME SIGNIFICANCE (STORED AS INTEGER)
960 
961  m = 3
962  IF(iprint.GT.1) print 199, hdr(3),m
963  IF(hdr(3).LT.xmsg) idata(3) = nint(hdr(3))
964  nnnnn = 3
965  IF(iprint.GT.1) print 197, nnnnn,idata(nnnnn)
966  197 FORMAT(5x,'IDATA(',i5,') STORED AS: ',i10)
967 
968 C STATION ELEVATION (FROM REPORTED STN. HGHT; STORED IN OUTPUT)
969 C (STORED AS REAL)
970 
971  m = 4
972  IF(iprint.GT.1) print 199, hdr(4),m
973  IF(hdr(4).LT.xmsg) rdatx(7) = nint(hdr(4))
974  nnnnn = 7
975  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
976 
977 C SUBMODE INFORMATION
978 C EDITION NUMBER (ALWAYS = 2)
979 C (PACKED AS SUBMODE TIMES 10 PLUS EDITION NUMBER - INTEGER)
980 C {NOTE: After 3/2002, the submode information is no longer
981 C available and is stored as missing (3).}
982 
983  m = 5
984  iedtn = 2
985  idata(8) = (3 * 10) + iedtn
986  IF(iprint.GT.1) print 199, hdr(5),m
987  IF(hdr(5).LT.xmsg) idata(8) = (nint(hdr(5)) * 10) + iedtn
988  nnnnn = 8
989  IF(iprint.GT.1) print 197, nnnnn,idata(nnnnn)
990 
991 C AVERAGING TIME (STORED AS INTEGER)
992 C (NOTE: Prior to 3/2002, this is decoded in minutes, after
993 C 3/2002 this is decoded in seconds - in either case
994 C it is stored in minutes)
995 
996  m = 6
997  IF(iprint.GT.1) print 199, hdr(6),m
998  IF(iprint.GT.1) print 199, hdr(14),m
999  IF(hdr(6).LT.xmsg) THEN
1000  idata(10) = nint(hdr(6)/60.)
1001  ELSE IF(hdr(14).LT.xmsg) THEN
1002  idata(10) = nint(hdr(14))
1003  END IF
1004  nnnnn = 10
1005  IF(iprint.GT.1) print 197, nnnnn,idata(nnnnn)
1006 C-----------------------------------------------------------------------
1007 
1008 C STATION IDENTIFICATION (STORED AS CHARACTER)
1009 C (OBTAINED FROM ENCODED WMO BLOCK/STN NUMBERS)
1010 
1011  stnid = ' '
1012 
1013 C WMO BLOCK NUMBER (STORED AS CHARACTER)
1014 
1015  m = 7
1016  IF(iprint.GT.1) print 199, hdr(7),m
1017  IF(hdr(7).LT.xmsg) WRITE(stnid(1:2),'(I2.2)') nint(hdr(7))
1018 
1019 C WMO STATION NUMBER (STORED AS CHARACTER)
1020 
1021  m = 8
1022  IF(iprint.GT.1) print 199, hdr(8),m
1023  IF(hdr(8).LT.xmsg) WRITE(stnid(3:5),'(I3.3)') nint(hdr(8))
1024  cob(1:4) = stnid(1:4)
1025  idata(11) = iob
1026  nnnnn = 11
1027  IF(iprint.GT.1) print 196, nnnnn,cob(1:4)
1028  196 FORMAT(5x,'IDATA(',i5,') STORED IN CHARACTER AS: "',a4,'"')
1029  cob(1:4) = stnid(5:6)//' '
1030  idata(12) = iob
1031  nnnnn = 12
1032  IF(iprint.GT.1) print 196, nnnnn,cob(1:4)
1033 
1034 cvvvvvdak port
1035 C LOAD THE YEAR/MONTH (STORED AS CHARACTER IN FORM YYMM)
1036 caaaaadak port
1037 
1038  m = 9
1039  IF(iprint.GT.1) print 199, hdr(9),m
1040  iyear = imsg
1041  IF(hdr(9).LT.xmsg) iyear = nint(hdr(9))
1042  m = 10
1043  IF(iprint.GT.1) print 199, hdr(10),m
1044  IF(hdr(10).LT.xmsg.AND.iyear.LT.imsg) THEN
1045 cvvvvvdak port
1046  iyear = mod(iyear,100)
1047 caaaaadak port
1048  iyear = nint(hdr(10)) + (iyear * 100)
1049 cvvvvvdak port
1050 cdak WRITE(COB,'(I6.6,2X)') IYEAR
1051  WRITE(cob,'(I4.4,4X)') iyear
1052 caaaaadak port
1053  idata(5) = iob
1054  nnnnn = 5
1055  IF(iprint.GT.1) print 9196, nnnnn,cob(1:6)
1056  9196 FORMAT(5x,'IDATA(',i5,') STORED IN CHARACTER AS: "',a6,'"')
1057  ELSE
1058  GO TO 30
1059  END IF
1060 
1061 C LOAD THE DAY/HOUR (STORED AS CHARACTER IN FORM DDHH)
1062 C AND THE OBSERVATION TIME (STORED AS REAL)
1063 
1064  m = 11
1065  IF(iprint.GT.1) print 199, hdr(11),m
1066  iday = imsg
1067  IF(hdr(11).LT.xmsg) iday = nint(hdr(11))
1068  m = 12
1069  IF(iprint.GT.1) print 199, hdr(12),m
1070  IF(hdr(12).LT.xmsg.AND.iday.LT.imsg) THEN
1071  ihrt = nint(hdr(12))
1072  m = 13
1073  IF(iprint.GT.1) print 199, hdr(13),m
1074  IF(hdr(13).GE.xmsg) GO TO 30
1075  rmnt = hdr(13)
1076  rdatx(4) = nint((ihrt * 100.) + (rmnt * 100.)/60.)
1077  nnnnn = 4
1078  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
1079  ihrt = ihrt + (iday * 100)
1080  WRITE(cob(1:4),'(I4.4)') ihrt
1081  idata(6) = iob
1082  nnnnn = 6
1083  IF(iprint.GT.1) print 196, nnnnn,cob(1:4)
1084  ELSE
1085  GO TO 30
1086  END IF
1087  rdata(1:1200) = rdatx(1:1200)
1088  RETURN
1089  30 CONTINUE
1090  iret = 4
1091  RETURN
1092  END
1093 C> @brief Fills cat.10 into o-put array - pflr rpt
1094 C> @author Dennis Keyser @date 2002-03-05
1095 
1096 C> For report (subset) read out of bufr message (passed in
1097 C> internally via bufrlib storage), calls bufrlib routine to decode
1098 C> surface data for wind profiler report. Surface data are then
1099 C> filled into the output array as category 10. The ouput array
1100 C> holds a single wind profiler report in the quasi-office note 29
1101 C> unpacked format.
1102 C>
1103 C> ### Program History Log:
1104 C> Date | Programmer | Comment
1105 C> -----|------------|--------
1106 C> 1996-12-16 | Dennis Keyser NP22 | Initial.
1107 C> 2002-03-05 | Dennis Keyser | Accounts for changes in input proflr (wind profiler) bufr dump file after 3/2002: surface data now all missing (mnemonics "pmsl", "wdir1","wspd1", "tmdb", "rehu", "reqv" no longer available) (will still work properly for input proflr dump files prior to 3/2002)
1108 C>
1109 C> @param[in] LUNIT Fortran unit number for input data file
1110 C> @param[inout] RDATA Single wind profiler report in a quasi-office note 29 unpacked format with [out] header information filled in [in] all data initialized as missing
1111 C>
1112 C> @remark Called by subroutine w3unpkb7. after 3/2002, there is no surface data available.
1113 C>
1114 C$$$
1115  SUBROUTINE unpk7704(LUNIT,RDATA)
1116  CHARACTER*40 SRFC
1117  INTEGER IDATA(1200)
1118  REAL(8) SFC_8(8)
1119  REAL SFC(8),RDATA(*),RDATX(1200)
1120  COMMON /pk77bb/kdate(8),ldate(8),iprint
1121 
1122  SAVE
1123 
1124  equivalence(rdatx,idata)
1125  DATA xmsg/99999./
1126  DATA srfc/'PMSL WDIR1 WSPD1 TMDB REHU REQV '/
1127  rdatx(1:1200) = rdata(1:1200)
1128  sfc_8 = 10.0e10
1129  CALL ufbint(lunit,sfc_8,8,1,nlev,srfc);sfc=sfc_8
1130  IF(nlev.NE.1) THEN
1131 C.......................................................................
1132 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS NOT WHAT IS EXPECTED --
1133  print 217, nlev
1134  217 FORMAT(/' ##W3UNPK77: THE NUMBER OF DECODED "LEVELS" (=',i5,') ',
1135  $ 'IS NOT WHAT IS EXPECTED (1) - NO SFC DATA PROCESSED'/)
1136  GO TO 99
1137 C.......................................................................
1138  END IF
1139 
1140 C MSL PRESSURE (STORED AS REAL)
1141 
1142  m = 1
1143  IF(iprint.GT.1) print 199, sfc(1),m
1144  199 FORMAT(5x,'SFC HERE IS: ',f17.4,'; INDEX IS: ',i3)
1145  IF((sfc(1)*0.1).LT.xmsg) rdatx(43) = nint(sfc(1) * 0.1)
1146  nnnnn = 43
1147  IF(iprint.GT.1) print 198, nnnnn,rdatx(43)
1148  198 FORMAT(5x,'RDATA(',i5,') STORED AS: ',f10.2)
1149 
1150 C SURFACE HORIZONTAL WIND DIRECTION (STORED AS REAL)
1151 
1152  m = 2
1153  IF(iprint.GT.1) print 199, sfc(2),m
1154  IF(sfc(2).LT.xmsg) rdatx(43+2) = nint(sfc(2))
1155  nnnnn = 43 + 2
1156  IF(iprint.GT.1) print 198, nnnnn,rdatx(43+2)
1157 
1158 C SURFACE HORIZONTAL WIND SPEED (STORED AS REAL)
1159 
1160  m = 3
1161  IF(iprint.GT.1) print 199, sfc(3),m
1162  IF(sfc(3).LT.xmsg) rdatx(43+3) = nint(sfc(3) * 10.)
1163  nnnnn = 43 + 3
1164  IF(iprint.GT.1) print 198, nnnnn,rdatx(43+3)
1165 
1166 C SURFACE TEMPERATURE (STORED AS REAL)
1167 
1168  m = 4
1169  IF(iprint.GT.1) print 199, sfc(4),m
1170  IF(sfc(4).LT.xmsg) rdatx(43+4) = nint(sfc(4) * 10.)
1171  nnnnn = 43 + 4
1172  IF(iprint.GT.1) print 198, nnnnn,rdatx(43+4)
1173 
1174 C RELATIVE HUMIDITY (STORED AS REAL)
1175 
1176  m = 5
1177  IF(iprint.GT.1) print 199, sfc(5),m
1178  IF(sfc(5).LT.xmsg) rdatx(43+5) = nint(sfc(5))
1179  nnnnn = 43 + 5
1180  IF(iprint.GT.1) print 198, nnnnn,rdatx(43+5)
1181 
1182 C RAINFALL RATE (STORED AS REAL)
1183 
1184  m = 6
1185  IF(iprint.GT.1) print 199, sfc(6),m
1186  IF(sfc(6).LT.xmsg) rdatx(43+6) = nint(sfc(6) * 1.e7)
1187  nnnnn = 43 + 6
1188  IF(iprint.GT.1) print 198, nnnnn,rdatx(43+6)
1189 
1190 C SET CATEGORY COUNTERS FOR SURFACE DATA
1191 
1192  idata(35) = 1
1193  idata(36) = 43
1194  99 CONTINUE
1195  IF(iprint.GT.1) print *, 'IDATA(35)=',idata(35),'; IDATA(36)=',
1196  $ idata(36)
1197  rdata(1:1200) = rdatx(1:1200)
1198  RETURN
1199  END
1200 C> @brief Fills cat.11 into o-put array - pflr rpt
1201 C> @author Dennis Keyser @date 2002-03-05
1202 
1203 C> For report (subset) read out of bufr message (passed in
1204 C> internally via bufrlib storage), calls bufrlib routine to decode
1205 C> upper-air data for wind profiler report. upper-air data are then
1206 C> filled into the output array as category 11. the ouput array
1207 C> holds a single wind profiler report in the quasi-office note 29
1208 C> unpacked format.
1209 C>
1210 C> ### Program History Log:
1211 C> Date | Programmer | Comment
1212 C> -----|------------|--------
1213 C> 1996-12-16 | Dennis Keyser NP22 | Initial.
1214 C> 1998-07-09 | Dennis Keyser | Modified wind profiler cat. 11 (height, horiz. significance, vert. significance) processing to account for updates to bufrtable mnemonics in /dcom
1215 C> 2002-03-05 | Dennis Keyser | Accounts for changes in input proflr (wind profiler) bufr dump file after 3/2002: mnemonics "acavh", "acavv", "spp0", and "nphl" no longer available; (will still work properly for input proflr dump files prior to 3/2002)
1216 C>
1217 C> @param[in] LUNIT Fortran unit number for input data file
1218 C> @param[inout] RDATA Single wind profiler report in a quasi-office note 29 unpacked format with [out] header information filled in [in] all data initialized as missing
1219 C>
1220 C$$$
1221  SUBROUTINE unpk7705(LUNIT,RDATA)
1222  CHARACTER*31 UAIR1,UAIR2
1223  CHARACTER*16 UAIR3
1224  INTEGER IDATA(1200)
1225  REAL(8) UAIR_8(16,255)
1226  REAL UAIR(16,255),RDATA(*),RDATX(1200)
1227  COMMON /pk77bb/kdate(8),ldate(8),iprint
1228 
1229  SAVE
1230 
1231  equivalence(rdatx,idata)
1232  DATA xmsg/99999./
1233  DATA uair1/'HEIT WDIR WSPD NPQC WCMP ACAVH '/
1234  DATA uair2/'ACAVV SPP0 SDHS SDVS NPHL '/
1235  DATA uair3/'HAST ACAV1 ACAV2'/
1236  rdatx(1:1200) = rdata(1:1200)
1237  nsfc = 0
1238  ilvl = 0
1239  ilc = 0
1240 C FIRST UPPER-AIR LEVEL IS THE SURFACE INFORMATION
1241  IF(iprint.GT.1) print 1078, ilc,ilvl
1242  1078 FORMAT(' ATTEMPTING 1ST (SFC) LVL WITH ILC =',i5,'; NO. LEVELS ',
1243  $ 'PROCESSED TO NOW =',i5)
1244  rdatx(50+ilc) = rdatx(7)
1245  IF(iprint.GT.1) print 198, 50+ilc,rdatx(50+ilc)
1246  198 FORMAT(5x,'RDATA(',i5,') STORED AS: ',f10.2)
1247  IF(rdatx(50+ilc).LT.xmsg) nsfc = 1
1248  IF(idata(35).GE.1) THEN
1249  rdatx(50+ilc+1) = rdatx(idata(36)+2)
1250  rdatx(50+ilc+2) = rdatx(idata(36)+3)
1251  END IF
1252  IF(iprint.GT.1) print 198, 50+ilc+1,rdatx(50+ilc+1)
1253  IF(rdatx(50+ilc+1).LT.xmsg) nsfc = 1
1254  IF(iprint.GT.1) print 198, 50+ilc+2,rdatx(50+ilc+2)
1255  IF(rdatx(50+ilc+2).LT.xmsg) nsfc = 1
1256  ilvl = ilvl + 1
1257  ilc = ilc + 11
1258  IF(iprint.GT.1) print *,'HAVE COMPLETED LEVEL ',ilvl,' WITH ',
1259  $ 'NSFC=',nsfc,'; GOING INTO NEXT LEVEL WITH ILC=',ilc
1260  uair_8 = 10.0e10
1261  CALL ufbint(lunit,uair_8,16,255,nlev,uair1//uair2//uair3)
1262  uair=uair_8
1263  IF(nlev.EQ.0) THEN
1264 C.......................................................................
1265 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS ZERO --
1266  IF(nsfc.EQ.0) THEN
1267 C ... NO UPPER AIR DATA PROCESSED
1268  print 217
1269  217 FORMAT(/' ##W3UNPK77: NO UPPER-AIR DATA PROCESSED FOR THIS',
1270  $ ' REPORT -- NLEV = 0 AND NSFC = 0'/)
1271  GO TO 99
1272  ELSE
1273 C ... ONLY FIRST (SURFACE) UPPER AIR LEVEL DATA PROCESSED
1274  print 218
1275  218 FORMAT(/' ##W3UNPK77: NO UPPER-AIR DATA ABOVE FIRST (SURFACE) ',
1276  $ 'LEVEL PROCESSED FOR THIS REPORT -- NLEV = 0 AND NSFC > 0'/)
1277  GO TO 98
1278  END IF
1279 C.......................................................................
1280  END IF
1281  IF(iprint.GT.1) print 1068, nlev
1282  1068 FORMAT(' THIS REPORT CONTAINS ',i3,' LEVELS OF DATA (NOT ',
1283  $ 'INCLUDING BOTTOM -SURFACE- LEVEL)')
1284  DO i = 1,nlev
1285  IF(iprint.GT.1) print 1079, ilc,ilvl
1286  1079 FORMAT(' ATTEMPTING NEW LEVEL WITH ILC =',i5,'; NO. LEVELS ',
1287  $ 'PROCESSED TO NOW =',i5)
1288 
1289 C HEIGHT ABOVE SEA-LEVEL (STORED AS REAL)
1290 C (NOTE: At one time, possibly even now, the height above sea
1291 C level was erroneously stored under mnemonic "HAST"
1292 C when it should have been stored under mnemonic "HEIT".
1293 C ("HAST" is defined as the height above the station.)
1294 C Will test first for valid data in "HEIT" - if missing,
1295 C then will use data in "HAST" - this will allow this
1296 C routine to transition w/o change when the fix is made.)
1297 
1298  IF(uair(1,i).LT.xmsg) THEN
1299  m = 1
1300  IF(iprint.GT.1) print 199, uair(1,i),m
1301  199 FORMAT(5x,'UAIR HERE IS: ',f17.4,'; INDEX IS: ',i3)
1302  rdatx(50+ilc) = nint(uair(1,i))
1303  ELSE
1304  m = 12
1305  IF(iprint.GT.1) print 199, uair(12,i),m
1306  IF(uair(12,i).LT.xmsg) rdatx(50+ilc) = nint(uair(12,i))
1307  END IF
1308  IF(iprint.GT.1) print 198, 50+ilc,rdatx(50+ilc)
1309  ilvl = ilvl + 1
1310 
1311 C HORIZONTAL WIND DIRECTION (STORED AS REAL)
1312 
1313  m = 2
1314  IF(iprint.GT.1) print 199, uair(2,i),m
1315  IF(uair(2,i).LT.xmsg) rdatx(50+ilc+1) = nint(uair(2,i))
1316  IF(iprint.GT.1) print 198, 50+ilc+1,rdatx(50+ilc+1)
1317 
1318 C HORIZONTAL WIND SPEED (STORED AS REAL)
1319 
1320  m = 3
1321  IF(iprint.GT.1) print 199, uair(3,i),m
1322  IF(uair(3,i).LT.xmsg) rdatx(50+ilc+2) =nint(uair(3,i) * 10.)
1323  IF(iprint.GT.1) print 198, 50+ilc+2,rdatx(50+ilc+2)
1324 
1325 C QUALITY CODE (STORED AS INTEGER)
1326 
1327  m = 4
1328  IF(iprint.GT.1) print 199, uair(4,i),m
1329  IF(uair(4,i).LT.xmsg) idata(50+ilc+3) = nint(uair(4,i))
1330  IF(iprint.GT.1) print 197, 50+ilc+3,idata(50+ilc+3)
1331  197 FORMAT(5x,'IDATA(',i5,') STORED AS: ',i10)
1332 
1333 C VERTICAL WIND COMPONENT (W) (STORED AS REAL)
1334 
1335  m = 5
1336  IF(iprint.GT.1) print 199, uair(5,i),m
1337  IF(uair(5,i).LT.xmsg) rdatx(50+ilc+4) = nint(uair(5,i) * 100.)
1338  IF(iprint.GT.1) print 198, 50+ilc+4,rdatx(50+ilc+4)
1339 
1340 C HORIZONTAL CONSENSUS NUMBER (STORED AS INTEGER)
1341 C (NOTE: Prior to 2/18/1999, the horizonal consensus number was
1342 C stored under mnemonic "ACAV1".
1343 C From 2/18/1999 through 3/2002, the horizontal consensus
1344 C number was stored under mnemonic "ACAVH".
1345 C After 3/2002, the horizontal consensus number is no
1346 C longer stored.
1347 C Will test first for valid data in "ACAVH" - if missing,
1348 C then will test for data in "ACAV1" - this will allow
1349 C this routine to work properly with historical data.)
1350 
1351  IF(iprint.GT.1) print 199, uair(6,i),m
1352  IF(iprint.GT.1) print 199, uair(13,i),m
1353  IF(uair(6,i).LT.xmsg) THEN
1354  m = 6
1355  idata(50+ilc+5) = nint(uair(6,i))
1356  ELSE
1357  m = 13
1358  IF(uair(13,i).LT.xmsg) idata(50+ilc+5) = nint(uair(13,i))
1359  END IF
1360  IF(iprint.GT.1) print 197, 50+ilc+5,idata(50+ilc+5)
1361 
1362 C VERTICAL CONSENSUS NUMBER (STORED AS INTEGER)
1363 C (NOTE: Prior to 2/18/1999, the vertical consensus number was
1364 C stored under mnemonic "ACAV2".
1365 C From 2/18/1999 through 3/2002, the vertical consensus
1366 C number was stored under mnemonic "ACAVV".
1367 C After 3/2002, the vertical consensus number is no
1368 C longer stored.
1369 C Will test first for valid data in "ACAVV" - if missing,
1370 C then will test for data in "ACAV2" - this will allow
1371 C this routine to work properly with historical data.)
1372 
1373  IF(iprint.GT.1) print 199, uair(7,i),m
1374  IF(iprint.GT.1) print 199, uair(14,i),m
1375  IF(uair(7,i).LT.xmsg) THEN
1376  m = 7
1377  idata(50+ilc+6) = nint(uair(7,i))
1378  ELSE
1379  m = 14
1380  IF(uair(14,i).LT.xmsg) idata(50+ilc+6) = nint(uair(14,i))
1381  END IF
1382  IF(iprint.GT.1) print 197, 50+ilc+6,idata(50+ilc+6)
1383 
1384 C SPECTRAL PEAK POWER (STORED AS REAL)
1385 C (NOTE: After 3/2002, the spectral peak power is no longer
1386 C stored.)
1387 
1388  m = 8
1389  IF(iprint.GT.1) print 199, uair(8,i),m
1390  IF(uair(8,i).LT.xmsg) rdatx(50+ilc+7) = nint(uair(8,i))
1391  IF(iprint.GT.1) print 198, 50+ilc+7,rdatx(50+ilc+7)
1392 
1393 C HORIZONTAL WIND SPEED STANDARD DEVIATION (STORED AS REAL)
1394 
1395  m = 9
1396  IF(iprint.GT.1) print 199, uair(9,i),m
1397  IF(uair(9,i).LT.xmsg) rdatx(50+ilc+8)=nint(uair(9,i) * 10.)
1398  IF(iprint.GT.1) print 198, 50+ilc+8,rdatx(50+ilc+8)
1399 
1400 C VERTICAL WIND COMPONENT STANDARD DEVIATION (STORED AS REAL)
1401 
1402  m = 10
1403  IF(iprint.GT.1) print 199, uair(10,i),m
1404  IF(uair(10,i).LT.xmsg) rdatx(50+ilc+9) =nint(uair(10,i) * 10.)
1405  IF(iprint.GT.1) print 198, 50+ilc+9,rdatx(50+ilc+9)
1406 
1407 C MODE INFORMATION (STORED AS INTEGER)
1408 C (NOTE: After 3/2002, the mode information is no longer stored.)
1409 
1410  m = 11
1411  IF(iprint.GT.1) print 199, uair(11,i),m
1412  IF(uair(11,i).LT.xmsg) idata(50+ilc+10) = nint(uair(11,i))
1413  IF(iprint.GT.1) print 197, 50+ilc+10,idata(50+ilc+10)
1414 C.......................................................................
1415  ilc = ilc + 11
1416  IF(iprint.GT.1) print *,'HAVE COMPLETED LEVEL ',ilvl,
1417  $ '; GOING INTO NEXT LEVEL WITH ILC=',ilc
1418  ENDDO
1419 
1420 C SET CATEGORY COUNTERS FOR UPPER-AIR DATA
1421 
1422  98 CONTINUE
1423  idata(37) = ilvl
1424  idata(38) = 50
1425  99 CONTINUE
1426  IF(iprint.GT.1) print *, 'NSFC=',nsfc,'; IDATA(37)=',idata(37),
1427  $ '; IDATA(38)=',idata(38)
1428  rdata(1:1200) = rdatx(1:1200)
1429  RETURN
1430  END
1431 C> @brief Fills in header in o-put array - vadw rpt.
1432 C> @author Dennis Keyser @date 1997-06-02
1433 
1434 C> For report (subset) read out of bufr message (passed in
1435 C> internally via bufrlib storage), calls bufrlib routine to decode
1436 C> header data for nexrad (vad) wind report. Header is then filled
1437 C> into the output array which holds a single vad wind report in the
1438 C> quasi-office note 29 unpacked format.
1439 C>
1440 C> ### Program History Log:
1441 C> Date | Programmer | Comment
1442 C> -----|------------|--------
1443 C> 1997-06-02 | Dennis Keyser NP22 | Initial.
1444 C>
1445 C> @param[in] LUNIT Fortran unit number for input data file
1446 C> @param[inout] RDATA Single wind profiler report in a quasi-office note 29 unpacked format with [out] header information filled in [in] all data initialized as missing
1447 C> @param[out] IRET Return code as described in w3unpk77 docblock
1448 C>
1449 C> @author Dennis Keyser @date 1997-06-02
1450  SUBROUTINE unpk7706(LUNIT,RDATA,IRET)
1451  CHARACTER*8 STNID,COB
1452  CHARACTER*45 HDR1
1453  INTEGER IDATA(1200)
1454  REAL(8) HDR_8(9)
1455  REAL HDR(9),RDATA(*),RDATX(1200)
1456  COMMON /pk77bb/kdate(8),ldate(8),iprint
1457 
1458  SAVE
1459 
1460  equivalence(rdatx,idata),(stnid,hdr_8(4)),(cob,iob)
1461  DATA xmsg/99999./,imsg/99999/
1462  DATA hdr1/'CLAT CLON SELV RPID YEAR MNTH DAYS HOUR MINU '/
1463  rdatx(1:1200) = rdata(1:1200)
1464  hdr_8 = 10.0e10
1465  CALL ufbint(lunit,hdr_8,9,1,nlev,hdr1);hdr=hdr_8
1466  IF(nlev.NE.1) THEN
1467 C.......................................................................
1468 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS NOT WHAT IS EXPECTED --
1469 C SET IRET = 6 AND RETURN
1470  print 217, nlev
1471  217 FORMAT(/' ##W3UNPK77: THE NUMBER OF DECODED "LEVELS" (=',i5,') ',
1472  $ 'IS NOT WHAT IS EXPECTED (1) - IRET = 6'/)
1473  iret = 6
1474  RETURN
1475 C.......................................................................
1476  END IF
1477 
1478 C LATITUDE (STORED AS REAL)
1479 
1480  m = 1
1481  IF(iprint.GT.1) print 199, hdr(1),m
1482  199 FORMAT(5x,'HDR HERE IS: ',f17.4,'; INDEX IS: ',i3)
1483  IF(hdr(1).LT.xmsg) THEN
1484  rdatx(1) = nint(hdr(1) * 100.)
1485  nnnnn = 1
1486  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
1487  198 FORMAT(5x,'RDATA(',i5,') STORED AS: ',f10.2)
1488  ELSE
1489  iret = 2
1490  print 102
1491  102 FORMAT(' *** W3UNPK77 ERROR: LAT MISSING FOR VAD WIND REPORT'/)
1492  RETURN
1493  END IF
1494 
1495 C LONGITUDE (STORED AS REAL)
1496 
1497  m = 2
1498  IF(iprint.GT.1) print 199, hdr(2),m
1499  IF(hdr(2).LT.xmsg) THEN
1500  rdatx(2) = nint(mod((36000.-(hdr(2)*100.)),36000.))
1501  nnnnn = 2
1502  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
1503  ELSE
1504  iret = 2
1505  print 104
1506  104 FORMAT(' *** W3UNPK77 ERROR: LON MISSING FOR VAD WIND REPORT'/)
1507  RETURN
1508  END IF
1509 
1510 C STATION ELEVATION (FROM REPORTED STN. HGHT; STORED IN OUTPUT)
1511 C (STORED AS REAL)
1512 
1513  m = 3
1514  IF(iprint.GT.1) print 199, hdr(3),m
1515  IF(hdr(3).LT.xmsg) rdatx(7) = nint(hdr(3))
1516  nnnnn = 7
1517  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
1518 
1519 C STATION IDENTIFICATION (STORED AS CHARACTER)
1520 C ('99'//LAST 3-CHARACTERS OF PRODUCT SOURCE ID//' ')
1521 
1522  m = 4
1523  IF(iprint.GT.1) print 299, stnid,m
1524  299 FORMAT(5x,'HDR HERE IS: ',9x,a8,'; INDEX IS: ',i3)
1525  cob(1:4) = '99'//stnid(2:3)
1526  idata(11) = iob
1527  nnnnn = 11
1528  IF(iprint.GT.1) print 196, nnnnn,cob(1:4)
1529  196 FORMAT(5x,'IDATA(',i5,') STORED IN CHARACTER AS: "',a4,'"')
1530  cob(1:4) = stnid(4:4)//' '
1531  idata(12) = iob
1532  nnnnn = 12
1533  IF(iprint.GT.1) print 196, nnnnn,cob(1:4)
1534 
1535 cvvvvvdak port
1536 C LOAD THE YEAR/MONTH (STORED AS CHARACTER IN FORM YYMM)
1537 caaaaadak port
1538 
1539  m = 5
1540  IF(iprint.GT.1) print 199, hdr(5),m
1541  iyear = imsg
1542  IF(hdr(5).LT.xmsg) iyear = nint(hdr(5))
1543  m = 6
1544  IF(iprint.GT.1) print 199, hdr(6),m
1545  IF(hdr(6).LT.xmsg.AND.iyear.LT.imsg) THEN
1546 cvvvvvdak port
1547  iyear = mod(iyear,100)
1548 caaaaadak port
1549  iyear = nint(hdr(6)) + (iyear * 100)
1550 cvvvvvdak port
1551 cdak WRITE(COB,'(I6.6,2X)') IYEAR
1552  WRITE(cob,'(I4.4,4X)') iyear
1553 caaaaadak port
1554  idata(5) = iob
1555  nnnnn = 5
1556  IF(iprint.GT.1) print 9196, nnnnn,cob(1:6)
1557  9196 FORMAT(5x,'IDATA(',i5,') STORED IN CHARACTER AS: "',a6,'"')
1558  ELSE
1559  GO TO 30
1560  END IF
1561 
1562 C LOAD THE DAY/HOUR (STORED AS CHARACTER IN FORM DDHH)
1563 C AND THE OBSERVATION TIME (STORED AS REAL)
1564 
1565  m = 7
1566  IF(iprint.GT.1) print 199, hdr(7),m
1567  iday = imsg
1568  IF(hdr(7).LT.xmsg) iday = nint(hdr(7))
1569  m = 8
1570  IF(iprint.GT.1) print 199, hdr(8),m
1571  IF(hdr(8).LT.xmsg.AND.iday.LT.imsg) THEN
1572  ihrt = nint(hdr(8))
1573  m = 9
1574  IF(iprint.GT.1) print 199, hdr(9),m
1575  IF(hdr(9).GE.xmsg) GO TO 30
1576  rmnt = hdr(9)
1577  rdatx(4) = nint((ihrt * 100.) + (rmnt * 100.)/60.)
1578  nnnnn = 4
1579  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
1580  ihrt = ihrt + (iday * 100)
1581  WRITE(cob(1:4),'(I4.4)') ihrt
1582  idata(6) = iob
1583  nnnnn = 6
1584  IF(iprint.GT.1) print 196, nnnnn,cob(1:4)
1585  ELSE
1586  GO TO 30
1587  END IF
1588  rdata(1:1200) = rdatx(1:1200)
1589  RETURN
1590  30 CONTINUE
1591  iret = 4
1592  RETURN
1593  END
1594 C> @brief Fills cat. 4 into o-put array - vadw rpt
1595 C> @author Dennis Keyser @date 1997-06-02
1596 
1597 C> For report (subset) read out of bufr message (passed in
1598 C> internally via bufrlib storage), calls bufrlib routine to decode
1599 C> upper-air data for nexrad (vad) wind report. Upper-air data are
1600 C> then filled into the output array as category 4. The ouput array
1601 C> holds a single vad wind report in the quasi-office note 29
1602 C> unpacked format.
1603 C>
1604 C> ### Program History Log:
1605 C> Date | Programmer | Comment
1606 C> -----|------------|--------
1607 C> 1997-06-02 | Dennis Keyser NP22 | Initial.
1608 C>
1609 C> @param[in] LUNIT Fortran unit number for input data file
1610 C> @param[inout] RDATA Single wind profiler report in a quasi-office note 29 unpacked format with [out] header information filled in [in] all data initialized as missing
1611 C> @param[out] IRET Return code as described in w3unpk77 docblock
1612 C>
1613 C> @author Dennis Keyser @date 1997-06-02
1614  SUBROUTINE unpk7707(LUNIT,RDATA,IRET)
1615  CHARACTER*1 CRMS(0:12)
1616  CHARACTER*8 COB
1617  CHARACTER*25 UAIR1
1618  INTEGER IDATA(1200)
1619  REAL(8) UAIR_8(5,255)
1620  REAL UAIR(5,255),RDATA(*),RDATX(1200)
1621  COMMON /pk77bb/kdate(8),ldate(8),iprint
1622 
1623  SAVE
1624 
1625  equivalence(rdatx,idata),(cob,iob)
1626  DATA xmsg/99999./
1627  DATA uair1/'HEIT WDIR WSPD RMSW QMWN '/
1628  DATA crms/' ','A',' ','B',' ','C',' ','D',' ','E',' ','F',' '/
1629  rdatx(1:1200) = rdata(1:1200)
1630  nsfc = 0
1631  ilvl = 0
1632  ilc = 0
1633 C FIRST CATEGORY 4 LEVEL UPPER-AIR LEVEL CONTAINS ONLY HEIGHT (ELEV)
1634  IF(iprint.GT.1) print 1078, ilc,ilvl
1635  1078 FORMAT(' ATTEMPTING 1ST (SFC) LVL WITH ILC =',i5,'; NO. LEVELS ',
1636  $ 'PROCESSED TO NOW =',i5)
1637  rdatx(43+ilc) = rdatx(7)
1638  IF(iprint.GT.1) print 198, 43+ilc,rdatx(43+ilc)
1639  198 FORMAT(5x,'RDATA(',i5,') STORED AS: ',f10.2)
1640  IF(rdatx(43+ilc).LT.xmsg) nsfc = 1
1641 C NOTE: The following was added because of a problem on the sgi-ha
1642 C platform related to equivalencing character and non-character
1643 C -- for now the addition of these two lines will set the quality
1644 C mark for sfc. cat . 4 level to the correct value of " "
1645 C rather than to "9999" - Mary McCann notified SGI of this
1646 C problem on 08-21-1998
1647  cob = ' '
1648  idata(43+ilc+3) = iob
1649  ilvl = ilvl + 1
1650  ilc = ilc + 4
1651  IF(iprint.GT.1) print *,'HAVE COMPLETED LEVEL ',ilvl,' WITH ',
1652  $ 'NSFC=',nsfc,'; GOING INTO NEXT LEVEL WITH ILC=',ilc
1653  uair_8 = 10.0e10
1654  CALL ufbint(lunit,uair_8,5,255,nlev,uair1);uair=uair_8
1655  IF(nlev.EQ.0) THEN
1656 C.......................................................................
1657 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS ZERO --
1658  IF(nsfc.EQ.0) THEN
1659 C ... NO UPPER AIR DATA PROCESSED
1660  print 217
1661  217 FORMAT(/' ##W3UNPK77: NO UPPER-AIR DATA PROCESSED FOR THIS',
1662  $ ' REPORT -- NLEV = 0 AND NSFC = 0'/)
1663  GO TO 99
1664  ELSE
1665 C ... ONLY FIRST (SURFACE) UPPER AIR LEVEL DATA PROCESSED
1666  print 218
1667  218 FORMAT(/' ##W3UNPK77: NO UPPER-AIR DATA ABOVE FIRST (SURFACE) ',
1668  $ 'LEVEL PROCESSED FOR THIS REPORT -- NLEV = 0 AND NSFC > 0'/)
1669  GO TO 98
1670  END IF
1671 C.......................................................................
1672  END IF
1673  IF(iprint.GT.1) print 1068, nlev
1674  1068 FORMAT(' THIS REPORT CONTAINS ',i3,' LEVELS OF DATA (NOT ',
1675  $ 'INCLUDING BOTTOM -SURFACE- LEVEL)')
1676  DO i = 1,nlev
1677  IF(iprint.GT.1) print 1079, ilc,ilvl
1678  1079 FORMAT(' ATTEMPTING NEW LEVEL WITH ILC =',i5,'; NO. LEVELS ',
1679  $ 'PROCESSED TO NOW =',i5)
1680 
1681 C HEIGHT ABOVE SEA-LEVEL (STORED AS REAL)
1682 
1683  m = 1
1684  IF(iprint.GT.1) print 199, uair(1,i),m
1685  199 FORMAT(5x,'UAIR HERE IS: ',f17.4,'; INDEX IS: ',i3)
1686  IF(uair(1,i).LT.xmsg) THEN
1687  rdatx(43+ilc) = nint(uair(1,i))
1688 
1689 C ... WE HAVE A VALID CATEGORY 4 LEVEL -- THERE IS A VALID HEIGHT
1690 
1691  ilvl = ilvl + 1
1692  ELSE
1693 
1694 C ... WE DO NOT HAVE A VALID CATEGORY 4 LEVEL -- THERE IS NO VALID
1695 C HEIGHT GO ON TO NEXT INPUT LEVEL
1696 
1697  IF(iprint.GT.1) print *, 'HEIGHT MISSING ON INPUT ',
1698  $ ' LEVEL ',i,', ALL OTHER DATA SET TO MSG ON THIS LEVEL'
1699  GO TO 10
1700  END IF
1701  IF(iprint.GT.1) print 198, 43+ilc,rdatx(43+ilc)
1702 
1703 C HORIZONTAL WIND DIRECTION (STORED AS REAL)
1704 
1705  m = 2
1706  IF(iprint.GT.1) print 199, uair(2,i),m
1707  IF(uair(2,i).LT.xmsg) rdatx(43+ilc+1) = nint(uair(2,i))
1708  IF(iprint.GT.1) print 198, 43+ilc+1,rdatx(43+ilc+1)
1709 
1710 C HORIZONTAL WIND SPEED (STORED AS REAL) (OUTPUT STORED
1711 C AS METERS/SECOND TIMES TEN, NOT IN KNOTS AS ON29 WOULD
1712 C INDICATE FOR CAT. 4 WIND SPEED)
1713 
1714  m = 3
1715  IF(iprint.GT.1) print 199, uair(3,i),m
1716  IF(uair(3,i).LT.xmsg) rdatx(43+ilc+2) =nint(uair(3,i) * 10.)
1717  IF(iprint.GT.1) print 198, 43+ilc+2,rdatx(43+ilc+2)
1718 
1719 C CONFIDENCE LEVEL (BASED ON RMS VECTOR WIND ERROR)
1720 C (NOTE: CONVERTED TO ORIGINAL LETTER INDICATOR AND PACKED
1721 C IN BYTE 4 OF CATEGORY 4 QUALITY MARKER LOCATION -- SEE
1722 C W3UNPK77 DOCBLOCK REMARKS 5. FOR UNPACKED VAD WIND REPORT
1723 C LAYOUT FOR VALUES
1724 
1725  m = 4
1726  IF(iprint.GT.1) print 199, uair(4,i),m
1727  IF(uair(4,i).LT.xmsg) THEN
1728 
1729 C ... CONVERT FROM M/S TO KNOTS
1730 
1731 CDAKCDAK KRMS = INT(1.93333 * UAIR(4,I))
1732  krms = int(1.9425 * uair(4,i))
1733  cob = ' '
1734  IF(krms.LT.13) THEN
1735  cob(4:4) = crms(krms)
1736  ELSE
1737  cob(4:4) = 'G'
1738  END IF
1739  idata(43+ilc+3) = iob
1740  END IF
1741  IF(iprint.GT.1) print 196, 43+ilc+3,cob(1:4)
1742  196 FORMAT(5x,'IDATA(',i5,') STORED IN CHARACTER AS: "',a4,'"')
1743 
1744 C ON29 WIND QUALITY MARKER (CURRENTLY NOT STORED)
1745 
1746  m = 5
1747  IF(iprint.GT.1) print 199, uair(5,i),m
1748 C.......................................................................
1749  ilc = ilc + 4
1750  IF(iprint.GT.1) print *,'HAVE COMPLETED LEVEL ',ilvl,
1751  $ '; GOING INTO NEXT LEVEL WITH ILC=',ilc
1752 
1753  10 CONTINUE
1754  ENDDO
1755 
1756 C SET CATEGORY COUNTERS FOR UPPER-AIR DATA
1757 
1758  98 CONTINUE
1759  idata(19) = ilvl
1760  99 CONTINUE
1761  IF(idata(19).EQ.0) THEN
1762  idata(20) = 0
1763  iret = 5
1764  ELSE
1765  idata(20) = 43
1766  END IF
1767  IF(iprint.GT.1) print *, 'NSFC=',nsfc,'; IDATA(37)=',idata(37),
1768  $ '; IDATA(38)=',idata(38)
1769  rdata(1:1200) = rdatx(1:1200)
1770  RETURN
1771  END
1772 C> @brief Fills in header in o-put array - goes snd
1773 C> @author Dennis Keyser @date 1998-07-09
1774 
1775 C> For report (subset) read out of bufr message (passed in
1776 C> internally via bufrlib storage), calls bufrlib routine to decode
1777 C> header data for goes sounding report. Header is then filled into
1778 C> the output array which holds a single goes sounding report in the
1779 C> quasi-office note 29 unpacked format.
1780 C>
1781 C> ### Program History Log:
1782 C> Date | Programmer | Comment
1783 C> -----|------------|--------
1784 C> 1997-06-05 | Dennis Keyser NP22 | Initial.
1785 C> 1998-07-09 | Dennis Keyser | Changed char. 6 of goes stnid to be unique for two different even or odd satellite id's (every other even or odd sat. id now gets same char. 6 tag)
1786 C>
1787 C> @param[in] LUNIT Fortran unit number for input data file
1788 C> @param[inout] RDATA Single wind profiler report in a quasi-office note 29 unpacked format with [out] header information filled in [in] all data initialized as missing
1789 C> @param[in] KOUNT Number of reports processed including this one
1790 C> @param[out] IRET Return code as described in w3unpk77 docblock
1791 C>
1792 C> @author Dennis Keyser @date 1998-07-09
1793  SUBROUTINE unpk7708(LUNIT,RDATA,KOUNT,IRET)
1794  CHARACTER*1 C6TAG(3,0:3)
1795  CHARACTER*8 STNID,COB
1796  CHARACTER*35 HDR1,HDR2
1797  INTEGER IDATA(1200)
1798  REAL(8) HDR_8(12)
1799  REAL HDR(12),RDATA(*),RDATX(1200)
1800  COMMON /pk77bb/kdate(8),ldate(8),iprint
1801  COMMON /pk77ff/ifov(3),kntsat(250:260)
1802 
1803  SAVE
1804 
1805  equivalence(rdatx,idata),(cob,iob)
1806  DATA xmsg/99999./,imsg/99999/
1807  DATA hdr1/'CLAT CLON ACAV GSDP QMRK SAID YEAR '/
1808  DATA hdr2/'MNTH DAYS HOUR MINU SECO '/
1809 
1810 
1811 C CURRENT LIST OF SATELLITE IDENTIFIERS (BUFR C.F. 0-01-007)
1812 C -----------------------------------------------------------
1813 
1814 C GOES 6 -- 250 GOES 9 -- 253 GOES 12 -- 256
1815 C GOES 7 -- 251 GOES 10 -- 254 GOES 13 -- 257
1816 C GOES 8 -- 252 GOES 11 -- 255 GOES 14 -- 258
1817 
1818 C IDSAT = -- EVEN1 -- --- ODD1 -- -- EVEN2 -- --- ODD2 --
1819 C Sat. No. - 252,256,... 253,257,... 250,254,... 251,255,...
1820 C IRTYP = CLR COR UNKN CLR COR UNKN CLR COR UNKN CLR COR UNKN
1821 C --- --- ---- --- --- ---- --- --- ---- --- --- ----
1822 
1823  DATA c6tag/'I','J','?', 'L','M','?', 'O','P','?', 'Q','R','?' /
1824 
1825  rdatx(1:1200) = rdata(1:1200)
1826  hdr_8 = 10.0e10
1827  CALL ufbint(lunit,hdr_8,12,1,nlev,hdr1//hdr2);hdr=hdr_8
1828  IF(nlev.NE.1) THEN
1829 C.......................................................................
1830 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS NOT WHAT IS EXPECTED --
1831 C SET IRET = 6 AND RETURN
1832  print 217, nlev
1833  217 FORMAT(/' ##W3UNPK77: THE NUMBER OF DECODED "LEVELS" (=',i5,') ',
1834  $ 'IS NOT WHAT IS EXPECTED (1) - IRET = 6'/)
1835  iret = 6
1836  RETURN
1837 C.......................................................................
1838  END IF
1839 
1840 C LATITUDE (STORED AS REAL)
1841 
1842  m = 1
1843  IF(iprint.GT.1) print 199, hdr(1),m
1844  199 FORMAT(5x,'HDR HERE IS: ',f17.4,'; INDEX IS: ',i3)
1845  IF(hdr(1).LT.xmsg) THEN
1846  rdatx(1) = nint(hdr(1) * 100.)
1847  nnnnn = 1
1848  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
1849  198 FORMAT(5x,'RDATA(',i5,') STORED AS: ',f10.2)
1850  ELSE
1851  iret = 2
1852  print 102
1853  102 FORMAT(' *** W3UNPK77 ERROR: LAT MISSING FOR GOES SOUNDING'/)
1854  RETURN
1855  END IF
1856 
1857 C LONGITUDE (STORED AS REAL)
1858 
1859  m = 2
1860  IF(iprint.GT.1) print 199, hdr(2),m
1861  IF(hdr(2).LT.xmsg) THEN
1862  rdatx(2) = nint(mod((36000.-(hdr(2)*100.)),36000.))
1863  nnnnn = 2
1864  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
1865  ELSE
1866  iret = 2
1867  print 104
1868  104 FORMAT(' *** W3UNPK77 ERROR: LON MISSING FOR GOES SOUNDING'/)
1869  RETURN
1870  END IF
1871 
1872 C NUMBER OF FIELDS OF VIEW - SAMPLE SIZE (STORED AS INTEGER)
1873 
1874  m = 3
1875  IF(iprint.GT.1) print 199, hdr(3),m
1876  IF(hdr(3).LT.xmsg) idata(3) = nint(hdr(3))
1877  nnnnn = 3
1878  IF(iprint.GT.1) print 197, nnnnn,idata(nnnnn)
1879  197 FORMAT(5x,'IDATA(',i5,') STORED AS: ',i10)
1880 
1881 C STATION ELEVATION (FROM HEIGHT OF FIRST -SURFACE- LEVEL)
1882 C (STORED AS REAL) -- STORED IN SUBROUTINE UNPK7709
1883 
1884 
1885 C RETRIEVAL TYPE (GEOSTATIONARY SATELLITE DATA-PROCESSING
1886 C TECHNIQUE USED) (STORED AS INTEGER)
1887 
1888  m = 4
1889  IF(iprint.GT.1) print 199, hdr(4),m
1890  IF(hdr(4).LT.xmsg) idata(8) = nint(hdr(4))
1891  irtyp = 3
1892  IF(idata(8).EQ.21) THEN
1893  irtyp = 1
1894  ELSE IF(idata(8).EQ.23) THEN
1895  irtyp = 2
1896  END IF
1897  nnnnn = 8
1898  IF(iprint.GT.1) print 197, nnnnn,idata(nnnnn)
1899 
1900 C PRODUCT QUALITY BIT FLAGS - QUALITY INFO. (STORED AS INTEGER)
1901 
1902  m = 5
1903  IF(iprint.GT.1) print 199, hdr(5),m
1904  IF(hdr(5).LT.xmsg) idata(10) = nint(hdr(5))
1905  nnnnn = 10
1906  IF(iprint.GT.1) print 197, nnnnn,idata(nnnnn)
1907 
1908 C STATION IDENTIFICATION (STORED AS CHARACTER)
1909 C (FIRST 5-CHARACTERS OBTAINED FROM 5-DIGIT COUNT NUMBER,
1910 C 6'TH CHARACTER OBTAINED FROM SAT. ID/RETRIEVAL TYPE TAG)
1911 
1912  WRITE(stnid(1:5),'(I5.5)') min(kount,99999)
1913 
1914 C DECODE THE SATELLITE ID
1915 
1916  m = 6
1917  idsat = 2
1918  IF(iprint.GT.1) print 199, hdr(6),m
1919  IF(hdr(6).LT.xmsg) THEN
1920  idsat = mod(nint(hdr(6)),4)
1921  IF(nint(hdr(6)).GT.249.AND.nint(hdr(6)).LT.260) THEN
1922  kntsat(nint(hdr(6))) = kntsat(nint(hdr(6))) + 1
1923  ELSE
1924  kntsat(260) = kntsat(260) + 1
1925  END IF
1926  END IF
1927  IF(iprint.GT.1) print 2197, idsat,irtyp
1928  2197 FORMAT(5x,'IDSAT IS: ',i10,', IRTYP IS: ',i10)
1929  stnid(6:6) = c6tag(irtyp,idsat)
1930  cob(1:4) = stnid(1:4)
1931  idata(11) = iob
1932  nnnnn = 11
1933  IF(iprint.GT.1) print 196, nnnnn,cob(1:4)
1934  196 FORMAT(5x,'IDATA(',i5,') STORED IN CHARACTER AS: "',a4,'"')
1935  cob(1:4) = stnid(5:6)//' '
1936  idata(12) = iob
1937  nnnnn = 12
1938  IF(iprint.GT.1) print 196, nnnnn,cob(1:4)
1939 
1940 cvvvvvdak port
1941 C LOAD THE YEAR/MONTH (STORED AS CHARACTER IN FORM YYMM)
1942 caaaaadak port
1943 
1944  m = 7
1945  IF(iprint.GT.1) print 199, hdr(7),m
1946  iyear = imsg
1947  IF(hdr(7).LT.xmsg) iyear = nint(hdr(7))
1948  m = 8
1949  IF(iprint.GT.1) print 199, hdr(8),m
1950  IF(hdr(8).LT.xmsg.AND.iyear.LT.imsg) THEN
1951 cvvvvvdak port
1952  iyear = mod(iyear,100)
1953 caaaaadak port
1954  iyear = nint(hdr(8)) + (iyear * 100)
1955 cvvvvvdak port
1956 cdak WRITE(COB,'(I6.6,2X)') IYEAR
1957  WRITE(cob,'(I4.4,4X)') iyear
1958 caaaaadak port
1959  idata(5) = iob
1960  nnnnn = 5
1961  IF(iprint.GT.1) print 9196, nnnnn,cob(1:6)
1962  9196 FORMAT(5x,'IDATA(',i5,') STORED IN CHARACTER AS: "',a6,'"')
1963  ELSE
1964  GO TO 30
1965  END IF
1966 
1967 C LOAD THE DAY/HOUR (STORED AS CHARACTER IN FORM DDHH)
1968 C AND THE OBSERVATION TIME (STORED AS REAL)
1969 
1970  m = 9
1971  IF(iprint.GT.1) print 199, hdr(9),m
1972  m = 10
1973  IF(iprint.GT.1) print 199, hdr(10),m
1974  IF(hdr(10).LT.xmsg.AND.hdr(9).LT.imsg) THEN
1975  m = 11
1976  IF(iprint.GT.1) print 199, hdr(11),m
1977  IF(hdr(11).GE.xmsg) GO TO 30
1978  m = 12
1979  IF(iprint.GT.1) print 199, hdr(12),m
1980  IF(hdr(12).GE.xmsg) GO TO 30
1981  rdatx(4) = nint(((hdr(10) + ((hdr(11) * 60.) + hdr(12))/3600.)
1982  $ * 100.) + 0.0000000001)
1983  nnnnn = 4
1984  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
1985  idayhr = nint(hdr(10)) + (nint(hdr(9)) * 100)
1986  WRITE(cob(1:4),'(I4.4)') idayhr
1987  idata(6) = iob
1988  nnnnn = 6
1989  IF(iprint.GT.1) print 196, nnnnn,cob(1:4)
1990  ELSE
1991  GO TO 30
1992  END IF
1993  rdata(1:1200) = rdatx(1:1200)
1994  RETURN
1995  30 CONTINUE
1996  iret = 4
1997  RETURN
1998  END
1999 C> @brief Fills cat. 12,8 to o-put array -goes sndg
2000 C> @author Dennis Keyser @date 1997-06-05
2001 
2002 C> For report (subset) read out of bufr message (passed in
2003 C> internally via bufrlib storage), calls bufrlib routine to decode
2004 C> upper-air (sounding) and additional data for goes sounding. Upper-
2005 C> air data are then filled into the output array as category 12
2006 C> (satellite sounding) and additional data are filled as category 8.
2007 C> The ouput array holds a single goes sounding in the quasi-office
2008 C> note 29 unpacked format.
2009 C>
2010 C> ### Program History Log:
2011 C> Date | Programmer | Comment
2012 C> -----|------------|--------
2013 C> 1997-06-05 | Dennis Keyser NP22 | Initial.
2014 C>
2015 C> @param[in] LUNIT Fortran unit number for input data file
2016 C> @param[inout] RDATA Single wind profiler report in a quasi-office note 29 unpacked format with [out] header information filled in [in] all data initialized as missing
2017 C> @param[out] IRET Return code as described in w3unpk77 docblock
2018 C>
2019 C> @author Dennis Keyser @date 1997-06-05
2020  SUBROUTINE unpk7709(LUNIT,RDATA,IRET)
2021  CHARACTER*1 CQMFLG
2022  CHARACTER*8 COB
2023  CHARACTER*37 CAT8A,CAT8B
2024  CHARACTER*48 UAIR1,RAD1
2025  INTEGER IDATA(1200),ICDFG(12)
2026  REAL(8) UAIR_8(4,255),CAT8_8(12),RTCSF_8,RAD_8(2,255)
2027  REAL UAIR(4,255),CAT8(12),RDATA(*),RDATX(1200),SC8(12),RAD(2,255)
2028  COMMON /pk77bb/kdate(8),ldate(8),iprint
2029  COMMON /pk77ff/ifov(3),kntsat(250:260)
2030 
2031  SAVE
2032 
2033  equivalence(rdatx,idata),(cob,iob)
2034  DATA xmsg/99999./,ymsg/99999.8/
2035  DATA uair1/'PRLC HGHT TMDB TMDP '/
2036  DATA rad1 /'CHNM TMBR '/
2037  DATA cat8a/'GLFTI PH2O PH2O19 PH2O97 PH2O73 TMSK '/
2038  DATA cat8b/'GCDTT CDTP CLAM SIDU SOEL ELEV '/
2039  DATA icdfg/ 50 , 51 , 52 , 53 , 54 , 55 , 56 ,57 ,58,59, 60 , 61 /
2040  DATA sc8/100.,100.,100.,100.,100.,100.,100.,10.,1.,1.,100.,100./
2041  rdatx(1:1200) = rdata(1:1200)
2042 
2043 C ALL NON-RADIANCE DATA WILL BE Q.C.'D ACCORDING TO NUMBER OF FIELDS-OF-
2044 C VIEW FOR RETRIEVAL: 0-2 --> BAD, 3-9 --> SUSPECT, 10-25 OR MISSING
2045 C --> NEUTRAL
2046 
2047  cqmflg = ' '
2048  IF(idata(3).LT.3) THEN
2049  cqmflg = 'F'
2050  ifov(1) = ifov(1) + 1
2051  ELSE IF(idata(3).LT.10.OR.idata(10).EQ.1) THEN
2052  cqmflg = 'Q'
2053  IF(idata(3).LT.10) ifov(2) = ifov(2) + 1
2054  END IF
2055  IF(idata(3).GT.9) ifov(3) = ifov(3) + 1
2056 
2057 C***********************************************************************
2058 C FILL CATEGORY 12 PART OF OUTPUT
2059 C***********************************************************************
2060 
2061  ilvl = 0
2062  ilc = 0
2063  uair_8 = 10.0e10
2064  CALL ufbint(lunit,uair_8,4,255,nlev,uair1);uair=uair_8
2065  IF(nlev.EQ.0) THEN
2066 C.......................................................................
2067 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS ZERO --
2068  print 217
2069  217 FORMAT(/' ##W3UNPK77: NO UPPER-AIR (SOUNDING) DATA PROCESSED ',
2070  $ 'FOR THIS REPORT -- NLEV = 0'/)
2071  GO TO 98
2072  ELSE IF(nlev.GT.50) THEN
2073 C.......................................................................
2074 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS GREATER THAN LIMIT OF 50 --
2075  print 218
2076  218 FORMAT(/' ##W3UNPK77: NO UPPER-AIR (SOUNDING) DATA PROCESSED ',
2077  $ 'FOR THIS REPORT -- NLEV > 50'/)
2078  GO TO 98
2079 C.......................................................................
2080  END IF
2081  IF(iprint.GT.1) print 1068, nlev
2082  1068 FORMAT(' THIS REPORT CONTAINS',i4,' INPUT LEVELS OF SOUNDING ',
2083  $ 'DATA')
2084  DO i = 1,nlev
2085  IF(iprint.GT.1) print 1079, i,ilc,ilvl
2086  1079 FORMAT(' ATTEMPTING NEW CAT. 12 INPUT LEVEL NUMBER',i4,' WITH ',
2087  $ 'ILC =',i5,'; NO. LEVELS PROCESSED TO NOW =',i5)
2088 
2089 C LEVEL PRESSURE (STORED AS REAL)
2090 
2091  m = 1
2092  IF(iprint.GT.1) print 199, uair(1,i),m
2093  199 FORMAT(5x,'UAIR HERE IS: ',f17.4,'; INDEX IS: ',i3)
2094  IF(i.EQ.1) THEN
2095  psfc = uair(1,i) * 0.1
2096  ELSE IF(uair(1,i)*0.1.GE.ymsg) THEN
2097 C WE DO NOT HAVE A VALID CATEGORY 12 LEVEL -- THERE IS NO VALID PRESSURE
2098 C -- GO ON TO NEXT INPUT LEVEL (IF SFC LEVEL MSG, CONTINUE PROCESSING)
2099  IF(iprint.GT.1) print *, 'PRESSURE MISSING ON INPUT',
2100  $ ' LEVEL ',i,', SKIP THE PROCESSING OF THIS LEVEL'
2101  GO TO 10
2102  ELSE IF(uair(1,i)*0.1.GE.psfc) THEN
2103 C WE DO NOT HAVE A VALID CATEGORY 12 LEVEL -- THE INPUT LEVEL PRESSURE
2104 C IS BELOW THE SURFACE PRESSURE -- GO ON TO THE NEXT INPUT LEVEL
2105  IF(iprint.GT.1) print *,'PRESSURE ON INPUT LEVEL ',i,
2106  $ ' IS BELOW GROUND, SKIP THE PROCESSING OF THIS LEVEL'
2107  GO TO 10
2108  END IF
2109 
2110 C WE HAVE A VALID CATEGORY 12 LEVEL -- THERE IS A VALID PRESSURE
2111 
2112  IF(uair(1,i)*0.1.LT.xmsg) rdatx(43+ilc) = nint(uair(1,i)*0.1)
2113  ilvl = ilvl + 1
2114  IF(iprint.GT.1) print 198, 43+ilc,rdatx(43+ilc)
2115  198 FORMAT(5x,'RDATA(',i5,') STORED AS: ',f10.2)
2116 
2117 C GEOPOTENTIAL HEIGHT (STORED AS REAL)
2118 
2119  m = 2
2120  IF(iprint.GT.1) print 199, uair(2,i),m
2121  IF(uair(2,i).LT.xmsg) rdatx(43+ilc+1) = nint(uair(2,i))
2122  IF(iprint.GT.1) print 198, 43+ilc+1,rdatx(43+ilc+1)
2123  IF(i.EQ.1) THEN
2124  IF(iprint.GT.1) print *, 'THIS IS SURFACE LEVEL, SO ',
2125  $ 'STORE HEIGHT ALSO AS ELEVATION IN HEADER'
2126  IF(uair(2,1).LT.xmsg) rdatx(7) = nint(uair(2,1))
2127  nnnnn = 7
2128  IF(iprint.GT.1) print 198, nnnnn,rdatx(nnnnn)
2129  END IF
2130 
2131 C TEMPERATURE (STORED AS REAL)
2132 
2133  m = 3
2134  IF(iprint.GT.1) print 199, uair(3,i),m
2135  itmp = nint(uair(3,i)*100.)
2136  IF(uair(3,i).LT.xmsg)
2137  $ rdatx(43+ilc+2) = nint((itmp - 27315) * 0.1)
2138  IF(iprint.GT.1) print 198, 43+ilc+2,rdatx(43+ilc+2)
2139 
2140 C DEWPOINT TEMPERATURE (STORED AS REAL)
2141 
2142  m = 4
2143  IF(iprint.GT.1) print 199, uair(4,i),m
2144  itmp = nint(uair(4,i)*100.)
2145  IF(uair(4,i).LT.xmsg)
2146  $ rdatx(43+ilc+3) = nint((itmp - 27315) * 0.1)
2147  IF(iprint.GT.1) print 198, 43+ilc+3,rdatx(43+ilc+3)
2148 
2149 C QUALITY MARKERS (STORED AS CHARACTER)
2150 
2151  cob = cqmflg//cqmflg//cqmflg//' '
2152  idata(43+ilc+6) = iob
2153  IF(iprint.GT.1) print 196, 43+ilc+6,cob(1:4)
2154  196 FORMAT(5x,'IDATA(',i5,') STORED IN CHARACTER AS: "',a4,'"')
2155 C.......................................................................
2156  ilc = ilc + 7
2157  IF(i+1.LE.nlev.AND.iprint.GT.1) print *,'HAVE COMPLETED ',
2158  $ 'LEVEL ',ilvl,'; GOING INTO NEXT LEVEL WITH ILC=',ilc
2159 
2160  10 CONTINUE
2161  ENDDO
2162 
2163 C SET CATEGORY COUNTERS FOR CATEGORY 12 (SOUNDING) DATA
2164 
2165  idata(39) = ilvl
2166  98 CONTINUE
2167  IF(iprint.GT.1) print *, idata(39),' CAT. 12 LEVELS PROCESSED'
2168  IF(idata(39).GT.0) idata(40) = 43
2169 
2170 C***********************************************************************
2171 C FILL CATEGORY 8 PART OF OUTPUT
2172 C WILL ATTEMPT TO FILL 12 "LEVELS"
2173 C LVL 1- LIFTED INDEX (DEG. K X 100 - RELATIVE) -------- CODE FIG. 250.
2174 C LVL 2- TOTAL COLUMN PRECIPITABLE WATER (MM X 100) ---- CODE FIG. 251.
2175 C LVL 3- 1. TO .9 SIGMA LAYER PRECIP. WATER (MM X 100) - CODE FIG. 252.
2176 C LVL 4- .9 TO .7 SIGMA LAYER PRECIP. WATER (MM X 100) - CODE FIG. 253.
2177 C LVL 5- .7 TO .3 SIGMA LAYER PRECIP. WATER (MM X 100) - CODE FIG. 254.
2178 C LVL 6- SKIN TEMPERATURE (DEG. K X 100) --------------- CODE FIG. 255.
2179 C LVL 7- CLOUD TOP TEMPERATURE (DEG. K X 100) ---------- CODE FIG. 256.
2180 C LVL 8- CLOUD TOP PRESSURE (MB X 10) ------------------ CODE FIG. 257.
2181 C LVL 9- CLOUD AMOUNT (C. FIG. BUFR TABLE 0-20-011) ---- CODE FIG. 258.
2182 C LVL 10- INSTR. DATA USED IN PROC.
2183 C (C. FIG. BUFR TABLE 0-02-021) --- CODE FIG. 259.
2184 C LVL 11- SOLAR ZENITH ANGLE (SOLAR ELEV) (DEG. X 100) -- CODE FIG. 260.
2185 C LVL 12- SATELLITE ZENITH ANGLE (ELEV) (DEG. X 100) --- CODE FIG. 261.
2186 C
2187 C IF DATA ONE ANY LEVEL ARE MISSING, THAT LEVEL IS NOT PROCESSED
2188 C***********************************************************************
2189 
2190  ilvl = 0
2191  ilc = 0
2192  cat8_8 = 10.0e10
2193  CALL ufbint(lunit,cat8_8,12,1,nlev8,cat8a//cat8b);cat8=cat8_8
2194  IF(nlev8.NE.1) THEN
2195  IF(nlev8.EQ.0) THEN
2196 C.......................................................................
2197 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS ZERO --
2198  print 318
2199  318 FORMAT(/' ##W3UNPK77: NO ADDITIONAL (CAT. 8) DATA PROCESSED FOR ',
2200  $ 'THIS REPORT -- NLEV8 = 0'/)
2201  GO TO 99
2202 C.......................................................................
2203  ELSE
2204 C.......................................................................
2205 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS NOT WHAT IS EXPECTED --
2206 C SET IRET = 7 AND RETURN
2207  print 219, nlev8
2208  219 FORMAT(/' ##W3UNPK77: THE NUMBER OF DECODED "LEVELS" (=',i5,') ',
2209  $ 'IS NOT WHAT IS EXPECTED (1) - IRET = 7'/)
2210  iret = 7
2211  RETURN
2212 C.......................................................................
2213  END IF
2214  END IF
2215 
2216 C THE TEMPERATURE CHANNEL SELECTION FLAG WILL BE USED LATER TO
2217 C DETERMINE Q. MARK FOR SKIN TEMPERATURE (IF 0 - OK, OTHERWISE - BAD)
2218 
2219  rtcsf_8 = 10.0e10
2220  CALL ufbint(lunit,rtcsf_8,1,1,nlev0,'TCSF');rtcsf=rtcsf_8
2221  itcsf = 1
2222  m = 1
2223  IF(iprint.GT.1) print 299, rtcsf,m
2224  299 FORMAT(5x,'RTCSF HERE IS: ',f17.4,'; INDEX IS: ',i3)
2225  IF(rtcsf.LT.xmsg) itcsf = nint(rtcsf)
2226  IF(iprint.GT.1) print 1798, itcsf
2227  1798 FORMAT(5x,'ITCSF IS: ',i10)
2228 
2229 C LOOP THROUGH THE 12 POSSIBLE ADDITIONAL DATA
2230 
2231  DO m = 1,12
2232  IF(iprint.GT.1) print 6079, m,ilc,ilvl
2233  6079 FORMAT(' ATTEMPTING MISCEL. INPUT',i5,' WITH ILC =',i5,'; NO. ',
2234  $ 'OUTPUT CAT. 8 LVLS PROCESSED TO NOW =',i5)
2235  IF(iprint.GT.1) print 399, cat8(m),m
2236  399 FORMAT(5x,'CAT8 HERE IS: ',f17.4,'; INDEX IS: ',i3)
2237  IF(cat8(m).LT.xmsg) THEN
2238 
2239 C WE HAVE A VALID CATEGORY 8 "LEVEL"
2240 
2241  ilvl = ilvl + 1
2242 
2243 C STORE THE DATUM IN WORD 1 OF THE CAT. 8 LEVEL
2244 
2245  rdatx(393+ilc) = nint(cat8(m) * sc8(m))
2246  IF(iprint.GT.1) print 198, 393+ilc,rdatx(393+ilc)
2247 
2248 C STORE THE CAT. 8 CODE FIGURE IN WORD 2 OF THE CAT. 8 LEVEL
2249 
2250  rdatx(393+ilc+1) = real(200+icdfg(m))
2251  IF(iprint.GT.1) print 198, 393+ilc+1,rdatx(393+ilc+1)
2252 
2253 C STORE THE QUALITY MARKER IN BYTE 1 OF WORD 3 OF THE CAT. 8 LEVEL
2254 
2255  cob = cqmflg//' '
2256 
2257 C IF THIS DATUM IS SKIN TEMPERATURE AND THE TEMPERATURE CHANNEL
2258 C SELECTION FLAG IS BAD (.NE. 0), SET QUALITY MARKER TO "F"
2259 
2260  IF(m.EQ.6.AND.itcsf.NE.0) cob(1:1) = 'F'
2261  idata(393+ilc+2) = iob
2262  IF(iprint.GT.1) print 196, 393+ilc+2,cob(1:4)
2263  ilc = ilc + 3
2264  IF(m.LT.12.AND.iprint.GT.1) print *,'HAVE COMPLETED OUTPUT',
2265  $ ' LVL',ilvl,'; GOING INTO NEXT INPUT DATUM WITH ILC=',ilc
2266  ELSE
2267  IF(iprint.GT.1) print *, 'DATUM MISSING ON INPUT ',m,
2268  $ ', GO ON TO NEXT INPUT DATUM (NO. LVLS PROCESSED SO ',
2269  $ 'FAR=',ilvl,'; ILC=',ilc,')'
2270  END IF
2271  ENDDO
2272 
2273 C SET CATEGORY COUNTERS FOR CATEGORY 8 (ADDITIONAL) DATA
2274 
2275  idata(27) = ilvl
2276  99 CONTINUE
2277  IF(iprint.GT.1) print *, idata(27),' CAT. 08 LEVELS PROCESSED'
2278  IF(idata(27).GT.0) idata(28) = 393
2279 
2280 C***********************************************************************
2281 C FILL CATEGORY 13 PART OF OUTPUT (RADIANCES)
2282 C***********************************************************************
2283 
2284  ilvl = 0
2285  ilc = 0
2286  rad_8 = 10.0e10
2287  CALL ufbint(lunit,rad_8,2,255,nlev13,rad1);rad=rad_8
2288  IF(nlev13.EQ.0) THEN
2289 C.......................................................................
2290 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS ZERO --
2291  print 417
2292  417 FORMAT(/' ##W3UNPK77: NO RADIANCE DATA PROCESSED FOR THIS ',
2293  $ 'REPORT -- NLEV13 = 0'/)
2294  GO TO 100
2295  ELSE IF(nlev13.GT.60) THEN
2296 C.......................................................................
2297 C PROBLEM: THE NUMBER OF DECODED "LEVELS" IS GREATER THAN LIMIT OF 60 --
2298  print 418
2299  418 FORMAT(/' ##W3UNPK77: NO RADIANCE DATA PROCESSED FOR THIS ',
2300  $ 'REPORT -- NLEV13 > 60'/)
2301  GO TO 100
2302 C.......................................................................
2303  END IF
2304  IF(iprint.GT.1) print 2068, nlev13
2305  2068 FORMAT(' THIS REPORT CONTAINS',i4,' INPUT LEVELS (CHANNELS) OF ',
2306  $ 'RADIANCE DATA')
2307  DO i = 1,nlev13
2308  IF(iprint.GT.1) print 2079, i,ilc,ilvl
2309  2079 FORMAT(' ATTEMPTING NEW CAT. 13 INPUT "LEVEL" NUMBER',i4,' WITH ',
2310  $ 'ILC =',i5,'; NO. LEVELS (CHANNELS) PROCESSED TO NOW =',i5)
2311 
2312 C CHANNEL NUMBER (STORED AS INTEGER)
2313 
2314  m = 1
2315  IF(iprint.GT.1) print 499, rad(1,i),m
2316  499 FORMAT(5x,'RAD HERE IS: ',f17.4,'; INDEX IS: ',i3)
2317  IF(rad(1,i).GE.ymsg) THEN
2318 C WE DO NOT HAVE A VALID CATEGORY 13 LEVEL -- THERE IS NO VALID CHANNEL
2319 C NUMBER -- GO ON TO NEXT INPUT LEVEL
2320  IF(iprint.GT.1) print *, 'CHANNEL NUMBER MISSING ON INPUT',
2321  $ ' LEVEL ',i,', SKIP THE PROCESSING OF THIS LEVEL'
2322  GO TO 210
2323  END IF
2324 
2325 C WE HAVE A VALID CATEGORY 13 LEVEL -- THERE IS A VALID CHANNEL NUMBER
2326 
2327  idata(429+ilc) = nint(rad(1,i))
2328  ilvl = ilvl + 1
2329  IF(iprint.GT.1) print 197, 429+ilc,idata(429+ilc)
2330  197 FORMAT(5x,'IDATA(',i5,') STORED AS: ',i10)
2331 
2332 C BRIGHTNESS TEMPERATURE (STORED AS REAL)
2333 
2334  m = 2
2335  IF(iprint.GT.1) print 499, rad(2,i),m
2336  IF(rad(2,i).LT.xmsg) rdatx(429+ilc+1) = nint(rad(2,i) * 100.)
2337  IF(iprint.GT.1) print 198, 429+ilc+1,rdatx(429+ilc+1)
2338 
2339 C QUALITY MARKERS (STORED AS CHARACTER)
2340 
2341  cob = ' '
2342  idata(429+ilc+2) = iob
2343  IF(iprint.GT.1) print 196, 429+ilc+2,cob(1:4)
2344 C.......................................................................
2345  ilc = ilc + 3
2346  IF(i+1.LE.nlev13.AND.iprint.GT.1) print *,'HAVE COMPLETED ',
2347  $ 'LEVEL ',ilvl,'; GOING INTO NEXT LEVEL WITH ILC=',ilc
2348 
2349  210 CONTINUE
2350  ENDDO
2351 
2352 C SET CATEGORY COUNTERS FOR CATEGORY 13 (RADIANCE) DATA
2353 
2354  idata(41) = ilvl
2355  100 CONTINUE
2356  IF(iprint.GT.1) print *, idata(41),' CAT. 13 LEVELS PROCESSED'
2357  IF(idata(41).GT.0) idata(42) = 429
2358 
2359  IF(idata(27)+idata(39)+idata(41).EQ.0) iret = 5
2360 
2361  IF(iprint.GT.1) print *,'IDATA(39)=',idata(39),'; IDATA(40)=',
2362  $ idata(40),'; IDATA(27)=',idata(27),'; IDATA(28)=',idata(28),
2363  $ '; IDATA(41)=',idata(41),'; IDATA(42)=',idata(42)
2364 
2365  rdata(1:1200) = rdatx(1:1200)
2366  RETURN
2367  END
subroutine errexit(IRET)
Exit with a return code.
Definition: errexit.f:20
subroutine w3difdat(jdat, idat, it, rinc)
Returns the elapsed time interval from an NCEP absolute date and time given in the second argument un...
Definition: w3difdat.f:29
subroutine w3fi04(IENDN, ITYPEC, LW)
Subroutine computes word size, the type of character set, ASCII or EBCDIC, and if the computer is big...
Definition: w3fi04.f:30
subroutine w3movdat(rinc, idat, jdat)
This subprogram returns the date and time that is a given NCEP relative time interval from an NCEP ab...
Definition: w3movdat.f:24
subroutine w3unpk77(IDATE, IHE, IHL, LUNIT, RDATA, IRET)
This subroutine decodes a single report from bufr messages in a jbufr-type data file.
Definition: w3unpk77.f:346
subroutine unpk7709(LUNIT, RDATA, IRET)
Fills cat.
Definition: w3unpk77.f:2021
subroutine unpk7706(LUNIT, RDATA, IRET)
Fills in header in o-put array - vadw rpt.
Definition: w3unpk77.f:1451
subroutine unpk7705(LUNIT, RDATA)
Fills cat.11 into o-put array - pflr rpt.
Definition: w3unpk77.f:1222
subroutine unpk7707(LUNIT, RDATA, IRET)
Fills cat.
Definition: w3unpk77.f:1615
subroutine unpk7704(LUNIT, RDATA)
Fills cat.10 into o-put array - pflr rpt.
Definition: w3unpk77.f:1116
subroutine unpk7708(LUNIT, RDATA, KOUNT, IRET)
Fills in header in o-put array - goes snd.
Definition: w3unpk77.f:1794
subroutine unpk7701(LUNIT, ITP, IRET)
Reads a single report out of bufr dataset.
Definition: w3unpk77.f:649
subroutine unpk7703(LUNIT, RDATA, IRET)
Fills in header in o-put array - pflr rpt.
Definition: w3unpk77.f:896
subroutine unpk7702(RDATA, ITP)
Initializes the output array for a report.
Definition: w3unpk77.f:800