如何使用Python快速实现读写LS-DYNA的输入文件Keyfiles

作为一名工程师,我经常想在某一行修改一个输入文件。问题是:为了找到行并修改值,我必须编写一个文件解析器来过滤掉特定行。不幸的是,作为一名工程师,写一个文件解析器并不是我想花费的时间。

此外,LS Dyna输入文件和其他有限元文件格式通常都是专有的,因此不存在交互的标准接口。说到这个话题,很难相信我们生活在2018年,而不是石器时代。

当然,可以使用带脚本的预处理器来修改输入面板,但前面还有更多的问题。预处理器再也不会写同一个文件,而是顺序不同或删除了行间注释。如果我只想做一些改变,从而提高“嘿,我们为什么不这样做”的标准,那么使用预处理器通常是很繁琐的事情。现代解决方案必须更轻、更直接、更易于使用。这就是我们进一步扩展QD库的原因。

1. QD Python库

QD python库0.7.0版支持对ls dyna输入文件(也称为keyfiles)的操作。其主要目的是构建一个文件或操作现有文件,同时保留其整个结构。我们试图实现最通用的方法,因为硬编码手册对我们来说不是一个选择,但文件格式给了我们一段艰难的时期,这导致了3个月的工作(正如您可能认识到的,我们通常非常敏感,为我们的想法设定了高标准)。

2. 读取关键字文件

关键文件可以如下读取:

>>> from qd.cae.dyna import *
>>> 
>>> # read a keyfile
>>> kf = KeyFile("path/to/keyfile", 
                 read_keywords=True, 
                 parse_mesh=True, 
                 load_includes=True)

read_keywords声明文件中的所有关键字都应被读取。parse_meshoption解析文本网格数据,并将节点和元素添加到后场的网格数据库中。在解析时,还会检查网格的一致性。最后,使用load_includes选项,还可以加载includes,并且可以通过keyfile.get_includes()函数进行访问。

3. 处理每个关键字

keyword类用于处理几乎所有关键字。类保存关键字的文本,并提供操作文本信息的舒适方法。这使得它可以再次保存一个相同的文件,包括注释,这非常方便。可以很容易地检查文件中的所有关键字:

>>> kf.keys()
['*BOUNDARY_SPC_SET_ID', '*CONSTRAINED_INTERPOLATION_SPOTWELD', '*CONTACT_AUTOMATIC_SINGLE_SURFACE_ID', '*DATABASE_CROSS_SECTION_PLANE_ID', '*ELEMENT_SHELL', '*END', '*HOURGLASS_TITLE', '*INCLUDE', '*INITIAL_VELOCITY', '*KEYWORD', '*NODE', '*PART', '*PART_CONTACT', '*PART_INERTIA_CONTACT', '*SECTION_SHELL_TITLE', '*SET_NODE_LIST_TITLE', '*SET_PART_LIST_TITLE']

由于同一类型可以有多个关键字,因此可以通过以下方式获得特定类型的所有关键字的列表:

>>> # get all part keywords
>>> part_keywords = kf["*PART"]
>>>
>>> # Check the number of part keywords
>>> len(part_keywords)
7
>>> # select the first part_keyword
>>> kw = part_keywords[0]
>>> print(kw)
$-------------------------------------------------------------------------------
$ Parts, Sections, and Materials
$-------------------------------------------------------------------------------
*PART
$# title
engine part number one
$#     pid     secid       mid     eosid      hgid      grav    adpopt      tmid
   2000001   2000001   2000017

现在有多种方法可以操纵关键字,如上面所述。大多数关键字的字段大小为10个字符,但不幸的是,有时它也是8个字符或其倍数。没有通用的方法来检查这一点,因此在出现问题时,请控制它,并使用keyword.set_field_size正确设置它。这里一切都很好,所以我们可以简单地从名称或索引中设置PID。

>>> # set a pid by name
>>> kw["pid"] = 500
>>> # set by indexing
>>> kw[1,0] = 500

因为我们没有硬编码手册,所以库不知道“pid”字段实际上在哪里。幸运的是,人们倾向于很好地记录他们的文件,这样我们就可以在上面的注释行中搜索名称“pid”,并修改下面的字段。顺便问一下,字段是左对齐还是右对齐并不重要。

另一种访问PID字段的方法是使用索引。PID位于第二张卡和第一个字段中,标准大小为10个字符。由于在编程中计数从0开始,我们也可以用卡片1和字段0的索引来处理这个字段。方括号是更通用函数的快捷方式,也可用于轻松添加新字段。

>>> kw.set_card_valueByIndex(iCard=2, iField=0, value=123, name="custom")
>>> print(kw)
$-------------------------------------------------------------------------------
$ Parts, Sections, and Materials
$-------------------------------------------------------------------------------
*PART
$# title
engine part number one
$#     pid     secid       mid     eosid      hgid      grav    adpopt      tmid
   2000001   2000001   2000017
$custom
123

查看库如何不仅设置字段,而且提供了设置名称的选项。我们不喜欢这里的值是左对齐的。库还提供格式化实用程序。首先,我们将全局格式设置为右侧,然后重新格式化卡。

>>> Keyword.field_alignment = Keyword.align.right
>>> Keyword.name_alignment = Keyword.align.right
>>> kw.reformat_all(skip_cards=[0])
>>> print(kw)
$-------------------------------------------------------------------------------
$ Parts, Sections, and Materials
$-------------------------------------------------------------------------------
*PART
$# title
engine part number one
$      pid     secid       mid     eosid      hgid      grav    adpopt      tmid
   2000001   2000001   2000017
$   custom
       123

有更多的方法控制格式,所以这只是一个小例子。在重新格式化时,我们必须跳过每一张带有非统一字段的卡(这里是卡0)。卡0在整行上都有一个名称字段(dyna行限制始终为80个字符,但我们不在乎)。如果我们像以前一样设置字段,名称将自动剪切,以适合10个字符的标准字段大小。可以通过手动指定字段大小来覆盖此行为


  • 分享于 2019-07-30 11:11
  • 阅读 ( 156 )

[版权声明] :本文系网友分享,仅以非商业性的交流和科研为目的,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本网( friends@stuch.cn )联系!我们将协调给予处理。阅读原文(请登录)..

0 条评论

请先 登录 后评论
猜猜我是谁
卢思浩

8
提问
2
回答
2
文章
暑期推广注册