車霖源
(上海船舶運(yùn)輸科學(xué)研究所 a.航運(yùn)技術(shù)與安全國(guó)家重點(diǎn)實(shí)驗(yàn)室; b.航運(yùn)技術(shù)交通行業(yè)重點(diǎn)實(shí)驗(yàn)室,上海 200135)
在船型優(yōu)化工作中,計(jì)算流體力學(xué)(Computational Fluid Dynamics,CFD)工具已成為不可或缺的計(jì)算工具之一。為獲得性能優(yōu)良的船舶線型,需借助經(jīng)驗(yàn)或優(yōu)化算法對(duì)多個(gè)方案進(jìn)行對(duì)比。CFD計(jì)算需耗費(fèi)大量的計(jì)算資源,一般在計(jì)算機(jī)集群或?qū)S玫姆?wù)器上通過(guò)相應(yīng)的軟件實(shí)現(xiàn),這些高性能計(jì)算機(jī)通常采用linux系統(tǒng)。CFD計(jì)算對(duì)CFD工具使用者有較高的要求,不僅要求其熟悉計(jì)算機(jī)系統(tǒng),而且要求其能很好地把握軟件的參數(shù)設(shè)置,保證計(jì)算的合理性和準(zhǔn)確性。在實(shí)際工作中,這會(huì)影響一部人使用CFD工具的效率,任務(wù)多時(shí)還會(huì)出現(xiàn)浪費(fèi)計(jì)算資源的問(wèn)題,影響工作進(jìn)度。因此,需在船型優(yōu)化設(shè)計(jì)人員與計(jì)算工具之間建立一座“橋梁”,使船型優(yōu)化設(shè)計(jì)人員將更多精力投入到優(yōu)化設(shè)計(jì)工作中,減少對(duì)計(jì)算工具的關(guān)注。
R語(yǔ)言的Shiny包可用來(lái)構(gòu)建交互式網(wǎng)頁(yè),便于部署,能滿足常用的交互式應(yīng)用的需求。OpenFOAM是一款CFD開源平臺(tái),從本質(zhì)上看是采用C++語(yǔ)言編寫的面向?qū)ο蟮念悗?kù),具有極強(qiáng)的擴(kuò)展性和強(qiáng)大的底層數(shù)學(xué)場(chǎng)量操作類庫(kù),可實(shí)現(xiàn)大規(guī)模的并行計(jì)算。OpenFOAM已在多個(gè)領(lǐng)域得到深入研究,在船舶水動(dòng)力領(lǐng)域得到了廣泛應(yīng)用。本文以O(shè)penFOAM為求解器,以Shiny為操作界面界面,以linux腳本為控制后臺(tái),建立針對(duì)船模阻力計(jì)算的遠(yuǎn)程應(yīng)用。
基本技術(shù)路線示意見圖1。首先,用戶利用瀏覽器輸入計(jì)算參數(shù),并將其與幾何文件一同上傳至服務(wù)器端;隨后,腳本執(zhí)行相關(guān)動(dòng)作,實(shí)現(xiàn)計(jì)算和信息展示等功能。
圖1 基本技術(shù)路線示意
R-Shiny在整個(gè)技術(shù)路線中起到傳遞數(shù)據(jù)和信息的作用,連接用戶與服務(wù)器。輸入數(shù)據(jù),在服務(wù)器端生成可供腳本使用的,用于生成OpenFOAM計(jì)算策略的參數(shù)文件。調(diào)用生成的結(jié)果文件和計(jì)算排隊(duì)文件,返回至瀏覽器,供用戶參考。
腳本功能分為3部分,即:執(zhí)行計(jì)算;監(jiān)測(cè)計(jì)算收斂情況,控制OpenFOAM;收集、匯總信息。提交計(jì)算方案之后,腳本探測(cè)到新的文件,調(diào)用OpenFOAM執(zhí)行網(wǎng)格劃分和計(jì)算等任務(wù)。同時(shí),根據(jù)計(jì)算的阻力時(shí)歷數(shù)據(jù)判斷計(jì)算是否收斂,以及是否結(jié)束本案例的計(jì)算,實(shí)現(xiàn)對(duì)多個(gè)方案的自動(dòng)、連續(xù)計(jì)算,生成計(jì)算結(jié)果和多個(gè)方案的計(jì)算排隊(duì)文件。
OpenFOAM設(shè)置以模板的形式存儲(chǔ)在服務(wù)器內(nèi),其中參數(shù)設(shè)置隨計(jì)算條件的改變而改變,計(jì)算條件來(lái)源于用戶提交的參數(shù)文件。腳本自動(dòng)生成供OpenFOAM計(jì)算使用的參數(shù),如邊界條件和網(wǎng)格劃分參數(shù)等。
Shiny的代碼由ui和server組成,其中:ui用于設(shè)計(jì)瀏覽器展示內(nèi)容的布局和用戶交互的信息;server用于處理相應(yīng)的邏輯關(guān)系,對(duì)輸入的信息進(jìn)行處理,對(duì)輸出的信息進(jìn)行控制,對(duì)用戶的操作作出反應(yīng),產(chǎn)出對(duì)應(yīng)的結(jié)果。
網(wǎng)頁(yè)界面由信息輸入和信息展示2個(gè)區(qū)域組成。信息輸入?yún)^(qū)域見圖2,計(jì)算參數(shù)可通過(guò)讀取文件和在頁(yè)面中填寫2種方式提交;上傳的幾何文件為stl格式的文件,可通過(guò)三維建模軟件(如Rhino)導(dǎo)出獲得。通過(guò)下載數(shù)據(jù)功能可獲得當(dāng)前輸入的參數(shù)文件和結(jié)果查詢編號(hào),方便下次計(jì)算時(shí)直接讀取參數(shù)文件,不需要重新在界面中填寫;同時(shí),可通過(guò)查詢編號(hào)查詢本方案的計(jì)算結(jié)果和排隊(duì)情況。圖3為查詢編號(hào)輸入?yún)^(qū)域。
當(dāng)計(jì)算完成之后,輸入查詢編號(hào)即可獲得計(jì)算結(jié)果,包括阻力值和收斂過(guò)程。在阻力計(jì)算中采用半船,圖4為半船的阻力時(shí)歷曲線,表1為處理后的全船阻力。若查詢的方案沒(méi)有計(jì)算結(jié)束或沒(méi)有開始計(jì)算,則顯示該方案的排隊(duì)情況。
圖2 信息輸入?yún)^(qū)域
圖3 查詢編號(hào)輸入?yún)^(qū)域
圖4 半船的阻力時(shí)歷曲線
表1 處理后的全船阻力
server負(fù)責(zé)從讀入的文件或界面中獲取數(shù)據(jù),并將其轉(zhuǎn)換為可被腳本讀入的格式,同時(shí)將參數(shù)文件和幾何文件放在指定位置,供腳本調(diào)用。對(duì)于信息展示的處理,則是從指定位置讀取結(jié)果文件,并將其傳遞給網(wǎng)頁(yè)。
在執(zhí)行計(jì)算的腳本中,參考OpenFOAM的官方示例,將計(jì)算過(guò)程分為幾何特征提取、背景網(wǎng)格劃分、多次局部加密、有幾何物體的網(wǎng)格劃分、網(wǎng)格檢查、多相流設(shè)置、計(jì)算域拆分、并行計(jì)算和計(jì)算結(jié)果組合等過(guò)程。由于要在不同情況下應(yīng)用計(jì)算策略,在執(zhí)行上述計(jì)算任務(wù)之前,根據(jù)提交的參數(shù)文件獲得OpenFOAM配置文件中不同參數(shù)的數(shù)值,并對(duì)模板文件進(jìn)行替換,得到當(dāng)前算例的完整計(jì)算文件。具體腳本執(zhí)行計(jì)算流程見圖5。
在進(jìn)行數(shù)值模擬過(guò)程中,需高效利用計(jì)算資源和時(shí)間資源,及時(shí)判斷模擬結(jié)果是否穩(wěn)定收斂,結(jié)束當(dāng)前過(guò)程,并對(duì)后續(xù)方案進(jìn)行計(jì)算。OpenFOAM中的控制文件controlDict可在計(jì)算過(guò)程中進(jìn)行修改并立即起效。利用該特性修改controlDict中的endTime,使計(jì)算立即結(jié)束。
利用腳本監(jiān)測(cè)計(jì)算總阻力,以最新的300個(gè)計(jì)算步的變異系數(shù)為評(píng)估變量,設(shè)定的準(zhǔn)則為變異系數(shù)等于0.1。變異系數(shù)用于反映一組數(shù)據(jù)的離散程度,本文借此概念評(píng)估計(jì)算阻力的振蕩情況,進(jìn)而判斷計(jì)算是否穩(wěn)定。變異系數(shù)的表達(dá)式為
(1)
判斷標(biāo)準(zhǔn)為
<01
(2)
若當(dāng)前進(jìn)行了1 000個(gè)時(shí)間步的計(jì)算,則計(jì)算700~1 000個(gè)時(shí)間步內(nèi)總阻力的變異系數(shù),判斷其數(shù)值是否小于0.1。若該變異系數(shù)的值小于0.1,則自動(dòng)修改配置文件controlDict中的endTime字段數(shù)值為當(dāng)前對(duì)應(yīng)的模擬時(shí)間,結(jié)束本方案的計(jì)算;若該變異系數(shù)的值大于等于0.1,則繼續(xù)計(jì)算,以此類推,直至計(jì)算穩(wěn)定。腳本處理流程見圖6。
圖5 腳本執(zhí)行計(jì)算流程
圖6 腳本處理流程
計(jì)算結(jié)束之后,原始的計(jì)算結(jié)果被存儲(chǔ)到了服務(wù)器中,用戶無(wú)法直接讀取,需通過(guò)Shiny將計(jì)算結(jié)果傳遞到瀏覽器端,實(shí)現(xiàn)信息展示。腳本對(duì)阻力時(shí)歷結(jié)果中的最后300個(gè)時(shí)間步的數(shù)據(jù)取平均值,將其存儲(chǔ)在相應(yīng)的文件中和特定的位置上,內(nèi)容包括壓阻力、黏性阻力和總阻力。同時(shí),腳本控制Gnuplot繪圖工具,處理得到阻力時(shí)歷曲線,為用戶提供收斂過(guò)程,幫助其判斷計(jì)算是否正常。
獲取多個(gè)方案的計(jì)算排隊(duì)情況有助于用戶合理規(guī)劃工作時(shí)間。應(yīng)用腳本監(jiān)測(cè)待計(jì)算文件夾內(nèi)的方案和正在計(jì)算的方案,形成排隊(duì)情況信息匯總,以表格的形式在瀏覽器中展示。
OpenFOAM的配置文件包含眾多內(nèi)容,軟件的使用門檻較高。本文針對(duì)船舶阻力計(jì)算,基于大量水池試驗(yàn),總結(jié)一套可靠的計(jì)算策略,建立相應(yīng)的模板文件。用戶無(wú)需知道參數(shù)如何設(shè)置,在瀏覽器中填寫好計(jì)算條件之后,腳本自動(dòng)生成符合當(dāng)前方案的配置文件。
下面以網(wǎng)格加密的參數(shù)設(shè)置說(shuō)明如何利用模板和腳本生成計(jì)算配置文件。文件topoSetDict.1用于對(duì)船體周圍的某個(gè)長(zhǎng)方形區(qū)域進(jìn)行1次加密標(biāo)記,因此區(qū)域的大小與船模尺度有關(guān),否則將導(dǎo)致加密區(qū)域過(guò)大,網(wǎng)格數(shù)量過(guò)多,或沒(méi)有將船模包圍進(jìn)去,在劃分網(wǎng)格時(shí)出現(xiàn)錯(cuò)誤。
模板中topoSetDict.1文件中的box字段按以下方式編寫:
box (x1min y1min-3) (x1max 0 z1max);
腳本中采用以下命令:
sed-i "s/x1min/$x1min/g" system/topoSetDict.1
sed-i "s/x1max/$x1max/g" system/topoSetDict.1
將模板中的x1min和x1max替換為對(duì)應(yīng)的數(shù)值。x1min和x1max是與船模長(zhǎng)有關(guān)的變量,本文取
x1min=-pp
(3)
x1max=1.5pp
(4)
式(3)和式(4)中:pp為船模垂線間長(zhǎng),根據(jù)實(shí)船垂線間長(zhǎng)和縮尺比計(jì)算得到。其他的字段采用類似的方式替換,最終獲得用于計(jì)算的配置文件。
首先校核計(jì)算精度,為后續(xù)改進(jìn)提供基礎(chǔ)。從上海船舶運(yùn)輸科學(xué)研究所的模型試驗(yàn)數(shù)據(jù)庫(kù)中隨機(jī)抽取31艘船的試驗(yàn)數(shù)據(jù)作為樣本,選擇設(shè)計(jì)吃水和設(shè)計(jì)航速狀態(tài),采用該應(yīng)用進(jìn)行計(jì)算校核,得到的誤差分布柱形圖和核密度估計(jì)曲線見圖7。
圖7 誤差分布柱形圖和核密度估計(jì)曲線
計(jì)算誤差基本集中在±4%以內(nèi),占總計(jì)算樣本的93.5%,且在0附近比例最高,均值為-0.42%,說(shuō)明該應(yīng)用對(duì)船模阻力具有很好的模擬效果,可作為船型優(yōu)化和性能評(píng)估的輔助工具。
在該應(yīng)用發(fā)布之后的20 d內(nèi)共對(duì)4艘船的近50個(gè)方案進(jìn)行了計(jì)算,包括1艘客船、2艘多用途船和1艘大型散貨船,幫助完成了相關(guān)的優(yōu)化選型和性能評(píng)估工作。
為合理利用計(jì)算資源,方便船型優(yōu)化設(shè)計(jì)人員使用CFD工具評(píng)估船舶性能,結(jié)合R-Shiny和linux腳本實(shí)現(xiàn)了基于OpenFOAM的遠(yuǎn)程應(yīng)用開發(fā)。該應(yīng)用在輸入計(jì)算參數(shù)和幾何文件之后能自動(dòng)配置好OpenFOAM所需文件并執(zhí)行計(jì)算;計(jì)算過(guò)程中可判斷收斂情況,在保證結(jié)果穩(wěn)定的情況下,結(jié)束當(dāng)前算例并進(jìn)行后續(xù)計(jì)算。該應(yīng)用能極大地提高計(jì)算資源的使用效率,縮短不必要的模擬時(shí)間;同時(shí),能為用戶反饋必要的信息,實(shí)現(xiàn)關(guān)鍵信息展示。
該應(yīng)用使用簡(jiǎn)單,計(jì)算精度高,展示結(jié)果清晰,方便用戶進(jìn)行批量多方案計(jì)算;輸入的參數(shù)較少且能重復(fù)利用,同時(shí)對(duì)輸入的幾何文件要求低,無(wú)需額外進(jìn)行修整。
本文涉及到的服務(wù)器端的信息是在文件中存儲(chǔ)和傳遞的,在處理過(guò)程中略顯繁瑣。后續(xù)將考慮采用數(shù)據(jù)庫(kù)技術(shù),通過(guò)數(shù)據(jù)庫(kù)實(shí)現(xiàn)信息存儲(chǔ),高效地管理輸入信息和輸出信息。此外,可融入幾何變形工具和優(yōu)化算法,實(shí)現(xiàn)自主或半自主式優(yōu)化,提升船型優(yōu)化效率。