简介:这份资源面向使用 LS-DYNA 进行非线性动力学仿真的工程师与研究人员,聚焦求解过程中单元体积变为负值这一常见报错,帮助读者从计算稳定性角度定位问题并恢复求解。压缩包仅含 1 个 docx 文档,约 32KB,篇幅精炼,便于随时查阅对照。内容从成因与对策两条线展开:一方面梳理材料参数与状态方程定义不当、人工时间步长设置偏大、模型边界约束不足、网格质量欠佳等诱因;另一方面给出可落地的处理思路,包括核对材料属性、适当调小 CONTROL_TIMESTEP 的第二个参数(如由 0.9 改为 0.7)、补齐固定约束与接触条件、优化单元形状,以及借助体积修正算法和过程监控及早发现异常。文档还提示了负体积修正后可能出现速度无穷大的连带现象,便于读者少走弯路。目前已有 1221 人学习下载,适合需要排查仿真不收敛问题、积累排错经验的中高级用户参考。
1. 负体积报错:算到 12% 单元体积变负,重跑一次还是同一个位置
某开发者跑一套压缩工况算例,求解到 12% 突然停住,messa 里一行Error negative volume in solid element #10023 of part #2,重跑一次还是差不多的步数崩,换台机器也一样。负体积(negative volume)这类故障在显式动力学里出现的频次很高,也容易反复出现:报错只给一个单元号和一个 part 号,不告诉你是材料生硬、步长偏大还是网格畸变。新手容易被这一行字带偏,直接去调时间步长,结果只是把崩溃点往后推了几毫秒;老手则会先判断单元是被压扁、被删掉,还是根本没约束住。这篇笔记按「报错长什么样 → 根因在哪 → 改哪张卡 → 以后怎么快速定位」走一遍,适合正在盯着 messenger 文件发愁的人。
2. 材料参数与状态方程:负体积的第一嫌疑
2.1 参数填错时,负体积报错集中在哪几个 part
材料参数填错引发的负体积有一个很典型的分布特征:报错单元集中在某一个或某两个 part 上,而不是随机散布在整个模型里。原因不复杂,显式求解里单元的声速是c = sqrt(E/ρ),刚度 E 和密度 ρ 任何一个填错,声速就跟着错,单元在当前时间步里能承受的体积应变也跟着错。E 填小了一个数量级,材料显得极软,压缩波还没传出去,单元已经被邻居压成了负体积。
我一般先做一件事:把报错的 part 号记下来,回到关键字文件里找到对应的*MAT_卡片,逐字段核对密度、弹性模量、泊松比。常见翻车点是单位制没统一——几何用毫米画、材料按米制填,密度写成 7850 而不是 7.8e-9,声速直接被拉低三个数量级,时间步长算出来偏大,第一步就开始积累误差。还有一种是失效应变 FS 留空或者填成 0,材料该断不断,单元被无限拉伸压缩,最后体积变负。
提示:报错单元号在 messag 里通常只打前若干个,别只看第一条。把全文的 part 号统计出来,集中在一处的,基本就是材料或网格的问题;东一个西一个的,往约束和接触上找。
2.2 状态方程和本构对不上,体积应变会先跑到负值
涉及高压、大变形、泡沫、橡胶、混凝土这类材料时,光有本构不够,还要配状态方程。状态方程描述的是压力与体积应变的关系,本构描述的是偏应力与应变的关系,两者是分开的两块。状态方程填错,体积应变会在很小的压力扰动下就跑到负值区间,单元体积算出来是负的,求解器直接报错。
判断方法看状态方程里的声速参数 C。以常用的多项式或 Gruneisen 形式为例,C 应该约等于材料在参考状态下的体积声速,也就是sqrt(K/ρ),K 是体积模量。如果 C 填成了 1.5e3(按 m/s 想当然填的),而模型是 t-mm-s 单位制,真实声速应该是 5.19e6 mm/s,两者差三个数量级,压力-体积关系完全失真。这类错误在混用两套单位制的模型里特别常见,尤其是从别的项目里拷一段材料卡片过来的时候。
还有一种情况:本构用的是带失效应变的塑性模型,但状态方程用的是理想气体或者空的 EOS,拉伸段没有截止。单元被拉开时压力算成很大的负值,下一时刻又被接触推回来压缩,来回震荡几次体积就变负了。常见做法是给这类材料补一条拉伸截止,或者干脆换成带拉伸失效标志的本构。
2.3 一套按单位制反查参数的检查动作
手工翻关键字文件容易漏,我一般用几条命令把材料和状态方程先列出来,看它们是不是成对出现、数量对不对得上。
# 列出所有材料卡片与状态方程卡片的行号,确认有没有 MAT 没配 EOS grep -n -E "^\*(MAT_|EOS_)" model.k | head -40 # 抠出报错 part 对应的材料段,重点看密度和模量两个字段 awk '/^\*MAT_PLASTIC_KINEMATIC/{f=1} f&&NR<=200{print NR": "$0} /^\*EOS_/{if(f)exit}' model.k第一条命令的作用是建立一张索引:每个*MAT_后面应该跟着它自己的参数行,如果某个高压材料后面没有*EOS_,就得问一句为什么。第二条是把某一段材料连同它后面的参数行打出来,方便对照单位制。
参数核对不要凭记忆,按下面的对照表把密度和模量两列填一遍,填完再看声速对不对:
| 物理量 | t-mm-s 制 | kg-m-s 制 | g-cm-μs 制 |
|---|---|---|---|
| 钢密度 | 7.8e-9 | 7850 | 7.8 |
| 弹性模量 | 210000 | 2.1e11 | 2.1e12 |
| 体积声速 | 5.19e6 | 5190 | 5.19e5 |
表里最后一行是算出来的,不是查出来的:c = sqrt(E/ρ)。如果你的模型里钢的声速算出来跟 5.19e6 mm/s 差了一个数量级,那负体积几乎是必然的,改步长只能延后,不能解决。
3. 时间步长与 *CONTROL_TIMESTEP:0.9 改成 0.7 之后为什么速度变成无穷大
3.1 TSSFAC 从 0.9 改到 0.7,缩的到底是什么
显式求解的稳定步长是dt = TSSFAC × min(L_e / c_e),L_e 是单元特征长度,c_e 是单元声速,TSSFAC 就是*CONTROL_TIMESTEP第二个字段那个缩放因子,默认 0.9。把 0.9 改成 0.7,步长只缩小了约 22%,它不会改变模型的物理行为,只改变数值积分的稳定裕度。
这解释了一个很常见的困惑:改完 TSSFAC,负体积报错往后推了一段,然后变成速度无穷大。推后说明步长确实参与了失稳,但从 0.9 到 0.7 只多撑了 22% 的裕度,说明真正的失稳源还在。速度无穷大这种表现,八成不是步长本身,而是单元被删掉了。
修改材料之后出现速度无穷大,因果链通常是这样的:你把失效应变调小或者换了本构,单元在更早的时刻满足失效条件被删除,删除单元的节点质量从系统里消失,剩下的节点承受原来的接触力和惯性力,加速度a = F/m里分母骤降,速度自然就飙上去了。这时候降 TSSFAC 只是让每一步小一点,掩盖了质量不守恒这件事。
3.2 卡片怎么改:*CONTROL_TIMESTEP 与配套的三张卡
改步长不是只动一个数字,至少要把下面这几张卡一起看一遍,否则改完不知道是哪个生效了。
*CONTROL_TIMESTEP $# dtinit tssfac isdo tslimt dt2ms lctm erode ms1st 0.0 0.7 0 0.0 0.0 0 0 0 *CONTROL_TERMINATION $# endtim endcyc dtmin endeng endmas 0.0020 0 0.0 0.0 0.0 *CONTROL_CONTACT $# slsfac rwpnal islchk shlthk penopt thkchg orien enmass 0.1 0.0 1 1 1 1 1 0dtinit留 0 表示由程序自己按最小单元算初始步长,一般不建议手填,除非你明确知道最小单元在哪。tssfac就是这次要调的 0.7,注意下限别低于 0.6,再往下时间步太小、累积误差和计算量都会明显增加。dt2ms是质量缩放的时间步目标,填负值表示只对小于目标步长的单元加质量,这是控制步长最直接的手段,但加了质量就要盯附加质量占比。endcyc和dtmin用来兜底,dtmin一旦被触发,求解器会直接终止而不是继续算下去。
调的顺序我一般是这样:先确认最小单元的尺寸,算出理论步长;再决定是缩 tssfac 还是加质量缩放;最后用能量曲线验证。反过来先调 tssfac、再看单元,很容易调到一个「能跑完但结果不可信」的参数上。
3.3 改完步长还是崩,说明问题不在步长
有个很实用的判据:如果 tssfac 调到 0.6 甚至更低,负体积还是出现在同样的单元、同样的时刻,那时间步长基本可以排除。这时候把注意力放回三件事上——单元本身畸变到什么程度、这个单元附近的接触力有多大、材料在这一时刻是不是刚好进入失效。
我通常会在崩溃时刻前后各输出一帧结果,看报错单元的形状。如果它已经被压成一条缝,长宽比超过 10,那问题在网格和载荷;如果它形状还算正常但速度突然变大,问题在质量删除或接触力尖峰。同样的报错,两种根因,处理方式完全不同,靠猜是猜不出来的。
4. 约束不足、网格与接触:负体积的另三个入口
4.1 未约束自由度:先看刚体位移和反力
模型没约束好导致负体积,表现和材料问题很像,但有一个区别:报错往往出现在加载初期,甚至第一步。缺少约束的部件在惯性力作用下整体飘移,几个部件互相穿透,单元在两块刚体之间被反复挤压,体积很快变负。
定位方法不复杂。在*BOUNDARY_SPC_SET里核对每一个 set 的节点范围,特别是有对称面和刚性墙的模型,容易漏掉某个方向的转动自由度。另一个办法是看反力:给模型施加位移载荷,输出约束点的反力曲线,如果反力在初始阶段是 0 或者剧烈震荡,说明约束没吃上力,载荷在推一个自由体。
常见做法是先只算前几十步,把速度云图打开。正常模型的速度分布是渐变的,缺少约束的部件会出现一整块同向平移的速度场,一眼就能看出来。这一步花不了几分钟,比事后猜材料省事得多。
4.2 网格畸变:最小单元尺寸决定了你能跑多快
网格质量和负体积的关系是直接的:特征长度 L_e 越小的单元,稳定步长越小;形状越扁的单元,在大变形下越早变负。一块区域里如果既有 5 mm 的六面体又有 0.2 mm 的楔形过渡单元,整个模型的步长被最小的那个卡住,而那个小单元往往就是第一个报负体积的。
检查动作分两步。先看最小单元尺寸,从 d3hsp 里能直接读到初始步长和对应单元;再看长宽比和翘曲度,超过 5 的长宽比在压缩工况里就要留意,超过 10 基本等于给自己埋雷。
# 从 d3hsp 里读初始时间步与最小单元信息,确认步长是不是被个别单元拖住 grep -i -A4 "smallest time step\|smallest element" d3hsp | head -30命令输出里会给出最小单元的编号和尺寸,把它跟报错单元号对一下。如果报错单元就是最小单元,且形状很差,处理方式是在这一块重新划分网格,用过渡更平缓的单元,而不是全局缩步长——全局缩步长会让整个模型陪你一起慢。
注意:局部加密网格是控制精度的常规手段,但加密之后最小单元尺寸下降,稳定步长同步下降,计算量可能翻几倍。加密前后一定重新看一遍时间步,别让加密动作本身变成新的负体积来源。
4.3 初始穿透与接触刚度:一上来就被压扁的单元
接触设置不当导致的负体积有个很明显的特征:报错出现在求解刚开始的极短时间内,而且报错单元集中在接触面附近。原因通常是初始穿透——两个部件在建模阶段就已经重叠,求解器第一步要强行把它们推开,接触力在一步之内从 0 跳到极大,界面单元直接被压扁。
处理手段是先做一次初始穿透检查,把重叠量算出来。如果重叠是建模误差,直接改几何;如果是公差累积,用接触卡里的偏移量修正。*CONTROL_CONTACT里的penopt控制惩罚刚度,默认值在大变形下可能偏硬,适当降低惩罚刚度可以让初始阶段平滑一些,但降太多会带来新的穿透,属于两害相权。
软约束选项也值得一试。把接触刚度按材料刚度缩放而不是按几何缩放,界面上刚度差别大的两个部件(比如金属对泡沫)接触时,接触力不会因为一侧极硬而出现尖峰。这一改动能解决相当一部分「刚起步就报负体积」的案例,尤其是多材料装配模型。
5. 负体积排查避坑:五条血泪踩坑记录
5.1 只改 TSSFAC 就当作修好了
现象:把 0.9 改成 0.7,负体积报错从 12% 推到 30%,以为搞定了,结果换个工况又崩,而且崩得更早。
原因:TSSFAC 只提供稳定裕度,不改变模型的物理行为。原模型里单元已经接近畸变极限,缩步长只是让它在崩溃前多算几步。
解决:把 tssfac 当临时手段,同时检查最小单元形状和材料失效应变。真正修好之后,tssfac 应该能调回 0.9 附近还稳定运行;调回去就崩,说明根因还在。
5.2 单位制混用,声速算错三个数量级
现象:材料参数看着都对,密度和模量也是从手册上抄的,但一加载就报负体积,报错 part 和材料卡一一对应。
原因:几何按毫米建模,材料按米制填写。密度写成 7850 而不是 7.8e-9,声速被低估,稳定步长偏大,第一步就开始积累误差。这类错误不会报参数非法,只会以负体积的形式表现。
解决:按 2.3 的对照表把密度、模量、声速三列全部重算一遍,声速用sqrt(E/ρ)现算,不查表。算完跟模型里填的比,差一个数量级就是它。
5.3 失效应变删除单元后质量丢失,速度变无穷大
现象:先报负体积,改了材料参数之后负体积没了,但求解中期出现速度无穷大,能量曲线内能突然掉一块。
原因:失效应变调小后单元更早被删除,节点质量从系统中消失,剩余节点的加速度F/m因分母骤降而飙升。质量不守恒,速度自然发散。
解决:优先用侵蚀接触或单元删除后的质量补偿,避免大面积删除;确实需要删除的,把失效应变调回接近材料真实延伸率的值,并在*DATABASE_MATSUM里盯附加质量和总质量曲线,质量掉超过 1% 就要回头查。
5.4 初始穿透没检查,第一步就被压扁
现象:报错出现在第 1 到第 10 步之间,报错单元全在接触面上,改材料没有任何效果。
原因:两个部件在建模阶段已经重叠,求解器第一步强行推开,接触力一步内从 0 跳到极大,界面单元直接被压成负体积。
解决:先算一遍初始穿透量,能改几何就改几何;改不了的用接触偏移量修正,配合软约束选项。改完再跑前 20 步,看接触力曲线是否平滑起步。
5.5 用质量缩放硬撑步长,结果能量对不上
现象:为了不崩,把dt2ms设成一个比较大的目标步长,模型的单元被统一加质量,能跑完了,但结果和试验对不上,内能偏高。
原因:质量缩放改变了模型的惯性,附加质量占比过大时,动态响应失真。它能解决的是步长问题,不是负体积的根因。
解决:dt2ms填负值,只对小于目标步长的单元生效,并实时监控附加质量占总质量的比例,一般控制在 1% 以内。缩放到 5% 以上,结果基本只能看趋势,不能看数值。
6. 快速定位负体积:从 messag 和 d3hsp 里三分钟找到源头
真正卡住人的时候,往往不是不知道怎么改,而是不知道该先改哪个。我的习惯是三步:定位、分类、验证,全程不打开图形界面也能完成大半。
6.1 三个文件按顺序看
第一步看 messag,把报错单元号和 part 号统计出来,判断是集中还是分散:
# 统计报错集中在哪些 part,集中说明是材料或局部网格,分散说明是整体约束或接触 grep -i "negative volume" messag | grep -o "part #[[:space:]]*[0-9]\+" | sort | uniq -c | sort -rn第二步看 d3hsp,确认最小单元尺寸、初始时间步,以及有没有质量缩放被触发的提示。第三步看能量文件,盯内能、沙漏能和附加质量三条曲线,如果内能在崩溃前出现尖峰或者突然下坠,说明单元在剧烈变形或者被删除。
| 报错特征 | 先查哪里 | 常见结论 |
|---|---|---|
| 报错集中在单一 part | 该 part 的*MAT_与*EOS_ | 单位制、声速、失效应变 |
| 报错出现在前 10 步 | 接触卡与初始穿透 | 重叠量、惩罚刚度 |
| 报错伴随速度无穷大 | 质量删除与能量曲线 | 失效应变过小、质量不守恒 |
| 报错单元是最小单元 | 网格长宽比与过渡区 | 局部加密或重划 |
| 改 tssfac 后报错时刻平移 | 时间步本身 | 临时缓解,根因另找 |
6.2 一条可复用的判断顺序
我现在遇到负体积,固定按这个顺序走:先确认报错是集中还是分散,集中的查材料,分散的查约束和接触;再看报错时刻,初期查接触穿透,中期查网格畸变和材料失效,末期多半是累积误差,回头查步长和能量;最后一定用 tssfac 回 0.9 复算一遍,能稳定跑完才算真修好,跑不完就说明只是把问题推后了。
从那以后我每次改材料参数,都会先把声速现算一遍再填卡,跑之前强制走一遍「最小单元尺寸 → 理论步长 → 报错 part 对应材料」的检查,这三步花不到五分钟,省下的是反复重跑的一整天。希望帮到你。
本文还有配套的精品资源,点击获取