計算物理屋の研究備忘録

Linux, Cygwin, Mac, zsh, emacs等の使い方、設定などのメモ

fortranで行列の出力

fortranで行列を出力する方法のまとめ

3行3列の行列 a(3, 3)

a11 a12 a13
a21 a22 a23
a31 a32 a33

これをこの並びで出力する

悪い例

write(*, *)  a(1:3, 1:3)

こう書くと以下のように出力される

a11 a21 a31 a12 a22 a32 a13 a23 a33

a11, a12 ・・・という順番ではなく a11, a21 ・・・
1行目ではなく1列目から順に出力される。これはfortranの仕様

write(*, *)  (a(i, 1:3), i = 1, 3)

じゃあこうしてやると、出力は

a11 a12 a13 a21 a22 a23 a31 a32 a33

順番は良いがwrite文一つで書くから1行で出力されてしまう

良い例

do文を使う

do i = 1, 3
  write(*, '(100e12.4)')  a(i, 1:3)
enddo

望み通り出力される

a11 a12 a13
a21 a22 a23
a31 a32 a33

write文の括弧の中の100e12.4の100というのは実はこの場合は3以上の数ならなんでもよい

1行で書く

write(*, '(3e12.4)') (a(i, 1:3), i = 1, 3)

ただし今回のwrite文の括弧の中の3e12.4は3じゃないとだめ
ここが3だから3つ出力されるごとに改行されて望み通りになる