吾生有涯 学海无涯
析模有界 知识无界

OpenFOAM编程案例|02 程序参数

本文演示利用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之道

赞(0) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《OpenFOAM编程案例|02 程序参数》
文章链接:https://www.topcfd.cn/18690/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册