如何在巨大的 3D 矢量数据单元网格上进行局部 FFT 并在空间上对其进行可视化?

计算科学 matlab 可视化 傅立叶分析 数据分析
2021-12-02 09:18:33

模拟类型:

我正在使用 OOMMF 微磁包进行模拟

http://math.nist.gov/oommf/

其中磁铁由300 万个细胞的网格表示,它被磁脉冲激发,单个细胞振荡,每个细胞的数据输出是 x、y、z 方向和每个组件随时间的绝对磁场值,所以一个迷你磁铁。现在我想对每个细胞的 m_z(t) 进行FFT,然后随着时间的推移可视化这个磁铁,而 m_z(t) 的细胞显示常见的振荡模式/特征频率得到相同的颜色。

数据输出格式:

它是“数据二进制 4”,如前所述,每个分量的 x、y、z 和绝对字段值都针对所有时间步(低于 300-500 时间步)给出

手册说:

二进制表示是网络字节顺序 (MSB) 中的 IEEE 浮点数为确保字节顺序正确,并提供文件未通过非 8 位干净通道发送的部分检查,第一个数据是预定义值:1234567.0(十六进制:49 96 B4 38) 4 字节模式,123456789012345.0(十六进制:42 DC 12 21 83 77 DE 40)用于 8 字节模式。数据紧跟校验值。数据的结构取决于标头中声明的 \meshtype" 是 \irregular" 还是 \rectangular"。对于不规则的网格,每个数据元素是一个 6 元组,由节点位置的 x、y 和 z 分量组成,然后是该位置的场的 x、y 和 z 分量。节点之间的排序不相关。节点的数量在段标题的 \pointcount" 行中指定。对于矩形网格,数据输入仅为字段值,在 x、y、z 分量三元组中。 这些按顺序排列,x 索引先递增,然后 y索引,z 索引最后。这名义上是Fortran 顺序,在这里采用是因为通常 x 是最长的维度,而 z 是最短的,所以这个顺序比 z 的普通 C 数组索引更有效地访问内存, y, x.每个维度的大小在段头中的 \xnodes, ynodes, znodes" 行中指定。

我在这里使用矩形网格

题:

FFT 可以使用诸如 MATHEMATICA 或 MATLAB 之类的东西来完成单个单元格和(m_z/数字,时间/数字)数据列表 .dat 文件,但是对于 300 万个单元格的单个时间步长,数据二进制 4 文件最多 20 MB 大,配备 30 GB RAM 和 12 个内核的工作站。上面的手册提到了 FORTRAN(据我所知,虽然很快,但学习语言并不容易)。

实现我正在寻找和上面描述的结果的方法是什么?从我的角度来看,我面临的问题是在合理的时间内使用大约 300 万个单元的脚本过程进行 FFT,然后将该数据转换为频谱图(查看存在哪些不同的特征频率和高次谐波,这也可以通过使用平均 m_z(对所有单个单元求和)并简单地对其进行 FFT),但在 FFT 之后还具有该数据二进制 4 格式的输出格式,可用于提供可视化软件,该软件可以读取此类网格数据并对其进行颜色编码,显示 3D 对象的单个 2D 切片。

我读到 MATHEMATICA 可以处理二进制 4 并提供高性能,但由于这对我来说是全新的领域,我首先想问一下上述限制和愿望,以合理的方式实现这一目标的最佳方式和软件/编程语言是什么时间(几周)

1个回答

在像你这样的机器上,20 MB 的数据文件真的不再很大了。我希望 Mathematica 能够在几秒钟内读取它,并且能够在几秒钟到一分钟内完成 FFT。您可以尝试通过简单地启动 Mathematica,创建一个包含 300 万个随机选择的条目的向量,然后让 Mathematica 进行 FFT。如果这发生在可接受的时间范围内,那么值得编写一个可以读取您拥有的数据的接口。

本质上,我想说的是,您可能会被数据的大小不必要地吓到。任何为您提供管理数据向量和执行 FFT 的合理编程环境都应该足够了。这包括与 FFTW 包链接的 Mathematica、Maple、Matlab 或 C/C++ 程序。我希望它们中的任何一个都能在适度的运行时为您提供结果。

Mathematica、Matlab 和 Maple 将具有额外的优势,即它们具有多种可视化数据的方法。