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(整数):10Real(实数):3.14159String(字符串):'hello_world'或"hello_world"Vector of Reals(实数向量):'1.0 2.5 3.0'Boolean(布尔值):true或false
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.,Steadyfor 稳态问题,Transientfor 瞬态问题).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官方网站的文档以获取最全面和最新的信息.