Transcript Fortran

CS 415: Programming
Languages
Fortran
Aaron Bloomfield
Fall 2005
1
The IBM 704
2
Standard Fortran joke
“GOD is REAL (unless declared INTEGER)."
3
Fortran I program control
IF (arithmetic expression) N1, N2, N3
DO N1 variable = first_value, last_value
5
Punch cards
6
Fortran history reference
http://www.ibiblio.org/pub/languages/fortran/ch1-1.html
7
Installing Fortran on Windows
We’ll use Fortran 77 for this course

The compiler has “some” Fortran 90 features
Install Cygwin: http://www.cygwin.com/


It’s a Unix-like shell for Windows
In particular, when you install it:
Install the gcc-g77 package in the Devel section
We may use Ocaml – if so, then you will need to install the ocaml
package (also in Devel)

This can be done later, too
Install a good editor

I like Emacs: http://www.gnu.org/software/emacs/emacs.html
Quite a learning curve, but the best editor out there
Binaries at http://ftp.gnu.org/pub/gnu/emacs/windows/
You can also install and use it as part of Cygwin
Tutorials can be found online
8
Compiling a Fortran program
Edit the program using your favorite editor

All program code must start on the 7th column!
In Cygwin, change to that directory

The c drive is at /cygdrive/c, etc.
Enter the command:

g77 –ff90 file.f
Then run the file:

./a.exe
9
Hello world in Fortran
PROGRAM HelloWorld
PRINT *,'Hello world!'
END PROGRAM HelloWorld
Column 1
Column 7
10
Fortran syntax
Lines can only be 72 characters long
Comments start with a !
First 6 columns must be spaces

Unless it’s a comment
No semi-colons after each line

A newline is a statement terminator
11
Variable declaration
The types are real, integer, etc.
real :: x, y, z
integer :: a, b, c
character :: g
Always put ‘implicit none’ at the beginning


Right after the ‘program’ line
Prevents implicit variable declaration
12
Input and output
Output statement:

print *, "(", tri1x, ", ", tri1y, ")“
Input statement:

read *, tri3x
There are ways to do nicely formatted output

We aren’t going over them
13
Operators
Boolean operators: .and., .or., .not., etc.


Basically the name of the operation in periods
Boolean values are .true. and .false.
Relational operators: <, >, <=, >=, ==, /=
14
Built-in functions
sqrt()
log()
sin()
cos()
exp()
etc.
15
If statements
Forms are (exp is a Boolean expression):
if (exp ) then
...
endif
if ( exp ) then
...
else
...
endif
if ( exp ) then
...
else if ( exp ) then
...
else if ( exp ) then
...
endif
16
Case statement
Form is:
Where value can be:

select case ( expr )
case ( value )
...
case ( value )
...
case ( value )
...
case default
...
end case
A single value
(300:)

A range of values
(200:400)
Case default
required
is
not
17
Looping
Form is:
do i = 1, 10
...
end do
The first loops from 1 to
10
do i = 1, 10, 2
...
end do
The second loops from 1
to 10, but odd numbers
only
18
Loop control
Exit

Exits the loop, not the program
Cycle


Similar to next or continue in other languages
Starts the next iteration of the loop
19
Demo
program
Computes
the
sin,
cos, tan,
etc.
! This program allows the user to input the number of
! and then computes the cosine, sine, and tangent. It
! user inputs "n" or "N".
PROGRAM angle
IMPLICIT none
! Type variables.
REAL :: cosine, sine, tangent, degrees
REAL :: pi = 3.141592
CHARACTER :: choice
DO
! Enter and read the number of degrees in the angle.
PRINT *, "Enter the number of degrees in the
READ *, degrees
! Convert number of degrees in angle to radians.
degrees = degrees*(pi/180)
! Use intrinsic functions to compute values.
cosine=cos(degrees)
sine=sin(degrees)
tangent=tan(degrees)
! Print results.
PRINT *, "cosine=", cosine, " sine=", sine, "
! Give user chance to exit program.
PRINT *
PRINT *, "Would you like to do this again?"
PRINT *,"(Press n to exit - any other key to
READ *, choice
! Exit loop if the value in choice is N or n.
IF (choice == "N" .or. choice == "n") EXIT
END DO
STOP
END PROGRAM angle
degrees in an angle
continues until the
angle."
tangent=", tangent
continue.)"
20
Demo
program
Computes
the
average
! This program averages a series of numbers input
! from the keyboard.
PROGRAM average
IMPLICIT none
! Type variables.
REAL :: data, sum, avg
INTEGER num, i
! Prompt for and enter number of numbers to average.
PRINT *,"Enter the number of numbers to average."
READ *,num
sum = 0.0
! Loop goes from 1 to number of values to average.
DO i = 1, num
! Prompt for and enter a number.
PRINT *,"Enter a value for the number"
READ *,data
! Add number to total.
sum = sum + data
END DO
! Calculate average.
avg = sum/real(num)
! Print results.
PRINT *,"The average = ",avg
STOP
END
21
Demo
program
Computes
the
average
via a
defined
function
! This program uses a function to find the average of three numbers.
PROGRAM func_ave
! Type variables in main program (a, b, and c are local variables).
REAL :: a,b,c,average
! Prompt for and get numbers to be averaged.
PRINT *,"Enter the three numbers to be averaged."
READ *, a,b,c
! Invoke function average
PRINT *,"The three numbers to be averaged are ",a,b,c
PRINT *,"The average of the three numbers is ", average(a,b,c)
STOP
END PROGRAM func_ave
! Function average
REAL FUNCTION average(x,y,z)
! Type variables in function (x, y, and z are local varialbes).
REAL :: x,y,z
! Function name contains the average the function calculates and returns.
average = (x + y + z)/3.0
RETURN
END FUNCTION average
22
Fortran gotchas
All variables must be declared at the beginning
Remember line limit of 72 characters!

Consider:
integer :: first, second, third, fourth, fifth, sixth, seventh, eighth, nin


The 8th variable is named ‘ei’
There is no 9th variable declared
Column 72!
No continuation lines in Fortran 77
== is comparison for if's
Can’t seem to be able to change the values of
parameters in functions
23
John Backus
Chemistry major at UVA
(entered 1943)
Flunked out after second
semester
Joined IBM as programmer in
1950
Developed
Fortran,
first
commercially
successful
programming language and
compiler
25
IBM 704
Fortran
manual, 1956
26
Fortran issues…
Fortran language was described using English



Imprecise
Verbose, lots to read
Ad hoc
DO 10 I=1.10
Assigns 1.10 to the variable DO10I
Early Fortrans didn’t care about spaces!
DO 10 I=1,10
Loops for I = 1 to 10
(Often incorrectly blamed for loss of Mariner-I)
27