Doug Sondak SCV sondakbuedu Outline Goals Introduction Emacs Fortran History Basic syntax makefiles Additional syntax Goals To be able to write simple Fortran programs To be able to understand and modify existing Fortran code ID: 243957
Download Presentation The PPT/PDF document "Introduction to Fortran" is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.
Slide1
Introduction to Fortran
Doug Sondak
SCV
sondak@bu.eduSlide2
Outline
Goals
Introduction
Emacs
Fortran History
Basic syntax
makefiles
Additional syntax Slide3
Goals
To be able to write simple Fortran programs
To be able to understand and modify existing Fortran code
To be able to manage program projects using an editor and
makefileSlide4
Introduction
Matlab
is great! Why do I need to learn a new language?!
All codes must be translated to machine language
Interpreted language
Matlab
, Python, Java
Translation is performed incrementally at run time
Compiled language
Fortran, C, C++
Translation is performed once, then executable is runSlide5
Introduction (cont’d)
Compiled languages run faster
I translated a program from
Matlab
to C for a user, and it ran 7 times as fast
Large-scale computing is usually done with compiled language
Some convenient features of interpreted languages (e.g., no need to declare variables) result in performance and/or memory penaltiesSlide6
Emacs
Professional programmers often work within a programming environment
Writing and editing code
Running code
On Unix systems, one typically uses an editor to write/modify code
Emacs
and vi are most popular
We will talk about
emacs
If you want to use vi, that’s fine
Arguing about which is better makes the Thirty-Years' War look tameSlide7
Emacs (cont’d)
Emacs
is a wonder tool!
We will just scratch the surface
.
emacs
file in home directory can be customized
Commands can be executed via menus or using the underlying character sequences
I like the latter, so that’s what we’ll do
Copy the file “junk” from /scratch/
sondak
This will be our example file for editing
cp /scratch/
sondak
/junk
.Slide8
Emacs Exercise
Type “
emacs
”
An
emacs
window will appear
A built-in tutorial is available
Type
CTL-h t
Hold CTL while pressing h, release CTL, then press t
We won’t do anything with the tutorial here, but it’s a good resource
The “META” key in the tutorial is “Esc”
To read a file
CTL-x CTL-f
You will be prompted for file name at bottom of window
Type
junk
and hit return
If the file doesn’t exist,
emacs
will create itSlide9
Emacs Exercise (cont’d)
You should now see file contents in window
To move down
CTL-n
(“next line”)
To move up
CTL-p
(“previous line”)
To move forward
CTL-f
(“forward”)
To move backward
CTL-b
(“backward”)
You can also navigate by clicking on the desired location
Click on the 0 in 0.282Slide10
Emacs Exercise (3)
To delete a character
CTL-d
Hit CTL-d 3 times to delete 0.2
Type 1.3
You’ve now changed 0.282 to 1.382
Highlight 0.288 with the mouse
Don’t include spaces before or after
CTL-w
will delete the highlighted characters
Oh no, we made a mistake!
CTL-x u
undoes the previous command. Try it; 0.288 should reappear.
another CTL-x u undoes the command previous to that, etc. Slide11
Emacs Exercise (4)
The
point
is the location on the left side of the cursor; i.e., between the character on which the cursor resides and the character to its left.
The
mark
is similar to the point, but it’s location is set (i.e., doesn’t move with cursor).
Suppose we want to delete all the characters between (inclusively) 0.288 and 0.407.Slide12
Emacs Exercise (5)
Place the cursor on the 0 in 0.288.
can simply click on the 0
To set the mark,
CTL-spacebar
The note “Mark set” will appear at the bottom of the screen.
Move the cursor to the right of 0.407
We place it to the right of the 7 rather than on it because the point is always to the
left
of the cursorSlide13
Emacs Exercise (6)
CTL-w
will delete all characters between the mark and the point
For now, let’s put the characters back in by using
CTL-x u
Move the cursor to the start of the current line using
CTL-a
(
CTL-e
moves to end of current line)
Delete (“kill”) the line with
CTL-k
Another CTL-k deletes the newline characterSlide14
Emacs Exercise (7)
“Meta” key is the Esc key
We will use M- here to indicate the Meta key
The Meta key is hit
prior
to the subsequent key(s), not simultaneously as with CTL
Place the cursor at the top of the file
M->
will move the cursor to the bottom of the file
M-<
will move it back to the topSlide15
Emacs Exercise (8)
Suppose we want to swap positions of 14.747 and 14.688
Set the mark at the 1 in 14.747
Place the cursor on the 1 in 14.688 to set the point to the left of the 1
CTL-w will delete 14.747
Place the cursor over the space to the left of the first 1 in 16.155
CTL-y
“yanks” the previously-deleted stringSlide16
Emacs Exercise (9)
Suppose we want to swap positions of the second and third columns
Set the mark after the last 0 in 0.000 in the 1
st
row of data
Set the point to the right of the 8 in 0.758 in column 2, last row
CTL-x r k
(“kill rectangle”) deletes the column
Place the point after the 8 in 37.578
CTL-x r y
(“yank rectangle”) inserts the columnSlide17
Emacs Exercise (10)
To save the modified file,
CTL-x CTL-s
A note will appear at the bottom of the window saying the file has been saved
To save it under a new name,
CTL-x CTL-w
You’ll be prompted for the name at the bottom of the screen
Note that when you get these kinds of prompts, you can edit them using
emacs
commands
Type a file name and then move back and forth with CTL-b and CTL-f
CTL-x CTL-c
to quit
Previous version will appear with ~ suffix in working directorySlide18
Fortran History
Before Fortran, programs were written in assembly language
Fortran was the first widely-used high-level computer language
1957
Developed by IBM for scientific applicationsSlide19
Fortran History
Fortran 66 (1966)
Fortran 77 (1978)
Fortran 90 (1991)
“fairly” modern (structures, etc.)
Current “workhorse” Fortran
Fortran 95 (minor tweaks to Fortran 90)
Fortran 2003
Gradually being implemented by compiler companies
Object-oriented support
Interoperability with C is in the standard
yay
!Slide20
What Language Should I Use?
I
usually
suggest using the language you know best
Matlab
is great, but is not a good choice for major number crunching
Researchers often write codes in
Matlab
, and they grow and grow (the codes, not the researchers) until they are much too slow
Then a painful translation is often requiredSlide21
What Language? (cont’d)
Fortran is hard to beat for performance
C has the potential to be as fast as Fortran if you avoid aliasing issues and promise the optimizer your code won’t screw up aliasing
Fortran doesn’t have this issue due to the different nature of its pointers
I have not written large C++ codes, but it’s to my understanding that object-oriented constructs tend to be slow
Suggestion – write computationally-intensive codes in Fortran or C
Can parallelize using MPI and/or
OpenMPSlide22
Fortran Syntax
Source lines are not ended with semicolons (as in C or
Matlab
)
Ampersand at end of line tells compiler that statement is continued on next source line
Not
case-sensitive
Spaces don’t matter except within literal character strings
I use them liberally to make code easy to read
Comment character is
!Slide23
Fortran Syntax (cont’d)
Declarations – should declare each variable as being integer, real (floating point), character, etc.
Integers and
reals
are stored differently
Integer arithmetic will truncate result
If
i
=3 and k=2,
i
/k=1, k/
i
=0Slide24
Fortran Syntax (3)
There are sometimes several ways to do the same thing
For backward compatibility
We will only use modern constructs
Source file suffix is compiler dependent
Usually .f90Slide25
Fortran Syntax (4)
First statement in code is
program
statement
Followed by program name
I like to give the source file the same name as the program
myprog.f90 (name of source file)
program
myprog
(first line in source code)Slide26
Fortran Syntax (5)
implicit none
Due to older versions of Fortran
Had “implicit typing”
Variables did
not
have to be declared
If names started with
i
-n, were automatically integers
If a-
h,o
-z, were automatically single-precision
reals
Implicit typing is considered bad programming practice
Always use implicit none
often next line after
program
Implicit none says that all variables must be declared
If you use implicit none and don’t declare all variables, compiler will yell at youSlide27
Fortran Syntax (6)
A character string is enclosed by single quotes
Characters within the quotes will be taken literally
‘This is my character string.’
print*
“list-directed” output
Lazy way to produce output
No format required
Follow by comma, then stuff to print
print*, ’This is my character string.’Slide28
Fortran Syntax (7)
At the end of the code is an
end program
statement, followed by program name
Paired with program statement that starts the code
end program
myprogSlide29
Exercise 1
Write a “hello world” program in an editor
Program should print a string
4 lines of code
Save it to a file name with a .f90
suffix
solutionSlide30
Compilation
A compiler is a program that reads source code and converts it to a form usable by the computer
Code compiled for a given processor will not generally run on other processors
AMD and Intel
are
compatible
On katana we have Portland Group compilers (pgf90) and GNU compilers (
gfortran
)
We’ll use pgf90, since it’s usually fasterSlide31
Compilation (cont’d)
Compilers have huge numbers of options
See PGI compiler documentation at
http://www.pgroup.com/doc/pgiug.pdf
PGI Fortran reference is at
http://www.pgroup.com/doc/pgifortref.pdf
For now, we will simply use the –o option, which allows you to specify the name of the resulting executableSlide32
Compilation (3)
Can create a Unix window within
emacs
:
CTL-x 2
will split the window horizontally
CTL-x o
toggles between windows
“o” stands for “other”
M-x
will prompt for a command at the bottom of the window
Type “shell” (no quotes) for the command
Half of
emacs
window will now be a Unix shell, so you can do your compilation there
In a normal Unix
tcshell
you can retrieve previous Unix commands with the up arrow; here it’s CTL up arrow
In a Unix window (in
emacs
or separate window):
pgf90 –o
hello_world
hello_world.f90Slide33
Compilation (4)
Compile your code
If it simply returns a Unix prompt it worked
If you get error messages, read them carefully and see if you can fix the source code and re-compile
Once it compiles correctly, type the executable name at a Unix prompt, and it will print your stringSlide34
Declarations
Lists of variables with their associated types
Placed in source code directly after “implicit none”
Basic types:
Integer
Real
Character
logicalSlide35
Declarations (cont’d)
Examples:
integer ::
i
, j, k
real ::
xval
, time
character(20) :: name, date
logical ::
isitSlide36
Arithmetic
+, -, *, /
** indicates power
2.4**1.5
Built-in functions such as sin,
acos
, exp, etc.
Exponential notation indicated by letter “e”
4.2e5Slide37
More List-Directed i/o
read*
is list-directed read, analogous to
print*
Follow with comma, then comma-delimited list of variables you want to read
read*, x, j
Often use list-directed read and write together
print*, ‘Enter a float and an integer:’
read*, x, j
print*, ‘float = ‘, x, ‘ integer = ‘, jSlide38
Exercise 2
Write program to prompt for a
Celcius
temperature, convert it to Fahrenheit, and print the result.
make sure you declare all variables
it’s a good habit to use decimal points with all
reals
, even if they’re whole numbers, e.g.,
3.0
F = (9/5)C +
32
solutionSlide39
Arrays
Specify static dimensions in declaration:
real, dimension(10,3,5) :: x
Can also specify ranges of values
integer, dimension(3:11, -15:-2) ::
ival
,
jvalSlide40
Arrays (cont’d)
Dynamic allocation
Need to specify no. dimensions in declaration
Need to specify that it’s an
allocatable
array
real, dimension(:,:,:),
allocatable
:: x, y
allocate
function performs allocation
allocate( x(
ni,nj,nk
), y(
ldim,mdim,ndim
) )
When you’re done with the variables,
deallocate
deallocate
(x, y)
not necessary at very end of code; Fortran will clean them up for youSlide41
Parameters
If variable has known, fixed value, declare as parameter and initialize in declaration
integer, parameter ::
idim
= 100,
jdim
= 200
Compiler
substitutes values wherever variables appear in code
Efficient, since there are no memory accesses
Often used for declaring arrays
integer, parameter ::
idim
= 100,
jdim
= 200
real, dimension(
idim
,
jdim
) :: x
integer, dimension(
idim
) ::
iarraySlide42
Exercise 3
Write program to prompt for 2 floating-point vectors of length 3, calculate the dot product, and print the result
Don’t
name the code “
dot_product
” or “dot”
Fortran has a “
dot_product
” intrinsic function
there is a
unix
command called “dot”
If x is an array, can use array name in list-directed read, and it will expect the appropriate number of values (dimension) separated by
spaces
solutionSlide43
Control
Do loop repeats calculation over range of indices
do
i
= 1, 10
a(
i
) =
sqrt
( b(
i
)**2 + c(
i
)**2 )
enddo
Can use increment that is not equal to 1
Goes at
end
of do statement, unlike
Matlab
do
i
= 10, -10, -2Slide44
Exercise 4
Modify dot product program to use a do
loop
solutionSlide45
If-Then-Else
Conditional execution of block of source code
Based on relational operators
< less than
> greater than
== equal to
<= less than or equal to
>= greater than or equal to
/= not equal to
.and.
.or.Slide46
If-Then-Else (cont’d)
if( x > 0.0 .and. y > 0.0 ) then
z = 1.0/(
x+y
)
elseif
( x < 0.0 .and. y < 0.0) then
z = -2.0/(
x+y
)
else
print*, ’Error condition’
endifSlide47
Exercise 5
In dot product code, check if the magnitude of the dot product is less than using the absolute value function
abs
. If it is, print a message. If not, calculate the reciprocal of the dot product and print the result
.
solutionSlide48
Array Syntax
Fortran will perform operations on entire arrays
Like
Matlab
, unlike C
To add two arrays, simply use
c = a + b
Can also specify array sections
c(-5:10) = a(0:15) + b(0:30:2)
Here we use b(0), b(2), b(4), …Slide49
Array Syntax (cont’d)
There are intrinsic functions to perform some operations on entire arrays
sum
sum(x)
is the same as x(1) + x(2) + x(3) + …
product
minval
maxvalSlide50
Exercise 6
Modify dot product code to use array syntax instead of do loop
use “sum” intrinsic to sum
comnponents
solutionSlide51
Subprograms
Subroutines and functions
Function returns a single object (number, array, etc.), and usually does not alter the arguments
Altering arguments in a function, called “side effects,” is sometimes considered bad programming practice
Subroutine transfers calculated values (if any) through argumentsSlide52
Functions
Definition starts with a return type
End with “end function” analogous to “end program”
Example: distance between two vectors
real function
distfunc
(a, b)
real, dimension(3) :: a, b
distfunc
=
sqrt
( sum((b-a)**2) )
end function
distfunc
Use:
z =
distfunc
(x, y)
Names of dummy arguments don’t have to match actual names
distfunc
must be declared in calling routine
real ::
distfuncSlide53
Subroutines
End with “end subroutine” analogous to “end program”
Distance subroutine
subroutine
distsub
(a, b, dist)
real :: dist
real, dimension(3) :: a, b
dist =
sqrt
( sum((b-a)**2) )
end subroutine
distfunc
Use:
call
distsub
(x, y, d)
As with function, names of dummy arguments don’t have to match actual namesSlide54
Exercise 7
Modify dot-product program to use a subroutine to compute the dot product
The subroutine definition may go before or after the main program in source code
Don’t forget to declare
arguments
solutionSlide55
Basics of Code Management
Large codes usually consist of multiple files
I usually create a separate file for each subprogram
Easier to edit
Can recompile one subprogram at a time
Files can be compiled, but not linked, using –c option; then object files can be linked
pgf90 –c mycode.f90
pgf90 –c myfunc.f90
pgf90 –o
mycode
mycode.o
myfunc.oSlide56
Exercise 8
Put dot-product subroutine and main program in separate files
Give main program same name you have been using for code, e.g., “program
dotprod
” and dotprod.f90
Give subroutine same name you used for subroutine, e.g., “subroutine
dp
” and dp.f90
Compile, link, and
run
solutionSlide57
Makefiles
Make is a Unix utility to help manage codes
When you make changes to files, it will
Automatically deduce which files need to be compiled and compile them
Link latest object files
Makefile
is a file that tells the make utility what to do
Default name of file is “
makefile
” or “
Makefile
”
Can use other names if you’d likeSlide58
Makefiles (cont’d)
Makefile
contains different sections with different functions
The sections are
not
executed in order!
Comment character is
#
There are defaults for some values, but I like to define everything explicitlySlide59
Makefiles (3)
example
makefile
:
### suffix rule
.SUFFIXES:
.SUFFIXES: .f90 .o
.f90.o:
$(F90) $(COMPFLAGS) $*.f90
### compiler
F90 = pgf90
COMMONFLAGS = -O3
COMPFLAGS = -c $(COMMONFLAGS)
LINKFLAGS = $(COMMONFLAGS)
### objects
OBJ =
mymain.o
sub1.o sub2.o fun1.o
### compile and link
myexe
: $(OBJ)
$(F90) –o $@ $(LINKFLAGS) $(OBJ)Slide60
Makefiles (4)
variables
Some character strings appear repeatedly in
makefiles
It’s convenient to give them names so if they are changed, you only have to do it in one place
To define variable:
name = string
No quotes are required for the string
String may contain spaces
“name” is any name you want
Variable names are usually all capitals
To continue line, use
\
characterSlide61
Makefiles (5)
Variables (cont’d)
To use variable, either of these work:
$(name)
${name}
Example:
Define compiler
F90 = pgf90
To use elsewhere in
makefile
:
$(F90)Slide62
Makefiles (6)
Good practice to define compiler info in variables
F90 = pgf90
COMMONFLAGS = -O3
COMPFLAGS = -c $(COMMONFLAGS)
LINKFLAGS = $(COMMONFLAGS)Slide63
Makefiles (7)
Have to define all file suffixes that may be encountered
.SUFFIXES: .o .f90
Just to be safe, delete any default suffixes first with a null .SUFFIXES: command
.SUFFIXES:
.SUFFIXES: .o .f90Slide64
Makefiles (8)
Have to tell how to create one file suffix from another with a
suffix rule
.f90.o:
$(F90) $(COMPFLAGS) $*.f90
The first line indicates that the rule tells how to create a .o file from a .f90 file
The second line tells
how
to create the .o file
The big space before $(F90) is a tab, and you must use it!
*$ is automatically the root of the first fileSlide65
Makefiles (9)
Usually define variable with all object file names
OBJ =
mymain.o
sub1.o
anothersub.o
\
firstfunc.o
func2.oSlide66
Makefiles (10)
Finally, everything falls together with the definition of a
rule
target: prerequisites
recipe
The target is any name you choose
Often use name of executable
Prerequisites are files that are required by target
e.g., executable requires object files
Recipe tells what you want the
makefile
to doSlide67
Makefiles (11)
### suffix rule
.SUFFIXES:
.SUFFIXES: .f90 .o
.f90.o:
$(F90) $(COMPFLAGS) $*.f90
### compiler
F90 = pgf90
COMMONFLAGS = -O3
COMPFLAGS = -c $(COMMONFLAGS)
LINKFLAGS = $(COMMONFLAGS)
### objects
OBJ =
mymain.o
sub1.o sub2.o fun1.o
### compile and link
myexe
: $(OBJ)
$(F90) –o $@ $(LINKFLAGS) $(OBJ)
Automatic variable for targetSlide68
Makefiles (12)
When you type “make,” it will look for a file called “
makefile
” or “
Makefile
”
It then searches for the first target in the file
In our example (and the usual case) the object files are prerequisites
It checks the suffix rule to see how to create an object file
In our case, it sees that .o files depend on .f90 files
It checks the time stamps on the associated .o and .f90 files to see if the .f90 is newer
If the .f90 file is newer it performs the suffix rule
In our case, compiles the routineSlide69
Makefiles (13)
Once all the prerequisites are updated as required, it performs the recipe
In our case it links the object files and creates our executable
Many
makefiles
have an additional target, “clean,” that removes .o and other files
clean:
rm
–f *.o
When there are multiple targets, specify desired target as argument to make command
make cleanSlide70
Exercise 9
Create a
makefile
for your dot product code
Include two targets
executable
clean
Delete your old object files using “make clean”
Build your code using the
makefile
solutionSlide71
Kind
Declarations of variables can be modified using “kind” parameter
Often used for precision of
reals
Intrinsic function
selected_real_kind
(n)
returns kind that will have at least
n
significant digits
n = 6 will give you “single precision”
n = 12 will give you “double precision”Slide72
Kind (cont’d)
integer, parameter ::
rk
=
selected_real_kind
(12)
real(
rk
) :: x, y, z
real(
rk
), dimension(101,101,101) :: a
If you want to change precision, can easily be done by changing one line of codeSlide73
Exercise 10
Modify dot-product code to use kinds to declare double-precision
reals
Don’t forget to modify all files
“make” will automatically compile and
link
solutionSlide74
Modules
Program units that group variables and subprograms
Good for global variables
Checking of subprogram arguments
If type or number is wrong, linker will yell at you
Can be convenient to package variables and/or subprograms of a given typeSlide75
Modules (cont’d)
module
module
-name
implicit none
… variable declarations …
contains
… subprogram definitions …
end module
module
-nameSlide76
Modules (3)
Only need “contains” if module contains subprograms
I usually name my modules (and associated files) with _mod in the name, e.g.,
solvers_mod
, solvers_mod.f90
In program unit that needs to access components of module
use
module-name
use
statement must be
before
implicit noneSlide77
Modules (4)
use
statement may specify specific components to access by using “only” qualifier:
use
solvers_mod
, only:
nvals
, x
A Fortran style suggestion:
Group global variables in modules based on function
Employ “use only” for all variables required in program unit
All variables then appear at top of program unit in declarations or “use” statementsSlide78
Modules (5)
When linking object files, modules must come first in the list
In my
makefiles
I create a MODS variable analogous to OBJS
Link command then contains $(MODS) $(OBJS)Slide79
Exercise 11
Create module
prec_mod
Separate file called prec_mod.f90
Parameter
rk
Real kind for double
Use this module in dot-product program units
Modify
makefile
to compile module
add module list to dependencies and link
recipe
solutionSlide80
Derived Types
Analogous to structures in C
Can package a number of variables under one name
type grid
integer ::
nvals
real, dimension(100,100)
:: x, y,
jacobian
end type gridSlide81
Derived Types (cont’d)
To declare a variable
type(grid) :: grid1
Components are accessed using
%
grid1%nvals = 20
grid1%x = 0.0
Handy way to transfer lots of data to a subprogram
call
calc_jacobian
(grid1)Slide82
Exercise 12
Create module with definition of
rvec3
type
Size of vector
nvals
=3
not a
paremeter
– can’t have parameter in derived type
Real 3-component vector
Use
prec_mod
Modify code to use rvec3
Modify
makefile
to include new
module
solutionSlide83
i/o
List-directed output gives little control
write
statement allows formatted output
write(unit, format) variables
Unit is a number indicating where you want to write data
The number 6 is std out (write to screen)Slide84
i/o (cont’d)
i
m
For integers
m is total number of characters in field
i3 125
a
m
For character strings
m is number of characters
a5 hello
Left-justifies
If m isn’t specified, writes number of characters in variable declarationSlide85
i/o (3)
f
m
.
n
For floating-point (real) numbers
m is total number of characters in field
n is number of decimal places
f5.3 1.234
f5.2 -1.23
If m is larger than required, right-justifies
e
m.n
Exponential notation
e9.2 -0.23e-01
Always zero left of decimalSlide86
i/o (4)
es
m.n
scientific notation
es9.2 -2.30e-02
In format statement, put formats within ‘()’
Example write statement
write(6, ‘(a, f6.2, i5, es15.3)’) ‘answers are ’, x, j, ySlide87
i/o (5)
Suppose you want to write to a file?
open
statement
open(11, file=‘
mydata.d
’)
“11” is unit number
Don’t use 5 or 6
Reserved for std in, std out
Use this unit in your write statement
When you’re finished writing, close the file
close(11)Slide88
i/o (6)
Can also read from file
read
rather than write
Can use * instead of format
specifier
read(11,*) j, xSlide89
Exercise 13
Write your dot-product result to a
file
solutionSlide90
Unformatted i/o
Binary data take much less disk space than
ascii
(formatted) data
Data can be written in binary representation
Not directly human-readable
open(199, file=‘
unf.d
’, form=‘unformatted’)
write(199) x(1:100000), j1, j2
read(199) x(1:100000), j1, j2
Note that there is no format specification
Fortran unformatted slightly different format than C binary
Fortran unformatted contains record delimitersSlide91
Exercise 14
Modify dot-product program to:
Write result to unformatted file
don’t write character string, just number
After file is closed, open it back up and read result
Print result to make sure it wrote/read
correctly
solutionSlide92
References
Lots of books available
I have an older edition of “
Fortran 95/2003 Explained” by Metcalf, Reid, and Cohen that I like
PGI
Compiler
http://www.pgroup.com/doc/pgiug.pdf
Fortran language reference
http://www.pgroup.com/doc/pgifortref.pdf
gfortran
http://gcc.gnu.org/wiki/GFortranSlide93
Survey
Please fill out the course survey at
http://scv.bu.edu/survey/fall10tut_survey.html