蒙小龍,黃 俊,劉志勤,張 勇,王耀彬
(1.西南科技大學計算機科學與技術學院,四川綿陽 621010;2.中國空氣動力研究與發展中心,四川綿陽 621000)
航空航天技術不斷發展得益于動力系統的發展,特別是燃氣輪機、噴氣式發動機、火箭發動機、超燃燒沖壓發動機等技術演進,工程熱動力是該演進過程的關鍵。CEA程序由NASA研究開發,用于熱力學、物理化學反應的計算與分析,如對固體推進劑組合能量特性分析,新型氧化劑的熱化學性能計算[13]。CEA程序一方面是其計算結果成為了相關航空航天研究人員的標準參照;另一方面逐步成為了一些涉及熱力學與化學平衡計算仿真平臺 (如,飛行器動力仿真系統[4])的編程基礎庫。
現有的CEA程序需要下載安裝到桌面電腦,極大地限制了使用環境,并且在較新的操作系統中兼容性不佳。運用于工程計算時,通常需要進行二次開發[5],然而該程序沒有提供標準應用程序編程接口 (Application Programming Interface,API),為開發人員增加了難度。
基于上述問題,本文提出采用基于Web技術實現CEA桌面程序的二次開發,提高了程序的便攜性,為涉及化學平衡問題的研究者提供開放便利的計算平臺。并且為相關開發人員提供了API,減少了二次開發的工作量。
在NASA CEA程序官網可以獲得相應的程序包,以及兩份程序手冊[6-7]。提供了在 Windows、Mac OS X、Linux、Sun/Solaris、Sgi/Iris系統下的程序包,覆蓋了目前主流桌面操作系統。第一份手冊是詳細介紹復雜化學平衡的數學分析和技術,包括計算指定熱力學狀態的化學平衡、平衡流和凍結流的火箭能量理論性能,以及入射和反射激波的性質以及爆轟性質等[8]。第二份是用戶手冊,介紹了程序的詳細使用方式。
CEA中的化學平衡計算代碼包含1個主程序、24個子程序以及5個入口,可以將它們分成8個不同的模塊[5]。如圖1所示,分別是2個數據前處理模塊,1個程序輸入模塊,1個主程序模塊,3個計算模塊,1個輸出模塊。
圖1 NASA-CEA代碼的8個模塊
以Windows程序包為例,官網提供了3個壓縮包,其中CEA+Fortran.zip包含CEA算法程序的Fortran源碼文件,CEAexec-win.zip包含CEA程序的算法可執行文件和所需的數據文件,CEAgui-jar.zip為CEA用戶界面包。將后面兩者解壓放到同一個文件夾,運行.bat腳本便能執行CEA圖形程序。整個程序運行過程中涉及到的文件如表1所示。通過分析,原始文件中除去“trans.lib”、 “thermo.lib”、“FCEA2.exe”,其余都是為配置中間生成的問題文件“*.inp”服務,將文件“* .inp”作為核心算法程序“FCEA2.exe”的輸入便可得到結果輸出文件“*.out”。
表1 官方windows版本壓縮文件及作用
由于“CEAgui.jar”只是用于配置問題參數客戶端界面,因此也可以開發不同的界面程序,來對配置問題輸入文件,再調用核心算法程序得到結果。考慮到跨平臺的各類終端使用,確立使Java Servlet技術來開發基于Web的應用程序。
程序的移植的方法主要有源代碼移植和二進制移植兩種方法,源代碼移植通過修改環境相關的部分源代碼,可使程序適應多種工作環境;二進制移植是指將軟件從原環境移植到目標環境,不但能正確運行,而且與其在原環境下表現一致[9]。文獻提到一種基于VC的CEA程序調用方式,這種方法為源代碼移植。簡而言之是將CEA的Fortran源碼進行部分修改然后重新編譯成動態鏈接庫,使用VC對動態鏈接庫進行調用。因為CEA算法內部函數之間的參數傳遞復雜,使用這種方法的弊端在于修改源碼后容易造成不可預計的錯誤。
圖2 CEA程序用戶界面
CEA算法在半個世紀以來,得到了空氣動力學以及熱力學研究者的廣泛認可。因此為保證移植的可靠性,應該在不修改算法源碼的基礎上,對程序進行二次開發。CEA軟件對算法和用戶界面有很好的分層,可以只對用戶界面移植而且不需要修改任何算法源碼。需要解決的問題之一是對算法的可執行文件調用,在 Java中可以使用“java.lang.Runtime”類獲得當前程序的運行時,使用運行時可以實現對可執行文件“.exe”的調用并獲得一個進程,同時在“java.lang.Process”類的配合下能夠與該進程進行交互;需要解決的另一個問題是配置文件的生成,Java能夠方便地進行文件讀寫操作,并且配置文件的語法格式在用戶手冊[6]中已經有詳細的介紹。
通過研究分析可以得到CEA圖形界面程序的計算流程,如圖3所示,在程序中配置生成物是可選的,其中包括指定生成物、忽略生成物、插入生成物。插入生成物指選擇可能的凝結物,雖然不影響最終的計算結果,但是在某些情況下能加快算法的收斂。“*.inp”與“*.out”文件在表1中有相應的解釋,實際上可以參照CEA用戶手冊[6]手動對“*.inp”進行合法的添加與修改。
軟件良好的交互性與易用性能提高工作的效率,官方的CEA圖形界面程序在新的操作系統兼容性較差,同時界面組織復雜對非專業使用者不友好。使用Web技術能讓CEA工作在任何支持瀏覽器的終端上面,Java的Servlet技術能生成動態Web內容并且能夠交互式瀏覽和修改數據。
圖3 CEA程序計算流程
面向對象編程的Java語言除了能對可執行文件進行調用,還能夠方便地進行文件讀寫操作。在Java EE中,使用已有的基礎能十分便捷地開發API,將CEA算法程序進行封裝,使用一個Servlet來處理客戶端API請求,API Servlet解析客戶端請求的問題信息,并且將計算結果返回給客戶端。客戶端根據規范的接口定義調用服務器提供的CEA算法接口,輸入問題描述字符串語句,接口返回計算結果數據。
根據以上的分析,將程序使用二進制移植方法完整移植到Java Web應用中是完全可行的。
選用流行的Eclipse作為開發平臺,應用采用Servlet+JSP技術開發。在Java Web的開發中可以使用多種支持Servlet技術的服務器,Tomcat是其中的一個。因為開源和免費的特性,使得用戶可以自由無障礙地下載、安裝、使用Tomcat,這也是Tomcat能夠被廣泛使用的重要原因之一。在項目中我們選用Tomcat作為Web應用服務器。
移植的Web應用目標框架如圖4所示,客戶端瀏覽器發出請求;HTTP服務器處理請求后再將請求遞交給Java虛擬機中的Servlet對象;Servlet對象將請求的內容包裝成配置文件,并且調用CEA核心算法;CEA算法處理配置文件,并且生成結果文件;Servlet對象等待結果文件的生成,接著讀取數據,將數數據封裝成請求返回給HTTP服務器;HTTP服務器收到請求后再將請求傳遞給客戶端瀏覽器。
圖4 移植目標整體結構
根據圖3的流程,設計的Web主要包含四類頁面,分別是問題類型配置,反應物配置,生成物配置以及輸出結果配置。每一個頁面對應一個Servlet,頁面中的數據以Form表單的形式提交,一個頁面可能包含多個表單。同時,對于每一個表單對應一個符合JavaBean規范的實體對象。在項目中主要有兩個目錄,一個是Java源代碼目錄,另外一個是Web Content目錄。
Java代碼目錄主要包含4個包,分別是“algorithm”,“servlet”, “entity”, “tools”。 “algorithm”包中主要是對CEA程序的調用代碼,“entity”中是對應頁面表單的數據對象,“servlet”中包含的是處理各個頁面請求的servlet類,“tools”包含的是文件操作等工具類。Web Content目錄中包含四類文件及目錄,“CEAcore”目錄包含的是CEA程序可執行文件及依賴數據文件;“Download”用于在程序運行后為每個用戶存放臨時數據,這些數據可供用戶下載;“META-INF”、“WEB-INF”、“static”這3個目錄包含頁面配置信息,依賴包以及靜態資源等;根目錄下“*.jsp”文件是相應的網頁頁面。
對CEA算法可執行文件的調用是項目中最關鍵的一步,使用 Java的運行時可以十分方便地實現。在“java.lang.Runtime”類的“exec”方法中包括3個參數,第一個是指令,第二個是環境變量設置,第三個是當前的工作路徑。調用的流程如下,首先指定指令為包含絕對路徑的“FCEA2.exe”,還指定了當前的工作路徑為“java.lang.File”類型的workpath。通過執行該指令獲得一個“java.lang.Process”類型的對象“localProcess”,也就是CEA算法的子進程。然后使用“localProcess”的“getOutputStream”方法獲得該進程的標準輸出流,接著使用“java.io.PrintWriter”類的“println”方法指定帶絕對路徑的輸入文件名,也就是“*.inp”文件的位置。執行“FCEA2.exe”,并且輸入“*.inp”文件的路徑。調用完成后在“*.inp”文件的目錄中會生成一個前綴相同的“*.out”文件。
為保證系統能在多用戶下正常工作,把用戶訪問服務器Session的唯一ID值作為臨時工作目錄名,每個用戶只能訪問對應服務器工作目錄中的資源,在用戶訪問結束或達到指定時限自動刪除臨時目錄及文件。實現了多個用戶獨立訪問,保證了用戶數據的安全。
為提高CEA程序二次開發的便利性,將所有問題配置封裝成一個URL API。因為請求的數據結構復雜,所以選用JSON的數據格式進行封裝,請求端以POST方式向服務器發送請求。程序中使用一個APIServlet來處理API請求,首先解析JSON數據為相應的Bean對象,然后根據Bean對象配置輸入問題文件,接著調用CEA算法處理問題文件,最后將輸入數據以及計算結果以JSON格式返回給接口調用者。
將項目部署到Tomcat服務器上,便可以使用瀏覽器訪問,目前項目已經部署到萬維網服務器[10]。應用的使用流程如圖5,在首頁可以選擇查看示例、上傳問題文件或者新建一個問題文件,共3個選項。
圖5 CEA Web應用使用流程
圖6為示例問題,第一段以“problem”開始,指定了案例名稱為“Example-1”,問題類型為“tp”(恒溫恒壓),壓力為“1,0.1,0.01”個大氣壓,溫度為“3000,2000”開爾文,化學當量比為“1,1.5”;第二段以“reac”開始,指定了反應物及物質的量,燃料為“H2”,量為1摩爾,氧化劑為“Air”(空氣),量為1摩爾;第三段以“only”開始,指定了生成物的成分;第四段以“output”開始,指定輸出數據單位;問題以“end”結束。在輸入文件中,字段“problem”、 “reac”、 “end”是必須的,字段 “only”、“omit”、“insert”、“output”是可選的。
圖6 恒溫恒壓問題配置文本示例
上述問題可以寫入文本文件,并且將后綴改為“.inp”,然后通過上傳選項獲得結果。也可以使用CEA Web新建問題配置數據獲得結果,Web界面如圖7所示,配置的簡要過程如下:
1)在“problem”頁面輸入ID為“Example-1”;選擇類型為tp;在氧燃混合物中選擇當量比并輸入值為“1,1.5”; 保存。
2)在“tp problem”頁面選擇溫度單位為“Kelvin”,值為“3000,2000”;選擇壓強單位為“atm”,值為“1,0.1,0.01”; 保存。
3)在“reactant”頁面選擇成分單位為“moles”,反應物為“H2”,“Air”,數量都為“1”;保存。
4)在“only”頁面指定生成物的成分;保存。
5)在“output”頁面選擇能量單位為“calories”,求解。
6)在“problem and result”頁面可以查看和下載問題文件與求解結果文件。
圖7 CEA Web應用界面
對于API的調用,在CEA Web[10]上可查看接口規范。開發人員只需將配置詳情按照API規范以JSON格式發出POST請求,服務器將返回帶有問題與結果詳情以及文件下載路徑的JSON數據。
JSON數據內容主要包含兩個部分,一個部分是“problempath”,包含文件名以及文件的相對路徑,將輸入/輸出文名與輸入/輸出文件路徑拼接可得到文件在服務器的相對路徑,進一步與服務器主機地址拼接可得到輸入/輸出文件的下載地址。因為程序將會通過服務器保留的Session檢驗請求者的下載地址是否合法,以此保證數據不會被其他用戶獲得,確保了用戶數據的安全性。另一個部分是“problemresult”,包含問題字符串和結果字符串。開發人員根據需要獲得問題與結果的字符串或者通過下載鏈接得到文本文件。
CEA是一款開源的計算化學平衡程序,廣泛應用于空氣動力學和熱力學的研究當中。本文介紹了CEA桌面應用程序的主要結構及工作流程,并且使用Servlet技術完整移植到了Web平臺中,支持用戶在任何具有瀏覽器的終端使用。同時,對CEA算法進行了封裝,為開發人員提供統一的應用程序編程接口API,方便將算法集成到其他大型系統中。接下來,將進一步改善用戶交互界面,對輸出結果文件進行分析,把各個部分用可視化圖表呈現出來。