Spacepy安裝與使用
最近科研的時候需要用到geopack惠昔,這個包本身并不陌生缤苫,但是作者的源碼是Fortran寫的赁温,之后一般在IDL 上使用坛怪。第一次學(xué)習(xí)磁層的時候老師讓我去下一個geopack并且畫出一張磁力線的圖,我當(dāng)時就對IDL 這門語言產(chǎn)生了抗拒股囊。我認(rèn)為一個好的語言是方便學(xué)習(xí)和交流袜匿,世界上很多人說英語,所以英語是一門好的語言稚疹,很多人說漢語居灯,所以漢語也是一門好的語言。很多人用python内狗,很多人用matlab怪嫌,但是當(dāng)遇到IDL的時候,google老師就很難派上用場柳沙。 使用范圍的狹窄限制了我的自學(xué)能力岩灭,IDL 的幫助文檔看起來真的是一頭霧水,而且正版IDL價格不菲赂鲤,相信它早晚會被淘汰噪径。這篇就記錄一下通過spacepy來達到geopack的功能。
關(guān)于spacepy的安裝
spacepy 官方doc:
https://pythonhosted.org/SpacePy/index.html
spacepy是一個基于python的用于空間科學(xué)計算的包数初,主要用于基本的數(shù)據(jù)分析和可視化找爱。更新和維護速度雖然很慢,(聽師兄說是Boulder的那群人寫的)但是查看了git后發(fā)現(xiàn)居然還有幾個兄弟在默默地維護和更新泡孩,比如升級對python3.6的支持等等车摄。真的是想buy them beers!
我使用的是OS 系統(tǒng),也在Ubuntu系統(tǒng)下成功配置了這個包。雖然是一個簡單的python模塊练般,但是有相當(dāng)多的dependence矗漾。
我使用的是Python3.6,最近3.7版本已經(jīng)發(fā)布薄料,還沒有測試在這個版本下是否安裝成功
配置python環(huán)境
配置python環(huán)境是一件比較容易的事情敞贡,如果想使用pycharm等編譯器的話最好有自己獨立于系統(tǒng)的環(huán)境。使用前可以查看一下當(dāng)前自己python的位置
? ~ which python
/Users/madonglai/anaconda3/bin/python
這是自己配置的環(huán)境摄职,具體anaconda使用的方法就不在這里寫出誊役。如果是需要在linux服務(wù)器上使用,可以通過miniconda或者virtualenv來配置自己的虛擬環(huán)境谷市,他們的好處是可以配置自己的環(huán)境甚至是python的版本蛔垢。
之后開始安裝spacepy所需要的依賴包
https://pythonhosted.org/SpacePy/dependencies.html
基本上利用pip install 這個神奇的命令都可以完成,唯一需要注意的是CDF這個是需要自己去下的迫悠。
依賴都安裝好了之后同樣可以用pip install spacepy 來安裝鹏漆。運行過程中會自動檢測你的依賴是否都安裝好了。
當(dāng)然也可以去git上下載他們一直在更新的包解壓后進入目錄创泄,然后通過
python setup.py build
python setup.py install
來進行安裝艺玲。
當(dāng)然這么簡單的安裝過程大概率是有bug的!我遇到的一個比較嚴(yán)重的bug就是gfortran的編譯器版本問題鞠抑。安裝后需要閱讀下是否安裝成功饭聚,這也是我最后不用pip的原因
Compiler /usr/local/bin/gfortran failed, trying another
Compiler gfortran failed, trying another
irbemlib compile failed. Try a different Fortran compiler? (--fcompiler)
irbemlib這個包的作者,使用了f2p這種簡單的把fortran語言轉(zhuǎn)換成python語言的方法搁拙,所以需要fortran的編譯器秒梳,但是如果是通過
brew install gcc
這種方法安裝的帶有g(shù)fortran的版本似乎不能好的編譯,而且一般都是安裝home brew箕速,不便于卸載gcc,經(jīng)常會遇到一些權(quán)限問題(運行brew doctor 可以方便地查看哪里除了問題)于是
sudo rm -r /usr/local/gfortran /usr/local/bin/gfortran
之后再重新下載一個gfortran問題就解決了酪碘。
在Ubuntu下的安裝就相對比較順利,基本步驟也類似弧满,完全可以參照之前的例子或者spacepy的主頁來解決婆跑。但是在CDF的安裝時會出現(xiàn)一點問題此熬,具體問題和解決方法在之后會提到庭呜。
關(guān)于這個例子
Geopack有很多優(yōu)點,在spacepy并沒有單獨的接口犀忱,但是Geopack本質(zhì)上是基于Ts磁場模型計算磁場(還有一些坐標(biāo)轉(zhuǎn)換募谎。)
本次例子的目的是根據(jù)時間和位置,獲得空間中任意一點的磁場阴汇。在spacepy中有很多完成的接口供我們使用数冬。例如在這個例子中需要使用的包irbempy得到磁場的函數(shù)
spacepy.irbempy.get_Bfield(ticks, loci, extMag='T01STORM', options=[1, 0, 0, 0, 0], omnivals=None)
當(dāng)然第一次使用的時候可能會出問題,因為你并沒有下載那個OMNI 的數(shù)據(jù),命令行會給出提示,也有可能不會給拐纱,下載的時候也會出很多問題铜异,需要多嘗試幾遍〗占埽可以在命令行前加入以下命令
import spacepy.toolbox as spt
spt.update(omni = True)
更新過一次數(shù)據(jù)庫就不用了揍庄,本質(zhì)上這個包是從OMNI 的database那里去下載數(shù)據(jù),然后再進行數(shù)據(jù)處理东抹,OMNI中的數(shù)據(jù)都是CDF格式蚂子,所以之前cdf的安裝是必須的。
我也曾經(jīng)嘗試過在Ubuntu16下安裝cdf缭黔,會出現(xiàn)一點問題食茎,具體問題是環(huán)境變量的配置。在make install 之后會有解釋文件 definition.B (在安裝目錄./bin 下)馏谨,將其最后一行改為
export LD_LIBRARY_PATH=$HOME/Libraries/cdf/cdf37_0-dist/lib:$LD_LIBRARY_PATH
在~/.bashrc中最后加入 .$HOME/Libraries/cdf/cdf37_0-dist/definition.B 然后chmod +x將這個文件變成可執(zhí)行文件并運行别渔。
以上路徑是我瞎寫的,需要自己參照自己的路徑來使用
數(shù)據(jù)的一些基本處理
配置好所有的庫和下載好數(shù)據(jù)之后就可以開始進行操作了惧互。所有包的解釋都在
https://pythonhosted.org/SpacePy/index.html
可以參照進行閱讀钠糊,但是有些最新版本的更新在這個網(wǎng)站上沒有解釋,推薦準(zhǔn)確的解釋去閱讀源代碼中的note壹哺,這是一個比較好的選擇抄伍。
import spacepy.time as spt
import spacepy.coordinates as spc
import spacepy.irbempy as ib
import spacepy.toolbox as st
t = spt.Ticktock(['2014-02-02T12:00:00', '2014-02-02T12:10:00'], 'ISO')
y = spc.Coords([[3,3,0],[2,3,0]], 'SM', 'car')
m = ib.get_Bfield(t,y)
print(m)
得出結(jié)果如下
{'Blocal': array([ 396.1620274 , 648.43456977]), 'Bvec': array([[ 15.7710819 , -51.64604429, 392.46440735],
[ 16.65412153, -90.57326112, 641.86175761]])}
沒有指定參數(shù)的時候會按照默認(rèn)參數(shù)得出結(jié)果。這個例子中我想得到的是包含外場(TS05)模型的磁場,有趣的是這個模型在spacepy中的簡稱是T05... 并沒有另一位兄弟Sitnov管宵。
Bfield = ib.get_Bfield(dts,ys_GEO,'T05')
Bfield_noe = ib.get_Bfield(dts,ys_GEO,'0')
0代表沒有外部場截珍,T05代表外場用的是TS05模型等等,這樣就達到了geopack的基礎(chǔ)功能箩朴。在閱讀源碼的過程中會發(fā)現(xiàn)getfield這個函數(shù)只能得到在geo坐標(biāo)下的磁場岗喉!這個是在note里沒有寫的
實現(xiàn)了第一步,那么畫磁力線啊等等等等基于geopack的功能就不難實現(xiàn)了炸庞!
還有一些關(guān)于坐標(biāo)轉(zhuǎn)換和時間序列的基礎(chǔ)操作钱床,在這里就不去詳述了,但毫無疑問這些都是需要注意的事情埠居。python的數(shù)組操作雖然有了numpy等一系列的包查牌,但在處理數(shù)組和一些函數(shù)方面,(比如弧度轉(zhuǎn)角度并不能對整個數(shù)組使用)個人感覺還是不如matlab的滥壕。
當(dāng)然spacepy還有很多很多很多的有用的function纸颜,之后用到的時候再記錄下來。
感想
把一些東西記錄下來還是很有趣的绎橘,每次在科研或者學(xué)習(xí)的過程中都會開很多網(wǎng)頁胁孙,而很多網(wǎng)頁都是打開過一遍的。留在腦子里的東西很少,而記錄下來應(yīng)該會對自己有所幫助涮较。
我python的使用還是處在入門階段稠鼻,比如spacepy安裝的源碼有一些就沒有看懂,并沒有時間去靜下心來學(xué)習(xí)總結(jié)狂票,感到很難受枷餐。
FORTRAN辣雞!IDL辣雞!