使用 numpy 在 Python 中导入 nastran 节点平台

Import nastran nodes deck in Python using numpy

如果我想将 Nastran Deck 导入 Python 数组,使用 numpy 一下子就可以了。我该怎么办?我哪里错了?

我有一个文件,里面只有网格。网格均等距与 Nastran 的短翻译器(8 个字符)

$ MH Nodes
456784567845678456784567845678
GRID     25601          58.50002-57.749923.05                      
GRID     25602          58.81002-57.749923.05  

如果我理解正确的话,使用 Numpy 的 dtype 命令非常棒。这是我的代码:

fileMH = "Gnodes.bdf"

dtyp = np.dtype([
                ("Grid",(np.void,8)),
                ("GN",(np.int,8)),
                ("Prop",(np.void,8)),
                ("X",(np.float,8)),
                ("Y",(np.float,8)),
                ("Z",(np.float,8)),
])

f = np.loadtxt(fileMH,dtyp,comments="$")

我得到的错误是一个浮点数错误,但是我期望 dtype 一次从字符串中提取 8 个字符。这是错误:

ValueError: invalid literal for float(): 58.50002-57.749923.05

感谢您的帮助。

P.S。有人可以做一个 nastran 标签吗,大量的数据处理是在 nastran 中完成的,这需要智能编程。这会很有帮助。

dtype指定二进制数据在内存中的布局。它没有定义文件中文本的格式。

您的数据文件具有固定宽度的字段。即每个字段使用八个字符,没有特殊的分隔符来分隔字段。您可以使用 numpy.genfromtxt 读取此类文件,方法是在 delimiter 参数中指定字段宽度。

这是 ipython 会话中的示例。首先,这是您的示例文件。 (我编辑了文件以确保在第二行和第三行的最后一个 05 之后有三个空格,但这不是必需的。)

In [15]: !cat nastran_data.txt
$ MH Nodes
456784567845678456784567845678
GRID     25601          58.50002-57.749923.05   
GRID     25602          58.81002-57.749923.05   

这里是genfromtxt要创建的数组的数据类型。请注意,GN 字段的类型为 np.int64XYZ 字段的类型为 np.float64.

In [16]: dt = np.dtype([('Grid', 'S8'), ('GN', np.int64), ('Prop', 'S8'), ('X', np.float64), ('Y', np.float64), ('Z', np.float64)])

使用 genfromtxt 读取文件,有六个固定宽度的字段,每个字段的长度为 8:

In [18]: a = np.genfromtxt('nastran_data.txt', dtype=dt, delimiter=(8, 8, 8, 8, 8, 8), skip_header=2)

In [19]: a
Out[19]: 
array([('GRID    ', 25601, '        ', 58.50002, -57.7499, 23.05),
       ('GRID    ', 25602, '        ', 58.81002, -57.7499, 23.05)], 
      dtype=[('Grid', 'S8'), ('GN', '<i8'), ('Prop', 'S8'), ('X', '<f8'), ('Y', '<f8'), ('Z', '<f8')])

In [20]: a['GN']
Out[20]: array([25601, 25602])

In [21]: a['X']
Out[21]: array([ 58.50002,  58.81002])

也许 pyNastran 可以代替 numpy? https://github.com/SteveDoyle2/pyNastran

此示例打印节点

import pyNastran
from pyNastran.bdf.bdf import BDF
model = BDF()
model.read_bdf('inputdeck.bdf', xref=True)
model.nodes
{1: GRID           1              8.      3.      0.,
 2: GRID           2              8.      9.      0.,
 3: GRID           3              8.     11.      0.,
 4: GRID           4              8.     13.      0.,
 5: GRID           5             -8.      3.      0.,
 6: GRID           6             -8.      9.      0.,
 7: GRID           7             -8.     11.      0.,
 8: GRID           8             -8.     13.      0.,
 9: GRID           9              2.      5.      0.}