王江超, 趙宏權(quán)
(1.華中科技大學(xué) 船舶與海洋工程學(xué)院, 湖北 武漢 430074; 2.江蘇科技大學(xué) 材料科學(xué)與工程學(xué)院, 江蘇 鎮(zhèn)江 212003)
?
Fortran與Tcl混合編程以及VTk圖形可視化的研究
王江超1, 趙宏權(quán)2
(1.華中科技大學(xué) 船舶與海洋工程學(xué)院, 湖北 武漢 430074; 2.江蘇科技大學(xué) 材料科學(xué)與工程學(xué)院, 江蘇 鎮(zhèn)江 212003)
由于科學(xué)數(shù)值計(jì)算語(yǔ)言Fortran在圖形處理以及可視化方面的不足,提出了以腳本語(yǔ)言Tcl (Tool Command Language)作為主語(yǔ)言,與Tk(Toolkit)一起進(jìn)行圖形界面等方面的開(kāi)發(fā)設(shè)計(jì),并且直接使用強(qiáng)大的圖形處理工具包VTk(Visualization Toolkit),輕松實(shí)現(xiàn)可視化。同時(shí),在Tcl中,嵌入Fortran語(yǔ)言,實(shí)現(xiàn)混合編程,進(jìn)行功能擴(kuò)展。以焊接生產(chǎn)中的縱向收縮力(Tendon Force)與焊接熱輸入的關(guān)系為示例,展示如何以若干個(gè)基本數(shù)據(jù)為基礎(chǔ),通過(guò)在Fortran中實(shí)現(xiàn)最小二乘法來(lái)進(jìn)行線(xiàn)性擬合;然后,所有的計(jì)算分析過(guò)程都會(huì)在Tcl/Tk構(gòu)建的主程序用戶(hù)界面GUI(Graphic User Interface)中實(shí)時(shí)顯示出來(lái);最后,主程序調(diào)用VTk圖形處理工具包,將所有基本數(shù)據(jù)以及計(jì)算擬合的線(xiàn)性函數(shù)進(jìn)行可視化處理。
圖形用戶(hù)界面 VTk可視化 混合編程 最小二乘法 焊接縱向收縮力
自1946年,世界上第一臺(tái)真正意義上的計(jì)算機(jī)發(fā)明和應(yīng)用以來(lái),計(jì)算機(jī)在之后的數(shù)十年間快速發(fā)展并在各行業(yè)中廣泛使用。而且,伴隨其產(chǎn)生的計(jì)算機(jī)語(yǔ)言更是發(fā)展迅猛,到目前為止,大約有30多種計(jì)算機(jī)語(yǔ)言在不同的計(jì)算機(jī)平臺(tái)和不同的行業(yè)中被使用。
作為主要的科學(xué)數(shù)值計(jì)算語(yǔ)言,F(xiàn)ortran (Formula Translation的縮寫(xiě))是世界上公認(rèn)最早出現(xiàn)的計(jì)算機(jī)高級(jí)程序設(shè)計(jì)語(yǔ)言。因其具有快捷及強(qiáng)大的數(shù)值計(jì)算能力,被廣泛地應(yīng)用在科學(xué)和工程計(jì)算領(lǐng)域,其最大特點(diǎn)是對(duì)數(shù)字公式的直接描述和使用,在計(jì)算機(jī)里具有很高的執(zhí)行效率[1]。在20世紀(jì)50年代,F(xiàn)ortran由美國(guó)IBM公司開(kāi)發(fā)并發(fā)布。之后,為了解決兼容性問(wèn)題,美國(guó)標(biāo)準(zhǔn)化協(xié)會(huì)對(duì)其開(kāi)展標(biāo)準(zhǔn)化研究,公布的Fortran版本產(chǎn)生了廣泛影響,常被稱(chēng)為Fortran66。隨著結(jié)構(gòu)化程序設(shè)計(jì)方法的出現(xiàn)和興起,美國(guó)標(biāo)準(zhǔn)化協(xié)會(huì)將結(jié)構(gòu)化特征引入,公布了Fortran77,該版本在社會(huì)上得到了更廣泛的應(yīng)用。直至20世紀(jì)末,國(guó)際標(biāo)準(zhǔn)化組織(ISO)采納美國(guó)標(biāo)準(zhǔn)化協(xié)會(huì)的標(biāo)準(zhǔn),并將其確定為國(guó)際標(biāo)準(zhǔn),通常稱(chēng)之為Fortran90,之后又出現(xiàn)Fortran95。同時(shí),OpenMPI使Fortran可以實(shí)現(xiàn)并行計(jì)算,大幅提高了Fortran的計(jì)算能力。在Linux中,GCC編譯器默認(rèn)支持Fortran。然而,F(xiàn)ortran在人機(jī)圖形交互界面以及可視化方面的不足,使得其不得不與其他圖形計(jì)算處理語(yǔ)言相結(jié)合,來(lái)實(shí)現(xiàn)科學(xué)計(jì)算、數(shù)據(jù)處理以及圖形顯示等相關(guān)功能。
Tcl是工具命令語(yǔ)言(Tool Command Language)的縮寫(xiě),而Tk是Tcl的“圖形工具箱”擴(kuò)展,提供各種標(biāo)準(zhǔn)的GUI接口命令,以便迅速進(jìn)行圖形界面的設(shè)計(jì)和開(kāi)發(fā)。Tcl是在20世紀(jì)80年代,加州大學(xué)伯克利分校的Ouseterhout教授及其團(tuán)隊(duì)研究人員為了解決集成電路設(shè)計(jì)時(shí),命令語(yǔ)言和工具之間的高效協(xié)作性問(wèn)題,而開(kāi)發(fā)出的一種可以廣泛使用的腳本語(yǔ)言[2]。Tcl實(shí)際上包含兩個(gè)部分:一個(gè)語(yǔ)言和一個(gè)庫(kù)。其中庫(kù)包括分析器、用于執(zhí)行命令的例程以及使其擴(kuò)展的庫(kù)函數(shù)。在Linux系統(tǒng)中,需要兩個(gè)主要程序tclsh和wish。前者是Tcl的外殼,常用來(lái)為外殼腳本提供執(zhí)行環(huán)境;wish類(lèi)似tclsh,主要是針對(duì)窗口化的GUI環(huán)境??偟膩?lái)說(shuō),Tcl語(yǔ)言規(guī)則簡(jiǎn)單且實(shí)用,容易與其他語(yǔ)言進(jìn)行混合編程進(jìn)行功能擴(kuò)展,而且通過(guò)Tk與GUI緊密集成,易于設(shè)計(jì)開(kāi)發(fā)用戶(hù)界面。VTk(Visualization Toolkit)是一個(gè)開(kāi)放資源的免費(fèi)軟件系統(tǒng),主要用于三維計(jì)算機(jī)圖形學(xué)、圖形處理以及可視化。VTk是在面向?qū)ο笤淼幕A(chǔ)上設(shè)計(jì)和實(shí)現(xiàn)的,包含一個(gè)C++類(lèi)庫(kù),可以方便地通過(guò)Tcl/Tk 語(yǔ)言調(diào)用,并且可以在任何一個(gè)基于Linux 的平臺(tái)上運(yùn)行[3]。VTk是Kitware Inc 的開(kāi)放源碼產(chǎn)品,Kitware提供關(guān)于VTk的技術(shù)支持和各種服務(wù)產(chǎn)品,包括教科書(shū)和用戶(hù)指南:《The Visualization Toolkit An Object-Orientated Approach to 3D Graphic》, 《The Visualization Toolkit User’s Guide》。
本研究中,以Tcl/Tk語(yǔ)言為基礎(chǔ)語(yǔ)言構(gòu)建程序的整體性框架。然后,以Fortran語(yǔ)言編寫(xiě)數(shù)值計(jì)算子程序獲得輸入數(shù)據(jù),并以VTk為后處理平臺(tái)對(duì)Fortran計(jì)算的數(shù)據(jù)做可視化分析。為確認(rèn)程序的整體架構(gòu)以及相關(guān)功能,實(shí)例展示了通過(guò)最小二乘法建立焊接中的縱向收縮力(Tendon Force)與焊接熱輸入的關(guān)系,并實(shí)時(shí)輸出分析過(guò)程,最后將最終計(jì)算結(jié)果可視化。
本文的主要目的是在Tcl/Tk構(gòu)建的主程序中,以Fortran程序?yàn)榛A(chǔ)實(shí)施線(xiàn)性擬合,獲得線(xiàn)性函數(shù)的相關(guān)參數(shù)。同時(shí),主程序?qū)崟r(shí)在Tcl/Tk建立的GUI中顯示線(xiàn)性擬合的過(guò)程。求解完畢之后,主程序調(diào)用圖形處理工具包VTk顯示計(jì)算結(jié)果。為了實(shí)現(xiàn)上述的程序功能,以下的相關(guān)概念被依次簡(jiǎn)要介紹并給出代碼示例。
1.1 最小二乘法的線(xiàn)性擬合
在科學(xué)研究中,線(xiàn)性擬合是最為常見(jiàn)且廣泛使用的參數(shù)化數(shù)據(jù)分析技術(shù),而最小二乘法是實(shí)現(xiàn)這一數(shù)據(jù)分析技術(shù)的基礎(chǔ)。
假設(shè)有一組數(shù)據(jù){(xi,yi)},其中i=1,…,n,要通過(guò)最小二乘法建立其線(xiàn)性關(guān)系。
則令 y=ax+b;
當(dāng)x=xi時(shí),y(xi)=axi+b。
估算y(xi)與實(shí)際yi之間的距離為d(xi)=|yi-(axi+b)|。
若d(xi)越小,則擬合的線(xiàn)性函數(shù)越趨于實(shí)際值。同理,可知參數(shù)a和b應(yīng)使得下式D2(xi)取最小值,則線(xiàn)性擬合精度最好。
D2(xi)=(yi-(axi+b))2
考慮所有已知數(shù)據(jù),則有
為使上式取最小值,則必須滿(mǎn)足下式方程。
解上述方程組可得參數(shù)a和b分別為
1.2 同步/實(shí)時(shí)輸出
要在Tcl/Tk建立的GUI界面中,實(shí)時(shí)輸出Fortran語(yǔ)言的計(jì)算結(jié)果,可以使用Tcl語(yǔ)言中的fileevent(文件事件)函數(shù)功能來(lái)完成[2,4-5]。
fileevent常被用來(lái)允許另一個(gè)進(jìn)程中的數(shù)據(jù)可以被接收,接收程序可以在等待數(shù)據(jù)傳輸?shù)耐瑫r(shí)繼續(xù)與用戶(hù)進(jìn)行交互操作。當(dāng)所有數(shù)據(jù)傳輸完成之后,文件結(jié)束標(biāo)示eof會(huì)被設(shè)置激活,而fileevent操作結(jié)束,數(shù)據(jù)傳輸通道也隨即被關(guān)閉。
具體來(lái)說(shuō),主程序需要先設(shè)置一個(gè)數(shù)據(jù)傳輸通道(pipe/channel);當(dāng)該通道可以被讀寫(xiě)的時(shí)候,fileevent將會(huì)在全局層面上執(zhí)行一個(gè)腳本來(lái)實(shí)現(xiàn)數(shù)據(jù)操作,并實(shí)時(shí)顯示出來(lái)。
Namespace eval my{}
// 打開(kāi)一個(gè)可執(zhí)行文件,并與其建立一個(gè)數(shù)據(jù)通道
set pipe [open | executable program]
// 設(shè)置數(shù)據(jù)傳輸任務(wù)未完成
set my::jobDone "false"
// 一旦數(shù)據(jù)通道中有數(shù)據(jù)存在,且其可讀時(shí),該數(shù)據(jù)即時(shí)會(huì)被GetData子過(guò)程操作處理
fileevent $pipe readable [list GetData $pipe]
// 等待所有數(shù)據(jù)傳輸完成,關(guān)閉通道
vwait my::jobDone
// GetData子過(guò)程:實(shí)時(shí)處理可執(zhí)行程序產(chǎn)生的數(shù)據(jù),直到該可執(zhí)行程序結(jié)束
proc GetData {
if {eof $pipe} {
set my::jobDone "true"
return
}
puts [gets $pipe]
}。
1.3 數(shù)據(jù)讀取
Fortran程序運(yùn)行完成之后,會(huì)將所有數(shù)據(jù)保存在一個(gè)文本文件中,Tcl主程序需要打開(kāi)該文件,并讀取所需要的數(shù)據(jù)。
List(列表)做為T(mén)cl中的基本對(duì)象和概念,可以被用來(lái)方便完成文件的讀取。List常常被看作一個(gè)包含有任意個(gè)元素(元素可以是任意字符串,也可以是一個(gè)子列表),且用空格或者表格字符相互分離的字符串。同時(shí),使用命令lindex和元素下標(biāo)(從零開(kāi)始)可提取該列表中對(duì)應(yīng)的元素內(nèi)容。
Set Data1 [lindex $lineCard 0]
Set Data2 [lindex $lineCard 1]
……
Set Data3 [lindex $lineCard 2]。
1.4 幾何圖形可視化
要在Tcl/Tk平臺(tái)上實(shí)現(xiàn)圖形可視化,需調(diào)用圖形工具包VTk(Visualization Toolkit)??傮w而言,用VTk進(jìn)行可視化應(yīng)用是非常方便的,它包括兩個(gè)基本部分。首先,建立適當(dāng)?shù)哪繕?biāo)圖形來(lái)獲取并顯示數(shù)據(jù);其次,建立一個(gè)數(shù)據(jù)流水線(xiàn)(data pipeline)來(lái)處理數(shù)據(jù),建立流水線(xiàn)就是將數(shù)據(jù)源、過(guò)濾器以及映射器連接起來(lái)。具體來(lái)說(shuō),需要使用和設(shè)置的有數(shù)據(jù)源(vtkPoints,vtkLined等)、映射源(vtkPolyDataMapper)、演員(vtkActor)、繪制器(vtkRenderer)以及繪制窗口(vtkRenderWindow)等操作對(duì)象[6]。
如下是一個(gè)顯示點(diǎn)(Point)的示例代碼。
// 設(shè)置數(shù)據(jù)源,定義Point坐標(biāo)
vtkPoints Points
Points InsertPoint 0 x0 y0 z0
// 將數(shù)據(jù)源轉(zhuǎn)化為圖像對(duì)象
vtkVertex MyVertices
[MyVertices GetPointIds] SetId 0 0
// 對(duì)圖像對(duì)象進(jìn)行設(shè)置
vtkCellArray Vertices
Vertices InsertNextCell MyVertices
// 建立繪制對(duì)象的圖形對(duì)象及其數(shù)據(jù)源
vtkPolyData Nodes
Nodes SetPoints Points
Nodes SetVerts Vertices
// 建立繪制對(duì)象的映射源
vtkPolyDataMapper MapperNode
MapperNode SetInput Nodes
// 建立演員對(duì)象及基本設(shè)置
vtkActor ActorNode
ActorNode Setmapper MapperNode
[ActorNode GetProperty] Setcolor 1.0 1.0 1.0
[ActorNode GetProperty] SetPointSize 10.0
// 建立繪制器及要繪制的演員對(duì)象
vtkRender Ren
Ren SetBackground 0.0 0.0 .0.0
Ren AddActor ActorNode
// 建立繪制窗口及設(shè)置對(duì)應(yīng)的繪制器
vtkRenderWindow RenWin
RenWin AddRenderer Ren
RenWin Render。
程序的整體構(gòu)架以Tcl/Tk語(yǔ)言為基礎(chǔ),顯示Fortran語(yǔ)言的計(jì)算分析過(guò)程,且使用其結(jié)果作為圖形輸入文件,調(diào)用VTk工具包可視化Fortran的計(jì)算結(jié)果。圖1給出了上述的程序架構(gòu)及相關(guān)數(shù)據(jù)流。
該整體架構(gòu)主要有三部分組成:(1)Fortran程序與GUI的交互操作;(2)Tcl/Tk主程序依次讀取計(jì)算結(jié)果;(3)VTk相關(guān)設(shè)置并可視化計(jì)算結(jié)果。
2.1 Fortran程序運(yùn)行及實(shí)時(shí)顯示
要在Fortran中通過(guò)最小二乘法實(shí)現(xiàn)線(xiàn)性擬合,首先需要程序讀取基礎(chǔ)數(shù)據(jù),然后依照1.1節(jié)中描述的數(shù)學(xué)理論進(jìn)行代碼編程,計(jì)算線(xiàn)性擬合函數(shù)的參數(shù)。在計(jì)算過(guò)程中,各相關(guān)變量以及程序運(yùn)行狀況將通過(guò)1.2節(jié)中介紹的文件事件(fileevent)實(shí)時(shí)在主程序的圖形界面GUI中顯示出來(lái)。
圖1 程序整體架構(gòu)及相關(guān)數(shù)據(jù)流
2.2 Tcl/Tk讀取計(jì)算數(shù)據(jù)
當(dāng)Fortran程序全部運(yùn)行完成之后,所有中間產(chǎn)生的數(shù)據(jù)以及計(jì)算結(jié)果都會(huì)被保存在一個(gè)文本文件中,Tcl需要打開(kāi)該文件,僅需要讀取圖形顯示所需的計(jì)算結(jié)果數(shù)據(jù)。使用1.3節(jié)中的列表List及其相關(guān)命令操作,可對(duì)文件及其存儲(chǔ)數(shù)據(jù)進(jìn)行讀取操作。
2.3 VTk相關(guān)設(shè)置及可視化
如果要可視化計(jì)算結(jié)果,需將計(jì)算結(jié)果從存儲(chǔ)文件中讀取,賦給VTk中的基本圖形對(duì)象,其操作與1.4節(jié)所示的直接定義Point坐標(biāo)位置略有不同。具體代碼如下所示。
// 設(shè)置需要讀取的計(jì)算結(jié)果文件
Set readfile [open Datafile]
// 設(shè)置數(shù)據(jù)源,定義Point坐標(biāo)
vtkPoints points
for {set I 0} {$i < NumberPoint} {incr i} {
set LineCard [gets $readfile]
set IndexPoint [lindex $LineCard 0]
set XPoint [lindex $LineCard 1]
setYPoint [lindex $LineCard 2]
set ZPoint [lindex $LineCard 3]
points insertPoint $IndexPoint $ XPoint $YPoint $ ZPoint
}。
之后的部分與常見(jiàn)的VTk圖形操作相同,不再贅敘。
該節(jié)以線(xiàn)性擬合焊接中縱向收縮力(Tendon Force)與焊接熱輸入的關(guān)系來(lái)進(jìn)行實(shí)例展示。在Tcl/Tk中建立的實(shí)現(xiàn)該實(shí)例的圖形界面如圖2所示。
圖2 GUI界面
同時(shí),表1給出了線(xiàn)性擬合的基本數(shù)據(jù),即在不同焊接熱輸入下的縱向收縮力數(shù)值[7]。
當(dāng)單擊按鈕“Linear Fitting”時(shí),運(yùn)行Fortran程序,通過(guò)最小二乘法進(jìn)行線(xiàn)性擬合,相關(guān)分析過(guò)程以及線(xiàn)性擬合結(jié)果全在圖形界面GUI中顯示出來(lái),如圖3所示。
表1 不同焊接熱輸入產(chǎn)生的縱向收縮力
圖3 在GUI中顯示的線(xiàn)性擬合過(guò)程
需要進(jìn)行可視化時(shí),單擊“Visualization”按鈕,主程序會(huì)先讀取Fortran程序產(chǎn)生并存儲(chǔ)在文本文件中的數(shù)據(jù),將其賦值給VTk的圖形對(duì)象,并可視化計(jì)算結(jié)果,如圖4所示。
圖4 實(shí)例分析的基本數(shù)據(jù)以及線(xiàn)性擬合結(jié)果的可視化
由基本數(shù)據(jù)擬合所得的焊接縱向收縮力(Tendon Force)與焊接熱輸入的關(guān)系為
Ftendon=0.19285843Qnet+1.1272670
其中,焊接縱向收縮力和焊接熱輸入的單位分別為kN和J/mm。該擬合結(jié)果與相關(guān)研究成果具有良好的一致性[8-9]。
本文通過(guò)最小二乘法進(jìn)行線(xiàn)性擬合來(lái)建立焊接縱向收縮力(Tendon Force)和焊接熱輸入之間關(guān)系的實(shí)例,系統(tǒng)闡述了如何用科學(xué)計(jì)算語(yǔ)言Fortran實(shí)施線(xiàn)性最小二乘法擬合,并將程序運(yùn)行結(jié)果實(shí)時(shí)在圖形界面GUI中顯示,當(dāng)Fortran程序運(yùn)行完畢之后,將相關(guān)結(jié)果調(diào)用圖形工具包VTk進(jìn)行可視化處理。具體結(jié)論包括以下幾點(diǎn)。
(1) 以Tcl/Tk語(yǔ)言為基礎(chǔ)創(chuàng)建圖形用戶(hù)界面GUI,并構(gòu)建科學(xué)計(jì)算與圖形可視化程序平臺(tái)。
(2) 通過(guò)Fortran和Tcl/Tk混合編程,快速有效地實(shí)現(xiàn)科學(xué)計(jì)算與圖形用戶(hù)界面等相關(guān)操作;fileevent可使科學(xué)計(jì)算過(guò)程實(shí)時(shí)在圖形用戶(hù)界面顯示。
(3) Tcl可使用List概念以及l(fā)index命令對(duì)文件進(jìn)行逐行讀取操作。
(4) 在Tcl中,調(diào)用圖形工具包VTk,可以方便地實(shí)現(xiàn)科學(xué)計(jì)算結(jié)果的可視化。
[1] Stephen J, Chapman. Fortran 90/95 for Scientists and Engineers (Second Edition) [M]. McGraw Hill Higher Education Publication, 2003.
[2] John K Ousterhout, Ken J. Tcl and the Tk Toolkit (2nd Edition) [M]. Addison Wesley Professional Publication, 2009.
[3] Will Schroeder, Ken Martin, Bill Lorensen. The Visualization Toolkit: An Object-Orientated Approach to 3D Graphic (Fourth Edition) [M]. Kitware Inc, 2006.
[4] Brent B Welch, Ken J. Practical Programming in Tcl and Tk (4th Edition)[M]. Prentice Hall, 2003.
[5] Eric Foster Johnson. Graphical Applications with Tcl and Tk (Second Edition) [M]. M&T Books, 1997.
[6] Kitware, Inc. The Visualization Toolkit User’s Guide [M]. Kitware, Inc, 2003.
[7] Wang J C, Hidekazu Murakawa. Fundamental Study of Buckling Behavior in Thin Plate Butt Welding by the Inherent Deformation Method [J]. Trends in Welding Research, Proceedings of the 9th International Conference (ASM International), 2012(9): 165-173.
[8] 羅宇,魯華益,謝雷,等. Tendon Force的概念及計(jì)算方法[J]. 造船技術(shù), 2004(04): 35-37.
[9] White J D, Leggatt R H, Dwight J B. Weld shrinkage prediction[J]. Welding and Metal Fabrication, 1980(11): 587-596.
Study on Mixed-Programming by Fortran / Tcl and Graphical Visualization with VTk
WANG Jiang-chao1, ZHAO Hong-quan2
(1.School of Naval Architecture and Ocean Engineering, Huazhong University of Science and Technology, Wuhan Hubei, 430074, China; 2.School of Material Science and Engineering,Jiangsu University of Science and Technology, Zhenjiang Jiangsu 212003, China)
Due to the disadvantages of scientific numerical computing language (Fortran) on graphic analysis and visualization, a proposal was presented to consider the script language Tcl as dominant programming language. Tcl usually develops the graphic interface with Tk and directly employs VTk for graphic visualization. Meanwhile, Tcl can plug in other programming language to implement mixed-programming and extend functions. In this study, taking the relation between Tendon force and welding heat input as an example, investigation demonstrates that how to carry out least square method for linear fitting with some basic data in Fortran. All computational procedure will be displayed immediately in GUI produced by Tcl/Tk, and VTk was employed to visualize the basic data and computed linear fitting function.
GUI VTk visualization Mixed programming Least square method Tendon force
中央高?;究蒲袠I(yè)務(wù)費(fèi)專(zhuān)項(xiàng)資金(編號(hào):2015MS102)資助。
王江超(1983-),男,副教授,主要從事有限元分析、數(shù)值計(jì)算方法等在焊接殘余應(yīng)力和變形預(yù)測(cè)中的應(yīng)用,還進(jìn)行相關(guān)程序?qū)崿F(xiàn)和軟件開(kāi)發(fā)等方面的研究工作。
TP391
A