1、COMSOL只是一款“界面非常友善”
“功能比较完善”的偏微分方程(PDE)求解器!

虽然COMSOL是多物理场耦合计算软件。但它相比其他软件的优点是:有中文版,功能齐全,界面友善。完全适用于习惯了windows操作系统的广大群众。但无论叫它什么,它的本质都是“求解器”而已。进行数值建模或数值仿真,需要考虑三大步骤:前处理,求解,后处理。而COMSOL集成了这三大步骤。所有的设置都可以在同一个操作界面完成,而且采用的是树状分支结构。方便步骤的查找,展开等等。它实际上非常好学(相比那些敲命令行的软件而言…)。

2、新手小白,首先应该明确要仿真的物理模型!

正所谓,工欲善其事必先利其器。如果自己研究的物理模型,控制方程都搞不明白,直接去上软件。那后果只会自己很痛苦(盲人摸象,苦了自己)。

3、了解物理模型之后,搜索相关案例进行学习!

COMSOL官方有非常多的案例,只要它可以做的模型,基本都会相应的案例教学。但是,即便如此,也不会有完全一样的案例等着你去学。所以,不要抱着寻找一模一样的案例的心态学习,那太不现实。

4、如何学习官方案例

学习官方案例要注意:

第一,通过学习案例,学会基本操作。也就是说你要明白怎么使用软件。

第二,通过学习官方案例,学会一些常用的技巧。

第三,触类旁通,举一反三。

通过学习案例,寻找自己解决问题的思路。很多新手,眼高手低。觉得跟自己无关学科模型案例没用。那就是大错特错。模型之间的区别仅在于控制方程不同。也就说,模拟不同的问题,只是数学描述有差别。求解,设置,网格划分都是类似的。很多技巧在这个模型中可以很好用,在另一个问题中也是大有帮助。所有的技巧都潜藏在案例中。但是仅仅几个跟你相关模型的案例,你又能吃透多少呢?

5、除了案例,还有那些资料可寻?

案例库的案例是第一手教程。其次就是帮助文档,操作手册。很不幸,COMSOL暂时没有官方的中文手册可以看。仅仅只有一部分模块简介是中文的。但操作手册永远都是你最先相当的辅助材料。因为,没有谁能比它写的更详细了。还有一些资料,可以在网上搜索到,比如百纳学术论坛。这里有很多经验贴可供参考,多翻翻论坛中过往的问题。

6、如何自我学习COMSOL?

我说的“自我学习”不是指自己学习,而是通过自己摸索,探寻等方式学习COMSOL。既然它是电脑程序,那它必须具有可操作性。这就好比,我们在玩LOL,玩DOTA,打农药的时候是一样的。多数人不需要看教程就会操作了,那是为什么呢?因为很多技能随便按一按就明白咋回事儿了。COMSOL也是一样的。很多功能你在不清楚的时候,自己填几个数字,改几个参数,动手实践一下看看程序的反应,自然就知道对应的功能是做什么的。这就是自我学习的过程。

7、学会提问

很多新手问问题,仅仅截个图就问咋回事儿。这都是让人哭笑不得的。当然,新手这样问无可厚非。所以,要学会自己调错。关于如何调错,可以看我之前的帖子。

建立完模型后,特别是多物理场的模型,很少有可以直接计算并得到结果的情况,即便我们再熟悉怎么建模,也可能会出现错误。那么如果快速高效的调节错误呢?

第一:对于完全不能跑的程序,比如点击计算后还没有出现收敛图就报错了。这样情况的错误一般可能会有未定义变量,协调初值失败,网格报错等等。这类错误往往给出了明确的出错地点,比如某个域中出现未定义值。或者协调初始值失败。根据错误提示,快速定位出错的环节。特别是对于新手,不要一出现错误就沮丧、慌张,乱调一气。

举例说明,对于未定义值,这个所谓的未定义值是模块中没有定义的变量,就比如用C编程时,调用了一个没有定义的变量,程序不知道它在哪里,一般这种问题可能出现在变量定义的环节,这里注意两点,一是全局定义和组件定义的变量范围是不同的,二是定义变量要用到基本变量和模块中的变量,要使用最基本的变量来定义新的变量。出现这种错误还有可能是自己疏忽造成的,比如选择两个模块,而定义的变量用到两个模块的变量,但是计算只计算了一个模块,显然是不对的。再说初始值问题,如果是协调初值失败,可以修改初始值,修改边界条件,最后修改求解器。

初始值的估计对于程序收敛速度和能够收敛有很大的关系,而模型的非线性程度也会造成无法协调初始值,这时候如果肯定初始值没有什么大问题,就更换求解器,比如原本的定常牛顿,换成自动牛顿。再比如说,出现除零错的情况,那就要仔细定位出现除零错的变量位置,这种情况很有可能是你定义的参数和变量或函数有问题,比如出现在分母上的变量在计算中等0了。还有可能是初始值造成的,比如模块的基本变量在模型中是分母位置,而你把它的初始值都等于0了,肯定会报错。

对于出现诸如,试图计算负数的开方等错误,都是同样类型的错误。如果调了很久也没发现错误所在位置,一个看似很笨的办法却能让你快速定位错误的位置。那就是把模型最简单化,比如一个模块你设定了一堆边界条件,那么就禁用所有“多余”的设置节点,只保留方程可以计算的节点即可,然后再计算,如果继续报同样的错误,说明错误不在这些子节点中。如果不报错了,那么依次开启每个子节点,重复此过程,最终定位错误所在节点。如果是变量的错误,同样把所有的变量都用常数代替计算,然后依次换成对应变量。同样,对于多物理场耦合出现的错误,也可以先关闭其他场只保留一个,然后耦合变量用常数代替,一个模块一个模块尝试,最终定位错误位置。

第二:对于程序开始运行,最后不收敛的情况,或收敛曲线无限震荡。这种情况要么等待报错,要么直接暂停求解器,关于暂停方法请在论坛中搜索“暂停求解器”。然后再后处理中画出所有主要变量的图像,分析哪些变量哪些位置出现了数值错误,即数值“噪声”。比如某个点突然很大的值。这种情况多半是边界条件(载荷)不适当造成的。调节这类错误先排除网格的问题,然后依次调节每个参数或边界条件。用笔记下每个不同的条件下,程序出现的结果的变化,这样就知道某个变量或条件对程序计算的影响趋势。这个过程就是累积经验的过程。切记,

一,不要直接关掉程序,这样没有结果可能看不出什么问题,调错就没有针对性;还有就是如果时间步长很短,那么尽量让程序存储数据的时间间隔也较短,比如时间步长是1e-5s,而存储数据是range(0,0.1,1),如果程序在计算时间不到0.1s的时候停了,那什么结果都看不到了,所以间隔至少是1e-5,推荐使用指数形式的时间间隔。

二是调节参数和边界条件,每次的(调节-计算)过程只改变一个参数,这样你才能知道到底是哪个出错了,不要一次调很多参数,这样你即便计算成功了,但最终还是不知道到底是哪个参数的影响,这样以后遇到同样的错误,仍然会无头绪。

很多程序出现的问题,只有在自己反复摸索的过程中,才能逐渐明白是怎么一回事儿。程序错误在报错的提示当中就那么几个,什么未定义值,什么协调初值失败,什么最后一个步长不收敛,达到最大迭代次数等等。但这些问题,不同的模型,不同的问题导致的原因是各种各样的。你不自己动手改,光靠别人的经验基本上无济于事。任何人调错必须亲自查看程序才行。所以调错提问最好的方式是提供物理模型描述和模型文件。否则白搭。

8、要学会学习

使用COMSOL的用户绝大多数是研究生以上,少数本科生人群。在研究生这个阶段,最应该学会的就是“自己学习”。多总结,多动手,多摸索,多尝试。自己没有亲自验证不对或对的事情,一定不要先去问别人。如果有学长学姐帮忙自然很好,但如果你周围只有自己使用,难道不毕业了吗?