Install

From Ecal

Jump to: navigation, search

Contents

主となるプログラムとコンパイラオプション

OS: #トラブル情報にある通りcentosでは動くgfortranのversionでもubuntuはエラーが出ることが多いので奨めません。 世の中には完璧なコンパイラというのは存在せず、何らかのバグがあるのが普通です。あるコンパイラで動かなかったときにソースが原因なのか、libraryが問題なのか、コンパイラが原因なのかを切り分けるためにx86ではintel fortran, gfortran両方が容易動く環境を奨めます。(ubuntuはintel fortranのinstallに手間がかかります。またlibraryにどこかバグがあるようです。)--Kino 21:13, 30 July 2010 (JST)

fortran: gfortranとintel fortranが良くテストされています。

うまくいかない場合は対処します。テストしてくださるのはありがたいのでご報告ください.


主となるプログラム

  • lmfa: fixed core chargeのprogramなのでatomのcore電荷を作成する。始めに一度必要。
  • lmf: serial version
  • lmf-MPI: ハミルトニアンの作成においてmpi parallelを行う。(processの数は原子数を超えてはいけません。).
  • lmf-MPIK: k-parallel.

コンパイラオプション

MakefileのPLATFORM=とMAKEINC/Make.inc.${PLATFORM}内部を変更することで新しいmachine/compilerに対応します。 用意されているMake.inc.{PLATFORM}がある場合は各々の環境でのlibraryを書いてあるLIBLOC=を書き換えれば十分です。

  • LIBLOC=
BLAS, LABACK, fftw-3が必要です。fftw-2では動きません。BLAS,LAPACKに関してはACMLもしくはnetlibから取ってきたソースからコンパイルしたものを使用することを奨めます。

以下はMake.inc.{PLATFORM}をscratchから作成する場合に読んでください。

  • compiler/link options
MAKEINC/Make.inc.*に普通使うoptionが書いてあります。しかし、場合によっては変更の必要があります。
fortranの標準化により少なくなってはいますが、時間を取得する関数などにシステム依存のsubroutineを呼んでいます。'./CPPCHECK.sh {fortran_compiler}'を用いてどのcompiler/link optionを用いるのか調べられます。途中で異常終了する場合は残念ながら自分でどのoptionを使うのか調べる必要があります。


  • optimization level
パラメタによる部分もありますが、optimization levelを下げないと答えが正しく出ない関数や、コンパイラによっては最適化にとても長い時間がかかるがほとんど高速化されない関数があります。これらの関数はoptimization levelを下げる必要があります。


  • blacs,scalapack
不要です。MPI版では-DBLACSも定義でき、blacs, scalapackを使えますがこれらはデバッグroutineに使用してるだけです。

Type make

gnumakeの機能を使っています。gnumakeを使用してください。


最初に、ごみが残っているかもしれないのでobject,実行ファイル、lm7K内のlibraryを全て消去します。

make cleanall

makeし直すときにはmake cleanallしてからmakeし直すことは重要です。


Makefile中のPLATFORMがあなたの環境に合わせて変更してください。ifortとgfortranが用意されています。 ifortの場合はPLATFORM=ifortです。

make

により実行ファイルが作られます。

MPI,MPIK版を作るにはifort,gfortranは PLATFORM=..._mpi, PLATFORM=..._mpikとして作成してあります。 ifortならば、mpi版は PLATFORM=ifort_mpi mpik版はPLATFORM=ifort_mpik と記述し makeしてください。

並列makeも可能です。'make -j #'で並列実行できます。#は並列数です。

programs

lmf lmfa lmfgw lmdos lmchk lmf2gw lm67 rdcmd fplot plbnds pldosが出来上がります。

lmfa : 原子のプログラム。lmfへの初期値を与えます。

lmf : a full-potential PAW(MTO+APW) program

lmfgw , lmf2gw : for GW calculation. See GW manuals

lmdos : partial DOS plotに用います。

lmchk : 結晶構造のcheckerです。--getwsrでMT半径の推奨値も作ります。

lm67 : 古いctrl fileを新しいVer.7のフォーマットに変換するためのutility。

rdcmd : "make check"に必要

fplot,plbnds,pldos : Plot utilities.

DOS, BANDのpostscript fileをつくります。使用法が難解でdocumentがほとんど書かれていません。FPLOTdir directoryにあるサンプルによって使用法を学ぶしかありません。(このdirectoryはMarkさんのFPLOT3.28.tar.gzを少し変更したものです。)

それらすべてとctrlgen.pyをbin/ directoryにcopyしていることを仮定します。(Makefileのinstall sectionを見てください。)


コンパイルに時間がかかるlm67はmake checkに使用しないのでMake.inc.*のprogram listから除いて構いません。

rdcmd,plot関係はMPI,MPIKでは作成しません。(コンパイル時にエラーがでます・・・。)

programの実行テスト

「programの実行テスト」で以下はobsoleteです。

serial

  • 'make check'(その具体的な動作)がさまざまな例に対してprogramを実行し正常に作成されたかが調べます。

最後に"all tests PASSED (copt te zrt co cr3si6 fe cu srtio3 felz gasls gdn eras c crn)"と表示されたらどこにもFAILが表示されなくプログラムが正常に作成されたことになります。いくつかのテストは時間がかなりかかります。 ここで"mv: Command not found. cp: `./ctrl.crn' and `./ctrl.crn' are the same file"などのエラーメッセージは無視してください。

#実行エラーが起きた場合に解説がありますが、このpackageは不必要に難しくなっていて、checkに失敗した場合どこがおかしいか初めての人が突き止めるのは困難です。順次書き換えていますので御容赦ください。

  • 動かなかった場合にはまず、slatsm library単体のテストを、slatsm/ directoryで'make check'を行って調べてください。
  • BLAS,LAPACKが原因で止まることがよくあります。他のlibraryも使用してみてください。
  • (更にテストをしたい場合は)次にTESTsamples/以下の例が再現できるか調べることができます。job_*というscriptを実行することでテストができます。答が正しいかどうかはlllmf*などの結果と見比べねばなりません。

mpi

将来作成しますが、mpi版に標準ではmake checkに相当するテストが現在ありません。 lmfをlmf-MPIなどと置き換えて手動でテストしてください。 例えばTESTsamles/feにて

mpirun -np 4 lmf-MPIK --rs=0 fe

などです。 テストをする際はlmf-MPIはprocess数が原子数をこえてはいけないことに注意してください。

serial版は途中結果のファイルが無い場合自動的に最初のiterationから計算を始めますが、mpi版は途中結果のファイルが無い場合に回復できずに終了するという動作の違いがあります。--rs=0としてください。

programを変更し自分でテストする際の注意

lmf計算では、rst.*が結果(電子密度)を含んだbinaryファイルです。 gfortranとifortとでbinary fileのimageが異なるため、例えば、gfortranの途中の結果からifortで継続して計算することはできず、その場合は原子の計算であるlmfaからやり直す必要があります。

あるいは、テキスト化されたrstファイルであるrsta.*を使うこともできます。これは、 lmf cu --rs=#1,#2 として用います。#1は入力がlmfaの結果であるatm(=0)かbinaryのrst(=1)かtextのrsta(=2)かを指定します。#2は出力が、rst(=1)かrsta(=2)かを指定します。 rst.cuから計算を再スタートしてrsta.cuを書き出すには、lmf cu --rs=1,2とします。 rsta.cuを使って計算を再スタートしrst.cuを書き出すには、lmf cu --rs=2,1とします。デフォルトは、--rs=1,1です。 これらは

lmf --help

に短い記述があります。

serial版は途中結果のファイルが無い場合自動的に--rs=0として計算を始めますが、mpi版は途中結果のファイルが無い場合にatomの結果をinputとして使用せずに終了するという動作の違いがあります。mpi版での最初のiterationでは--rs=0を追加してください。

途中結果のファイル: rst または rstaファイル。--rs=で指定する。

トラブル情報

make check OK!

  • ubuntu10.04 + gfortran-4.3(4.3.4) + core2duo for commit 2b740(10Sep2010)
  • ubuntu10.04 + gfortran-4.3(4.3.4) + core-i7 for commit 70a71(12Sep2010)
  • centos5.3 + ifort10.1 + Xeon for commit 2b740(10Sep2010)
  • centos5.0 + libgcc-4.1.2-48.el5, gcc44-gfortran-4.4.0-6.el5にupgradeでは正常に動作。→centosでのinstall法
  • centos5.0にmpfr-3.0.0、gcc-gfortran-4.4.3をソースからインストールした場合は正常に動作。

注:commit 70a71と2b740はほとんど違いがない.

注:以上から判断するに「gfortran4.4でecaljが動かない」のは、gcc-gfortran-4.4の問題でなくubuntuの問題。

問題が生じた場合

  • ubuntu9.10,10.04"""+ gfortran-4.4 + core i7,core2duo: Memory Allocation Failed.
  • centos5.0 gfortran4.1ではOperating system errorと出て動かない。gfortran4.4へversion upすること。(2010年7月)→CentOS 5 gfortran4.1

詳細

segmentation faultでおちる

ひとつには、stacksizeの問題がありえる。

ulimit -s unlimited

を試す。

LIBLOOCの例

ubuntu 9.10で

LIBLOC= /usr/lib64/libfftw3.a /usr/lib64/liblapack.so.3gf /usr/lib64/libblas.a 

でやってます(ubuntu9.10はそのままではintel fortranが使えません。すこし面倒な作業が必要です。) その他、acmlならgfortran,ifortバージョンがある。ifortならmklも使いやすい。

CentOS 5 gfortran4.1

dc5ca1f3以後において centos5.0, libgcc-4.1.2-48.el5, gcc41-gfortran4.1(4.1.2)で Operating system error: Cannot allocate memory というエラーメッセージがでて一部のテストが動かなくなったのでこちらのgcc44-gfortran4.4に上げました。 (gcc44-gfortran-4.4.0-6.el5.)

同じメッセージが出たときのために書いておくと、-O0 -g で動くようになります。-O0だけでは止まります。 調べたところとまっているところはuser programがallocateするところでなく、subroutine callするsystem側で ユーザーが書いた部分ではありません。systemがcall時に作業用のmemoryを取れないというエラーです。 webを探すとCP2Kが同じバグに遭遇しています。

ubuntu9.10 corei7

ubuntu9.10+ gfortran + core i7だとMemory allocation Failedでcr3si6に関しておちる。 解決策。

1。ubuntu10.04にアップグレードする。gfortran-4.3をつかう。 2。ubuntu10.04にアップグレードしてifort10をつかう(たぶん)。

ubuntu10.04 core2duo

gfortran-4.3をつかうとmake checkをパスする。 sudo apt-get install gfortran-4.3もしくはSynpaticパッケージマネージャーからできる。そのあと以下のようにして,gfortranがgfortran-4.3を指し示すようにしてやる必要がある。まず、

which gfortran
ls /usr/bin/gfortran

をみて,gfortranが-> /usr/bin/gfortran-4.4となっているのを確認する。次に、

sudo mv /usr/bin/gfortran /usr/bin/gfortran.backup
sudo ln -s /usr/bin/gfortran-4.3 /usr/bin/gfortran

して、gfortranが/usr/bin/gfortran-4.3を指し示すようにする。

ls -l /usr/bin/gfortran

で確認する。make cleanallしてからmake checkする。 math libraryは、MAKE/Make.inc.gfortranの設定において、例えば、

LIB2= /usr/lib64/libfftw3.a /usr/lib64/liblapack.so.3gf /usr/lib64/libblas.a 
LIBLOC=$(LIB2)

となります。 ライブラリのインストールは、 sudo apt-get install liblapack3gf でできるでしょう。dependencyがあるlibraryも自動的にinstallされるはずなのでblasも自動的にinstallされるでしょう。 fftw-devもinstallしてください。(apt cache search fftwしてさがす)。

centosでのinstall法

yum install gcc44-gfortran.x86_64でgcc44-gfortran.x86_64 0:4.4.0-6.el5がインストール可能。

c3daa22994e4c692b2c76b4641f7b62a3f9bcf1a以降はbug fixされている

ubuntu11.04において

  • gfortran 4.4.6, 4.5.3, 4.6.0
  • ifort 10.1, 12.0 (opt=-O2 -O2 -O1 -O0)
  • ifort 11.1 (opt=-O1 -O1 -O1 -O0)

で動作確認済み。--Kino 16:01, 12 May 2011 (JST)

fujitsu fortran

frt: Fujitsu Fortran Driver Version 3.4 (Mar 28 2011 10:20:04)


  1. lmf lmfaは-O0 でコンパイル
  2. FFLAGS= -O3 -Kprefetch -KSSE2 -KSSE3 -KSSE4 , _LESS1=-O1, _LESS2=-O0, _LESS3= -O0

までは確認済み。-Kfastでは結果が合わない。 lmf, lmfaを-O0でコンパイルするのはこのコンパイラはcharacterの扱い(command line optionの扱い)が不得意なため。

ifort 11.1

system()関数にバグがある。 fsubs.Fにおいてuse ifportをコメントアウトすること。

その他

具体的な動作

make checkが通らなかった時のためや開発するときのためにmake checkの具体的な動作を書いておきます。

make checkは fp/test/にてtest.fp {system}を実行しています。一つ一つテストしたい場合はfp/testに移動してください。#実行エラーが起きた場合の例の通り

test.fp {テスト}

で実行できます。テスト内容はtest.fpの ’set mater_lst ='の行を探せばわかります。 #test.fpのrdcmdにtest.fpで使用しているrdcmdの説明があります。MPIのテストの仕方の記述もあります。ただし、mpiに関してはTESTsamples/でテストすれば十分です。

実行エラーが起きた場合

例えば, test.fpを一つ一つ実行するとして、coptの例 (注:以下の--no-iactivというオプションは、対応するctrlファイルの中にIAVCTIV=Tとなっているのと関係している。これは途中でプロンプトして設定を逐次修正しながら実行していくモード。これをオフするために--no-iactiveとなっている。IACTIVを削除またはFにするのとおなじ)。

./test.fp --no-iactive copt

を実行すると

... the following job(s) will be executed by invoking "rdcmd -cat:TESTLMF --noerr ctrl.copt"
lmfa copt -vnsp=2 -cstrx=l12 --pr41,41 -vmet=3 -vtetra=0 -vnk1=2 -vlfrce=12 -vdist=1 --rs=0 -vnit=3 --time=5 --no-iactiv
lmf copt -vnsp=2 -cstrx=l12 --pr41,41 -vmet=3 -vtetra=0 -vnk1=2 -vlfrce=12 -vdist=1 --rs=0 -vnit=3 --time=5 --cvK:158,790 -vpwmode=0
... starting invocation of rdcmd:
/some_path/rdcmd '-f:#rdcmd:%2f' -cat:TESTLMF --noerr ctrl.copt  >& out.lmf.copt

と途中表示される。表示順序が不適切なため、どのプログラムがどのエラーを出しているのか見にくい。 この表示は5行目のように呼ばれるrdcmdが中で2、3行目のlmfa,lmfコマンドを実行する、という意味である。 (1、4、5行目はshell scriptの出力、2,3行目のコマンドはrdcmd --n -cat:TESTLMF ctrl.coptによる実行コマンドの出力で実行はしていない。実行は5行目で行う。)

エラーが起きると、一見rdcmd実行中に起きたように見えて意味不明だが、実際はこのrdcmdはこの場合2、3行目を実行しているだけなので、2、3行目のlmfa,lmfの方でエラーは起きている。out.lmf.coptが2、3行目の実行コマンドの出力なのでout.lmf.coptの中身を見てどこがおかしいのか対応することになる。

test.fpのrdcmd

test.fpでrdcmdを使っている。このコマンドの詳細がdocにないので書いておく。 (注:以下の--no-iactivというオプションは、対応するctrlファイルの中にIAVCTIV=Tとなっているのと関係している。これは途中でプロンプトして設定を逐次修正しながら実行していくモード。これをオフするために--no-iactiveとなっている。IACTIVを削除またはFにするのとおなじ)。

-cat

/rdcmd '-f:#rdcmd:%2f' -cat:TESTLMF --noerr ctrl.c  >& out.lmf.c

はctrl.cのTESTLMFで始まっているcategoryの行を実行する。ctrl.cでは

TESTLMF lmfa --no-iactiv c -vzbak=0
        lmf  --no-iactiv c -vzbak=0

となっているので

lmfa --no-iactiv c -vzbak=0
lmf  --no-iactiv c -vzbak=0

を実行し、同様に  rdcmd '-f:#rdcmd:%2f' -cat:TESTION --noerr ctrl.c >& out.lmf.c では TESTIONで始まるcategoryの行を実行する。

TESTION lmfa --no-iactiv c -vzbak=1
        lmf  --no-iactiv c -vzbak=1

lmfa --no-iactiv c -vzbak=1
lmf  --no-iactiv c -vzbak=1

を実行する。2行だけでなく何行でも書いていい。mpi commandもここに書けて

TESTLMF lmfa --no-iactiv c -vzbak=0
#        lmf  --no-iactiv c -vzbak=0
        mpirun -np 4 lmf-MPIK --no-iactiv c -vzbak=0 --rs=0
TESTION lmfa --no-iactiv c -vzbak=1
#        lmf  --no-iactiv c -vzbak=1
        mpirun -np 4 lmf-MPIK  --no-iactiv c -vzbak=1 --rs=0

としていい。またlmfaとlmfの左が揃っているのは意味がない。単に二列目から書けばいい。 なお、mpi版ではrstファイルの読み込み動作がserial versionと違いdefaultではrstが無い場合に自動で処理をしない。testp.fpではrstファイルが無い動作になるのでMPI,MPIKでは--rs=0を必ず付けること。

ctrl.coptは

TESTLMF lmfa copt -vnsp=2 -cstrx=l12 --pr41,41 -vmet=3 -vtetra=0 -vnk1=2 -vlfrce=12 -vdist=1 --rs=0 -vnit=3 --time=5 --no-iactiv
        lmf  copt -vnsp=2 -cstrx=l12 --pr41,41 -vmet=3 -vtetra=0 -vnk1=2 -vlfrce=12 -vdist=1 --rs=0 -vnit=3 --time=5 --no-iactiv --cvK:158,790 -vpwmode=0
MPI version
        mpix   -np=4 lmf-MPIK copt -vnsp=2 -cstrx=l12 --pr41,41 -vmet=3 -vtetra=0 -vnk1=2 -vlfrce=12 -vdist=1 --rs=0 -vnit=3 --time=5 --cvK:158,790 -vpwmode=0
CLEAN   rm -f atm.copt ctrl.copt log.copt moms.copt out.lmf.copt wkp.copt spec.prop

となっている。一列目からはじまるのがcategoryなのでそのまま読むと category=TESTLMF

lmfa copt -vnsp=2 -cstrx=l12 --pr41,41 -vmet=3 -vtetra=0 -vnk1=2 -vlfrce=12 -vdist=1 --rs=0 -vnit=3 --time=5 --no-iactiv
lmf  copt -vnsp=2 -cstrx=l12 --pr41,41 -vmet=3 -vtetra=0 -vnk1=2 -vlfrce=12 -vdist=1 --rs=0 -vnit=3 --time=5 --no-iactiv --cvK:158,790 -vpwmode=0

category=MPI

version
mpix   -np=4 lmf-MPIK copt -vnsp=2 -cstrx=l12 --pr41,41 -vmet=3 -vtetra=0 -vnk1=2 -vlfrce=12 -vdist=1 --rs=0 -vnit=3 --time=5 --cvK:158,790 -vpwmode=0

category=CLEAN

rm -f atm.copt ctrl.copt log.copt moms.copt out.lmf.copt wkp.copt spec.prop

という3つの実行コマンドがあることになる。

unknown categoryは無視されるのでそこにコマンドを埋め込んでいる。 単に-cat:の内容をshell scriptとしてfileに出すprogramをつくり、そのshell scriptを実行してくれた方がわかりやすかった。こういう不必要な複雑さがこのprogramにはある。--Kino 17:03, 15 July 2010 (JST)

--n

rdcmd --n -cat:TESTLMF ctrl.copt

でTESTLMF categoryの内容を書き出す。 SITE,CLASSなどの他のcategoryの内容もこれで書き出せる。

-f

-fは出力の行頭に使う。spaceは無視されるので

rdcmd --n -cat:OPTIONS "-f: " ctrl.copt

とすれば、行頭になにもない出力が得られる。

NSPIN=2 REL=T CCOR=1
SCR=0 TWOC=0 GAMMA=0 NSPH=0 HF=hf
NONCOL=0 SO=0
PFLOAT=0
rdcmd --n -cat:OPTIONS "-f:%2f" ctrl.copt

は空白2つになる。

  NSPIN=2 REL=T CCOR=1
  SCR=0 TWOC=0 GAMMA=0 NSPH=0 HF=hf
  NONCOL=0 SO=0
  PFLOAT=0
Personal tools