3. 基本的な使用方法

abICSでは, モンテカルロステップ毎に位置座標を更新しながら、ソルバー(VASP, QEなど)によるエネルギー計算などを行います. そのため、位置座標以外の情報について予め用意する必要があります。これらの情報は、ソルバーの入力形式に従ったファイルを参照し取得します。

3.1. 参照ファイルの準備

使用するソルバーの入力形式に従った入力ファイルを用意します。 参照ファイルのパスはabICSの入力ファイルにある [solver] セクションの base_input_dir で指定します。 座標情報については、abICSの入力ファイルを参照するため、記載する必要はありません。 以下、QEの参照ファイルの例について記載します。

&CONTROL
  calculation = 'relax'
  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
/
&ions
/
ATOMIC_SPECIES
Al 26.981 Al.pbe-nl-kjpaw_psl.1.0.0.UPF
Mg 24.305 Mg.pbe-spnl-kjpaw_psl.1.0.0.UPF
O  16.000 O.pbe-n-kjpaw_psl.1.0.0.UPF
ATOMIC_POSITIONS crystal

K_POINTS gamma

3.2. 入力ファイルの作成

次にabICSの入力ファイルを作成します。 abICSの入力ファイルは, 以下の4つのセクションから構成されます.

  1. [replica] セクション

    レプリカ数や温度の幅, モンテカルロステップ数など,レプリカ交換モンテカルロ部分のパラメータを指定します.

  2. [solver] セクション

    ソルバーの種類 (VASP, QE, OpenMX)、ソルバーへのパス、参照用入力ファイル( 参照ファイルの準備 )のあるディレクトリなど、ソルバーのパラメータを指定します.

  3. [observer] セクション

    取得する物理量の種類などを指定します.

  4. [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 = [
            [4.056800, 4.056800, 0.000000],
            [4.056800, 0.000000, -4.056800],
            [0.000000, 4.056800, -4.056800], ]
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

実行すると、カレントディレクトリ以下にレプリカ番号を名前にもつディレクトリが作られ、各レプリカはその中でソルバーを実行します。 ここで、 input.toml はabICS用の入力ファイルです( 入力ファイルの作成 参照)。

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 が自動的に設定されます。

3.4. ソルバー利用時の注意点

abICSでは原子の座標を更新します. それ以外の設定については基本的にソルバーごとに指定する必要があります。ただし、構造最適化をする原子の指定についてはabICS側で制御することが可能です。構造最適化機能を有効にする場合には、ソルバーの参照ファイルで構造最適化オプションを有効にした上で、構造最適化のステップ数なども指定することで最適化が行われます。また、abICSではソルバー毎に、参照ファイル名、実装時に仮定している参照ファイルのルールや、abICS入力ファイルで指定できる実行形式 run_scheme があります。以下、それらについて説明します。

3.4.1. VASP

  • URL : https://www.vasp.at

  • 参照ファイル

    • INCAR, POTCAR, KPOINTS ファイルを用意してください。

      • POTCARファイルは元素をアルファベット順に並べてください。

      • POSCARファイルは不要ですが、依存パッケージである pymatgen のバージョンによっては必要になります。その場合、なにか適当なファイルを用意してください。

  • abICS 入力ファイル

    • run_scheme の指定

      mpi_spawn_ready に設定してください。 なお、VASPをソルバーとして利用する際には、 MPI_Comm_spawn を利用するためのパッチをあてる必要があります。 利用されたい場合には、お問い合わせ のその他に記載された連絡先までご連絡ください。

3.4.2. Quantum Espresso

  • URL : https://www.quantum-espresso.org

  • バージョンは 6.2 以上を利用してください。

    • いわゆる旧形式 XML バージョンは利用できません。

  • 参照ファイル

    • 参照ファイル名は scf.in にしてください。

    • calculationscfrelax のみ対応しています。

    • \(\Gamma\) 点のみで計算する場合には、 kpointsGamma に指定すると高速化します。

  • abICS 入力ファイル

    • run_scheme の指定

      mpi_spawn に設定してください。

3.4.3. OpenMX

  • URL : http://www.openmx-square.org

  • バージョンは 3.9 を利用してください。

  • 参照ファイル

    • 参照ファイル名は base.dat にしてください。

  • abICS 入力ファイル

    • run_scheme の指定

      mpi_spawn_wrapper に設定してください。