Я должен оценить влияние полей B на отклонение частиц, используя силу F = V.B.
У меня есть двумерная сетка с nx и ny, которая показывает количество точек в каждом направлении. B - это магнитное поле, которое представляет собой двумерные сетки (с размером nx.ny = 1600.900 = 1440000), а V - скорость частицы и представляет собой одномерный массив (с размером 431605462). У меня также есть два одномерных массива (с тем же размером, что и массив V), которые показывают координаты X и Y каждой частицы. Я назвал их 'grid_pro_x' и 'grid_pro_y'.
Поскольку V - это одномерный массив, а B - это двумерный массив, я не могу напрямую умножить V на B. Для решения этой проблемы я создал двумерный нулевой массив для V и, используя 2 для циклов, нахожу частицы, которые находятся в каждой ячейке. сетки. Я рассматриваю среднюю скорость всех частиц как компонент скорости каждой ячейки. из-за большой размерности сетки, если я сохраню исходное измерение, коду потребуется несколько дней для завершения массива V, поскольку его необходимо повторить 1440000 раз.
В качестве решения я сжал V необязательной переменной, называемой divider. Если я использую divider = 10, я думаю, что для завершения кода потребуется 2 дня, а если я использую divider = 100, код будет завершен через полчаса, но теперь точность результатов значительно снижается. Вы можете увидеть код в следующем.
nx,ny= 1600, 900
xmin = -30.0e-6
xmax = 50.0e-6
ymin = -45.0e-6
ymax = 45.0e-6
#### create a 2D velocity array
divider = 100
m_p= 1.6726219e-27 # (kg unit) proton mass
nx_new = nx/divider
ny_new = ny/divider
Vx = np.zeros((ny_new, nx_new))
Vy = np.zeros((ny_new, nx_new))
res_x = (xmax - xmin)/nx_new # resolution in x direction
res_y = (ymax - ymin)/ny_new # resolution in y direction
# Find corresponding indices
for i in range( 0,ny_new ):
for j in range( 0,nx_new):
xx = i*res_x
yy = j*res_y
##### all particles with different Px confined in a specific cell
Px_pro_lim = Px_pro[(grid_pro_x >= xx ) & (grid_pro_x < xx+res_x ) & (grid_pro_y >= yy ) & (grid_pro_y < yy+res_y ) ]
Vx[i,j] = np.mean(Px_pro_lim)/m_p
#print 'Vx[i,j]= ' ,Vx[i,j]
Есть ли у вас какие-либо рекомендации по повышению эффективности кода или у вас есть какие-либо другие алгоритмы поиска двумерного массива для параметра V?
ура