PROJECT FINAL REPORT – Spring 2002 DSES-6620 Scott Munro

advertisement
PROJECT FINAL REPORT
DSES-6620 – Spring 2002
Scott Munro
1.0 Overview
Instrument approach equipment and procedures allow aircraft to make safe
landings in weather conditions that would preclude such a landing using visual
references only (i.e. flying by “looking out the window”). An airport may have one
or more instrument approaches associated with it. A “non-precision” approach
employs a non-directional radio beacon (NDB) or VHF Omni-Directional Range
(VOR) system to provide positive and accurate course during the approach, and
may possibly employ Distance Measuring Equipment (DME) to provide range
information. A “precision approach” will typically employ an Instrument Landing
System (ILS). The ILS includes a localizer to provide highly accurate course
guidance, in conjunction with an electronic glide slope to control descent.
Additionally, outer and middle marker beacons provide the pilot with positional
information during the descent. Precision approach equipment will allow the pilot
to land with lower ceilings and visibility limits than allowed by the non-precision
approach system.
The method in which precision or non-precision approach equipment is used for
an instrument landing is described by the “approach procedure”, graphically
depicted in an approach plate (ref. Figure 1 and 2). The approach procedure
includes parameters such as approach fixes, reporting points, minimum safe
altitudes, missed approach procedures, and communications frequencies.
The project described herein entails the simulation of traffic at a small
commercial airport, with the intent of assessing the benefit of implementing a
precision instrument approach procedure in addition to and existing nonprecision approach. Airport operations during varying weather conditions are
limited by available approaches to a given runway. Minimum ceiling, visibility,
and aircraft approach category limits specified for an instrument approach dictate
whether or not a landing can be made IFR weather conditions. While use of
precision instrument approach systems are desirable in that they allow landings
in weather which might otherwise result in flight delays and possible diversion to
alternate airports, they represent a significant capital investment by the airport
operator.
2.0 Problem Description
The airport configuration shall be notionally similar to Tweed New Haven. The
baseline airport will consist of a single runway served by a single non-precision
VOR approach procedure. The procedure is shown below in Figure 1a and 1b.
Figure 1a – Non-precision VOR Approach
Figure 1b – Non-precision VOR Approach
Figure 2a – Precision ILS Approach
Figure 2b – Precision ILS Approach
For the purposes of the simulation, the important components of the approach
are:



the initial approach fix at 5.0 nm out from the New Haven VOR, identified
on the plate as PONDS.
the missed approach point - 0.4 nm from the New Haven VOR.
the missed approach procedure – climbing right turn to 2000 feet, then
direct to Madison VOR and hold as published.
Minimum weather conditions required for this approach are:


Visibility greater or equal to 1 mile.
Minimum descent altitude of 380 feet above sea level (altitude at which
runway environment must be in sight to continue with landing).
The modified configuration of the airport employs a precision Instrument Landing
System (ILS) approach procedure. The procedure is shown above in Figure 2a
and 2b.
The relevant components of the approach are:



the initial approach fix, interception of glide slope at 1500 feet, 5.5 nm out
from the New Haven ILS, identified on the plate as SALLT.
the missed approach condition - descent to decision height
the missed approach procedure – climbing right turn to 2000 feet, then
direct to Madison VOR and hold as published.
Minimums for this approach are:


Visibility greater of equal to ¾ mile
Minimum descent altitude of 257 feet above sea level (altitude at which
runway environment must be in sight to continue with landing).
It shall be assumed that all landings are straight in, and all instrument approach
equipment, including glide-slope, localizer, airport lighting system and RAIL, are
operational. Additionally, arriving commercial traffic will fall within approach
category A, B, or C (these approach categories are a function of aircraft stall
speed). The assumptions are made so that minimums for a given approach do
no change during the simulation. Additionally, the simulation will not consider the
impact of departing aircraft on the availability of the runway for arrivals. The
details of each approach shall be described in the section on methodology below.
3.0 Objective
The objective of the modeling effort is to quantify the benefit derived from
implementation of the additional precision ILS approach. In order to accomplish
this, both the non-precision VOR and precision ILS approach must be modeled.
The goal is to determine the following measures of merit for each approach type
under realistic operating conditions:



Average number of landings per hour (runway utilization)
Average number of diversions to an alternate airport due to weather, per
hour
Average delay in minutes due to weather, per aircraft
4.0 Methodology
In order to provide a reasonable level of fidelity in predicting airport performance,
the model must consider each of the following elements:
Element
Impact
Approach Procedure
Time and weather required to
successfully execute the approach.
Time required to execute the missed
approach procedure.
Air Traffic Control
Minimum separation between aircraft,
and aircraft arrival rate.
Federal Aviation Regulations
Fuel on board for each aircraft on an
instrument flight plan.
Weather
Current ceilings, visibility, and winds at
any given time during the simulation.
Aircraft Performance
Approach speeds, landing distances
and maximum crosswind limits for
landing.
Each of these elements and their instantiation in the model are described in
detail below.
4.1 Weather
Over 10,000 hours of weather observation data was used in the model. This data
was obtained from the US National Climatic Data Center in the form of Surface
Weather Observations from the Bridgeport reporting station. This data consists of
hourly recordings of meteorological conditions including ceilings, visibility,
surface wind speed, direction, and variability. A sample record for a single hour’s
observation is shown below in Figure 3.
Figure 3 – Sample Surface Weather Observation
The elements of importance for the simulation are the local standard time of a
given record, wind direction, wind speed in knots, surface visibility in fractional
miles, present weather notation, and ceilings. The present weather and ceiling
data is encoded. The encoded “present weather” data includes local surface
conditions. For example, “-SN” means light snow; “FG” means fog. The encoded
ceiling data includes coverage and height. “BKN005 OVC015” would indicate a
broken ceiling at five hundred feet, and an overcast ceiling at fifteen hundred
feet.
Due to the nature of weather, it is probably ill advised to attempt and represent it
as a statistical distribution (an unsuccessful attempt was made to do this using
Stat::Fit). Climatic conditions for a given hour have some dependence on the
conditions of the preceding hour. Stated differently, if we have fog and ½ mile
visibility at 1200 hours, it is unlikely that we will have clear air and unlimited
visibility at 1300 hours. Accordingly, a decision was made that the weather data
would be “played back” for the purposes of the simulation. Specifically, for any
given hour of the simulation, the corresponding weather record for that hour was
looked up from a large array of weather data.
To accomplish this, an application was written called “weather.exe” which parsed
10714 hours of weather data, decoded the ceilings and other pertinent
meteorological condition, and formatted it into a tab delimited database. The
database records are ordered by observation hour, and contain the current wind
direction and velocity, visibility, and lowest significant ceiling which would impact
an approach. This database was then converted to an Excel spreadsheet, which
was then imported into an Array within ProModel. The source code for
weather.exe may be found in Appendix A.
4.3 Air Traffic Control
Air Traffic Control (ATC) is responsible for providing separation between all
aircraft operating under and instrument flight plan. Within 40 miles of a radar
facility, this separation is specified to be 3 miles laterally, and 500 feet vertically.
In the model, vertical separation is implied (ie. not explicitly enforced). Lateral
separation is maintained by dividing all routes within the model into a series of “3
mile long” queues with a capacity of one. This ensures that aircraft entity in the
simulation maintain proper separation. Transit time through the queue is based
on aircraft cruise and approach speed for the given segment.
4.4 Federal Aviation Regulations (FAR)
FAR Part 91.167 requires that aircraft operating on an IFR flight plan carry
enough fuel to fly to the destination airport, fly from that airport to an alternate
airport, and after that fly for an additional 45 minutes. Therefor, for the purposes
of the model, an assumption is made that aircraft will hold for a maximum of 45
minutes due to below minimums weather before they divert to an alternate
airport. To accomplish this, a “FuelRemaining” attribute is created and assigned
to each aircraft entity with an initial value of 45. During a hold, this value is
reduced by one for each minute of simulation time. When fuel remaining equals
zero, the aircraft will divert to the alternate (and exit the simulation).
4.6 Aircraft Performance
The three components of aircraft performance that are relevant to the model are
approach speed, cruise speed, and landing ground roll. These elements, in
conjunction with approach segment lengths and winds, will allow us to determine
the transit time for each approach segment of the model. For the purposes of the
model, only a single aircraft type is considered. This is a Piper PA-28 and is a
relatively common type of single engine general aviation aircraft (The Tweed
New Haven Fixed Base Operator has a number of these). The following speeds
are relevant to PA-28 operations and used in the model:



Approach Speed
Final Approach Speed
Cruise Speed (airport area)
: 70 Knots Indicated Airspeed (KIAS)
: 63 KIAS
: 90 KIAS
Landing ground roll is a bit more complicated, as it is a function of outside air
temperature, pressure altitude and current runway head wind. The landing
performance chart for the PA-28 is shown in Figure 4. This chart, in conjunction
with the assumption of sea-level standard conditions and the current head winds
as determined from the weather database are used to determine ground roll. The
ground roll, coupled with the average speed on the runway (from touchdown to
full-stop) is then used to determine the Runway Obstruction Time (ROT) for each
aircraft landing.
Figure 4 – Landing Performance for PA-28
Aircraft performance also governs the maximum allowable crosswinds. If the
crosswind due to the current weather conditions is beyond this maximum, the
aircraft must hold and wait for them to decrease. The maximum allowable
crosswind used for the PA-28 is 14 knots.
4.7 Approach Procedure
For the purposes of the simulation, the aircraft arrive at the initial approach fix;
aircraft activity prior to the initial approach fix is not considered. If the ceiling or
visibility are below limits for the specific approach, the arriving aircraft are routed
directly to the Madison VOR to hold for appropriate weather. If the weather is
within limits, the aircraft begins the approach to the missed approach point. If the
weather changes during the approach such that it is out of limits, a missed
approach must be executed and the aircraft proceeds to the Madison VOR to
hold. Otherwise, it completes the landing and exits the simulation. Aircraft holding
at the Madison VOR will be sequentially routed back to the initial approach fix if
the weather improves to within landing limits.
5.0 Model Description
The ProModel simulation of the airport is show below in Figure 5. The same
model is show again in Figure 6 with the graphics removed to allow better
understanding of each of the models functional components.
Figure 5 – Runtime View of ProModel Airport Simulation
Each of the models components will now be described in turn to illustrate its
operation.
5.1 Entities
The model employs only a single entity, which is the PA-28 aircraft. Each entity
has an attribute named FuelRemaining which is assigned an initial value of 45
minutes. This value is reduced by one for each minute the aircraft may hold
awaiting acceptable weather minimums for the approach being modeled.
5.2 Arrivals
Aircraft arrive at the initial approach fix, PONDS. Since the model is intended to
investigate maximum airport capacity, the arrival rate is fixed at a maximum
frequency of four minutes, based on the assumption that there is only one aircraft
an on final approach at a time.
Figure 6 – View of ProModel Airport Simulation with Background Graphics Removed and
Locations Labelled
5.3 Locations and Processing
Please refer to Figure 6 for locations described in the following section.
5.3.1 PONDS – The Initial Approach Fix
PONDS is the arrival point for aircraft entities and the initial approach fix for the
runway. Upon entry to PONDS, the simulation calls the subroutine
UpdateWeather(). This subroutine reads the appropriate record from the weather
array for the current simulation time. It uses the weather data to set the following
global variables:
Visibility_Current
Wind_Dir_Current
Wind_Vel_Current
Ceiling_Current
: The current visibility in fractional miles
: The current wind direction in degrees
: The current wind velocity in kts
: The current ceiling in hundreds of feet
Crosswind_Current : The current crosswind velocity component in kts
V_Headwind
: The current headwind velocity in kts
UpdateWeather() calls a number of subroutines as part of its processing.
UpdateWindComponents() calculates the wind vector components parallel and
perpendicular to the runway heading (headwind and crosswind components).
Additionally, the trigonometric subroutines sin() and cos() where created due to
the fact that ProModel lacks these functions (sin and cos were implemented as
Taylor series expansions).
After the call to UpdateWeather(), the current weather global variable values are
examined to see if they are less than the current requirements for the approach
being modeled. Specifically, Visibility_Current and Ceiling_Current must be
greater than the approach minimums, and the Crosswind_Current must be less
than the maximum allowable for the aircraft type being modeled. Note: in order to
alter the minimums for the appropriate precision or non-precision approach
values, they were implemented as the following macros:
Visibility_Min
Ceiling_Min
Crosswind_Max
: Min. visibility for the specific approach in miles
: Min. ceiling for the specific approach in 100’s of feet
: Max. allowable crosswind for aircraft type in kts
If the approach requirements are met, the aircraft entity is routed onto the first
approach segment, “AproachSeg1”. Otherwise, it is routed to the Madison VOR
to hold awaiting acceptable weather.
5.3.2 ApproachSeg1 and ApproachSeg2 – The Approach Segment
The total length of the approach is 4.6 nm. In order to ensure proper IFR
separation of aircraft entities, it is broken into two queues of capacity one. The
first segment, ApproachSeg1, is conceptually 3 nm. The second segment,
ApproachSeg2, is 1.6 nm. Since movement through the queue is expressed in
time and not distance, we must calculate the appropriate value. As previously
stated, the approach velocity of the aircraft entity is 70 nm/hr. The maximum
allowable speed deviation during instrument flight procedures is 5% or 10 knots,
whichever is greater (in this case 10 knots). This implies a triangular distribution
of possible times to complete each approach segment as follows:
ApproachSeg1
Minimum time = (3 nm / (70 kts – 10 kts)) * 60 min/hr = 3.0 min
Mode time = (3 nm / 70 kts) * 60 min/hr = 2.6 min
Maximum time = (3nm / (70 kts + 10 kts)) * 60 min/hr = 2.3 min
This is implemented in the location processing as:
MOVE FOR T(2.3,2.6,3.0)
ApproachSeg2
In a similar manner as described for ApproachSeg2, which is 1.6 nm in length,
the following movement is defined:
MOVE FOR T(1.2,1.4,1.6)
5.3.3 HVN – The Missed Approach Point
During a real approach, the pilot must have the runway environment in sight by
the missed approach point. If not, he must execute the missed approach
procedure. The missed approach point is designated as location HVN in the
model. At HVN, the subroutine UpdateWeather() is called to see if there has
been a change in weather that occurred during the preceding approach segment.
If there has, and the minimums are no longer acceptable for the approach, the
aircraft will be routed onto the missed approach segment “MAP Seg1”.
Otherwise, it continues with the landing.
5.3.4 Rwy2 – The Landing
The landing consists of the final descent and flare, ground roll, and exit from the
runway onto a taxiway. For the VOR approach, the final descent is 400 ft at 500
ft/min or 0.8 minutes. The ground roll is determined via the landing performance
chart in Figure 4 and is a function of headwind. The nominal touchdown speed is
63 knots, with a variation of 5 knots (based on the author’s experience in this
aircraft). Assuming a full stop landing, the average velocities on the runway are:
Maximum: [(65 kts + 5kts) + 0kts]/2 = 34 kt = 3446 ft/min
Mode: [65 kts + 0kts]/2 = 32 kt = 3242 ft/min
Minimum: [(65 kts – 5 kts) – 0 kts]/2 = 29 kt = 2939 ft/min
The ground roll distance at sea-level standard conditions, 2325 lbs gross weight
is:
450 ft with a 15 knot headwind
750 ft with a 5 kt tailwind
These ground rolls and average runway speeds can be combined to determine
ground roll time as follows:
a. with 15 kt headwind:
Maximum: 450 ft / 3446 ft/min = 0.13 min
Mode: 450 ft / 3242 ft/min = 0.14 min
Minimum: 450 ft / 2939 ft/min = 0.15 min
b. With 5 knot tailwind:
Maximum: 750 ft / 3446 ft/min = 0.22 min
Mode: 750 ft / 3242 ft/min = 0.23 min
Minimum: 750 ft / 2939 ft/min = 0.26 min
The information in items a. and b. above can be used to interpolate a given
maximum, mode, and minimum ground roll time as a function of headwind. This
has been accomplished in the model via the subroutines:
InterpMaxRoll()
InterpModeRoll()
InterpMinRoll()
Each of these subroutines takes the current headwind as an argument and
returns the appropriate ground roll time. The final piece of information required is
the time to exit the runway, which is specified at 30 seconds (again based on
experience). The descent time of 0.8 minutes and runway exit time of 0.5
minutes are added to the ground roll time in the interpolation subroutines. The
final triangular distribution for runway obstruction time becomes:
MOVE FOR T(InterpMinRoll(),InterpModeRoll(),InterpMaxRoll())
After completion of the movement along the runway, aircraft entities exit the
simulation.
5.3.5 MAP_Seg1, MAP_Seg2, MAP_Seg3 – The Missed Approach Segment
The missed approach segment consists of the distance from the missed
approach point to the hold at Madison VOR. This is measured from the
appropriate Low Altitude Enroute Chart and is approximately 9 nm. This is
broken into three separate 3-mile long segments to ensure proper IFR separation
of aircraft. The average cruise speed during the missed approach is 90 kts, 10
kts. In an analogous manner to section 5.3.2, the triangular distribution for each
segment is:
MOVE FOR T(1.8,2.0,2.3)
5.3.6 MAD – The Holding Pattern at Madison VOR
Aircraft entities hold at the Madison VOR location awaiting acceptable weather
for landing, or to run low on fuel and therefore divert to an alternate airport. In
reality, aircraft hold by flying a racetrack pattern off one of the VOR radials, with
multiple aircraft separated by altitude (this is often called “the stack”). For the
purposes of the simulation, the hold is simply modeled as a queue of infinite
capacity. Note: clearly, an infinite number of aircraft cannot hold at a VOR with a
finite amount of vertical airspace. In practice, ATC may vector aircraft to multiple
holding locations, divert aircraft to alternate airports, etc. This is beyond the
scope of the current model and is the simplifying assumption of infinite capacity
was made. In addition, during the actual running of the model, the average queue
contents were observed to remain reasonable.
Aircraft holding at the MAD location check the updated weather in 1-minute
intervals. At each interval, the aircraft entity’s FuelRemaining attribute is reduced
by on minute. If the weather changes such that approach limits are met, the
aircraft are routed onto the return segment to attempt a landing. Otherwise, if the
fuel remaining is exhausted (FuelRemaining=0), they are routed onto the Divert
segment and are routed to the alternate airport.
5.3.7 Return_Seg1, Return_Seg2, Return_Seg3, Return_Seg4 – The Return
Segment
If weather conditions return to acceptable approach minimums, holding aircraft
with sufficient fuel return to the initial approach fix PONDS via the return
segment. A direct return from the hold at MAD to the initial approach fix was
measured from the Low Altitude Enroute Chart at approximately 12 nm. To
maintain IFR aircraft separation, the route is divided into four separate 3-mile
long segments of capacity one. Assuming the same average velocities as in the
missed approach segment, the time to transit each return segment is:
MOVE FOR T(1.8,2.0,2.3)
5.3.8 Divert – The Divert to Alternate Airport Segment
If aircraft exhaust their fuel allotted for holding without acceptable weather
minimums, they are diverted to their “alternate airport” by being routed onto the
Divert segment. Aircraft move along this segment of two minutes and then exit
the simulation.
6.0 Model Verification and Validation
In order to verify that the model logic operated correctly, a dummy weather file
was created to force certain conditions to exist and observe that aircraft entities
behaved as desired. Specifically, the following conditions were modeled:
Condition
Behavior
Weather always within
approach mimimums
All aircraft proceed from initial approach fix to
the runway.
Visibility always below
approach minimums.
All aircraft are routed to hold at MAD, and
eventually divert to the alternate airport.
Ceiling always below
approach minimums
All aircraft are routed to hold at MAD, and
eventually divert to the alternate airport.
Crosswind always above
maximum allowable for
aircraft
All aircraft are routed to hold at MAD, and
eventually divert to the alternate airport
Weather minimums initially
below approach minimums,
but improve to within
approach minimums
All aircraft are routed to hold at MAD, but return
to the initial approach fix PONDS when weather
is update.
Weather minimums initially
within approach minimums,
but subsequently fall below
minimums
All aircraft are routed onto the approach
segment. When weather is updated, aircraft on
approach segment are routed onto the missed
approach segment. Subsequent arrivals at the
initial approach fix are routed directly to MAD to
hold.
7.0 Model Input
The model-input text can be found in Appendix B. Differences between the
precision and non-precision approach models are annotated in the Macros
section. Graphs of the first year of weather input data are found in Figures 7
though 10 below.
Wind Speed vs Run Hour
25
Wind Speed (kt)
20
15
10
5
0
Jan-01
Feb-01
Mar-01
Apr-01
May-01
Jun-01
Jul-01
Aug-01
Sep-01
Oct-01
Nov-01
Dec-01
Oct-01
Nov-01
Dec-01
Time
Figure 7 – Wind Speed Data
Wind Direction vs Run Hour
350
300
Wind Direction (deg)
250
200
150
100
50
0
Jan-01
Feb-01
Mar-01
Apr-01
May-01
Jun-01
Jul-01
Aug-01
Sep-01
Time
Figure 8 – Wind Direction Data
Ceilings vs. Run Hour
200
180
160
Ceiling (x10^2 Ft)
140
120
100
80
60
40
20
0
Jan-01
Feb-01
Mar-01
Apr-01
May-01
Jun-01
Jul-01
Aug-01
Sep-01
Oct-01
Nov-01
Dec-01
Oct-01
Nov-01
Dec-01
Hour
Figure 9 – Ceiling Height Data
Visibility vs Run Hour
10
9
8
Visibility (mi)
7
6
5
4
3
2
1
0
Jan-01
Feb-01
Mar-01
Apr-01
May-01
Jun-01
Jul-01
Aug-01
Time
Figure 10 – Visibility Data
Sep-01
8.0 Model Results
The model was run for both the non-precision VOR and precision ILS
configurations. Each run was for 10714 hours, which represents the extent of the
weather database employed. The text output from the precision ILS and nonprecision VOR approach models can be found in Appendices C and D
respectively.
The impact of the availability of each approach type is summarized in Tables 1
and 2 below. Table 1 shows the total number of landings, diversions to
alternates, and missed approaches for each approach type. Table 2 shows the
same parameters on a per hour basis.
Approach Type
VOR
ILS
Parameter
Landings
Divert to Alternate Airport
Missed Approached
148353
12342
387
151375
9320
332
Change
3022
-3022
-55
% Change
2.0%
-24.5%
-14.2%
Table 1 – Total Airport Approach Performance
Parameter (per hour)
Landings
Divert to Alternate Airport
Missed Approached
Approach Type
VOR
ILS
13.85
1.15
0.036
14.13
0.87
0.031
Change
0.28
-0.28
-0.005
% Change
2.0%
-24.5%
-14.2%
Table 2 – Airport Approach Performance Per Hour
It can be seen from the results that use of the precision ILS approach provides a
2% increase in the total number of landings during the simulation period, as well
as a reduction in diversions to alternates and missed approaches of 24.5% and
14.2% respectively. These numbers are relevant with respect to aircraft arriving
at the maximum capacity of the approach. For a small Fixed Base Operator, the
two percent increase in landings may not merit the investment in precision
approach equipment. For a larger commercial operation, this would represent a
significant increase in landing fees.
Another parameter with which to gauge the approach performance is average
delay time. This is defined as the difference between the average minutes in
operation per aircraft entity and the theoretical minimum time in operation given
an non-eventful approach and landing. The average delay times for each
approach are summarized below.
Approach Type
Average Delay (min)
Precision ILS
3.55
Non-precision VOR
4.43
The use of the ILS approach reduces the average delay by almost one minute.
In summary, it is important to point out that actual IFR operations are highly
complex. ATC and aircraft are systems operating in real-time and controlled by
humans making decisions based on a myriad of parameters. As such, a
simulation like the one presented here may be made arbitrarily complex and still
not provide accurate representation on an event by event basis. Where a
simulation such as this is useful is in examining aggregate behavior of the
system over long periods of time with the intent of determining the impact of
changes to the system.
Appendix A
Source Code for Surface Weather Observation Decoding Application
//: === WEATHER.C ===
//:
//: Description: Parses Form 10A Surface Observation ASCII files
//: 20020415, Scott Munro
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
"strman.h"
"parse.h"
#define MAXSTR 255
// ceiling type defines
#define BROKEN "BKN"
#define OVERCAST "OVC"
#define SCATTERED "SCT"
#define FOG "FG"
#define VERTVIS "VV"
void main(int argc, char *argv[]) {
FILE *flist_fp;
FILE *out_fp;
char *fields[MAXFIELDS];
char strbuf[MAXSTR];
char *strptr;
char datestr[MAXSTR];
int i;
int nfields;
int n_day=0;
int n_hour=0;
int hour;
int minute;
int ceiling;
float vis;
//
//
//
//
//
//
//
//
//
//
//
//
//
//
list of files to process
output file pointer
pointer to database fields
generic string buffer
generic string pointer
date string buffer
generic counter
number of fields read
day index
hour index
current hour
current minute
current ceiling
current visibility
int getceiling(const char *ctype, const char *cstrbuf); // decodes ceil. info
if (argc != 3) {
printf("\n\nUsage: weather [file list] [output file]\n\n");
exit(10);
}
// open input file list
if ((flist_fp=fopen(argv[1],"rb"))==NULL) {
printf("\nUnable to open input file %s\n", argv[1]);
exit(20);
}
// open output file list
if ((out_fp=fopen(argv[2],"wb"))==NULL) {
printf("\nUnable to open output file %s\n", argv[2]);
exit(25);
}
// initialize weather database
while (fgets(strbuf, 500, flist_fp)) {
if(!InitDelDBase(trim(strbuf))) {
printf("\nUnable to initialize database %s\n", strbuf);
exit(30);
}
// get date of current database
for (i=0; i<5; i++) GetDelDBase(",", fields);
strcpy(datestr, fields[1]);
trim(datestr);
// dump first four rows, which are just header info
for (i=0; i<4; i++) GetDelDBase(",", fields);
// read weather data
while((nfields = GetDelDBase(",", fields)) != NULL) {
fprintf(out_fp, "%s\t", datestr);
fprintf(out_fp, "%d\t", n_hour);
n_hour++;
// convert hour of reading to minutes
strcpy(strbuf, fields[1]);
trim(strbuf);
strbuf[2]='\0';
hour=atoi(strbuf);
strcpy(strbuf, fields[1]);
trim(strbuf);
strptr=&strbuf[2];
minute=atoi(strptr);
nfields = n_day*24*60+hour*60+minute;
fprintf(out_fp, "%ld\t", n_day*24*60+hour*60+minute);
// output wind direction and speed
fprintf(out_fp, "%s\t%s\t", trim(fields[2]), trim(fields[3]));
// output surface visability
if ((strptr=strstr(trim(fields[6]), "/")) != NULL) {
// decode fractional distance
strptr--;
vis = *strptr - '0';
strptr+=2;
vis = vis/(*strptr - '0');
if (strlen(fields[6]) == 5)
vis = vis + *fields[6] - '0';
} else
vis = (float )atof(fields[6]);
fprintf(out_fp, "%4.2f\t", vis);
// set current ceiling
ceiling = 999;
if ((i=getceiling(SCATTERED, fields[9])) != -1 && i < ceiling)
ceiling = i;
if ((i=getceiling(BROKEN, fields[9])) != -1 && i < ceiling)
ceiling = i;
if ((i=getceiling(OVERCAST, fields[9])) != -1 && i < ceiling)
ceiling = i;
if ((i=getceiling(VERTVIS, fields[9])) != -1 && i < ceiling)
ceiling = i;
// printf("\ni = %d, ceiling = %d\n", i, ceiling);
if (strstr(fields[8], FOG) != NULL)
ceiling=0;
fprintf(out_fp, "%d", ceiling);
fprintf(out_fp, "\n");
}
CloseDelDBase();
n_day++;
}
// deallocate memory for fields
// for (i=0; i < MAXFIELDS; i++) free(fields[i]);
fclose(flist_fp);
fclose(out_fp);
}
int getceiling(const char *ctype, const char *cstrbuf) { // decodes ceiling info
char ceilstr[MAXSTR];
char *strptr;
strcpy(ceilstr, cstrbuf);
if ((strptr=strstr(ceilstr, ctype)) != NULL) {
strptr+=3;
strptr[3]='\0';
return(atoi(trim(strptr)));
} else
return(-1);
}
//: === PARSE.C ===
//:
//: Description: File and buffer parsing utilities
//: Copyright 1996, Scott Munro
#include "parse.h"
//:
//:
//:
//:
//:
//:
//:
//:
//:
Program Name: loadfile
Description : Allocates memory and returns pointer to buffer containing
the contents of file with path <filename>. Returns NULL pointer
if unable to load file.
Author
: Scott Munro
Created
: 960513
Version
: 1.01
Modified
: 971121
Usage
: char *loadfile(char *filename)
char *loadfile(char *filename) {
char *buffer, *bufptr;
int c;
long buf_siz;
FILE *fp;
struct stat f_data;
// get page info
if (stat(filename, &f_data) == -1) {
fprintf(stderr, "\nloadfile: Can't get file info for %s\n", filename);
return(NULL);
}
buf_siz = f_data.st_size + 1;
// make sure file is a reasonable size
if ((buf_siz) > 0XFFFF)
{
fprintf(stderr, "\nloadfile: File %s too large for load\n", filename);
return(NULL);
}
// allocate memory for loading file
if ((buffer = (char *)malloc((size_t )buf_siz)) == NULL)
{
fprintf(stderr, "\nloadfile: Insufficient memory\n");
return(NULL);
}
// load page
if ((fp = fopen(filename, "rb")) == NULL)
{
fprintf(stderr, "\nloadfile: Unable to open %s for read\n", filename);
return(NULL);
}
bufptr = buffer;
while ((c = getc(fp)) != EOF) *bufptr++ = c;
*bufptr = NULL;
fclose(fp);
return(buffer);
}
//: Program Name: GetVal
//: Description : Subroutine locates comment of the form %<comment>: <value> in
//:
buffer pointed to by <buffer>. Returns pointer to string
//:
//:
//:
//:
//:
//:
Author
Created
Version
Modified
Usage
:
:
:
:
:
containing <value>. Returns NULL if unable to locate comment.
Scott Munro
960513
1.01
971121
*GetVal(char *buffer, char *comment)
char *GetVal(char *buffer, char *comment) {
char srch_str[80];
char val[80];
char *valptr;
char *value;
char *bufptr;
unsigned length;
strcpy(srch_str, "%");
strcat(srch_str, comment);
strcat(srch_str, ": ");
length = strlen(srch_str);
if ((bufptr = strstr(buffer, srch_str)) == NULL) return(NULL);
bufptr = bufptr + length;
valptr = val;
while (*bufptr != '\n' && *bufptr != '\r') *valptr++ = *bufptr++;
*valptr = NULL;
if ((value = malloc(strlen(val))) == NULL) {
fprintf(stderr, "\nGetVal: Unable to allocate memory for value\n");
return(NULL);
}
strcpy(value, val);
return(value);
}
//:
//:
//:
//:
//:
//:
//:
//:
//:
//:
Program Name: InitDelDBase
Description : Subroutine initializes delimited database for read prior to
calls to GetDelData. Required parameter is the file name
of the delimited database file. Returns 1 on success, 0 on
error.
Author
: Scott Munro
Created
: 971121
Version
: 1.00
Modified
:
Usage
: int InitDelDBase(char *filename)
static FILE *db_ptr;
int InitDelDBase(char *dbname) {
if ((db_ptr = fopen(dbname, "rb")) == NULL) return(0);
return(1);
}
//:
//:
//:
//:
//:
//:
//:
//:
//:
//:
//:
//:
//:
Program Name: GetDelDBase
Description : Subroutine reads the next record a delimited ASCII format
database and loads a pointer array with pointers to strings
containing values of the fields in that line. GetDelData
returns the number of fields successfully read, but will never
return more that MAXFIELDS values. The database must be
initialized with a call to InitDelData before a call to
GetDelData is made. On error or end of file it returns NULL.
Author
: Scott Munro
Created
: 971121
Version
: 1.00
Modified
:
Usage
: int GetDelDBase(char *delchars, char *fields[])
int GetDelDBase(char *delchars, char *fields[]) {
char recbuf[MAXRECLEN];
char *recbufptr;
int ifield = 0;
int flen;
int i;
char *strptr;
static int prevfields = 0;
//
//
//
//
buffer for database record
pointer for database record buffer
current field index
length of current field
// counter
// generic string pointer
// number of fields in previous record
if (fgets(recbuf, MAXRECLEN, db_ptr) == NULL) return(NULL);
// if we got a record of MAXRECLEN length back, it is likely that we did
// not read the entire record.
if (strlen(recbuf) >= MAXRECLEN)
fprintf(stderr, "GetDelDBase: Warning - database record larger than\
maximum allowable length.\n");
// break up strings into separate fields
recbufptr = recbuf;
while ((recbufptr = strtok(recbufptr, delchars)) != NULL) {
flen = strlen(recbufptr);
// check to see if a field buffer already exists. If it does, see if it
// is big enough and realloc if necessary. If it doesn't, allocate memory.
if (ifield > prevfields - 1) {
if ((fields[ifield] = (char *)malloc(flen+1)) == NULL) {
fprintf(stderr, "GetDelDBase: insufficient memory.\n");
return(NULL);
}
} else if (flen > strlen(fields[ifield])) {
// printf("realloc for field %d, size %d\n", ifield, flen+1);
if ((fields[ifield] = (char *)realloc(fields[ifield], flen+1)) ==
NULL) {
fprintf(stderr, "GetDelDBase: insufficient memory.\n");
return(NULL);
}
}
strcpy(fields[ifield], recbufptr);
// pop of any trailing carrige returns or line feeds
if ((strptr = strchr(fields[ifield], '\n')) != NULL) *strptr = '\0';
if ((strptr = strchr(fields[ifield], '\r')) != NULL) *strptr = '\0';
++ifield;
recbufptr = NULL;
}
// free unneeded fields
if (ifield < prevfields)
for (i = ifield; i < prevfields; i++)
free(fields[i]);
prevfields = ifield;
return(ifield);
}
//:
//:
//:
//:
//:
//:
//:
//:
//:
Program Name: RewindDelDBase
Description : Rewinds delimited database so that database pointer is
positioned at the first record. Database must have been
initially opened by a call to InitDelDBase.
Author
: Scott Munro
Created
: 971121
Version
: 1.00
Modified
:
Usage
: void RewindDelDBase(void)
void RewindDelDBase(void) {
rewind(db_ptr);
}
//:
//:
//:
//:
//:
//:
//:
Program Name:
Description :
Author
:
Created
:
Version
:
Modified
:
Usage
:
CloseDelDBase
Closes a delimited database initially opened via InitDelDBase.
Scott Munro
971121
1.00
void CloseDelDBase(void)
void CloseDelDBase(void) {
fclose(db_ptr);
}
//: === STRMAN.C ===
//:
//: Description: String Manipulation Utilities
//: Copyright 1997, Scott Munro
#include "strman.h"
//:
//:
//:
//:
//:
//:
//:
Program Name:
Description :
Author
:
Created
:
Version
:
Modified
:
Usage
:
trim
trims whitespace characters a string
Scott Munro
971125
1.00
char trim(char *str)
char *trim(char *str) {
char *strptr1, *strptr2;
strptr1 = strptr2 = str;
// trim preceding white space
while (isspace(*strptr2)) ++strptr2;
if (strptr2 != str) {
while (*strptr2 != '\0') *strptr1++ = *strptr2++;
*strptr1 = *strptr2;
}
// trim trailing white space
strptr1 = str + strlen(str) - 1;
while (isspace(*strptr1)) --strptr1;
*++strptr1 = '\0';
return(str);
}
//:
//:
//:
//:
//:
//:
//:
Program Name:
Description :
Author
:
Created
:
Version
:
Modified
:
Usage
:
atrim
trims arbitrary character delimiting a string
Scott Munro
971201
1.00
char trim(char *str, char c)
char *atrim(char *str, char c) {
char *strptr1, *strptr2;
strptr1 = strptr2 = str;
// trim preceding white space
while (*strptr2 == c) ++strptr2;
if (strptr2 != str) {
while (*strptr2 != '\0') *strptr1++ = *strptr2++;
*strptr1 = *strptr2;
}
// trim trailing white space
strptr1 = str + strlen(str) - 1;
while (*strptr1 == c) --strptr1;
*++strptr1 = '\0';
return(str);
}
//:
//:
//:
//:
//:
//:
//:
//:
//:
//:
//:
Program Name: sr
Description : Locates and replaces characters in a string. Returns a pointer
to a new string obtained by a call to malloc, which contains
the transformed string. The user is responsible for freeing
the space allocated by sr when it is no longer needed.
sr() returns a NULL pointer on failure.
Author
: Scott Munro
Created
: 971125
Version
: 1.00
Modified
:
Usage
: char *sr(const char *str, const char *findstr, const char *replstr)
char *sr(const char *str, const char *findstr, const char *replstr) {
char *oldstr, *newstr;
// buffers for original and transformed strings
char *strhead, *strend;
// some string pointers
unsigned incsize;
// incremental length to be added to newstr
unsigned rstrsiz, fstrsiz; // search and replacement string sizes
if (strlen(findstr) == 0)
return(strdup(str));
oldstr = strdup(str);
rstrsiz = strlen(replstr);
fstrsiz = strlen(findstr);
// calculate the size of the transformed string
strhead = oldstr;
incsize = 0;
while ((strhead = strstr(strhead, findstr)) != NULL) {
incsize = incsize + (rstrsiz - fstrsiz);
strhead = strhead + fstrsiz;
}
if ((newstr = (char *)malloc(sizeof(char) * (strlen(oldstr) + incsize + 1)))
== NULL) {
fprintf(stderr, "\nsr: insufficient memory.\n");
return(NULL);
}
// transform string
*newstr = '\0';
strhead = oldstr;
while ((strend = strstr(strhead, findstr)) != NULL) {
*strend = '\0';
strcat(newstr, strhead);
strcat(newstr, replstr);
strhead = strend + fstrsiz;
}
if (strlen(strhead))
strcat(newstr, strhead);
free(oldstr);
return(newstr);
}
//:
//:
//:
//:
//:
//:
//:
//:
Program Name: norm
Description : Normalizes the supplied input string by stripping spaces
and non-alphanumeric characters, then capitalizing the result.
Author
: Scott Munro
Created
: 971126
Version
: 1.00
Modified
:
Usage
: char *norm(char *str);
char *norm(char *str) {
char *newstr1, *newstr2;
newstr1 = strdup(str);
trim(newstr1);
newstr2 = sr(newstr1, "-", "");
free(newstr1);
newstr1 = sr(newstr2, "\\", "");
free(newstr2);
newstr2 = sr(newstr1, "/", "");
free(newstr1);
newstr1 = sr(newstr2, ".", "");
free(newstr2);
newstr2 = sr(newstr1, "(", "");
free(newstr1);
newstr1 = sr(newstr2, ")", "");
free(newstr2);
newstr2 = sr(newstr1, "&", "");
free(newstr1);
newstr1 = sr(newstr2, "*", "");
free(newstr2);
newstr2 = sr(newstr1, " ", "");
free(newstr1);
newstr1 = sr(newstr2, "#", "");
free(newstr2);
strupr(newstr1);
strcpy(str, newstr1);
free(newstr1);
return(str);
}
//
//
//
//
//
//
//
//
//
//
//
//
//
//
=== PARSE.H ===
Description: Header file for PARSE.C
Author: sdMunro
Created: 960513
Version: 1.0
Modified by:
Last Modified:
Copyright 1996, Hyperkinetics LLC
EDIT LOG
960513: Orignal program file
#ifndef PARSE_H
#define PARSE_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/stat.h>
#include<alloc.h>
#define MAXFIELDS 255 // the maximum number of fields returned by GetDelData()
#define MAXRECLEN 1024 // the maximum record length in a delimited database
// function prototypes
char *loadfile(char *filename);
char *GetVal(char *buffer, char *comment);
int GetDelDBase(char *delchars, char *fields[]);
int InitDelDBase(char *dbname);
void RewindDelDBase(void);
void CloseDelDBase(void);
#endif
//
//
//
//
//
//
//
//
//
//
//
=== STRMAN.H ===
Description: Header file for STRMAN.C
Author: sdMunro
Created: 971125
Version: 1.0
Modified by:
Last Modified:
Copyright 1997, Scott Munro
#ifndef STRMAN_H
#define STRMAN_H
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <ctype.h>
#include <alloc.h>
#define TRUE 1
#define FALSE 0
// function prototypes
char *trim(char *str);
char *atrim(char *str, char c);
char *sr(const char *str, const char *findstr, const char *replstr);
char *norm(char *str);
#endif
Appendix B
Model Input Text
********************************************************************************
*
*
*
Formatted Listing of Model:
*
*
C:\My Documents\DESClass\Project\vorrwy2_020427.mod
*
*
*
********************************************************************************
Time Units:
Distance Units:
Initialization Logic:
Minutes
Feet
Visibility_Current=weather[1,3]
Ceiling_Current=weather[1,4]
Wind_Dir_Current=weather[1,1]
Wind_Vel_Current=weather[1,2]
********************************************************************************
*
Locations
*
********************************************************************************
Name
Cap
Units Stats
Rules
Cost
---------------- -------- ----- ----------- -------------- -----------PONDS
1
1
Time Series Oldest, ,
#
#First 3 nm segement, at 70kt => 2.6min
ApproachSeg1
1
1
Time Series
#
#Remaining segement, 1.6nm at 70kt => 1.4min
ApproachSeg2
1
1
Time Series
Rwy2
1
1
Time Series
MAD
INF
1
Time Series
Return_Seg1_2min 1
1
Time Series
Return_Seg2_2min 1
1
Time Series
Return_Seg3_2min 1
1
Time Series
Return_Seg4_2min 1
1
Time Series
HVN
1
1
Time Series
MAP_Seg1_2min
1
1
Time Series
MAP_Seg2_2min
1
1
Time Series
MAP_Seg3_3mi
INFINITE 1
Time Series
Divert
inf
1
Time Series
Oldest, FIFO,
Oldest,
Oldest,
Oldest,
Oldest,
Oldest,
Oldest,
Oldest,
Oldest,
Oldest,
Oldest,
Oldest,
Oldest,
,
FIFO,
FIFO,
FIFO,
FIFO,
FIFO,
FIFO,
,
FIFO,
FIFO,
FIFO,
FIFO,
********************************************************************************
*
Entities
*
********************************************************************************
Name
Speed (fpm) Stats
Cost
---------- ------------ ----------- -----------Aircraft
70
Time Series
********************************************************************************
*
Processing
*
********************************************************************************
Process
Entity
Location
Operation
Blk Output
-------- ---------------- --------------------- -------Aircraft PONDS
UpdateWeather()
IF (Ceiling_Current > Ceiling_Min
Crosswind_Max) THEN
{
ROUTE 1
}
ELSE
{
ROUTE 2
}
1
Aircraft
2
Aircraft
Aircraft ApproachSeg1
MOVE FOR T(2.3,2.6,3.0)
1
Aircraft
Aircraft ApproachSeg2
MOVE FOR T(1.2,1.4,1.6)
1
Aircraft
Aircraft HVN
UpdateWeather()
IF (Ceiling_Current > Ceiling_Min
Crosswind_Max) THEN
{
ROUTE 1
}
ELSE
{
ROUTE 2
}
Aircraft Rwy2
Routing
Destination
Rule
---------------- ------) AND (Visibility_Current
ApproachSeg1
MAD
FIRST 1
FIRST 1
ApproachSeg2
FIRST 1
HVN
FIRST 1
) AND (Visibility_Current
1
Aircraft Rwy2
FIRST 1
2
Aircraft MAP_Seg1_2min
FIRST 1
MOVE FOR T(InterpMinRoll(),InterpModeRoll(),InterpMaxRoll())
Move Logic
-----------> Visibility_Min) AND (Crosswind_Current <
> Visibility_Min) AND (Crosswind_Current <
Aircraft MAP_Seg1_2min
Aircraft MAP_Seg2_2min
Aircraft MAP_Seg3_3mi
Aircraft MAD
Aircraft Return_Seg1_2min
Aircraft Return_Seg2_2min
Aircraft Return_Seg3_2min
Aircraft Return_Seg4_2min
Aircraft Divert
1
Aircraft EXIT
FIRST 1
MOVE FOR T(1.8,2.0,2.3)
1
Aircraft MAP_Seg2_2min
FIRST 1
MOVE FOR T(1.8,2.0,2.3)
1
Aircraft MAP_Seg3_3mi
FIRST 1
MOVE FOR T(1.8,2.0,2.3)
1
Aircraft MAD
FIRST 1
UpdateWeather()
WHILE (((Ceiling_Current < Ceiling_Min ) OR (Visibility_Current < Visibility_Min) OR (Crosswind_Current >
Crosswind_Max)) AND (FuelRemaining > 0)) DO
{
WAIT 1
UpdateWeather()
FuelRemaining=FuelRemaining-1
}
IF (FuelRemaining <= 0)
THEN ROUTE 2
ELSE ROUTE 1
1
Aircraft Return_Seg1_2min FIRST 1
2
Aircraft Divert
FIRST 1
MOVE FOR T(1.8,2.0,2.3)
1
Aircraft Return_Seg2_2min FIRST 1
MOVE FOR T(1.8,2.0,2.3)
1
Aircraft Return_Seg3_2min FIRST 1
MOVE FOR T(1.8,2.0,2.3)
1
Aircraft Return_Seg4_2min FIRST 1
MOVE FOR T(1.8,2.0,2.3)
1
Aircraft PONDS
FIRST 1
MOVE FOR 10.0
1
Aircraft EXIT
FIRST 1
********************************************************************************
*
Arrivals
*
********************************************************************************
Entity
Location Qty each
First Time Occurrences Frequency Logic
-------- -------- ---------- ---------- ----------- ---------- -----------Aircraft PONDS
1
0
INF
4
FuelRemaining=45
********************************************************************************
*
Attributes
*
********************************************************************************
ID
Type
Classification
------------- ------------ -------------#
#Fuel remaining in minutes
FuelRemaining Integer
Entity
********************************************************************************
*
Variables (global)
*
********************************************************************************
ID
Type
Initial value Stats
-------------------- ------------ ------------- ----------#
#Current visibility from weather file
Visibility_Current
Real
0
#
#Current ceiling from weather file
Ceiling_Current
Integer
0
#
#Current cross-wind component from weather file
Crosswind_Current
Integer
0
#
#Current head-wind
Headwind_Current
Integer
0
#
#Current wind direction from weather file
Wind_Dir_Current
Integer
0
#
#Current wind speed from weather file
Wind_Vel_Current
Integer
0
#
#Current hour, trucncated to nearest integer
Hour_Current
Integer
0
Wind_Effective_Angle Integer
0
V_Headwind
Real
0
V_Crosswind
Real
0
Time Series
Time Series
Time Series
Time Series
Time Series
Time Series
Time
Time
Time
Time
Series
Series
Series
Series
********************************************************************************
*
Arrays
*
********************************************************************************
ID
Dimensions
Type
---------- ------------ -----------weather
25,4
Real
********************************************************************************
*
Macros
*
********************************************************************************
ID
------------------Visibility_Min
Ceiling_Min
Crosswind_Max
Runway_Heading
Text
-----------1
[Note: 0.75 for the precision ILS approach]
3.8 [Note: 2.57 for the precision ILS approach]
14
20
********************************************************************************
*
Subroutines
*
********************************************************************************
ID
Type
Parameter Type
Logic
-------------------- ------------ ---------- ------------ -----------------UpdateWeather
None
// subroutine updates weather current weather from the weather array
// and calculates the current crosswind component
// 1. Update time and current weather values
Hour_Current = trunc(clock(hr))
Wind_Dir_Current = weather[(1+Hour_Current),1]
Wind_Vel_Current = weather[(1+Hour_Current),2]
Visibility_Current = weather[(1+Hour_Current),3]
Ceiling_Current = weather[(1+Hour_Current),4]
// 2. Calculate current crosswind component for given runway heading
UpdateWindComponents()
Crosswind_Current=ROUND(V_Crosswind)
Headwind_Current=ROUND(V_Headwind)
UpdateWindComponents None
// subroutine calculates current runway crosswind and headwind components
IF (Runway_Heading <= Wind_Dir_Current AND Wind_Dir_Current <=
(Runway_Heading+90)) THEN
{
Wind_Effective_Angle = Wind_Dir_Current - Runway_Heading
V_Crosswind = Wind_Vel_Current * sin(Wind_Effective_Angle)
V_Headwind = Wind_Vel_Current * cos(Wind_Effective_Angle)
RETURN
}
IF ((Runway_Heading+90) < Wind_Dir_Current AND Wind_Dir_Current <=
(Runway_Heading+180)) THEN
{
Wind_Effective_Angle = Wind_Dir_Current - (Runway_Heading+90)
V_Crosswind = Wind_Vel_Current * cos(Wind_Effective_Angle)
V_Headwind = -1 * Wind_Vel_Current * sin(Wind_Effective_Angle)
RETURN
}
IF ((Runway_Heading+180) < Wind_Dir_Current AND Wind_Dir_Current <=
(Runway_Heading+270)) THEN
{
Wind_Effective_Angle = Wind_Dir_Current - (Runway_Heading+180)
V_Crosswind = Wind_Vel_Current * sin(Wind_Effective_Angle)
V_Headwind = -1 * Wind_Vel_Current * cos(Wind_Effective_Angle)
RETURN
}
IF ((Runway_Heading+270) < Wind_Dir_Current AND Wind_Dir_Current <=
(Runway_Heading+360)) THEN
{
Wind_Effective_Angle = Wind_Dir_Current - (Runway_Heading+270)
V_Crosswind = Wind_Vel_Current * cos(Wind_Effective_Angle)
V_Headwind = Wind_Vel_Current * sin(Wind_Effective_Angle)
RETURN
}
// we should never get here
DEBUG
sin
Real
theta
Real
// subroutine uses Taylor series expansion to calculate sin(theta)
// theta is in degrees
theta = theta * 3.14159 / 180.0
RETURN (theta - theta**3.0/6.0 + theta**5.0/120.0 - theta**7.0/5040.0)
cos
Real
theta
Real
// subroutine uses Taylor series expansion to calculate cos(theta)
// theta is in degrees
theta = theta * 3.14159 / 180.0
RETURN (1 - theta**2.0/2.0 + theta**4.0/24.0 - theta**6.0/720.0)
InterpMinRoll
Real
// subroutine interpolates max rollout time based on headwind
RETURN (0.8 + (-0.0045*(V_Headwind+5)+0.22) + 0.5)
InterpModeRoll
Real
// subroutine interpolates mode rollout time based on headwind
RETURN (0.8 + (-0.0045*(V_Headwind+5)+0.23) + 0.5)
InterpMaxRoll
Real
// subroutine interpolates minimum rollout time based on headwind
RETURN (0.8 + (-0.0055*(V_Headwind+5)+0.26) + 0.5)
Appendix C
Model Output Text for Precision ILS Approach Run
-------------------------------------------------------------------------------General Report
Output from C:\MYDOCU~1\DESCLASS\PROJECT\VORRWY~1.MOD [DSES6620 Project - HVN Precision and Non-precision Approach]
Date: Apr/28/2002
Time: 01:19:11 AM
-------------------------------------------------------------------------------Scenario
: Normal Run
Replication
: 1 of 1
Simulation Time : 10713 hr
-------------------------------------------------------------------------------LOCATIONS
Location
Name
---------------PONDS
ApproachSeg1
ApproachSeg2
Rwy2
MAD
Return Seg1 2min
Return Seg2 2min
Return Seg3 2min
Return Seg4 2min
HVN
MAP Seg1 2min
MAP Seg2 2min
MAP Seg3 3mi
Divert
Scheduled
Hours
--------10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
Capacity
-------999999
1
1
1
999999
1
1
1
1
1
1
1
1
999999
Total
Entries
------163063
151708
151707
151375
11687
2367
2367
2367
2367
151707
332
332
332
9320
Average
Minutes
Per Entry
--------0.446125
2.632871
1.400140
1.508257
42.937644
2.115407
2.092241
2.071916
2.035595
0.000000
2.035497
2.032690
2.033488
2.000000
LOCATION STATES BY PERCENTAGE (Multiple Capacity)
Location
Name
-------PONDS
MAD
Divert
Scheduled
Hours
--------10713
10713
10713
%
Empty
----97.45
92.23
97.14
%
Partially
Occupied
--------2.55
7.77
2.86
%
Full
---0.00
0.00
0.00
|
|
|
|
|
|
|
%
Down
---0.00
0.00
0.00
Average
Contents
---------0.113175
0.621406
0.330457
0.355195
0.780691
0.00778986
0.00770456
0.00762971
0.00749596
0
0.00105135
0.0010499
0.00105031
0.028999
Maximum
Contents
-------10
1
1
1
18
1
1
1
1
1
1
1
1
2
Current
Contents
-------0
1
0
1
0
0
0
0
0
0
0
0
0
0
% Util
-----0.00
62.14
33.05
35.52
0.00
0.78
0.77
0.76
0.75
0.00
0.11
0.10
0.11
0.00
LOCATION STATES BY PERCENTAGE (Single Capacity/Tanks)
Location
Name
---------------ApproachSeg1
ApproachSeg2
Rwy2
Return Seg1 2min
Return Seg2 2min
Return Seg3 2min
Return Seg4 2min
HVN
MAP Seg1 2min
MAP Seg2 2min
MAP Seg3 3mi
Scheduled
Hours
--------10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
%
Operation
--------62.14
33.05
35.52
0.75
0.75
0.75
0.75
0.00
0.11
0.10
0.11
%
Setup
----0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
%
Idle
-----37.86
66.95
64.48
99.22
99.23
99.24
99.25
100.00
99.89
99.90
99.89
Average
Minutes
In
System
-------9.054809
Average
Minutes
In Move
Logic
-------0.000000
%
Waiting
------0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
%
Blocked
------0.00
0.00
0.00
0.03
0.02
0.01
0.00
0.00
0.00
0.00
0.00
%
Down
---0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
FAILED ARRIVALS
Entity
Name
-------Aircraft
Location
Name
-------PONDS
Total
Failed
-----0
ENTITY ACTIVITY
Entity
Name
-------Aircraft
Total
Exits
-----160694
Current
Quantity
In System
--------2
Average
Minutes
Wait For
Res, etc.
--------0.129083
ENTITY STATES BY PERCENTAGE
Entity
Name
-------Aircraft
%
In Move
Logic
------0.00
%
Wait For
Res, etc.
--------1.43
%
In Operation
-----------93.23
%
Blocked
------5.34
Average
Minutes
In
Operation
--------8.442049
Average
Minutes
Blocked
-------0.483678
VARIABLES
Variable
Name
-------------------Visibility Current
Ceiling Current
Crosswind Current
Headwind Current
Wind Dir Current
Wind Vel Current
Hour Current
Wind Effective Angle
V Headwind
V Crosswind
N Missed Approach
N Divert
N Landings
N Multiple Approach
Wind Dir
Total
Changes
------802973
802973
802972
802972
802973
802973
802972
802972
802972
802972
332
9320
151375
2367
802972
Average
Minutes
Per Change
----------0.800500
0.800500
0.800501
0.800501
0.800500
0.800500
0.800501
0.800501
0.800501
0.800501
1931.204843
68.800107
4.246275
270.908587
0.800501
Minimum
Value
--------0
0
0
-21
0
0
0
0
-20.9967
-0.018757
0
0
0
0
0
Maximum
Value
------10
999
28
24
360
30
10713
90
24
28.1908
332
9320
151375
2367
370
Current
Value
-------10
999
7
-1
280
7
10713
80
-1.21309
6.89327
332
9320
151375
2367
280
Average
Value
-------7.91297
560.434
4.89191
0.988985
213.95
7.60039
5356
49.5538
0.988516
4.90966
188.344
5202.26
75143.9
1313.44
224.3
Appendix D
Model Output Text for Non-Precision VOR Approach Run
-------------------------------------------------------------------------------General Report
Output from C:\My Documents\DESClass\Project\vorrwy2_020427.mod [DSES6620 Project - HVN Precision and Non-precision Approach]
Date: Apr/28/2002
Time: 01:42:23 PM
-------------------------------------------------------------------------------Scenario
: Normal Run
Replication
: 1 of 1
Simulation Time : 10713 hr
-------------------------------------------------------------------------------LOCATIONS
Location
Name
---------------PONDS
ApproachSeg1
ApproachSeg2
Rwy2
MAD
Return Seg1 2min
Return Seg2 2min
Return Seg3 2min
Return Seg4 2min
HVN
MAP Seg1 2min
MAP Seg2 2min
MAP Seg3 3mi
Divert
Scheduled
Hours
--------10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
Capacity
-------999999
1
1
1
999999
1
1
1
1
1
1
1
1
999999
Total
Entries
------163261
148741
148740
148353
14907
2565
2565
2565
2565
148740
387
387
387
12342
Average
Minutes
Per Entry
--------0.483109
2.633699
1.399798
1.508423
43.249366
2.113183
2.090049
2.068131
2.033356
0.000000
2.026403
2.031749
2.023930
2.000000
LOCATION STATES BY PERCENTAGE (Multiple Capacity)
Location
Name
-------PONDS
MAD
Divert
Scheduled
Hours
--------10713
10713
10713
%
Empty
----97.24
90.20
96.20
%
Partially
Occupied
--------2.76
9.80
3.80
%
Full
---0.00
0.00
0.00
|
|
|
|
|
|
|
%
Down
---0.00
0.00
0.00
Average
Contents
---------0.122706
0.609445
0.323915
0.348143
1.00302
0.00843261
0.0083403
0.00825283
0.00811406
0
0.00122004
0.00122326
0.00121855
0.0384019
Maximum
Contents
-------10
1
1
1
18
1
1
1
1
1
1
1
1
2
Current
Contents
-------0
1
0
1
0
0
0
0
0
0
0
0
0
0
% Util
-----0.00
60.94
32.39
34.81
0.00
0.84
0.83
0.83
0.81
0.00
0.12
0.12
0.12
0.00
LOCATION STATES BY PERCENTAGE (Single Capacity/Tanks)
Location
Name
---------------ApproachSeg1
ApproachSeg2
Rwy2
Return Seg1 2min
Return Seg2 2min
Return Seg3 2min
Return Seg4 2min
HVN
MAP Seg1 2min
MAP Seg2 2min
MAP Seg3 3mi
Scheduled
Hours
--------10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
10713
%
Operation
--------60.94
32.39
34.81
0.81
0.81
0.81
0.81
0.00
0.12
0.12
0.12
%
Setup
----0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
%
Idle
-----39.06
67.61
65.19
99.16
99.17
99.17
99.19
100.00
99.88
99.88
99.88
Average
Minutes
In
System
-------9.929746
Average
Minutes
In Move
Logic
-------0.000000
%
Waiting
------0.00
0.00
0.00
0.00
0.00
0.01
0.00
0.00
0.00
0.00
0.00
%
Blocked
------0.00
0.00
0.00
0.03
0.02
0.01
0.00
0.00
0.00
0.00
0.00
%
Down
---0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
0.00
FAILED ARRIVALS
Entity
Name
-------Aircraft
Location
Name
-------PONDS
Total
Failed
-----0
ENTITY ACTIVITY
Entity
Name
-------Aircraft
Total
Exits
-----160694
Current
Quantity
In System
--------2
Average
Minutes
Wait For
Res, etc.
--------0.139926
ENTITY STATES BY PERCENTAGE
Entity
Name
-------Aircraft
%
In Move
Logic
------0.00
%
Wait For
Res, etc.
--------1.41
%
In Operation
-----------93.31
%
Blocked
------5.28
Average
Minutes
In
Operation
--------9.265546
Average
Minutes
Blocked
-------0.524274
VARIABLES
Variable
Name
-------------------Visibility Current
Ceiling Current
Crosswind Current
Headwind Current
Wind Dir Current
Wind Vel Current
Hour Current
Wind Effective Angle
V Headwind
V Crosswind
N Missed Approach
N Divert
N Landings
N Multiple Approach
Wind Dir
Total
Changes
------944214
944214
944213
944213
944214
944214
944213
944213
944213
944213
387
12342
148353
2565
944213
Average
Minutes
Per Change
----------0.680757
0.680757
0.680757
0.680757
0.680757
0.680757
0.680757
0.680757
0.680757
0.680757
1648.527276
51.954059
4.332773
249.996386
0.680757
Minimum
Value
--------0
0
0
-21
0
0
0
0
-20.9967
-0.018757
0
0
0
0
0
Maximum
Value
------10
999
28
24
360
30
10713
90
24
28.1908
387
12342
148353
2565
370
Current
Value
-------10
999
7
-1
280
7
10713
80
-1.21309
6.89327
387
12342
148353
2565
280
Average
Value
-------7.91297
560.434
4.89191
0.988985
213.95
7.60039
5356
49.5538
0.988516
4.90966
222.08
7013.33
73332.6
1441.45
224.3
Download