CS 415: Programming Languages Fortran Aaron Bloomfield Fall 2005
Standard Fortran joke • “GOD is REAL (unless declared INTEGER)."
Fortran I program control • IF (arithmetic expression) N1, N2, N3 • DO N1 variable = first_value, last_value
Fortran history reference • http://www.ibiblio.org/pub/languages/fortran/ch1-1.html
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
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
Hello world in Fortran PROGRAM HelloWorld PRINT *,'Hello world!' END PROGRAM HelloWorld Column 1 Column 7
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
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
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
Operators • Boolean operators: .and., .or., .not., etc. • Basically the name of the operation in periods • Boolean values are .true. and .false. • Relational operators: <, >, <=, >=, ==, /=
Built-in functions • sqrt() • log() • sin() • cos() • exp() • etc.
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
Form is: select case ( expr ) case ( value ) ... case ( value ) ... case ( value ) ... case default ... end case Where value can be: A single value (300:) A range of values (200:400) Case default is not required Case statement
Form is: do i = 1, 10 ... end do do i = 1, 10, 2 ... end do The first loops from 1 to 10 The second loops from 1 to 10, but odd numbers only Looping
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
! This program allows the user to input the number of degrees in an angle ! and then computes the cosine, sine, and tangent. It continues until the ! 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 angle." 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, " tangent=", tangent ! Give user chance to exit program. PRINT * PRINT *, "Would you like to do this again?" PRINT *,"(Press n to exit - any other key to continue.)" 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 Demo program • Computes the sin, cos, tan, etc.
! 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 Demo program • Computes the average
! 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 Demo program • Computes the average via a defined function
Fortran gotchas • All variables must be declared at the beginning • Remember line limit of 72 characters! • Consider: • The 8th variable is named ‘ei’ • There is no 9th variable declared • 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 integer :: first, second, third, fourth, fifth, sixth, seventh, eighth, ninth Column 72!
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
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)