你的位置:众腾娱乐 > 关于众腾娱乐 > OpenFOAM编程案例|02 程序参数
OpenFOAM编程案例|02 程序参数
发布日期:2024-07-22 04:38    点击次数:178

本文演示利用OpenFOAM中的argList类为创建的程序构造命令参数。

从提供的argc和argv参数中提取命令参数和选项。如下面的命令执行方式:

program -listFiles \(*.txt\)

命令中,program为命令的名称,listFiles及\(*.txt\)均为命令的参数。本案例的目的即为构造能够携带参数的应用程序。

1 文件准备

本案例的文件结构如前面的案例相同。

采用下面的命令创建文件与文件夹。

cd $FOAM_RUNmkdir demo2cd demo2touch demo2.Cmkdir Makecd Maketouch files optionscd ..

文件组织结构如下图所示。

图片

修改files文件的内容
demo2.CEXE = demo2
修改options文件的内容
EXE_INC = \        -I$(FOAM_SRC)/finiteVolume/lnInclude \        -I$(FOAM_SRC)/meshTools/lnInclude EXE_LIBS = \        -lfiniteVolume \        -lmeshTools
2 添加参数

编辑源代码deom2.C,如下所示。

#include <fvCFD.H> int main(int argc, char *argv[]){    // 定义程序的使用说明    argList::addNote(        "输入参数:\n"        "---------------------\n"        "参数1:someWord\n"        "参数2:someScalar\n");    // 构建参数    Foam::argList args(argc, argv);    return 0;}

这段代码很简单,编译运行如下图所示。

图片

可以看到上面的简单代码为程序添加了帮助文档,可以通过程序名后面带参数-help来查看。

下面继续完善代码,为程序添加两个参数。

#include <fvCFD.H> int main(int argc, char *argv[]){    // 定义程序的使用说明    argList::addNote(        "输入参数:\n"        "---------------------\n"        "参数1:someWord\n"        "参数2:someScalar\n");     // 准备参数列表    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<scalar>(2);    const scalar someScalar = args.get<scalar>(2); //第二个参数     Info << "获取参数:" << endl        << "someWord:" << someWord << endl        << "someScalar:" << someScalar << endl;     return 0;}

编译运行如下图所示。

图片

提示需要输入两个参数。将运行命令改成./demo2 hello 2,如下图所示,可以看到程序顺利运行。

图片

3 添加选项

可以为程序添加可选参数。如下代码。

    #include <fvCFD.H> int main(int argc, char *argv[]){        // 定义程序的使用说明    argList::addNote(                "输入参数:\n"                "---------------------\n"                "参数1:someWord\n"                "参数2:someScalar\n");         // 准备参数列表    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<scalar>(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所支持的函数,被替换的函数如下表所示。

老版本函数(被废弃)新版本函数optionFoundfoundoptionReadIfPresentreadIfPresent

被废弃的函数目前依然可以使用,只是在编译过程中会有警告信息,不建议使用老版本函数,除了更复杂以外,还很有可能在未来更高的版本中被彻底放弃。

(本文程序在OpenFOAM 2112下运行通过。在V9版本下需要进行小幅修改。强烈建议手撸代码,因此文中的源代码就不提供了。)

(完毕)

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。