控制面积和提取反力其实是一回事,控制面积就是单位压强下的反力,在那个充满代码与灵感的CSDN平台上,我找到了两位大佬分享的源码,它们如同散落的珍珠,闪烁着智慧的光芒。
我将这些珍贵的代码片段小心翼翼地组合起来,并融入了自己的一些理解与合并工作,仿佛在进行一场精密的乐高积木搭建,每一块都承载着前人的经验与创新的火花。批量施加集中力的思路,我参考了“利用python对abaqus模型批量加载集中力载荷_abaqus集中力怎么加载_整天不学习的博客-CSDN博客”这篇文章,它像一盏明灯,照亮了批量操作的路径。
至于批量提取反力的网页,我却有些模糊了记忆,只记得它可能来自某乎上一篇深入浅出的技术文章,字里行间充满了工程师们交流的温度。
如果哪位大佬看到了相关内容并觉得我无意中引用了您的作品,请一定提醒我,我会怀着感激与尊重之心及时处理

这方面文献很多,但是大部分课题组发表的文章中都不会包含子程序的源码,这能理解但是对于我个人而言就还是需要再去学习这部分知识。简单来说就是走了很多别人已经走过的老路。我觉得大可不必,所以我将自己总结出来的源码放在下面希望可以帮到同做地下结构抗震数值模拟的各位。
下面是我合并后的源码(部分变量与注释未修改,有 python 基础的可以自行修改以便于提取不同数据):
from odbAccess import openOdbfrom textRepr import *from abaqus import*from abaqusConstants import*from caeModules import *import csvimport 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模块中找到,并赋予给变量NodeSetNodeSetX = 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) # 在每一行的末尾添加0for 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) # 在每一行的末尾添加0for 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 = [], [], [] # 读取csvwith 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].rootAssemblyn1 = 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 = [], [], [] # 读取csvwith 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].rootAssemblyn1 = 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)
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删