2013年6月22日土曜日

for do done (shell scripting)

「seq: zero increment」再び!


少数の計算でまた不都合が発生してしていた。今回は「0.05×0.1=0」となってしまう現象。scale=6だから0.005は表示されるはずだと思ったんだがなぁ。

「bc -l」で解決!


ネットで検索して解決策が見つかった。そしてそれはあまりにもシンプルすぎた。
bcに「-l」のオプションを付け加えるだけでかけ算も割り算も支障なくできるようになった。このオプションデフォルトでいるだろって感じだが、bcを使うときはつけるように心がけたい。

「sensitivityanalysis.sh」最終的なスクリプト!


またいつか同じような計算をするかもしれないという将来的なことも考えてPISCESモデルパラメータの各名称&デフォルト値をリストダウンしてスクリプトを作成しておくことにする。これはバージョン3.4.1なので他ではirrelevantな場合多いにあり。

# Start of Input. Modify below #

# set of names of parameters to analyze.

set_parnam="wsbio xkmort ferat3 wsbio2 conc0 conc1 conc2 conc2m conc3 conc3m xsizedia xsizephy concnnh4 concdnh4 xksi1 xksi2 xkdoc concfebac qnfelim qdfelim caco3r pislope pislope2 excret excret2 bresp chlcnm chlcdm chlcmin fecnm fecdm grosip wchl wchld mprat mprat2 mpratm part2 grazrat2 resrat2 mzrat2 xprefc xprefp xprefz xprefpoc xthresh2zoo xthresh2dia xthresh2phy xthresh2poc xthresh2 xkgraz2 epsher2 sigma2 unass2 grazflux part grazrat resrat mzrat xpref2c xpref2p xpref2d xthreshdia xthreshphy xthreshpoc xthresh xkgraz epsher sigma1 unass xremik xremip nitrif xsirem xsiremlab xsilab xlam1 oxymin ligand kdca nca"

# set of standard PISCES values of the above parameters (omitting Exponents if there are any).

set_stdval="2. 2. 10. 30. 1. 8. 1. 3. 3. 8. 1. 1. 1. 8. 2. 3.33 417 1. 7. 7. 0.16 2. 2. 0.05 0.05 0.00333 0.033 0.05 0.0033 40. 40. 0.151 0.001 0.02 0.01 0.01 0.01 0.75 0.7 0.005 0.03 1. 0.3 1. 0.3 1. 1. 1. 1. 2. 20. 0.3 0.6 0.3 2. 0.5 3.0 0.03 0.001 0.1 1. 0.5 1. 1. 1. 2. 20. 0.3 0.6 0.3 0.25 0.025 0.05 0.003 0.025 0.31 0.005 1. 0.6 6 1."

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]}/2" | bc -l` `echo "scales=${floats};${stdval[$it-1]}/10" | bc -l` `echo "scales=${floats};${stdval[$it-1]}/2+${stdval[$it-1]}" | bc -l`)
 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

0 件のコメント:

コメントを投稿