捐赠我们 社区应用 会员列表 统计排行 邀请注册
主题 : 介绍一个读取参数文件的方法
supersonic 离线
级别: 论坛版主
显示用户信息 
0  发表于: 2006-05-02   
倒序阅读   全看  

介绍一个读取参数文件的方法

管理提醒: 本帖被 wjjxlc 执行加亮操作(2008-11-21)
一般来说CFD程序都需要外部输入一些参数,诸如Re,Mach,边界条件,模型参数……。问题越复杂,参数越多。

虽然简单的利用编程语言的输入功能可以实现,但是这样比较难以实现比较自由的格式的参数文件,以及加入注释等等。当参数文件包含的参数多了之后,就比较容易出错。

以前在研究AMROC的时候就发现AMROC采用了一套叫ExternalControl的C++类来实现外部参数的输入。这套类来自于GrAL网格类(http://www.math.tu-cottbus.de/~berti/gral/)。采用这个类库可以比较方便实现自由格式的参数文件读取。

对于参数文件,ExternalControl将其作为一个ControlDevice,还可以以c/c++的{}方式在内部嵌套多层SubDevice。比如我的一个主参数文件 dks.cas
复制代码

  1. case_name NACA_T01
    grid_name naca0012.grd

    ref_rho 1.0
    ref_e 2.5
    ref_L 1.0

    lbm_par
    {
    # inviscid 0; laminar 1
    vis_mode 1

    Gamma 1.4

    # tau for inviscid flows; Re for laminar flows
    Re_tau 500

    # only available for viscous flows
    Pr 0.7
    }

    nbc 5
    bc_file dks.bc

    init_condition
    {
    # 0 for initializing macrostate equaly;
    # 1 for initializing from a file
    # 2 for restart microstate from a checkpoint file
    init_mode 0
    init_file NA

    irho 1.0E0
    iu 0.3878462E0
    iv 0.0689185E0
    ie 1.785714E0
    }

    time_control
    {
    time_step 1.0E-4
    max_step 200
    print_step 10
    save_step 30
    }


另外一个参数文件是为边界条件数据dks.bc
复制代码

  1. bc1
    {
    bctype 103
    dir 1 # i 0/j 1
    index 69 # 1 or MAX
    start_i 2
    end_i 281
    start_j 0
    end_j 0
    mis 0
    brho 1.0E0
    bU 0.7878462E0
    bV 0.1389185E0
    be 1.785714E0
    }

    bc2
    {
    bctype 203
    dir 0 # i 0/j 1
    index 1 # 1 or MAX
    start_i 0
    end_i 0
    start_j 2
    end_j 69
    mis 0
    brho 0.0E0
    bU 0.0E0
    bV 0.0E0
    be 0.0E0
    }

    bc3
    {
    bctype 203
    dir 0 # i 0/j 1
    index 225 # 1 or MAX
    start_i 0
    end_i 0
    start_j 2
    end_j 69
    mis 0
    brho 0.0E0
    bU 0.0E0
    bV 0.0E0
    be 0.0E0
    }

    bc4
    {
    bctype 207
    dir 1 # i 0/j 1
    index 1 # 1 or MAX
    start_i 2
    end_i 61
    start_j 281
    end_j 222
    mis 0
    brho 0.0E0
    bU 0.0E0
    bV 0.0E0
    be 0.0E0
    }

    bc5
    {
    bctype 102
    dir 1 # i 0/j 1
    index 1 # 1 or MAX
    start_i 62
    end_i 221
    start_j 0
    end_j 0
    mis 0
    brho 0.0E0
    bU 0.0E0
    bV 0.0E0
    be 0.0E0
    }


读取这两个文件的代码是
复制代码

  1. #include
    #include
    #include
    using namespace std;

    #include "IO/mutator.h" // only needed for "special" mutators.
    #include "IO/control-device.h"

    int t_bcdata[50][8];
    double t_bcm[50][4];

    void read_bcdata(c*****t int n_bcs, c*****t string[$ bc_f)]

    int main(int argc, char* argv[])
    {
    //ControlDevice Ctrl( GetFileControlDevice(case_f.c_str()) );
    // 依据参数文件dks.cas建立一个控制设备,取名DKS
    ControlDevice Ctrl( GetFileControlDevice("dks.cas", "DKS") );
    string case_name, grid_name;
    // 将参数文件中的参数名称和变量进行关联
    Ctrl.add("case_name", GetMutator(case_name));
    Ctrl.add("grid_name", GetMutator(grid_name));

    int vis_mode;
    double tgamma,tRe,tPr,rfrho,rfe,rfL;
    Ctrl.add("ref_rho", GetMutator(rfrho));
    Ctrl.add("ref_e", GetMutator(rfe));
    Ctrl.add("ref_L", GetMutator(rfL));

    // 获取子控制设备lbm_par
    ControlDevice Ctrl1 = Ctrl.getSubDevice("lbm_par");
    // 关联子控制设备中的参数和变量
    Ctrl1.add("vis_mode", GetMutator(vis_mode));
    Ctrl1.add("Gamma", GetMutator(tgamma));
    Ctrl1.add("Re_tau", GetMutator(tRe));
    Ctrl1.add("Pr", GetMutator(tPr));

    int t_nbc;
    std::string bc_file;
    Ctrl.add("nbc", GetMutator(t_nbc));
    Ctrl.add("bc_file", GetMutator(bc_file));

    ControlDevice Ctrl3 = Ctrl.getSubDevice("init_condition");
    int init_mode;
    double tr0,tu0,tv0,te0;
    std::string init_file;
    Ctrl3.add("init_mode", GetMutator(init_mode));
    Ctrl3.add("init_file", GetMutator(init_file));
    Ctrl3.add("irho", GetMutator(tr0));
    Ctrl3.add("iu", GetMutator(tu0));
    Ctrl3.add("iv", GetMutator(tv0));
    Ctrl3.add("ie", GetMutator(te0));

    ControlDevice Ctrl4 = Ctrl.getSubDevice("time_control");
    double time_step;
    int max_step, print_step,save_step;
    Ctrl4.add("time_step", GetMutator(time_step));
    Ctrl4.add("max_step", GetMutator(max_step));
    Ctrl4.add("print_step", GetMutator(print_step));
    Ctrl4.add("save_step", GetMutator(save_step));

    // 读取全部参数的值到对应的变量
    Ctrl.update();

    // 根据变量的值进行其它操作,这里暂注释掉
    // Grid
    //read_grid(grid_name.c_str());
    //extend_grid();
    //metric();
    //cell_center();
    std::cout<<"Grid done"<
    // LBM model
    if(vis_mode==0)
    std::cout<<"Inviscid flow"< else if(vis_mode>=1)
    std::cout<<"Laminar flow"<
    //set_ref(rfe, rfrho, refL);
    //set_lbm(rfe, tRe, tPr, tgam);

    // read bc data
    //read_bcdata(t_nbc, bc_file);
    // init
    //if(init_mode==0) // using irho,iu,iv,ie as initial values
    // init(tr0,tu0,tv0,te0);
    //else if(init_mode==1) // reading rho/u/v/e from a file
    //
    //else if(init_mode==2)
    //
    //else
    //

    //bc();


    // 打印参数值到标准输出,just have a look
    Ctrl.print_values(cout);

    // 读取边界条件参数文件
    read_bcdata(t_nbc, bc_file);
    return 1;
    }

    void read_bcdata(c*****t int n_bcs, c*****t string& bc_f)
    {

    ControlDevice Ctrl( GetFileControlDevice(bc_f.c_str(),"BC") );

    // 根据bc个数来开辟空间
    ostringstream* bc_entry = new ostringstream[n_bcs];
    ControlDevice* bc_ctrl = new ControlDevice[n_bcs];
    for(int ii=0;ii {
    // 构造子控制设备名称
    bc_entry[ii]<<"bc"< bc_ctrl[ii] = Ctrl.getSubDevice( bc_entry[ii].str() );

    bc_ctrl[ii].add( "bctype", GetMutator(t_bcdata[ii][0]) );
    bc_ctrl[ii].add( "dir", GetMutator(t_bcdata[ii][1]) );
    bc_ctrl[ii].add( "index", GetMutator(t_bcdata[ii][2]) );
    bc_ctrl[ii].add( "start_i", GetMutator(t_bcdata[ii][3]) );
    bc_ctrl[ii].add( "end_i", GetMutator(t_bcdata[ii][4]) );
    bc_ctrl[ii].add( "start_j", GetMutator(t_bcdata[ii][5]) );
    bc_ctrl[ii].add( "end_j", GetMutator(t_bcdata[ii][6]) );
    bc_ctrl[ii].add( "mis", GetMutator(t_bcdata[ii][7]) );

    bc_ctrl[ii].add( "brho", GetMutator(t_bcm[ii][0]) );
    bc_ctrl[ii].add( "bU", GetMutator(t_bcm[ii][1]) );
    bc_ctrl[ii].add( "bV", GetMutator(t_bcm[ii][2]) );
    bc_ctrl[ii].add( "be", GetMutator(t_bcm[ii][3]) );
    }

    Ctrl.update();
    Ctrl.print_values(cout);
    delete [] bc_entry;
    delete [] bc_ctrl;

    return;
    }


我想这些代码和注释已经能说明问题了,就不再多说了

BTW: GrAL提供的代码比较过时,不符合新的C++标准,因此必须做修改才能在。改天我把修改过得代码贴上来。
清空我的评分动态本帖最近评分记录: 共1条评分记录
li040384 积分 +1 2013-06-02 优秀文章
隐藏评分记录
Aciscatia 离线
级别: 论坛版主
显示用户信息 
1  发表于: 2006-05-02   
全看  
C++的正则表达式类库也很方便,我现在就用这个呢~~~
论成败,人生豪迈
大不了,重头再来
supersonic 离线
级别: 论坛版主
显示用户信息 
2  发表于: 2006-05-03   
全看  
修改过的ExternalControl类库

其实基本上是头文件包含方式的修改

编译全部C++文件,并打包成静态库就行了
附件: extctrl.rar (22 K) 下载次数:28
MingliZhu 离线
级别: 普通会员
显示用户信息 
3  发表于: 2006-05-05   
全看  
一个字:好!!!
stein 离线
级别: 初级会员
显示用户信息 
4  发表于: 2006-06-07   
全看  
太棒了!
pi_scu 离线
级别: 注册会员
显示用户信息 
5  发表于: 2010-12-04   
全看  
请问,要使用IO/MUTATOR.H 及IO/CONTROL-DEVICE .H 是不是下载了你给的附件包,就可以使用了?
LBM
supersonic 离线
级别: 论坛版主
显示用户信息 
6  发表于: 2010-12-04   
全看  
引用
引用第5楼pi_scu于2010-12-04 13:09发表的  :
请问,要使用IO/MUTATOR.H 及IO/CONTROL-DEVICE .H 是不是下载了你给的附件包,就可以使用了?


是的,作为一个lib来使用,或者加入到整个工程中
ao2000xue 离线
级别: 普通会员
显示用户信息 
7  发表于: 2012-08-08   
全看  
这个值得学习啊
yangmener 离线
级别: 初级会员
显示用户信息 
8  发表于: 2012-12-30   
全看  
太好了。。。
aiq645451657 离线
级别: 初级会员
显示用户信息 
9  发表于: 2013-10-13   
全看  
回 楼主(supersonic) 的帖子
真是好资料,我给我同事推荐了
aiq645451657 离线
级别: 初级会员
显示用户信息 
10  发表于: 2013-10-13   
全看  
回 楼主(supersonic) 的帖子
真是好资料,我给我同事推荐了的
zpjqzk 离线
级别: 注册会员
显示用户信息 
11  发表于: 2013-10-18   
全看  
刚刚入门,还有点看不懂,不过看起来很爽
05071110 离线
级别: 注册会员
显示用户信息 
12  发表于: 2016-04-09   
全看  
这个东西真是帮了大忙了,谢谢!
gyzhangqm 离线
级别: 普通会员
显示用户信息 
13  发表于: 2016-12-08   
全看  
这个东西真是帮了大忙了,谢谢!
描述
快速回复

验证问题:
傲雪论坛成立于哪一年? 正确答案:2002年
按"Ctrl+Enter"直接提交