星期五, 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