搞有限元仿真的朋友应该都有过这种经历:一个碰撞分析或者成型分析,算了三天三夜,眼看快到收尾的载荷步了,结果机房断电、远程会话断开、或者某个节点直接爆内存退出,模型停在了95%的位置。重新跑一遍?代价太大。又或者,你算完了一个成形过程,想接着算回弹,但重新建模再跑一次前段工序,纯属浪费机时。这种时候,LS-DYNA的重启动(Restart)功能就是最直接的解药。
我最早接触重启动,也是被一次深夜的计算中断逼出来的。当时一个整车碰撞模型算到一半,因为存储空间不足被系统强杀,离预定终止时间还剩20小时算力。那会儿我对重启动的理解还停留在“加一行*RESTART就能续算”的层面,真上手才发现,LS-DYNA把重启动分成了好几种类型,每种对模型文件、二进制文件甚至CPU核数的要求都不一样,踩坑踩得相当扎实。这篇内容想把重启动从文件体系、关键字配置到工程场景的实操边界,再到常见失败排查,完整梳理一遍,给自己做个备忘,也希望能帮到正在被同类问题折磨的同行。
1. 为什么要用重启动:先搞清楚你的仿真场景属于哪一类
很多人对重启动的理解是“算到一半坏了,接上继续算”,这确实是它的一个重要用途,但并不是全部。从事多年显式动力学分析,我的体会是:重启动本质上是一种“基于已计算状态继续演进”的求解机制,它的应用场景远比“断点续传”要广。
1.1 从一次计算中断说起
我遇到的第一类典型场景是中断恢复。某次我做了一个某型汽车B柱热成型淬火过程模拟,模型规模中等,约180万单元,单机16核跑,预计要算60小时。跑到第43小时的时候,机房做了次例行维护,进程被终止,d3dump文件停在了周期性的写盘节点上。如果重新从头算,等于浪费了接近三分之二的机时。这时候只要把d3dump文件拿回来,配合原始k文件做一次简单重启动,就可以从第43小时对应的物理时间继续往下积分,无需重复前段计算。
第二类常见场景是分阶段加载。比如你要模拟一个零件先完成冲压成形、再切边、再回弹的完整工艺链。每一个工序虽然可以用独立的模型单独算,但更稳妥的做法是在前一个工序的计算结束后保存一个full restart数据库,在后续工序的模型中作为初始应力应变场导入。这样能保证场变量——尤其是厚向应力分布、等效塑性应变、回弹前后的接触状态——在前一工序的结尾和下一工序的开头保持连续。
第三类场景是参数迭代。比如你在做安全气囊展开与乘员耦合分析时,第一次算完发现气囊的排气孔系数或者点火时刻不合理,需要微调。重新跑整个碰撞过程显然不经济。如果模型在气囊展开之前的状态已经稳定,你可以在这个“稳定状态”落一个重启动点,之后每次只需要从该点出发,修改展开阶段的关键字卡片,做full restart即可。
这四类场景归根到底都指向同一件事:仿真分析中,完整求解路径上的许多段落是可以裁剪、复用、局部修改再出发的。重启动就是LS-DYNA专门为这种需求保留的后门,问题只在于你得搞清楚简单重启动(Simple Restart)和全量重启动(Full Restart)各自负责哪一类任务,用错了类型,轻则算不下去,重则结果完全失真。
1.2 Simple Restart 与 Full Restart 的本质区别
LS-DYNA的重启动,表面上看都靠*RESTART关键字触发,但内部走的完全不是同一条路。
简单重启动的基础是中性文件(binary d3dump),它保存了上一段计算结束时的所有状态量:每个节点的坐标、速度、加速度,每个单元的内力、应力、应变、历史变量,接触面的状态向量,以及沙漏力、滑移能、内能、动能等系统级数据。简单重启动时,求解器读取这些状态,直接把时间积分器“解冻”,沿着中断时刻继续向前推进。注意,简单重启动不能修改任何模型定义——材料卡、单元连接关系、边界条件、接触定义统统不能动,只能保持原模型继续算。你甚至不能改终止时间之外的任何控制参数,顶多是通过*CONTROL_TERMINATION调整一下终点时刻。它适合做续算和延长计算时长。
全量重启动的基础是d3full(或d3dbl)数据库文件,这个文件里包含的是完整的应力应变场和一个快照式的网格数据。做full restart时,LS-DYNA允许你在新的输入文件中重新定义部分模型——比如改变材料参数、更换加载曲线、删除某些部件、添加新的部件或接触——然后从d3full中读取原始网格的应力应变状态作为初始条件,在新模型上重新初始化并开始计算。这才是真正意义上的“改造后继续算”。
打个比方:简单重启动就像一个视频播放器从断点继续播放,档案本身不能换;全量重启动则更像你先把一部电影的当前画面逐帧导出成素材,然后在剪辑软件里只替换后半段的素材轨道,前半段画面作为背景素材继续参与后半段渲染。后者灵活得多,但同时你自己要承担更多的一致性检查责任——你改动后的模型必须和前一阶段的物理状态逻辑自洽,否则结果就是准垃圾。
下面的表是我自己常用的一张对照表,能帮你快速判断该用哪种重启动:
| 对比维度 | Simple Restart(简单重启动) | Full Restart(全量重启动) |
|---|---|---|
| 读取文件 | d3dump | d3full / d3dbl |
| 能否修改模型 | 不能 | 可以修改部件、材料、载荷、接触等 |
| 典型用途 | 中断续算、延长时间、保存阶段性状态继续跑 | 分阶段工艺链、局部参数优化迭代、更换工况 |
| 对CPU数量要求 | 必须有完全一致的MPI配置 | 无严格限制,可跨节点数运行 |
| 精度风险 | 较低 | 较高,需要做一致性验证 |
| 关键字组合 | *RESTART配合原始输入文件 | *RESTART配套新的输入文件 |
2. 重启动核心技术文件体系:d3dump、d3full、d3dbl 的分工逻辑
在配置重启动之前,必须把LS-DYNA的二进制输出文件体系弄清楚。我当时第一次见到工作目录里一堆d3dump01、d3dump02、d3full01这类文件时,完全分不清谁是谁,后来踩了几次坑才弄明白,这几个文件虽然都是二进制结果数据,但内容和用途差异巨大。
2.1 谁保存了什么状态:二进制文件的角色梳理
d3dump是重启动里最基础的状态文件。它按照你设定的时间间隔(通过*DATABASE_BINARY_D3DUMP控制)周期性写盘,比如每0.5ms写一个d3dump01,每1ms写一个d3dump02,以此类推。每次写盘都相当于给求解过程拍了一张快照,里面包含节点坐标与速度、单元应力应变积分点数据、接触状态、材料历史变量等。默认情况下,LS-DYNA还会在计算的最后一步自动写一个d3dump文件,文件名序号继续递增。这个文件的大小取决于模型规模,我见过一个600万单元整车模型,单个d3dump就能超过8GB,所以做重启动规划时磁盘空间要提前留足。
d3full是用于全量重启动的数据库文件。它的内容比d3dump更“结构化”:保存的数据不是简单的内存快照,而是经过整理的全模型应力应变场、单元/节点拓扑信息、材料定义历史变量等,可以独立供新的输入文件重新组织模型使用。在单次计算中,d3full默认只在求解开始时和结束时各写一个,分别叫d3full01和d3full02。如果你需要在中途某个时刻形成全量重启动的基准点,就得用DATABASE_BINARY_D3LFULL和DATABASE_BINARY_D3LDBL加上*DATABASE_EXTENT_BINARY来控制输出频率。
d3dbl是d3full的“双精度版本”,光从文件名就能看出来,它记录的状态量精度更高,同时文件体积也更大。对于成型分析这类对回弹应力精度有苛刻要求的场景,我通常建议用双精度版本做全量重启动的基准,因为单精度在长历时的累积误差确实会在应力场上留下痕迹。d3full和d3dbl不能同时启用,二选一即可。
这些文件的生成机制,对应到关键字上,最基本的配置长这样:
*DATABASE_BINARY_D3DUMP $ dt 液晶 lcdt beam npltc pset我来解释一下这个卡片里最重要的字段:dt是每隔多少计算时间写一个d3dump,这里建议不要设置得太频繁,否则会严重拖慢I/O;液晶字段如果设为1,表示同时把d3dump也输出为ASCII格式,方便调试,但生产计算中强烈不建议开启,因为会成倍放大写盘时间和文件体积。
对于d3full,通过DATABASE_BINARY_D3LFULL控制写出的物理时间间隔,而输出哪些数据内容则由DATABASE_EXTENT_BINARY来决定。这张卡片的控制范围很细,从应力应变、截面力、壳单元历史变量,到是否输出接触的内能、沙漏力,都能独立开关。全量重启动时,一些隐藏的历史变量如果没在输出中打开,重启动后这些量的初始值可能就是空的,直接影响后续计算结果。
2.2 重启动状态文件的落点规划
建议每个重启动任务开始前,先把工作目录的文件生命周期理清楚。一个典型的工程目录可能包含原始k文件、历次d3dump文件、d3full文件以及它们对应的binout、glstat、ascii输出目录。重启动运行过程中,求解器会继续写入新的binout,文件名如果和中断前的重名,可能直接覆盖掉旧数据。我习惯上在每次重启动之前把旧目录整包复制并重命名加上时间戳,比如model_qxx_20230701,然后重启动的新输出写到干净的新目录,这样前后数据可以完整对比,不会出现“算完发现旧glstat被覆盖”的悲剧。
还有一点要特别提醒:动态模拟中如果用了*DATABASE_BINARY_D3PLOT,d3plot文件也能设置输出间隔,但d3plot不能作为重启动的输入文件。早期LS-DYNA版本里全量重启动还能读d3plot,但新版已经移除了这一路径。如果你手上只有d3plot而缺少d3dump/d3full,意味着这个模型已经无法重启动了,只能从头再跑。所以,凡是预期可能要重启动的项目,从第一秒起就把d3dump输出间隔规划好,这是成本最低的投资。
3. 简单重启动完整实操:中断续算、长时延展与坑位避让
简单重启动是日常用得最多的重启动方式,也是最容易踩坑的方式,因为它的门槛低,很多人以为随便拿个d3dump就能继续算,结果被各种一致性要求卡住。
3.1 从断点续算的完整步骤
一个最小可用的简单重启动任务,其实只需要两个东西:原始输入k文件 + 最新的d3dump文件。操作步骤如下:
- 确保工作目录里有完整的原始k文件(或至少是初始求解时使用的完整输入模型文件,包括include的文件全部齐全)。
- 确认d3dump文件完整且没有损坏。判断依据是文件修改时间是否落在最后一次写盘时间点,以及文件大小是否和前一周期相比稳定增长。损坏的d3dump读入时一般会直接报错,但有些损坏是静默的,报错会推迟到几步之后才出现,非常难定位。
- 在k文件中,把所有跟“第一次启动”相关的设置清理掉,尤其是初始条件关键字,例如*INITIAL_VELOCITY_GENERATION、INITIAL_STRESS_SOLID等,因为这些状态已经在d3dump里了,重复施加等于二次加载,模型结构会被严重污染。同时建议把终止控制关键字CONTROL_TERMINATION的时间调整为你希望到达的终点时刻。
- 在关键字文件中加入RESTART,并根据需要选择该项下面的参数。LS-DYNA的RESTART卡片核心字段是ias和ifr:
*RESTART $ ias ifr 1 1这里的ias参数控制是否在小重启动中读取新文件里的部分关键字,例如新增的曲线数据或输出控制。ifr参数则决定当你提交重启动任务时,求解器是否用项目名自动寻找最新版本的d3dump文件。如果ifr设为0,求解器默认读取当前目录里序号最大的d3dump,这很方便,但也容易让你在不小心留了多个d3dump文件时读错了版本。所以,真要严谨,将ifr设为1,并且在提交命令中用restart参数指定具体的dump文件,例如在命令行提交任务时加上restart=d3dump03,保证读取的是明确的那个文件。
- 提交命令和初算时差异很小,只是让求解器知道这是重启动。典型命令格式:
ls-dyna i=model.key restart=d3dump03 ncpu=16 memory=200m- 计算开始后,先不要急着离开。观察前面几步的glstat文件,确认时间步长没有异常跳变,总能量、沙漏能、滑移能都处在合理区间。重启动后最容易出现的直接崩溃是接触穿透,尤其是充气成型、碰撞这类强接触问题,接触面如果因为重启动文件的精度差异发生微小几何穿透,可能在几步内就产生巨大的接触力振荡。
3.2 变更CPU核数与MPI配置时怎么办
这是简单重启动最“堵心”的坑。LS-DYNA官方文档对simple restart有一个硬性限制:重启动时使用的CPU核数和MPI进程数与初算时必须完全一致。原因在于d3dump内部存储了与并行分区相关的数据结构,节点和单元在CPU间的归属划分跟初算时的拓扑绑定,换掉核数意味着分区方式变了,状态数据没法对应到新的进程组合上,直接表现就是读文件报错,或者算几步后内存越界。
我踩过一回:白天用服务器16核开算,晚上机房做维护把机器回收了,第二天给我分配了一台32核的新机器,我满怀希望地提交重启,结果连文件都读不进去,排查半天才确认是这个限制。现实的解决方案一般是三种:
第一种,如果是公司内部集群或者自己有管理员权限的机器,尽量让初算和重启动落在同一台机器上、同一套MPI环境下。这是最省心的。
第二种,如果一定要换核数,需要从simple restart切换成full restart。思路是初算时额外打开DATABASE_BINARY_D3LFULL的输出,把d3full文件作为重启动基准,在新核数环境下用新的输入文件加RESTART读入。全量重启动对CPU核数没有强制一致性要求,代价是你需要重新搭建输入文件中的输出控制、接触定义等非几何信息。
第三种,如果是商业集群调度系统,向管理员申请保留相同的节点数核心数配置,或者干脆把初算任务的核数设定写进作业脚本,重启动直接复用同一脚本,更改任务名和读取文件即可。
另外提醒一点:简单重启动如果涉及工作目录变更、模型文件名称变化,一定检查k文件中的include路径是否还是相对路径,别让求解器在找include文件时直接报出file missing错误。很多人重启动失败不是LS-DYNA的锅,而是k文件里写的绝对路径在新机器上根本不存在。
4. Full Restart 的模型改造边界:能改什么、不能改什么
Full restart是重启动里上限最高、也最容易误操作的部分。它能做的事情很多,但LS-DYNA内部对某些改动的接受程度,和物理上是否允许,是两回事。我从一次某零部件级回弹分析讲起,详细说说我理解中的改造边界。
4.1 分阶段工艺链中的典型应用
做过板料成形模拟的应该都熟悉这样的链路:先算拉延成形,再把成形结束时的状态作为初始条件做切边,最后释放约束做回弹。如果用full restart来串接,拉延阶段结束后,我们要在k文件里把模具的约束释放,同时把切边工艺带来的几何删除和新增节点/单元一并整理进模型。
这个阶段的实际操作是:主输入文件里包含前段模型的所有*PART、MAT、SECTION和接触定义,然后额外新增一个或几个PART,用来定义切边后的修剪部分或后续工装。去掉前段模具的刚体运动约束,改为适当位置的固定边界。最后在RESTART关键字里选择full restart模式,读取d3full文件作为初始状态。
这种做法的好处是应力应变场能无缝继承,特别是回弹分析中,成形后的残余应力分布是回弹变形的主要驱动力,如果从零初始应力算起,回弹量基本不准。我在实际项目里对比过一次:同一块高强钢门槛件,直接重新建模算回弹 vs full restart继承成形状态算回弹,最终回弹位移差了30%以上,可见应力场继承的重要性。
执行full restart时,新增的单元和部件可以自由定义初始状态,但已有部件的初始状态完全来自d3full里的应力应变数据。所以如果你在模型里修改了某个材料的弹性模量,那么重启动开始时,这个材料所有单元的应力值仍然是旧模量下的历史应力,求解器会基于新模量重新计算刚度矩阵——这在物理上相当于让一个已经变形的物体突然换了材料属性,应力场会在后续几步内重新平衡,伴随一定的能量扰动。如果修改幅度大,比如把钢材换成了铝,初始应力场可能远超新材料的承载范围,计算直接发散。所以全量重启动能改材料,但只能做局部参数微调,不能做跨量级替换。
4.2 可以安全触碰的模型区域
结合LS-DYNA的实际行为,我认为full restart下可以安全操作的包括以下几类:
- 修改载荷曲线(*DEFINE_CURVE)、幅值曲线、时间相关函数:这是最常见的用途,比如优化气囊的点火时刻、更换冲压的压边力曲线。
- 删除已有单元和部件:通过*PART_DELETE或直接在include中不include原part,可以将不再参与后续分析的部件移除。但要小心,删除的部件如果和非删除部件之间存在接触,删除行为会导致接触力瞬间变为零,可能在保留部件中激起虚假的动态响应。
- 添加新的部件、单元、约束和接触:前提是新增部分的初始状态合理(默认零应力),并且和原有状态在几何上不冲突。
- 修改非历史变量相关的材料参数:比如应力应变曲线中后续段的硬化数据、率相关的参数,只要不改变材料类型和状态变量的数量,修改后重新初始化在工程上是可接受的。
- 调整边界条件、约束方程、刚性体运动方式:这是回弹分析的常规操作。
不能触碰的红线包括:改变已有单元的几何拓扑(重新划分网格、修改单元连接关系)、改变单元类型(壳单元变实体)、改变材料类型(从MAT_PIECEWISE_LINEAR_PLASTICITY换成MAT_JOHNSON_COOK),以及修改任何和材料历史变量数量相关的参数。一旦触碰,求解器大概率不会直接报红字,而是在计算若干步后输出莫名其妙的应力或历史变量错误。
我这次把材料从Cowper-Symonds率相关模型换成Johnson-Cook模型做优化测试时,就撞上了历史变量不一致的问题。Cowper-Symonds只需要极少的历史变量存等效塑性应变,而J-C需要额外的温度等效历史变量。full restart读入d3full后,某些单元的历史变量数组长度匹配不上,表现是内存写越界,进程因为signal 11直接退出。反复检查才发现是材料模型切换带来的历史变量槽位冲突。后来指导我的前辈给了一个稳妥建议:必须保留材料类型,只允许在同一大类材料模型内部微调参数。这个经验我一直沿用到现在。
由此可以总结一个原则:full restart的模型改造,本质上是“在既有物理状态上做局部手术”,既要保证改动部分和未改动部分在初始状态上匹配,又要保证材料本构内部的历史变量体系不被破坏。任何可能引发“初始状态和新模型不自洽”的改动,都要带着十二分警惕对待。
5. 重启动失败排查链路:从报错信息反推到根因
重启动失败是最磨人的问题,因为错误通常在提交后几分钟甚至几十步之后才爆发,而且报错信息往往不是直接指向根因。我总结出一个相对固定的排查链路,可以大幅度缩短定位时间。
5.1 先看文件、再看环境、最后查模型
第一次做重启动排查时,我的习惯是直接盯着d3hsp文件翻找error关键字,这种方法虽然有效但效率低。后来我把排查顺序调整为三层:
第一层是文件层。提交重启动任务后,先确认读入的文件版本。d3dump和d3full都是从二进制文件读进来,如果文件本身来自不同版本的LS-DYNA求解器(比如初算用R11双精度,重启动用R12单精度),文件头里的版本标记不匹配,求解器会直接报“incompatible binary file”。这种情况我遇到过好几次——不同的license节点可能挂着不同的求解器版本,初算和重启动被调度到不同版本上就出问题。所以提交前先查版本号,统一求解器版本是个基准前提。
第二层是环境层。确认MPI配置、临时目录空间、共享内存设置。简单重启动对CPU核数的一致性要求前面说过,这一层的问题大多表现为读文件后直接hang住,或者在MPI初始化阶段报错。还有一种隐蔽情形:不同的MPI实现(比如MPICH和OpenMPI)也可能造成d3dump读取失败,因为它们对二进制文件中的分区元数据解释不同。所以,最稳的做法是同一台机器、同一套MPI、同一求解器版本,三者都对齐再提交。
第三层才是模型层。如果读文件正常、也成功推进了若干步,才需要考虑模型自洽性。这时优先看的是几个关键输出:glstat中的总能量曲线是否在重启动点出现跳变;binout里的接触力是否有突变;单元应力是否在重启动点附近出现异常峰值。能量曲线上如果出现明显台阶,基本可以断定是状态量继承出了问题,要么是历史变量缺失,要么是初始场和模型不匹配。
5.2 一次加密重启动失败案例的复盘
说一个比较有代表性的排查过程。某次我在做一个某型乘用车侧面碰撞的加密网格重启动任务,用于局部细化B柱区域的单元。由于加密网格意味着几何拓扑改变,这其实已经超出了普通full restart的能力范围,当时初步尝试是这么做的:先计算基础碰撞模型到某一时刻,生成d3full,然后在重启动模型的k文件里对B柱区域重新划分网格节点和单元,其他区域沿用原网格,希望通过d3full把应力继承到新的网格上。
结果第一次提交直接失败。报错信息很直白——某个单元读不到初始应力数据。后来分析了原因:d3full里保存的单元数据是按原始单元ID组织的,重启动模型里新划分的单元ID和原始单元ID部分重叠,加剧了状态量的错位。更深层的问题是,网格拓扑变更后,积分点数量、应力张量维度、历史变量均已无法对应。
这条路的最终结论是不该这么干。网格加密在LS-DYNA中要走专门的*MESH技术路线(例如自适应网格重构或映射网格),而重启动功能本身只支持“网格拓扑不变”的模型延续。这次失败也让我明白一个道理:重启动解决的是时间延续和状态继承,不是网格重构。凡是需要改几何网格的模型,重启动都不是正确的技术路径。
从那次以后,我的排查表里多了一条铁律:重启动报错如果伴随网格、单元号相关字眼,别再折腾重启动参数了,先回到网格策略本身——到底是整体重算,还是采用重映射方案,优先级远比重启动本身要高。
6. 重启动结果一致性验证与工程验收经验
重启动计算完成后,验证结果是否可信是最容易被忽略、也最致命的一环。很多人看到重启动能正常跑完,就直接把结果拿去做结论了,结果可能整个后半段分析都是失真的。这里分享一套我一直在使用的验证套路。
6.1 能量平衡全局检查:先宏观再微观
无论简单重启动还是全量重启动,先看全局能量曲线永远是第一步。正常重启动后,总能量(total energy)从重启动点开始应该是光滑连续的。如果出现明显的上下跳变,说明状态量在衔接点丢失或者重复计入了。尤其要关注滑动能(sliding energy)和沙漏能(hourglass energy),因为这两项对重启动过程中的接触状态和时间步长最敏感。滑动能在重启动点出现负值跳动,通常意味着接触面的穿透/脱开状态发生了误判,这在碰撞类模型里尤其要警惕。
我通常的做法是:在重启动点前后分别输出能量数据,生成一条跨重启动点的可视化曲线,用后处理软件查看衔接是否顺滑。顺滑的标准不是数值完全一致——允许微小偏差,因为在二进制文件写入和读入之间,相对误差通常控制在千分之一之内——而是趋势和斜率不能发生突变。一旦有突变,直接排查重启动基准文件是否由于磁盘写入中断而损坏,或者模型改动是否超出了合理范围。
6.2 局部响应对照:位移、应力、接触力的逐项校验
全局能量没问题之后,再抽样查看关心区域的局部响应。具体到不同工程场景,侧重点不一样:
- 碰撞分析重点看关键点的位移时程曲线和加速度曲线,与不使用重启动的完整分析进行对比。条件允许时,对同一个模型同时做一次完整计算和一次“人为中断-重启动”计算,两者在重启动点之后的响应差异在工程允许误差内(我个人的接受阈值是位移偏差5%以内),说明重启动状态继承可靠。
- 板料成形分析侧重等效塑性应变分布和厚度减薄率的一致性。
- 回弹分析要重点关注应力场在重启动点前后的连续性和回弹位移的可重复性。
抽样位置要有代表性:高应力区、接触区、模型边界、载荷施加区各抽几个节点。用ASCII输出或binout提取节点时程数据,把重启动计算和完整计算的差异量化出来。
用一张简单的验收表说明:
| 检查项 | 检查方法 | 可接受判据 |
|---|---|---|
| 总能量连续性 | 重启动点前后glstat曲线 | 无跳变、斜率连续 |
| 沙漏能 | 重启动点附近曲线 | 占比总能量<5%且无突增 |
| 关键点位移 | 和完整计算对比 | 偏差<5% |
| 关键单元应力 | 重启动点前后应力场快照 | 相对偏差<1% |
| 接触力连续性 | binout提取接触力时程 | 无非物理振荡 |
6.3 必要时做一次“预演重启动”验证
对重要模型,我建议在正式使用重启动之前先做一次低成本的预演。所谓预演,就是选定一个中间时刻,让计算正常跑到该时刻,然后用该时刻的d3dump做一次简单重启动,连续计算到终点;再另外做一次不中断的完整计算。两者对比,如果能量曲线和关键点响应高度一致,说明这套文件体系和配置是可信的。
这个预演会增加一部分机时消耗,但从工程可靠性的角度看,非常值得。我曾在一次预演中发现,某版本求解器在简单重启动后会重置部分接触阻尼状态,导致后续几步出现微观振荡。如果不是预演提前暴露,直接拿去跑数小时的正式任务,等到终点再发现问题,损失完全不同。
预演本身也是检验重启动文件和环境配置的最好手段——如果预演能和完整计算吻合,后续的重启动流程就可以放心复用。
7. 最后再分享一点实际体会
LS-DYNA重启动这件事,看似功能简单,实际用起来边界和坑都很多。我最早接触时以为它只是“续算”,后来经历了d3dump与MPI配置冲突、full restart历史变量错位、网格拓扑变更的无效尝试之后,才逐渐形成一个相对系统的判断框架:先分清场景是续算、分阶段、还是参数优化;再根据场景选择simple restart还是full restart;然后验证文件、环境、模型三层是否匹配;最后必须做能量与局部响应一致性校验。
重启动真正考验人的不是它本身的操作,而是使用者对这个模型在算完一段之后的物理状态有没有清晰的预期。你得知道某个时刻模型里的应力场是什么量级、哪些区域接触状态敏感、哪些历史变量对后续结果影响最大,才有可能在改造模型后仍然保证结果的合理性。
同时务必养成好习惯:重启动任务开始前,完整归档原始模型和上一次计算的全部输出数据;规划好输出文件的命名与目录,避免覆盖;在项目关键节点主动落盘d3dump或d3full文件,而不是等中断发生后才去回忆有没有配置输出。这些看似小事的习惯,能在关键时刻帮大忙。