# 将for循环转换为并行计算

``````#Calculate if two particles are neighbors (Periodic Boundary Condition)
#center is the coordinates of the particles
#d is the distance threshold for two clusters to be neighbors
# Maxima_Range and Lattice_Range are for periodic boundary conditions
#Pos_3d is a list.
# Suppose particle i has neighbors j,k,l.
# Pos_3d[i] = [j,k,l]

def find_neighbors(center,d,Maxima_Range,Lattice_Range):
a,b = np.shape(center) #get the dimension of the array
flag_3d = np.zeros(a)  #count the number of neighbors for particle i
Pos_3d = [[] for i in range(a)]
# Pos_3d is a two dimmensional list.
#Pos_3d[i] includes the indices of all the neighbors of particle i

diff_sqrt = d ** 0.5
for i in range(a):
if i % 6 == 5: #for some reason, when i % 6 == 5, it is the center coordinates, this cannot be changed.
for j in range(i+1,a):
if j % 6 == 5:

diff_x = center[i]-center[j]
diff_y = center[i]-center[j]
diff_z = center[i]-center[j]

if diff_x < diff_sqrt and diff_y < diff_sqrt and diff_z < diff_sqrt and diff_x > -diff_sqrt and diff_y > -diff_sqrt and diff_z > -diff_sqrt:
#if one of the x,y,z component is already bigger than d, we don't need to calculate their distance in 3-D. They are not neighbors.

diff = diff_x * diff_x +diff_y * diff_y +diff_z * diff_z

if diff <= d: #without period boundary condition
flag_3d[i] +=1
flag_3d[j] +=1
Pos_3d[i].append(j)
Pos_3d[j].append(i)
continue

#With periodic boundary condition
#in x

do something..

return Pos_3d
``````