做结构仿真的人大多经历过这个场景:几何模型从 CAD 里导进来,一个零件就是一个体(Body),名字干干净净,看着特别舒服。点一下 Generate Mesh,网格哗啦一下出来了,全是四面体,单元数两百多万,求解跑一晚上,应力云图看着也还行。但等你想把网格调细一点看应力集中、或者换个载荷重算一遍的时候,麻烦才真正开始——每次重划要等半小时,节点数每次都不一样,同一个位置的应力值飘个百分之十几,你根本分不清那是网格噪声还是真实结果。
我在 ANSYS Workbench 里折腾网格这些年,越来越认同一句话:网格质量的上限,在几何分块(Partition / Slice)那一步就已经定死了,后面调尺寸、调质量、调收敛,都是在既定框架里做微调。而分区分块之后,真正决定这套网格"能不能用、好不好用"的,是节点(Node)这一层的细节——节点连不连得上、载荷加在哪个节点上、结果从哪些节点读出来。这篇文章就把 Workbench 里分区分块网格划分和节点的运用这两件事串起来讲,既有方法选择的判断逻辑,也有我在实际项目里踩过的坑和验证过的手法。适合刚接触 Workbench 网格模块、或者已经卡在"六面体划不出来"阶段的人。
1. 全自动网格为什么常常不听话:从"一个体"到"一堆块"的动机
1.1 四面体填充的代价不只是单元数量
四面体单元最大的优势是适应性强,再复杂的几何都能给你填满,不用你操心拓扑;代价是同等精度下它需要的节点数明显更多。原因不复杂:一阶四面体是常应变单元,弯曲变形在单元内部被近似得非常粗糙,只能靠加密来补偿。一个悬臂结构的弯曲问题,六面体 40 万节点能算准的位移,换成一阶四面体可能要 150 万节点才能达到相近的误差量级。
更麻烦的是求解开销的增长。节点数翻倍,内存占用和求解时间不是线性增长,用直接解法时接近节点数的平方级,迭代解法也在 1.5 次方量级上下。这意味着你从 40 万节点换到 150 万节点,机器可能直接撑不住。所以"用四面体省事"这件事,本质上是用后面的求解时间在还前面省下的建模时间,账是要算的。
1.2 扫掠成型的三个硬性条件
要让 ANSYS Meshing 老老实实给你扫出六面体,一个体需要同时满足三个条件,缺一条都会失败或者退化:
- 存在一对拓扑一致的源面和目标面。两个面上的面数、边数、环的嵌套层次要对应得上,一个面上有个圆孔、另一个面上没有,就直接判死刑。
- 从源面到目标面存在一条连续的侧壁路径。这条路径上不能有分叉,也不能有内环走到一半凭空消失。
- 侧壁上的母线不互相交叉。连接源面和目标面对应边的那些"母线",在空间上不能互相穿过。
我在实际项目中遇到过的"扫不出来",九成以上不是软件的问题,而是几何本身触犯了这三条里的一条。分区分块做的就是这件事:用切割面把一个不满足条件的体,拆成若干个满足条件的体。这话听着像废话,但它是整个分块工作的全部意义所在——分块不是为了把模型切碎,而是为了让每一块都满足扫掠条件。
1.3 判断值不值得分块:三条经验线
分块不是免费的。每切一刀,就多出至少一个面、若干条边,网格在这些交界面上要额外处理;切得密了,网格尺寸会被交界面锁死;几何一旦更新,所有切割特征都要重建,参数化研究里这一点尤其要命。
我的判断标准大概是这样几条:
第一,薄壁件和钣金件优先抽中面用壳单元,这比分块切六面体划算得多,壳单元在厚度方向本来就没必要分很多层。
第二,一次性的概念验证、只看趋势的分析,四面体加局部加密足够了,别浪费时间。
第三,拓扑频繁变化的参数化研究,分块特征很容易失效,还不如用 MultiZone 让它自己去适应。
反过来,如果你的模型要反复迭代很多轮、要严格控制单元规模、要读应力集中处的准确数值,那么分块的投入基本上一定回本。我做过一个支撑座的疲劳分析,四面体方案 180 万节点算 6 小时,六面体分块方案 55 万节点算 40 分钟,而且应力收敛曲线干净得多——这种场景,花两天时间做分块是完全值得的。
2. 切割工具的选择:Slice、Partition、Imprint 与虚拟拓扑的边界
2.1 Slice:用一个平面或草图把体切成规整段
Slice 是我用得最多的工具。在 DesignModeler 里它对应的是 Extrude / Revolve / Sweep / Plane 加 Slice 的组合操作,本质是拿一个面去切体,切完两个体共享一个新面。SpaceClaim 里对应的叫 Split Body,操作更直观:选目标体、选切割工具(平面、另一个面、草图),回车。
Slice 的价值在于"结果可预期"。你用一个平面去切,切出来的两个体一定是规则的两块,交界面是一个平整的面,扫掠路径清清楚楚。我一般习惯把切割平面画在几何的关键尺寸位置上,比如轴肩、台阶根部、圆角结束的地方——切割位置和几何特征对齐,网格质量最容易控制,因为特征位置本来就是网格需要加密或过渡的地方。
一个容易忽略的点:切割平面最好垂直于你希望的扫掠方向。如果切斜了,切出来的两个体虽然各自能扫,但交界面上单元的投影会变成平行四边形,长宽比立刻变差。斜切不是不能用,但要清楚代价。
2.2 Partition 与布尔切分:面切面、体切体的差别
DesignModeler 里的 Partition 支持多种切分方式:面切面(Faceted)、体切体、边切边。它的定位和 Slice 不同——Partition 更多是"用已有几何去分割已有几何",切完是共拓扑的两块,不是简单的一刀两断。
体切体(Body to Body)在做组合结构时特别有用。比如一个支架由底板和两块立筋组成,如果直接把它当成一个体去划网格,立筋和底板的交界处必然是个难点;但如果先用立筋的侧面去 Partition 底板,把底板分成"立筋下面"和"立筋周围"两个区域,每一块都是规则六面体形状,问题就消失了。
这里有个实操细节值得注意:Partition 之后如果两块体在布尔意义上仍然属于同一个 Part,它们之间的面会自动共享拓扑(Share Topology = Share),节点在交界面上是连续的,不需要额外的接触对。这个特性在后续理解节点连续性时非常关键。
2.3 Imprint Faces:只留印记不动体
很多初学者不知道 Imprint Faces 这个工具,我觉得它被低估了。它做的事是:把切割工具的轮廓"印"在体的面上,但不真的把体切开。结果是面上多了一条边或者一个面域,体还是一个体。
什么时候用它?一个典型场景是你只想在某个面上做局部加密,而不想改变体的拓扑。比如一块大平板,你希望在中间某个圆形区域加密网格,如果直接切一个圆柱出来,体就多了一块,扫掠条件可能就被破坏了;用 Imprint Faces 在板上印出一个圆,然后对这个圆形面域单独设 Face Sizing,网格加密了,体的完整性还保留着。
代价是:印记会让面上多出内部边(Internal Edge),网格划分器要处理这些边,有时候会生成质量较差的过渡单元。我的经验是印记区域不要太多太密,一次印一两个关键区域就好,超过三四个印记,网格质量的收益就开始变成负的。
2.4 Virtual Topology:先治几何,再谈分块
Virtual Topology(虚拟拓扑)是分块之前的前置处理,很多人跳过这一步直接切,结果越切越乱。它的作用是:把几何里那些"没用的小面、小边、短边"合并掉,让网格划分器看不见它们。
典型场景是从 CAD 导入的模型里,一个原本平滑的曲面被分割成几十个面片——这通常是建模历史留下的痕迹,对网格划分毫无意义,但每一个面片的边界都会被网格划分器当成硬边界,硬生生把网格尺寸压小。这时候用 Virtual Topology 的 Merge Face / Merge Edge 把相邻面片合成一个虚拟面,网格立刻变得规整。
我的做法是:导入几何后的第一件事就是检查有没有多余的边和面,用虚拟拓扑清理干净;清理完再开始分块。顺序反过来的话,你可能基于一堆碎面做了分块,等发现问题再回头清理,前面的工作就白做了。
| 工具 | 是否改变体拓扑 | 主要用途 | 典型风险 |
|---|---|---|---|
| Slice | 是,一分为二 | 制造扫掠段 | 切面倾斜导致长宽比恶化 |
| Partition | 是,共拓扑分割 | 用已有几何切分 | 切割工具与被切体干涉 |
| Imprint Faces | 否,只加印记 | 局部加密、定义加载区 | 印记过密产生劣质过渡单元 |
| Virtual Topology | 否,合并特征 | 清理 CAD 遗留碎面碎边 | 合并过度丢失真实几何特征 |
3. 分块方案怎么设计:从受力路径倒推切割面
3.1 沿主传力方向切:让扫掠方向顺着应力流
分块方案不是随便切的,它应该由结构的主传力路径决定。原因很实在:六面体网格在扫掠方向上的插值精度天然更好,如果这个方向正好是应力梯度最大的方向,你就能用更少的单元拿到更准的结果;反过来,如果扫掠方向和应力梯度方向垂直,那六面体相对四面体的优势会被大幅抵消。
举个具体的例子。一根受弯的悬臂梁,最大弯曲应力的梯度方向是沿长度方向变化的,所以我会让扫掠方向沿梁的轴线,单元沿轴线方向可以适当拉长(长宽比 3 到 5 完全能接受),而在截面方向保持较密的网格。这样单元总数能省下三成,弯曲应力的精度反而更高。
再比如一个带法兰的圆筒受内压,主应力是环向和轴向的,扫掠方向沿轴向是最自然的,切割平面垂直于轴线,一段一段切过去。如果圆筒上有个接管,接管和筒体的连接处是分块的重点:要沿接管的轴线单独切出一块,让接管的网格沿着自己的轴线扫,然后在交界面上与筒体网格对接。
3.2 过渡段的处理:T 形、L 形、圆角区怎么切
结构里最麻烦的从来不是规则段,而是过渡段。L 形拐角、T 形接头、圆角根部,这些地方几何突变,扫掠条件基本不满足,四面体也容易在这里出问题。
我的处理思路是"把过渡段单独切成一个块,允许它用相对不规则的网格,但把它和规则段之间的界面做成规整的对接面"。具体做法:在圆角结束的位置、拐角开始的位置各切一刀,中间这个不规则块用 MultiZone 或者四面体,两侧的规则段用 Sweep。这样不规则网格被限制在一个很小的区域里,单元数量可控,而且不会污染到主体网格。
还有一个技巧:如果过渡段的尺寸允许,用倒角或者小圆角替代尖角,切块会容易很多。尖角附近的网格畸变几乎无法完全避免,而一个半径合适的圆角,既符合工程实际(真实零件很少有绝对尖角),又给了网格划分器发挥空间。
3.3 切割数量与求解开销的平衡
有个反直觉的点:切得越多不代表网格越好。每多一个切割面,就多一个网格对接的界面,界面上要么节点共享(同一 Part),要么生成接触对(不同 Part)。节点共享的界面网格过渡是隐式的,质量还行;一旦跨 Part,界面上的网格匹配就成了额外负担。
我的经验值是:一个大件切 5 到 15 块是比较舒服的区间,超过 20 块就要审视一下是不是切过头了。有些切割纯粹是为了"看起来整齐",对扫掠条件没有实质帮助,这种刀就直接省掉。
同时要留意切割面本身的尺寸。如果两个切割面离得很近(比如间距只有整体尺寸的 2%),中间那层网格要么被压得很薄,要么直接被忽略,两种情况都不好。遇到这种结构(比如薄垫片、薄隔板),要么把它单独作为一个体处理并单独分块,要么在几何上简化掉。
3.4 一个环形支撑座的完整分块示例
拿一个实际做过的环形支撑座举例,帮助理解上述原则怎么落地。这个零件大致是:中心一个圆柱凸台,外面一圈环形的支撑板,支撑板上有四个对称的加强筋,整体高度 80 mm,外径 240 mm。
分块顺序是这样的:
第一步,用水平面在凸台根部切一刀,把凸台和支撑板分开。切完之后凸台是一个规规矩矩的圆柱体,沿轴线扫掠毫无压力。
第二步,用四个加强筋的侧面去 Partition 支撑板,把支撑板分成四段"扇形板"加四块"筋下区域"。筋下区域是薄板,沿厚度方向扫掠三四层就够;扇形板沿径向扫掠。
第三步,对凸台根部的圆角过渡区单独设 Body Sizing,控制在 3 mm 左右,保证圆角处有三到四层单元。
最后一步,检查所有分割面:凸台和支撑板的分割面是不是同一个 Part 内共享拓扑,如果是,节点连续,不用管;如果不是,需要改成 Form New Part 或者加接触。
整个过程用掉四刀,切出九个块,网格总数从四面体方案的 130 万降到六面体的 42 万,最大等效应力从 218 MPa 收敛到 196 MPa(这个差异是真实存在的,四面体在这里低估了应力峰值)。
4. 分块之后的网格方法落地:Sweep、MultiZone 与局部尺寸控制
4.1 Sweep 的源面、目标面与路径判定
体分好之后,在 Mesh 分支下 Insert Method,选择对应的体,Method 选 Sweep。剩下的事情交给软件自动判定源面和目标面,但强烈建议你手动确认一遍。
自动判定的逻辑是基于面的形状和拓扑匹配度,大多数情况没问题,但遇到两个面形状相近的时候会判错,症状是网格沿着错误的方向扫掠,或者直接报"cannot sweep"。
手动指定的做法是在 Method 的 Details 里把 Src/Trg Selection 从 Automatic 改成 Manual Source 或者 Manual Source and Target,然后手动选面。选完之后看一眼预览——Workbench 会用一个箭头表示扫掠方向,箭头对不对一眼就能看出来。
还有两个参数值得关注:Sweep Num Divs 可以直接指定扫掠方向的层数(不设的话由单元尺寸决定),Sweep Bias Type 可以设置层数的疏密分布(比如靠近壁面密、中间疏)。这两个参数在薄壁件的厚度方向特别好用,直接给 3 层加个对称 Bias,比调全局尺寸精确得多。
4.2 MultiZone 自动分块的能力边界
MultiZone 是"软件帮你分块"的方案,它会自动把体切成若干个可映射的区域。对于形状不太规整但整体还比较"块状"的体,它的效果相当不错,我在处理铸件毛坯类模型时用得比较多。
它的能力边界也很清楚。第一,它依赖几何本身的可分块性,如果体是一个弯管或者带螺旋特征的形状,MultiZone 基本无能为力。第二,切出来的块数你控制不了,有时候会切出很多小碎块,网格质量参差。第三,它对付薄壁和窄槽特别容易失败。
用 MultiZone 的时候,我一般会打开 Mappable Sides 的 Manual 模式,手动指定哪些面必须是映射面,给它一点约束,成功率会明显提高。另外 Method 里的 Mapped Mesh 选项可以强制要求纯六面体,如果几何实在不行,它会报错而不是退化成四面体——报错比悄悄退化更有价值,至少你知道问题在哪。
4.3 Body Sizing、Face Sizing、Edge Sizing 的叠加逻辑
尺寸控制有全局和局部两层。全局的在 Mesh 分支的 Sizing 里设(Element Size、Min Size 等),局部的靠 Body Sizing、Face Sizing、Edge Sizing 来覆盖。
一个经常被问到的问题是:多个尺寸控制叠加在一起,谁生效?答案是取最小值。全局尺寸 10 mm,某个面的 Face Sizing 设了 3 mm,那个面上就是 3 mm;如果这个面上还挂了 Edge Sizing 1 mm,那边缘附近就是 1 mm,并且会向面内做过渡。
这个规则听起来简单,但它是很多"网格莫名其妙变密"的根源。我遇到过一个模型单元数比预期多三倍,最后查出来是某条早先加的 Edge Sizing 一直挂着没删,把整条边的网格锁死在 0.5 mm。所以每次改完尺寸设置,我都会打开 Mesh 分支下的 Statistics,看一眼节点和单元数量级对不对,这一步几乎不花时间,能省掉很多返工。
另外提醒一点:Edge Sizing 的 Bias 功能在需要边界层效果又不想用 Inflation 的时候很好用,但 Bias Factor 不要给太大,超过 5 以后过渡单元的尺寸跳变会很剧烈,反而容易出问题。
4.4 Inflation 与边界层:顺序错了全盘重来
流体和传热分析里 Inflation 是必需品,结构分析里遇到接触、疲劳、表面应力集中也常用。Inflation 本质上是沿指定面的法向按增长比生成层状单元。
坑主要在顺序上。Inflation 必须加在 Method 之后、尺寸控制之前考虑——如果你先设了很小的 Face Sizing,再叠加 Inflation,软件会尝试同时满足两者,结果就是第一层单元被压得很薄,后面几层迅速膨胀,长宽比爆炸。正确的做法是:明确 Inflation 的第一层高度和增长比,让 Face Sizing 的值不小于 Inflation 的总厚度,两者协调而不是互相打架。
Inflation 的层数也不是越多越好。结构件上一般三到五层就够,层数多了只会堆节点数。第一层高度按你关心的应力梯度来定,我通常让第一层单元的高度在特征尺寸的 1/20 到 1/10 之间。
4.5 网格质量指标的判读与阈值
打开 Mesh 分支下的 Mesh Metric,可以看十几种质量指标。真正需要盯的就三个:
| 指标 | 含义 | 六面体建议值 | 四面体建议值 |
|---|---|---|---|
| Skewness | 偏斜度 | < 0.75,最好 < 0.5 | < 0.85,最好 < 0.75 |
| Aspect Ratio | 长宽比 | < 5(连接件可放宽至 10) | < 10 |
| Jacobian Ratio | 雅可比比 | > 0.7 | > 0.6 |
偏斜度是最综合的指标,我一般先按它排序,把最差的几十个单元挑出来看位置。如果最差的单元集中在某个圆角或者尖角上,而且数量很少,通常不影响整体结果;如果最差单元连成一片,那说明这块的网格方案有问题,要回去重新分块。
还有一个容易被忽略的检查项:Element Quality 为负或者接近零的单元(也就是体积接近零的畸变单元)。这类单元会让求解器直接报错,或者产生完全错误的局部结果。划分完之后在 Mesh 分支下右键 Check Mesh 做一次,代价很小。
5. 节点在 Workbench 里的角色:连续性、加载与后处理
5.1 共享拓扑与节点连续性
节点这件事的起点是拓扑共享。Workbench 里几何体的 Share Topology 属性有两个值:Share 和 None。同一 Part 下的多个体,如果 Share Topology 是 Share,它们在相互接触的面上会自动共享节点;如果是 None,即使几何上严丝合缝贴在一起,软件也认为它们不连续,需要接触对来传力。
这个设定的影响是连锁的。节点共享时,界面上的位移是强连续的,力通过共享节点直接传递,界面不会出现"过软"的现象;节点不共享用接触传力时,界面刚度取决于接触算法的设置,通常偏软,界面附近的应力会有一定误差。
所以我的做法是:能共享拓扑就共享,尤其是分块切出来的块,一定要放在同一个 Part 里。跨 Part 的界面尽可能少,只在确实需要模拟相对滑动、分离、或者不同材料的时候才用接触。
判断有没有真的共享上,有个简单办法:划完网格看界面附近的节点分布,如果两侧网格的节点在交界线上重合(能看出是同一套节点),就是共享上了;如果两侧各有自己的节点,串珠一样错开,那就没共享。
5.2 Node Merge、Node Move、Node Copy:手工修补网格
有时候节点不连续是历史遗留问题——比如网格是从别的软件导进来的,或者模型是拼接出来的,界面上差了几微米。这种情况可以用 Mesh Edit 工具集里的 Node Merge 来救。
Node Merge 的逻辑是:在指定容差范围内,把相互靠近的节点合并成一个。容差是最关键的参数,给太小合不上,给太大可能把本来不该合并的节点也吃掉,产生畸变单元。我的做法是从很小的容差开始试(比如模型整体尺寸的百万分之一量级),合不上就逐步放大一档,同时每次合并后都重新看一遍网格质量。
Node Move 用来微调个别节点的位置。场景很具体:某个节点位置正好导致单元畸变,或者你想让某个节点精确落在几何特征上以便读取结果。它是一次性的修补手段,不适合大范围使用。
Node Copy 用得少一些,主要是在需要强行构造对称网格的时候。
这三个工具的共同特点是:它们是对网格的手工干预,不会随几何更新自动重做。所以用完之后要在心里记一笔,几何一变,这些修补就全没了。
5.3 节点级命名选择与远程点的建立
命名选择(Named Selection)是节点运用里最实用的功能之一。它有两种创建方式:基于几何创建,或者基于网格创建。区别在于——基于几何创建的命名选择,在网格重划后会自动跟随几何更新;基于网格创建的,作用域是具体的节点或单元,网格一变就失效。
这个区别直接决定了加载和结果提取的可靠性。如果模型会反复重划网格,命名选择一定要优先基于几何建立,只有在几何上无法表达的区域(比如你想选一圈特定高度的节点)才用网格方式。
远程点(Remote Point)是另一回事。它创建一个虚拟的节点,用来施加远程载荷、远程位移或者作为多点约束的从属点。远程点的作用域可以选几何(面、边),也可以选点。选几何的时候,网格重划后它会自动重新映射到新的节点集合上;选具体点的时候,同样会失效。
我在用远程点的时候有个习惯:作用域尽量选面或者边,不要选顶点。顶点在几何更新或者网格调整后位置可能变,而面相对稳定得多。
5.4 节点载荷、节点结果与探针取值
逐节点施加载荷在 Workbench 里是个相对小众但很有用的操作。要选节点,得先把作用域切换到网格节点,也就是先创建一个基于网格的命名选择,然后在载荷的 Details 里把它作为作用域。
典型的应用场景是这样的:你有一组实测的载荷数据,分布在结构表面的若干个点上,需要精确地加到对应的网格节点上。这时候的做法是导出网格节点坐标清单,用脚本把实测点和最近的网格节点匹配起来,生成命名选择,再施加力。
后处理这边,探针(Probe)是最常用的节点级结果提取工具。在结果分支里插入 Probe,作用域选到具体的节点,可以直接读出该节点的位移、应力、温度等数值。做收敛性验证的时候,我会在应力集中位置固定放一个节点探针,每加密一次网格就记录一次值,看它是不是在收敛——这比看云图颜色靠谱得多,云图的色标范围每次都会自动调整,肉眼是看不出收敛的。
5.5 Match Control 与周期性模型的节点对齐
做周期对称结构(叶轮、扇区模型)时,两侧切割面上的网格需要严格对应,否则周期边界条件没法用。这时候要用 Match Control:指定两个面(或者两组面),软件会保证在两侧生成一一对应的网格,节点可以做到完全镜像对齐。
Match Control 的约束挺严的:两个面的几何形状需要能通过旋转或者镜像重合,容差范围内;两侧的尺寸控制设置需要一致,否则匹配会失败。实际操作里,我会在建立 Match Control 之前,先把两侧面的 Face Sizing 设成完全一样的参数,然后再建,成功率会高很多。
匹配成功之后,周期边界上的节点严格一一对应,用命令流定义周期约束或者用 Cyclic 分析,结果都可靠。匹配不上硬用周期边界,会得到莫名其妙的结果,而且很难排查。
6. 排查实录:分块做完了,网格还是失败的四种典型症状
6.1 扫掠方向被误判
症状:网格划出来了,但是形状很怪,单元沿一个明显不合理的方向拉长,或者在某些区域突然扭曲。
排查路径:把 Mesh 分支展开,找到对应的 Sweep 方法,看 Src/Trg Selection 是不是 Automatic。如果是,改成 Manual,检查软件选的两个面是不是你想要的。我在一个阶梯轴上遇到过这个问题——软件把两个台阶面当成了源面和目标面,扫掠方向变成径向,网格整个歪掉。
顺带提一句,判断扫掠方向是否合理的直观方法:看箭头方向是不是与体的长轴一致。绝大多数工程结构,扫掠方向都应该沿最长的那一维。
6.2 分块面之间有缝隙
症状:网格划出来了,但界面处的应力云图上有明显的"一条线",或者求解时报节点不连续的警告,或者界面两侧的位移对不上。
排查路径:回到几何,检查分块出来的两个体是不是真的共享拓扑。在 Geometry 分支下选中两个体,看它们是不是在同一个 Part 里,Share Topology 是不是 Share。我遇到过一种情况:几何看起来是贴合的,实际上两块体之间差了 0.002 mm,肉眼完全看不出来,但网格划分器认为它们是两个独立的面。用几何检查工具量一下两体之间的最小距离,或者直接用一个体去切另一个体(保证共面),都能解决。
如果几何上已经共享、网格还是不连续,那就检查一下是不是在 Mesh 分支下动了什么设置,比如把某个体的 Share Topology 单独改成了 None。
6.3 碎面与短边把网格尺寸压死
症状:单元数远超预期,打开网格一看,某个小区域密密麻麻全是单元,而大部分区域很稀疏。
排查路径:打开 Mesh 分支下的 Sizing,看有没有短边或者小面被附加了尺寸控制。更常见的是 CAD 导入时留下的碎面碎边,它们没有明确的尺寸控制,但网格划分器会默认沿着这些边生成网格,边一短,网格就密。
解决方法就是前面说的 Virtual Topology,把没意义的碎边合并掉。合并之后重新划一次,单元数往往能降下来一大截。我印象最深的一次,一个导入的支架模型合并了十几条碎边之后,单元数从 240 万降到 68 万,计算时间从 8 小时降到 50 分钟。
6.4 接触对两侧节点不匹配
症状:接触分析的结果异常,接触面附近的应力明显偏低或者偏高,或者接触状态在迭代中反复跳动。
排查路径:先看接触对两侧的网格尺寸是否相当。如果一侧是 2 mm,另一侧是 10 mm,接触面上一侧有很多节点、另一侧很少,接触压力的分布会很不均匀。理想情况下,两侧网格尺寸尽量接近,或者让密集一侧不超过稀疏一侧的两倍。
Workbench 里有个工具可以辅助:接触对的 Advanced 设置里有 Contact Side / Target Side 的调整选项,还有 Adjust to Touch 的容差设置。但要注意的是,Adjust to Touch 只调整几何的穿透间隙,不解决网格尺寸匹配问题,这两件事经常被混为一谈。
7. 把分块和节点控制变成可复用流程
7.1 命名选择前置:先命名,再分块
这条经验是我吃了亏才总结出来的。最初做分块的时候,我是先把几何切好、网格划完,然后才想起来要建命名选择,于是回头一个个面地去点。问题是——分块之后面的数量翻了好几倍,哪个面是原始模型的哪个特征,已经很难对应上了。
后来改成:在动刀之前,先把原始几何上所有有意义的特征命名好——所有的加载面、约束面、关注点、接触面,全部建好命名选择。然后再去分块。这样即使切了很多刀,原来的命名选择依然有效,而且在后续的参数化研究中,命名选择会自动跟随几何更新。
命名选择的命名规范也值得花点心思。我的习惯是用"功能_位置"的格式,比如 LOAD_FLANGE_TOP、FIX_BOTTOM_FACE、CONTACT_BOSS_OUTER,而不是面1、面2。模型一旦交给别人,或者自己隔两周再打开,这个命名规范能省掉大量回忆时间。
7.2 参数化与脚本录制
分块的过程可以录制成脚本,这是把手工操作变成流程的最直接办法。在 DesignModeler 或者 SpaceClaim 里,每一步操作都可以生成脚本;Mechanical 里的网格设置、命名选择、结果提取,也可以通过脚本录制下来。
真正有价值的地方在于:参数化研究里,几何尺寸一变,分块的切割位置也需要跟着变。如果切割面是用尺寸参数定位的(比如"在总长的 40% 处切一刀"),参数一改,切割面自动跟着走,整套流程就活了。如果切割面是随手点的位置,几何一变就全乱。
我给一个参数化模型定切割位置的时候,尽量让每一个切割平面都对应一个明确的尺寸参数,哪怕这个参数只是从主尺寸派生出来的。多花十分钟定义参数,能省掉后面几十次重建的时间。
7.3 几何变更后的网格重建与节点失效
几何一改,网格必然重建,重建就意味着所有基于网格的命名选择、节点探针、手工合并的节点全部失效。这不是 bug,是设计如此。
应对办法有两条。第一,尽量把关键的作用域建立在几何层而不是网格层。第二,如果确实需要节点级的操作,就把它放在流程的最后一步,并且单独记录下来——我会在模型旁边放一个文本文件,记着"这个模型做了哪些手工节点操作、用了什么容差",重建的时候照着做一遍。
还有个小细节:手动合并节点之后,如果需要反复重建网格,可以考虑把合并操作写成脚本,这样至少执行过程是自动的。
8. 几个只有踩过才记得住的操作细节
8.1 单位与容差:所有数值问题的起点
Workbench 里几何单位、网格尺寸单位、节点合并容差单位,如果不统一,会出现非常隐蔽的错误。我遇到过的最典型的一次是:几何以毫米建模,节点合并容差按米的习惯填了 0.001,结果相当于合并容差 1 mm,把不该合并的节点全吃掉了,网格看起来没问题,求解结果偏差 30%。
我的习惯是在项目开始时就明确单位制,在 Workbench 的 Units 菜单里锁定,然后所有的尺寸、容差、参数都用同一套单位思考。节点合并的容差,建议从"模型特征最小尺寸的千分之一"这个量级开始试,逐步放大。
8.2 保存与导出:把网格单独存一份
网格划好之后,我一般会把网格单独导出一份(导出为 CDB 或者直接在 Workbench 里另存一个只有网格的状态),原因是网格重建的代价很高——一个复杂模型的分块加网格可能要一两个小时,如果因为后面的求解设置出了问题导致整个项目重建,损失太大。
导出的网格还能拿到其他后处理工具里做检查,或者交给同事复用。这在团队协作里特别有价值,一个人的分块方案和网格可以给整个组用。
8.3 结果路径与截面:从节点集合里读数据
最后说一个后处理的技巧。当你需要沿某条路径看结果分布(比如沿厚度方向的应力梯度、沿焊缝方向的应力分布),做法是定义 Path:指定起点和终点,软件会沿着这条线取最近的节点结果。
这里有一个坑:如果路径穿过的区域网格很粗,路径上的采样点落在单元内部,结果是被插值出来的,不一定反映真实分布。所以定义路径之前先确认路径区域的网格足够密,尤其是你想看梯度变化的地方。我一般会先加一个对应的命名选择,看看这条路径附近有多少节点,节点太少就回头加密。
同样的道理适用于截面结果和表面结果。截面上的应力云图看着漂亮,但如果截面方向只有两三层单元,那个分布基本没有参考价值。节点数量决定了你能看到的信息量的上限,这一点在分块阶段就已经定下来了——这也是为什么我总说,分块这件事值得在最开始就认真做。