敬請關注《地學新視野》
一、Julia程式語言簡介
Julia是一種新的程式語言,一種函數式程式語言,一種面向科學技術計算的高性能動態高級程序設計語言。Julia程式語言具有通用、動態、快速、開源、易於使用等特點。
Julia程式語言設計項目大約開始於2009年中,由麻省理工學院(MIT)計算機科學與人工智慧實驗室(CSAIL)研發和發布,Julia語言的主要創造者包括Viral Shah博士、Alan Edelman教授、Jeff Bezanson博士和Stefan Karpinski。2012年MIT發布了Julia的第一個版本(0.1版),目前的最新版本是1.1版。近年來,Julia 語言成為全球熱度上升最快的程式語言之一,截止2019年2月27日下載量已超過 400 萬次,下載者包括谷歌、Facebook、FAA 和美國能源部等部門的開發者,Julia社區已經註冊了數千個軟體包。Julia開發環境已經支持Windows、MacOS 、Linux、FreeBSD等多種作業系統平臺。
從Julia官網上可以看到Julia已經在諸多行業獲得應用,下面列出了若干個典型應用:
(1)Racefox公司用Julia語言開展機器學習研究,對運動圖像進行數位化分析和訓練指導。
(2)普林斯頓大學用Julia語言開展機器學研究與建模。
(3)Laketide公司用Julia語言開展人工智慧與機器學習研究,開展產品開發。
(4)Riken公司用BioJulia軟體寶開展RNA測序研究,開發了一種新的單細胞RNA測序方法。
(5)巴西國家空間研究所用Julia開展空間發射規劃。
(6)歐洲最大的保險公司之一Aviva用Julia進行償付能力和合規性分析。
(7)美國國家能源研究科學計算中心(NERSC)研究人員用Julia在超級計算機上進行空間圖像分析,可在15分鐘對1.88億個天文對象編目,速度提高1000倍。
(8)Fugro Roames用Julia進行機器學習,識別電網系統網絡故障或潛在故障,速度提高100倍。
(9)美國聯邦航空管理局正在用Julia開發下一代空間碰撞防範系統。
(10)Now-Casting Economics公司用Julia進行宏觀經濟建模,建模周期從數周縮短到數天。
(11)MIT用Julia進行機器人研究,解決上樓梯、危險環境、複雜地形清淨下的行走問題。
(12)AOT能源用Julia進行期權價格分析、線性規劃和市場模擬。
(13)加州大學伯克利分校在自動駕駛項目中用Julia進行預測控制優化建模。
(14)英國癌症研究者用Julia進行腫瘤生長建模和癌症基因告知解釋研究。
我們在上一篇文章(《Julia:一種新的科學計算程式語言》)中已經詳細介紹了Julia程式語言的特點和主要應用領域,本文將介紹Julia語言在地球物理研究中的應用情況。
二、地球物理研究採用Julia程式語言的理由
長期以來,在地球物理勘探產品研發中廣泛採用的是C/C++、Java等程式語言,而地球物理研究特別是高等學校的師生們中廣泛採用的是Matlab、Fortran和C語言。
Julia語言作為一種新的程式語言,能否在地球物理研究中取得好的應用呢?或者說為什麼我們要將其應用於地球物理研究中呢?我想理由有三:
(一)易於獲得和使用
Julia語言開發工具是開源、免費的,可以很方便地從網絡上下載、安裝部署,支持Windows、MacOS 、Linux、FreeBSD等多種作業系統環境,這對於一般研究者來說很重要。
具有Matlab、R、Python等語言編程經驗的研究者可以快速遷移到Julia語言編程。
(二)具有適合地球物理研究所需要的豐富的數據處理功能
Julia程式語言的設計從根本上講非常擅長數值計算和科學計算,內置了豐富的線性代數計算函數,提供了連接R、Python、Java和C等其它語言的程序接口,而且具有豐富的擴展軟體包可供選擇使用。
目前已經有用Julia語言編寫的大量科學計算工具,這些工具正是地球物理研究工作中不可缺少的,例如:
通用編程:DataStructures,LightGraphs
般數學運算:Calculus,DataFrames,StatsBase,Distributions,HypothesisTests,GLM
微分方程生態系統:DifferntialEquations.jl
最優化工具:JuMP.jl,Optim.jl,Roots
迭代線性求解器:IterativeSolvers.jl
資料庫連接:ODBC,JDBC
用戶界面構建與可視化:Gadfly,PyPlot,Interact
機器學習與深度學習:Knet,Clustering,DecisionTree
文件與數據格式處理:JSON,HDFS,JLD
與其它語言的互操作:RCall,JavaCall,PyCall
活躍的Julia生態系統中有一群來自科學界各個領域熱情的開發者和維護者,這個生態系統將持續變得越來越大,這為地球物理研究提供了豐富的共享代碼資源。
(三)計算性能卓越且支持並行計算
Julia語言具有極其卓越的計算性能,甚至能接近包括C語言在內的靜態編譯語言,而地球物理研究中對計算性能有較高的要求,而Matlab等常常不能滿足要求。
Julia專為並行性而設計,並為各個級別的並行計算提供內置基元:指令級並行,多線程和分布式計算,這樣為地球物理研究提供了極大的便利性。
Julia編譯器還可以為各種硬體加速器生成本機代碼,例如GPU和Xeon Phi。諸如DistributedArrays.jl和Dagger.jl之類的軟體包為並行性提供了更高級別的抽象。
三、基於Julia語言的地球物理擴展軟體包
據筆者的初步調研(基於Julia語言擴展軟體包網站pkg.julialang.org和開源軟體管理網站GitHub查詢),基於Julia程式語言開發的地球物理擴展軟體包主要包括以下幾種:
(1)SeismicJulia軟體包
SeismicJulia軟體包由加拿大阿爾伯塔大學的信號分析與成像研究組(SAIG,其主頁地址為http://saig.physics.ualberta.ca)貢獻,是一組基於Julia用於讀、寫及處理地震數據的工具,具體內容下一節再重點詳加介紹。
代碼下載地址:https://github.com/SeismicJulia/Seismic.jl。
(2)TeaSeis軟體包
這是雪佛龍能源技術公司開發的JavaSeis地震數據文件IO的Julia語言實現,主要用於讀寫JavaSeis格式的地震數據文件,這種數據文件格式應用於多個地震軟體項目中,如Landmark公司的SeisSpace。
代碼下載地址:https://github.com/ChevronETC/TeaSeis.jl。
(3)SeisPlot軟體包
這是一個地震道繪圖擴展軟體包,也是由加拿大阿爾伯塔大學的信號分析與成像研究組開發。
代碼下載地址:https://github.com/SeismicJulia/SeisPlot.jl。
(4)Seis、SAC、SACPlot軟體包
利茲大學地球與環境學院的Andy Nowacki用Julia語言開發了一組地震數據處理軟體包,其中Seis是一個地震信號分析框架,SAC是一個SAC格式地震數據處理軟體包,SACPlot是一個SAC格式數據文件地震道繪圖擴展軟體包,與SAC軟體包配套使用。
代碼下載地址:https://github.com/anowacki/Seis.jl,
https://github.com/anowacki/SAC.jl,
https://github.com/anowacki/SACPlot.jl。
(5)JuMIT和SeismicBSS軟體包
MIT的Pawan Bharadwaj開發了JuMIT和SeismicBSS兩個Julia擴展軟體包。JuMIT是一個地震波場模擬與反演工具包,其中包含了豐富地震波場正演模擬和反演模塊,值得研究和借鑑;SeismicBSS是一個盲源地震信號分離處理擴展軟體包。
代碼下載地址:https://github.com/pawbz/JuMIT.jl,
和https://github.com/pawbz/SeismicBSS.jl。
(6)GroundMotion軟體包
這是一個天然地震研究中的地面震動評估擴展軟體包,由俄羅斯地球物理技術公司(主頁:https://geophystech.ru)的Roman和Andrey Stepnov開發。
代碼下載地址:https://github.com/geophystech/GroundMotion.jl。
(7)SeisIO軟體包
有兩個SeisIO軟體包,一個是美國喬治亞理工大學SLIM(地震成像與模擬實驗室)研究組(主頁:https://slim.gatech.edu)開發的,主要功能是SEGY地震數據的讀寫,支持多文件的並行掃描;另一個是Joshua Jones個人開發的,主要功能包括SAC和(SeisIO)本地格式等多種格式地震數據的讀寫、時間同步、數據合併、補邊和基本處理。
代碼下載地址:https://github.com/slimgroup/SeisIO.jl,
和https://github.com/jpjones76/SeisIO.jl。
(8)PlotSeis軟體包
開發了SeisIO軟體包的Joshua Jones,還開發了一個支持SeisIO.jl的地震數據可視化工具軟體包PlotSeis,但這個軟體包2017年後未見更新。
代碼下載地址:https://github.com/jpjones76/PlotSeis.jl。
四、Seismic地震數據處理擴展軟體包介紹
SAIG研究成員
加拿大阿爾伯塔大學信號分析與成像研究組(SAIG)的Aaron Stanton、Mauricio D. Sacchi和Nasser Kazemi於2016年在維也納召開的EAGE開源軟體研討會上以「用Julia語言開展高效的地球物理研究(Efficient Geophysical Research in Julia)」為題報告了他們的研究成果。他們開發了一組用於地震數據讀寫和處理的Julia軟體包,工具包總的名稱為SeismicJulia,訪問地址為https://github.com/SeismicJulia/,其中包含了多個Julia軟體包:
SeisMain.jl:SeismicJulia主軟體包
SeisAcoustic.jl:聲波模擬與成像軟體包
SeisProcessing.jl:地震數據處理工具
SeisImaging.jl:地震成像工具
SeisReconstruction.jl:地震數據重建工具
SeisPlot.jl :繪圖工具
這是SAIG設計的SeismicJulia總的軟體包結構,部分功能尚沒有多少內容,內容還不完整,仍處於開發中。而基於Julia v0.6版本開發的地震數據讀寫和處理工具包的名稱叫Seismic.jl,其代碼訪問地址為https://github.com/SeismicJulia/Seismic.jl,文檔訪問地址為http://seismicjulia.github.io/Seismic.jl/。下圖是Seismic軟體包在GitHub上的主頁:
Seismic擴展軟體包在GitHub上的頁面
Seismic.jl包含功能如下圖所示:
Seismic擴展軟體包主要功能組成
由圖可見,Seismic擴展軟體包主要功能組成包括四個方面,即實用工具包、處理功能包、成像功能包和求解器功能包。詳細功能如下:
(1)實用工具包
格式轉換:SEGY,SU和RSF格式間的互轉
內部格式的讀寫
時窗選取
觀測系統
道頭統計
選排
面元定義
補邊與反補邊
理論子波計算
(2)處理功能包
相似度
正常時差校正
切除
增益
疊加
帶通濾波和FK扇形濾波
拉登變換
五維插值
構造平滑
FX反褶積
平面波分解傾角估計
振幅包絡
…
(3)成像功能包
(4)求解器功能包
點積測試
基於內存或磁碟的預定義共軛梯度
迭代再加權最小二乘法(IRLS)
快速迭代軟閾值算法(FISTA)
五、Seismic使用說明和編程示例
在安裝好Julia開發環境後,使用Seismic.jl軟體包以前,需要安裝並檢查最新版本,這可在Julia命令行上運行下列命令即可:
Pkg.add(「Seismic」)
Pkg.checkout(「Seismic」)
下面給出了一個代碼示例和對應的繪圖輸出結果。代碼中通過幾個簡單的Julia函數實現了SEGY格式地震數據下載、格式轉換、時窗設置、數據讀取、地震剖面繪圖等功能,其中用到了PyPlot繪圖軟體包。
基於Seismic軟體包的編程示例代碼
上述Seismic編程代碼的繪圖輸出
六、結束語
Julia是一種新的程式語言,一種面向科學技術計算的高性能動態高級程序設計語言。Julia免費開源、簡單易用、性能卓越、支持並行,具有地球物理研究所需要的豐富的數據分析處理功能,也有豐富的擴展軟體包資源可以共享,一些研究者已經基於Julia語言開發了多個地震數據分析處理工具包,這些都為Julia語言在地球物理中的應用打下了良好的基礎。
我們相信,Julia程式語言將成為一種新的有效的地球物理技術研究工具。
2019年3月5日
《地學新探索》公眾號2019年文章清單:
敬請關注《地學新視野》