提出这个问题背后的整个目标源于尝试在Abaqus/CAE中创建线性约束方程(http://abaqus.software.polimi.it/v6.14/books/usb/default.htm?startat=pt08ch35s02aus129.html#usb-cni-pequation),以将周期性边界条件应用于网格模型。由于我的模型有超过一百万个元素,我需要对 1000 个这样的模型执行蒙特卡罗模拟,因此我想并行化由于与 Abaqus/CAE 相关的许可和多线程限制而没有找到解决方案的过程。这里有一些讨论:来自Abaqus/CAE的Python多处理
我目前正在尝试使用创建的节点集在 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 文件中,我还可以将这些命令编写为单独的文件,并使用
*EQUATION, INPUT=file_name
我正在寻找 Abaqus Python 命令将上述关键字写入 .inp 文件,而不是指定公式约束本身。 上面链接的用户指南指示通过GUI指定这一点,但我无法在我的Abaqus CAE 2018版本中做到这一点。
Abaqus/CAE 用法:交互模块:创建约束:公式:
在将光标悬停在数据表上的同时单击鼠标按钮 3,然后选择从文件中读取。
所以我正在寻找脚本参考手册中的命令来执行此操作。有用于解析输入文件 (http://abaqus.software.polimi.it/v6.14/books/ker/pt01ch24.html) 的命令,但没有直接写入输入文件而不是通过脚本执行的命令。我知道我可以将其硬编码到输入文件中,但是我想执行的模拟数量之多要求每一点自动化。我已经尝试使用适当的算法和numpy数组优化代码,但是对于一个模型,预处理本身需要数小时。
附言这是我关于SO的第一篇文章 - 所以我不确定这个问题是否以适当的格式表达。希望对实际问题的任何回答或对 Abaqus/CAE 中并行化预处理步骤的预期结果的任何其他解决方案。
您正在寻找 KeywordBlock 对象。这允许您将任何内容作为格式化字符串写入输入文件(关键字、注释等)。我相信这种方法比要求您以编程方式自行编写输入文件(或更新现有文件)的替代方案更不容易出错。
关键字块对象是在组件级别创建零件实例时创建的。它使用相应的关键字存储您在CAE中所做的一切。
请注意,对 KeywordBlock 对象所做的任何更改都将在写入作业输入文件时同步到该文件,但不会更新 CAE 模型数据库。例如,如果使用关键字块存储约束方程的关键字,则约束定义将不会显示在 CAE 模型树中。MDB 的其余部分并不知道它们的存在。
如您所知,关键字必须写入输入文件的相应部分。例如,可以在零件、零件实例或组件级别定义*equation
关键字(请参阅关键字参考手册)。当您在 KeywordBlock 对象中存储关键字时,也必须考虑这一点(不幸的是,它不会自动将您的关键字放在正确的位置!副作用是写入关键字块并不总是安全的 - 也就是说,每当它可能与通过 CAE GUI 进行的后续更改发生冲突时。我相信 Abaqus 文档建议您在最后一步添加关键字。
所以基本上,阅读KeywordBlock对象,找到正确的位置,然后insert
你的新关键字。下面是一个示例代码段,可帮助您入门:
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))