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

密度不是每个分析都要填,但填错的代价按工况差得很远

密度不是每个分析都必须填。纯静力里它完全不参与, 模态里它决定了有没有解,显式里它直接决定这个作业算多久。 这篇按工况把分界划清楚:哪些分析不填也对,哪些分析不填会被拦, 哪些分析不填不会报错、但结果整体是错的。
纯静力:不填也对
静力平衡方程里没有质量项。不加重力、不加离心、不用惯性释放的静力分析, 密度填不填、填多少,结果一模一样。
模态:不填就没有解
频率来自 K 和 M 两个矩阵。没有密度又没有点质量,M 是零矩阵, 特征值问题不成立 —— 这一类是会被拦住的,属于「好错误」。
显式:密度决定时间步
Δt 正比于 √ρ。密度小写 100 倍,稳定时间增量缩到十分之一, 作业时间涨十倍 —— 而且结果还是对的,所以没人会去查。

01纯静力:密度真的可以不填

静力分析求解的是 K·u = F。这个式子里没有质量, 所以密度既不影响刚度也不影响外载,填与不填结果完全一致。 示例库里 Concrete_C30 那条只写了密度和弹性两块 —— 换个只做静力的场景,连密度都可以省掉。

但有三种情况下静力分析也要密度,因为载荷本身是从质量来的:

载荷类型CAE 里的名字为什么要密度
重力Gravity体力 = ρ·g·V。密度是 0 就没有自重, 模型看起来加了载荷但位移全是 0
离心/角加速度Rotational body force惯性力同样正比于密度
惯性释放Inertia relief靠分布惯性力平衡外载,没有质量分布就无从平衡
这是「不报错的错误」里最安静的一种
忘了填密度就加重力,Abaqus 不会提醒你。它会算出一个合法但全是零的自重结果,然后你在这个基础上继续叠别的载荷, 最后交出去的报告里少了一整项。
自检的办法很直接:跑完看一眼总质量。CAE 的 Tools → Query → Mass properties,或者 dat 文件里的质量汇总, 和你手算的「体积 × 密度」对一遍。差一个数量级立刻就看出来了。

固有频率来自广义特征值问题 (K − ω²M)·φ = 0。 M 是质量矩阵,它唯一的来源就是密度(外加你手工放的点质量、非结构质量)。 密度全是 0 的模型,M 是零矩阵,这个问题退化成 K·φ = 0, 没有非平凡解。

好在这一类是会被拦住的。求解器提取不出特征值会中止, 不会给你一堆假频率。相比第 01 节那种静悄悄算出零自重的情形, 这反而是省事的错误。

真正麻烦的是密度填了、但填错量级

频率正比于 √(K/M),也就是反比于 √ρ。这一层是不报错的: 密度大 1012 倍,频率就小 106 倍, 求解器照样给你一份完整的模态结果。 这正是 mm 制里把 7850 当密度填进去的后果 —— 该填的是 7.85e-9。 换算的来龙去脉在单位制那一篇的第 03 节,这里不重复。

一个不用建模就能做的量级自检
拿到模态结果先别看振型,先问一句「这个数量级合理吗」。 频率反比于 √ρ 这一条,让量级错误必然是成千上万倍的偏差, 而不是百分之几。一阶模态算出 0.0012 Hz 或者 1.2 MHz, 都不用查模型,先去看密度那一栏。

03显式动力学:密度决定这个作业算多久

这是三种工况里密度作用最大、也最少被意识到的一种。 Abaqus/Explicit 是条件稳定的,每个增量步不能超过应力波穿过最小单元的时间:

Δt_stable ≈ L_e / c_d        L_e:最小单元的特征长度
c_d = √(E / ρ)               c_d:材料的膨胀波速

合起来:  Δt_stable ≈ L_e · √(ρ / E)

也就是说 Δt 正比于 √ρ。把这个关系代进去算一下代价:

密度填成波速 c_d 变为稳定时间步变为增量步数变为
正确值
小 100 倍大 10 倍小 10 倍多 10 倍
小 10⁴ 倍大 100 倍小 100 倍多 100 倍
大 100 倍小 10 倍大 10 倍少 10 倍
由 Δt ∝ √ρ 直接推出,与具体材料无关。总时长不变时,增量步数与 Δt 成反比。

密度小写两个数量级,一个本来算一小时的作业变成十小时,而结果是对的 —— 波速和时间步一起变,物理上是自洽的, 只是你算的不再是原来那个材料。没有报错,没有警告, 只有一句「怎么这么慢」。

反过来,故意放大密度是显式里的标准手段
既然 Δt ∝ √ρ,人为把密度调大就能换来更大的时间步 —— 这就是质量缩放(Mass scaling)。 准静态问题里它很常用,因为那类问题本来就不关心惯性。
但它有代价:放大的质量会带来虚假的惯性力。 判据是看动能和内能的比值,一般要求动能全程远小于内能(常用的经验线是 5% 以内)。 超了就说明缩放过头,结果里已经混进了不该有的惯性效应。
关键在于质量缩放要在 Step 里显式设置, 而不是偷偷把材料密度改大 —— 后者会让模态、重力、后续所有工况一起错, 而且下一个人接手时完全看不出来。

04隐式动力学与其余工况

分析类型要不要密度不填的后果
Static, General / Riks不要(除非有重力、离心、惯性释放)结果不变
Frequency(模态)必须提取不出特征值,作业中止
Modal dynamics / Response spectrum / Random response必须依赖模态结果,同上
Dynamic, Implicit必须惯性项进方程,没有质量就退化成一串静力解
Dynamic, Explicit必须算不下去;填错量级则时间步和作业时长成倍偏
Heat transfer(稳态)不要稳态导热与密度无关
Heat transfer(瞬态)必须热容项是 ρ·c_p,缺一个都不行
Buckle(线性屈曲)不要特征值来自刚度,不涉及质量
瞬态传热那一行值得单独记一下
瞬态温度场的时间常数由 ρ·cp/k 决定,三个量缺一不可。 很多人记得填热导率和比热,忘了密度也在这个乘积里 —— 密度错一个量级,温度上升的快慢就错一个量级, 而稳态终值是对的。跑短时的瞬态时这个错误藏得很深。
比热在 mm 制下要乘 106 这件事,见单位对照表

05密度可以填 0,这是有意留的

插件对各个数值列的检查分两档:大多数要求为正, 密度这一列要求非负 —— 也就是允许 0。 报错原文里那个词能看出来:

报错原文
density: value must be non-negative, got -7.85e-09
用的是 non-negative 而不是 positive。 对比一下屈服应力那条是plastic: yieldStress must be positive —— 那一列 0 就不行。

为什么给密度留这个口子,因为确实有该填 0 的场合:

  • 无质量的辅助件。 用来传力或者施加约束的刚性连接、 虚拟梁,只要刚度不要质量。
  • 质量另行给定。 质量已经用点质量、 非结构质量或者 *MASS 单独加过了,材料本身不该再算一遍。
  • 纯静力模型的占位。 材料库统一格式, 这一条确实用不到密度。
但显式里密度为 0 是另一回事
显式的时间步 Δt ∝ √ρ,ρ = 0 会让稳定时间步趋于 0,作业根本推进不下去。 所以在 Explicit 里给某个材料填 0,不是「忽略惯性」,是「无法求解」。 那种场合应该用刚体约束或者连接单元,而不是把密度归零。

06JSON 里怎么写,以及报错全表

密度是单列属性,两种写法都合法:

"density": 7.85e-9                 裸数字,手写材料库最常用

"density": { "value": 7.85e-9 }    对象形式,和别的属性排版一致

"density": {                       温度相关:末尾多一列温度
  "table": [
    [7.85e-9,  20.0],
    [7.80e-9, 400.0]
  ]
}

上面这些数取自插件自带示例库 materials_sample.jsonSteel_Q345Steel_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 lengthtable 里有的行带温度列有的不带要么全部一列,要么全部两列
density: "table" is emptytable 键在但是空数组补数据,或者整块删掉——不需要密度的材料可以不写这一块
逐字取自插件 1.2.1 的 materialImporterKernel.py。完整 22 条见帮助文档第 08 节。

JSON 各字段的完整定义在帮助文档第 05 节。弹性那一栏的检查规则见弹性模量与泊松比

07四条自检

  1. 这个 Step 用不用得到密度? 对着第 04 节那张表过一遍。 不用的话,密度错了也不影响这次的结果 —— 但下次有人拿这个模型做模态就会中招。
  2. 加了重力/离心/惯性释放吗? 加了就必须有密度, 而且要查总质量,不能只看有没有报错。
  3. 总质量对不对? Query → Mass properties, 和「体积 × 密度」手算一遍。这一步能同时抓住量级错误和漏填。
  4. 显式作业慢得反常? 先看 sta 文件里的稳定时间增量, 再回头查密度。Δt ∝ √ρ,慢十倍对应密度小一百倍, 这个对应关系很好反推。

常见问题

Abaqus 静力分析必须填密度吗?

不必须。静力求解的是刚度矩阵乘位移等于载荷,式子里没有质量项,密度填不填结果一致。但有三种例外:加了重力、加了离心力或角加速度、用了惯性释放——这三种载荷本身就是从质量来的,没有密度就没有载荷。麻烦的是这时候 Abaqus 不会报错,它会算出一个合法但全是零的自重结果。跑完用 Tools 里的 Query Mass properties 查一下总质量,和体积乘密度手算对一遍即可。

Abaqus 模态分析不填密度会怎样?

提取不出特征值,作业会中止。固有频率来自广义特征值问题,质量矩阵唯一的来源就是密度加上手工放的点质量和非结构质量,密度全为零时质量矩阵是零矩阵,问题没有非平凡解。这一类反而是省事的错误,因为它会被拦住。真正麻烦的是密度填了但量级错了:频率反比于密度的平方根,密度大一万亿倍频率就小一百万倍,求解器照样给出一份完整结果。

显式分析密度填错为什么作业会变慢?

Abaqus/Explicit 是条件稳定的,稳定时间增量约等于最小单元特征长度除以膨胀波速,而波速等于弹性模量除以密度再开方。合起来时间步正比于密度的平方根。密度小写一百倍,波速大十倍,时间步缩到十分之一,总时长不变的话增量步数就多十倍,作业时间也涨十倍。而且结果本身是自洽的,不会报错,唯一的症状就是慢。sta 文件里能直接看到当前的稳定时间增量,慢十倍对应密度小一百倍,很好反推。

Abaqus 材料密度可以填 0 吗?

在隐式分析里可以。插件对密度这一列的检查是非负,允许 0,报错用的词是 must be non-negative 而不是 must be positive,这和屈服应力那一列不同。留这个口子是因为确实有该填 0 的场合:只要刚度不要质量的辅助件、质量已经用点质量或非结构质量单独加过的情况、以及纯静力模型里用不到密度的占位条目。但在 Abaqus/Explicit 里不行——时间步正比于密度的平方根,密度为零会让稳定时间步趋于零,作业推进不下去,那种场合应该用刚体约束或连接单元。

什么是质量缩放,会不会把结果算错?

质量缩放是显式分析里人为放大密度以换取更大稳定时间步的做法,因为时间步正比于密度的平方根。准静态问题很常用,那类问题本来就不关心惯性。代价是放大的质量会带来虚假的惯性力,判据是全程比较动能和内能,一般要求动能远小于内能,常用的经验线是百分之五以内,超了说明缩放过头。要点是必须在 Step 里显式设置质量缩放,而不是偷偷把材料密度改大——后者会让模态、重力和后续所有工况一起错,下一个人接手时完全看不出来。

瞬态传热分析要填密度吗?

要。稳态导热与密度无关,但瞬态温度场的时间常数由密度乘比热再除以热导率决定,三个量缺一不可。常见的疏漏是记得填热导率和比热却忘了密度也在这个乘积里,结果温度上升的快慢错一个量级而稳态终值是对的,跑短时瞬态时这个错误藏得很深。另外在 mm-tonne-s 单位制下比热要在 SI 数值基础上乘一百万,这一项也很容易漏。

这一步可以不自己做

密度这一栏最贵的错误不是漏填,是量级填错而结果自洽 —— 没有报错,只有慢十倍的作业和偏一百万倍的频率。插件按选定单位制统一换算,不留这一层给人工。

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