目录
一、需求
希望根据节点编号,对模型中不同节点施加不同大小的载荷,通过csv表格的形式批量加载。
利用abaqus自身的IDE。
二、功能实现
2.1 读取csv表格数据
按如下格式准备好需要导入的节点编号和集中载荷数据。第一列为节点编号,第二列至第四列为节点力的三个方向大小。
将csv中的数据存入列表, 代码如下:
import csv
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]))
2.2 根据节点编号获取节点对象
主要是采用getFromLabel方法,官方介绍如下图:
代码如下,这时node1就是编号为100的节点在模型中的MeshNode对象。但是到这里还不能直接对此加载,因为创建集中力需要Sequence对象,而不是MeshNode对象。
# 获取模型对象,这里'model'为当前模型的名称
a = mdb.models['model'].rootAssembly
# 获取模型中的所有节点,这里'instance'为当前部件名称
n1 = a.instances['instance'].nodes
# 根据节点号获取节点对象,这里100为节点编号
node1 = n1.getFromLabel(100)
2.3 创建集中力
创建集中力之前需要创建分析步step,然后在分析步中创建集中力。接着2.2中所说,需要将MeshNode对象转换为对应的Sequence对象:首先用index方法获得该节点的索引号,然后创建一个只有该节点的切片,见下面代码中的nodes1,最后再是创建ConcentratedForce。代码如下:
# 创建一个名为'step-1'的分析步
s= mdb.models['model'].StaticStep(name='step-1', previous='Initial')
# 创建节点力
n = n1.index(node1) # 获得节点索引
nodes1 = n1[n:n+1] # 获得节点序列
region = regionToolset.Region(nodes=nodes1)
# 创建名为'load-1',大小为(0,0,1)的集中力
mdb.models[model].ConcentratedForce(name='load-1',
createStepName='step-1', region=region,
cf1=0.0, cf2=0.0, cf3=1.0,
distributionType=UNIFORM, field='', localCsys=None)
三、总结
主要的流程为,根据节点编号获取节点对象,然后获取节点索引号,得到节点序列,最后对该节点创建集中力。完整代码如下:
# -*- coding: utf-8 -*-
from abaqus import*
from abaqusConstants import*
from caeModules import *
import csv
filename = 'n.csv' # csv文件名
model = 'model-2' # 模型名称
stepp = 'Step-test' # 分析步名称
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
s= mdb.models[model].StaticStep(name=stepp, previous='Initial') # 创建分析步
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)
print(str(len(nodes))+' ConcentratedForce created on ' + stepp)