fortran言語まとめ
私のFortranの基本的な使い方のまとめ
日曜日、10/14/2007-21:00-gator
日曜日、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。