将关键字插入 .inp 文件的 Abaqus Python 命令

Posted

技术标签:

【中文标题】将关键字插入 .inp 文件的 Abaqus Python 命令【英文标题】:Abaqus Python Command to insert keyword to the .inp file 【发布时间】:2019-12-02 18:01:12 【问题描述】:

提出这个问题的全部目的源于尝试在 Abaqus/CAE 中对线性约束方程 (http://abaqus.software.polimi.it/v6.14/books/usb/default.htm?startat=pt08ch35s02aus129.html#usb-cni-pequation) 的创建进行多处理,以将周期性边界条件应用于网格模型。由于我的模型有超过一百万个元素,并且我需要对 1000 个此类模型执行蒙特卡罗模拟,因此我想并行化由于与 Abaqus 相关的许可和多线程限制而尚未找到解决方案的过程/CAE。这里有一些讨论:Python multiprocessing from Abaqus/CAE

我目前正在尝试使用创建的节点集在 Abaqus 之外执行方程定义,因为我知道输入文件的方程语法。

** Constraint: <name>
*Equation
<dof>
<set1>, <dof>, <coefficient1>.
<set2>, <dof>, <coefficient2>.
<set3>, <dof>, <coefficient3>.

e.g.
** Constraint: Corner_c1_Constraint-1-pair1
*Equation
3
All-1.c1_Node-1, 1, 1.
All-1.c5_Node-1, 1, -1.
RefPoint-3.SetRefPoint3, 1, -1.

除了直接将这些行写入 .inp 文件之外,我还可以将这些命令编写为单独的文件,并将其链接到模型的 .inp 文件中使用

*EQUATION, INPUT=file_name

我正在寻找 Abaqus Python 命令来将上述关键字写入 .inp 文件,而不是自己指定方程式约束。 上面链接的用户指南指示通过 GUI 指定这一点,但我在我的 Abaqus CAE 2018 版本中无法做到这一点。

Abaqus/CAE 用法: 交互模块:创建约束:方程:鼠标悬停在数据表上的同时点击鼠标键3,选择Read from File。

所以我正在从脚本参考手册中寻找一个命令来代替它。有一些命令可以解析输入文件 (http://abaqus.software.polimi.it/v6.14/books/ker/pt01ch24.html),但不能直接写入输入文件而不是通过脚本执行它。我知道我可以将它硬编码到输入文件中,但是我想要执行的模拟数量庞大,可以调用所有可能的自动化。我已经尝试使用适当的算法和 numpy 数组来优化代码,但是对于一个模型,预处理本身需要数小时。

附言这是我关于 SO 的第一篇文章 - 所以我不确定这个问题是否以适当的格式表达。希望对实际问题的任何答案或对在 Abaqus/CAE 中并行化预处理步骤的预期结果的任何其他解决方案。

【问题讨论】:

我在下面的回答将允许您将关键字写入作业输入文件。我一直在工作中做类似的事情。问:您的流程的哪一部分是您想要并行执行的瓶颈?确定方程的节点,还是运行分析? 感谢@MattP。那行得通。我的瓶颈是:(1)根据坐标对长方体模型相对面上的节点进行排序,(2)为每个匹配节点集创建约束方程以应用周期性边界条件。我目前正在使用本机 sorted() 函数,我想我可以通过桶排序实现进一步加快它。虽然还没有尝试过。至于创建约束方程,它是通过循环遍历节点集数组来串行完成的,我试图通过并行化过程在 CAE 之外自己编写方程。 太棒了!你介意标记/接受答案吗? 完成。您是否设法为您在另一篇文章 (***.com/questions/44146116/…) 中尝试的多处理追求找到了解决方案?只是好奇! (谢谢!)我选择以增加存储空间和组织良好的数据结构为代价优化串行代码的速度。之后的计算速度非常快。我得出的结论是,并行化可能是可能的,但并非没有在 Abaqus Python 内核之外执行操作。最后,我得到了一个我很满意的纯 Python 串行实现。 【参考方案1】:

您正在寻找 KeywordBlock 对象。这允许您将任何内容作为格式化字符串写入输入文件(关键字、cmets 等)。我相信这种方法比需要您自己以编程方式编写输入文件(或更新现有文件)的替代方法更不容易出错。

在装配级别创建零件实例时会创建关键字块对象。它使用相应的关键字存储您在 CAE 中所做的一切。

请注意,您对 KeywordBlock 对象所做的任何更改都会在写入时同步到作业输入文件,但不会更新 CAE 模型数据库。例如,如果您使用 KeywordBlock 存储约束方程的关键字,则约束定义将不会显示在 CAE 模型树中。 Mdb 的其余部分不知道它们的存在。

如您所知,关键字必须写入输入文件的适当部分。例如,*equation 关键字可以在零件、零件实例或装配级别定义(请参阅关键字参考手册)。当您在 KeywordBlock 对象中存储关键字时,也必须考虑这一点(不幸的是,它不会自动将您的关键字放在正确的位置!)。副作用是写入 KeywordBlock 并不总是安全的——也就是说,只要它可能与通过 CAE GUI 进行的后续更改发生冲突。我相信 Abaqus 文档建议您在最后一步添加关键字。

所以基本上,阅读 KeywordBlock 对象,找到正确的位置,然后 insert 你的新关键字。这是一个帮助您入门的示例 sn-p:

partname = "Part-1"
model = mdb.models["Model-1"]
modelkwb = model.keywordBlock
assembly = model.rootAssembly

if assembly.isOutOfDate:
    assembly.regenerate()

# Synch edits to modelkwb with those made in the model. We don't need
# access to *nodes and *elements as they would appear in the inp file,
# so set the storeNodesAndElements arg to False.
modelkwb.synchVersions(storeNodesAndElements=False)

# Search the modelkwb for the desired insertion point. In this example, 
# we are looking for a line that indicates we are beginning the Part-Level 
# block for the specific Part we are interested in. If it is found, we 
# break the loop, storing the line number, and then write our keywords
# using the insert method (which actually inserts just below the specified
# line number, fyi). 
line_num = 0
for n, line in enumerate(modelkwb.sieBlocks):
    if line.replace(" ","").lower() == "*part,name=0".format(partname.lower()):
        line_num = n
        break
if line_num:
    kwds = "your keyword as a string here (may be multiple lines)..."
    modelkwb.insert(position=line_num, text=kwds)
else:
    e = ("Error: Part '' was not found".format(partname),
         "in the Model KeywordBlock.")
    raise Exception(" ".join(e))

【讨论】:

以上是关于将关键字插入 .inp 文件的 Abaqus Python 命令的主要内容,如果未能解决你的问题,请参考以下文章

编辑 Abaqus 输入文件并从 Matlab 运行它

abaqus怎么镜像网格

abaqus修改inp直接建立工程

abaqus视图中如何不使用科学计数法

Hypermesh画的网格怎样导入fluent

ABAQUS 分析出现网格错误解决办法