在“求解多物理场问题”这篇博客中,我们介绍了 COMSOL 中用于求解稳态多物理场问题的全耦合和分离算法。这里,我们再来看一下能够加快这两种方法收敛的一些技巧。
就像我们刚刚了解到的那样,利用全耦合方法求解稳态非线性问题时,所用的正是用于求解非线性单物理场问题的阻尼 Newton-Raphson 算法。虽然这一算法在许多情况下收敛良好,但如果选择的初始条件较差,可能会出现无法收敛或收敛很慢的问题。综合这些方面不难看出,我们之前介绍的一些技巧同样适用于多物理场问题,例如载荷递增和非线性递增。事实上,我们也无需再为这些技巧多做补充,因为它们的使用方法相同。
这是非线性递增技巧的一个新变形,即逐渐增加物理场之间的耦合。从数值角度来看,它其实与之前讨论的非线性递增技巧相同,但从概念角度来看,它是物理场间耦合的递增量级, 而非单一物理场中非线性的量级。唯一的难点在于选择和执行将发生递增的项。幸运的是,绝大多数多物理场问题中物理场间的耦合都相当明显,可以通过以下方式轻松找出:写出控制方程和边界条件,并查看材料属性和载荷如何依赖于求解变量。
这里要记住的重要一点是:求解全耦合多物理场问题的底层算法与求解非线性单物理场问题的算法完全相同。记住这一点之后您就会发现,除了要理解全耦合多物理场问题模型中物理场间的相互作用外,并没有其他概念上的障碍。
另一方面,分离方法则可能带来许多不同的求解策略,它们可以极大地加快解的收敛,并能显著影响求解问题所需的内存量。为了更好地理解这一点,让我们做一个有关不同多物理场求解技巧的流程图。这里还是继续以之前母线板博客中讨论的问题为例进行说明,母线板由于电流的影响被加热,并承受了热应力。
首先,全耦合求解器会从初始猜测开始,然后应用 Newton-Raphson 迭代直到收敛的解:

求解这一问题时,您将得到一个收敛图,其中显示误差估算会随着 Newton-Raphson 迭代逐渐减小。理想情况下,如果确实在收敛的话,误差单调下降,然后开始分析载荷递增、非线性,或多物理场耦合。本方法通常需要使用内存要求较高的直接求解器,用来求解每个 Newton-Raphson 迭代中的线性方程组。

现在,对比全耦合方法与分离法,分离法会按顺序逐个求解每个物理场,直到收敛:

针对这一问题,您将得到一类不同的收敛图,它将显示与您求解的每个物理场相关的误差。每个物理场可以选择直接或内存要求较低的迭代求解器作为最优求解器,用以求解线性方程组。每个分离步骤本身都可以看作一个非线性问题,可以求解至允许的容差,并能根据正在求解的具体物理问题组合定制合适的递增。
使用这一求解方法,您将至少得到两个收敛图,一个针对分离步中可能用到的迭代求解器,第二个则是分离法的总收敛图:

上图显示了每个物理场中误差的下降情况。虽然分离求解法可能需要进行更多次迭代来求解相同问题,但其中的每个环节都要快于全耦合方法中的 Newton-Raphson 步骤。您还可以从中获得其他一些信息,比如,如果只有一个或者两个物理场不收敛,那您可以首先检查它们的一些设定。
有关此问题,您可能还会想到一点,即温度变化是由电流的电阻加热驱动,电流分布依赖于电导率,电导率又依赖于温度。也就是说,电压与温度的解双向耦合。另一方面,虽然热应变和杨氏模量依赖于温度,但电压与温度的解却并不依赖于位移或应力。也就是说,热学问题和结构问题之间存在一个单向耦合。我们可以立即发现一个更有效的方法来求解这一问题。我们可以首先求解电压和温度问题,然后再求解位移:

因此,我们可以看到该问题(至少)有三种不同的求解方法:全耦合、分离并假定所有物理场间的耦合是分离的,或者利用温度和位移之间的单向耦合进行顺序求解。当求解一个多物理场问题时,COMSOL 会假定所有物理场之间的耦合,并根据物理场和问题大小尝试选择最优的全耦合或分离法。当然,打开求解器设定部分查看软件选择了哪种设定,也通常会对您有较大帮助。
我们设计本系列博客的初衷,是希望帮助您理解 COMSOL 用于求解单物理场和多物理场线性及非线性稳态问题的算法,同时还讲到了诸如网格剖分、精度和收敛等问题。掌握这些信息之后,您会更有信心地进行此类模型的求解。
这篇博客,我们将介绍 COMSOL Multiphysics 中求解多物理场有限元问题的两类算法。到目前为止,我们已经学习了如何进行网格划分,以及求解线性和非线性单物理场有限元问题,但是还没有考虑过同一个域内存在多个相互影响的不同物理场的问题。
我们先来看一个非常简单的稳态多物理场问题:穿过金属母线板的稳态电流场,母线板内的热量传递和结构变形的相互作用。电流引起电阻加热,从而导致母线板受热并开始膨胀。因为升温较为显著,所以母线板的电、热以及结构材料的性能变化不能忽略。我们希望求出稳态条件下的电流、温度场、变形以及应力。下图为待求解问题的示意图:

待求解的多物理场问题。
这里我们需求解三个本构偏微分方程。首先,描述域内电压分布的方程为:
通过有限元法离散后,可以得到一组等式:
其中,下标 表示未知电压,系数矩阵
与未知温度
相关。假设电压分布已知,体电阻热可由下式推导:
其中,电场 为
。这个热源出现在温度的本构方程中:
并给出了方程组:
当求出域中的温度分布后,就能求解结构位移:
其中,弹性矩阵 由与温度度有关的杨氏模量
推导。产生的热应变为
,应变为
。求解结构位移的方程组可以写成:
其中,下标 表示未知位移。
合并以上方程组可得:
为了简化方程,我们可以省略参数中的下标:
这就是求解多物理场耦合问题的所有模式!求解单物理场非线性问题和求解多物理场问题并没有概念上的区别。我们已经学习了关于求解非线性单物理场问题的所有知识,包括所有关于阻尼、负载和非线性加速以及网格划分的讨论,这对于求解多物理场问题同样有效。
但是,理解上述方法有一个缺点(在某些情况下是非常致命的)。通过代入 Newton-Raphson 迭代法,我们要求解导数 ,即:
这里,我们使用了一个简化符号来简化和缩短表达式,例如:
很明显,以上矩阵为非对称矩阵,这将导致一个问题:如果系统矩阵不能确定,我们可能需要使用更加消耗内存的直接求解器求解。(尽管迭代求解器在预条件选择正确的情况下能处理范畴更为宽广的问题,但并不能保证足以应对所有特例。)使用直接求解器求解此类多物理场问题将会耗费更多的内存和时间。
不过,还有一种替代方法。上述求解方式被称为全耦合法,假设需要同时考虑物理场之间的所有耦合。实际上,在求解很多类型的多物理场问题时,我们可以忽略这些非对角线的项,采取更节约内存、更具时效性的分离 求解法。
分离法按顺序分析每一个物理场,使用之前求解物理场得到的结果来得到一个待求物理场的载荷和材料属性。因此,对于上面这个例子,我们先通过 Newton-Raphson 迭代求解电压:
其中对于第一次迭代,我们必须对电压和温度各做出一个初始估计值 。使用温度场的初始条件来求解得到初始的材料性能。接下来求解温度:
其中,在第一次迭代 中 ,使用温度场的初始条件对材料性能
求解,但是荷载是通过之前计算的电压
计算得到。按照类似的方法,可以求解位移场:
其中,结构载荷以及材料性能是由之前计算的温度场推导而来。
继续使用迭代:有序地重复计算电压、温度和位移。 像这篇博客中定义的一样,此算法将持续进行直到达到收敛为止。
这个方法最大的优势是可以在每一个子步骤中使用最优求解器。这不仅意味着将在每一个子步求解更小的问题,还可相应的选择更节约内存的快速求解器。虽然分离法一般需要更多的迭代步骤才可收敛,但是与全耦合法中的迭代相比,分离法的每一次迭代在计算时间上都会显著减少。
如下为使用分离式求解器处理一个具有 n 个多物理场模型的算法:
对于一般物理场问题,用户仍然需要确定物理场的求解顺序,但是软件会默认建议内置的多物理场接口使用合适的求解顺序。 COMSOL Multiphysics 会按照分离法的求解顺序为每一个物理场提供默认的线性求解器设定。
使用分离法得到的收敛解与使用全耦合法得到的解完全一致。通常分离法会经过更多次的迭代以达到收敛,但是每个子步骤的所消耗的内存和时间会降低,从而进一步降低整体的求解时间和内存使用率。
在这篇博客中,我们介绍了处理多物理场问题的两类算法:全耦合法 和分离法 。全耦合法与求解单物理场非线性问题的 Newton-Raphson 迭代法一样,非常占用内存,但是十分实用,广泛适用于存在强相互作用的多物理场问题。另一方面,分离法假设能对每一个物理场单独求解,并且能在多种物理场之间完成迭代直至模型收敛。
我们已在求解器系列的部分博客中讨论了求解非线性静态有限元问题、用于改善非线性问题收敛的载荷递增,以及用于改善非线性问题收敛的非线性递增。我们还介绍了线性静态问题网格剖分的注意事项,以及在网格剖分过程中如何找到奇异性并对此进行处理。在本篇博客中,我们将基于上述内容解释如何准备网格,以便能高效地求解非线性稳静态有限元问题。
您是否还记得“线性 静态问题的网格剖分注意事项 ”博客中提到的三个关键点:
我们还了解到,当求解非线性问题时,即使包含单一自由度且有解的有限元问题也可能不收敛。我们已经学习过处理这种问题的几种方法,但尚未介绍网格和非线性求解器之间的相互作用。
对非线性问题进行网格剖分时应熟记以下内容:
就算问题本身很完善、我们也选择了一个好的求解方法,但如果没有在强非线性区域内进行足够的网格剖分,问题也可能不收敛。
为了更好地理解上述内容,我们将研究一个一维传热有限元问题。考虑 1 m 厚的墙,一端温度恒定为 ,另一端温度恒定为
,如下图所示:

我们将检验不同热传导率下问题的解,如下图所示:

如果绘制线性情形 的解,将得到:

经检验后,我们发现解是一条直线。对于这种情况,整个域内使用单一线性单元即可求解。
现在,如果我们要绘制 时的解,并用虚线表示各个单元,将得到:

我们发现这种非线性问题的解要求域内要有多个单元。实际上不管我们使用多少单元,多项式基函数都不会完美匹配真实解。我们可以在域内任何一处成功细化网格并无限接近真实解,就如同处理线性问题一样。
最后,如果我们绘制 时的解,将得到:

这个解更为复杂。很明显解内存在单靠一个单元无法充分描述的区域。当然也存在解会随位置的函数迅速变化的区域。这些区域都在 附近,周围的材料属性函数中存在强非线性。尽管材料属性函数的温度部分只存在一个强非线性区域,但解会在域内的两处区域变化迅速。只有这些区域需要更细化的网格。实际上,当这些区域中的网格太过粗化时,求解器可能完全不收敛。
此类问题就可以使用自适应网格细化求解,因为建模域内的梯度位置总体上是未知的。非线性递增同样十分有用,因为不论网格尺寸,从一个线性问题出发总能得到一个可以求解的问题。通过逐渐递增非线性以及循环使用自适应网格细化,将能够改善非线性问题的模型收敛。
历来,非线性静态有限元问题的网格剖分都和非线性模型的收敛相关。除了收敛速度,收敛概率也都依赖于求解器算法和所使用的网格。到目前为止我们已经介绍了许多求解技巧,包括手动及自适应网格细化、对初始条件的选择、载荷递增、非线性递增,以及上述方法之间的任意组合,您将会在进行更为复杂的建模时用到这些技巧。最后,还请记住我们需要网格细化研究来评估解的精确度。
如果希望获取一个综合了上述所有求解方法的模型示例,请点击访问金属的冷却和凝固模型。熟练掌握以上方法后,您将能更高效、快速地进行非线性问题的建模。
正如之前在 “非线性问题的载荷递增“博客中所讨论的,当求解一个问题时,我们可以从一个已知解的无载荷问题开始,然后使用延拓法逐渐递增载荷来进行求解。这个算法同样适用于理解接近失效的载荷时的情况。然而载荷递增并非适用于所有情况,在某些情况下可能无法发挥效用。本篇博客中,我们将介绍如何通过非线性递增改进问题的收敛。
再次考虑下图中含非线性刚度的弹簧系统,对其施加应力。

我们发现可以使用阻尼 Newton 法求解该问题,或是使用延拓法并递增载荷,从而为 Newton 法提供一个好的初始条件。现在我们来检验如何递增非线性。首先,让我们再来看一看描述单一节点上受力平衡的方程:
可将以上等式写成通式: ,其中
是非线性弹簧刚度。现在我们可以使用以下刚度来求解不同的问题:
也就是说,我们将弹簧的刚度方程分为两部分:一个线性项 ,以及一个非线性项
,接着引入一个附加参数
,插入在线性项和非线性项之间。然后对一系列带有参数
的问题使用与之前相同的 Newton 法,并使参数
从 0 递增到 1 。也就是说,使用延拓法从一个(容易求解的)线性问题递增到一个(更难的)非线性问题。
接下来使用这种该法求解上述例题。初始弹簧刚度 被改写成:
我们从求解 的情况开始,得到一个线性弹簧刚度
,所以现在需要做的就是找到一个线性化起点
。在这个案例中,如果选择
,那么
。回想之前关于求解线性稳态有限元模型的讨论,我们学到总能使用一次 Newton 迭代来求解线性问题。现在递增参数
,结果如下:

可以明显看到,只有一小部分从 开始的解需要对
求解。所以我们可以重复
的步骤并从完全线性情形递增到完全非线性情形。
这一方法很有吸引力,因为我们总能找出线性问题的解,所以总能求解 。您只需考虑该对哪些点
进行初始线性化以及应该使用哪种非线性递增。
我们也可使用非线性递增的概念来解决非线性项不连续可导的情形。让我们回忆一下求解非线性稳态有限元问题 博客中的案例:具有分段常数弹簧刚度的系统, 时
,
时
,以及
时
,将构成受力平衡方程:

正如之前看到的,这个问题无法用 Newton 法求解,除非您碰巧在解的(非常小)收敛半径内开始求解。但现在考虑将原始的弹簧刚度替换为可以递增的平滑刚度:

显然该问题可以求解,而且我们可以使用这个方法得到原始问题的大致解,它仅要求我们得出一个大致的平滑方程和非线性递增路径。
当您遇到具有上述阶梯行为的问题时,就可以尝试使用双折线非线性求解器代替 Newton 法。双折线求解器是一个置信域求解器,适用于求解 Newton 法可能会在不同区域内震荡的问题。结构接触问题就是这类问题的良好物理示例,即当两个物理进行物理接触时,会产生载荷的突然转移。
我们已经介绍了两种改善非线性问题收敛性的方法:载荷递增和非线性递增。在实际操作中,您可以选择其中的一种做法,以及对材料属性及载荷进行恰当设置,从而能够结合这两种做法。很难说哪种方法的表现更优异,对于每个模型,您可能需要进行一些不同的尝试,包括载荷递增路线、非线性递增以及线性化初始条件的选择等。同样,当您预期解可能会在不同情形下产生震荡时,双折线求解器会比 Newton 法更有效。随着经验的增加,您将能形成一种工程直觉,从而能够找出所求解问题的最佳求解方式。
博客中介绍的方法,主要适用于求解难以找到良好初始条件的非线性稳态有限元问题,或者包含强非线性以及不连续性材料属性的问题。实际操作中,您将能通过这些方法解决很多问题。此外,您还应注意到,求解非线性问题时需要不同的网格剖分方法。这将是我们接下来会阐述的主题,请继续关注。
正如我们之前在“求解非线性稳态有限元问题”博客中所看到的,并不是所有的非线性问题都可通过阻尼 Newton-Raphson 法求解。尤其是当选择了一个不合适的初始条件或者设定一个无解的问题时,只会造成非线性求解器持续执行迭代而无法收敛。在此我们介绍一种更为可靠的非线性问题解决方案。
让我们再次考虑对弹簧施加应力的系统,弹簧具有非线性刚度:

只要我们选择合适的初始条件(之前我们令 ),便可求解该问题。在“求解非线性稳态有限元问题”博客中,我们注意到在收敛半径外选择初始条件,譬如任
,都会导致求解器失效。现在对于这个单一自由度的问题可以轻松地判断出它的收敛半径,但若是处理普遍的有限元问题时将会困难许多。所以不应试着求出收敛半径,而应首先对此类问题进行一些物理判断。
在此我们会向一个系统施加载荷, ,设定初始条件
,并尝试进行求解。如果我们施加载荷
会发生什么?牛顿第一定律表明,一个无载荷的系统将不会产生形变。所以若是施加一个无限小但是大于 0 的载荷
又会怎样?可以合理地假设, Newton-Raphson 法会从初始条件
开始求解,最终将找到一个解
。 同样也可以较为合理地认为,我们可以将载荷增加到
使得
,并再次得到一个解
,只要载荷增量足够小即可。重复该算法,最后将达到最终载荷
,以及期望的解。即从 0 载荷和 0 解开始,逐渐增大载荷直至达到期望的总载荷。下图展示了这个过程。粗箭头表示其中从特定的载荷值开始进行 Newton-Raphson 迭代。

这个算法也被称作载荷的 延拓法。这种从接近 0 开始逐渐增加载荷的方法,提供了一种更为可靠的使用阻尼 Newton 法求解非线性问题的途径,因为之前一步的解对下一步而言是很好的初始猜测。
使用这个算法,我们不仅能更好地解决如何为 Newton-Raphson 迭代找到好的起始点的问题,还拥有了一种应对无解问题的算法。再次考虑弹簧拉伸后刚度减小的问题,即之前讨论过的 ,该问题无解。在本案例中,我们可以解析判定出,对于任意载荷
时都无解。但如果使用更小的载荷,那么系统会是稳定的。实际上在我们假设的场景中,系统处于双稳态;对于每一个载荷
都存在双解,尽管我们只对从
和
开始产生的分支感兴趣。下面绘制出
的图像:

现在假设我们不知道载荷峰值在 处,并检验 COMSOL 求解
时会发生什么。如果我们绘制出
时
的图像,观察后发现
时无解。 COMSOL 中的延拓求解器会自动在上一次成功的载荷值和下一次的期望载荷之间的区间执行一次搜索。即求解器会尝试进行回溯并找到一个可作为下一步起始值的中间解。当将 延拓法(或参数扫掠)用于在单一参数上求解稳态问题时,都会使用这个算法。那样的话,求解器将能够找到系统的最接近失效的载荷,这会是一项非常有价值的信息。
我们已经介绍了载荷递增以及使用延拓法改善 Newton 法鲁棒性的概念。由于一个无载荷的系统存在已知解,而且我们已经看到该技术可以解决初始条件选值问题。此外,我们还了解到可以近似的求出破坏载荷。也因此,载荷递增是您在设定和求解非线性稳态有限元问题时应该理解的重要技术。
让我们来看一下非线性有限元问题的日志文件。我们将设定并求解上文中描述的关于非线性弹簧在拉伸过程中刚度减小的问题。已知该问题无解,让我们来观察将发生什么:
求解器 1 中的稳态求解器 1 开始于 2013.07.15 11:26:46 参数化求解器 非线性求解器 求解的自由度数量:1 参数 P = 0.2 找到对称矩阵 相关变量的缩放: 稳态变量 u (mod1.ODE1): 1 迭代数 ErrEst 阻尼 步长 #Res #Jac #Sol 1 0.18 1.0000000 1 2 1 2 2 0.013 1.0000000 0.22 3 2 4 3 6.5e-005 1.0000000 0.015 4 3 6 参数 P = 0.3 迭代数 ErrEst 阻尼 步长 #Res #Jac #Sol 1 0.025 1.0000000 0.21 7 4 9 2 0.00069 1.0000000 0.031 8 5 11 参数 P = 0.4 迭代数 ErrEst 阻尼 步长 #Res #Jac #Sol 1 0.89 1.0000000 2.7 11 6 14 2 0.3 0.8614583 0.76 12 7 16 3 0.2 0.8154018 0.43 13 8 18 4 0.31 0.4194888 0.42 14 9 20 5 0.86 0.0836516 0.9 15 10 22 参数 P = 0.325 迭代数 ErrEst 阻尼 步长 #Res #Jac #Sol 1 0.089 1.0000000 0.4 18 12 26 2 0.014 1.0000000 0.13 19 13 28 3 0.0003 1.0000000 0.018 20 14 30 参数 P = 0.375 迭代数 ErrEst 阻尼 步长 #Res #Jac #Sol 1 0.099 1.0000000 0.32 23 15 33 2 0.079 0.9390806 0.19 24 16 35 3 0.2 0.3028345 0.24 25 17 37 4 0.94 0.0302834 0.95 26 18 39 ... 部分日志文件省略 ... 参数 P = 0.368359 迭代数 ErrEst 阻尼 步长 #Res #Jac #Sol 1 0.046 1.0000000 0.057 80 49 112 2 0.061 0.3013806 0.072 81 50 114 求解器 1 中的稳态求解器 1 :求解时间: 0 s 物理内存:471 MB 虚拟内存: 569 MB
求解器同时报告了一项错误: 未能为所有函数找到一个解, 即使使用最大参数步长。 即使使用最小阻尼因子也不收敛, 返回解未收敛。
除了求解器报告现在调用了参数化求解器,日志文件的开头部分和以前一致。我们看到当 和
时,求解器完成求解。当
时,求解器失效并自动追踪求出中间解。出于简洁的目的省略了一些中间步骤,但我们仍可以看到参数化求解器已十分接近峰值载荷的解析解。从该信息来看,我们可以使用一组新的参数重新求解并e更好地理解系统在接近破坏载荷时的行为表现,这些信息会非常有价值。
本篇博客中,我们将简要介绍求解非线性稳态有限元问题的算法,并通过一个非常简单的一维有限元问题来演示这些内容,即我们在“求解线性稳态有限元模型”博客中所讨论的那个问题。
考虑下图所示的系统:弹簧的一端与刚性壁相连,对另一端施加应力。弹簧的刚度可表示为关于其拉伸距离的方程: ,即弹簧的刚度随弹簧拉伸呈指数增长。

现需求出弹簧受力端的位移。与之前在线性 问题中的处理类似,我们可将描述非线性 有限元问题中某一节点受力平衡的方程写成如下形式:
在本案例中,只有弹簧的刚度和解有关;但在更多情况下,非线性问题中的载荷和单元的属性都可以任意依赖于解。
绘制上述方程,并请记住我们希望求出 使得 的
。

实际上,对这个问题的求解与线性问题只存在细微的差别。回想一下,在求解线性问题时我们使用了一次 Newton-Raphson 迭代——这里我们同样使用这种迭代方法:

不难发现,我们又一次采取初始猜测: ,并计算方程
,以及它的导数
。 从而得到
。通过检验发现这不是解,因为
。 但是如果继续使用 Newton-Raphson 迭代,很明显我们将会逐渐接近问题的解,如下图所示。(您可以点击 Newton-Raphson 迭代法来获取关于该算法的更多信息。)

所以除了需要使用多次 Newton-Raphson 迭代求解,求解非线性问题和求解线性问题的本质相同,除了要使用多次 Newton-Raphson 迭代求解。实际上,我们可以继续使用迭代以任意接近真实解,但并没有必要这么做。之前也有讨论过,我们总是会碰到电脑数值精度的问题,所以只能达到一个接近真实解的实际极限。观察几次迭代后的结果:
| 0 | 0.000 | 2.000 | ||
| 1 | 2.000 | 12.77 | 2.000 | 10.77 |
| 2 | 1.424 | 3.915 | 0.576 | 8.855 |
| 3 | 1.035 | 0.914 | 0.389 | 3.001 |
| 4 | 0.876 | 0.104 | 0.159 | 0.810 |
| 5 | 0.853 | 0.002 | 0.023 | 0.102 |
| 6 | 0.852 | 0.001 | 0.001 | 0.001 |
经过六次迭代后我们发现 和
的每两次之间的差值以
的绝对值都减少到 0.001 甚至更小。经过从
开始的六次 Newton-Raphson 迭代后,解的误差收敛到 0.001 以内。当求解非线性问题时,我们都将使用这个算法直到解收敛至期望容差内。第二种终止准则:求解器不可以执行超过规定次数的迭代。无论哪种准则、容差还是迭代次数,只要满足一项后,求解器就将停止工作。同时应熟记“求解线性稳态有限元问题”博客中关于数值缩放问题的讨论。容差准则适用于缩放后的解矢量一而不是解的绝对值。
尽管对于求解当 为矢量时的情况进行绘制的难度更高,但使用的是相同的算法,即适用于典型非线性有限元问题。然而当求解涉及几百、几千甚至几百万自由度的问题时,执行 Newton-Raphson 迭代的次数越少越好。上文中提到需求解的等式:
,且计算导函数的倒数是计算强度最高的步骤。 COMSOL 采用阻尼因子来避免运算至无解区域的情况,以及最小化 Newton-Raphson 迭代的次数。再考虑之前绘制的第一次 Newton-Raphson 迭代,并观察该步骤
。 所以对于该迭代取值过大。出现这类情况时, COMSOL 将会在
区间上执行一个简单的搜索,并找到一点
使得
。然后在该点重新执行 Newton-Raphson 迭代。

其中 表示阻尼因子,且
。 当
即为阻尼 增加;当
时问题无阻尼。我们较喜欢采用这一方法,因为搜索过程仅需要 COMSOL 来计算
,而且与计算导数
和其倒数
相比,计算成本要低。
需要着重强调的是该阻尼项没有直接的物理解释。尽管这种算法能有效改善收敛,但是通过检验阻尼因子只能收集到极少量的物理信息。此外,尽管 COMSOL 允许您手动修改阻尼因子,但很难借助模型中的物理知识或信息来操作。我们通过人为干预计算得到的结果很难超过缺省的阻尼算法。不过,当缺省的阻尼 Newton-Raphson 方法收敛缓慢或完全不收敛时,还可以根据问题的物理场选择其他一些表现更为优异的技巧。
求解非线性问题向来较为困难,因为上述求解过程可能在许多情况下并不收敛。尽管 Newton-Raphson 方法失效的情况很多,但在实际操作中可以将不收敛归纳为以下几种情况:
首先考虑之前的非线性问题,但选择不同的起始点,例如 。 如下图所示,如果我们选择任意初始条件
,那么使用 Newton-Raphson 法将无法求解,因为
的导数不指向解。
的左侧区域无解,所以这些起始点在 Newton-Raphson 方法的收敛半径以外。即使存在解,对起始点的选择也可能造成 Newton-Raphson 方法无法收敛。所以与线性问题中一个被设定好的问题永远有解不同,非线性模型的收敛很大程度上依赖于初始条件的选择。我们会在后续博客中阐述如何选择合适的初始条件。

当问题本身无解时,非线性求解器也会失效。再次考虑上述问题,但是弹簧刚度为 。 即弹簧被拉伸时刚度减小。绘制出
时的
,可以看出问题无解。但 Newton-Raphson 法无法判断出该情况;算法将直接失效,并且在达到用户给出的迭代数后结束运算。

最后考虑材料属性中存在不连续性的情况。譬如,仍然考虑上述问题,但是弹簧刚度在不同区间内有不同的值: 时
,
时
,
时
。 如果绘制出相应的
图像,可以发现是不可微且不连续,这就与 Newton-Raphson 方法需满足的条件相悖。通过检验可以很清楚地看出,除非选择
区间内的起始点,否则 Newton-Raphson 迭代会在区间外的迭代之间震荡。

总结一下,截至目前我们已经介绍了使用阻尼 Newton-Raphson 法求解非线性有限元问题,并讨论了所使用的收敛准则。同时还介绍了几种算法失效的情况,包括:
我们即将讨论阐述以上问题的几种方式,但是在此之前先来看一个代表性的非线性有限元问题的日志文件。以下是一个几何非线性结构力学问题的日志文件(已添加行号):
1) 求解器 1 稳态求解器 1开始于:10-Jul-2013 15:23:07. 2) 非线性求解器 3) 求解自由度数: 2002 。 4) 发现对称矩阵。 5) 因变量的缩放: 6) 位移场(材料) (mod1.u):1 7) 迭代数 ErrEst 阻尼 步长 #Res #Jac #Sol 8) 1 6.1 0.1112155 7 3 1 3 9) 2 0.12 0.6051934 1.2 4 2 5 10) 3 0.045 1.0000000 0.18 5 3 7 11) 4 0.012 1.0000000 0.075 6 4 9 12) 5 0.0012 1.0000000 0.018 7 5 11 13) 6 1.6e-005 1.0000000 0.0015 8 6 13 14) 求解器 1 稳态求解器 1 :求解时间: 1 s 15) 物理内存: 849 MB 16) 虚拟内存: 946 MB
现在您应该已经了解 COMSOL 如何求解非线性稳态有限元问题,以及怎样读取日志文件。
本篇博客中,我们将向您介绍使用 COMSOL 求解任何有限元问题时,其中所用的两类线性方程组的求解算法。这些信息与理解求解器的内部工作原理,以及内存使用如何随问题大小变化等相关。
让我们考虑一个包含三个节点和三个单元的线性静态有限元问题:

每个单元由两个节点约束。其中一个节点位于刚性壁处,我们知道这里的位移是 0,因此无需求解该节点。正如我们在之前一篇有关求解线性静态有限元问题的博客中读到的,我们可以为每个节点编写出一个力的平衡方程:
而且,我们可以这样写:
或者更加简洁的形式:
我们可以使用 Newton-Raphson 迭代方法来求解此问题,由于这是一个线性静态问题,我们可以通过一次迭代求解,并使用 作为初始值,此时将得到如下解:
现在,该问题仅包含两个未知项,或称自由度 (DOF),可以轻松通过笔算求解。但整体而言,您的矩阵通常会包含数千乃至数百万个 DOF,对上述方程的求解通常是整个问题中计算量最大的部分。当在计算机中求解此类线性方程组时,我们还应了解条件数的概念,这是一种测量解对载荷变化敏感性的方法。虽然 COMSOL 不会直接计算条件数(这样做的成本与求解问题相同),我们还是会提供条件数的相关项目。在用于求解线性方程组的数值方法中,我们就需要条件数。
我们有两个用于求解 的基础类算法:直接和迭代方法。下面,我们将简要介绍这两类方法,它们的一般属性,以及相对表现。
COMSOL 中使用的直接求解器是 MUMPS、PARDISO,以及 SPOOLES 求解器。所有求解器都基于 LU 分解。
对于所有良态有限元问题,这些求解器都能得到相同的答案,这就是它们最大的优势;它们甚至支持求解一些非常病态的问题。从解的角度来看,您选择哪个直接求解器并不重要,因为它们都将返回相同的解。不同直接求解器之间的主要区别在于其相对速度。MUMPS、PARDISO 和 SPOOLES 求解器每个都可以利用单台机器上的所有处理器内核,但 PARDISO 最快,SPOOLES 最慢。在所有直接求解器中,SPOOLES 使用的内存最少。所有直接求解器都需要使用大量的 RAM,但 MUMPS 和 PARDISO 可以在核外储存解,这意味着它们能够将部分问题卸载到硬盘上。MUMPS 求解器也支持集群计算,使您可用的内存大于通常任一台机器中所能提供的。
如果您在求解一个没有解的问题,例如没有约束却有载荷的结构力学问题,直接求解器仍会尝试求解,但会返回一个与下方所示类似的错误信息:
求解失败。 相对残差(0.06)大于相对容差。 返回的结果未收敛。
如果收到此类报错,您应检查问题是否被正确约束。
COMSOL 中包含大量的迭代求解器,但它们在本质上与共轭梯度法类似,所以概念相当简单,不难理解其最高级形式。其他变形包括广义最小残差方法和双共轭梯度稳定迭代法,对于这方面有许多变形,但表现都很类似。
与直接求解器相反,迭代方法会逐步求解,而非通过一个计算强度很大的步骤来实现。因此,当利用迭代方法求解一个问题时,您会观察到求解过程中的误差估计会随着迭代次数的增加而减少。对于良态问题,应为单调收敛。如果您正在处理一些非良态问题,收敛就将更慢。迭代求解器的振荡行为通常表明问题没有设定好,比如问题没有足够的约束。下方显示了迭代求解器的典型收敛图:

缺省情况下,我们认为当迭代求解器的估计误差小于 10-3 时,模型已收敛。这可以在求解器设定窗口中控制:

可以将容差设得更高,更快地完成求解;或者设得更低,在当前网格上实现更高的准确度。根据机器精度 (2.22×10-16) 和条件数(依赖于问题),容差必须始终大于一个数。但通常没必要将容差设得过低,因为模型的输入项,比如材料属性,其精度通常不会超过几位有效数字。如果您要更改相对容差,我们通常建议将它减少一个数量级,然后对比解。请记住,您是在当前使用的网格上以更低的容差求解,更合理的做法是细化网格。
迭代求解器最大的优势是其内存使用,当求解同样大小的问题时,它们的内存使用明显小于直接求解器。迭代求解器最大的劣势在于它们并非“直接可用”。不同物理场需要不同的迭代求解器设定,具体基于所求解的控制方程的性质。
幸运的是,COMSOL 已经为所有预定义的物理场接口内置了缺省的求解器设定。COMSOL 将自动检测要求解的物理场,以及问题大小,并针对具体问题选择求解器,直接或迭代。COMSOL 会根据最高鲁棒性和最低内存使用来选择缺省的迭代求解器,不需要用户进行任何操作。
当在仿真中求解线性方程组时,COMSOL 会自动检测最佳求解器,无需用户进行任何操作。直接求解器使用的内存要高于迭代求解器,但更具鲁棒性。迭代求解器会逐步求解,如果需要,可以修改收敛容差。
在上一篇博客中,我们介绍了线性静态问题的网格划分注意事项。其中,网格收敛是一个关键概念,因为随着网格的细化,解将变得更加精确。这篇博客,我们将更加深入地探究:对于线性静态有限元问题,如何选择合适的网格进行网格收敛研究。
在之前的博客中,我们介绍了 4 种不同的三维单元类型:四面体、六面体、棱柱和金字塔形:

这 4 种单元可以进行各种组合,对任何三维模型进行网格剖分。(对于二维模型,可以选择三角形和四边形单元。因为它只是三维的一个逻辑子集,不需要太多额外的解释,所以我们这里将不会进行过多介绍。)为什么要使用不同的单元,我们在上一篇文章中没有深入介绍。
对于 COMSOL Multiphysics 中的大部分物理场而言,四面体单元是默认的单元类型。四面体也称单纯形网格,简单讲就是,可以使用四面体单元对 任何 三维体进行网格划分,无论什么形状或拓扑结构。它们也是唯一一种可用于自适应网格细化的单元类型。因此,四面体单元通常是首要选择。
另外三种单元类型(六面体、棱柱和金字塔形)仅用于确实需要时。首先应该注意的是,这些单元并非总能划分具体几何。根据划分的算法,通常需要进行更多的用户输入来创建这类网格,因此在进行网格划分前,应该首先问一下自己为什么要这样划分。这里,我们将介绍使用六面体和棱柱单元的原因。金字塔形仅在需要在六面体和四面体网格之间创建一个过渡区域时使用。
在此,我们有必要介绍一些背景信息。在第一台电子计算机诞生之前,有限元方法背后的数学理论就已经得到了充分的发展。第一台运行有限元程序的计算机中布满了真空管和手工制作的电路,虽然后来的晶体管极大地改进了计算机,但 25 年前发明的超级计算机的时钟速度也不过与如今流行的一些配件(谷歌眼镜)相同。
最早求解的一些有限元问题在结构力学领域,早期程序主要是为一些内存极小的计算机编写的。因此,会使用一阶单元(通常使用特定的积分方案)来节省内存与时间。但在结构力学问题中,使用一阶四面体单元会带来严重的问题,而使用一阶六面体单元则可以得到精确的结果。
由于这些较早期的代码产物,现在,许多结构工程师仍然更喜欢使用六面体而非四面体单元。
事实上,在 COMSOL 中使用二阶四面体单元求解结构力学问题会得到精确的结果,与使用六面体单元的差别仅在于内存需求和求解时间。
在 COMSOL 中使用六面体和棱柱单元的主要是因为它们可以极大地降低网格中的单元数。这些单元可能有极高的长宽比(最长边与最短边的比例),而用于创建四面体网格的算法则会尽量保持长宽比接近一致。当您知道解在特定方向上会逐渐变化,或者您对这些区域中的精确解并不感兴趣,因为您知道感兴趣的结果在模型的其他位置时,使用具有高长宽比的六面体和棱柱单元较为合理。
考虑一个轮毂示例,如下所示。
左边轮毂中的网格仅由四面体构成,而右边轮毂中的网格则包括四面体(绿色)、六面体(蓝色)、棱柱(粉色),以及位于这些网格过渡区的金字塔形网格。在孔和拐角处这些我们预期应力会更高的区域,混合网格使用了较小的四面体单元。辐条和轮毂附近使用了六面体和棱柱单元。峰值应力不会出现在轮毂或辐条处(至少在静载荷下),我们可以有把握地假定这些区域应力的变化相对较慢。四面体网格包含大约 145000 个单元和 730000 个自由度。混合网格包含接近 78000 个单元和大约 414000 个自由度,求解时间与内存使用都大约为原来的一半。混合网格需要大量的用户设定,而四面体网格基本上不需要用户设置。
注意:自由度和求解问题所需内存之间并没有直接的联系。这是因为不同单元类型的计算要求不同。二阶四面体中每个单元有 10 个节点,而二阶六面体则有 27 个。这说明使用六面体单元时,单个网格矩阵更大,对应的系统矩阵也更密集。求解所需的内存(和时间)与要求解的自由度数、节点间的平均连通性,以及其他一些因素有关。
另一个示例是对负载弹簧的结构分析,如下图所示。由于沿弹簧螺旋长度方向的变形几乎一致,因此采用一个能描述整体形状和截面,并且沿螺旋长度方向相对较延伸的网格单元是合理的。使用棱柱进行网格划分需要 504 个单元和 9526 个自由度,四面体单元则需要 3652 个单元和 23434 个自由度。因此,尽管单元数量相差很大,但自由度数差别不大。

使用六面体和棱柱单元的另外一个重要原因是,几何在一个方向上包含极薄的结构,例如晶圆上的外延材料层,冲压钣金件或夹层式复合材料。
下图所示为刻蚀在基底上的一层非常薄的轨迹材料。使用四面体单元对薄层进行划分,网格将被划分成非常小的单元,但如果使用棱柱单元划分,该区域的网格将被划分成非常薄的单元。只要几何结构中包含比零件中最大尺寸小 10-3 倍或更小的层,就应该使用六面体和棱柱单元进行网格划分。
此外,COMSOL 还提供了多种边界条件,可用于代替模拟薄层材料。例如在下列 4 个电磁仿真案例中,考虑了具有相对较高和较低电导率,以及相对较高和较低磁导率的薄层材料。
COMSOL 的大部分物理场接口中都包括类似的边界条件。使用这类边界条件可以避免对这些薄层进行完整网格划分的需求。
最后,上述讨论仅适用于线性静态有限元问题。对于非线性静态问题、时域或频率问题,应使用不同的网格划分方法。
总之,在开始对线性静态问题进行网格划分之前,应牢记以下注意事项:
阅读之前的一篇博客 “线性静态问题的网格剖分注意事项”,我们发现,有限元模型的解将能在网格细化的限度内收敛至真实解。不仅如此,我们还了解到,在误差较高的区域,可以通过自适应网格细化生成包含更小单元的网格,而不是简单地在整个模型内都使用较小的网格单元。在这篇博客中,我们将讨论有限元建模过程中一些常见的由模型奇异性造成的错误。
让我们来分析在单轴应力作用下一个含方孔平板的受力情况。这与之前讲解过的一个示例较为类似,都是利用平板的对称性而只对其中的四分之一进行受力分析。

与之前一样,我们可以通过自适应网格细化让 COMSOL 在预计误差较大的区域内插入更多的单元:

我们观察后发现,插入到锐孔内拐角的网格单元越来越小。让我们以网格尺寸函数的形式绘制出内拐角处的应力图:

从上图中可以看出,不论网格细化到什么程度,应力值一直呈递增趋势。事实也是如此:因为模型中存在奇异性,所以尖角处的应力值不随网格细化程度而收敛。实际上这是完全准确的:尖角处的应力在理论上趋于无穷。每次您看到此类不收敛的行为表现时,就应当联想到模型中存在奇异性。
在实际的结构工程中,应极力避免产生尖锐的内角。当然您完全有理由说,可以把存在奇异性的尖角磨平来防止此类问题出现;这样,我们不难预测到模型中的应力将会随网格细化而收敛,但是在内角处仍需要插入大量的单元。所以接下来将介绍其他几种处理奇异性的方法。
处理奇异性的一种方式就是忽略它们。有限元方法的一个重要特征就是它允许局部存在不准确,因为其出发点就是为了最小化模型中的整体误差。我们在上述模型中预估的应力值并不正确,但如果在离奇异性产生点约 2~3 个网格单元处求应力,那么结果将会收敛。因此,如果我们考虑远离奇异性产生处的应力将不会受奇异性影响。
同样不可忽略的是,奇异性会对解的求导产生影响。在结构力学中,我们需求解位移场 ,进而从应变
推导应力,其中应变由位移场的变化率
定义。所以当把应力作为位移场的变化率来考虑时,就更清楚地解释了为什么在尖角处的应力趋向于无穷。然而,如果只考虑解
,那么即便在尖角处也不会产生奇异性,结果将随网格细化而收敛。
另一个常见的允许奇异性存在的情况是,您仅对模型输出的积分值感兴趣。例如一个线性材料的总弹性势能可表示为:
如果在一个包含奇异性的域内对其求值,例如带有方孔的平板,那么积分会随网格细化迅速收敛,即便被积函数在域内任意一点不收敛。如果您希望得到模型内一个域(或边界)处的被积函数,那么您的模型中可以存在奇异性。无论是尖角还是圆角,积分值最终都会收敛至相同的值。这种情形常见于电磁学,此时设备的电感和电容分别被表示为域内电场和磁场的积分形式。
总的来说有三类情形允许在模型中存在奇异性:
在上述几种情况中,您可以通过网格细化观察解的收敛。对于模型中其他不收敛的地方也应仔细观察,以保证您对结果的解读不会产生偏差。
最后,仍然有一些情况需要 精确求出奇异点附近的场,但是模型可能很大,我们无法为所有的边应用圆角。在这些情形下,我们可以使用 子模型法,或拆拆分模型法。在可能存在奇异性的大型模型中,这种方法会首先使用相对粗化的网格来找出解,然后将信息传递给包含更细化网格和更圆滑拐角的子模型。轮毂的子模型示例演示了该方法的使用。
本篇博客中,我们介绍了线性静态有限元问题的网格剖分注意事项。这是网格剖分技巧系列博客的第一篇,希望能帮您建立起对有限元模型剖分网格的信心。
有限元网格通常服务于两大目的。首先,它将模拟的 CAD 几何细分为更小的组成部分,或称单元,在此基础上,我们将能够写出一组方程来描述控制方程的解。网格也用于代表所求解物理场的解域。不论是几何离散化还是解的离散化,都会出现误差,所以我们将分别查看。
考虑两个非常简单的几何,一个立方体和一个柱形壳:

我们可以使用四类单元来剖分这些几何 – 四面体、六面体、三角棱柱,以及金字塔形单元:

灰圈代表单元的角,或称节点。您可以使用这四种单元的任意组合。(在二维模型中,可以使用三角形和四边形单元。)检查一下您将发现,这两个几何都可以通过一个六面体单元、两个棱柱、三个金字塔形,或五个四面体进行网格剖分。正如我们在之前一篇有关求解线性静态有限元问题博客中读到的,您总可以通过一次 Newton-Raphson 迭代得到解。在所有线性有限元问题中,不论您使用了哪种网格,这一点都适用。让我们看一下可以在这些结构中使用的最简单网格。下图显示了用于离散这些几何的单个六面体单元:

立方体的网格显然是真实几何的完美表征,柱形壳的网格则看起来相当差。事实上,这只是因为绘制的关系才看起来如此。出于图形表现的目的,绘制在屏幕上的单元通常会有直的边,但 COMSOL 则会使用二阶拉格朗日单元来离散几何(以及解)。因此,虽然单元的边看上去是直的,它的内部表征其实是:

白圈代表这些二阶单元边的中点节点。也就是说,定义了单元边的线由三个点表征,这些边通过多项式拟合近似。每个四边形面的中心,以及二阶拉格朗日六面体单元(为清晰起见,图中已省略)的中心也有一些额外的节点。显然,这些单元在代表单元中弯曲边界方面的表现更好。缺省情况下,COMSOL 会在大部分物理场中使用二阶单元,化学物质传递问题和流体流动场中的求解是两个例外。(由于这类问题中以对流为主,使用一阶单元求解控制方程会更好。)还可以使用更高阶单元,但缺省的二阶单元通常能在精度和计算要求之间达到一个较好的折中。
下图显示了当使用一阶和二阶单元剖分一个 90° 弧时的几何离散化误差:

据此我们可以得出以下结论:至少需要 2 个二阶单元或 8 个一阶单元才能将几何离散化误差降低到 1% 以下。事实上,使用 2 个二阶单元会引入小于 0.1% 的几何离散化误差。更细化的网格可以更精确地表示几何,但将使用更多的计算资源。这也给了我们两条相当实用的指导:
根据这些经验法则,我们现在可以估算在对几何进行网格剖分时引入的误差,这样即使还没开始求解模型,也能对剖分操作有一定信心。现在,让我们将注意力转向网格如何离散解这一点上。
有限元网格也用于表示解的域。在解节点处计算,并基于多项式在整个单元上内插该解,以得到整个解的域。当求解线性有限元问题时,不论网格有多粗化,我们总能够计算得到解,虽然可能并不精确。要理解网格密度对解精度的影响,让我们看一下之前几何中的一个简单传热问题:

在立方体和柱形壳相对的面上施加了一个温差。导热系数恒定,所有其他表面均为热绝缘。
立方体的解是温度场在整个立方体中呈线性变化。对本模型而言,一个一阶六面体单元已足以得到真实的解。当然,您很少会这么幸运!

因此,让我们看一个略具挑战性的案例。我们已经看到,柱形壳模型因弯曲边的存在而包含几何离散化误差,因此我们将沿弯曲边使用 2 个二阶(或 8 个一阶)单元开始模型研究。如果仔细看一下上图,您将发现边界上单元的边是弯曲的,而内部单元的边则是直的。
沿柱体的轴向,我们可以只使用一个单元,因为温度场在此方向无变化。但从内表面到外表面的径向上,我们还需要足够的单元来离散化解。本案例中的解析解为 ,可与我们的有限元解进行对比。由于多项式基函数无法完美描述该函数,让我们绘制一下线性和二阶单元有限元解的误差:

从这一绘图中可以看到,误差将随着您增加模型中的单元数目而减小。这也是有限元方法的一个基本特点:单元越多,您的解越精确。当然,这样做也要付出一定的代价:我们需要更多的计算资源、时间和硬件来求解更大型的模型。现在,您已经注意到绘图的 x 轴没有单位,这是我们的特意设定。每个模型中误差相对于网格细化的减小速率不同,这与许多因素相关。唯一重要的一点是,它在适定的问题中会不断呈单调式下降。
您还将发现,在某个点后,误差会重新升高。这将在单个网格单元变得非常小的时候发生,我们碰到了数值精度的限制。也就是说,我们模型中的数小于电脑可以精确表示的数。这是所有计算方法中固有的一个问题,而非仅存在于有限元方法中;计算机无法精确表示所有实数。误差开始重新增大的那个点接近 ,出于安全和实用的考虑,我们经常说最小可实现的误差是 10-6。因此,如果我们积分整个模型中真实和计算解的缩放差:
我们就可以说在网格细化的限制下,误差 通常可以小至 10-6。实际上,模型输入的不确定性通常比它更大。同时也请记住,我们通常并不知道真实的解,相反,我们需要对比由不同尺寸网格计算得到的解,并观察解正朝哪个值收敛。
我希望通过介绍一个更好的网格细化方法来结束本篇博客。上图显示出,随着模型中所有单元变小,误差会减少。但理想情况下,您仅需细化误差较高区域的单元。COMSOL 通过自适应网格细化解决了该问题,它首先会在初始网格上求解,然后在误差估算较高的区域迭代插入单元,然后重新求解模型。您可以按照需要进行足够多的迭代。本功能可用于二维下的三角形单元和三维下的四面体单元。让我们在一个简单的结构力学问题中检查一下该问题,单轴拉伸下的有孔平板,如下图所示。利用对称性,我们仅需求解模型的 1/4。

在离孔洞较远的地方,计算得到的位移场和合应力都比较均匀,但靠近孔洞处的变化很大。下图显示了初始网格,及几次自适应网格细化迭代后的结果,以及计算得到的应力场。

请注意 COMSOL 如何优先在孔洞周围插入更小的单元。这应该不奇怪,因为我们已经知道孔洞周围的应力更高。实际上,我们建议综合自适应网格细化、工程判断,以及个人经验来找到一个可接受的网格。