赵茹嫦 王银燕 李余良
(哈尔滨工程大学 动力与能源工程学院 哈尔滨150001)
FORTRAN语言结构缜密,语法严谨,自诞生以来积累了大量高效而可靠的源程序,广泛地应用于并行计算和高性能计算等领域。但由于FORTRAN数据的输入输出是在DOS界面里完成的,图形功能弱,计算结果可视化存在缺陷,给用户的使用带来很多不便。而VB作为一种Windows软件开发语言,可视化图形功能强,开发效率高,采用面向对象的编程思想,把复杂的设计问题分解为多个能够完成独立功能的对象的集合。利用VB的图形功能实现FORTRAN计算程序的可视化,对充分利用原有FORTRAN计算程序具有很大的实际意义。
用VB和FORTRAN两种语言混合开发计算软件的方法一般有两种:
(1)用VB设计界面及控制程序,将FORTRAN程序编译成DLL动态链接库,再由VB程序调用FORTRAN动态链接库。其中,数据交换由参数传递来实现;
(2)用VB设计界面,将FORTRAN应用程序编译成可执行的*.exe应用程序,由VB应用程序直接调用,最终结果显示在VB界面上。在整个运行过程中,FORTRAN应用程序在后台运行,VB和FORTRAN间的数据交换均通过磁盘文件进行,设计流程如图1所示[1]。
图1 VB调用FORTRAN外壳程序
第一种方法需要解决参数传递的问题。由于参数较多,还需要构造动态链接库,比较复杂,因此只适合于计算量小、参数少的情况;而第二种方法简单明了,适合于计算量较大、交互操作不多的情况。因此,对于船用柴油机工作过程数值模拟计算程序的可视化编程,适合选用第二种方法。
用VB调用FORTRAN程序编译的.exe文件时,首先利用VB中的shell函数启动FORTRAN应用程序。在启动FORTRAN的过程中,将会遇到三个常见的问题:
(1)shell函数是以异步方式执行的,这种执行方式不能等待FORTRAN程序结束而将继续执行后续VB程序,使VB得不到最终的数据而出错;
(2)由于VB是直接运行于Windows平台的,而FORTRAN是一种基于DOS平台的应用程序,在Windows平台运行DOS应用程序时,会退出Windows而进入到DOS界面,出现“黑屏”现象。此外,即使Windows平台的DOS程序终止运行,DOS也不能自动关闭,返回到 Windows 平台[2];
(3)由FORTRAN编制的柴油机工作过程计算程序的输入数据是通过*.txt文件输入的,要使FORTRAN进入计算,需要提供符合FORTRAN程序格式要求的数据文本。
因此,解决以上三个问题是实现船用柴油机工作过程数值计算可视化的关键。
用Win32 API提供的有关进程操作函数可以解决外壳程序的异步运行问题。首先用CreatProcess函数建立FORTRAN外壳进程句柄,然后通过WaitForSingleObject函数等待外壳进程终止,Close Handle函数用于将打开的进程对象关闭[3]。这些函数需要在VB中事先声明。其中CreateProcess函数有10个参数,参数IpStartupInfo用来指向一个STARTUPINFO类型的结构,该数据结构将指定如何显示外壳应用程序窗口。
当其成员dwflags的值等于1时,表示另一个成员wShowWindow有效;当wShowWindow的值等于0时,表示隐藏外壳应用程序的窗口。这样的操作就隐藏了DOS平台,即不会出现“黑屏”的现象。
此外,在WaitForSingleObject函数中,参数dwMilliseconds表示VB应用程序等待事件的最长时间。当其值等于-1时,表示可以进行无限长的等待下去,直到外壳应用程序结束。因此,除了在VB中预先声明上述函数之外,还要声明下列常量和数据结构:
启动并等待外壳程序的实现方法,代码如下:
如果用VB的Shell函数来运行FORTRAN外壳程序,可利用API函数OpenProcess和CloseHandle或OpenProcess和GetExitCodeProcess来实现等待Shell程序的执行,从而解决shell函数异步执行的问题,具体实现参见下列示例代码。
在利用Shell函数调用外部程序的过程中,只要在shell()语句之后加入循环调用StillRun()函数的代码,就可时刻监视shell函数所执行的外部程序运行状态,直到 stillrun()返回 false 时,才执行 shell()语句的后续程序。
对于shell函数启动外壳DOS程序时出现 “黑屏”的问题,解决的办法是将shell函数的第二个可选参数设为vbHide。这样在壳程序运行时,DOS窗口会自动隐藏。同时,在Windows环境下右击该DOS应用程序文件名,选择“属性”项,在“属性”对话框的“程序”标签下,选中“退出时关闭窗口”复选框,此时将生成该DOS应用程序的PIF文件。以后在Windows环境下运行该应用程序时,程序结束后会自动关闭DOS窗口而返回Windows状态。
FORTRAN的原始数据读入为*.txt文件输入方式。为了实现可视化输入,在VB调用FORTRAN的*.exe应用程序的同时,将为FORTRAN程序创建一个.txt数据读入文件。具体操作为:首先,根据FORTRAN程序中的输入数据属性,编制VB可视化界面,对输入参数合理布局,再将输入数据存储到一个无穷大的数组空间内;待输入完毕,数组中的输入数据将按FORTRAN计算程序本身要求的格式排列,存入*txt文件中,为FORTRAN程序的计算做好准备。实现过程可用图2来说明。
图2 输入文件创建过程
根据计算机型的基本情况,输入需要设置的参数。输入界面如图3所示。首先,通过多项选择按钮选择计算的机型是柴油机还是汽油机、二冲程还是四冲程,并在输入框中输入气缸数;其次,输入发动机整体几何参数,比如缸径、行程、压缩比等,选择是否有中冷器以及有无增压,若增压则选择增压型式,是脉冲还是定压;第三,设置燃烧参数,选择燃烧模型,设置燃油含碳量和低热值等参数;最后,点击按钮,对进排气系统、增压器、中冷器进行单独设置,点击计算初始化,对计算中的初始条件进行设定。
图3 基本参数设置界面
程序还设置了输入提示功能。比如,在中冷器复选框中未选择有中冷选项,点击中冷器按钮,就会弹出“是否中冷”提示框,若选择“是”(如图4),鼠标则返回到中冷器设置复选框,同时进入到中冷器设置界面。
进入计算前,还需对部分参数进行初始化设置。点击计算初始化,进入图5所示界面。对压力和温度设一初值,程序将根据初值进行迭代计算,在计算要求的精度内收敛,程序继续运行。
为了验证本软件 (命名为MCY软件)的正确性,用MCY软件对某柴油机工作过程进行了模拟计算,计算结果与实验值进行对比,同时也与商业软件GT-POWER进行对比计算。
图4 选择中冷的提示功能
图5 初始值设置界面
图6 示功图对比曲线
图7 排气总管压力波变化曲线
图6为在发动机转速为1 000 r/min时,MCY软件计算示功图与试验示功图的比较。可以看出,两者在变化趋势上基本一致,着火前期存在一定误差,达到最高压力之后,曲线基本吻合。经计算,最大爆压的相对误差在允许范围内。图7为排气管内的压力波动曲线。从曲线整体上可以看出,MCY软件计算结果波动略大于GT计算结果,但两者波动趋势基本一致。
本文重点讨论了在VB对FORTRAN可执行程序的调用,以及在调用过程中将会遇到的问题,并提出了解决方案。
本文提供的方法,在不改变FORTRAN程序本身,保持其算法和强大的数值计算功能的前提下,通过和VB的混合编程,开发出一个可视化的数值模拟计算系统,实现了FORTRAN程序的可视化输入,提高了原程序的使用效率,对类似的程序改进具有重要的指导意义和参考价值。对FORTRAN程序的改进设计,并不影响到原程序的功能和独立性。FORTRAN程序作为一个独立的数值计算模块,既可以与VB程序编制的界面集成使用,又可以单独使用。
[1]蒲军平,刘鹏.VB界面设计与FORTRAN数值计算功能的组合应用[J].计算机应用与软件.2010,27(12):148-150.
[2]杨华保,田宏星,刘健,陈永新.FORTRAN程序的可视化管理设计研究[J].航空计算技术,2009(4):94-97.
[3]张学强,郑公营.VB调用C和Fortran自定义动态库函数联合编程[J].工程物理地球学报.2010,7(1):55-59.
[4]周方,戴村供,詹友基.排气系统模拟计算程序的开发[J].福建工程学院学报,2005,3(1):87-90.