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
希望这里的分享可以对坚持、热爱又勇敢的您有所帮助。
如果这里的分享对您有帮助,您的评论或赞助将对本系列以及后续其他系列的更新、勘误、迭代和完善都有很大的意义,这些行动也会为后来的新同学的学习有很大的助益。
赞助打赏时的信息和留言将用于展示和感谢。

Copyright @ 2026 Aerosand
- 课程(文本、图片等):CC BY-NC-SA 4.0
- OpenFOAM 开发代码 :GPL v3
- 其他代码:MIT License
Loading...