NOAA GVI GUIDE

Appendix K

dividing line
www image Introduction Page, GVI Guide TOC, Acronyms
Previous Section, Next Section

APPENDIX K: Software for Reading the Third Generation Weekly Composite GVI Header

This appendix contains a variety of software that can be used to read the Third Generation Weekly Composite GVI header record. The source code for a FORTRAN and a C program are provided to read the header record and output the contents. Job control language is provided (for IBM users) to help the user set up a job using the FORTRAN code. Subroutine Q9EI32 is also included in Assembly language which is called from the FORTRAN program CONVERT.

The FORTRAN code provided (CONVERT) will read the first 512 bytes of any given Third Generation Weekly Composite GVI image and output the contents of the header. The information that is contained in one file header will be different from another file. In other words, the Channel 1 header information will be different from the Channel 2, Channel 4, Channel 5, solar zenith angle, scan angle, precipitable water index, and NDVI files.

The FORTRAN program can either be run interactively or in batch mode. Instructions follow for running the program in either way.

To run the FORTRAN program interactively, the input file should be set to unit 10. Then type: nforvclg, and link the load module, 'nmc.prod.v77w3lib.load' along with the source code. (The load module contains the assembly code for the subroutine Q9EI32 which is provided later in this appendix). The output is sent to standard output, unit 6. All the important information is given. All other bytes in the header are blank and should be ignored.

To run the FORTRAN program in batch mode, use the job control language "header.jcl" as an example. This code sets up the input file as unit 10, and links the appropriate load module to convert the floating point number, "IEEE", into the IBM floating point equivalent.

The Third Generation weekly composite GVI dataset was created using C language on a UNIX workstation. The header is actually a mixed-mode header, containing character, integer and real variables. The header was designed to be read across all platforms, because each variable occurs on a full word boundary. C is an ideal language to read/write this mixed-mode header, because of the benefit of using structures. The following C source code uses the same structure that was used to create the Third Generation Weekly Composite GVI datasets.

K.1 FORTRAN Source code:

        PROGRAM CONVRT                                                  
C                                                                       
C  PURPOSE:  TO CONVERT A 512 BYTE HEADER (MIXED-MODE, WRITTEN IN C) TO 
C            ITS REAL AND INTEGER ELEMENTS.                             
C                                                                       
        REAL*4 EQT,LLLAT,URLAT,LLLON,URLON,RESOL,SLOPE,RNTERC           
        REAL*4 C4SLP,C4INT,C5SLP,C5INT,RCALIN,RCALSL                    
        REAL*4 REQT                                                     
        INTEGER*4 IEQT,ILLLAT,IURLAT,ILLLON,IURLON,IRESOL,ISLOPE,INTERC 
        INTEGER*4 IC4SLP,IC4INT,IC5SLP,IC5INT,ICALIN,ICALSL             
        INTEGER*2 PLATF,SATID,SENSOR,IMTYPE,ORBIT,SATINC,SATRA          
        INTEGER*2 SATALT,SATNOD,SATSCL,SATSCA,SATCHA,YEAR,MONTH         
        INTEGER*2 JDAY,BITPIX,NCOLS,NROWS,INTERL,MAPPRO                 
        INTEGER*2 ORIENT,SATULX,SATULY,OVLAY,OLBP,DUMMY,VALUE           
        INTEGER*2 ICHVAL                                                
        CHARACTER*1 HDR(512),DUMMY1,PSTATE                              
        EQUIVALENCE(HDR(1),PLATF)                                       
        EQUIVALENCE(HDR(3),SATID)                                       
        EQUIVALENCE(HDR(5),SENSOR)                                      
        EQUIVALENCE(HDR(7),IMTYPE)                                      
        EQUIVALENCE(HDR(9),ORBIT)                                       
        EQUIVALENCE(HDR(11),SATINC)                                     
        EQUIVALENCE(HDR(13),SATRA)                                      
        EQUIVALENCE(HDR(15),SATALT)                                     
        EQUIVALENCE(HDR(17),SATNOD)                                     
        EQUIVALENCE(HDR(19),SATSCL)                                     
        EQUIVALENCE(HDR(21),SATSCA)                                     
        EQUIVALENCE(HDR(23),SATCHA)                                     
        EQUIVALENCE(HDR(25),YEAR)                                       
        EQUIVALENCE(HDR(27),MONTH)                                      
        EQUIVALENCE(HDR(29),JDAY)                                       
        EQUIVALENCE(HDR(31),DUMMY)                                      
        EQUIVALENCE(HDR(33),IEQT)                                       
        EQUIVALENCE(HDR(37),PSTATE)                                     
        EQUIVALENCE(HDR(41),BITPIX)                                     
        EQUIVALENCE(HDR(43),NCOLS)                                      
        EQUIVALENCE(HDR(45),NROWS)                                      
        EQUIVALENCE(HDR(47),INTERL)                                     
        EQUIVALENCE(HDR(49),MAPPRO)                                     
        EQUIVALENCE(HDR(51),ORIENT)                                     
        EQUIVALENCE(HDR(53),SATULX)                                     
        EQUIVALENCE(HDR(55),SATULY)                                     
        EQUIVALENCE(HDR(57),ILLLAT)                                     
        EQUIVALENCE(HDR(61),IURLAT)                                     
        EQUIVALENCE(HDR(65),ILLLON)                                     
        EQUIVALENCE(HDR(69),IURLON)                                     
        EQUIVALENCE(HDR(73),IRESOL)                                     
        EQUIVALENCE(HDR(77),ISLOPE)                                     
        EQUIVALENCE(HDR(81),INTERC)                                     
        EQUIVALENCE(HDR(85),IC4SLP)                                     
        EQUIVALENCE(HDR(89),IC4INT)                                     
        EQUIVALENCE(HDR(93),IC5SLP)                                     
        EQUIVALENCE(HDR(97),IC5INT)                                     
        EQUIVALENCE(HDR(101),ICALSL)                                    
        EQUIVALENCE(HDR(105),ICALIN)                                    
        EQUIVALENCE(HDR(109),OVLAY)                                     
        EQUIVALENCE(HDR(111),OLBP)                                      
        REWIND(10)                                                      
        READ(10,'(512(A1))') HDR                                        
C
C* THE ROUTINE Q9EI32 WILL CONVERT THE INTEGER VARIABLE, CREATED IN
C  IEEE ON A UNIX WORKSTATION, INTO ITS IBM FLOATING POINT EQUIVALENT.
C  
      CALL Q9EI32(IEQT,REQT,1,ISTAT,0)                                  
      CALL Q9EI32(ILLLAT,LLLAT,1,ISTAT,0)                               
      CALL Q9EI32(ILLLON,LLLON,1,ISTAT,0)                               
      CALL Q9EI32(IURLAT,URLAT,1,ISTAT,0)                               
      CALL Q9EI32(IURLON,URLON,1,ISTAT,0)                               
      CALL Q9EI32(IRESOL,RESOL,1,ISTAT,0)                               
      CALL Q9EI32(ISLOPE,SLOPE,1,ISTAT,0)                               
      CALL Q9EI32(INTERC,RNTERC,1,ISTAT,0)                              
      CALL Q9EI32(IC4SLP,C4SLP,1,ISTAT,0)                               
      CALL Q9EI32(IC4INT,C4INT,1,ISTAT,0)                               
      CALL Q9EI32(IC5SLP,C5SLP,1,ISTAT,0)                               
      CALL Q9EI32(IC5INT,C5INT,1,ISTAT,0)                               
      CALL Q9EI32(ICALSL,RCALSL,1,ISTAT,0)                              
      CALL Q9EI32(ICALIN,RCALIN,1,ISTAT,0)                              
      WRITE(6,20) 'PLATFORM= ',PLATF                                    
      WRITE(6,20) 'SATELLITE ID= ',SATID                                
      WRITE(6,20) 'SENSOR TYPE= ', SENSOR                               
      WRITE(6,20) 'IMAGE TYPE= ', IMTYPE                                
      WRITE(6,20) 'ORBIT NUMBER= ', ORBIT                               
      WRITE(6,20) 'SATELLITE INCLINATION (DEG)= ', SATINC               
      WRITE(6,20) 'RIGHT ASCENSION OF ACSENDING NODE= ', SATRA          
      WRITE(6,20) 'SATELLITE ALTITUDE (KM)= ', SATALT                   
      WRITE(6,20) 'NODE OF SATELLITE= ', SATNOD                         
      WRITE(6,20) 'NUMBER OF SCANS LINES/ORBIT= ', SATSCL               
      WRITE(6,20) 'NUMBER OF SCANS/SCAN LINE= ', SATSCA                 
      WRITE(6,20) 'CHANNEL NUMBER= ', SATCHA                            
      WRITE(6,20) 'YEAR OF DATA= ', YEAR                                
      WRITE(6,20) 'MONTH OF DATA= ', MONTH                              
      WRITE(6,20) 'JULIAN DATE= ', JDAY                                 
      WRITE(6,50) 'EQUATORIAL CROSSING TIME (GMT)= ', REQT              
      WRITE(6,20) 'PROCESSING STATE= ', PSTATE                          
      WRITE(6,20) 'NUMBER OF BITS IN IMAGE PIXEL= ', BITPIX             
      WRITE(6,20) 'NUMBER OF COLUMNS IN IMAGE FILE= ', NCOLS            
      WRITE(6,20) 'NUMBER OF ROWS IN IMAGE FILE= ', NROWS               
      WRITE(6,20) 'STORAGE INTERLEAF= ', INTERL                         
      WRITE(6,20) 'MAP PROJECTION= ', MAPPRO                            
      WRITE(6,20) 'ORIENTATION= ', ORIENT                               
      WRITE(6,20) 'SATELLITE COORD. UPPER LEFT X= ', SATULX             
      WRITE(6,20) 'SATELLITE COORD. UPPER LEFT Y= ', SATULY             
      WRITE(6,50) 'LOWER LEFT LATITUDE (DEG)= ', LLLAT                  
      WRITE(6,50) 'UPPER RIGHT LATITUDE (DEG)= ', URLAT                 
      WRITE(6,50) 'LOWER LEFT LONGITUDE (DEG)= ', LLLON                 
      WRITE(6,50) 'UPPER RIGHT LONGITUDE (DEG)= ', URLON                
      WRITE(6,50) 'RESOLUTION OF DATA(M)= ', RESOL                      
      WRITE(6,50) 'SLOPE FOR CHANNEL (PRE-LAUNCH)= ', SLOPE             
      WRITE(6,50) 'INTERCEPT FOR CHANNEL (PRE-LAUNCH)= ', RNTERC        
      WRITE(6,50) 'CHANNEL 4 SLOPE FOR COUNT > 177= ', C4SLP            
      WRITE(6,50) 'CHANNEL 4 INTERCEPT FOR COUNT > 177= ', C4INT        
      WRITE(6,50) 'CHANNEL 5 SLOPE FOR COUNT >= 177= ', C5SLP           
      WRITE(6,50) 'CHANNEL 5 INTERCEPT FOR COUNT >= 177= ', C5INT       
      WRITE(6,50) 'RECALIB SLOPE FOR CHANNEL (HOLBEN/KAUFMAN)= ', RCALSL
      WRITE(6,50) 'RECALIB INTER FOR CHANNEL (HOLBEN/KAUFMAN)= ', RCALIN
      WRITE(6,20) 'IS THERE AN OVERLAY?= ', OVLAY                       
      WRITE(6,20) 'NUMBER OF OVERLAY COLORS= ', OLBP                    
20    FORMAT(A60,1X,I4)                                               
50    FORMAT(A60,1X,F10.2)                                           
        END                                                             

K.2 Sample JCL (Header.jcl):

//WWDOIT JOB (XXXXXXXXXXXXXXX,WWB07,SO),'STEVE:WTDISK',REGION=0K,  
//    TIME=(30,),MSGCLASS=T,MSGLEVEL=(0,0),NOTIFY=$ED12SO          
//*MAIN CLASS=XACHK,LINES=60,ORG=WWBCK,FAILURE=CANCEL             
//STEP2 EXEC NFORVCLG,PARM.FORT='XREF'                             
//FORT.SYSPRINT DD SYSOUT=T                                        
//FORT.SYSIN DD DSN=CONVERT,DISP=SHR                     
//LKED.SYSPRINT DD SYSOUT=T                                       
//LKED.SYSLIB DD                                                   
//            DD                                                   
//            DD DSN=NSS.STNSNIUT.COMMONX.LOAD,DISP=SHR            
//            DD DSN=IMS.COMMON.XLOAD,DISP=SHR                     
//            DD DSN=IMS.MVS.CLUE,DISP=SHR                         
//            DD DSN=NMC.PROD.V77W3LIB.LOAD,DISP=SHR               
//LKED.SYSLIN  DD DCB=BLKSIZE=3120                                 
//*                                                                
//GO.FT06F001 DD SYSOUT=T                                          
//FT10F001 DD DSN=$ED12SO.CH1,DISP=SHR                             
//GO.SYSIN DD *                                                    
/*                                                                
 //     


K.3 Subroutine Q9EI32 (Assembly language):

Q9EI32   START 0                                                                
*$$$   SUBPROGRAM  DOCUMENTATION  BLOCK 
*                                                                               
* SUBPROGRAM:  W3AI49        IEEE 32 BIT F.P. TO IBM370 32 BIT F.P.            
*   PRGMMR: REJONES          ORG: NMC421      DATE:88-06-23                    
*                                                                               
* ABSTRACT:    FORTRAN CALLABLE  SUBROUTINE  TO CONVERT  32   BIT IEEE       
*   FLOATING POINT NUMBERS TO IBM370  32 BIT FLOATING POINT NUMBERS. A     
*   32 BIT IEEE FLOATING POINT NUMBER HAS A SIGN BIT,AN 8 BIT EXPONENT,        
*   AND A 23 BIT FRACTION.  THE 1ST BIT OF THE FRACTION IS  IMPLICIT         
*   AND IS NOT STORED.  A 32 BIT IBM370  FLOATING POINT NUMBER HAS A 1          
*   BIT SIGN,A 7 BIT EXPONENT, AND A 24 BIT FRACTION.THE IEEE EXPONENT          
*   HAS A BASE 2, THE IBM370 BASE 16, THIS CAUSES A DIFFERENCE  IN THE          
*   WAY THE NUMBERS ARE  NORMALIZED. WHEN A IEEE FLOATING POINT 
*   NUMBER IS NORMALIZED THE BIT NEXT TO THE EXPONENT WILL HAVE A 1 IN
*   IT.  AN IBM370  FLOATING  NUMBER  CAN HAVE  UP TO 3 ZERO  BITS  AFTER 
*   THE EXPONENT WHEN THE NUMBER IS  NORMALIZED. THESE 3 BITS  HAVE TO
*   BE COMPUTED AND  SUBTRACTED FROM THE  IEEE EXPONENT, AND THE
*   FRACTION SHIFTED LEFT FOR THE NUMBER OF ZERO BITS. ALL 32 BIT IEEE
*   FLOATING POINT NUMBERS WILL CONVERT TO IBM370 FLOATING POINT
*   NUMBERS,  EXCEPT INFINITY AND NAN NUMBERS WILL BE SET TO ZERO. ONE
*   WILL BE ADDED TO ISTAT FOR EACH NAN OR INFINITY  NUMBER FOUND.
*   DENORMALIZED NUMBERS WILL BE SET TO ZERO, BUT WILL NOT BE
*   COUNTED IN ISTAT. UP TO THREE BITS OF PRECISION MAY BE TRUNCATED
*   DOING THE CONVERSION.                   
*                                                                              
* PROGRAM HISTORY LOG:                                                          
*   85-08-03  R.E.JONES                                                        
*   88-06-17  R.E.JONES   ADDED 5TH PARAMETER FOR ORDER OF BYTES                
*                                            IN MEMORY.                                            
*                                                                              
* USAGE:  CALL Q9EI32(A,B,N,ISTAT,IORDER)                                       
*   OR    CALL W3AI49(A,B,N,ISTAT,IORDER)  ALIAS                                
*                                                                               
*   INPUT VARIABLES:                                                            
*     NAMES  INTERFACE     DESCRIPTION OF VARIABLES AND TYPES                       
*     ---------  ----------------   -----------------------------------------------          
*     A             ARG    LIST    REAL*4 IEEE 32 BIT FLOATING POINT NUMBERS,               
*                                                 BYTES ARE IN 4,3,2,1 ORDER IF IORDER = 1.                
*     N             ARG    LIST   NUMBER OF IEEE 32 BIT FLOATING POINT NUMBERS.         
*     IORDER ARG    LIST   = 0 , BYTES ARE IN 1,2,3,4 ORDER (BIG ENDIAN)           
*                                                FROM SUN, APOLLO, MC68881, MC68882, ETC.  
 
*                                                 = 1 , BYTES ARE IN 4,3,2,1 ORDER (LITTLE         
*                                                 ENDIAN) FROM INTEL 8087, 80287, 80387,             
*                                                 WEITEK 1167, 3167, 4167 COPROCESSORS.             
*                                                                               
*   OUTPUT VARIABLES:                                                           
*     NAMES  INTERFACE  DESCRIPTION OF VARIABLES & TYPE                          
*     ---------  -----------------  -----------------------------------------------          
*     B           ARG LIST         ARRAY OF IBM370 32 BIT FLOATING POINT NUMBERS.       
*     ISTAT  ARG LIST        0 , IF ALL IEEE NUMBERS CONVERTED                       
*                                          +L   L IS THE NUMBER OF NAN OR INFINITY NUMBERS          
*                                            SET TO ZERO                                        
*                                            -1   IF N IS ZERO OR LESS THEN ZERO                     
*                                                                               
*   REMARKS: EXECUTION  RATES, 20 INSTRUCTIONS FOR ENTRY, SETTING UP         
*    MAIN LOOP AND EXIT, 10 INSTRUCTIONS FOR ZERO, 30 FOR A POSITIVE          
*    NUMBER,  32 FOR A NEGATIVE NUMBER. FOR A LARGE ARRAY IT WILL              
*    TAKE ABOUT 31 INSTRUCTIONS TO CONVERT EACH FLOATING POINT
*    NUMBER.         
*    THE NAS-9050  WILL TAKE ABOUT 1.7 SEC TO CONVERT ONE MILLION             
*    IEEE 32 BIT FLOATING POINT NUMBERS TO IBM370 FLOATING POINT               
*    IF IORDER = 1, IT WILL TAKE ABOUT 41 INSTRUCTIONS TO CONVERT             
*    EACH NUMBER, AND ABOUT 2.0 SEC TO CONVERT ONE MILLION NUMBERS.      
*                                                                              
*    IBM SYSTEM/370 PRINCIPLES OF OPERATIONS  GA22-7000-9  APPENDIX A.        
*    FLOATING POINT NUMBERS A5-7.                                              
*                                                                              
*    IEEE TASK 754 STANDARD FLOATING POINT ARITHMETIC.                        
*                                                                               
*   FORMATS:               (BINARY)                                            
*    IEEE            SEEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF                         
*    IBM370          SEEEEEEE FFFFFFFFFFFFFFFFFFFFFFFF                          
*                                                                              
*   THE FOLLOWING ARE EXAMPLES OF IEEE AND IBM 32 BIT FLOATING POINT        
*                    IEEE (HEX)      IBM (HEX)                                  
*            0        00000000       00 000000                                  
*           -0        80000000          N/A                                    
*            1        3F800000       41 100000                                  
*            2        40000000       41 200000                                  
*            3        40400000       41 300000                                  
*            4        40800000       41 400000                                  
*            8        41000000       41 800000                                  
*           15        41700000       41 F00000                                  
*           16        41800000       42 100000                                 
*           32        42000000       42 200000                                 
*          -32        C2000000       C2 200000                                 
*         -NAN        FF8XXXXX          N/A     FRACTION > 0                   
*         +NAN        7F8XXXXX          N/A     FRACTION > 0                    
*      -INFINITY      FF800000          N/A     FRACTION = 0                    
*      +INFINITY      7F800000          N/A     FRACTION = 0                   
*      -DENORMALIZE   804XXXXX          N/A     FRACTION > 0                    
*      +DENORMALIZE   004XXXXX          N/A     FRACTION > 0                    
*                                                                               
* ATTRIBUTES:                                                                   
*   LANGUAGE: IBM ASSEMBLER H V 02                                             
*   MACHINE:  NAS                                                               
*                                                                               
*$$$                                                                           
*                                                                               
GOTO     EQU   15                      UNCONDITIONAL TRANSFER                   
PLUS     EQU   2                                                                
R0       EQU   0                                                                
R1       EQU   1                                                                
R2       EQU   2                                                                
R3       EQU   3                                                                
R4       EQU   4                                                                
R5       EQU   5                                                                
R6       EQU   6                                                               
R7       EQU   7                                                                
R8       EQU   8                                                                
R9       EQU   9                                                                
R10      EQU   10                                                              
R11      EQU   11                                                              
R12      EQU   12                                                              
R13      EQU   13                                                              
R14      EQU   14                                                               
R15      EQU   15                                                               
ZERO     EQU   8                                                               
*                                                                                        
               ENTRY Q9EI32                                                          
Q9EI32   BC    GOTO,12(R15)                                                              
                DC    X'7'                                                                      
                DC    CL7'W3AI49'                                                               
                STM   R14,R12,12(R13)                                                            
               USING W3AI49,R15                                                               
             L     R12,0(R1)               PUT ADDRESS OF 1ST PARAM IN R12                   
             L     R11,8(R1)               PUT ADDRESS OF 3RD PARAM IN R11                   
             L     R11,0(R11)              PUT N IN R11                                      
             L     R9,12(R1)               PUT ADDRESS OF 4TH PARAM IN R9                    
             SR    R0,R0                   ZERO R0 FOR ISTAT                                  
            LTR   R11,R11                  TEST N FOR PLUS                                    
            BC    PLUS,CONT                                                                 
            BCTR  R0,0                     SET 4TH PARAM TO -1                               
            BC    GOTO,EXIT                N IS ZERO OR NEGATIVE, EXIT              
CONT     DS    0H                                                                        
              L     R10,16(R1)             PUT ADDRESS OF 5TH PARAM IN R10                   
              L     R10,0(R10)             LOAD IORDER INTO R10                              
              LA    R6,3(0,0)              LOAD 3 INTO R6                                   
              L     R1,4(R1)               PUT ADDRESS OF 2ND PARAM IN R1                   
              L     R7,FRACTION            LOAD MASK FOR FRACTION                            
              LA    R8,133(0,0)            LOAD BIAS IN R8                         
 *                                                                               
LOOP     DS    0H                                                                        
              L     R2,0(R12)              LOAD 32 BIT F.P. NO. INTO R2                      
              LTR   R10,R10                TEST IORDER FOR ZERO                              
              BC  ZERO,NREVERSE            DO NOT REVERSE ORDER OF BYTES                     
              LR    R3,R2                  LOAD COPY OF R2 INTO R3                           
              N     R3,BYTEMASK            MASK OUT BYTES 1 AND 3                            
              SLL   R3,8                   SHIFT R3 LEFT 8 BITS                              
              SRL   R2,8                   SHIFT R2 RIGHT 8 BITS                             
              N     R2,BYTEMASK            MASK OUT BYTES 2 AND 4                            
              OR    R2,R3                  OR, BYTES ARE IN 2,1,4,3 ORDER                   
              LR    R3,R2                  LOAD COPY OF R2 INTO R3                           
             SLL   R3,16                   SHIFT R3 LEFT 16 BITS ,,2,1                       
             SRL   R2,16                   SHIFT R2 RIGHT 16 BITS 4,3,,     
              OR    R2,R3                  OR, BYTES ARE IN 4,3,2,1 ORDER           
NREVERSE   DS    0H                                                                                           
                        SR    R3,R3              ZERO R3 FOR SIGN BIT                              
                        LTR   R2,R2              TEST R2 FOR 0                                    
                        BC    ZERO,STORE         BRANCH ON ZERO                                    
                        BC    PLUS,GOPLUS        BRANCH ON PLUS                                    
                        L     R3,ISIGN           PUT SIGN BIT IN R3                                
                        N     R2,SIGNMASK        AND OUT SIGN BIT                                               
GOPLUS        DS    0H                                                                       
                        LR    R4,R2               PUT COPY OF WORD IN R4                           
                        O     R2,TBIT8            PUT IN MISSING BIT                                
                        NR    R2,R7               MASK, KEEP  FRACTION                              
                        SRL   R4,23               SHIFT EXPONENT TO RIGHT                           
                        LTR   R4,R4               TEST R4 FOR 0                                    
                        BC    ZERO,STZERO         BRANCH ON EXPONENT ZERO                           
                        LA    R5,255(0,0)         LOAD 255 IN R5                                   
                        CR    R4,R5               TEST FOR NAN AND INFINITY                        
                        BC    ZERO,OVERFLOW       EXPONENT EQUAL TO 255                             
                        AR    R4,R8               ADD 133 TO EXPONENT                               
                        LR    R5,R4               LOAD EXPONENT IN R5                              
                        NR    R5,R6               EXPONENT  . AND . 3                               
                        XR    R4,R5               EXCLUSIVE OR R4 AND R5                            
                        SLL   R4,22               SHIFT IBM EXPONENT 22 BIT                        
                        XR    R5,R6               EXCLUSIVE OR R5 AND 3                             
                        SRL   R2,0(R5)            SHIFT INTO POSITION FRACTION                      
                        OR    R2,R4               OR EXPONENT AND FRACTION                          
                        OR    R2,R3               OR IN SIGN BIT                                    
                        BC    GOTO,STORE          GO STORE IBM F.P. NUMBER                
 OVERFLOW  DS    0H                                                                        
                         A     R0,ONE             ADD 1 TO ISTAT                           
STZERO   DS    0H                                                                       
                   SR    R2,R2                    ZERO R2, FOR IBM F.P ZERO               
 STORE    DS    0H                                                                       
                  ST    R2,0(R1)                  STORE 32 BIT F.P. NUMBER IN B                     
                  LA    R12,4(0,R12)              ADD 4 TO ADDRESS OF A                             
                  LA    R1,4(0,R1)                ADD 4 TO ADDRESS OF B                             
                  BCT   R11,LOOP                                                         
*                                                                               
EXIT        DS    0H                                                                       
                  ST    R0,0(R9)                  STORE ISTAT IN 4TH PARAM                          
                  LM    R2,R12,28(R13)            RESTORE REGISTERS                                 
                  MVI   12(R13),X'FF'             SET COMPLETION BITS                               
                  BCR   GOTO,R14                  RETURN                                   
*                                                                               
ADUMMY      DC    H'0000'                                                         
BYTEMASK    DC    X'00FF00FF'                                                   
FRACTION    DC    X'00FFFFFF'                                                      
ISIGN       DC    X'80000000'                                                      
ONE         DC    X'00000001'                                                      
SIGNMASK    DC    X'7FFFFFFF'                                                      
TBIT8       DC    X'00800000'                                                               
END                                                                    


K.4 Source code for C module:

#include >stdio.h<
#include >math.h<
#include >malloc.h<
#include >stdlib.h<

        /*****   The purpose of the C source code is to provide software to read the 512-byte
header at the beginning of every Third Generation GVI Weekly Composite dataset.     *****/

static FILE *fp1, *fp2;

struct image_header_desc
{
        /*****      Satellite Information   *****/

        short platform;         /*  0=tiros-n, 1=noaa, 2=goes, 3=meteosat,
                                       4=landsat, 5=gms, 6=insat  */

        short sat_id;           /*  0=tiros-n, 0=noaa6, 1=noaa7, 2=noaa8,
                                       3=noaa9, 4=noaa10, 5=noaa11, 6=noaa12,
                                       0=goes4, 1=goes5, 2=goes6, 3=goes7,
                                       0=meteosat3, 1=meteosat4, 2=meteosat5
                                       0=landsat4 */

        short sensor;           /*  0=avhrr, 1=vissr, 2=mss  */

        short im_type;          /*  0=1b avhrr gac, 1=1b lac, 2=gvi daily,
                                       3=gvi weekly, 4=hrpt, 5=apt, 6=ssm/i  */

        short orbit;            /*  # of orbits  */
        short sat_inc;          /*  Satellite inclination  */
        short sat_raan;         /*  Right Ascension of the ascending node  */
        short sat_alt;          /*  Satellite altitude  */
        short sat_node;         /*  0=daytime ascending 1=daytime descending*/
        short sat_scline;       /*  # of scan lines/orbit  */
        short sat_scan;         /*  # of scans/scan line  */
        short sat_chan;         /*  # of channels associated with satellite,
                                    sensor, and image type  */

        /*****       Ancillary/Image data information  *****/

        short year;             /*  Year of dataset  */
        short month;            /*  Month of dataset  */
        short jul_date;         /*  Julian date of dataset  */
        short pad;              /*  fill with padding  */
        float time;             /*  Time of dataset (eqt x'ing time) */
        char data_type;         /*  Processing state (raw, calibrated, 
                                    angular corrected) */
        char padd[3];           /*  padding  */

        /*****      Image Characteristics     *****/

        short nbyte_pixl;       /*  # of bytes per image pixel  */
        short ncols;            /*  # of columns in image file  */
        short nrows;            /*  # of rows in image file  */
        short interl;           /*  Storage interleaf 0=scan,1=pixel,2=chan  */

        /*****      Navigation    *****/

        short map_proj;         /*  Map proj. 0=unmapped,1=mercator,2=Polar,
                                             3=Plate Carree */
        short orient;           /*  if polar stereo, provide orientation  */
        short sat_ulx;          /*  if mercator, sat. coord upper left x  */
        short sat_uly;          /*  if mercator, sat. coord upper left y  */
        float ll_lat;           /*  lower left lat.  */
        float ur_lat;           /*  upper right lat.  */
        float ll_lon;           /*  lower left lon.  */
        float ur_lon;           /*  upper right lon.  */
        float resol;            /*  resolution  */
        float slope;            /*  channel slope */
        float intercept;        /*  channel intercept  */
        float bt[4];            /*  channel 4,5 bt conversion  */
        float sendeg[2];        /*  sensor degradation */

        /*****      Display      *****/

        short ovlay;            /*  overlay?  0=no, 1=yes  */
        short olbp;             /*  # of overlay colors  */
        char padding[400];
}header;

void main(int argc, char *argv[])
{

       if (argc != 3)
       {
        printf("usage -- readheader inputfile outputfile\n");
        exit(EXIT_FAILURE);
       }

  if (!(fp1=fopen(argv[1],"rb")))
  {
   printf("Cannot open file %s to read\n",argv[1]);
   exit(EXIT_FAILURE);
  }

  if (!(fp2=fopen(argv[2],"w")))
  {
   printf("Cannot open file %s to write\n",argv[2]);
   exit(EXIT_FAILURE);
  }

  fread(&header,512,1,fp1);

/*  Write output to user-defined file  */

        fprintf(fp2,"platforn = %d\n", header.platform);
        fprintf(fp2,"sat_id = %d\n", header.sat_id);
        fprintf(fp2,"sensor = %d\n", header.sensor);
        fprintf(fp2,"in_type = %d\n", header.im_type);
        fprintf(fp2,"orbit = %d\n", header.orbit); 
        fprintf(fp2,"sat_inc = %d\n", header.sat_inc);
        fprintf(fp2,"sat_raan = %d\n", header.sat_raan);
        fprintf(fp2,"sat_alt = %d\n", header.sat_alt);
        fprintf(fp2,"sat_node = %d\n", header.sat_node);
        fprintf(fp2,"sat_scline = %d\n", header.sat_scline);
        fprintf(fp2,"sat_scan = %d\n", header.sat_scan);
        fprintf(fp2,"sat_chan = %d\n", header.sat_chan);
        fprintf(fp2,"year = %d\n", header.year);
        fprintf(fp2,"month = %d\n", header.month);
        fprintf(fp2,"jul_date = %d\n", header.jul_date);
        fprintf(fp2,"time = %f\n", header.time);
        fprintf(fp2,"data_type = %d\n", header.data_type);
        fprintf(fp2,"nbyte_pixl = %d\n", header.nbyte_pixl);
        fprintf(fp2,"ncols = %d\n", header.ncols);
        fprintf(fp2,"nrows = %d\n", header.nrows);
        fprintf(fp2,"interl = %d\n", header.interl);
        fprintf(fp2,"map_proj = %d\n", header.map_proj);
        fprintf(fp2,"orient = %d\n", header.orient);
        fprintf(fp2,"sat_ulx = %d\n", header.sat_ulx);
        fprintf(fp2,"sat_uly = %d\n", header.sat_uly);
        fprintf(fp2,"ll_lat = %f\n", header.ll_lat);
        fprintf(fp2,"ur_lat = %f\n", header.ur_lat);
        fprintf(fp2,"ll_lon = %f\n", header.ll_lon);
        fprintf(fp2,"ur_lon = %f\n", header.ur_lon);
        fprintf(fp2,"resol = %2f\n", header.resol);
        fprintf(fp2,"slope for calibration = %f\n", header.slope);
        fprintf(fp2,"intercept for calibration = %f\n", header.intercept);
        fprintf(fp2,"Brightness temp. slope for channel 4/5 for count > 177 = %f\n", header.bt[0]);
        fprintf(fp2,"Brightness temp. intercept for channel 4/5 for count > 177 = %f\n",
header.bt[1]);
        fprintf(fp2,"Brightness temp. slope for channel 4/5 for count >= 177 = %f\n", header.bt[2]);
        fprintf(fp2,"Brightness temp. intercept for channel 4/5 for count >= 177 = %f\n",
header.bt[3]);
        fprintf(fp2,"Kaufman/Holben sensor degradation slope for channel = %f\n",
header.sendeg[2]);
        fprintf(fp2,"Kaufman/Holben sensor degradation slope for channel = %f\n",
header.sendeg[2]);
        fprintf(fp2,"ovlay = %d\n", header.ovlay);
        fprintf(fp2,"olbp = %d\n", header.olbp);

}

Previous Section Top of Page Next Section