introduction to fortran - university of alaska...
TRANSCRIPT
1
Introduction to Fortran
Ed Kornkven
PHYS F693
Spring 2004
Resources
• http://www.csl.mtu.edu/cs2911/www/FortranReview.htm
– The source of these notes - some bugs• http://www.fortran.com/fortran/tutorials.html
– List of Fortran Tutorials
– The Manchester Computer Centre materials are anice set of notes but unfortunately in PostScriptformat
• Fortran 90 for Engineers and Scientists, Larry Nyhoff andSanford Leestma, Prentice-Hall, 1997
2
Source Form
• Max. line length of 132 characters
• Case insensitive
• Identifiers
– Begin with alpha
– Contain alphanumeric and underscore
– Max. length of 31 characters
• Exclamation begins comment
Source Form (cont.)
• Ampersand (&) at end of lineindicates continuation
• Semicolon separates multiplestatements on a line
• Statement labels are integers
3
Source Form (cont.)
PROGRAM name ! Exclamation mark indicates comment
IMPLICIT NONE ! Don’t implicitly declare variables ! declarations follow and must precede use:CONTAINS ! Internal subroutines and functions follow:END PROGRAM name
Prototype CodePROGRAM main
IMPLICIT NONEREAL :: a=6.0, b=30.34, c=98.98REAL :: mainsummainsum = add()
CONTAINSFUNCTION add()
REAL :: add ! a,b,c defined in 'main'add = a + b + c
END FUNCTION addEND PROGRAM main
4
Declaration of Primitive Types
INTEGER :: i, j = 2 ! do not forget the double :: without spaces REAL :: a, b, c = 1.2 LOGICAL, PARAMETER :: debug = .true.
! Parameter indicates a constant CHARACTER(20) :: name = "John"
IMPLICIT NONE ! always use
Assignment Statement
• variable = expression
I = 3**2 J = MOD(15, 2)
A = 'Quotes delineate character literal' B = "Can also use double quotes.”
5
Operators and Their Priority
Left-to-right+ -Addition and
subtraction
Left-to-right* /Multiplication
and division
Right-to_left**Exponentiation
AssociativitySymbolArithmeticOperator
Some Intrinsic Functions
REALREALLOG(x)
REALREALexEXP(x)
REALREALTangent of x radiansTAN(x)
REALREALCosine of x radiansCOS(x)
REALREALSine of x radiansSIN(x)
REALREALSquare root of xSQRT(x)
REALREAL
INTEGERINTEGERAbsolute value of xABS(x)
RETURNTYPEARG TYPEDESCRIPTIONFUNCTION
6
Conversion Functions
INTEGERINTEGERMax of x1,.. xnMAX(x1,.., xn)
REALINTEGERConverts x to REALREAL(x)
INTEGERINTEGERx - INT( x/y) * yMOD(x,y)
REALREAL
INTEGERINTEGERMin of x1,.. xnMIN(x1,.., xn)
REALREAL
INTEGERREALFractional part of xFRACTION(x)
INTEGERREALGreatest integer < or =
to xFLOOR(x)
INTEGERREALNearest integer to xNINT(x)
INTEGERREALInteger part of xINT(x)
RETURN
TYPEARG TYPEDESCRIPTIONFUNCTION
Input/Output
• READ(integer_unit_number, format-format_line)– Fortran “unit number” functions like a file
descriptor in C– Formats are powerful and complex like they are in
C• READ(*,*) a, b, c ! asterisks for default values
– Traditional default unit numbers are• 5 = stdin• 6 = stdout
• PRINT format,• PRINT *, 'hi’
– Shortcut for WRITE(*,*)
7
Input/Output
• Full treatment of I/O is important forscientific computing but not possiblehere -- e.g.:– Binary and text files– Sequential and direct access– On-the-fly conversions between different binary
formats– Setting record lengths, block sizes, etc.– Special instructions for asynchronous I/O
Logical Operators andPrecedence
Left-to-right.EQV. .NEQV.
Left-to-right.OR.
Left-to-right.AND.
Right-to-left.NOT.Logical
None.LT. .LE. .GT..GE. .EQ. .NE.
(old style)
< <= > >= == /=Relational
ASSOCIATIVITYOPERATORTYPE
8
IF Statements
• Single line formIF ( logical-expr ) statement
• Multiple statement formIF ( logical-expr ) THEN statementsEND IF
• If-else formIF ( logical-expr ) THEN statementsELSE statementsEND IF
• Else-if formIF ( logical-expression )
THEN statementsELSE IF (logical-expression)
THEN statementsELSE IF (logical-expression)
THEN statementsELSE statementsEND IF
Selection• SELECT CASE StatementSELECT CASE (selector)
CASE (label-list-1)
statements-1
CASE (label-list-2)
statements-2
CASE (label-list-3)
statements-3
...........
CASE (label-list-n)
statements-n
CASE DEFAULT
statements-DEFAULT
END CASE
9
SELECT Labels
• A label has one of the following fourforms:
Label Meaning
:x all values less or equal x
x: all values greater or equal to x
x:y all values in the range of x and y
x the values of x itself
SELECT Example
SELECT CASE(index) CASE(:0) print *, "index is equal or less then zero" CASE(1: maxIndex) print *, "index is in range" CASE( int(maxIndex/2) ) print *, "index is at mean" CASE(maxIndex+1:) print *, "index is greater the max"END CASE
10
Iteration
• General DO-Loop w/ EXITDO Statements-1 IF (Logical-Expr) EXIT Statements-2END DO
• Nested DO-loop:Outer: DO IF (expression-1) EXIT Outer Statements-1 Inner: DO IF (expression-2) EXIT Inner Statements-2 END DO Inner Statements-3END DO Outer
• Counting LoopDO var=init-val,final-val,step-size StatementsEND DO
• Default step-size is 1DO var=initial-value, final-value StatementsEND DO
• CYCLE: jump up to the topof loop and increment (likecontinue in C)
Iteration Examples
• Classic example
Sum = 0DO Count = 1, N
READ*, InputSum = Sum + Input
END DOAverage = REAL(Sum) / REAL(N)
• Another example
READ(*,*) NFactorial = 1DO I = 1, N
Factorial = Factorial * IEND DO
11
Obsolescent/RedundantLoops
• Fortran 77 DO loops
DO 100 I=1, Nstatements
100 CONTINUE
• Redundant WHILE loop
DO WHILE(logical-expr)statements
END DO
• Equivalent toDO
IF (logical_expr) EXITstatements
END DO
Subprograms
• Subroutines– Don’t return a value
except by modifyingarguments
– Therefore, not typed andnot declared
– Arguments are passedby reference
– Invoked by CALLstatement
• Functions– Conceptually return a
value, don’t modifyarguments; but this is notenforced!
– Typed by return value; mustbe declared
– Arguments are passed byreference
– Assign return value tofunction name
– Invoked by name reference
12
Subroutine Example
SUBROUTINE swap(a,b)IMPLICIT NONE ! Good habitINTEGER, INTENT(INOUT):: a, b ! INTENT is optionalINTEGER:: tmp ! localtmp = aa = bb = tmpEND SUBROUTINE swap
! Call with:CALL swap(x,y) ! Call by reference!
Function ExampleREAL FUNCTION fact(k)IMPLICIT NONEINTEGER, INTENT (IN) :: kREAL :: fINTEGER :: i
IF (k .lt. 1) THEN fact = 0.0ELSE f = 1.0 DO i = 1, k f = f * i END DO fact = fEND IFEND FUNCTION fact
13
More Fun With Functions• Look, Ma! Fortran can do recursion!
– Just declare the routine to be recursive andspecify the result value
RECURSIVE REAL FUNCTION fact3(k) RESULT (fact)IMPLICIT NONEINTEGER, INTENT (IN) :: k
IF (k .lt. 1) THEN fact = 0.0ELSE IF (k .eq. 1) THEN fact = 1.0ELSE fact = k * fact3(k-1)END IFEND FUNCTION fact3
More Fun With Functions• By default, variables declared inside a
subprogram have– Local scope– “Automatic” lifetime
• A local variable can be given a “static”lifetime by either– Initializing it
INTEGER :: keeper = 0– Or giving it the SAVE attribute when declaring it
INTEGER, SAVE :: keeper
14
Expressions & Assignments
• Data types
– Implicit typing rules
• Operators
• Library functions
• Assignments
1-D Arrays
• Syntax– type, DIMENSION ( extent ) :: name-1, name-2, ...
– type, DIMENSION( lower : upper) :: list-array-names
• Array operands and operators
– InitializationA = (/ 1, 2, 3 /)
– Array expressions and assignmentsA = B + C ! These operations are done
A = B * 3.14 ! element-wise
15
Array ExampleREAL FUNCTION fact(k)INTEGER, INTENT (IN) :: kINTEGER, PARAMETER :: N = 8REAL :: f ! Don’t use “fact” on RHS!REAL :: precmp(N)=(/1.0,2.0,6.0,24.0,120.0,720.0,5040.0,40320.0/)IF (k .lt. 1) THEN fact = 0.0ELSE IF (k .le. N) THEN fact = precmp(k)ELSE f = precmp(N) DO i = N+1, k f = f * i END DO fact = fEND IFEND FUNCTION fact
Some Array Functions
Maximum value in array AMAXVAL(A)
Product of the elements in APRODUCT(A)
Sum of the elements in ASUM(A)
Number of elements in ASIZE(A)
One Dimensional array of oneelement containing the location ofthe smallest element
MINLOC(A)
One Dimensional array of oneelement containing the location ofthe largest element
MAXLOC(A)
Minimum value in array AMINVAL(A)
RETURNSFUNCTION
16
Dynamic Array Allocation
• Syntax– type, DIMENSION(:), ALLOCATABLE :: list-of-array-names
– ALLOCATE(list, STAT = status-variable)
– DEALLOCATE( list, STAT= status-variable)
Dynamic Array Allocation
• Example
PROGRAM mainINTEGER, DIMENSION(:), ALLOCATABLE :: AINTEGER :: aStatus, NWRITE(*, '(1X, A)', ADVANCE = "NO") "Enter array size: "READ *, N ! Try 1 billion on your PC!ALLOCATE( A(N), STAT = aStatus )IF (aStatus /= 0) STOP "*** Not enough memory ***"PRINT*, ‘Array allocated with size ‘, N
DEALLOCATE(A)PRINT*, ‘Array deallocated…’END PROGRAM main
17
Multidimensional Arrays
• Syntax– type, DIMENSION( dim1,dim2,…) :: list-array-names
– type, DIMENSION(:,:,…), ALLOCATABLE :: list-array-names
– ALLOCATE(array-name( lower1: upper1, lower2: upper2) ,
STAT = status)
• Examples– INTEGER, DIMENSION(100,200) :: a
– INTEGER, DIMENSION(:,:), ALLOCATABLE :: a
Multidimensional Arrays• Column-major ordering
– Suppose we have the declarationINTEGER, DIMENSION(100,200) :: a
– The usual way of viewing a 2-D array reference is• A(row,column) - first dimension is “rows”, second is “columns”
– Of course, computer memory is 1-D. How is virtual 2-D array mapped to real memory?
• In Fortran, it is in column-major order -- I.e., column-by-column• NB: C is row-major order!
– Yes, there are situations in which we care!• Certain performance situations• Interfacing Fortran and C
18
Multi-D Array Functions
Array of one less dimension containing the
maximum values in array A along dimension D. If D
is omitted, maximum of the entire array is returned.
MAXVAL(A,D)
Number of elements in ASIZE(A)
Like MAXLOC() but for smallest elementMINLOC(A)
One Dimensional array of one element containing
the location of the largest elementMAXLOC(A)
Like MAXVAL() but for minimaMINVAL(A,D)
RETURNSFUNCTION
Multi-D Array Fns (cont.)
Matrix product of A and B (provided result is
defined)MATMUL(A,B)
Array of one less dimension containing the products
of the elements of A along dimension D. If D is
omitted, the product of the elements of the entire
array is returned.
PRODUCT(A)
Array of one less dimension containing the sums of
the elements of A along dimension D. If D is
omitted, the sum of the elements of the entire array
is returned.SUM(A,D)
RETURNSFUNCTION
19
Modules
• Modules - used to packagetogether
– Type declarations
– Subprograms
– Data type definitions
• Forms a library that can be usedin other program units
Module Syntax
• Module definitionMODULE module-name IMPLICIT NONE specification part
PUBLIC :: Name-1, Name-2, ... , Name-n PRIVATE :: Name-1, Name-2, ... , Name-n
CONTAINS internal-functionsEND MODULE
• Module use - use the USE to useUSE module-name
20
New Fortran Features ThatWe Can’t Cover
• Pointers
• User-defined types and operations
• INTERFACE blocks
• KIND
• Others -- can you say “C++”?
Obsolescent & RedundantFeatures
• Arithmetic IF
• PARAMETER
• DATA
• GO TO
• Computed GO TO
• COMMON blocks
• EQUIVALENCE
22
SX-6 Overview• SX-6 Node
– 8 CPUs
– 64 GB Memory
• Performance
– 64 GFLOPS perNode
• SUPER-UXoperating system
– 32- and 64-bit IEEE
SX-6Languages /
ProgrammingModels
√Fortran 90
Co-array Fortran
UPC
√HPF
√C++ / C
SHMEM
√ ("almost all")MPI-2
√MPI
√OpenMP
√Auto par.
SX-6 ProgrammingEnvironment
23
CPU Performance Overview
12.828Peak perf.(GFLOPS)
800500500Clock (mHz)
34.13.631.9Mem. BW(GB/sec)
128 x 64 x 648 x 64 x 648 x 256 x 64Vector regs.
828Vector pipes
X1SV1exSX-6
Earth Simulator - 40 TFlops
• 640 SX-6 cabinets
• x 8 Pes each
• = 40960 GFLOPS
• > combined 5nearest competitors
“Real Performance”?
• SC 2002 Gordon Bell prize winner
• Sustained rates exceeding 25 TFLOPS
24
Compiling on SX-6
• Gateway machine
– rimegate.arsc.edu
– An SGI front end
– Fast compiles using SX cross-compilers
• SX-6
– rime.arsc.edu
– Limited disk space, no backups• http://www.arsc.edu/support/howtos/usingsx6.html
Compiling on SX-6 (cont.)
• Summary
– Give Fortran source files a suffix of .f90
– Rime compile: f90 file.f90
– Rimegate compile: sxf90 file.f90
– Execute (must be on Rime!): ./a.out
– For compiler options: man {sx}f90
– NQS batch system