
                             Model Change Bulletin
              
                                    MCB#5                          6/30/04

                            CAL3QHC  (Dated 95221)
                            CAL3QHCR (Dated 04174)

     Both CAL3QHC and CAL3QHCR are covered by this Model Change Bulletin (MCB)
under the CAL3QHC model name.  Since CAL3QHCR is an enhanced but separate
version of CAL3QHC, both models will retain their respective Julian creation
dates.  Under this MCB, both models, only CAL3QHCR has been updated and only
CAL3QHCR has a new creation date.

     The one of the dimensions of the array variables used in creating the
Calm Duration Table was set too low for certain meteorological data sets that
have a large number of 1-hour in duration calms.  The array value has been 
reset from 200 to 2000.  The overflow from these variables caused some of the
values in the table to appear with astericks in the day of occurrence field
and it caused erroneous totals for some of the concentrations. 

     Additional modifications to the model includes additional write 
statements, and an additional output file to capture DOS window output.  The 
execution statement has been modified as appears below in the change comments.

       
Here are the modifications to CAL3QHCR:

The main program header was updated

from:
C  *                                                                        *
C  *                         CAL3QHCR (DATED 95221)                         *
C  *                                                                        *
C  *                       *** SEE CAL3QHC MCB#4 ***                        *
C  *                                                                        *
C  *     ON THE SUPPORT CENTER FOR REGULATORY AIR MODELS BULLETIN BOARD     *
C  *                                                                        *
C  *                        (919) 541-5742 (8-N-1)                          *
C  *                                                                        *
to:
C  *                                                                        *
C  *                         CAL3QHCR (DATED 04174)                         *
C  *                                                                        *
C  *                       *** SEE CAL3QHC MCB#5 ***                        *
C  *                                                                        *
C  *        ON THE SUPPORT CENTER FOR REGULATORY AIR MODELS WEB SITE        *
C  *                                                                        *
C  *                      http://www.epa.gov/scram001                       *
C  *                                                                        *
*****

Our mailing address has changed

from:
C                       EPA
C                       MD-14
C                       Research Triangle Park, NC 27711
to:
C                       EPA
C                       4930 Page Road
C                       D243-01
C                       Research Triangle Park, NC 27711
*****

Modification comments have been added to the model.  They are:

C                       June 23, 2004 - An array upper bound overflow condition 
C                                       is possible when the number of calms in
C                                       one of the duration classes in the
C                                       Calms Duration Frequency table exceeds
C                                       200.  The related array sizes were   
C                                       increased.  Also, when the mixing 
C                                       heights are both zero, the program 
C                                       crashes.  A substitute value is now 
C                                       used and a warning message to check the
C                                       mixing height values has been 
C                                       emphasized.
C                                       
C
*****

from:
C
C  Type: CAL3QHCR < control metdata et1data et2data summaryoutput linkdetails
C
to:
C
C                            EXECUTION PROCEDURES
C
C  Create an input file with the name: CAL3R.CTL
C    CAL3R.CTL Structure:
C      [full pathname] Message filename (eg MainMarket.MSG)
C      [full pathname] input filename  (eg C:\CAL3QHCR\Proj\MainMarket.INP)
C      [full pathname] meteorological filename (eg E:\Met\Medford\S4222590.asc)
C      [full pathname] ET1 filename  (eg fname.et1)
C      [full pathname] ET2 filename
C      [full pathname] Output filename
C      [full pathname] Link data filename
C    If all the files and executable are in the same subdirectory, the 
C      full pathname is not needed.
C  Copy CAL3QHCR to the subdirectory where CAL3R.CTL is located
C  Double Click: CAL3QHCR
C
*****

The variable IO was deleted

from:
C   INTG   - Probabilty density contribution by element and subelement.
C   IO     - Unit number for output to the monitor
C   IOPT   - Metric to english conversion in output option.  See SCAL.
to:
C   INTG   - Probabilty density contribution by element and subelement.
C   IOPT   - Metric to english conversion in output option.  See SCAL.
*****

The variable ISCN is used in place of the number 6 which is the unit number
for sending data to a monitor screen

from:
C   IRU    - Rural/urban mixing height flag (0-rural, 1-urban)
C   ISCTM  - Flag indicating whether maxima concentrations are being calculated
to:
C   IRU    - Rural/urban mixing height flag (0-rural, 1-urban)
C   ISCN   - Unit number for output to the monitor
C   ISCTM  - Flag indicating whether maxima concentrations are being calculated
*****

Met data checking was enhanced and three flags were added accordingly

from:
C   MDY    - Day of meteorological data.
C   MHR    - Hour ending of meteorological data.
to:
C   MDY    - Day of meteorological data.
C   MFLG   - Flag indicating that one of the met data values is out of range
C   MFLG1  - Flag indicating when to print a line of met data
C   MFLG2  - Flag indicating there may be an error in the met data
C   MHR    - Hour ending of meteorological data.
*****

The variable MSGS was created to define the unit number through which error and
other messages are written.  Variable names, MVALN & VAL, were also added and 
used in identifying meteorological data outside normal bounds.

to:
C   MSGS   - Unit number for error messages
C   MVALN  - Name of meteorological value that maybe out of range
C   MYR    - Year of meteorological data.
*****

from:
C   V1     - Average of depositon and settling velocities [m/s].
C   VD     - Deposition velocity [cm/s].  Converted to m/s.
to:
C   V1     - Average of depositon and settling velocities [m/s].
C   VAL    - Meteorological data value 
C   VD     - Deposition velocity [cm/s].  Converted to m/s.
*****

A variable for file names was added so that the input file names could be read from
a control file.  This would add the ability to enter long file names in a text file 
instead of creating a BAT (batch file) with long filenames which can be troublesome.

from:
      CHARACTER*40 JOB, RUN
to:
      CHARACTER*80 FNZ(7)
      CHARACTER*40 JOB, RUN

from:
      CHARACTER*20 LNK, RCP(60)
      CHARACTER*15 X1(60)
      CHARACTER*10 DAYWK
to:
      CHARACTER*20 LNK, RCP(60)
      CHARACTER*15 X1(60), MVALN(10)
      CHARACTER*10 DAYWK
*****

from:
      INTEGER  ANGMAX(60), AT, CAVG, CLAS, CNTM(24), COD,
     +         CUMT, FAMB, FLINK, IHE(60),
     +         IIHR, IMIN, ISEC, IX, IYRR, IMON, IDAY,
     +         JD(60), NOLNK(120), RAVG, SFR, ST

to:
      INTEGER  ANGMAX(60), AT, CAVG, CLAS, CNTM(24), COD,
     +         CUMT, FAMB, FLINK, MSGS, IHE(60),
     +         IIHR, IMIN, ISEC, IX, IYRR, IMON, IDAY, JD(60), 
     +         MFLG(10), MFLG1, MFLG2, NOLNK(120), RAVG, SFR, ST

*****

The VAL variable refers to the ten hourly meteorological values that are 
read during each loop of the program.

from:
      
      REAL     IDLFAC, INC, K1, KZ, LIM, MIXH, MOWT, NE, PAF(5, 3, 3)
C
to:
      
      REAL     IDLFAC, INC, K1, KZ, LIM, MIXH, MOWT, NE, PAF(5, 3, 3),
     +         VAL(10)
C
*****

Three new units, ICTL, MSGS, and ISCN were added.

from:
      COMMON /IO/  IN, IO, IMET, IT1, IT2, IPO, ILK
to:
      COMMON /IO/  ICTL, IN, MSGS, IMET, IT1, IT2, IPO, ILK, ISCN
*****

The arrays used in creating the Calm Duration Table were increased in
size from 200 to 2000.

from:
     2          NIP(24), NIPJ(24,200), NIPH(24,200),
to:
     2          NIP(24), NIPJ(24,2000), NIPH(24,2000),
*****

Data was rearranged here

from:
      DATA BNTH/24*0.0/, CMAX/0./, CNHR/1440*0./, CNTM/24*0/,
     1     CONTL/28800*0.0/, CRMAXB/60*0./, ILIN/0/, IP/0/, IP15/0/,
     2     IPP/0/, ITAVG / 7, 0, 23, 8784/, J8/16/, JHR8/540*0/,
     3     NATM/8,1,24,8760/, NIP/24*0/, RNMX8/540*0./,
     4     TOTL/240*0.0/, XR/NN*0.0/, YR/NN*0.0/, ZR/NN*0.0/

to:
      DATA BNTH/24*0.0/, CMAX/0./, CNHR/1440*0./, CNTM/24*0/,
     1     CONTL/28800*0.0/, CRMAXB/60*0./, ILIN/0/,
     2     IP/0/, IP15/0/, IPP/0/,
     3     ITAVG / 7, 0, 23, 8784/,J8/16/, JHR8/540*0/,
     4     NATM/8,1,24,8760/, NIP/24*0/, RNMX8/540*0./, TOTL/240*0.0/,
     5     XR/NN*0.0/, YR/NN*0.0/, ZR/NN*0.0/

*****

Meteorological names were added for identification of possible erroneous
meteorological data.  These are the names associated with the variables VAL
and MVALN

from:
     +                          ' +7',' +8',' +9','+10'/
      DATA X1 /60*'---------------'/
to:
     +                          ' +7',' +8',' +9','+10'/
      DATA MVALN / 'Year', 'Month', 'Day', 'Hour', 'Wind Direction', 
     +            'Wind Speed', 'Temperature', 'Stability Class',
     +            'Rural Mix Hgt', 'Urban Mix Hgt'/
      DATA X1 /60*'---------------'/
*****

The ICTL, ISCN and MSGS unit numbers are defined.

from:
C
C        7 - IN   - Input Control File
C        6 - IO   - Output to the Screen
C        8 - IPO  - Printout to a file
C       10 - IMET - Meteorological Input File (ASCII format)
to:
C
C        5   ICTL - Control File
C        6   ISCN - Statements sent to Monitor
C        7 - INP  - Input File
C        8 - MSGS - Error & other messages sent to a file 
C        9 - IPO  - Printout to a file
C       10 - IMET - Meteorological Input File (ASCII format)
*****



from:
      MAXR=60
C
to:
      MAXR=60
        IRMAX = 1
        A = 0.0
C
*****

A substitute I/O approach was added.  Easily viewable long input/output 
filenames can be added to a text file and then read in as input filenames
to OPEN statements.

from:
CLC
CL      OPEN (5,FILE=FILE5 ,STATUS='OLD')
CL      OPEN (6,FILE=FILE6 ,STATUS='UNKNOWN')
CLC

CL          WRITE (6,'(6X,A6,A8,2X,A7,A5/)')
CL     +            'DATE: ',IDATE,' TIME: ',ITIME
C      ==========================================
to:
CLC
CL          WRITE (ISCN,'(6X,A6,A8,2X,A7,A5/)')
CL     +            'DATE: ',IDATE,' TIME: ',ITIME

C     Open Control File (*.CTL) and read in I/O file names, and
C          OPEN data files
C
      OPEN (ICTL, FILE ='cal3r.ctl' , STATUS='OLD', ERR = 89)
          DO I = 1, 7
            READ(ICTL, *) FNZ(I)
          WRITE(ISCN, *) 'READ IN: ', TRIM(FNZ(I))
        END DO
      CLOSE(ICTL)

        OPEN (MSGS, FILE = FNZ(1),STATUS='UNKNOWN', ERR = 97)
        OPEN (IN, FILE = FNZ(2) ,STATUS='OLD', ERR = 91)
        OPEN (IMET, FILE = FNZ(3) ,STATUS='OLD', ERR = 92)
        OPEN (IT1, FILE = FNZ(4) ,STATUS='UNKNOWN', ERR = 93)
        OPEN (IT2, FILE = FNZ(5) ,STATUS='UNKNOWN', ERR = 94)
        OPEN (IPO, FILE = FNZ(6) ,STATUS='UNKNOWN', ERR = 95)
        OPEN (ILK, FILE = FNZ(7) ,STATUS='UNKNOWN', ERR = 96)
      GOTO 98
      
   89   WRITE(MSGS,*) 'Error opening the control file CAL3R.CTL.'
        WRITE(MSGS,*) 'CAL3R.CTL replaces listing the filenames '
        WRITE(MSGS,*) 'on a Command Line.'
        WRITE(MSGS,*) 'There should be 7 filenames listed in CAL3R.CTL'
        WRITE(MSGS,*) 'See the source code listing for its structure'
        WRITE(MSGS,*) 'under: EXECUTION Procedures.'
        WRITE(ISCN,*) 'Error opening the control file CAL3R.CTL.'
        WRITE(ISCN,*) 'CAL3R.CTL replaces listing the filenames '
        WRITE(ISCN,*) 'on a Command Line.'
        WRITE(ISCN,*) 'There should be 7 filenames listed in CAL3R.CTL'
        WRITE(ISCN,*) 'See the source code listing for its structure.'
        WRITE(ISCN,*) 'under: EXECUTION Procedures.'
          STOP
   91   WRITE(MSGS,*) 'Error opening the input file.'
        WRITE(ISCN,*) 'Error opening the input file.'
          STOP
   92   WRITE(MSGS,*) 'Error opening the meteorological datafile.'
        WRITE(ISCN,*) 'Error opening the meteorological datafile.'
          STOP
   93   WRITE(MSGS,*) 'Error opening the first intermediate file.'
        WRITE(ISCN,*) 'Error opening the first intermediate file.'
          STOP
   94   WRITE(MSGS,*) 'Error opening the second imtermediate file.'
        WRITE(ISCN,*) 'Error opening the second imtermediate file.'
          STOP
   95   WRITE(MSGS,*) 'Error opening the output file.'
        WRITE(ISCN,*) 'Error opening the output file.'
          STOP
   96   WRITE(MSGS,*) 'Error opening the detailed link file.'
        WRITE(ISCN,*) 'Error opening the detailed link file.'
          STOP
   97   WRITE(ISCN,*) 'Error opening the message file.'
          STOP
   98 CONTINUE
C      ==========================================
*****

The DOS Window can close abruptly without letting the viewer see the
information on the screen.  Duplicate messages are sent to the monitor
screen and to a MSG file.

from:
C
      WRITE(IO,*) ' '
      WRITE(IO,*) 'READING INPUT FROM THE MAIN CONTROL FILE'

to:
C
      WRITE(MSGS,*) ' '
      WRITE(MSGS,*) 'READING INPUT FROM THE MAIN CONTROL FILE'
      WRITE(ISCN,*) ' '
      WRITE(ISCN,*) 'READING INPUT FROM THE MAIN CONTROL FILE'

*****

Some of the error, warning and informational output was duplicated
or rerouted to the MSGS output file.

from:
        IF (NR.GT.MAXR) THEN
           WRITE (IO,167) NR, MAXR
           STOP
to:
        IF (NR.GT.MAXR) THEN
           WRITE (MSGS,167) NR, MAXR
           STOP
*****


from:

         WRITE(IO,31) ISMN, ISDY, ISYR, ISJDAY, IEMN, IEDY, IEYR, IEJDAY

to:

         WRITE(MSGS,31) ISMN, ISDY, ISYR, ISJDAY,
     &                  IEMN, IEDY, IEYR, IEJDAY
         WRITE(ISCN,31) ISMN, ISDY, ISYR, ISJDAY,
     &                  IEMN, IEDY, IEYR, IEJDAY

*****

from:
C
      WRITE(IO,*) ' '
      WRITE(IO,*) 'READING DATA FROM THE MET FILE'
to:
C
      WRITE(MSGS,*) ' '
      WRITE(MSGS,*) 'READING DATA FROM THE MET FILE'
      WRITE(ISCN,*) ' '
      WRITE(ISCN,*) 'READING DATA FROM THE MET FILE'
*****

from:
         IF (IMFLG .EQ. 1) THEN
           WRITE (IO, 11)
           WRITE (IO, 12) ISFCID, ISFCYR, IAIRID, IAIRYR
           WRITE (IO, 13) IMFCID, IMFCYR, IMIRID, IMIRYR
            STOP
to:
         IF (IMFLG .EQ. 1) THEN
           WRITE (MSGS, 11)
           WRITE (MSGS, 12) ISFCID, ISFCYR, IAIRID, IAIRYR
           WRITE (MSGS, 13) IMFCID, IMFCYR, IMIRID, IMIRYR
           WRITE (ISCN, 11)
           WRITE (ISCN, 12) ISFCID, ISFCYR, IAIRID, IAIRYR
           WRITE (ISCN, 13) IMFCID, IMFCYR, IMIRID, IMIRYR
            STOP
*****

from:
C
      WRITE(IO,*) ' '
      WRITE(IO,*) 'READING RECEPTOR LOCATIONS FROM THE CONTROL FILE'
C
to:
C
      WRITE(MSGS,*) ' '
      WRITE(MSGS,*) 'READING RECEPTOR LOCATIONS FROM THE CONTROL FILE'
      WRITE(ISCN,*) ' '
      WRITE(ISCN,*) 'READING RECEPTOR LOCATIONS FROM THE CONTROL FILE'
C
*****

from:
C
      WRITE(IO,*) ' '
      WRITE(IO,*) 'READING LINK (ETS) DATA FROM THE MAIN INPUT FILE'

to:
C
      WRITE(MSGS,*) ' '
      WRITE(MSGS,*) 'READING LINK (ETS) DATA FROM THE MAIN INPUT FILE'
      WRITE(ISCN,*) ' '
      WRITE(ISCN,*) 'READING LINK (ETS) DATA FROM THE MAIN INPUT FILE'

*****

from:
C
      WRITE(IO,*) ' '
      WRITE(IO,*) 'FINISHED READING CONTROL FILE INPUT'

to:
C
      WRITE(MSGS,*) ' '
      WRITE(MSGS,*) 'FINISHED READING CONTROL FILE INPUT'
      WRITE(ISCN,*) ' '
      WRITE(ISCN,*) 'FINISHED READING CONTROL FILE INPUT'

*****

from:
           IF (LL(I).GE.WL(I)) GOTO 16
             WRITE (IO,17)
             STOP
to:
           IF (LL(I).GE.WL(I)) GOTO 16
             WRITE (MSGS,17)
             WRITE (ISCN,17)
             STOP
*****

from:
   16      IF (ABS(HL(I)).LE.10.) GOTO 19
             WRITE (IO,18)
             STOP
to:
   16      IF (ABS(HL(I)).LE.10.) GOTO 19
             WRITE (MSGS,18)
             WRITE (ISCN,18)
             STOP
*****

from:
C
      WRITE(IO,*) ' '
      WRITE(IO,*) 'ENTERING MAIN PROCESSING LOOP'

to:
C
      WRITE(MSGS,*) ' '
      WRITE(MSGS,*) 'ENTERING MAIN PROCESSING LOOP'
      WRITE(ISCN,*) ' '
      WRITE(ISCN,*) 'ENTERING MAIN PROCESSING LOOP'

*****

from:
        IF (IAZ .EQ. 2) THEN
          WRITE(IO, *) ' '
          WRITE(IO, *) 'CALCULATING LINK CONTRIBUTIONS.'
        END IF
to:
        IF (IAZ .EQ. 2) THEN
          WRITE(MSGS, *) ' '
          WRITE(MSGS, *) 'CALCULATING LINK CONTRIBUTIONS.'
          WRITE(ISCN, *) ' '
          WRITE(ISCN, *) 'CALCULATING LINK CONTRIBUTIONS.'
        END IF
*****

from:

        WRITE(IO,53) ISJDAY

to:

        WRITE(MSGS,53) ISJDAY
        WRITE(ISCN,53) ISJDAY

*****

from:
            MN = IJ
            WRITE(IO,53) MN
C              IMNST = MN
to:
            MN = IJ
            WRITE(MSGS,53) MN
            WRITE(ISCN,53) MN
C              IMNST = MN
*****

from:

           IF (IEFLAG .EQ. 0) THEN
             IEFLAG = 1
             JITS = MOD(IJ + IDOW - 1,7)
             IF  (JITS .EQ. 0) JITS = 7
             IF ((JITS .NE. IDY) .OR. (IH .NE. IHREND)) THEN
               WRITE (IO,*) 'Error in Emissions file data date sequence'
               WRITE (IO,464) ISYR, JITS,    IH
               WRITE (IO,465) IEYR,  JSDOW,  IHREND
                STOP
             END IF
           END IF

to:

          IF (IEFLAG .EQ. 0) THEN
            IEFLAG = 1
            JITS = MOD(IJ + IDOW - 1,7)
            IF  (JITS .EQ. 0) JITS = 7
            IF ((JITS .NE. IDY) .OR. (IH .NE. IHREND)) THEN
              WRITE (MSGS,*)'Error in Emissions file data date sequence'
              WRITE (MSGS,464) ISYR, JITS,    IH
              WRITE (MSGS,465) IEYR,  JSDOW,  IHREND
              WRITE (ISCN,*)'Error in Emissions file data date sequence'
              WRITE (ISCN,464) ISYR, JITS,    IH
              WRITE (ISCN,465) IEYR,  JSDOW,  IHREND
               STOP
            END IF
          END IF

*****

An algorithm was added to identify meteorological values that
might be out of normal ranges.

from:
     +                  XRUR, XURB

to:
     +                  XRUR, XURB
          IF (MYR .LT. 1 .OR. MYR .GT. 99) MFLG(1) = 1
          IF (MMN .LT. 1 .OR. MMN .GT. 12) MFLG(2) = 1
          IF (MDY .LT. 1 .OR. MDY .GT. 31) MFLG(3) = 1
          IF (MHR .LT. 1 .OR. MHR .GT. 24) MFLG(4) = 1
          IF (BRG .LT. 0.0 .OR. BRG .GT. 360.0) MFLG(5) = 1
          IF (U .LT. 0.0 .OR. U .GT. 100.0) MFLG(6) = 1
          IF (TMP .LT. 230.0 .OR. TMP .GT. 320.0) MFLG(7) = 1
          IF (CLAS .LT. 1 .OR. CLAS .GT. 7) MFLG(8) = 1
          IF (XRUR .LE. 0.01) MFLG(9) = 1
          IF (XURB .LE. 0.01) MFLG(10) = 1
          DO I = 1, 10
            IF (MFLG(I) .GT. 0) THEN
              VAL(1) = FLOAT(MYR)
              VAL(2) = FLOAT(MMN)
              VAL(3) = FLOAT(MDY)
              VAL(4) = FLOAT(MHR)
                VAL(5) = BRG
                VAL(6) = U
                VAL(7) = TMP
              VAL(8) = FLOAT(CLAS)
                VAL(9) = XRUR
                VAL(10) = XURB
              IF (MFLG1 .EQ. 0) THEN
                 IF (MFLG2.EQ.0) THEN
                    WRITE(IPO,*) ' '
                    WRITE(IPO,*) '*********************************',
     +                           '**************************' 
                    WRITE(IPO,*) ' Please check the meteorological ',
     +                           'data listed in CAL3HR.ERR.' 
                    WRITE(IPO,*) '*********************************',
     +                           '**************************' 
                    WRITE(MSGS,*) ' '
                    WRITE(MSGS,*) 'Meteorological data that appears ',
     +                            'to be in error: '
                    WRITE(ISCN,*) ' '
                    WRITE(ISCN,*) 'Meteorological data that appears ',
     +                            'to be in error: '
                    MFLG2 = 1
                 END IF
                 WRITE(MSGS,*) ' '
                 WRITE(MSGS,51)  MYR, MMN, MDY, MHR, BRG, U, TMP, CLAS,
     +                          XRUR, XURB
                 WRITE(ISCN,*) ' '
                 WRITE(ISCN,51)  MYR, MMN, MDY, MHR, BRG, U, TMP, CLAS,
     +                          XRUR, XURB
                   MFLG1 = 1
              END IF
              WRITE(MSGS,52)  MVALN(I), VAL(I)
              WRITE(ISCN,52)  MVALN(I), VAL(I)
   52         FORMAT('   The ', A15,' value,', F8.1,
     +               ' appears to be out of range.')
              MFLG(I) = 0
            END IF
          END DO   
          IF (MFLG1 .EQ. 1) THEN
                WRITE(MSGS,*) '   Please review the ', 
     +         'data and adjust accordingly.'
                WRITE(ISCN,*) '   Please review the ', 
     +         'data and adjust accordingly.'
          END IF
          MFLG1 = 0


*****

A substitute mixing height was added to keep the program from
crashing when mixing heights are at 0.0.  The mixing height data 
still needs to be reviewed. 

from:
          END IF

to:
          END IF
          IF (MIXH .EQ. 0.00) MIXH = MAX(XRUR,XURB)
          IF (MIXH .EQ. 0.00) MIXH = 10.00

*****

from:
             IF ((MITS .NE. IJ) .OR. (IH .NE. MHR)) THEN
               WRITE (IO,*) 'Error in Met file data date sequence'
               WRITE (IO,464)  ISYR, IJ,   IH
               WRITE (IO,465)  MYR,  MITS, MHR
                STOP
to:
             IF ((MITS .NE. IJ) .OR. (IH .NE. MHR)) THEN
               WRITE (MSGS,*) 'Error in Met file data date sequence'
               WRITE (MSGS,464)  ISYR, IJ,   IH
               WRITE (MSGS,465)  MYR,  MITS, MHR
               WRITE (ISCN,*) 'Error in Met file data date sequence'
               WRITE (ISCN,464)  ISYR, IJ,   IH
               WRITE (ISCN,465)  MYR,  MITS, MHR
                STOP
*****

from:
        MN = 1
        WRITE(IO,*) ' '
        WRITE(IO,*) 'END OF PROCESSING LOOP'

to:
        MN = 1
        WRITE(MSGS,*) ' '
        WRITE(MSGS,*) 'END OF PROCESSING LOOP'
        WRITE(ISCN,*) ' '
        WRITE(ISCN,*) 'END OF PROCESSING LOOP'

*****

from:
C
      WRITE(IO, *)
      WRITE(IO, *) 'Preparing output tables and storing them to file.'

to:
C
      WRITE(MSGS, *)
      WRITE(MSGS, *) 'Preparing output tables and storing them to file.'
      WRITE(ISCN, *)
      WRITE(ISCN, *) 'Preparing output tables and storing them to file.'

*****

from:

             WRITE (IO, *)
             WRITE (IO, *) 'Preparing link contribution tables.'

to:

             WRITE (MSGS, *)
             WRITE (MSGS, *) 'Preparing link contribution tables.'
             WRITE (ISCN, *)
             WRITE (ISCN, *) 'Preparing link contribution tables.'

*****

from:
      WRITE(IPO, *)
      WRITE (IO, *)
      WRITE (IO, *) 'Program terminated normally'

to:
      WRITE(IPO, *)
      WRITE (MSGS, *)
      WRITE (MSGS, *) 'Program terminated normally'
      WRITE (ISCN, *)
      WRITE (ISCN, *) 'Program terminated normally'

*****

The creation date was updated

from:
  200   FORMAT (A1,58X,'CAL3QHCR (Dated: 95221)')
to:
  200   FORMAT (A1,58X,'CAL3QHCR (Dated: 04174)')
*****

The PM format was expanded for some sensitivity testing and 
then commented out.

from:
  281   FORMAT ( 6X,24(1H-),1H*,40(1H-),1H*,60(1H-))
  290   FORMAT (5X,I3,2H. ,A20,1H*,4(1X,F8.1,1X),1H*,1X,F6.0,
     +    2X,F4.0,2X,A2,1X,F6.1,2X,F5.1,1X,F5.1,2X,F4.1)
  293   FORMAT (9X,I3,2H. ,A20,1H*,4(1X,F8.1,1X),1H*,4X,F5.0,
to:
  281   FORMAT ( 6X,24(1H-),1H*,40(1H-),1H*,60(1H-))

C        Insertion, Adesman 1/16/2003
  290   FORMAT (5X,I3,2H. ,A20,1H*,4(1X,F8.1,1X),1H*,1X,F6.0,
     +    2X,F4.0,2X,A2,1X,F6.1,2X,F5.1,1X,F5.1,2X,F4.1)
C  290   FORMAT (5X,I3,2H. ,A20,1H*,4(1X,F8.1,1X),1H*,1X,F6.0,
C     +    2X,F4.0,2X,A2,1X,F6.1,2X,F6.2,1X,F5.1,2X,F4.1)
C        End Of Insertion

  293   FORMAT (9X,I3,2H. ,A20,1H*,4(1X,F8.1,1X),1H*,4X,F5.0,
*****

from:
     +    3X,F4.0,2X,A2,1X,F6.1,1X,F5.1,I5)
  294   FORMAT (5X,I3,2H. ,A20,1H*,4(1X,F8.1,1X),1H*,1X,F6.0,
     +    2X,F4.0,2X,A2,1X,F6.1,2X,F5.1,1X,F5.1,2X,F4.1,1X,F4.2,1X,F5.1,
     +    2X,A3)
  295   FORMAT (9X,I3,2H. ,A20,1H*,4(1X,F8.1,1X),1H*,3X,F6.0,
to:
     +    3X,F4.0,2X,A2,1X,F6.1,1X,F5.1,I5)

C        Insertion, Adesman 1/16/2003
  294   FORMAT (5X,I3,2H. ,A20,1H*,4(1X,F8.1,1X),1H*,1X,F6.0,
     +    2X,F4.0,2X,A2,1X,F6.1,2X,F5.1,1X,F5.1,2X,F4.1,1X,F4.2,1X,F5.1,
     +    2X,A3)
C  294   FORMAT (5X,I3,2H. ,A20,1H*,4(1X,F8.1,1X),1H*,1X,F6.0,
C     +    2X,F4.0,2X,A2,1X,F6.1,2X,F6.2,1X,F5.1,2X,F4.1,1X,F4.2,1X,F5.1,
C     +    2X,A3)
C        End Of Insertion

  295   FORMAT (9X,I3,2H. ,A20,1H*,4(1X,F8.1,1X),1H*,3X,F6.0,
*****

from:
      COMMON /CHR/ STAR(2,NN), BLNK, STR, JOB, RUN, EXIN
      COMMON /IO/ IN, IO, IMET, IT1, IT2, IPO, ILK

to:
      COMMON /CHR/ STAR(2,NN), BLNK, STR, JOB, RUN, EXIN
      COMMON /IO/  ICTL, INP, MSGS, IMET, IT1, IT2, IPO, ILK, ISCN

*****

from:
10        CONTINUE
          IF (A .GT. RNMX(JJ,K)) THEN
to:
10        CONTINUE
          IF (JJ .GT. 0) THEN
          IF (A .GT. RNMX(JJ,K)) THEN
*****

from:
           NDV(JJ,K,I) = NCN
         END IF
C            CONCENTRATION IS ONE OF THE TOP CONC.'S FOR THIS RECEPTOR
to:
           NDV(JJ,K,I) = NCN
          END IF
          END IF
C            CONCENTRATION IS ONE OF THE TOP CONC.'S FOR THIS RECEPTOR
*****

The following COMMON /IO/ statements were expanded with additional
unit number variables:

from:
      COMMON /IO/  IN, IO, IMET, IT1, IT2, IPO, ILK

to:
      COMMON /IO/  ICTL, INP, MSGS, IMET, IT1, IT2, IPO, ILK, ISCN

*****

from:
      COMMON /IO/  IN, IO, IMET, IT1, IT2, IPO, ILK
to:
      COMMON /IO/  ICTL, INP, MSGS, IMET, IT1, IT2, IPO, ILK, ISCN
*****

The creation date was updated.

from:
 300  FORMAT (A1,46X,'CAL3QHCR (Dated: 95221)')
to:
 300  FORMAT (A1,46X,'CAL3QHCR (Dated: 04174)')
*****

from:
      COMMON /IO/ IN, IO, IMET, IT1, IT2, IPO, ILK
to:
      COMMON /IO/  ICTL, INP, MSGS, IMET, IT1, IT2, IPO, ILK, ISCN
*****

Additional outputs are now sent to both the monitor screen and to a
MSGS output file.  Sometimes a Windows DOS window will close before
all the data printed there can be read.  The MSGS files duplicates 
most of those messages.  The next several statements add the second 
output capability to the program.

from:
      IF (IMN.LT.1 .OR. IMN.GT.12) THEN
        WRITE(IO,*) 'Month value in error, value:', IMN
        WRITE(IO,*) '  Day, year, jday of month above:', IDY, IYR, JDY
         STOP
to:
      IF (IMN.LT.1 .OR. IMN.GT.12) THEN
        WRITE(MSGS,*) 'Month value in error, value:', IMN
        WRITE(MSGS,*) '  Day, year, jday of month above:', IDY, IYR, JDY
        WRITE(ISCN,*) 'Month value in error, value:', IMN
        WRITE(ISCN,*) '  Day, year, jday of month above:', IDY, IYR, JDY
         STOP
*****

from:
      IF (IDY .GT. IDYMAX(IMN)) THEN
        WRITE(IO,*) 'Day exceeds days in month:', IDY
        WRITE(IO,*) '  Month, year & jday of day above:', IMN, IYR, JDY
         STOP
to:
      IF (IDY .GT. IDYMAX(IMN)) THEN
        WRITE(MSGS,*) 'Day exceeds days in month:', IDY
        WRITE(MSGS,*)'  Month, year & jday of day above:', IMN, IYR, JDY
        WRITE(ISCN,*) 'Day exceeds days in month:', IDY
        WRITE(ISCN,*)'  Month, year & jday of day above:', IMN, IYR, JDY
         STOP
*****

from:
         ELSE
           WRITE(IO,*) 'Invalid Date; 2/29+ in a Non-Leap Year'
           WRITE(IO,*) '  Values are m,d,yr,jdy:', IMN, IDY, IYR, JDY
             STOP
to:
         ELSE
           WRITE(MSGS,*) 'Invalid Date; 2/29+ in a Non-Leap Year'
           WRITE(MSGS,*) '  Values are m,d,yr,jdy:', IMN, IDY, IYR, JDY
           WRITE(ISCN,*) 'Invalid Date; 2/29+ in a Non-Leap Year'
           WRITE(ISCN,*) '  Values are m,d,yr,jdy:', IMN, IDY, IYR, JDY
             STOP
*****

from:
      COMMON /IO/  IN, IO, IMET, IT1, IT2, IPO, ILK
to:
      COMMON /IO/  ICTL, INP, MSGS, IMET, IT1, IT2, IPO, ILK, ISCN
*****

The additional unit numbers are defined for each unit number variable:

from:
     +     STR/'*'/, IHR/600*0/, L3/1/, L4/2/, NHR/0/, IPAG/0/,
     +      IN/7/, IO /6/, IPO/8/, IMET/10/, IT1 /11/, IT2/12/, ILK/15/
      DATA DAYWK / 'Monday.', 'Tuesday.',  'Wednesday.', 'Thursday.',
to:
     +     STR/'*'/, IHR/600*0/, L3/1/, L4/2/, NHR/0/, IPAG/0/,
     +     ICTL /5/, ISCN/6/, INP /7/, IMET/10/, MSGS /8/, IPO/9/,
     *     IT1 /11/, IT2/12/, ILK/15/
      DATA DAYWK / 'Monday.', 'Tuesday.',  'Wednesday.', 'Thursday.',
*****

from:
      COMMON /IO/  IN, IO, IMET, IT1, IT2, IPO, ILK
to:
      COMMON /IO/  ICTL, INP, MSGS, IMET, IT1, IT2, IPO, ILK, ISCN
*****

from:
          IF (NL .GT. MAXL) THEN
            WRITE(IO, 168) NL, MAXL
            STOP
to:
          IF (NL .GT. MAXL) THEN
            WRITE(MSGS, 168) NL, MAXL
            WRITE(ISCN, 168) NL, MAXL
            STOP
*****

from:

      WRITE(IO, *)
      WRITE(IO, *) '  End of ETS processing subroutine.'
      WRITE(IO, *)
CC
to:

      WRITE(MSGS, *)
      WRITE(MSGS, *) '  End of ETS processing subroutine.'
      WRITE(MSGS, *)
      WRITE(ISCN, *)
      WRITE(ISCN, *) '  End of ETS processing subroutine.'
      WRITE(ISCN, *)
CC
*****

The PM format was changed form an F8.1 to a F9.2

from:
   42 FORMAT (3I3,F6.2)
  164 FORMAT (1X, I4, 2F8.1)
  168 FORMAT (' NUMBER OF LINKS INPUT = ', I4, '> MAXIMUM ALLOWED',
to:
   42 FORMAT (3I3,F6.2)

C          Insertion, Adesman 1/16/2003
C  164 FORMAT (1X, I4, 2F8.1)
  164 FORMAT (1X, I4, 2F9.2)
C           End Of Insertion

  168 FORMAT (' NUMBER OF LINKS INPUT = ', I4, '> MAXIMUM ALLOWED',
*****

