February 01, 2013

GrADS的資料結構

GrADS 主要就是由 一個或一組 binary 格式的資料檔(data)與一個(或一組)ASCII 格式的控制檔(contorl file) 類似檔頭 (Header)的功用,描述與指示這組資料的基本資訊。基本上資料結構在 GrADS 的官網上就說的很詳細了,我硬是把他畫了一張圖,讓大家可以比較容易清楚明白,
由GrADS 產生出來或是由其他程式產生出來讓GrADS可讀的資料應如何排列 -- 基本上是為下一篇 IDL output to GrADS binary做準備。

當 GrADS 讀取資料時,他是以 X (通常是經度, Longitude)- Y (通常是緯度, Latitude) 同時讀取,稱為"一筆"資料。X軸由左而右(0 度 - 360度),Y 軸由下而上(南緯90度 - 北緯90度)。如果這筆資料有垂直向則加上 Z 軸,這樣就是一筆3D資料。資料寫成矩陣 (array) 的形式就是: data(X, Y, Z)
如果時間軸的話,再加上時間 (T),那資料的arry 就成了: data(X, Y, Z, T)。

以上應該還算好理解,如果這筆資料有兩個以上變數(Var)各有X, Y, Z呢?
像第一張圖所標示的,GrADS 的處理原則是在同一時間內,先把第一個時間內(T1)的第一個變量(Var1)X, Y, Z處理完,再處理第二變量(Var2)的 X, Y, Z...,直到第N個變量(Var N)的X, Y, Z都處理完。資料的arry 寫成 data(X, Y, Z, Var)。

(1) 單一時間內,GrADS 處理多種變量(Vars)的順序

如果有時間軸的話,就如上規則先處理第一個時間(T1)的變量,再繼續讀第二個時間(T2)的第一個變量(Var 1),直到Var N。
然後再處理第三個時間...直到第 N個時間,第二張圖所示。所以他的變量的arry就是 data(X, Y, Z, Var, T)。

較新版本的GrADS,還加上另一維度 - 也就是 ensemble (E, 系集合),如果前面的五維不夠用的話,可以在加上這第六維,
通常用於預報數據除了實際初始時間 (T),再加上預報時間(Lead Time)的情況。詳細ctl 文件維度 E 的寫法,請看GrADS 官網說明。
 
(2) 加上系集合與時間維度後,GrADS 處理數據的規則

瞭解了GrADS binary 的資料結構,我們就可以很輕鬆地用 Fortran 、IDL或是Matlab 等軟體讀取或產生這樣的檔案,不但同時可以讓 GrADS 的使用者使用,也可以讓我們在處理數據時,第一時間快速地畫出圖,檢驗一下我們所下的數據對還是不對,達到充分運用兩套工具,以增進我們工作效能的目的。

January 26, 2013

工欲善其事


當初學IDL 的時候,老師沒有給一份比較實質而且有系統的講義。大多時候是派發作業時,附上了一些 samples,自己就上網找資料加上揣摩修改半路出家,真是痛苦萬分...

後來做研究執行計畫時決定以戰養戰,覺得應該把 IDL 從基本開始學起,儘管網路資源豐富,可是手上還是需要一本好的入門書,以便隨時翻照查閱。因此找到了這一本:

Practical IDL Programming
ISBN: 1558607005
作者是 Liam E. Gumley
http://www.gumley.com/

這本書真是深入淺出,把基本的 IDL指令都交代的很詳細,而且附上了有用的程式範例與函式庫,讓讀者可以自行應用在自己的程式裡頭。這些程式範例都可以在以上的網頁裡下載得到,是一本很棒很適合IDL 初學者的指引與日後手邊的參考用書。

另外一份對入門者不錯的資料是 Colorado State University (CSU) 大氣科學系老師 Joe Munchak的上課講義:
http://www.atmos.colostate.edu/programming/


總共有五周的講義,加上作業以及作業解答。看完後對於IDL 會有更深一層的認識。

January 21, 2013

IDL 在地圖上畫風向量 - Wind vector overploting on the map

在7.0 版IDL之前要畫風向量,一般會使用以下幾個 functions:

VEL - Draws a velocity (flow) field with streamlines.
VELOVECT - Draws a 2D velocity field plot.
PLOT_FIELD - Plots a 2D field using arrows.
ARROW - Draws one or more vectors with arrow heads.

或者,你也可以用The IDL Astronomy User's Library (NASA)  的 partvelvec.pro

可是他們都不能讓你同時把風向量化在地圖上。如果你要用 ivector 那也要7.0 以後才能用。

Here is a "quick solution" from somebody whom we have to appreciate:
map_vect.pro

Notice that you might need to modify the reference vector size for your purposes.

The figure below represents the composition of 500mb wind speed contour and directions in 1956. The data source is NCEP/NCAR Reanalysis data (NNR) provided by the Physical Science Division, NOAA Earth System Research Laboratory.



From

MPI vs. openMP

MPI (Message Passing Interface) and openMP

I am struggling with those two things for a while. Here has several websites having good explanations in Chinese:

OpenMP 與 MPI 的差別

中央氣象局超高速運算電腦系統的應用

SST - 老梗

1900 - 2000 年間夏季平均海平面溫度 Mean Sea Surface Temperature (SST) 全球分布。 SST 的分析是做 颱風,ENSO 與 El Niño 的老梗,這張圖比較棘手的地方在近極區(75 度以北或以南)的地區,有時候是海冰,不是有效的海水溫度,需要剔除掉,處理的時候硬是脫層皮;加上360 X 180 網格資料乘上100年, IDL 硬是被我操掛了好幾次... orz 回到圖上,西太平洋,印度洋與墨西哥灣,三大暖區,也是颱風易於生成的地方。

建立紅-白-藍色表 - How to create a R-W-B color table in IDL

在大氣裡面,有很多機會看在天氣圖或是變差圖上到紅白藍三色的色表。我把 David W. Fanning's website talking about "Constructing a Color Table in IDL" 上的簡單色表程式稍微改寫了一下,就完成了我們常用的這個紅白藍色表。這一篇告訴你怎麼建立這個色表;下一篇,我再說明怎麼把它用在IDL的繪圖上面。 (1) 紅白藍矩陣的設定: 第一部份,設定紅色漸層至白色。第二部份則由白色漸深至藍色。
pro color_table_RWB

device, decomposed=0
ncolors = 255
steps = 128
scaleFactor = FINDGEN(steps) / (steps - 1)
; Do first half colors (red to white).
; Red vector: 255 -> 0
R = REPLICATE(ncolors, steps)
; Green vector: 255 -> 0
G = 0 + (0 + ncolors) * scaleFactor
; Blue vector: 0 -> 255
B = 0 + (0 + ncolors) * scaleFactor

; Do second 100 colors (whie to blue).
;Red vector: 0 -> 255
R = [R, reverse(0 + (ncolors + 0) * scaleFactor)]
; Green vector: 0 -> 0
G = [G, reverse(0 + (ncolors - 0) * scaleFactor)]
; Blue vector: 255 -> 0
B = [B, REPLICATE(ncolors, steps)]
(2) 列出RGB三矩陣裡的顏色設定值: 色階總數設定為 255+1 (值從0到255),如果你不想用這麼多色階,可從這個loop 印出所有色階的值供你撿用。 或者,就由設定間隔值,可以直接取得等量色階,然後你就可以自行設定所需的色表。
k = 0
for i = 0, ncolors-1, 16 do begin
print, i, R(i), G(i), B(i), k
k = k + 1
endfor
(3)螢幕快速顯示色表:
TVLCT, R, G, B

;display the sample
image = FINDGEN(255) # REPLICATE(1, 60)
WINDOW, XSIZE=255, YSIZE=60
TV, BYTE(image)
END
(4) 從(2) output 的色階代碼:
color# Red Green Blue
0 255.000 0.000000 0.000000 0
16 255.000 32.1260 32.1260 1
32 255.000 64.2520 64.2520 2
48 255.000 96.3780 96.3780 3
64 255.000 128.504 128.504 4
80 255.000 160.630 160.630 5
96 255.000 192.756 192.756 6
112 255.000 224.882 224.882 7
128 255.000 255.000 255.000 8
144 222.874 222.874 255.000 9
160 190.748 190.748 255.000 10
176 158.622 158.622 255.000 11
192 126.496 126.496 255.000 12
208 94.3701 94.3701 255.000 13
224 62.2441 62.2441 255.000 14
240 30.1181 30.1181 255.000 15
(5)最後執行這個程式後,你可以在螢幕上看到如下的紅白藍色表。

March 01, 2012

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free WordPress Themes | Blogger Theme by Lasantha - Premium Blogger Templates | Affiliate Network Reviews