王圣軍 金 濤
(陜西師范大學物理學與信息技術學院 陜西 西安 710062)
計算物理教學中基于FORTRAN的結果可視化方法
王圣軍 金 濤
(陜西師范大學物理學與信息技術學院 陜西 西安 710062)
介紹在計算物理教學中配合Fortran語言進行可視化輸出的一種高效的方法.以利薩如圖形的模擬和可視化輸出作為例子介紹了這種可視化方法.這種方法結合了Fortran的系統函數功能和gnuplot的腳本功能,可以自動地把數據文件以圖形的方式顯示出來或者保存為圖片文件.整個可視化過程需要的繪圖代碼少,操作簡潔,并且所用軟件都是在科學研究中常用的免費軟件.通過這種方法能夠低成本高效地實現計算結果的可視化.
計算物理學 可視化 Fortran Gnuplot
隨著計算機在物理學中被廣泛地應用,計算物理已經成為一門重要的課程.在計算物理中將數據轉換為圖像進行可視化輸出,可以使結果直觀、易于理解,是使用計算機處理數據的一大優勢.所以計算結果的可視化輸出是計算物理教學中的一個重要環節[1].對于計算物理中常用的編程語言來說,圖形化輸出是一件麻煩的事情.比如Fortran語言和C語言標準本身沒有圖形輸出功能.
為了可視化輸出結果,有些教材采用了BASIC或者Java等有圖形功能的計算機語言,在程序中編寫圖形輸出的代碼.例如文獻[2]中采用的計算機語言是BASIC.在分子振動的半經典量子化的例子中,作者提供的程序包含了可視化輸出.程序代碼總長度是302行,而其中與圖形輸出相關的代碼子程序有172行.其中有大量的代碼被用來設定圖形輸出的環境和格式.這種可視化方式花費的代價比較大.在教學中解釋這些代碼需要花費比較多的時間.
在傳統的編程語言之外,MatLab是一個非常強大的工具,在計算和數據可視化方面的功能都非常豐富并且使用方便輸出美觀[3].但是傳統的編程語言在科學計算中仍被廣泛使用.所以本文關注配合傳統編程語言使用的繪圖工具和可視化輸出方法.
本文介紹了以Fortran語言作為教學語言的情況下計算結果可視化輸出的方法.我們選用的Fortran語言編譯器是Gfortran.這是一個性能良好的免費軟件,它既支持Fortran77也支持最新的Fortran語言標準.
我們選用的繪圖軟件是Gnuplot.這是一種比較常用的免費科學繪圖軟件,可以繪制函數和數據的2維以及3維圖.它常被用于科學出版物的繪圖,能在各種主流操作系統上運行,包括Windows,Linux等.Gnuplot可以把圖形直接輸出到屏幕上,也可以保存為多種格式的圖像文件,包括EPS,PDF,JPEG等.它可以通過命令行以交互的方式使用,也可以通過腳本以批處理模式使用.
我們通過一個例子來說明使用這些軟件進行可視化輸出的方法.這個例子是用Fortran語言寫程序輸出利薩如曲線.我們以腳本方式使用Gnuplot進行繪圖.首先建立一個Fortran源程序prog.f90.具體內容如下:
program main
implicit none
real :: x,y,omx,omy,phix,t,h
open(10,file=′x-y.txt′)
t=0;h=0.01
omx=3.0;omy=4.0;phix=3.1415926/2
do while(t<100)
x=sin(omx*t+phix)
y=sin(omy*t)
write(10,*)x,y
t=t+h
enddo
close(10)
call system("gnuplot pl.txt")
endprogram
然后,建立一個Gnuplot的腳本文件pl.txt.把這個文件和Fortran源程序文件prog.f90放在同一個文件夾里面.這個腳本文件是一個純文本文件.文件的內容只有兩行.具體內容如下:
plot ′x-y.txt′ with lines
pause-1
在Windows的命令窗口中,使用Gfortran編譯源程序的命令為:
gfortran prog.f90
編譯以后得到的可執行程序是a.exe.這個程序首先完成計算過程,把數據保存到文件”x-y.txt”中.然后當程序運行到call system("gnuplot pl.txt")的時候,它調用Gnuplot軟件.此時彈出如圖1所示的圖形輸出窗口.

圖1 Gnuplot的圖形輸出窗口
在程序prog.f90中,關于繪圖的代碼只有一行:
call system("gnuplot pl.txt")
在這里,我們使用了系統函數system(),括號中的字符串被傳遞給操作系統的命令窗口.這一句的功能是在命令窗口中調用Gnuplot并且讓它使用腳本pl.txt繪圖.
這里的Gnuplot腳本文件只有兩行.第一行使用了繪制2維圖的命令plot.在命令中寫入了數據文件的名字x-y.txt.Gnuplot軟件會去硬盤上讀取這個文件,用其中的數據進行繪圖.plot命令的選項with lines指定了使用線來繪圖.第二行pause-1指示Gnuplot在繪圖之后不要退出,而是等待輸入.這時在命令窗口中按Enter鍵就可以關閉圖形輸出窗口并退出Gnuplot.
系統函數system()在早期的Fortran語言標準中不是內部函數,但是多數編譯器都支持這個函數.在使用Gfortran進行編譯的時候可以直接使用這個函數.在使用Visual Fortran進行編譯的時候要使用一個模塊use DFPORT.在使用ifort編譯的情況下,要使用的模塊是use IFPORT.在最新的Fortran語言標準中已經包含了此功能,使用它的方法是調用標準的內部子程序:
call execute_command_line (“gnuplot pl.txt”)
在支持新標準的編譯器中使用這種方法時不需要在源程序中包含特殊的模塊.
這里介紹的做法實際等效于先保存數據文件,然后使用獨立的繪圖軟件導入數據,進行繪圖.但是Gnuplot的腳本功能使我們不需要操作繪圖軟件.Fortran語言的系統函數功能,結合Gnuplot的腳本功能,使得畫圖成為一個自動化的過程.這種方式在課堂演示中非常快捷方便.另外,在科學計算的編程和模擬中,快速地對結果進行圖形化輸出是檢驗程序是否存在錯誤或者尋找適當參數的快捷方法.所以這個方式在科學計算中也具有實際的應用價值.
在Gnuplot的腳本中可以通過簡單的命令進行更多的設置.這里介紹幾個常用的設置.首先,可以設定坐標軸上的標簽.例如使用命令:
set xlabel ′x′
set ylable ′y′
把x軸和y軸的標簽設定為x和y.其次,還可以使用對數坐標.設定坐標軸采用對數坐標的命令是:
set logscale x
set logscale y
也可以設定讓Gnuplot不把結果輸出到屏幕上,而是把結果保存成一個圖片文件.Gnuplot支持多種圖片格式.例如,可以把利薩如曲線輸出一個png格式的圖片.在腳本中首先設定輸出終端類型:
set terminal png
然后設定輸出文件名稱:
set output ′fig.png′
輸出為圖片文件時,腳本中不寫pause-1.一個完整腳本的例子如下:
set terminal png
set output ′fig.png′
set xlabel ′x′
set ylabel ′y′
plot ′x-y.txt′ with lines
使用這個腳本,得到的圖片如圖2所示.

圖2 Gnuplot輸出的圖片
Gnuplot盡管是一個免費軟件,但是目前已經被廣泛地應用到了科學研究的繪圖任務中.一些重要的免費版科學數據分析軟件是以Gnuplot為繪圖組件的.在計算物理中學習Gnuplot的簡單使用方法,對于未來的學習和研究都有潛在的幫助.此外,Gnuplot的使用方式和Matlab等商業版軟件比較接近,對于學習Matlab也有幫助.
結論:本文介紹了一種高效地把數值計算結果可視化輸出的方法.該方法結合了Fortran語言的系統函數功能和Gnuplot軟件的腳本繪圖功能,能夠自動化地把數據文件輸出到屏幕或者圖形文件,不需要操作繪圖軟件的中間過程,有利于實現高效的課堂演示.這種方式需要的代碼少,使用方便,容易掌握.這里介紹的所有軟件都是免費軟件,便于學生在個人計算機上使用,從而有利于學生靈活地開展計算物理課程的上機實踐.
1 彭芳麟, 梁穎. 科學計算可視化與計算物理學. 大學物理, 2013, 32(7): 2~12
2 S. E. Koonin著. 計算物理學. 秦克誠,譯. 北京: 高等教育出版社, 19923 彭芳麟. 計算物理基礎. 北京: 高等教育出版社, 2010
2016-11-24)