ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Star CCM+中用阈值衍生件精准圈选并删除目标网格

Star CCM+中用阈值衍生件精准圈选并删除目标网格 前阵子帮一个同事收拾一套算例网格他遇到的情况挺典型整个计算域里有一小撮网格质量极差卡在一堆形状怪异的小缝隙里手动选择又选不准拉框还会把附近的好网格一起框进去折腾半天也没清理干净。后来我用了一个组合拳——在 Star CCM 里先用衍生零部件Derived Parts创建阈值Threshold提取目标区域再配合区域内的网格删除操作把那些坏单元一并收拾掉前后没用几分钟效果还特别干净。这篇文章就把这套思路从头捋一遍包括衍生零部件到底怎么用、阈值参数怎么设置不容易翻车、区域内删除目标网格的几种路径以及我踩过的坑和排查经验给正在被网格清理、局部加密或后处理区域提取折磨的朋友做个参考。看完这篇文章你会清楚三件事第一衍生零部件不是花架子它是把“按物理量圈范围”这件事变成可复用资产的关键工具第二阈值参数不是随手填的方向和范围的取舍直接决定目标网格的命中率第三删除目标网格不只有一种做法不同的改动深度对应不同的操作路径。文章涉及的内容偏前处理和网格处理适合用过 Star CCM 基础操作、想进一步把网格控制能力提上来的工程师和研究生。1. 整体思路为什么用“阈值”来圈定网格区域1.1 衍生零部件和常规零部件的区别很多接触 Star CCM 一段时间的人对零部件的理解还停留在“几何模型导入后生成的那一堆基础零部件”上也就是模型树里带图标的那几个 Solid、Surface、Volume 之类。这些零部件有明确的几何来源跟 CAD 模型挂钩是网格生成的输入。但实际算前处理做得多了就会发现很多时候我们需要关注的并不是“几何上属于哪个零件”的区域而是“物理量上满足什么条件”的区域——比如速度低于某个值的回流区、温度超过某个阈值的燃烧区、涡量特别高的剪切层。这时候常规零部件就帮不上忙了因为你没法用几何框选去描述一个流动特征。衍生零部件Derived Parts就是专门解决这类问题的工具。它不是从几何模型直接创建的实体零件而是基于现有网格节点、单元、表面或物理场数据“计算”出来的新零部件。它的底层数据和原始零部件共享你可以随时刷新也可以和原始零部件一起参与后续的网格操作、后处理或求解过程。换句话说它更像是“视图”或者“选区”而不是一套新的独立网格。我第一次用的时候也担心它会不会复制一份大网格导致内存暴涨实际上它只存引用关系和阈值定义内存开销非常小完全不用有顾虑。1.2 阈值衍生件的原理和工作流程阈值Threshold是衍生零部件里最常用的一个类型。它的底层逻辑不复杂给一个标量场比如速度大小、压力、温度、涡量或者自定义的场函数设一个最小值和一个最大值软件就会把所有网格单元或表面面片的标量值跟这个区间做比较落在区间里的就归入这个阈值衍生件落在区间外的就不要。这个逻辑听起来跟后处理里显示云图时调整色标范围差不多但它比调云图多了一层意义阈值衍生件是一个带定义的零部件可以被后续的网格操作、区域提取、体渲染、报告监视等直接引用。云图范围只能改“显示”阈值能实实在在地把“目标网格”这个集合变成操作对象。我在实际工作中经常一次创建好几个阈值衍生件分别对应不同物理条件然后统一挂在同一个场景里做叠加显示调试起来非常直观。这里要注意一个方向性问题。星空里阈值衍生件创建时通常会有 Inside 和 Outside 的选择。Inside 是保留阈值区间内的部分Outside 是保留区间外的部分。很多人第一次用的时候容易搞混尤其是设置区间边界时正好卡在目标区域边沿上的情况选反了就会把想要的删掉、不想要的留下。建议创建后先在场景里叠加显示一遍确认提取的高亮区域就是你要的目标区域再进入下一步操作。养成这个习惯能省掉后面很多麻烦。1.3 为什么“区域内删除目标网格”值得这么干回到标题里的核心诉求区域内删除目标网格。为什么这种操作值得专门研究因为网格清理和局部控制在工程算例里太常遇到了。典型场景之一是删除小缝隙或薄壁区域的网格。有些几何模型在 CAD 阶段就没处理好留下了极其细小的间隙或尖角网格生成后这些位置会出现大量歪斜、负体积或体积极小的单元。这些单元在求解时轻则拖慢收敛重则直接让计算发散。如果想手动选中这些单元基本等于大海捞针如果拉框选择又会误伤周围的正常网格。而这类坏网格通常都有物理量特征——比如被压缩在极窄空间里就往往伴随很高的压力梯度或速度梯度或者单元体积特别小可以直接用“单元体积”作为标量场来设置阈值。场景之二是做局部区域的控制调整。比如某个区域网格太密想让求解器在后续计算里跳过它或者相反某个区域需要在现有基础上进一步加密这些操作如果目标区域能用物理量定义用阈值衍生件就会非常顺手。你不需要去数网格编号也不用手工描边界阈值自动把边界圈出来后续所有操作只针对这个区域生效。第三类场景更偏后处理提取某个物理范围内的体单元做体积分统计、创建截面做流量监测、给某个高温区域单独渲染等等。这些本质上也是“先把目标网格找出来”的问题。所以把阈值衍生件和网格删除/网格控制组合起来等于拥有了一套“按物理量定制网格操作”的通用方法不管你是做整车外流场、电子散热还是燃烧仿真这套逻辑是通用的。2. 实操前置阈值衍生零部件的创建与调试2.1 创建阈值衍生件的完整步骤在 Star CCM 中创建阈值衍生件的位置很固定模型树上右键点击 Derived Parts选择 New Derived Part然后在弹出的下拉菜单里选择 Threshold。这个菜单里还有 Contour、Section、Probe 这些选项功能各不相同但 Threshold 和 Contour 容易被混淆下面会专门说。创建之后属性窗口里通常会出现几个关键设置项。第一项是 Parts 或 Input Parts 的选择这决定了你基于哪一套零部件来提取数据。一般选择包含目标网格的体网格零部件即可如果有多区域多零部件注意别选错。第二项是 Scalar Field即你要以哪个标量场作为阈值判定依据。默认可能是压力或速度大小你可以从列表里选任何已存在的场也可以选自定义场函数。第三项就是最小值和最大值也就是阈值的上下限。第四项是方向选择Inside 还是 Outside这个前面已经提到过大部分人第一次都会在这里栽跟头。创建完成后模型树里会多出来一个 Threshold 衍生件节点。这时候建议立刻在场景里查看一下把该衍生件拖入一个 Mesh 场景或 Geometry 场景调成透明显示或线框模式再叠加原始网格就能看到哪些单元被阈值捕获。我个人的习惯是把它跟原始零部件放在同一个场景渲染模式分别设成不同的颜色这样高亮区域一目了然。如果发现高亮区域明显偏大或偏小直接改最小值和最大值场景会实时更新非常方便。2.2 阈值范围和方向怎么定才不容易删错阈值参数的核心难点不在“会填”而在“填得准”。经验不足的人往往直接拍脑袋填一个区间发现高亮区域不对再反复试效率低不说还容易对结果失去信心。这里分享几个我常用的确定参数的方法。先定标量场。理论上任何场都可以当阈值依据但工程上效率最高的还是那些跟“坏网格/目标特征”强相关的场。比如清理低质量单元时单元体积Cell Volume或单元质量度量Cell Quality Metric往往能直接命中问题单元提取高温区时温度是最直接的选择提取低速回流区时速度大小或者压力都可以。原则只有一条目标网格在这个场上的数值分布要跟周围网格有足够明显的区别。如果找来找去找不到合适场那就用场函数自己构造一个这个后面会展开讲。再定区间。我一般不会一上来就精确填目标范围而是先打开一个标量云图在颜色图例上读取目标区域的场值大概落在什么区间然后把这个区间稍微放大 5%10% 作为阈值上下限。为啥要放大因为阈值是严格的数学截断边界上的单元值如果刚好卡在限值附近会因为数值波动导致同一个特征区被切出锯齿状边界稍微放大一点可以让选区更稳定后续处理也更顺滑。但放大也不能太多不然误伤范围变大反而失去阈值的意义。多试几次你就能找到手感。接着定方向。Inside 和 Outside 的选择其实有一个统一判断标准你关心的对象是“区间内的单元”还是“区间外的单元”。大部分人犯错是因为下意识觉得“我要删坏网格坏网格在区间内所以选 Inside”但实际操作时会把阈值区间设反导致选区完全反掉。我的经验是每设置完一次立刻拖到场景里看一眼高亮区域就是被选中的区域。看对了再进行下一步看错了直接切换方向不要靠猜。还有一个隐藏参数需要注意阈值的分段位置是基于节点值还是单元值。Star CCM 里不同的阈值类型和零部件类型可能对这个细节有不同的默认处理。某些情况下如果阈值结果出现半个单元“半亮半暗”的状态说明是在节点上插值后再做的判定。这种情况对显示问题不大但如果要做精确的体积统计或网格删除建议在属性里设置成基于单元Cell的判定方式保证每个单元要么完全选中、要么完全没选中。2.3 用场函数构造更灵活的阈值条件有时候单一标量场不足以描述“目标网格”的几何位置和物理特征。比如你想删除某个坐标范围内的低质量单元或者想提取同时满足“温度高于某值且速度低于某值”的区域这种情况下直接用内置场就不够看了。解决办法是自定义一个场函数Field Function把所有条件揉进一个公式里再把阈值基于这个场函数执行。场函数的创建入口在 Tools Field Functions右键新建然后定义公式。语法并不复杂Star CCM 支持基本的数学运算符、常用函数以及各种内置物理量的引用。比如要构造一个“x 坐标在 0 到 0.1 米之间且温度大于 300K”的组合条件公式可以写成if(${Position}[0] 0 ${Position}[0] 0.1 ${Temperature} 300, 1, 0)。这种公式的返回值是 1 或 0那阈值就可以设成最小 0.5、最大 1.0选 Inside就能把所有满足条件的单元一次性圈出来。用场函数的好处是灵活但也有代价公式里如果用了耗时的计算量或庞大的插值函数场景刷新和衍生件更新会变慢。我建议在公式里尽量少用随位置大范围变化的插值表能用解析表达式的就用解析表达式。另外自定义场函数都有单位公式里的常量别忘了带单位或者确保单位兼容不然随时给你报一个单位错误排查半天才发现是常量后面少写了单位。从实用角度讲掌握场函数 阈值组合基本就能覆盖绝大多数“按条件圈网格”的需求。你甚至可以把阈值衍生件固化为模板下次遇到类似算例直接改公式里的数值参数就能复用这比每次重新创建从头设置要高效得多。3. 区域内删除目标网格的完整实现路径3.1 路径一拆分解耦后删除子零部件先说一条我实际项目里用得最多的路径用阈值明确目标区域然后通过 Split by Threshold 把目标区域从整个零部件里拆出来拆出来后删除不需要的子零部件。这种方法的好处在于删除过程可控、可回溯而且在模型树里能清楚看到拆出了哪些部分。具体操作是这样先按照第 2 节的方法把阈值衍生件创建好确认高亮区域是目标网格。然后找到 Operations 下的 Split by Threshold 操作或者直接对原始零部件右键选择类似的拆分功能不同版本菜单位置略有差别但名字都带 Split 和 Threshold。在操作属性里把输入零部件指定为你要拆分的体网格把标量场和阈值区间设置成跟前面一致的参数运行该操作。运行完成后原始零部件会按阈值被拆分成多个子零部件其中一部分对应阈值区间内另一部分对应区间外。之后的事就很简单了在模型树里选中不需要的那个子零部件右键删除。如果拆分出来的是多个子件也逐一检查只保留需要参与后续计算的部件。删除之后你会发现原来那个完整的网格集合被“区域内删除目标网格”的效果实现了。而且因为拆分和删除是基于零部件层的操作撤销和回归也比较方便——删除前可以先复制原始零部件做备份或者直接 CtrlZ 撤销容错率很高。这条路径还有一个额外好处拆分后的子零部件各自独立后续可以对它们分别设置不同的网格控制、边界条件或物理模型。比如把目标区域拆出来做局部的细致网格控制或者把不需要计算的区域单独抑制掉这比在原零部件上做全局控制灵活得多。我就经常用这一招同时处理“网格清理”和“局部细化”两个需求一套流程走两遍效率翻倍。3.2 路径二借助单元格集标记并清理另一条更偏向网格层面的路径是借助 Cell Set单元格集。它的核心思路是不直接删除零部件而是先用单元格集把目标网格标记出来再通过网格操作里的移除、编辑或重构功能针对这个集合实施删除或替换。这条路径适合不想改变零部件结构、只想调整网格的场景比如重组体网格之前统一清理坏单元。具体来说你可以基于阈值衍生件生成一个 Cell Set。有了单元格集之后网格操作里就可以把它作为一个控制对象来引用。比如在体网格重构时可以让求解器或网格工具“跳过”这些标记单元或者主动从网格里移除它们在编辑网格阶段也可以直接用软件提供的单元删除类操作把集合内的单元删掉。这种方式的优势是目标网格始终作为一个动态集合存在如果后续阈值条件变了只需修改阈值衍生件删除目标也会跟着更新不需要重新拆分零部件。不过要注意一点直接用单元格集删除单元可能会导致网格出现空洞或孤立面所以在实际工程中我很少单纯地“删”就完事一般会把“删除”和“重新生成”一起考虑。比如先标记低质量单元删除后立即对受影响区域执行曲面重建和体网格重填。如果你对后处理修复这块没有把握建议优先选择路径一的零部件拆分删除法因为它的操作层级更接近几何语义出现裂缝和悬空面时更容易通过常规修复手段处理。3.3 删除之后的重建与验证无论是走哪条路径删除目标网格都不是终点。网格被删掉后原本连续的计算域会出现一个洞如果不做处理直接拿去做求解计算基本必崩。所以删除之后一定要同步跟进重建和验证步骤。先做表面完整性检查。把删除后的体网格零部件调出来显示模式切到表面或线框绕观察一圈重点看删除边界有没有因为切得不齐而出现明显的悬空边、尖角或重复面。如果目标区域原本是内部的体网格删除后边界上理应露出一个平滑的“切面”这个切面最好由规整的表面单元构成。如果发现边界很毛糙一般是因为阈值切在单元之间产生了锯齿这时候可以考虑用 Surface Remesher 对面网格做一次光顺重构或者稍微调整阈值参数尽量让切面沿天然网格面走。再重建体网格。如果删除的目标网格数量不大可以直接对修改后的零部件重新执行体网格生成。如果删除区域比较大建议先把体网格零部件导出为面网格做一遍表面修复再重新生成体网格。这样虽然多了一道工序但网格质量会稳得多。重建完成后务必运行一次网格质量检查看最小单元体积、负体积单元数量、歪斜率等指标是否恢复到可接受的区间再放心提交求解。最后做一次区域验证。在求解器运行之前创建一个后处理监视报告比如计算目标区域的体积、质量流量或者温度平均值跟删除前的数值做对比确认这次删除没有把不该动的东西带走了。很多实战中的翻车事故都是在删除后没做这一步验证等到迭代求解到一半才发现某个关键区域被误删导致整个算例白跑。这个额外几十秒的验证动作能省下一个通宵的返工。4. 常见问题与排查技巧实录4.1 阈值衍生件提取后显示空白什么都没圈到这个问题几乎每个人都会遇到翻车原因通常集中在三个地方。第一个原因是选错了标量场或输入零部件。尤其是多区域、多部件算例你在创建 Threshold 时选择了一个不包含目标物理量的零部件提取结果自然为空。排查方式很简单把输入零部件换成包含目标区域的体网格零部件再确认标量场确实存在于该零部件上。第二个原因是阈值区间和实际场值完全没交集。比如目标区域的温度都在几百 K你设的阈值区间却是常温附近的数值自然什么都圈不到。这时候不要凭感觉猜先打开一个标量云图读取目标区域实际的场值范围再把阈值区间调整到跟它重叠。第三个原因是单位问题Star CCM 里不同零部件、不同物理量可能在界面显示成不同单位但阈值输入框的单位不一定自动换算一个数值差了几百倍圈不到东西太正常了。检查一下输入框旁的单位下拉框确保跟场一致。还有一个不太起眼的原因阈值衍生件创建后场景缓存没有刷新。有时候模型树里节点存在但场景显示还停留在旧状态。这种时候右键刷新场景或者把衍生件重新拖入场景一次问题往往就消失了。在判断“没圈到”之前先花十秒钟刷新一下避免在不是问题的问题上浪费时间。4.2 阈值边界出现锯齿和台阶选区边缘粗糙用阈值提取的特征区域边界基本不可能平滑这是原理上注定的——阈值是逐单元或逐节点做判断肯定会把连续物理场切成离散台阶。如果你的目标只是为了删除坏网格锯齿边界通常问题不大因为删除操作本身对边界形状的要求不高。但如果这个区域要用来生成网格控制或者做后处理监测面锯齿边界可能会带来负面效果。我常用的对策有三个。第一调整阈值区间让边界尽量落在物理场梯度大的位置这样相邻单元的数值差异大被阈值切开的锯齿宽度会小很多。第二用光顺算法处理。Star CCM 里有针对面网格的光顺重构工具可以对切面重新划分让边界单元更均匀。第三把阈值衍生件转换成面数据再用 Surface Offset 或类似操作做一次偏移和重构相当于把粗糙边界重新“布”一遍。具体用哪种取决于你要拿这个边界去做什么。做网格控制就用前两种做监测面可以三种都试试挑效果最稳的。4.3 删除网格后出现悬空面和空洞如何安全修复删除目标网格后出现悬空面和空洞是网格清理场景里最典型的后续问题。你删的如果是孤立在计算域中间的坏单元簇那删除后周围的好网格还是会围绕出新的边界一般问题不大但如果删除的目标区域跟外部边界相连甚至跨越了多个特征区域删除后就很可能会出现边界断裂。修复思路是先把删除后的零部件在表面模式下仔细检查一遍找到裂缝和悬空面的位置。如果是小面积空洞可以直接用面网格修复工具让软件自动识别并补面如果是大面积撕裂建议退回上一步把阈值区间调小一点缩小删除范围分多次小步清理而不是一次性删除一大片。要特别提醒的是删除后尽量不要再叠加其他网格操作否则问题会叠加排查起来非常痛苦。正确顺序是简化、删除、检查、修复每一步确认没问题再做下一步。如果实在删不干净我还有一个备选思路用网格包装Surface Wrapper把整个修复后的模型重新包一层。Wrapper 本身有粘连和漏洞检测能力能在很大程度上自动修复悬空和破损。不过 Wrapper 会改变表面细节如果目标区域包含薄壁或小尺度特征要谨慎调整包装尺寸参数防止关键特征被“包没了”。4.4 多个零部件共享节点导致删除后关联混乱还有一种隐蔽的翻车点目标网格和周围的零部件共享节点或共享面删除后会导致其他零部件表面也被牵动轻则显示异常重则破坏整个计算域拓扑。遇到这种情况我的建议是在执行删除前先切断共享拓扑关系。可以在零部件属性里把共享接触面的设置改为非共享状态或者直接先用拆分操作把目标区域拆成独立零部件再删除。这一步等于先把“关联”剪断再动手后面就不会牵连一片了。如果已经删出问题也别慌把原始备份零部件重新拖进模型重新走一遍删除流程记得先处理拓扑耦合问题即可。总之删除目标网格这件事本身不难难的是删除之后不能让其他部分崩掉。把拓扑关系梳理清楚多留备份多验证经验都是这样一点点攒下来的。5. 除了删网格阈值衍生零部件还能这么用5.1 局部网格加密与自定义网格控制阈值衍生件最容易被忽视的用途之一是做局部网格加密的“圈地工具”。很多人做局部加密还在手动建立一个方块或者圆柱形的网格控制区域这种方法对规则几何还行但遇到流场特征不规则的情况就非常难受——你想加密的区域往往是个弯曲的射流、漩涡或者薄薄的边界层用规则几何框选不是包进太多没必要的区域就是漏掉关键的尾迹结构。用阈值衍生件配合 Mesh Control 就能解决这个问题。你可以把某个物理场比如涡量、速度梯度或者 Q 准则作为阈值依据把高梯度区或高涡量区圈出来然后把这个衍生的区域指定为网格控制的作用区域施加局部尺寸或加密参数。由于阈值区域跟随物理场变化整个网格加密逻辑从“人为画范围”变成了“按物理特征自适应”网格资源能更精准地花在关键区域。我在做汽车尾部涡流结构分析时这套方法比手动加密盒子的效果要好得多网格量能省 30% 以上。5.2 后处理监测面与体积统计阈值衍生件在后处理里的用法也非常香。例如需要统计高温区的体积占比、计算某个速度范围内的流量或者监测多相流中特定相体积分数超过临界值的区域这些需求都可以用一个阈值衍生件搞定。具体做法是把阈值衍生件创建好后直接拖入报告Report的体积积分或面积分表达式里作为积分的几何范围。你会发现收敛速度比别人拍脑袋画截面快得多而且数值一致性也更好。还有一种常见用法是创建阈值表面把阈值衍生件转成表面零部件然后在后处理场景里显示成等值面效果。比起手动创建 Isosurface阈值衍生的表面有一个优势——它直接关联物理场场更新后表面也更新非常适合做瞬态动画里追踪某个特征区域的位置变化。5.3 多相流、燃烧等复杂场景中的区域提取多相流和燃烧算例里“按阈值圈网格”几乎是刚需。比如自由液面追踪可以基于 Volume Fraction 设置阈值把相界面精确提取出来燃烧算例里可以基于组分浓度或温度阈值把火焰锋面位置画出来进而统计燃烧区体积、预估反应区域范围。这些用法跟我前面讲的删除网格是完全同源的逻辑区别只在于提取出来的区域用于什么目的。而且这类场景里衍生件的价值会进一步放大流动是瞬态的特征区域每时每刻都在变用固定几何去圈永远都滞后而阈值衍生件实时跟着流场变量走在哪一步都能提取出当前物理状态下的真实区域。把这个思路固化到日常工作流里你会发现很多原本靠手动调整的环节都能自动化计算效率和结果解读的方便程度都会上一个台阶。我个人在实际操作中的体会是阈值衍生件是 Star CCM 里少有的“你越早学会以后省事越多”的功能。它的入门门槛很低创建一次、看一次高亮效果基本就懂了但它的上限很高等你能熟练组合场函数、拆分、网格控制和后处理报告时几乎每个算例都能用到它。如果你正被网格选择、局部控制或者后处理区域提取折磨就把这篇文章里的步骤当成起点拿一个自己之前做过的小算例练一遍最多半天时间你就能感受到直接操作网格和按物理量操作网格之间的巨大差别。
返回列表