01纯静力:密度真的可以不填
静力分析求解的是 K·u = F。这个式子里没有质量, 所以密度既不影响刚度也不影响外载,填与不填结果完全一致。 示例库里 Concrete_C30 那条只写了密度和弹性两块 —— 换个只做静力的场景,连密度都可以省掉。
但有三种情况下静力分析也要密度,因为载荷本身是从质量来的:
| 载荷类型 | CAE 里的名字 | 为什么要密度 |
|---|---|---|
| 重力 | Gravity | 体力 = ρ·g·V。密度是 0 就没有自重, 模型看起来加了载荷但位移全是 0 |
| 离心/角加速度 | Rotational body force | 惯性力同样正比于密度 |
| 惯性释放 | Inertia relief | 靠分布惯性力平衡外载,没有质量分布就无从平衡 |
02模态与特征值分析:没有质量就没有频率
固有频率来自广义特征值问题 (K − ω²M)·φ = 0。 M 是质量矩阵,它唯一的来源就是密度(外加你手工放的点质量、非结构质量)。 密度全是 0 的模型,M 是零矩阵,这个问题退化成 K·φ = 0, 没有非平凡解。
好在这一类是会被拦住的。求解器提取不出特征值会中止, 不会给你一堆假频率。相比第 01 节那种静悄悄算出零自重的情形, 这反而是省事的错误。
真正麻烦的是密度填了、但填错量级
频率正比于 √(K/M),也就是反比于 √ρ。这一层是不报错的: 密度大 1012 倍,频率就小 106 倍, 求解器照样给你一份完整的模态结果。 这正是 mm 制里把 7850 当密度填进去的后果 —— 该填的是 7.85e-9。 换算的来龙去脉在单位制那一篇的第 03 节,这里不重复。
03显式动力学:密度决定这个作业算多久
这是三种工况里密度作用最大、也最少被意识到的一种。 Abaqus/Explicit 是条件稳定的,每个增量步不能超过应力波穿过最小单元的时间:
Δt_stable ≈ L_e / c_d L_e:最小单元的特征长度
c_d = √(E / ρ) c_d:材料的膨胀波速
合起来: Δt_stable ≈ L_e · √(ρ / E)也就是说 Δt 正比于 √ρ。把这个关系代进去算一下代价:
| 密度填成 | 波速 c_d 变为 | 稳定时间步变为 | 增量步数变为 |
|---|---|---|---|
| 正确值 | 1× | 1× | 1× |
| 小 100 倍 | 大 10 倍 | 小 10 倍 | 多 10 倍 |
| 小 10⁴ 倍 | 大 100 倍 | 小 100 倍 | 多 100 倍 |
| 大 100 倍 | 小 10 倍 | 大 10 倍 | 少 10 倍 |
密度小写两个数量级,一个本来算一小时的作业变成十小时,而结果是对的 —— 波速和时间步一起变,物理上是自洽的, 只是你算的不再是原来那个材料。没有报错,没有警告, 只有一句「怎么这么慢」。
04隐式动力学与其余工况
| 分析类型 | 要不要密度 | 不填的后果 |
|---|---|---|
| Static, General / Riks | 不要(除非有重力、离心、惯性释放) | 结果不变 |
| Frequency(模态) | 必须 | 提取不出特征值,作业中止 |
| Modal dynamics / Response spectrum / Random response | 必须 | 依赖模态结果,同上 |
| Dynamic, Implicit | 必须 | 惯性项进方程,没有质量就退化成一串静力解 |
| Dynamic, Explicit | 必须 | 算不下去;填错量级则时间步和作业时长成倍偏 |
| Heat transfer(稳态) | 不要 | 稳态导热与密度无关 |
| Heat transfer(瞬态) | 必须 | 热容项是 ρ·c_p,缺一个都不行 |
| Buckle(线性屈曲) | 不要 | 特征值来自刚度,不涉及质量 |
05密度可以填 0,这是有意留的
插件对各个数值列的检查分两档:大多数要求为正, 密度这一列要求非负 —— 也就是允许 0。 报错原文里那个词能看出来:
density: value must be non-negative, got -7.85e-09non-negative 而不是 positive。 对比一下屈服应力那条是plastic: yieldStress must be positive —— 那一列 0 就不行。为什么给密度留这个口子,因为确实有该填 0 的场合:
- 无质量的辅助件。 用来传力或者施加约束的刚性连接、 虚拟梁,只要刚度不要质量。
- 质量另行给定。 质量已经用点质量、 非结构质量或者
*MASS单独加过了,材料本身不该再算一遍。 - 纯静力模型的占位。 材料库统一格式, 这一条确实用不到密度。
06JSON 里怎么写,以及报错全表
密度是单列属性,两种写法都合法:
"density": 7.85e-9 裸数字,手写材料库最常用
"density": { "value": 7.85e-9 } 对象形式,和别的属性排版一致
"density": { 温度相关:末尾多一列温度
"table": [
[7.85e-9, 20.0],
[7.80e-9, 400.0]
]
}上面这些数取自插件自带示例库 materials_sample.json(Steel_Q345 与 Steel_S355_TempDep 两条), 是演示格式用的值,不是可以直接引用的材料数据。 该文件在开头声明了自己的单位制是 tonne, mm, s, N, MPa, 所以密度写成 t/mm³。
温度相关密度:一般不必,但它合法
固体的密度随温度的变化通常远小于模量和屈服强度的变化, 大多数分析里当常数就够。真要给,形式和别的属性一样 —— 多出来的那一列是温度。
| 报错 | 触发条件 | 改法 |
|---|---|---|
density: value must be non-negative, got -7.85e-09 | 密度是负数 | 多半是复制时带了减号;0 是允许的,负数不行 |
density: values must be numbers | 值是字符串,例如带了引号或单位 | 去掉引号,也不要写 "7.85e-9 t/mm3" |
density: all rows must have the same length | table 里有的行带温度列有的不带 | 要么全部一列,要么全部两列 |
density: "table" is empty | table 键在但是空数组 | 补数据,或者整块删掉——不需要密度的材料可以不写这一块 |
JSON 各字段的完整定义在帮助文档第 05 节。弹性那一栏的检查规则见弹性模量与泊松比。
07四条自检
- 这个 Step 用不用得到密度? 对着第 04 节那张表过一遍。 不用的话,密度错了也不影响这次的结果 —— 但下次有人拿这个模型做模态就会中招。
- 加了重力/离心/惯性释放吗? 加了就必须有密度, 而且要查总质量,不能只看有没有报错。
- 总质量对不对? Query → Mass properties, 和「体积 × 密度」手算一遍。这一步能同时抓住量级错误和漏填。
- 显式作业慢得反常? 先看 sta 文件里的稳定时间增量, 再回头查密度。Δt ∝ √ρ,慢十倍对应密度小一百倍, 这个对应关系很好反推。