abaqus脚本
这个专题主要记录自己使用abaqus过程中(尤其是结合python做二次开发和脚本自动化方面)的一些技术点记录。
1. 自动提交运算
如果只是修改部分计算参数,可以先生成一个inp文件,然后对inp文件进行修改,得到新的算例配置inp,再利用python脚本提交运算。
如这里有一个算例:要计算一个弹性梁再不同载荷作用下的变形,载荷施加在自由端,每个算例载荷大小不同。可以使用下面的脚本:
import os
import subprocess
import numpy as np
def create_input_file(dir_path, load_list):
input_file = "Job-1.inp"
output_file_name = dir_path + "/" + "Job-1.inp"
start = 158702
end = 158710
new_lines = [
"*Cload\n",
"_PickedSet7, 1, {:.6f}\n".format(load_list[0]),
"_PickedSet7, 2, {:.6f}\n".format(load_list[1]),
"_PickedSet7, 3, {:.6f}\n".format(load_list[2]),
"** Name: Load-2 Type: Momen\n",
"*Cload\n",
"_PickedSet8, 4, {:.6f}\n".format(load_list[3]),
"_PickedSet8, 5, {:.6f}\n".format(load_list[4]),
"_PickedSet8, 6, {:.6f}\n".format(load_list[5]),
]
with open(input_file, "r") as fin, open(output_file_name, "w") as fout:
for i, line in enumerate(fin, 1):
if i >= start and i <= end:
fout.write(new_lines[i - start])
elif i < start or i > end:
fout.write(line)
return output_file_name
def submit_job(inputFileName, numCpus=1):
abaqus_path = r"D:\program_files\abaqus2022\Commands\abaqus.bat"
# 提交作业
jobName = "Job-1"
# 指定工作目录
dir_path, inpu_file = inputFileName.split("/")
# 切换到指定目录
cpus = 12
command = abaqus_path + " job=Job-1 input=Job-1.inp cpus={} int ask=off".format(
cpus
)
try:
result = subprocess.run(
command, shell=True, check=True, capture_output=True, text=True
)
print("complete done!")
print(result.stdout)
except subprocess.CalledProcessError as e:
print("field: ", e)
print("error: ", e.stderr)
这样就可以自动提交运算。
2、 截面转角自动读取
有了批量计算结果,每个结果保存为一个odb文件,需要借助python脚本批量对结果文件进行处理。
我需要读取梁自由断面的转角,编写如下脚本实现(再小变形下,满足平截面假定,界面上的任何一个点的转角可以表征这个截面的转角):
import os
import numpy as np
from abaqusConstants import *
from odbAccess import openOdb
from scipy.spatial import KDTree
def extract_node_rotations(node_labels, odb_path="Job-1.odb", step_name="Step-1"):
odb = openOdb("Job-1.odb")
step = odb.steps[step_name]
last_frame = step.frames[-1]
rotations_field = last_frame.fieldOutputs["UR"]
result = []
for node_label in node_labels:
for value in rotations_field.values:
if value.nodeLabel == node_label:
result.extend(list(value.data))
break
else:
result.extend([None, None, None]) # 如果没找到节点
odb.close()
return result
还遇到一个需求:读取指定节点的应变。
这个问题困扰了我很久,因为abaqus应变值保存在积分点,而不是节点。怎么实现?我找到一个比较笨的方法:先利用abaqus的场输出功能写出所有节点的应变(给函数可以自动将积分点的应变插值到节点),然后解析节点应变,找到自己需要的节点编号对应的应变。如果需要给出坐标来选点,可以在导出节点坐标,这样得到节点坐标、节点应变的表格,再利用坐标插值,可以得到具体坐标点的应变值。因为一点应变是6个自由变量的张量,可以对该张量的每个元进行循环处理。
导出节点应变的脚本如下:
def write_nodal_strain(fname, odb_path):
import visualization
from abaqus import session
session.mdbData.summary()
o1 = session.openOdb(name=odb_path)
session.viewports["Viewport: 1"].setValues(displayedObject=o1)
odb = session.odbs[odb_path]
session.writeFieldReport(
fileName=fname,
append=ON,
sortItem="Node Label",
odb=odb,
step=0,
frame=1,
outputPosition=NODAL,
variable=(
(
"E",
INTEGRATION_POINT,
(
(COMPONENT, "E11"),
(COMPONENT, "E22"),
(COMPONENT, "E33"),
(COMPONENT, "E12"),
(COMPONENT, "E13"),
(COMPONENT, "E23"),
),
),
),
stepFrame=SPECIFY,
)
导出节点坐标的函数类似。插值函数可以使用scipy.inter类实现。

浙公网安备 33010602011771号