火灾模拟软件FDS场景建模环境的设计

2014-12-25 02:23苗志宏马金强
中国人民警察大学学报 2014年2期
关键词:调用文档运算

●苗志宏,马金强

(武警学院 消防工程系,河北廊坊 065000)

0 引言

FDS(Fire Dynamics Simulator)是美国国家技术标准局(NIST)建筑火灾实验室开发的基于场模拟的火灾动力学模拟软件[1-2]。它采用数值方法求解一系列适用于低速流动热驱动形的N-S方程,并以火灾时的烟气流动和热传递过程为重点研究对象。FDS的特点是针对性较强,可以得到比较详细的物理量的时空分布,能精细地体现火灾现象。目前FDS已经被用来解决消防领域中的一些实际问题,在火灾理论研究、建筑性能化设计中,常用这种方法来模拟火灾过程[3-4]。但是,FDS是基于控制台的应用程序,场景建模文件的构建只能通过手工编辑文本文件的方式进行,文件编辑需要熟悉FDS的文件格式和记忆大量的命令;同时,FDS的模拟计算结果需要使用SmokeView软件来展现三维场景,它们都需要用户回到DOS环境中使用命令形式来调用,这些对于FDS的用户是个不小的困难,直接影响着软件的应用效率。因此,对FDS的场景建模环境进行专门的研究和开发,使其拥有更强的功能和更高的效率,成为火灾和消防科学领域的设计及研究人员关注的重点课题[5-7]。本文给出了一个Windows下基于图形用户界面的FDS场景建模环境的设计过程。该环境集FDS场景建模文档编辑、FDS运算、FDS运算步骤输出以及SmokeView的运行为一身,可以使火灾模拟的效率大大提高。

1 编程环境的基本组成

火灾模拟软件FDS编程环境的主界面如图1所示,其组成主要部分有主框架和客户区。在主框架中有标题栏、菜单栏、工具栏和状态栏。客户区由3个子窗口组成,分别是工作目录窗口、编辑窗口和运算过程显示窗口,其中编辑窗口可同时打开多个文档。FDS的场景建模命令在编辑窗口中按文本文件进行编辑,具有一般文本编辑的各种功能,并且对FDS命令的关键字具有语法识别功能,并按高亮显示。工作目录窗口按树型目录显示当前工作目录中的所有文件,这样FDS运算输出文件也显示在其中,选中文件后双击鼠标右键可打开文件。运算过程显示窗口显示FDS运算过程的步骤信息,这里我们将FDS原来在控制台下的步骤显示重定向到该窗口,并屏蔽了控制台窗口。状态栏中能显示当前运算的信息和当前光标所在的行号和列号。建模环境主界面与FDS后台运算的连接是设计的核心部分,其运行结构图如图2所示。

图1 FDS场景建模环境主界面

图2 FDS场景建模运行结构图

2 FDS编程环境设计过程

FDS编程环境的主要功能包括:多文档编辑,调用外部程序FDS,运算过程显示等。场景建模环境由VC++6.0平台进行设计,采用MFC的多文档视图模式进行开发。开发基本过程如下:

2.1 多窗口界面的设计

窗口界面是用户的主要操作区域,如图1所示。客户区中的工作目录窗口和运算过程显示窗口是以浮动窗口方式设计的,初始情况下分别停靠在主窗口的左边和下端。其主要实现过程是采用了Cristi Posea提供的 CSizingControlBar类和 CSizingControl-BarG 类(类声明和实现文件是:sizecbar.h,sizecbar.cpp,源代码见 http://www.codeproject.com/Articles/6/CSizingControlBar-a-resizable-control-bar),它们是从MFC中CControlBar类继承来的。

为此,在工程FdsEditor中载入文件sizecbar.h,sizecbar.cpp,scbarg.h,scbarg.cpp,并在 stdafx.h 文件中添加文件包含指令:#include"sizecbar.h"#include"scbarg.h"。这样就可以在主框架类CMain-Frame中添加以下3个成员对象:(1)CSizingControl-BarG m_wndLeftBar(工作目录窗口);(2)CBottomBar m_wndBottomBar(运算过程显示窗口);(3)CTreeCtrl m_wndTree(工作目录窗口中的树状目录)。这里CBottomBar是CSizingControlBarG的公有派生类,在其中添加了CEdit类型的公有成员对象m_wndEdit,它是运算过程显示窗口中的编辑框。并在CBottom-Bar类中重写WM_CREATE消息映射函数OnCreate()。在CMainFrame类的成员函数OnCreate()中,可调用Create函数来实现上面3个成员对象的创建和控制窗口的初始停靠位置(这里省去了代码实现部分)。

2.2 关键字高亮编辑器设计

关键字高亮编辑器的设计使用了已有的类CSynEditView[8],该类是 CRichEditorView 的派生类,既继承了CRichEditorView类的所有功能,又具有关键字高亮显示的特点,因此在工程中将视类CFdsEditorView设置为CSynEditView的派生类。为使FDS的建模关键字按高亮显示,这里需要在CSynEdit-View类的成员函数LoadSynWord(INT nLanguage)的分支结构switch中添加FDS建模语句的关键字,如&HEAD、&MISC等(这里省去了代码实现部分)。

2.3 FDS运算连接

建模环境主界面与FDS后台运算的连接是本设计的核心部分。本文建模环境中FDS运算过程是通过建立一个线程[9]来开启FDS运算引擎的,主要是通过调用线程创建函数AfxBeginThread()来实现。通过主框架中运算按钮的响应函数OnBuildFds5()来调用AfxBeginThread(),其调用流程如图3所示。

图3 FDS运算调用流程图

其实现代码为:

void CMainFrame::OnBulidFds5()

{

//TODO:Add your command handler code here

//Step 1:读取FDS安装路径//

ifstream infile("FdsPath.txt");//FDS安装路径已存放在 FdsPath.txt中

if(!infile)

{MessageBox("请先设置FDS的安装路径!");

return;}

char str[255];

int i=0;

while(infile.get(str[i++ ]))

{}

strFdsSetupPath=str;//存放FDS安装路径

infile.close();

//Step 2:重新或继续运算选择//

CString strStop;//存放stop文件路径

strStop=GetFdsStopFile();

//先判断*.stop是否存在,如果存在则删除掉!

if(strStop!="")//有否stop文件

{DeleteFile(strStop);//删除stop文件

UINT nRet=MessageBox("检测到stop文件,如果要继续上次运算,则请在MISC语句里添加:RESTART=.TRUE.;选择确定按钮,则回到文件添加:RESTART=.TRUE.;选择取消按钮,则重新计算.","Stop 文件",MB_OKCANCEL);

if(nRet==IDOK)

{return;}

}

//Step 3:设置运算状态//

BuildState=1;

SmokeviewState=FALSE;

//Step 4:获取FDS建模文档//

GetFdsDocPath();

//Step 5:为FDS创建和启动一个线程//

if(strFdsSetupPath!="")

AfxBeginThread(FDSThreadFun,this);

}

上面代码中分别调用了成员函数GetFdsDocPath(),GetFdsStopFile()来获取FDS建模文档的路径和中断文件(*.stop)的路径。由于篇幅问题这里略去实现代码,其方法是先获得活动文档类的指针,然后调用文档类的函数GetPathName()来实现。

在主框架类CMainFrame中添加一个静态成员函数 FDSThreadFun(),以它作为函数 AfxBeginThread中的线程的入口函数,并声明一个全局线程句柄m_hThread。

为重定向控制台下运算步骤信息至本环境的相应窗口中,在函数FDSThreadFun()中通过调用API函数 CreatePipe()来创建匿名管道(Anonymous Pipes),并将标准输出重定向到匿名管道。然后通过API函数CreateProcess()来创建一个子进程实现对外部应用软件FDS的调用,并利用ReadFile()函数来读取匿名管道中的运算步骤信息。最后将运算步骤信息重新显示在主框架的下端窗口中。

为实现FDS运算中途暂停和停止,在主框架中的工具栏增加“暂停/继续”和“停止”两个按钮。FDS的暂停运算是通过使用SuspendThread挂起该线程来实现的,继续运算是使用线程恢复函数ResumeThread来实现的。“暂停/继续”的响应函数代码如下:

void CMainFrame::OnBulidSuspendAndContinue()

{

//TODO:Add your command handler code here

m_fdsRun=!m_fdsRun;//FDS是否处于运算状态

if(m_fdsRun)

{::SuspendThread(m_hThread);

m_wndToolBar.SetButtonText(11,"继续");}

else

{::ResumeThread(m_hThread);

m_wndToolBar.SetButtonText(11,"暂停");

}}

由于FDS内核采用大涡模拟算法,运算时间会很长,因此在工具栏中添加了“停止”按钮来中途停止运算,以便下次从原来停止的地方继续运算。为此,在“停止”按钮的响应函数中,实现了自动产生Stop文件的过程。

2.4 连接SmokeView

输入的建模文档经过FDS运算后,就会输出可以在SmokeView中打开的smv文件。为启动Smoke-View模块并在其中同时打开smv文件,在主框架的工具栏中添加了“SmokeView”按钮,其响应函数如下所示:

void CMainFrame::OnBuildSmokeview()

{

//TODO:Add your command handler code here

CString strChid;

strChid=GetFdsCHIDFile();//获得输出文件名

strChid=strChid+".smv";//加扩展名 smv

if(BuildSuccess)//运算成功

//启动smokeview,并打开当前的smv文件

ShellExecute(NULL,"open","smokeview.exe",strChid,"",SW_SHOW);

else//启动 smokeview

ShellExecute(NULL,"open","smokeview.exe",NULL,"",SW_SHOW);

}

上面代码中使用了API函数ShellExecute来调用外部程序SmokeView。

3 FDS编程环境的使用

下面实际运行设计好的FDS场景建模环境,为此选用FDS5.0提供的一个例子room_fire.fds来运行,打开文件后,进行运算,其最终的运算效果图如图4所示。

图4 运算效果图

4 结语

本文设计出了Windows下的FDS场景建模环境,该环境采用类似VC++6.0开发界面风格进行设计,使FDS场景建模文档编辑、FDS运算、FDS运算步骤输出以及SmokeView的运行为一体。本环境屏蔽了FDS基于控制台的参数输入输出过程,使FDS的建模输入和运算输出展现在同一个图形用户界面中。使用本文设计的FDS场景建模环境可以大大提高火灾模拟的效率。

[1]Kevin McGrattan,Bryan Klein,Simo Hostikka,et al.Fire Dynamics Simulator(Version 5)User’s Guide[M].US:National Institute of Standards and Technology,2009.

[2]Kevin McGrattan,Simo Hostikka,Jason Floyd,et al.Fire Dynamics Simulator(Version 5)Technical Reference Guide[M].US:National Institute of Standards and Technology,2009.

[3]霍然.性能化建筑防火分析与设计[M].合肥:安徽科学技术出版社,2003.

[4]李引擎.建筑防火性能化设计[M].北京:化学工业出版社,2005.

[5]陈驰,任爱珠,张新.基于虚拟现实的建筑火灾模拟系统[J].自然灾害学报,2007,16(1):55-60.

[6]邵钢,金浩,杨培中,等.可视化隧道火灾仿真系统开发[J].计算机仿真,2007,24(3):198-206.

[7]吴炜煜,高佐人,任爱珠.基于FDS的火场空间物理建模器研究[J].系统仿真学报,2005,17(8):1800-1802.

[8]夏俊杰,赵刚.基于MFC的代码编辑器设计方法[J].现代电子技术,2012,35(12):28-30.

[9]孙鑫.VC++深入详解[M].修订版.北京:电子工业出版社,2012.

猜你喜欢
调用文档运算
浅谈Matlab与Word文档的应用接口
重视运算与推理,解决数列求和题
有人一声不吭向你扔了个文档
有趣的运算
核电项目物项调用管理的应用研究
系统虚拟化环境下客户机系统调用信息捕获与分析①
Word文档 高效分合有高招
“整式的乘法与因式分解”知识归纳
Persistence of the reproductive toxicity of chlorpiryphos-ethyl in male Wistar rat
利用RFC技术实现SAP系统接口通信