宇宙論的シミュレーションから特定の量を計算するための Python コードをいくつか書きました。これは、粒子がサイズ 8,000^3 のボックス内に含まれているかどうかを確認することによって行われます。原点から開始し、ボックス内に含まれるすべての粒子が見つかったときにボックスを進めます。全体で約 200 万個のパーティクルを数えており、シミュレーション ボリュームの合計サイズは 150,000^3 であるため、これには長い時間がかかります。
以下にコードを投稿します。改善方法について何か提案はありますか?
前もって感謝します。
from __future__ import division
import numpy as np
def check_range(pos, i, j, k):
a = 0
if i <= pos[2] < i+8000:
if j <= pos[3] < j+8000:
if k <= pos[4] < k+8000:
a = 1
return a
def sigma8(data):
N = []
to_do = data
print 'Counting number of particles per cell...'
for k in range(0,150001,8000):
for j in range(0,150001,8000):
for i in range(0,150001,8000):
temp = []
n = []
for count in range(len(to_do)):
n.append(check_range(to_do[count],i,j,k))
to_do[count][1] = n[count]
if to_do[count][1] == 0:
temp.append(to_do[count])
#Only particles that have not been found are
# searched for again
to_do = temp
N.append(sum(n))
print 'Next row'
print 'Next slice, %i still to find' % len(to_do)
print 'Calculating sigma8...'
if not sum(N) == len(data):
return 'Error!\nN measured = {0}, total N = {1}'.format(sum(N), len(data))
else:
return 'sigma8 = %.4f, variance = %.4f, mean = %.4f' % (np.sqrt(sum((N-np.mean(N))**2)/len(N))/np.mean(N), np.var(N),np.mean(N))