UMBC CMSC201, Computer Science I, Spring '97
Project 5: Oil Spill Simulation
Due: Monday, May 12, 1997
Your assignment is to write a program that simulates an oil spill and the
movement of the oil over time under certain conditions. This project will
give you practice using two-dimensional arrays, passing an array to a function,
pointers, getting input from the user using scanf, and reading from a file
using ansi C functions, rather than unix redirection.
You are not allowed to use any of the Roberts' libraries for this project
Description of the Oil Spill and Simulation
Your program will simulate an oil spill involving 8,000 gallons of crude oil.
You will run the simulation over a 225 square mile area, a 15 mile X 15 mile
square.
You must keep track of the number of gallons of oil that are present on the
surface of each square mile. The number of gallons in a particular square-mile
location will vary over time due to environmental factors, i.e. the tides,
wind, etc. For this simulation we will be concerned only with the effects of
the wind on the oil spill.
If the wind is from the west, then the oil in a particular location will be
pushed primarily to the east, affecting the neighboring areas to the north,
north-east, east, south-east and south. Some portion of the oil will stay
within the original square-mile area. Obviously the area to the east will
get the largest influx of oil. Over time, the spill will shift significantly
to the east.
The initial number of gallons of oil per square-mile location are found in the
file "oilspill.dat". Basically, the file contains 225 integer values separated
by whitespace. This is the contents of the file. You may assume that none of
the integers found in the file will be larger than 3 digits. I guarantee that
there are 225 integers in the file, so checking for EOF is not necessary.
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 500 500 500 500 0 0 0 0 0
0 0 0 0 0 0 500 500 500 500 0 0 0 0 0
0 0 0 0 0 0 500 500 500 500 0 0 0 0 0
0 0 0 0 0 0 500 500 500 500 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
You will be reading the values found in the file into a two dimensional array.
This array will then hold the original number of gallons found in each square-
mile area at the time of the spill.
You will also be asking the user to say how many time intervals should pass
between displaying the values for each square-mile area, and the total amount
of time for the entire simulation, as well as the wind direction. We will
assume a constant wind velocity so that you do not need to consider it in your
calculations.
A Sample Run
retriever[102] a.out
Please enter the time interval : 5
Enter the total time : 15
Enter the wind direction : w
Time: 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 500 500 500 500 0 0 0 0 0
0 0 0 0 0 0 500 500 500 500 0 0 0 0 0
0 0 0 0 0 0 500 500 500 500 0 0 0 0 0
0 0 0 0 0 0 500 500 500 500 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Time: 5
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 3 6 8 7 4 1 0
0 0 0 0 0 0 1 10 28 43 47 39 20 5 0
0 0 0 0 0 0 9 49 108 149 153 114 56 15 1
0 0 0 0 0 0 28 116 229 303 299 213 100 26 3
0 0 0 0 0 0 36 154 305 402 396 282 130 34 3
0 0 0 0 0 0 36 154 305 402 396 282 130 34 3
0 0 0 0 0 0 28 116 229 303 299 213 100 26 3
0 0 0 0 0 0 9 49 108 149 153 114 56 15 1
0 0 0 0 0 0 1 10 28 43 47 39 20 5 0
0 0 0 0 0 0 0 0 3 6 8 7 4 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Time: 10
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 2 5 6 5 3
0 0 0 0 0 0 0 0 1 7 15 23 26 21 13
0 0 0 0 0 0 0 1 10 28 51 69 71 57 35
0 0 0 0 0 0 0 6 28 67 114 145 144 113 68
0 0 0 0 0 0 1 13 49 114 186 231 226 173 102
0 0 0 0 0 0 2 17 65 146 235 289 280 213 124
0 0 0 0 0 0 2 17 65 146 235 289 280 213 124
0 0 0 0 0 0 1 13 49 114 186 231 226 173 102
0 0 0 0 0 0 0 6 28 67 114 145 144 113 68
0 0 0 0 0 0 0 1 10 28 51 69 71 57 35
0 0 0 0 0 0 0 0 1 7 15 23 26 21 13
0 0 0 0 0 0 0 0 0 0 2 5 6 5 3
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Time: 15
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 2
0 0 0 0 0 0 0 0 0 0 1 3 8 11 12
0 0 0 0 0 0 0 0 0 1 6 15 26 34 36
0 0 0 0 0 0 0 0 0 5 18 38 59 74 75
0 0 0 0 0 0 0 0 2 13 37 72 107 129 128
0 0 0 0 0 0 0 0 5 22 57 106 155 185 180
0 0 0 0 0 0 0 0 7 28 71 129 187 220 213
0 0 0 0 0 0 0 0 7 28 71 129 187 220 213
0 0 0 0 0 0 0 0 5 22 57 106 155 185 180
0 0 0 0 0 0 0 0 2 13 37 72 107 129 128
0 0 0 0 0 0 0 0 0 5 18 38 59 74 75
0 0 0 0 0 0 0 0 0 1 6 15 26 34 36
0 0 0 0 0 0 0 0 0 0 1 3 8 11 12
0 0 0 0 0 0 0 0 0 0 0 0 0 1 2
retriever[103]
More details
- To begin, you will need to read in the data from the data file,
oilspill.dat You will NOT be able to use unix redirection for this program,
since you will also need to ask the user to input information. You will need
to open the file for reading using fopen, read the integers in the file using
fscanf, placing them into a two-dimensional array of integers as you go, and
then close the file.
- For each unit of time, the amount of oil in each square-mile area must be
recalculated. I will chose the wind direction W for the explanation of the
calculations. The original amount of oil in the square will be reduced by 50%,
because that much will be pushed by the wind into some of it's neighboring
easterly squares. At the same time, however, more oil will be pushed into the
area from some of its more westerly neighbors.
For a west wind, the square and its surrounding squares will be affected as
follows:
Percentage of original Example using # of gallons
Time 0: Time 1: Time 0: Time 1:
| | | 5% | 10% 0| 0| 0 0| 10| 20
----+----+---- ----+----+---- ----+----+---- ----+----+----
|100%| | 50%| 20% 0| 200| 0 0| 100| 40
----+----+---- ----+----+---- ----+----+---- ----+----+----
| | | 5% | 10% 0| 0| 0 0| 10| 20
Winds from other directions will cause similar effects on their neighboring
squares using the same percentages.
- If you view the results of the simulation after each unit of time, the
movement of the oil is less noticeable than if you wait for several time units
before viewing. Since the user needs to see and interpret the results of the
simulation, the user needs to have control over how often he views the
results and over how long a period of time to run the simulation. The period
of time between the printing of charts I will refer to as the time interval.
The period of time for the entire simulation I will refer to as total time.
You must ask the user to input both the time interval and the total time, as
well as the wind direction.
You are REQUIRED to have a function called GetInput which gets all three of
these items from the user. Since this function has to "return" three pieces
of data, the function must have pointers as arguments. Here is the function
prototype you are to use for this function :
void GetInput (int *intervalPtr, int *timePtr, char *dirPtr);
Although no error checking is necessary for the data coming in from the
file, error checking of the user input is required.
- Hints
- Be aware that the diagrams of oil movement shown above are the
simplest case, where there was no oil originally in any of the neighboring
squares. Each square mile will lose oil in the fashion indicated, but each
square mile will also have an influx of oil from its neighboring squares.
- Since every square will be altered by its neighbors, and you must use the
original values of each square for the calculations, you cannot just move
through the array making changes as you go. This would give erroneous results.
A second two-dimensional array needs to be made that will hold the new amounts
of oil that are being calculated for each square, while the original array is
still intact to provide the values needed for the calculations.
The data file
The data file for this project is called oilspill.dat and it is found in my
201 directory. You should copy this file into your own directory. The
executable and this data file need to be in the same directory. Here's how:
Change directory until you are in the directory where you will write your code
and have the executable, then type the following command at the unix prompt.
cp ~sbogar1/201/oilspill.dat oilspill.dat
What to Turn In
You must use separate compilation
for this project and should have a file, called proj5.c, that contains only
the function main(). You should also have an oilspill.c and oilspill.h, that
contain the functions used by proj5.c and the prototypes for those functions,
respectively. Submit as follows:
submit cs201 proj5 proj5.c oilspill.c oilspill.h
The order in which the files are listed doesn't matter. However, you
must make sure that all files necessary to compile your
project are listed.