从整数创建一个球形打包最近邻列表

2024-06-12 03:18:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在python中构造一个最近邻列表,它将节点的最近邻存储在有限的三维六边形最近填充(HCP)晶格中。我已经用一个2d正方形晶格来定义结构了。我不需要坐标,只需要一种快速的方法,从整数列表中为HCP创建最近邻列表。下面是我如何用正方形格子来完成这个任务的示例代码。在

N = int #number of nodes
L = side # a 32x32 graph, L would be 32

for i in range(N):

    nearNeighbor[i][0] = (i + 1 ) % N
    nearNeighbor[i][1] = (i + (N - 1)) % N
    nearNeighbor[i][2] = (i + L) % N
    nearNeighbor[i][3] = (i + N - L) % N

    if (i-L < 0):
         nearNeighbor[i][3] = -2
    if (i+L >= N):
         nearNeighbor[i][2] = -2
    if (i%L) == 0:
         nearNeighbor[i][1] = -2     
    if ((i+1)%L) == 0:
         nearN[eighbori][0] = -2

就这样。现在一个HCP晶格,当可视化时,就像一个巨大的球体立方体,紧密地聚集在一起。每个节点最多应该有12个最近的邻居,他们应该出来做一个立方体。我想我主要想知道如何使用整数和模运算来表示HCP格,就像我对平方格所做的那样。你能帮我叠一下吗?在


Tags: 方法代码示例列表if节点定义整数
1条回答
网友
1楼 · 发布于 2024-06-12 03:18:18

这个问题的答案取决于如何截短HCP晶格并为其编制索引。一个选择是

Indexed HCP latticeIndexed HCP lattice part 2

使用此选项,以下代码将返回给定站点的邻居列表。在

def neighbors(i, W, H, D):
  A = W * H

  plane = i / A
  plane_index = i % A
  row = plane_index / W
  col = plane_index % W

  r = -1 if row % 2 else 1   # (-1)**row
  p = -1 if plane % 2 else 1 # (-1)**plane

  nbors = []

  # first include neighbors in same plane
  if col != W-1: nbors.append(i+1)
  if col != 0:   nbors.append(i-1)
  if row != H-1: nbors.append(i+W)
  if row != 0:   nbors.append(i-W)
  if (col != 0 or r > 0) and (col != W-1 or r < 0):
    if row != H-1: nbors.append(i+W+r)
    if row != 0:   nbors.append(i-W+r)

  # now add neighbors from other planes
  if plane != D-1: nbors.append(i+A)
  if plane != 0:   nbors.append(i-A)

  if (col != 0 or p < 0) and (col != W-1 or p > 0):
    if plane != D-1: nbors.append(i+A-p)
    if plane != 0:   nbors.append(i-A-p)

  if ((col != W - 1 or p > 0 or r < 0) and
      (col != 0 or p < 0 or r > 0) and
      (row != H-1 or p < 0) and
      (row != 0 or p > 0)):
    if plane != D-1:
      nbors.append(i + A + p*W + (r-p)/2) #10
    if plane != 0:
      nbors.append(i - A + p*W + (r-p)/2) #11

  return nbors

为了确保逻辑正确,我在编写上述函数时使用了以下测试

^{pr2}$

请注意,测试并没有涵盖所有独特类型的网站,因此,可能仍然有一个角落的情况是错误的。在

相关问题 更多 >