提取控制面积和提取反力其实是一回事,控制面积就是单位压强下的反力,我在CSDN上找到了两个大佬的源码并将其组合了一下,自己做了点合并的工作。
批量施加集中力参考:利用python对abaqus模型批量加载集中力载荷_abaqus集中力怎么加载_整天不学习的博客-CSDN博客 批量提取的网页我忘记了(可能来自某乎文章),如果有大佬看到侵权烦请提醒我。
这方面文献很多,但是大部分课题组发表的文章中都不会包含子程序的源码,这能理解但是对于我个人而言就还是需要再去学习这部分知识。简单来说就是走了很多别人已经走过的老路。我觉得大可不必,所以我将自己总结出来的源码放在下面希望可以帮到同做地下结构抗震数值模拟的各位。
下面是我合并后的源码(部分变量与注释未修改,有python基础的可以自行修改以便于提取不同数据):
from odbAccess import openOdb
from textRepr import *
from abaqus import*
from abaqusConstants import*
from caeModules import *
import csv
import regionToolset
#=====================================提取X向RF1=================================================
# 获取odb对象
my_odb = openOdb(r"C:\temp\Job-1.odb") #改为你自己ODB文件所在地址
# 获取指定分析步
step = my_odb.steps['Step-1'] #改为你所要提取分析步
# 选取最后一帧
frame = step.frames[-1] #改为你所要提取的帧
# 获取全局反力场变量
dis_field = frame.fieldOutputs['RF'] #改为你所想要提取的变量
# *****************************************************
# 获取局部场变量
# 在前处理时已经定义好的节点集合名称为'SET-X/SET-Y'
# 将已经定义好的集合在odb模块中找到,并赋予给变量NodeSet
NodeSetX = my_odb.rootAssembly.nodeSets['SET-X'] #改为你自己的部件及先前对应的集合
# 在前述全局位移场变量的基础上提取局部位移场
local_dis_values = dis_field.getSubset(region=NodeSetX)
# *****************************************************
# 创建新的csv文件用于保存所需数据
# 遍历指定集合内各节点信息并格式化输出
with open('dataX.csv','w') as f: # 不指定决定路径则在工作路径生成
f.write("NodeLabel, NodeRF\n")
for node_value in local_dis_values.values:
txt_line = "{}, {}\n".format(node_value.nodeLabel, node_value.data[0])#在ABAQUS开发中0代表X方向,1代表Y方向,2代表Z方向
f.write(txt_line)
# 关闭ODB,释放资源
#=====================================提取Y向RF2=================================================
NodeSetY = my_odb.rootAssembly.nodeSets['SET-Y'] #改为你自己的部件及先前对应的集合
# 在前述全局反力场变量的基础上提取局部反力场
local_dis_values = dis_field.getSubset(region=NodeSetY)
# *****************************************************
# 创建新的csv文件用于保存所需数据
# 编历指定集合内各节点信息并格式化输出
with open('dataY.csv','w') as f: #在ABAQUS工作路径生成
f.write("NodeLabel, NodeRF\n")
for node_value in local_dis_values.values:
txt_line = "{}, {}\n".format(node_value.nodeLabel, node_value.data[1])
f.write(txt_line)
# 关闭ODB,释放资源
#====================================修改文件格式===============================================
#==============修改X向文件===============
# 打开原始CSV文件
input_file = r'C:\temp\dataX.csv'#目录为abaqus工作目录
# 读取原始数据
rows = []
with open(input_file, 'r') as file:
reader = csv.reader(file)
rows = list(reader)
# 在每一行的末尾添加0
for row in rows:
value = row[1]
if value.startswith('-'):
row[1] = value[1:] # 移除负号
else:
row[1] = '-' + value # 添加负号
row.append('0')
row.append('0')
# 写入更新后的数据到原始CSV文件
with open(input_file, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerows(rows)
#==============修改Y向文件===============
# 打开原始CSV文件
input_file = r'C:\temp\dataY.csv'
# 读取原始数据
rows = []
with open(input_file, 'r') as file:
reader = csv.reader(file)
rows = list(reader)
# 在每一行的末尾添加0
for row in rows:
value = row[1]
if value.startswith('-'):
row[1] = value[1:] # 移除负号
else:
row[1] = '-' + value # 添加负号
row.append('0')
row.append('0')
# 写入更新后的数据到原始CSV文件
with open(input_file, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerows(rows)
#=================================施加X向RF=====================================================
#执行此步骤之前需要将csv中力添加负号
filename = 'dataX.csv' # csv文件名
model = 'Model-1' # 模型名称
stepp = 'Step-1' # 分析步名称
instance = 'Part-1-1' # 部件名称
nodes = []
force_x, force_y, force_z = [], [], []
# 读取csv
with open(filename) as f:
reader = csv.reader(f)
rows = next(reader)
for row in reader:
nodes.append(int(row[0]))
force_x.append(float(row[1]))
force_y.append(float(row[2]))
force_z.append(float(row[3]))
a = mdb.models[model].rootAssembly
n1 = a.instances[instance].nodes # 模型中的所有节点
# 创建节点力
for i in range(len(nodes)):
node1 = n1.getFromLabel(nodes[i]) # 根据节点号获取节点对象
n = n1.index(node1) # 节点索引
nodes1 = n1[n:n+1] # 节点序列
region = regionToolset.Region(nodes=nodes1)
load = 'load_on_node_' + str(nodes[i]) # 节点力命名
mdb.models[model].ConcentratedForce(name=load,
createStepName=stepp, region=region,
cf1=force_x[i], cf2=force_y[i], cf3=force_z[i],
distributionType=UNIFORM, field='', localCsys=None)
#==================================施加y向RF=========================================================
#同样去提取的Y向文件中添加负号
filename = 'data.csv' # csv文件名
model = 'Model-1' # 模型名称
stepp = 'Step-1' # 分析步名称
instance = 'Part-1-1' # 部件名称
nodes = []
force_x, force_y, force_z = [], [], []
# 读取csv
with open(filename) as f:
reader = csv.reader(f)
rows = next(reader)
for row in reader:
nodes.append(int(row[0]))
force_x.append(float(row[1]))
force_y.append(float(row[2]))
force_z.append(float(row[3]))
a = mdb.models[model].rootAssembly
n1 = a.instances[instance].nodes # 模型中的所有节点
# 创建节点力
for i in range(len(nodes)):
node1 = n1.getFromLabel(nodes[i]) # 根据节点号获取节点对象
n = n1.index(node1) # 节点索引
nodes1 = n1[n:n+1] # 节点序列
region = regionToolset.Region(nodes=nodes1)
load = 'load_on_node_' + str(nodes[i]) # 节点力命名
mdb.models[model].ConcentratedForce(name=load,
createStepName=stepp, region=region,
cf1=force_x[i], cf2=force_y[i], cf3=force_z[i],
distributionType=UNIFORM, field='', localCsys=None)