Fortran90 3 33 1 2 Fortran90 FORTRAN 1956 IBM IBM704 FORTRAN(FORmula TRANslation ) 1965 FORTRAN66 1978 FORTRAN77 1991 Fortran90 Fortran90 Fortran Fortran90 6 Fortran90 77 90 90 Fortran90 [ ] Fortran90 Fortran90 DO Fortran90 1) 2) 3) 4) DO 5) 6) 7) 3, 33 ()
3 Fortran90 IF IF END IF, DO DO DO CONTINUE DO ASSIGN GO TO RETURN PAUSE FORMAT H PROGRAM free_source_form! INTEGER & long_name_max31_with_underscore REAL ra,rb,rc! ra=1.0; rb=2.0; rc=ra * rb!! & WRITE(*,*) & ra,rb,rc END PROGRAM free_source_form 4 132 _( ) 31 ;( )!( ) &() 1 1. a.lt.b a<b a b a.gt.b a>b a b a.le.b a>=b a b a.ge.b a<=b a b a.eq.b a==b a b a.ne.b a/=b a b 5 Fortran 5.1 Fortran Fortran90 2 2. INTEGER REAL COMPLEX LOGICAL CHARACTER 5.2
KIND ( ) 3 type [, attribute,...] name[,...] type attribute PARAMETER DIMENSION ALLOCATABLE 3. (1 ) 1 (2 ) 2 (4 ) 4 (8 ) 8 SAVE INTENT OPTIONAL POINTER TARGET INTRISTIC EXTERNAL ( ) 4 ( ) 8 ( ) 4 ( ) 8 (1 ) 1 (4 ) 4 (1 ) 1 name,( ) integer_var INTEGER(KIND=4) integer_var! (1) INTEGER(4) integer_var! (2) INTEGER integer_var! (3) 4 4. (1) (2) KIND= (3) double_a,double_b,( ) INTEGER 4 REAL 4 COMPLEX 4 LOGICAL 4 CHARACTER 1 REAL(KIND=8) double_a,double_b!(1) REAL(8) double_a,double_b!(2) 5.3 5.4
_( ) 1000! (1) 12345_4! (2) 5000000000_8! (3) (1),(2) 4 (3) 8 5000000000 5000000000 _8 8 1.0! (1) 1.0_4! (2) 1.0e0! (3) 1.0_8! (4) 1.0d0! (5) (1) (2) (3) (4) (5) (3) (5) 5.5 =() =() INTEGER(KIND=4) integer_var=12345_4 INTEGER(8) double_int=5000000000_8 REAL(8) double_a=2.0_8*3.141592654_8 PARAMETER REAL,PARAMETER pi=3.14 INTEGER,PARAMETER cols=100,row=cols+1 5.6 Fortran90 10 SELECTED INT KIND(p) 10 p 10 0p 10 p p -1 SELECTED REAL KIND(r,e) 10 r 10 e r e 10 r -1 e -2-3 INTEGER,PARAMETER & ip2=selected_int_kind(2)! (1) INTEGER,PARAMETER & rp10=selected_real_kind(10,70)! (2) INTEGER(KIND=ip2) n! (3) REAL(KIND=rp10) a,b! (4) COMPLEX(KIND=rp10) c! (5) n=10_ip2! (6) a=100.0_rp10; b=33.33_rp10! (7) c=cmplx(a,b,kind=rp10)! (8) (8) CMPLX (KIND=)
5. KIND(x) HUGE(x) TINY(x) RANGE(x) EPSILON(x) PRICISION(x) BIT_SIZE(x) 10 1 10 5.7 Fortran90 5 1 PROGRAM ex_inq_num INTEGER,PARAMETER & ip=selected_int_kind(9), & rp=selected_real_kind(10,10) INTEGER(KIND=ip) ivar REAL(KIND=rp) rvar WRITE(*,*) '<< INTEGER >>' WRITE(*,*) 'KIND ',KIND(ivar) WRITE(*,*) 'HUGE ',HUGE(ivar) WRITE(*,*) 'RANGE ',RANGE(ivar) WRITE(*,*) 'BIT_SIZE ',BIT_SIZE(ivar) WRITE(*,*) '<< REAL >>' WRITE(*,*) 'KIND ',KIND(rvar) WRITE(*,*) 'HUGE ',HUGE(rvar) WRITE(*,*) 'TINY ',TINY(rvar) WRITE(*,*) 'RANGE ',RANGE(rvar) WRITE(*,*) 'PRICISION ',PRICISION(rvar) WRITE(*,*) 'EPSILON ',EPSILON(rvar) END PROGRAM ex_inq_num << INTEGER >> KIND 4 HUGE 2147483647 RANGE 9 BIT_SIZE 32 << REAL >> KIND 8 HUGE 1.797693134862316+308 TINY 2.225073858507201-308 RANGE 307 PRICISION 15 EPSILON 2.220446049250313E-16 1. 5.8 I,J,K,L,M,N FRTRAN77 DO,( ).( ) DO 10 I=1.5 DO10I 1.5 DO DO10I Fortran90 6 Fortran () For-
tran90 1) END (PROGRAM SUBROUTINE FUNCTION) 2) 3) ( ) 4) 6.1 CONTAINS 2sub_init func_add main_program_name a,b,c c 100.0 sub_init b=b*c (b) (c) (c) () c 100.0 PROGRAM main_prog_name REAL a,b,c=100.0 b=1.0 CALL sub_init(b) a=func_add(b,c) CONTAINS SUBROUTINE sub_init(b) REAL,INTENT(INOUT) b b=b*c END SUBROUTINE sub_init REAL FUNCTION func_add(x,y) REAL,INTENT(IN) x,y func_add=x+y END FUNCTION func_add END PROGRAM main_prog_name 2. 6.2 6.2.1 (INTENT) INTENT ( 2) () () ( ) 6 6. INTENT INTENT INTENT(IN) INTENT(OUT) INTENT(INOUT) 2 INTENT CALL sub_init(1.0) Fortran 1.0 c (100.0) 1.0
INTENT INTENT 6.2.2 =,( ) INTEGER FUNCTION scale(start,finish,point) inc=scale(1,20,10)!(1) inc=scale(point=2,start=1,finish=20)!(2) inc=scale(1,finish=20,point=2)!(3) (1) 6.2.3 OP- TIONAL PRESENT PRESENT.TRUE..FALSE. 3 PROGRAM ex_key_optional INTEGER inc inc=scale(start=1,finish=20) CONTAINS INTEGER FUNCTION & scale(start,finish,point) INTEGER,INTENT(IN) start,finish INTEGER,INTENT(IN),OPTIONAL & point INTEGER lpoint=10! Check optional argment IF (PRESENT(point)) THEN lpoint=point ENDIF scale=(finish-start)/lpoint END FUNCTION scale END PROGRAM ex_key_optional 3. 6.3 IN- TENT INTERFACE INTERFACE END INTERFACE 3 scale INTERFACE
INTERFACE INTEGER FUNCTION & scale(start,finish,point) INTEGER,INTENT(IN) start,finish INTEGER,INTENT(IN),OPTIONAL & point END FUNCTION scale END INTERFACE 7 DO FORTRAN77 Fortran90 DO Fortran90 DO DO DO 7.1 DO FORTRAN77 DO (5 ) CONTINUE DO 100 i=1,100,5 100 CONTINUE Fortran90 loop DO i=1,100,5 loop 1) CONTINUE 2) DO 3) (loop) DO FORTRAN77 GOTO IF Fortran90 DO (i=1,100,5) CYCLIC( ) EXIT( ) 5 Fortran Fortran90 31 Fortran90 GOTO 4 (total) DO CYCLE EXIT PROGRAM ex_do INTEGER num,total,count total=0; count=0 data_input DO WRITE(*,*) 'Input number ' READ(*,*) num IF ( num == 0 ) EXIT data_input total = total + 1 IF ( num < 0 ) CYCLE data_input count=count+1 input_data WRITE(*,*) total,count END PROGRAM ex_do 4. 7.2 type,dimension(extent,...) name,... DIMENSION DIMENSION (extent),( ) ( ) [] 1 INTEGER,DIMENSION(100) array100 INTEGER,DIMENSION(09) array10 REAL,DIMENSION(10,5) array50 REAL,DIMENSION(-31,8) array32
7.2.1 (shape) (conformable) (shape) (rank) (extent) (conformable) INTEGER,DIMENSION(24,310) a INTEGER,DIMENSION(3,8) b INTEGER c INTEGER,DIMENSION(2,5) d a (rank) 2 (extent) 3 8 (size) 24(328) (shape) (/3,8/) a b c 7.2.2 (/ /), ( ) (/ 1,2,3,4,5,6 /) 1,2,...,6 DO (/ (i,i=1,6) /)!(1) (/ ((i/10),i=2,10,2) /)!(2) (/ 10,20,(i,i=2,10,2) /)!(2) (1) (/ 1,2,3,4,5,6 /) (2) (/ 2.0,4.0,6.0,8.0,10.0 /) (3) (/ 10,20,2,4,6,8,10 /) INTEGER,DIMENSION(6) & line=(/ (i,i=1,6) /) RESHAPE INTEGER,DIMENSION(2,4) box = & RESHAPE( (/ (i,i=1,8) /), (/ 2, 4 /) ) box 1 3 5 7 2 4 6 8 7.3 7.3.1 DO [ ][ ][ ] DO ( ) 1 ( )
1) a(10,10) 0.0 DO (1) (2) (3) a (2) DO i=1,10 DO j=1,10 a(j,i)=0.0!(1) a(,)=0.0!(2) a=0.0!(3) 3 a mean=sum(a(,))/size(a(,)) SUM a 7.3.3 DO i=2,n a(i)=a(i-1)+a(i)!(1) DO a(2n)=a(2n)+a(1n-1)!(2) 2) a DO 1.0 DO i=2,10,2 DO j=1,10 a(j,i)=1.0!(1) a(,2102)=1.0!(2) 7.3.2 1 a b c 2 c(,)=a(,)+b(,) a 1000 a(,)=sqrt(a(,))*1000.0 SQRT (1) a(i)=a(i)+a(i-1)+a(i-2)+...+a(1) (2) a(i)=a(i-1)+a(i) (1) SUM a(2n)=(/ (SUM(a(1i)),i=2,n) /) 7.3.4 a(43) DO i=1,n x(i)=b(i)/a(i,i)!(1) b(i+1n)=b(i+1n)-a(i+1n,i)*x(i)!(2) (2) i=n a,b n+1n (2)
7.3.5 WHERE WHERE WHERE WHERE( MOD(odd(),2) /= 0) & odd()=odd()*2 7.3.7 1) DIMENSION ( ),( ) odd MOD 2 WHERE WHERE( a() > 0.0 ) a() = SQRT(a()) ELSEWHERE a() = 0.0 END WHERE 0.0 7.3.6 Fortran90 ALLOCAT- ABLE DIMENSION ( ) ALLOCATE DEALLOCATE READ n a PROGRAM allocatable_array REAL,DIMENSION(,),ALLOCATABLE a INTEGER n READ(*,*) n ALLOCATE(a(n,n+1))) DEALLOCATE(a) END PROGRAM allocatable_array 2) 5 swap a,b work SIZE SUBROUTINE swap(a,b) REAL,DIMENSION() a,b REAL,DIMENSION(SIZE(a)) work work=a; a=b; b=work; END SUBROUTINE swap 5. 8 Fortra90 1) 5 MAXVAL,MINVAL PROGRAM ex_mean REAL,DIMENSION(5) vec REAL mean READ(*,*) vec mean = (SUM(vec)-MAXVAL(vec)- & MINVAL(vec))/REAL(SIZE(vec)-2) WRITE(*,*) " = ", mean END PROGRAM ex_mean
2) PROGRAM ex_std INTEGER n REAL,DIMENSION(),ALLOCATABLE vec READ(*,*) n ALLOCATE(vec(n)) READ(*,*) vec WRITE(*,*) " = ", mean(vec) WRITE(*,*) " = ", disp(vec) WRITE(*,*) " = ", std_vec(vec) DEALLOCATE(VEC) CONTAINS REAL FUNCTION mean(vec) REAL,DIMENSION() vec mean = SUM(vec)/REAL(SIZE(vec)) END FUNCTION mean REAL FUNCTION disp(vec) REAL,DIMENSION() vec disp = & SUM((vec-mean(vec))**2) & /REAL(SIZE(vec)) END FUNCTION disp REAL FUNCTION std_vec(vec) REAL,DIMENSION() vec std_vec = SQRT(disp(vec)) END FUNCTION std_vec END PROGRAM ex_std 3) Fortran90 MAXLOC DOT_PRODUCT 9 Fortran90 90 PROGRAM ex_gauss INTERFACE SUBROUTINE gauss(a,order) REAL,DIMENSION(,), & INTENT(inout) a INTEGER,DIMENSION(),& INTENT(inout) order END SUBROUTINE gauss END INTERFACE INTEGER n,i REAL,DIMENSION(,), & ALLOCATABLE a INTEGER,DIMENSION(),& ALLOCATABLE order READ(*,*) n ALLOCATE(a(n+1,n),order(n)) DO i=1,n READ(*,*) a(,i) order=(/(i,i=1,n)/) CALL gauss(a,order) WRITE(*,*) a(n+1,) DEALLOCATE(a) END PROGRAM ex_gauss SUBROUTINE gauss(a,order) INTEGER i,j,n REAL,DIMENSION(,) a INTEGER,DIMENSION() order INTEGER,DIMENSION(1) line! n=size(a,2) DO j=1,n line=maxloc(abs(a(j,jn)))+j-1 IF (line(1) /= j) & CALL swap(a(,line(1)),a(,j), & order(line(1)),order(j)) DO i=j+1,n a(j,i)=a(j,i)/a(j,j) a(j+1n+1,i)=a(j+1n+1,i)- & a(j,i)*a(j+1n+1,j)! DO i=n,1,-1 a(n+1,i)=a(n+1,i)- & DOT_PRODUCT(a(n+1,i+1n),a(i+1n,i)) a(n+1,i)=a(n+1,i)/a(i,i) a(n+1,order())=a(n+1,) CONTAINS SUBROUTINE swap(a_i,a_j,o_i,o_j) REAL,DIMENSION() & a_i,a_j INTEGER o_i,o_j REAL,DIMENSION(SIZE(a_i)) work INTEGER tmp work=a_i a_i=a_j a_j=work tmp=o_i o_i=o_j o_j=tmp END SUBROUTINE swap END SUBROUTINE gauss