2010年10月20日 星期三

[轉載]何謂博士(The illustrated guide to a ph.D)

這篇文章轉載自


這篇文章可以給許多博士生非常非常好的警惕--博士並不博。

每個研究生都鑽研在自己的專業領域,有些人喜歡把內圈變大,有些人喜歡專注在某一特定領域的獨特性。無論是哪一種,都不能忘記人類的知識何其浩瀚,絕不可能是人一輩子能夠通曉所有知識跟學問。

因此,博士們....是不是應該更謙虛的面對自己以及別人的專業呢?

Share

2010年10月6日 星期三

劉玲根老師提供的幾篇科普文章

劉玲根老師是台灣一位相當了不起的地球化學家,他深厚的學術涵養以及謙遜的態度、鍥而不捨研究精神,我在大學時代聽過幾場劉老師的演講而深受感動。他是一位了不起的學者,我問的問題,無論多麼外行或粗淺,他總是能細心且耐心的用最淺顯的字句解釋給我這毛頭小子聽懂為止。這幾篇文章適合給大學程度以上,喜歡地球化學、結晶學的同學閱讀;如果你不懂這些領域,也可以從中體會地球科學界的一些爭論及思考方向。

地函研究的爭議 --科學人, 102, 66-70, Aug, 2010.

地球深處的神秘礦物 -- 科學人, 102, 52-65, Aug, 2010.

大氣與海洋 - 談系內行星的演化 ─ 科學月刊, 第41卷第7期, 538-543, 2010.7月號.

Share

2010年9月3日 星期五

Takeoff and incident angle from TauP

TauP 1.2以上的版本可以在taup_time裡面求得該phase的takeoff angle以及incident angle,筆者目前所能下載到的最新版本為2.0 beta6,相信如果需要這些資訊的研究人員可以更輕易的使用taup。TauP的作者Philip非常貼心的把Takeoff angle以及incident angle欄位放在後面,這樣一來使用者就無需更改呼叫taup的shell script。

taup_time -ph PcP,ScP -deg 46.5 -h 122.2

Model: iasp91
Distance   Depth   Phase   Travel    Ray Param  Takeoff  Incident  Purist    Purist
  (deg)     (km)   Name    Time (s)  p (s/deg)   (deg)    (deg)   Distance   Name
-----------------------------------------------------------------------------------
   46.50   122.2   PcP      587.05     3.532     15.12    10.62    46.50   = PcP
   46.50   122.2   ScP      808.93     4.185      9.94    12.61    46.50   = ScP

請各位無痛升級到新版的TauP吧!

Share

2010年9月2日 星期四

SeisMac 初體驗

今天逛逛Apple Download時,發現其實在MacOSX上有許多好玩的小程式。特別是在Math & Science的分類裡,有一個SeisMac的小程式。不過從Apple Download經常無法下載,後來google才知道原來SeisMac也是IRIS提供的一套免費小程式,他利用MacBook上的Sudden Motion Sensor(SMS)來記錄XYZ三軸的加速度,並且允許你將所見的畫面儲存成tif,或是另存成sac(binary),asac(ascii)以及csv格式。

開啟SeisMac之後,輕輕搖晃或是手指輕拍你的laptop,或是跟我一樣隨意搖晃你的MacBook,你會發現移動的加速度已經被記錄下來啦!

接著,你可以儲存這些seismogram為sac格式!

缺點是,三個分量必須個別儲存,有點討厭。這三個分量並不是E/N/Z方向,而是以laptop為參考座標的X/Y/Z三個方向。儲存完之後,還真的可以用SAC去跑唷!

不過我還是不知道這樣有趣的小程式究竟可以如何使用--用在地震儀上未免也太貴了些。如果你對這個小程式感興趣的話,或許應該參考他的SeisMacHelp頁面!

Share

SAC installation on Linux and MacOSX

先前我一直沒有寫一篇如何在linux上安裝Seismic Analysis Code(SAC)的筆記,是因為在sac的網站上已經有很詳細的說明。下載下來的sac都已經是可以直接執行的binary,所以幾乎沒有任何問題。由於最近開始練習使用Mac來做日常工作,我想日後如果想在MacOSX上面跑sac的使用者也可以依此參考,因此寫下這篇簡單的sac on mac筆記。

在linux上,只要確定你安裝的linux是x86還是x86_64的版本即可。假設將sac解壓縮到/opt,則只需要在~/.profile裡設定幾個環境變數即可:

export SAC=/opt/sac
export SACLIB=$SAC/lib
export SACAUX=$SAC/aux
export PATH=$PATH:$SAC/bin
如果是csh的愛好者,你的環境變數應該長得像這樣:
setenv SAC /opt/sac
setenv SACLIB $SAC/lib
setenv SACAUX $SAC/aux
set path = ( $path $SAC/bin )

在MacOSX上,你也應該下載一個適合自己版本的sac來用。我的MacOS是Leopard(10.5),是64位元的版本,intel的cpu,可以執行x86或是x86_64的binary,不過當我設定好環境變數之後,敲入sac卻有錯誤訊息:

dyld: Library not loaded: /opt/local/lib/libSM.6.dylib
Referenced from: /opt/sac/bin/sac
Reason: image not found
Trace/BPT trap
dylib我不知道是什麼,不過看前面libSM.6我猜應該是缺乏動態函式libSM,所以dylib應該是dynamic library的意思,在linux相當於少了libSM.6.so的意思。知道少了這個lib,在linux只要用套件管理程式裝起來就可以了。但是在mac並沒有套件管理程式,該怎麼做呢?

為了解決這個問題,我們必須裝上MacPorts,這是一個開放原始碼的軟體,他收集了很多開放原始碼的程式,像是在linux世界裡常見的gedit,gimp等等的程式,可以透過MacPorts移植到MacOS上使用。但是,這些套件都是原始碼,他會下載原始碼到你的電腦上並自動編譯、安裝,所以會非常耗時;建議晚上安裝,早上起來就好了。

但是要安裝MacPorts,則必須要有gcc、make這些工具。而這些工具都是由xcode來的。也就是說,你必須先安裝xcode,才能有gcc,才能安裝MacPorts,才能安裝libSM.6.dylib,才能順利執行sac。

大部分安裝好MacOSX之後是不會有xcode的,你必須從安裝光碟裡去選擇並安裝xcode。安裝完xcode之後,你就有fortran, c, c++, python, Java等編譯器可以使用。接著下載給Snow Leopard(10.6), Leopard(10.5)以及Tiger(10.4)的MacPorts安裝檔來安裝。

安裝完成後,你的shell應該就能找到port這個指令。由於我不清楚mac如何更改default shell為tcsh,所以奉勸還是忘記有tcsh這類shell吧。安裝好之後,都是用port指令當做mac的套件管理程式。
更新MacPorts並且更新套件庫索引:

sudo port selfupdate
尋找套件名稱:
port search foo
安裝套件:
sudo port install foo
移除套件:
sudo port uninstall foo
回到我們的問題本身--套件的關鍵字是libSM,因此我們透過search找到的套件名稱為xorg-libsm,因此只需要輸入:
sudo port install xorg-libsm
再次執行sac,就可以快樂的在MacOSX上使用sac。

更舊版本的Mac恐怕需要更舊版本的sac才行--我所測試的sac版本為101.4。希望本文能對於Mac的使用者有所助益。

Share

2010年7月13日 星期二

What can shell script do?

最近暑期生來到這裡,讓整個地球所變得熱鬧且充滿生氣。其實我一直很想作一些bash的教學,不過礙於環境,所有的教學跟經驗,我希望能把握僅存的時間寫成教學文章,讓年輕的地震學家或地球物理學家能夠透過學習bash,充分體驗bash之美。

今天只是牛刀小試一番,我們來看看shell script的威力。假設我今天瀏覽一個網頁,該頁面上充滿著美麗的圖片(當然,圖片的內容是風景或是美女...筆者沒有權利過問@_@);以 這個頁面為例,我們要抓下裡面風景的圖檔其實不需要任何工具,一個終端機就行了。檢視這個頁面的原始碼,搜尋jpg或是png,你大約可以發現你要的圖片是位於哪個區塊。
我把選取的範圍另存成一個文字檔之後(temp.txt),就可以利用shell script來取得我們要的東西。 讓我們來思考一下這個東西。我們要得東西主要是http://blablabla.com/XXX.jpg這樣的格式,但是其他累贅的字串實在太多,而且大多處於同一行的狀態,這個時候用awk不太適合,先把sed請出來用:

cat temp.txt | sed 's/></\n/g'
我的目的是把每個網址列都盡量變成獨立的一行,把字串裡面所有的
><
符號都變成換行字元符號。 關鍵字串已經獨立成一行一行了,此時grep以及awk就可以雙劍合璧:
cat temp.txt | sed 's/></\n/g' | grep 'http'| awk '{print$2;}'
我利用pipe在延續剛剛的命令,取出包含http的字串後,發現關鍵字串在第二的colume,用awk取值非常容易。 我們要的網址列已經呼之欲出了,再做個最後的努力吧!
cat temp.txt | sed 's/></\n/g' | grep 'http'| awk '{print$2;}' | awk -F= '{print $2}' | uniq

我們要的網址列已經乖乖的呈獻在我們面前。讓我們愉快的把他寫成shell script當成送自己的第一份禮物吧!

  1. #!/bin/bash
  2. ## This script is going to help you to download pictures automatically from web.
  3.  
  4. ## pictures: the real link we need
  5. pictures=$(cat temp.txt | sed 's/></\n/g' | grep 'http'| awk '{print$2;}' | awk -F= '{print $2}' | uniq)
  6.  
  7. ## start to download:
  8. for files in $pictures; do
  9.     wget -c $pictures
  10. done

我們要的圖片就這樣下載下來了。希望這篇小文能讓你對shell script感到興趣,並在研究的路程上處理繁複的data能更得心應手,事事都以shell為想法來解決問題。

Share

2010年3月18日 星期四

Taup on Windows

Java在眾多程式語言裡面脫穎而出,最大的原因除了物件導向的程式設計易於維護之外,他的跨平台特性確實讓其他語言望其項背。Java透過JVM(Java虛擬機器)來執行,因此跨平台的任務就交給撰寫JVM的廠商或團體,我們只要負責寫或是用就好。Taup就是由Java語言所開發而成,理所當然他是能夠在windows上面運行的。如果你對於linux還是有抗拒但又必須用到Taup,那麼請參考這篇文章。

首先,你必須要有可以運行Java程式的環境(Java Runtime Environment,簡稱JRE)。如何知道你有沒有安裝java呢?請打開你的終端機:(哦,不!是命令提示字元....),輸入java -version

如果你可以看到跟筆者類似的畫面,而不是找不到這個指令,那麼就表示你的系統已經有安裝JRE(也就是大家所說的Java),可以順利執行Taup。If not,請google一下java這個字,找到下載java的頁面。

安裝完Java後,請你再敲一次java -version,應該就可以看到跟第一張圖類似的畫面。接下來,我們需要設定環境變數讓你的Windows知道如何找到taup!
假設你下載Taup並把她解壓縮後放到C:\,則你需要設定一個名為TAUP_HOME的變數:

有了這個變數還不夠,你還需要把Taup的可執行目錄加進系統命令搜尋的PATH裡!

這個path環境變數非常重要,請小心利用分號把%TAUP_HOME%\bin加到最後面。按下確定之後還不行,請你重新開機以讓環境變數生效。(我不知道有沒有不重開機就生效的方法,如果有,可以利用留言分享給其他朋友)

上圖...有點浪費版面...
總之重新啟動系統後,TauP就可以正常執行了!

這是Taup的圖形介面,下圖是linux上執行的畫面。

各位可以發現,java程式的優勢就是設計師不必擔心不同平台有不同的顯示效果,唯一不同之處就是字型,其餘完全相同。

可以在windows上執行所有Taup的功能,或許可以對於學習Taup有些許的幫助。

後記:
筆者測試的結果是Windows上的跑Taup的速度比linux或是solaris上慢得太多,或許是因為我的windows是虛擬機器的關係;但如果你的實體windows也跑得不快,也別太意外。

Share

2010年2月24日 星期三

[轉載] 研究生的學習與訓練

本文摘錄自藏經閣:研究生的學習與訓練,我認為切中許多要點,是非常值得現值研究生階段的學子思考的。


一、前言:

又到了碩士班、博士班入學,尋找指導教授的時間,我很喜歡和同學分享經驗,但似乎最有效率的作法,是把他寫下來,讓有興趣的同學參考。這篇文章是希望整理自己在研究道路上的一些體驗,絕不是什麼定律,也絕不適用於每一個人,只是分享一些經驗,給同學一些參考或是借鏡。

二、瞭解自己的需要和目的:

說到研究生的學習與訓練,應該打從有了繼續深造的念頭說起,為何要花兩年時間唸個碩士,花個3-5年唸個博士呢?是因為大家都唸,不唸很奇怪?還是想要有多點收入,以後升遷容易?還是真的想從研究生的訓練裡來提昇自己的能力。我覺得首先必須清楚自己要的是什麼,唸個學位帶給自己的又是什麼?如果期待碩士帶給你的是加薪,升遷,我想念碩士應該不是一個最有效率的投資。對我來說,研究生是一個訓練,訓練自己更有效率地使用知識與資料,更有效率,更有系統,更科學的發現與解決問題。這個訓練的結果或許會反應到未來工作的選擇,工作內容上,但我相信這只是這個訓練的結果而不應該是碩士班訓練的目的。這個訓練是辛苦的,絕不是把24個學分的課修完,論文一交就結束了。如果你踏入研究所抱持跟我一樣的態度,是來訓練自己使用知識,瞭解與解決問題的能力,我想做為研究生的第一步,應該是讓自己隨時隨刻知道自己在研究生的訓練過程中該努力什麼,時時地警惕有無做到這樣的訓練。

三、找尋適合自己的研究環境:

決定了繼續深造這條路,接下來就是找一個適合自己的研究環境,現在爭取學校入學資格的方式與途徑很多,很多人都可以擁有數個選擇的機會。我想許多人面對的問題就是學校和指導教授的選擇,有人考慮延續大學的專題,繼續留在系上,有些人則選擇出去闖一闖,開拓自己的視野。我的看法是,環境影響一個人,如果說大學的環境會影響大學生的風格與氣質,那實驗室將影響研究生的研究能力與態度。研究生與指導教授,實驗室伙伴的關係遠遠超過學校對研究生的影響,所以大部分的人都會同意我說,碩士班或博士班的訓練應該以指導教授和實驗室為選擇的主要考慮,所以找一個適合自己的指導教授和實驗室是很重要的。在這裡我說”適合或不適合”,應該是從自己學習的個性,指導教授訓練的方式與專業能力,實驗室專長與研究重點,實驗室其他成員的程度與軟硬體設施幾個方面來考慮,在說明尋找一個適合自己的環境之前,請容許我就個人的經驗來談談到底什麼才是選擇環境的主要考慮。我覺得指導教授是重要的,因為他影響實驗室的風格和你之後兩年的訓練,實驗室同儕是重要的,因為人多半近朱者赤,環境帶給人的影響通常遠比自己帶給自己的影響來的大很多。指導教授的重要,並不全然取決與指導教授的專業能力,而是在學生與老師互動的關係上,適合自己的老師遠比能力強的老師來的有影響,所以並不見得到其他的學校,找其他的老師會比留在系上跟自己熟悉的老師來的有幫助。但是值得注意的是,在選擇任何環境之前,必須思考這個環境帶給自己的優缺點是什麼,什麼是這個環境所缺乏而你又希望在碩士班的訓練中得到的。舉個自己的例子來說,我當年選擇繼續留在系上讀碩士班,博士班,是因為我對系上的環境和老師十分熟悉,幾乎不用花任何時間在適應環境上,可以把所有的時間投入做研究或訓練自己的其他能力,但我知道我缺乏國際觀的訓練,所以我時時刻刻注意自己的英文能力,爭取參加國際會議的機會,我知道我缺乏大環境的衝擊與刺激,所以我利用研究之餘的時間到中研院,工研院工作,學習不同的工作方式,工作態度與專業技術。尋找一個好的環境是極為重要的,在已經選定的環境中,因應客觀環境訂定適合自己的學習方法和方式更是重要。所以我必須要說,找一位和自己學習方式,態度能配合的老師是重要的,如果你很清楚自己獨立慣了,希望能走出一條自己的路,不妨找一個可以讓你大顯身手的老師,如果你需要嚴格的訓練,那不妨找一個要求嚴格,已有一條明確道路的老師。所以很清楚的要找一個跟你能配合的老師,我想很多人都會建議,不妨在選擇老師之前,和老師談談,和實驗室的同學,學長談談,我想更重要的事情是搞清楚自己的研究態度和學習方式,才能找到一個適合自己的老師。

四、改變吸收知識的方法:

決定了繼續深造也找好了學校老師,接下來就是進行一連串的訓練,研究生的訓練因指導教授而異,因人而異,也因研究領域而有不同,在這裡只是試著列舉些個人經驗和大家分享。在大學時代,我幾乎是跟著老師跟著課本,一步一腳印地學習所謂的基本知識,到了碩士班,我吸收知識的方式有了很大的改變,我幾乎沒有看完任何一本書或是論文(其實在大學時代我也沒有好好看完一本書),吸收知識的方式幾乎都是問題導向,遇到一個問題,思考一個問題,尋找跟這個問題有關的資料,閱讀和這個問題有關的章節,舉個例子來說,我不瞭解PC的開機程序,我想知道從我打開電腦電源直到Windows 2000提示我輸入帳號密碼之間發生了什麼事情,我找了有關於PC,Windows的所有資料開始閱讀,做些實驗,我慢慢瞭解開機之後大概會先做執行 BIOS,POST檢查等等,完成之後會檢查硬碟分割表,在執行Windows開機,我發現我對BIOS那段還不是很確定,於是我繼續尋找PC BIOS的程序與資料,繼續展開問題,繼續研究。所以我不斷的展開問題與學習,我看了很多書的很少部分,可是讓我對一件事情,一個問題有完整的認識與瞭解。這樣以問題為導向的吸收知識的方法是我在研究生的訓練過程中常常使用的,比較有效率,但是必須建立在對專業知識有基本的認識之上。

五、蒐集與整理資料

研究生蒐集與整理資料是基本能力,現在蒐集與整理資料比起我那個年代(雖然沒有差幾年)是方便多了,我以前幾乎一個星期要跑圖書館數十次,西文期刊室,微片光碟閱覽室是我流連的地方,現在網際網路發達,上Google,IEEE Explorer隨便一個Key Word都可以找到一堆的論文,報告,資料的蒐集方便,來源非常多,相對起來資料的整理便顯的更加的重要,看完資料不加以吸收整理,時間一久,其實跟沒看沒什麼兩樣,花十分鐘的時間看資料,也花十分鐘的時間整理資料是有必要的。把資料讀完,用自己的文字記錄自己所得到,是一件一定要做的工作,以前我學長教我每讀完一篇資料,在筆記本上紀錄這篇資料的重點,和對於這篇資料的一些有系統或是隨意的想法,定期的閱讀這些想法和資料將有助於研究,事實證明這樣的方式幫我整理出了許多研究的問題與解決方法,更進一步,我現在我在電腦上做資料的整理,慢慢建立一套屬於自己的資訊庫系統,一個研究課題,一個技術,可以透過一個自己熟悉而且有效率,有系統的方式找到,一些隨意的想法,和一些片段的研究過程可以透過這種方式保存與重新咀嚼。此外國內外相同領域的實驗室,會議,論壇,研究人員的整理也是必要的,透過與國內外專家的討論,使遠比埋頭苦讀來的有效率的。在這裡有個重點希望和大家分享,身處與資訊爆炸的時代,資料的整理遠比資料的取得來的重要,不經整理的資料,永遠都只是資料,不是知識,透過同儕或是相同領域專家的激盪與討論,遠優於埋首苦讀。

六、學習思考:

剛剛提到閱讀資料和整理資料,一個很重要的關鍵在於閱讀資料和整理資料都需要思考,思考是需要學習的。我常常覺得國內教育最值得爭議的地方在於對思考的訓練不夠(最少在我那個年代是這樣),我在國中的時候幾乎可以看到題目的前幾個字就可以作答,很多時候我根本不知道問題,就已經有了答案。我常常以為知識的可貴在於知道問題,而不是知道答案。以答案為導向的訓練會讓人喪失發掘問題與思考的能力。希望大家沒有這樣的困擾,如果有,則需要開始學習思考。我前一陣子幫華碩R&D的工程師上課,課後他們希望我可以與他們分享一些學習上的經驗,我以一句話和他們共勉~”資料和知識最大的差別在於,資料是別人整理的,知識是自己整理的。打開書本閱讀和閡上書本思考是一樣的重要。”看完資料,閡上資料,先別管別人的方法是什麼,先問自己讀了什麼,問題是什麼,如果是你,如果解決,想不出方法了,再看看別人怎麼做。所以我看論文是三段式的,先試著瞭解問題,放下論文,思考問題,如果問題有意義,我需要,我開始思考如果是我,我怎麼做,經驗告訴我常常”我的解決方法”,和”別人的方法”相似,但是那是我的解法,是經由我大腦思考出來的解法,如果想不出方法,在去看論文的後半部,思考他的方式和技術,第三個階段則是瞭解完問題和答案後再回去思考問題本身,常常你會發現其實還有問題。我不是什麼聰明的人,如果我是這樣,我相信工科系的其他學生也會如此。我記得學弟曾經問我,在碩士博士期間,需要看多少論文,我看了多少論文,答案是我真正看完的論文少的可憐,絕大部分的論文只看 Introduction就停下來。但是重點是我花了遠超過讀論文的時間在思考論文想要討論的問題。

七、發掘問題:

以前聽過一個故事是這麼說的,一個東方的小孩回家,父母會問他的小孩,今天在學校回答了幾個問題,一個西方的小孩回家,父母會迫不及待的問他,今天在學校問了幾個問題。我們受的訓練的確是這樣的,是一個回答問題的訓練,當然這無所謂對錯,只是訓練的方式不同,回答問題和提出問題都需要思考,但是沒有經過思考的答案和問題都是沒有意義的。在研究生的訓練過程中,學習發掘問題是重要的一環。如果你問我,我如何找問題,如何知道什麼才是有意義值得研究的問題?我的答案是這也需要訓練,我常常從別人的研究裡找問題,這也是許多過來人給的意見,但我也從自己的研究和自己的工作經驗裡找問題,我常常覺得問題通常是遇到了才知道,所以有些人建議讀碩士前應該有工作的經驗,因為從工作之中,你才會遇到問題,才會逼迫著你去找尋答案,在學校,你通常在看到問題的同時也得到了答案,所以對於發掘問題的訓練,我覺得一方面從別人的研究與經驗獲得,也可以透過動手的經驗(比方說碩士課程中對於Project的研究)找到靈感。 Well define你的問題和問題的發掘一樣的重要,任何一個問題都必須瞭解前因後果才有意義,無病呻吟的題目雖然可以完成論文,但不會有意義。在國外技術人員在解決問題之前,一定作兩件事情,一是Problem Statement,清楚定義你的問題,二是Requirement Statement,說明你要Target的目標。任何問題都需要明確的描述,才能確定問題的Target和目的(Objective),不然往往你會花了很多時間作一個問題卻被一個很簡單的假設所擊倒。

八、建立模型,尋求解決方法並科學化地驗證:

清楚地瞭解問題,接下來就是替你的問題建立模型(Model)並找到解決方法,能否有效率,科學地找到一個方法或是給予問題適當的模型,或是開創自己的一套理論系統,常常需要仰賴基本知識的根基,把一個問題用科學化或數學化的方式描述和定義有助於思考問題,但建立模型需要基本知識的根基和訓練,並沒有一定的規則或方式可以遵循,在研究生的訓練過程中,科學化系統化的建立問題模型,並找到答案也是重要的訓練。有了模型,有了方法,接下來需要驗證,系統化的驗證在科學的過程中是非常重要的一環,如果一個方法比另一方法好,則必須需先訂出比較的方法,最好有科學的量測方式和參數(Index),有一般解或是 Close Form當然最好,或者是實驗或是模擬證明都是一個完整研究所不能或缺的。研究的過程一個Iteration,所以在任何一個點,都需要重回前一步驟或是最先的步驟來重新思考,檢查,或者是從新來過,透過研究過程數個步驟的反覆進行,才能使研究趨於完備。

研究生的訓練當然不僅與如此,拉拉雜雜說的一大堆,希望對大家有些幫助,剩下的部分需要大家自己去思考,去發掘,我就在此打住,最後和大家分享一些自己的零碎經驗,希望對大家有幫助。

  • 第一,人是習慣動物,要試著養成好習慣:
  • 讀書,作筆記,思考,生活作息等等,我記得曾經過了一年十分有規律的生活,早上6:00起床,跑步到8:00, 9:00上班,5:00下班,7:00坐上書桌聽一個小時英文,8:00-12:00寫論文,在那一年裡面,我寫了20多篇論文,完成了博士班絕大部分的工作,我並不特別,而是持續而規律的習慣是很驚人的,別忘了如果我第一天給你一塊錢,之後每天給你前一天1倍的錢,如果你在連續第29天都拿而在第30天放棄,那你第30天損失的將超過你前29天的總和,學習也是這樣子的。

  • 第二,時時警惕自己:
  • 辛苦工作不見得會成功,但是成功的背後一定是一段辛苦的過程,如果你覺得生活過得很愜意,你也許需要警惕自己是否鬆懈,當然並不是研究生都必須過得很辛苦,而是陶醉在研究的同時,通常在別人看事件很辛苦的事。訓練的過程中,別給自己太多的藉口,也別輕易放棄。

  • 第三,從失敗中學習經驗,在逆境中成長:
  • 人要從成功的例子裡學到什麼我覺得很難,通常都是從失敗的例子裡學到東西(因為那會痛,會有深刻的印象),研究的過程中就好像人生,不可能一直順遂,你必須對時常發生的艱苦狀況有心理準備,並學著從逆境中爬起,我常常跟學弟妹說,如果你在學習的過程中覺得很難過,很痛苦,很沮喪那是必然的,因為每個人都是這樣,沒有人例外。放棄問題,你會不再痛苦,但你也享受不了挑戰問題之後的喜樂。我記得我碩一的時候到工研院報告我的一項研究成果,幾乎被評審委員批評的體無完膚,在之後的三天裡我幾乎食不下厭,一言不語,三天之後,我想出了解決方案,我不應該放棄,我應該正視我研究上的缺失,改進問題,直到現在為止我再也沒有遇到這樣的困境,我在博二暑假的時候,獨自到美國Bell Lab.工作,我在美國沒有親友,也是第一次到國外工作居住,剛去的前幾週,我必須自己處理工作,生活(或者我應該用”生存”更貼切些)的所有問題,工作的壓力和自我的要求讓我常常躲在房間,面對窗外,一面想家,一面痛恨自己沒事幹嘛來這裡受苦受難,但幾週之後,我開始感謝我當時的”錯誤決定”,在美國的那段時間可以說是煎熬,但是也學到很多。人深處逆境,在受苦受難的時候應該高興才對,因為你在之後的某一時刻會發現,這一切都是最好的安排。

  • 第四,勇於接受挑戰:
  • 我說YES的次數,遠超過NO的次數,雖然有時候不知道如何說NO會把自己弄得很辛苦。但是勇敢接受挑戰是很重要的,有了較多的經驗與歷練,就會有更多成功的機會。在許多時候,不需要計較事情做多做少,也無須計較是誰的工作或是誰的成就,經驗與歷練是沒有人可以從你身上拿走的。勇於把自己丟在一個惡劣的環境,一個嚴格的環境和監督之下,把自己的研究丟出來讓大家批評,勇於接受挑戰,我常常覺得如果我25歲跌倒,可能爬的起來,但是我 52歲跌到,可能就很辛苦了。勇於接受挑戰,勇於嘗試自己沒有的經驗和歷練,用樂觀積極的態度面對困難,這是我在研究生和在工作上抱持的態度,也希望和大家共勉。

本文摘錄自藏經閣:研究生的學習與訓練

Share

2010年2月6日 星期六

TauP指令筆記

TauP包含了八個指令以及一個圖形介面模式。圖形模式容易看得到圖,但是實際上,TauP強大的威力必須藉由命令列才能夠真的發揮。本文僅僅作為自己以及地震學同好的參考,若有疏漏,請不吝指正。

taup_time
主要目的:輸入深度、距離等參數,求出各種phase的走時以及ray parameter(horizontal slowness)。
可用參數:

  • -ph
  • 後面接一長串的phases list,每個phase之間以','分隔,例如PP,ScP
  • -pf
  • 後面接內含phase名稱的檔案。
  • -mod[el]
  • 接速度模型名稱,預設是iasp91,另外還可以選擇prem, qdt, ak135,以及你自訂的速度構造模型。
  • -h
  • depth(evdp),單位是km。
  • -deg
  • 大圓路徑的距離,單位是度。
  • -km
  • 大圓路徑的距離,單位是km。
  • -sta
  • 後面接stla及stlo。
  • -evt
  • 後面接evla及evlo。
  • -rayp
  • 只印出ray parameter。
  • -time
  • 只印出travel time。
  • -o
  • 指定output檔名。
  • -debug
  • 偵錯模式。
  • -verbose
  • 詳細輸出模式。
  • -version
  • 印出Taup版本號。
  • -help
  • 印出詳細參數資訊。
由於-o, -debug, -verbose, -version以及-help每個指令都有;且不在我們處理數據的目的之內,下面的command就不再列出。
使用範例:
在evdp=130km, gcarc=65o,以iasp91的模型看P,PcP,ScP的走時以及ray parameter:
taup_time -h 130 -deg 65 -ph P,PcP,ScP
Model: iasp91
Distance   Depth   Phase   Travel    Ray Param   Purist    Purist
  (deg)     (km)   Name    Time (s)  p (s/deg)  Distance   Name
----------------------------------------------------------------
   65.00   130.0   P        625.99     6.471      65.00  = P
   65.00   130.0   PcP      657.70     4.134      65.00  = PcP
在evdp=130km, stla/stlo=40/120.5, evla/evlo=12/140,以prem模型看ScP的走時及ray parameter:
taup_time -mod prem -sta 40 120.5 -evt 12 140 -h 210 -ph ScP
Model: prem
Distance   Depth   Phase   Travel    Ray Param   Purist    Purist
  (deg)     (km)   Name    Time (s)  p (s/deg)  Distance   Name
----------------------------------------------------------------
   32.86   210.0   ScP      736.43     3.470      32.86  = ScP
在evdp=330km, gcarc=4350km, iasp91的模型下看PKiKP的資訊,並匯出成PKiKP.dat檔:
taup_time -evdp 330 -km 4350 -ph PKiKP -o PKiKP.dat
不會有任何畫面上的輸出,因為結果已經輸出到PKiKP.dat裡。

taup_pierce
主要目的:輸入深度、距離等參數,求出各種ray穿透到各深度的時間、距離、走時,甚至是投影到地表的經緯度位置。
可用參數:

  • -ph
  • 後面接一長串的phases list,每個phase之間以','分隔,例如PP,ScP
  • -pf
  • 後面接內含phase名稱的檔案。
  • -mod[el]
  • 接速度模型名稱,預設是iasp91,另外還可以選擇prem, qdt,以及你自訂的速度構造模型。
  • -h
  • depth(evdp),單位是km。
  • -deg
  • 大圓路徑的距離,單位是度。
  • -km
  • 大圓路徑的距離,單位是km。
  • -sta
  • 後面接stla及stlo。
  • -evt
  • 後面接evla及evlo。
  • -az
  • 需搭配-evt方能使用。
  • -baz
  • 需搭配-sta方能使用。
  • -turn
  • 只印出反射面上端(topside of reflection),用於crust/mantle邊界。
  • -under
  • 只印出反射面下端(underside of reflection),用於crust/mantle邊界。
  • -rev
  • 同時印出反射面上下端。但是可能程式有一些邏輯問題,-rev跟-turn行為完全相同。
  • -pierce
  • 接一個深度值,可以多計算該深度的到時以及ray parameter。
  • -nodiscon
  • 搭配-pierce使用,僅印出-pierce所指定深度的資訊。
使用範例:
在evdp=122.5km, gcarc=60o時,印出ScP travel time隨距離變化的資訊:
taup_pierce -h 122.5 -deg 60 -ph ScP
> ScP at   867.49 seconds at    60.00 degrees for a    122.5 km deep source in the iasp91 model.
    0.00   122.5     0.0
    0.15   210.0    19.7
    0.53   410.0    63.2
    1.12   660.0   111.4
   13.48  2889.0   469.6
   57.47   660.0   785.6
   58.62   410.0   813.9
   59.36   210.0   838.7
   59.65   122.5   850.1
   59.92    35.0   861.6
   59.96    20.0   863.9
   60.00     0.0   867.5
此時的三個欄位分別是gcarc, depth以及travel time。
在stla/stlo=-40/120, evla/evlo=0/140且evdp=105km的情況下,計算ScP的資訊並額外求出在440km處的travel time, ray parameter等資訊:
taup_pierce -h 105 -sta -40 120 -evt 0 140 -pierce 440 -ph ScP
> ScP at   802.18 seconds at    43.96 degrees for a    105.0 km deep source in the iasp91 model.
    0.00   105.0     0.0      0.00    140.00
    0.17   210.0    23.6     -0.15    139.94
    0.52   410.0    67.0     -0.48    139.81
    0.58   440.0    73.0     -0.53    139.78
    1.06   660.0   115.0     -0.98    139.60
   12.28  2889.0   468.3    -11.36    135.30
   41.65   660.0   721.3    -37.98    121.44
   42.58   440.0   745.7    -38.80    120.87
   42.70   410.0   749.1    -38.90    120.80
   43.37   210.0   773.6    -39.49    120.37
   43.69   105.0   787.1    -39.76    120.17
   43.89    35.0   796.3    -39.94    120.05
   43.92    20.0   798.6    -39.97    120.03
   43.96     0.0   802.2    -40.00    120.00
此時的五個欄位分別是:gcarc, depth, travel time, lat, lon。也會多算出440km處的資訊。
在stla/stlo=-40/120, evdp=105km, gcarc=1387km且baz=65o時,求ScP的資訊:
taup_pierce -h 105 -km 1387 -sta -40 120 -baz 65 -ph ScP
> ScP at   707.47 seconds at    12.47 degrees for a    105.0 km deep source in the iasp91 model.
    0.00   105.0     0.0    -33.90    133.64
    0.06   210.0    23.3    -33.93    133.58
    0.19   410.0    66.0    -34.00    133.45
    0.39   660.0   113.1    -34.11    133.25
    4.28  2889.0   445.5    -36.16    129.21
   11.66   660.0   630.8    -39.65    120.95
   12.03   410.0   656.7    -39.81    120.53
   12.26   210.0   680.0    -39.91    120.25
   12.38   105.0   692.9    -39.96    120.12
   12.45    35.0   701.7    -39.99    120.03
   12.46    20.0   704.0    -39.99    120.02
   12.47     0.0   707.5    -40.00    120.00
靈活給定-evt/-az以及-sta/-baz,幾乎就掌握了taup_pierce這個指令。欲取得各個phase在構造邊界的反彈點位置,例如ScP反彈點投影到地表的座標,利用taup_pierce把2889.0給grep出來,取第四、第五欄位就可以了!

taup_path
主要目的:輸入深度、距離等參數,用來輸出可以用於psxy的格式,以GMT繪製出ray path。
可用參數:

  • -ph
  • 後面接一長串的phases list,每個phase之間以','分隔,例如PP,ScP
  • -pf
  • 後面接內含phase名稱的檔案。
  • -mod[el]
  • 接速度模型名稱,預設是iasp91,另外還可以選擇prem, qdt,以及你自訂的速度構造模型。
  • -h
  • depth(evdp),單位是km。
  • -deg
  • 大圓路徑的距離,單位是度。
  • -km
  • 大圓路徑的距離,單位是km。
  • -sta
  • 後面接stla及stlo。
  • -evt
  • 後面接evla及evlo。
  • -gmt
  • 輸出結果直接是GMT script。
使用範例:
在evdp=560km, gcarc=74o時,印出PcP,PKiKP的ray path,需匯出成GMT script:
taup_path -h 560 -deg 74 -ph PcP,PKiKP -gmt -o 1999.009.raypath.gmt
不指定輸出檔名時,預設輸出檔名為taup_path.gmt。執行taup_path.gmt會得到這樣的圖型:

taup_curve
主要目的:輸入深度、距離等參數,用來輸出可以用於psxy的格式,以GMT繪製出travel time curve。
可用參數:

  • -ph
  • 後面接一長串的phases list,每個phase之間以','分隔,例如PP,ScP
  • -pf
  • 後面接內含phase名稱的檔案。
  • -mod[el]
  • 接速度模型名稱,預設是iasp91,另外還可以選擇prem, qdt,以及你自訂的速度構造模型。
  • -h
  • depth(evdp),單位是km。
  • -gmt
  • 輸出結果直接是GMT script。
  • -reddeg
  • 輸出曲線其速度衰減單位為deg/sec。
  • -redkm
  • 輸出曲線其速度衰減單位為km/sec。
使用範例:
taup_curve -h 138 -mod prem -gmt -o curve-deg.gmt

畫出來還不是普通的醜,所以必須要自己改一下才行。

taup_setsac
主要目的:幫助標記phase名稱以及該phase的理論到時,並寫入到sac檔的headers(t0~t9以及kt0~kt9)內。
可用參數:

  • -ph
  • 後面接一長串的phases-number,每個phase之間以','分隔,例如PP-1,ScP-5
  • -pf
  • 後面接內含phase-number的檔案。
  • -mod[el]
  • 接速度模型名稱,預設是iasp91,另外還可以選擇prem, qdt,以及你自訂的速度構造模型。
  • -devpkm
  • 設置evdp單位為km(預設是meter)。這個參數很容易忘記,一定要加上去。
使用範例:
將sac檔的PcP與ScP的到時標記起來並寫入到headers裡。
taup_setsac -ph ScP-1,PcP-2 -evdpkm ST40.01.BHZ.sac
ST40.01.BHZ.sac
Swap bytes for linux: swapBytes(npts) (40743*4) + header(632) =  file length=163604
此時看一下sac檔的headers:
SAC> lh t1 kt1 t2 kt2


  FILE: ST40.01.BHZ.sac - 1
 --------------------------------------

      t1 = 8.076501e+02
     kt1 = ScP
      t2 = 5.859711e+02
     kt2 = PcP
關於這個指令,需特別注意sac headers裡的evdp跟o都必需要被設定過(也就是必須有值);有些phase在某距離內會有多個到時,注意taup只會取第一個到時,其餘忽略。另外,這裡如果沒有加上-evdpkm,則用meter計算會天差地遠;後面的sac檔名不適用萬用字元或正規表示法,如果要三個方向的sac檔都要寫入,必須輸入三個檔名才行。

taup_table
主要目的:將速度構造模型匯出成LocSAT可以使用的travel time table格式,或是一般格式。
可用參數:

  • -ph
  • 後面接一長串的phases list,每個phase之間以','分隔,例如PP,ScP
  • -pf
  • 後面接內含phase名稱的檔案。
  • -mod[el]
  • 接速度模型名稱,預設是iasp91,另外還可以選擇prem, qdt,以及你自訂的速度構造模型。
  • -header
  • 接一個LocSAT格式的檔案,內含有depth-distance的資料檔。
  • -locsat
  • 輸出LocSAT格式的travel time table(ascii)。
  • -generic
  • 輸出一般的travel time table(ascii)。
使用範例:
將prem模型的ScP,PcP的travel time以一般格式輸出:
taup_table -model prem -ph ScP,PcP -generic -o generic_ScP_PcP.dat
輸出的結果部份如下:
prem     0.00      0.0 PcP    510.35     0.000       0.00  PcP
prem     0.00      0.0 ScP    723.01     0.000       0.00  ScP
prem     0.10      0.0 PcP    510.35     0.010       0.10  PcP
prem     0.10      0.0 ScP    723.01     0.012       0.10  ScP
prem     0.20      0.0 PcP    510.35     0.019       0.20  PcP
prem     0.20      0.0 ScP    723.01     0.025       0.20  ScP
prem     0.30      0.0 PcP    510.36     0.029       0.30  PcP
prem     0.30      0.0 ScP    723.02     0.037       0.30  ScP
prem     0.40      0.0 PcP    510.36     0.038       0.40  PcP
prem     0.40      0.0 ScP    723.02     0.050       0.40  ScP
將prem模型的ScP,PcP的travel time以LocSAT格式輸出:
taup_table -model prem -ph ScP,PcP -locsat -o locsat_ScP_PcP.dat
輸出的結果部份如下:
n # ScP,PcP travel-time tables for prem structure. (From TauP_Table)
40     # number of depth samples
   0.00   1.00   2.00   3.00   4.00   5.00  10.00  15.00  19.00  21.00
  25.00  30.00  33.00  35.00  40.00  45.00  49.00  51.00  55.00  60.00
  70.00  80.00  90.00 100.00 120.00 140.00 160.00 180.00 200.00 220.00
 240.00 260.00 280.00 300.00 350.00 400.00 450.00 500.00 550.00 600.00
207    # number of distances
   0.00   0.10   0.20   0.30   0.40   0.50   0.60   0.70   0.80   0.90
   1.00   1.10   1.20   1.30   1.40   1.50   1.60   1.70   1.80   1.90
   2.00   2.10   2.20   2.30   2.40   2.50   2.60   2.70   2.80   2.90
   3.00   3.10   3.20   3.30   3.40   3.50   3.60   3.70   3.80   3.90
   4.00   4.10   4.20   4.30   4.40   4.50   4.60   4.70   4.80   4.90
   5.00   5.10   5.20   5.30   5.40   5.50   5.60   5.70   5.80   5.90
   6.00   6.10   6.20   6.30   6.40   6.50   6.60   6.70   6.80   6.90
   7.00   7.10   7.20   7.30   7.40   7.50   7.60   7.70   7.80   7.90
如果你想使用LocSAT,網站上提供的ftp下載處連結是錯誤的,請下載Linux版本,或是HP unix版本,或是Solaris版本

taup_create
主要目的:自訂一個速度構造的模型。
可用參數:只有兩個參數可用

  • -nd
  • "named discontinuities"格式的檔案,請參考$TAUP_HOME/modelFiles/prem.nd。
  • -tvel
  • ".tvel"格式的檔案,請參考$TAUP_HOME/modelFiles/iasp91.tvel。
使用範例:
修改prem速度模型後,產生一個新的model:
taup_create -nd new_prem.nd
結果會在工作目錄下產生名為new_prem.taup的一個速度模型檔,這是一個binary。
修改iasp91速度模型後,產生一個新的model:
taup_create -tvel new_iasp91.tvel
結果會在工作目錄下產生名為new_iasp91.taup的一個速度模型檔,這是一個binary。
很可惜的,taup_create並沒有-o參數,他必定會用輸入檔當成輸出的檔名。這個新的速度模型檔放在工作目錄下就可以被找到並且指定:
taup_time -mod new_prem -evdp 330 -km 4350 -ph PKiKP -o PKiKP.dat
如此一來便可以搭配自訂模型來處理問題。

taup_peek
主要目的:用於debugging先前taup_create所產生的模型細節問題。
可用參數:只有一個參數可用

  • -mod
  • 接我們所產生的model檔名。
使用範例:
taup_peek -mod new_prem
然後在互動式的問答輸入depth跟distance來作詳細的偵錯。

如果你看了這篇筆記,對你有些幫助或是有需要補充的地方,請留言給筆者,謝謝!

Share