前提・実現したいこと
数値計算データを可視化するためにanacondaで描画プログラムを書いています。
以前は地球流体電脳ライブラリ(DCL)を用いて、fortranで計算したデータから以下のようなグラフを可視化できておりました。
今回はfortranで計算したデータをpythonを用いて読み込ませようとしているのですが、配列のデータの切り方が間違っているため、正しい描画ができません。
fortranで一定ステップ計算した後、下記のサブルーチンから(200回程度)出力させているのですが、20回分のデータをpythonで読み込み作図しようとしているがうまくいきません。
pythonのソースコードは以下のリンクを参照して作りました。
http://ig.hateblo.jp/entry/2014/05/30/225607
該当のソースコード
fortran
1 2 subroutine writefile(u,v,h) 3 implicit none 4 real(8),dimension(1:im ,1:jm ,1:3 ),intent(in)::u,v 5 real(8),dimension(1:im ,0:jm ,1:3 ),intent(in)::h 6 real(4),dimension(1:im ,1:jm ,1:3 ) ::uvh 7 integer::i,j,m 8 9 open(11,file='uvh.dat', status='unknown', form='unformatted') 10 11 do j=1,jm 12 do i=1,im 13 uvh(i,j,1)=real(u(i,j,2)) 14 uvh(i,j,2)=real(v(i,j,2)) 15 uvh(i,j,3)=real(h(i,j,2)) 16 enddo 17 enddo 18 write(11) (((uvh(i,j,m),i=1,im),j=1,jm),m=1,3) 19 return 20 end subroutine writefile 21 22 23*pythonのデータ読み取り箇所 24 25import numpy as np 26 27im = 202 28jm = 481 29nstep = 20 30 31# %% 0.fromfileを用いたファイル読み込み 32f90 = open('uvh.dat', 'rb') 33ary = np.fromfile(f90, np.float32,count=im*jm*3*20) 34 35# %% 1.読み込んだn番目の要素を取り出し、fortran形式の4次元配列に 36uvhpy = ary.reshape(jm,im,3,nstep, order='F') # 1要素あたり4byte×202*481*3=4×291486=1165944byte 37 38# %% 2.コンターを作図する 39import matplotlib.pyplot as plt 40 41x = np.linspace(0,50 , im) 42y = np.linspace(-60, 60, jm) 43X, Y = np.meshgrid(x, y) 44 45for i in range(nstep): 46 Z = uvhpy[:, :,2,i] 47 plt.contour(X,Y,Z) 48 plt.show() 49
試したこと
pythoでのforループをなしにして、ary内のcount=imjm3として、uvhpyを3次元配列とreshapeして描かせたら、グラフらしきものは出てきました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。