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

圖1 Gnuplot的圖形輸出窗口
在程序prog.f90中,關(guān)于繪圖的代碼只有一行:
call system("gnuplot pl.txt")
在這里,我們使用了系統(tǒng)函數(shù)system(),括號中的字符串被傳遞給操作系統(tǒng)的命令窗口.這一句的功能是在命令窗口中調(diào)用Gnuplot并且讓它使用腳本pl.txt繪圖.
這里的Gnuplot腳本文件只有兩行.第一行使用了繪制2維圖的命令plot.在命令中寫入了數(shù)據(jù)文件的名字x-y.txt.Gnuplot軟件會去硬盤上讀取這個文件,用其中的數(shù)據(jù)進(jìn)行繪圖.plot命令的選項with lines指定了使用線來繪圖.第二行pause-1指示Gnuplot在繪圖之后不要退出,而是等待輸入.這時在命令窗口中按Enter鍵就可以關(guān)閉圖形輸出窗口并退出Gnuplot.
系統(tǒng)函數(shù)system()在早期的Fortran語言標(biāo)準(zhǔn)中不是內(nèi)部函數(shù),但是多數(shù)編譯器都支持這個函數(shù).在使用Gfortran進(jìn)行編譯的時候可以直接使用這個函數(shù).在使用Visual Fortran進(jìn)行編譯的時候要使用一個模塊use DFPORT.在使用ifort編譯的情況下,要使用的模塊是use IFPORT.在最新的Fortran語言標(biāo)準(zhǔn)中已經(jīng)包含了此功能,使用它的方法是調(diào)用標(biāo)準(zhǔn)的內(nèi)部子程序:
call execute_command_line (“gnuplot pl.txt”)
在支持新標(biāo)準(zhǔn)的編譯器中使用這種方法時不需要在源程序中包含特殊的模塊.
這里介紹的做法實際等效于先保存數(shù)據(jù)文件,然后使用獨立的繪圖軟件導(dǎo)入數(shù)據(jù),進(jìn)行繪圖.但是Gnuplot的腳本功能使我們不需要操作繪圖軟件.Fortran語言的系統(tǒng)函數(shù)功能,結(jié)合Gnuplot的腳本功能,使得畫圖成為一個自動化的過程.這種方式在課堂演示中非常快捷方便.另外,在科學(xué)計算的編程和模擬中,快速地對結(jié)果進(jìn)行圖形化輸出是檢驗程序是否存在錯誤或者尋找適當(dāng)參數(shù)的快捷方法.所以這個方式在科學(xué)計算中也具有實際的應(yīng)用價值.
在Gnuplot的腳本中可以通過簡單的命令進(jìn)行更多的設(shè)置.這里介紹幾個常用的設(shè)置.首先,可以設(shè)定坐標(biāo)軸上的標(biāo)簽.例如使用命令:
set xlabel ′x′
set ylable ′y′
把x軸和y軸的標(biāo)簽設(shè)定為x和y.其次,還可以使用對數(shù)坐標(biāo).設(shè)定坐標(biāo)軸采用對數(shù)坐標(biāo)的命令是:
set logscale x
set logscale y
也可以設(shè)定讓Gnuplot不把結(jié)果輸出到屏幕上,而是把結(jié)果保存成一個圖片文件.Gnuplot支持多種圖片格式.例如,可以把利薩如曲線輸出一個png格式的圖片.在腳本中首先設(shè)定輸出終端類型:
set terminal png
然后設(shè)定輸出文件名稱:
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盡管是一個免費軟件,但是目前已經(jīng)被廣泛地應(yīng)用到了科學(xué)研究的繪圖任務(wù)中.一些重要的免費版科學(xué)數(shù)據(jù)分析軟件是以Gnuplot為繪圖組件的.在計算物理中學(xué)習(xí)Gnuplot的簡單使用方法,對于未來的學(xué)習(xí)和研究都有潛在的幫助.此外,Gnuplot的使用方式和Matlab等商業(yè)版軟件比較接近,對于學(xué)習(xí)Matlab也有幫助.
結(jié)論:本文介紹了一種高效地把數(shù)值計算結(jié)果可視化輸出的方法.該方法結(jié)合了Fortran語言的系統(tǒng)函數(shù)功能和Gnuplot軟件的腳本繪圖功能,能夠自動化地把數(shù)據(jù)文件輸出到屏幕或者圖形文件,不需要操作繪圖軟件的中間過程,有利于實現(xiàn)高效的課堂演示.這種方式需要的代碼少,使用方便,容易掌握.這里介紹的所有軟件都是免費軟件,便于學(xué)生在個人計算機上使用,從而有利于學(xué)生靈活地開展計算物理課程的上機實踐.
1 彭芳麟, 梁穎. 科學(xué)計算可視化與計算物理學(xué). 大學(xué)物理, 2013, 32(7): 2~12
2 S. E. Koonin著. 計算物理學(xué). 秦克誠,譯. 北京: 高等教育出版社, 19923 彭芳麟. 計算物理基礎(chǔ). 北京: 高等教育出版社, 2010
2016-11-24)