クイズ①

ベクトルの内積計算
Program ab
real(8), allocatable :: a(:),b(:)
Real(8)
:: abinner, anorm, bnorm
integer
:: ni, i
ベクトルの配列を確保
a, b に値を代入
内積,ノルムの計算
ni=5
allocate( a(ni), b(ni) )
a(1:5) = 1.d0; b(1:5) = 2.d0
abinner=0.d0; anorm=0.d0; bnorm=0.d0
do i=1,ni
abinner = abinner + a(i)*b(i)
anorm = anorm + a(i)*a(i)
bnorm = bnorm + b(i)* b(i)
enddo
anorm = dsqrt(anorm); bnorm=dsqrt(bnorm)
write(*,’(3(1PE9.2))’) abinner,anorm,bnorm
stop
end program ab
ベクトルの内積計算(サブルーチン①)
Program ab
real(8), allocatable :: a(:),b(:)
Real(8)
:: abinner, anorm, bnorm
integer
:: ni, i
ベクトルの配列を確保
a, b に値を代入
計算自身を
副プログラムに任せる.
ni=5
allocate( a(ni), b(ni) )
a(1:5) = 1.d0; b(1:5) = 2.d0
call inner(a,b,ni,abinner)
call vnorm(a,ni,anorm)
call vnorm(b,ni,bnorm)
write(*,’(3(1PE9.2))’) abinner,anorm,bnorm
stop
end program ab
内積のサブルーチン
Program ab
real(8), allocatable :: a(:),b(:)
Real(8)
:: abinner, anorm, bnorm
integer
:: ni, i
ni=5
allocate( a(ni), b(ni) )
a(1:5) = 1.d0; b(1:5) = 2.d0
call inner(a,b,ni,abinner)
call vnorm(a,ni,anorm)
call vnorm(b,ni,bnorm)
subroutine inner(avec,bvec,ndim,res)
implicit none
real(8), dimension(ndim) :: avec,bvec
Integer
:: i,ndim
real(8)
:: res
res=0.d0
do i=1,ndim
write(*,’(3(1PE9.2))’) abinner,anorm,bnorm
res=res + avec(i) * bvec(i)
enddo
stop
end program ab
return
end subroutine
内積をユーザ定義関数でも書ける
Program ab
real(8), allocatable :: a(:),b(:)
real(8)
:: abinner, anorm, bnorm
integer
:: ni, i
real(8),external :: finner, fvnorm
ni=5
allocate( a(ni), b(ni) )
a(1:5) = 1.d0; b(1:5) = 2.d0
abinner=finner(a,b,ni)
anorm = fvnorm(a,ni)
bnorm = fvnorm(b,ni)
real(8) function finner(avec,bvec,ndim)
implicit none
real(8), dimension(ndim) :: avec,bvec
Integer
:: i,ndim
finner=0.d0
do i=1,ndim
write(*,’(3(1PE9.2))’) abinner,anorm,bnorm
finner=finner + avec(i) * bvec(i)
enddo
stop
end program ab
end function
内積・ノルムを同時に計算
Program ab
real(8), allocatable :: a(:),b(:)
Real(8)
:: abinner, anorm, bnorm
integer
:: ni, i
ni=5
allocate( a(ni), b(ni) )
a(1:5) = 1.d0; b(1:5) = 2.d0
call inner_vnorm(a,b,ni,abinner,anorm,bnorm)
write(*,’(3(1PE9.2))’) abinner,anorm,bnorm
stop
end program ab
サブルーチンのメリット
• 複雑な計算をパッケージ化してブラックボック
ス化できる.(必要ない人は見なくてもよい)
• 変数名を変えれば,何回も使いまわせる.
• 賢い人が書いたサブルーチンを利用できる.
(ルールさえ間違えなければ)