fortran90でファイルの入出力に関する設定です。
fortranでデータの書き出しには、
書式付きと書式なしがあります。
書式付きはそこでプログラムがすべて終わる時
書式なしはそのデータを使って別のプログラムを動かす時
と使い分けられると思います。
[adsense1]
書式付き
利点
・テキストデータなので、結果を人間がわかりやすい形で出力出来る。
・ミスを発見しやすい
欠点
・データの書き出しに時間がかかる
・データ量が多くなる(書式なしの約3倍)
書式付きは、例えば
open(10,file="test.d")
write(10,'(A,i5,e15.5e2)')"aaa",j,alpha
write(10,'(A,i5,e15.5e2)')"aaa",j,alpha
見たいに書式を指定して書ださせることです。
書式なし
利点
・書き出し時間を短くできる
・データ量が少なくなる(書式付の約1/3倍)
・簡潔にコードが書ける
欠点
・バイナリファイルなので出力結果を直接見ることが出来ない。
書式なしのプログラムでは、
open(10,file="test.bin",form="unformatted")
write(10)"aaa",j,alpha
write(10)"aaa",j,alpha
の様に書きます。
実際のプログラムでは、
program main
implicit none
integer,parameter::N1=4
integer,parameter::N2=7
integer::i,j
double precision::A(1:N1),B(1:N2)
complex(kind(0d0))::CC(1:N1,1:N2)
do i=1,N1
A(i)=100d0+dble(i)
enddo
do j=1,N2
B(j)=dble(j)
enddo
do i=1,N1
do j=1,N2
CC(i,j)=A(i)+B(j)
enddo
enddo
!q open(21,file="unformatted.bin",form="unformatted")
!q write(21)N1,N2
!q do i=1,N1
!q do j=1,N2
!q write(21)A(i),B(j),CC(i,j)
!q enddo
!q enddo
!q close(21)
open(21,file="unformatted.bin",form="unformatted")
write(21)N1,N2
write(21)A,B,CC
close(21)
stop
end program main
implicit none
integer,parameter::N1=4
integer,parameter::N2=7
integer::i,j
double precision::A(1:N1),B(1:N2)
complex(kind(0d0))::CC(1:N1,1:N2)
do i=1,N1
A(i)=100d0+dble(i)
enddo
do j=1,N2
B(j)=dble(j)
enddo
do i=1,N1
do j=1,N2
CC(i,j)=A(i)+B(j)
enddo
enddo
!q open(21,file="unformatted.bin",form="unformatted")
!q write(21)N1,N2
!q do i=1,N1
!q do j=1,N2
!q write(21)A(i),B(j),CC(i,j)
!q enddo
!q enddo
!q close(21)
open(21,file="unformatted.bin",form="unformatted")
write(21)N1,N2
write(21)A,B,CC
close(21)
stop
end program main
といった感じです。
書式なしの読み込み
書式なしのファイルを読み込むためにはまったく同じ形で読み込ませればいいです。
例えば、上の形で書いた場合、読み込みは
program main
implicit none
integer::i,j,N1,N2
double precision,allocatable::A(:),B(:)
complex(kind(0d0)),allocatable::CC(:,:)
open(21,file="unformatted.bin",form="unformatted")
read(21)N1,N2
allocate(A(1:N1),B(1:N2),CC(1:N1,1:N2))
!q do i=1,N1
!q do j=1,N2
!q read(21) A(i),B(j),CC(i,j)
!q enddo
!q enddo
read(21) A,B,CC
close(21)
do i=1,N1
do j=1,N2
write(6,'(4f10.5)')A(i),B(j),CC(i,j)
enddo
enddo
stop
end program main
implicit none
integer::i,j,N1,N2
double precision,allocatable::A(:),B(:)
complex(kind(0d0)),allocatable::CC(:,:)
open(21,file="unformatted.bin",form="unformatted")
read(21)N1,N2
allocate(A(1:N1),B(1:N2),CC(1:N1,1:N2))
!q do i=1,N1
!q do j=1,N2
!q read(21) A(i),B(j),CC(i,j)
!q enddo
!q enddo
read(21) A,B,CC
close(21)
do i=1,N1
do j=1,N2
write(6,'(4f10.5)')A(i),B(j),CC(i,j)
enddo
enddo
stop
end program main
とすればいいです。
”!q”のコメントアウトは2つのプログラムに共通しています。
なのでどういう書き方でも、同じ入出力の形を指定してあげれば良いです。
[adsense2]