爱德华 . 蒙克 桥上的少女(2)
调试算例 — 从理想跌落到现实
表面上,我们天天在研究,如何用高端的模型、高精度的算法、浓密的网格,获得最准确的结果。
实际上,从你打开一个新算例开始,无数的不收敛、无数的数据跑偏,从各个角落冒出来。每次领导问起你的进度,你只能告诉他,你是多么地倒霉,又要延期。直到最后,领导也不得不同意,放弃一切要求,快点结束。获得一个勉强收敛、凑合能看的结果和一颗受伤的心,结束这个伟大的算例。
为什么总是命不好?
同样的边界条件,别人用得很好,在你这里,边界条件几步把计算掐死,或者拉着整个流场跑偏,或者与内部流动共振永远不收敛。
高端模型,别人发表的文章,获得了很漂亮的结果。为什么你先是不会用、然后不收敛、最后不准确。
命不好,只是不熟悉这些方法,只会打开、运行。不知道每个设置,对后面一步步迭代有什么影响,交叉使用又会发生什么效果?
任何一点不了解,就是一个被掩盖的坑。坑多了,运气就不会好,迟早会掉进去。
所有的意外都不是意外,只是最初盲目乐观的坑。
要命好,主动去失败
有一个迷信的说法,做好一个仿真算例,总共要犯多少次错误有个定数。犯过了这么多的错误,才能够获得够用的经验,到达真正的成功。
只有趟遍了路上所有的坑,才能够顺利抵达目标。
为了改变我们的坏运气,可以主动去失败,用更少的时间,趟完更多的坑,用最小的代价积累经验。
先去趟哪种坑?
算例中的坑可以分为两类:
1、可以耗时间很少的:边界条件、模型、格式…
2、必须耗时间很多的:网格、时间步长、迭代步数…
不知道为什么,绝大多数人,只要算例出了一点点问题,首选加密网格、减小时间步长、增加迭代步数。全然不顾,会把运行时间成倍增加。
也许,大家认为这么做绝对正确,至于运行时间成倍增加,只代表工作量大,没什么丢人的。
这么做没错,只不过把趟坑的成本抬得太高。一个算例运行要一天,一个月你可以趟过30个坑;一个算例运行要一周,一个月你只能趟过4个坑。
如果你在调试初期,上手就把网格搞得很浓密,以后你试任何一个小小的改动,都要付出惨重的时间代价。
合理的办法:在建立算例的时候,先用很少的网格、较大的时间步、较少的迭代步数。去主动试错,变换各种边界条件、模型、算法格式……,用最少的时间,试遍所有你能够想到的选项,获得最全面的经验。
有人会说,陆姐骗人,明明这些选项和网格多少相关,网格少的时候,验证结果不全面。
你这么说也对,但是你让我挑选:一千万网格,一个月时间获得一个正确的验证;十万网格,半天获得一个有点缺陷的验证。我愿意要那个有点缺陷的验证,因为性价比高。
不要忘了,一个月时间,领导已经向你要结果,你才刚刚获得一点经验,无论如何都是失败。
除非你有时间宝盒,可以随便使用时间。否则,调试算例,还是先用最短的时间,获得大量有点不全面的经验。
举个例子
在你开始算例前,请你回想过去运气不好的故事,相信这次运气会更不好。只要有一个选项你没有试过,就会在最要命的时候出错。
第一步:用一万个网格画一个平板、管子、方块、斜坡,与你最后要做的产品有那么一点点类似。用一两天的时间,把所有你能够想到的边界条件、模型、格式的各种选项都尝试完。运行一次也就一分钟左右,你用一天时间,可以运行成千次,足够把这几十个选项点得熟透,避免以后犯下简单错误。
第二步:用较为稀疏的网格画出算例的真实状态,还是调试边界条件、模型、格式。这个阶段,运行一次的时间也许会增加到一个小时甚至一天。主要观察计算结果是否合乎常理,然后再做些小调整。这个阶段有可能要耗费一周以上。
如果运行顺利,进入下一步。如果失败,回到第一步。
第三步:用较为浓密的网格、较小的时间步、较多的迭代步数,运行一周甚至一个月的时间,获得一个计算结果。主要观察局部流动结构和重要性能是否合理,仿真结果与实验数据有什么不同,并且回答为什么。
如果运行顺利,结束。如果失败,回到上一步。
总 结
1、永远相信自己运气不好,开始不要把算例搞得太复杂。
2、初期主动去趟坑,趟过越多的坑,越容易成功。
3、先去趟那些可以耗时间很少的坑(边界条件、模型、格式),最后去趟那些必须耗时间很多的坑(加密网格、减小时间步、增加迭代步数),用最低的成本购买教训。
4、要舍得下功夫苦干,但是,那些耗时间很多的表面正确的事情,少做。