AMBER/インストール
 * AMBER8のインストール -- &color(red){Vine 4.2}; [#a24667cd]
 &color(red){''これはIntel Compiler 11が使えないと思い、試行錯誤した記録です。Intel Compiler 11の記録は[[こちら>../]]。''};
 #br
 分子動力学シミュレーション(MD)で一般的に使用されるAMBERをインストールしてみます。~
 専門外なので難しいことはよーわかりません。ちなみに2008年8月現在の最新版はAMBER10なので相当古いバージョンです。シングルCPU環境の場合はIntel Math Kernel Library(MKL)を追加インストールしますが、並列環境で実行する場合は加えてLAM-MPIをインストールしてMPI環境を準備します。~
 なお、このプログラムは古く、いろいろ試してみたところCentOS 5.2では動作しなかったため、結局Vine 4.2にインストールしました。なお、Vine 2.6r4を使えばすんなり動作しました。
 なお、このプログラムは古く、いろいろ試してみたところCentOS 5.2では動作しなかったため、結局Vine 4.2にインストールしました。なお、Vine 2.6r4を使えばすんなり動作しました。~
 &color(red){註:Intel Compiler 11を使えばCentOS 5.2でも動作するかもしれません。};
 
 ** 使用するコンパイラ [#kc7db65e]
 AMBER8は古いため新しいコンパイラだと問題が生じるようです。以下の組み合わせで行いました。
 
 - GCC Ver.3.3.6 (Vine 4.2ディフォルト)
 - Intel C Compiler Ver.8.1.038
 - Intel Fortran Compiler Ver.8.1.034
 - Intel Math Kernel Library Ver.9.1.023
 
 を使いました。~
 Intel Compiler 11.0を使った場合、newton_raphテストでProgram errorがでました(解決済み)。それ以外は細かい数値の差は出ましたが、大きな問題なさそうなのですが・・・
 
 ** Intel Math Kernel Library(MKL)のインストール [#hc653e72]
 数学計算を行うためのライブラリです。Intel製のためIntelプロセッサに最適化されています。
 
 *** アーカイブファイルの取得 [#m7eaa4b3]
 Intelのサイトから非商用無料版を取得します(それにしてもIntelのホームページはわかりにくい!!)。
 - Intel Math Kernel Library -- http://www.intel.com/cd/software/products/asmo-na/eng/307757.htm
 - [[非商用版の申し込みページ>https://registrationcenter.intel.com/RegCenter/AutoGen.aspx?ProductID=1049&AccountID=&ProgramID=&RequestDt=&rm=NCOM&lang=]]
 ユーザー登録を行います。登録するとライセンスキーが取得でき、ダウンロードができるようになります。あまり新しいと問題が出るのでインストールはVer.9.1.023を使いました。~
 インストールはIntel Compiler本体と同様です。
 
 ** LAM-MPIのインストール [#la3bec37]
 MPIによる並列計算を行う場合はインストールします。シングルスレッドでの計算しか行わない場合は不要です。~
 AMBERのコンパイルにIntel Compilerを使うので同様にIntel Compilerを使います。GCCでコンパイルするとAMBERとリンクするときにエラーが出て失敗します。
 
 - http://structbio.vanderbilt.edu/archives/amber-archive/2005/1848.php~
 このコメントでは-staticオプションが指定されていますが以下に示すようにコンパイラの指定のみでも問題なさそうです。
 
 *** configureオプション [#e7226b85]
 最適化オプションを調べるのがめんどくさかったので最低限のオプションでビルドしました。
 
 - CC=icc   <-- Intel Compiler (C)
 - FC=ifort <-- Intel Compiler (Fortran)
 - CXX=icpc <-- Intel Compiler (C++)
 - CFLAGS,FFLAGS,CXXFLAGS,LDFLAGSなどは設定しませんでした。最適化オプションを使うと処理速度が向上するかも。
 
 インストール先は/usr/local/lamにしたかったのでprefixオプションも使用します。prefixオプションなしだと/usr/local直下にインストールされます。
 
 ** ビルド [#n464543f]
 configureに結構時間がかかりますが、makeは10分ほどで終わりました(Pentium Dual Core 1.8GHz)。
  % source /opt/intel_fc_80/bin/ifortvars.csh <-- bashなら.sh
  % source /opt/intel_cc_80/bin/iccvars.csh   <-- bashなら.sh
  % ./configure CC=icc FC=ifort CXX=icpc --prefix=/usr/local/lam
  % make
  # make install
 
 * AMBER8本体のインストール [#se2eb7f1]
 ようやく準備が整ったのでAMBERをビルドします。/usr/local/amber8以下にインストールしますが、ビルドも同じ場所で行うので最後の並列テスト以外はroot権限で実行します。
 
 ** aptでインストール [#me18f97e]
 - byacc
 - XOrg-devel
 
 ** 必要なもの [#t72e329e]
 - LAM-MPI -- 並列化環境で実行する場合
 - Intel Math Kernel Library(MKL) 9.1
 - Intel Fortran Compiler 8.1 -- &color(red){''Ver.9.1でもビルドはできましたが、テストが通りません''};
 
 ** ビルド [#b2a39892]
 *** Intel Compilerおよび環境変数のセットアップ [#l31770d0]
  # source /opt/intel_fc_80/bin/ifortvars.sh
  # cd /usr/local
  # tar zxvf amber8.tgz
  # export AMBERHOME=/usr/local/amber8
  # export LAM_HOME=/usr/local/lam   (並列化版もビルドする場合)
  # export MKL_HOME=/opt/intel/mkl/9.1.023
 
 *** 修正パッチ [#ce4f1837]
 AMBER8は修正パッチが配布されており、使用する場合はこの段階でパッチを当てます -- http://ambermd.org/bugfixes80.html
  # cd $AMBERHOME
  # patch -p0 -N -r patch_rejects < bugfix.all
 私はAMBERを使ったことがないのでわかりませんが、パッチを当てると結果が多少変わり、テスト結果に変化が現れます。使う人に聞きながら確認したところあまり問題はなさそうですが、よく確認して下さい。
 
 :オリジナルの場合(シングル、パラレル)|
 - テストは全部通る
 - 50%程度の確率でtest/qmmm/divcon/Run.crambinおよびtest/qmmm/divcon/Run.crambin_mdが失敗する。連続して実行するとPASSしたりFAILUEしたりする
  diffing crambin.out.save with crambin.out
  possible FAILURE:  check crambin.out.dif
 こんな感じ。crambin.out.difを見ると、
  >  MINDO not supported -- program terminated
 というエラーが出ています。
 
 :パッチを当てた場合(シングル)|
 - test/antechamber/fluorescein/prmtop.dif
 - test/tgtmd/change_target.ntr/tgtmd.out.dif
 - test/tgtmd/PME/tgtmd.out.dif~
 小数点以下4桁目が1ずれているものがある(丸め誤差のような気がしますが)。またprmtop.difを見るとDIHEDRALの出力結果の数が異なる。
 -- http://structbio.vanderbilt.edu/archives/amber-archive/2005/3408.php
 
 :パッチを当てた場合(パラレル)|
 - シングルの結果に加えてtest/pheTI/out.p1.difが出力される。内容は以下の通り。
  190c190
  <  Ewald error estimate:   0.5094E-16
  ---
  >  Ewald error estimate:   0.0000
 静電ポテンシャルだから、並列で実行すると差が出ることはあるそうな。まあ、マイナス16乗のオーダーなので・・・
 
 #classdiv(box-yellow)
 &color(blue){''パッチを当てていない場合、実行時にエラーが出ました。またSegmentation faultが出ることもあります。''};
  cd qmmm/divcon; ./Run.crambin
  ../../../exe/sander.QMMM: relocation error: ../../../exe/sander.QMMM: symbol mkstemp64, version GLIBC_2.2 not defined in file libc.so.6 with link time reference
    ./Run.crambin:  Program error
  make: *** [test.sander.QMMM] エラー 1
 パッチを当てずにこの問題を解決するにはglibcの再構築が必要な気がします。おそらくcompatオプションを入れてビルドすれば回避できると思うのですが、私の場合[[TLS対応glibc>どぶお/Linuxで遊ぼう!/VineでTLS対応glibc]]でたまたま回避できました。詳しくは検証してません&huh;~
 少なくとも''ldd sander''でダイナミックリンクライブラリを確認したときにlibc.so.6の参照先が/lib/tls/libc.so.6の時は問題が発生しませんでしたが、''LD_ASSUME_KERNEL=2.4.1''を設定し、参照先を''/lib/i686/libc.so.6''にした時、または''LD_ASSUME_KERNEL=2.4.0''で''/lib/libc.so.6''の時は同様のエラーが発生しました。
 #classdiv(end)
 
 *** シングルスレッド版のビルド [#w609b750]
 並列化版をビルドする際もまずシングルスレッド版をビルドします。~
 Pentium4への最適化オプションである-p4をつけてコンパイルします。
  # cd $AMBERHOME/src
  # ./configure -p4 ifort
 生成されるconfig.h中のLAPACKのライブラリ名が異なるので修正します。
 :config.h|
  OLD:61 LOADLIB=  -lsvml -L/opt/intel/mkl/9.1.023/lib/32 -lvml -lmkl_lapack64 -lmkl -lguide -lpthread
  NEW:61 LOADLIB=  -lsvml -L/opt/intel/mkl/9.1.023/lib/32 -lvml -lmkl_lapack -lmkl -lguide -lpthread
 
 修正したらビルドし、テストを実施します。コンパイラのバージョンによってはテストに失敗するのでちゃんと確認しておいた方が良さそうです。
  # make serial <-- -jオプションでmakeするとビルドに失敗します
  # cd $AMBERHOME/test
  # make test   <-- マシンパワーに余裕があるなら-jオプションを使ってもOK
 テストが終了したら差のある結果をチェックします。
  # find ./ -name "*.dif"
 で結果に差があったプログラムの出力ファイルのリストが得られます。パッチを当てたかどうかで結果が若干変わります。
 
 :staticリンクの場合|
  % ./configure -p4 -static ifort
 でstaticリンクも作れますが、以下のエラーが出るので$AMBERHOME/src/leap/src/leap/Makefileを修正します。
  /usr/X11R6/lib/libX11.a(XlcDL.o): In function `try_both_dlsym':
  XlcDL.o(.text+0x111): undefined reference to `dlsym'
  XlcDL.o(.text+0x136): undefined reference to `dlsym'
  /usr/X11R6/lib/libX11.a(XlcDL.o): In function `open_object':
  XlcDL.o(.text+0x635): undefined reference to `dlopen'
  /usr/X11R6/lib/libX11.a(XlcDL.o): In function `close_object':
  XlcDL.o(.text+0x6a4): undefined reference to `dlclose'
  collect2: ld returned 1 exit status
  make: *** [xaLeap] エラー 1
 -修正部分($AMBERHOME/src/leap/src/leap/Makefile)
  113 XALEAP_LIB = ../Xraw/libXaw.a ../Wc/libWcLeap.a ../Xpm/libXpm.a \
  114     ../Xmu/libXmu.a -L$(XHOME)/lib -lXt -lXext -lSM -lICE -lX11 -lm -lpthread
 114行目の最後に-ldlを追加。
  114     ../Xmu/libXmu.a -L$(XHOME)/lib -lXt -lXext -lSM -lICE -lX11 -lm -lpthread -ldl
 
 *** 並列版のビルド [#n947aa26]
 SANDERを並列化環境下で実行する場合は通常版をビルドした後に並列版をビルドします。
  # cd $AMBERHOME/src
  # make clean
  # ./configure -lam -p4 ifort
  # vi config.h <-- シングル版と同様に修正
  # make parallel
 
 *** 並列版のテスト [#p9c57ea4]
 シングルスレッド版はrootでテストしましたが、並列版は一般ユーザーで行います。ユーザーdobuoで行う場合以下のようになります。~
 まず、testディレクトリ以下のファイルの所有者をpooに変更します。
  # chown -R dobuo:dobuo $AMBERHOME/test
 続いて、ユーザーdobuoでテストを実行します。付属のドキュメントにはmake test.parallelで行えと書いてありますが、存在しないのでmake testを実行します。どうやら''DO_PARALLEL''をセットしておけば並列化テストになるようです。この例はcshですがsh系の場合exportを使って下さい。なお、DO_PARALLELの設定を4以上にしたらテストが途中で失敗しました(残基よりもプロセッサが多い、というようなことを言われた)。
  % setenv DO_PARALLEL "mpirun -np 2"   (2はCPUの数)
  % setenv AMBERHOME /usr/local/amber8
  % source /opt/intel_fc_80/bin/ifortvars.sh
  % setenv LD_LIBRARY_PATH /opt/intel/mkl/9.1.023/lib/32:${LD_LIBRARY_PATH}
  % setenv PATH /usr/local/lam:${PATH}
  % cd $AMBERHOME/test
  % lamboot   <-- LAMデーモンの起動
  % make test
  % lamhalt   <-- LAMデーモンのシャットダウン
  % find ./ -name "*.dif"
 #br
 以上で完了です。
 
 *** 実行環境のセットアップ [#h4086e38]
 実行するための環境を整えます。.cshrcに以下の行を追加します。
  # for AMBER8
  # Intel Compiler
  source /opt/intel_fc_80/bin/ifortvars.sh
  source /opt/intel_cc_80/bin/iccvars.sh
  setenv LD_LIBRARY_PATH /opt/intel/mkl/9.1.023/lib/32:${LD_LIBRARY_PATH}
  # LAM-MPI
  setenv LAM_HOME /usr/local/lam
  setenv PATH $LAM_HOME/bin:${PATH}
  # AMBER
  setenv AMBERHOME /usr/local/amber8
  setenv PATH $AMBERHOME/exe:${PATH}
 AMBERではIntel Compiler 8.1を使うので他のバージョンでコンパイルしたプログラムを使うときに競合するかも・・・~
 また、MPIで実行する場合はmpirunするときにMPIデーモンの起動も忘れずに。
 - 起動:lamboot
 - 停止:lamhalt
 
 以上です。苦労したー&sad;