第一次打开 COMSOL 的时候,我盯着左侧模型树看了快十分钟,几何建完、物理场选完,然后就卡在那一长串灰色节点上——边界到底该点哪一个?加完边界条件又不知道网格该怎么划,划完了求解报错,报错信息还看不懂。折腾两天之后才算跑出第一张能看的云图。后来带新人,发现几乎每个人都会在同样的地方踩坑:边界设置靠猜、网格划分靠默认、数据处理靠截图。这篇内容就围绕这三件事展开,不扯虚的,全是我自己在 COMSOL 里反复试错攒下来的做法。如果你刚开始用这款软件,或者已经能跑通流程但结果总是对不上,那接下来的内容应该能帮你少走不少冤枉路。文中涉及的操作路径以常见的 COMSOL 桌面界面为准,具体版本可能略有差异,但逻辑是通的。
1. 先把流程理顺:三个环节为什么最容易翻车
1.1 从几何到结论的完整链路
COMSOL 的模型树本身就是一条流水线:几何、材料、物理场、边界条件、网格、求解、后处理,自上而下排列。这个顺序不是随便定的,它对应的是数学上的定解问题——偏微分方程加上初始条件和边界条件,才构成一个有意义的问题。很多人一上手就急着点“计算”,忽略了模型树其实是按依赖关系排的:几何改了,网格得重建;物理场换了,边界条件跟着失效;网格变了,求解器的自由度数量也变,之前调好的收敛参数可能直接不灵。
我的习惯是每次新建模型先把模型树从头到尾念一遍,确认每个节点都有内容,没有“待定”的空壳。尤其是“边界条件”这一类节点,COMSOL 会默认给你挂上一个初始值或者默认约束,但它只覆盖了一部分边界,剩下的边界是什么行为,软件不会主动提醒你。这就像装修房子,水电泥瓦都排好了,唯独有一面墙忘了砌,你住进去之前是发现不了的。
还有一个容易被忽略的点:模型树里节点的先后顺序会影响求解。比如在多物理场耦合里,先求解哪个场、后求解哪个场,对应的是分离式求解的迭代顺序,顺序选错,收敛速度可能差出好几倍。所以不要觉得“节点放哪儿都一样”,它是有物理含义的。
1.2 用“反推法”确定建模精度
新手最容易犯的第二个错误是维度贪多。明明是一个轴对称的管道,非要建三维全模型;明明只关心稳态温度分布,非要从零时刻开始跑瞬态。结果就是网格数量爆炸、求解时间从分钟级变成小时级,最后还因为收敛问题卡死。
我现在的做法是反推:先问自己最终要交付的结论是什么。如果是要看某个截面的平均温度,那二维轴对称就够了;如果是要看局部应力集中,那可能只需要把关注区域切出来做子模型;如果要看流动分离的三维结构,那才需要完整三维。这个判断过程大概花五分钟,但能省下几个小时的计算时间。
反推的第二步是确定精度目标。比如你关心压降,那就要回答“压降算到多少位有效数字算够用”。工程上一般 2% 到 5% 的误差是可接受的,那网格无关性验证的目标就定在相邻两套网格的结果差异小于这个数。目标定了,后面所有参数选择都有了依据,不至于在“要不要再加密一层”这种问题上纠结半天。
2. 边界设置:物理场落地的第一道关
2.1 边界条件约束的到底是什么
边界条件这个词听起来抽象,说白了就是告诉软件“这块边界外面是什么情况”。一块金属板一头固定,那固定端的位移就是零,这是位移边界条件;另一头挂了个重物,那这一端受到的力就是已知的,这是力边界条件;板的上下表面暴露在空气里,那表面就和环境有热交换,这是对流边界条件。每一种边界条件,本质都是在给方程补充一条信息,让解唯一。
关键点在于:COMSOL 里没有被显式设置为边界条件的边界,会采用物理场的默认行为。固体力学的默认是自由边界,也就是表面不受力;传热的默认是绝热,也就是没有热量进出;流体流动的默认是壁,也就是无滑移。这些默认值本身没错,错在你以为它不存在。我见过最典型的翻车场景是:做一个散热器模型,只给底面设了热源,其他面没管,结果表面全部按绝热处理,热量一点都散不出去,温度算出来高得离谱,还以为是材料参数填错了。
所以我的习惯是,物理场建好之后,先在“边界条件”节点里挨个看一遍,确认每一条外边界都被显式覆盖了,实在不需要设置的才留着默认。
2.2 常见物理场的边界类型怎么选
不同物理场的边界条件名称不一样,但功能分类是相通的:一类是“约束型”,直接指定某个量的值(位移、温度、速度);一类是“载荷型”,指定通量或力;还有一类是“对称/周期型”,利用几何或物理上的对称性减少计算量。下面这张表是我平时建模时随手查的对照。
| 物理场 | 常见边界类型 | 典型使用场景 | 需要留意的点 |
|---|---|---|---|
| 固体力学 | 固定约束 | 结构根部、螺栓连接面 | 约束过多个方向会导致过约束,应力虚高 |
| 固体力学 | 指定位移 | 已知变形量的加载端 | 单位要和几何单位系统一致 |
| 固体力学 | 边界载荷(力/压力) | 受压面、受拉端 | 压力方向沿法向,力的方向要手动定义 |
| 固体力学 | 辊支撑 | 只允许面内滑动的对称面 | 比固定约束更接近真实约束状态 |
| 传热 | 温度 | 与恒温源接触的面 | 温度值会强制覆盖该面的所有点 |
| 传热 | 热通量 | 已知功率密度的加热面 | 注意是单位面积功率还是总功率 |
| 传热 | 对流热通量 | 自然对流或强制风冷表面 | 换热系数和流体温度要一起给 |
| 传热 | 热绝缘 | 默认边界,或真正的绝热面 | 数值上无通量,不等于无温度梯度 |
| 流体流动 | 入口(速度/压力/质量流) | 管道进口、风道进风口 | 速度入口要给出方向,压力入口要给参考压力 |
| 流体流动 | 出口(压力) | 管道出口、开放边界 | 出口压力通常设为零(表压) |
| 流体流动 | 壁(无滑移/滑移) | 管壁、对称面 | 滑移壁可用于简化对称面 |
| 电磁场 | 理想电导体 | 金属表面 | 相当于电场完全反射 |
| 电磁场 | 端口 | 波导输入输出 | 端口类型要匹配模式 |
这张表不是让你背下来,而是提醒你:每加一个边界条件,先确认它属于哪一类,再想清楚它在物理上对应什么。搞不清楚的时候,问自己一句“这块边界外面的世界长什么样”,答案通常就出来了。
2.3 参数填写与方向定义的实操细节
边界条件加对了类型,参数填错照样白搭。最常见的三个坑是单位、方向和参考值。
单位方面,COMSOL 支持在输入框里直接带单位,比如输入1[MPa]、25[degC]、0.5[m/s],软件会自动换算成基础单位。这个功能一定要用起来,比手动换算靠谱得多。我见过有人把 MPa 当成 Pa 输进去,结果应力云图差了六个数量级,还以为是材料模型有问题。
方向方面,边界载荷默认沿表面法向,这个在平直表面上没问题,但在曲面或者有倒角的地方,法向是逐点变化的。如果你要施加的是全局方向(比如重力方向固定向下),就得改用“指定方向”的选项,手动输入方向矢量。流体入口同理,速度入口要指定法向流入还是给定方向分量,如果几何是斜的,选错方向可能导致流体从入口往外流,求解直接发散。
参考值方面,压力类边界条件通常给的是表压,需要一个参考压力。如果你同时设了入口速度和出口压力,而入口速度是质量流换算来的,那就要保证两者在密度上是一致的,否则进出口质量不守恒,残差降不下去。这类问题不会报错,只会让结果看起来“怪怪的”,比如速度场收敛了但压力场一直在漂。
提示:边界条件设置完成后,可以在物理场节点右键选择“检查边界条件”,软件会列出所有边界被哪些条件覆盖,哪些还停留在默认状态。这个检查我每次都会做,花不了半分钟。
2.4 边界设置的六个高频错误
踩过的坑整理一下,基本能覆盖新手 80% 的问题。
第一,忘记设置出口。只设了入口没设出口,流体无处可去,求解器会在第一步就告诉你“自由度不足”。第二,对称面用了固定约束。对称面的正确做法是辊支撑或对称边界,用了固定约束相当于把对称面焊死了,结果必然偏硬。
第三,热源给了总功率却没注意面积。热通量的单位是 W/m²,如果你的热源是 10 W,加热面积是 0.01 m²,那热通量应该是 1000 W/m²,直接填 10 会差两个数量级。
第四,入口和出口都给了速度。进出口都给速度,压力场就没有参考点,解会漂移。正确做法是一端给速度,另一端给压力。
第五,多物理场耦合边界漏设。比如流固耦合里,流体域和固体域的交界面必须同时被两边识别,漏了一边,耦合就断了。第六,周期性边界没配对。周期边界的源面和目标面必须一一对应,选反了或者选少了,结果会出现莫名其妙的跳变。
3. 网格划分:在“算得动”和“算得准”之间找平衡
3.1 物理场决定网格策略
网格划分的第一原则是跟着物理场走,而不是跟着几何走。同样一个圆柱,做结构分析时网格可以粗一点,因为应力变化相对平缓;做流体分析时,壁面附近的速度梯度极大,必须铺边界层网格;做传热分析时,如果存在薄壁或者大温差界面,界面附近也要加密。
COMSOL 提供了一个“物理场控制网格”的选项,会根据你选的物理场自动推荐单元尺寸。这个功能对新手很友好,但不要完全依赖它。它的推荐值是基于典型工况的,你的模型如果尺度特殊(比如微流控芯片、大型结构件),推荐值可能完全不适用。我的做法是先用物理场控制网格跑一遍,看看能不能收敛、结果量级对不对,然后再切到“用户控制网格”手动调。
单元阶次也值得说一下。COMSOL 默认用二阶拉格朗日单元,对大多数问题够用。一阶单元计算量小但精度低,容易出现“剪切锁定”这类数值问题;三阶以上精度高但自由度暴涨。除非你在做高精度的波动或者应力集中分析,否则二阶是性价比最高的选择。
3.2 从全局尺寸到局部加密的分层做法
我的网格流程分三层:全局尺寸、局部加密、边界层。
全局尺寸决定整体单元数量。一般先用“常规”或“较细”跑一遍,看看求解时间和内存占用能不能接受。如果模型很大,全局尺寸可以适当放松,靠局部加密来补精度。
局部加密针对的是几何上的小特征和物理上的高梯度区。圆角、小孔、薄壁、接触面,这些地方要单独加“尺寸”节点,把单元尺寸压到特征尺寸的三分之一以下。判断标准很简单:如果一个小圆角上只有一两个单元,那这个圆角等于没建,应力集中根本算不出来。
边界层网格是流体和传热问题的重头戏。它的作用是在壁面法向铺一层层逐渐变厚的薄单元,用来捕捉速度边界层和温度边界层。边界层网格的关键参数有三个:首层厚度、层数、增长率。这三个参数不是拍脑袋定的,下面单独说。
3.3 边界层网格的首层厚度怎么算
首层厚度决定了你能不能解析壁面附近的梯度。工程上常用的判据是无量纲壁面距离 y+。层流问题要求 y+ 在 1 左右,湍流问题如果用壁面函数,y+ 可以放宽到 30 到 100;如果要做壁面解析(低雷诺数模型),还是要压到 1 附近。
计算过程不复杂,拿一个具体例子走一遍。假设管道内径 D = 20 mm,平均流速 U = 1 m/s,介质是 20℃ 的水,密度 ρ ≈ 998 kg/m³,动力粘度 μ ≈ 1.002×10⁻³ Pa·s。
先算雷诺数:Re = ρUD/μ = 998 × 1 × 0.02 / 0.001002 ≈ 19920,属于湍流。
再算摩擦系数,用布拉修斯公式:f = 0.316 × Re^(-0.25)。Re^0.25 大约是 11.88,所以 f ≈ 0.0266。
然后算摩擦速度:u_τ = U × √(f/8) = 1 × √(0.003325) ≈ 0.0577 m/s。
首层厚度由定义反推:y = y+ × μ / (ρ × u_τ)。取 y+ = 1,得到 y ≈ 1 × 0.001002 / (998 × 0.0577) ≈ 1.74×10⁻⁵ m,也就是 0.017 mm。如果改用壁面函数、取 y+ = 50,首层厚度约为 0.87 mm。
层数和增长率要配合着定。总厚度要覆盖到边界层外层,湍流边界层厚度大致可以用 0.37×L/Re^0.2 估算,L 是沿流动方向的长度。假设管道长 0.5 m,Re 取 19920,Re^0.2 约等于 7.2,边界层厚度约 0.37×0.5/7.2 ≈ 0.026 m,也就是 26 mm。这个值偏大,实际管道内湍流边界层厚度通常只占直径的 10% 到 20%,用 4 mm 左右作为目标更合理。
如果首层取 0.017 mm、增长率 1.2、层数 15,总厚度是 0.017 × (1.2^15 - 1)/(1.2 - 1),1.2^15 约等于 15.4,算下来约 1.22 mm。这个厚度不够覆盖 4 mm,要么把层数加到 20 层(总厚度约 3.1 mm),要么把增长率提到 1.3。这就是参数之间的相互制约关系,不是随便填三个数就完事。
注意:首层厚度算出来之后,记得检查它是否小于相邻几何特征尺寸。如果首层比圆角还厚,网格会互相挤压,质量直接崩掉。
3.4 网格质量指标与无关性验证
网格划完,先看质量统计。COMSOL 的网格节点里能看到单元质量分布,重点看三个指标。
| 指标 | 含义 | 合格参考 | 不合格的处理 |
|---|---|---|---|
| 单元质量 | 综合形状指标,0 到 1 | 平均值 0.6 以上,最小值不低于 0.1 | 局部加密或调整几何小特征 |
| 偏度 | 单元偏离正四面体的程度 | 最大值控制在 0.8 以内 | 减小相邻单元尺寸比 |
| 单元体积比 | 最大单元与最小单元体积之比 | 控制在 10⁴ 到 10⁵ 量级 | 避免跨尺度过于悬殊 |
质量不过关,求解器要么报错,要么给出看起来收敛了但实际有问题的解。尤其是偏度大的单元,在梯度大的区域会产生非物理振荡。
网格无关性验证是另一件必须做的事,但很多人跳过。做法很简单:用同一套边界条件和求解设置,跑三套不同密度的网格(比如粗、中、细),比较你关心的关键量(压降、最高温度、最大应力)。如果中等网格和细网格的结果差异小于 2%,就可以认为中等网格已经收敛,用中等网格继续做后续分析。三套网格的单元数最好相差 1.5 到 2 倍,差距太小看不出趋势,差距太大浪费时间。
这里有个经验:网格无关性验证要针对你最终要报告的那个量,而不是随便挑一个。比如你关心的是出口平均温度,那验证对象就是它,不是最大温度。有些量对网格不敏感,有些量极其敏感,用自己的目标量做判据才靠谱。
4. 求解设置与收敛排查
4.1 稳态与瞬态的求解器选择逻辑
稳态求解对应的是“系统最终稳定下来的状态”,瞬态求解对应的是“随时间演变的过程”。选哪个不看物理场类型,看你要回答什么问题。如果你只关心散热器最终能压到多少度,稳态就够了;如果你关心它从开机到稳定需要多久、中间会不会超温,那就必须瞬态。
稳态求解默认用直接求解器,它把整个方程组一次性解出来,稳定但吃内存。模型自由度上到百万级的时候,直接求解可能直接爆内存,这时候要换成迭代求解器,代价是需要调预条件器和松弛因子,收敛过程会磨人一些。
多物理场耦合还有全耦合和分离式两种策略。全耦合把所有场的方程放在一个矩阵里同时解,收敛快、精度高,但对内存要求高;分离式按场逐个求解、交替迭代,内存友好但迭代次数多,强耦合问题可能根本不收敛。判断标准是看场与场之间的耦合强度:流固耦合、电磁热耦合这种强耦合,优先全耦合;传热和结构之间只有弱关联的,分离式就够用。
4.2 不收敛的排查顺序
不收敛是家常便饭,关键是按顺序排查,别乱试。我的一般顺序是这样。
第一步看残差曲线。残差是下降了之后卡住,还是一开始就震荡?下降后卡住通常是网格或物理场设置问题,一开始就震荡多半是边界条件矛盾或者初值太离谱。
第二步检查边界条件是否自洽。前面说的进出口都设速度、对称面设固定约束,都会导致方程组病态。这一步用“检查边界条件”功能能省很多事。
第三步看材料参数和初值。有些非线性材料(比如随温度变化的导热系数)在初值附近就发散,可以先把材料参数改成常数跑通,再逐步打开非线性。初值方面,瞬态问题如果初始场和边界条件差太远,第一步就会炸,可以先用稳态解作为瞬态初值。
第四步调整求解器。把阻尼牛顿换成自动高度非线性牛顿,或者手动降低初始阻尼系数;瞬态问题把时间步进从“自由”改成“中间”或“严格”,减小单步跨度。
第五步才是回去改网格。网格质量差确实会导致不收敛,但它通常是最后一环,因为改网格成本最高。
4.3 时间步与 CFL 的实操控制
瞬态求解里,时间步不是越小越好。步长太小,计算时间长且误差累积;步长太大,会直接跳过物理过程的细节,甚至发散。工程上的经验判据是库朗数:CFL = U × Δt / Δx,其中 U 是特征速度,Δx 是网格尺寸。对流主导的问题,CFL 控制在 1 以内比较稳妥。
举个例子,管道内流速 1 m/s,最小网格尺寸 0.5 mm,那 Δt 应该小于 0.0005 s。如果你设了 0.01 s 的固定步长,CFL 等于 20,流体在一个时间步内跨过 20 个网格,结果基本不能信。
COMSOL 的瞬态求解器默认用“自由”步进,由局部误差控制自动调整步长,大多数情况下够用。但如果你做的是有明显特征时间尺度的问题(比如周期性脉冲加热),建议手动指定输出时间点,让求解器在关键时刻落在整数步上,后处理取数据会方便很多。
5. 数据处理:从彩色云图到能交付的结论
5.1 后处理图元的使用场景对照
云图好看,但云图不是结论。COMSOL 的后处理图元有十几种,每种对应不同的表达需求,选错了图,别人看不懂你想说明什么。
| 图元类型 | 适合表达 | 不适合表达 |
|---|---|---|
| 表面图 | 二维分布、界面上的场量 | 内部三维结构 |
| 切面图 | 内部截面上的分布 | 整体趋势 |
| 体图 | 三维体的整体分布 | 精确定量 |
| 等值面 | 某个阈值的空间位置 | 连续变化 |
| 流线 | 流场走向和拓扑 | 定量速度大小 |
| 箭头图 | 矢量方向 | 密度过高时看不清 |
| 点图 | 沿线的精确曲线 | 空间分布 |
我的习惯是:先用体图或者切面图看整体趋势,确认没有异常区域;再用点图提取关键路径上的曲线做定量分析;最后用表面图或者等值面做汇报用的示意图。三层图配合着用,既能看清全局,又能说清细节。
5.2 派生值的计算与验证
云图只能看趋势,真正能写进报告的是派生值:积分、平均值、最大值、通量。COMSOL 的“派生值”节点里可以直接选体最大、面平均、线积分这些类型,选好几何实体和表达式就能算。
这里有个非常实用的技巧:用守恒律做交叉验证。比如做传热分析,进入系统的总热功率应该等于出口带走的热量加上边界散失的热量;做流体分析,进出口的质量流率应该相等。如果这两个数对不上,说明边界条件或者网格有问题,结果不可信。
具体操作是建两个积分节点,一个算入口的质量流率(对“法向速度×密度”在入口面上积分),一个算出口的,两者相减应该接近零。传热同理,算入口的焓流量和出口的焓流量,差值就是被加热或冷却的功率。这个检查花两分钟,但能挡住大部分低级错误。
对于瞬态结果,还要注意取的是瞬时值还是时间平均值。COMSOL 支持在派生值里对时间做平均,但前提是你指定的时间范围覆盖了完整的波动周期,否则平均值没有意义。
5.3 批量导出与自动化脚本
参数化扫描跑完之后,手动一个个导出数据能累死人。这时候用 LiveLink 接口写几行脚本会省很多事。下面这段是常见的批量导出写法,作用是打开模型、读取指定数据集上的场量、把结果存成文本。
import com.comsol.model.* import com.comsol.model.util.* model = mphopen('case.mph'); % 读取网格统计,确认单元数量 meshStats = mphmeshstats(model, 'mesh1'); fprintf('单元数: %d\n', meshStats.numelem); % 在指定数据集上提取温度场,坐标和数据一起导出 data = mpheval(model, {'T'}, 'dataset', 'dset1', ... 'selection', 'all', 'outofplane', false); coord = data.p; values = data.d1; % 写入文本,方便后续在表格软件里画图 fid = fopen('result_T.txt', 'w'); fprintf(fid, 'x,y,z,T\n'); for i = 1:size(coord, 2) fprintf(fid, '%.6e,%.6e,%.6e,%.6e\n', ... coord(1,i), coord(2,i), coord(3,i), values(1,i)); end fclose(fid);如果不想用外部接口,COMSOL 自带的“模型方法”也能做批量处理,用 Java 语法在模型内部循环参数、导出结果。核心思路是一样的:把重复操作写成代码,人只负责看结果。
导出格式上,文本文件适合小数据量和后续处理,VTK 格式适合导入到其他可视化工具里看三维场,图像格式只是给汇报用,别拿图像去做数据分析。
5.4 结果可信度的四步自检
算出结果不等于结果正确。我每次出报告前会走一遍四步自检。
第一步,量级检查。算出来的温度是不是在物理上合理的范围内,应力是不是超过了材料屈服强度,流速是不是和入口流量对得上。量级不对,先回头查单位。
第二步,守恒检查。前面说的质量守恒、能量守恒,能查的都查一遍。
第三步,网格无关性。关键量在两套网格上的差异是否小于设定阈值。
第四步,极限工况验证。把模型简化到一个有解析解或者有经验公式的工况,比如充分发展管内流动的压降可以用达西公式估算,两者对比一下。这一步最费时间,但最能暴露系统性问题。
6. 常见问题速查表与个人习惯
6.1 问题现象、原因与处理对照
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| 求解报“自由度不足” | 边界条件未覆盖某些边界,或物理场之间缺少耦合 | 检查边界条件覆盖情况,补全多物理场耦合节点 |
| 残差卡在 10⁻³ 下不去 | 网格质量差、边界条件矛盾、材料非线性太强 | 先查网格质量,再逐条核对边界,最后给非线性材料加初值 |
| 温度云图出现局部异常高点 | 热源单位错误、边界条件重叠、网格畸变 | 核对单位,检查重叠边界,查看网格质量 |
| 流场入口出现回流 | 入口和出口压力不匹配、出口位置离回流区太近 | 调整出口压力,把出口延长到流动充分发展区 |
| 结果随网格变化剧烈 | 网格太粗、关键区域未加密、边界层首层过厚 | 减小局部尺寸,重算边界层参数,做三套网格对比 |
| 瞬态第一步就发散 | 初值与边界条件差距过大、时间步过大 | 用稳态解做初值,减小初始步长或改用自动步进 |
| 派生值与其他工具结果不符 | 单位换算、积分面选错、坐标系不一致 | 核对积分对象和单位,确认坐标系方向 |
| 模型打开后计算极慢 | 网格自由度过多、求解器设置不当 | 降低网格密度,改用迭代求解器或分离式策略 |
这张表放在手边,遇到问题先对号入座,比盲目试参数快得多。
6.2 工程文件与版本管理习惯
最后说几个不涉及技术但影响效率的习惯。
一是模型文件命名带版本号和日期,不要用“最终版”“最终版2”这种名字,过两周自己都分不清。二是每次重大修改前另存一份,COMSOL 的撤销功能有限,改坏了回不去是最难受的。三是把常用的边界条件、网格设置、求解器配置存成“模型模板”,新项目直接套用,能省掉大量重复劳动。
还有一个是我个人的习惯:每建完一个模型,在模型树最上面加一个“全局定义”节点,把所有关键参数(几何尺寸、材料属性、工况条件)都写成参数,后面所有节点引用参数而不是硬编码数字。这样改工况的时候只改一处,全模型联动。刚开始觉得麻烦,用熟了之后,调试效率提升非常明显。
提示:参数化之后,配合参数化扫描可以一次性跑多个工况,结果自动汇总到一个数据集里,比手工改数字再重算快得多。扫描的工况数量不要贪多,先从三到五个关键点开始,确认趋势之后再加密。
这套流程跑顺之后,从接到问题到给出可信结果,中间的大部分时间其实是花在反复确认和验证上,而不是点按钮上。COMSOL 这类的仿真工具,真正的门槛不在操作,而在判断——判断边界设得对不对、网格够不够、结果可不可信。这三个判断做扎实了,软件本身反倒是最不用操心的部分。