1
2
3      SUBROUTINE VRTCBL(HE1,HE2,SZ1,SZ2,FACT)
4!***********************************************************************
5!        VRTCBL Module of the AMS/EPA Regulatory Model - AERMOD
6!
7!        PURPOSE: Calculates Vertical Term for Use in Bi-Gaussian Plume
8!                 Equation for Unstable (Convective) Conditions.
9!                 Skewness of the plume is treated
10!                 using two Gaussian plumes.  Revised from VRTCBL as
11!                 programmed by Roger Brode, September 30, 1993.
12!
13!        PROGRAMMERS: Roger Brode, Russ Lee
14!
15!        DATE:    July 20, 1994
16!
17!        MODIFIED BY R.W. Brode, PES, Inc. to adjust HE and ZI for cases
18!                 with receptors below stack base (ZR < 0) - 12/26/00
19!
20!        MODIFIED BY R.W. Brode, PES, Inc. to set vertical term to 0.0
21!                 for cases when receptor is above mixing height - 1/22/98
22!
23!        INPUTS:  Plume 1 Height (arg), HE1
24!                 Plume 2 Height (arg), HE2
25!                 Vertical Dispersion Parameter (Plume 1), SZ1
26!                 Vertical Dispersion Parameter (Plume 2), SZ2
27!                 Factor to distinguish between direct
28!                    and indirect plumes, FACT =  1.0 for Direct Plume
29!                                         FACT = -1.0 for Indirect Plume
30!                 Mixing Height, ZI
31!                 Receptor Height, ZR
32!
33!        OUTPUTS: Vertical Term, FSUBZ
34!
35!        ASSUMPTIONS:   Vertical term for UNSTAB plumes includes
36!                       one-half of reflection terms corresponding
37!                       to the updraft portion of the plume.  Plume
38!                       heights and sigma-z's are passed as arguments.
39!
40!        CALLED FROM:   WRAP, LIFT
41!***********************************************************************
42
43!     Variable Declarations
44      USE MAIN1
45      IMPLICIT NONE
46      CHARACTER MODNAM*12
47      INTEGER :: I
48      REAL :: HE1 , HE2 , SZ1 , SZ2 , FACT , SZARG , HEARG1 , HEARG2 ,  &
49     &        A1 , A2 , A3 , A4 , TWOIZI , SUM , T1 , T2 , TERM , V
50      REAL :: HE1TMP , HE2TMP , ZITMP
51
52      SAVE
53
54!     Variable Initializations
55      MODNAM = 'VRTCBL'                                                 !7278396
56      V = 0.0
57
58      IF ( ZR.EQ.0.0 ) THEN
59!        Vertical Term for Case With FLAT Terrain and No Flagpole
60!        Receptor (ZR = 0.0)
61         SUM = 0.0                                                      !7278396
62
63         DO I = 0 , 1000
64            T1 = 0.0                                                    ! 16119K
65            T2 = 0.0
66            TWOIZI = 2.*I*ZI*FACT
67!           Check for FACT < 0 and skip first term.
68            IF ( FACT.LT.0. .AND. I.EQ.0 ) GOTO 50
69
70            HEARG1 = TWOIZI + HE1                                       ! 12480K
71            HEARG2 = TWOIZI + HE2
72            A1 = (-0.5/(SZ1*SZ1))*(HEARG1)*(HEARG1)
73            IF ( A1.GT.EXPLIM ) T1 = EXP(A1)
74            A2 = (-0.5/(SZ2*SZ2))*(HEARG2)*(HEARG2)
75            IF ( A2.GT.EXPLIM ) T2 = EXP(A2)
76
77!           Sum the Plume 1 and Plume 2 Portions
78            TERM = (LAMDA1/SZ1)*T1 + (LAMDA2/SZ2)*T2
79            SUM = SUM + TERM
80
81!           Check for Convergence of Summation Term
82!              Exit Loop
83            IF ( ABS(TERM).LE.5.0E-7*ABS(SUM) ) GOTO 100
84
85 50      ENDDO
86
87!        Calculate Total Vert. Term - (2.*) was Removed for Optimization
88 100     V = 2.*SUM                                                     !7278396
89
90      ELSEIF ( ZR.LE.ZI ) THEN
91!        Vertical Term for Case of ZR .NE. 0.0
92!        First adjust for terrain below stack base with ZR < 0,
93!        by keeping HE and ZI horizontal.
94         HE1TMP = MAX(HE1,HE1-ZR)                                       !      0
95         HE2TMP = MAX(HE2,HE2-ZR)
96         ZITMP = MAX(ZI,ZI-ZR)
97
98         SUM = 0.0
99
100         DO I = 0 , 1000
101            T1 = 0.0                                                    !      0
102            T2 = 0.0
103            TWOIZI = 2.*I*ZITMP*FACT
104!           Check for FACT < 0 and skip first term.
105            IF ( FACT.LT.0. .AND. I.EQ.0 ) GOTO 150
106!
107!      Note:  The following code can be used for the indirect plume
108!      as well as the direct plume, since HEn, for the indirect plume,
109!      already contains ZI, and thus represents the first "reflection"
110!      off the top of the mixed layer.
111!
112            HEARG1 = TWOIZI + HE1TMP                                    !      0
113            HEARG2 = TWOIZI + HE2TMP
114            A1 = (-0.5/(SZ1*SZ1))*(ZR-(HEARG1))*(ZR-(HEARG1))
115            A2 = (-0.5/(SZ1*SZ1))*(ZR+(HEARG1))*(ZR+(HEARG1))
116            IF ( A1.GT.EXPLIM ) T1 = EXP(A1)
117            IF ( A2.GT.EXPLIM ) T1 = T1 + EXP(A2)
118            A3 = (-0.5/(SZ2*SZ2))*(ZR-(HEARG2))*(ZR-(HEARG2))
119            A4 = (-0.5/(SZ2*SZ2))*(ZR+(HEARG2))*(ZR+(HEARG2))
120            IF ( A3.GT.EXPLIM ) T2 = EXP(A3)
121            IF ( A4.GT.EXPLIM ) T2 = T2 + EXP(A4)
122
123!           Sum the Plume 1 and Plume 2 Portions
124            TERM = (LAMDA1/SZ1)*T1 + (LAMDA2/SZ2)*T2
125            SUM = SUM + TERM
126
127!           Check for Convergence of Summation Term
128!              Exit Loop
129            IF ( ABS(TERM).LE.1.0E-6*ABS(SUM) ) GOTO 200
130
131 150     ENDDO
132
133 200     V = SUM                                                        !      0
134
135      ELSE
136!        Receptor is above mixing height, set V=0.
137         V = 0.0                                                        !      0
138
139      ENDIF
140
141!     Calculate FSUBZ from V;  FSUBZ = V / SQRT(2*PI)
142!     (Note that 1/SZ term is included in V)
143      FSUBZ = V/SRT2PI                                                  !7278396
144
145      CONTINUE
146      END


HyperKWIC - Version 1.00DD executed at 20:00 on 1 Mar 2018 | Personal or Academic or Evaluation User | Free for Non-Commercial, Non-Government Use