BOUT代码梳理其一:输入参数

输入参数设计的核心理念

BOUT++框架通过模块化设计实现了物理问题研究与数值计算的解耦。这一设计允许研究人员专注于物理模型的构建,仅需修改example目录下的模块即可开展研究,具体实现方式如下:

  • 核心库独立编译
    • libbout++.a(主功能库)
    • libpvode.a(数值求解器)
    • libpvpre.a(预处理模块)
  • 物理模块动态编译:用户物理模型编译为独立可执行文件,按需调用核心库
  • 运行时参数配置:通过修改BOUT.inp文本文件调整超参数,无需重新编译

该架构支持三级修改机制:

  1. 初级修改:仅调整BOUT.inp参数文件与网格设置,适用于大多数物理场景研究
  2. 中级修改:重新编译example目录下的物理模型代码,用于扩展物理模块功能
  3. 高级修改:修改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()函数

在最后的OptionINI::read()函数中会识别BOUT.inp文件中的内容并复制到数据结构options中。在Option类中有一个静态变量root,在第一次调用时实例化,并在所有地方共享该变量。

解析BOUT.inp文件

  • 整理列举每一个BOUT.inp中的值,整理和分析其中的作用
  • 对比elm-pb和eigen-box的区别
  • 列举所有调用slepc接口的函数,并整理

运行新的eigen-elm-pb

输入梳理

使用脚本遍历BOUT中所有的OPTION

文章标题:BOUT代码梳理其一:输入参数
文章作者:Myron
转载链接:https://sunwaybits.tech/bout-input-file-code-logic.html
暂无评论

发送评论 编辑评论


				
😃
😄
😁
😆
😅
😂
🤣
🥲
😊
😇
🙂
🙃
😉
😌
😍
🥰
😘
😗
😙
😚
😋
😛
😝
😜
🤪
🤨
🧐
🤓
😎
🥸
🤩
🥳
😏
😒
😞
😔
😟
😕
🙁
😣
😖
😫
😩
🥺
😢
😭
😤
😠
😡
🤬
🤯
😳
🥵
🥶
😱
😨
😰
😥
😓
🤗
🤔
🤭
🤫
🤥
😶
😐
😑
😬
🙄
Emoji
上一篇
下一篇