Fortran Training Course - V20140411 - 2day
Fortran Training Course - V20140411 - 2day
Fortran Training Course - V20140411 - 2day
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.
Selective Statement
Loop Statement
2 Day
Dynamic Allocation
09:30 - 10:30
Subprogram
File I/O
2014-04-14
SUPERCOMPUTING EDUCATION CENTER 4
Connect to edu system
Environment Setup
2014-04-14
SUPERCOMPUTING EDUCATION CENTER 5
Basic User Environment
L ogin
– 사용자의 초기 접속은 총 4대의 로그인 노드로 한정됨
– 컴퓨팅 노드로의 액세스 불가
– 액세스 인터페이스는 ssh, sftp, ftp, X11 만 허용됨
U nix or Linux
– $ ssh -l user_id xxx.xxx.xxx.xxx or
– $ ssh -l user_id IP address
W indows
– putty 나 SSH Secure Shell Client 등의 ssh 접속 유틸리티를 이용함
• Free Download Site : http://www.putty.org/
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 95
Fortran 2003
활용 영역
– 많은 입‧출력을 요구하는 문제보다는 많은 양의 계산이 필요한 공학, 통
계학, 수학, 그리고 경영과학 등에 널리 사용
Software Inertia
PROGRAM HELLO
Program
IMPLICIT NONE Name
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 (거의 사용하지 않음)
Total=x_value+y_value
& +z_value
C Comment line
병렬 연산 표현 불가능
수치적 이식성 부족
– 시스템 간 정밀도 표현 차이
Fortran90 새로운 기능 소개
– 개선된 문법
– Type Declaration과 attributing
– New control structure
– Numeric Processing
– Dynamic Memory Allocation
– Array Processing
– Pointers
– 데이터 타입과 연산자의 사용자 정의
– 프로시저
– 모듈
– 프로그램 단위
STOP
END
(http://www.comphys.uni-duisburg.de/Fortran90/pl/pl.html)
관계 연산자 표현
• .LT., .LE., .EQ., .NE., .GE., .GT. : Fortran77 스타일
• <, <=, ==, /=, =>, > : Fortran90 허용
Fortran : /=
C/C++ : !=
PROGRAM free_source_form
IMPLICIT NONE
PRINT*, &
Size
Type Description Example
(64bit OS기준)
3.141592654, 0.2353
Real 실수형 4 Byte
123.45E0, 1234.3E-3
Fortran77 Fortran90
Valid Invalid
X X*Z
Min_cur 7YEARS
Time28 _no_way$
– Operators +, -, *, /, **
Assignment
radius = 2.5
y=z
test = value+loop-temp
volume = (4.0*pi*radius**3.0) / 3.0
Parameter type
REAL gamma, pi
INTEGER, PARAMETER :: days = 365 ! Fortran90 Style
PARAMETER(gamma=1.4, pi=3.14) ! Fortran77 Style
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
Formatted Output
2014-04-14
SUPERCOMPUTING EDUCATION CENTER 35
Formatted Output
Fortran 입/출력의 종류
– 자동서식형태 : 컴퓨터에 의해 자동적으로 서식이 지정
– 서식지정형태 : 프로그래머에 의해 서식이 지정
PRINT 사용법
PRINT 서식지정자, 출력목록
결과 화면
100 FORMAT (1X, 2I5, I7, I10) ! 2I5 is same I5, I5 (Repetion Indicatior)
101 FORMAT (1X, 2I5.2, I7, I10.7)
102 FORMAT (1X, 2I5.0, I7, I10)
200 FORMAT(A)
STOP
END
결과 화면
STOP
END
결과 화면
x = 0 . 4 0 y = 8 . 7 0
– D 배정밀도
– E 실수 (지수)
– F 실수 (고정) 일반적으로 F(또는 D, E) Fw.d (w:숫자적을 전체칸, d:유효숫
자)
– I 정수
– 줄바꿈 표시’/’ : 입/출력시 다음줄로 이동
write(*, 400) (ii(j), j=1,4)
400 format(4(i2,/))
– 한칸 이동 ‘x’
STOP
END
Selective Statement
2014-04-14
SUPERCOMPUTING EDUCATION CENTER 45
Relational Expression
Logical return with True or False value
– Left to right order
– 순환구조(loops structure)
• 프로그램의 일부분을 반복 실행하는 명령문
• DO ~ CONTINUE문, GOTO문과 IF문을 사용한 구조
– 기타 제어문
• STOP : 주 프로그램에서 실행을 종료
• CALL : 서브루틴 프로그램의 호출
• RETURN : 서브루틴 실행을 종료
• END : 하나의 프로그램이나 서브루틴 프로그램을 끝냄
IF (expression) statement
IF (expression) THEN
statement
...
ENDIF
Example Code
STOP
END
IF (expression1) THEN
statements
ELSEIF (expression2) THEN
statements
ENDIF
Example Code
IF (a > b) THEN
max = a
ELSEIF (b < a) THEN
min = b
ENDIF
40 CONTINUE
STOP
END
SELECT-CASE (Fortran90)
– IF 문과 같은 순차적 선택이 아닌 병렬적 선택 수행
CASE(value-list)
statements
CASE(value-list)
statements
END SELECT
INTEGER :: n, k
WRITE (*, *) ‘ k = ‘, k
END
2014-04-14 58
SUPERCOMPUTING EDUCATION CENTER 58
Derived Data Type
Derived Data Type 사용 예
TYPE COORDS_3D
REAL :: x, y, z
END TYPE COORDS_3D
TYPE SPHERE
TYPE ( COORDS_3D ) :: center
REAL :: radius
END TYPE SPHERE
1. ‘%’ 연산자 이용
teamA(1)%record(2,2)
teamA(4)%record(:, :)
teamA(:)%record(1,2)
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))
Loop Statement
2014-04-14
SUPERCOMPUTING EDUCATION CENTER 64
Do Loops (1/5) – F77
비슷한 작업을 반복할 때 사용, C/C++ 언어의 for 반복문과 동일
Fortran 77에서는 한가지 Loop, 즉 Do-loop 뿐이다
DO label, variable = e1, e2, e3
{block of statement}
label 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
END
DO i = 1, 100
total = total + i
ENDDO
END
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
END
DO WHILE (expression)
statements
ENDDO
END
statements2
ENDDO
– 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
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
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
C/C++ Array
int ar[10];
Index는 ar[0] ~
a[9]
INTEGER i, j
INTEGER 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
– INTEGER max
PARAMETER (max=100)
REAL buf(max, max)
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
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 i, j
INTEGER, PARAMETER :: max=3
INTEGER, DIMENSION(max, max) :: buf
DO i = 1, max
DO j = 1, max
buf(i, j) = i * j
STOP
END
Memory
Address
a(0,0) a(0,1) a(0,2) a(0,0) a(0,1) a(0,2)
1000 1012 1024 1000 1004 1008
DO i=0, 2
DO j=0, 2 for (i=0; i<3; i++)
a(j, i) = ?
for (j=0; j<3; j++)
END DO
END DO a(i, j) = ?
INTEGER i, j INTEGER i, j
INTEGER, PARAMETER :: max=10000 INTEGER, PARAMETER :: max=10000
INTEGER, DIMENSION(max, max) :: buf INTEGER, DIMENSION(max, max) :: buf
STOP STOP
END END
– nlist : 변수명,배열명,
– clist : nlist에 기억시킬 숫자나 문자, 논리 상수 리스트
DATA문 사용의 규칙
– DATA문은 선언문 뒤에, 최초의 실행문 보다 앞에 와야 한다.
– nlist의 항목수는 clist의 항목수와 일치 : 일대일 대응
• clist의 type은 nlist항목의 type형태로 변환되어 입력된다.
• nlist중의 어떤 항목의 형이 문자형이나 논리형인 경우는 clist도 같은 형
이어야 한다.
A = 10.5
B = 21.3
C = ‘IN’
D ATA A / 1 0 . 5 / , B / 2 1 . 3 / , C / ’ I N ’ / or
D ATA A , B , C / 1 0 . 5 , 2 1 . 3 , ’ I N ’ /
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 /
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
STOP
END
$ gfortran -o ex5f_pointer.x ex5f_pointer.f90
$ ./ex5f_pointer.x
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)
Subprogram
2014-04-14
SUPERCOMPUTING EDUCATION CENTER 94
Subprogram (1/3)
Subprogram
– 반복되는 동일한 명령문들의 집단
• 전체 프로그램의 간소화
• 다른 프로그램에서 공동으로 사용 가능
Subroutine Function
호출 호출문(call) Function명에 의해 호출
function명에 실어 단 한 개만을
처리된 결과 여러 인수에 실어 return
return
CALL SWAP(m, n)
total = myadd(m, n)
SUBROUTINE SWAP(a, b)
INTEGER FUNCTION myadd (a, b)
INTEGER a, b
INTEGER a, b
INTEGER c
myadd = a + b
c=a
a=b
RETURN
b=c
END
RETURN
END
EXP 지수 Y=EXP(X) y= x
ABS,IABS 절대값 Y=ABS(X)
SUBROUTINE sub(…)
INTEGER bufsize, n
PARAMETER (bufsize=10)
REAL a(bufsize, bufsize)
COMMON /apple/ a, n, bufsize
..
END SUBROUTINE
a=1
b=2
CALL swap
SUBROUTINE swap
INTEGER c, d
INTEGER tmp
COMMON c, d
IMPLICIT NONE
INTEGER :: a = 1, b = 2, myadd
INTEGER total
total = myadd(a, b)
END
myadd = c + d
RETURN
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
MODULE ModuleName
USE ModuleName
CONTAINS
Subprogram 1 USE ModuleName, ONLY : List
Subprogram 2
…
Subprogram n
프로시저 내의 인수들에 대한 이용 계획 명시
– 효율적인 컴파일, 프로그램 안전성 증가
– in, out, inout
!Use the function Fahr_to_Celsius to convert it to Celsius ! Function to convert a Celsius temperature to Fahrenheit.
C_Temp = Fahr_to_Celsius(F_Temp) Function Celsius_to_Fahr(Temp)
REAL::Celsius_to_Fahr
! Output the result REAL, INTENT(IN) :: Temp
PRINT '(1X, 2(F6.2, A))', F_Temp, &
" in Fahrenheit is equivalent to ", C_Temp, " in Celsius" Celsius_to_Fahr = 1.8 * Temp + 32.0
END FUNCTION Celsius_to_Fahr
END PROGRAM Temp_Conversion_2 END MODULE Temperature_Library
Program Program
Source Fortran 90 Object
File Compiler File
Program
Executable
Linker
File
Module Module
Source Fortran 90 Object
File Compiler File
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
Factorial(5) n Fact
5 120
= n * Factorial(n - 1) 120
Factorial(4) n Fact
= n * Factorial(n - 1)
4 24
n Fact
Factorial(3) = n * Factorial(n - 1)
3 6
n Fact
Factorial(2) = n * Factorial(n - 1)
2 2
n Fact
Factorial(1) = n * Factorial(n - 1)
1 1
Factorial(0) n Fact
=1
0 1
File I/O
2014-04-14
SUPERCOMPUTING EDUCATION CENTER 112
Input / Output (1/4)
I/O statements
– Line단위의 입출력
• FMT = Format부호(생략가능)
– * : 자유형식에 의한 입/출력, 데이터 사이 구분을 위해 ,나 빈칸
• Error및 파일끝부호(생략가능)
– ERR : 실행중 오류발생시 지정된 문 번호로 실행 이동
– END : 입력파일의 마지막까지 다 읽은 경우 지정된 문 번호로 이동
OPEN(UNIT=12,FILE=“MY.TXT”,STATUS=“OLD”,ACTION=“READ”,
POSITION=“REWIND”,IOSTAT=status)
REPLACE(NEW+OLD)
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
REAL A, B, C
READ(*, *) A, B, C
WRITE(*, 10) A, B, C
10 FORMAT(F4.1, F5.2, F6.3)
STOP
END
READ(10, *) n CLOSE(10)
CLOSE(20)
WRITE(*, *) n 9999 STOP
WRITE(20, *) n END
2014-04-14
SUPERCOMPUTING EDUCATION CENTER 119
Advanced Lab #1 (1/2)
<Problem>
– Monte carlo simulation
– PI = 4 ⅹAc/As
END
뒷장에 계속
CLOSE(20)
END
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
IMPLICIT NONE
INTEGER, PARAMETER :: NumItems = 5
REAL, DIMENSION(NumItems) :: A
A = (/1,2,3,4,5/)
!A = (/I,I=1,5/)
CONTAINS
FUNCTION Norm(A, N)
INTEGER, INTENT(IN) :: N
REAL, DIMENSION(N), INTENT(IN) :: A
REAL :: Norm
Norm = SQRT(SUM(A*A))
Using Array Intrinsic
END FUNCTION Norm functions
1 + 2 + ⋯ +
END PROGRAM array_func_norm
IMPLICIT NONE
INTEGER, PARAMETER :: NumItems = 5
REAL, DIMENSION(NumItems) :: A, B
A = (/1,2,3,4,5/)
B = (/1,2,3,4,5/)
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
IMPLICIT NONE
INTEGER, PARAMETER :: NumItems = 5
REAL, DIMENSION(NumItems) :: A
A = (/1,2,3,4,5/)
!A = (/I,I=1,5/)
CONTAINS
FUNCTION Mean(X)
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 '(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