
多孔延时起爆模拟这个事我琢磨了挺长时间也被LS-DYNA各种“看似正常其实全错”的结果坑过。爆炸力学里多点起爆本身就是技术活难点不在几何建模也不在算例规模而在于你能否把起爆点的时间序列和材料参数控制清楚。起爆时间写错一位小数或者JWL状态方程某个系数没对齐单位算出来的应力云图就是另一套物理世界的东西。先把话说在前头所谓多孔延时起爆简单讲就是多个炮孔或药包按预设时间差依次起爆利用应力波的先后到达、叠加和相互干扰来控制破碎方向、块度分布以及爆破振动。隧道光面爆破、露天台阶爆破、拆除爆破里这套思路都是核心。LS-DYNA做这事主要靠两个东西一个是*INITIAL_DETONATION关键字把起爆点坐标和起爆时间管理起来另一个是炸药、岩石、空气的材料参数与状态方程必须匹配一致。这两个点就是整个模拟成败的关键也是我今天想详细聊的内容。看这篇文章的人我默认你至少打开过LS-DYNA或者看过K文件知道什么叫part、什么叫网格。如果你是完全零基础也没关系我会把每一步的“为什么”也讲清楚。1. 多孔延时起爆的物理本质和仿真难点1.1 单孔和多孔在力学响应上到底差在哪单孔起爆岩体里传播的是一个相对规则的柱面波或球面波应力随距离衰减边界条件也简单仿真起来是件“熟能生巧”的事。但多孔起爆不一样两个孔之间会存在压应力波相遇在某些位置产生应力叠加在另一些位置又可能产生拉应力区。最典型的物理现象就是孔间裂缝。如果两个炮孔同时起爆冲击波在孔间中线相遇会产生一个强烈的拉伸阶段裂纹会优先沿着两孔连线方向扩展。这也是为什么光面爆破要求周边孔尽量同段起爆的原因——为了形成平整的贯穿裂缝。可一旦把起爆时间错开这个相遇点就不再是两孔连线中点而是偏向先起爆的那个孔裂缝走向会完全改变。这个物理逻辑放在仿真里意味着你对起爆时间的控制必须精确到能反映“波前到达位置”的差异。LS-DYNA是显式动力学求解器时间步长通常小到微秒量级起爆延迟如果只差几十微秒结果里就会看到完全不同的叠加图形。1.2 “时间线”为什么是命门很多人做多孔模拟把模型建好、材料填完、起爆点随便一扔就跑计算了。结果后处理一看三个孔的压力云图跟一个孔差不多就以为代码出了问题。实际上很可能是起爆时间没拉开或者输出间隔太大压根没捕捉到不同起爆时刻之间的过程。严格来说起爆时间线的设置必须和你的研究目标匹配。如果你关心的是爆轰波在炸药内部的传播和孔间应力叠加时间延迟应该设置在几十微秒到几毫秒量级如果你关心的是岩体破碎块度、抛掷效果起爆间隔就要往几十毫秒的真实爆破网络靠。这个尺度差异直接决定了你要看多长的时间窗也决定了后处理时要把输出频率设到多密。1.3 LS-DYNA在这个问题上的定位LS-DYNA并不擅长模拟炸药的详细化学反应它把爆轰过程理想化了。炸药用的是程序爆轰模型也就是给定爆速D和CJ爆压从起爆点出发按爆速推进爆轰波阵面波经过的单元被点燃再通过JWL状态方程计算爆轰产物的压力。这个简化非常合理因为我们在爆破工程里关心的不是炸药分子层面的反应而是应力波如何作用到介质上。所以LS-DYNA做多孔延时起爆模拟真正的核心工作就是三块材料本构及状态方程、起爆点时间线、网格与时间步的匹配。这三块搞定了仿真基本就成了。2. 材料参数与状态方程——这是最容易翻车的地方2.1 炸药本构高频燃烧模型加JWL状态方程LS-DYNA里炸药最常用的组合是*MAT_HIGH_EXPLOSIVE_BURN加*EOS_JWL。前者负责“什么时候燃、燃多快”后者负责“燃烧后产物的压力是多少”。*MAT_HIGH_EXPLOSIVE_BURN核心参数就几个密度RO、爆速D、CJ压力PCJ和燃烧系数BETA。其中PCJ是Chapman-Jouguet爆轰压力是爆轰波阵面上的特征压力。BETA一般取0表示当前单元一旦被波阵面穿过就整个烧掉不需要额外模拟层流燃烧速率。*EOS_JWL才是决定压力数值的关键。JWL方程长这样P A(1 - ω/(R1V))e^(-R1V) B(1 - ω/(R2V))e^(-R2V) ωE0/V这里V是爆轰产物的相对体积E0是初始比内能A、B、R1、R2、ω都是拟合参数。前两项在高压时起主要作用第三项负责低压后期的能量释放。说人话就是A、R1控制爆轰波刚产生那一下的巨大压力B、R2控制中期的膨胀压力ω和E0管后期气体膨胀做功。以TNT为例常用参数大致如下参数取值单位说明RO1630kg/m³D6930m/sPCJ21.0e9PaA371.2e9PaB3.231e9PaR14.15无量纲R20.95无量纲OMEGA0.30无量纲E07.0e9J/m³V01.0无量纲K文件里就这样写*MAT_HIGH_EXPLOSIVE_BURN $ mid ro d pcj beta 1 1630.0 6930.0 21.0e9 0.0 $ *EOS_JWL $ eosid a b r1 r2 omega e0 v0 1 371.2e9 3.231e9 4.15 0.95 0.30 7.0e9 1.0这里必须强调上面这些参数只是TNT的常见参考值不同文献和不同装药状态会有出入。真正做工程模拟前最好找同源文献的标定数据代入前先做一维或单孔验证确认爆压峰值和爆速合理再铺开到全模型。2.2 岩石介质要能变形也得能“坏”岩石材料的选取直接决定你能不能看到“裂缝、破碎”这类现象。如果岩石只建模成弹性体那不管你怎么调起爆时序云图里都只会有一圈圈应力波看不到单元失效和裂纹扩展模拟就失去了工程意义。简单有效的方案是用*MAT_PLASTIC_KINEMATIC配合失效应变。它既能反映塑性变形又会在等效塑性应变达到阈值时删除单元模拟岩石的破坏。参数大致按照中硬岩来给参数取值说明RO2600kg/m³E50e9Pa弹性模量PR0.2泊松比SIGY100e6Pa屈服强度ETAN2.0e9Pa切线硬化模量FAIL0.15失效应变BETA1.0考虑硬化如果希望对破坏模式控制得更细可以再加*MAT_ADD_EROSION按最大主应力或压力阈值来删除单元模拟拉裂纹。多孔延时起爆研究里孔间拉伸裂纹往往比压碎更能说明时序设计的优劣所以一个合理的侵蚀准则是少不了的。岩石材料写在K文件里长这样*MAT_PLASTIC_KINEMATIC $ mid ro e pr sigy etan beta fail 2 2600.0 50.0e9 0.20 100.0e6 2.0e9 1.0 0.152.3 空气介质别让应力波跑到边界又弹回来空气在爆破模拟里一般用*MAT_NULL配合*EOS_LINEAR_POLYNOMIAL。空气虽然不参与承载但爆轰产物膨胀时需要推开空气而且冲击波需要通过空气域向远处传播。空气的初始内能E0不能给0否则压力是负的计算会崩。*MAT_NULL $ mid ro pc mu ... 3 1.225 0.0 0.0 $ *EOS_LINEAR_POLYNOMIAL $ eosid c0 c1 c2 c3 c4 c5 c6 e0 v0 3 0.0 0.0 0.0 0.0 0.4 0.4 0.0 2.5e5 1.0模型外边界还要加无反射边界条件否则应力波会在截断边界上反射回来几毫秒后计算结果里就会多出一些不该存在的应力波干扰你对延时叠加效果的判断。3. 起爆点时间线控制——LS-DYNA里怎么把“先后顺序”写清楚3.1 起爆卡片拆解多孔起爆最核心的关键字是*INITIAL_DETONATION一个卡片定义一个起爆点。一张卡可以整出多个起爆点只要你把每一行按时序要求写好*INITIAL_DETONATION $ pid x y z lt 1 0.0 0.0 1.0 0.0 1 1.0 0.0 1.0 0.002 1 2.0 0.0 1.0 0.005字段分别对应PID要起爆哪个part的炸药、X/Y/Z起爆点坐标、LT起爆时刻。如果你有多个炸药part也可以在不同行写不同的PID。LS-DYNA会从每个给定坐标点出发以材料卡里的爆速D向外推进爆轰波阵面。注意起爆点坐标一定要落在炸药单元内部。很多新手把起爆点放在炸药表面或者紧挨着孔壁的位置结果要么炸药不燃要么爆轰波推进曲线特别奇怪。我一般会把起爆点设在每个药卷几何中心偏下端一点的位置模拟雷管所在位置。3.2 三种时间线策略对应不同工程目标实际使用中时间线不是随便拉的。我归纳下来大概三种第一种全部同段起爆也就是LT全部相同。这种最省事应力波在孔间对称叠加能产生比较强的拉应力带适合光面爆破、预裂爆破的机理研究。缺点是峰值应力大振动大起爆点之间几乎没有时序上的差异可以分析。第二种等间隔延时起爆。孔与孔之间按固定时间差Δt依次起爆模拟逐孔起爆的台阶爆破网络。Δt的设置要参照岩石中应力波从一孔传到另一孔的时间。举个简单的数字例子孔距1米岩石纵波波速约4000 m/s那么应力波走完孔间距离大概需要0.25毫秒。如果Δt只有0.05毫秒那么第二个孔起爆时第一个孔的应力波还没走远两者仍然会在孔间区域强烈叠加效果接近“准同时起爆”如果Δt放到0.5毫秒以上波前已经越过第二个孔位叠加效果会明显减弱变成先后独立破碎。到底选多大取决于你要不要孔间贯穿裂缝。第三种不等间隔延时起爆。有些设计需要某个区域先形成破碎带再引导后续爆破错峰释放。这时候时间差就不是等差数列可能前段密、后段稀甚至有一段完全空白。这种序列在K文件里也没啥特殊操作就是不同起爆行写不同的LT。但后处理的时候特别容易混淆我习惯在建模阶段就把每孔编号、坐标、LT整理成一张表对着表写K文件对着表看结果。3.3 大量炮孔怎么批量写起爆点几十个孔还手动写K文件吗我是不写的。用任何你顺手的脚本语言生成一份起爆卡片片段然后粘贴进K文件即可。比如用Python按孔位坐标和网络时序生成holes [(0.0, 0.0), (1.0, 0.0), (2.0, 0.5), (3.0, 1.0)] delay 0.002 # 2ms等差延时 with open(detonation.txt, w) as f: for i, (x, y) in enumerate(holes): f.write(f 1 {x:.3f} {y:.3f} 1.0 {i * delay:.6f}\n)生成的内容直接接到*INITIAL_DETONATION下面既不会漏孔也不会手抖把时间写反。这个习惯我后来一直保留着尤其是遇到几十个炮孔的台阶爆破模型手写绝对要出事故。4. 一个三孔延时起爆的实操全过程4.1 几何、网格和单位制实例就用最简单的三孔模型孔距1米三个药包沿x方向一字排开孔径0.05米药包长度0.4米埋在岩体里。岩体范围取5米×3米×2米四周设置无反射边界。单位制这里我统一用m-kg-s所有物理量都换算成国际单位。用这套单位的好处是参数表几乎不用换算JWL里的A、B、E0直接拿Pa和J/m³写不容易看错。网格上药包附近的单元尺寸取0.02米左右大概是孔径的0.4倍用来保证压力梯度看得清。远离药包的地方放大到0.05米到0.1米中间做渐变过渡。药包之间尤其是中线附近网格尽量加密因为那是应力波叠加和裂纹扩展的关键区。4.2 材料卡片汇总把前面说的材料合到一起大概是这样一个结构*PART $ pid sid mid eosid hgid 1 1 1 1 1 2 2 2 0 1 3 3 3 3 1PART 1是炸药PART 2是岩石PART 3是空气。炸药和空气用JWL、多项式状态方程岩石用塑性随动模型全都开沙漏控制。4.3 起爆时间序列设计为了让大家看出时间线对结果的影响我这三个孔采取不等间隔延时第一孔0毫秒起爆第二孔0.5毫秒后起爆第三孔2.5毫秒后起爆。这样做的意图是第一孔和第二孔时间间隔短应力波还在孔间区域徘徊时第二孔就响了两孔之间的应力叠加会比较明显第二孔和第三孔间隔拉长到2毫秒让先前的应力波先走远第三孔更近似独立起爆。对应的K文件片段*INITIAL_DETONATION $ pid x y z lt 1 0.0 0.0 0.4 0.0 1 1.0 0.0 0.4 0.0005 1 2.0 0.0 0.4 0.0025注意坐标的z值。药包中心在0.4米高度起爆点放在药包中心稍稍偏下更接近雷管实际位置。如果你只关心平面内的波传播z取多少其实影响不大但别放在药包的边界单元上。4.4 输出设置和后处理验证输出频率一个重要的建议是D3PLOT的输出时间间隔必须小于最小起爆延时不然你根本看不到“第二孔还没响”的中间状态。三孔模型里最小间隔0.5毫秒那我就把输出间隔设成0.05毫秒。这样每一孔起爆前后至少有几十帧数据动画放出来才能看出爆轰波逐孔推进和叠加的过程。同时用*DATABASE_HISTORY_SOLID记录几个关键单元的压力变化。我一般会在三孔连线的中点、第一孔与第二孔之间的位置、远处岩石表面各放一个观测单元。后处理时直接把这三个单元的压力时间曲线叠在一起就能清楚看到波峰到达的时间差与设定的起爆延时是否吻合。如果单元A的峰值压力出现时刻、单元B的峰值压力出现时刻与理论传播时间对不上大概率某个环节的起爆时序或材料参数有问题。4.5 结果里应该看到什么先起爆的第一孔会先产生一个柱面波等它扩散到第二孔附近时第二孔起爆第二孔附近会出现新的高压源两个波前在孔间区域叠加峰值压力会比单孔明显抬高。第三孔起爆时第一孔产生的波已经传播了将近10米早就超出模型范围或已经衰减所以第三孔周围的应力场更像单个炮孔的响应。如果你把压力云图调成半透明配合岩石单元的失效状态还会看到第一孔和第二孔之间的失效带明显比第二孔和第三孔之间更连续、更规则。这就是延时设计不同带来的裂缝形态差异也是多孔延时起爆模拟最想看到的工程信息。5. 实操中的坑与排查经验5.1 起爆点写错位置炸药就是不炸最常见的问题没有之一。起爆点坐标不在炸药单元内部或者炸药part的ID填错表现是炸药材料没有任何反应压力始终是0。排查方法很简单在LS-PrePost里把起爆点坐标显示出来看它到底落在哪个单元里同时确认那个单元是炸药part。如果多个孔共用一个PID所有起爆点都可以指向同一个part这是允许的。但要注意一个part内多个起爆点同时作用爆轰波会从多个位置向外推进波前相遇处会有一个高压碰撞区这是真实存在的物理现象不属于错误。5.2 爆压总是偏低或者压力波形不对优先怀疑JWL参数和单位制。很多人从论文里抄参数没注意论文用的可能是cm-g-μs单位制压力单位是Mbar换算成Pa差了整整10的11次方。代入之后爆轰产物压力被压得很小岩石几乎纹丝不动。还有就是E0的初值。空气的E0不能给太小否则爆轰产物膨胀过程中会把空气拉伸成负压力计算几步就出负体积。炸药的E0则必须和爆速CJ参数匹配不同装药对应不同数值不能随便拿一组参数拼接。5.3 负体积和网格畸变多孔延时起爆模型里装药周围网格受的压力梯度极大拉格朗日网格很容易畸变。我常用的处理办法有三种第一炸药和空气用共节点方式建模但给它们开沙漏控制并适当降低时间步长缩放因子TSSFAC比如从默认0.9调到0.6。第二岩石单元加侵蚀让过度畸变的单元及时删除避免负体积连锁反应。这个做法的代价是单元删除后裂纹看起来略微离散但整体应力波趋势是准的。第三如果后期要模拟爆腔膨胀和抛掷拉格朗日格式就不太合适了建议换ALE多物质或者SPH。起爆时间线部分完全不受影响只是材料算法换了。5.4 常见问题速查表现象可能原因排查与处理炸药不爆压力为0起爆点不在炸药单元内检查坐标与part归属爆压明显偏低JWL参数单位制不一致统一换算到m-kg-s或mm-ms-吨压力曲线振荡剧烈时间步过大或沙漏控制不足TSSFAC降到0.6增强沙漏控制网格负体积炸药附近网格畸变岩石加侵蚀、局部重划分应力波反射干扰结果没有无反射边界或边界太小添加无反射边界并扩大空气域多孔效果几乎看不出起爆延时过短或输出间隔过大对比应力波传播时间调大延时或加密输出程序运行极慢网格过细模型过大药包附近加密远场放粗5.5 一个时间步与网格的匹配技巧显式动力学的时间步受最小单元边长和材料波速控制。单元分得太细时间步就小得离谱几毫秒的起爆时序要跑很久。我一般会先跑一个不含炸药的单孔模型观察最小时间步的数值再估算完整模型的时间成本。如果算出要跑几个星期那就果断把起爆区域以外的网格放大或者用质量缩放强行调大时间步但质量缩放不能加太多否则爆轰波前的应力云图会失真。6. 继续往下扩展的几个方向多孔延时起爆模型搭顺了之后可以玩的花样其实很多。同一套时间线控制方法可以迁移到预裂爆破、光面爆破、逐孔起爆台阶模型里无非是调整起爆点坐标和LT序列。你甚至可以把它和数据优化算法接在一起用程序生成几十组延时方案批量跑仿真再自动比对指定区域的压力峰值或裂纹密度去搜索最优时序。我自己在实操中的一个习惯是每做一个新延时方案都同时跑一个“同时起爆”的对照组。这样对比起爆顺序对孔间应力和失效形态的影响就非常直观。对照组可能用不了多少额外时间但它会让你对仿真结果有一眼看懂的能力。材料库方面我建议逐步沉淀属于自己的参数表。每一个模型跑完都把使用过的炸药品种、岩石类别、JWL参数来源、验证结果记录下来。这个动作救过我很多次尤其是隔了几个月回来复用模型的时候没有这套记录光凭记忆真的会把人逼疯。多孔延时起爆模拟做到最后你会发现它考的不是你会不会点开某个软件按钮而是你对爆炸力学最基本的应力波传播逻辑是否清楚。时间线是表象应力波叠加才是本质。LS-DYNA只不过是把这套物理规律老老实实地算了出来。把这一点想透了无论炮孔排成什么形状、延时怎么千变万化你都能很快给出靠谱的仿真方案。