MOOSE框架

分类:开源CAE | 2026-10-02 改写
CAE visualization for moose framework theory - technical simulation diagram
MOOSE框架

理论:用残差描述物理

概述

🙋

MOOSE和其他开源有限元软件有什么不同?

🎓

在于它不是“分析软件”,而是“用来开发分析软件的框架”。MOOSE(Multiphysics Object Oriented Simulation Environment)由美国爱达荷国家实验室开发,网格处理交给libMesh,线性和非线性求解器交给PETSc,使用者只需编写控制方程的“残差”。例如热传导,把扩散项和热源项分别写成Kernel,在输入文件中列出,MOOSE就会把它们相加求解。增加物理场时也只需添加Kernel,热、结构、化学反应等所有未知量作为一个非线性方程组联立,用牛顿法一起求解。模拟核燃料行为的BISON等众多研究用求解器都建立在它之上。

残差与牛顿法

$$ R_i(u) = \int_\Omega \left( k(u)\,\nabla\psi_i\cdot\nabla u - \psi_i f \right) d\Omega = 0,\qquad J_{ij} = \frac{\partial R_i}{\partial u_j},\qquad J\,\delta u = -R $$

ψᵢ为试函数,k(u)为依赖于解的系数,f为源项,J为雅可比矩阵。MOOSE可以组装(近似的)J,也可以用JFNK(无雅可比牛顿-克雷洛夫)法,不形成矩阵而用残差差分计算J·v。

用制造解法(MMS)验证

$$ u_{ex} = \sin(\pi x),\quad f = \pi^2 \sin(\pi x),\qquad p = \log_2 \frac{e_{N}}{e_{2N}} $$

预先设定解,反推满足它的源项f并施加。由单元数N加倍时误差之比求收敛阶p,与理论值(线性单元函数值为2,梯度为1)比较。

Coffee Break 随笔闲谈

为核燃料而生的框架

MOOSE的开发始于2008年前后,爱达荷国家实验室为模拟核燃料行为而启动。燃料芯块中的热、变形、裂变气体释放和材料变化相互影响,依次运行多个独立程序的方法难以处理这种强耦合。于是采用了“物理写成残差,联立与求解交给框架”的设计,并于2014年作为开源软件公开。

算例

例1:用制造解sin(πx)确认收敛阶

在区间[0, 1]上用线性单元求解−u″ = f,两端u = 0,精确解为sin(πx)。

单元数NL2误差梯度误差L2阶梯度阶
43.93×10⁻²0.499——
89.92×10⁻³0.2511.990.99
162.49×10⁻³0.1262.001.00
326.22×10⁻⁴0.06302.001.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
牛顿法(正确组装雅可比矩阵)50.957
Picard迭代(k固定为上一次的值)120.957
参考:k = 1(线性)11.250

接近收敛时,牛顿法的残差按平方下降(7×10⁻³ → 4×10⁻⁶),而Picard迭代每次大约只下降到1/10。由于k随u增大,最大值从线性情况的1.25降到0.957。

🙋

既然牛顿法总是更有利,为什么还会使用分开依次求解的方法?

🎓

牛顿法的弱点在于正确构造雅可比矩阵的工作量,以及初值离解较远时容易发散。想沿用各物理场已有的程序,或者耦合较弱、交换几次就能收敛时,分离式方法更简单也更快。MOOSE两者都支持:强耦合的变量放进一个牛顿系统,弱耦合或时间尺度不同的物理场可以用MultiApp机制分别求解并交换数据。雅可比矩阵不准确会失去二次收敛,迭代次数会增加到接近Picard,因此MOOSE还提供与差分雅可比比较、找出Kernel导数错误的功能。

入门流程

  1. 用conda等搭建环境,编译MOOSE并运行一次测试。
  2. 用输入文件运行附带的热传导等例题,掌握Kernel、边界条件和Executioner的写法。
  3. 编写自己的Kernel后,用制造解确认收敛阶。
  4. 非线性问题中观察牛顿法的迭代次数,确认雅可比矩阵是否正确。
  5. 把验证过的算例登记为测试,每次修改时自动运行。
Coffee Break 随笔闲谈

“收敛阶停在1.5”

把新的边界条件实现为Kernel并用制造解检验时,常常出现L2阶不是2、而是停在1.5左右的情况。原因多是一些小的不一致:边界项没有在与单元内部相同的积分点上计算,或者源项用节点值近似。只看结果图会觉得很合理,所以不测收敛阶就发现不了这类错误。这正是MOOSE开发重视验证测试的原因。

常见错误

错误与对策

错误后果对策
只用节点值验证漏掉实现错误用L2、H1范数看收敛阶
雅可比矩阵错误牛顿迭代次数增加与差分雅可比比较
Kernel符号错误发散或解的方向相反用制造解确认
初值离解太远牛顿法发散用载荷增量或时间推进逼近
把弱耦合也放进一个系统计算量大用MultiApp分离
🙋

我想了解相关内容。

关联模拟器

在本领域的交互式模拟器中体验理论

模拟器列表

相关分析领域

结构分析流体分析(CFD)热分析
本文评价
感谢您的反馈!
有帮助
更详细
报错
有帮助
0
更详细
0
报错
0