Академический Документы
Профессиональный Документы
Культура Документы
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
14:50
15:00
Break
15:00
16:30
Array
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
Index
2014-04-14
What is Fortran
Basic Grammar
Formatted Output
Selective Statement
Loop
Subprogram
Module
File I/O
Environment Setup
2014-04-14
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 :
http://www.putty.org/
<Be careful>
Yes(Y) Click
10
11
What is Fortran
2014-04-14
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
13
Fortran
,
(legacy code)
,
, ,
Software Inertia
14
HELLO
IMPLICIT NONE
Program
Name
STOP
! [STOP] is optional
15
16
2014-04-14
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)
18
Fortran77 (2/2)
72
5
6
1 ,
(6)
(Fortran90 )
() (Recursive) (Factorial)
COMMON , EQUIVALENCE
19
Fortran77
vs
Fortran90
Fortran90
Type Declaration attributing
New control structure
Numeric Processing
Dynamic Memory Allocation
Array Processing
Pointers
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
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
Fortran 90
(http://www.comphys.uni-duisburg.de/Fortran90/pl/pl.html)
SUPERCOMPUTING EDUCATION CENTER
22
;
!
&
31 ( )
IBM XL Fortran 250
.LT., .LE., .EQ., .NE., .GE., .GT. : Fortran77
<, <=, ==, /=, =>, >
: Fortran90
Fortran : /=
C/C++
: !=
23
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
24
PROGRAM free_source_form
IMPLICIT NONE
REAL :: tx, ty, tz
! Trailing statements
! Multiple statements
PRINT*, &
tx,ty,tz
25
Type
Description
Integer
4 Byte
Real
4 Byte
Character
Logical
4 Byte
Complex
4 Byte
(64bit OS)
Example
0.2353
1234.3E-3
1Byte ()
?Byte ()
Sunday
.TRUE. ,
.FALSE.
C = (1.4, 3.2)
26
Fortran77
Fortran90
INTEGER n
IMPLICIT NONE
PARAMETER(n=1000)
encode
INTEGER*8 call
REAL, DIMENSION(n) :: x, y
call = 0
INTEGER(8) :: call=0
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$
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
29
Not Ok
! Fortran77
! Fortran90
I = 10
K=5
J=I+K
IMPLICIT NONE
POW = 3.0
I = 10
K=5
J=I+K
C/C++
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
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
! Fortran90 Style
PARAMETER(gamma=1.4, pi=3.14)
! Fortran77 Style
pi = pi * 3
days = days + 3
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
STOP
END
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.
34
Formatted Output
2014-04-14
35
Formatted Output
Fortran /
:
:
Fortran
PRINT :
WRITE
PRINT
PRINT
* () :
FORMAT ( 1 ~ 99999 )
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 :
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
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
! 2I5
is same
I5, I5
(Repetion Indicatior)
STOP
END
$ gfortran o ex8a.x ex8a.f90
$ ./ex8a.x
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
.
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
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
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
/ : /
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
! 5X is five spaces
STOP
END
44
Selective Statement
2014-04-14
45
Relational Expression
Logical return with True or False value
Left to right order
Operator
Math
.LT.
Less than
A .LT. B
.LE.
<=
A .LE. B
.EQ.
Equal to
A .EQ. B
.NE.
/=
Not Equal to
A .NE. B
.GT.
Greater than
A .GT. B
.GE.
>=
A .GE. B
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.
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 :
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
49
Example Code
Fortran90
PROGRAM ex3a
IMPLICIT NONE
INTEGER :: num = -3
! Fortran90 Style
num = -num
> == .GT.
STOP
END
$ gfortran -o ex3a.x ex3a.f90
$ ./ex3a.x
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
51
Example Code
Fortran90
PROGRAM ex3b
IMPLICIT NONE
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
52
If Statement (3/3)
Arithmetic IF statement
IF(expression) Negative, Zero, Positive
Expression (+),(-),(0) .
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
54
ELSE
WRITE(*, *) "There are no real roots"
END IF
STOP
END
delta = b**2 - 4 * a * c
IF (delta >= 0) THEN
delta = SQRT(delta)
Ax2 + Bx + C = 0
B B2 4 AC
2A
55
Select-Case
SELECT-CASE (Fortran90)
IF
IF
Expression integer, character, logical
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
57
2014-04-14
58
58
TYPE/END TYPE
attribute(dimension, allocatable, target, intent,..)
PARAMETER attribute
:
Derived Data Type
59
60
61
:: name
:: record
TYPE(SCORE), DIMENSION(20)
:: teamA
teamA(1)%record(2,2)
teamA(4)%record(:, :)
teamA(:)%record(1,2)
Allocatable or pointer
62
63
Loop Statement
2014-04-14
64
label
Label :
Variable : ( )
e1:, e2: (, ,, )
e3: ( )
65
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
66
DO ~ ENDDO IF
67
WHILE
68
cycle C/C++
continue
DO ~ ENDDO IF statements1 ,
statements2
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
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
71
72
2014-04-14
73
! 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
74
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
75
INTEGER max
PARAMETER (max=100)
REAL buf(max, max)
76
77
REAL, DIMENSION(0:19) :: ar
DOUBLE, DIMENSION(-100:100) :: ar
78
79
C
int a[3][3];
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
80
Example Code
Before
After
PROGRAM ex5d_before
PROGRAM ex5d_after
IMPLICIT NONE
IMPLICIT NONE
INTEGER
i, j
INTEGER
i, j
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
ENDDO
ENDDO
ENDDO
ENDDO
STOP
STOP
END
END
81
description
ALLOCATED(A)
DOT_PRODUCT(A,
B)
MAXVAL(A)
MAXLOC(A)
MINVAL(A)
MINLOC(A)
PRODUCT(A)
SIZE(A)
SUM(A)
82
Data (1/2)
DATA
DATA , .
nlist clist :
clist type nlist type .
nlist clist
.
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
C/C++
malloc(),
free()
! 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
86
Example Code
Fortran90
PROGRAM ex5f_pointer
IMPLICIT NONE
REAL, POINTER
REAL, TARGET
REAL, DIMENSION(:), POINTER
REAL, DIMENSION(3), TARGET
::
::
::
::
ptr1
num = 3.0
ptr2
b
! b(1) = 1.0; b(2) = 2.0; b(3) = 3.0
87
etc.
2014-04-14
88
Implied DO
DO
A(5)
WRITE(*,*) (a(i), i=1, 5, 1)
READ(*,*) (a(i), i=1, 5)
DO
89
Where Construct
Where
where (expression)
statements
elsewhere
! optional...
statements
end where
.
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)
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
92
93
07. Subprogram
Subprogram
2014-04-14
94
Subprogram (1/3)
Subprogram
( )
subprogram .
subroutine
library function
subprogram
statement function
function
User defined function
function
95
Subprogram (2/3)
Subroutine & Function
Subroutine
Function
(call)
Function
return
function
return
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 c
c=a
a=b
b=c
myadd = a + b
RETURN
END
RETURN
END
97
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)
y= x
y = ln x
y = log x
98
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)
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
100
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
101
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
103
Modules
Subprograms
, Subprogram,
USE Module
!USING MODULE
MODULE ModuleName
USE ModuleName
CONTAINS
Subprogram 1
Subprogram 2
Subprogram n
104
Modules
INTENT Attribute
,
in, out, inout
INTENT(in)
INTENT(out)
INTENT(inout)
105
106
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
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
107
Program
Source
File
Fortran 90
Compiler
Program
Object
File
Linker
Module
Source
File
Fortran 90
Compiler
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
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
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
111
File I/O
2014-04-14
112
FMT = Format()
* : /, ,
Error ()
ERR :
END :
113
OPEN(UNIT=12,FILE=MY.TXT,STATUS=OLD,ACTION=READ,
POSITION=REWIND,IOSTAT=status)
UNIT : (9 ~ 99),
FILE :
CLOSE(UNIT=12)
114
WRITE(*,*) A,B,C
WRITE(6,30) A+X,B+Y,C+Z
WRITE(6,*) THE VALUE OF THE OUTPUT, A,B,C
115
STOP
END
116
100 FORMAT(3(F10.4))
DO i=1, n
$ vim points.dat
$ gfortran -o ex7b_fileio.x ex7b_fileio.f90
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
118
2014-04-14
119
PI = 4 Ac/As
120
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) /)
ENDDO
pi = (4 * in_count) / (in_count + out_count)
WRITE (*, '(A, F15.10)') 'PI = ', pi
END
121
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(*, *) '-------------------------------------------
122
$ 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
123
124
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
Data
126
127
128
129
130
131
2. ()
3. Syntax ,
4.
5. 1
6.
132