EPA-AA-TSS-IM85-2

                  Technical Report
           Multiple Stringency Version of
                 MOBILE3 Users Guide
                         By

                 David J. Brzezinski


                      April 198S.
                        NOTICE

Technical  Reports  do  not  necessarily represent  final  EPA
decisions  or  positions.   They  are   intended  to  present
technical   analysis   of   issues   using   data   which  are
currently  available.   The  purpose  in the  release  of such
reports   is   to  facilitate  the   exchange  of  technical
information   and   to   inform   the  public   of  technical
developments  which may form  the  basis  for  a  final  EPA
decision, position or regulatory action.

               Technical Support Staff
         Emission Control Technology Division.
               Office  of Mobile  Sources
             Office of Air and Radiation
        U. S. Environmental Protection Agency

-------
                              -2-

1.0  BACKGROUND

     MOBILES, as with all  of  the EPA mobile source models, uses
a single  stringency  to  identify the  first  year  failure rate of
Tech I  (pre-catalyst) and  Tech II (oxidation catalyst)  vehicles
in the  Inspection  and Maintenance  (I/M)  program to be  modeled.
This  single   number  most   often   covers  • a   wide   range  of
technologies and vehicle classes when applied to an I/M program
which inspects  many  model years  and  all vehicle types.  Unless
the  cutpoints  used  are  carefully balanced,  the actual failure
rate may  vary greatly from model year to model year and vehicle
class to  vehicle class.   This single stringency input was meant
to reduce  the  amount of  input information necessary to model an
I/M scenario.

     It  is possible  for  MOBILES  to use a separate stringency
for  each  model year of  each  vehicle class.   The only barrier
has  been  the need to  modifiy the  input stream and appropriate
subroutines to accept and  utilize user supplied  information.

     Such  modifications  have now been done and the results are
described  in  this  report.   No other changes in  the MOBILES code
have been made other than the  changes  necessary  to accept the
multiple  stringencies.   Therefore,  this version  of  MOBILES is
not  different  from  the original release of MOBILES for non-I/M
cases  and differs  only  in  its  flexibility  for evaluating I/M
cases.

-------
                              -3-

2.0  INPUTS

     It  is assumed  for  purposes of this report that the user is
familiar with  using MOBILES and has available the MOBILES Users
Guide.*  This  report,  therefore,  addresses  only  the new inputs
and modifications to the existing  inputs.

     The  only  input  flag  modified  is  the stringency  level
described  in   Section   2.2.3  of  the  MOBILER3  Users  Guide.
Usually  the  second field of  the  I/M  characteristics  record
indicates the  stringency  to use for all model years and vehicle
classes.  In  the  Multiple  Stringency  MOBILES,  the  use  of this
flag  has been  modified to  indicate the  number  of stringencys
the user wishes to  input.   The valid range  for of this flag is
now therefore  1 to  99.

     Immediately  following  the  I/M characteristics  record in
the  input  stream should  follow the  new stringency input data.
This  information must  precede  the anti-tamper ing program  (ATP)
characteristics  record.    The  user   must  input   stringency
description  records totaling the  number  indicated  in  the  second
field  of the  I/M  characteristics record.   Too  many or too  few
stringency   description   records   will   result   in  an  error
message.   Each stringency description  record  must contain  the
following information:

     1.    Vehicle  class  (1-3)
     2.    First model  year of  stringency group
     3.    Last model year of stringency group
     4.    Stringency  (10-50)

     The format for this  record is II,IX,12,IX,12,IX,12.

     The vehicle class indicates  the vehicle type  for which  the
stringency   will  apply.    Only passenger   cars  (LDGV:   1)   and
light-duty   trucks. (LDGT1: 2  and  LDGT2: 3)  are valid vehicle
types.

     The first  and last  model years  for  the stringency group
indicate inclusively the  model years for which  this  stringency
record will  apply.  Only  the last two digits of the  model  year
.are  input  in each case.   If the same model  year  is used  for  the
first  and  last model year, then the stringency  will  only  apply
to  that one model  year.   If a  single  stringency is to be  used
 *"Users  Guide   to  MOBILES   (Mobile  Source  Emissions  Model)",
 EPA-460/3-84-002.

-------
                              -4-

for all  model years  of  that vehicle  type,  the first  and last
model  years  must  cover  all  of   the  model  years  for  which
stringency applies.   For LDGV,  this is 1951  through  1980.  For
LDGT1 and  LDGT2,  this is  1951  through 1983.   Last model years
beyond these ranges will cause an error message.

     Model  year   ranges  for  a  stringency must  be chosen with
care.  Overlapping  model year ranges for  the  same vehicle class
will result in an error message.

     Since  a  stringency  record cannot apply  to more  than one
vehicle  type,  there must be  at  least  one stringency  record for
each vehicle  type  subject  to the  I/M program  specified in the
I/M characteristics record.  If  a  vehicle class or  model year
is not given  a  stringency,  the  model will assume the stringency
is zero and put a warning in  the output.

     The  last  field of  the  stringency  record is the stringency
itself.   Stringency is  defined  as  the first year  failure rate
in  percent  for  the  idle  hydrocarbon   (IHC)  and  idle  carbon
monoxide  (ICO)   concentration  cutpoints  used  in  the   program.
The  stringency  input  in  this field  must  correspond  to the
stringency  for  the  model year  group  defined by  the first and
last model years  specified  in the second  and third fields.

-------
                              -5-

3.0  ERRORS AND WARNINGS

     If a  stringency  record specifies an  invalid  (greater  than
3)  vehicle type, an error 84 will occur:

     - out of bounds, I/M Stringency for  classes 1-3 only

     If a  stringency record specifies a model year  beyond  the
valid range  of  model years for  that vehicle  class,  an error 85
or 86 will occur:

         - inappropriate first/last MYR for stringency

     If a  model year  is  specified in more  than  one stringency
record for a vehicle class, an error 86 will occur:

            - inappropriate last MYR for stringency

This  error will  indicate  the  stringency  record  for  the model
year range whose last model year is duplicated elsewhere.

     If the  stringency  input  is not between 10 and 50, an error
33 will occur:

     - out of bounds, stringency (10 to  50)

     All  of  the  above  errors  are .fatal and  will  cause  the
MOBILES run to  terminate.

     If  a  vehicle  cla'ss   or   model  year  covered  by  the  I/M
program   which   uses  stringency   has   not   had   a   stringency
specified  using a  stringency  record,  the model will assume  that
the stringency  is  zero and will  issue a  warning in the output:

      Warning:  I/M stringency  for  (MYR)  class 	  is  zero

This  warning   will   not  prevent  completion  of  the  MOBILES
computations.

-------
                              -6-

4.0  EXAMPLE

     The  example   input  stream   shows  a  case   where  nine
stringencies  are  specified   in  the  second  field  of  the  I/M
characteristics  record.  The  I/M characteristics record is then
immediately  followed  by the  nine  stringency records.   In- this
example three  stringency records are used -to define stringency
levels  for  each  of  the   three  vehicle classes.   The  third
stringency  record  demonstrates  the  technique  to  specify  a
stringency  for  a single model year.  Note  that the model years
covered by  the stringencies cover all of the model years which
must be covered and do so without overlap.

     The output  echoes  the user  input stringency information in
the I/M program description.

-------
                         -7-
Example Input Stream for Multiple Stingency MOBILES
MOBILES : 1
1
83
1
1
1
2
2
2
3
3
3
1
1 1
09
51
75
80
51
75
80
51
79
81
88
1
1
74
79
80
74
79
83
78
80
83
19
1 :
51
10
20
10
10
20
10
10
20
10
.6
          MULTIPLE STRINGENCY MOBILES
          2 1 .1 4 4 2  1  1
           20 4 1 2 1
          75.0  20.6  27.3  20.6
I PROMPT
PROJID
Input/Output Flags
I/M. Characteristics
Stringency Record
Stringency Record
Stringency Record
Stringency Record
Stringency Record
Stringency Record
Stringency Record
Stringency Record
Stringency Record
Scenario Record

-------
                                  -8-
  .Example Output Using Multiple Stringency MOBILES
MOBILES :  MULTIPLE STRINGENCY MOBILES

I/M program selected:

    Start year (January 1):
    Number of input stringencys:
    Mechanic training program?:
    First model year covered:
    Last model year covered:
    Vehicle types covered:
  •  1981 t later MYR test type:
    1981 & later MYR test cutpoints:
                           1983
                            9
                           No
                           1951
                           2020
                           LDGV,  LDGT1,  LDGT2
                           Idle
                           1.2%  ICO / 220  ppm  IHC
Vehicle Class  1 -
Vehicle Class  1 -
Vehicle Class  1 -
Vehicle Class  2 -
Vehicle Class  2 -
Vehicle Class  2 -
Vehicle Class  3 -
Vehicle Class  3 -
Vehicle Class' 3 -
Model Years 1951
Model Years 1975
Model Years 1980
Model Years 1951
Model Years 1975
Model Years 1980
Model Years 1951
Model Years 1979
Model Years 1981
through 1974 use 10%
through 1979 use 20%
through 1980 use 10%
through 1974 use 10%
through 1979 use 20%
through 1983 use 10%
through 1978 use 10%
through 1980 use 20%
through 1983 use 10%
                                              Stringency
                                              Stringency
                                              Stringency
                                              Stringency
                                              Stringency
                                              Stringency
                                              Stringency
                                              Stringency
                                              Stringency
Total HG.emission  factors  include  evapora'tive  HC  emission  factors.
Cal.
Year:
1988
I/M
Anti-tarn.
Veh.
Veh.
VMT
Type:
Sod. :
Mix:
LDGV
19.6
0.643
LDGT1
19.6
0.121
Region: Low Altitude: 500. Ft.
Program: Yes Ambient Temp:.- 75.0 (F)
Program: No Operating Mode:
LDGT2
19.6
0.087
LDGT HDGV
•19.6
0.041
LDDV
19.6
0.036
LDDT
19.6
0.015
20.6 /
HDDV
19.6
0.050
27:
MC
19.
0.
3 /'20
Ail
6
007
.6
Ve


 Composite
 Total  HC:
  *Svap  HC:
 Exhst   CO:
 2xhst NOX:
Emission Factors (Gm/Mile)
 ,2.25   4.15   5.14   4.57   8.75
  0.85   1.33   1.74   1.50   4.60
 14.25  26.49  28.36  27.27  91.06
  1.56   2.72   3.05   2.86   5.32
                              0.40    0.62    3.94
                              0.0     0.0     0.0
                              1-.32    1.53 ,  11.63
                              1.17    1.45   17.74
                                 6.02   3.02
                                 2.26  ' 	
                                19.81  19.3.2
                                 0.65   2.78

-------
                              -9-

5.0  COMPUTER CODE CHANGES

     The  Appendix contains  a  listing  of  the  subroutines  and
functions  which  contain  the  changes  in  the MOBILES  computer
code  necessary  to allow  the  use  of multiple stringency.   Any
changes  in  the code  are  indicated  by  a  verticle bar  near  the
MOBILES Users Guide  line  number.   The  subroutines and functions
with changes are:

     1.    Subroutine ONESEC
     2.    Subroutine QUITER
     3.    Function PCLEFT
     4.    Subroutine OUTIMP

     Subroutine ONESEC  contains  the input code and input checks
for  the  stringency   records.   Subroutine  QUITER contains  the
error   code  output   logic.    Function   PCLEFT  chooses   the
appropriate  stringency to   use  for  choosing  the I/M  program
credit  for  each  model  year  of   each  vehicle  class.   This
function  is  where   the   new  input  information  is  actually
utilized.   Subroutine  OUTIMP was  modified  to  write  the  user
input in the MOBILES output.

     In  subroutine  PCLEFT,   the  model  sorts  through  all  of the
input  stringency records  for each  model year  of each vehicle
class covered  by the I/M program  once  for HC and once for CO.
If  the  model year and  vehicle class combination  is not covered
by  a stringency  record and  that combination is covered  by the
I/M  program as  specified  in  the   I/M  characteristics record,
then  the  stringency  i's  assumed  to  be  zero   and   PCLEFT  is
returned as one.

-------
            Appendix

  Multiple Stringency MOBILE3 :

 Computer Code Changes Necessary
to Allow Multiple Stringency Input

-------
Page 1
3000
3000.6
3000.7
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033"
3034
3035
3036
3037
3039
3040
3041
3042
3043
3044
3044.2
3044.4
3044.6
3044.8
3045
3046
3047
3048
3049
3050
3051

C
C
.C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
•C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
.C
C
C
C
C
C
C.
C
C
C
SUBROUTINE ONESEC (INERR,*)

This Subroutine has been modified to use multiple stringencies

ONESEC checks if control flags indicate One-time Data. It then reads in,
validates, and stores the data.

Called by MAIN.

Calls CCEVAX, GETATP, GET IMC, GETVMT, NEWERQ, QUITER and YRTEST.

Input on call:

parameter list: INERR
common blocks:
/ FLAGS 1 / I PROMT , TAMFLG , VMFLAG
/FLAGS2/ MYMRFG.NEWFLG, IMFLAG, ATPFLG
/FLAGS3/ ICEVFG
/IOUCOM/ IOUGEN.IOUASK
/SYSCOM/ MAXVEH
/YEARS4/ IY 1941, IY 1960, IY2020

Output on return:

parameter list: INERR
common blocks:
/BASETR/ ZMLTAM.DRTAM
/CEVCOM/ USRTPD.USRMPD
/IMPAR1/ ICYIM,ISTRIN,IMTFLG,MODYR1,MODYR2
/IMPAR2/ ILDT, ITEST, ICUTS.NUDATA.NLIM, IMNAME
/MYRSAV/ AMAR, JULMYR
/NEWCOM/ NEWPAR,BERNEW,NEWFIT,NEWCT
,
Local array subscripts:

NAMMMR(2,2,8) - NAMMMR ( ICH, IG, IV )

Local variable / array dictionary:

Name Type • Description
CHKMYR R myr mix check: sum of the myr fractions - 1.0 +/- i.E-6
(a normalized myr distribution has been entered for each IV)
DRNEW R new emission rate's deterioration rate (slope)
MYF I my of first (JDX order) AMAR / JULMYR to be entered on READ
MYL I . my of last (JDX order) AMAR / JULMYR to be entered on READ
NAMMMR R*8 prompts for replacement AMAR & JULMYR, by JDX & IV
NVEH I vehicle class for stringency input
NMYF I first model year of stringency grouping
NMYL I last model year of stringency grouping
NSTR I stringency for MYR/CLASS grouping
NEWMYF I new emission rate's first my of affected range
NEWMYL I new emission rate's last my of affected range
NEWPOL I new 'emission rate's pollutant code
NEWREG I new emission rate's region code
NEWVEH I new emission rate's vehicle type code
SUMMYR R sum of myr for IV; used to normalize user entered JULMYR
2EROML R user entered tampering zml to be checked: ZEROML <- 1.0

-------
Page 2
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
| 3068. 5
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
309.3
3094
.3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
C ZMLNEW R new emission rate's zero mile level (intercept)
r*
\~
C
C
INTEGER TAMFLG,SPDFLG,VMFLAG,ALHFLG,ATPFLG,PRTFLG
REAL JULMYR
C
COMMON /BASETR/ BTR(7,2),ZMLTAM(7,2,4) ,DRTAM(7,2,4)
COMMON /CEVCOM/ USRTPD(8) ,USRMPD(8)
COMMON /FLAGS 1/ IPROMT.TAMFLG.SPDFLG.VMFLAG
COMMON /FLAGS2/ MYMRFG.NEWFLG, IMFLAG, ALHFLG.ATPFLG
COMMON /FLAGS3/ IFORM, PRTFLG, ICEVFG, IDLFLG.NMHFLG
COMMON /IMPAR1/ ICYIM, ISTRIN, IMTFLG.MODYR1 ,MODYR2
COMMON /IMPAR2/ ILDT, ITEST, ICUTS.NUDATA.NLIM, IMNAME(20,9)
COMMON /IOUCOM/ IOUAER, IOUIMD, IOUGEN, IOUREP, IOUERR, IOUASK
COMMON /MYRSAV/ AMAR (20 , 8) , JULMYR (20 , 8) , NEWCUM
















COMMON /NEWCOM/ NEWPAR(5 , 100) ,BERNEW(2, 100) ,NEWFIT(100) .NEWCT
COMMON /NEWTOO/ NEWSTR (4 , 1 00)
COMMON /SYSCOM/ MAXVEH , MAXLTW , MAXPOL , MAXREG , INITPR
COMMON /YEARS4/ IY1941 , IY1960, IY2020
C
REAL*8 NAMMMR (2 , 2 , 8)
C
DATA NAMMMR/
* '1-10 for1 , ' LDGV: ' ,
* '11-20 fo'.'r LDGV: ',
* ' 1-10 for' , ' LDGT1: ' ,
* ' 11-20 fo'.'r LDGT1:1,
* '1-10 for ' , ' LDGT2 1 ' ,
* '11-20 fo', 'r LDGT2:1 ,
* '1-10 for' , ' HDGV: ',
* ' 11-20 fo1 , 'r HDGV: ' ,
* ' 1-10 for', ' LDDV: ' ,
* '11-20 fo', 'r LDDV: ' ,
* '1-10 for', ' LDDT: ',
* ' 11-20 fo', 'r LDDT: ',
* ' 1-10 for', ' HDDV: ' ,
* ' n-20 fo', 'r HDDV: ',
* ' 1-10 for', ' Me: ',
*. '11-20 fo', 'r Me: '/
C •
C Process flags.
C
IF(TAMFLG.EQ.l) GOTO 20
IF(IMFLAG.EQ.2) GOTO 10
C .
IF(IPROMT.EQ.2) WRITE (IOUASK, 200)
200 FORMAT (' ',' Enter tampering intercepts (zero mile levels)')
IF(IPROMT.EQ.2) WRITE (IOUASK, 205)
205 FORMAT (' ' , 'for non-I/M case only:')
READ (IOUGEN, 1 00 , END-99) ( (ZMLTAM (ID, 1 , IVTAM) , ID- 1 , 7) , IVTAM- 1
100 FORMAT (7F8. 4)
IF(IPROMT.EQ.2) WRITE (IOUASK, 2 10)
210 FORMAT (' ',' Enter tampering slopes (deterioration rates)')
IF (IPROMT. EQ. 2) WRITE (IOUASK, 205)
READ(IOUGEN, 1 10.END-99) ((DRTAM(ID, 1 , IVTAM) , ID-1 ,7) .IVTAM-1 ,
110 FORMAT (7F9. 5)
GOTO 12
C

































,4)




4)




-------
3110
3111
3112
3113
3114
3115
3116
3117
3118
3-119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129 .
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3153
3164
3165
3166
3167
3168







C
C
C
C






C
C
C

C
C
C
C




C











C




C












                                                                 Page  3
 10 IF(IPROKT.EQ.2) WRITE(IOUASK,200)
    IF(IPROMT.EQ.2) WRITE (IOUASK,2 15).
215 FORMAT(' ','for non-I/M and I/M cases:')
    READ(lOUGEN,100,END-99) ZMLTAM
    IF(IPROMT.EQ.2) WRITE(IOUASK,210)
    IF(IPROKT.EQ.2) WRITE(IOUASK,215)
    READ(IOUGEN,110,END-99) DRTAM

 Insure tampering zero mile levels  (intercepts) do not exceed  unity.
 There is no range check for deterioration rates.

 12 DO 14 IVTAM-1,4
    DO 14 IM-1.IMFLAG
    DO 14 ID-1,7
    ZEROML-ZMLTAM(ID,IM,IVTAM)
    IF(ZEROML.GT.1.0) CALL QUITER(ZEROML,0,50,INERR)
 14 CONTINUE

 Checfc for  user supplied vmt mix to be  used  for all  scenarios  of this  run.

 20 IF(VMFLAG.EQ.3) CALL GETVMT(INERR,&99)

 ChecJc for  user supplied my mileage accrual  rates and /  or registration
 distributions.

    IF(MYMRFG.EQ.I) GOTO 44
    IF(MYMRFG.EQ.3) GOTO 26
    IF(IPROMT.EQ.2) WRITE(IOUASK,220)
220 FORMAT(/)

    DO 22  IV-1.MAXVEH
    DO 22  IG-1,2
    IF(IPROMT.EQ.2) WRITE(IOUASK,230)  (NAMMMR(lCH,IG,IV),ICH-1,2)
230 FORMAT('  '/Enter MYM  ages *,2A8)
    MYF-1
    IF(IG.EQ.2) MYF-11
    MYL-10
    IF(IG.EQ.2) MYL-20
    READ(IOUGEN,130,END-99)  (AMAR(JDX,IV),JDX-MYF.MYL)
130 FORMAT(10F5.3)
 22 CONTINUE

    DO 24  IV-1.MAXVEH
    DO 24  JDX-1,20
    IF(AMAR(JDX,IV).LT.O.) CALL QUITER(AMAR(JDX,IV),0,19,INERR)
 24 CONTINUE

    IF(MYMRFG.EQ.2) GOTO  36
 26 IF(IPROMT.EQ.2) WRITE(IOUASK,220)
    DO 32  IV-1.MAXVEH
    DO 28  IG-1,2
    IF(IPROMT.EQ.2) WRITE(IOUASK,235)  (NAMMMR(ICH,IG,IV),ICH-1,2)
235 FORMAT('  ','Enter KYR  ages ',2A8)
    MYF-1
    IF(IG.EQ.2) MYF-11
    MYL-10
    IF(IG.EQ.2) MYL-20
    READ(IOUGEN,130,END-99)  (JULMYR(JDX,IV),JDX-MYF.MYL)
 28 CONTINUE

-------
                                                                 Page 4
3169
3170
3171
3172
3173
3174
3175
3175
3177
3178
3179
3180
318.1
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
.3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
C




C



C




C
C

C
C
C
C







C
C
C
•



C
C
C

C





C



C
C
C






C
   CHKMYR-0.0
   DO  30  JDX-1,20
   CHKMYR-JULMYR(JDX,IV)+CHKMYR .
 30 CONTINUE

   IF(CHKMYR-.00001.GT.1..OR.CHKMYR+.00001.LT.1.)
  *  CALL QUITER(CHKMYR,0,49,INERR)
 32 CONTINUE

   DO  34  IV-1.MAXVEH
   DO  34  JDX-1,20'
   IF(JULMYR(JDX,IV).LT.O.)  CALL QUITER(JULMYR(JDX,IV),0,20,INERR)
 34 CONTINUE
 36 DO 38 IV-1.MAXVEH

 Skip 0 with non-0 checks if user supplies MYR only and on HDDV pass:
 the BD values are 0.0's for all 20 my's (HDDMYM has not yet been called)

    IF(KYMRFG.EQ.3.AND.IV.EQ.7) GOTO 38
    DO 38 JDX-1,20
    IF(AMAR(JDX,IV).LE.0.0.AND.JULMYR(JDX,IV).GT.0.0)
   *    CALL QUITER(JULMYR(JDX,IV),0,21,INERR)
    IF (Am (JDX,IV).CT.0.0.AND.JULMYR (JDX, IV) .EQ.0.0)
   *    CALL QUITER(AMAR(JDX,IV),0,22,INERR)
 38 CONTINUE

 Check vehicle equalities (LDGV.LDDV),   (LDGTl.LDDT) mod yr regs.

    DO 40 JDX-1,20
    IF(JULMYR(JDX,l).NE.JULMYR(JDX,5))  CALL QUITER(0.,JDX,65,INERR)
    IF(JULMYR(JDX,2).NE.JULMYR(JDX,6))  CALL QUITER(0.,JDX,66,INERR)
 40 CONTINUE

 Normalize JULMYR.

 44 DO 50 IV-1.MAXVEH

    SUMMYR=0.0
    DO 46 JDX-1,20
    SUMMYR-JULMYR(JDX,IV)+SUMMYR
 46 CONTINUE
    IF(SUMMYR.EQ.O.)  SUMMYR-1.

    DO 50 JDX-1,20
    JULMYR(JDX,IV)-JULMYR(JDX,IV)/SUMMYR
 50 CONTINUE

 Here read in e.f. modification data.

    IF(NEWFLG.EQ.1) GOTO 60
    IF(IPROMT.EQ.2) WRITE(IOUASK,240)
240 FORMAT('0','Enter no. of new e.f. intercept/slope pairs  (12)')
    READ(IOUGEN,140,END-99)  NEWCT
140 FORMAT(12)
    IF(NEWCT.LT.1.OR.NEWCT.GT.100) CALL QUITER(0.,NEWCT,23,INERR)

-------
                                                                            Page 5
3228           DO 55 IFAC-1.NEWCT
2229           IF(IPROMT.EQ.2) WRITE(IOUASK,250)
3230       250 FORMATC ','Enter region,veh. type,pollutant,first my,1/
3231        •  *  '  ','last ray,new intercept (A), and new slope (B)')
3232           READ(IOUGEN,150,END-99) NEWREG,NEWVEH,NEVPOL,
3233          *  NEWMYF,NEWMYL,ZMLNEW.DRNEW
3234       150 FORMAT(11,1X,I1,1X,I1,1X.I2,1X,12,1X.F6.2,1X.F6.2)
3235           IF (NEWREG. NE. LAND. NEWREG. NE. 2)
3236          *   CALL QUITER(0.,NEWREG,62,INERR)
3237           IF(NEWVEH.LT.LOR.NEWVEH.GT.8) CALL QUITER(0.,NEWVEH,25,INERR)
3238   .        IF(NEWPOL.LT.LOR.NEWPOL.GT.3) CALL QUITER(0. .NEWPOL.26, INERR)
3239           CALL YRTEST(NEWMYF,27,IY1941,IY2020,INERR)
3240           CALL YRTEST(NEWMYL,28,IY1941,IY2020,INERR)
3241           IF(NEWMYL.LT.NEWMYF) CALL QUITER(0.,0,29,INERR)
3242           IF(ZMLNEW.LE.O.) CALL  QUITER(ZMLNEW,0,30,INERR)
3243           IF(DRNEW.LT.O.) CALL QUITER(DRNEW,0,31,INERR)
3244     C
3245     C  Store alternate equation  data.
3246     C
3247  .         NEWPAR(1,IFAC)-NEWREG
3248           NEWPAR(2,IFAC)-NEWVEH
3249           NEWPAR(3,IFAC)-NEWPOL
3250           NEWPAR(4,IFAC)-NEWMYF
3251           NEWPAR(5,IFAC)-NEWMYL
3252           BERNEW(1,IFAC)-ZMLNEW
3253           BERNEW(2,IFAC)-DRNEW
3254        55 CONTINUE
3255           CALL NEWERQ(INERR)
3256     C
3257     C  If IMFLAG-2,  read in  I/M  program  parameters.
3258     C
3259        60 IF(IMFLAG.EQ.1) GOTO  70
3260           NLIM-0
3261           IF(IPROMT.EQ.2) WRITE(IOUASK,260)
3262       260 FORMATC'0','Enter  I/M  Start Year,  # of stringencies, m.t.  flag,1/
3263          *  '  ','first model year  and last model year of prog, benefits,'/
3264          *  '  ','vehicle, test  type,  cutpoints  and newdata  flags')
3265           READ(IOUGEN,160,END-99)
3266          *    ICYIM,ISTRIN,IMTFLG,MODYR1,MODYR2,ILDT,ITEST,ICUTS,NUDATA
3257       160 FORMAT(2(I2,1X),I1,1X,2(I2,1X),3(I1,1X),I1)
3268     C
3269     C  Check.  I/M  inputs.
3270     C
3271           CALL YRTEST(ICYIM,32,IY1960,IY2020,INERR)
3272           IF(ISTRIN.LT.I) CALL  QUITER(0.,ISTRIN,33,INERR)
3273           IF(IMTFLG.LT.LOR.IMTFLG.GT.2)  CALL QUITER(0., IMTFLG, 34, INERR)
3274           CALL YRTEST(MODYR1,35,IY1941,IY2020,INERR)
3275           CALL YRTEST(MODYR2,36,IY1941,IY2020,INERR)
3276    .      . IF(MODYR1.GT.MODYR2)  CALL QUITER(0.,0,37,INERR)
3277           IF(ILDT.LT.LOR.ILDT.GT.4)  CALL QUITER(0.,ILDT,72,INERR)
3278           IF(ITEST.LT.LOR.ITEST.GT.3) CALL QUITER(0., ITEST, 73, INERR)
3279           IF(ICUTS.LT.LOR.ICUTS.GT.3) CALL QUITER(0., ICUTS,82, INERR)
3280           IF(NUDATA.LT.LOR.NUDATA.GT.4)  CALL QUITER(0. .NUDATA, 74, INERR)
3281           IF (NUDATA. GT.O CALL  GETIMC(&99)
3281.02  C
328L04  C    This  is where the new stringencies are read.
328L06  C
3281.08        IY1980  - 1980
3281.1         IY1983  - 1983

-------
                                                                            Page 6
3281.12  C
2281.14        IF(IPROKT.EQ.2)  WRITE(IOUASK,261)  ISTRIN
3281.16    261  FORMAT('0VEnter for each of  the ',12,' stringencies :',/,
3281.18       *'OThe vehicle type code ( 1:LDGV,  2:LDGT1, 3:LDGT2 ),',/,
3281.2        *'  The first model year of the  grouping,',/,
3281.22       *'  The last model year of the grouping,'/,
3281.24       *'  The first year failure rate  (stringency).')
3281.26  C
3281.28        DO 61 IM-1,ISTRIN                        .   .
3281.3         READ(IOUGEN,161,END-99) NVEH,NMYF,NMYL,NSTR
3281.32    161  FORMAT(I1,2(1X,I2),1X,I2)
3281.34  C
3281.36  C   Check the stringency input parameters
3281.38  C
3281.4         IF(NVEH.GT.3) CALL QUITER(0.,NVEH,84,INERR)
3281.42        IF(NVEH.EQ.I) CALL YRTEST(NMYF,85,IY1941,IY1980,INERR)
3281.44        IF(NVEH.GT.1) CALL YRTEST(NMYF,85,IY1941,IY1983,INERR)
3281.46        IF(NVEH.EQ.l) CALL YRTEST(NMYL,86,NMYF,IY1980,INERR)
3281.48        IF(NVEH.GT.1) CALL YRTEST(NMYL,86,NMYF,IY1983,INERR)
3281.5         IF(NSTR.LT.10.0R.NSTR.GT.50) CALL QUITER(0.,NSTR,33,INERR)
3281.52  C
3281.54  C   Store new stringency information
3281.56  C
3281.58        NEWSTR(1,IM) - NVEH
3281.6         NEWSTR(2,IM) - NMYF
3281.62        NEWSTR(3,IM) - NMYL
3281.64        NEWSTR(4,IM) - NSTR
3281.66  C
3281.68     61 CONTINUE
3281.7   C
3281.72  C   Check the MYR group ranges  for overlaps
3281.74 • C
3281.76        DO 62 IM-1,ISTRIN
3281.78        DO 62 IN-1,ISTRIN
3281.8         IF(NEWSTR(1,IM).NE.NEWSTR(1,IN))  GOTO  62
3281.82        IF(IK.EQ.IN)                      GOTO  62
3281.84        IF(NEWSTR(3,IM).LT.NEWSTR(2,IN))  GOTO  62
3281.86        IF(NEWSTR(3,IM).LT.NEWSTR(3,IN))
3281.88       * CALL QUITER(0.,NEWSTR(3,IM),86,INERR)
3281.9      62 CONTINUE
3281.92  C
3283     C  Anti-tampering program  -> get  parameters  and effectiveness rates.
3284     C                             •
3285        70 IF(ATPFLG.EQ.2)  CALL GETATP(INERR,&99)
.3286     C
3287          . IF(ICEVFG.LT.3)  GOTO 90
3288     C
3289     C  Read trips/day and  miles/day.
3290     C
3291           IF(IPROMT.EQ.2)  WRITE(IOUASK,270)
3292       270 FORMAT('0','Enter average trips/day')
3293           READ(IOUGEN,170,END-99)  USRTPD
3294       170 FORMAT(8F5.1)
3295     C
3296           DO 80 IV-1.MAXVEH
3297           IF(USRTPD(IV).LT.O.)  CALL QUITER(USRTPD(lV),0,54,INERR)
3298        80 CONTINUE
3299     C
3300           IF(IPROMT.EQ.2)  WRITE(IOUASK,280)

-------
                                                                            Page 7
3301       280 FORMAT('0','Enter average miles/day1)
3302           READ(lOUGEN,170,END-99) USRMPD  .
3303     C
3304           DO 85 IV-1.MAXVEH
3305           IF(USRMPD(IV).LT.O.) CALL QUITER(USRMPD(lV),0,55,INERR)
3306        85 CONTINUE
3307           CALL CCEVAX
3308        90 RETURN
3309     C
3310     C  EOF on any attempted read -> take alternate return  1 -> run aborts.
3311     C
3312        99 RETURN 1
3313           END

-------
Page 8
1 1000
1 1000.3
11000.6
1 1001
11002
11003
1 1004
1 1005
1 1006
1 1007
11008
1 1009
11010
1 101 1
1 1012
1 1013
1 1014
1 1015,
11016
1 1017
11018
11019
11020
11021
11022
11023
11024
11025
11026
11027
1 1028
11029
1 1030
11031
11032
11033
11 f\ ^ A
1 034
11035
1 1036
11037
11038
1 1039
1 1040
1 1041
1 1042
1 1043
1 1044
1 1045
11046
1 1047
1 1048
11049
11050
11051
1 1052
1 1053
1 1054
11055
1 1056

C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
• c
C
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c
c




c
SUBROUTINE QUITER (RVALUE, IVALUE, MESSAG, INERR)

This Subroutine has been modified to use multiple stringencies

QUITER prints error and warning messages on unit IOUERR.
•
Called by CONSEC, CRANKC, DIURNL, EFCALX, GETATP, HOTSOK, IERPTR,
IEXMPT, IGEPTR, IGLPTR, IGPPTR, IGSFPT, IGTPTR, IGUPTR,
ISPPTR, ISPPT8, ITCPTR, NEWERQ, ONESEC, PARSEC, TFCALX,
TPD, XMPD and YRTEST.

Input on call:

parameter list: RVALUE, I VALUE, MESSAG, INERR
common blocks:
/IOUCOM/ IOUREP, IOUERR, IOUASK
/NEWCOM/ NEWPAR
/NEWEQU/ MAXEQU
/YEARS4/ IY 194 1,111960, I Y2020

Output on return:

parameter list: INERR

Warning: there is a conditional branch to STOP at statement number 98.

Local array subscripts:

IOBMSG(5) - IOBMSG ( ICH )
NAMFLG(15) - NAMFLG ( ICH )
NAMFNC (16) - NAMFNC ( ICH )
NAMVEH(8) - NAMVEH ( IV )

Local variable / array dictionary:

Name Type Description
IOBMSG I character string vector: 'out of bounds for'
KAXMES I maximum message code value ( - 83 in MOBILES release version)
MCODE I - MESSAG - message code, unless < 0 or > MAXMES -> - 1
NAMFLG R*8 control flag names •+ 'Unknown'
NAMFNC R*8 function names (to identify subprogram source of error)
NAMVEH R*8 vehicle type • names

Notes:

The error message for the new function ITCPTR was installed.
Error/warning code related to INFLAG, TRKFLG & UNFFLG removed and replaced
with code for TAMFLG & ATPFLG. Error code 73 refers to ITEST, not IOPTN.
Error codes 82 (refers to ICUTS) and 83 (refers to interpolated altitude)
added. MAXMES accordingly was increased to 83, leaving MESSAG values
84-97 available for future additions to QUITER' s messages.


COMMON /IOUCOM/ IOUAER, IOUIMD, IOUGEN, IOUREP, IOUERR, IOUASK
COMMON /NEWCOM/ NEWPAR (5 , 1 00) , BERNEW (2 , 1 00) , NEWFIT ( 1 00) , NEWCT
COMMON /NEWEQU/ MAXEQU
COMMON /YEARS4/ IY 1941 , IY1960, IY2020


-------
Page 9
1 1057
1 1058
11059
1 1060
11061
1 1062
1 1063
11064
1 1065
1 1066
1 1067
1 1068
11069
1 1070
11071
1 1072
1 1073
1 1074
1 1075
11076 .
11077
11078
11079
11080
1 1081
11082
1 1083
1.1084
11085
11086
11087
11088
11089
1 1090
1 1091
1 1092
11093
11094
1 1095
11096
11097
1 1098
1 1099
1 1100
1 1 101
1 1102
11103
1 1 104
1 1105
11106
11107
1 1108
| 11109
11110
11111
11112
11113
11114
11115
DIMENSION IOBKSG(5)
C
REAL*8 NAMFLG ( 1 5) , NAMVEH (8) , NAMFNC ( 1 6)
-C
DATA NAMFLG/
* ' Unknown ' ,
* ' IPROMT ' ,
* ' TAMFLG ' ,
* ' SPDFLG ' ,
* ' VMFLAG ' ,
* ' MYMRFG ' ,
* ' NEWFLG ' ,
* ' IMFLAG ' ,
* ' ALHFLG ' ,
* ' ATPFLG ' ,
* ' IFORM ' ,
* ' PRTFLG ' ,
* ' ICEVFG ' ,
* ' IDLFLG ' ,
* ' NHMFLG '/
C
DATA NAMVEH/
* ' LDGV ' ,
* 'LDGT1 ',
* ' LDGT2 ' ,
* 'HDGV
* ' LDDV ' ,
* ' LDDT ' ,
* ' HDDV
* 'KG '/
C
DATA NAMFNC/
* ' HOTSOK ' , .
* ' TPD ' ,
* ' DIURNL ' ,
* ' XMPD ',
* ' CRANKC ' ,
* ' IGEPTR ' ,
* ' IGUPTR ' ,
* ' IGLPTR ',
* ' IGTPTR ' ,
* . ' IGPPTR ' ,
* ' IERPTR ' ,
* ' ISPPTR ' ,
* ' ISPPT8 ' ,
* ' IEXMPT ' ,
* ' ITCPTR ' ,
* ' IGSFPT '/
. C
DATA IOBMSG/
* ' ou ' , ' t of , ' bou ' , ' nds ' , ' f or ' /
C
DATA MAXMES/86/
c
MCODE-MESSAG
C
C Trap unknown errors.
C
IF(MCODE.LT.I.OR.MCODE.GT.MAXMES) MCODE-1

-------
                                                                             Page  10
 11116
 11117
 11118
 11119
 11120
 11121
 11122
 1 1123
 11124
 11125
 1 1126
 11127
 11128
 11129
 11130
 11131
 1 1132
 11133
 11134
 11135
[11136
 1 1137
 11138
 11139
 11140
 11141
 11142
 11143
 11144
 11145
 1 1146
 1 1147
 11148
 1 1 149
 11150
 1 1151
 11152
 11153
 11154
 11155
 1 1156
 11157
 11158
 11159
 1.1 16Q
 1 1 161
 11162
 11163
•11164
 11165
 11166
 11167
 11168
 1 1169
 11170
 1 1 171
 1 1172
 1 1 173
 1 1 174
C
C
C
 Test for warnings.
C
C
C
    IF(MCODE.NE.16.AND.MCODE.NE.21.AND.MCODE.NE.22.AND.MCODE.NE.31
   *   .           .AND.MCODE.NE.49.AND.MCODE.NE.52.AND.MCODE.NE.53
   *              .AND.MCODE.NE.56.AND.MCODE.NE.59.AND.MCODE.NE.71)
   *      WRITE(IOUERR,300)
300 FORMATC -',T2, ' *** Error:1)

 Branch to the appropriate error / warning message.

    GOTO(
     *
     *
     *
     *
     *
     *
10,
1 1
21,
31,
41,
51,
61,
71,
81,
1 1 •

22,
32,
42,
52,
62,
72,
82,
1 1 ,

23,
33,
43,
53,
63,
73,
83,
1 1 ,
1 1
24,
34,
44,
54,
64,
74,
84,
11 ,
11
25,
35,
45,
55,
65,
75,
85,
11 i

26,
36,
46,
56,
66,
76,
86
11 ,
.17,
27,
37,
47,
57,
67,
77,

11 i
18,
27,
38,
48,
58,
68,
78,

11 i
19,
29,
39,
49,
59,
69,
79,

11 i
20,
30,
40,
50,
60,
70,
80,

            ),MCODE
    10 WRITE(IOUERR,310)  MESSAG.NAMFLG(MCODE)
  310 FORMAT(' + ',1 OX,'Message  code  (,I4,A8)
      GOTO 98
    11 WRITE(IOUERR,311)  IVALUE,IOBMSG,NAMFLG(MCODE)
  311 FORMATC + 1 , 10X,I4,5A4,'flag',A8)
      IF(MCODE.EQ.2)  WRITE (IOUERR,312)
  312 FORMATC  ','Prompt/mode  type  (1 to 4) must  be  corrected  before1,
     *        ' your next run.')
      GOTO 98
    16 WRITE(IOUERR,316)  RVALUE
  316 FORMATC  ','Warning: ',G10.3,'  speed reduced to 55 m.p.h.',
     *   ' maximum')
      GOTO 99
    17 WRITE(IOUERR,317)  RVALUE,IOBMSG
  317 FORMATC + 1,10X.G10.3,5A4,'VMTMIX  (0. to 1.)')
      GOTO 98
    18 WRITE(IOUERR,318)  RVALUE
  318 FORMAT('+',10X.G10.3,'  sum of VMTMIX is not equal to 1.')
      GOTO 98
    19 WRITE(IOUERR,319)  RVALUE
  319 FORMAT('+',10X.G10.3,'  negative model year  mileage')
      GOTO 98
    20 WRITE(IOUERR,320)  RVALUE
  320 FORMATC + ', 10X.G10.3,'  negative model year  registration')
      GOTO 98
    21 WRITE(IOUERR,321)  RVALUE
  321 FORMATC  ','Warning: ',G10.3,'  registration with zero mileage')
      GOTO 99
    22 WRITE(IOUERR,322)  RVALUE
  322 FORMATC  ','Warning: '.G10.3,'  mileage  with zero registration1)
      GOTO 99
    23 WRITE(IOUERR,323)  IVALUE,IOBMSG
  323 FORMAT(' + ',1 OX,14,5A4,'e.f. changes (1  to 100  pairs)1)
      GOTO 98
    24 WRITE(IOUERR,324)  IVALUE,IOBMSG
  324 FORMAT(' + ',1 OX,14,5A4,'region  (1,2,3 only)1)

-------
                                                                             Page i1
-, 1175           GOTO 98
11176        25 WRITE(IOUERR,325)  IVALUE,I03HSG  .
11177       325 FORMAT('+',10X,14,5A4,'vehicle.type (l to 8)')
 1178           GOTO 98
 1179        26 WRITE(IOUERR,326)  IVALUE,IOBMSG
 1180       326 FORMAT(' + ',1 OX,14,5A4,'pollutant (1 to 3)')
 1181           GOTO 98
 1182        27 WRITE(IOUERR,327)  IVALUE,IOBMSG,IY1941,IY2020
 1183       327 FORMAT('+',10X,I4,5A4,'year (',14,' to ',14,')')
 1184           GOTO 98
 1185        29 WRITE(IOUERR,329)
 1186       329 FORMAT(' + ',1 OX,' last year cannot be less than first year')
 1187           GOTO 98
11188        30 WRITE(IOUERR,330)  RVALUE
11189       330 FORMAT('+',10X,G10.3,' intercept must be positive')
11190           GOTO 98  .
11191        31 WRITE(IOUERR,331)  RVALUE
11192       331 FORMAT(' ','Warning:  '.G10.3,'  negative slope for ageing vehicle')
11193           GOTO 99
11194  .      32 WRITE(IOUERR,327)  IVALUE,IOBMSG,IY1960,IY2020
11195           GOTO 98
11196        33 WRITE(IOUERR,333)  IVALUE,IOBMSG
11197       333 FORMAT('+',10X,14,5A4,'stringency  (10 to 50)')
11198           GOTO 98
11199        34 WRITE(IOUERR,334)  IVALUE,IOBMSG
11200       334 FORMAT(' + ',1 OX,14,5A4,'mechanics training  (1  to  2)')
11201           GOTO 98
11202        35 WRITE(IOUERR,335) IVALUE,IOBMSG,IY1941,IY2020
11203       335 FORMAT('+',10X,I4,5A4,'MODYR1  (',14,' to  ',14,')')
11204    .       GOTO 98
11205        36 WRITE(IOUERR,336) IVALUE,IOBMSG,IY1941,IY2020
11206       336 FORMAT(' + ',10X,I4,5A4, 'MODYR2  C/I4,' to  ',14,')')
11207           GOTO 98
11208        37 WRITE(IOUERR,337)
11209       337 FORMAT('+',10X,'  MODYR1  cannot be  greater  than  MODYR21)
11210           GOTO 98
11211        38 WRITE(IOUERR,327) IVALUE,I03MSG,IY1960,IY2020
11212           GOTO 98
11213        39 WRITE(IOUERR,339) RVALUE.       • .
11214       339 FORMAT('-i-',-lOX,Gl0.3,'  speed must  be  positive1)
11215           GOTO 98
11216        40 WRITE(IOUERR,340) RVALUE
11217       340 FORMAT('+',10X,G10.3,' .valid temperature.is 0-110 deg. (F)')
11218           GOTO 98
11219        41 WRITE(IOUERR,341) RVALUE,IOBMSG
11220       341 FORMAT('+.',10X,G10.3,5A4,'PCCN (0.  to 100.)')
11221           GOTO 98
11222        42 WRITE(IOUERR,342) RVALUE,IOBMSG
11223    .   342 FORMAT('+',10X.G10.3.5A4,'PCHC (0.  to 100.)')
11224           GOTO 98
11225        43 WRITE(IOUERR,343) RVALUE,IOBMSG
11226       343 FORMAT('+',10X,G10.3,5A4,'PCCC (0.  to 100.)')
11227           GOTO 98
11228        44 WRITE(IOUERR,344) RVALUE,IOBMSG
M229       344 FORMATC + ', 10X.G10.3.5A4, 'AC  (0.  to 1.)')
11230           GOTO 98
11231        45 WRITE(IOUERR,345) RVALUE,IOBMSG
11232       345 FORMAT C-t-'.l OX, G10.3,5A4, 'extra load  (0.  to 1.)')
11233           GOTO 98

-------
                                                                              Page 12
 11234         46 WRITE(IOUERR,346)  RVALUE,IOBKSG
 11235        346 FORMAT('+' ,10X,G10.3,5A4, 'trailers (0.  to 1.)').'
 1 1236           GOTO 98
 11237         47 WRITE(IOUERR,347)  RVALUE,IOBMSG
 11238        347 FORMAT(' + ',1 OX,G10.3,5A4,'humidity (20. to 140.)')
 11239           GOTO 98
 11240         48 WRITE(IOUERR,348)  NAMVEH(IVALUE)
 11241        348 FORMATC + ',10X,' there are no sales for vehicle ',A8)
 11242           GOTO 98                                   .  .
 11243         49 WRITE(IOUERR,349)  RVALUE
 11244        349 FORMAT('  ','Warning:'',010.3,'  MYR sura not - 1. (will normalize)')
 11245           GOTO 99
 11246         50 WRITE(IOUERR,350)  RVALUE,IOBMSG
 11247        350 FORMAT(' + ',1 OX,G10.3,5A4,'tampering rate intercept (up to 1.0)')
 11248           GOTO  98
 11249         51 WRITE(IOUERR,351)  IVALUE.MAXEQU
 11250        351 FORMAT('+',10X,'equation1,13,'  causes more than1,13,
 11251          *        '  allowed for any 1 reg/mode/pol.')
 11252           GOTO  98
 11253         52 WRITE(IOUERR,352)  RVALUE
,11254        352 FORMATC  '/Warning:  ' ,010.3,'  speed increased',
 11255           *                              '  to 5 m.p.h. minimum")
 11256           GOTO  99
 11257         53 WRITE(IOUERR,353)
 11258        353 FORMAT('0','You must correct all flags before you run again.')
 11259           GOTO  98
 11260         54 WRITE(IOUERR,354)  RVALUE
 11261        354  FORMATC + ', 10X.G10.3,' average trips/day cannot be negative')
 11262           GOTO  98
 11263         55 WRITE(IOUERR,355)  RVALUE
 11264        355  FORMAT ('•»•', 10X.G10.3,' average miles/day cannot be negative')
 11265     '       GOTO  98
 11266         56 WRITE(IOUERR,356)
 11267        356 FORMATC ','Comment: A/C correction factor will be calculated.'
 11268           *    /'  ',T11,'Value of inputted AC usage  parameter is ignored.')
 11269            GOTO 99
 11270         57 WRITE(IOUERR,357)
 11271        357  FORMAT('+',10X,'WB temp cannot be greater than DB temp1)
 11272            GOTO 98
 11273         58 WRITE(IOUERR,358) RVALUE,IOBMSG
 11274        358 FORMAT('+',10X.G10.3,5A4,'altitude  (-200 to  10,000  ft.)')
 11275            GOTO 98
 11276         59 WRITE(IOUERR,359) IVALUE,(NEWPAR(lPAR,IVALUE),IPAR-1,3)
 11277        359 FORMATC ','Warning:  equation1,13,' zeroes all idle coefficients',
 11278           *   '  (and total)  for  IR=',I1,',  IV-1-,II,1,  IP-',I1)
 11279          .  GOTO 99
 11280         60 WRITE(IOUERR,360) RVALUE,INERR,NAMFNC(IVALUE)
 11281        360 FORMAT('•»•', 10X.G10.3,' default used for',IS/  in function',A8)
• 11282            GOTO 98
 11283         61  WRITE(IOUERR,361) INERR.NAMFNC(IVALUE)
 11284        361  FORMATC+ ' ,10X,'  default used  for',15,'  in  index function',AS)
 11285            GOTO 98
 11286         62 WRITE(IOUERR,362) IVALUE,IOBMSG
 11287        362 FORMAT('•••',10X, 14,5A4,'new e.f.  region (1,2,3  only)')
 11288            GOTO 98
 11289         63 WRITE(IOUERR,363) RVALUE,IOBMSG
 11290        363 FORMAT('+',10X,G10.3,5A4,'(0.  <-  PCHC+PCCC  <•  100.)')
 11291            GOTO 98
 11292  .       64 WRITE(IOUERR,364) RVALUE,IOBMSG

-------
                                                                             Page  13
11293       364 FORMATC + 1 ,10X.G10.3.5A4, ' (0.  <- PCHC+PCCC-PCCN <- 100.)')
11294           GOTO 98
11295        65 WRITE(IOUERR,365)  IVALUE
11296       365 FORMAT(' + ',10X,' MYR of LDDV not equal to LDGV for JDX-',I2)
11297           GOTO 98
11298        66 WRITE(IOUERR,366)  IVALUE
11299       366 FORMATC + 1 , 10X, ' MYR of LDDT not equal to LDGT1 for JDX-',I2)
1 1300           GOTO 98
11301        67 WRITE(IOUERR,367)  KAMVEH(IVALUE)
11302       367 FORMAT('+',10X,' EFFTP>0.  and GSF-0. for vehicle  ',A8)
11303   .        GOTO 98
11304        68 WRITE(IOUERR,368)  NAMVEH(lVALUE)
11305       368 FORMAT(' +',10X,' EFFTP<-0. and VKTMIX>0. for vehicle  ',A8)
11306           GOTO 98
11307        69 WRITE(IOUERR,369)  NAMVEH(IVALUE)
11308       369 FORMATC + ',10X,' EFIDLE>0. and GSF-0. for vehicle ' ,A8)
11309          •GOTO 98
11310        70 WRITE(IOUERR,370)  NAMVEH(IVALUE)
11311       370 FORMAT('+',10X,' EFIDLE<-0. and VKTMIX>0. for vehicle  ' ,A8)
11312  .         GOTO 98
11313        71 WRITE(IOUERR,371)  IOUREP,IOUERR,IOUASK  -
11314       371 FORMATC  ','Comment: Current output unit numbers  are',
11315          *    ' IOUREP-', 11,.'  IOUERR-',11, ' IOUASK-',11)
11316           GOTO 99
11317        72 WRITE(IOUERR,372)  IVALUE,IOBMSG
11318       372 FORMAT('+',10X,I4,5A4,'I/M vehicle type  (1  to 4)')
 1319           GOTO 98
 1320        73 WRITE(IOUERR,373) IVALUE,IOBMSG
 1321       373 FORMAT('+',10X,14,5A4,'short test type flag (1 to 3)')
 1322           GOTO 98
 1323        74 WRITE(IOUERR,374) IVALUE,IOBMSG
 1324       374 FORMAT('+',10X,I4,5A4,'new I/M data flag  (1 to 4)')
11325           GOTO 98
11326        75 WRITE(IOUERR,375) IVALUE,IOBMSG
11327       375 FORMAT('•*•', 10X, 14,5A4,'anti-tampering program  start  year')
11328           GOTO 98
11329        76 WRITE(IOUERR,376) IVALUE,IOBMSG  '
11330       376 FORMATC+',10X,I4.5A4,'anti-tampering program  1st model year')
11331           GOTO 98                  ...
11332        77 WRITE(IOUERR,377) IVALUE,IOBMSG
11333       377 FORMAT('+',10X,14,5A4,'anti-tampering program  last model year')
11334           GOTO 98
11335        78 WRITE(IOUERR,378) IVALUE,IOBMSG
11336       378 FORMATC + ', 10X.I4.5A4,'anti-tampering vehicle  type  (1  to 2)')
11337           GOTO 98
11338        79 WRITE(IOUERR,379) RVALUE,IOBMSG
11339       379 FORMAT('•*•', 10X.G10.3.5A4, 'evap  ATP  effectiveness  rate (0. to 1.)')
11340           GOTO 98
11341    .    80 WRITE(IOUERR,380) RVALUE,IOBMSG
11342       380 FORKAT('+',lOX,Gl0.3,5A4,'exh ATP effectiveness  rate (0. to 1.)')
11343           GOTO 98
11344        81 WRITE(IOUERR,381) RVALUE,IOBMSG
11345       381 FORMAT('+',10X,G10.3,5A4,'AER matrix file column  sum (0. to 1.)')
11346 '          GOTO 98
11347        82 WRITE(IOUERR,382) IVALUE,IOBMSG
11348       382 FORMAT('+',10X,I4,5A4,'1981+ vehicles cutpoints  flag (1 to 3)')
11349           GOTO 98                                      •
11350        83 WRITE(IOUERR,383) RVALUE,IOBMSG
11351     C

-------
                                                                             Page 14
11352     C  Use F,  not G,  format because PARSEC checfc of entered altitude aborts
11353     c  scenario if altitude < -200 or > 10000 feet (see QUITER message 58).
11354     C
11355       383 FORMAT('+ ',10X,F6.0,5A4,'altitude (region - 3 -> alt. < 1500.)')
11355.1          GOTO 98
11355.2       84 WRITE(IOUERR,384) IVALUE,IOBMSG
11355.3      384 FORMAT('+',10X,14,5A4,'I/M stringency for classes 1-3 only')
11355.4          GOTO 98                                                    .
11355.5       85 WRITE(IOUERR,385) IVALUE
11355.6      385 FORMAT (' + ',10X.I4,' is inappropriate first MYR for stringency')
11355.7          GOTO 98
11355.8       86 WRITE(IOUERR,386) IVALUE
11355.9      386 FORMAT('+',10X,14,' is inappropriate last MYR for stringency1)
11356     C                                  .
11357     C  Messages 60 and 61 produce excessive output if not stopped here.
11358     C
11359        98 IF(MCODE.EQ.1.OR.MCODE.EQ.2.0R.MCODE.EQ.53.0R.MCODE.EQ.60
11360          *                           .OR.MCODE.EQ.61) STOP
11361           INERR-INERR+1
11362     C
11363        99 RETURN
11364           END

-------
Page 15
40000
40000.09
40000. 18
40000.27
40001
40002
40003
40004
40005
40006
40007
40008
40009
40010
40011
40012
40013
40014
40015
40016 .
40017
40018
40019
40020
40021 •
40022
40023
40024
40025
40026
40027
40028
40029
A f\f\ ^ f*
40030
40031
40032
40033
40034
40035
40036
40037
40037.5
40038
40039
40040
40041
40042
40043
40044
40045
40046
40047
40048
40049
40050
40051
40052
40053
40054
FUNCTION PCLEFT(MY,ICY,IP,IV)
c
C This Subroutine has been modified to use multiple stringencies
-C
C
C PCLEFT determines the basic emission factor multiplicative adjustment
C ( • percentage left of BEF * PCLEFT ) for the effects of an inspection /
C maintanance (I/M) program, after checking whether or not I/M applies to
C factor being computed by the calling function.
C
C Called by BEF.
C
C Input on call:
C
C parameter list: MY, ICY, IP, IV
C common blocks:
C /FLAGS2/ IMFLAG
C /IMCR12/ CRED12
C /IMCR4P/ CRED4P
C /IMPAR1/ ICYIM,ISTRIN,IKTFLG,MODYR1,MODYR2
C /IKPAR2/ ILDT.ITEST.ICUTS
C
C Output on return:
C
C function: PCLEFT
C
C Local array subscripts:
C
C MYGIM(10,3) - MYGIM ( ITECH, IVIM )
C
C Local variable / array dictionary:
C
C Name Type . Description
C AGE 1ST I age of the vehicle at first inspection
C BY I benefit year for technology 1 or 2 vehicle
C IBY I benefit year for technology 4 plus vehicle







the




























C IREM I remainder - stringency - greatest multiple of 10 < stringency
C ISTRN I stringency index into technology 1 or 2 credits .array

C ITECH I -emissions control technology as f (model year, vehicle type)
C MYGIM I model year groups for I/M pollution control technologies
C NSTR . I local stringency for MYR/CLASS grouping
C REM R IREM converted to REAL value
C
C Notes:
C






C PCLEFT has been completely rewritten. Credits are now read in and stored
C as type REAL. Technology IV+ modeling is changed. For example, there are
.C 7 technology categories covered (4 thru 10) and IOPTN has been replaced
C IOPTN and ICUTS.
C -
C
INTEGER ALHFLG.ATPFLG
C
COMMON /FLAGS2/ MYMRFG , NEWFLG , IMFLAG, ALHFLG.ATPFLG
COMMON /IMCR12/ CRED12(19,20,5,2,2)
COMMON /IMCR4P/ CRED4P(19,2,7, 3, 3)
COMMON /IMPAR1/ ICYIM, ISTRIN, IMTFLG.MODYR1 ,MODYR2
COMMON /IMPAR2/ ILDT, ITEST, ICUTS, NUDATA.NLIM, IMNAME(20,9)
by











-------
40054.2
40054.5
40055
40056
40057
40058
40059
40060
40061
40062
40063
40064
40065
40066
40067
40068
40069
40070
40071
40072
40073
40074
40075
40076
40077
40078
40079
40080
40081
40082
40083
40084
4C085
40086
40087
40088
40089
40090
40091
40092
40093
40094
40095
40096
40097
40098
40099 •
40100
' 40101
40102
40103
40104
40105
40106
40107
40108
40109
40110
401 1 1


C

C
C
C
C

C
C

C

C

C
C
C

C
C
C






C
C
• c



C
c
c


c
c
c
c
c
c



c
c
c
c

c
c
c
c

                                                                Page 16
   COMMON /IOUCOM/ IOUAER,IOUIMD,IOUGEN,IOUREP,IOUERR.IOUASK
   COMMON /NEWTOO/ NEWSTR(4,100)

   INTEGER BY,IBY,AGE1ST,MYGIM(10,3)

ITECH - 4 does not occur for LDGT1/2 -> repeat last year (1983) of previous
my group -> value 4 will never be selected t>y technology search loop.

   DATA MYGIM/                              .   .
ITECH: 1     2     3     4     s     6     7     8     910
LDGV
  *  1974, 1979,  1980, 1981, 1982,  1983,  1984, 1986, 1989, 2020,
LDGT1
  *  1974, 1980,  1983, 1983, 1984,  1985,  1986, 1987, 1989, 2020,
LDGT2
  *  1978, 1980,  1983, 1983, 1984,  1985, 1986, 1987, 1989, 2020/

Initialize PCLEFT to  "no reduction" value -  1.0.

   PCLEFT -1.0

If factor being calculated  by BEF is not covered by  I/M, then  RETURN.

   IF(IMFLAG.EQ.1.OR.IP.EQ.3.0R.IV.GT.3.0R.
  *   (IV.GT.1.AND.ILDT.EQ.1).OR.
  *   (IV.EQ.3.AND.ILDT.EQ.2).OR.
  *   (IV.EQ.2.AND.ILDT.EQ.3).OR.
  *    ICY.EQ.MY.OR.ICY.LE.ICYIM.OR.
  *    MY.LT.MODYR1.0R.MY.GT.MODYR2) GOTO 99

Find the benefit  year:  •       •

   BY=ICY-ICYIM
   IF(MY.GT.ICYIM) BY-ICY-MY
   IF(BY.GT.19)  BY-19

Find the age  of  the vehicle at first inspection.

   AGE1ST=1
   IF(MY.LT.ICYIM) AGE1ST-ICYIM-MY-M

Determine technology  by model year  and vehicle type.  Note that because
MYGIM(10,IV)  =  2020 for IV-1,2,3  -  ICY upper bound (see PARSEC),  a match in
the technology  serch  loop  has to  occur.  As  with all the my index arrays in
MOBILES,  insure  in any my  changes that 2020  remains a my group upper bound.

   DO  10  ITECH-1,10
   IF(MY.LE.MYGIM(ITECH,IV)) GOTO 20
 10 CONTINUE

Technology 3  does not exist as a  separate  category in the credits arrays.
The percent reduction for  technology 3 - that for technology 2.

20 IF (ITECH.EQ.3) ITECH-2

Select correct  I/M credits for TECH 1  & 2.
Interpolate between  10,20,30,40 & 302  stringency.

   IF(ITECH.GT.2) GOTO 40

-------
Page 17
4011 1 .05
40 1 1 1 . 1
40111 . 15
40111.2
40111.25
40111 .3
40111.35
40111.4
401 1.45
401 1.5
401 1.55
401 1.6
401 1.65
40111.7
40111.75
4011 1 .8
40111.85
40111.9
40113
40114
•40115
40116
40117
40118
40119
40120
40121
40122
40123
40124
40125
40126
40127
40128
40129
40130
40131
40132
40133
40134
40135
40136
40137
40138
40139
40140
40141
40142
40143
40144
40145
40146
40147
40148
40149
40150
40151
40152
40153
40154
40155
C
C
C








C
C
C



C



C
C
C





. C
C
C




C
C
C
C
C
C
C
C
C
C
C
C
.C
C
C

C

C
C
C

C



Determine which stringency to use for this MYR/CLASS grouping

NSTR " 0
DO 21 IM-1.ISTRIN
NMYF - NEWSTR(2,IM)
NMYL - NEWSTR(3,IM)
IF(MY.GE. NMYF. AND.
* MY. LE. NMYL. AND.
* IV.EQ.NEWSTR(1,IM)) NSTR - NEWSTR(4,IM)
21 CONTINUE

Check for missing stringencies

IF(NSTR.LE.O.AND.IP.EQ.l) WRITE (IOUERR, 12 1) MY, IV, NSTR
121 FORMAT (' Warning: I/M stringency for ',14,' class ',11,' - ',12)
IF(NSTR.LT.IO) GOTO 99

22 IREM-NSTR-(NSTR/10)*10
REM-IREM*. 1
I STRN- (NSTR- IREM) / 1 0

Without mechanic training

IF(IMTFLG.EQ.2) GOTO 30
PCRED-CRED 1 2 (BY , AGE 1 ST , ISTRN , ITECH , IP)
IF (ISTRN . LT . 5 . AND . IREM . GT . 0) PCRED-
* (CRED 1 2 (BY , AGE 1 ST , ISTRN+ 1 , ITECH , IP) -PCRED) *REM+PCRED
GOTO 50

With mechanic training

30 PCRED-CRED 1 2 (20-BY, 21 -AGE 1ST, ISTRN, ITECH, IP)
IF(ISTRN.LT.5.AND.IREM.GT.O) PCRED-
* (CRED 1 2 (20-BY , 2 1 -AGE 1 ST , ISTRN+ 1 , ITECH , IP) -PCRED) *REM+PCRED
GOTO 50

Select I/M credits for TECH 4-10 vehicles.

ITEST - 1 idle test
2 2500 rpm idle test
. 3 loaded test

ICUTS - 1 0.52 ICO./ 100 ppm IHC
2 1.2% ICO / 220 ppm IHC
3 3.02 ICO / 300 ppm IHC


IP-i (HC emissions)
IP-2 (CO emissions)

40 IBY - BY + AGE 1ST - 1

PCRED-CRED4P (IBY , IP , ITECH-3 , ICUTS , ITEST)

Set I/M benefit.

50 PCLEFT -1.0- PCRED

99 RETURN
END

-------
Page 18
62000
62000.3
62000.6
62001
62002
62003
62004
62005
62006
62007
62008
62009
62010
62011
62012
62013
62014
62015
62016
62017
62018
62019
62020
62021
62022
62023
C*5 rt"} A
62024
62025
62026
62027
62028
62029
62030
62031
62032
62033
62034
62035
62036
62037
62038
62039
62040
62041
62042
62043
62044
62044.5
62045
62046
62047
62048
62049
62050
62051
62052
62053
62054
62055

C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
C
• C
C
C
C
C
C
C
C
C
C
C
C
C





C


C






SUBROUTINE OUTIMP

This Subroutine has been modified to use multiple stringencies

OUTIMP prints the I/M program parameters and the alternate I/M credits
set name, if it was entered.

Called by OUTHD3 and OUTHD4.

Input on call:

common blocfcs:
/IMPAR1/ ICYIM,ISTRIN,IMTFLG,MODYR1,MODYR2
/ IMPAR2/ ILDT , ITEST , ICUTS , NLIM , IMNAKE
/IOUCOM/ IOUREP
/STRING/ NOYES, COMMA

Local array subscripts:

CUTCO(3) - CUTCO ( ICUTS )
CUTHC (3) ~ CUTHC ( ICUTS )
TTYPE (4, 3) - TTYPE ( ICH, ITEST )

Local variable / array dictionary:

Name Type Description
CUTCO R labels for testing cuts for CO, in percents
CUTHC R labels for testing cuts for HC, in ppm IHC
ICO I ICO label
LDGT I LDGT label
LDGV I LDGV label
ONE R number 1 as character
PPKIHC R*8 ppm IHC label
SLASH R character '/'
TTYPE R test type description
TWO R number 2 as character

Notes:

Output formats were updated to reflect new I/M methodology, including
replacing IOPTN with ITEST and ICUTS.


COMMON /IMPAR1/ ICYIM, ISTRIN, IMTFLG.MODYR1 ,MODYR2
. COMMON /IMPAR2/ ILDT, ITEST, ICUTS, NUDATA, NLIM, IMNAME (20, 9)
COMMON /IOUCOM/ IOUAER, IOUIMD, IOUGEN, IOUREP, IOUERR, IOUASK
COMMON /NEWTOO/ NEWSTR (4 , 1 00)
COMMON /STRING/ NOYES (2) .COMMA, PERIOD

DIMENSION TTYPE(4,3) ,CUTCO(3) ,CUTHC(3)
REAL*8 PPMIHC

DATA LDGV, LDGT, ONE, TWO /' LDGV1, 'LDGT' , 'l ','2 '/
DATA TTYPE/ ' Idle ' , ' ' , ' ' , ' ' ,
2 '2500',' rpm1,1 / I', 'die ',
3 'Load'.'ed /',' Idl'.'e '/
DATA CUTCO/ ' 0. 5% ' , ' 1 . 2X ' , ' 3 . 0'i ' / , ICO/ ' ICO ' /
DATA SLASH/' / '/

-------
Page 19
62056
62057
62058
62059
62060
62061
62062
62063
62054
62065
62066
62067
62068
62069
62070
62071
62072
62073
62074
62075 .
62076
62076. 1
62076.2
62076.3
62076.4
62076.5
62076.6
62076.7
62076.8
62076.9
62077
62078
62079
62080
62081
62082
62083
62084
62085
62086
62087
DATA CUTHC/1 100',' 220',' 300' /.PPMIHC/' ppm IHC'/
C
WRITE (IOUREP, 200) ICYIM, ISTRIN.NOYES(lMTFLG) .MODYR1 .MODYR2
200 FORMATCo1 , 'I/M program selected:'/
* '0',' Start year (January 1): ',I4/
* ' ',' Number of input stringencies: ',I2,/
* ' ',' Mechanic training program?: ",A4/
* ' ',' First model year covered: ',I4/
* ' ',' Last model year covered: .',14)
C ;
IF (ILDT. EQ. 1) WRITE (IOUREP, 2 10) LDGV
IF(ILDT.EQ.2)WRITE(IOUREP,210) LDGV , COMMA , LDGT , ONE
IF(ILDT.EQ.3)WRITE(IOUREP,210) LDGV , COMMA , LDGT , TWO
IF (ILDT. EQ. 4) WRITE (IOUREP, 2 10) LDGV , COMMA , LDGT , ONE , COMMA , LDGT , TWO
210 FORMAT (' ',' Vehicle types covered: ',
* A4,A2,A4,A1,A2,A4,A1)
C
WRITE (IOUREP, 220) (TTYPE(lCH, ITEST) , ICH-1 ,4) ,
* CUTCO(ICUTS) , ICO, SLASH, CUTHC(ICUTS) , PPMIHC
220 FORMATC ',' 1981 & later MYR test type: ' ,4A4/
* ' ',' 1981 & later MYR test cutpoints: ' ,2A4,A2,A4,A8)
C
C Output of stringencies input
C
WRITE (IOUREP, 230)
DO 21 IM-1.ISTRIN
WRITE (IOUREP, 221) (NEWSTR(J, IM) , J-1 ,4)
221 FORMATC Vehicle Class ',11,' - Model Years ',14,' through ',
*I4,' use ',12, "i Stringency')
21 CONTINUE
C
IF(NLIM.EQ.O) GOTO 99
WRITE (IOUREP, 2 30).
230 FORMATC ')
DO 10 LINES- 1.NLIM
WRITE (IOUREP, 2 40) (IMNAME(N, LINES) ,N-1 ,20)
240 FORMATC ' ,20A4)
10 CONTINUE
C
99 RETURN
END

-------