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 里的 JC | damage 里的 JC | |
|---|---|---|
| 管什么 | 流动应力怎么随应变、应变率、温度变 | 什么时候开始失效 |
| 参数 | A、B、n、m(+ C、epsilonDot0) | d1 ~ d5 |
| 写法 | 一堆键值对 | 一张 8 列的表 |
| 温度参数 | 要 | 也要 |
| 能单独用吗 | 能 | 能 |
两个块都能单独用。只要硬化:材料按 JC 本构变形,永不失效。只要失效:材料用别的硬化方式 (比如普通的应力—应变表),但用 JC 准则判断断裂。两者不是配套关系, 这一点在文献里经常被含混带过,因为论文往往同时标定两套参数。
d1 到 d5 写进 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 失效准则里的角色 |
|---|---|---|
| 1 | d1 | 基础项,常数项 |
| 2 | d2 | 三轴度指数项的系数 |
| 3 | d3 | 三轴度指数项的指数 |
| 4 | d4 | 应变率修正项的系数 |
| 5 | d5 | 温度修正项的系数 |
| 6 | meltingTemperature | 温度归一化的上端 |
| 7 | transitionTemperature | 温度归一化的下端 |
| 8 | referenceStrainRate | 应变率归一化的参考值 |
这 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 |
| d2 | 1.45 |
| d3 | -0.47 |
| d4 | 0 |
| d5 | 1.6 |
| meltingTemperature | 925 |
| transitionTemperature | 293 |
| referenceStrainRate | 1 |
d1 和 d3 都是负的,d4 是 0。 很多人第一次看到会以为哪里抄错了、或者以为插件会拦。插件不拦 —— 而且这不是漏了校验,是刻意的。
ductile 和 shear 两个分支都调用了_checkColumn(..., allowZero=True) 去查第一列非负, 而 johnsonCook 分支一次都没调。 理由很直接:那两个模型的第一列是断裂应变,负数没有物理意义; JC 的 d1~d5 是拟合系数,符号取决于拟合,负号是常态。这个对比很好用 —— 看插件查不查,就知道那一列是不是物理量。 四个损伤模型的校验策略差异,在剪切损伤与 FLD那篇里有一张完整对照表。
这篇讲的是怎么填,不负责给你参数。如果你要的是现成的一组数, 站内单独有一个 Johnson-Cook 参数库, 那里按材料列了完整的硬化和失效参数、以及每组数的适用范围和出处。 两处配合着看:参数库解决"填什么",这篇解决"填在哪、为什么报错"。
d4 写 0 的含义也值得说一句:它是应变率修正项的系数,写 0 就是关掉失效准则里的应变率相关性。注意这和塑性块里的rateDependent 是两件事 —— 失效不看应变率,不等于流动应力也不看。 示例库正好演示了这种组合:塑性块的 C 是 0.002(有率相关), 失效块的 d4 是 0(率无关)。
04两个块的温度参数必须对齐
示例库里两个块的温度参数是一样的:熔点 925、转变温度 293。这不是巧合, 也不是插件强制的 —— 插件把两个块分别传给 Abaqus 的两个关键字,不会替你比对。写得不一致,导入照样成功。
| 写在哪 | 熔点 | 转变温度 |
|---|---|---|
| plastic(硬化) | 925 | 293 |
| damage.johnsonCook(失效) | 925 | 293 |
为什么必须一致?因为 JC 的硬化式和失效式里,温度都是以同一个归一化温度的形式出现的:当前温度减去转变温度, 再除以熔点减去转变温度。两个块用了不同的端点,就等于同一个物理温度在两处被折算成了 不同的归一化值,材料会一边"觉得自己很热"、一边"觉得自己还凉"。
关于温标:示例里转变温度是 293,熔点是 925。293 只有当成开氏温度才是室温, 所以这份示例用的是绝对温标。不过 JC 里这两个温度只以差值比的形式出现, 真正要紧的不是选哪套温标,而是它和模型里的温度场、以及绝对零度的设定必须是同一套。 混着用(材料参数按开氏、初始温度场按摄氏)是不报错的另一种错法。
顺带一提:JC 失效表不接受温度列。源码里那一行是table, _ = _rows(...) —— _rows() 返回的温度相关标志被下划线丢掉了。 其他三个损伤模型都接收并使用了这个标志。原因也说得通:温度已经是 JC 的显式参数 (第 6、7 列),再叠一层温度插值就重复了。所以这里千万别按温度相关表那篇的套路多加一列, 那会被表宽校验拦下来。
05硬化那边的 A B n m 和 rateDependent
示例库 Al_6061_T6 的硬化参数(同样是演示值):
| 参数 | 值 | 含义 |
|---|---|---|
| A | 324 | 初始屈服应力,量纲是应力 |
| B | 114 | 硬化模量,量纲是应力 |
| n | 0.42 | 硬化指数,无量纲 |
| m | 1.34 | 温度软化指数,无量纲 |
| C | 0.002 | 应变率敏感系数,无量纲 |
| epsilonDot0 | 1 | 参考应变率 |
A 和 B 带应力量纲,所以它们跟着单位制走。 毫米—吨—秒制下应力单位是 MPa,324 就是 324 MPa;换成米—千克—秒制, 这两个数要改成 3.24e8 和 1.14e8。整套换算关系在单位制那篇里。n、m、C 无量纲,不用动。
epsilonDot0 和失效表第 8 列的 referenceStrainRate是两个不同的参数,尽管示例里都写了 1、名字也像。 前者归一化硬化式里的应变率,后者归一化失效式里的应变率。 标定时它们可以取不同的值,插件也不会替你对齐 —— 但如果你的数据来自同一组试验, 通常就该一致。
hardening 的值必须是 Abaqus 认识的常量名。写错大小写或拼写, 会拿到 unknown Abaqus constant "..." 这条报错 —— 它出自插件的常量解析函数,凡是需要填 Abaqus 常量的地方(hardening、softening、degradation、 evolution 的 type)都可能触发。06evolution 用 ENERGY 时字段名会换
示例库给 Al_6061_T6 配的演化是能量型:
"evolution": { "type": "ENERGY", "fractureEnergy": 15 }注意字段名。插件按 type 决定读哪个键:
| type | 要读的字段名 | 量纲 |
|---|---|---|
| DISPLACEMENT(默认) | displacementAtFailure | 长度 |
| ENERGY | fractureEnergy | 能量 / 面积 |
写了 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提交前照着过一遍
- d1~d5 在
damage.johnsonCook里,A / B / n / m 在plastic里, 没有互串。 - 失效表一行正好 8 个数,顺序是 d1 d2 d3 d4 d5 熔点 转变温度 参考应变率。
- 失效表没有第 9 列 —— JC 失效不接温度列。
- 两个块的熔点和转变温度逐个对齐;改参数时两处一起改。
- 温度参数、初始温度场、绝对零度设定用同一套温标(示例用的是绝对温标)。
- A 和 B 的数值和整套模型的单位制一致;n、m、C 无量纲不用换。
evolution里type和字段名配套:ENERGY 配fractureEnergy,DISPLACEMENT 配displacementAtFailure, 或者两者都用value;值大于 0。- 导入后对着 JSON 字段说明核一遍层级; 材料整个没生效就看材料没生效那篇。