I/O の問題と、配列の変形の問題に切り分けよう。
csv は list-directed (* format のこと)で読み込めばいい。ただし、色々落とし穴があるので要注意だが。(ブービートラップだらけのべトコンの村を捜索するつもりで行けば問題ない。)
とりあえずワーク配列に一気にに読み込んで、その後で変形するのが楽。
Fortran は列優先なので、これは頭に叩き込んでおく必要がある。
wk に一気に読み込むと、入力ファイルの一列目は wk(1, :) に入り、二列目は wk(2,:) に入る。
次に、それぞれの一次元の列を二次元に直してやればいい。それには reshape 関数を使う。
Fortran は列優先なのを念頭に変形すると、今の場合は素直に配列サイズを与えればいい(はず)。
二次元配列が 0 始まりなので混乱するかもしれないが、単にサイズを与えればいい。
読み込み1行、変形2行で目的は達せられる。
プログラム
fortran
1 program Console23
2 implicit none
3 integer, parameter :: nc = 2, nd = 2
4 real(8) :: a(0:nc+1, 0:nd+1), b(0:nc+1, 0:nd+1)
5 real(8) :: wk(2, (nc+2)*(nd+2))
6 open(10, file = 'input.dat')
7 read(10, *) wk
8
9 a = reshape(wk(1, :), shape(a))
10 b = reshape(wk(2, :), shape(b))
11! サイズを手動で与えてもいい a = reshape(wk(1, :), [nc+2, nd+2])
12
13
14!check
15 block
16 integer :: i
17 do i = 0, nc+1
18 print '(4(g0, 1x))', a(i, :)
19 end do
20 end block
21 end program Console23
テスト入力ファイル
input.dat めんどいので 4*4 サイズで。
1,1
2,2
3,3
4,4
5,5
6,6
7,7
8,8
9,9
10,10
11,11
12,12
13,13
14,14
15,15
16,16
実行結果
1.000000000000000 5.000000000000000 9.000000000000000 13.00000000000000
2.000000000000000 6.000000000000000 10.00000000000000 14.00000000000000
3.000000000000000 7.000000000000000 11.00000000000000 15.00000000000000
4.000000000000000 8.000000000000000 12.00000000000000 16.00000000000000