/WPS/ungrib/src/ngl/w3/w3fi63.f
FORTRAN Legacy | 4020 lines | 1716 code | 1 blank | 2303 comment | 0 complexity | 0c471b57123c3c19f33701c39a780cf2 MD5 | raw file
Possible License(s): AGPL-1.0
Large files files are truncated, but you can click here to view the full file
- SUBROUTINE W3FI63(MSGA,KPDS,KGDS,KBMS,DATA,KPTR,KRET)
- C$$$ SUBPROGRAM DOCUMENTATION BLOCK
- C . . . .
- C SUBPROGRAM: W3FI63 UNPK GRIB FIELD TO GRIB GRID
- C PRGMMR: FARLEY ORG: NMC421 DATE:94-11-22
- C
- C ABSTRACT: UNPACK A GRIB (EDITION 1) FIELD TO THE EXACT GRID
- C SPECIFIED IN THE GRIB MESSAGE, ISOLATE THE BIT MAP, AND MAKE
- C THE VALUES OF THE PRODUCT DESCRIPTON SECTION (PDS) AND THE
- C GRID DESCRIPTION SECTION (GDS) AVAILABLE IN RETURN ARRAYS.
- C
- C WHEN DECODING IS COMPLETED, DATA AT EACH GRID POINT HAS BEEN
- C RETURNED IN THE UNITS SPECIFIED IN THE GRIB MANUAL.
- C
- C PROGRAM HISTORY LOG:
- C 91-09-13 CAVANAUGH
- C 91-11-12 CAVANAUGH MODIFIED SIZE OF ECMWF GRIDS 5-8
- C 91-12-22 CAVANAUGH CORRECTED PROCESSING OF MERCATOR PROJECTIONS
- C IN GRID DEFINITION SECTION (GDS) IN
- C ROUTINE FI633
- C 92-08-05 CAVANAUGH CORRECTED MAXIMUM GRID SIZE TO ALLOW FOR
- C ONE DEGREE BY ONE DEGREE GLOBAL GRIDS
- C 92-08-27 CAVANAUGH CORRECTED TYPO ERROR, ADDED CODE TO COMPARE
- C TOTAL BYTE SIZE FROM SECTION 0 WITH SUM OF
- C SECTION SIZES.
- C 92-10-21 CAVANAUGH CORRECTIONS WERE MADE (IN FI634) TO REDUCE
- C PROCESSING TIME FOR INTERNATIONAL GRIDS.
- C REMOVED A TYPOGRAPHICAL ERROR IN FI635.
- C 93-01-07 CAVANAUGH CORRECTIONS WERE MADE (IN FI635) TO
- C FACILITATE USE OF THESE ROUTINES ON A PC.
- C A TYPOGRAPHICAL ERROR WAS ALSO CORRECTED
- C 93-01-13 CAVANAUGH CORRECTIONS WERE MADE (IN FI632) TO
- C PROPERLY HANDLE CONDITION WHEN
- C TIME RANGE INDICATOR = 10.
- C ADDED U.S.GRID 87.
- C 93-02-04 CAVANAUGH ADDED U.S.GRIDS 85 AND 86
- C 93-02-26 CAVANAUGH ADDED GRIDS 2, 3, 37 THRU 44,AND
- C GRIDS 55, 56, 90, 91, 92, AND 93 TO
- C LIST OF U.S. GRIDS.
- C 93-04-07 CAVANAUGH ADDED GRIDS 67 THRU 77 TO
- C LIST OF U.S. GRIDS.
- C 93-04-20 CAVANAUGH INCREASED MAX SIZE TO ACCOMODATE
- C GAUSSIAN GRIDS.
- C 93-05-26 CAVANAUGH CORRECTED GRID RANGE SELECTION IN FI634
- C FOR RANGES 67-71 & 75-77
- C 93-06-08 CAVANAUGH CORRECTED FI635 TO ACCEPT GRIB MESSAGES
- C WITH SECOND ORDER PACKING. ADDED ROUTINE FI636
- C TO PROCESS MESSAGES WITH SECOND ORDER PACKING.
- C 93-09-22 CAVANAUGH MODIFIED TO EXTRACT SUB-CENTER NUMBER FROM
- C PDS BYTE 26
- C 93-10-13 CAVANAUGH MODIFIED FI634 TO CORRECT GRID SIZES FOR
- C GRIDS 204 AND 208
- C 93-10-14 CAVANAUGH INCREASED SIZE OF KGDS TO INCLUDE ENTRIES FOR
- C NUMBER OF POINTS IN GRID AND NUMBER OF WORDS
- C IN EACH ROW
- C 93-12-08 CAVANAUGH CORRECTED TEST FOR EDITION NUMBER INSTEAD
- C OF VERSION NUMBER
- C 93-12-15 CAVANAUGH MODIFIED SECOND ORDER POINTERS TO FIRST ORDER
- C VALUES AND SECOND ORDER VALUES CORRECTLY
- C IN ROUTINE FI636
- C 94-03-02 CAVANAUGH ADDED CALL TO W3FI83 WITHIN DECODER. USER
- C NO LONGER NEEDS TO MAKE CALL TO THIS ROUTINE
- C 94-04-22 CAVANAUGH MODIFIED FI635, FI636 TO PROCESS ROW BY ROW
- C SECOND ORDER PACKING, ADDED SCALING CORRECTION
- C TO FI635, AND CORRECTED TYPOGRAPHICAL ERRORS
- C IN COMMENT FIELDS IN FI634
- C 94-05-17 CAVANAUGH CORRECTED ERROR IN FI633 TO EXTRACT RESOLUTION
- C FOR LAMBERT-CONFORMAL GRIDS. ADDED CLARIFYING
- C INFORMATION TO DOCBLOCK ENTRIES
- C 94-05-25 CAVANAUGH ADDED CODE TO PROCESS COLUMN BY COLUMN AS WELL
- C AS ROW BY ROW ORDERING OF SECOND ORDER DATA
- C 94-06-27 CAVANAUGH ADDED PROCESSING FOR GRIDS 45, 94 AND 95.
- C INCLUDES CONSTRUCTION OF SECOND ORDER BIT MAPS
- C FOR THINNED GRIDS IN FI636.
- C 94-07-08 CAVANAUGH COMMENTED OUT PRINT OUTS USED FOR DEBUGGING
- C 94-09-08 CAVANAUGH ADDED GRIDS 220, 221, 223 FOR FNOC
- C 94-11-10 FARLEY INCREASED MXSIZE FROM 72960 TO 260000
- C FOR .5 DEGREE SST ANALYSIS FIELDS
- C 94-12-06 R.E.JONES CHANGES IN FI632 FOR PDS GREATER THAN 28
- C 95-02-14 R.E.JONES CORRECT IN FI633 FOR NAVY WAFS GRIB
- C 95-03-20 M.BALDWIN FI633 MODIFICATION TO GET
- C DATA REP TYPES [KGDS(1)] 201 AND 202 TO WORK.
- C 95-04-10 E.ROGERS ADDED GRIDS 96 AND 97 FOR ETA MODEL IN FI634.
- C 95-04-26 R.E.JONES FI636 CORECTION FOR 2ND ORDER COMPLEX
- C UNPACKING. R
- C 95-05-19 R.E.JONES ADDED GRID 215, 20 KM AWIPS GRID
- C 95-07-06 R.E.JONES ADDED GAUSSIAN T62, T126 GRID 98, 126
- C 95-10-19 R.E.JONES ADDED GRID 216, 45 KM ETA AWIPS ALASKA GRID
- C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
- C 96-03-07 R.E.JONES CONTINUE UNPACK WITH KRET ERROR 9 IN FI631.
- C 96-08-19 R.E.JONES ADDED MERCATOR GRIDS 8 AND 53, AND GRID 196
- C 97-02-12 W BOSTELMAN CORRECTS ECMWF US GRID 2 PROCESSING
- C 98-06-17 IREDELL REMOVED ALTERNATE RETURN IN FI637
- C 98-08-31 IREDELL ELIMINATED NEED FOR MXSIZE
- C 98-09-02 Gilbert Corrected error in map size for U.S. Grid 92
- C 98-09-08 BALDWIN ADD DATA REP TYPE [KGDS(1)] 203
- C 01-03-08 ROGERS CHANGED ETA GRIDS 90-97, ADDED ETA GRIDS
- C 194, 198. ADDED AWIPS GRIDS 241,242,243,
- C 245, 246, 247, 248, AND 250
- C 01-03-19 VUONG ADDED AWIPS GRIDS 238,239,240, AND 244
- C 2001-06-06 GILBERT Changed gbyte/sbyte calls to refer to
- C Wesley Ebisuzaki's endian independent
- C versions gbytec/sbytec.
- C Removed equivalences.
- C 01-05-03 ROGERS ADDED GRID 249 (12KM FOR ALASKA)
- C 01-10-10 ROGERS REDEFINED GRID 218 FOR 12 KM ETA
- C REDEFINED GRID 192 FOR NEW 32-KM ETA GRID
- C 02-03-27 VUONG ADDED RSAS GRID 88 AND AWIPS GRIDS 219, 220,
- C 223, 224, 225, 226, 227, 228, 229, 230, 231,
- C 232, 233, 234, 235, 251, AND 252
- C 02-08-06 ROGERS REDEFINED GRIDS 90-93,97,194,245-250 FOR THE
- C 8KM HI-RES-WINDOW MODEL AND ADD AWIPS GRID 253
- C 2003-06-30 GILBERT SET NEW VALUES IN ARRAY KPTR TO PASS BACK ADDITIONAL
- C PACKING INFO.
- C KPTR(19) - BINARY SCALE FACTOR
- C KPTR(20) - NUM BITS USED TO PACK EACH DATUM
- C 2003-06-30 GILBERT ADDED GRIDS 145 and 146 for CMAQ
- C and GRID 175 for AWIPS over GUAM.
- C 2003-07-08 VUONG ADDED GRIDS 110, 127, 171, 172 AND MODIFIED GRID 170
- C 2004-09-02 VUONG ADDED AWIPS GRIDS 147, 148, 173 AND 254
- C 2005-01-04 COOKE ADDED AWIPS GRIDS 160 AND 161
- C 2005-03-03 VUONG MOVED GRID 170 TO GRID 174 AND ADD GRID 170
- C 2005-03-21 VUONG ADDED AWIPS GRID 130
- C 2005-10-11 VUONG ADDED AWIPS GRID 163
- C 2006-12-12 VUONG ADDED AWIPS GRID 120
- C 2007-04-12 VUONG ADDED AWIPS 176 AND DATA REP TYPE KGDS(1) 204
- C 2007-06-11 VUONG ADDED NEW GRIDS 11 TO 18 AND 122 TO 125 AND 138
- C AND 180 TO 183
- C 2007-11-06 VUONG CHANGED GRID 198 FROM ARAKAWA STAGGERED E-GRID TO POLAR
- C STEREOGRAPGIC GRID ADDED NEW GRID 10, 99, 150, 151, 197
- C 2008-01-17 VUONG ADDED NEW GRID 195 AND CHANGED GRID 196 (ARAKAWA-E TO MERCATOR)
- C 2009-05-21 VUONG MODIFIED TO HANDLE GRID 45
- C 2010-05-11 VUONG DATA REP TYPE KGDS(1) 205
- C 2010-02-18 VUONG ADDED GRID 128, 139 AND 140
- C 2010-07-20 GAYNO ADDED ROTATED LAT/LON "A,B,C,D" STAGGERS -> KGDS(1) 205
- C 2010-08-05 VUONG ADDED NEW GRID 184, 199, 83 AND
- C REDEFINED GRID 90 FOR NEW RTMA CONUS 1.27-KM
- C REDEFINED GRID 91 FOR NEW RTMA ALASKA 2.976-KM
- C REDEFINED GRID 92 FOR NEW RTMA ALASKA 1.488-KM
- C 2010-09-08 ROGERS CHANGED GRID 94 TO ALASKA 6KM STAGGERED B-GRID
- C CHANGED GRID 95 TO PUERTO RICO 3KM STAGGERED B-GRID
- C CHANGED GRID 96 TO HAWAII 3KM STAGGERED B-GRID
- C CHANGED GRID 96 TO HAWAII 3KM STAGGERED B-GRID
- C CHANGED GRID 97 TO CONUS 4KM STAGGERED B-GRID
- C CHANGED GRID 99 TO NAM 12KM STAGGERED B-GRID
- C ADDED GRID 179 (12 KM POLAR STEREOGRAPHIC OVER NORTH AMERICA)
- C CHANGED GRID 194 TO 3KM MERCATOR GRID OVER PUERTO RICO
- C CORRECTED LATITUDE OF SW CORNER POINT OF GRID 151
- C
- C USAGE: CALL W3FI63(MSGA,KPDS,KGDS,KBMS,DATA,KPTR,KRET)
- C INPUT ARGUMENT LIST:
- C MSGA - GRIB FIELD - "GRIB" THRU "7777" CHAR*1
- C (MESSAGE CAN BE PRECEDED BY JUNK CHARS)
- C
- C OUTPUT ARGUMENT LIST:
- C DATA - ARRAY CONTAINING DATA ELEMENTS
- C KPDS - ARRAY CONTAINING PDS ELEMENTS. (EDITION 1)
- C (1) - ID OF CENTER
- C (2) - GENERATING PROCESS ID NUMBER
- C (3) - GRID DEFINITION
- C (4) - GDS/BMS FLAG (RIGHT ADJ COPY OF OCTET 8)
- C (5) - INDICATOR OF PARAMETER
- C (6) - TYPE OF LEVEL
- C (7) - HEIGHT/PRESSURE , ETC OF LEVEL
- C (8) - YEAR INCLUDING (CENTURY-1)
- C (9) - MONTH OF YEAR
- C (10) - DAY OF MONTH
- C (11) - HOUR OF DAY
- C (12) - MINUTE OF HOUR
- C (13) - INDICATOR OF FORECAST TIME UNIT
- C (14) - TIME RANGE 1
- C (15) - TIME RANGE 2
- C (16) - TIME RANGE FLAG
- C (17) - NUMBER INCLUDED IN AVERAGE
- C (18) - VERSION NR OF GRIB SPECIFICATION
- C (19) - VERSION NR OF PARAMETER TABLE
- C (20) - NR MISSING FROM AVERAGE/ACCUMULATION
- C (21) - CENTURY OF REFERENCE TIME OF DATA
- C (22) - UNITS DECIMAL SCALE FACTOR
- C (23) - SUBCENTER NUMBER
- C (24) - PDS BYTE 29, FOR NMC ENSEMBLE PRODUCTS
- C 128 IF FORECAST FIELD ERROR
- C 64 IF BIAS CORRECTED FCST FIELD
- C 32 IF SMOOTHED FIELD
- C WARNING: CAN BE COMBINATION OF MORE THAN 1
- C (25) - PDS BYTE 30, NOT USED
- C (26-35) - RESERVED
- C (36-N) - CONSECUTIVE BYTES EXTRACTED FROM PROGRAM
- C DEFINITION SECTION (PDS) OF GRIB MESSAGE
- C KGDS - ARRAY CONTAINING GDS ELEMENTS.
- C (1) - DATA REPRESENTATION TYPE
- C (19) - NUMBER OF VERTICAL COORDINATE PARAMETERS
- C (20) - OCTET NUMBER OF THE LIST OF VERTICAL COORDINATE
- C PARAMETERS
- C OR
- C OCTET NUMBER OF THE LIST OF NUMBERS OF POINTS
- C IN EACH ROW
- C OR
- C 255 IF NEITHER ARE PRESENT
- C (21) - FOR GRIDS WITH PL, NUMBER OF POINTS IN GRID
- C (22) - NUMBER OF WORDS IN EACH ROW
- C LATITUDE/LONGITUDE GRIDS
- C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
- C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
- C (4) - LA(1) LATITUDE OF ORIGIN
- C (5) - LO(1) LONGITUDE OF ORIGIN
- C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
- C (7) - LA(2) LATITUDE OF EXTREME POINT
- C (8) - LO(2) LONGITUDE OF EXTREME POINT
- C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
- C (10) - DJ LATITUDINAL DIRECTION INCREMENT
- C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
- C GAUSSIAN GRIDS
- C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
- C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
- C (4) - LA(1) LATITUDE OF ORIGIN
- C (5) - LO(1) LONGITUDE OF ORIGIN
- C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
- C (7) - LA(2) LATITUDE OF EXTREME POINT
- C (8) - LO(2) LONGITUDE OF EXTREME POINT
- C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
- C (10) - N - NR OF CIRCLES POLE TO EQUATOR
- C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
- C (12) - NV - NR OF VERT COORD PARAMETERS
- C (13) - PV - OCTET NR OF LIST OF VERT COORD PARAMETERS
- C OR
- C PL - LOCATION OF THE LIST OF NUMBERS OF POINTS IN
- C EACH ROW (IF NO VERT COORD PARAMETERS
- C ARE PRESENT
- C OR
- C 255 IF NEITHER ARE PRESENT
- C POLAR STEREOGRAPHIC GRIDS
- C (2) - N(I) NR POINTS ALONG LAT CIRCLE
- C (3) - N(J) NR POINTS ALONG LON CIRCLE
- C (4) - LA(1) LATITUDE OF ORIGIN
- C (5) - LO(1) LONGITUDE OF ORIGIN
- C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
- C (7) - LOV GRID ORIENTATION
- C (8) - DX - X DIRECTION INCREMENT
- C (9) - DY - Y DIRECTION INCREMENT
- C (10) - PROJECTION CENTER FLAG
- C (11) - SCANNING MODE (RIGHT ADJ COPY OF OCTET 28)
- C SPHERICAL HARMONIC COEFFICIENTS
- C (2) - J PENTAGONAL RESOLUTION PARAMETER
- C (3) - K " " "
- C (4) - M " " "
- C (5) - REPRESENTATION TYPE
- C (6) - COEFFICIENT STORAGE MODE
- C MERCATOR GRIDS
- C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
- C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
- C (4) - LA(1) LATITUDE OF ORIGIN
- C (5) - LO(1) LONGITUDE OF ORIGIN
- C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
- C (7) - LA(2) LATITUDE OF LAST GRID POINT
- C (8) - LO(2) LONGITUDE OF LAST GRID POINT
- C (9) - LATIT - LATITUDE OF PROJECTION INTERSECTION
- C (10) - RESERVED
- C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
- C (12) - LONGITUDINAL DIR GRID LENGTH
- C (13) - LATITUDINAL DIR GRID LENGTH
- C LAMBERT CONFORMAL GRIDS
- C (2) - NX NR POINTS ALONG X-AXIS
- C (3) - NY NR POINTS ALONG Y-AXIS
- C (4) - LA1 LAT OF ORIGIN (LOWER LEFT)
- C (5) - LO1 LON OF ORIGIN (LOWER LEFT)
- C (6) - RESOLUTION (RIGHT ADJ COPY OF OCTET 17)
- C (7) - LOV - ORIENTATION OF GRID
- C (8) - DX - X-DIR INCREMENT
- C (9) - DY - Y-DIR INCREMENT
- C (10) - PROJECTION CENTER FLAG
- C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
- C (12) - LATIN 1 - FIRST LAT FROM POLE OF SECANT CONE INTER
- C (13) - LATIN 2 - SECOND LAT FROM POLE OF SECANT CONE INTER
- C E-STAGGERED ARAKAWA ROTATED LAT/LON GRIDS (TYPE 203)
- C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
- C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
- C (4) - LA(1) LATITUDE OF ORIGIN
- C (5) - LO(1) LONGITUDE OF ORIGIN
- C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
- C (7) - LA(2) LATITUDE OF CENTER
- C (8) - LO(2) LONGITUDE OF CENTER
- C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
- C (10) - DJ LATITUDINAL DIRECTION INCREMENT
- C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
- C CURVILINEAR ORTHIGINAL GRID (TYPE 204)
- C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
- C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
- C (4) - RESERVED SET TO 0
- C (5) - RESERVED SET TO 0
- C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
- C (7) - RESERVED SET TO 0
- C (8) - RESERVED SET TO 0
- C (9) - RESERVED SET TO 0
- C (10) - RESERVED SET TO 0
- C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
- C ROTATED LAT/LON A,B,C,D-STAGGERED (TYPE 205)
- C (2) - N(I) NR POINTS ON LATITUDE CIRCLE
- C (3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
- C (4) - LA(1) LATITUDE OF FIRST POINT
- C (5) - LO(1) LONGITUDE OF FIRST POINT
- C (6) - RESOLUTION FLAG (RIGHT ADJ COPY OF OCTET 17)
- C (7) - LA(2) LATITUDE OF CENTER
- C (8) - LO(2) LONGITUDE OF CENTER
- C (9) - DI LONGITUDINAL DIRECTION OF INCREMENT
- C (10) - DJ LATITUDINAL DIRECTION INCREMENT
- C (11) - SCANNING MODE FLAG (RIGHT ADJ COPY OF OCTET 28)
- C (12) - LATITUDE OF LAST POINT
- C (13) - LONGITUDE OF LAST POINT
- C KBMS - BITMAP DESCRIBING LOCATION OF OUTPUT ELEMENTS.
- C (ALWAYS CONSTRUCTED)
- C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
- C (1) - TOTAL LENGTH OF GRIB MESSAGE
- C (2) - LENGTH OF INDICATOR (SECTION 0)
- C (3) - LENGTH OF PDS (SECTION 1)
- C (4) - LENGTH OF GDS (SECTION 2)
- C (5) - LENGTH OF BMS (SECTION 3)
- C (6) - LENGTH OF BDS (SECTION 4)
- C (7) - VALUE OF CURRENT BYTE
- C (8) - BIT POINTER
- C (9) - GRIB START BIT NR
- C (10) - GRIB/GRID ELEMENT COUNT
- C (11) - NR UNUSED BITS AT END OF SECTION 3
- C (12) - BIT MAP FLAG (COPY OF BMS OCTETS 5,6)
- C (13) - NR UNUSED BITS AT END OF SECTION 2
- C (14) - BDS FLAGS (RIGHT ADJ COPY OF OCTET 4)
- C (15) - NR UNUSED BITS AT END OF SECTION 4
- C (16) - RESERVED
- C (17) - RESERVED
- C (18) - RESERVED
- C (19) - BINARY SCALE FACTOR
- C (20) - NUM BITS USED TO PACK EACH DATUM
- C KRET - FLAG INDICATING QUALITY OF COMPLETION
- C
- C REMARKS: WHEN DECODING IS COMPLETED, DATA AT EACH GRID POINT HAS BEEN
- C RETURNED IN THE UNITS SPECIFIED IN THE GRIB MANUAL.
- C
- C VALUES FOR RETURN FLAG (KRET)
- C KRET = 0 - NORMAL RETURN, NO ERRORS
- C = 1 - 'GRIB' NOT FOUND IN FIRST 100 CHARS
- C = 2 - '7777' NOT IN CORRECT LOCATION
- C = 3 - UNPACKED FIELD IS LARGER THAN 260000
- C = 4 - GDS/ GRID NOT ONE OF CURRENTLY ACCEPTED VALUES
- C = 5 - GRID NOT CURRENTLY AVAIL FOR CENTER INDICATED
- C = 8 - TEMP GDS INDICATED, BUT GDS FLAG IS OFF
- C = 9 - GDS INDICATES SIZE MISMATCH WITH STD GRID
- C =10 - INCORRECT CENTER INDICATOR
- C =11 - BINARY DATA SECTION (BDS) NOT COMPLETELY PROCESSED.
- C PROGRAM IS NOT SET TO PROCESS FLAG COMBINATIONS
- C SHOWN IN OCTETS 4 AND 14.
- C =12 - BINARY DATA SECTION (BDS) NOT COMPLETELY PROCESSED.
- C PROGRAM IS NOT SET TO PROCESS FLAG COMBINATIONS
- C
- C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
- C
- C ATTRIBUTES:
- C LANGUAGE: FORTRAN 90
- C
- C$$$
- C 4 AUG 1988
- C W3FI63
- C
- C
- C GRIB UNPACKING ROUTINE
- C
- C
- C THIS ROUTINE WILL UNPACK A 'GRIB' FIELD TO THE EXACT GRID
- C TYPE SPECIFIED IN THE MESSAGE, RETURN A BIT MAP AND MAKE THE
- C VALUES OF THE PRODUCT DEFINITION SEC (PDS) AND THE GRID
- C DESCRIPTION SEC (GDS) AVAILABLE IN RETURN ARRAYS.
- C SEE "GRIB - THE WMO FORMAT FOR THE STORAGE OF WEATHER PRODUCT
- C INFORMATION AND THE EXCHANGE OF WEATHER PRODUCT MESSAGES IN
- C GRIDDED BINARY FORM" DATED JULY 1, 1988 BY JOHN D. STACKPOLE
- C DOC, NOAA, NWS, NATIONAL METEOROLOGICAL CENTER.
- C
- C THE CALL TO THE GRIB UNPACKING ROUTINE IS AS FOLLOWS:
- C
- C CALL W3FI63(MSGA,KPDS,KGDS,LBMS,DATA,KPTR,KRET)
- C
- C INPUT:
- C
- C MSGA = CONTAINS THE GRIB MESSAGE TO BE UNPACKED. CHARACTERS
- C "GRIB" MAY BEGIN ANYWHERE WITHIN FIRST 100 BYTES.
- C
- C OUTPUT:
- C
- C KPDS(100) INTEGER*4
- C ARRAY TO CONTAIN THE ELEMENTS OF THE PRODUCT
- C DEFINITION SEC .
- C (VERSION 1)
- C KPDS(1) - ID OF CENTER
- C KPDS(2) - MODEL IDENTIFICATION (SEE "GRIB" TABLE 1)
- C KPDS(3) - GRID IDENTIFICATION (SEE "GRIB" TABLE 2)
- C KPDS(4) - GDS/BMS FLAG
- C BIT DEFINITION
- C 25 0 - GDS OMITTED
- C 1 - GDS INCLUDED
- C 26 0 - BMS OMITTED
- C 1 - BMS INCLUDED
- C NOTE:- LEFTMOST BIT = 1,
- C RIGHTMOST BIT = 32
- C KPDS(5) - INDICATOR OF PARAMETER (SEE "GRIB" TABLE 5)
- C KPDS(6) - TYPE OF LEVEL (SEE "GRIB" TABLES 6 & 7)
- C KPDS(7) - HEIGHT,PRESSURE,ETC OF LEVEL
- C KPDS(8) - YEAR INCLUDING CENTURY
- C KPDS(9) - MONTH OF YEAR
- C KPDS(10) - DAY OF MONTH
- C KPDS(11) - HOUR OF DAY
- C KPDS(12) - MINUTE OF HOUR
- C KPDS(13) - INDICATOR OF FORECAST TIME UNIT (SEE "GRIB"
- C TABLE 8)
- C KPDS(14) - TIME 1 (SEE "GRIB" TABLE 8A)
- C KPDS(15) - TIME 2 (SEE "GRIB" TABLE 8A)
- C KPDS(16) - TIME RANGE INDICATOR (SEE "GRIB" TABLE 8A)
- C KPDS(17) - NUMBER INCLUDED IN AVERAGE
- C KPDS(18) - EDITION NR OF GRIB SPECIFICATION
- C KPDS(19) - VERSION NR OF PARAMETER TABLE
- C
- C KGDS(13) INTEGER*4
- C ARRAY CONTAINING GDS ELEMENTS.
- C
- C KGDS(1) - DATA REPRESENTATION TYPE
- C
- C LATITUDE/LONGITUDE GRIDS (SEE "GRIB" TABLE 10)
- C KGDS(2) - N(I) NUMBER OF POINTS ON LATITUDE
- C CIRCLE
- C KGDS(3) - N(J) NUMBER OF POINTS ON LONGITUDE
- C CIRCLE
- C KGDS(4) - LA(1) LATITUDE OF ORIGIN
- C KGDS(5) - LO(1) LONGITUDE OF ORIGIN
- C KGDS(6) - RESOLUTION FLAG
- C BIT MEANING
- C 25 0 - DIRECTION INCREMENTS NOT
- C GIVEN
- C 1 - DIRECTION INCREMENTS GIVEN
- C KGDS(7) - LA(2) LATITUDE OF EXTREME POINT
- C KGDS(8) - LO(2) LONGITUDE OF EXTREME POINT
- C KGDS(9) - DI LONGITUDINAL DIRECTION INCREMENT
- C KGDS(10) - REGULAR LAT/LON GRID
- C DJ - LATITUDINAL DIRECTION
- C INCREMENT
- C GAUSSIAN GRID
- C N - NUMBER OF LATITUDE CIRCLES
- C BETWEEN A POLE AND THE EQUATOR
- C KGDS(11) - SCANNING MODE FLAG
- C BIT MEANING
- C 25 0 - POINTS ALONG A LATITUDE
- C SCAN FROM WEST TO EAST
- C 1 - POINTS ALONG A LATITUDE
- C SCAN FROM EAST TO WEST
- C 26 0 - POINTS ALONG A MERIDIAN
- C SCAN FROM NORTH TO SOUTH
- C 1 - POINTS ALONG A MERIDIAN
- C SCAN FROM SOUTH TO NORTH
- C 27 0 - POINTS SCAN FIRST ALONG
- C CIRCLES OF LATITUDE, THEN
- C ALONG MERIDIANS
- C (FORTRAN: (I,J))
- C 1 - POINTS SCAN FIRST ALONG
- C MERIDIANS THEN ALONG
- C CIRCLES OF LATITUDE
- C (FORTRAN: (J,I))
- C
- C POLAR STEREOGRAPHIC GRIDS (SEE GRIB TABLE 12)
- C KGDS(2) - N(I) NR POINTS ALONG LAT CIRCLE
- C KGDS(3) - N(J) NR POINTS ALONG LON CIRCLE
- C KGDS(4) - LA(1) LATITUDE OF ORIGIN
- C KGDS(5) - LO(1) LONGITUDE OF ORIGIN
- C KGDS(6) - RESERVED
- C KGDS(7) - LOV GRID ORIENTATION
- C KGDS(8) - DX - X DIRECTION INCREMENT
- C KGDS(9) - DY - Y DIRECTION INCREMENT
- C KGDS(10) - PROJECTION CENTER FLAG
- C KGDS(11) - SCANNING MODE
- C
- C SPHERICAL HARMONIC COEFFICIENTS (SEE "GRIB" TABLE 14)
- C KGDS(2) - J PENTAGONAL RESOLUTION PARAMETER
- C KGDS(3) - K PENTAGONAL RESOLUTION PARAMETER
- C KGDS(4) - M PENTAGONAL RESOLUTION PARAMETER
- C KGDS(5) - REPRESENTATION TYPE
- C KGDS(6) - COEFFICIENT STORAGE MODE
- C
- C MERCATOR GRIDS
- C KGDS(2) - N(I) NR POINTS ON LATITUDE CIRCLE
- C KGDS(3) - N(J) NR POINTS ON LONGITUDE MERIDIAN
- C KGDS(4) - LA(1) LATITUDE OF ORIGIN
- C KGDS(5) - LO(1) LONGITUDE OF ORIGIN
- C KGDS(6) - RESOLUTION FLAG
- C KGDS(7) - LA(2) LATITUDE OF LAST GRID POINT
- C KGDS(8) - LO(2) LONGITUDE OF LAST GRID POINT
- C KGDS(9) - LATIN - LATITUDE OF PROJECTION INTERSECTION
- C KGDS(10) - RESERVED
- C KGDS(11) - SCANNING MODE FLAG
- C KGDS(12) - LONGITUDINAL DIR GRID LENGTH
- C KGDS(13) - LATITUDINAL DIR GRID LENGTH
- C LAMBERT CONFORMAL GRIDS
- C KGDS(2) - NX NR POINTS ALONG X-AXIS
- C KGDS(3) - NY NR POINTS ALONG Y-AXIS
- C KGDS(4) - LA1 LAT OF ORIGIN (LOWER LEFT)
- C KGDS(5) - LO1 LON OF ORIGIN (LOWER LEFT)
- C KGDS(6) - RESOLUTION (RIGHT ADJ COPY OF OCTET 17)
- C KGDS(7) - LOV - ORIENTATION OF GRID
- C KGDS(8) - DX - X-DIR INCREMENT
- C KGDS(9) - DY - Y-DIR INCREMENT
- C KGDS(10) - PROJECTION CENTER FLAG
- C KGDS(11) - SCANNING MODE FLAG
- C KGDS(12) - LATIN 1 - FIRST LAT FROM POLE OF
- C SECANT CONE INTERSECTION
- C KGDS(13) - LATIN 2 - SECOND LAT FROM POLE OF
- C SECANT CONE INTERSECTION
- C
- C LBMS(*) LOGICAL
- C ARRAY TO CONTAIN THE BIT MAP DESCRIBING THE
- C PLACEMENT OF DATA IN THE OUTPUT ARRAY. IF A
- C BIT MAP IS NOT INCLUDED IN THE SOURCE MESSAGE,
- C ONE WILL BE GENERATED AUTOMATICALLY BY THE
- C UNPACKING ROUTINE.
- C
- C
- C DATA(*) REAL*4
- C THIS ARRAY WILL CONTAIN THE UNPACKED DATA POINTS.
- C
- C NOTE:- 65160 IS MAXIMUN FIELD SIZE ALLOWABLE
- C
- C KPTR(10) INTEGER*4
- C ARRAY CONTAINING STORAGE FOR THE FOLLOWING
- C PARAMETERS.
- C
- C (1) - UNUSED
- C (2) - UNUSED
- C (3) - LENGTH OF PDS (IN BYTES)
- C (4) - LENGTH OF GDS (IN BYTES)
- C (5) - LENGTH OF BMS (IN BYTES)
- C (6) - LENGTH OF BDS (IN BYTES)
- C (7) - USED BY UNPACKING ROUTINE
- C (8) - NUMBER OF DATA POINTS FOR GRID
- C (9) - "GRIB" CHARACTERS START IN BYTE NUMBER
- C (10) - USED BY UNPACKING ROUTINE
- C
- C
- C KRET INTEGER*4
- C THIS VARIABLE WILL CONTAIN THE RETURN INDICATOR.
- C
- C 0 - NO ERRORS DETECTED.
- C
- C 1 - 'GRIB' NOT FOUND IN FIRST 100
- C CHARACTERS.
- C
- C 2 - '7777' NOT FOUND, EITHER MISSING OR
- C TOTAL OF SEC COUNTS OF INDIVIDUAL
- C SECTIONS IS INCORRECT.
- C
- C 3 - UNPACKED FIELD IS LARGER THAN 65160.
- C
- C 4 - IN GDS, DATA REPRESENTATION TYPE
- C NOT ONE OF THE CURRENTLY ACCEPTABLE
- C VALUES. SEE "GRIB" TABLE 9. VALUE
- C OF INCORRECT TYPE RETURNED IN KGDS(1).
- C
- C 5 - GRID INDICATED IN KPDS(3) IS NOT
- C AVAILABLE FOR THE CENTER INDICATED IN
- C KPDS(1) AND NO GDS SENT.
- C
- C 7 - EDITION INDICATED IN KPDS(18) HAS NOT
- C YET BEEN INCLUDED IN THE DECODER.
- C
- C 8 - GRID IDENTIFICATION = 255 (NOT STANDARD
- C GRID) BUT FLAG INDICATING PRESENCE OF
- C GDS IS TURNED OFF. NO METHOD OF
- C GENERATING PROPER GRID.
- C
- C 9 - PRODUCT OF KGDS(2) AND KGDS(3) DOES NOT
- C MATCH STANDARD NUMBER OF POINTS FOR THIS
- C GRID (FOR OTHER THAN SPECTRALS). THIS
- C WILL OCCUR ONLY IF THE GRID.
- C IDENTIFICATION, KPDS(3), AND A
- C TRANSMITTED GDS ARE INCONSISTENT.
- C
- C 10 - CENTER INDICATOR WAS NOT ONE INDICATED
- C IN "GRIB" TABLE 1. PLEASE CONTACT AD
- C PRODUCTION MANAGEMENT BRANCH (W/NMC42)
- C IF THIS ERROR IS ENCOUNTERED.
- C
- C 11 - BINARY DATA SECTION (BDS) NOT COMPLETELY
- C PROCESSED. PROGRAM IS NOT SET TO PROCESS
- C FLAG COMBINATIONS AS SHOWN IN
- C OCTETS 4 AND 14.
- C
- C
- C LIST OF TEXT MESSAGES FROM CODE
- C
- C
- C W3FI63/FI632
- C
- C 'HAVE ENCOUNTERED A NEW GRID FOR NMC, PLEASE NOTIFY
- C AUTOMATION DIVISION, PRODUCTION MANAGEMENT BRANCH
- C (W/NMC42)'
- C
- C 'HAVE ENCOUNTERED A NEW GRID FOR ECMWF, PLEASE NOTIFY
- C AUTOMATION DIVISION, PRODUCTION MANAGEMENT BRANCH
- C (W/NMC42)'
- C
- C 'HAVE ENCOUNTERED A NEW GRID FOR U.K. METEOROLOGICAL
- C OFFICE, BRACKNELL. PLEASE NOTIFY AUTOMATION DIVISION,
- C PRODUCTION MANAGEMENT BRANCH (W/NMC42)'
- C
- C 'HAVE ENCOUNTERED A NEW GRID FOR FNOC, PLEASE NOTIFY
- C AUTOMATION DIVISION, PRODUCTION MANAGEMENT BRANCH
- C (W/NMC42)'
- C
- C
- C W3FI63/FI633
- C
- C 'POLAR STEREO PROCESSING NOT AVAILABLE' *
- C
- C W3FI63/FI634
- C
- C 'WARNING - BIT MAP MAY NOT BE ASSOCIATED WITH SPHERICAL
- C COEFFICIENTS'
- C
- C
- C W3FI63/FI637
- C
- C 'NO CURRENT LISTING OF FNOC GRIDS' *
- C
- C
- C * WILL BE AVAILABLE IN NEXT UPDATE
- C ***************************************************************
- C
- C INCOMING MESSAGE HOLDER
- CHARACTER*1 MSGA(*)
- C BIT MAP
- LOGICAL*1 KBMS(*)
- C
- C ELEMENTS OF PRODUCT DESCRIPTION SEC (PDS)
- INTEGER KPDS(*)
- C ELEMENTS OF GRID DESCRIPTION SEC (PDS)
- INTEGER KGDS(*)
- C
- C CONTAINER FOR GRIB GRID
- REAL DATA(*)
- C
- C ARRAY OF POINTERS AND COUNTERS
- INTEGER KPTR(*)
- C
- C *****************************************************************
- INTEGER JSGN,JEXP,IFR,NPTS
- REAL REALKK,FVAL1,FDIFF1
- C *****************************************************************
- C 1.0 LOCATE BEGINNING OF 'GRIB' MESSAGE
- C FIND 'GRIB' CHARACTERS
- C 2.0 USE COUNTS IN EACH DESCRIPTION SEC TO DETERMINE
- C IF '7777' IS IN PROPER PLACE.
- C 3.0 PARSE PRODUCT DEFINITION SECTION.
- C 4.0 PARSE GRID DESCRIPTION SEC (IF INCLUDED)
- C 5.0 PARSE BIT MAP SEC (IF INCLUDED)
- C 6.0 USING INFORMATION FROM PRODUCT DEFINITION, GRID
- C DESCRIPTION, AND BIT MAP SECTIONS.. EXTRACT
- C DATA AND PLACE INTO PROPER ARRAY.
- C *******************************************************************
- C
- C MAIN DRIVER
- C
- C *******************************************************************
- KPTR(10) = 0
- C SEE IF PROPER 'GRIB' KEY EXISTS, THEN
- C USING SEC COUNTS, DETERMINE IF '7777'
- C IS IN THE PROPER LOCATION
- C
- CALL FI631(MSGA,KPTR,KPDS,KRET)
- IF(KRET.NE.0) THEN
- GO TO 900
- END IF
- C PRINT *,'FI631 KPTR',(KPTR(I),I=1,16)
- C
- C PARSE PARAMETERS FROM PRODUCT DESCRIPTION SECTION
- C
- CALL FI632(MSGA,KPTR,KPDS,KRET)
- IF(KRET.NE.0) THEN
- GO TO 900
- END IF
- C PRINT *,'FI632 KPTR',(KPTR(I),I=1,16)
- C
- C IF AVAILABLE, EXTRACT NEW GRID DESCRIPTION
- C
- IF (IAND(KPDS(4),128).NE.0) THEN
- CALL FI633(MSGA,KPTR,KGDS,KRET)
- IF(KRET.NE.0) THEN
- GO TO 900
- END IF
- C PRINT *,'FI633 KPTR',(KPTR(I),I=1,16)
- END IF
- C
- C EXTRACT OR GENERATE BIT MAP
- C
- CALL FI634(MSGA,KPTR,KPDS,KGDS,KBMS,KRET)
- IF (KRET.NE.0) THEN
- IF (KRET.NE.9) THEN
- GO TO 900
- END IF
- END IF
- C PRINT *,'FI634 KPTR',(KPTR(I),I=1,16)
- C
- C USING INFORMATION FROM PDS, BMS AND BIT DATA SEC ,
- C EXTRACT AND SAVE IN GRIB GRID, ALL DATA ENTRIES.
- C
- IF (KPDS(18).EQ.1) THEN
- CALL FI635(MSGA,KPTR,KPDS,KGDS,KBMS,DATA,KRET)
- IF (KPTR(3).EQ.50) THEN
- C
- C PDS EQUAL 50 BYTES
- C THEREFORE SOMETHING SPECIAL IS GOING ON
- C
- C IN THIS CASE 2ND DIFFERENCE PACKING
- C NEEDS TO BE UNDONE.
- C
- C EXTRACT FIRST VALUE FROM BYTE 41-44 PDS
- C KPTR(9) CONTAINS OFFSET TO START OF
- C GRIB MESSAGE.
- C EXTRACT FIRST FIRST-DIFFERENCE FROM BYTES 45-48 PDS
- C
- C AND EXTRACT SCALE FACTOR (E) TO UNDO 2**E
- C THAT WAS APPLIED PRIOR TO 2ND ORDER PACKING
- C AND PLACED IN PDS BYTES 49-51
- C FACTOR IS A SIGNED TWO BYTE INTEGER
- C
- C ALSO NEED THE DECIMAL SCALING FROM PDS(27-28)
- C (AVAILABLE IN KPDS(22) FROM UNPACKER)
- C TO UNDO THE DECIMAL SCALING APPLIED TO THE
- C SECOND DIFFERENCES DURING UNPACKING.
- C SECOND DIFFS ALWAYS PACKED WITH 0 DECIMAL SCALE
- C BUT UNPACKER DOESNT KNOW THAT.
- C
- C CALL GBYTE (MSGA,FVAL1,KPTR(9)+384,32)
- C
- C NOTE INTEGERS, CHARACTERS AND EQUIVALENCES
- C DEFINED ABOVE TO MAKE THIS KKK EXTRACTION
- C WORK AND LINE UP ON WORD BOUNDARIES
- C
- C THE NEXT CODE WILL CONVERT THE IBM370 FOATING POINT
- C TO THE FLOATING POINT USED ON YOUR MACHINE.
- C
- call gbytec(MSGA,JSGN,KPTR(9)+384,1)
- call gbytec(MSGA,JEXP,KPTR(9)+385,7)
- call gbytec(MSGA,IFR,KPTR(9)+392,24)
- C
- IF (IFR.EQ.0) THEN
- REALKK = 0.0
- ELSE IF (JEXP.EQ.0.AND.IFR.EQ.0) THEN
- REALKK = 0.0
- ELSE
- REALKK = FLOAT(IFR) * 16.0 ** (JEXP - 64 - 6)
- IF (JSGN.NE.0) REALKK = -REALKK
- END IF
- FVAL1 = REALKK
- C
- C CALL GBYTE (MSGA,FDIFF1,KPTR(9)+416,32)
- C (REPLACED BY FOLLOWING EXTRACTION)
- C
- C THE NEXT CODE WILL CONVERT THE IBM370 FOATING POINT
- C TO THE FLOATING POINT USED ON YOUR MACHINE.
- C
- call gbytec(MSGA,JSGN,KPTR(9)+416,1)
- call gbytec(MSGA,JEXP,KPTR(9)+417,7)
- call gbytec(MSGA,IFR,KPTR(9)+424,24)
- C
- IF (IFR.EQ.0) THEN
- REALKK = 0.0
- ELSE IF (JEXP.EQ.0.AND.IFR.EQ.0) THEN
- REALKK = 0.0
- ELSE
- REALKK = FLOAT(IFR) * 16.0 ** (JEXP - 64 - 6)
- IF (JSGN.NE.0) REALKK = -REALKK
- END IF
- FDIFF1 = REALKK
- C
- CALL GBYTEC (MSGA,ISIGN,KPTR(9)+448,1)
- CALL GBYTEC (MSGA,ISCAL2,KPTR(9)+449,15)
- IF(ISIGN.GT.0) THEN
- ISCAL2 = - ISCAL2
- ENDIF
- C PRINT *,'DELTA POINT 1-',FVAL1
- C PRINT *,'DELTA POINT 2-',FDIFF1
- C PRINT *,'DELTA POINT 3-',ISCAL2
- NPTS = KPTR(10)
- C WRITE (6,FMT='('' 2ND DIFF POINTS IN FIELD = '',/,
- C & 10(3X,10F12.2,/))') (DATA(I),I=1,NPTS)
- C PRINT *,'DELTA POINT 4-',KPDS(22)
- CALL W3FI83 (DATA,NPTS,FVAL1,FDIFF1,
- & ISCAL2,KPDS(22),KPDS,KGDS)
- C WRITE (6,FMT='('' 2ND DIFF EXPANDED POINTS IN FIELD = '',
- C & /,10(3X,10F12.2,/))') (DATA(I),I=1,NPTS)
- C WRITE (6,FMT='('' END OF ARRAY IN FIELD = '',/,
- C & 10(3X,10F12.2,/))') (DATA(I),I=NPTS-5,NPTS)
- END IF
- ELSE
- C PRINT *,'FI635 NOT PROGRAMMED FOR EDITION NR',KPDS(18)
- KRET = 7
- END IF
- C
- 900 RETURN
- END
- SUBROUTINE FI631(MSGA,KPTR,KPDS,KRET)
- C$$$ SUBPROGRAM DOCUMENTATION BLOCK
- C . . . .
- C SUBPROGRAM: FI631 FIND 'GRIB' CHARS & RESET POINTERS
- C PRGMMR: BILL CAVANAUGH ORG: W/NMC42 DATE: 91-09-13
- C
- C ABSTRACT: FIND 'GRIB; CHARACTERS AND SET POINTERS TO THE NEXT
- C BYTE FOLLOWING 'GRIB'. IF THEY EXIST EXTRACT COUNTS FROM GDS AND
- C BMS. EXTRACT COUNT FROM BDS. DETERMINE IF SUM OF COUNTS ACTUALLY
- C PLACES TERMINATOR '7777' AT THE CORRECT LOCATION.
- C
- C PROGRAM HISTORY LOG:
- C 91-09-13 CAVANAUGH
- C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
- C
- C USAGE: CALL FI631(MSGA,KPTR,KPDS,KRET)
- C INPUT ARGUMENT LIST:
- C MSGA - GRIB FIELD - "GRIB" THRU "7777"
- C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
- C (1) - TOTAL LENGTH OF GRIB MESSAGE
- C (2) - LENGTH OF INDICATOR (SECTION 0)
- C (3) - LENGTH OF PDS (SECTION 1)
- C (4) - LENGTH OF GDS (SECTION 2)
- C (5) - LENGTH OF BMS (SECTION 3)
- C (6) - LENGTH OF BDS (SECTION 4)
- C (7) - VALUE OF CURRENT BYTE
- C (8) - BIT POINTER
- C (9) - GRIB START BIT NR
- C (10) - GRIB/GRID ELEMENT COUNT
- C (11) - NR UNUSED BITS AT END OF SECTION 3
- C (12) - BIT MAP FLAG
- C (13) - NR UNUSED BITS AT END OF SECTION 2
- C (14) - BDS FLAGS
- C (15) - NR UNUSED BITS AT END OF SECTION 4
- C
- C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
- C KPDS - ARRAY CONTAINING PDS ELEMENTS.
- C (1) - ID OF CENTER
- C (2) - MODEL IDENTIFICATION
- C (3) - GRID IDENTIFICATION
- C (4) - GDS/BMS FLAG
- C (5) - INDICATOR OF PARAMETER
- C (6) - TYPE OF LEVEL
- C (7) - HEIGHT/PRESSURE , ETC OF LEVEL
- C (8) - YEAR OF CENTURY
- C (9) - MONTH OF YEAR
- C (10) - DAY OF MONTH
- C (11) - HOUR OF DAY
- C (12) - MINUTE OF HOUR
- C (13) - INDICATOR OF FORECAST TIME UNIT
- C (14) - TIME RANGE 1
- C (15) - TIME RANGE 2
- C (16) - TIME RANGE FLAG
- C (17) - NUMBER INCLUDED IN AVERAGE
- C KPTR - SEE INPUT LIST
- C KRET - ERROR RETURN
- C
- C REMARKS:
- C ERROR RETURNS
- C KRET = 1 - NO 'GRIB'
- C 2 - NO '7777' OR MISLOCATED (BY COUNTS)
- C
- C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
- C
- C ATTRIBUTES:
- C LANGUAGE: FORTRAN 77
- C MACHINE: HDS9000
- C
- C$$$
- C
- C INCOMING MESSAGE HOLDER
- CHARACTER*1 MSGA(*)
- C ARRAY OF POINTERS AND COUNTERS
- INTEGER KPTR(*)
- C PRODUCT DESCRIPTION SECTION DATA.
- INTEGER KPDS(*)
- C
- INTEGER KRET
- C
- C ******************************************************************
- KRET = 0
- C ------------------- FIND 'GRIB' KEY
- DO 50 I = 0, 839, 8
- CALL GBYTEC (MSGA,MGRIB,I,32)
- IF (MGRIB.EQ.1196575042) THEN
- KPTR(9) = I
- GO TO 60
- END IF
- 50 CONTINUE
- KRET = 1
- RETURN
- 60 CONTINUE
- C -------------FOUND 'GRIB'
- C SKIP GRIB CHARACTERS
- C PRINT *,'FI631 GRIB AT',I
- KPTR(8) = KPTR(9) + 32
- CALL GBYTEC (MSGA,ITOTAL,KPTR(8),24)
- C HAVE LIFTED WHAT MAY BE A MSG TOTAL BYTE COUNT
- IPOINT = KPTR(9) + ITOTAL * 8 - 32
- CALL GBYTEC (MSGA,I7777,IPOINT,32)
- IF (I7777.EQ.926365495) THEN
- C HAVE FOUND END OF MESSAGE '7777' IN PROPER LOCATION
- C MARK AND PROCESS AS GRIB VERSION 1 OR HIGHER
- C PRINT *,'FI631 7777 AT',IPOINT
- KPTR(8) = KPTR(8) + 24
- KPTR(1) = ITOTAL
- KPTR(2) = 8
- CALL GBYTEC (MSGA,KPDS(18),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- ELSE
- C CANNOT FIND END OF GRIB EDITION 1 MESSAGE
- KRET = 2
- RETURN
- END IF
- C ------------------- PROCESS SECTION 1
- C EXTRACT COUNT FROM PDS
- C PRINT *,'START OF PDS',KPTR(8)
- CALL GBYTEC (MSGA,KPTR(3),KPTR(8),24)
- LOOK = KPTR(8) + 56
- C EXTRACT GDS/BMS FLAG
- CALL GBYTEC (MSGA,KPDS(4),LOOK,8)
- KPTR(8) = KPTR(8) + KPTR(3) * 8
- C PRINT *,'START OF GDS',KPTR(8)
- IF (IAND(KPDS(4),128).NE.0) THEN
- C EXTRACT COUNT FROM GDS
- CALL GBYTEC (MSGA,KPTR(4),KPTR(8),24)
- KPTR(8) = KPTR(8) + KPTR(4) * 8
- ELSE
- KPTR(4) = 0
- END IF
- C PRINT *,'START OF BMS',KPTR(8)
- IF (IAND(KPDS(4),64).NE.0) THEN
- C EXTRACT COUNT FROM BMS
- CALL GBYTEC (MSGA,KPTR(5),KPTR(8),24)
- ELSE
- KPTR(5) = 0
- END IF
- KPTR(8) = KPTR(8) + KPTR(5) * 8
- C PRINT *,'START OF BDS',KPTR(8)
- C EXTRACT COUNT FROM BDS
- CALL GBYTEC (MSGA,KPTR(6),KPTR(8),24)
- C --------------- TEST FOR '7777'
- C PRINT *,(KPTR(KJ),KJ=1,10)
- KPTR(8) = KPTR(8) + KPTR(6) * 8
- C EXTRACT FOUR BYTES FROM THIS LOCATION
- C PRINT *,'FI631 LOOKING FOR 7777 AT',KPTR(8)
- CALL GBYTEC (MSGA,K7777,KPTR(8),32)
- MATCH = KPTR(2) + KPTR(3) + KPTR(4) + KPTR(5) + KPTR(6) + 4
- IF (K7777.NE.926365495.OR.MATCH.NE.KPTR(1)) THEN
- KRET = 2
- ELSE
- C PRINT *,'FI631 7777 AT',KPTR(8)
- IF (KPDS(18).EQ.0) THEN
- KPTR(1) = KPTR(2) + KPTR(3) + KPTR(4) + KPTR(5) +
- * KPTR(6) + 4
- END IF
- END IF
- C PRINT *,'KPTR',(KPTR(I),I=1,16)
- RETURN
- END
- SUBROUTINE FI632(MSGA,KPTR,KPDS,KRET)
- C$$$ SUBPROGRAM DOCUMENTATION BLOCK
- C . . . .
- C SUBPROGRAM: FI632 GATHER INFO FROM PRODUCT DEFINITION SEC
- C PRGMMR: BILL CAVANAUGH ORG: W/NMC42 DATE: 91-09-13
- C
- C ABSTRACT: EXTRACT INFORMATION FROM THE PRODUCT DESCRIPTION
- C SEC , AND GENERATE LABEL INFORMATION TO PERMIT STORAGE
- C IN OFFICE NOTE 84 FORMAT.
- C
- C PROGRAM HISTORY LOG:
- C 91-09-13 CAVANAUGH
- C 93-12-08 CAVANAUGH CORRECTED TEST FOR EDITION NUMBER INSTEAD
- C OF VERSION NUMBER
- C 95-10-31 IREDELL REMOVED SAVES AND PRINTS
- C 99-01-20 BALDWIN MODIFIED TO HANDLE GRID 237
- C
- C USAGE: CALL FI632(MSGA,KPTR,KPDS,KRET)
- C INPUT ARGUMENT LIST:
- C MSGA - ARRAY CONTAINING GRIB MESSAGE
- C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
- C (1) - TOTAL LENGTH OF GRIB MESSAGE
- C (2) - LENGTH OF INDICATOR (SECTION 0)
- C (3) - LENGTH OF PDS (SECTION 1)
- C (4) - LENGTH OF GDS (SECTION 2)
- C (5) - LENGTH OF BMS (SECTION 3)
- C (6) - LENGTH OF BDS (SECTION 4)
- C (7) - VALUE OF CURRENT BYTE
- C (8) - BIT POINTER
- C (9) - GRIB START BIT NR
- C (10) - GRIB/GRID ELEMENT COUNT
- C (11) - NR UNUSED BITS AT END OF SECTION 3
- C (12) - BIT MAP FLAG
- C (13) - NR UNUSED BITS AT END OF SECTION 2
- C (14) - BDS FLAGS
- C (15) - NR UNUSED BITS AT END OF SECTION 4
- C
- C OUTPUT ARGUMENT LIST: (INCLUDING WORK ARRAYS)
- C KPDS - ARRAY CONTAINING PDS ELEMENTS.
- C (1) - ID OF CENTER
- C (2) - MODEL IDENTIFICATION
- C (3) - GRID IDENTIFICATION
- C (4) - GDS/BMS FLAG
- C (5) - INDICATOR OF PARAMETER
- C (6) - TYPE OF LEVEL
- C (7) - HEIGHT/PRESSURE , ETC OF LEVEL
- C (8) - YEAR OF CENTURY
- C (9) - MONTH OF YEAR
- C (10) - DAY OF MONTH
- C (11) - HOUR OF DAY
- C (12) - MINUTE OF HOUR
- C (13) - INDICATOR OF FORECAST TIME UNIT
- C (14) - TIME RANGE 1
- C (15) - TIME RANGE 2
- C (16) - TIME RANGE FLAG
- C (17) - NUMBER INCLUDED IN AVERAGE
- C (18) -
- C (19) -
- C (20) - NUMBER MISSING FROM AVGS/ACCUMULATIONS
- C (21) - CENTURY
- C (22) - UNITS DECIMAL SCALE FACTOR
- C (23) - SUBCENTER
- C KPTR - ARRAY CONTAINING STORAGE FOR FOLLOWING PARAMETERS
- C SEE INPUT LIST
- C KRET - ERROR RETURN
- C
- C REMARKS:
- C ERROR RETURN = 0 - NO ERRORS
- C = 8 - TEMP GDS INDICATED, BUT NO GDS
- C
- C SUBPROGRAM CAN BE CALLED FROM A MULTIPROCESSING ENVIRONMENT.
- C
- C ATTRIBUTES:
- C LANGUAGE: FORTRAN 77
- C MACHINE: HDS9000
- C
- C$$$
- C
- C INCOMING MESSAGE HOLDER
- CHARACTER*1 MSGA(*)
- C
- C ARRAY OF POINTERS AND COUNTERS
- INTEGER KPTR(*)
- C PRODUCT DESCRIPTION SECTION ENTRIES
- INTEGER KPDS(*)
- C
- INTEGER KRET
- KRET=0
- C ------------------- PROCESS SECTION 1
- KPTR(8) = KPTR(9) + KPTR(2) * 8 + 24
- C BYTE 4
- C PARAMETER TABLE VERSION NR
- CALL GBYTEC (MSGA,KPDS(19),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 5 IDENTIFICATION OF CENTER
- CALL GBYTEC (MSGA,KPDS(1),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 6
- C GET GENERATING PROCESS ID NR
- CALL GBYTEC (MSGA,KPDS(2),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 7
- C GRID DEFINITION
- CALL GBYTEC (MSGA,KPDS(3),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 8
- C GDS/BMS FLAGS
- C CALL GBYTEC (MSGA,KPDS(4),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 9
- C INDICATOR OF PARAMETER
- CALL GBYTEC (MSGA,KPDS(5),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 10
- C TYPE OF LEVEL
- CALL GBYTEC (MSGA,KPDS(6),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 11,12
- C HEIGHT/PRESSURE
- CALL GBYTEC (MSGA,KPDS(7),KPTR(8),16)
- KPTR(8) = KPTR(8) + 16
- C BYTE 13
- C YEAR OF CENTURY
- CALL GBYTEC (MSGA,KPDS(8),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 14
- C MONTH OF YEAR
- CALL GBYTEC (MSGA,KPDS(9),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 15
- C DAY OF MONTH
- CALL GBYTEC (MSGA,KPDS(10),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 16
- C HOUR OF DAY
- CALL GBYTEC (MSGA,KPDS(11),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 17
- C MINUTE
- CALL GBYTEC (MSGA,KPDS(12),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 18
- C INDICATOR TIME UNIT RANGE
- CALL GBYTEC (MSGA,KPDS(13),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 19
- C P1 - PERIOD OF TIME
- CALL GBYTEC (MSGA,KPDS(14),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 20
- C P2 - PERIOD OF TIME
- CALL GBYTEC (MSGA,KPDS(15),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 21
- C TIME RANGE INDICATOR
- CALL GBYTEC (MSGA,KPDS(16),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C
- C IF TIME RANGE INDICATOR IS 10, P1 IS PACKED IN
- C PDS BYTES 19-20
- C
- IF (KPDS(16).EQ.10) THEN
- KPDS(14) = KPDS(14) * 256 + KPDS(15)
- KPDS(15) = 0
- END IF
- C BYTE 22,23
- C NUMBER INCLUDED IN AVERAGE
- CALL GBYTEC (MSGA,KPDS(17),KPTR(8),16)
- KPTR(8) = KPTR(8) + 16
- C BYTE 24
- C NUMBER MISSING FROM AVERAGES/ACCUMULATIONS
- CALL GBYTEC (MSGA,KPDS(20),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- C BYTE 25
- C IDENTIFICATION OF CENTURY
- CALL GBYTEC (MSGA,KPDS(21),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- IF (KPTR(3).GT.25) THEN
- C BYTE 26 SUB CENTER NUMBER
- CALL GBYTEC (MSGA,KPDS(23),KPTR(8),8)
- KPTR(8) = KPTR(8) + 8
- IF (KPTR(3).GE.28) THEN
- C BYTE 27-28
- C UNITS DECIMAL SCALE FACTOR
- CALL GBYTEC (MSGA,ISIGN,KPTR(8),1)
- KPTR(8) = KPTR(8) + 1
- CALL GBYTEC (MSGA,IDEC,KPTR(8),15)
- KPTR(8) = KPTR(8) + 15
- IF (ISIGN.GT.0) THEN
- KPDS(22) = - IDEC
- ELSE
- KPDS(22) = IDEC
- END IF
- ISIZ = KPTR(3) - 28
- IF (ISIZ.LE.12) THEN
- C BYTE 29
- CALL GBYTEC (MSGA,KPDS(24),KPTR(8)+8,8)
- C BYTE 30
- CALL GBYTEC (MSGA,KPDS(25),KPTR(8)+16,8)
- C BYTES 31-40 CURRENTLY RESERVED FOR FUTURE USE
- KPTR(8) = KPTR(8) + ISIZ * 8
- ELSE
- C BYTE 29
- CALL GBYTEC (MSGA,KPDS(24),KPTR(8)+8,8)
- C BYTE 30
- CALL GBYTEC (MSGA,KPDS(25),KPTR(8)+16,8)
- C BYTES 31-40 CURRENTLY RESERVED FOR FUTURE USE
- KPTR(8) = KPTR(8) + 12 * 8
- C BYTES 41 - N LOCAL USE DATA
- CALL W3FI01(LW)
- C MWDBIT = LW * 8
- MWDBIT = bit_size(KPDS)
- ISIZ = KPTR(3) - 40
- …
Large files files are truncated, but you can click here to view the full file