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

问题描述 投票:0回答:1

我正在尝试弄清如何在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值是落在球体内的网格点。但是,这不能保证我想要的周期性边界。

是否有任何优雅的方法,而不必遍历每个网格点

python numpy mesh periodicity
1个回答
0
投票

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

您的代码:

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])
© www.soinside.com 2019 - 2024. All rights reserved.