python如何输⼊⽂件_如何使⽤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,并且可以通过 _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"]
>>>
python怎么读的>>> # 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 个字符的标准字段⼤⼩。可以通过⼿动指定字段⼤⼩来覆盖此⾏为
请您登录后阅读全⽂, 登录 或者 注册

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。