Julia程式語言:地球物理研究的新選擇

2021-01-14 地學新視野

敬請關注《地學新視野》

一、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年文章清單:


敬請關注《地學新視野》

相關焦點

  • Julia程式語言助力天氣/氣候模式
    雖然主要集中於地球物理流體的模擬,但研究結果也表明對於在計算流體力學的廣闊領域中應用精度較低的Posit數制具有重要的意義和應用前景。圖文在2018年8月8日,MIT正式發布程式語言Julia 1.0,號稱:Python、R、C++三合一。
  • 「全新」程式語言 Julia開箱體驗
    本文共 1540字,閱讀大約需要 5分鐘,文末有計時器可自行對時Julia 是一個 「全新」的高性能動態程式語言
  • Julia:世界上知名的大公司都在使用這款新的程式語言!
    程式語言可謂種類繁多;數學家、研究人員和數據科學家面臨的一大問題常常是,找到實際上適合手頭處理的任何任務的某一種語言。為了避免困難,總部位於孟加拉國和美國的初創公司Julia Computing的幾位聯合創始人開發出了一種通用程式語言:Julia,不是程式設計師的人經過培訓就能使用這種語言。
  • MIT正式發布程式語言Julia 1.0:Python、R、C++三合一
    它是像 Python 一樣有用的通用程式語言,像 R 語言一樣便於統計的語言,像 Perl 一樣自然的字符串處理語言,像 Matlab 一樣強大的線性代數語言,也是像 shell 一樣的「膠水語言」。它簡單易學,卻能讓嚴苛的黑客們為之傾心。我們希望它兼具交互性和可編譯性。
  • 程式設計師為什麼愛用Julia語言?這裡有五點理由
    編輯:大明【新智元導讀】Julia作為2012年才誕生的一門新興動態程式語言,近年來得到了迅速普及,它具有哪些獨特的特點優勢?Julia是一種免費的現代高級程式語言,於2012年正式發布。作為程式語言大家族中的年輕一員,Julia提供了許多令人眼前一亮的功能和特性。 作為程式設計師,為什麼選擇使用Julia?任何一種程式語言永遠不會是完美的,而且永遠不可能成為一個最終確定的產品,而是會隨著時間的推移不斷變化和發展。本文在此分享程式設計師學習Julia程式語言的五個理由。
  • 史上最強科學計算程式語言?| 麻省理工的Julia
    首先科普一下什麼是「Julia」的高性能動態程式語言」  ,Julia是一個新的高性能動態高級程式語言。語法和其他程式語言類似,易於其他語言用戶學習。Julia擁有豐富的函數庫,提供了數字精度、精緻的增幅 器(sophisticated amplifier)和分布式並行運行方式。
  • Julia到底是怎樣的一個程式語言?它的可否媲美matlab?
    Julia到底是怎樣的一個程式語言?它的可否媲美matlab?Julia 是一個面向科學計算的高性能動態高級程序設計語言。其語法與其他科學計算語言相似。在許多情況下擁有能與編譯型語言相媲美的性能。Julia 是個靈活的動態語言,適合科學和數值計算,性能可與傳統靜態類型語言媲美。一群擁有各種語言豐富編程經驗的Matlab高級用戶,對現有的科學計算編程工具感到不滿——這些軟體對自己專長的領域表現得非常棒,但在其它領域卻非常糟糕。
  • Julia 1.6.0 發布!超高性能動態高級程式語言
    Julia 是一個高性能動態高級程式語言。其擁有豐富的函數庫,提供了數字精度、精緻的增幅器和分布式並行運行方式。核心函數庫等大多數庫由 Julia 編寫,但也用成熟的 C 和 FORTRAN 庫來處理線性代數、隨機數產生和字符串處理等問題。
  • Julia(建設者)
    本文轉載自【微信公眾號:雲深之無跡,ID:TT1827652464】經微信公眾號授權轉載,如需轉載與原文作者聯繫建設者構造函數[1]是創建新對象的函數,特別是Composite Types的實例。在Julia中,類型對象還充當構造函數:它們在作為參數應用於元組時會創建自己的新實例。
  • 關於程式語言 Julia,開發團隊有這些想告訴你
    (點擊上方公眾號,可快速關注)轉自:開源中國社區程式語言排行榜每月都有,排名前 10
  • 為什麼明星公司會選擇Go作為程式語言?
    近日,Hacker News 發布了 2018 年 7 月的程式語言招聘趨勢排行榜,其中,Go 語言已經反超 Java 進入了前三名的行列。從淺綠色的 Go 語言走勢圖可以看出來,企業對於 Go 語言的採用情況在逐年上升。
  • 單片機程式語言的比較
    例如,懂得彙編語言指令就可以使用在片內ram作變量的優勢,因為片外變量需要幾條指令才能設置累加器和數據指針進行存取。同樣的,當要求使用浮點數和啟用函數時也只有具備彙編編程經驗才能避免生成龐大的、效率低的程序,對於這方面的編程,沒有彙編語言是做不到的。
  • 程式語言「木蘭」被指套殼造假
    「木蘭」來了項目負責人劉雷:由編譯實驗室完全自主設計  說到程式語言「木蘭」,還要從本月15日說起。15日開始,多家媒體發布了一個消息:我國自主研發的程式語言「木蘭」正式發布。這個消息,讓很多人為之一振。
  • 程式語言學哪個比較好?2019年最實用的程式語言
    學習編程關鍵是要找到一種合適的語言,那麼程式語言那麼多,該如何選擇?下面萬古網校小編為大家分享一篇關於程式語言選擇的文章,希望能給你帶來幫助!第一大類語言包括Java、C、Python和C++。這類語言都是非常通用的語言,它們並不局限於特定的編程平臺或用途。
  • 華為被曝自研程式語言「倉頡」,南大教授馮新宇領銜
    △圖源微博@IT工程師,經授權目前這件事尚未得到官方證實,但據知乎@匿名用戶 透露,華為有意研究自己的程序語言,在行業內早已是公開的秘密。「華為自研程式語言並非秘密」「編譯器實驗室早已有之」事實上,華為在編譯器與程式語言方面早有動向。方舟編譯器,就是華為在編譯器方向的研究成果之一。
  • 單片機的程式語言:彙編語言、C語言、PL/M和BASIC語言
    單片機的程式語言很多,目前常見的程式語言有4種,即彙編語言、C語言、PL/M和BASIC語言。下面我們來介紹一下吧:一、BASIC程式語言BASIC是一種高級語言,它的英文含義是「初學者通用符號指令代碼」,是在1965年5月,由美國科學家託馬斯•庫爾茲研製出來的。10多年後,微軟公司把它移植到微型機上。
  • 10 種最具影響力的程式語言
    僅僅知道 X 是首個具有 Z 特性的語言並不意味著 X 實際上影響了 Z。雖然 Absys 可以說是首個邏輯程式語言,但幾乎所有的邏輯編程實際上都是源於 Prolog 了,後者是獨立開發的。最終,只有一種方法可以確定 X 影響了 Y:引用。
  • 原來學編程不一定要數學好,看了最新研究我鬆了一口氣
    一直以來,我們都認可數學在編程學習中的重要性,雖然我們很多程式設計師對這個話題有不同的理解,不過學好編程就要有紮實的數學功底,這個觀點大家可能殊途,但往往同歸,對它並沒有多大的異議。不過最近的MIT神經科學家在eLife期刊發表了一項新研究,則給出了不同的觀點。
  • 傳華為正在自研程式語言倉頡 已申請「倉頡語言」商標
    日前,有數碼博主爆料:從華為內部得知,華為正在自研程式語言倉頡,該項目已經進行了很久,預計明年會向外公布具體細節。華為CNMO注意到,華為已於8月21日申請註冊「倉頡語言」商標。該商標狀態為「註冊申請中」,申請人名稱為「華為技術有限公司」,國際分類為「42類 設計研究」。
  • 邏輯式程式語言極簡實現(使用C#) - 1. 邏輯式程式語言介紹
    本系列將儘可能簡潔地說明邏輯式編程語音的原理,並實現一門簡單的邏輯式程式語言。考慮到C#的用戶較多,因此選擇用C#來實現。實現的這門語言就叫NMiniKanren。文章總體內容如下:NMiniKanren語言介紹NMiniKanren運行原理實現NMiniKanren故事從兩個正在吃午餐的程式設計師說起。