应用注解 – COMSOL 博客 - //www.denkrieger.com/blogs 发布博客 Thu, 04 Jul 2024 06:07:07 +0000 en-US hourly 1 https://wordpress.org/?v=5.7 模拟电磁波和周期性结构 //www.denkrieger.com/blogs/modeling-electromagnetic-waves-periodic-structures //www.denkrieger.com/blogs/modeling-electromagnetic-waves-periodic-structures#comments Fri, 17 Jan 2014 22:15:45 +0000 http://com.staging.comsol.com/blogs/?p=59371 \alpha_1 > \pi/2 , \alpha_1 = 0,意味着垂直入射。入射波矢和全局 x 轴之间的夹角为入射方位角 \alpha_2,位于范围 -\pi/2 > \alpha_2 \geq \pi/2 之内。 由该定义, \alpha_1 和 \alpha_2 的正值表示波沿着 x 轴 和 y 轴正向传播。 如要使用入射方向的上述定义,我们需要指定 \bf{a_1} 矢量。这可以通过选定一个周期性端口参考点来完成,它必须是入射端口的角点之一。软件使用从该点出发的面内边来定义两个矢量,\bf{a_1} […]]]> 我们经常想要模拟入射到周期性结构中的电磁波(光、微波),例如衍射光栅、超材料,或频率选择表面。这可以使用 COMSOL 产品库中的 RF 或波动光学模块来完成。两个模块都提供了 Floquet 周期性边界条件和周期性端口,并将反射和透射衍射级作为入射角和波长的函数进行计算。本博客将介绍这类分析背后的概念,并将介绍这类问题的设定方法。

场景

首先,让我们来考虑代表周期性重复晶胞的自由空间平行六面体,平面波沿一个角度入射到其上,如下图所示。

平面波经过周期性重复晶胞的图示

入射波矢 在全局坐标系中有三个分量,其大小分别是: , ,和 。该问题可通过在域侧面使用周期性边界条件,并在顶部和底部使用端口边界条件来模拟。该问题设定最复杂的地方是定义入射波和出射波的方向和偏振。

定义波方向

虽然 COMSOL 软件非常灵活,支持对基矢坐标系的任意定义,但在本博客中,我们将选定一个坐标系并始终使用它。入射光的方向由两个角度定义, ;以及两个矢量, 为模拟空间中向外指向的法向, 为入射面的一个矢量。我们这里所选择的约定将 与全局 x 轴对齐,将 与全局 z 轴对齐。因此,入射波的波矢与全局 z 轴之间的夹角为 ,即入射仰角,其中 ,意味着垂直入射。入射波矢和全局 x 轴之间的夹角为入射方位角 ,位于范围 之内。 由该定义, 的正值表示波沿着 x 轴 和 y 轴正向传播。

如要使用入射方向的上述定义,我们需要指定 矢量。这可以通过选定一个周期性端口参考点来完成,它必须是入射端口的角点之一。软件使用从该点出发的面内边来定义两个矢量,,且 。在下图中,我们可以看到满足这一条件的四组 。因此,俯瞰 z 轴及平面时,入射面端口上的周期性端口参考点应为 x-y 平面左下角的点。通过选择此点, 矢量变得与全局 x 轴对齐。

周期性重复晶胞上的周期性端口参考点图示

既然选择了周期性端口参考点而在入射面定义了 ,那么模拟域中出射面的端口也必须定义。法向矢量 指向相反的方向,因此必须调整所选择的周期性端口参考点。四个角点都无法提供与入射面矢量对齐的 ,因此我们必须选择这四个点之一,并调整 的定义。通过在出射面选择与入射面所选定点完全相反的周期性端口参考点,并将 旋转 的方向被旋转到 ,指向与入射面 相反的方向。由于这种旋转,模拟域中出射面的 的正负号发生了转换。

周期性重复晶胞中出射面的周期性端口参考点图示

下一步,考虑一个代表介电半空间的模拟域,在入射和出射端口面之间存在折射率差异,这会使波方向发生改变,如下图所示。根据斯涅耳定律,我们知道折射角为 。这使我们可以计算出射端口处的波矢方向。此外,请注意,即使有额外的介电层夹在两个半空间之间,这种关系也仍然成立。

斯涅耳定律图示

总结一下,要定义通过一个晶胞的平面波方向,我们首先需要选择两个点,即周期性端口参考点,它们在入射面和出射面的位置完全相反。这些点定义了矢量 。因此,入射面的 可以相对于全局坐标系定义。在出射面上,方向角变为:

定义偏振

入射平面波的偏振可以是二者之一,即电场或磁场与 x-y 平面平行。所有其他偏振,例如圆形或椭圆形,都可以由这二者的线性组合建立。下图显示了 ,且磁场与 x-y 平面平行的情况。当 时,全局坐标系中的入射和出射端口的磁场大小是 。由于光束旋转使 ,磁场大小变为 。对于正交偏振,可以用类似方法定义入射面的电场大小。在出射端口,x-y 平面中的场分量可以用相同的方式定义。

周期性重复晶胞中磁场与 x-y 平面相平行的偏振图示

到目前为止,我们已经看到了如何定义传播经过介电界面周围晶胞的平面波的方向与偏振。对这类问题,您可以看到案例库中 Fresnel 方程模型的结果与解析解一致。

定义衍射级

接下来,让我们来检查一下把周期性结构引入模拟域之后会发生什么变化。考虑一个入射到下图周期性结构中、且 的平面波。如果波长相对光栅间距足够短,就可能会存在一个或多个衍射级。要理解这些衍射级,我们必须观察由矢量 所定义的平面,以及由矢量 所定义的平面。

平面波衍射图示

首先,沿着由 所定义平面的法向观察,我们能看到零阶透射传输模式的存在,其方向如前所述按照斯涅尔定律定义。零阶反射分量也存在。结构中也可能存在一些光的吸收,不过未在图片中显示。下图仅显示了零阶透射传输模式。间距 是由矢量 所定义平面中的周期性。

零阶透射传输模式图示

对于足够短的波长,也可以有更高阶的衍射模式。当 时,下图显示了这些情况。

短波长的更高阶衍射模式图示

这些模式存在的条件是:

m\lambda_0 = d(n_B \sin \beta_m - n_A \sin \alpha_1)

for:

其中 时的情况可以简化为斯涅耳定律。当 时,如果光程差等于真空中波长的整数倍,则发生相长干涉, 阶衍射光束的衍射角为 。注意,正负 阶的个数无需相同。

下一步,我们沿着由矢量 所定义的平面观察。也就是说,我们将视角绕 z 轴旋转,直到入射波矢看上去沿表面的法向。进入此平面的衍射标注为 阶光束。注意该平面上的周期性间距 不同,且正负 阶的个数总是相同。

沿矢量 n 和 k 所定义平面的衍射

设定周期性端口时,COMSOL 会自动计算这些 阶模式,并定义监听端口,从而可以计算出衍射至每种模式的能量有多少。

最后,我们必须考虑在波发生衍射后,其偏振可能会经历旋转。因此,每个衍射级包含两个正交偏振,面内矢量面外矢量分量。观察由 和衍射波矢 所定义的平面,衍射场可以有两个分量。面外矢量分量是指偏振方向在衍射面外(由 ) 所定义的平面)的衍射光束,面内矢量分量则为正交偏振。因此,如果面内矢量分量在特定衍射级非零,则意味着入射波在衍射时经历了偏振的旋转。对于 阶模式,类似定义仍然适用。

衍射波的面内矢量和面外矢量图示

考虑介电基底上的周期性结构。光束以 入射时,就会有更高的衍射级,对所有衍射级的可视化会变得非常复杂。在下图中,入射平面波的方向用黄色矢量显示。 衍射级在正 z 方向的衍射用蓝色箭头显示,负 z 方向的衍射用青绿色箭头显示。 阶模式的正向衍射显示为红色,负向衍射显示为紫红色。衍射可以在这些方向的每个方向上发生,衍射波的偏振方向可以在衍射面内,也可以垂直于衍射面。衍射面本身可以显示为一个圆弧。注意,在 模式下衍射面在正 z 和负 z 方向不同。

对介电基底上所有衍射级的可视化

定义三维周期性结构时,所有端口会自动设定。它们获取了这些不同的衍射级,并能够计算每级的场和相对相位。理解这些端口的含义和解释有助于模拟周期性结构。

]]>
//www.denkrieger.com/blogs/modeling-electromagnetic-waves-periodic-structures/feed/ 11
提高多物理场问题的收敛性 //www.denkrieger.com/blogs/improving-convergence-multiphysics-problems //www.denkrieger.com/blogs/improving-convergence-multiphysics-problems#comments Mon, 23 Dec 2013 15:18:18 +0000 http://com.staging.comsol.com/blogs/?p=102711 “求解多物理场问题”这篇博客中,我们介绍了 COMSOL 中用于求解稳态多物理场问题的全耦合分离算法。这里,我们再来看一下能够加快这两种方法收敛的一些技巧。

载荷递增和非线性递增技巧

就像我们刚刚了解到的那样,利用全耦合方法求解稳态非线性问题时,所用的正是用于求解非线性单物理场问题的阻尼 Newton-Raphson 算法。虽然这一算法在许多情况下收敛良好,但如果选择的初始条件较差,可能会出现无法收敛或收敛很慢的问题。综合这些方面不难看出,我们之前介绍的一些技巧同样适用于多物理场问题,例如载荷递增非线性递增。事实上,我们也无需再为这些技巧多做补充,因为它们的使用方法相同。

递增多物理场问题

这是非线性递增技巧的一个新变形,即逐渐增加物理场之间的耦合。从数值角度来看,它其实与之前讨论的非线性递增技巧相同,但从概念角度来看,它是物理场间耦合的递增量级, 而非单一物理场中非线性的量级。唯一的难点在于选择和执行将发生递增的项。幸运的是,绝大多数多物理场问题中物理场间的耦合都相当明显,可以通过以下方式轻松找出:写出控制方程和边界条件,并查看材料属性和载荷如何依赖于求解变量。

这里要记住的重要一点是:求解全耦合多物理场问题的底层算法与求解非线性单物理场问题的算法完全相同。记住这一点之后您就会发现,除了要理解全耦合多物理场问题模型中物理场间的相互作用外,并没有其他概念上的障碍。

另一方面,分离方法则可能带来许多不同的求解策略,它们可以极大地加快解的收敛,并能显著影响求解问题所需的内存量。为了更好地理解这一点,让我们做一个有关不同多物理场求解技巧的流程图。这里还是继续以之前母线板博客中讨论的问题为例进行说明,母线板由于电流的影响被加热,并承受了热应力。

全耦合方法

首先,全耦合求解器会从初始猜测开始,然后应用 Newton-Raphson 迭代直到收敛的解:

全耦合求解器方法

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

耦合收敛图

分离法

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

分离式求解器的模拟方法

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

使用这一求解方法,您将至少得到两个收敛图,一个针对分离步中可能用到的迭代求解器,第二个则是分离法的总收敛图:

分离方法迭代收敛图

上图显示了每个物理场中误差的下降情况。虽然分离求解法可能需要进行更多次迭代来求解相同问题,但其中的每个环节都要快于全耦合方法中的 Newton-Raphson 步骤。您还可以从中获得其他一些信息,比如,如果只有一个或者两个物理场不收敛,那您可以首先检查它们的一些设定。

顺序求解步骤

有关此问题,您可能还会想到一点,即温度变化是由电流的电阻加热驱动,电流分布依赖于电导率,电导率又依赖于温度。也就是说,电压与温度的解双向耦合。另一方面,虽然热应变和杨氏模量依赖于温度,但电压与温度的解却并不依赖于位移或应力。也就是说,热学问题和结构问题之间存在一个单向耦合。我们可以立即发现一个更有效的方法来求解这一问题。我们可以首先求解电压和温度问题,然后再求解位移:

多物理场问题的顺序求解步骤

因此,我们可以看到该问题(至少)有三种不同的求解方法:全耦合、分离并假定所有物理场间的耦合是分离的,或者利用温度和位移之间的单向耦合进行顺序求解。当求解一个多物理场问题时,COMSOL 会假定所有物理场之间的耦合,并根据物理场和问题大小尝试选择最优的全耦合或分离法。当然,打开求解器设定部分查看软件选择了哪种设定,也通常会对您有较大帮助。

求解器系列博客结束语

我们设计本系列博客的初衷,是希望帮助您理解 COMSOL 用于求解单物理场和多物理场线性及非线性稳态问题的算法,同时还讲到了诸如网格剖分、精度和收敛等问题。掌握这些信息之后,您会更有信心地进行此类模型的求解。

]]>
//www.denkrieger.com/blogs/improving-convergence-multiphysics-problems/feed/ 6
求解多物理场问题的 2 种算法 //www.denkrieger.com/blogs/solving-multiphysics-problems //www.denkrieger.com/blogs/solving-multiphysics-problems#comments Mon, 16 Dec 2013 15:10:32 +0000 http://com.staging.comsol.com/blogs/?p=121211 这篇博客,我们将介绍 COMSOL Multiphysics 中求解多物理场有限元问题的两类算法。到目前为止,我们已经学习了如何进行网格划分,以及求解线性和非线性单物理场有限元问题,但是还没有考虑过同一个域内存在多个相互影响的不同物理场的问题。

一个简单的稳态多物理场问题

我们先来看一个非常简单的稳态多物理场问题:穿过金属母线板的稳态电流场,母线板内的热量传递和结构变形的相互作用。电流引起电阻加热,从而导致母线板受热并开始膨胀。因为升温较为显著,所以母线板的电、热以及结构材料的性能变化不能忽略。我们希望求出稳态条件下的电流、温度场、变形以及应力。下图为待求解问题的示意图:

稳态电流经过金属母线板的多物理场问题示意图
待求解的多物理场问题。

涉及的方程

这里我们需求解三个本构偏微分方程。首先,描述域内电压分布的方程为:

\nabla \cdot[- \sigma(T) \nabla V] = 0

通过有限元法离散后,可以得到一组等式:

\mathbf{f}_V = \mathbf{K}_V(\mathbf{u}_T)\mathbf{u}_V-\mathbf{b}_V

其中,下标 表示未知电压,系数矩阵 与未知温度 相关。假设电压分布已知,体电阻热可由下式推导:

Q=\sigma(T)\bf{E \cdot E}

其中,电场 。这个热源出现在温度的本构方程中:

\nabla \cdot [ – k(T) \nabla T ] = Q(V)

并给出了方程组:

\mathbf{f}_T = \mathbf{K}_T(\mathbf{u}_T)\mathbf{u}_T-\mathbf{b}_T(\mathbf{u}_V)

当求出域中的温度分布后,就能求解结构位移:

\nabla \cdot [\mathbf{C}:(\epsilon-\epsilon_{\Delta T})] = \mathbf{0}

其中,弹性矩阵 由与温度度有关的杨氏模量 推导。产生的热应变为 ,应变为 。求解结构位移的方程组可以写成:

\mathbf{f}_D = \mathbf{K}_D(\mathbf{u}_T)\mathbf{u}_D-\mathbf{b}_D(\mathbf{u}_T)

其中,下标 表示未知位移。

合并以上方程组可得:

\[ \mathbf{f} =
\left\{
\begin{array}{c} \mathbf{f}_V \\ \mathbf{f}_T \\ \mathbf{f}_d \end{array}
\right\}
=
\left[
\begin{array}{ccc}
\mathbf{K}_V(\mathbf{u}_T) %26 \mathbf{0} %26 \mathbf{0} \\
\mathbf{0} %26 \mathbf{K}_T(\mathbf{u}_T) %26 \mathbf{0} \\
\mathbf{0} %26 \mathbf{0} %26 \mathbf{K}_D(\mathbf{u}_T)
\end{array}
\right]
\left\{
\begin{array}{c} \mathbf{u}_V \\ \mathbf{u}_T \\ \mathbf{u}_D \end{array}
\right\}

\left\{
\begin{array}{c} \mathbf{b}_V \\ \mathbf{b}_T(\mathbf{u}_V) \\ \mathbf{b}_D(\mathbf{u}_T) \end{array}
\right\}
\]

为了简化方程,我们可以省略参数中的下标:

\mathbf{f} = \begin{Bmatrix} \mathbf{f}_V \\ \mathbf{f}_T \\ \mathbf{f}_d \end{Bmatrix} = \begin{bmatrix}\mathbf{K}_V(\mathbf{u}) & \mathbf{0} & \mathbf{0}\\\mathbf{0} & \mathbf{K}_T(\mathbf{u}) & \mathbf{0}\\\mathbf{0} & \mathbf{0} & \mathbf{K}_D(\mathbf{u})\\\end{bmatrix} \begin{Bmatrix} \mathbf{u}_V \\ \mathbf{u}_T \\ \mathbf{u}_D \end{Bmatrix} – \begin{Bmatrix} \mathbf{b}_V \\ \mathbf{b}_T(\mathbf{u}) \\ \mathbf{b}_D(\mathbf{u}) \end{Bmatrix}

这就是求解多物理场耦合问题的所有模式!求解单物理场非线性问题和求解多物理场问题并没有概念上的区别。我们已经学习了关于求解非线性单物理场问题的所有知识,包括所有关于阻尼、负载和非线性加速以及网格划分的讨论,这对于求解多物理场问题同样有效。

全耦合法

但是,理解上述方法有一个缺点(在某些情况下是非常致命的)。通过代入 Newton-Raphson 迭代法,我们要求解导数 ,即:

\mathbf{f}'(\mathbf{u}^i)
=
\left[
\begin{array}{ccc}
\mathbf{ K}_V%26\mathbf{K}_{V,T}%26\mathbf{0} \\
\mathbf{-b}_{T,V}%26\mathbf{ K}_T%26\mathbf{0} \\
\mathbf{0}%26(\mathbf{K}_{D,T}-\mathbf{b}_{D,T})%26\mathbf{K}_D
\end{array}
\right]

这里,我们使用了一个简化符号来简化和缩短表达式,例如:

\mathbf{Ku}_{V,T}=\frac{\partial \left( \mathbf{K}_V\left( \mathbf{u} \right) \mathbf{u}_V \right)}{\partial \mathbf{u}_T}

很明显,以上矩阵为非对称矩阵,这将导致一个问题:如果系统矩阵不能确定,我们可能需要使用更加消耗内存的直接求解器求解。(尽管迭代求解器在预条件选择正确的情况下能处理范畴更为宽广的问题,但并不能保证足以应对所有特例。)使用直接求解器求解此类多物理场问题将会耗费更多的内存和时间。

不过,还有一种替代方法。上述求解方式被称为全耦合法,假设需要同时考虑物理场之间的所有耦合。实际上,在求解很多类型的多物理场问题时,我们可以忽略这些非对角线的项,采取更节约内存、更具时效性的分离 求解法。

分离法

分离法按顺序分析每一个物理场,使用之前求解物理场得到的结果来得到一个待求物理场的载荷和材料属性。因此,对于上面这个例子,我们先通过 Newton-Raphson 迭代求解电压:

\mathbf{u}^{i+1}_V=\mathbf{u}^i_V-[\mathbf{K}_V(\mathbf{u}^i_T)]^\mathbf{-1} \mathbf{b}_V

其中对于第一次迭代,我们必须对电压和温度各做出一个初始估计值 。使用温度场的初始条件来求解得到初始的材料性能。接下来求解温度:

\mathbf{u}^{i+1}_T=\mathbf{u}^i_T-[\mathbf{K}_T(\mathbf{u}^i_T)]^\mathbf{-1} \mathbf{b}_T(\mathbf{u}_V^{i+1})

其中,在第一次迭代 中 ,使用温度场的初始条件对材料性能 求解,但是荷载是通过之前计算的电压 计算得到。按照类似的方法,可以求解位移场:

\mathbf{u}^{i+1}_D=\mathbf{u}^i_D-[\mathbf{K}_D(\mathbf{u}^{i+1}_T)]^\mathbf{-1} \mathbf{b}_D(\mathbf{u}_T^{i+1})

其中,结构载荷以及材料性能是由之前计算的温度场推导而来。

继续使用迭代:有序地重复计算电压、温度和位移。 像这篇博客中定义的一样,此算法将持续进行直到达到收敛为止。

这个方法最大的优势是可以在每一个子步骤中使用最优求解器。这不仅意味着将在每一个子步求解更小的问题,还可相应的选择更节约内存的快速求解器。虽然分离法一般需要更多的迭代步骤才可收敛,但是与全耦合法中的迭代相比,分离法的每一次迭代在计算时间上都会显著减少。

如下为使用分离式求解器处理一个具有 n 个多物理场模型的算法:

  1. 设定模型中所有物理场的初始条件
  2. 初始化记录迭代次数的计数器
  3. 以分离法的求解顺序求得解一个物理场,使用上一步骤计算材料性能
  4. 利用已求解的扑粉解求解第二个物理场
  5. 使用之前计算的第(n-1)个解求解第 n 个物理场
  6. 重复步骤 2-6 直到收敛,或迭代次数超过预期峰值

对于一般物理场问题,用户仍然需要确定物理场的求解顺序,但是软件会默认建议内置的多物理场接口使用合适的求解顺序。 COMSOL Multiphysics 会按照分离法的求解顺序为每一个物理场提供默认的线性求解器设定。

使用分离法得到的收敛解与使用全耦合法得到的解完全一致。通常分离法会经过更多次的迭代以达到收敛,但是每个子步骤的所消耗的内存和时间会降低,从而进一步降低整体的求解时间和内存使用率。

求解多物理场问题的总结

在这篇博客中,我们介绍了处理多物理场问题的两类算法:全耦合法分离法 。全耦合法与求解单物理场非线性问题的 Newton-Raphson 迭代法一样,非常占用内存,但是十分实用,广泛适用于存在强相互作用的多物理场问题。另一方面,分离法假设能对每一个物理场单独求解,并且能在多种物理场之间完成迭代直至模型收敛。

]]>
//www.denkrieger.com/blogs/solving-multiphysics-problems/feed/ 3
非线性静态有限元问题网格剖分的注意事项 //www.denkrieger.com/blogs/meshing-considerations-nonlinear-static-finite-element-problems //www.denkrieger.com/blogs/meshing-considerations-nonlinear-static-finite-element-problems#comments Tue, 10 Dec 2013 14:56:58 +0000 http://com.staging.comsol.com/blogs/?p=121151 我们已在求解器系列的部分博客中讨论了求解非线性静态有限元问题、用于改善非线性问题收敛的载荷递增,以及用于改善非线性问题收敛的非线性递增。我们还介绍了线性静态问题网格剖分的注意事项,以及在网格剖分过程中如何找到奇异性并对此进行处理。在本篇博客中,我们将基于上述内容解释如何准备网格,以便能高效地求解非线性稳静态有限元问题。

对线性和非线性静态问题的回顾

您是否还记得“线性 静态问题的网格剖分注意事项 ”博客中提到的三个关键点:

  1. 经过一次 Newton-Raphson 迭代后,不论网格尺寸大小,线性静态有限元问题都会收敛。
  2. 您应选择从尽量粗化的网格开始,然后手动细化网格或是使用自适应网格细化,使用更细化的网格求解。
  3. 应当使用网格细化评估结果的精确度,同时使收敛远离模型中的奇异性。

我们还了解到,当求解非线性问题时,即使包含单一自由度且有解的有限元问题也可能不收敛。我们已经学习过处理这种问题的几种方法,但尚未介绍网格和非线性求解器之间的相互作用。

非线性问题的网格剖分

对非线性问题进行网格剖分时应熟记以下内容:

就算问题本身很完善、我们也选择了一个好的求解方法,但如果没有在强非线性区域内进行足够的网格剖分,问题也可能不收敛。

为了更好地理解上述内容,我们将研究一个一维传热有限元问题。考虑 1 m 厚的墙,一端温度恒定为 ,另一端温度恒定为 ,如下图所示:

一维传热有限元问题中的域

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

不同热传导率的绘图

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

线性情形 k=25 的解

经检验后,我们发现解是一条直线。对于这种情况,整个域内使用单一线性单元即可求解。

现在,如果我们要绘制 时的解,并用虚线表示各个单元,将得到:

非线性静态有限元问题的绘图

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

最后,如果我们绘制 时的解,将得到:

自适应网格帮助改进非线性模型的收敛

这个解更为复杂。很明显解内存在单靠一个单元无法充分描述的区域。当然也存在解会随位置的函数迅速变化的区域。这些区域都在 附近,周围的材料属性函数中存在强非线性。尽管材料属性函数的温度部分只存在一个强非线性区域,但解会在域内的两处区域变化迅速。只有这些区域需要更细化的网格。实际上,当这些区域中的网格太过粗化时,求解器可能完全不收敛。

此类问题就可以使用自适应网格细化求解,因为建模域内的梯度位置总体上是未知的。非线性递增同样十分有用,因为不论网格尺寸,从一个线性问题出发总能得到一个可以求解的问题。通过逐渐递增非线性以及循环使用自适应网格细化,将能够改善非线性问题的模型收敛。

总结

历来,非线性静态有限元问题的网格剖分都和非线性模型的收敛相关。除了收敛速度,收敛概率也都依赖于求解器算法和所使用的网格。到目前为止我们已经介绍了许多求解技巧,包括手动及自适应网格细化、对初始条件的选择、载荷递增、非线性递增,以及上述方法之间的任意组合,您将会在进行更为复杂的建模时用到这些技巧。最后,还请记住我们需要网格细化研究来评估解的精确度。

如果希望获取一个综合了上述所有求解方法的模型示例,请点击访问金属的冷却和凝固模型。熟练掌握以上方法后,您将能更高效、快速地进行非线性问题的建模。

]]>
//www.denkrieger.com/blogs/meshing-considerations-nonlinear-static-finite-element-problems/feed/ 1
通过递增非线性改进非线性问题的收敛 //www.denkrieger.com/blogs/nonlinearity-ramping-improving-convergence-nonlinear-problems //www.denkrieger.com/blogs/nonlinearity-ramping-improving-convergence-nonlinear-problems#respond Tue, 03 Dec 2013 14:51:04 +0000 http://com.staging.comsol.com/blogs/?p=121091 正如之前在 “非线性问题的载荷递增“博客中所讨论的,当求解一个问题时,我们可以从一个已知解的无载荷问题开始,然后使用延拓法逐渐递增载荷来进行求解。这个算法同样适用于理解接近失效的载荷时的情况。然而载荷递增并非适用于所有情况,在某些情况下可能无法发挥效用。本篇博客中,我们将介绍如何通过非线性递增改进问题的收敛。

非线性递增示例

再次考虑下图中含非线性刚度的弹簧系统,对其施加应力。

向非线性刚度的弹簧系统中施加力

我们发现可以使用阻尼 Newton 法求解该问题,或是使用延拓法并递增载荷,从而为 Newton 法提供一个好的初始条件。现在我们来检验如何递增非线性。首先,让我们再来看一看描述单一节点上受力平衡的方程:

f(u)=p-\exp(u)u

可将以上等式写成通式: ,其中 是非线性弹簧刚度。现在我们可以使用以下刚度来求解不同的问题:

k(u,\beta)= k(u_0)+\beta \left[ k(u) – k(u_0) \right]

也就是说,我们将弹簧的刚度方程分为两部分:一个线性项 ,以及一个非线性项 ,接着引入一个附加参数 ,插入在线性项和非线性项之间。然后对一系列带有参数 的问题使用与之前相同的 Newton 法,并使参数 从 0 递增到 1 。也就是说,使用延拓法从一个(容易求解的)线性问题递增到一个(更难的)非线性问题。
接下来使用这种该法求解上述例题。初始弹簧刚度 被改写成:

k(u,\beta)=\exp(u_0)+\beta\left[\exp(u)-\exp(u_0)\right]

我们从求解 的情况开始,得到一个线性弹簧刚度 ,所以现在需要做的就是找到一个线性化起点 。在这个案例中,如果选择 ,那么 。回想之前关于求解线性稳态有限元模型的讨论,我们学到总能使用一次 Newton 迭代来求解线性问题。现在递增参数 ,结果如下:

使用延拓法将线性问题递增为非线性问题

可以明显看到,只有一小部分从 开始的解需要对 求解。所以我们可以重复 的步骤并从完全线性情形递增到完全非线性情形。

这一方法很有吸引力,因为我们总能找出线性问题的解,所以总能求解 。您只需考虑该对哪些点 进行初始线性化以及应该使用哪种非线性递增。

我们也可使用非线性递增的概念来解决非线性项不连续可导的情形。让我们回忆一下求解非线性稳态有限元问题 博客中的案例:具有分段常数弹簧刚度的系统, ,以及 ,将构成受力平衡方程:

不连续分段常数弹簧刚度

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

使用递增步长改进非线性问题的收敛

显然该问题可以求解,而且我们可以使用这个方法得到原始问题的大致解,它仅要求我们得出一个大致的平滑方程和非线性递增路径。

当您遇到具有上述阶梯行为的问题时,就可以尝试使用双折线非线性求解器代替 Newton 法。双折线求解器是一个置信域求解器,适用于求解 Newton 法可能会在不同区域内震荡的问题。结构接触问题就是这类问题的良好物理示例,即当两个物理进行物理接触时,会产生载荷的突然转移。

改善非线性问题收敛性的结束语

我们已经介绍了两种改善非线性问题收敛性的方法:载荷递增和非线性递增。在实际操作中,您可以选择其中的一种做法,以及对材料属性及载荷进行恰当设置,从而能够结合这两种做法。很难说哪种方法的表现更优异,对于每个模型,您可能需要进行一些不同的尝试,包括载荷递增路线、非线性递增以及线性化初始条件的选择等。同样,当您预期解可能会在不同情形下产生震荡时,双折线求解器会比 Newton 法更有效。随着经验的增加,您将能形成一种工程直觉,从而能够找出所求解问题的最佳求解方式。

博客中介绍的方法,主要适用于求解难以找到良好初始条件的非线性稳态有限元问题,或者包含强非线性以及不连续性材料属性的问题。实际操作中,您将能通过这些方法解决很多问题。此外,您还应注意到,求解非线性问题时需要不同的网格剖分方法。这将是我们接下来会阐述的主题,请继续关注。

]]>
//www.denkrieger.com/blogs/nonlinearity-ramping-improving-convergence-nonlinear-problems/feed/ 0
非线性问题的载荷递增 //www.denkrieger.com/blogs/load-ramping-nonlinear-problems //www.denkrieger.com/blogs/load-ramping-nonlinear-problems#comments Fri, 22 Nov 2013 14:40:17 +0000 http://com.staging.comsol.com/blogs/?p=121031 \exp(-1) 时都无解。但如果使用更小的载荷,那么系统会是稳定的。实际上在我们假设的场景中,系统处于双稳态;对于每一个载荷 p \le \exp(-1) 都存在双解,尽管我们只对从 p=0 和 u_0=0 开始产生的分支感兴趣。下面绘制出 f(u) 的图像: 现在假设我们不知道载荷峰值在 p = \exp(-1) 处,并检验 COMSOL 求解 p = 0.2, 0.3, 0.4 时会发生什么。如果我们绘制出 p = 0.2, 0.3 时 f(u) 的图像,观察后发现 p = […]]]> 正如我们之前在“求解非线性稳态有限元问题”博客中所看到的,并不是所有的非线性问题都可通过阻尼 Newton-Raphson 法求解。尤其是当选择了一个不合适的初始条件或者设定一个无解的问题时,只会造成非线性求解器持续执行迭代而无法收敛。在此我们介绍一种更为可靠的非线性问题解决方案。

非线性问题示例

让我们再次考虑对弹簧施加应力的系统,弹簧具有非线性刚度:

非线性刚度弹簧

只要我们选择合适的初始条件(之前我们令 ),便可求解该问题。在“求解非线性稳态有限元问题”博客中,我们注意到在收敛半径外选择初始条件,譬如任 ,都会导致求解器失效。现在对于这个单一自由度的问题可以轻松地判断出它的收敛半径,但若是处理普遍的有限元问题时将会困难许多。所以不应试着求出收敛半径,而应首先对此类问题进行一些物理判断。

借助载荷递增改进鲁棒性

在此我们会向一个系统施加载荷, ,设定初始条件 ,并尝试进行求解。如果我们施加载荷 会发生什么?牛顿第一定律表明,一个无载荷的系统将不会产生形变。所以若是施加一个无限小但是大于 0 的载荷 又会怎样?可以合理地假设, Newton-Raphson 法会从初始条件 开始求解,最终将找到一个解 。 同样也可以较为合理地认为,我们可以将载荷增加到 使得 ,并再次得到一个解 ,只要载荷增量足够小即可。重复该算法,最后将达到最终载荷 ,以及期望的解。即从 0 载荷和 0 解开始,逐渐增大载荷直至达到期望的总载荷。下图展示了这个过程。粗箭头表示其中从特定的载荷值开始进行 Newton-Raphson 迭代。

利用延拓法递增载荷

这个算法也被称作载荷的 延拓法。这种从接近 0 开始逐渐增加载荷的方法,提供了一种更为可靠的使用阻尼 Newton 法求解非线性问题的途径,因为之前一步的解对下一步而言是很好的初始猜测。

使用这个算法,我们不仅能更好地解决如何为 Newton-Raphson 迭代找到好的起始点的问题,还拥有了一种应对无解问题的算法。再次考虑弹簧拉伸后刚度减小的问题,即之前讨论过的 ,该问题无解。在本案例中,我们可以解析判定出,对于任意载荷 时都无解。但如果使用更小的载荷,那么系统会是稳定的。实际上在我们假设的场景中,系统处于双稳态;对于每一个载荷 都存在双解,尽管我们只对从 开始产生的分支感兴趣。下面绘制出 的图像:

弹簧拉伸后刚度减小

现在假设我们不知道载荷峰值在 处,并检验 COMSOL 求解 时会发生什么。如果我们绘制出 的图像,观察后发现 时无解。 COMSOL 中的延拓求解器会自动在上一次成功的载荷值和下一次的期望载荷之间的区间执行一次搜索。即求解器会尝试进行回溯并找到一个可作为下一步起始值的中间解。当将 延拓法(或参数扫掠)用于在单一参数上求解稳态问题时,都会使用这个算法。那样的话,求解器将能够找到系统的最接近失效的载荷,这会是一项非常有价值的信息。

归纳和结论

我们已经介绍了载荷递增以及使用延拓法改善 Newton 法鲁棒性的概念。由于一个无载荷的系统存在已知解,而且我们已经看到该技术可以解决初始条件选值问题。此外,我们还了解到可以近似的求出破坏载荷。也因此,载荷递增是您在设定和求解非线性稳态有限元问题时应该理解的重要技术。

COMSOL 日志文件

让我们来看一下非线性有限元问题的日志文件。我们将设定并求解上文中描述的关于非线性弹簧在拉伸过程中刚度减小的问题。已知该问题无解,让我们来观察将发生什么:

 求解器 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更好地理解系统在接近破坏载荷时的行为表现,这些信息会非常有价值。

]]>
//www.denkrieger.com/blogs/load-ramping-nonlinear-problems/feed/ 1
求解非线性稳态有限元问题 //www.denkrieger.com/blogs/solving-nonlinear-static-finite-element-problems //www.denkrieger.com/blogs/solving-nonlinear-static-finite-element-problems#comments Tue, 19 Nov 2013 16:32:20 +0000 http://com.staging.comsol.com/blogs/?p=120511 本篇博客中,我们将简要介绍求解非线性稳态有限元问题的算法,并通过一个非常简单的一维有限元问题来演示这些内容,即我们在“求解线性稳态有限元模型”博客中所讨论的那个问题。

与刚性壁相连的弹簧系统

考虑下图所示的系统:弹簧的一端与刚性壁相连,对另一端施加应力。弹簧的刚度可表示为关于其拉伸距离的方程: ,即弹簧的刚度随弹簧拉伸呈指数增长。

弹簧的一端与刚性壁相连,在另一端施加力

现需求出弹簧受力端的位移。与之前在线性 问题中的处理类似,我们可将描述非线性 有限元问题中某一节点受力平衡的方程写成如下形式:

f(u)=p-k(u)u=p-exp(u)u

 

在本案例中,只有弹簧的刚度和解有关;但在更多情况下,非线性问题中的载荷和单元的属性都可以任意依赖于解。

绘制上述方程,并请记住我们希望求出 使得

非线性有限元问题的函数

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

问题的一次 Newton-Raphson 迭代

不难发现,我们又一次采取初始猜测: ,并计算方程 ,以及它的导数 。 从而得到 。通过检验发现这不是解,因为 。 但是如果继续使用 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 Multiphysics 中的阻尼算子
其中 表示阻尼因子,且 。 当 即为阻尼 增加;当 时问题无阻尼。我们较喜欢采用这一方法,因为搜索过程仅需要 COMSOL 来计算 ,而且与计算导数 和其倒数 相比,计算成本要低。

需要着重强调的是该阻尼项没有直接的物理解释。尽管这种算法能有效改善收敛,但是通过检验阻尼因子只能收集到极少量的物理信息。此外,尽管 COMSOL 允许您手动修改阻尼因子,但很难借助模型中的物理知识或信息来操作。我们通过人为干预计算得到的结果很难超过缺省的阻尼算法。不过,当缺省的阻尼 Newton-Raphson 方法收敛缓慢或完全不收敛时,还可以根据问题的物理场选择其他一些表现更为优异的技巧。

为什么非线性问题会不收敛

求解非线性问题向来较为困难,因为上述求解过程可能在许多情况下并不收敛。尽管 Newton-Raphson 方法失效的情况很多,但在实际操作中可以将不收敛归纳为以下几种情况:

情形 1 : 初始条件与解距离太远

首先考虑之前的非线性问题,但选择不同的起始点,例如 。 如下图所示,如果我们选择任意初始条件 ,那么使用 Newton-Raphson 法将无法求解,因为 的导数不指向解。 的左侧区域无解,所以这些起始点在 Newton-Raphson 方法的收敛半径以外。即使存在解,对起始点的选择也可能造成 Newton-Raphson 方法无法收敛。所以与线性问题中一个被设定好的问题永远有解不同,非线性模型的收敛很大程度上依赖于初始条件的选择。我们会在后续博客中阐述如何选择合适的初始条件。

非线性模型的初始条件距离解过远,造成收敛失败

情形 2 : 问题无解

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

弹簧被拉伸时刚度减小

情形 3 : 问题不平滑且无法求导

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

虑材料属性中存在不连续性
总结一下,截至目前我们已经介绍了使用阻尼 Newton-Raphson 法求解非线性有限元问题,并讨论了所使用的收敛准则。同时还介绍了几种算法失效的情况,包括:

  • 选择的初始条件离解太远
  • 设定的问题无解
  • 定义的问题不平滑且不可微

读取 COMSOL 日志文件

日志文件

我们即将讨论阐述以上问题的几种方式,但是在此之前先来看一个代表性的非线性有限元问题的日志文件。以下是一个几何非线性结构力学问题的日志文件(已添加行号):

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

注释

  • 第 1 行报告了求解器的种类和开始时间。
  • 第 2 行报告了软件正在下达指令给非线性系统求解器。
  • 第 3 行以自由度数的形式报告了问题的大小。
  • 第 4 行报告了待求有限元矩阵的种类。
  • 第 5-6 行报告了缩放比例。在本案例中,位移场的尺寸是 1 m,对解的期望级数较为合适。
  • 第 7-13 行报告了经过六次 Newton-Raphson 迭代后解收敛。第一列报告了迭代次数,第二列报告了定义收敛所采用的误差估计。收敛准则的缺省值为 0.001 。第三列显示了前两步中使用的阻尼,而第 3-6 步无阻尼。
  • 第 14-16 行报告了求解时间和内存要求。

现在您应该已经了解 COMSOL 如何求解非线性稳态有限元问题,以及怎样读取日志文件。

]]>
//www.denkrieger.com/blogs/solving-nonlinear-static-finite-element-problems/feed/ 2
线性方程组的解:直接和迭代求解器 //www.denkrieger.com/blogs/solutions-linear-systems-equations-direct-iterative-solvers //www.denkrieger.com/blogs/solutions-linear-systems-equations-direct-iterative-solvers#comments Mon, 11 Nov 2013 15:07:25 +0000 http://com.staging.comsol.com/blogs/?p=101201 本篇博客中,我们将向您介绍使用 COMSOL 求解任何有限元问题时,其中所用的两类线性方程组的求解算法。这些信息与理解求解器的内部工作原理,以及内存使用如何随问题大小变化等相关。

线性静态有限元问题

让我们考虑一个包含三个节点和三个单元的线性静态有限元问题:

包含三个单元和三个节点的线性静态有限元问题示例

每个单元由两个节点约束。其中一个节点位于刚性壁处,我们知道这里的位移是 0,因此无需求解该节点。正如我们在之前一篇有关求解线性静态有限元问题的博客中读到的,我们可以为每个节点编写出一个力的平衡方程:

f_{u_1} = k_3 (u_2-u_1)-k_2 (u_1-0)

 

f_{u_2} = p-k_3 (u_2-u_1)-k_1 (u_2-0)

 

而且,我们可以这样写:

\begin{Bmatrix} f_{u_1} \\ f_{u_2} \end{Bmatrix}=\begin{Bmatrix} 0 \\ p \end{Bmatrix}-\begin{bmatrix} k_2+k_3 && -k_3 \\ -k_3 && k_1+k_3 \end{bmatrix}\begin{Bmatrix} u_1 \\ u_2 \end{Bmatrix}

 

或者更加简洁的形式:

\bf{f(u)=b-Ku}

 

我们可以使用 Newton-Raphson 迭代方法来求解此问题,由于这是一个线性静态问题,我们可以通过一次迭代求解,并使用 作为初始值,此时将得到如下解:

\mathbf{u}_{solution}=\mathbf{K^{-1}b}

 

现在,该问题仅包含两个未知项,或称自由度 (DOF),可以轻松通过笔算求解。但整体而言,您的矩阵通常会包含数千乃至数百万个 DOF,对上述方程的求解通常是整个问题中计算量最大的部分。当在计算机中求解此类线性方程组时,我们还应了解条件数的概念,这是一种测量解对载荷变化敏感性的方法。虽然 COMSOL 不会直接计算条件数(这样做的成本与求解问题相同),我们还是会提供条件数的相关项目。在用于求解线性方程组的数值方法中,我们就需要条件数。

我们有两个用于求解 的基础类算法:直接迭代方法。下面,我们将简要介绍这两类方法,它们的一般属性,以及相对表现。

直接方法

COMSOL 中使用的直接求解器是 MUMPSPARDISO,以及 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 会自动检测最佳求解器,无需用户进行任何操作。直接求解器使用的内存要高于迭代求解器,但更具鲁棒性。迭代求解器会逐步求解,如果需要,可以修改收敛容差。

]]>
//www.denkrieger.com/blogs/solutions-linear-systems-equations-direct-iterative-solvers/feed/ 9
选择合适的单元进行网格划分 //www.denkrieger.com/blogs/meshing-your-geometry-various-element-types //www.denkrieger.com/blogs/meshing-your-geometry-various-element-types#comments Mon, 04 Nov 2013 13:53:18 +0000 http://com.staging.comsol.com/blogs/?p=97551 在上一篇博客中,我们介绍了线性静态问题的网格划分注意事项。其中,网格收敛是一个关键概念,因为随着网格的细化,解将变得更加精确。这篇博客,我们将更加深入地探究:对于线性静态有限元问题,如何选择合适的网格进行网格收敛研究。

不同的单元类型

在之前的博客中,我们介绍了 4 种不同的三维单元类型:四面体、六面体、棱柱和金字塔形:

三维网格剖分单元类型;四面体、六面体、棱柱,以及金字塔形

这 4 种单元可以进行各种组合,对任何三维模型进行网格剖分。(对于二维模型,可以选择三角形和四边形单元。因为它只是三维的一个逻辑子集,不需要太多额外的解释,所以我们这里将不会进行过多介绍。)为什么要使用不同的单元,我们在上一篇文章中没有深入介绍。

不同单元类型的适用情形

对于 COMSOL Multiphysics 中的大部分物理场而言,四面体单元是默认的单元类型。四面体也称单纯形网格,简单讲就是,可以使用四面体单元对 任何 三维体进行网格划分,无论什么形状或拓扑结构。它们也是唯一一种可用于自适应网格细化的单元类型。因此,四面体单元通常是首要选择。

另外三种单元类型(六面体、棱柱和金字塔形)仅用于确实需要时。首先应该注意的是,这些单元并非总能划分具体几何。根据划分的算法,通常需要进行更多的用户输入来创建这类网格,因此在进行网格划分前,应该首先问一下自己为什么要这样划分。这里,我们将介绍使用六面体和棱柱单元的原因。金字塔形仅在需要在六面体和四面体网格之间创建一个过渡区域时使用。

在此,我们有必要介绍一些背景信息。在第一台电子计算机诞生之前,有限元方法背后的数学理论就已经得到了充分的发展。第一台运行有限元程序的计算机中布满了真空管和手工制作的电路,虽然后来的晶体管极大地改进了计算机,但 25 年前发明的超级计算机的时钟速度也不过与如今流行的一些配件(谷歌眼镜)相同。

最早求解的一些有限元问题在结构力学领域,早期程序主要是为一些内存极小的计算机编写的。因此,会使用一阶单元(通常使用特定的积分方案)来节省内存与时间。但在结构力学问题中,使用一阶四面体单元会带来严重的问题,而使用一阶六面体单元则可以得到精确的结果。

由于这些较早期的代码产物,现在,许多结构工程师仍然更喜欢使用六面体而非四面体单元。

事实上,在 COMSOL 中使用二阶四面体单元求解结构力学问题会得到精确的结果,与使用六面体单元的差别仅在于内存需求和求解时间。

在 COMSOL 中使用六面体和棱柱单元的主要是因为它们可以极大地降低网格中的单元数。这些单元可能有极高的长宽比(最长边与最短边的比例),而用于创建四面体网格的算法则会尽量保持长宽比接近一致。当您知道解在特定方向上会逐渐变化,或者您对这些区域中的精确解并不感兴趣,因为您知道感兴趣的结果在模型的其他位置时,使用具有高长宽比的六面体和棱柱单元较为合理。

示例 1:轮毂

考虑一个轮毂示例,如下所示。

轮毂的网格示例

左边轮毂中的网格仅由四面体构成,而右边轮毂中的网格则包括四面体(绿色)、六面体(蓝色)、棱柱(粉色),以及位于这些网格过渡区的金字塔形网格。在孔和拐角处这些我们预期应力会更高的区域,混合网格使用了较小的四面体单元。辐条和轮毂附近使用了六面体和棱柱单元。峰值应力不会出现在轮毂或辐条处(至少在静载荷下),我们可以有把握地假定这些区域应力的变化相对较慢。四面体网格包含大约 145000 个单元和 730000 个自由度。混合网格包含接近 78000 个单元和大约 414000 个自由度,求解时间与内存使用都大约为原来的一半。混合网格需要大量的用户设定,而四面体网格基本上不需要用户设置。

注意:自由度和求解问题所需内存之间并没有直接的联系。这是因为不同单元类型的计算要求不同。二阶四面体中每个单元有 10 个节点,而二阶六面体则有 27 个。这说明使用六面体单元时,单个网格矩阵更大,对应的系统矩阵也更密集。求解所需的内存(和时间)与要求解的自由度数、节点间的平均连通性,以及其他一些因素有关。

示例 2:负载弹簧

另一个示例是对负载弹簧的结构分析,如下图所示。由于沿弹簧螺旋长度方向的变形几乎一致,因此采用一个能描述整体形状和截面,并且沿螺旋长度方向相对较延伸的网格单元是合理的。使用棱柱进行网格划分需要 504 个单元和 9526 个自由度,四面体单元则需要 3652 个单元和 23434 个自由度。因此,尽管单元数量相差很大,但自由度数差别不大。

负载弹簧的网格划分示例

示例 3:晶圆上的材料

使用六面体和棱柱单元的另外一个重要原因是,几何在一个方向上包含极薄的结构,例如晶圆上的外延材料层,冲压钣金件或夹层式复合材料。

下图所示为刻蚀在基底上的一层非常薄的轨迹材料。使用四面体单元对薄层进行划分,网格将被划分成非常小的单元,但如果使用棱柱单元划分,该区域的网格将被划分成非常薄的单元。只要几何结构中包含比零件中最大尺寸小 10-3 倍或更小的层,就应该使用六面体和棱柱单元进行网格划分。

晶圆示例上的材料

更多示例

此外,COMSOL 还提供了多种边界条件,可用于代替模拟薄层材料。例如在下列 4 个电磁仿真案例中,考虑了具有相对较高和较低电导率,以及相对较高和较低磁导率的薄层材料。

COMSOL 的大部分物理场接口中都包括类似的边界条件。使用这类边界条件可以避免对这些薄层进行完整网格划分的需求。

最后,上述讨论仅适用于线性静态有限元问题。对于非线性静态问题、时域或频率问题,应使用不同的网格划分方法。

结束语

总之,在开始对线性静态问题进行网格划分之前,应牢记以下注意事项:

  • 如果可能,请使用四面体网格;它们对用户交互的要求最低,并支持自适应网格细化
  • 如果你预先知道解在一个或多个方向上变化缓慢,那么应该在这些区域使用含较高长宽比的六面体或棱柱单元网格
  • 如果几何包括薄层材料,应该使用六面体或棱柱,或考虑使用边界条件来代替
  • 始终进行网格细化研究,并在细化网格时随时监控内存要求以及解的收敛
]]>
//www.denkrieger.com/blogs/meshing-your-geometry-various-element-types/feed/ 7
网格剖分时识别并解决其中的奇异性 //www.denkrieger.com/blogs/how-identify-resolve-singularities-model-meshing //www.denkrieger.com/blogs/how-identify-resolve-singularities-model-meshing#respond Tue, 29 Oct 2013 14:46:41 +0000 http://com.staging.comsol.com/blogs/?p=120451 阅读之前的一篇博客 “线性静态问题的网格剖分注意事项”,我们发现,有限元模型的解将能在网格细化的限度内收敛至真实解。不仅如此,我们还了解到,在误差较高的区域,可以通过自适应网格细化生成包含更小单元的网格,而不是简单地在整个模型内都使用较小的网格单元。在这篇博客中,我们将讨论有限元建模过程中一些常见的由模型奇异性造成的错误。

结构力学示例

让我们来分析在单轴应力作用下一个含方孔平板的受力情况。这与之前讲解过的一个示例较为类似,都是利用平板的对称性而只对其中的四分之一进行受力分析。

单轴应力下含方孔的平板

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

对平板几何执行自适应网格细化

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

以网格尺寸函数的形式绘制出的内拐角处的应力图

从上图中可以看出,不论网格细化到什么程度,应力值一直呈递增趋势。事实也是如此:因为模型中存在奇异性,所以尖角处的应力值不随网格细化程度而收敛。实际上这是完全准确的:尖角处的应力在理论上趋于无穷。每次您看到此类不收敛的行为表现时,就应当联想到模型中存在奇异性。

在实际的结构工程中,应极力避免产生尖锐的内角。当然您完全有理由说,可以把存在奇异性的尖角磨平来防止此类问题出现;这样,我们不难预测到模型中的应力将会随网格细化而收敛,但是在内角处仍需要插入大量的单元。所以接下来将介绍其他几种处理奇异性的方法。

将模型当作整体来研究

处理奇异性的一种方式就是忽略它们。有限元方法的一个重要特征就是它允许局部存在不准确,因为其出发点就是为了最小化模型中的整体误差。我们在上述模型中预估的应力值并不正确,但如果在离奇异性产生点约 2~3 个网格单元处求应力,那么结果将会收敛。因此,如果我们考虑远离奇异性产生处的应力将不会受奇异性影响。

对解求导

同样不可忽略的是,奇异性会对解的求导产生影响。在结构力学中,我们需求解位移场 ,进而从应变 推导应力,其中应变由位移场的变化率 定义。所以当把应力作为位移场的变化率来考虑时,就更清楚地解释了为什么在尖角处的应力趋向于无穷。然而,如果只考虑解 ,那么即便在尖角处也不会产生奇异性,结果将随网格细化而收敛。

在奇异性产生处求积分

另一个常见的允许奇异性存在的情况是,您仅对模型输出的积分值感兴趣。例如一个线性材料的总弹性势能可表示为:

U=\frac{1}{2}\int_{\Omega}\sigma:\epsilon d\Omega

如果在一个包含奇异性的域内对其求值,例如带有方孔的平板,那么积分会随网格细化迅速收敛,即便被积函数在域内任意一点不收敛。如果您希望得到模型内一个域(或边界)处的被积函数,那么您的模型中可以存在奇异性。无论是尖角还是圆角,积分值最终都会收敛至相同的值。这种情形常见于电磁学,此时设备的电感和电容分别被表示为域内电场和磁场的积分形式。

关于网格剖分和模型中奇异性的总结

总的来说有三类情形允许在模型中存在奇异性:

  1. 当您不需要奇异点处的解,而是在离奇异点一定距离处求解;
  2. 当您不需要在在奇异点处解求导;
  3. 当您在奇异点周围的域(范围)或边界内求积分值,包括对解的导数进行积分。

在上述几种情况中,您可以通过网格细化观察解的收敛。对于模型中其他不收敛的地方也应仔细观察,以保证您对结果的解读不会产生偏差。

最后,仍然有一些情况需要 精确求出奇异点附近的场,但是模型可能很大,我们无法为所有的边应用圆角。在这些情形下,我们可以使用 子模型法,或拆拆分模型法。在可能存在奇异性的大型模型中,这种方法会首先使用相对粗化的网格来找出解,然后将信息传递给包含更细化网格和更圆滑拐角的子模型。轮毂的子模型示例演示了该方法的使用。

]]>
//www.denkrieger.com/blogs/how-identify-resolve-singularities-model-meshing/feed/ 0