【发布时间】:2023-03-11 01:25:01
【问题描述】:
所以,我正在涉足等离子模拟的世界。现在,虽然我知道顶级模拟是用 fortran 编写的,并且具有超内存效率的子例程和专用代码,但我希望只运行一些低级模拟。
我的问题是,在时变环境(嗯,时间步长)中模拟大量粒子时,跟踪所有数据是一个技巧。我之前使用过多维数组——使用粒子的列号和属性的行号,但是这感觉相当笨拙。但是,它似乎执行得更快。
我最近尝试定义自己的类,但是作为一个 python 新手,我可能以一种非常低效的方式做到了。对于 3 维中的每个粒子,我需要能够存储粒子的位置、速度和力(一旦代码变得更复杂,就有可能添加更多变量)。使用我对类的了解,我定义了一个 particle 对象(我认为),它使我的代码更易于阅读和遵循:
# Define Particle as a class
class particle():
def __init__(self, index=0, pos=np.array([0, 0, 0]), vel=np.array([0,0,0]),
F=np.array([0, 0, 0])):
self.index = index # Particle index (identifier)
self.pos = pos # Position 3-vector
self.vel = vel # Velocity 3-vector
self.F = F # Net force 3-vector (at particle)
因此,我可以轻松地初始化一个包含大量此类对象的数组,并以相当直接的方式修改每个值。然而,正如我所提到的,这对于只涉及几个粒子的模拟运行速度较慢。我将使用我的代码将其与纯面向矩阵的方法进行比较,看看哪种方法更适合大型模拟。
我想我的问题是:以这种方式定义“粒子”是最有效的吗?或者是否有更高效的 CPU/内存方式来定义这样的对象。我想保留它的方法能力(即particle[i].pos = [1,2,3] 或particle[2].vx[1] = 3),这样我就可以为每个粒子设置值,并通过函数传递它们。请记住,我是 Python 新手,所以我可能不会在处理大型复杂代码方面取得巨大成功。
【问题讨论】:
-
你在使用 numpy 吗?
-
是的。我也在使用 matplotlib 进行可视化。
-
@user2357112 好点。在我更新的答案中解决了这个问题。
标签: python arrays class types simulation