pythonでコードをつくったのですが回るのが非常に遅くてこまっています。
高速化したいコードは以下の通りです。稚拙なコードですがご教授おねがいします。
python
1import h5py 2import numpy as np 3import matplotlib.pyplot as plt 4kekka = [] 5 6#hdfファイルからデータを読み取る 7# %d:各時間のデータ 8for b in range (0,40000,100): 9 hdf5 = h5py.File("C:file_%d.hdf5"%(b), 'r') 10 list_x=(hdf5["particles/fluid/arrays/x"].value.tolist()) 11 list_y=(hdf5["particles/fluid/arrays/y"].value.tolist()) 12 list_z=(hdf5["particles/fluid/arrays/z"].value.tolist()) 13 list_p=(hdf5["particles/fluid/arrays/p"].value.tolist()) 14 #z座標(高さ)の条件をわける 15 Z=[] 16 zkiriwake = [0.001*x for x in range(1,2001,20)] 17 for u in zkiriwake: 18 zyouso = [j for j, takasa in enumerate(list_z) if (u+0.02)>=takasa>=(u)] 19 Z.append(zyouso) 20 21 #x,y座標の条件わけ 22 r = [i for i, (x, y) in enumerate(zip(list_x, list_y)) if 0.15*0.15>=((x-7.0)**2+y**2) and x>=7.0 ] 23 y1 = [i for i, y in enumerate(list_y) if -0.8>=y>=-0.10] 24 y2 = [i for i, y in enumerate(list_y) if -0.06>=y>=-0.08] 25 y3 = [i for i, y in enumerate(list_y) if -0.04>=y>=-0.06] 26 y4 = [i for i, y in enumerate(list_y) if -0.02>=y>=-0.04] 27 y5 = [i for i, y in enumerate(list_y) if 0>=y>=-0.02] 28 y6 = [i for i, y in enumerate(list_y) if 0.02>=y>=0] 29 y7 = [i for i, y in enumerate(list_y) if 0.04>=y>=0.02] 30 y8 = [i for i, y in enumerate(list_y) if 0.06>=y>=0.04] 31 y9 = [i for i, y in enumerate(list_y) if 0.08>=y>=0.06] 32 y10 = [i for i, y in enumerate(list_y) if 0.10>=y>=0.08] 33 34 #それぞれの高さについて、指定した位置の圧力平均をとりモーメント化 35 power1=[] 36 M = [0.01*x for x in range (1,201,2)]#モーメント計算に使用するうでの長さ 37 for h in Z: 38 hani1 = set (h) & set (r) & set (y1) 39 hani2 = set (h) & set (r) & set (y2) 40 hani3 = set (h) & set (r) & set (y3) 41 hani4 = set (h) & set (r) & set (y4) 42 hani5 = set (h) & set(r) & set (y5) 43 hani6 = set (h) & set (r) & set (y6) 44 hani7 = set (h) & set (r) & set (y7) 45 hani8 = set (h) & set (r) & set (y8) 46 hani9 = set (h) & set (r) & set (y9) 47 hani10 = set (h) & set (r) & set (y10) 48 p1 = [list_p[i] for i in hani1] 49 p2 = [list_p[i] for i in hani2] 50 p3 = [list_p[i] for i in hani3] 51 p4 = [list_p[i] for i in hani4] 52 p5 = [list_p[i] for i in hani5] 53 p6 = [list_p[i] for i in hani6] 54 p7 = [list_p[i] for i in hani7] 55 p8 = [list_p[i] for i in hani8] 56 p9 = [list_p[i] for i in hani9] 57 p10 = [list_p[i] for i in hani10] 58 goukei = np.array([sum(p1),sum(p2),sum(p3),sum(p4),sum(p5),sum(p6),sum(p7),sum(p8),sum(p9),sum(p10)]) 59 kazu = np.array([len(p1),len(p2),len(p3),len(p4),len(p5),len(p6),len(p7),len(p8),len(p9),len(p10)]) 60 pp=np.zeros_like(kazu) 61 pp[kazu!=0]=goukei[kazu!=0]/kazu[kazu!=0] 62 ppp=sum(pp) 63 power1.append(ppp) 64 65 moment1 = [x * y for (x, y) in zip(power1, M)] 66 #圧力について面積を考慮せず計算していたため最後に面積をかける 67 mo = sum(moment1)*0.02*0.02*3.14 68 kekka.append(mo) 69#グラフ制作 70plt.plot(kekka) 71plt.title("moment and time") 72plt.xlabel("time[1e-5]") 73plt.ylabel("moment[Nm]") 74plt.show()
これは粒子がある円柱にぶつかるシミュレーションの、円柱周辺のモーメントを計算するというコードで、高さごとにそれぞれの平面的範囲の圧力平均をモーメント計算するというものです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/06 05:08