Fortran basic 2018 전산천문학및실습 한두환 / 박명구
Fortran 이란? Fortran (FORmula TRANslation) - 과학및공학분야에서수학적계산에주로사용하는프로그램언어 - Outdated but still important, especially in science Version Fortran 66 Fortran 77 Fortran 90/95
Fortran 구조 프로그램구조 Program name Declarations Statements Stop End 주프로그램의이름 선언문 : 변수, 배열, 프로그램의성질 실행문 : 직접실행되는문 ( 치환문, 제어문, 입출력문 ) 프로그램의정지 프로그램의끝
Fortran 구조 프로그램구조 주프로그램의이름 선언문 : 변수, 배열, 프로그램의성질 실행문 : 직접실행되는문 ( 치환문, 제어문, 입출력문 ) 프로그램의정지 프로그램의끝
Fortran 규칙 칸 (Column) 에관한규칙 칸내용설명 1 1-5 6 주석행 (Comment) 문번호 (Statement #) 연속행 (Continue line) 첫째칸에 * 또는 c 를써서행을시작하면주석행으로선언할수있다. 문 (Statement) 을식별또는참조할때사용문번호를선언할수있고 1-99999 사이의숫자를사용할수있다. 6 번째칸에문자를사용하면문을연결하여사용할수있다. 7-72 문 (Statement) 실행문기술 72 번째칸까지실행문을기술할수있다. 73- 이이후에열은컴파일할때무시된다.
Fortran 규칙 칸 (Column) 에관한규칙 C 1 2 3 4 5 6 7 C23456789012345678901234567890123456789012345678901234567890123456789012 program rule real r, area, pi pi = 3.141592653589793238462643383279502412 c This program reads a real number r and prints c the area of a circle with radius r. write (*,20) The value of PI is, + pi 20 format(a20,f12.9) write (*,*) 'Give radius r:' read (*,*) r area = 3.14159*r*r write (*,*) 'Area = ', area stop
변수의종류와선언 변수 (Variables) 변수이름은문자 a-z 와숫자 0-9 로정의할수있다. 단, 첫번째는문자로시작해야한다. 대문자와소문자를구분하지않는다. 변수의종류 (Types) 종류 (Type) 내용 설명 integer 정수형 32bit (-2147483648, 2147483647) real 실수형 32bit (1.175494E-38, 3.402823E+38) double precision 배정도실수형 64bit (2.225074D-308, 1.797693D+308) complex 복소수형 ( 실수부, 허수부 ) logical 논리형 참 (.TRUE.) 거짓 (.FALSE.) character 문자형 문자, 문자열
변수의종류와선언 변수의선언 1. 변수종류선언문에의한방법 2. IMPLICIT 명령문에의한방법 3. 묵시적방법 4. 매개변수문에의한방법 program variables integer num implicit integer (v-y,z) implicit real (a-c,e) real pi, pi2 parameter (pi=3.14159265358979) pi2=3.14159 index=10 num=211 stop
변수의종류와선언 1. 변수종류선언문에의한방법변수종류에따라대응하는명령문사용 INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICAL, CHARACTER Integer num Real num1 Double precision num3 Complex vect Logical mx Character str*7 num=9 num1=7.2 num2=9.3d0 vect=(2,3) mx=.true. str= abcdefg 변수명 num num1 num3 vect mx str 종류정수형실수형배정도실수형복소수형논리형문자형
변수의종류와선언 2. IMPLICIT 명령문에의한방법 특정영문자혹은지정된범위에포함된영문자로시작하는 변수명의종류 (type) 을지정한다. implicit integer(a-c,x) implicit real(i-n,z) 변수명의첫문자가 a-c (a, b, c), x 로시작하는변수명은모두정수형변수가된다. 변수명의첫문자가 i-n, z 로시작하는변수는모두실수형변수가된다.
변수의종류와선언 3. 묵시적방법변수명의첫문자가 I-N 중하나로시작되는변수는정수형변수로선언된다. 그외나머지변수명은실수형변수가된다. 4. 매개변수문에의한방법프로그램에서상수와같이변수값이변하지않는경우매개변수문을이용하여선언할수있다. real pi parameter (pi=3.14159265358979) 실수형변수인 pi 의변수값을 3.14159265358979 로정의한다.
기초명령어 1. READ READ( 입력장치번호, FORMAT 문번호,ERR 문번호,END 문번호 ) 2. PRINT(or WRITE) PRINT( 입력장치번호,FORMAT 문번호 ) 3. STOP 4. END read *, num read(*,*)name print *, pi print(*,*) num write(5,10) pi,num
예제 1 program Hello print *, Hello! write(6,90) 90 format(1x, Nice to meet you.,/) stop Hello! Nice to meet you. Press RETURN to close window...
예제 2 program vartype Integer num Real num1 Double precision num2 Complex vect Logical mx Character str*7 num=9 num1=7.2 num2=9.3e0 vect=(2,3) mx=.true. str='abcdefg' print *,num stop
예제 3 원의넓이계산 program circle real r, area, pi parameter (pi = 3.14159) write (*,*) 'Input radius r: read (*,*) r area = pi*r*r write (*,*) 'Area = ', area stop Give radius r: 2 Area = 12.5664 Press RETURN to close window...
연산 (expression) 산술연산자 우선순위연산자비고 1 괄호속소괄호만사용가능 2 함수 3 ** 지수 4 *,/ 곱셈, 나눗셈 5 +,- 덧셈, 뺄셈 사용예 A=3+5 B=A*8 c=a**2 x=(2.0,3.1)-(1.0,1.1)
연산 (expression) 관계연산자 연산 의미.GT. Greater than ( >) ~ 보다크다..GE. Greater than or equal to ( ) ~ 보다크거나같다..LT. Less than (<) ~ 보다작다..LE. Less than or equal to ( ) ~ 보다작거나같다..EQ. Equal to (=) ~ 와같다..NE. Not equal to ( ) ~ 와같지않다.
연산 (expression) 논리연산자연산의미.NOT. 부정 A.NOT. A T F.AND. 논리곱 A B A.AND. B T T T T F F F F F.OR. 논리합 A B A.OR. B T T T T F T.EQV. 논리등가 A B A.EQV. B T T T T F F F F T.NEQV. 논리비등가 A B A.NEQV. B T T F T F T
내장함수
예제 4 - 연산 (expression) program Arithmetic A=5.7 B=6.5 I=8 K=7 C=A+I D=A+B*K E=A+I/K F=I/K write (*,*)'A= ',A, B= ',B write (*,*)'I= ',I, K= ',K write (*,*)'A+I= ',C write (*,*)'A+B*K= ',D write (*,*)'A+I/K= ',E write (*,*)'I/K= ',F stop
예제 4 - 연산 (expression) program Arithmetic A= 5.70000 B= 6.50000 A=5.7 B=6.5 I=8 K=7 C=A+I D=A+B*K I= A+I= A+B*K= A+I/K= I/K= 8 K= 13.7000 51.2000 6.70000 1.00000 7 E=A+I/K Press RETURN to close window... F=I/K write (*,*)'A= ',A, B= ',B write (*,*)'I= ',I, K= ',K write (*,*)'A+I= ',C write (*,*)'A+B*K= ',D write (*,*)'A+I/K= ',E write (*,*)'I/K= ',F stop
예제 5 - 연산 (expression) 논리연산 program Logic LOGICAL s1,s2,s3,s123 a=10.0 b=50.0 s1=a.ge.10.and.a.lt.40 s1 10 a<40 s2=a.ge.0.and.a.lt.10.or.b.ge.50 s2 0 a<10 or b 50 s3=b.ge.0.and.b.lt.50 s3 0 b<50 s123=s1.or.s2.or.s3 s123 s1 or s2 or s3 write (*,*)'a=',a,' b=',b write (*,*)'s1=',s1,' s2=',s2,' s3=',s3 write (*,*)'s123=',s123 stop
예제 5 - 연산 (expression) 논리연산 program Logic LOGICAL s1,s2,s3,s123 a=10.0 Press RETURN to close window... b=50.0 s1=a.ge.10.and.a.lt.40 s1 10 a<40 s2=a.ge.0.and.a.lt.10.or.b.ge.50 s2 0 a<10 or b 50 s3=b.ge.0.and.b.lt.50 s3 0 b<50 s123=s1.or.s2.or.s3 s123 s1 or s2 or s3 write (*,*)'a=',a,' b=',b write (*,*)'s1=',s1,' s2=',s2,' s3=',s3 write (*,*)'s123=',s123 stop a= 10.0000 b= 50.0000 s1= T s2= T s3= F s123= T
예제 6 연산 (expression) xx 2 + 2aaaa + bb = 0, aa = 5, bb = 24 일때근찾기,xx = aa ± aa 2 bb program Roots_of_EQ C---roots of X**2+2aX+b=0---- real a,b a=-5.0 b=24.0 root1=-a+sqrt(a**2-b) root2=-a-sqrt(a**2-b) write (*,*)'a=',a,' b=',b print *, Roots of X**2+2aX+b=0 : write (*,*) root1, and ', root2 stop
예제 6 연산 (expression) xx 2 + 2aaaa + bb = 0, aa = 5, bb = 24 일때근찾기,xx = aa ± aa 2 bb program Roots_of_EQ C---roots of X**2+2aX+b=0---- a= -5.00000 b= 24.0000 real a,b Roots of X**2+2aX+b=0 : 6.00000 and 4.00000 a=-5.0 b=24.0 Press RETURN to close window... root1=-a+sqrt(a**2-b) root2=-a-sqrt(a**2-b) write (*,*)'a=',a,' b=',b print *, Roots of X**2+2aX+b=0 : write (*,*) root1, and ', root2 stop
프로그램오류 1. Syntax Error 스펠링이틀린경우 잘못된명령어사용 Comma(,), apostrophe( ) 사용 2. Run-time Error 수식연산중에나는오류 (0 으로나누는경우 ) 3. Line-Positioning Errors 잘못된열에서작성 (7~72) 4. Errors in Arithmetic Expressions 변수종류를혼용해서사용 (REAL : A-H, O-Z, INTEGER : I-N)
입출력문 (I/O statement) OPEN 문외부파일을사용혹은생성하거나장치를연결하는데사용하는명령문기본형식 : open (unit=unitnumber,file=filename, ) open(unit=1,file= test.dat ) open(1,file= test.dat ) unit : 장치번호, 1-99사이의정수, 5 : 표준입력 6 : 표준출력 * : 장치번호생략시, 표준입출력선언
입출력문 (I/o statement) READ 문외부파일혹은장치로부터자료를읽어들일때사용하는명령문기본형식 : read (unit=unitnumber,format, )variables read(*,*)x 표준입력을통해변수값 x, y 를읽는다. CLOSE 문파일의사용이끝나면 CLOSE 문을사용하여파일을닫는다. 기본형식 : close (unit=unitnumber) 9번장치번호의 close(9) 파일을닫는다.
입출력문 (I/o statement) PRINT 문변수값을표준출력장치에출력한다. 기본형식 : print *,variables print *,x WRITE 문외부파일혹은장치에변수값을출력한다. 기본형식 : write(unit=unitnumber,format, ) write(*,*)x
입출력문 (I/o statement) 파일입력 1. 파일열기 (OPEN 문 ) 2. 자료읽기 (READ 문 ) 3. 파일닫기 (CLOSE 문 ) 파일출력 1. 파일열기 (OPEN 문 ) 2. 자료출력 (WRITE 문 ) 3. 파일닫기 (CLOSE 문 )
예제 7 입출력문 (I/o statement) program IO real A,I,C open(unit=9,file='ex07-io.txt') read(9,*)a,i close(9) ex07-io.txt 파일을읽어들이고읽은자료를출력하고, 자료의합도출력하기 C=A+I write(*,*)'a=',a,' I=',I write(*,*)'c=',c open(11,file='ex07-out.txt') write(11,*)'a==',a,' I==',I write(11,*)'c==',c close(11) stop
예제 7 입출력문 (I/o statement) program IO real A,C open(unit=9,file='ex07-io.txt') read(9,*)a,i close(9) C=A+I write(*,*)'a=',a,' I=',I write(*,*)'c=',c open(11,file='ex07-out.txt') write(11,*)'a==',a,' I==',I write(11,*)'c==',c close(11) stop ex07-io.txt 파일을읽어들이고읽은자료를출력하고, 자료의합도출력하기 A= 12.1230 I= 7 C= 19.1230 Press RETURN to close window...
입출력문 (I/O statement) FORMAT 문입출력문과같이사용되며변수값의형태를변환시켜준다. fn format(formatcode) fn = 문번호 formatcode : 형식기본형식의미 (w: 변수전체칸,d: 유효숫자 ) 예 A Aw 문자열 A9 D Dw.d 배정도실수형 D7.3 E Ew.d 실수형, 지수표시 E8.2 F Fw.d 실수형, 고정형식 F9.5 I Iw 정수형 I3 X wx 수평띄워쓰기 2X
입출력문 (I/o statement) 예제 1 예제 ) hello.f program Hello print *, 'Hello!' write(6,90)'hello~~!' 90 format(3x,a3,/) 결과 stop Hello! Hello~~! Press RETURN to close window...
예제 8 입출력문 (I/o statement) program format_ex A=5.7 I=8 C=A+I write (*,*)'A= ',A write (*,*)'A+I= ',C write (*,*)'--use format statements--' write (*,10)'A=',A write (*,20)'A+I=',C 10 format(a2,f3.1) 20 format(a4,f4.1) stop
예제 8 입출력문 (I/o statement) program format_ex A=5.7 I=8 C=A+I write (*,*)'A= ',A write (*,*)'A+I= ',C A= 5.70000 A+I= 13.7000 --use format statements-- A=5.7 A+I=13.7 Press RETURN to close window... write (*,*)'--use format statements--' write (*,10)'A=',A write (*,20)'A+I=',C 10 format(a2,f3.1) 20 format(a4,f4.1) stop
예제 9 - 입출력문 (I/o statement) 반지름을입력받아원의넓이를계산하여 ex09-circle.txt 파일로결과를저장하기 program circle real r, area, pi parameter (pi = 3.14159) c This program reads a real number r and prints c the area of a circle with radius r. open(3,file='ex09-circle.txt') write (*,*) 'Give radius r:' read(*,*) r area = pi*r*r write (3,*) 'Given radius r=',r write (3,*) 'Area = ', area stop
예제 9 - 입출력문 (I/o statement) 반지름을입력받아원의넓이를계산하여 ex09-circle.txt 파일로결과를저장하기 program circle real r, area, pi parameter (pi = 3.14159) c This program reads a real number 2 r and prints c the area of a circle with radius r. open(3,file='ex09-circle.txt') write (*,*) 'Give radius r:' read(*,*) r area = pi*r*r write (3,*) 'Given radius r=',r write (3,*) 'Area = ', area stop Give radius r: Press RETURN to close window... Given radius r= 2.00000 Area = 12.5664
조건문 (if statement) 조건문 IF (expression) executable statement IF (expression) THEN statement ENDIF IF (expression) THEN statement ELSEIF (expression) THEN statement ELSE statement ENDIF if (x.lt. 0) x=-x if (y.gt. 0) then x=exp(y) if
조건문 (if statement) 조건문 Nested if statements if (x.gt. 0) then if (x.ge. y) then write(*,*) 'x is positive and x >= y' else write(*,*) 'x is positive but x < y' if elseif (x.lt. 0) then write(*,*) 'x is negative' else write(*,*) 'x is zero' if
예제 10 조건문 (if statement) x 값과 y 값을비교하여출력하기 program ex_if1 x=2.3 y=4.1 if (x.ge. y) then write(*,*) ' x >= y' else write(*,*) ' x < y' if stop x < y Press RETURN to close window...
예제 11 - 조건문 (if statement) x 값과 y 값을입력받고비교하여출력하기 program ex_if write(*,*) 'Give the values of x and y:' read(*,*) x,y if (x.gt. 0) then if (x.ge. y) then write(*,*) 'x is positive and x >= y' else write(*,*) 'x is positive but x < y' if elseif (x.lt. 0) then write(*,*) 'x is negative' else write(*,*) 'x is zero' if stop
예제 11 - 조건문 (if statement) x 값과 y 값을입력받고비교하여출력하기 program ex_if write(*,*) 'Give the values of x and y:' read(*,*) x,y if (x.gt. 0) then if (x.ge. y) then 4.1 write(*,*) 'x is positive x is positive and x >= but y' x < y else write(*,*) 'x is positive Press RETURN but x < to y' close window... if elseif (x.lt. 0) then write(*,*) 'x is negative' else write(*,*) 'x is zero' if stop Give the values of x and y: 2.3
반복문 (loops) DO loops 기본형식 : DO m i=s,e,t statements m CONTINUE m : DO loop의영역을나타내는문번호 i : 수행횟수의제어 (integer) s : 초기값 e : 최종값 t : 증가값 CONTINUE : 정상적인실행순서를진행시키는명령문
반복문 (loops) DO loops (fortran 90/95) DO i=s,e,t statements ENDDO WHILE loops expression 이참일경우반복한다. 기본형식 : WHILE (expression) DO statements ENDDO DO WHILE (expression) statements ENDDO
반복문 (loops) If 와 goto 를사용한반복문 m if (expression) then statements goto m if Until 반복문 DO statements until (expression) m continue statements if (expression) goto m
반복문 (loops) exiting from DO loops m m n DO m i=s,e,t statements if(expression) exit CONTINUE DO m i=s,e,t statements if(expression) goto n CONTINUE CONTINUE
반복문 (loops) 다중 DO 반복문 do 10 i=s1,e1,t1 do 20 j=s2,e2,t2 statements 20 continue 10 continue do 10 i=s1,e1,t1 do 10 j=s2,e2,t2 statements 10 continue
예제 12 - 반복문 (loops) 1 부터 n 까지의합계산 program loop_sum integer i, n, sum write(*,*) Give a value of n read(*,*)n sum = 0 do 10 i = 1,n sum = sum + i write(*,*) i=,i write(*,*) sum=,sum 10 continue stop
예제 12 - 반복문 (loops) 1 부터 n 까지의합계산 program loop_sum integer i, n, sum write(*,*) Give a value of n read(*,*)n sum = 0 do 10 i = 1,n sum = sum + i write(*,*) i=,i write(*,*) sum=,sum 10 continue stop Give a value of n 10 i= 1 sum= 1 i= 2 sum= 3 i= 3 sum= 6 i= 4 sum= 10 i= 5 sum= 15 i= 6 sum= 21 i= 7 sum= 28 i= 8 sum= 36 i= 9 sum= 45 i= 10 sum= 55 Press RETURN to close window...
예제 13 - 반복문 (loops) 100 보다작거나같은수를 2 의지수로하여값을계산 program loops integer n write(*,*) loop while n=1 while(n.le. 100) do n=2*n write(*,*)n do write(*,*) loop if statements n=1 10 if (n.le. 100) then n=2*n write(*,*)n goto 10 if stop
예제 13 - 반복문 (loops) program loops 100보다 integer 작거나n 같은수를 2의지수로하여값을계산 write(*,*) loop while n=1 while(n.le. 100) do n=2*n write(*,*)n do write(*,*) loop if statements n=1 10 if (n.le. 100) then n=2*n write(*,*)n goto 10 if stop loop - while 2 4 8 16 32 64 128 loop - if statements 2 4 8 16 32 64 128 Press RETURN to close window...
예제 14 - 반복문 (loops) 다중 DO 반복문 program doubledo do 10 i=1,10 do 20 j=1,10 write(*,*)'i,j=',i,j 20 continue 10 continue stop i,j= 1 1 i,j= 1 2 i,j= 1 3 i,j= 1 4 i,j= 10 8 i,j= 10 9 i,j= 10 10 Press RETURN to close window...
배열 (Array) 배열선언 : 변수는사전에선언하지않아도가능, 배열은반드시선언해야함. dimension a1(k) integer a1(k) real a1(k) character*n a1(k) a1(k): 1차원배열 (vector),k-첨자변수( 정수 ),n-문자수 real a1(k) a2(l:u): 1차원 real 배열 a2(l:u) (vector),l-첨자최소치,u-첨자최대치 ex) a(5) a[1],a[2],a[3],a[4],a[5] a(0:4) a[0],a[1],a[2],a[3],a[4]
배열 (Array) 배열선언 : 변수는사전에선언하지않아도가능, 배열은반드시선언해야함. 2차원배열 dimension a3(n1,n2) integer a3(n1,n2) real a3(n1,n2) character*n a3(n1,n2) n1-행, n2-열, n-문자수 (1,1) (1,2) (1,3) (1,n2) (2,1) (2,2) (2,3) (2,n2) (n1,1) (n1,2) (n1,3) (n1,n2)
배열 (Array) 배열입출력 : 입출력문에서배열명은배열요소전부를나타냄 integer a(3) read (*,*) a print *, a integer a(3) do 10 i=1,3 read (*,*) a(i) print *,a(i) 10 continue integer a(3) print *, (a(i),i=1,3)
배열 (Array) 배열입출력 : 입출력문에서배열명은배열요소전부를나타냄 2 차원배열출력 : integer a(2,3) print *, ((a(i,j),j=1,3),i=1,2) 순서 i=1(j=1,2,3) i=2(j=1,2,3) : 행우선으로처리 integer a(2,3) do 10 i=1,2 do 20 j=1,3 print *,a(i,j) 20 continue 10 continue
예제 15 - 배열 (Array) 3 by 3 행렬인 aa ii, jj = ii/jj 계산및출력 program ex_array integer i,j real a(3,3) do 10 i=1,3 do 20 j=1,3 a(i,j)=real(i)/real(j) 20 continue print *,(a(i,j),j=1,3) 10 continue stop
예제 15 - 배열 (Array) 3 by 3 행렬인 aa ii, jj = ii/jj 계산및출력 program ex_array integer i,j real a(3,3) do 10 i=1,3 do 20 j=1,3 a(i,j)=real(i)/real(j) 20 continue print *,(a(i,j),j=1,3) 10 continue stop 1.00000 0.500000 0.333333 2.00000 1.00000 0.666667 3.00000 1.50000 1.00000 Press RETURN to close window...
함수 (function) 포트란에서사용하는함수는라이브러리에내장되어있는내장함수 (intrinsic function) 과사용자가정의한문함수 (statement function) 가있다. 내장함수 (intrinsic fucntion) ex) 삼각함수, 로그함수, 지수함수, 제곱근 yy = ssssnn 2 xx + ccccss 2 xx + ee 2xx zz = xx + yy = xx 2 + yy 2 y=sin(x)**2+cos(x)**2+exp(2*x) z=abs(x+y)+sqrt(x**2+y**2)
함수 (function) 문함수 (statement fucntion) 사용자의필요에따라함수를정의. 기본형식 : fn(a1,a2,..., an)=expression fn: 함수명 a1,a2,...,an : 인수 expression : 산술식이나논리식 문함수위치는선언문다음, 실행문이전 함수명은 6 자이내 인수는 1 개이상 ADD(a,b)=a+b x=add(3.5,5.5)
예제 16 - 함수 (function) 문함수 (statement fucntion) 사용자의필요에따라함수를정의. ff xx = xx 3 2xx 2 + xx + 5 program fx real x,y,r f(x)=x**3-2*x**2+x+5 do i=1,20 r=0.5*i y=f(r) write(*,*)'f(',r,')=',y do stop
부프로그램 (subprogram) 함수의형태가하나의독립된단위프로그램으로작성된것 프로그램에서자주사용하는문함수를모듈처럼만들어사용할수있다. 기본형식 : ftype FUNCTION fn(v1,v2,...,vn) statement (fn=...) RETURN END ftype : 함수의형태 (REAL, INTEGER 등등 ) fn: 함수명 v1,v2,...,vn : 인수로단순변수또는배열명 RETURN : 호출프로그램으로되돌려주는명령문 END : 부프로그램의끝 [ 함수명 =...] 인내용이반드시포함. RETURN(or END) 문사용시함수명에저장된함수값이되돌려짐.
예제 17 - 부프로그램 (subprogram) a,b 를비교하여큰값선택하기 (findmax(a,b)) program find_max real a,b,findmax a=3.2 b=5.2 program ex_find_max real a,b external findmax a=3.2 b=5.2 print*,findmax(a,b) if(a.ge.b)then findmax=a else findmax=b if print*,findmax stop stop FUNCTION findmax(x,y) real x,y if(x.ge.y)then findmax=x else findmax=y if RETURN END
예제 18 - 부프로그램 (subprogram) 프로그램에서자주사용하는문함수를모듈처럼만들어사용할수있다. program ex_ft real y,r external f do i=1,20 r=0.5*i y=f(r) write(*,*)'r=',r,'y=',y do stop function f(x) real f,x f=x**3-2*x**2+x+5 return ff xx = xx 3 2xx 2 + xx + 5
부프로그램 -subroutine 함수부프로그램 (FUNTION) 과마찬가지로하나의독립된단위프로그램 여러개의결과값을전달할수있다. ( 함부부프로그램은하나의결과값만전달 ) 기본형식 : SUBROUTINE sn(v1,v2,...,vn) statement RETURN END sn: 서브루틴명 v1,v2,...,vn : 인수로단순변수또는배열명 RETURN : 호출프로그램으로되돌려주는명령문 END : 부프로그램의끝
부프로그램 -subroutine 함수부프로그램 (FUNTION) 과마찬가지로하나의독립된단위프로그램 기본형식 : SUBROUTINE sn(v1,v2,...,vn) statement RETURN END subroutin 은명령문임, 한개이상의 RETURN 문을포함해야하고, END 로끝난다. main 프로그램내에서사용할수없음 인수가없는경우도있음
부프로그램 -subroutine 주프로그램 (Main program) 에서서브루틴호출하는형식 CALL sn(v1,v2,...,vn) sn: 서브루틴명 v1,v2,...,vn : 인수로단순변수또는배열명 CALL: 서브루틴프로그램을호출시사용하는명령문 program main... CALL sn(v1,v2,...,vn)... STOP END SUBROUTINE sn(v1,v2,...,vn) statement RETURN END
예제 19 - 부프로그램 (subprogram) a,b 를비교하여큰값선택하기 (findmax(a,b)) program ex_find_max real a,b,maximum program find_max real a,b,findmax a=3.2 b=5.2 if(a.ge.b)then findmax=a else findmax=b if print*,findmax stop a=3.2 b=5.2 call findmax(a,b,maximum) print*,maximum stop SUBROUTINE findmax(x,y,maxim) real x,y,maxim if(x.ge.y)then maxim=x else maxim=y if RETURN END
형선언문 (Type Statement) IMPLICIT 문변수명의첫글자를임의로지정하여변수의형태를결정 IMPLICIT type(c1,...,cn), type(d1,...,dn) type : 변수의형태 (integer, real, character,...) C1,...,Cn, D1,...,Dn : 변수명의첫번째영문자 IMPLICIT integer(a,x-z), real(k-m) 묵시적방법무시 (I-N 중하나로시작되는변수명 = 정수형변수, 나머지변수명 = 실수형변수 ) IMPLICIT NONE
형선언문 (Type Statement) DATA 문특정변수나배열의원소에초기치설정 data v1,v2,...,vn /d1,d2,...,dn/ v1,v2,...,vn: 변수명또는배열명 d1,d2,...,dn: 초기치 data A,B,C /1.0, 2.5, 3.3/ data A/1.0/, B/2.5/, C/3.3/ dimension x(2,2), a(10) data x/1.0,-3.7,3.0,0.0/, a/10*0.0/ data m/10/, n/20/, x/2.5/, y/2.5/ data m,n /10,20/, x,y /2*2.5/ real A(10,20) data A/200*0.0/
공통블록 (Common blocks) COMMON 문여러서브루틴간에공동기억장소를마련해변수를공유하는방법 common /name1/v1,...,vn /name2/x1,...,xn name : common block 의이름, 앞뒤로 / 가있어야함. v1,...,vn x1,...,xn : 변수, 배열 부프로그램의 COMMOM 문에사용된변수는반드시주프로그램의 COMMON 문에사용되어야함. 주프로그램의 COMMON 문의변수이름인부프로그램에서 COMMON 문의변수이름과같지안아도됨 ( 같게할것을권장 )
공통블록 (Common blocks) COMMONprogram 문 여러서브루틴간에공동기억장소를마련해변수를공유하는방법 real A,B common /kim/a,b name : common... block의이름, 앞뒤로 / 가있어야함. v1,...,vn x1,...,xn : 변수, 배열 stop 부프로그램의 COMMOM문에사용된변수는반드시주프로 그램의 COMMON문에사용되어야함. 주프로그램의 subroutine COMMON tmp(..) 문의변수이름인부프로그램에서 COMMON문의변수이름과같지안아도됨 ( 같게할것을권장 ) real A,B common /kim/a,b... return
예제 20 - 공통블록 (Common blocks) program ex_area COMMON문여러서브루틴간에공동기억장소를마련해변수를공유하는방법 real L,Tarea,Rarea,Tcir,Rcir common /var/tarea,rarea,tcir,rcir L=3.0 name : common block의이름, 앞뒤로 / 가있어야함.... v1,...,vn x1,...,xn : 변수, 배열 call calarea(l) print*, Tarea=,Tarea print*, Rarea=,Rarea print*, Tcir=,Tcir print*, Rcir=,Rcir stop End subroutine calarea(x) 부프로그램의 COMMOM문에사용된변수는반드시주프로그램의 COMMON문에사용되어야함. real x,tarea,rarea,tcir,rcir common /var/tarea,rarea,tcir,rcir 주프로그램의 COMMON문의변수이름인부프로그램에서 COMMON문의변수이름과같지안아도됨 ( 같게할것을권장 ) Tarea=sqrt(3.0)/2.0*x**2 Rarea=x**2 Tcir=3.0*x Rcir=4.0*x subroutine calarea(x)... return
유의할점 program test print*,8/3 print*,8.0/3 print*,8.0/3.0 print*,2**3 print*,2.0**3 print*,2.0**3.0 stop 2.0**3 = 2.0*2.0*2.0 2.0**3.0 = exp(3.0*log(2.0) (-2.0)**3 : fine (-2.0)**3.0 : uncalculable
예제 least square fit yfit xx = aa sin xx + bb sin 2xx + cc sin 3xx sine.txt xx ii ( ) yy ii xx ii ( ) yy ii 3 0.0433 183-0.2043 20 0.2532 200-1.2431 34 0.3386 218-1.8422 50 0.356 230-1.8726 75 0.4983 248-1.4889 88 0.7577 269-0.8372 111 1.4585 290-0.4377 129 1.8628 303-0.364 143 1.8264 320-0.3508 160 1.2431 344-0.2126 sine.txt 자료를 yfit(x) 로 least square fit 해서 x, y, yfit(x) 를화면과파일 sinefit.txt 에출력하라. ff xx = aaff 0 xx + bbff 1 xx + ccff 2 xx ff 0 xx, ff 1 xx, ff 2 xx : known function of xx M = ff 0 2, PP ff 0 ff 1, QQ ff 0 ff 2 R ff 1 2, SS ff 1 ff 2, TT ff 2 2 U yyff 0, VV yyff 1, WW yyff 2 DD = MMMMMM + 2PPPPPP MMMM 2 RRQQ 2 TTPP 2 a = 1 DD b = 1 DD c = 1 DD UU RRRR SS2 + VV QQQQ PPPP + WW PPPP QQQQ UU SSSS PPPP + VV MMMM QQ2 + WW PPPP MMMM UU PPPP RRRR + VV PPPP MMMM + WW MMMM PP2