01剪切损伤的三列,和那个不是列的 ks
damage.shear 的表结构和韧性损伤长得很像,也是三列:
_rows(sub, ('fractureStrain', 'shearStressRatio', 'strainRate'), 'damage.shear')| 列 | 字段名 | 含义 | 取值 |
|---|---|---|---|
| 第 1 列 | fractureStrain | 该剪切应力比下的等效塑性断裂应变 | ≥ 0(0 合法) |
| 第 2 列 | shearStressRatio | 剪切应力比 | 按标定 |
| 第 3 列 | strainRate | 等效塑性应变率 | ≥ 0 |
| 第 4 列 | (温度) | 多写一列时才有 | 按你的温标 |
和韧性损伤的差别只在第 2 列:那边是应力三轴度,这边是剪切应力比。 两个模型可以同时挂在一个材料上,分别捕捉拉伸主导和剪切主导两种失效路径, Abaqus 会各自判断。
真正要注意的是 ks。源码里它是这么处理的:
if 'ks' in sub:
kwargs['ks'] = float(sub['ks'])它被放进 kwargs,和 table 是并列的两个参数。 换成 JSON 的话就是:
"damage": {
"shear": {
"ks": 0.3,
"table": [
[0.30, 1.0, 0.001],
[0.22, 2.0, 0.001]
],
"evolution": { "type": "ENERGY", "fractureEnergy": 10 }
}
}ks 在 table 外面、和它同级。写进表里会怎样? 假设你把它当第 4 个数写进每一行,插件的表宽推断会把它当成温度列 (规则见 温度相关表那篇), 于是不报错、静默变成温度相关表,而 ks 根本没传给 Abaqus。 要是只在某一行加了,就会撞上:
damage.shear: all rows must have the same length这条报错指向表宽,你会以为是列数问题,其实根因是把标量当列了。ks 不写就是不传,Abaqus 用它自己的默认值。
02FLD 只有两列,而且次应变在前
成形极限图的表最简单,只有两列 —— 但顺序是最容易写反的:
_rows(sub, ('minorStrain', 'majorStrain'), 'damage.fld')| 列 | 字段名 | 含义 | 符号 |
|---|---|---|---|
| 第 1 列 | minorStrain | 次应变,板面内较小的那个主应变 | 可正可负 |
| 第 2 列 | majorStrain | 主应变,板面内较大的那个主应变 | 通常为正 |
| 第 3 列 | (温度) | 多写一列时才有 | 按你的温标 |
怎么自查?看第 1 列有没有负数。一条完整的成形极限曲线必然跨过纵轴: 左半支是拉—压变形(深拉延),次应变为负;右半支是双向拉伸(胀形),次应变为正。 所以正常的 FLD 表,第 1 列一定有负值。如果第 1 列全是正数、 第 2 列反而出现负数,基本可以断定两列写反了。
插件对这两列一个校验都没做,源码里 fld 分支没有任何_checkColumn 调用。这正是因为负的次应变是物理必需的 —— 要是照韧性损伤那样查非负,FLD 的左半支就没法填了。
"damage": {
"fld": {
"table": [
[-0.20, 0.52],
[-0.10, 0.42],
[ 0.00, 0.36],
[ 0.10, 0.40],
[ 0.20, 0.46]
],
"evolution": { "type": "DISPLACEMENT", "value": 0.2 }
}
}fld 支持温度相关,多给一列就是温度。这一点和Johnson-Cook不同 —— 那个模型的源码把温度标志丢弃了,因为温度已经是它的显式参数。
还有一点要清楚:FLD 是板料成形的准则, 用在壳单元上才有意义。拿它去评价一个实体单元建的锻件,模型跑得动,结论不可信。
03四个损伤模型的校验策略对照表
这张表是把插件源码 _addDamage() 的四个分支逐行比出来的, 记住它比记住每个模型的规则划算 —— 因为插件查不查,反映的是那一列是不是物理量。
| 模型 | 列数 | 第 1 列 | 查非负吗 | 接温度列吗 | 额外标量 |
|---|---|---|---|---|---|
| ductile | 3 | fractureStrain | 查(0 合法) | 接 | — |
| shear | 3 | fractureStrain | 查(0 合法) | 接 | ks |
| johnsonCook | 8 | d1 | 不查 | 不接 | — |
| fld | 2 | minorStrain | 不查 | 接 | — |
读法:
- 查非负的那两个(ductile、shear),第 1 列都是断裂应变 —— 一个真实的物理量,负数无意义,所以插件拦。
- 不查的那两个,一个第 1 列是拟合系数 d1(示例里就是 -0.77), 一个第 1 列是次应变(左半支必须为负)。都是负值合法,所以插件不拦。
- 唯一不接温度列的是 johnsonCook,因为温度是它表里的第 6、7 列, 已经显式给了。
- 唯一有额外标量的是 shear,就是那个
ks。
那两个"查非负"的报错串是这个形状(形容词会随允许零与否变化):
damage.shear: fractureStrain must be non-negative, got -0.1而演化那一层的校验没带允许零的参数,所以它的形容词是另一个:
damage.fld.evolution: displacementAtFailure must be positive, got 0这两个词(non-negative 和 positive)是判断报错来自哪一层的最快线索,韧性损伤那篇的第 4 节把这对差别讲透了。
04演化子块:四个模型共用同一套规则
好消息是 evolution 的规则四个模型完全一致,源码里就是同一个函数在处理。 所以韧性损伤那篇学到的东西,剪切和 FLD 直接照搬:
| 字段 | 不写会怎样 | 说明 |
|---|---|---|
| type | 插件按 DISPLACEMENT 处理 | 决定下面读哪个字段名 |
| displacementAtFailure | — | type 为 DISPLACEMENT 时读它,量纲是长度 |
| fractureEnergy | — | type 为 ENERGY 时读它,量纲是能量除面积 |
| value | — | 前两个都没写时才会去读的兜底字段名 |
| softening | 插件不传,走 Abaqus 那端的默认 | 软化规律 |
| degradation | 插件不传,走 Abaqus 那端的默认 | 多个损伤准则并存时怎么合并 |
注意后两行和第一行的区别。type 的默认值是插件给的 —— 源码里无条件解析了一次,不写就是 DISPLACEMENT。 而 softening 和 degradation 是写了才传, 不写的话插件根本不把这两个参数交给 Abaqus,最终用什么由 Abaqus 那一端决定。
degradation 在剪切损伤这里特别值得显式写出来。如果你给同一个材料同时挂了韧性损伤和剪切损伤(这是常见做法), Abaqus 手里就有两个损伤变量,得决定怎么合并。写 MAXIMUM 是取两者较大值, 也就是哪条路径先坏就按那条算 —— 这通常是你想要的。 既然插件不写就不传,那就别赌,直接写出来。
单位问题也一样:displacementAtFailure 是长度,跟着单位制走, 而且和网格尺寸耦合;fractureEnergy 是单位面积能量,网格细化时收敛。 换算表在单位制那篇里。
05这两个模型上会看到的报错,以及它们的真实原因
插件的表解析报错是四个模型共用的,串的开头会带上路径(比如damage.shear、damage.fld.evolution), 所以先看冒号前面那一段,就知道错在哪一层。
| 报错串 | 字面意思 | 在这两个模型上的常见真实原因 |
|---|---|---|
| all rows must have the same length | 各行列数不一致 | 把 ks 当列塞进了部分行 |
| missing key(s) value | 缺 value 字段 | evolution 的 type 和字段名不配套,比如写了 ENERGY 却填 displacementAtFailure |
| "table" is empty | 表是空的 | 留了 "table": [] 占位没删 |
| row ... is not a list of numbers | 某行不是数字列表 | FLD 数据从表格里拷来,某行带了引号或空串 |
| values must be numbers | 值不是数字 | 负号写成了全角,或者数字里混了空格 |
| expected an object with ... | 这一层不是对象 | 直接写成 "fld": [[...]],漏了外面的 { "table": ... } |
最后一条值得单独说。fld 只有两列,看着像个纯数组, 于是很多人会直接写 "fld": [[-0.2, 0.52], ...]。插件要的是一个对象,表得放在里面的 table 键下 —— 因为还得有地方放 evolution。报错串会告诉你它期望什么, 照着字面改就行。
全角负号那一条在实际支持里出现频率不低,因为中文输入法下打减号很容易带出全角。 这类字符问题在 JSON 字段说明里也提过, 用编辑器的 JSON 校验先过一遍能省不少时间。
06提交前照着过一遍
- 剪切损伤:每行正好三个数,顺序是断裂应变、剪切应力比、应变率;第 1 列没有负数。
ks写在table外面、和它同级; 不需要就整个不写。- FLD:每行正好两个数,次应变在前; 第 1 列应该有负值,全是正数就要怀疑写反了。
- FLD 的主应变随次应变呈 V 形,最低点在次应变 0 附近。
- FLD 用在壳单元上;实体单元建的模型别套这个准则。
- 两个模型都有
evolution子块,值大于 0,type和字段名配套。 - 同时挂了多个损伤准则时,显式写出
degradation, 别依赖不传时 Abaqus 那端的默认。 - 材料里已经有
plastic块 —— 损伤是叠在塑性之上的, 塑性表本身的坑见塑性表那六种报错。