本文演示利用OpenFOAM中的argList
类为创建的程序构造命令参数。
从提供的argc和argv参数中提取命令参数和选项。如下面的命令执行方式:
program -listFiles (*.txt)
命令中,program为命令的名称,listFiles及(*.txt)
均为命令的参数。本案例的目的即为构造能够携带参数的应用程序。
1 文件准备
本案例的文件结构如前面的案例相同。
采用下面的命令创建文件与文件夹。
cd $FOAM_RUN
mkdir demo2
cd demo2
touch demo2.C
mkdir Make
cd Make
touch files options
cd ..
文件组织结构如下图所示。
-
修改 files
文件的内容
demo2.C
EXE = demo2
-
修改 options
文件的内容
EXE_INC =
-I$(FOAM_SRC)/finiteVolume/lnInclude
-I$(FOAM_SRC)/meshTools/lnInclude
EXE_LIBS =
-lfiniteVolume
-lmeshTools
2 添加参数
编辑源代码deom2.C
,如下所示。
#include
int main(int argc, char *argv[])
{
// 定义程序的使用说明
argList::addNote(
"输入参数:n"
"---------------------n"
"参数1:someWordn"
"参数2:someScalarn");
// 构建参数
Foam::argList args(argc, argv);
return 0;
}
这段代码很简单,编译运行如下图所示。
可以看到上面的简单代码为程序添加了帮助文档,可以通过程序名后面带参数-help
来查看。
下面继续完善代码,为程序添加两个参数。
#include
int main(int argc, char *argv[])
{
// 定义程序的使用说明
argList::addNote(
"输入参数:n"
"---------------------n"
"参数1:someWordn"
"参数2:someScalarn");
// 准备参数列表
argList::noParallel();
argList::validArgs.append("someWord");
argList::validArgs.append("someScalar");
Foam::argList args(argc, argv);
// 读取参数
const word someWord = args[1]; //第一个参数
//原始程序,新版本将argRead函数废弃了,改用get函数
// const scalar someScalar = args.argRead(2);
const scalar someScalar = args.get(2); //第二个参数
Info << "获取参数:" << endl
<< "someWord:" << someWord << endl
<< "someScalar:" << someScalar << endl;
return 0;
}
编译运行如下图所示。
提示需要输入两个参数。将运行命令改成./demo2 hello 2
,如下图所示,可以看到程序顺利运行。
3 添加选项
可以为程序添加可选参数。如下代码。
#include
int main(int argc, char *argv[])
{
// 定义程序的使用说明
argList::addNote(
"输入参数:n"
"---------------------n"
"参数1:someWordn"
"参数2:someScalarn");
// 准备参数列表
argList::noParallel();
argList::validArgs.append("someWord");
argList::validArgs.append("someScalar");
// 增加一个选项参数,调用方式为-dict word
// 参数依次为:选项名、参数、使用说明
argList::addOption(
"dict",
"word",
"额外的字典路径(非当前路径):");
// 增加一个布尔选项,调用形式为-someSwitch
argList::addBoolOption(
"someSwitch",
"从A切换到B");
// 增加一个整数选项,调用形式为-someInt label
argList::addOption(
"someInt",
"label"
"可选整数");
// 创建一个参数对象args
Foam::argList args(argc, argv);
// 读取参数someWord及someScalar
const word someWord = args[1]; //第一个参数
const scalar someScalar = args.get( 2); //第二个参数
// 输出参数信息
Info << "获取参数:" << endl
<< "someWord:" << someWord << endl
<< "someScalar:" << someScalar << endl;
// 读取选项-dict的信息
fileName dictPath("defaultDict");
if (args.found("dict"))
{
args.readIfPresent("dict", dictPath);
Info << "获取一个字典路径" << nl;
}
Info << "从字典文件:[" << dictPath << "]中读取字典" << endl;
// 读取布尔选项信息,并输出信息
const bool someConstBool = args.found("someSwitch");
Info << "开关设置为:" << someConstBool << endl;
// 读取整x选项参数并输出参数值
label someInt(0);
args.readIfPresent("someInt", someInt);
Info << "整数选项值:" << someInt << endl;
Info << "-------End-------" << endl;
return 0;
}
注意参数是必选的,可选参数可以不选。
编译后输入下面的命令./demo2 hello 2 -dict defaultDict1 -someSwitch -someInt 2
,运行如下图所示。这里命令参数是随便输入的,仅为演示。
注意可选参数可以不选,如下面的命令./demo2 hello 2 -dict defaultDict1 -someSwitch
。
而且可选参数的位置可以随意调换,如下图为命令./demo2 hello 2 -dict defaultDict1 -someInt 3 -someSwitch
的运行结果。
可选参数还可以放到必选参数的前面,如运行命令./demo2 -someInt 3 hello 3
,结果如下图所示。
注意,源文件中读参数函数已经修改为最新OpenFOAM所支持的函数,被替换的函数如下表所示。
老版本函数(被废弃) | 新版本函数 |
---|---|
optionFound | found |
optionReadIfPresent | readIfPresent |
被废弃的函数目前依然可以使用,只是在编译过程中会有警告信息,不建议使用老版本函数,除了更复杂以外,还很有可能在未来更高的版本中被彻底放弃。
(本文程序在OpenFOAM 2112下运行通过。在V9版本下需要进行小幅修改。强烈建议手撸代码,因此文中的源代码就不提供了。)
(完毕)
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册