工程师平台
Abaqus 实战2026-09-07

同一个名字,两个互不依赖的关键字

Johnson-Cook 这个名字在 Abaqus 里指两样东西:一个是塑性硬化模型,参数是 A、B、n、m; 另一个是失效准则,参数是 d1 到 d5。它们是两个互不依赖的块, 可以只用其中一个,也可以两个都用。麻烦在于两边都要填熔点和转变温度, 于是把 d1~d5 塞进硬化块、或者两个块的温度参数写得不一样,成了最常见的两种错法。 前者会被插件当场拦下,后者不报错、结果没意义。这篇把边界画清楚, 再顺手解释那个让很多人以为自己填错了的负号。
两个块,各自独立
plastic.hardening 为 JOHNSON_COOK 管硬化(A B n m),damage.johnsonCook 管失效(d1~d5),互不替代。
d1 和 d3 本来就是负的
插件对这 8 列一个校验都没做,因为负值在 JC 失效准则里完全合法 —— 这和韧性损伤的非负校验正好相反。
JC 失效不接温度列
源码把 _rows() 返回的温度标志直接丢弃了,因为温度已经是这个模型的显式参数。

01同一个名字,两个完全不同的块

先看一份把两者都用上的 JSON,边界一眼就清楚了:

"plastic": {
  "hardening": "JOHNSON_COOK",
  "A": 324, "B": 114, "n": 0.42, "m": 1.34,
  "meltingTemperature": 925,
  "transitionTemperature": 293,
  "rateDependent": { "type": "JOHNSON_COOK", "C": 0.002, "epsilonDot0": 1 }
},
"damage": {
  "johnsonCook": {
    "table": [[-0.77, 1.45, -0.47, 0, 1.6, 925, 293, 1]],
    "evolution": { "type": "ENERGY", "fractureEnergy": 15 }
  }
}
plastic 里的 JCdamage 里的 JC
管什么流动应力怎么随应变、应变率、温度变什么时候开始失效
参数A、B、n、m(+ C、epsilonDot0)d1 ~ d5
写法一堆键值对一张 8 列的表
温度参数也要
能单独用吗

两个块都能单独用。只要硬化:材料按 JC 本构变形,永不失效。只要失效:材料用别的硬化方式 (比如普通的应力—应变表),但用 JC 准则判断断裂。两者不是配套关系, 这一点在文献里经常被含混带过,因为论文往往同时标定两套参数。

最常见的错法:把 d1~d5 写进了 plastic
最常见的错法:把 d1d5 写进 plastic 块。 插件读 plastic 时不认识这些键,读 damage.johnsonCook 时又找不到表, 于是你会看到 missing key(s) 那条报错, 报错串的完整形状是 damage.johnsonCook: missing key(s) ...

02失效那张表的 8 列:顺序不能错

damage.johnsonCook 的表宽是 8,字段名和顺序由源码写死:

('d1', 'd2', 'd3', 'd4', 'd5',
 'meltingTemperature', 'transitionTemperature', 'referenceStrainRate')
字段名在 JC 失效准则里的角色
1d1基础项,常数项
2d2三轴度指数项的系数
3d3三轴度指数项的指数
4d4应变率修正项的系数
5d5温度修正项的系数
6meltingTemperature温度归一化的上端
7transitionTemperature温度归一化的下端
8referenceStrainRate应变率归一化的参考值
列名与顺序取自 materialImporterKernel.py 的 _addDamage() johnsonCook 分支

这 8 个数在示例库里写成一行,因为它们是一组常数而不是一条曲线 —— JC 失效准则本身就是个解析式,不需要用表去插值。真要写多行也不会报错, 但那不是这个模型的用法。

如果你只给了 7 个或 9 个数,插件的表宽校验会先响:

damage.johnsonCook: all rows must have the same length

或者在字段名对不上时给出 missing key(s)。 这类结构性报错和塑性表那边是同一套机制,塑性表那六种报错里逐条拆过。

03d1 是 -0.77,这不是笔误

示例库里 Al_6061_T6 的 JC 失效参数是这样的:

参数
d1-0.77
d21.45
d3-0.47
d40
d51.6
meltingTemperature925
transitionTemperature293
referenceStrainRate1
来自插件示例库 materials_sample.json,演示值,不是 6061-T6 的标定结论

d1d3 都是负的,d4 是 0。 很多人第一次看到会以为哪里抄错了、或者以为插件会拦。插件不拦 —— 而且这不是漏了校验,是刻意的。

看插件查不查,就知道那一列是不是物理量
源码里 ductileshear 两个分支都调用了_checkColumn(..., allowZero=True) 去查第一列非负, 而 johnsonCook 分支一次都没调。 理由很直接:那两个模型的第一列是断裂应变,负数没有物理意义; JC 的 d1~d5 是拟合系数,符号取决于拟合,负号是常态。

这个对比很好用 —— 看插件查不查,就知道那一列是不是物理量。 四个损伤模型的校验策略差异,在剪切损伤与 FLD那篇里有一张完整对照表。

这篇讲的是怎么填,不负责给你参数。如果你要的是现成的一组数, 站内单独有一个 Johnson-Cook 参数库, 那里按材料列了完整的硬化和失效参数、以及每组数的适用范围和出处。 两处配合着看:参数库解决"填什么",这篇解决"填在哪、为什么报错"。

d4 写 0 的含义也值得说一句:它是应变率修正项的系数,写 0 就是关掉失效准则里的应变率相关性。注意这和塑性块里的rateDependent 是两件事 —— 失效不看应变率,不等于流动应力也不看。 示例库正好演示了这种组合:塑性块的 C 是 0.002(有率相关), 失效块的 d4 是 0(率无关)。

04两个块的温度参数必须对齐

示例库里两个块的温度参数是一样的:熔点 925、转变温度 293。这不是巧合, 也不是插件强制的 —— 插件把两个块分别传给 Abaqus 的两个关键字,不会替你比对。写得不一致,导入照样成功。

写在哪熔点转变温度
plastic(硬化)925293
damage.johnsonCook(失效)925293
示例库 Al_6061_T6,两处一致

为什么必须一致?因为 JC 的硬化式和失效式里,温度都是以同一个归一化温度的形式出现的:当前温度减去转变温度, 再除以熔点减去转变温度。两个块用了不同的端点,就等于同一个物理温度在两处被折算成了 不同的归一化值,材料会一边"觉得自己很热"、一边"觉得自己还凉"。

两处不一致不会报错,只是曲线悄悄不对
两处不一致不会报任何错,也不会在结果里表现为明显异常, 只是曲线悄悄不对。JSON 里这两对数离得很远(一个在 plastic,一个在 damage 的表里第 6、7 位), 改参数时特别容易只改一处。

关于温标:示例里转变温度是 293,熔点是 925。293 只有当成开氏温度才是室温, 所以这份示例用的是绝对温标。不过 JC 里这两个温度只以差值比的形式出现, 真正要紧的不是选哪套温标,而是它和模型里的温度场、以及绝对零度的设定必须是同一套。 混着用(材料参数按开氏、初始温度场按摄氏)是不报错的另一种错法。

顺带一提:JC 失效表不接受温度列。源码里那一行是table, _ = _rows(...) —— _rows() 返回的温度相关标志被下划线丢掉了。 其他三个损伤模型都接收并使用了这个标志。原因也说得通:温度已经是 JC 的显式参数 (第 6、7 列),再叠一层温度插值就重复了。所以这里千万别按温度相关表那篇的套路多加一列, 那会被表宽校验拦下来。

05硬化那边的 A B n m 和 rateDependent

示例库 Al_6061_T6 的硬化参数(同样是演示值):

参数含义
A324初始屈服应力,量纲是应力
B114硬化模量,量纲是应力
n0.42硬化指数,无量纲
m1.34温度软化指数,无量纲
C0.002应变率敏感系数,无量纲
epsilonDot01参考应变率

AB 带应力量纲,所以它们跟着单位制走。 毫米—吨—秒制下应力单位是 MPa,324 就是 324 MPa;换成米—千克—秒制, 这两个数要改成 3.24e8 和 1.14e8。整套换算关系在单位制那篇里。nmC 无量纲,不用动。

epsilonDot0 和失效表第 8 列的 referenceStrainRate是两个不同的参数,尽管示例里都写了 1、名字也像。 前者归一化硬化式里的应变率,后者归一化失效式里的应变率。 标定时它们可以取不同的值,插件也不会替你对齐 —— 但如果你的数据来自同一组试验, 通常就该一致。

hardening 的值必须是 Abaqus 认识的常量名
hardening 的值必须是 Abaqus 认识的常量名。写错大小写或拼写, 会拿到 unknown Abaqus constant "..." 这条报错 —— 它出自插件的常量解析函数,凡是需要填 Abaqus 常量的地方(hardeningsofteningdegradation、 evolution 的 type)都可能触发。

06evolution 用 ENERGY 时字段名会换

示例库给 Al_6061_T6 配的演化是能量型:

"evolution": { "type": "ENERGY", "fractureEnergy": 15 }

注意字段名。插件按 type 决定读哪个键:

type要读的字段名量纲
DISPLACEMENT(默认)displacementAtFailure长度
ENERGYfractureEnergy能量 / 面积

写了 ENERGY 却填 displacementAtFailure,报错会很反直觉。 插件的逻辑是:先看有没有 table 或者当前 type 对应的那个字段名, 两者都没有,才回头去找一个叫 value 的兜底字段。 所以这种情况下你会看到它抱怨缺 value,而不是缺 fractureEnergy

damage.johnsonCook.evolution: missing key(s) value

看到这条串别去找 value 该怎么加 —— 真正要改的是把字段名和type 配套。当然直接写 "value": 15 也确实能跑, 因为两种类型都接受这个兜底名,示例库的 Steel_Q345 用的就是它。

这个 15 的量纲是单位面积断裂能,在毫米—吨—秒制下是 mJ/mm², 数值上等于 N/mm。选能量型的好处是网格细化时结果收敛, 这一点和位移型的对比在韧性损伤那篇的第 5 节讲得更细, 示例库里 Steel_Q345 用的正是位移型,可以对着看。

另外,演化值必须大于 0。这一处的校验没带允许零的参数, 写 0 会报 must be positive

07提交前照着过一遍

  1. d1~d5 在 damage.johnsonCook 里,A / B / n / m 在 plastic 里, 没有互串。
  2. 失效表一行正好 8 个数,顺序是 d1 d2 d3 d4 d5 熔点 转变温度 参考应变率。
  3. 失效表没有第 9 列 —— JC 失效不接温度列。
  4. 两个块的熔点和转变温度逐个对齐;改参数时两处一起改。
  5. 温度参数、初始温度场、绝对零度设定用同一套温标(示例用的是绝对温标)。
  6. A 和 B 的数值和整套模型的单位制一致;n、m、C 无量纲不用换。
  7. evolutiontype 和字段名配套:ENERGY 配fractureEnergy,DISPLACEMENT 配 displacementAtFailure, 或者两者都用 value;值大于 0。
  8. 导入后对着 JSON 字段说明核一遍层级; 材料整个没生效就看材料没生效那篇
把两个块写在相邻位置
两处温度参数对齐这一条,最省事的做法是在 JSON 里把两个块写在相邻位置, 别让 plastic 在文件开头、damage 在文件结尾。改的时候一眼就能看到另一处。

常见问题

Johnson-Cook 塑性和 Johnson-Cook 失效必须一起用吗?

不必须。它们是两个互不依赖的块。可以只用 JC 硬化让材料按 JC 本构变形而永不失效,也可以用普通的应力应变表做硬化、只用 JC 准则判断断裂。文献里常常同时给出两套参数,容易让人以为是配套的,其实插件和 Abaqus 都把它们当两个独立对象处理。

d1 是负数,是不是抄错了?

不是。d1 到 d5 是拟合系数,符号取决于拟合结果,负号很常见。插件示例库里 Al_6061_T6 的 d1 是 -0.77、d3 是 -0.47,都是负的。插件对这 8 列一个校验都没做,而对韧性损伤和剪切损伤的第一列都要求非负,因为那两列是断裂应变,负数没有物理意义。看插件查不查,就能判断那一列是物理量还是拟合系数。

两个块里的熔点和转变温度写得不一样会怎样?

不会报错,导入照样成功,但结果没有意义。JC 的硬化式和失效式都用当前温度减转变温度再除以熔点减转变温度做归一化,两处端点不同,等于同一个物理温度在两处被折算成不同的归一化值。因为这两对数在 JSON 里离得很远,改参数时容易只改一处,建议把两个块写在相邻位置。

JC 失效表能加温度列吗?

不能。插件源码读这张表时把温度相关标志直接丢弃了,其他三个损伤模型都保留并使用了它。原因是温度已经是 JC 失效准则的显式参数,在表的第 6、7 列,再叠一层温度插值就重复了。如果你按温度相关表的习惯多加一列,会被表宽校验拦下来,报 all rows must have the same length。

epsilonDot0 和 referenceStrainRate 是同一个参数吗?

不是。epsilonDot0 在 plastic 的 rateDependent 里,归一化硬化式中的应变率;referenceStrainRate 是失效表的第 8 列,归一化失效式中的应变率。示例库里两者都写了 1,名字也像,但概念不同,标定时可以取不同值,插件不会替你对齐。如果两组数据来自同一批试验,通常应该一致。

d4 写 0 是什么意思?

d4 是失效准则里应变率修正项的系数,写 0 就是关掉失效对应变率的敏感性。这和塑性块里的 rateDependent 是两件事:失效不看应变率,不等于流动应力也不看。示例库正好演示了这种组合,塑性块的 C 是 0.002 有率相关,失效块的 d4 是 0 率无关。

这一步可以不自己做

把 plastic 和 damage 两个块在 JSON 里写成相邻位置 —— 熔点和转变温度要对齐两处,离得远就一定会漏改一处。

在线材料库需要 Abaqus 2023 或更高版本;2022 及更早只能用本地 JSON 材料库。