资讯动态

ICEM CFD网格划分全路径:自动划分、附加块映射与结构/非结构网格

发布时间:2026/9/20 19:04:22 来源:尧图企业网站定制
简介围绕ICEM网格划分原理整理的PDF文档面向计算流体力学、有限元与数值仿真方向的学生及工程师适合刚接触ANSYS ICEM CFD、希望理清非结构网格与结构网格差异的入门到中级读者。内容从数值仿真的离散化思路切入串联质量、动量、能量守恒及时间与空间离散化再展开网格划分的两条路线自动生成的非结构网格操作简单、适应复杂实体但常需修补基于附加块的结构网格人工量大、质量高更适合规则模型。文档还梳理几何实体、反映特征的块、点线关联、节点设置到网格生成与后处理的基本流程并介绍网格单元类型、网格拓扑、构造块和节点分布规则等关键概念以及向Autodyn、LS-DYNA等求解器输出或导入网格的思路。压缩包内共1个PDF文件约2.96MB轻量便于查阅。目前已有740人学习下载。1. 从 PDE 到代数方程组网格节点为什么是线性插值点仿真跑了一夜残差卡在 1e-2 不动翻日志才发现是几个负体积单元在捣乱。这类问题多半不出在求解器参数上而是卡在几何离散化那一步。数值仿真的链路很直白先写数学描述——动量守恒、质量守恒、能量守恒配上本构关系、状态方程和失效模式凑成一组时变偏微分方程时间离散化把它压成定常偏微分方程空间离散化再把它变成代数方程组交给计算机求解分析结果再回来修正模型。空间离散化的物理动作就是划分网格边线用组合直线段逼近表面用组合平面区域逼近实体用网格单元填充。再往底层看几何离散化的实质是确定网格节点的空间分布而每个节点本质上就是一次线性插值点——网格给多密场变量在单元内的近似就能细到什么程度。主流空间离散化方法里有限差分、有限元、有限体积三家的网格需求各不相同但都绕不开节点在哪这个问题。2. 自动划分与附加块映射两条路线的原理与选型ICEM 把网格划分分成两大类。一类按预设方法自动划分由算法求解节点操作简单输出非结构网格能应付很复杂的实体网格质量不能保证大多需要修补另一类基于附加块先创建反映实体特征的块确定块上的节点分布关联块与实体的点线面把块的节点投影到实体上需要大量人工操作可输出结构网格也可以非结构形式输出质量高主要面向相对简单的模型。这两条路的差别不在操作习惯而在拓扑自由度。自动划分把节点位置的决策权交给算法算法只看几何局部特征看不到全局的流动方向或应力主方向附加块是人先把计算域的拓扑结构定下来再让算法去填充凡是人能想到这个方向必须顺着流的地方块都能表达出来。2.1 自动划分配置的是尺寸场不是一键出网格自动划分真正要你给的是一套尺寸场全局最大尺寸、最小尺寸、曲率加密、窄缝加密、边界层参数。节点分布由这些参数和几何特征共同决定。几何里一个 0.2 mm 的倒角如果没有被 Part 单独限尺寸全局 5 mm 的设定会直接把它穿过去于是又回到修补环节。自动划分的修补成本经常被低估。面网格生成后常见的问题是相交面处的单元重叠、狭长单元、以及自由边没有完全封闭导致体网格生成时报surface mesh is not closed。这些不是参数调错而是几何本身有间隙或重叠面需要在 Geometry 里做修复或者干脆换用能容忍脏几何的面网格方法。2.2 附加块的本质是满射加单射的一一映射块划分在数学上要求构造一个从规则计算域到物理域的映射既是满射又是单射。单射保证两个不同的块节点不会投影到同一个几何位置单元不塌陷、不翻转满射保证实体的每一点都被块覆盖几何不漏。关联这一步做的就是告诉程序块的这条边对应实体的哪条曲线节点按参数化位置投影过去相对空间位置保持一一对应。块划分被说成主要应用于简单模型不是算法弱而是块拓扑必须与几何拓扑同构几何上有 12 条棱块上就得有对应的 12 条边几何上有个圆柱就得用 O 型块把它包起来否则投影出的单元会严重扭曲。复杂几何意味着大量切块和关联人工成本随特征数量增长。2.3 选型对照与规模估算对比维度自动划分求解节点附加块映射节点决定方尺寸场加几何特征块的节点分布加投影人工投入低主要调参数高切块与关联占大头单元类型三角形、四面体、三棱柱四边形、六面体为主质量可控性差依赖修补高正交性与长宽比可设计几何适应性复杂实体、装配体拓扑可分解的实体典型用途快速试算、脏几何边界层、旋转机械、方向性强的冲击算例确定路线之后先估一下规模避免建完网格发现内存扛不住。下面这段脚本按节点数粗算场变量和拓扑的内存占用def estimate_hex(nx, ny, nz, dof_per_node5, bytes_per_dof8): nx/ny/nz: 三个方向的单元数 dof_per_node: 每个节点的场变量个数速度3压力温度之类 bytes_per_dof: 双精度 8 字节 nodes (nx 1) * (ny 1) * (nz 1) cells nx * ny * nz field_mem nodes * dof_per_node * bytes_per_dof / 1024**2 # MB topo_mem cells * (8 * 4 6 * 4) / 1024**2 # 8节点索引6邻居 return nodes, cells, field_mem, topo_mem n, c, f, t estimate_hex(120, 80, 60) print(f节点 {n}单元 {c}场变量约 {f:.0f} MB拓扑约 {t:.0f} MB)参数里最容易拍错的是dof_per_node显式动力学通常只有位移和速度隐式 CFD 会多出湍流量实际按求解器设置翻一倍比较稳妥。结构化网格 57 万单元这个量级在桌面工作站上还算轻但如果三个方向各乘 2内存就是 8 倍增长。提示块划分的节点数由每个块边的分布决定先算规模再切块比切完再发现网格太密要省事得多。3. 非结构网格的落地路径参数分层、面网格方法与体网格分支非结构网格的划分步骤是固定的设置参数、选择方法、自动划分、大多需要网格修补。真正决定成败的是前三步里的参数覆盖关系和方法的匹配。3.1 参数的四层覆盖关系ICEM 把网格参数分成四层优先级从低到高是全局、Part、面、线原文里局部设置为准说的就是这个覆盖关系Global Mesh Setup全局最大/最小尺寸、单元类型、边界层全局设定Part Mesh Setup按 Part 覆盖尺寸比如只对流体域加密Surface Mesh Setup单个面的最大尺寸、高度、增长率Curve Mesh Setup单条曲线的节点数或间距实际调参的顺序是从粗到细先定全局尺寸跑一遍面网格看整体分布再对关注区域单独降尺寸。反过来做很容易在几十个面上重复设定最后记不清哪个值生效。3.2 面网格五种方法的适用边界方法节点铺法适合几何代价Patch Dependent贴边界曲线铺面细节多、需要捕捉小特征面相交处容易出错Patch Independent忽略小于阈值的特征脏几何、小孔小边多特征被抹掉需确认物理上可忽略ShrinkWrap从包络面收缩贴合有缝隙、重叠面的模型尖锐特征被磨圆Delaunay从表面到内部逐渐粗化需要快速拿到体网格边界层控制弱AutoBlock正交块贴近几何表面近似可块分解的实体只有规则区域用得上面网格的单元形状还要选Quad w/one Tri、All Tri、All Quad、Quad Dominant以及带四边形边界层的选项。流动方向明确的外流场Quad Dominant 加边界层通常比全三角形更省单元纯复杂几何就接受 All Tri。3.3 体区域定义与体网格分支面网格完成后必须先定义体区域才能生成体网格。做法是 Geometry 里的 Create Body用 Material Point 方式在体上选两个点使两点连线的中心落在体内部——中心在体外的点对会导致体区域跑到几何外面去这是新手最常踩的坑之一。体网格方法按几何复杂度分派Cartesian 生成规则笛卡尔网格靠近壁面时需要额外处理Hexa-Dominant 以六面体为主、过渡区用其他单元Tetra/Mixed 是四面体为主的万能方案Robust (Octree) 是八叉树路线鲁棒性最好但边界层需要单独贴。通常先用 Octree 拿一版能收敛的结果再考虑换 Hexa-Dominant 提升精度。下面是一个回放脚本的骨架把上面几步串起来。命令名会随版本变化最稳的写法是在 GUI 里手动操作一遍、录制脚本再改参数# ICEM CFD 回放脚本骨架非结构面网格 体网格 # 全局尺寸与面网格方法 ic_set_meshing_params global MaxSize 8.0 ic_set_meshing_params global MinSize 0.5 ic_set_meshing_params global SurfaceMeshMethod Patch Dependent # 只对流体域做局部加密覆盖全局尺寸 ic_geo_set_family_params FLUID surface_mesh_size 2.0 # 面网格计算 ic_surface_mesh_compute_global # 用 Material Point 定义体区域 ic_vol_create_body_from_geom_by_point FLUID 0.0 0.0 0.0 # 体网格先用鲁棒性好的八叉树路线 ic_volume_mesh_compute FLUIDMaxSize和MinSize决定尺寸场的上下界两者比值超过 20 时过渡区单元质量会明显下滑。surface_mesh_size是 Part 级覆盖写在这里的值会盖掉全局设定。体网格那一步如果报某个体区域为空先回去检查 Material Point 的中心是否真的落在体内部。3.4 质量检查与修补循环面网格生成完立刻查质量不要等到体网格。Edit Mesh 里的 Display Mesh Quality 可以按不同指标着色最常用的判断是看有没有自由边、重叠单元和最小内角过小的三角形。修补手段包括合并节点、光顺、局部重划对脏几何则回到 Geometry 做修复比在网格上硬补要干净。4. 结构网格的构造块、点线关联与 i/j/k 节点分布结构网格的划分流程是几何实体、反应特征的块、点线关联、设置节点、生成网格、网格后处理。六步里最花时间的是第二步和第三步。4.1 把实体切成能反映特征的基本块2D 用四边形块3D 用六面体块。初始块的生成方式有 Initialize Blocks按几何包围盒粗略建块之后靠 Split Block 切分让块的棱边数量与几何特征对应。圆柱、圆管这类回转体必须用 O 型块把块切成一个内芯加一圈环投影后单元才能顺着圆周方向排列否则中心区会出现退化的六面体。切块的粒度要克制。块切得越细关联工作量越大而且一个块边只能关联一条曲线块多到一定程度后哪些边关联了哪些曲线很容易搞混。常见做法是先按主要特征切成十几个块跑一版预网格看哪里扭曲再针对性加切。4.2 关联顺序决定映射是否自洽关联是点对点、线对线、面对面的映射。稳妥的顺序是先把大面关联掉再处理线最后处理点。原因是面关联会自动带动其边界上的线先线后点容易产生冲突程序会提示同一块边被关联到两条曲线。关联完成后按 F2 之类的方式切换显示让块和几何叠加逐条确认块边确实压在对应的几何曲线上。这一步偷懒后面投影出来的网格会斜着穿过几何面质量指标上表现为 Determinant 骤降。4.3 节点分布与 i/j/k 索引块的节点分布用 Edge Params 设定参数包括节点数、分布律BiGeometric、Uniform 等、Spacing 1/Spacing 2、Ratio。边界层方向通常用 BiGeometric两端间距按 y 目标反算中间用一个增长率过渡。下面这段脚本按首层高度和增长率反算层数与总厚度import math def bl_layers(h0, ratio, target_total): 按首层高度 h0 和增长率 ratio 累加直到接近目标总厚度 h, total, n h0, 0.0, 0 while total target_total: total h h * ratio n 1 return n, total def h_from_yplus(y_plus, rho, u_tau, mu): 由目标 y 反算首层网格高度 return y_plus * mu / (rho * u_tau) h0 h_from_yplus(30, 1.225, 12.0, 1.8e-5) n, t bl_layers(h0, 1.2, 0.05) print(f首层 {h0*1000:.3f} mm层数 {n}总厚度 {t*1000:.2f} mm)u_tau是壁面摩擦速度用求解器给的结果或经验值代入ratio超过 1.3 时单元尺寸跳跃明显容易在过渡区产生高长宽比单元。i/j/k 索引是块的三个方向节点数索引方向要和几何方向对应索引方向搞反网格在预网格阶段看起来正常导入求解器后流场方向会整体错位。4.4 生成、检查与结构网格的非结构输出预网格Pre-Mesh显示正常后用 Display Mesh Quality 逐项看指标。结构网格的质量检查常看这几项指标看什么经验阈值Determinant雅可比行列式的正负与畸变大于 0.3 较稳低于 0.1 需处理Angle单元最小与最大内角大致 18° 到 160° 之间Aspect Ratio长宽比边界层外可放宽Warpage面扭曲越小越好Volume单元体积必须为正负体积直接终止计算结构网格可以按非结构形式输出。这一步的意义在于让只支持非结构读入的求解器也能吃到六面体网格。转换前先确认预网格没有负体积转换后重新查一遍质量两次的指标不会完全一致。批量重建时用回放脚本驱动不必每次打开界面# 用回放脚本驱动 ICEM 批处理把日志留在文件里 icemcfd -batch -script build_block.rpl -output build_block.log # 出问题先看日志里最后一条 ic_ 命令再回放定位 tail -n 50 build_block.log | grep -i error\|fail可执行文件名和参数随安装方式不同用之前先确认当前环境里的实际名称。日志里报错的最后一条 ic_ 命令就是断点把它前面的操作单独存成一个小脚本改一次跑一次比整段重跑快得多。5. 网格导出到 Autodyn/LS-DYNA 后的首轮验证网格质量过关不代表能直接算。从 ICEM 导出到求解器导入这一段翻车点集中在单位、Part 命名和坐标对齐三处。5.1 单位与坐标一致性ICEM 里几何尺寸按 CAD 原始单位走可能是毫米也可能是米。求解器里材料参数用的密度、弹性模量、状态方程系数是按固定单位制写的两边对不上模型会以错误的量级起算最典型的现象是第一时间步就发散或者时间步长被压到极小。导出前先量一下模型的包围盒尺寸和求解器里期望的尺寸对一遍。坐标对齐同样容易忽略。ICEM 里的几何原点如果不在结构对称中心求解器里设置的初始条件、对称边界、加载面位置全部要跟着平移。常见做法是在 ICEM 里先把几何平移到求解器约定的坐标系再开始建块。5.2 Part 命名与边界条件映射求解器读入网格后边界条件是按 Part 名或者组名挂上去的。Part 名带空格、带特殊字符、或者两个面用了同一个名字导入时就会合并成一个边界后面想单独给某个面加载荷就做不到了。导出前在 Part Mesh Setup 里过一遍命名把入口、出口、壁面、对称面分清楚。5.3 用脚本做一轮导出后的体检导出之后写个小脚本统计单元规模和质量分布比在求解器里等报错要快。下面按导出的网格文件里常见的节点与单元段做解析import sys from collections import Counter def scan_mesh(path, keywords(NODE, ELEMENT, HEX, TET, QUAD)): 粗略统计导出的关键字文件里各类实体出现次数 counter Counter() with open(path, r, errorsignore) as f: for line in f: head line.lstrip()[:12].upper().strip() for kw in keywords: if head.startswith(kw): counter[kw] 1 break return counter if __name__ __main__: stats scan_mesh(sys.argv[1]) for k, v in stats.most_common(): print(f{k:8s} {v})keywords按实际导出格式的关键字改不同求解器的段头不同。统计结果和 ICEM 里显示的单元总数对不上说明导出时漏了某个 Part或者有 Part 被设成了不输出。这一步查出来只要改设置重导比在求解器里追一个单元数为零的报错省时间。导入之后别急着跑完整算例。先跑一步看能量、动量和质量守恒的初始残差是否在合理量级再看有没有单元报负体积。首轮验证通过再逐步加时间步长和载荷。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价