컴퓨팅브릿지 Basic Fortran grammar (Fortran 77) 김정한
- 목표
INDEX 1. Fortran
01. Fortran Basic Fortran grammar
Fortran FORmula TRANslation 1950 년대후반 IBM 에서개발 가장오래된최초의고급언어 (high level language) 1966 Fortran V (Fortran77) 국제표준채택 (1980, ISO) FORTRAN 77 Fortran 90, Fortran 95, Fortran 2003
Fortran 언어의특징 상호호환성 컴퓨터의기종에관계없이공통으로사용 쉽고간단한문법과명령어 단기간에활용가능 명령은문장으로표현, 문장은실행문과비실행문으로구성 다양한프로그램라이브러리지원 많은공개소스 (legacy code) 활용영역 많은입 출력을요구하는문제보다는많은양의계산이필요한공학, 통계학수학, 그리고경영과학등에널리사용되고있다 Software Inertia
Layout of FORTRAN program The layout of FORTRAN program dates back to old 80 column punched cards, which were used for program input Comment field(c/*) Statement number field : 1~5 column (1~99999) Continuation field (except 0/blank), Statement field Identification field : 73~80 column No translation, memo/references 1 2-5 6 7-72 73-80 Total=x_value+y_value & +z_value C Comment line. 9 9999 FORMAT( Answer =,I4)
Variable names Must be at least one alphabetic character long, up to a maximum of 6 alphanumeric characters 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 names X THEDAY Min_cur Time28 Invalid names X*Z THE TIME 7YEARS _no_way$
Basic data types Type statement:<data Type> <variable> [,<variable(s)>] integer age,grade Implicit statement Implicit double precision(a-h,o-z) Implicit real (I,x-z) Default Implicit variables. I to N integers!! Types Real Integer Complex Logical character e.g. X=5.0, y=3.0e2 i=20, j=-1 Z=(1.4,3.2) >>> 1.4+3.2i Test=.TRUE. Tag=.False. Char1= Hello
Parameters Parameters are constants, their value, once defined, can not be changed Executable statement 보다앞에위치 REAL gamma,pi INTEGER days paraemter(days=365) parameter(gamma=1.4, pi=3.14)
Assignment <variable> = <value> <variable> <expression> Expressions follow the BODMAS precedence rule Operators +-,*,/ and ** Only round bracket radius=2.5 y=z test=value+loop-temp volume=(4.0*pi*radius**3.0)/3.0 **3 0)/3 0
Relational expression Logical return with True or False value Left to right order Operator Math Meaning e.g..lt. < Less than A.LT.B LTB.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
Logical expression Complex conditions Order :.NOT..AND..OR..EQV..NEQV..TRUE. and.false. 값만가능 Operator Meaning e.g. Results.NOT. 부정.NOT.A A 가참아면거짓, 거짓이면참.AND. 논리곱 AANDB A.AND.B AB A,B 가모두참일때만참, 그이외는거짓.OR. 논리합 A.OR.B A,B 가모두거짓일때만거짓, 그이외는참.EQV. 논리등가 A.EQV.B A,B 가모두거짓이거나모두참일때참.NEQV. 논리비등가 A.NEQV.B A,B 가모두참이거나모두거짓일때거짓
Library function (1/2) Name Meaning e.g. Mathematical expression SIN, COS, TAN Sine,cosine, i tangent Y=SIN(X) y sin x SQRT 제곱근 Y=SQRT(X) y x EXP 지수 Y=EXP(X) x y e ABS,IABS 절대값 Y=ABS(X) y x ALOG 자연대수 Y=ALOG(X) y ln x 상용대수 ( ) y log x ALOG10 상용대수 Y=ALOG10(X)
Library function (2/2) Name Meaning e.g. Mathematical expression INT 실수 -> 정수 K=INT(X) 실수 X 를정수로변환 REAL 정수 -> 실수 Y=REAL(J) 정수 J 를실수로변환 FLOAT 정수 -> 실수 Y=FLOAT(J) 정수 J 를실수로변환 DBLE 정수 -> 실수 Y=DLBE(J) 정수 J 를실수로변환 ICHAR 문자 -> 정수 K=ICHAR(C) 문자 C 를정수로변환 CHAR 정수 -> 문자 C=CHAR(K) 정수 K 를문자로변환 MOD 나머지 Y=MOD(X,Y) X 를 Y 로나눈나머지 MAX (MIN) 최대 ( 최소 ) j=max(i1,i2,i3) i1,i2,i3 중최대값 ( 최소값 )
Control structure 제어문을사용한제어구조 분기구조 (branches structure) 지정된문번호로실행을이동 조건식의결과에따라프로그램을선택적으로수행 IF문, GOTO문 순환구조 (loops structure) 프로그램의일부분을반복실행하는명령문 DO~CONTINUE 문, GOTO 문과 IF 문을사용한구조 기타제어문 STOP : 주프로그램에서실행을종료 CALL : 서브루틴프로그램의호출 RETURN : 서브루틴실행을종료 END : 하나의프로그램이나서브루틴프로그램을끝냄
IF STATEMENT (1/2) Block IF statement IF(expression1) THEN {block1} ELSE IF(expression2) THEN {block2} ELSE {block3} END IF Logical IF statement IF(expression) statement
DO-loops 반복적으로수행되는문장블록제어 DO label,variable=e1,e2,e3 l bl label CONTINUE {block of statement} Label : 문장번호 Variable : 제어변수명 ( 정수형변수나실수형변수 ) e1: 초기값, e2: 최종값 ( 정수형, 실수형변수, 상수, 산술식등 ) e3: 증분값 ( 양수나음수 )
Computed GO TO statement 여러방향의선택 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 expression 이범위를벗어나면 GOTO 문의다음문을실행
Array FORTRAN 의배열 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) 배열을구성하는변수명의하한값은 default가 1 V(c1:c2) 로선언가능 : c1은차원의하한값, c2는차원의상한값 Multi-dimensional array 7D까지가능 C언어와의배열구조차이를이해하는것이중요
DATA 문 (1/2) 변수나배열요소에초기치부여 지정문과같은효과를가지며다수의초기치를한줄로부여 DATA nlist /clist/, nlist /clist/.. nlist : 변수명, 배열명, clist : nlist에기억시킬숫자나문자, 논리상수리스트 DATA 문사용의규칙 DATA 문은선언문뒤에, 최초의실행문보다앞에와야한다. nlist의항목수는 clist의항목수와일치 : 일대일대응 clist의 type은 nlist항목의 type형태로변환되어입력된다. nlist중의어떤항목의형이문자형이나논리형인경우는 clist도같은형이어야한다.
DATA 문 (2/2) 예제 A=10.5 B=21.3 C= IN DATA A/10.5/, B/21.3/, C/ IN / / or DATA A,B,C/10.5, 21.3, IN / DIMENSION a(5) DATA a/1.0, 2.0, 3.0, 4.0, 5.0/ DIMENSION b(10) DATA b/5*12.0, 5*21.0/ DIMENSION d(5) DIMENSION d(5) DATA d(2), d(3), (d(i),i=4,5)/11.0, 22.0, 33.0, 44.0/
부프로그램 (subprogram) (1/3) Subprogram 반복되는동일한명령문들의집단 별개의프로그램유닛으로작성하여호출 전체프로그램의간략화 다른프로그램에서공동으로사용가능 독립적컴파일에따른에러의수정이쉽다 대규모프로젝트에적합 ( 여러사람의참여가능 ) 무리한 subprogram 의사용은코드의성능저하를가져올수있다. subprogram subroutine function library function User defined function statement function function
부프로그램 (subprogram) (2/3) Subroutine & function Subroutine Function 호출호출문 (call) Function 명에의해호출 인수필요한경우사용한개이상의인수반드시필요처리된결과여러인수에실어 return function명에실어단한개만을 return 기타 서브루틴명은수식에사용불가변수와같이이용할수없음 프로그램의수식에서변수처럼사용가능
부프로그램 (subprogram) (3/3) 문함수 (statement function) 비교적간단한함수를 1 개의문장을이용해서정의 두개이상의문장으로표현불가 한개의단위프로그램내에서만사용가능 최초의실행문앞에, 선언문보다는뒤에위치한다. 문함수명을변수나배열로사용불가 비실행문으로문번호를가질수없음 NAME(d1, d2,.., dn) = expression Variable = NAME(a1, a2,., an) 호출문
COMMON 문 (1/2) 전역변수자료전달 많은개수의인수목록을단순화할수있음 최초의실행문보다앞에위치 Dimension문대신에배열을선언할수있다. Blank(unlabeled) l l 와 Named(labeled) l d) common 문 COMMON O variable ab list COMMON /common block name/ variable list
COMMON 문 (2/2) Blank common 문 부프로그램에서사용되는가인수사용불가 가변크기배열은사용불가 Subroutine SUB(X,N,IM) COMMON A, B, N(10), Z(IM) Named common 문 DATA 문으로초기치를부여할수있다 문자형데이터와문자형이외의데이터는하나의공통블럭안에서함께사용불가 REAL A,B CHARACTER*10 WORD COMMON /A1/A,B,WORD COMMON /A1/A,B /A2/WORD
입 / 출력문 (1/4) OPEN 파일열기 OPEN(UNIT=n, FlLE=fname, FORM=frm, ACCESS=acc, STATUS=sta, RECL=rl, IOSTAT=ios, ERR=err) UNIT = 정수형 : 특정장치에의한입 / 출력 (1~99) FILE = 파일이름 FORM = Formatted, Unformatted(default) ACCESS = Sequential(default), Direct STATUS = New, Old, Scratch, Unknown RECL = 각레코드의길이 (access = 'Direct') IOSTAT = 에러코드받는변수 ERR = 에러가발생했을때수행할 line number 파일닫기 :Close(UNIT=n)
입 / 출력문 (2/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)/ 모니터 (6)) FMT = 출력형식 * : 자유형식에의한입 / 출력, 데이터사이구분을위해컴마나빈칸 Error 및파일끝부호 ( 생략가능 ) ERR : 실행중오류발생시지정된문번호르실행이동 END : 입력파일의마지막까지다읽은경우지정된문번호로이동
입 / 출력문 (3/4) Format (FMT) Real Positioning Purpose Integer Decimal Form Description Iw, Iw.m Fw.d Exponential Form Ew.d Logical Character Horizontal Tabbing Lw A, Aw Vertical / Other Grouping r(...) nx Tc WRITE(*, '(I2, x, F5.2)') I, A
입 / 출력문 (4/4) Example 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
FORMAT 문 (1/2) READ/WRITE 와함께사용할수있는비실행문 DATA ii /1, 2, 3, 4/ i1 = -10 i2 = 999 i3 = 111 a1 = 100.0 a2 = -9.99 a3 = 1.23e9 write(*,100) i1,i2,i3,(ii(j),j=1,4) i2 i3 j=1 100 format(i4,1x,i2,1x,i10.5,1x,4(i2,1x)) write(*,200) a1,a2,a3 200 format(f7.2,1x,f7.1,1x,e7.2)
FORMAT 문 (2/2) 문자형변수출력 character*20 A A = format test write(*,100) A 100 format(a20) 줄바꿈표시 / : 입 / 출력시다음줄로이동 write(*,400) (ii(j),j=1,4) 400 format(4(i2,/)) 한칸이동 x
Using Library(1/2) Library? 하나이상의 Subroutine, Function 들이저장된모음 다른프로그램들과링크 특정계산에최적화된루틴 Libraries BLAS, GotoBLAS, ATLAS LAPACK, FFTW MKL, ACML, ESSL : (Vendor Library - BLAS, LAPACK, FFT) Linking
Using Library(2/2) Inverse Matrix (LAPACK) PROGRAM Inverse_Matrix IMPLICIT NONE INTEGER i,j,k,n,info PARAMETER (n=2) INTEGER IPIVOT(n) DOUBLE PRECISION A(n,n), P(n,n), WORK(n) A(1,1)=1.0d0;A(1,2)=1.0d0;A(2,1)=2.0d0;A(2,2)=3.0d0 P(1,1)=1.0d0;P(1,2)=0.0d0;P(2,1)=0.0d0;P(2,2)=1.0d0 PRINT *, 'Initial A =' DO i=1,n PRINT '(F4.1,x,F4.1)', (A(i,j), j=1,n) ENDDO! Factorization CALL DGETRF(n, n, A, n, IPIVOT, INFO)! Solve A^{-1} CALL DGETRI(n, A, n, IPIVOT, WORK, n, INFO) PRINT *, 'Inverse of A = ' DO i=1,n PRINT '(F4.1,x,F4.1)', (A(i,j), j=1,n) ENDDO STOP END