Fortran与Tcl混合编程以及VTk图形可视化的研究
2016-12-28王江超赵宏权
王江超, 赵宏权
(1.华中科技大学 船舶与海洋工程学院, 湖北 武汉 430074; 2.江苏科技大学 材料科学与工程学院, 江苏 镇江 212003)
Fortran与Tcl混合编程以及VTk图形可视化的研究
王江超1, 赵宏权2
(1.华中科技大学 船舶与海洋工程学院, 湖北 武汉 430074; 2.江苏科技大学 材料科学与工程学院, 江苏 镇江 212003)
由于科学数值计算语言Fortran在图形处理以及可视化方面的不足,提出了以脚本语言Tcl (Tool Command Language)作为主语言,与Tk(Toolkit)一起进行图形界面等方面的开发设计,并且直接使用强大的图形处理工具包VTk(Visualization Toolkit),轻松实现可视化。同时,在Tcl中,嵌入Fortran语言,实现混合编程,进行功能扩展。以焊接生产中的纵向收缩力(Tendon Force)与焊接热输入的关系为示例,展示如何以若干个基本数据为基础,通过在Fortran中实现最小二乘法来进行线性拟合;然后,所有的计算分析过程都会在Tcl/Tk构建的主程序用户界面GUI(Graphic User Interface)中实时显示出来;最后,主程序调用VTk图形处理工具包,将所有基本数据以及计算拟合的线性函数进行可视化处理。
图形用户界面 VTk可视化 混合编程 最小二乘法 焊接纵向收缩力
0 前言
自1946年,世界上第一台真正意义上的计算机发明和应用以来,计算机在之后的数十年间快速发展并在各行业中广泛使用。而且,伴随其产生的计算机语言更是发展迅猛,到目前为止,大约有30多种计算机语言在不同的计算机平台和不同的行业中被使用。
作为主要的科学数值计算语言,Fortran (Formula Translation的缩写)是世界上公认最早出现的计算机高级程序设计语言。因其具有快捷及强大的数值计算能力,被广泛地应用在科学和工程计算领域,其最大特点是对数字公式的直接描述和使用,在计算机里具有很高的执行效率[1]。在20世纪50年代,Fortran由美国IBM公司开发并发布。之后,为了解决兼容性问题,美国标准化协会对其开展标准化研究,公布的Fortran版本产生了广泛影响,常被称为Fortran66。随着结构化程序设计方法的出现和兴起,美国标准化协会将结构化特征引入,公布了Fortran77,该版本在社会上得到了更广泛的应用。直至20世纪末,国际标准化组织(ISO)采纳美国标准化协会的标准,并将其确定为国际标准,通常称之为Fortran90,之后又出现Fortran95。同时,OpenMPI使Fortran可以实现并行计算,大幅提高了Fortran的计算能力。在Linux中,GCC编译器默认支持Fortran。然而,Fortran在人机图形交互界面以及可视化方面的不足,使得其不得不与其他图形计算处理语言相结合,来实现科学计算、数据处理以及图形显示等相关功能。
Tcl是工具命令语言(Tool Command Language)的缩写,而Tk是Tcl的“图形工具箱”扩展,提供各种标准的GUI接口命令,以便迅速进行图形界面的设计和开发。Tcl是在20世纪80年代,加州大学伯克利分校的Ouseterhout教授及其团队研究人员为了解决集成电路设计时,命令语言和工具之间的高效协作性问题,而开发出的一种可以广泛使用的脚本语言[2]。Tcl实际上包含两个部分:一个语言和一个库。其中库包括分析器、用于执行命令的例程以及使其扩展的库函数。在Linux系统中,需要两个主要程序tclsh和wish。前者是Tcl的外壳,常用来为外壳脚本提供执行环境;wish类似tclsh,主要是针对窗口化的GUI环境。总的来说,Tcl语言规则简单且实用,容易与其他语言进行混合编程进行功能扩展,而且通过Tk与GUI紧密集成,易于设计开发用户界面。VTk(Visualization Toolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学、图形处理以及可视化。VTk是在面向对象原理的基础上设计和实现的,包含一个C++类库,可以方便地通过Tcl/Tk 语言调用,并且可以在任何一个基于Linux 的平台上运行[3]。VTk是Kitware Inc 的开放源码产品,Kitware提供关于VTk的技术支持和各种服务产品,包括教科书和用户指南:《The Visualization Toolkit An Object-Orientated Approach to 3D Graphic》, 《The Visualization Toolkit User’s Guide》。
本研究中,以Tcl/Tk语言为基础语言构建程序的整体性框架。然后,以Fortran语言编写数值计算子程序获得输入数据,并以VTk为后处理平台对Fortran计算的数据做可视化分析。为确认程序的整体架构以及相关功能,实例展示了通过最小二乘法建立焊接中的纵向收缩力(Tendon Force)与焊接热输入的关系,并实时输出分析过程,最后将最终计算结果可视化。
1 相关概念及代码示例
本文的主要目的是在Tcl/Tk构建的主程序中,以Fortran程序为基础实施线性拟合,获得线性函数的相关参数。同时,主程序实时在Tcl/Tk建立的GUI中显示线性拟合的过程。求解完毕之后,主程序调用图形处理工具包VTk显示计算结果。为了实现上述的程序功能,以下的相关概念被依次简要介绍并给出代码示例。
1.1 最小二乘法的线性拟合
在科学研究中,线性拟合是最为常见且广泛使用的参数化数据分析技术,而最小二乘法是实现这一数据分析技术的基础。
假设有一组数据{(xi,yi)},其中i=1,…,n,要通过最小二乘法建立其线性关系。
则令 y=ax+b;
当x=xi时,y(xi)=axi+b。
估算y(xi)与实际yi之间的距离为d(xi)=|yi-(axi+b)|。
若d(xi)越小,则拟合的线性函数越趋于实际值。同理,可知参数a和b应使得下式D2(xi)取最小值,则线性拟合精度最好。
D2(xi)=(yi-(axi+b))2
考虑所有已知数据,则有
为使上式取最小值,则必须满足下式方程。
解上述方程组可得参数a和b分别为
1.2 同步/实时输出
要在Tcl/Tk建立的GUI界面中,实时输出Fortran语言的计算结果,可以使用Tcl语言中的fileevent(文件事件)函数功能来完成[2,4-5]。
fileevent常被用来允许另一个进程中的数据可以被接收,接收程序可以在等待数据传输的同时继续与用户进行交互操作。当所有数据传输完成之后,文件结束标示eof会被设置激活,而fileevent操作结束,数据传输通道也随即被关闭。
具体来说,主程序需要先设置一个数据传输通道(pipe/channel);当该通道可以被读写的时候,fileevent将会在全局层面上执行一个脚本来实现数据操作,并实时显示出来。
Namespace eval my{}
// 打开一个可执行文件,并与其建立一个数据通道
set pipe [open | executable program]
// 设置数据传输任务未完成
set my::jobDone "false"
// 一旦数据通道中有数据存在,且其可读时,该数据即时会被GetData子过程操作处理
fileevent $pipe readable [list GetData $pipe]
// 等待所有数据传输完成,关闭通道
vwait my::jobDone
// GetData子过程:实时处理可执行程序产生的数据,直到该可执行程序结束
proc GetData {
if {eof $pipe} {
set my::jobDone "true"
return
}
puts [gets $pipe]
}。
1.3 数据读取
Fortran程序运行完成之后,会将所有数据保存在一个文本文件中,Tcl主程序需要打开该文件,并读取所需要的数据。
List(列表)做为Tcl中的基本对象和概念,可以被用来方便完成文件的读取。List常常被看作一个包含有任意个元素(元素可以是任意字符串,也可以是一个子列表),且用空格或者表格字符相互分离的字符串。同时,使用命令lindex和元素下标(从零开始)可提取该列表中对应的元素内容。
Set Data1 [lindex $lineCard 0]
Set Data2 [lindex $lineCard 1]
……
Set Data3 [lindex $lineCard 2]。
1.4 几何图形可视化
要在Tcl/Tk平台上实现图形可视化,需调用图形工具包VTk(Visualization Toolkit)。总体而言,用VTk进行可视化应用是非常方便的,它包括两个基本部分。首先,建立适当的目标图形来获取并显示数据;其次,建立一个数据流水线(data pipeline)来处理数据,建立流水线就是将数据源、过滤器以及映射器连接起来。具体来说,需要使用和设置的有数据源(vtkPoints,vtkLined等)、映射源(vtkPolyDataMapper)、演员(vtkActor)、绘制器(vtkRenderer)以及绘制窗口(vtkRenderWindow)等操作对象[6]。
如下是一个显示点(Point)的示例代码。
// 设置数据源,定义Point坐标
vtkPoints Points
Points InsertPoint 0 x0 y0 z0
// 将数据源转化为图像对象
vtkVertex MyVertices
[MyVertices GetPointIds] SetId 0 0
// 对图像对象进行设置
vtkCellArray Vertices
Vertices InsertNextCell MyVertices
// 建立绘制对象的图形对象及其数据源
vtkPolyData Nodes
Nodes SetPoints Points
Nodes SetVerts Vertices
// 建立绘制对象的映射源
vtkPolyDataMapper MapperNode
MapperNode SetInput Nodes
// 建立演员对象及基本设置
vtkActor ActorNode
ActorNode Setmapper MapperNode
[ActorNode GetProperty] Setcolor 1.0 1.0 1.0
[ActorNode GetProperty] SetPointSize 10.0
// 建立绘制器及要绘制的演员对象
vtkRender Ren
Ren SetBackground 0.0 0.0 .0.0
Ren AddActor ActorNode
// 建立绘制窗口及设置对应的绘制器
vtkRenderWindow RenWin
RenWin AddRenderer Ren
RenWin Render。
2 整体构架及各模块功能实现
程序的整体构架以Tcl/Tk语言为基础,显示Fortran语言的计算分析过程,且使用其结果作为图形输入文件,调用VTk工具包可视化Fortran的计算结果。图1给出了上述的程序架构及相关数据流。
该整体架构主要有三部分组成:(1)Fortran程序与GUI的交互操作;(2)Tcl/Tk主程序依次读取计算结果;(3)VTk相关设置并可视化计算结果。
2.1 Fortran程序运行及实时显示
要在Fortran中通过最小二乘法实现线性拟合,首先需要程序读取基础数据,然后依照1.1节中描述的数学理论进行代码编程,计算线性拟合函数的参数。在计算过程中,各相关变量以及程序运行状况将通过1.2节中介绍的文件事件(fileevent)实时在主程序的图形界面GUI中显示出来。
图1 程序整体架构及相关数据流
2.2 Tcl/Tk读取计算数据
当Fortran程序全部运行完成之后,所有中间产生的数据以及计算结果都会被保存在一个文本文件中,Tcl需要打开该文件,仅需要读取图形显示所需的计算结果数据。使用1.3节中的列表List及其相关命令操作,可对文件及其存储数据进行读取操作。
2.3 VTk相关设置及可视化
如果要可视化计算结果,需将计算结果从存储文件中读取,赋给VTk中的基本图形对象,其操作与1.4节所示的直接定义Point坐标位置略有不同。具体代码如下所示。
// 设置需要读取的计算结果文件
Set readfile [open Datafile]
// 设置数据源,定义Point坐标
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
}。
之后的部分与常见的VTk图形操作相同,不再赘叙。
3 实例展示
该节以线性拟合焊接中纵向收缩力(Tendon Force)与焊接热输入的关系来进行实例展示。在Tcl/Tk中建立的实现该实例的图形界面如图2所示。
图2 GUI界面
同时,表1给出了线性拟合的基本数据,即在不同焊接热输入下的纵向收缩力数值[7]。
当单击按钮“Linear Fitting”时,运行Fortran程序,通过最小二乘法进行线性拟合,相关分析过程以及线性拟合结果全在图形界面GUI中显示出来,如图3所示。
表1 不同焊接热输入产生的纵向收缩力
图3 在GUI中显示的线性拟合过程
需要进行可视化时,单击“Visualization”按钮,主程序会先读取Fortran程序产生并存储在文本文件中的数据,将其赋值给VTk的图形对象,并可视化计算结果,如图4所示。
图4 实例分析的基本数据以及线性拟合结果的可视化
由基本数据拟合所得的焊接纵向收缩力(Tendon Force)与焊接热输入的关系为
Ftendon=0.19285843Qnet+1.1272670
其中,焊接纵向收缩力和焊接热输入的单位分别为kN和J/mm。该拟合结果与相关研究成果具有良好的一致性[8-9]。
4 结论
本文通过最小二乘法进行线性拟合来建立焊接纵向收缩力(Tendon Force)和焊接热输入之间关系的实例,系统阐述了如何用科学计算语言Fortran实施线性最小二乘法拟合,并将程序运行结果实时在图形界面GUI中显示,当Fortran程序运行完毕之后,将相关结果调用图形工具包VTk进行可视化处理。具体结论包括以下几点。
(1) 以Tcl/Tk语言为基础创建图形用户界面GUI,并构建科学计算与图形可视化程序平台。
(2) 通过Fortran和Tcl/Tk混合编程,快速有效地实现科学计算与图形用户界面等相关操作;fileevent可使科学计算过程实时在图形用户界面显示。
(3) Tcl可使用List概念以及lindex命令对文件进行逐行读取操作。
(4) 在Tcl中,调用图形工具包VTk,可以方便地实现科学计算结果的可视化。
[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]. 造船技术, 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
中央高校基本科研业务费专项资金(编号:2015MS102)资助。
王江超(1983-),男,副教授,主要从事有限元分析、数值计算方法等在焊接残余应力和变形预测中的应用,还进行相关程序实现和软件开发等方面的研究工作。
TP391
A