
FLAC3D 里做隧道衬砌、基坑支护的基本都会遇到同一个坎模型算完了应力云图花花绿绿很漂亮可设计院要的偏偏是弯矩图、轴力图和剪力图不是应力。我自己第一次做地铁区间衬砌的内力提取也被 shell 单元的“弯矩到底在哪看”绕了很久。明明结构单元算出来的是应力但规范、配筋、裂缝验算要的全是内力这一步接不上后面全卡住。这篇文章就把 shell 单元、liner 单元的弯矩、轴力、剪力提取这件事讲透。不绕弯子直接从原理到实操把 FLAC3D 里结构单元内力提取的几种方法、注意事项和常见坑全部过一遍。适合正在用 FLAC3D 做地下工程、边坡、基坑数值分析的研究生、工程师也适合刚接触结构单元后处理、想搞清楚“节点力”和“单元内力”区别的初学者。1. 内容整体设计与思路拆解1.1 先搞清楚shell 单元和 liner 单元到底用哪个很多新手一上来就纠结选 shell 还是 liner其实这两个单元的定位差异非常明确选错才会出问题。shell 单元在 FLAC3D 里是纯粹的结构单元它的逻辑是把你需要的结构面离散成薄壳通过截面应力积分得到内力。它本身没有“和岩土发生界面滑移”的概念适合模拟与周围介质变形比较协调的结构比如锚喷面层、地表板、衬砌的简化模型。liner 单元则是在 shell 的基础上增加了一组“结构-岩土相互作用”的耦合逻辑包括法向弹簧、切向弹簧还能考虑渗透压力和排水条件。这正好对应隧道衬砌的实际受力状态衬砌背后有围岩压力有法向挤压也可能有切向摩擦还有地下水渗流带来的孔隙水压力。所以做隧道衬砌模拟用 liner 单元通常比 shell 更合理。这里给出一张对比表方便快速选型。对比项shell 单元liner 单元结构本构弹性/弹塑性壳单元弹性/弹塑性壳单元法向耦合无靠接触力传递有法向耦合弹簧切向耦合无有切向耦合弹簧渗流/孔隙压力不直接支持支持水力耦合适用场景板、面层、简化的衬砌隧道衬砌、地下洞室支护内力输出轴力、剪力、弯矩轴力、剪力、弯矩附加接触力需要注意的是liner 单元虽然多了耦合弹簧但你提取“结构本身”的轴力、弯矩、剪力时方法和 shell 几乎完全一样。区别在于 liner 单元还附带输出“接触法向应力”和“切向剪应力”这两项用于评价围岩和衬砌之间的荷载传递状态不要和结构内力混在一起。1.2 核心原理为什么节点力不等于你要的弯矩这是整个提取过程里最容易被绕进去的一步。FLAC3D 结构单元在每个节点上都有节点力node force和节点力矩node moment很多用户看到“力”字就觉得可以直接拿去设计其实不行。节点力是结构在平衡状态下由外力、相邻单元内力共同形成的集中力它的量纲是“力”单位是 N 或者 kN。而结构设计需要的内力是“单位长度上的截面力”比如单位长度轴力 NN/m、单位长度剪力 QN/m、单位长度弯矩 MN·m/m。这两个物理量差了整整一个“长度”的量纲。FLAC3D 的 shell/liner 单元在计算时本质上是把截面应力沿壳厚度积分。积分结果就是“单位长度薄膜力 单位长度弯曲矩”薄膜力membrane force对应轴力 N 和面内剪力横向剪力transverse shear对应剪力 Q弯曲矩bending moment对应弯矩 M。你可以把 shell 单元想象成很多根“单位宽度的小梁”拼接在一起。每根小梁承担自己的轴力、剪力和弯矩单元内力输出给用户的正是这种“每延米宽度”的小梁内力。所以当你在后处理里看到弯矩数值是“多少多少”要清楚那是“每米宽度上的弯矩”实际配筋计算时再结合衬砌环向宽度或验算断面宽度去换算。理解了这一层你再看 FLAC3D 里的输出变量名就会清楚很多。那种直接叫 force 的往往是节点力或者单元端部力不能直接当设计内力用真正设计要的通常是单元积分点上的截面内力。1.3 这个方法能覆盖的工程场景内力提取不是只服务隧道衬砌。岩土工程里凡是涉及“薄壳结构”的数值分析都逃不开这套方法。隧道与地下洞室的初支、二衬内力评价基坑围护结构中的地下连续墙、水平支撑如果用壳单元模拟墙身边坡工程的锚喷面层、挡土板矿山巷道锚喷支护的内力分布管道、涵洞等线状结构的壳单元模拟。在这些场景里设计人员关心的问题高度一致我的衬砌厚度够不够哪个断面弯矩最大轴力是受压还是受拉剪力是否超过截面抗剪承载力。这些问题的答案全都要靠提取出的内力数据来回答。把提取流程捋顺等于打通了数值计算和结构设计之间的那座桥。2. 核心细节解析与实操要点2.1 提取前必须做的三项检查我有几次提取出来的弯矩数据离谱得没法看回头排查问题都不在提取方法本身而是模型源头上就有毛病。所以在动手提内力之前先过这三关。第一关单元法向方向。shell/liner 单元的法向方向直接影响内力正负号的解读。如果你建单元时法向朝内和法向朝外得到的“弯矩正号对应哪侧受拉”完全是相反的。检查方法很简单在 FLAC3D 绘图窗口里把结构单元的法向箭头显示出来确认所有单元法向一致。对于隧道衬砌通常统一指定为“指向围岩外侧”或者“指向隧道内侧”整套模型保持一致后处理时心里才有底。第二关材料参数和本构模型。shell/liner 单元的内力计算依赖单元厚度、弹性模量、泊松比等参数。厚度写错一位小数弯矩差的就是一个数量级。尤其注意 shell 单元的“厚度”和你最终设计衬砌厚度是否是同一个值如果你是为了模拟初支二衬的组合结构可能需要用等效厚度不能直接把两个厚度加起来用要按照等效刚度换算。第三关单位制统一。FLAC3D 是一个“无单位”的软件它不管你怎么输入只按数值计算。如果你用 m、N、Pa 计算和用 cm、kg、MPa 计算输出的内力数值会差出好几个数量级。最稳妥的办法是开算之前就固定一套单位制我习惯用“m kg N Pa”这套因为导出后处理数据时不用额外换算。等到提取内力时要能明确说出你当前模型里“一米是多少、一牛是多少”。2.2 三条提取路径怎么选FLAC3D 里提取结构单元内力我常用三条路各有适用场景没有绝对的优劣。路径一GUI 后处理直接看。打开 Plot 窗口添加 StructuralElement 图元然后在变量选择里找到结构单元的内力分量比如弯矩分量、轴力分量、剪力分量。这个方法最快适合“我就想知道最大弯矩发生在哪个位置”这种快速判断。但它有个突出问题GUI 上看的是一幅云图拿不到具体数值序列也没法直接导出成设计用的 Excel 表。路径二sel recover 类似命令把内力“恢复”到单元场。这个思路相当于让程序把所有结构单元的内力在单元面上重新插值、平滑一遍然后你可以在云图或者数据导出里看到比较完整的分布。这个方法在 FLAC3D 7.0 里使用体验更好适合需要做精确后处理、出一张干净的内力云图的场景。需要注意恢复场本身是一种后处理插值网格越粗插值结果和原始单元积分点值的偏差可能越大不要盲目相信“平滑后很漂亮”的图。路径三FISH 脚本遍历结构单元把内力写到文件。这是最灵活、也最一劳永逸的方案。写一个脚本遍历所有 shell/liner 单元读取每个单元质心的坐标和对应内力分量然后输出成 CSV 或 txt 文件之后用 Excel、Origin、Matlab 随便怎么处理。这个方法适合批量计算、参数分析以及需要把内力曲线画出来做包络图的场景。三条路径不是互斥的。我实际工作中通常是 GUI 先扫一眼整体分布判断模型是否正常再用脚本导出数据做定量分析。建议你也建立类似的流程不要只会一种。2.3 读懂输出变量force 和 moment 的分量对应关系FLAC3D 结构单元的内力输出是定义在单元局部坐标系下的。每个 shell/liner 单元有自己的一套局部坐标轴通常 x 轴和 y 轴在壳面内z 轴沿法向。内力输出的分量也是跟着这套局部轴走的。这张对应关系表对你后面读数据非常重要输出分量物理含义典型用途force-x局部 x 方向单位长度轴力面内薄膜力判断衬砌环向/纵向受力force-y局部 y 方向单位长度轴力面内薄膜力判断另一方向面内受力force-xy面内剪切薄膜力面内剪切验算moment-x绕局部 x 轴的弯矩对应 y 方向弯曲主弯矩方向判断moment-y绕局部 y 轴的弯矩对应 x 方向弯曲主弯矩方向判断shear-x / shear-y单位长度横向剪力截面抗剪验算这里的“局部 x、y”不是你模型全局坐标系的 x、y而是每个壳单元自己的一套坐标。所以你会发现一段弧形衬砌的不同位置输出力分量的方向是不断变化的。这不代表结果错了反而是正确的因为内力本来就该按结构局部坐标来定义。在实际操作时我建议提取数据时连同单元质心的全局坐标一起输出回到 Excel 里再按坐标重排数据这样可以从“哪个位置的内力”逆推出是拱顶、拱腰还是仰拱非常直观。3. 实操过程与核心环节实现3.1 一个能跑通的简化模型示例用一个圆形隧道衬砌的简化模型来演示完整流程。隧道半径取 3.0 m衬砌采用 liner 单元模拟厚度 0.3 m材料参数取 C30 混凝土对应的弹性参数围岩简化为均匀地层只做弹性分析。这个模型的目的是演示内力提取所以没加复杂的节理、渗流和开挖工序。真实项目里这些因素当然要考虑但内力提取方法完全一样。参数数值隧道半径3.0 m衬砌厚度0.3 m衬砌弹性模量30 GPa衬砌泊松比0.2围岩弹性模量1.0 GPa围岩泊松比0.3地应力按静水压力 5 MPa建模大致思路是先生成地层网格挖出隧道空间然后在隧道洞壁表面创建 liner 结构单元连接好结构-围岩界面再施加重力或地应力求解平衡。这一步骤本身内容不少但今天的重点不在建模所以建模部分就不逐条展开了。假如你是第一次建衬砌模型建议在 FLAC3D 帮助文档里搜“liner create by-geometry”或者“structure liner create”先跑通一个最简模型再回来。3.2 用 GUI 快速定位最大弯矩位置模型算完第一步我永远是在 GUI 里看整体分布。操作路径Plot 窗口添加 StructuralElement 图元在变量列表里切到弯矩分量比如 moment-y 或 moment-x然后调整色标范围把最大、最小值的区域标出来。这里有一个非常实用的技巧把 Plot 里结构单元的图元叠加在围岩截面云图上方透明度调到 60% 左右这样可以看到衬砌内力最大位置对应围岩的哪个区域。比如我导出的结果可能显示拱脚附近弯矩最大而那个位置恰好是围岩塑性区比较集中的地方两者相互印证说明结果趋势上可信。GUI 阶段不需要追求精确数值重点看两件事一是分布连续不连续二是极值位置在不在你预期的工程部位。如果出现“拱顶为正弯矩、仰拱也是正弯矩”这种明显不符合对称性的分布先不要急着导出数据回模型里检查荷载和约束是否对称而不是直接进入脚本提取。3.3 用脚本批量导出轴力、弯矩、剪力到 CSVGUI 看完趋势接下来就是干正事把单元内力批量导出。以 FISH 脚本为例思路是遍历模型中所有结构单元筛选出 liner/shell 类型读取质心坐标和内力分量写进 CSV 文件。我写过一个非常基础的导出脚本框架如下def export_internal_forces local fname shell_internal_forces.csv local fp io.open(fname, w) io.write(fp, x,y,z,moment_x,moment_y,shear_x,shear_y,force_x,force_y\n) local s structure.list loop while s # null if structure.type(s) liner | structure.type(s) shell local pos structure.pos(s) local m structure.moment(s) local sh structure.shear(s) local f structure.force(s) io.write(fp, string(pos(1), 6, 3) , string(pos(2), 6, 3) , string(pos(3), 6, 3) , string(m(1), 12, 4) , string(m(2), 12, 4) , string(sh(1), 12, 4) , string(sh(2), 12, 4) , string(f(1), 12, 4) , string(f(2), 12, 4) \n) endif s structure.next(s) endloop io.close(fp) end注意这段脚本里的structure.moment、structure.shear、structure.force这些访问器在不同 FLAC3D 版本里的名字可能会有差异。你用 5.0、6.0 还是 7.0函数前缀和对象调用方式不完全一样。写脚本前先在 FLAC3D 的 Fish 帮助里搜一下你那个版本的结构单元属性访问函数名照着帮助文档的规范调整即可逻辑框架是通用的。用 7.0 的 Python 接口也可以达到同样目的代码可能更接近日常编程习惯import itasca as it with open(shell_internal_forces.csv, w) as f: f.write(x,y,z,moment_x,moment_y,shear_x,shear_y,force_x,force_y\n) for s in it.structure.list(): if s.type() in (liner, shell): pos s.pos() m s.moment() sh s.shear() fo s.force() f.write(f{pos[0]:.3f},{pos[1]:.3f},{pos[2]:.3f},{m[0]:.4f},{m[1]:.4f},{sh[0]:.4f},{sh[1]:.4f},{fo[0]:.4f},{fo[1]:.4f}\n)运行完脚本你会得到一个几百行到几千行的 CSV 文件里面每一行是一个壳单元的质心坐标和内力分量。接下来才是真正体现经验的地方怎么把这些散点数据变成一条设计能用的弯矩曲线。3.4 把散点数据画成弯矩包络图从 CSV 到“弯矩-位置曲线”核心是确定一个“展角”或者“路径坐标”。以圆形隧道为例我一般会在 Excel 里加一列角度把每个单元质心的坐标转换成相对于隧道中心的极角。比如隧道中心在 (0, 0)某个单元质心坐标是 (x, y)则角度可以算为ATAN2(y, x)单位转成度。这样按角度从小到大排序就能得到“从拱脚到拱顶到另一侧拱脚”的完整环向弯矩分布。画图时我习惯把横轴设为隧道环向角度纵轴设成弯矩值这样一张图就能看出全环的弯矩变化规律。实际工程里往往更关注极值所以我会在图上把最大正弯矩、最大负弯矩的位置标出来再回去看该位置的径向位移和围岩压力形成完整判断。对于非圆形的直墙拱形隧道展角就没那么方便了我更建议按“累计弧长”作为横轴从拱脚开始沿衬砌内表面遍历单元质心累计相邻两点距离得到弧长坐标。这个处理在 Excel 里也简单只要有坐标后续统计算距离就行。4. 常见问题与排查技巧实录4.1 数量级不对九成是单位制问题最典型的问题就是你费劲导出数据发现弯矩数值要么大得离谱要么小得离谱。比如衬砌厚度 0.3 m弹性模量按 Pa 输入围岩按 MPa 输入数值上差三个数量级算出来的内力自然错误。排查顺序我建议是先看模型用的长度单位是什么。如果模型是 m力的单位是 N那么弯矩输出单位应该是 N·m/m。如果你导出数据后想换算成 kN·m/m直接除以 1000 就行。如果发现数据差了 10^6 级别十有八九是弹性模量单位混用了。另外一个隐蔽的单位坑是 liner 单元的厚度。FLAC3D 里有个概念叫“截面厚度”如果你输入厚度时把 0.3 m 输成了 0.3 cm那么即使你模型其他部分全是 m 单位衬砌的抗弯刚度也会差出 10^6 倍以上弯矩结果自然完全失真。建模型时我把所有结构单元的厚度列成一个核对表算完第一步就对一遍。4.2 正负号拿不准用局部坐标系定位受拉侧弯矩的正负号是最让人头疼的。同样一段衬砌在不同单元的局部坐标下“正弯矩”可能对应完全不同的受拉侧。直接用数字画包络图时正负号如果没理解对会把受拉侧判断错配筋方向就反了。我的做法是提取完数据后先选一个特征位置比如拱顶单元在 GUI 里显示它的局部坐标轴再结合该单元的弯矩分量判断“正弯矩是让衬砌内表面受拉还是外表面受拉”。确认一次后面所有单元的符号解释就都有了基准。对于隧道衬砌工程上更关心的往往是最不利工况下“哪一侧受拉”。正常使用状态衬砌外表面受压、内表面受拉是比较常见的情况。但不同地质条件、不同埋深下完全可能反过来。所以不要死记“外受拉还是内受拉”要根据模型具体结果和局部坐标逐项核对。4.3 内力分布出现局部突变怎么排查如果你导出的弯矩沿衬砌环向变化非常不平滑出现尖角或者锯齿状分布不要急着怪软件。按下面几个方向排查。网格太粗是最常见的诱因。壳单元在曲率大的位置如果网格尺寸过大单元之间的内力过渡就会很差。此时加密衬砌环向网格数比如从每 30° 一个单元加到每 15° 一个单元通常有明显改善。加密网格本身成本不高但能极大提升内力分布的光滑度。应力集中也可能造成局部突变。洞口、截面变化、约束位置附近数值结果本来就容易局部分叉这属于真实力学响应的一部分不是错误。提取内力做设计时需要把这类局部峰值和整体规律区分开不能一看到尖角就认为模型错了也不要盲目相信尖角峰值就一定是最大设计内力。liner 和 shell 混用时要特别注意连接位置的刚度突变。比如你为了让某个部位更贴近实际把一段衬砌用 shell、另一段用 liner两个单元类型刚度特性不同连接处内力会出现跳跃。这种跳跃不代表真实结构会有那么大的内力突变反而提示你在建模阶段就应该统一单元类型或者在连接处做局部精细处理。4.4 面向设计取值时的一点经验数值模型提取出来的内力不能直接拿去做极限状态设计中间还需要做一些工程处理。第一个是“包络取值”。同一工况下不同荷载组合可能给出不同内力分布你要把所有工况算完把每个断面的最大正弯矩、最大负弯矩、最大轴力分别取出来画成包络图这才是配筋设计的真正输入。第二个是“局部峰值过滤”。单元角点附近的内力峰值经常带有数值奇异性进行平滑化处理时既要保证整体分布不失真又要避免被局部尖峰带偏。实际操作中我按“相邻 3 个单元平均”或者“按弧长滑动平均”处理一下极值再用于设计参考。第三个是“单位换算和有效宽度”。前面说过shell 单元内力是单位长度的内力但实际配筋计算要用到“分段宽度”。比如你取 1 m 环段作为设计单元内力就直接用提取值如果按整环配筋则需要沿环向积分或者取控制断面宽度。具体按设计规范走数值模型给的是基础数据不是最终设计结果。最后分享一点实际体会我自己刚开始做衬砌内力提取时走了不少弯路最深刻的体会是这个问题的难点不在软件操作而在“物理概念是否清晰”。你把单位长度内力、局部坐标、薄膜力和弯曲矩这四个概念搞明白了FLAC3D 里的那些菜单和脚本都只是顺手的工具。现在我的固定流程是建模前先确定单位制和单元类型求解后先用 GUI 看分布趋势再用脚本导出 CSV最后回到 Excel 做包络图和受拉侧判断。一套流程下来从算完模型到拿出设计需要的弯矩图、轴力图基本一小时以内能完成。如果你正在做类似的项目建议先拿一个简单的圆形隧道模型把整个流程跑通再去碰复杂断面。数据导出的脚本写好一次以后换模型只需要改输出文件名和筛选条件非常省事。