星期二, 12月 10, 2013

GMT 繪圖軟體使用中文字

因為不知道下次是多久之後才會再設定到了
所以在這裏記錄一下
也不想另外安裝字型,就用系統裏的。

系統內建的中文字型檔,不是從 windows co 過去的!!

yum CentOS6.4 的字型套件名:cjkuni-fonts-ghostscript.noarch
CentOS 7 的字型套件名與上面的不同:ghostscript-chinese-zh_TW.noarch
首先看看這個檔在不在 vi /usr/share/ghostscript/conf.d/cidfmap.zh_TW
不在就是字型套件沒裝,就裝上吧:
yum install cjkuni-fonts-ghostscript.noarch #centos 6
yum install ghostscript-chinese-zh_TW.noarch #centos 7
它應該至少會把二個字型分別裝在 /usr/share/fonts/cjkuni-ukai/ 與 /usr/share/fonts/cjkuni-uming/
然後 /usr/share/ghostscript/conf.d/cidfmap.zh_TW 這個檔案也會出現!內容如下:
/ZenKai-Medium          << /FileType /TrueType /Path (/usr/share/fonts/cjkuni/ukai.ttc) /CSI [(CNS1) 4] >> ;
/ShanHeiSun-Light       << /FileType /TrueType /Path (/usr/share/fonts/cjkuni/uming.ttc) /CSI [(CNS1) 4] >> ;
/Adobe-CNS1             /ShanHeiSun-Light ;
不知道在搞什麼!字型的位置跟實際上的不太一樣,把它改過來,改成下面的樣子

/ZenKai-Medium          << /FileType /TrueType /Path (/usr/share/fonts/cjkuni-ukai/ukai.ttc) /CSI [(CNS1) 4] >> ;
/ShanHeiSun-Light       << /FileType /TrueType /Path (/usr/share/fonts/cjkuni-uming/uming.ttc) /CSI [(CNS1) 4] >> ;
/Adobe-CNS1             /ShanHeiSun-Light ;

加到GMT的字型列表中

然後,ZenKai-Medium 聽起來像是正楷,就把它加到gmt中吧,方法如下:
#gmt4的版本,是要改PS_font_info.d 這個檔案,gmt 5則不是(請看下面gmt 5的部份)
#後面三行看起來像這樣:
vi /usr/local/gmt/share/pslib/PS_font_info.d Palatino-BoldItalic 0.677 0 ZapfChancery-MediumItalic 0.610 0 ZapfDingbats 0.700 1 #最後面新增一行 ZenKai-Medium-UniCNS-UTF8-H 0.700 1 #如果是gmt5,改的是PSL_custom_fonts.txt這個檔案在 /gmtdir/share/postscriptlight/下吧 vi /usr/local/share/postscriptlight/PSL_custom_fonts.txt #一樣在最後面新增一行 ZenKai-Medium-UniCNS-UTF8-H 0.700 1
上面這行很重要的是ZenKai-Medium是字型名稱,但是後面還一定要加一串不知道是什麼鬼的字"-UniCNS-UTF8-H"
我真的不知道為什麼,只知道UniCNS-UTF8-H 可以
ls /usr/share/ghostscript/8.70/Resource/CMap/
中找到,網路上人家簡體字用的是UniGB-UTF8-H,我試了一下不行…想說GB命名的編碼八成都與簡體有關,就想說隨便拿幾個試試…第一個就是把GB換成CNS…就成功了!耶!
# 重要1,gmt 的字型設定可以分五項FONT_ANNOT_PRIMARY, FONT_ANNOT_SECONDARY, FONT_LABEL, FONT_LOGO, FONT_TITLE,要確定你用到字型的部份是哪一個,不然會以為沒改好。 # 重要2, 可以用gmtset,只在需要打中文字的前面設定使用中文字形,之後再設定回原來的字型,這樣英文字比較不會怪…
gmtset HEADER_FONT 35; echo 1.5 5 40 0 35 LM GMT,測試 >tmp;echo 5 0.5 20 0 35 LM 測試2>>tmp;pstext tmp -R0/7/0/7 -JX6i/6i -B1/1:."GMT 中文": -P >cn.ps; ghostscript cn.ps
如果有中文字就成功了
CentOS5 設定路徑和6.4版不同,我的系統也沒要裝什麼,cidfmap.zh_TW是放在/etc/ghostscript/中。看起來與6.4版內容很像,所以什麼都沒做,就從"加到GMT的字型列表中"的部份開始即可

星期一, 7月 22, 2013

python3.3 easy_install numpy scipy matplotlib 安裝

安裝ptyhon 3.3.2
yum install tk-devel.x86_64
yum install tcl-devel.x86_64
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel
yum install lzma-devel.x86_64 # centos 6.5 不叫這個名字,先不裝看看
yum install xz-devel.x86_64

#上面二個要先裝,不然plot.show()會沒畫面跳出來。
wget http://www.python.org/ftp/python/3.3.2/Python-3.3.2.tar.bz2
tar jxvf Python-3.3.2.tar.bz2
cd Python-3.3.2
export LDFLAGS=-L/usr/lib64;./configure --prefix=/opt/python3 --with-wide-unicode
# 還有,如之後要裝 mod_wsgi (django會用到),那麼記得一定要在configure時加上,--enable-shared
# 還要在編譯時加上-fPIC 不過應該做好--enable-shared設定時就會加上了,如果沒有就export CFLAGS=-fPIC再configure

make
make test
#出現如下錯誤,但似乎不是程式的問題,是不應該用真實存在的網址www.python.org做測試
#所以假裝測這件事…
#FAIL: test_geturl (test.test_urllibnet.urlopenNetworkTests)
#----------------------------------------------------------------------
#Traceback (most recent call last):
#  File "/home/cmd/tmp/python3/Python-3.3.5/Lib/test/test_urllibnet.py", line 86, in test_geturl
#    self.assertEqual(gotten_url, URL)
#AssertionError: 'https://www.python.org/' != 'http://www.python.org/'
#- https://www.python.org/
#?     -
#+ http://www.python.org/

make install
# 有人說要用 make altinstall
# 不知道差異是啥…

#好了之後記得設定路徑
# 因為Centos5已經裝了python2.? 所以我們新裝的請用python3執行

移除先前用yum裝的版本(如果有裝的話)
yum remove python-setuptools.noarch

安裝 setuptools
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py 
python3 ez_setup.py
easy_install pip
pip install numpy
cd /opt/python3/lib/python3.3/site-packages/numpy-1.7.1-py3.3-linux-x86_64.egg/numpy/distutils
# 這一段應該不用執行
# 執行 python3 setup.py ,然後輸入下面二行設定c與fortran 編譯器
# gcc
# f<intelem>
# Ctrl-D
新增 site.cfg 檔案,內容如下:
vi /opt/python3/lib/python3.3/site-packages/numpy/distutils/site.cfg
[mkl]
library_dirs = /opt/intel/mkl/lib/intel64
include_dirs = /opt/intel/mkl/include
mkl_libs = mkl_rt
lapack_libs =
透過pip 安裝 scipy 及 matplotlib
先裝 libpng-devel
yum install libpng-devel.x86_64
pip install scipy
pip install matplotlib
# 上面這個如果有X相關的問題(可能是遠端ssh 有x-tunnel沒開X serv),

安裝Module netCDF4 假設我們已經裝好hdf5在 /usr/local/hdf5及netcdf4在/usr/local/netcdf 中
export HDF5_DIR=/usr/local/hdf5
export NETCDF4_DIR=/usr/local/netcdf
export USE_NCCONFIG=1
pip install netcdf4
安裝basemap
yum install agg.x86_64
# geos 必需3.?版以上與 proj 與 ,所以另外增加第三方套件庫,
wget http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm
wget http://apt.sw.be/redhat/el6/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
#註,請自行連上網去看,上面的/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm 檔案有無更新的版本。
rpm -Uvh rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm
yum install proj-devel.x86_64
yum install geos-devel.x86_64
# yum install geos-python.x86_64 <--不用?

pip install pillow
pip install pytz
pip install python-dateutil
easy_install basemap
# 在用到PIL套件時如果遇到此類錯誤
#decoder jpeg not available
#就是沒裝libjpeg
#要裝上它(CentOS6.5是如下套件)
yum install libjpeg-turbo-devel.x86_64
#完了之後要重新裝PIL及相關套件(Python2版)在python3中叫做Pillow
pip install -I Pillow
pip install -I pytz
pip install -I python-dateutil
# 
easy_install -mxN basemap
easy_install basemap
# 這次在CentOS6.5的機器上,一直沒有辦法把basemap裝好,
#感覺是GEOS的問題,試了好久,只好編譯basemap裏面附的geos版本
# 編譯好之後再手動setup basemap,步驟如下
# 下載 basemap-1.0.7.tar.gz 並且 tar zxvf
# src 資料夾裏有一個 geos-3.3.3
./configure --prefix=/usr/local/geos
make; make install
export GEOS_DIR=/usr/local/geos
cd ../
python3 setup.py install
# 搞定
安裝ipython
#先安裝zeromq 套件,網站建議用yum,所以要把該網站的repo放到/etc/yum.repos.d/中
#cd /etc/yum.repos.d/
#wget http://download.opensuse.org/repositories/home:/fengshuo:/zeromq/CentOS_CentOS-5/home:fengshuo:zeromq.repo
# 6.5 版直接不用做上面的步驟
yum install zeromq-devel.x86_64
pip install tornado
pip install pyzmq
pip install ipython

星期二, 12月 25, 2012

ImageMagick 將 jpeg 合併製成 gif 動畫

簡報檔只能有一個檔案是個人在做簡報的一個原則,所以裏面的動畫檔,基本上都用gif來解決…可是最近一直有gif檔太大,但是縮小又太模糊的困擾發生,只好測試一下看看該怎麼做gif檔比較能夠接受。
本篇重點在於resize jpg圖檔時,記得 -quality 100,圖形才不會糊糊的。
convert -resize 14% -quality 100 input.jpg output.jpg
基本上用到的工具就只是ImageMagick,請自行安裝先…

這是原始圖檔,4600x5500像素…檔案大小1.64MB,這樣的檔案一共44個。
基本上放ppt檔的圖形不需要那麼多像素,full hd 也才1920x1200。何況投影片解析度通常沒那麼高,以1024x768為目標來說,我們把圖形縮 14% 的話就變成644x770的檔案。指令如下:
convert -resize 14% original-1.jpg small-1.jpg
檔案大小被這麼一縮,剩下82k大小,可是圖形變的很糊,字與線條邊邊都會因為壓縮而有雜點…

用下述指令產生gif 檔
convert -loop 30 -delay 25 small-*.jpg anim.gif
做成的檔案大小是10.6mb,真是出人意料之外,因為44個各別的檔案也才3.64mb,怎會做成gif卻變那麼大,而且gif圖形品質當然不會變好哩。


jpeg轉檔時記得不要壓縮
由於jpeg存檔時可以指定是否壓縮,預設都會壓(不過我不知道convert採用的預設值多少),我們可以透過-quality 來決定壓縮值,0-100,100是不壓,所以重新用下述指令縮小圖檔:
convert -resize 14% -quality 100 original-1.jpg small-1.jpg
檔案大小變成約300kb,44個一共13.0mb

用下述指令把jpg合成gif後,檔案變成約9mb大小…又是另一個讓人意外的答案。
convert -loop 30 -delay 25 small-*.jpg anim.gif
註:
convert -loop 30 -delay 25 -quality 100 smail-*.jpg anim.gif
convert -loop 30 -delay 25 -quality 50 smail-*.jpg anim.gif
合成的檔案大小一樣是9mb,懷疑合成gif時沒有用到壓縮,所以quality在合成gif時無做用。


星期四, 10月 11, 2012

samba無法進入連結(link)資料夾

因為安全因素,所以samba預設不會讓你進到連結的資料夾。當然,一定有打開的方法,如下:
編輯/etc/samba/smb.conf

[global]
如果有這些關鍵字,就把它設成如下,不然就新增。然後/sbin/service smb restart 即可。
follow symlinks = yes
wide links = yes
unix extensions = no

#然後記得還有 selinux 的權限問題, #假如你link到/disk1/cmd 那麼記得執行如下指令打開selinux權限 chcon -t samba_share_t /disk1/cmd

星期二, 6月 12, 2012

bash 如何用變數取得變數名稱

中文形容的不恰當,英文比較貼切
bash, how to get variable name from variable

假設bash有如下變數:
st21413=5234.3
st21416=4432.2
st52405=5732.1
所以
echo $st21413 會得到 5234.3
那如果
A=st21413
有沒有什麼方法可以透過A得到5234.3的值?
直覺得想法像是
echo $`$A`
結果得到 $st21413 而非 5234.3 …
正解:
A=st21413
echo ${!A}
即可得到5234.3
如果
B=${!A}
那 B 的值就是 5234.3 囉,即
echo $B 會得到 5234.3

星期一, 5月 14, 2012

用 ImageMagick 的 convert 合併圖檔

話說生論文的重點在於你有沒有好看的圖…英文不好、論點不佳、結果很慘,只好靠作圖來加分…是這樣嗎。
使用GMT繪圖時,撰寫的scripts習慣以一張圖為一個檔案,並且直接轉成jpg。 可是在論文編排時,常常需要把幾張圖合成一張,然後在圖中附上a,b,c,d。 以前的做法是用power point編排後再存成ps檔,再由ps檔轉成jpg(此時可設定解析度)。 本來以為這樣的做法,解析度可以保持(事實上解析度是很大…可以過論文排版的檢查),不過實際上圖的解析度並沒有很好。 另外的做法是用gimp處理jpg檔,或是保留ps檔使用coreldraw,可是對於不常用這些軟體的我來說很是麻煩。
由於我一直有在使用ImageMagick,尤其是要執行縮小或製作gif檔時使用convert命令的方法很是方便。 當然強大的ImageMagick如果只是要把很有規則(大小一樣有的沒的)的幾張圖重新排列,並加上(a)(b)(c)(d)應該不難,只是我不會,也一直沒空去了解。最近又要排版了,再用回power point實在品質太差(我標準提高了嗎?)。所以只好花點時間研究ImageMagick,哇~簡值是神奇,只要一個指令就可以搞定。 例如我有四張圖如下:




然後透過下面的指令:
convert \( -page -0-0 \( figure4-a.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(a\) -flatten \) -page -0-0 \( figure4-b.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(b\) -flatten \) -bordercolor black -border 50 +append \) \( -page -0-0 \( figure4-c.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(c\) -flatten \) -page -0-0 \( figure4-d.jpg -page +350+220 -background none -fill black -pointsize 220 label:\(d\) -flatten \) -bordercolor black -border 50 +append \) -append out.jpg
就變成這樣一張圖:

很神奇對不對(我是指我能寫出這天書般的指令),只是上面的指令記不起來的啦,下次也保證看不懂的啦。既然已經花點時間去了解ImageMagick裏convert的用法,也相信下次要用時會忘記,只好寫個簡單的scripts幫助記憶,並且希望可以再下次要用時直接取用。如果你有需要就請隨便用,把你的圖搞壞了別怪我就是了。
convert 可以透過( ) 來優先處理,所以下面的邏輯是先對每一張圖加上(a) (b) (c) (d),用-label給文字,-pointsize給大小,-page給位置。另外,圖要合併時是沒間距的,所以透過-border加個白色外框(由-bordercolor設定白色)。
然後用+append把二張做橫向合併,所以每個橫向的合併要再用一個( )
最後把橫向合份好的結果再用-append用垂向合併。大致上是這個意思
convert   ( (圖1加字) (圖2加字) +append)  ( (圖3加字) (圖4加字) +append ) )  -append  outfigname.jpg

scripts的寫法是當然由最裏面的小圖一路往上拓展,內容如下:

figncols=2
fignrows=2
outfigname=out.jpg
figname[1]=figure4-a.jpg
figname[2]=figure4-b.jpg
figname[3]=figure4-c.jpg
figname[4]=figure4-d.jpg

labelvar[1]="label:\(a\)"
labelvar[2]="label:\(b\)"
labelvar[3]="label:\(c\)"
labelvar[4]="label:\(d\)"
labelvar[5]="label:\(e\)"
labelvar[6]="label:\(f\)"
labelvar[7]="label:\(g\)"
labelvar[8]="label:\(h\)"
labelvar[9]="label:\(i\)"
labelvar[10]="label:\(j\)"
labelvar[11]="label:\(k\)"
labelvar[12]="label:\(l\)"
# ( if rows=3, cols=4, there will have 12 figs)
#          rows
# c    fig1   fig2   fig3
# o    fig4   fig5   fig6
# l    fig7   fig8   fig9
# s    fig10  fig11  fig12
#
#
figtots=`expr $figncols \* $fignrows`
pagevar="-page +350+220"  # label position in pixel
#  下面設定圖與圖中的間隔及顏色,這裏是設黑色,寬度50
bordervar="-bordercolor black -border 50"
pointsize="-pointsize 220"  # font size in pixel
pointvar="$pagevar -background none -fill black $pointsize"
for (( i=1; i<=$figtots; i++ )); do
  a[$i]=`echo " -page -0-0 \( ${figname[$i]} $pointvar ${labelvar[$i]} -flatten \)"`
done
for (( i=1; i<=$fignrows; i++ )); do
    b[$i]=`echo "\("`
  for (( j=1; j<=$figncols; j++ )); do
    k=`expr \( $i \- 1 \) \* $figncols \+ $j `
    b[$i]=`echo "${b[$i]} ${a[$k]}"`
  done
    b[$i]=`echo "${b[$i]} $bordervar +append \)"`
done
c=`echo "convert "`
for (( i=1; i<=$fignrows; i++ )); do
  c=`echo "$c ${b[$i]}"`
done
c=`echo "$c -append $outfigname"`
echo $c
echo "the command above is excuting"
eval $c
echo "done"

星期一, 1月 30, 2012

編譯 ncview


一直以來,都用 fortran 配合 GMT畫模式輸出結果的圖,其實已經很方便了,不過常常還是要改一下script。有時候只想非常快速的看一下結果,(完全不重品質),其實 ncview 算是不錯的軟體。下面是其安裝步驟:

安裝 udunits
export F77=ifort
./configure --prefix=/usr/local/udunits
make
make check
make install
make install-html install-pdf


安裝 ncview 除udunits外,至少需要下面的套件
yum install libXaw-devel.x86_64
yum install libXmu-devel.x86_64
yum install libpng-devel.x86_64
./configure --prefix=/usr/local/ncview --with-udunits2_incdir=/usr/local/udunits/include --with-udunits2_libdir=/usr/local/udunits/lib
make
make install

星期四, 12月 29, 2011

剛學NCL很多東西還搞不是很清楚,只好用TIP的方式。
跑海洋模式,大部份在繪圖時會用到岸線資料,所以寫一個能畫模式結果並顯示岸線資料是基本的工夫,如下圖。但如果不想繪岸線怎辦?


最簡單的想法是透過繪圖的順序,把岸線蓋掉。在NCL中,岸線是與CONTOUR畫在一起。控制繪圖順序的方式有PreDraw, Draw,  與 PostDraw。
PreDraw是最先畫的,Draw次之最後是PostDraw,所以讓岸線先畫,Contour後畫。不過還是得先找出控制繪圖順序的屬性,cnFillDrawOrder是contour的屬性;mpOutlineDrawOrder是map的屬性。在程式碼上加上下面二行屬性。
res@cnFillDrawOrder        = "Draw"
res@mpOutlineDrawOrder="PreDraw"
結果如果是沒有反應,那應該是我們用了rangs/gshhs 的高解析度岸線的關係…如果我們用了rangs/gshhs的岸線,有很多屬性會自動失效(手冊上寫的,別問我原因)…所以就不要用 rangs/gshhs的岸線檔就好了,改用預設值,就是把下面這一行註解掉就可以了。
;res@mpDataBaseVersion      = "HighRes"

結果岸線的確是變粗,不過還是沒有成功,主要是預設的邊界設定還沒關閉,再加上下面這一行:
res@mpFillBoundarySets="NoBoundaries"
結果就會如下圖一樣,看不到岸線…白色的地方是因為模式本身的mask所致。


星期三, 7月 13, 2011

/etc/sysconfig/iptables 被重設

最近某一台新機器的iptables改完之後常常會跑回原先的設定
仔細看一下/etc/sysconfig/iptables 的檔案,發現前二行是
# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
大意是說,這個iptables是由 system-config-sercuritylevel 產生,查了一下
發現這是一個執行檔在/usr/bin下
改為root,執行system-config-sercuritylevel (文字介面即可)
嗯,是一個防火牆的設定介面…裏面的設定值大概固定時間會寫一次到iptables這個檔案,難怪怎麼設定都沒用。
怎麼解決?就把要開的埠在寫在自訂就好了5901,5902,5903 餘類推。

POM bcond

純個人紀錄用…
最近在計算海嘯的例子發現在邊界上有明顯的反射…

這個試了n天,這應該是預設邊界條件的ramp(一個介於1~0間的值)所致…
ramp的目的是要由邊界推動模式時,可以在一個時間內慢慢的起動,免得一下推太用力爆掉,但是這個算例(海嘯)是由計算區域內往外傳,所以ramp反而把該往外傳的值變的比較小…導致出去的不乾淨,造成反射。下面是原始的code,在bcond 的subroutine中(idx=2)。
       vaf(i,jm)=vabn(i)
     $          +rfn*sqrt(grav/h(i,jmm1))
     $          *(el(i,jmm1)-eln(i))
       vaf(i,jm)=ramp*vaf(i,jm)
下述的code應該有一個邏輯上的錯誤,就是不應該全部的值乘上ramp,而是只有邊界往內傳的部份要乘上ramp。照上面的想法,只要不要啟動ramp(即ramp一直為1)就應該不會有反射(或至少要變的比較小),試跑之後,得到下面的結果:
果然邊界的反射沒有了…
按上面的敘述把code改成如下(共四個邊界,這舉一隅,餘類推):
       vaf(i,jm)=ramp*vabn(i)
     $               +rfn*sqrt(grav/h(i,jmm1))
     $               *(el(i,jmm1)-ramp*eln(i))
這一行就不要了,看是刪掉還是註解掉。
c       vaf(i,jm)=ramp*vaf(i,jm)
註:話說回來rfn 放的地方也怪怪的…印像中,他是rfe=0或1,第於1就沒什麼意思,有乘等於沒乘。等於0就讓vaf=0,就等於設了一道牆,既然設為牆了,vabn(i)應該也要乘才是。不過目前為止,我的例子的rfn都是1,就暫且不管了。不過還是把認為對的寫在下面,當成記錄,方便哪天用到時可以查。
       vaf(i,jm)=ramp*vabn(i)
     $              +sqrt(grav/h(i,jmm1))
     $              *(el(i,jmm1)-ramp*eln(i))
       vaf(i,jm)=rfn*vabn(i)

星期三, 6月 01, 2011

intel fortran 使用大的陣列 ( > 2G)

跑數值的當然會需要有大大的記體,然後開大大的陣列
編譯時如果遇到  relocation truncated to fit 錯誤,那編譯時就加入
-shared-intel -mcmodel=medium
例如:
ifort -shared-intel -mcmodel=medium mycode.f90


如果用的是動態陣列,不會先知道用多大的陣列,可以編譯過關
但是執行時可能會遇到 segment fault 錯誤
那就執行程式前使用下列命令
ulimit -s unlimited

星期六, 5月 21, 2011

車控~


終於到了可以讓我這個老爸好好玩軌道組的時候了…今天帶小雞去反斗城買一組五百元左右的一火車及一個簡單的軌道組,想說來和現有的A夢火車拼一起,並且這樣就有二台小火車可以跑…結果明明架上寫的是498的…付錢卻變成1190……這種過年過節才買的下去的價位…當然就沒買了…不過還是買了99元的二倍長型軌道一包四支…
Posted by Picasa

星期五, 4月 29, 2011

ROMS再試

ROMS... n個年前就想玩了,實際上也每隔一段時間就玩一下…
重點是好難啊…沒有一次上手,希望這次能成…
這裏記錄一些指令…免得每次玩都要查半天
請確定你有裝 ifort 以及 intel math kernel liberary
而且這二個的初始路徑設置也都正確執行了…
mkdir roms
cd roms
svn co --username CMD https://www.myroms.org/svn/src/trunk <---這是roms主程式
svn co --username CMD https://www.myroms.org/svn/src/test  <---測試範例
找一個範例來試,DAMEE_4,它在 test/DAMEE_4目錄下 DAMEE_4包含三個子資料夾Data scoord11 scoord22, 再到scoord11中 修改 build.bash
cd test/DAMEE_4/scoord11
vi build.bash
export        MY_ROOT_DIR=${HOME}/roms <--主要是看你的trunk是放哪
# 以下的平行設定只有用到openmp…因為只有一台多核心電腦,沒有cluster
# export           USE_MPI=on            # distributed-memory parallelism
# export        USE_MPIF90=on            # compile with mpif90 script
##export         which_MPI=mpich         # compile with MPICH library
##export         which_MPI=mpich2        # compile with MPICH2 library
# export         which_MPI=openmpi       # compile with OpenMPI library
export        USE_OpenMP=off            # shared-memory parallelism
# 說過了,慣用ifort
export              FORT=ifort
#export              FORT=gfortran
# export              FORT=pgi
# 關掉debug,注意!!!netcdf 4以後版本一定要設USE_NETCDF4=on
# 注意2!! netcdf4以後版本理論上會在netcdf/bin資料夾中有一個nc-config 確定一下它的位置在path中
#        也就是你可以直接 nc-config 即可成功執行,不需打路徑。如果沒辦法的話,就想辦法讓它能被執行吧。
# 
#export         USE_DEBUG=on            # use Fortran debugging flags
 export         USE_LARGE=on            # activate 64-bit compilation
 export       USE_NETCDF4=on            # compile with NetCDF-4 library
#export   USE_PARALLEL_IO=on            # Parallel I/O with Netcdf-4/HDF5
# 下面這一行不打開,就沒有什麼要設定的啦…
#export       USE_MY_LIBS=on            # use my library paths below
改完之後執行 ./build.bash 會產生一個OceanO 可執行檔(如果沒有用open_mp的話,就是oceanS) 執行方法如下:
ln -s ../Data/netcdf4/* ./
export OMP_NUM_THREAD=4   <---看你要用幾個核心
./oceanO < oecea_damee_4.in > log &
注意:不知道為什麼,一定要把輸出結果轉到一個檔案…不然會segment fault。

配合ROMS所需: netcdf 4.1.2 + hdf5 + zlib 1.2.5

ROMS如果要用到netcdf4以上,必需要讓netcdf4編譯時用到 with hdf5 非常煩人
很快速的記下步驟:
一、安裝 zlib1.2.5
./configure --prefix=/usr/local/zlib --shared
make
make install
註:如果 --prefix=/usr/local/zlib 是讓zlib裝在 /usr/local/zlib 資料夾中。這樣裝的好處是方便管理,缺點是 lib 與 includ 所在地要另外告知系統(就是讓系統知道他們被放在/usr/local/zlib 中。通常我的作法是寫一個script放在/etc/profile.d中,內容如下:
#! /bin/bash
ZLIBHOME=/usr/local/zlib

if [ -z "${LIBRARY_PATH}" ]
then
    LIBRARY_PATH="$ZLIBHOME/lib"
    export LIBRARY_PATH
else
    LIBRARY_PATH="$ZLIBHOME/lib:${LIBRARY_PATH}"
    export LIBRARY_PATH
fi

if [ -z "${LD_LIBRARY_PATH}" ]
then
    LD_LIBRARY_PATH="$ZLIBHOME/lib"
    export LD_LIBRARY_PATH
else
    LD_LIBRARY_PATH="$ZLIBHOME/lib:${LD_LIBRARY_PATH}"
    export LD_LIBRARY_PATH
fi
安裝szip-2.1
http://www.hdfgroup.org/ftp/lib-external/szip/2.1/src/szip-2.1.tar.gz
tar zxvf szip-2.1.tar.gz
cd szip
export F77=ifort
./configure --prefix=/usr/local/szip
make all
make install
二、安裝 hdf5 同zlib,如果我們不是裝在預設的資料夾,就需要告訴系統lib與includ放哪。拿上面的script一下即可。
export FC=ifort
./configure --prefix=/usr/local/hdf5 --enable-fortran --enable-hl --enable-shared --with-szlib=/usr/local/szip --with-zlib=/usr/local/zlib

make
make check
make install
make check-install

三、安裝libjpeg (jpge-6b) 原來,hdf4和hdf5是不相容的,衛星資料用的是hdf4,所以來裝一下hdf4,上面的libjpeg與szip就是為了這個hdf4裝的,請注意路徑是否與下面的設定一致。 在安裝hdf4之前,還得先裝libjpeg (jpge-6b)
wget http://www.hdfgroup.org/ftp/lib-external/jpeg/src/jpegsrc.v6b.tar.gz
tar zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b
export F77=ifort
./configure --prefix=/usr/local/libjpeg
make all
# 需要自行新增資料夾…
mkdir /usr/local/libjpeg/bin
mkdir /usr/local/libjpeg/man
mkdir /usr/local/libjpeg/man/man1
make install
mkdir /usr/local/libjpeg/include
make install-headers
mkdir /usr/local/libjpeg/lib
make install-lib
四、安裝 hdf4
#因為gdal要新版,epel裏的太舊,所以要自己裝,重點是,如果這個 hdf4 打算讓gdal用,就必需加上下面三行
export CFLAGS="-fPIC"
export CXXFLAGS="-fPIC"
export LIBS="-lm"
export F77=ifort
./configure --prefix=/usr/local/hdf4 --with-szlib=/usr/local/szip --disable-netcdf --disable-fortran --enable-shared
#./configure --prefix=/usr/local/hdf4 --with-zlib=/usr/local/zlib --with-szlib=/usr/local/szip --with-jpeg=/usr/local/libjpeg --enable-fortran 
make
make check
make install
# 因為hdf4的bin裏也有叫做ncdump 與ncgen的執行檔,和netcdf取同樣名子,所以把它改掉。
cd /usr/local/hdf4/bin
mv ncdump h4dump
mv ncgen h4gen

四、安裝 netcdf 4.3.1.1 (C) 與 netcdf-4.2 (fortran)
注意,自4.2版之後,fortran c c++分開,要先裝c版,再裝fortran 版 CPPFLAGS="-I/usr/local/hdf5/include -I/usr/local/zlib/include" LDFLAGS="-L/usr/local/hdf5/lib -L/usr/local/zlib/lib"
所以改成下面指令
yum install libcurl-devel.x86_64
wget ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4.3.1.1.tar.gz
tar zxvf netcdf-4.3.1.1.tar.gz
cd netcdf-4.3.1.1
./configure FC=ifort F77=ifort F90=ifort CXX=g++ --prefix=/usr/local/netcdf --enable-netcdf4 --enable-shared --enable-dap CPPFLAGS="-I/usr/local/hdf5/include -I/usr/local/zlib/include" LDFLAGS="-L/usr/local/hdf5/lib -L/usr/local/zlib/lib" 
make 
make check
make install
wget http://www.unidata.ucar.edu/downloads/netcdf/ftp/netcdf-fortran-4.2.tar.gz
tar zxvf netcdf-fortran-4.2.tar.gz
cd netcdf-fortran-4.2
#./configure FC=ifort F77=ifort F90=ifort CXX=g++ --prefix=/usr/local/netcdf --enable-shared CPPFLAGS="-I/usr/local/netcdf/include -I/usr/local/hdf5/include -I/usr/local/zlib/include" LDFLAGS="-L/usr/local/hdf5/lib -L/usr/local/zlib/lib -L/usr/local/netcdf/lib" 
#因為系也另外裝了netcdf,所以要注意LD_LIBRARY_PATH裏的順序,我們裝的netcdf要放前可,不然會用到系統裝的,會有問題。
#所以如果用上面的方法出現錯誤,可能是這個原因,那就改用下面的方法
CPPFLAGS="-I/usr/local/netcdf/include -I/usr/local/hdf5/include -I/usr/local/zlib/include" \
  LD_LIBRARY_PATH=/usr/local/hdf5/lib:/usr/local/zlib/lib:/usr/local/netcdf/lib:${LD_LIBRARY_PATH} \
  LDFLAGS="-L/usr/local/hdf5/lib -L/usr/local/zlib/lib -L/usr/local/netcdf/lib" \
  LIBS="-lnetcdf -lhdf5_hl -lhdf5 -lz -lcurl" \
  ./configure  FC=ifort F77=ifort F90=ifort CXX=g++ --prefix=/usr/local/netcdf --enable-shared --prefix=/usr/local/netcdf
安裝 netcdf 4.1.3
注意,自4.1.3版之後,不支援--with-hdf5=/usr/local/hdf5,取而代之的是改用
CPPFLAGS=-I/usr/local/hdf5/include LDFLAGS=-L/usr/local/hdf5/lib
所以改成下面指令
yum install curl-devel.x86_64
./configure FC=ifort F77=ifort F90=ifort CXX=g++ --prefix=/usr/local/netcdf --enable-netcdf4 --enable-shared --enable-dap CPPFLAGS=-I/usr/local/hdf5/include LDFLAGS=-L/usr/local/hdf5/lib 
make 
make check
make install

安裝 netcdf 4.1.2
./configure FC=ifort F77=ifort F90=ifort CXX=g++ --prefix=/usr/local/netcdf --enable-netcdf4 --enable-shared --with-hdf5=/usr/local/hdf5
make 
make check
make install

星期四, 4月 28, 2011

剪刀石頭布

忽然的,小雞就會猜拳了…
剪刀石頭布…輸的畫一筆…
誰說二歲八個月的小朋友好騙…
以下公布戰況…


註:那個用來畫臉的「有夠貴」彩色筆號稱無毒且耐操,不怕小朋友用力畫…但是輕~~~輕點啦…臉好痛啊~~~~

貓村

每逢週末溜小孩的時間,大多是跟團、桃園、大安森林公園或是台大…
無意間看到朋友的facebook講猴硐,看起來非常有趣…
重點是不遠且火車可以到,就殺過來了。


星期三, 4月 27, 2011

grd2xyz 解 etopo2 (netcdf) 然後用gawk挖空其中一塊…

自從GMT支援netcdf 後,有些三維的nc檔可以透過grd2xyz解…還算方便。
下面的程式主要是我有二個水深檔,一個是台灣附近500m解析度,一個是etopo2。
我想取出東經114.5-150.5,北緯14.5-55.5的水深,有500m解析度的水深就用他,沒有的話就用etopo2。然後合起來的水深內插成5分一個點,並轉成xyz檔。程式如下:

R1="-R114.5/150.5/14.5/55.5"
slonl=117
slonr=125
slatt=27
slatb=18
FN500m=taidpv626_500m.xyz
OFN=decetop.dat
DELTX="-I5m/5m -S2m -N1"
grd2xyz ETOPO2v2g_f4.nc -fg $R1 | gawk '! ($1 > L && $1 < R && $2 > B && $2 < T) {printf"%8.4f %8.4f %7.1f\n", $1, $2, -1*$3}' L=$slonl R=$slonr T=$slatt B=$slatb > $OFN
gawk '{print $1, $2}' decetop.dat | psxy $R1 -JM5i -S+0.01 -W0.001c -Ba10f5SWne -P -K > decetop.ps
pscoast -R -JM -B -G104 -Df -O -W0.01,104 >> decetop.ps
cat $FN500m >> $OFN
makecpt -Cseis -T-8000/8000/500 -Z > colors.cpt
nearneighbor $OFN $R1 $DELTX -Gbath.grd 1>/dev/null 2>&1
grdview bath.grd $R1 -JM5i -Qi100 -V -Sc -Ccolors.cpt -P -K > bath.ps
pscoast -R -JM -B -G104 -Df -O -W0.01,104 >> bath.ps
grd2xyz bath.grd -fg $R1 | gawk  '{printf"%8.4f %8.4f %7.1f\n", $1, $2, $3}'> resample_$OFN

ps2epsi decetop.ps decetop.eps
eps2jpg -d 600 -f decetop.eps
ps2epsi bath.ps bath.eps
eps2jpg -d 600 -f bath.eps
rm -f decetop.ps decetop.eps bath.ps bath.eps

星期四, 3月 24, 2011

本機 matlabpool 無法使用的問題

在Linux下要使用 matlabpool local n 如果出現 Attempt to reference field of non-structure array。
那有可能是它無法根據你的電腦名稱找到你的ip。請在linux終端機模式下試試下面的指令:
hostname -i
hostname -f
如果出現未知的遠端位址,那就是沒設定好啦。
解決方法如下:
hostname
會出現你設定的電腦名稱,如: mypc1
切換成root,然後 vi /etc/hosts
找到這一行
127.0.0.1      localhost.localdomain localhost
改成
127.0.0.1      mypc1 localhost.localdomain localhost
存檔

hostname -i <--會出現 127.0.0.1
hostname -f <-- 會出現 mypc1
然後記得一定要重開 matlab。

星期二, 12月 21, 2010

星期二, 12月 07, 2010

NETCDF + CENTOS + ifort 編譯

NETCDF + CENTOS + ifort 編譯
注意1: 如果裝gmt用自編的netcdf出現錯誤,說是curl之類的錯誤,可以先
export NETCDF_LIB="/usr/local/netcdf/lib -lcurl"

sh gmt_install.sh gmtvar.txt

注意2: 如果編譯遇到錯誤,說是少了crypt 之類的函數庫,可以試試不要編譯 dap
./configure --prefix=/usr/local/netcdf --disable-dap

下面的系統都試過了,應該沒有問題
netcdf + CentOs 5.4 + ifort 11.1 + icc emt64
先執行下面指令:

export CC=icc
export CXX=icpc
export CFLAGS='-O3 -xT -ip -no-prec-div -static'
export CXXFLAGS='-O3 -xT -ip -no-prec-div -static'

export F77=ifort
export FC=ifort
export F90=ifort
export FFLAGS='-O3 -xT -ip -no-prec-div -static'

export CPP='icc -E'
export CXXCPP='icpc -E'

# 然後
./configure --prefix=/usr/local/netcdf
make
#make test
好像改成
make check
make install

Cygwin + gfortran

export CC=gcc
export FC=gfortran
export F90=gfortran
export F77=gfortran
export CPPFLAGS=-DpgiFortran
./configure --prefix=/usr/local/netcdf/