Вы находитесь на странице: 1из 133

Fortran Training Course

KISTI Supercomputing Center


http://www.ksc.re.kr
http://edu.ksc.re.kr

Reference Resources
 http://seismic.yonsei.ac.kr/fortran/


http://www.cs.mtu.edu/~shene/COURSES/cs201/NOTES/fortran.html

 http://ihlee.kriss.re.kr/compphys/f90module.htm
 http://blog.npol.net/116
 http://www.star.le.ac.uk/~cgp/f90course/f90.html
 http://www.fortran.com/tutorials.html
 Etc.
SUPERCOMPUTING EDUCATION CENTER

Agenda
1 Day
09:30

10:30

 Environment Setup

10:30

10:40

 Break

10:40

12:00

 Fortran Introduction
 Selective Statement

12:00

13:30

 Lunch

13:30

14:50

 Derived Data Type


 Loop Statement

14:50

15:00

 Break

15:00

16:30

 Array

SUPERCOMPUTING EDUCATION CENTER

Agenda
2 Day
 Dynamic Allocation

09:30

10:30

10:30

10:40

 Break

10:40

12:00

 Module

12:00

13:30

 Lunch

13:30

14:40

 Recursive

 Subprogram

 File I/O
14:40

14:50

 Break

14:50

16:30

 Advanced Lab
 Summary & Closing

SUPERCOMPUTING EDUCATION CENTER

Index

2014-04-14

What is Fortran

Basic Grammar

Formatted Output

Selective Statement

Derived Data Type

Loop

Array, Dynamic Allocation, Array Function

Subprogram

Module

File I/O

Advanced Lab & Summary

SUPERCOMPUTING EDUCATION CENTER

Connect to edu system

Environment Setup

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

Basic User Environment


L ogin
4

ssh, sftp, ftp, X11

U nix or Linux
$ ssh -l user_id xxx.xxx.xxx.xxx
$ ssh -l user_id IP address

or

W indows
putty SSH Secure Shell Client ssh
Free Download Site :

SUPERCOMPUTING EDUCATION CENTER

http://www.putty.org/

Login to Education System


 Host Name : xxx.xxx.xxx.xxx (PuTTY Usage)

SUPERCOMPUTING EDUCATION CENTER

Login to Education System


 SSH -> X11 Tab - Enable X11 forwarding Check
 X display location : localhost:0.0
 Save

<Be careful>

Xming must be started


in XP or Win7

SUPERCOMPUTING EDUCATION CENTER

Login to Education System


 PuTTY Security Alert

SUPERCOMPUTING EDUCATION CENTER

Yes(Y) Click

Login to Education System


 login as : edun##
(## is your table number at the corner)
 edun##@ xxx.xxx.xxx.xxxs password :

SUPERCOMPUTING EDUCATION CENTER

10

Login to Education System


 Login to lab node (s0001, s0002, s0003, s0004)
$ ssh s0003

 GNU Fortran Compiler Selection

SUPERCOMPUTING EDUCATION CENTER

11

01. What is Fortran

What is Fortran

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

12

What is Fortran?
 FORmula () TRANslation ()

1950 IBM
(High Level Language)
 C


1966 Fortran V (Fortran77) by ANSI, ISO
, (1980, ISO)  FORTRAN 77
 Fortran 90 (1991 , )
 Fortran 95
 Fortran 2003

SUPERCOMPUTING EDUCATION CENTER

13

Fortran




,


(legacy code)


,
, ,

 Software Inertia

SUPERCOMPUTING EDUCATION CENTER

14

First Fortran Code


Hello, World
PROGRAM

HELLO

IMPLICIT NONE

Program
Name

WRITE (*, *) Hello, World

STOP

! [STOP] is optional

END PROGRAM HELLO

! [PROGRAM] [hello] is optional

$ gfortran o hello.x hello.f90


$ ./hello.x

SUPERCOMPUTING EDUCATION CENTER

15

SUPERCOMPUTING EDUCATION CENTER

16

02. Basic Fortran Grammar

Basic Fortran Grammar

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

17

Fortran77 (1/2)
 77
1 Column : c, * 2~72 column
1~5 Column : (1~99999), Optional
6 Column : (0, ),
Optional
7~72 :
73~80 Column : , Optional ( )

2~5

7~72

73~80

Total=x_value+y_value
&
C
9

+z_value
Comment line

9999

FORMAT(Answer =,I4)

SUPERCOMPUTING EDUCATION CENTER

18

Fortran77 (2/2)


72
5
6
1 ,
(6)


 (Fortran90 )



 () (Recursive) (Factorial)
 COMMON , EQUIVALENCE

SUPERCOMPUTING EDUCATION CENTER

19

Fortran77

vs

Fortran90

 Fortran90

Type Declaration attributing
New control structure
Numeric Processing
Dynamic Memory Allocation
Array Processing
Pointers



SUPERCOMPUTING EDUCATION CENTER

20

Example Code
Fortran77 Style (Fixed Format)
C234567890123456789012345678901234
C This is a Fortran 77 Style
PROGRAM ex2_f77
INTEGER
i
REAL
r
CHARACTER*10 str
i = 10
r = 20.0
str = I study Fortran90
C Show Messages
WRITE(*, *) 'i = ', i
WRITE(*, *) 'r = ', r
WRITE(*, *) 'str = ,
& str

Fortran90 Style (Free Format)


! This is a Fortran 90 Style

PROGRAM ex2_f90
IMPLICIT NONE
INTEGER :: i = 10
REAL :: r = 20.0
CHARACTER*10 :: str = I study Fortran90
WRITE(*, *) 'i = ', i
WRITE(*, *) 'r = ', r
WRITE(*, *) 'str = ', str
STOP
END

STOP
END

$ gfortran o ex2_f77.x ex2_f77.f


$ ./ex2_f77.x

SUPERCOMPUTING EDUCATION CENTER

$ gfortran o ex2_f90.x ex2_f90.f90


$ ./ex2_f90.x
21

Fortran 90

(http://www.comphys.uni-duisburg.de/Fortran90/pl/pl.html)
SUPERCOMPUTING EDUCATION CENTER

22

Fortran 90 Improved Syntax (1/3)




132
IBM XL Fortran 6700

;
!
&
31 ( )
IBM XL Fortran 250


.LT., .LE., .EQ., .NE., .GE., .GT. : Fortran77
<, <=, ==, /=, =>, >
: Fortran90
Fortran : /=
C/C++

SUPERCOMPUTING EDUCATION CENTER

: !=

23

Fortran 90 Improved Syntax (2/3)


 Fortran 90
- : a-z, A-Z, 0-9, _ (underscore)
Symbol

Description

Symbol

Description

Space

Equal

Plus

Minus

Asterisk

Slash

Left parenthesis

Right parenthesis

Comma

Period

Single quote

Double quote

Colon

Semi colon

Shriek

&

Ampersand

Percent

<

Less than

>

Greater than

Dollar

Question mark

SUPERCOMPUTING EDUCATION CENTER

24

Fortran90 Improved Syntax (3/3)


 Improved Syntax
Fortran90 Style

PROGRAM free_source_form
IMPLICIT NONE
REAL :: tx, ty, tz

! Trailing statements

tx=1.0 ; ty=2.0 ; tz=tx*ty

! Multiple statements

PRINT*, &
tx,ty,tz

! Continuation symbol on line to be continued

END PROGRAM free_source_form

SUPERCOMPUTING EDUCATION CENTER

25

Fortran90 Data Type, Variable (1/2)


 Fortrans 5 Data Types
Size

Type

Description

Integer

4 Byte

Real

4 Byte

Character

Logical

4 Byte

Complex

4 Byte

SUPERCOMPUTING EDUCATION CENTER

(64bit OS)

Example

0, 120, -235, +32856


3.141592654,
123.45E0,

0.2353
1234.3E-3

1Byte ()

?Byte ()

Sunday

.TRUE. ,

.FALSE.

C = (1.4, 3.2)

26

Fortran90 Data Type, Variable (2/2)


 Variable Declaration
INTEGER
REAL
CHARACTER(LEN=10)
or
CHARACTER(10)

:: score = 10, rank = 5


:: average, total = 10.23
:: str = ABCDEFGHI
:: str, msg*20

Fortran77

Fortran90

INTEGER n

IMPLICIT NONE

PARAMETER(n=1000)

INTEGER, PARAMETER :: n=1000

INTEGER pixels(n, n), encode(n, n)

INTEGER, DIMENSION(n, n) :: pixels,

REAL x(n), y(n)

encode

INTEGER*8 call

REAL, DIMENSION(n) :: x, y

call = 0

INTEGER(8) :: call=0

SUPERCOMPUTING EDUCATION CENTER

27

Variable Names
 Variable Naming Rule
Must be at least one alphabetic character long, up to a maximum of 6
alphanumeric characters (Fortran77)
Must start with an alphabetic character
Alphanumeric characters are : a-z,0-9 and the underscore (_)
Capital letters are treated the same way as lower-case letters

Valid

Invalid

X*Z

THEDAY

THE TIME

Min_cur

7YEARS

Time28

_no_way$

SUPERCOMPUTING EDUCATION CENTER

28

Assignment
 <variable> = <value> | <variable>| <expression>
Expressions follow the BODMAS precedence rule
Operators +, -, *, /, **
Only round bracket

Assignment

radius = 2.5
y=z
test = value+loop-temp
volume = (4.0*pi*radius**3.0) / 3.0

SUPERCOMPUTING EDUCATION CENTER

29

Implicit None (F90)


 I, J, K, L, M, N
, (INTEGER)
 (REAL)
 Fortran 90 IMPLICIT NONE

Ok

Not Ok

! Fortran77

! Fortran90

I = 10
K=5
J=I+K

IMPLICIT NONE

POW = 3.0

I = 10
K=5
J=I+K

! Error, Not declared


! Error , Not declared
! Error , Not declared

 C/C++

SUPERCOMPUTING EDUCATION CENTER

30

Example Code
Fortran77
PROGRAM ex2a_f77
INTEGER i
REAL r
CHARACTER*10 str
i = 10
r = 20.0
str = '1234567890'
WRITE(*, *) 'i = ', i
WRITE(*, *) 'r = ', r
WRITE(*, *) 'str = ', str

Fortran90
PROGRAM ex2a_f90
IMPLICIT NONE
INTEGER :: i = 10
REAL :: r = 20.0
CHARACTER*10 :: str = 1234567890
WRITE(*, *) 'i = ', i
WRITE(*, *) 'r = ', r
WRITE(*, *) 'str = ', str
STOP
END

STOP
END

$ gfortran o ex2a_f77.x ex2a_f77.f


$ ./ex2a_f77.x

SUPERCOMPUTING EDUCATION CENTER

$ gfortran o ex2a_f90.x ex2a_f90.f90


$ ./ex2a_f90.x
31

Parameter
 Parameter is constants(), their value, once defined, can not
be changed with new values
 C/C++ const
 Located in front of the Executable statement
Parameter type
REAL

gamma, pi

INTEGER, PARAMETER :: days = 365

! Fortran90 Style

PARAMETER(gamma=1.4, pi=3.14)

! Fortran77 Style

pi = pi * 3

! Error - Not allowed

days = days + 3

! Error Not allowed

SUPERCOMPUTING EDUCATION CENTER

32

Example Code
Fortran77
PROGRAM ex2b_f77
REAL r, area, pi
PARAMETER (pi=3.141592)
r=5
area = pi * r * r

Fortran90
PROGRAM ex2b_f90
IMPLICIT NONE
REAL :: r = 5, area
REAL, PARAMETER :: pi = 3.141592
pi = pi + 0.3
area = pi * r * r

WRITE (*, *) 'Area =', area


WRITE (*, *) 'Area =', area
STOP
END

STOP
END

$ gfortran -o ex2b_f77.x ex2b_f77.f


$ ./ex2b_f77.x

SUPERCOMPUTING EDUCATION CENTER

$ gfortran -o ex2b_f90.x ex2b_f90.f90


$ ./ex2b_f90.x
33

Operation
 Fortran
B2 4AC  B ** 2 4 * A * C

 Data type
Integer  7 / 4 = 1
Real
 7.0 / 4.0 = 1.75

 Mixed-Mode Expressions
7.0 / 4  7.0 / 4.0 = 1.75
7.0 + 7 / 4  7.0 + 1.0  8.0
7 + 7.0 / 4  7 + 7.0 / 4.0  7 + 1.75  7.0 + 1.75 = 8.75
 real, int, etc.

SUPERCOMPUTING EDUCATION CENTER

34

03. Formatted Output

Formatted Output

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

35

Formatted Output
 Fortran /
:
:

 Fortran
PRINT :
WRITE

 PRINT
PRINT

* () :

FORMAT ( 1 ~ 99999 )

SUPERCOMPUTING EDUCATION CENTER

36

Formatted Output
Edit Descriptions

Purpose

Aw

Iw

Iw.m

Fw.d

10

Ew.d

Ew.dEe

ESw.d

ESw.dEe

ENw.d

ENw.dEe

nX

(New Line)

Tc

Tab

w : ( )
m : ()
d : ()
e : ()
x, n, c :

SUPERCOMPUTING EDUCATION CENTER

37

Formatted Output -
 ( I )
INTEGER :: alpha = 5, beta = 5290, gamma = -32768
WRITE (*, 200) '1234567890123456789012345678901234567890'
WRITE (*, 100) alpha, alpha-5, beta, gamma
WRITE (*, 101) alpha, alpha-5, beta, gamma
WRITE (*, 102) alpha, alpha-5, beta, gamma
100 FORMAT (1X, 2I5, I7, I10)
101 FORMAT (1X, 2I5.2, I7, I10.7)
102 FORMAT (1X, 2I5.0, I7, I10)
200 FORMAT(A)

! 2I5

is same

I5, I5

SUPERCOMPUTING EDUCATION CENTER

38

Example Code
Fortran90
PROGRAM ex8a
IMPLICIT NONE
INTEGER :: alpha = 5, beta = 5290, gamma = -32768
WRITE (*, 200) '1234567890123456789012345678901234567890'
WRITE (*, 100) alpha, alpha-5, beta, gamma
WRITE (*, 101) alpha, alpha-5, beta, gamma
WRITE (*, 102) alpha, alpha-5, beta, gamma
100
101
102
200

FORMAT (1X, 2I5, I7, I10)


FORMAT (1X, 2I5.2, I7, I10.7)
FORMAT (1X, 2I5.0, I7, I10)
FORMAT(A)

! 2I5

is same

I5, I5

(Repetion Indicatior)

STOP
END
$ gfortran o ex8a.x ex8a.f90
$ ./ex8a.x

SUPERCOMPUTING EDUCATION CENTER

39

Formatted Output -
 ( F, E, ES, EN )
INTEGER :: red = 127, blue = -23
REAL :: a = 8.3, b = .231, c = 238.129
WRITE (*, 200) '1234567890123456789012345678901234567890'
WRITE (*, 100) red, blue, a, b, c
100 FORMAT (1X, 2I4, 2F6.3, F8.3)
200 FORMAT(A)

F8.3
.

SUPERCOMPUTING EDUCATION CENTER

40

Example Code
Fortran90
PROGRAM ex8b
IMPLICIT NONE

, 0, , d , E, 4
INTEGER :: red = 127, blue = -23
REAL :: a = 8.3, b = .231, c = 238.129
REAL :: alpha = .12345E8, beta = .0139, gamma = -4.5E-12
WRITE (*, 200) '1234567890123456789012345678901234567890'
WRITE (*, 100) red, blue, a, b, c
WRITE (*, 101) alpha, beta, gamma
100 FORMAT (1X, 2I4, 2F6.3, F8.3)
101 FORMAT (1X, 2E15.5, E15.4)
200 FORMAT(A)

Result

STOP
END
$ gfortran o ex8b.x ex8b.f90
$ ./ex8b.x

SUPERCOMPUTING EDUCATION CENTER

41

Formatted Output -
 ( A )
REAL :: x = 0.4, y = 8.7
WRITE (*, 100) x = , x, y = , y
100 FORMAT (2X, A, F6.2, ,2X,A, F6.2)

! 2X is two spaces


x

SUPERCOMPUTING EDUCATION CENTER

42

Formatted Output -
 Format

character*20 A
A =format test
write(*, 100) A
100 format(a20)

D
E ()
F () F( D, E) Fw.d (w: , d:
)
I
/ : /

write(*, 400) (ii(j), j=1,4)


400 format(4(i2,/))
x

SUPERCOMPUTING EDUCATION CENTER

43

Example Code
Fortran90
PROGRAM ex2c_format
IMPLICIT NONE
INTEGER :: i = 10, tt = 128
REAL :: rr = 3.141592654
CHARACTER*10 :: str = '1234567890'
WRITE(*, *) 'i = ', i
WRITE(*, 100) 'rr = ', rr
100 FORMAT(A, F13.6)
WRITE(*, *) 'str = ', str
WRITE(*, 200) 'str = ', str
200 FORMAT(A, A20)
WRITE(*, 300) tt, tt
300 FORMAT(2(I3, /))

! / is new line

WRITE(*, 301) tt, tt


301 FORMAT(I4, 5X, I4)

! 5X is five spaces

WRITE(*, 302) tt, tt


302 FORMAT(2I4)

! (2I4) = (I4, I4)

STOP
END

$ gfortran o ex2c_format.x ex2c_format.f90


$ ./ex2c_format.x

SUPERCOMPUTING EDUCATION CENTER

44

03. Selective Statement

Selective Statement

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

45

Relational Expression
 Logical return with True or False value
Left to right order
Operator

Math

.LT.

Less than

A .LT. B

.LE.

<=

Less than or equal to

A .LE. B

.EQ.

Equal to

A .EQ. B

.NE.

/=

Not Equal to

A .NE. B

.GT.

Greater than

A .GT. B

.GE.

>=

Greater than or equal to

A .GE. B

SUPERCOMPUTING EDUCATION CENTER

Meaning

e.g.

46

Logical Expression
 Complex conditions
Order : .NOT.
.AND.
.OR.
.TRUE. and .FALSE.

.EQV. .NEQV.

Operator

Meaning

e.g.

.NOT.

.NOT. A

.AND.

A .AND. B

.OR.

A .OR. B

A, B ,

.EQV.

A .EQV. B

A, B

.NEQV.

SUPERCOMPUTING EDUCATION CENTER

Results
A ,
A, B ,

A .NEQV. B A, B

47

Control Structure

(branches structure)


IF, GOTO

(loops structure)

DO ~ CONTINUE, GOTO IF

STOP :
CALL :
RETURN :
END :

SUPERCOMPUTING EDUCATION CENTER

48

IF Statement (1/3)
 Logical IF statement
.

IF (expression) statement
IF

IF (expression) THEN
statement
...
ENDIF
Example Code
IF (num .LT. 0) num = -num
IF (num .LT. 0) THEN
num = -num
num = num + 2
ENDIF

SUPERCOMPUTING EDUCATION CENTER

49

Example Code
Fortran90
PROGRAM ex3a
IMPLICIT NONE
INTEGER :: num = -3

! Fortran90 Style

WRITE(*, *) 'Before num = ', num


IF (num .LT. 0)

num = -num

WRITE(*, *) 'After num = ', num


IF (num > 0) THEN
WRITE (*, *) 'Num > 0'
END IF

> == .GT.

STOP
END
$ gfortran -o ex3a.x ex3a.f90
$ ./ex3a.x

SUPERCOMPUTING EDUCATION CENTER

50

If Statement (2/3)
 Block IF statement ( )
IF (expression1) THEN
statements
ELSEIF (expression2) THEN
statements
ENDIF
Example Code
IF (a > b) THEN
max = a
ELSEIF (b < a) THEN
min = b
ENDIF

SUPERCOMPUTING EDUCATION CENTER

51

Example Code
Fortran90
PROGRAM ex3b
IMPLICIT NONE

WRITE(*, *) 'min = ', min


WRITE(*, *) 'max = ', max

INTEGER :: a = 10, b = 20
INTEGER min, max
IF (a > b) THEN
max = a
min = b
ELSEIF (a < b) THEN
max = b
min = a
ELSE
min = a
max = a
ENDIF

STOP
END

$ gfortran o ex3b.x ex3b.f90


$ ./ex3b.x

SUPERCOMPUTING EDUCATION CENTER

52

If Statement (3/3)
 Arithmetic IF statement
IF(expression) Negative, Zero, Positive
Expression (+),(-),(0) .

SUPERCOMPUTING EDUCATION CENTER

53

Example Code
Fortran90
PROGRAM ex3c
IMPLICIT NONE
INTEGER :: NUM = 100
IF (NUM-100) 10, 20, 30
10 PRINT *,'NUM is less than 100.'
GO TO 40
20 PRINT *,'NUM equals 100.'
GO TO 40
30 PRINT *,'NUM is greater than 100.'
40 CONTINUE

STOP
END
$ gfortran o ex3c.x ex3c.f90
$ ./ex3c.x

SUPERCOMPUTING EDUCATION CENTER

54

Example Code (Quadratic Equation)


Fortran90
PROGRAM quadratic_equation
IMPLICIT NONE

ELSE
WRITE(*, *) "There are no real roots"
END IF

REAL :: a, b, c, delta, z1, z2


WRITE(*, *) "Enter a, b, c"
READ(*, *) a, b, c

STOP
END

delta = b**2 - 4 * a * c
IF (delta >= 0) THEN
delta = SQRT(delta)

Ax2 + Bx + C = 0

B B2 4 AC
2A

z1 = (-b + delta) / (2.0 * a)


z2 = (-b - delta) / (2.0 * a)
WRITE(*, *) "The roots = ", z1, z2
$ gfortran -o quadratic_equation.x -Wall quadratic_equation.f90
$ ./quadratic_equation.x

SUPERCOMPUTING EDUCATION CENTER

55

Select-Case
 SELECT-CASE (Fortran90)
IF
IF
Expression integer, character, logical

SELECT CASE (expression)


CASE(value-list)
statements
CASE(value-list)
statements
END SELECT

SUPERCOMPUTING EDUCATION CENTER

56

Example Code
Fortran90
PROGRAM ex3d
IMPLICIT NONE
INTEGER :: n, k
WRITE (*, *) 'Enter the value n = '
READ *, n
SELECT CASE (n)
CASE ( :0 )

! ~ 0
k = -n

CASE ( 10: )
k = n + 10
CASE DEFAULT
k=n
END SELECT

! 10 ~
! 0 ~ 10

WRITE (*, *) k = , k
END

$ gfortran o ex3d.x ex3d.f90


$ ./ex3d.x

SUPERCOMPUTING EDUCATION CENTER

57

04. Derived Data Type

Derived Data Type

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

58

58

Derived Data Type


 Derived Data Type
TYPE COORDS_3D
REAL :: x, y, z
END TYPE COORDS_3D
TYPE (COORDS_3D) :: var
var%x = 10
TYPE (COORDS_3D), DIMENSION(10), TARGET :: var_arr
var_arr(1)%x = 10

 TYPE/END TYPE
attribute(dimension, allocatable, target, intent,..)
PARAMETER attribute
:
Derived Data Type

SUPERCOMPUTING EDUCATION CENTER

59

Derived Data Type


 derived type derived type
TYPE COORDS_3D
REAL :: x, y, z
END TYPE COORDS_3D
TYPE SPHERE
TYPE ( COORDS_3D ) :: center
REAL
:: radius
END TYPE SPHERE
TYPE ( SPHERE ) :: s_var
s_var%center%x
s_var%center%y
s_var%center%z
s_var%radius

SUPERCOMPUTING EDUCATION CENTER

60

Derived Data Type


 Derived Data Type
1. %
TYPE ( SPHERE ) :: s_var
s_var%center%x = 10.0
s_var%radius = 5.0

2. Derived data type


TYPE( COORDS_3D ) :: var
var
= COORDS_3D(1.0, 2.0, 3.0)
TYPE ( SPHERE ) :: s_var
s_var%center = COORDS_3D(1.0, 2.0, 3.0)
s_var
= SPHERE(COORDS_3D(1.0, 2.0, 3.0), 4.0)
s_var
= (1.0, 2.0, 3.0, 4.0) ( X )

SUPERCOMPUTING EDUCATION CENTER

61

Derived Data Type


 Derived Data Type
TYPE SCORE
CHARACTER ( LEN = 10 )
INTEGER, DIMENSION(2,2)
END TYPE SCORE

:: name
:: record

TYPE(SCORE), DIMENSION(20)

:: teamA

teamA(1)%record(2,2)
teamA(4)%record(:, :)
teamA(:)%record(1,2)

Allocatable or pointer

SUPERCOMPUTING EDUCATION CENTER

62

Derived Data Type


derived_data_type.f90
PROGRAM derived_data_type
TYPE POINT
REAL :: x,y
END TYPE POINT
TYPE(POINT) :: a, b
REAL :: c = 0.0
a = POINT(1.0,1.0)
b = POINT(2.0,2.0)
c = SQRT((a%x-b%x) * (a%x-b%x) + (a%y-b%y) * (a%y-b%y))
PRINT *, "a=", a, "b=", b, "c=", c
END PROGRAM derived_data_type

gfortran -o derived_data_type .x derived_data_type.f90

SUPERCOMPUTING EDUCATION CENTER

63

05. Loop Statement

Loop Statement

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

64

Do Loops (1/5) F77


 , C/C++ for
 Fortran 77 Loop, Do-loop

label

DO label, variable = e1, e2, e3


{block of statement}
CONTINUE

Label :
Variable : ( )
e1:, e2: (, ,, )
e3: ( )

Example Code (Fortran77)


PROGRAM ex4a_f77_do
INTEGER i, total
total = 0
DO 100 i = 1, 100
total = total + i
100 CONTINUE
WRITE (*, *) total = , total
END

SUPERCOMPUTING EDUCATION CENTER

65

Do Loops (2/5) F90


 Loops in Fortran90
DO variable = e1, e2, e3
{block of statement}
ENDDO

Variable : ( )
e1:, e2: (, ,, )
e3: ( or ), 1
Example Code (Fortran90)
PROGRAM ex4a_do
IMPLICIT NONE
INTEGER :: i, total = 0
DO i = 1, 100
total = total + i
ENDDO
WRITE (*, *) total = , total
END

SUPERCOMPUTING EDUCATION CENTER

66

Do Loops (3/5) F90


 Loops & IF in Fortran90 ( DO 1)
DO
statements
IF (expression) exit
statements
ENDDO

DO ~ ENDDO IF

Example Code (Fortran90)


PROGRAM ex4b_do
IMPLICIT NONE
INTEGER :: i = 0, total = 0
DO
total = total + i
IF (i > 100) exit
i=i+1
ENDDO
WRITE (*, *) total = , total
END

SUPERCOMPUTING EDUCATION CENTER

67

Do Loops (4/5) F90


 Loops & While in Fortran90 ( DO 2)
DO WHILE (expression)
statements
ENDDO

WHILE

Example Code (Fortran90)


PROGRAM do_while
IMPLICIT NONE
INTEGER :: i = 0, total = 0
DO WHILE( i <= 100 )
total = total + i
i=i+1
ENDDO
WRITE (*, *) total = , total
END

SUPERCOMPUTING EDUCATION CENTER

68

Do Loops (5/5) F90


 Loops & IF in Fortran90
DO
statements1
IF (expression) cycle
statements2
ENDDO

cycle C/C++
continue

DO ~ ENDDO IF statements1 ,
statements2

Example Code (Fortran90)


PROGRAM ex4c_do
IMPLICIT NONE
INTEGER :: i = 0, total = 0
DO
i=i+1
IF ( i > 100) exit
IF (MOD(i, 2) == 0) cycle
total = total + i
ENDDO
WRITE (*, *) total = , total
END
SUPERCOMPUTING EDUCATION CENTER

69

Go To

GO TO (label 1 , label 2 , , label n) integer-expression

label 1, label2:
integer-expression :
integer-expression=1 label1 (goto label1)
integer-expression=2 label1 (goto label2)
integer-expression GOTO

SUPERCOMPUTING EDUCATION CENTER

70

Example Code
Fortran90
PROGRAM gugudan
IMPLICIT NONE
INTEGER :: i, j, first, last, result
WRITE (*, *) 'Enter the two numbers (ex) 3 9 : '
READ *, first, last
DO i = 1, first
DO j = 1, last
result = i * j
IF (result /= 0) THEN
WRITE (*, *) i, '*', j, '=', result
END IF
END DO
END DO
END
$ gfortran -o gugudan.x gugudan.f90
$ ./gugudan.x

SUPERCOMPUTING EDUCATION CENTER

71

SUPERCOMPUTING EDUCATION CENTER

72

06. Array, Dynamic Allocation

Array, Dynamic Allocation

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

73

Array (1/5) F77


 FORTRAN77
REAL a, b, c
DIMENSION a(100), b(10, 10), c(2, 3, 4)
or
REAL a(100), b(10, 10), c(2, 3, 4)

! Recommend
C/C++ Array
int ar[10];
Index ar[0] ~
a[9]

Index default 1
V(c1:c2) : c1 , c2
Multi-dimensional array 7D
C

SUPERCOMPUTING EDUCATION CENTER

74

Example Code (F77 Style)


Fortran77
PROGRAM ex5a_f77_array
INTEGER
INTEGER

i, j
buf(3, 3)

DO 20 i = 1, 3
DO 10 j = 1, 3
buf(i, j) = i * j
WRITE(*, *) 'buf(', i, ',', j, ') = ', buf(i, j)
10
CONTINUE
20 CONTINUE
END

$ gfortran o ex5a_f77_array.x ex5a_f77_array.f90


$ ./ex5a_f77_array.x

SUPERCOMPUTING EDUCATION CENTER

75

Array (2/5) F77


 Array
INTEGER ar(10)
REAL ar(0:19)
DOUBLE ar(-100:100)

! ar(1), ar(2), , ar(10)


! ar(0), ar(1), , ar(19)
! ar(-100), ar(0), , ar(100)

INTEGER max
PARAMETER (max=100)
REAL buf(max, max)

SUPERCOMPUTING EDUCATION CENTER

76

Example Code (F77 Style)


Fortran77
PROGRAM ex5b_f77_array
INTEGER
i, j, max
PARAMETER (max=3)
INTEGER buf(max, max)
DO 20 i = 1, max
DO 10 j = 1, max
buf(i, j) = i * j
WRITE(*, *) 'buf(', i, ',', j, ') = ', buf(i, j)
10
CONTINUE
20 CONTINUE
END

$ gfortran o ex5b_f77_array.x ex5b_f77_array.f90


$ ./ex5b_f77_array.x

SUPERCOMPUTING EDUCATION CENTER

77

Array (3/5) F90


 FORTRAN90
INTEGER, DIMENSION(100) :: ar

! ar(1), ar(2), , ar(10)

REAL, DIMENSION(0:19) :: ar

! ar(0), ar(1), , ar(19)

DOUBLE, DIMENSION(-100:100) :: ar

! ar(-100), ar(0), , ar(100)

INTEGER, PARAMETER :: max = 100


REAL, DIMENSION(max, max) :: buf
INTEGER, DIMENSION(100, 100) :: a, b, c
REAL :: array(5,6,7), scalar, vector(100) ! Declare array, scalar, vector
INTEGER :: buf(5) = ( / 1, 2, 3, 4, 5 / ) ! Set initial value
CHARACTER(LEN=3), PARAMETER :: day(0:6) = &
( / Sun, Mon, Tue, Wed, Thu, Fri, Sat / )

SUPERCOMPUTING EDUCATION CENTER

78

Example Code (F90 Style)


Fortran90
PROGRAM ex5c
IMPLICIT NONE
INTEGER
i, j
INTEGER, PARAMETER ::
max=3
INTEGER, DIMENSION(max, max) :: buf
DO i = 1, max
DO j = 1, max
buf(i, j) = i * j
WRITE(*, *) 'buf(', i, ',', j, ') = ', buf(i, j)
ENDDO
ENDDO
STOP
END
$ gfortran o ex5c.x ex5c.f90
$ ./ex5c.x

SUPERCOMPUTING EDUCATION CENTER

79

Array (4/5) Fortran & C Memory


 FORTRAN Array Memory Address ()
Fortran

C
int a[3][3];

INTEGER, DIMENSION(0:2, 0:2) :: a

a(0,0)

a(0,1)

a(0,2)

1000

1012

a(1,0)

Memory
Address

a(0,0)

a(0,1)

a(0,2)

1024

1000

1004

1008

a(1,1)

a(1,2)

a(1,0)

a(1,1)

a(1,2)

1004

1016

1028

1012

1016

1020

a(2,0)

a(2,1)

a(2,2)

a(2,0)

a(2,1)

a(2,2)

1008

1020

1032

1024

1028

1032

DO i=0, 2
DO j=0, 2
a(j, i) = ?
END DO
END DO

SUPERCOMPUTING EDUCATION CENTER

for (i=0; i<3; i++)


for (j=0; j<3; j++)
a(i, j) = ?

80

Example Code
Before

After

PROGRAM ex5d_before

PROGRAM ex5d_after

IMPLICIT NONE

IMPLICIT NONE

INTEGER

i, j

INTEGER

i, j

INTEGER, PARAMETER :: max=10000

INTEGER, PARAMETER :: max=10000

INTEGER, DIMENSION(max, max) :: buf

INTEGER, DIMENSION(max, max) :: buf

DO i=1, max

DO j=1, max

DO j=1, max

DO i=1, max

buf(i, j) = i * j

buf(i, j) = i * j

! WRITE(*, *) 'buf(', i, ',', j, ') = ', buf(i, j)

! WRITE(*, *) 'buf(', i, ',', j, ') = , & buf(i, j)

ENDDO

ENDDO

ENDDO

ENDDO

STOP

STOP

END

END

$ gfortran o ex5d_before.x ex5d_before.f90


$ time ./ex5d_before.x

$ gfortran o ex5d_after.x ex5d_after.f90


$ time ./ex5d_after.x

SUPERCOMPUTING EDUCATION CENTER

81

Array (5/5) F90 Array Intrinsic Functions


Array Functions

description

ALLOCATED(A)

A logical function which indicates if the array is allocated.


( return .TRUE. or .FALSE. )

DOT_PRODUCT(A,
B)

Returns the dot product of the elements in the array A and B

MAXVAL(A)

Returns the largest value in the array A

MAXLOC(A)

Returns the location(index) of largest value in the array A

MINVAL(A)

Returns the smallest value in the array A

MINLOC(A)

Returns the location(index) of smallest value in the array A

PRODUCT(A)

Returns the product of all the elements in the array A

SIZE(A)

A function which returns the number of elements in an array A

SUM(A)

Returns the sum of all the elements in the array A

SUPERCOMPUTING EDUCATION CENTER

82

Data (1/2)


DATA nlist /clist/, nlist /clist/ ..


nlist : ,,
clist : nlist ,

 DATA
DATA , .
nlist clist :
clist type nlist type .
nlist clist
.

SUPERCOMPUTING EDUCATION CENTER

83

Data (2/2)
 Example
A = 10.5
B = 21.3
C = IN
D ATA A / 1 0 . 5 / , B / 2 1 . 3 / , C / I N /
D ATA A , B , C / 1 0 . 5 , 2 1 . 3 , I N /

or

DIMENSION a(5)
D ATA a / 1 . 0 , 2 . 0 , 3 . 0 , 4 . 0 , 5 . 0 /
DIMENSION b(10)
D ATA b / 5 * 1 2 . 0 , 5 * 2 1 . 0 /
DIMENSION d(5)
D ATA d ( 2 ) , d ( 3 ) , ( d ( i ) , i = 4 , 5 ) / 11 . 0 , 2 2 . 0 , 3 3 . 0 , 4 4 . 0 /
SUPERCOMPUTING EDUCATION CENTER

84

Allocatable Array F90


 (Allocatable Array)
REAL, DIMENSION(:, :), ALLOCABABLE :: buf
ALLOCATE(buf(10, 10))
! allocate memory
...
DEALLOCATE(buf)
! free memory

C/C++
malloc(),
free()

REAL, TARGET :: B(100,100)


REAL, POINTER :: U(:,:),V(:)
....
U => B
.

SUPERCOMPUTING EDUCATION CENTER

! B target .
!
! U B aliasing

85

Example Code
Fortran90
PROGRAM ex5e_dyalc
IMPLICIT NONE
INTEGER
i, j
INTEGER, PARAMETER :: max = 50000
INTEGER, ALLOCATABLE, DIMENSION(:, :) :: buf
ALLOCATE(buf(max, max))
DO j = 1, max
DO i = 1, max
buf(i, j) = i * j
ENDDO
ENDDO
DEALLOCATE(buf)
END
$ gfortran o ex5e_dyalc.x ex5e_dyalc.f90
$ ./ex5e_dyalc.x

SUPERCOMPUTING EDUCATION CENTER

86

Example Code
Fortran90
PROGRAM ex5f_pointer
IMPLICIT NONE
REAL, POINTER
REAL, TARGET
REAL, DIMENSION(:), POINTER
REAL, DIMENSION(3), TARGET

::
::
::
::

b = (/1.0, 2.0, 3.0/)

ptr1
num = 3.0
ptr2
b
! b(1) = 1.0; b(2) = 2.0; b(3) = 3.0

ptr1 => num


ptr2 => b
PRINT *, 'num =', num
PRINT *, 'ptr1 =', ptr1
PRINT *, 'b(1)=', b(1), 'b(2)=', b(2), 'b(3)=', b(3)
PRINT *, 'ptr2 =', ptr2(1), ptr2(2), ptr2(3)
PRINT *, 'size of b(3) is', size(b)
PRINT *, 'sum of b(3) is', sum(b)
STOP
END
$ gfortran -o ex5f_pointer.x ex5f_pointer.f90
$ ./ex5f_pointer.x

SUPERCOMPUTING EDUCATION CENTER

87

etc.

Implied DO, where construct

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

88

Implied DO
 DO
A(5)
WRITE(*,*) (a(i), i=1, 5, 1)
READ(*,*) (a(i), i=1, 5)

DO

SUPERCOMPUTING EDUCATION CENTER

89

Where Construct
 Where
where (expression)
statements
elsewhere
! optional...
statements
end where
.

SUPERCOMPUTING EDUCATION CENTER

90

Example Code
Reverse Array
PROGRAM Reverse
IMPLICIT NONE
INTEGER, PARAMETER :: SIZE = 30
INTEGER, DIMENSION(1:SIZE) :: a
INTEGER
:: Head, Tail
INTEGER
:: Temp, i, n
READ(*,*) n
READ(*,*) (a(i), i = 1, n)
WRITE(*,*) "Input array:"
WRITE(*,*) (a(i), i = 1, n)
Head = 1 ; Tail = n
DO
IF (Head >= Tail) EXIT
Temp = a(Head)
a(Head) = a(Tail) ; a(Tail) = Temp
Head = Head + 1
Tail = Tail - 1
END DO
WRITE(*,*)
WRITE(*,*) "Reversed array:"
WRITE(*,*) (a(i), i = 1, n)

! maximum array size


! input array
! pointer moving forward and backward
! read in the input array
! display the input array
! start with the beginning and with the end
! for each pair...
! if Head crosses Tail, exit
! otherwise, swap them
! move forward
! move backward
! loop back
! display the result

END PROGRAM Reversed


$ gfortran -o ex_reverse.x ex_reverse.f90
$ ./ex_reverse.x

SUPERCOMPUTING EDUCATION CENTER

91

Example Code
Array Operation
PROGRAM ARRAY2
IMPLICIT NONE
INTEGER I,J
REAL, DIMENSION (10) :: A=(/(J,J=1,10)/), B, C
REAL CSUM,CMAX,CMIN,AVERAGE
DATA B/3*1.,4*2.,3*3./
C=A+B
CSUM=SUM(C) ; CMIN=MINVAL(C) ; CMAX=MAXVAL(C)
AVERAGE=CSUM/10
WRITE(*,*) ' RESULTS FOR FULL C ARRAY'
WRITE(6,2000)AVERAGE,CMIN,CMAX
2000 FORMAT(' AVERAGE OF ALL ELEMENTS IN C = ',
F8.3,/,' MINIMUM OF ALL ELEMENTS IN C = ', F8.3,/, &
' MAXIMUM OF ALL ELEMENTS IN C = ', F8.3)
WRITE(6,2001) C
2001 FORMAT(' C = ',/,(8E10.2))
C(1)=0. ;
C(10)=0.
C(2:9)=A(2:9)+B(2:9)
CSUM=SUM(C(2:9))
CMIN=MINVAL(C(2:9))

AVERAGE=CSUM/8
WRITE(*,'(//,'' RESULTS FOR ELEMENTS 2 THROUGH 9
OF C'')')
WRITE(6,2002)AVERAGE,CMIN,CMAX
2002 FORMAT(' AVERAGE OF SELECTED ELEMENTS IN C =
', F8.3,/,' MINIMUM OF SELECTED ELEMENTS IN C = ',
F8.3,/, &
' MAXIMUM OF SELECTED ELEMENTS IN C = ', F8.3)
WRITE(6,2003) C(2:9)
2003 FORMAT(' C = ',/,(1P,8E10.2))
A(4)=-1.0
WHERE (A.GT.0)
C=LOG(A)
ELSE WHERE
C=0.
END WHERE
PRINT *
WRITE(6,*) ' RESULTS OF LOG(A)'
WRITE(6,2004) C
2004 FORMAT(' C = ',/,(1P,8E10.2))
STOP
END

gfortran -o arr_op.x arr_op.f90


./arr_op.x

SUPERCOMPUTING EDUCATION CENTER

92

SUPERCOMPUTING EDUCATION CENTER

93

07. Subprogram

Subprogram

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

94

Subprogram (1/3)
 Subprogram





( )
subprogram .
subroutine
library function

subprogram

statement function

function
User defined function

function

SUPERCOMPUTING EDUCATION CENTER

95

Subprogram (2/3)
 Subroutine & Function
Subroutine

Function

(call)

Function

return

function
return

SUPERCOMPUTING EDUCATION CENTER

96

Subprogram (3/3)
 Subroutine & function
Subroutine
INTEGER :: m = 1, n = 2
CALL SWAP(m, n)

SUBROUTINE SWAP(a, b)
INTEGER a, b

Function
INTEGER :: m = 1, n = 2, total, myadd
total = myadd(m, n)

INTEGER FUNCTION myadd (a, b)


INTEGER a, b

INTEGER c
c=a
a=b
b=c

myadd = a + b
RETURN
END

RETURN
END

SUPERCOMPUTING EDUCATION CENTER

97

Intrinsic Function (1/2)


 Math Function
Name
SIN, COS, TAN

Meaning
Sine,cosine,
tangent

e.g.

Mathematical
expression

Y=SIN(X)

y = sin x
y= x

SQRT

Y=SQRT(X)

MOD

X=MOD(A,B)

EXP

Y=EXP(X)

ABS,IABS

Y=ABS(X)

ALOG

Y=ALOG(X)

ALOG10

Y=ALOG10(X)

SUPERCOMPUTING EDUCATION CENTER

y= x
y = ln x

y = log x
98

Intrinsic Function (2/2)


 Transform Function
Name

Meaning

e.g.

INT

->

K=INT(X)

REAL

->

Y=REAL(J)

FLOAT

->

Y=FLOAT(J)

DBLE

->

Y=DLBE(J)

ICHAR

->

K=ICHAR(C)

CHAR

->

C=CHAR(K)

MOD

Y=MOD(X,Y)

X Y

MAX (MIN)

()

j=MAX(i1,i2,i3)

FLOOR

FLOOR(x)

SUPERCOMPUTING EDUCATION CENTER

i1,i2,i3 ( )
X

99

Common
 (Global)
, ( )

,
Example Code (Fortran77)
PROGRAM ex6a_f77_common
INTEGER bufsize, n
PARAMETER (bufsize=10)
REAL a(bufsize, bufsize)
COMMON /apple/ a, n, bufsize

END
SUBROUTINE sub()
INTEGER bufsize, n
PARAMETER (bufsize=10)
REAL a(bufsize, bufsize)
COMMON /apple/ a, n, bufsize
..
END SUBROUTINE

SUPERCOMPUTING EDUCATION CENTER

100

Example Code (1/2)


Fortran90
PROGRAM ex6a_subroutine
IMPLICIT NONE
INTEGER a, b
COMMON a, b

tmp = c
c=d
d = tmp
END SUBROUTINE

a=1
b=2
WRITE(*, 100) 'Before swap: ', a, b
100 FORMAT(A, I2, I2)
CALL swap
WRITE(*, 100) 'After swap: ', a, b
END
SUBROUTINE swap
INTEGER c, d
INTEGER tmp
COMMON c, d

$ gfortran -o ex6a_subroutine.x ex6a_subroutine.f90


$ ./ex6a_subroutine.x

SUPERCOMPUTING EDUCATION CENTER

101

Example Code (2/2)


Fortran90
PROGRAM ex6b_function
IMPLICIT NONE
INTEGER :: a = 1, b = 2, myadd
INTEGER total
total = myadd(a, b)
WRITE (*, *) 'a + b = ', total
END
INTEGER FUNCTION myadd (c, d)
INTEGER c, d
myadd = c + d
RETURN
END
$ gfortran o ex6b_function.x ex6b_function.f90
$ ./ex6b_function.x

SUPERCOMPUTING EDUCATION CENTER

102

Example Code 2
Fortran90
PROGRAM ex6c_function
IMPLICIT NONE
INTEGER :: a = 1, b = 2, myadd, added_op
INTEGER total,total2
total = myadd(a, b)
WRITE (*, *) 'a + b = ', total
total2 = added_op(myadd, b)
write (*,*) 'a + b + b = ', total2
END
FUNCTION myadd(c, d)
INTEGER c, d
integer myadd
myadd = c + d
END function
function added_op(a,b)
integer a,b,added_op
added_op = a(1,2)+b
end function
$ gfortran o ex6b_function.x ex6b_function.f90
$ ./ex6b_function.x

SUPERCOMPUTING EDUCATION CENTER

103

Modules
 Subprograms

, Subprogram,
USE Module

Example Code (Fortran90)


! MODULE EXAM - SUBPROGRAM

!USING MODULE

MODULE ModuleName
USE ModuleName
CONTAINS
Subprogram 1
Subprogram 2

Subprogram n

USE ModuleName, ONLY : List

END MODULE ModuleName

SUPERCOMPUTING EDUCATION CENTER

104

Modules
 INTENT Attribute

,
in, out, inout
INTENT(in)

INTENT(out)

INTENT(inout)

SUPERCOMPUTING EDUCATION CENTER

105

Example Code (1/2)


temp_conversion_1.f90
PROGRAM Temp_Conversion_1
IMPLICIT NONE
REAL :: F_Temp, C_Temp
CHARACTER(1) :: Response
DO
! Get a Fahrenheit temperature
WRITE (*, '(1X, A) ', ADVANCE = "NO") &
"Enter a Fahrenheit temperature:"
READ *, F_Temp
!Use the function Fahr_to_Celsius to convert it to Celsius
C_Temp = Fahr_to_Celsius(F_Temp)

"More temperature to convert(Y or N)?:"


READ *, Response
IF (Response /="Y") EXIT
END DO
CONTAINS
FUNCTION Fahr_to_Celsius(Temp)
REAL :: Fahr_to_Celsius
REAL, INTENT(IN) :: Temp
Fahr_to_Celsius = (Temp - 32.0) / 1.8
END FUNCTION Fahr_to_Celsius
END PROGRAM Temp_Conversion_1

! Output the result


PRINT '(1X, 2(F6.2, A))', F_Temp, &
" in Fahrenheit is equivalent to ", C_Temp, " in Celsius"
WRITE (*, '(1X, A) ', ADVANCE = "NO") &

gfortran -o temp_conversion_1.x temp_conversion_1.f90


./temp_conversion_1.x

SUPERCOMPUTING EDUCATION CENTER

106

Example Code (2/2)


temp_conversion_2.f90

Temperature_Library.f90

PROGRAM Temp_Conversion_2

MODULE Temperature_Library

USE Temperature_Library

IMPLICIT NONE

IMPLICIT NONE
REAL :: F_Temp, C_Temp
CHARACTER(1) :: Response

CONTAINS
! Function to convert a Fahrenheit temperature to Celsius.
FUNCTION Fahr_to_Celsius(Temp)
REAL::Fahr_to_Celsius
REAL, INTENT(IN) :: Temp

! Get a Fahrenheit temperature


WRITE (*, '(1X, A) ', ADVANCE = "NO") &
"Enter a Fahrenheit temperature:"
READ *, F_Temp
!Use the function Fahr_to_Celsius to convert it to Celsius
C_Temp = Fahr_to_Celsius(F_Temp)
! Output the result
PRINT '(1X, 2(F6.2, A))', F_Temp, &
" in Fahrenheit is equivalent to ", C_Temp, " in Celsius"
END PROGRAM Temp_Conversion_2

Fahr_to_Celsius = (Temp - 32.0) / 1.8


END FUNCTION Fahr_to_Celsius
! Function to convert a Celsius temperature to Fahrenheit.
Function Celsius_to_Fahr(Temp)
REAL::Celsius_to_Fahr
REAL, INTENT(IN) :: Temp
Celsius_to_Fahr = 1.8 * Temp + 32.0
END FUNCTION Celsius_to_Fahr
END MODULE Temperature_Library

gfortran -c Temperature_Library.f90
( Temperature_Library.mod , Temperature_Library.o )
gfortran -o temp_conversion_2.x temp_conversion_2.f90 Temperature_Library.o
./temp_conversion_2.x

SUPERCOMPUTING EDUCATION CENTER

107

Module [Compile & Link Process]

Program
Source
File

Fortran 90
Compiler

Program
Object
File

Linker

Module
Source
File

Fortran 90
Compiler

SUPERCOMPUTING EDUCATION CENTER

Program
Executable
File

Module
Object
File

108

Recursion


Fortran90
RECURSIVE
recursion RESULT

I N T E G E R R E C U R S I V E F U N C T I O N f a c t ( n ) R E S U LT ( n _ f a c t )
R E C U R S I V E I N T E G E R F U N C T I O N f a c t ( n ) R E S U LT ( n _ f a c t )
R E C U R S I V E F U N C T I O N f a c t ( n ) R E S U LT ( n _ f a c t )
INTEGER :: n_fact

SUPERCOMPUTING EDUCATION CENTER

109

Recursion

Subprogram Subprogram
Factorial(5)

n
5

Fact
120

= n * Factorial(n - 1)

Factorial(4)

n
4

Fact
24

= n * Factorial(n - 1)

Factorial(3)

n
3

Fact
6

= n * Factorial(n - 1)

Factorial(2)

n
2

Fact
2

= n * Factorial(n - 1)

Factorial(1)

n
1

Fact
1

= n * Factorial(n - 1)

Factorial(0)

n
0

Fact
1

SUPERCOMPUTING EDUCATION CENTER

120

=1

110

Example Code
factorial_recursive.f90
PROGRAM Factorial_recursive
IMPLICIT NONE
INTEGER :: Fact, Res
CHARACTER(1) :: Response
DO
WRITE (*,'(1X, A)',ADVANCE = "NO") &
"Enter the Factorial Number : "
READ *, Fact
Res = Factorial(Fact)
PRINT *, "Factorial Number(", Fact, ") : ",Res
WRITE (*, '(1X, A) ', ADVANCE = "NO") &
"More temperature to convert(Y or N)?:"

READ *, Response
IF (Response /="Y") EXIT
END DO
CONTAINS
RECURSIVE FUNCTION Factorial(n) RESULT(Fact)
INTEGER :: Fact
INTEGER, INTENT(IN) :: n
IF (n==0) THEN
Fact = 1
ELSE
Fact = n * Factorial(n-1)
END IF
END FUNCTION Factorial
END PROGRAM Factorial_recursive

gfortran -o factorial_recursive.x factorial_recursive.f90


./factorial_recursive.x

SUPERCOMPUTING EDUCATION CENTER

111

08. File I/O

File I/O

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

112

Input / Output (1/4)


 I/O statements
Line

READ(UNIT=n,FMT=f,END=label,ERR=label) input data-list


WRITE(UNIT=n,FMT=f,END=label,ERR=label) output data-list
UNIT = : /
* : (/)
5 (Standard Input), 6 (Standard Output)

FMT = Format()
* : /, ,

Error ()
ERR :
END :

SUPERCOMPUTING EDUCATION CENTER

113

Input / Output (2/4)


 (File I/O)
Line

OPEN(UNIT=12,FILE=MY.TXT,STATUS=OLD,ACTION=READ,
POSITION=REWIND,IOSTAT=status)
UNIT : (9 ~ 99),
FILE :

STATUS : NEW(), OLD(),


REPLACE(NEW+OLD)
ACTION : READ, WRITE, READWRITE()
POSITION : REWIND(), APPEND(), ASIS( )
IOSTAT : 0 Successful Open, Not 0 - Error

CLOSE(UNIT=12)

SUPERCOMPUTING EDUCATION CENTER

114

Input / Output (2/4)


 Example
Input/Output
READ(*,*) A,B,C
READ(UNIT=5,FMT=*,ERR=50,END=70) A,B,C
READ *, A,B,C
READ(5,10) A,B,C
10 FORMAT(1X,3I4)
READ(5,(1X,3I4)) A,B,C

WRITE(*,*) A,B,C
WRITE(6,30) A+X,B+Y,C+Z
WRITE(6,*) THE VALUE OF THE OUTPUT, A,B,C

SUPERCOMPUTING EDUCATION CENTER

115

Example Code (3/4)


Fortran90
PROGRAM ex7a_read
IMPLICIT NONE
REAL A, B, C
WRITE(*, *) 'Please input A, B, C : ex) 1.1 2.2 3.3'
READ(*, *) A, B, C
WRITE(*, 10) A, B, C
10 FORMAT(F4.1, F5.2, F6.3)

STOP
END

$ gfortran o ex7a_read.x ex7a_read.f90


$ ./ex7a_read.x

SUPERCOMPUTING EDUCATION CENTER

116

Example Code (4/4)


Fortran90
PROGRAM ex7b_fileio
IMPLICIT NONE

100 FORMAT(3(F10.4))
DO i=1, n

INTEGER, PARAMETER :: nmax = 1000


INTEGER n, i
REAL x(nmax), y(nmax), z(nmax)
! Open the data file
OPEN(10, FILE='points.dat', STATUS='OLD', POSITION='REWIND')
OPEN(20, FILE='result.dat', STATUS=REPLACE')
READ(10, *) n
WRITE(*, *) n
WRITE(20, *) n
IF (n > nmax) THEN
WRITE(*, *) 'Error: n = ', 'is larger than nmax =', nmax
GOTO 9999
ENDIF
DO i=1, n
read(10, 100) x(i), y(i), z(i)
ENDDO

$ vim points.dat
$ gfortran -o ex7b_fileio.x ex7b_fileio.f90

SUPERCOMPUTING EDUCATION CENTER

WRITE(*, 200) x(i), y(i), z(i)


WRITE(20, 200) x(i), y(i), z(i)
END DO
200 FORMAT(3(F10.4))
WRITE(*,*) '------------------------------'
WRITE(20, *) '------------------------------'
CLOSE(10)
CLOSE(20)
9999 STOP
END

points.dat
3
1.0, 2.0, 3.0
4.0, 5.0, 6.0
7.0, 8.0, 9.0

$ ./ex7b_fileio.x
$ cat result.dat
117

SUPERCOMPUTING EDUCATION CENTER

118

09. Advanced Lab & Summary

Advanced Lab & Summary

2014-04-14

SUPERCOMPUTING EDUCATION CENTER

119

Advanced Lab #1 (1/2)


 <Problem>

Monte carlo simulation

Random number use

PI = 4 Ac/As

SUPERCOMPUTING EDUCATION CENTER

120

Advanced Lab #1 (2/2)


PROGRAM PI_MC
IMPLICIT NONE
INTEGER :: i, scope = 10000000
REAL :: x, y, z, pi, z1, in_count = 0.0, out_count = 0.0
! Get Random
CALL INIT_RANDOM_SEED()
DO i=0, scope-1
CALL RANDOM_NUMBER(x)
CALL RANDOM_NUMBER(y)
z=x*x+ y*y
z1 = SQRT(z)
IF (z1 <= 1) THEN
in_count = in_count + 1
ELSE
out_count = out_count + 1
ENDIF

SUBROUTINE INIT_RANDOM_SEED()
IMPLICIT NONE
INTEGER
:: i, n, clock
INTEGER, DIMENSION(:), ALLOCATABLE :: seed
CALL RANDOM_SEED(size = n)
ALLOCATE(seed(n))
CALL SYSTEM_CLOCK(COUNT=clock)
seed = clock + 37 *

(/ (i - 1, i = 1, n) /)

CALL RANDOM_SEED(PUT = seed)


DEALLOCATE(seed)
END SUBROUTINE

ENDDO
pi = (4 * in_count) / (in_count + out_count)
WRITE (*, '(A, F15.10)') 'PI = ', pi
END

SUPERCOMPUTING EDUCATION CENTER

121

Advanced Lab #2 (1/3) - Array


PROGRAM SCORE
IMPLICIT NONE
INTEGER kor(10), eng(10), matt(10), total(10), &
rank(10), trank(10)
REAL ave(10)
INTEGER :: i, j, getTotal, nTotal
CHARACTER grade(10)
OPEN(20, FILE='score.dat', STATUS='OLD')
READ(20, *) nTotal
DO i=1, nTotal
READ(20, *) kor(i), eng(i), matt(i)
!total(i) = kor(i) + eng(i) + matt(i)
total(i) = getTotal(kor(i), eng(i), matt(i))
ave(i) = total(i) / 3.0
rank(i) = i
ENDDO
CALL BubbleSort(total, rank, nTotal)

DO i=1, nTotal
DO j=1, nTotal
IF (total(i) .EQ. total(rank(j))) THEN
trank(i) = j
END IF
ENDDO
IF (ave(i) .GE. 90) THEN
grade(i) = 'A'
ELSE IF (ave(i) .GE. 80) THEN
grade(i) = 'B'
ELSE IF (ave(i) .GE. 70) THEN
grade(i) = 'C'
ELSE
grade(i) = 'F'
ENDIF
ENDDO
WRITE(*, *) ' KOR ENG MAT Total Ave Rank Grade'
WRITE(*, *) '-------------------------------------------'
DO i=1, 5
WRITE(*, 100) kor(i), eng(i), matt(i), total(i), ave(i), &
trank(i), grade(i)
ENDDO
100 FORMAT(I5, I5, I5, I5, F6.1, I5, A4);
WRITE(*, *) '-------------------------------------------

SUPERCOMPUTING EDUCATION CENTER

122

Advanced Lab #2 (2/3) - Array


CLOSE(20)
END
INTEGER FUNCTION getTotal(k, e, m)
INTEGER k, e, m
getTotal = k + e+ m
END FUNCTION
SUBROUTINE BubbleSort(t, r, ns)
INTEGER t(*), r(*)
! INTEGER t(10), r(10)
INTEGER i, j, c

$ cat
5
70
89
99
91
76

score.dat
50
70
100
67
96

Input Data

65
99
85
64
60

DO i=1, ns-1
DO j=1, ns-i
IF (t(r(j)) < t(r(j+1))) THEN
c = r(j)
r(j) = r(j+1)
r(j+1) = c
ENDIF
ENDDO
ENDDO
END SUBROUTINE

SUPERCOMPUTING EDUCATION CENTER

123

Advanced Lab #2 (3/3) - Result

SUPERCOMPUTING EDUCATION CENTER

124

Advanced Lab #3 (1/2) Dynamic Allocation


PROGRAM SCORE_DYNA
IMPLICIT NONE
INTEGER, ALLOCATABLE, DIMENSION (:) :: kor, eng, &
matt, total, rank, trank
CHARACTER, ALLOCATABLE, DIMENSION (:) :: grade
REAL, ALLOCATABLE, DIMENSION (:) :: ave
INTEGER :: i, j, getTotal, nTotal
OPEN(20, FILE='score.dat', STATUS='OLD')
READ(20, *) nTotal
ALLOCATE(kor(nTotal))
ALLOCATE(eng(nTotal))
ALLOCATE(matt(nTotal))
ALLOCATE(total(nTotal))
ALLOCATE(rank(nTotal))
ALLOCATE(trank(nTotal))
ALLOCATE(ave(nTotal))
ALLOCATE (grade(nTotal))

SUPERCOMPUTING EDUCATION CENTER

DO i=1, nTotal
READ(20, *) kor(i), eng(i), matt(i)
!total(i) = kor(i) + eng(i) + matt(i)
total(i) = getTotal(kor(i), eng(i), matt(i))
ave(i) = total(i) / 3.0
rank(i) = i
ENDDO
CALL BubbleSort(total, rank, nTotal)
DO i=1, nTotal
DO j=1, nTotal
IF (total(i) .EQ. total(rank(j))) THEN
trank(i) = j
END IF
ENDDO
IF (ave(i) .GE. 90) THEN
grade(i) = 'A'
ELSE IF (ave(i) .GE. 80) THEN
grade(i) = 'B'
ELSE IF (ave(i) .GE. 70) THEN
grade(i) = 'C'
ELSE
grade(i) = 'F'
ENDIF
ENDDO

125

Advanced Lab #3 (2/2) Dynamic Allocation


WRITE(*, *) ' KOR ENG MAT Total Ave Rank Grade'
WRITE(*, *) '-------------------------------------------'
DO i=1, nTotal
WRITE(*, 100) kor(i), eng(i), matt(i), total(i), ave(i), &
trank(i), grade(i)
ENDDO
100 FORMAT(I5, I5, I5, I5, F6.1, I5, A4);
WRITE(*, *) '-------------------------------------------'
DEALLOCATE(kor)
DEALLOCATE(eng)
DEALLOCATE(matt)
DEALLOCATE(total)
DEALLOCATE(rank)
DEALLOCATE(trank)
DEALLOCATE(ave)
DEALLOCATE(grade)
CLOSE(20)
END

SUPERCOMPUTING EDUCATION CENTER

INTEGER FUNCTION getTotal(k, e, m)


INTEGER k, e, m
getTotal = k + e+ m
END FUNCTION
SUBROUTINE BubbleSort(t, r, ns)
INTEGER t(*), r(*)
! INTEGER t(10), r(10)
INTEGER i, j, c
DO i=1, ns-1
DO j=1, ns-i
IF (t(r(j)) < t(r(j+1))) THEN
c = r(j)
r(j) = r(j+1)
r(j+1) = c
Input
ENDIF
ENDDO
$ cat score.dat
ENDDO
5
END SUBROUTINE
70 50 65
89 70 99
99 100 85
91 67 64
76 96 60

Data

126

Advanced Lab #4 (1/4) Array Function - Norm


PROGRAM array_func_norm
IMPLICIT NONE
INTEGER, PARAMETER :: NumItems = 5
REAL, DIMENSION(NumItems) :: A
A = (/1,2,3,4,5/)
!A = (/I,I=1,5/)
PRINT '(1X, "Array A = (", 5F6.2 ,")")' , A(:)
PRINT '(1X, "Norm of the array A is", F6.2)', Norm(A,NumItems)
CONTAINS
FUNCTION Norm(A, N)
INTEGER, INTENT(IN) :: N
REAL, DIMENSION(N), INTENT(IN) :: A
REAL :: Norm
Norm = SQRT(SUM(A*A))
END FUNCTION Norm

Using Array Intrinsic


functions
1 + 2 + + 

END PROGRAM array_func_norm

SUPERCOMPUTING EDUCATION CENTER

127

Advanced Lab #4 (2/4) Array Function - Dot Product


PROGRAM array_func_dot
IMPLICIT NONE
INTEGER, PARAMETER :: NumItems = 5
REAL, DIMENSION(NumItems) :: A, B
A = (/1,2,3,4,5/)
B = (/1,2,3,4,5/)
PRINT '(1X, "Dot Product define function : ", F6.2)', DOT(A,B,NumItems)
PRINT '(1X, "Dot Product array function : ", F6.2)', DOT_PRODUCT(A,B)
CONTAINS
FUNCTION DOT(A,B,N)
INTEGER i
INTEGER, INTENT(IN) :: N
REAL, DIMENSION(N), INTENT(IN) :: A, B
REAL :: DOT = 0
DO i = 1, N
DOT = DOT + A(i) * B(i)
END DO
END FUNCTION DOT
END PROGRAM array_func_dot

SUPERCOMPUTING EDUCATION CENTER

128

Advanced Lab #4 (3/4) Array Function - Mean 1


PROGRAM array_func_mean1
IMPLICIT NONE
INTEGER, PARAMETER :: NumItems = 5
REAL, DIMENSION(NumItems) :: A
A = (/1,2,3,4,5/)
!A = (/I,I=1,5/)
PRINT '(1X, "Array A = (", 5F6.2 ,")")' , A(:)
PRINT '(1X, "Mean of the array A is", F6.2)',Mean(A)
CONTAINS
FUNCTION Mean(X)
INTEGER, PARAMETER :: NumElements = 5
REAL, DIMENSION(NumElements), INTENT(IN) :: X
REAL :: Mean
Mean = SUM(X) / REAL(NumElements)
END FUNCTION Mean
END PROGRAM array_func_mean1

SUPERCOMPUTING EDUCATION CENTER

129

Advanced Lab #4 (4/4) Array Function - Mean 2


PROGRAM array_func_mean2
IMPLICIT NONE
REAL, DIMENSION(:), ALLOCATABLE :: Item
INTEGER :: NumItems
WRITE (*, '(1X, A)', ADVANCE = 'NO') "How many numbers are in the data set?"
READ *, NumItems
ALLOCATE(Item(NumItems))
PRINT *, "Enter the", NumItems, "real numbers:"
READ *, Item
PRINT '(1X, "Mean of the ", I3, " Numbers is ", F6.2)', NumItems, Mean(Item)
DEALLOCATE(Item)
CONTAINS
FUNCTION Mean(X)
REAL :: Mean
REAL, DIMENSION(:), INTENT(IN) :: X
Mean = SUM(X) / REAL(SIZE(X))
END FUNCTION Mean
END PROGRAM array_func_mean2

SUPERCOMPUTING EDUCATION CENTER

130

SUPERCOMPUTING EDUCATION CENTER

131

How does beginner make a good program?


1. ,

2. ()
3. Syntax ,
4.

5. 1
6.

SUPERCOMPUTING EDUCATION CENTER

132

Вам также может понравиться