2013年6月21日金曜日

sensitivity analysis続き

ACEnet: Placentia

我がメモリアル大のスパコンクラスターPlacentiaのhead nodeとshort.qで計算時間に違いが。前者だと5分で終わる計算が後者だと1時間もかかった。違いは何か。メモリ(
RAM)量?とりあえずhead nodeのときは容量がわからない。short.qではデフォルト値が2GB。

short.qで8GBメモリリクエストすると50分で計算できた。大して変わらない。Placentiaはユーザー数が多いせいか本来より長い時間かかるような気がする。

PISCESのパラメーターが80ちかくあることに気づいたのでループを新しくスクリプトに追加することにした。以下がコード:

# Start of Input. Modify below #

set_parnam="conc3 conc3m" # set of names of parameters to analyze.
set_stdval="3.0 8.0" # set of standard PISCES values of the above parameters.
floats=6 # number of decimal places.

# End of Input. Do NOT modify below #
parnam=($set_parnam)
stdval=($set_stdval)
count=${#parnam[@]}
for it in `seq 1 $count`
do
 para=0
 echo $para >> SA_stat.txt
 grep "${parnam[$it-1]} " namelist_pisces >> SA_stat.txt
 for newnum in $(seq `echo "scale=${floats};${stdval[$it-1]}*0.5" | bc` `echo "scales=${floats};${stdval[$it-1]}*0.1" | bc` `echo "scales=${floats};${stdval[$it-1]}*0.5+${stdval[$it-1]}" | bc`)
 do
  sed -i -r "s/${parnam[$it-1]}\s+=\s+[0-9]+\.*[0-9]*/${parnam[$it-1]}  =  ${newnum}/" namelist_pisces
  ./opa
  para=$((${para}+1))
  echo $para >> SA_stat.txt
  grep "${parnam[$it-1]} " namelist_pisces >> SA_stat.txt
  mv LABSEA_1m*_ptrc_T.nc ../MY_SRC/SA/${parnam[$it-1]}${para}.nc
  rm LABSEA_*restart*.nc
 done
 echo "end of run for ${parnam[$it-1]}" >> SA_stat.txt
 sed -i -r "s/${parnam[$it-1]} += +[0-9]+\.*[0-9]*/${parnam[$it-1]}  =  ${stdval[$it-1]}/" namelist_pisces
done

ちょっと手こずったのは青色でハイライトされているところ。少数計算はechoとbcコマンドを使ってできることは知ったが割り算で答えが1以下になる場合は0となってしまう問題があることに気づいた。例えば:

echo "1/2" | bc

と入力しても0.5という答えにはならず「0」となってしまう。

どうしたら良いか考えた結果、割り算をかけ算に直すことにした。例えばさっきの場合だと1÷2ではなくて1× 0.5と置き換えることにした。割り算は極力避けた方がいいかもな。たぶん解決策はあるんだろうけど。

このスクリプトをhead nodeで試してみると2つのパラメータで合計20分で計算できた。ひとつあたり10分計算。早い。しかもcpuもそんなに使わない(20%程度)なのでたぶん走らせといても何も言われないだろう。nohupで夜行列車モードだな。

0 件のコメント:

コメントを投稿