3. 基本的な使用方法¶
abICSでは, モンテカルロステップ毎に位置座標を更新しながら、ソルバー(VASP, QEなど)によるエネルギー計算などを行います. そのため、位置座標以外の情報について予め用意する必要があります。これらの情報は、ソルバーの入力形式に従ったファイルを参照し取得します。
3.1. 参照ファイルの準備¶
使用するソルバーの入力形式に従った入力ファイルを用意します。
参照ファイルのパスはabICSの入力ファイルにある [solver]
セクションの base_input_dir
で指定します。
座標情報については、abICSの入力ファイルを参照するため、記載する必要はありません。
以下、QEの参照ファイルの例について記載します。
&CONTROL
calculation = 'scf'
tstress = .false.
tprnfor = .false.
pseudo_dir = '~/qe/pot'
disk_io = 'low'
wf_collect = .false.
/
&SYSTEM
ecutwfc = 60.0
occupations = "smearing"
smearing = "gauss"
degauss = 0.01
/
&electrons
mixing_beta = 0.7
conv_thr = 1.0d-8
electron_maxstep = 100
/
ATOMIC_SPECIES
Al 26.981 Al.pbesol-nl-kjpaw_psl.1.0.0.UPF
Mg 24.305 Mg.pbesol-spnl-kjpaw_psl.1.0.0.UPF
O 16.000 O.pbesol-n-kjpaw_psl.1.0.0.UPF
ATOMIC_POSITIONS crystal
K_POINTS automatic
1 1 1 0 0 0
3.2. 入力ファイルの作成¶
次にabICSの入力ファイルを作成します。 abICSの入力ファイルは, 以下の4つのセクションから構成されます.
[replica] セクション レプリカ数や温度の幅, モンテカルロステップ数など,レプリカ交換モンテカルロ部分のパラメータを指定します.
[solver] セクション ソルバーの種類 (VASP, QE, ...)、ソルバーへのパス、不変な入力ファイルのあるディレクトリなど(第一原理計算)ソルバーのパラメータを指定します.
[observer] セクション 取得する物理量の種類などを指定します.
[config] セクション 合金の配位などを指定します.
これらの詳細については 入力ファイルフォーマット をご覧ください。 以下、QEの場合の入力ファイルの例を記載します。
[replica]
nreplicas = 2
nprocs_per_replica = 1
kTstart = 1000.0
kTend = 1200.0
nsteps = 2 # Number of steps for sampling
RXtrial_frequency = 1
sample_frequency = 1
print_frequency = 1
[solver]
type = 'qe'
path= './pw.x'
base_input_dir = './baseinput'
perturb = 0.0
run_scheme = 'mpi_spawn'
[config]
unitcell = [[8.1135997772, 0.0000000000, 0.0000000000],
[0.0000000000, 8.1135997772, 0.0000000000],
[0.0000000000, 0.0000000000, 8.1135997772]]
supercell = [1,1,1]
[[config.base_structure]]
type = "O"
coords = [
[0.237399980, 0.237399980, 0.237399980],
[0.762599945, 0.762599945, 0.762599945],
[0.512599945, 0.012600004, 0.737399936],
[0.487399966, 0.987399936, 0.262599975],
[0.012600004, 0.737399936, 0.512599945],
[0.987399936, 0.262599975, 0.487399966],
[0.737399936, 0.512599945, 0.012600004],
[0.262599975, 0.487399966, 0.987399936],
[0.987399936, 0.487399966, 0.262599975],
[0.012600004, 0.512599945, 0.737399936],
[0.487399966, 0.262599975, 0.987399936],
[0.512599945, 0.737399936, 0.012600004],
[0.262599975, 0.987399936, 0.487399966],
[0.737399936, 0.012600004, 0.512599945],
[0.237399980, 0.737399936, 0.737399936],
[0.762599945, 0.262599975, 0.262599975],
[0.512599945, 0.512599945, 0.237399980],
[0.487399966, 0.487399966, 0.762599945],
[0.012600004, 0.237399980, 0.012600004],
[0.987399936, 0.762599945, 0.987399936],
[0.987399936, 0.987399936, 0.762599945],
[0.012600004, 0.012600004, 0.237399980],
[0.487399966, 0.762599945, 0.487399966],
[0.512599945, 0.237399980, 0.512599945],
[0.737399936, 0.237399980, 0.737399936],
[0.262599975, 0.762599945, 0.262599975],
[0.237399980, 0.512599945, 0.512599945],
[0.762599945, 0.487399966, 0.487399966],
[0.762599945, 0.987399936, 0.987399936],
[0.237399980, 0.012600004, 0.012600004],
[0.737399936, 0.737399936, 0.237399980],
[0.262599975, 0.262599975, 0.762599945],
]
[[config.defect_structure]]
coords = [
[0.000000000, 0.000000000, 0.000000000],
[0.749999940, 0.249999985, 0.499999970],
[0.249999985, 0.749999940, 0.499999970],
[0.249999985, 0.499999970, 0.749999940],
[0.749999940, 0.499999970, 0.249999985],
[0.499999970, 0.749999940, 0.249999985],
[0.499999970, 0.249999985, 0.749999940],
[0.000000000, 0.499999970, 0.499999970],
[0.749999940, 0.749999940, 0.000000000],
[0.249999985, 0.249999985, 0.000000000],
[0.249999985, 0.000000000, 0.249999985],
[0.749999940, 0.000000000, 0.749999940],
[0.499999970, 0.000000000, 0.499999970],
[0.000000000, 0.749999940, 0.749999940],
[0.000000000, 0.249999985, 0.249999985],
[0.499999970, 0.499999970, 0.000000000],
[0.374999970, 0.374999970, 0.374999970],
[0.624999940, 0.624999940, 0.624999940],
[0.374999970, 0.874999940, 0.874999940],
[0.624999940, 0.124999993, 0.124999993],
[0.874999940, 0.874999940, 0.374999970],
[0.124999993, 0.124999993, 0.624999940],
[0.874999940, 0.374999970, 0.874999940],
[0.124999993, 0.624999940, 0.124999993],
]
[[config.defect_structure.groups]]
name = 'Al'
# species = ['Al'] # default
# coords = [[[0,0,0]]] # default
num = 16
[[config.defect_structure.groups]]
name = 'Mg'
# species = ['Mg'] # default
# coords = [[[0,0,0]]] # default
num = 8
[observer]
ignored_species = ['O']
3.3. abICSの実行¶
MPI 実行時に指定するプロセス数はレプリカ数以上である必要があります。
$ mpiexec -np 2 abics input.toml
実行すると、カレントディレクトリ以下にレプリカ番号を名前にもつディレクトリが作られ、各レプリカはその中でソルバーを実行します。
3.3.1. MPI プロセス数に関する Tips¶
abICS はソルバーの実行のために MPI_Comm_spawn
という MPI ライブラリ関数を使用します。
この関数は新規に MPI プロセスを(複数)起動して、そこで任意プログラムを(並列)実行します。
たとえば、 1ノードあたり 4CPU コアをもつような並列計算機において、 2レプリカの計算を、1つあたり4並列のソルバーで実行する場合を考えます。
mpiexec -np 2 abics input.toml
として実行した場合、ノード 0 の最初の2コアでレプリカ制御プロセス A,B が起動し、それぞれが4並列ソルバー a,b を新規に起動します。
そのとき、ソルバー a はノード 0 の残り2コアとノード 1 の先頭 2コアに、
ソルバー b はノード 1 の残り2コアとノード 2 の先頭 2コアに配置され、ソルバー内でノード間通信が発生し、性能が低下します。
初期プロセスを多めに取ることで、プロセスを整列させ、不要なノードまたぎが起きないようにできます。
今回の例では、 mpiexec -np 4 abics input.toml
とすることで、
レプリカ制御プロセス A,B の他に何もしないプロセスで ノード0 をすべて埋めることができ、
ソルバー a,b はそれぞれノード1, 2 を埋めることができます。
3.3.2. MPI 実装依存性¶
MPI 実装によっては、 MPI_Comm_spawn
関数で、「合計でいくつのプロセスを起動できるか」 という情報 (MPI_UNIVERSE_SIZE
) を利用することがあります。
MPI_UNIVERSE_SIZE
の設定方法など、 各種MPI 実装に関するTips を紹介します。
OpenMPI¶
使用できるCPU コア数と同じ値が MPI_UNIVERSE_SIZE
として自動で設定されます。
使用プロセス数がこれを超える場合には、 --oversubscribe
オプションを渡す必要があります。
OpenMPI は、 MPI_Comm_spawn
で呼び出したプロセスが非ゼロのリターンコードを返した場合に、すべてのプロセスごと終了します。
リターンコードを無視したい場合は、 --mca orte_abort_on_non_zero_status 0
としてください。
例えばQuantum ESPRESSO は、計算中に浮動小数点数例外を捕捉すると、終了時に非ゼロのリターンコードを返します。
MPICH / Intel MPI¶
-usize <num>
オプションで MPI_UNIVERSE_SIZE
を指定できます。
実際には指定しなくとも動作するようです。
HPE (SGI) MPT¶
-up <num>
オプションで MPI_UNIVERSE_SIZE
を指定できます。
-np <num>
オプションよりも先に指定する必要があります。
その他¶
大規模スパコンなどでは、ベンダーがジョブスケジューラとともに専用の MPI 実行スクリプトを用意している場合があります。 その場合は、個別のマニュアルを参考にしてください。
例として、 物性研スパコン sekirei, enaga では、 mpijob -spawn
とすることで、 MPI_UNIVERSE_SIZE
が自動的に設定されます。