dlztcsy的个人博客分享 http://blog.sciencenet.cn/u/dlztcsy

博文

COMSOL的报错要点分析

已有 4593 次阅读 2018-6-11 15:46 |个人分类:有趣的|系统分类:科研笔记

      COMSOL是一款非常好的有限元分析软件包,特别是可以很方便地实现多物理场的耦合计算。人性化的中文界面,让用户可以快速入门。但是,很多用户最头疼的莫过于在自己的建模过程中遇到各种各样的,“莫名其妙”的错误。如何快速找出并分析排除模型中的错误,以及如何快速实现收敛就成了会用软件与“会”用软件之间的分水岭。

      常见的错误,我们可以把报错信息分成可定位错误无法定位错误

      计算未开始直接给出具体的某变量未定义,某变量在计算中出现除零错/试图计算负数开方,协调初始值失败,使用分离求解器中出现某分离步中变量缺失,还有一些网格报错,材料报错。这些错误因为有明显的错误信息,可以归类为可定位错误;

       在计算一段时间后,达到最大迭代次数未收敛,最后一个步长未收敛,精确计算边界通量失败等,计算一段时间后出现的未定义值,无法给出准确错误新的提示,归类为无法定位错误。

       学习软件的过程就是不断地出错,不断地纠正错误,再继续出错,再继续修正错误,逐步累积经验,最终学会使用软件的过程。虽然这个过程漫长而枯燥,更是消耗精力。本文结合本人实践经验,指出几点分析报错的要点共同行参考。

分析要点1:学会准确定位出错位置

     对于可定位错误,报错信息中会给出具体的出错信息。比如材料有问题,那就查看材料设置,网格有错误,那就查看网格。常见问题有,比如在模块中对应的材料位置,选择了“来自材料”选项,而没有给相应的域或边界设定材料。对于网格,比如提示用户某网格没有划分,或网格划分重复,或边界层网格没有组后划分等等。这样的错误比较明显,只需要修改相应的位置即可。

      如果是变量未定义,可能来自于自己需要定义的变量,比如变量的作用域有错误,在组件中定义的变量只能此组件中使用,如同在函数中定义的变量只能在函数中使用是一样的。而使用组件中的原始变量去定义新的变量要注意作用域问题,比如在全局中定义一个变量,而需要使用组件下面某个模块中的变量,那必须给出这个变量所在的组件名称,比如comp1.T。这说明,在全局中定义的变量使用的是组件1中的温度T变量,而不是组件2或组件3的,因为如果不使用变量的全部限定名,将会出现二义性,自然程序会报错。

      还有一些莫名的未定义,这些错误会让很多新手用户崩溃,所以要仔细检查。这可能是模块中的变量,那为什么会出现未定义呢?之前讲过,每个变量都有全部的限定名,这个全部的限定名是”组件名.模块名.变量名“这样的格式。但用户往往在修改错误的过程中会有某种不当操作,使得求解器在编译方程的过程中所使用的变量名和模块中定义的变量名不同就会造成这样的错误。修改方法是,使用查找(ctrl+F)功能,搜索这个变量,或者在模块的方程视图中查找并修改。还有一种情况是,在计算一段时间后,出现某变量未定义,这在很大程度上是因为初始条件不适当造成的,这就要修改初值。

      对于除零错和试图计算负数的开方等问题,也会让很多新用户崩溃,特别是对于模块非常不熟悉的用户。同理,这种问题必须要找到对应的变量,将对应的变量调出在结果中画出图像,查看是否有值。而且需要找到计算这个变量的所有值,特别是分母,开方内等位置的变量,看看它们是否等于0以及是否小于0。造成这样错误的原因有很多种,比如它们是在计算了几个时间步之后出现0的,这往往是初始值或边界条件不适当造成的。而如果它们是在刚计算还没有出现收敛图时就报错了,多半是因为它们的初始值就是0,这样的错误往往是用户自己不认真导致的,比如出现了绝对压强等于0。 

      最后还有一个终极的办法,如果你的模型本来是可以计算的,而在不断修改的过程中,最后发现怎么修改也不对,回不到原来的正常情况,那么可以直接重新打开这个程序,且选择不保存,即退回到正常状况。或者直接删除求解器,重新设置求解器。             

      技巧1:学会查找方程视图中的变量

      技巧2:注意每个变量在不同作用域中所使用的名称不同

      技巧3:删除求解器,重新设置

分析要点2:多尝试(只能多试,去总结)

      真的很难用语言说明到底该如何分析错误,因为只要模型不同,同样的报错信息可能的原因多种多样,并没有统一的指导方法,特别是对于不收敛的原因分析更是如此。接下来简要讨论一下不收敛的主要原因。

      稳态计算,稳态计算过程中,如果模型非常好(模型好,指初边值条件和网格都非常适当)并不需要特别多的迭代次数即可收敛。如果收敛图上下震荡(可能有用户对于进度条前后快速移动感到恐慌)剧烈,或者增加到上千迭代次数最后收敛曲线也很难下降,这时候就需要好好设置初边值条件了。前者,对于震荡剧烈的模型,多半是初边值条件不适当,比如边界过约束,某位置梯度过大,边界条件与域初始值相差太大,动网格等特殊求解技术的设置中参数设置不当等等。这时候应该修改自己的初边值条件,或修改对应设置。对于后者,基本上很难收敛,偷懒的技巧是,增大一下容差。或在模块中添加收敛项或稳定性条件。

      技巧4:修改容差,或增加稳定性条件(模块设置中有相应的位置),稳态和瞬态问题都适用。

      瞬态计算,对于瞬态计算最头疼的是计算很久之后报错。除修改初边值条件和网格外,可以考虑修改求解器。

      以下均列为技巧。

      使用这些技巧的前提是,用户要百分百确定自己的边界条件没有问题,网格适当,初始值也适当。

      技巧5:将全耦合求解改成分离求解,注意求解变量的顺序,最好先求解单场,比如热流耦合,先计算温度;热电耦合先计算电场。

      技巧6:修改雅可比修正位置,比如将每个时间步一次,改为初次迭代,当然修正次数越多,计算越慢。

      技巧7:增大每个分离步的迭代次数,并降低其阻尼因子

      建模都是从简到繁的过程,不要试图一次建立完整的模型。

      技巧8:建模一句话口诀:先建立最简单的模型,只要能跑就行。然后逐步添加更多的项,耦合更多的模块,添加更复杂的技术,而对于本可以运行的程序,最后怎么修改都无法运行,记住,删掉重做。

 总   结

      很难用几句话就能说明哪些错误该怎么调试,对于新用户来讲,核心手段仍然是要理解模块,知道如何设置初边值,如何加密网格。因为调试技巧终归是在模型设置没有太大问题的时候才可以使用的手段。假如边界条件本就是错误的,初始条件本非常不合适,那所有的技巧都是浮云。

      Best convergence.



http://blog.sciencenet.cn/blog-1467490-1118453.html

上一篇:等离子体鞘的形成
下一篇:辉光放电

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备14006957 )

GMT+8, 2019-11-14 18:52

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部