найти индексы, используя для цикла - PullRequest
0 голосов
/ 30 мая 2019

Я должен оценить влияние полей 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?

ура

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...