输入参数设计的核心理念
BOUT++框架通过模块化设计实现了物理问题研究与数值计算的解耦。这一设计允许研究人员专注于物理模型的构建,仅需修改example
目录下的模块即可开展研究,具体实现方式如下:
- 核心库独立编译:
libbout++.a
(主功能库)libpvode.a
(数值求解器)libpvpre.a
(预处理模块)
- 物理模块动态编译:用户物理模型编译为独立可执行文件,按需调用核心库
- 运行时参数配置:通过修改
BOUT.inp
文本文件调整超参数,无需重新编译
该架构支持三级修改机制:
- 初级修改:仅调整
BOUT.inp
参数文件与网格设置,适用于大多数物理场景研究 - 中级修改:重新编译
example
目录下的物理模型代码,用于扩展物理模块功能 - 高级修改:修改
src
源码并重新编译核心库,实现框架底层优化
这种分层修改机制虽然会略微增加可执行文件的大小,但显著降低了用户的时间成本和学习门槛。下文将重点解析BOUT.inp
文件在框架中的解析过程。
BOUT.inp文件
读取机制
默认输入文件为BOUT.inp
,用户可通过运行时-f
参数指定其他配置文件。框架的读取调用链如下:
- 入口函数:
main()
(位于boutmain.hxx
/physicsmodel.hxx
)- →
BoutInitialise()
(bout++.cxx
)
- 配置读取层:
OptionsReader::read()
(sys/optionsread.cxx
)- →
OptionINI::read()
(sys/options/options_ini.cxx
)
在OptionINI::read()
中,框架会解析配置文件内容并存储至options
数据结构。值得注意的是,Option
类通过静态变量root
实现全局配置共享——该变量在首次调用时实例化,后续所有操作均基于此单例对象。
文件格式
以下以elm-pb/eigen/BOUT.inp为例子,该文件格式都是通过OptionINI::read()
来进行解析的。
# Solver settings
[solver]
type = slepc
[solver:advance]
type = karniadakis
timestep = 1e-2
section部分
以[]
括起来的内容,可以使用:
来进行子section的区分,如[section:subsection]
变量部分
name = string
注释部分
使用#
来进行注释。
输入参数设计的核心理念
BOUT++框架通过模块化设计实现了物理问题研究与数值计算的解耦。这一设计允许研究人员专注于物理模型的构建,仅需修改example
目录下的模块即可开展研究,具体实现方式如下:
- 核心库独立编译:将框架主体编译为以下静态库文件:
- libbout++.a
- libpvode.a
- libpvpre.a
- 物理模块编译成单独的可执行文件,调用独立的库文件。
- 运行时可以修改文本文件BOUT.inp作为超参。
因此bout产生了三级的修改:最小的是只修改BOUT.inp文件,大部分物理问题使用对应的物理代码,修改该文件和网格就可以完成物理研究;其次是修改example中的代码,此时需要重新编译example中的内容,在需要增添物理部分的时候便可以使用该方法;最后是修改BOUT主体代码,此时就需要重新编译src中的内容生成新的库文件。
使用这种可分级的修改能虽然一定程度上增大了可执行文件的大小,但是节省了使用的时间成本和学习成本。
本文章主要研究BOUT.inp文件是如何在bout工程代码中被解析的。
读取BOUT.inp文件
默认输入文件名字为BOUT.inp,可以通过运行时的-f参数来改为其他文件。其调用关系如下:
- boutmain.hxx或bout/physicsmodel.hxx:
main()
函数- bout++.cxx:
BoutInitialise()
函数- sys/optionsread.cxx:
OptionsReader::read()
函数- sys/options/options_ini.cxx:
OptionINI::read()
函数
- sys/options/options_ini.cxx:
- sys/optionsread.cxx:
- bout++.cxx:
在最后的OptionINI::read()
函数中会识别BOUT.inp文件中的内容并复制到数据结构options中。在Option类中有一个静态变量root,在第一次调用时实例化,并在所有地方共享该变量。
解析BOUT.inp文件
- 整理列举每一个BOUT.inp中的值,整理和分析其中的作用
- 对比elm-pb和eigen-box的区别
- 列举所有调用slepc接口的函数,并整理
运行新的eigen-elm-pb
输入梳理
使用脚本遍历BOUT中所有的OPTION