---
name: abaqus-explicit-analysis
description: Abaqus/Explicit 显式动力学分析专用技能。覆盖跌落、冲击、爆炸、成形等瞬态非线性问题。包含建模要点、材料/单元/接触设置、稳定性控制、能量平衡验证和常见坑点排查。
metadata:
openclaw:
emoji: 💥
version: 1.1.0
created: 2026-04-25
updated: 2026-04-25
domain: 有限元分析/显式动力学
tags:
> 官方文档: https://www.3ds.com/products/simulia/abaqus/explicit
> Abaqus/Explicit 是显式动力有限元求解器,适合模拟高速瞬态和高度非线性事件。
.cae / .jnl 转换为可重复运行的 Python 脚本| 场景 | 推荐单元 | 说明 |
|---|---|---|
| ------ | --------- | ------ |
| 薄壁结构(厚度/特征尺寸 < 1/10) | S4R / S3R 壳单元 | 本案例类型,2mm板厚 vs 1m尺寸 |
| 实体结构 | C3D8R 六面体 / C3D10M 四面体 | 大变形推荐 C3D8R |
| 刚体部件 | 壳/实体 + RigidBody 约束 | 如本例中的地面 |
| 超弹性/橡胶 | C3D8RH(杂交) | 不可压缩材料必须杂交 |
关键规则:显式分析中,避免使用二阶单元(如 C3D20、S8R),一阶减缩积分单元(C3D8R、S4R)是首选。
# 显式网格种子设置
part.seedPart(deviationFactor=0.1, minSizeFactor=0.1, size=0.02)
part.setMeshControls(elemShape=QUAD, technique=STRUCTURED)
part.generateMesh()
# 单元类型(显式库)
part.setElementType(
elemTypes=(
ElemType(elemCode=S4R, elemLibrary=EXPLICIT, hourglassControl=DEFAULT),
ElemType(elemCode=S3R, elemLibrary=EXPLICIT) # 自动三角过渡
),
regions=...
)
网格尺寸估算公式:
稳定时间步长 dt ≈ L_min / c
其中: L_min = 最小单元特征长度
c = sqrt(E/rho) = 材料波速(钢约 5000 m/s)
对钢材,0.02m 网格 ≈ 3μs 稳定步长,0.02s 分析需 ~7000 步。
显式分析中材料定义必须包含密度,否则无法计算惯性力:
mat = model.Material(name='DQSK36')
mat.Density(table=((7850.0, ), )) # 必须先定义密度
mat.Elastic(table=((207e9, 0.28), )) # 弹性模量 + 泊松比
mat.Plastic(table=( # 塑性数据
(154.31e6, 0.0), (221.76e6, 0.02), # (屈服应力, 塑性应变)
...
))
塑性数据注意:
(屈服应力, 0.0)model.HomogeneousShellSection(
material='DQSK36', name='Section-1',
thickness=0.002, # 壳厚
numIntPts=5, # Simpson 积分点数(推荐5)
integrationRule=SIMPSON
)
将不需要变形的部件设为刚体可大幅减少计算量:
# 先创建参考点
rp = assembly.instances['Part-Ground-1'].InterestingPoint(
assembly.instances['Part-Ground-1'].edges[4], CENTER)
assembly.ReferencePoint(point=rp)
# 设为刚体
model.RigidBody(
name='Rigid-Ground',
bodyRegion=Region(faces=...),
refPointRegion=Region(referencePoints=(refPoint, ))
)
# 约束参考点
model.EncastreBC(name='BC-1', createStepName='Initial',
region=Region(referencePoints=(refPoint, )))
⚠️ 警告:刚体部件不会输出积分点变量(应力、应变)。如果后处理需要看刚体的应力,不要设为刚体。
model.ExplicitDynamicsStep(
name='Step-1', previous='Initial',
timePeriod=0.02, # 物理时间(秒)
maxIncrement=0.0005 # 最大增量步(可选)
)
时间步选择:
# 场输出(云图用)
model.fieldOutputRequests['F-Output-1'].setValues(
numIntervals=50, # 输出帧数
variables=('S', 'PE', 'PEEQ', 'LE', 'U', 'V', 'A', 'CFORCE', 'STH')
)
# 历史输出(曲线/能量用)
model.historyOutputRequests['H-Output-1'].setValues(
variables=('ALLAE', 'ALLCD', 'ALLDC', 'ALLDMD', 'ALLFD', 'ALLIE',
'ALLKE', 'ALLPD', 'ALLSE', 'ALLVD', 'ALLWK', 'ALLCW',
'ALLMW', 'ALLPW', 'ETOTAL')
)
关键字段说明:
| 变量 | 含义 | 用途 |
|---|---|---|
| ------ | ------ | ------ |
S | 应力 | 查看应力分布 |
PEEQ | 等效塑性应变 | 判断永久变形程度 |
ALLKE | 总动能 | 观察速度衰减 |
ALLIE | 总内能 | 观察能量吸收 |
ALLAE | 伪应变能 | 沙漏控制指标 |
ETOTAL | 总能量 | 能量守恒验证 |
ALLFD | 摩擦耗散能 | 有摩擦接触时检查 |
ALLVD | 粘性耗散能 | 阻尼相关 |
# 创建接触属性
model.ContactProperty('IntProp-1')
model.interactionProperties['IntProp-1'].TangentialBehavior(
formulation=FRICTIONLESS # 或 PENALTY + frictionCoefficient=0.2
)
# 可选法向行为
# model.interactionProperties['IntProp-1'].NormalBehavior(
# pressureOverclosure=HARD, allowSeparation=ON,
# constraintEnforcementMethod=DEFAULT
# )
# 创建通用接触
model.ContactExp(createStepName='Step-1', name='Int-1')
model.interactions['Int-1'].includedPairs.setValuesInStep(
stepName='Step-1', useAllstar=ON)
model.interactions['Int-1'].contactPropertyAssignments.appendInStep(
assignments=((GLOBAL, SELF, 'IntProp-1'), ), stepName='Step-1'
)
摩擦系数参考:
| 接触对 | 摩擦系数 |
|---|---|
| -------- | --------- |
| 钢-钢(干) | 0.3~0.6 |
| 钢-钢(润滑) | 0.05~0.15 |
| 钢-混凝土 | 0.4~0.7 |
| 钢-橡胶 | 0.5~1.0 |
| 自接触 | 0.1~0.3 |
运行时常遇到初始过闭合警告:
***WARNING: There are 68 initial node-face overclosures.
***WARNING: 36 secondary nodes are coincident with reference plane.
***WARNING: 546 surface intersections detected.
处理策略:
*CONTACT CLEARANCE ASSIGNMENT对于可能发生自折叠的结构(如薄板冲击后翻折),需启用自接触:
model.ContactExp(createStepName='Step-1', name='SelfContact')
model.interactions['SelfContact'].includedPairs.setValuesInStep(
stepName='Step-1', useAllstar=ON)
model.interactions['SelfContact'].contactPropertyAssignments.appendInStep(
assignments=((SELF, SELF, 'IntProp-1'), ), stepName='Step-1'
)
显式分析中初速度是最常用的加载方式(模拟自由落体、冲击等):
model.Velocity(
name='Velocity-Box',
region=Region(
faces=..., edges=..., vertices=... # 必须指定整个部件
),
velocity1=0.0, velocity2=-10.0, velocity3=0.0, # Vx, Vy, Vz
distributionType=MAGNITUDE
)
⚠️ 注意:Velocity 载荷的 region 必须覆盖部件的所有面、边、顶点,否则未被覆盖的节点初速度为零,会导致内部应力波。
model.Gravity(createStepName='Step-1', name='Gravity',
comp1=0.0, comp2=-9.81, comp3=0.0, distributionType=UNIFORM)
初速度 vs 重力:
mdb.Job(
name='Job-Explicit-Drop', model='Model-1',
numCpus=4, # 根据实际 CPU 核心数调整
numDomains=4, # 通常等于 numCpus
parallelizationMethodExplicit=DOMAIN,
explicitPrecision=SINGLE, # 单精度(显式推荐)
nodalOutputPrecision=SINGLE,
multiprocessingMode=DEFAULT,
memory=90, memoryUnits=PERCENTAGE
)
关键决策:
explicitPrecision=SINGLE:显式分析用单精度足够,双精度会显著增加内存和时间numCpus:不要超过物理核心数,超线程不会提升显式计算性能mdb.jobs['Job-Explicit-Drop'].submit(consistencyChecking=OFF)
mdb.jobs['Job-Explicit-Drop'].waitForCompletion()
# 在 Abaqus/CAE 中检查:
# Result -> History Output -> ETOTAL
# 曲线应该基本水平(允许 ±5% 波动)
判断标准:
ETOTAL 变化 < 5%:结果可信ETOTAL 变化 5~10%:可接受,但需谨慎解读ETOTAL 变化 > 10%:结果不可信,需检查接触/网格# ALLAE / ALLIE < 5% 优秀
# ALLAE / ALLIE < 10% 可接受
# ALLAE / ALLIE > 10% 需改进
如果沙漏能过高:
# 修改单元类型,增加沙漏控制
ElemType(elemCode=C3D8R, elemLibrary=EXPLICIT, hourglassControl=ENHANCED)
# 或使用 C3D8I(完全积分,无沙漏但计算量大)
在后处理中检查接触面是否有异常穿透(一个部件穿入另一个部件)。正常穿透量应 < 单元尺寸的 10%。
# 在 .sta 文件中检查 STABLE INCREMENT
# 如果稳定步长剧烈波动,可能意味着:
# 1. 单元畸变严重
# 2. 接触状态频繁变化
# 3. 材料软化导致波速降低
现象:分析不报错,但结果全为零或无意义
原因:显式分析基于 F=ma,没有密度就没有惯性力
解决:材料定义中必须包含 Density
现象:计算时间极长,结果末尾出现大量数值噪声
原因:显式是条件稳定的,分析时间越长,总步数越多
解决:只计算关心的物理时间段,用多个分析步分段
现象:结果出现异常应力波,从内部向外扩散
原因:Velocity 载荷的 region 未覆盖所有节点
解决:region 必须包含 faces + edges + vertices
现象:部件直接穿过彼此,无接触力
原因:ContactExp 的 createStepName 与实际分析步不匹配
解决:确保接触在需要它的分析步开始时激活
现象:接触只在单侧生效,或应力分布异常
原因:壳单元的 SNEG/SPOS 面方向定义错误
解决:在 CAE 中 Display -> Part Display Options -> Show normals 检查法向
现象:计算极慢,.sta 文件中时间步长异常小
原因:局部网格过密,成为限制步长的瓶颈
解决:统一网格尺寸,或用 seedEdgeByNumber 而非 seedEdgeBySize
现象:后处理中刚体部件没有应力/应变云图
原因:刚体不参与变形计算,自然没有应力结果
解决:如果确实需要看应力,不要设为刚体;如果只是为了减少计算量但又要看结果,改用 *RIGID BODY, PINNED 只约束自由度
以下是标准的显式分析 Python 脚本结构:
# -*- coding: mbcs -*-
"""Abaqus/Explicit Analysis Script Template"""
from abaqus import *
from abaqusConstants import *
from part import *
from material import *
from section import *
from assembly import *
from step import *
from interaction import *
from load import *
from mesh import *
from job import *
# 1. 创建模型
mdb.Model(name='Explicit-Model')
model = mdb.models['Explicit-Model']
# 2. 创建零件(几何/网格)
# ... Part creation and meshing ...
# 3. 定义材料
mat = model.Material(name='Material-1')
mat.Density(table=((rho, ), ))
mat.Elastic(table=((E, nu), ))
mat.Plastic(table=plastic_data)
# 4. 定义截面并分配
model.HomogeneousShellSection(material='Material-1', name='Section-1',
thickness=t, numIntPts=5)
# 5. 装配
# ... Instance creation and positioning ...
# 6. 定义分析步
model.ExplicitDynamicsStep(name='Step-1', previous='Initial',
timePeriod=time_period)
# 7. 输出请求
model.fieldOutputRequests['F-Output-1'].setValues(
numIntervals=num_frames, variables=('S', 'PEEQ', 'U', 'V'))
model.historyOutputRequests['H-Output-1'].setValues(
variables=('ALLKE', 'ALLIE', 'ALLAE', 'ETOTAL'))
# 8. 接触
model.ContactProperty('IntProp-1')
model.interactionProperties['IntProp-1'].TangentialBehavior(formulation=FRICTIONLESS)
model.ContactExp(createStepName='Step-1', name='Int-1')
model.interactions['Int-1'].includedPairs.setValuesInStep(stepName='Step-1', useAllstar=ON)
model.interactions['Int-1'].contactPropertyAssignments.appendInStep(
assignments=((GLOBAL, SELF, 'IntProp-1'), ), stepName='Step-1')
# 9. 边界条件与加载
# ... BC and loads ...
# 10. 作业提交
mdb.Job(name='Job-1', model='Explicit-Model', numCpus=num_cpus,
numDomains=num_cpus, explicitPrecision=SINGLE,
parallelizationMethodExplicit=DOMAIN)
mdb.jobs['Job-1'].submit(consistencyChecking=OFF)
mdb.jobs['Job-1'].waitForCompletion()
# 在 Abaqus/CAE 命令行或脚本中使用
from viewerModules import *
odb = session.openOdb(name='Job-1.odb')
vp = session.viewports['Viewport: 1']
vp.setValues(displayedObject=odb)
# Mises 应力
vp.odbDisplay.setPrimaryVariable(variableLabel='S', outputPosition=INTEGRATION_POINT,
refinement=(INVARIANT, 'Mises'))
vp.odbDisplay.display.setValues(plotState=(CONTOURS_ON_DEF, ))
# 等效塑性应变
vp.odbDisplay.setPrimaryVariable(variableLabel='PEEQ', outputPosition=INTEGRATION_POINT)
# 能量历史曲线
xy1 = session.XYDataFromHistory(name='ALLKE', odb=odb,
outputVariableName='Kinetic energy: ALLKE for Whole Model')
xy2 = session.XYDataFromHistory(name='ALLIE', odb=odb,
outputVariableName='Internal energy: ALLIE for Whole Model')
xy3 = session.XYDataFromHistory(name='ETOTAL', odb=odb,
outputVariableName='Total energy: ETOTAL for Whole Model')
session.XYPlot('Energy History')
session.curves['Energy History'].addData(xy1, xy2, xy3)
# 截图
session.printToFile(fileName='result', format=PNG,
canvasObjects=(vp, ))
Explicit-Drop.cae / Explicit-Drop-Script.py共 1 个版本