尽可能简单的示例

Example 1 : As Simple as it Gets

问题陈述

该例子描述了创建基本输入文件以及利用MOOSE解决问题所需的六个部分。

考虑三维域\(\Omega\)中的稳态扩散方程:

\[\begin{equation}\label{M-1} -\nabla \cdot \nabla u = 0 \in \Omega \end{equation}\]

底部\(u=1\),顶部\(u=0\),其余边界则是\(\nabla u \cdot \hat{n}=0\)

该方程的弱形式,用内部相乘符号表示为:\(\nabla \phi_i , \nabla u_h = 0 \ \forall \ \phi_i\),其中\(\phi_i\)是测试函数,\(u_h\)是有限元的解。

输入文件

基本的输入文件包含六部分:

  • 网格

  • 变量

  • 内核(kernels)

  • 边界条件(BCs)

  • Executioner

  • 输出

网格

此处使用的是预生成的网格文件,如何生成后续教程会讲。

1
2
3
[Mesh]
file = 'mug.e'
[]

变量

对于这个简单的问题,只有一个变量,“扩散”,which represents u from the continuous problem。 扩散变量近似是线性拉格朗日形状函数。

1
2
3
4
5
6
[Variables]
[./diffused]
order = FIRST
family = LAGRANGE
[../]
[]

内核

问题陈述的弱形式is represented by 扩散内核对象。一般而言,用户使用的是基于MOOSE的客制化内核,但MOOSE已经有定义好的扩散内核。 为了使用特定的内核,需要在输入文件里定义一个sub-section,标记为"diff" (这是由用户任意定义的名字),这将利用扩散内核,并对之前定义的变量"diffused"起作用。

1
2
3
4
5
6
[Kernels]
[./diff]
type = Diffusion
variable = diffused
[../]
[]

边界条件

边界条件的定义类似于内核。对于这个问题,需要两个狄利克雷边界条件。在输入文件中,两个边界条件分别使用MOOSE提供的DirichletBC对象指定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[BCs]
[./bottom]
# 用户选择的任意名字
type = DirichletBC
variable = diffused
boundary = 'bottom' # 这必须匹配网格文件中的边界命名
value = 1
[../]

[./top]
# arbitrary user-chosen name
type = DirichletBC
variable = diffused
boundary = 'top' # 这必须匹配网格文件中的边界命名
value = 0
[../]
[]

请注意,这个问题(左侧和右侧)的诺伊曼边界条件是隐含满足的,我们没有必要定义。然而,对于非零诺伊曼或其他边界条件,许多内置对象由MOOSE提供(例如NeumannBC)。您还可以创建从MOOSE中的现有对象派生的自定义边界条件。

Executioner

要解决的问题类型和解决方法在执行者块中定义。这个问题是稳态的,将使用稳态执行器,并将使用默认解决方法Preconditioned Jacobain Free Newton Krylov。

1
2
3
4
[Executioner]
type = Steady
solve_type = 'PJFNK'
[]

输出

有两种输出的类型:输出到屏幕上(控制台)以及输出到Exodus II 文件(exodus)。 设定“file_base”参数是可选的,在本例中,它强制命名输出文件“out.e” ("e"是使用Exodus II格式的扩展名)。

1
2
3
4
[Outputs]
execute_on = 'timestep_end'
exodus = true
[]

运行该问题

1
2
3
cd ~/projects/moose/examples/ex01_inputfile
make -j8
./ex01-opt -i ex01.i