MOOSE仿真软件输入文件定义格式详解

Table of Contents

MOOSE (Multiphysics Object-Oriented Simulation Environment) 仿真软件采用一种名为 HIT (Hierarchical Input Text) 的分层文本格式作为其输入文件. 这种格式设计旨在提供一种人类可读, 易于编辑和组织的输入方式, 同时保持强大的灵活性以应对复杂的多物理场耦合问题.

本文将详细介绍MOOSE输入文件的基本语法, 核心构建块(Blocks)以及常用参数的定义格式.

1. 基本语法和结构

MOOSE输入文件由一系列的" 块" (Blocks)构成. 每个块都由方括号 [ ] 包围的块名来定义. 块内部可以包含参数定义或嵌套的其他子块.

基本规则:

  • 块(Block): 使用 [BlockName] 来开启一个块, 使用 [][../] 来闭合一个块. 嵌套块的定义方式为 [BlockName][SubBlockName].
  • 参数(Parameter): 在块内部, 参数以 parameter_name = value 的形式定义.
  • 注释(Comment):# 号开头, 从 # 到行尾的内容都将被视为注释.
  • 大小写敏感: 块名和参数名通常是大小写敏感的.
  • 数据类型: 参数值可以是多种类型, 包括:
    • Integer (整数): 10
    • Real (实数): 3.14159
    • String (字符串): 'hello_world'"hello_world"
    • Vector of Reals (实数向量): '1.0 2.5 3.0'
    • Boolean (布尔值): truefalse

2. 核心构建块(Mandatory Blocks)

一个最基本的MOOSE输入文件必须包含以下六个顶级块, 它们共同定义了一个完整的仿真问题.

2.1. [Mesh] - 网格块

[Mesh] 块用于定义仿真的几何区域和网格. 您可以从外部文件加载网格, 也可以在运行时生成简单的网格.

常用参数:

  • type: 指定网格生成器的类型.
  • file: 当=type = FileMesh=时, 指定外部网格文件的路径.
  • dim: 当=type = GeneratedMesh=时, 指定生成网格的维度(1, 2, 或 3).
  • nx, ny, nz: 在每个维度上的网格单元数量.
  • xmin, xmax, ymin, ymax, zmin, zmax: 网格的坐标范围.

示例:

  • 从文件加载网格:

    [Mesh]
      [file]
        type = FileMeshGenerator
        file = 'path/to/your/mesh.e'
      []
    []
    
  • 生成一个2D矩形网格:

    [Mesh]
      type = GeneratedMesh
      dim = 2
      nx = 20
      ny = 20
      xmax = 1.0
      ymax = 1.0
    []
    

2.2. [Variables] - 变量块

[Variables] 块用于定义求解的未知变量(例如, 温度, 位移, 浓度等).

常用参数:

  • 块名 (例如 [u]): 定义变量的名称.
  • type: 指定变量的类型, 通常是 MooseVariableFV (有限体积) 或 MooseVariableFE (有限元).
  • family: 有限元基函数的族 (e.g., LAGRANGE).
  • order: 有限元基函数的阶次 (e.g., FIRST, SECOND).
  • initial_condition: 变量的初始值.

示例:

[Variables]
  [temperature]
    type = MooseVariableFE
    family = LAGRANGE
    order = FIRST
    initial_condition = 300 # 初始温度为 300K
  []
[]

2.3. [Kernels] - 控制方程块

[Kernels] 块是定义偏微分方程(PDE)的核心部分. 每个Kernel代表PDE中的一项(例如, 时间导数项, 扩散项, 对流项等).

常用参数:

  • 块名 (e.g., [time_derivative]): 为Kernel指定一个唯一的名称.
  • type: 指定Kernel的类型, MOOSE内置了大量的Kernel类型 (e.g., TimeDerivative, Diffusion, Convection).
  • variable: 指定该Kernel作用于哪个变量.

示例 (求解瞬态热传导方程 \(\\frac{\\partial T}{\\partial t} - \\nabla \\cdot (k \\nabla T) = 0\)):

[Kernels]
  [time_derivative]
    type = TimeDerivative
    variable = temperature
  []
  [diffusion]
    type = Diffusion
    variable = temperature
    diffusivity = 'k' # k 在 [Materials] 块中定义
  []
[]

2.4. [BCs] - 边界条件块

[BCs] (Boundary Conditions) 块用于施加问题的边界条件.

常用参数:

  • 块名 (e.g., [left_wall]): 为边界条件指定一个唯一的名称.
  • type: 指定边界条件的类型 (e.g., DirichletBC - 第一类边界, NeumannBC - 第二类边界).
  • variable: 指定该边界条件作用于哪个变量.
  • boundary: 指定作用在哪个几何边界上 (通常是在网格文件中定义的边界ID或名称).
  • value: 边界条件的值.

示例:

[BCs]
  [left_wall]
    type = DirichletBC
    variable = temperature
    boundary = 'left' # 假设网格中有名为 'left' 的边界
    value = 500
  []
  [right_wall]
    type = NeumannBC
    variable = temperature
    boundary = 'right'
    value = 0 # 绝热边界
  []
[]

2.5. [Executioner] - 求解器设置块

[Executioner] 块用于配置求解过程, 包括选择求解类型(稳态或瞬态), 时间步长和非线性求解器参数等.

常用参数:

  • type: 求解器类型 (e.g., Steady for 稳态问题, Transient for 瞬态问题).
  • solve_type: 线性/非线性求解策略 (e.g., PJFNK - Preconditioned Jacobian-Free Newton-Krylov).
  • dt: 对于瞬态问题, 初始时间步长.
  • end_time: 对于瞬态问题, 仿真的结束时间.
  • petsc_options_iname, petsc_options_value: 设置底层PETSc求解器的详细参数.

示例:

[Executioner]
  type = Transient
  solve_type = PJFNK
  end_time = 100.0
  dt = 1.0

  petsc_options_iname = '-pc_type -ksp_rtol'
  petsc_options_value = 'lu       1e-6'
[]

2.6. [Outputs] - 输出块

[Outputs] 块控制仿真结果的输出格式和频率.

常用参数:

  • exodus: 设置为 true 以输出与ParaView等后处理软件兼容的Exodus II格式文件.
  • csv: 设置为 true 以输出CSV格式的后处理器数据.
  • interval: 对于瞬态问题, 指定输出结果的时间步间隔.

示例:

[Outputs]
  exodus = true
  csv = true
  interval = 5 # 每5个时间步输出一次结果
[]

3. 常用可选块

除了上述必须的块之外, 还有许多可选块可以用来定义更复杂的问题.

  • [Materials]: 定义材料属性, 如热导率, 密度, 弹性模量等. 这些属性可以在 [Kernels][BCs] 中被引用.

    [Materials]
      [thermal_conductivity]
        type = GenericConstantMaterial
        prop_names = 'k'
        prop_values = '1.2'
      []
    []
    
  • [Functions]: 定义空间或时间相关的函数, 可用于定义初始条件, 边界条件或材料属性.

    [Functions]
      [initial_temp_dist]
        type = ParsedFunction
        expression = '300 + 200 * x'
      []
    []
    
  • [GlobalParams]: 定义可在整个输入文件中使用的全局参数, 以减少重复输入.

    [GlobalParams]
      diffusivity_val = 1.5e-5
    []
    
    [Kernels]
      [diffusion]
        type = Diffusion
        variable = temperature
        diffusivity = ${diffusivity_val} # 使用 ${} 引用全局参数
      []
    []
    

4. 总结

MOOSE的输入文件格式通过其分层的块结构, 提供了一种清晰且模块化的方式来定义复杂的物理问题. 理解其核心块(Mesh, Variables, Kernels, BCs, Executioner, Outputs)的功能和语法是使用MOOSE进行仿真的第一步. 随着对软件的深入使用, 您将接触到更多高级和特定的块, 以解决您特定领域的科学和工程问题. 建议经常查阅MOOSE官方网站的文档以获取最全面和最新的信息.

Author: 青岛红创

Created: 2025-07-09 Wed 10:01