GAMESSのインストール(暫定版)
                    全くの初心者のインストール記録ですので、
                    間違え・勘違いも多くあると思われますので、
                    あくまでも参考程度にお使い下さい。

GAMESS(The General Atomic and Molecular Electronic Structure System)とは、原子、分子の量子化学計算をHartree Fock近似をベースに行なうプログラムで、有名なGaussianと対をなすフリー(無料)のプログラムです。WindowsならPC-GAMESSという各CPUに最適化されたプログラムもあるようなので、そちらから計算を始めてみるのも良いかと思います。このページでは、GAMESS-USのソースプログラムからインストールした例を紹介したいと思います。


フリー(無料)といってもライセンス制なので、ホームページからe-mailや所属などの情報を送って、パスワードを送ってもらう。FTPサイトよりgamess-current.tar.gzというファイルを取ってくる。
tar -xvzf gamess-current.tar.gz
で展開する。read meファイルは、gamess/misc/readme.unixにあるので、インストールにおいては、そのファイルを参照して下さい。

GAMESSを並列化においては、Distributed Data Interface (DDI)というGAMESS独自の並列化プログラムが存在します。一般的な並列化のMPIでも可能だそうですが、実行速度の面から推奨はされていないようです。PCクラスタを作り、GaussianやGAMESSを実行することのみを考えている方は、MPICHのインストールは不要ですので、余計な手間が省けます。

DDIでは、defaultでrshによる通信を前提としているので、rshがきちんとインストールしているか確かめておいて下さい。
master.localdomain上からslave1にアクセスする場合は、
rsh slave1.localdomain hostname
rsh slave1.localdomain date
などと入力すると、パスワード無しで、slave1.localdomainとドメイン名が表示されたり、時刻が表示されれば、問題ありません。

GAMESSにおいては、makefileを使用しないところも、普通のインストールとは異なるところです。重要なファイル(Editorで修正する必要があるファイル)を羅列しますと
comp        コンパイルオプションの指定compallから呼び出される
compall      すべてのsourceファイルからobjectファイルにコンパイルする
lked        objectファイルをリンクし、実行ファイルを作り出す
runall        テストファイルをすべて実行する
rungms       実行時の設定(スクラッチファイルの場所、ホストの指定)と、gamess.01.xの実行
tools/actvte.code sourceファイルに手を加えて、コンパイル可能な形式に変換する
ddi/compddi    並列化の実行プログラムとライブラリの作成
これらのファイルは、ほとんどがシェルスクリプトcshで書かれていますので、editorで変更を行ない、順に実行していくとGAMESSが実行できるようになっています。
まず、comp compall lkedの修正を行ないます。主な変更ポイントはTARGETとパスの変更です。
set TARGET=ibm64 を set TARGET=linux-ia64
chdir /u3/mike/gamess を chdir /opt/gamess
などと変更します。TARGETはマシンの指定でem64tのLinuxはItaniumとは違いますが、linux-ia64が最も近いようです。ちなみにlinux-ia64では、コンパイラがインテルコンパイラを指定しているので、ifortやiccが使えることが重要です。ただ、私の場合はインテルのCコンパイラ(icc)がうまく動かなかったので(コンパイラの問題)、iccをすべてgccに置き換えて、FLAGも少し、gccバージョンに変更して用いました。(gccのフラグはlinux-pcのスクリプトの中に書いてあります。)また、chdirはインストールするフォルダですが、現在、gamessのコンパイル用ファイルを修正しているフォルダを指定する必要があります。
   if (-e /opt/intel) then
      if(qqq`cd /opt/intel ; ls | grep mkl` =~ qqqmkl* ) then
         set LIBRARIES="-L/opt/intel/mkl/8.0.1/lib/em64t -lmkl_lapack64 -lmkl -lguide -lpthread -Vaxlib"
         set BLAS=' '
      endif
   endif (lkedの中のif ($TARGET == linux-ia64) thenの直後あたりのスクリプトの変更です。)
TARGETにlinux-ia64を選ぶとlkedのスクリプト内で自動的にインテルMKLがインストールされているかチェックしてライブラリのパスも自動的に行なわれるのですが、em64tが原因なのか、うまく認識されなかったので、上記のようにパスの指定(LIBRARIES)をMKLのバージョンを直接書き換えました。
次にactivate関連の修正です。
cd tools
cp actvte.code actvte.f
vi actvte.f
:%s/^\*UNX/ここにスペース4つ分/
:wq
ifort -o actvte.x -Vaxlib actvte.f
cd ..
actvte.codeはフォートランのプログラムで、Linux用にカスタマイズされた設定を有効にするのが、viエディッタを開いて行なう作業です。「:%s/^\*UNX/    /」の意味は、「:%s/文字列1/文字列2/」で文字列1を文字列2で置き換える作業で、^の記号は先頭の文字列の記号(メタ文字の一種)で「*UNX」が先頭にあることを指定します。また、「*」も特殊な文字(メタ文字)なので、通常は認識しないので、「\」を加えて文字としての「*」を認識できるようにしています。置き換える文字が半角スペース4文字分というのが重要で、これは、フォートラン言語が固定形式だからです。フォートランのプログラムでは行番号を書く文字数とプログラム本体を書く文字数が指定されており、*UNXをきっちり4文字のスペースで置換しないとプログラムがうまく認識してくれません。Linux用にコメント文*UNXをスペースで置き換えて有効にしたフォートランプログラムをコンパイルします。コンパイラは何でもよいのですが、オプションの「-o actvte.x」を忘れないで下さい。-oオプションは機械語の翻訳されたプログラムの名前を指定するもので、comp、compallスクリプトからtoolsフォルダ内のactvte.xのプログラムを呼び出すので、フォルダの名前と場所も含めてその通りにする必要があります。
では、実際にコンパイルをしましょう。
./compall >& compall.log &
この作業は時間がかかるので、バックグランド処理にしました。コマンドの最後に&を付けるとそうなります。シェルの実行中のログおよびエラーは「>&」によりcompall.logというファイルに書き出されますので、時々
tail compall.log
としてやれは、コンパイルの途中経過を見ることができます。シェルスクリプトが行なっている作業は、sourceフォルダ内のプログラム*.srcなどのファイルをtools/actvte.xでフォートランの形式に変換ます。このファイルを*.f(このファイルは一時ファイルなので、コンパイル後消去される)コンパイラで機械語に翻訳し、*.o(オブジェクトファイルと呼ばれる)をobjectフォルダへと格納していきます。コンパイルが進むにつれobjectフォルダの中のファイルが増えていくのが確認できます。(コンパイルはほぼアルファベット順に進みます。)
続いて、DDI関連の設定とコンパイルです。
cd ddi
vi compddi  (内容を修正する)
./compddi >& compall.log
mv ddikick.x ..
cd ..
compddiもDDI関連のシェルスクリプトです。変更箇所は以下のところです。
set TARGET=ibm64 を set TARGET=linux-ia64
if($TARGET == linux-ia64) thenの中の
 set CC = 'icc' を set CC = 'gcc'
 set CFLAGS = "-DLINUX =O3 -ansi_alias -I./include" を set CFLAGS = "-DLINUX -O3 -I./include"
にそれぞれ変更します。基本的にはcomp、compall、lkedのときと同様です。このシェルスクリプトを実行するとddikick.xという並列化実行ファイルとlibddi.aというライブラリーファイルが生成されます。ddikick.xのみ親ディレクトリに移動させ、libddi.aはddiディレクトリーの中に保持しておきます。(このような各ファイルの場所は実行時のシェルスクリプトrungms等に指定されているので、マニュアル通りの指示に従うのが懸命だと思います。)
これで、ようやく実行プログラムを作る(リンク)する準備が整いました。
./lked gamess 01 >& lked.log
このコマンドが成功していたら、gamess.01.xというファイルが作られています。うまく行ってない方は、lked.logの中身をチェックして問題点を探して下さい。ちなみに01とかの数字はコンパイル時に指定できるバージョン番号で設定を変えてリンクし直すときは、02 03とバージョンを変えて実行ファイルを作ることが可能です。


ここまでgamess.01.xが作ることができた人は、あともう一息です。もう少し頑張って下さい。

テストプログラムを走らせるためのスクリプトrunallから修正していきましょう。主な修正点は
chdir /u1/mke/gamess を chdir /opt/gamess に
set VERNO=00 を set VERNO=01 に
rungms exam$NUM $VERNO 1  >&  exam$NUM.log を
./rungms exam$NUM $VERNO 1  >&  exam$NUM.log に変更しました。
1つめはgamessの存在するディレクトリーの指定で、2つめは使用するgamessのバージョンです。(lkedを実行するときに指定して番号です。)そして3つめは、私の環境ではカレントディレクトリーにパスを指定していないので、「./」を付けないとシェルが実行されないためです。ここからメインのプログラムを実行しているシェルがrungmsだと分かります。
./rungms 入力ファイル GAMESSのバージョン CPUの数 >& 出力ログ
といった形式で記述します。GAMESSのバージョンとCPU数は省略しても構いません。では実際に実行するrungmsの中身を見ながら修正していきましょう。
#
setTARGET=sockets  #これまでTARGET=linux-ia64としてきましたが、rungmsの中ではsocketsのままでOKです
set SCR=/scr/$USER  #スクラッチファイル(サイズの大きな中間ファイル)の格納場所の指定です。変更して下さい
#
set JOB=$1      # name of the input file xxx.inp, give only the xxx part
set VERNO=$2    # revision number of the executable created by 'lked' step
set NCPUS=$3    # number of compute processes to be run

# provide defaults if last two arguments are not given to this script
if (null$VERNO == null) set VERNO=01  #GAMESSのバージョンが指定されなかったときに使用する番号です。01に変えました。
if (null$NCPUS == null) set NCPUS=8  #CPU数が指定されなかった時に使用する番号です。PentiumDx4台??
#
このような要領で様々なファイルの保存先を変えていきました。(基本的にこんな感じで、書いている以外にも全部)
setenv ERICFMT ~mike/gamess/ericfmt.datをsetenv ERICFMT opt/gamess/ericfmt.dat
setenv MCPPATH ~mike/gamess/mcpdataをsetenv MCPPATH opt/gamess/mcpdata
setenv  EXTBAS /dev/null
#
setenv IRCDATA ~$USER/scr/$JOB.ircをsetenv IRCDATA /home/$USER/scr/$JOB.irc
setenv   INPUT $SCR/$JOB.F05
setenv   PUNCH ~$USER/scr/$JOB.datをsetenv   PUNCH /home/$USER/scr/$JOB.dat
setenv  AOINTS $SCR/$JOB.F08
これらの設定ではgamessが/opt/gamessフォルダーの中にあり、ユーザーのホームディレクトリーの中にscrというフォルダーがある必要があります。
   set os=`uname`
   if ($os == AIX)     set GMSPATH=/u1/mike/gamess
   if ($os =~ CYGWIN*) set GMSPATH=~/gamess
   if ($os == Darwin)  set GMSPATH=/Users/mike/desktop/gamess
   if ($os == HP-UX)   set GMSPATH=/zr/mike/gamess
   if ($os == IRIX)    set GMSPATH=/home/hbar4/people/schmidt/gamess
   if ($os == IRIX64)  set GMSPATH=/home/hbar4/people/schmidt/gamess
   if ($os == Linux)   set GMSPATH=/cu/mike/gamess この行(Linux)をset GMSPATH=/opt/gamessに変更する。
   if ($os == OSF1)    set GMSPATH=/au/mike/gamess
   if ($os == SunOS)   set GMSPATH=/hf/mike/gamess
以下のスクリプトの辺りが並列化で計算するときとホスト名の指定などを行なう部分です。
#
#       Five examples of how to build the HOSTLIST are shown....
#           terminology: CPU= processor, NODE= physical enclosure (box)
#
#       1. Sequential execution is sure to be on this very same host
   if ($NCPUS == 1) then
      set NNODES=1
      set HOSTLIST=(`hostname`)
   endif
#
少しでも参考になればと思い、私が書き加えたスクリプトを載せておきます。
#       1. Sequential execution is sure to be on this very same host
   if ($NCPUS == 1) then
      set NNODES=1
      set HOSTLIST=(`hostname`)
   endif
#
   if ($NCPUS == 2) then
      set NNODES=1
     setHOSTLIST=(`hostname`:cpus=2)
   endif
#
   if ((`hostname` == master.localdomain) && ($NCPUS >2)) then
      set NNODES=4
      set NCPUS=8
     setHOSTLIST=(master:cpus=2 slave1:cpus=2 slave2:cpus=2 slave3:cpus=2)
   endif
#
#       2. This is an example of how to run on a 4-way SMP enclosure,
もちろん、master.localdomainを各PCクラスターのマスターサーバーのhostnameにmaster、slave1等のマシン名は各自の設定に書き直して使用して下さい。

ここまで設定が終了すれば、おそらく実行できると思いますのでGAMESSを走らせて見て下さい。
./runall
健闘をお祈りいたします。



back home next

inserted by FC2 system