01为什么区间是 −1 到 0.5,而且两端都不含
这个区间不用背,两行代数就能推出来。等向线弹性里,体积模量和剪切模量都能用 E 和 ν 表示:
K = E / [ 3 (1 − 2ν) ] 体积模量:抵抗体积变化
G = E / [ 2 (1 + ν) ] 剪切模量:抵抗形状变化材料要是稳定的,这两个模量都得是正的有限值 —— 压它一下体积得变小、 剪它一下得有反力。E 已经要求为正,那么:
- K > 0 要求 1 − 2ν > 0,即 ν < 0.5。 ν 正好等于 0.5 时分母是 0,K 发散。
- G > 0 要求 1 + ν > 0,即 ν > −1。 ν 正好等于 −1 时分母是 0,G 发散。
两端都是开区间,因为端点上不是「值很大」而是「没有值」。 插件的检查写的就是这个:
elastic: poissonsRatio must be between -1 and 0.5 (exclusive), got 0.5exclusive 是重点 —— 它在提醒你端点也不行, 不是「0.5 超出范围了」而是「0.5 本身就是那个不成立的点」。020.5 那一端:不可压缩,以及橡胶该怎么办
ν = 0.5 的物理含义是体积完全不可压缩:怎么拉怎么压, 体积一点不变。橡胶、部分软组织、以及大变形下的金属塑性区都接近这个状态, 所以很多人第一反应是「那我就填 0.5」。
填不进去。而且退一步填 0.4999 也不是好主意:K 并没有消失, 只是变成了一个比 G 大四五个数量级的数。刚度矩阵里两个相差几万倍的量放在一起, 单元会出现体积自锁 —— 结构明明该变形,算出来却硬得离谱, 而这一次不会有任何报错。
金属塑性不用担心这件事。塑性流动本身是等体积的,但那是*PLASTIC 那一栏管的事,弹性段的 ν 照常填零点三上下就行 —— 塑性表怎么填见塑性表三类报错。
03−1 那一端:负泊松比不是笔误
区间下限是 −1 而不是 0,这是故意的。泊松比为负的材料(拉伸时横向也变粗) 在结构上是可实现的,多见于特定的点阵和折叠结构。插件对负值照收不误, 只有 ν ≤ −1 才拦。
所以如果你确实在算一个负泊松比的胞元,不必绕过检查。 反过来,如果你没打算填负数却看到 ν 是负的, 那大概率是这两种情况之一:
| 看到的值 | 多半是什么 | 怎么确认 |
|---|---|---|
-0.3 | 从表格复制时带进了减号,或者列错位了 | 把这一行的 E 一起看一眼,E 是不是也串了位 |
-1 | 占位符没替换,或者某处用 −1 表示「无数据」 | 这个值会被拦下:got -1,因为端点不含 |
elastic: youngsModulus must be positive, got -206000。 数量级对不对它管不了 —— 把 SI 的 2.06e11 Pa 直接填进 mm 制模型(那里应该是 206000 MPa),插件不会有任何反应,因为 2.06e11 也是个正数。 量纲这一层只能靠自己,见单位制那一篇。04JSON 里这一栏怎么写
最简形式就是两个键,插件把它们拼成一行表:
"elastic": {
"youngsModulus": 206000.0,
"poissonsRatio": 0.3
}上面这组数取自插件自带示例库 materials_sample.json 里的Steel_Q345,是演示用的整数值, 用来说明格式,不要当成可以直接引用的材料数据。 同一个文件里另外三条的写法是这样:
| 示例库条目 | youngsModulus | poissonsRatio |
|---|---|---|
Steel_Q345 | 206000.0 | 0.3 |
Al_6061_T6 | 68900.0 | 0.33 |
Concrete_C30 | 30000.0 | 0.2 |
密度可以写成裸数字,弹性不行
单列的属性(密度、热导率、比热)允许直接写一个数, 因为那是手写材料库的人第一反应会写的形式。弹性有两列,没法这么省:
"density": 7.85e-9 ✔ 单列,可以裸写
"elastic": 206000 ✘ 两列,缺了泊松比elastic: missing key(s) poissonsRatio05温度相关的弹性表:第三列是温度
模量随温度变时,改用 table 写法,每行末尾加一列温度。 插件判断「是不是温度相关」的规则很直白:行比这个属性本身需要的列数多出来一列,那一列就是温度。 弹性本身要两列,所以三列就意味着温度相关。
"elastic": {
"table": [
[210000.0, 0.3, 20.0],
[180000.0, 0.3, 400.0],
[120000.0, 0.3, 600.0]
]
}这段同样出自示例库(Steel_S355_TempDep 那条),是演示值。 注意三行的泊松比都是 0.3 —— 温度列在, 但你完全可以让某一列保持不变,Abaqus 只是按温度内插而已。
三条容易踩的
- 列数必须整齐。 前两行三列、第三行两列, 整块判非法:
elastic: all rows must have the same length。 缺列的行不会被当成室温。 - 温度标度要和模型一致。 这一列是摄氏还是开氏, 插件不管也管不了,它只是一列浮点数。同一个模型里各处必须统一, 细节见热膨胀那篇的第 05 节。
- 范围外按端点取值。 表里给到 600,模型算到 700 时, Abaqus 不会外推,会一直用 600 那一行。想让高温段可信就得把表给够。
06等向以外的类型:插件在哪一步停手
elastic 块可以带一个 type 键,不写就是ISOTROPIC。一旦写成别的,插件的行为会变成两件事:不再做那两条物理检查,并且要求你显式给 table。
"elastic": {
"type": "ENGINEERING_CONSTANTS",
"table": [[ ... 按该类型的列布局填 ... ]]
}elastic: type ENGINEERING_CONSTANTS requires an explicit "table"unknown Abaqus constant "ENGINERING_CONSTANTS"—— 这条打印的是大写化之后的名字。为什么插件到这里就不管了:非等向类型的列数和列的含义随类型不同, −1 到 0.5 这种一维判据在那里没有对应物(正交异性的稳定性条件是一组 涉及全部九个常数的不等式,不是逐列能查的)。与其做一个半吊子的检查, 不如原样透传,让 Abaqus 自己的材料校验去处理。
LAMINA 6 个、ENGINEERING_CONSTANTS 和ORTHOTROPIC 9 个、ANISOTROPIC 21 个, 温度相关时各多一列。对不上直接报elastic: type LAMINA needs 6 values per row, or 7 with a trailing temperature column, got 5。07这一栏的报错全表
| 报错 | 触发条件 | 改法 |
|---|---|---|
elastic: youngsModulus must be positive, got 0 | E 填了 0 或负数 | 检查是不是列错位、或者占位符没替换 |
elastic: poissonsRatio must be between -1 and 0.5 (exclusive), got 0.5 | ν 取到端点或跑到区间外 | 接近不可压缩的材料改用超弹,不要凑 0.4999 |
elastic: missing key(s) poissonsRatio | 只给了一个键,或者把 elastic 写成了裸数字 | 两个键都要给;裸数字只有单列属性能用 |
elastic: values must be numbers | 某个值是字符串,例如带了引号或单位后缀 | 去掉引号,也不要写 "206000 MPa" |
elastic: all rows must have the same length | table 里各行列数不齐 | 要么全部两列,要么全部三列(第三列温度) |
elastic: "table" is empty | table 键在但数组是空的 | 补数据,或者整块删掉 |
elastic: type ORTHOTROPIC requires an explicit "table" | 非等向类型没给 table | 按该类型的列布局补上 table |
unknown Abaqus constant "ORTHOTROPICS" | type 拼错了 | 名字要和 Abaqus 常量一致,插件会先转成大写再找 |
JSON 各字段的完整定义在帮助文档第 05 节,报错对照表在第 08 节。