1. WB环境下网格划分的整体思路与模块连接逻辑
1.1 为什么明明画了网格,求解器却说“Domain 3没有划分网格”
很多人第一次在ANSYS Workbench里跑静力分析时,都会遇到一个莫名其妙的报错:带有标记“geom1”的几何中的“domain 3”没有划分网格,这可能导致结果不正确。
乍一看这条报错你可能会懵——明明在Mesh模块里已经生成了网格,节点和单元数量都有统计,为什么求解器还是说某个体没网格?这里先解释一个概念:在Workbench里,一个几何体(Body)在求解器内部会被映射为一个或多个Domain。你从外部CAD软件导入的装配体,或者用SpaceClaim建的多个实体,每个实体在进入求解器后都对应一个Domain。报错里提到的“domain 3”,翻译成人话就是“第三个实体”。
那为什么第三个实体没网格?我踩过的坑主要有三种:第一,这个实体被抑制了(Suppress Body),网格划分时直接跳过;第二,这个实体没有赋予材料属性,在Engineering Data里没匹配到材料,求解器根本不认它是参与计算的体;第三,也是最隐蔽的——几何更新后网格没有重新生成,模型树里的Mesh图标虽然亮着,但实际网格数据是旧的,新加进来的体没有覆盖到。
所以在Workbench里,网格生成不是一劳永逸的。你改了几何、改了材料、改了接触,都必须回头重新生成网格。这个“更新”不是点一下右键再点Generate Mesh就完了,很多时候需要在项目流程图中把Geometry、Model这些单元格全部刷新一遍。我建议养成一个习惯:改完几何后,在Project Schematic里右键整个分析系统,选择Update Project,让Workbench自己判断哪些模块需要重新计算。有些时候报错,就是因为你在SpaceClaim里改了几何,但忘了回来刷新Model单元格。
1.2 网格划分的三种底层策略:自动、扫掠、多域
Workbench里插入Method时有几个选项——Automatic、Tetrahedrons、Hex Dominant、Sweep、MultiZone。不少新手看到这么多选项直接放弃,全部用Automatic。这不能说错,但遇到复杂模型,Automatic生成的网格质量往往不够理想。
先说Automatic。它的逻辑很简单:如果能扫掠(Sweep)就扫掠,不能扫掠就自动生成四面体。这个策略对于单一实体、形状规则的零件很友好,但面对多体装配体或者带复杂曲面的模型,它生成的四面体会在局部区域堆积大量单元,计算前看着密密麻麻,计算中才发现求解时间被拖得很长。
Sweep(扫掠)的适用场景是:一个实体在某个方向上截面形状一致,比如轴、杆、管道、拉伸体。扫掠网格最大的优势是单元排列规整,六面体占比高,可以用很少的单元数量达到不错的精度。但Sweep需要你手动指定Source面和Target面,有时候几何稍复杂一点,WB的自动识别会失败。我遇到这种情况会在模型树里手动指定两个面,或者把实体切成多个可扫掠的块。
MultiZone(多域)是Sweep的升级版。它能自动把复杂几何划分成多个区域,每个区域分别扫掠。这个方法的门槛是:几何必须能被切割成可扫掠的块。如果几何过于复杂,MultiZone会退化成四面体,但有总比没有强。做流固耦合分析或者大变形分析时,我倾向于用MultiZone尽量多出六面体,因为六面体在变形过程中的体积锁定现象比四面体轻得多。
Hex Dominant(六面体主导)则是另一条路。它先生成四面体,再把内部单元转成六面体,只在表面留下少量金字塔或四面体过渡。这种方法的优点是适用范围比Sweep宽,但缺点是转换过程可能导致局部单元严重扭曲,网格质量反而下降。我的经验是:只有在需要考虑接触穿透或者材料非线性时,才优先尝试六面体主导。
1.3 模块连接的常见坑:Engineering Data与网格的关联
热词里有一句话值得注意:“首先应用ansys workbench建立任意一个包括engineering data的分析模块(如static structural)”。说得很有道理,但很多人不知道为什么。
原因在于——Workbench里的材料库是全局共享的,但每个分析系统里有独立的Engineering Data单元格。如果你直接拖一个Mesh模块进项目流程图,你会发现它没有Engineering Data这一项。没有材料数据,网格划分本身不报错,因为网格不依赖材料参数;但进入求解阶段就麻烦了——你赋予了几何体材料,但材料库里压根没有这个材料,求解器会报错或者把材料默认为结构钢。如果是热分析或者电磁分析,默认材料算出来的结果完全是错的。
这件事关联到网格划分的一个隐蔽问题:网格划分之后,软件需要根据材料属性决定单元的积分属性。比如在电磁分析里,不同材料区域的网格剖分密度要求完全不同;在结构分析里,超弹性材料和线弹性材料的网格策略也不同。不信你用默认结构钢算一个橡胶密封圈,网格加密十倍也收敛不了,因为材料本构模型从一开始就是错的。
所以我的建议是:在项目流程图里先拖一个Static Structural或者别的带Engineering Data的系统,再把Mesh模块拖进去连接它的Model单元格。这样你既能用材料库里的所有材料,也能让网格参数和物理场匹配。
2. 网格质量控制的核心参数与选型逻辑
2.1 尺寸、曲率、邻近度:三个基础控制项怎么配合
全局网格控制面板里有一组参数经常被人忽略,但它们的配合决定了网格质量的基线。这组参数是Element Size、Curvature和Proximity。
Element Size,全局单元尺寸,是一个基准值。它不是最终所有单元的实际尺寸,而是网格划分器在决定单元大小时的参考。如果你不设置任何局部尺寸,那么全局尺寸就是所有位置的单元大小。但实际工作中很少只靠全局尺寸控制,因为一个零件里既有大平面又有小圆角,全局尺寸设小了浪费计算资源,设大了圆角处的应力算不准。
Curvature(曲率)控制的逻辑是:在曲率大的区域自动加密单元。你可以设置一个最小曲率半径,或者是曲率法向角(Curvature Normal Angle)。这个参数的意思是:在一个圆弧范围内,相邻单元的法向夹角不超过多少度。默认值是30度或者12度,我通常把它调到18度左右,既能保证圆弧处有足够的单元数量,又不至于把整个圆周细分成几百个单元。
Proximity(邻近度)则是处理“间隙”问题的。当两个面距离很近时(比如接触间隙、薄壁特征),邻近度控制会让这个区域自动加密。具体原理是:如果间隙尺寸小于全局单元尺寸的一定倍数,网格划分器就会在这个间隙里放入更多单元。这个参数在包含螺纹、键槽、薄垫片的模型里特别重要。我曾经算一个带细牙螺纹的连接结构,不加邻近度控制时螺纹牙顶处只有两个单元,一加载就穿透;开启邻近度后牙顶处有五六个单元,结果才稳定。
三个参数配合使用的基本原则:Element Size定基准,Curvature定圆角加密,Proximity定间隙加密。三者叠加会导致局部单元密度显著上升,所以最好先不开启Curvature和Proximity跑一个粗糙网格看看整体形态,再加控制项加密,逐步对比结果。
2.2 单元质量指标怎么看:偏斜度、正交质量、宽高比
网格画完怎么看质量?Mesh模型的右键菜单里有一个Mesh Metric选项,可以显示偏斜度(Skewness)、正交质量(Orthogonal Quality)、宽高比(Aspect Ratio)等指标。这个功能很实用,但指标的意义得搞清楚。
偏斜度是衡量单元“有多不正”的指标。值域0到1,0表示完美正单元,1表示完全退化。对于四面体,偏斜度低于0.85通常是可以接受的,低于0.7算是质量较好。对于六面体,要求更严格一些,最好控制在0.8以下。如果你发现某些网格偏斜度超过了0.95,那基本意味着单元已经严重扭曲,计算时极有可能导致奇异矩阵或者不收敛。
正交质量是ANSYS近年主推的一个指标。它的定义是每个单元的面向量与从单元中心到每个面的向量之间的夹角余弦的最小值。值域也是0到1,但方向和偏斜度相反——1表示完美正交,0表示完全畸变。对于大多数结构分析,正交质量平均值大于0.2就算能用,但我的经验是低于0.1的区域在接触分析中会出问题。你可以通过Mesh Metric的下拉菜单切换查看这些指标,并且设置阈值让不合格单元以不同颜色显示。这对定位局部网格问题非常高效。
宽高比(Aspect Ratio)衡量单元在三个方向上的尺寸比例。比值过大意味着单元细长,可能引起刚度矩阵病态。在薄壳结构中宽高比偏大是正常的,但在实体结构中,如果出现宽高比超过20的单元,就要小心了。
总结一句经验:不要追求所有单元质量都完美,这在复杂几何里不现实。关键是关注最小值和平均值——平均值正常、最小值不塌陷,这个网格就可以用。
2.3 网格无关性验证到底怎么做
网格无关性验证听起来很学术,其实就是一句话:加密网格,看计算结果变不变。如果加密两次结果几乎不变化,说明网格已经收敛,可以放心用当前网格。
具体操作步骤是:先以较大的全局尺寸(比如实体模型用10mm)划分网格,求解一个你关心的量(比如最大等效应力、最大变形、固有频率)。然后把全局尺寸减小到5mm,重新求解,比较结果。如果变化超过5%,继续加密到2.5mm再比较。直到相邻两次加密的结果变化小于5%,就可以认为网格无关了。
这个方法说起来简单,但有一个坑叫“局部加密陷阱”。全局加密往往是盲目的,有些区域无论怎么加密,结果就是不收敛——因为你关注的那个点正处于尖角奇异性区域(比如L形拐角、阶梯轴根部)。这些位置理论上应力是无穷大的,任何有限网格都无法收敛。正确做法是人为忽略这些奇异点,关注离奇异点有一段距离的应力峰值。或者,在使用局部网格控制时,把重点关注区域单独加密,而不是盲目全局加密。
网格无关性验证还有一个实用技巧:不要只看最大值,还要看云图分布趋势。有时候最大值变了5%,但云图的等值线分布一模一样,那说明整体求解已经稳定,最大值的变化只是奇异点的数值噪音。
3. 实操过程:从几何清理到网格生成的完整流程
3.1 几何准备:SpaceClaim里的清理操作
网格划分前,几何准备阶段省下的时间会在网格阶段加倍还回来。不少使用者从SolidWorks导入模型后直接拖进Mesh模块,结果网格质量差、求解报错,回头检查发现是几何本身有大量碎面、微小的倒角、或者重叠的面。
SpaceClaim在Workbench里不仅仅是个建模工具,更重要的定位是“几何清理器”。我在实际工作中清理几何的优先级是:第一,删除所有小于网格尺寸的小特征——比如直径小于网格尺寸的小孔、高度小于网格尺寸的台阶、非常薄的板——这些特征要么用Fill填充,要么用Simplification工具删掉,因为它们对结果影响微乎其微,但会给网格划分带来巨大负担;第二,合并碎面——导入的CAD模型在圆角过渡处长年被切成几十片小面,用SpaceClaim的选择过滤器选中这些碎面,合并成一个大面,这能让网格更规整;第三,修复自由边和重叠面——用Repair工具自动检测,尤其是从STEP格式导入的模型,自由边出现的概率太高了。
如果你不用SpaceClaim,直接在DesignModeler里也能做类似操作,但效率低不少。SpaceClaim还有一个优势:它支持直接拉动(Pull)几何,改模型就像捏橡皮泥,不用去管草图约束关系。网格划分之前把几何清理干净,比划分之后再头疼处理残次网格要划算得多。
3.2 命名与局部网格控制:接触区域、螺栓孔等细节
几何准备完之后,在进入Mesh前有一件事很多人忘做——命名选择(Named Selection)。在SpaceClaim里选中一个面或体,右键创建命名,这个名称在后续设置边界条件时会变成可以下拉选择的项目。命名的核心价值是:当你修改几何后重新导入,命名选择会自动更新,不会因为几何重新生成而丢失。
局部网格控制是网格质量的关键。常用的局部控制有三个:Body Sizing(体尺寸)、Face Sizing(面尺寸)、Contact Sizing(接触尺寸)。对于螺栓孔周围,用Face Sizing把孔径周围的单元尺寸设为全局尺寸的二分之一;接触区域,用Contact Sizing设定接触面附近的单元层;对于应力集中区域,用Sphere of Influence(影响球)在某个球心周围加密。
这里有一个常见误区:局部加密不是越密越好。接触区域加密过度会导致接触探测的单元过多,计算时间成倍上升,收敛反而变慢。我的做法是:先把全局网格跑通,再根据应力云图定位需要加密的区域,用局部控制逐步细化。而不是一上来就到处设Face Sizing,把简单问题复杂化。
3.3 求解前检查清单:更新几何、材料、连接关系
网格生成后,进入求解器前需要过一遍检查清单,很多人忽略这一步导致白算几小时。我的前三项检查是:几何是否更新、材料是否赋值、连接关系是否正确。
检查几何更新的方法是看项目流程图中Model单元格的状态——如果Geometry发生了变化,Model单元格会有一个刷新标志。右键刷新后,Mesh可能需要重新生成。我通常的做法是:在Mesh模块里点击Mesh分支,在Details面板里看Statistics——节点和单元数量是否符合当前网格设置。如果显示的是旧数据,说明需要重新Generate Mesh。
材料赋值检查:在Model分支下选中每个Geometry Body,看一下Assigned Material是否与预期一致。我见过不少案例,明明设计了铝合金材料库,结果某个体的材料还是默认结构钢——因为你在SpaceClaim里新建的实体没有自动继承材料赋值。尤其是你在SpaceClaim里复制了一个体再修改,新体的材料很可能丢失。
连接关系检查:这是最容易疏忽的。两个本来应该接触的零件,如果模型导入时因为间隙问题没有生成接触,求解时两个零件会各自独立运动,结果完全错误。在WB里,自动检测接触(Auto Detection)有时会因为公差设置不当而漏检某些接触对。网格划分完成后,接触检测已经完成,你需要检查Contact区域里是否包含了你期望的所有接触对。如果漏了,手动右键Contact生成接触,或者修改自动检测公差。
4. 常见问题与排查技巧实录
4.1 “Domain 3没有划分网格”的排查与解决
回到文章开头那个报错。实际的排查步骤可以概括成四步:
第一步,先看模型树。检查是否有Body被Suppress了,如果被抑制,在SpaceClaim或者DM里取消抑制。
第二步,检查材料赋值。每个Body都必须有Assign Material。选中Body,看Details面板的Material那一行是否显示为“None”或者空白。如果是,说明这个体没有材料,去Engineering Data里确认材料名称,然后在Assignment下拉列表里选中。
第三步,重新生成网格。有时候网格图标显示的是旧数据,右键Mesh,Generate Mesh,看看Statistics里的节点和单元数有没有变化。特别注意,如果有Body没有被网格覆盖,Statistics里节点数会明显偏少。
第四步,如果前三步都没问题,那就是几何问题——这个Body可能是一个退化体(比如厚度为零的面、极小实体、或者布尔运算残留的碎片)。一个快速验证方法是:在Mesh的Details面板里,把Element Order设为Draft,用Preview来看这个体是否被网格划分器识别。如果预览时这个体始终不出现,那基本就是几何问题,需要回到SpaceClaim重新创建一个替换的体。
4.2 ANSYS安装与许可问题速查
热搜词里关于ANSYS安装的求助非常多,我稍微整理一下常见的问题和排查方向。
第一类:ANSYS License Manager无法启动。这类问题大概率是许可证服务没有启动,或者端口被占用。检查Windows服务管理器中“ANSYS, Inc. License Manager”这个服务的状态。如果启动失败,常见原因是杀毒软件拦截了服务,或者之前安装的其他软件占用了端口。把服务设置为自动启动,并且允许它在防火墙里通信,一般能解决。
第二类:Workbench提示Not connect a valid licensing。这种情况往往是许可文件的hostname和当前计算机名不一致,或者时间不同步导致许可校验失败。检查环境变量ANSYSLMD_LICENSE_FILE是否指向正确的许可文件路径。
第三类:failover feature不可用,比如提示failover feature 'ansys electronics_desktop' is not available。这类报错多见于模块授权不完整。需要确认你购买的许可是否包含Electronics Desktop功能模块。HPC或者Maxwell等模块的许可证在默认开启时只分配了很少的核心,也需要在许可管理界面配置。
第四类:ansyswbu.exe encountered a problem导致Workbench崩溃。这个报错的原因很多,但最常见的诱因是显卡驱动不兼容。ANSYS在渲染大型装配体的三维模型时非常依赖OpenGL,遇到这个报错可以先更新显卡驱动,再把Workbench的Graphics设置改为Software模式试一下。如果崩溃发生在启动阶段,还可能是配置文件损坏,可以删除AppData下ANSYS相关的缓存文件再启动。
4.3 网格划分中的实际排查流程
再分享一个我自己的排查套路,适用于网格划分失败或者网格质量异常。
第一步,把所有的局部网格控制全删掉,只保留全局设置,重新生成一次网格。如果这样能成功生成,说明问题出在某个局部控制上——逐个加回控制项,找到引发问题的那个,通常是尺寸设置过小、或者Sweep的Source/Target选择有问题。
第二步,如果全局网格也失败,那么把几何进一步简化。删掉所有倒角、圆角、安装孔,哪怕结果相对粗糙,但先验证几何本身能不能网格化。如果简化几何也无法划分,大概率是几何本身有破面或自由边。回到SpaceClaim,用Repair工具修复后再导入。
第三步,排查单元质量差的区域。在Mesh Metric里看Skewness大于0.95的单元集中在哪些部位,通过颜色显示定位。这些区域往往是几何狭窄过渡区,用局部的Face Sizing把该区域加密,或者用MultiZone强制重新划分,通常能改善。
第四步,排查收敛性问题。网格没有问题但求解不收敛——这种情况往往是网格局部过密或过疏导致接触计算困难。检查接触区域的网格密度是否匹配,如果两个接触面网格密度差距太大,接触探测会失效。用Contact Sizing把接触区域的网格匹配起来,大部分收敛问题能迎刃而解。
5. 网格划分的进阶技巧与提速手段
5.1 多体零件与共享拓扑的网格策略
Workbench里有一个开关叫Share Topology(共享拓扑),在Mesh模块的Details面板里可以设置。它的作用是让多个相邻的实体在网格划分时共享节点,这样接触面处的网格是连续的,不需要再额外生成接触对。
但共享拓扑有一个缺陷:它会强制把多个体的网格在交界面上完全匹配,这会导致网格单元沿着交界线产生一定程度的扭曲。如果只是做简单的静力分析,我一般不开启共享拓扑,让Workbench自动生成接触对,因为接触对处理起来更灵活。但如果做多体零件的模态分析或者热分析,我建议开启共享拓扑,因为模态和热分析对网格的连续性要求比接触算法高得多。
关于多域网格,还有一个技巧叫“虚拟拓扑合并”。在Mesh里可以选中多个相邻的面,用Create Virtual Cell把面合并成一个虚拟面,让网格划分器跨过真实几何边界生成网格。这个方法可以大幅减少碎面造成的网格混乱,尤其适合从三维CAD导入的复杂曲面模型。缺点是虚拟拓扑不可参数化,几何一变可能就得重建。
5.2 网格划分的提速与内存管理
做大型装配体网格划分时,时间成本往往会让你怀疑人生。几个提速经验供参考:
第一,控制单元数量。经验法则:结构静力分析每百万自由度大约占用1GB左右内存,求解时间随自由度非线性增长。网格不是越多越好,而是够用就好。在全局设置里把Element Size调到合理值,再配合局部加密,用最少的单元达到目标精度。
第二,尽量使用扫掠网格而非四面体。同样的精度下,扫掠六面体网格的单元数通常是四面体的三分之一,计算时间能缩短一半甚至更多。
第三,善用Distributed(分布式)与Batch(批处理)。如果机器有多核,在Mesh模块的Advanced面板里把Number of CPUs设置成物理核心数。在Workbench里,网格划分本身是支持并行计算的,不少用户从来没改过这个选项,默认用单核生成网格,浪费了硬件资源。
第四,合理选择求解器。并不是所有分析都需要迭代求解器。Workbench默认会根据模型自动选择直接求解器或迭代求解器,不要轻易改动。如果你发现内存不足,尝试开启求解器的Out of Core功能,让部分矩阵写到磁盘上,牺牲一点时间换取大规模计算的可行性。
还有一个冷门但实用的点:在做流固耦合分析(热词里有人搜“ansys流固耦合分析与工程实例”)以及蠕变分析时,流体域的网格和固体域的网格要求差异极大。流体域需要靠近壁面处有非常细密的边界层网格(Inflation),固体域则更关注应力集中区域。这两种网格在一个模型里共存,建议分开划分:先用Fluent Meshing划分流体域,再用Mechanical划分固体域,最后在System Coupling里耦合。强行在一个Mesh模块里同时生成这两类网格,基本上是噩梦。
6. 最后的经验小结
我实际操作中的体会是,网格划分就像炒菜——火候(全局尺寸)是基础,调味(局部控制)是提升,什么时候用大火(扫掠),什么时候用小火(四面体加密),完全取决于食材(几何)与菜系(物理场)。不要迷信某个特定方法或者某一类特定网格能够通吃所有问题,也没有哪个网格划分器能做到零人工干预。即便是经验丰富的分析师,一个新模型的网格也需要至少迭代三五轮才能达到满意的质量。
最后再分享一个小技巧:网格划分完了别忘了保存一份带网格的工程文件(.wbpj和相关的dsdb文件),这样下次修正设置时不用重新划分网格。尤其是在做参数优化时,每改一个参数都要重新计算网格会非常痛苦,如果能把网格部分单独分离出来做敏感性分析,会省下大量时间。这个项目后续还可以扩展的方向是:把网格质量检查脚本(Python在Workbench里的二次开发)集成到流程中,自动输出网格质量报告,配合你自己的分析标准,基本可以达到半自动化的状态。