MOOSE框架
理论:用残差描述物理
概述
MOOSE和其他开源有限元软件有什么不同?
在于它不是“分析软件”,而是“用来开发分析软件的框架”。MOOSE(Multiphysics Object Oriented Simulation Environment)由美国爱达荷国家实验室开发,网格处理交给libMesh,线性和非线性求解器交给PETSc,使用者只需编写控制方程的“残差”。例如热传导,把扩散项和热源项分别写成Kernel,在输入文件中列出,MOOSE就会把它们相加求解。增加物理场时也只需添加Kernel,热、结构、化学反应等所有未知量作为一个非线性方程组联立,用牛顿法一起求解。模拟核燃料行为的BISON等众多研究用求解器都建立在它之上。
残差与牛顿法
ψᵢ为试函数,k(u)为依赖于解的系数,f为源项,J为雅可比矩阵。MOOSE可以组装(近似的)J,也可以用JFNK(无雅可比牛顿-克雷洛夫)法,不形成矩阵而用残差差分计算J·v。
用制造解法(MMS)验证
预先设定解,反推满足它的源项f并施加。由单元数N加倍时误差之比求收敛阶p,与理论值(线性单元函数值为2,梯度为1)比较。
为核燃料而生的框架
MOOSE的开发始于2008年前后,爱达荷国家实验室为模拟核燃料行为而启动。燃料芯块中的热、变形、裂变气体释放和材料变化相互影响,依次运行多个独立程序的方法难以处理这种强耦合。于是采用了“物理写成残差,联立与求解交给框架”的设计,并于2014年作为开源软件公开。
算例
例1:用制造解sin(πx)确认收敛阶
在区间[0, 1]上用线性单元求解−u″ = f,两端u = 0,精确解为sin(πx)。
| 单元数N | L2误差 | 梯度误差 | L2阶 | 梯度阶 |
|---|---|---|---|---|
| 4 | 3.93×10⁻² | 0.499 | — | — |
| 8 | 9.92×10⁻³ | 0.251 | 1.99 | 0.99 |
| 16 | 2.49×10⁻³ | 0.126 | 2.00 | 1.00 |
| 32 | 6.22×10⁻⁴ | 0.0630 | 2.00 | 1.00 |
单元尺寸每减半,L2误差变为1/4,梯度误差变为1/2,得到理论上的收敛阶。
把节点值与精确解比较,即使4个单元误差也在10⁻⁷以下。这是不是说已经足够精确了?
这是一维线性单元特有的性质,很容易被误导。在这个问题中只有节点值几乎与精确解一致(超收敛),而节点之间的值和梯度,如表所示4个单元时L2误差有4×10⁻²,梯度误差有0.5。只看节点值,即使单元实现有错也可能发现不了。在MOOSE中,基本做法是用L2范数、H1半范数等积分量评价误差,并按单元加密2倍、4倍时的收敛阶判断。阶数偏离理论值时,应怀疑Kernel的符号、积分点的处理或边界条件的施加方式。
例2:在非线性扩散中比较牛顿法与Picard迭代
−(k(u)u′)′ = 10,k = 1 + u²,两端u = 0,32个单元。比较残差范数降到10⁻¹⁰以下所需的迭代次数。
| 求解方法 | 迭代次数 | 最大值u |
|---|---|---|
| 牛顿法(正确组装雅可比矩阵) | 5 | 0.957 |
| Picard迭代(k固定为上一次的值) | 12 | 0.957 |
| 参考:k = 1(线性) | 1 | 1.250 |
接近收敛时,牛顿法的残差按平方下降(7×10⁻³ → 4×10⁻⁶),而Picard迭代每次大约只下降到1/10。由于k随u增大,最大值从线性情况的1.25降到0.957。
既然牛顿法总是更有利,为什么还会使用分开依次求解的方法?
牛顿法的弱点在于正确构造雅可比矩阵的工作量,以及初值离解较远时容易发散。想沿用各物理场已有的程序,或者耦合较弱、交换几次就能收敛时,分离式方法更简单也更快。MOOSE两者都支持:强耦合的变量放进一个牛顿系统,弱耦合或时间尺度不同的物理场可以用MultiApp机制分别求解并交换数据。雅可比矩阵不准确会失去二次收敛,迭代次数会增加到接近Picard,因此MOOSE还提供与差分雅可比比较、找出Kernel导数错误的功能。
入门流程
- 用conda等搭建环境,编译MOOSE并运行一次测试。
- 用输入文件运行附带的热传导等例题,掌握Kernel、边界条件和Executioner的写法。
- 编写自己的Kernel后,用制造解确认收敛阶。
- 非线性问题中观察牛顿法的迭代次数,确认雅可比矩阵是否正确。
- 把验证过的算例登记为测试,每次修改时自动运行。
“收敛阶停在1.5”
把新的边界条件实现为Kernel并用制造解检验时,常常出现L2阶不是2、而是停在1.5左右的情况。原因多是一些小的不一致:边界项没有在与单元内部相同的积分点上计算,或者源项用节点值近似。只看结果图会觉得很合理,所以不测收敛阶就发现不了这类错误。这正是MOOSE开发重视验证测试的原因。
常见错误
错误与对策
| 错误 | 后果 | 对策 |
|---|---|---|
| 只用节点值验证 | 漏掉实现错误 | 用L2、H1范数看收敛阶 |
| 雅可比矩阵错误 | 牛顿迭代次数增加 | 与差分雅可比比较 |
| Kernel符号错误 | 发散或解的方向相反 | 用制造解确认 |
| 初值离解太远 | 牛顿法发散 | 用载荷增量或时间推进逼近 |
| 把弱耦合也放进一个系统 | 计算量大 | 用MultiApp分离 |
我想了解相关内容。