ofsp2026 09_keyword

Created time
Mar 28, 2026 05:25 AM
type
Post
status
Published
date
Mar 28, 2026
slug
ofsp2026 09_keyword
summary
tags
ofsp2026
OpenFOAM
category
post
icon
password
Place
Last edited time
Mar 28, 2026 09:13 AM
📌
Important
访问 https://aerosand.cc 以获取最近更新。

0. 前言

让我们停下脚步,仔细想一下前一篇文章的项目。我们很难称它是按关键词读取参数,因为代码只是实现了机械读取。如果我们更改输入文件的关键词顺序,就会导致传入参数的不一致(读者可以尝试更换 ofspProperties 文件中关键词顺序,重新运行代码,查看结果)。
我们来考虑一下如何真正的按关键词读取。
本文主要讨论
了解 OpenFOAM 读取参数的方式
使用 C++ 方式实现按关键词读参
编译运行 keyword 项目

1. OpenFOAM 读参

📌
Tip
OpenFOAM 的读参方式随着架构更新已经发生了较大的变化。我们以较早版本的代码为例,方便读者理解。
我们看一下 OpenFOAM 中一些简单类型的参数的读取语句是什么样子的。
laplacianFoam/createFields.H 文件中可以看到以下语句
虽然 lookup() 的语法在 OpenFOAM 中有点过时,但是相对来说非常直观。
简单概括如下,
  • IOdictionary 是和文件读取相关的类
  • IOdictionary 基于外部文件 transportProperties 构造对象 transportProperties
  • 对象 transportProperties 具有 IOdictionary 类的方法,比如 lookup()
  • 也就是说,对象 transportProperties 可以使用 lookup() 方法
我们尝试自己动手模仿,实现 OpenFOAM 的这个读取功能。

2. 实现按关键词读参

2.1. 项目准备

终端输入命令,建立本项目
为该项目新建文件,最终项目架构如下

2.2. 自开发 IOdictionary

我们设想,自开发的 IOdictionary 类也可以有类似 OpenFOAM 的语法表达。简化的形式如下
其中,对象 ofspProperties 是类 IOdictionary 基于文件名(路径) ofspProperties 的实例化。对象 ofspProperties 可以使用类 IOdictionary 中定义的方法 lookup()
为了实现自开发类 IOdictionary 可以读取外部文件的功能,我们考虑仍然使用 C++ 原生 fstream 类。
类的声明 IOdictionary.H 内容如下
📌
Tip
尽量贴合 OpenFOAM 的代码风格。
类的定义 IOdictionary.C 内容如下
我们还需要定义库 Make
文件 IOdictionary/Make/files 内容如下
因为没有使用到其他库,文件 IOdictionary/Make/options 留空即可。
终端输入命令,编译生成动态库

2.3. 主项目

主源码 ofsp_09_keyword.C 内容如下
我们还需要定义项目 Make
文件 ofsp_09_keyword/Make/files 内容如下
文件 ofsp_09_keyword/Make/options 内容如下

2.5. 编译运行

我们在该项目的根目录下提供类似 OpenFOAM 字典的文件。ofspProperties 文件内容如下(路径为 /ofsp/ofsp_09_io/ofspProperties
终端输入命令,编译运行该项目
终端输出内容如下
即使我们调整外部文件字典中的参数顺序,例如
无需重新编译项目,直接运行该项目
终端输入命令
最后的结果是一样的。

3. 小结

从上面的讨论可见,重构项目的思路基本正确。但是读取得到的参数类型统一是 string 类型,还是不符合我们最后的要求,我们需要进一步开发功能特性。
本文完成讨论
了解 OpenFOAM 读取参数的方式
使用 C++ 方式实现按关键词读参
编译运行 keyword 项目
 

支持我们

📌
Tip
希望这里的分享可以对坚持、热爱又勇敢的您有所帮助。
如果这里的分享对您有帮助,您的评论或赞助将对本系列以及后续其他系列的更新、勘误、迭代和完善都有很大的意义,这些行动也会为后来的新同学的学习有很大的助益。
赞助打赏时的信息和留言将用于展示和感谢。
Alipay
Alipay
 
Copyright @ 2026 Aerosand
  • OpenFOAM 开发代码 :GPL v3
 
 
Loading...