3D 网格上具有周期性边界的球体

Spheres with periodic boundaries on a 3D mesh

我正在尝试弄清楚如何在 numpy 网格上定义周期性边界。

假设我定义了一个大小为 1x1x1 的盒子,并在里面放了一个半径为 0.25 的球体。这个球体不在中心,但足够靠近边界,因此球体的一部分必须从盒子的另一侧出来。

例如如果代码如下

  import numpy as np

  x_ = np.linspace(0,1,100)
  y_ = np.linspace(0,1,100)
  z_ = np.linspace(0,1,100)

  X,Y,Z = np.meshgrid(x_,y_,z_,indexing='ij')

  I = (X-particle['x'])**2 + (Y-particle['y'])**2 + (Z-particle['z'])**2 < particle['r']**2

我将得到一个 3D 布尔数组,其中 True 值是落在球体内的网格点,False 值是落在球体内的网格点。然而,这并不能保证我想要的周期性边界。

有什么优雅的方法可以做到这一点,而不必遍历每个网格点

一个简单的方法是在相邻的周期性网格中复制您的圆,并检查当前网格中的网格点与相邻网格中的中心的距离:

您的代码:

import numpy as np

x_ = np.linspace(0,1,100)
y_ = np.linspace(0,1,100)
z_ = np.linspace(0,1,100)

X,Y,Z = np.meshgrid(x_,y_,z_,indexing='ij')

我添加了一些示例圆参数:

particle = {'r':0.25, 'x':0.3, 'y':0.5,'z':0.8}

由于您的网格长度为 1x1x1,我猜点之间的间距为 0.01,所以:

import itertools
grid_size = 1.0
offsets = itertools.combinations_with_replacement([grid_size,0,-grid_size],r=3)
centers = [(particle['x']+x_offset, particle['y']+y_offset,particle['z']+z_offset) for x_offset,y_offset, z_offset in offsets]
I=np.logical_or.reduce([(X-c_x)**2 + (Y-c_y)**2 + (Z-c_z)**2 < particle['r']**2 for c_x, c_y, c_z in centers])

您可以通过可视化切片来仔细检查它:

from matplotlib import pyplot as plt
plt.imshow(I[:,50,:])

或完整的 3D 网格(相当慢)

%matplotlib notebook
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.voxels(I)
plt.show()