fortran言語まとめ

22151 ワード

私のFortranの基本的な使い方のまとめ
日曜日、10/14/2007-21:00-gator
  :gator










《Fortran 95 》 。 , 3~9
, ( 16 )。 Fortran C
, 。 C Fortran
。 , , , ; C ,
, 。 ,
。 , Fortran, ,
, 。 。
, 。 !
!
 

1、
Fortran=For mula Tran slator/Translation
: 。 ,
,IBM 。
。ortran 。 Fortran 。
2、Fortran        
,Fortran 。 Fortran 77 Fortr
an90。ortran 90 Fortran 77 , 77 ,
90。 77 , 77 ,
77 。 77 90 。
Fortran 77: (fixed format), :.f .for
(1) C,c * , ;
(2) , , 1~5 (
);7~72 ;73 ;
(3) , "0" 。
Fortran 90: (free format), :.f90
(1) "!" ;
(2) 132 , ;
(3) & , 。
Fortran 90。
3、Fortran     , C     
, 。 。
(1)
(2)
(3)
(4) C,Fortran { }
(5) 。
complex :: a ! 。 ,
a=(1.0,2.0) ! a=1+i
(6) (**)。 。 ,
a=4.0**0.5,a=8.0**(1.0/3.0)
(7) ;
(8) ,
4、Fortran       
"Hello Fortran" 。
program main ! ,main program ,
write(*,*) "Hello" !
stop !
end [program[main]] !end , 。[ ] , 。
, 。 ,
。 Fortran 。 。 www.answers.com
。 ! 。
program cylinder !
! Calculate the area of a cylinder.
! Declare variables and constants.
! constants=pi
! variables=radius squared and height
implicit none ! Require all variables to be explicitly declared
! 。 。
integer :: ierr
character :: yn
real :: radius, height, area
real, parameter :: pi = 3.1415926536
!
interactive_loop: do !do ,Fortran , d
!interactive_loop
!    Prompt the user for radius and height

! and read them.

write (*,*) 'Enter radius and height.' !

read (*,*,iostat=ierr) radius,height ! 。isotat 。

! If radius and height could not be read from input,

! then cycle through the loop.

if (ierr /= 0) then

write(*,*) 'Error, invalid input.'

cycle interactive_loop
!cycle C continue

end if

! Compute area. The ** means "raise to a power."

area = 2 * pi * (radius**2 + radius*height) ! C

! Write the input variables (radius, height)

! and output (area) to the screen.

write (*,'(1x,a7,f6.2,5x,a7,f6.2,5x,a5,f6.2)') &
 !"&"    。           
'radius=',radius,'height=',height,'area=',area
yn = ' '
yn_loop: do
! do
write(*,*) 'Perform another calculation? y[n]'
read(*,'(a1)') yn
if (yn=='y' .or. yn=='Y') exit yn_loop
if (yn=='n' .or. yn=='N' .or. yn==' ') exit interactive_loop
end do yn_loop
! do
end do interactive_loop
end program cylinder

Fortran 。 module ,

 

1、 ,
(1)integer: kind=2, kind=4
integer([kind=]2) :: a=3
integer:: a, 。
!"::" ; ::;
! , 。
real,parameter :: pi=3.1415926 。parameter 。
(2)real: kind=4( ), kind=8
real([kind=]8) :: a=3.0
, 1E10 ,1D10
(3)complex
complex([kind=]4) b
(4)character
character([len=]10) c !len
(5)logical
logical*2 :: d=.ture. ( logical(2)::d=.ture. )
(6) type: C struct
Fortran 77 DATA ,
data a,b,string /1, 2.0, 'fortran'/
C ,Fortran , ( implicit )。
, i,j,k,l,m,n integer, real。
implicit none。 。
Fortran " ":
integer a,b
equivalence(a,b)

a,b 。 ; 。 :equivalence(
,a), a 。
2、      
read(*,*) a !
write(*,*) "text" ! 。Fortran 77 ' text'。Fortan 90 " " ' '
print *,"text" !
(*,*) (unit=*,fmt=*)。 unit / , , ;fmt
。 *, , 。print *

 

1、
(1)
== /= > >= < <= !Fortran 90
.EQ. .NE. .GT. .GE. .LT. .LE. !Fortran 77
(2)
.AND. .OR. .NOT. .EQV. .NEQV.
! .NOT. , ( logical )
!.EQV.: , .NEQV.:
2、IF

(1) :

if( ) then

……

end if


then ,

if( ) …… !then end if

(2) :

if( 1) then

……

else if( 2)then

……

else if ( 3)then

……

else

……

end if


(3) :

if( ) then

if( ) then

if( ) then

else if( ) then

……

else


……

end if

end if

end if


(4) :

program example

implicit none

real c

write (*,*) "input a number"

read (*,*) c

if(c) 10,20,30
!10,20 30 , c / / 0, 10/20/30

10 write (*,*) "A"

goto 40
!goto ,

20 write (*,*) "B"

goto 40

30 write (*,*) "C"

goto 40

40 stop

end

3、SELECT CASE

C switch

select case( )

case( 1)
! case(1:5) 1<= <=5

…… !case(1,3,5) 1 3 5

case( 2) ! integer,character logical , real



case default

……

end case


4、PAUSE, CONTINUE
pause , enter
continue ,
 

1、DO
do counter= , , / !counter / ,
…… !counter 。 / 1
……
…… ! {}
……
end do
Fortran 77 end do , :
do counter= , , /
……
……
! do
2、DO WHILE
do while( )
……
……
end do

C while( ) {……}。
, 。 if
。 , 。 。
3、    C   do{……}while(    );         ,      ,  



do while(.ture.)

……

……

if( ) exit !exit C break。C continue Fortran cycle

end do


4、Fortran :
, :
outer: do i=1,3
inner: do j=1,3
……
end do inner
end do outer

, :
loop 1: do i=1,3
loop2: do j=1,3
if(i==3) exit loop1
!exit loop1
if(j==2) cycle loop2 !cycle loop2 , loop2
write(*,*) i,j
end do loop2
end do loop1

Fortran , Fortran , 。
 

1、
C ,Fortran () , (),
integer a(5) !
real :: b(3,6) !
integer, real, character, logical type。 7 。
。 C ,Fortran , :
integer, allocatable :: a(:)
!                   size  ,      :
allocate(a(size)) !

C ,Fortran 1 , :
integer a(-3:1) ! -3,-2,-1,0,1
integer b(2:3,-1:3) !b(2~3,-1~3)
2、         
C ,Fortran a(2,2) a(1,1),a(2,1),a(1,2),a(2,2
)。 , 。 column major。
3、   
(1) :
integer a(5)
data a /1,2,3,4,5/

integer :: a(5)=(/1,2,3,4,5/)
integer :: a(5)=5 , 5 5
integer :: a(2,2)=(/1,2,3,4/)
a(1,1)=1,a(2,1)=2,a(1,2)=3,a(2,2)=4
(2) Fortran : 。 。
integer a(5)
integer i
data (a(i),i=2,4)/2,3,4/
!(a(i),i=2,4) i 2 4 , 1

integer i
integer :: a(5)=(/1,(2,i=2,4),5/)
! 1,2,2,2,5
integer :: b(5)=(/i, i=1,5/) ! 1,2,3,4,

data ((a(i,j),i=1,2),j=1,2)=/1,2,3,4/ !a(1,1)=1,1(2,1)=2,a(1,2)=3,a(2,2)=4
4、      
a,b 、
a=5 ! 5
a=(/1,2,3/) ! a ,a(1)=1,a(2)=2,a(3)=3
a=b ! , a,b,c ,
a=b+c
a=b-c
a=b*c
a=b/c
a=sin(b)
!
5、        
a
a(3:5)=(/3,4,5/) !a(3)=3,a(4)=4,a(5)=5
a(1:5:2)=3 !a(1)=3,a(3)=3,a(5)=3
a(3:)=5 !a(3) 5
a(1:3)=b(4:6) !
a(:)=b(:,2) !a(1)=b(1,2),a(2)=b(2,2),
6、WHERE
where if, 。 、 a,b
where(a<3)
b=a
!a 3 b
end where
where(a(1:3)/=0) c=a ! end where, where ,
! do 。
7、FORALL
C for :
forall(triplet1[,triplet2 [,triplet3…]],mask)
triplet i=2:6:2, , 1

forall(i=1:5,j=1:5,a(i,j)<10)
a(i,j)=1
end forall

forall(i=1:5,j=1:5,a(i,j)/=0) a(i,j)=1/a(i,j)
forall , C for 。
 

Fortran : (subroutine) (function)。
, , 。 ,
。 , C 。
1、
: , 。


subroutine name (parameter1, parameter2)
! 。 , 。
, 。
implicit none
integer:: parameter1, parameter2
! 。
…… ! 。
……
mreturn ! C , 。
            !   。            ,    ;    return        。
end [subroutine name]
: call , 。 :
call subroutine name(parameter1,parameter2)

a. 。 , 。
b. C 。Fortran (call by address/reference),
, 。
, 。
c. , C。 。
、 , 。
2、     
: 。 。
。 , 。
real, external :: function_name


function function_name(parameter1, parameter2)
implicit none
real:: parameter1, parameter2
! ,
real::function_name ! ,
……
……
function_name=….
!
return
end

, :
real function function_name(parameter1, parameter2)
implicit none
real:: parameter1, parameter2
!
……
……
function_name=….
!
return
end

function_name(parameter1,parameter2)
call 。
。 。
, , 。
3、        
(1) 。Fortran ,
。 call ShowReal(1.0) 1.0 1。
(2) , C , ,
。 a(5), call function(a) a(1) , call functio
n(a(3)) a(3) 。
(3) , C , ,
。 Fortran column major 。
(4) , , ,
。 :
subroutine Array(num,size)
implicit none
integer:: size
integer num(size)
! , 。
……
……
return
end

(5)save : ,
。 save :
integer, save :: a=1
(6) ( 、 、 )。 C

real, external :: function !
real, intrinsic :: sin !
external sub !
(7) (interface): 。 :
a.
b.
c.
d.
e. 。
。 。 。
4、    

。 : , C 。



integer :: a,b

common a,b
!



integer :: c,d

common c,d


a c ,b d 。

。 , common



common /groupe1/ a, common /group2/ b

common /groupe1/ c a、c 。

block data 。 data

。 ; data :

block data [name]

implicit none

integer a,b,c

real d,e

common a b c

common /group1/ d,e

data a,b,c,d,e /1,2,3,4.0,5.0/

end [block data [name]]


5、Module
Module 。 ,
。 , , , ,
odule 。Module 。

module module_name
……
……
end [module [module_name]]

: , :use module_name.
Module contains ( contains
, contains )。 module module
, , module

 6、include         ,       (        )。 :

include 'funcion.f90'
 


1、
Fortran ,


。 。
character(len=20)::filenamein="in.txt", filenameout="out.txt" !
logical alive
integer::fileidin=10,fileidout=20

!10,20 , 1,2,5,6 , 2、6 (
),1、5 ( )
integer::error
real::in,out

!
inquire(file=filenamein, exist=alive) ! ,alive 0
if(.NOT. alive) then
write(*,*) trim(filenamein), " doesn't exist."
!trim filenamein
! stop ,
end if
open([unit=]fileidin, file=filenamein, status="old")
open([unit=]fileidout,file=filenameout[,status="new"])

!unit / 。 status="old"; status="new";
! status, status="unknown", ……
read([unit=]fileidin, [fmt=]100,iostat=error )in !error=0 。
100 format(1X,F6.3)
! , , read/write
write(([unit=]fileidout, "(1X,F6.3)")out
close(fileidin)
close(fileidout)

!1X 。F6.3 real 6 ( ), 。
! I3, , ;A8, , 8 。 /
。 。
2、    
(internal file)。 。
integer::a=1,b=2
character(len=20)::string
write(unit=string,fmt="(I2,'+',I2,'=',I2)")a,b,a+b
write(*,*)string

1+2=3。 :
integer a
character(len=20)::string="123"
read(string,*)a
write(*,*)a

123。