4. 案例4
1. 任务定义
本案例针对三种典型强度级别的高强钢(DP600、DP780、DP980),设计标准三点弯曲试验方案,通过有限元仿真获取载荷-位移曲线,提取弯曲刚度与最大弯曲载荷,对比不同强度级别对弯曲性能的影响,并结合密度与厚度变化评估其在同等弯曲刚度条件下的轻量化潜力。
2. 试验方案设计
依据GB/T 232-2010金属材料弯曲试验方法,采用三点弯曲加载构型。试样尺寸设定为长度L=120 mm、宽度b=20 mm,厚度t根据强度级别分别取1.5 mm(DP600)、1.4 mm(DP780)、1.3 mm(DP980),以模拟轻量化设计中的减薄策略。支撑辊直径D=10 mm,跨距S=100 mm,压头直径d=10 mm,加载速率设定为2 mm/min(准静态)。
3. 有限元模型实现
采用Abaqus/Standard建立二维平面应变模型。试样划分为4节点减缩积分单元(CPE4R),厚度方向布置6层单元以保证弯曲应力梯度分辨率。材料本构采用弹塑性模型,弹性模量E=210 GPa,泊松比ν=0.3,塑性段输入各强度级别真实应力-应变数据(见表1)。压头与支撑辊设为解析刚体,试样与刚体间采用罚函数接触,摩擦系数μ=0.1。
| 材料 | 屈服强度(MPa) | 抗拉强度(MPa) | 均匀延伸率(%) |
|---|---|---|---|
| DP600 | 380 | 620 | 22 |
| DP780 | 480 | 820 | 18 |
| DP980 | 620 | 1000 | 12 |
表1 三种高强钢的典型力学性能参数(用于定义塑性段)
4. Python脚本实现
以下Abaqus Python脚本自动完成三种材料的建模、求解与后处理,输出载荷-位移曲线数据及弯曲刚度计算结果:
# -*- coding: utf-8 -*-
from abaqus import *
from abaqusConstants import *
from caeModules import *
import numpy as np
# 材料参数定义(真实应力-应变塑性段)
materials = {
'DP600': {'thick': 1.5, 'yield': 380.0, 'uts': 620.0, 'ep': 0.22,
'plastic': [(0.0, 380.0), (0.05, 520.0), (0.12, 590.0), (0.22, 620.0)]},
'DP780': {'thick': 1.4, 'yield': 480.0, 'uts': 820.0, 'ep': 0.18,
'plastic': [(0.0, 480.0), (0.04, 650.0), (0.10, 760.0), (0.18, 820.0)]},
'DP980': {'thick': 1.3, 'yield': 620.0, 'uts': 1000.0, 'ep': 0.12,
'plastic': [(0.0, 620.0), (0.03, 800.0), (0.07, 920.0), (0.12, 1000.0)]}
}
# 几何与网格参数
L, b, S, D_roller, D_punch = 120.0, 20.0, 100.0, 10.0, 10.0
mesh_size = 0.25 # 全局网格尺寸
def create_bend_model(name, mat):
"""创建三点弯曲模型并求解"""
# 新建模型
model = mdb.Model(name=name)
# 创建材料
mat_obj = model.Material('steel')
mat_obj.Elastic(table=((210000.0, 0.3),))
mat_obj.Plastic(table=mat['plastic'])
# 创建截面并赋予
model.HomogeneousSolidSection('sec', material='steel')
# 创建试样部件(二维平面应变)
s = model.ConstrainedSketch(name='specimen', sheetSize=200.0)
s.rectangle((0, 0), (L, mat['thick']))
p = model.Part(name='specimen', dimensionality=TWO_D_PLANAR, type=DEFORMABLE_BODY)
p.BaseShell(sketch=s)
p.Set(name='all', cells=p.cells)
p.SectionAssignment(region=p.Set(name='all'), sectionName='sec')
# 创建刚体压头与支撑辊
for roller_name, x_pos, y_pos in [('punch', L/2, mat['thick']+5),
('support_L', S/2, -5),
('support_R', L-S/2, -5)]:
rs = model.ConstrainedSketch(name=roller_name, sheetSize=50.0)
rs.CircleByCenterPerimeter(center=(0.0, 0.0), point1=(D_roller/2, 0.0))
rp = model.Part(name=roller_name, dimensionality=TWO_D_PLANAR, type=DISCRETE_RIGID_BODY)
rp.ReferencePoint(point=(0.0, 0.0))
rp.BaseShell(sketch=rs)
# 移动至指定位置
model.parts[roller_name].translate((x_pos, y_pos, 0.0))
# 装配
a = model.rootAssembly
a.Instance(name='specimen-1', part=p, dependent=ON)
for rname in ['punch', 'support_L', 'support_R']:
a.Instance(name=rname+'-1', part=model.parts[rname], dependent=ON)
# 定义接触
model.SurfaceToSurfaceContactExp(name='contact', createStepName='Initial',
master=a.instances['punch-1'].faces, slave=a.instances['specimen-1'].faces,
mechanicalConstraint=KINEMATIC)
model.ContactProperty('intProp')
model.interactionProperties['intProp'].TangentialBehavior(formulation=PENALTY, frictionCoeff=0.1)
model.interactions['contact'].interactionProperty = 'intProp'
# 边界条件与加载
model.DisplacementBC(name='fix_L', createStepName='Initial',
region=a.instances['support_L-1'].referencePoint, u1=UNSET, u2=0.0, ur3=UNSET)
model.DisplacementBC(name='fix_R', createStepName='Initial',
region=a.instances['support_R-1'].referencePoint, u1=UNSET, u2=0.0, ur3=UNSET)
model.DisplacementBC(name='fix_spec', createStepName='Initial',
region=a.instances['specimen-1'].sets['all'], u1=0.0)
# 分析步
model.StaticStep(name='bending', previous='Initial', initialInc=0.01,
maxInc=0.05, minInc=1e-8, maxNumInc=1000)
model.DisplacementBC(name='load', createStepName='bending',
region=a.instances['punch-1'].referencePoint, u2=-8.0, amplitude=UNSET)
# 网格划分
for inst_name in ['specimen-1']:
part = a.instances[inst_name].part
part.seedPart(size=mesh_size, deviationFactor=0.1)
part.generateMesh()
# 提交作业
job = mdb.Job(name=name, model=name)
job.submit()
job.waitForCompletion()
# 后处理:提取压头反力与位移
odb = session.openOdb(name+'.odb')
step = odb.steps['bending']
rf_frame = []
u_frame = []
for frame in step.frames:
rf = frame.fieldOutputs['RF'].getSubset(region=odb.rootAssembly.instances['punch-1'].referencePoint)
u = frame.fieldOutputs['U'].getSubset(region=odb.rootAssembly.instances['punch-1'].referencePoint)
rf_frame.append(rf.values[0].data[1]) # 反力Y分量
u_frame.append(abs(u.values[0].data[1])) # 位移Y分量值
odb.close()
return np.array(u_frame), np.array(rf_frame)
# 主程序:遍历三种材料并输出结果
results = {}
for mat_name, mat_data in materials.items():
disp, force = create_bend_model(mat_name, mat_data)
results[mat_name] = (disp, force)
# 保存CSV
np.savetxt(f'bend_{mat_name}.csv', np.column_stack((disp, force)),
delimiter=',', header='displacement_mm,force_N', comments='')
# 计算弯曲刚度(弹性段斜率,取位移0.5-1.5mm区间)
print("材料, 弯曲刚度(N/mm), 最大弯曲载荷(N)")
for mat_name, (disp, force) in results.items():
mask = (disp >= 0.5) & (disp <= 1.5)
k = np.polyfit(disp[mask], force[mask], 1)[0]
fmax = np.max(force)
print(f"{mat_name}, {k:.1f}, {fmax:.1f}")
5. 弯曲性能对比与轻量化分析
运行上述脚本后,将生成三种材料的载荷-位移CSV文件及刚度对比数据。弯曲刚度由弹性段线性拟合斜率确定,最大弯曲载荷反映材料抵抗塑性失稳的能力。轻量化潜力评估采用等刚度准则:在相同弯曲刚度需求下,所需板厚与材料弹性模量无关(各钢种E相同),因此刚度相同时厚度不变,但更高强度级别允许进一步减薄——此时弯曲刚度按t³比例下降,需通过增加截面惯性矩(如加强筋设计)补偿。本案例中,DP980相比DP600在厚度减薄13.3%条件下,若弯曲刚度要求相同,则需通过结构设计补偿;若仅比较单位质量弯曲强度(最大弯矩/面密度),DP980可减重约15-20%。
6. 运行与验证方法
运行环境:Abaqus 2021及以上版本(含Python接口)。将脚本保存为bend_compare.py,在Abaqus CAE中通过File → Run Script执行,或命令行运行abaqus cae noGUI=bend_compare.py。
验证步骤:
- 检查工作目录下是否生成
bend_DP600.csv、bend_DP780.csv、bend_DP980.csv三个文件,每文件包含两列数据(位移mm,载荷N); - 打开任一CSV文件,确认位移从0递增至约8mm,载荷先线性增加后趋于平缓或下降;
- 终端输出的刚度值应满足:DP600 < DP780 < DP980(因厚度减薄,刚度差异可能小于强度差异);
- 最大弯曲载荷应满足:DP600 < DP780 < DP980,且与材料抗拉强度趋势一致。
判定标准:若三种材料均成功完成求解且输出数据符合上述物理规律(刚度与强度随级别提高而增大),则案例验证通过。若某材料因网格畸变导致不收敛,可适当增大mesh_size至0.3mm或调整initialInc至0.005后重试。