LAMMPS 概説
LAMMPSは、Large-scale Atomic/Molecular Massively Parallel Simulatorの略で、材料モデリングに重点を置いた古典的な分子動力学シミュレーションです。
元々はF77で書かれていました。LAMMPS 99がF77で、LAMMPS 2001がF90で書かれていたバージョンです。とあるMPIの実装実験の時、手頃な負荷のアプリが欲しいという事で、C++に書き換えられました。現在のLAMMPSは、2005年に公開されたC++版を祖とするものです。
オープンソースでフリーである事から、特にスパコンで様々な実装実験などに使われた為、知名度があります。GPGPUを使用したノード間並列の独自実装実験は有名かと思います。
LAMMPSは、C++で書かれているという点が人気の原因の一つかもしれません。
MDという事で、次のようなシムをイメージされるかと思います。
これは、ベンゼンを、Amber Force Field を使用してLAMMPSで計算した結果をVMDで表示させたものですが、こういったものが一般的なMDのイメージだと思います。
LAMMPSの人気の理由には、元々、実装実験の為にC++にポーティングされた為、パッケージという形でコードを組み込み易いという点もあったりします。つまり、自分が計算したい部分以外をLAMMPSを使って、自分が計算したい部分だけコードを書いて、LAMMPSに組み込んで使うという使い方もLAMMPSの場合、割とメジャーだったりします。
これは machdyn の example の rubber_rings_3d をLAMMPSで計算させた結果をVMDで表示させたものです。文字通りにゴムのリングが衝突する様子です。
MDのMどこに行った?といった感もありますが、こうしたMDでイメージされる用途以外の使用方法もあったりするのです。
このように、かなり自由にパッケージの形で計算コードを組み込み易い為、計算手法の実装実験のテストベッドとして有効なようで、新しい計算手法などを論文にする際、実装の例としてLAMMPSのパッケージとして公開して掲載される場合がしばしばある為、特にC++でシム等のコードを書く層での知名度は高いように思います。
LAMMPS のバージョン
LAMMPSに関しては、弊社はかなり以前から取り扱っていました。2008年に問い合わせに応じて作成したバイナリが社内に残してあったりします。こうした事を評価して頂けたのか、お問い合わせが比較的あるアプリです。
C++でコードを書いている人がなぜ問い合わせを?と思うかもしれませんが、その理由の一つが、バージョン互換性の問題です。最近のLAMMPSでは起きなくなりましたが、昔のバージョンでは、特定のスパコン環境でしか動作しないコードがそのまま入っていた為に特定のスパコンでしかビルド出来ない場合などがあり、ビルド可能なバージョンを選択する事が、結構、面倒な時期がありました。
この事情は開発者側でも同様であったようで、アップデートパッチのみのリリースだったものを、stableとして、纏めてからリリースするようになりました。
あまりにフリーダムにパッチがリリースされ、パッチを適用しようにも、コードが変ってしまっていて、コードの整合性が無くなってしまい、パッチがあてられないといった事態が生じた為、定期的に、そこまでのパッチなどを纏めて、開発の起点とするソースツリーをstableとしてリリースするようになったのです。
その為、LAMMPSのバージョン番号は、stableをリリースした日付で標記します。
LAMMPS 23Jun2022 update1の場合、23Jun2022がバージョン番号となります。
こういった事情があるので、一般的なstableのイメージとは異なり、LAMMPSのstableバージョンは、開発陣がビルド出来る事を確認して、パッチやパッケージ開発の起点としたといったようなものです。もっとも、stableとは言っても、一部のパッケージは動作試験まではしていないような場合も見受けられます。
LAMMPSを使用する場合、このバージョン番号が大事で、異なるバージョンだと同じインプットがそのままでは使用出来ない可能性は他アプリに比べて、かなり高いと言えるでしょう。
LAMMPS のパッケージにおける互換性の問題
このバージョン互換性の問題は、計算手法の実装実験のテストベッドとして、ユーザーが自分が使い易いようにLAMMPSを変えてゆくからなのですが、同じ事がLAMMPSに組み込むパッケージでも起ります。
ビルドしようと思ったら、目的のパッケージが無くなっていたとか、仕様が変っていた、などが、普通に生じる訳なので、弊社に聞いてみようという事かと思います。
パッケージが無くなってしまう例は、稀ですがある話で、reaxFFの独自実装だったreax/cは無くなってしまいました。代わりという訳ではないのですが、REAXFFという、似たようなreaxFFの独自実装のパッケージが現在のLAMMPSには加わっています。
因みに、REAXFFに関してはお問い合わせが割とあるのですが、reaxFFの開発者が開発したreaxFFというアプリは別に存在します。LAMMPSのREAXFFのパッケージは、独自実装である事から、reaxFFとまったく同じ計算結果を担保するものではない点、以前に存在していたreax/cと仕様の互換性が無い点には注意が必要です。
パッケージに関しては、計算手法の論文発表と公開が終ったので、放置したままというパッケージは割とあり、reax/cが無くなったのも、長期に渡り放置されていた為もあるように思います。
パッケージは、沢山の人が開発している為、かなりの数となり、さらに、そのパッケージで使用する関連ライブラリもかなりな数となってしまっています。
この関連ライブラリの扱いが面倒で、開発者の環境に依存する為、最新版であれば動作するという場合はむしろ例外です。あるバージョン以上で、かつ、あるバージョン以下の特定のバージョンでないと仕様の違いの為に動作しない、というのが普通である為、0からビルドするのがとても面倒な事は、実際にビルドしてきた身としては実感する面もあります。
関連ライブラリはOSに一般的にインストールされているライブラリもありますし、パッケージの為にビルドする必要があるものもありますが、このような沢山のパッケージを組み込むのは大変です。
OSにインストール済みのライブラリと同じライブラリで、LAMMPSが要求するライブラリのビルドオプションと、OSにインストール済みのライブラリのビルドオプションが異なっていて、OSにインストール済みのものだと動作出来ない場合などが特に厄介です。
弊社で組み込んだパッケージ
弊社でLAMMPS 23Jun2022 update1に組み込んで動作を確認したパッケージは以下のとおりです。
ASPHERE、ATC、AWPMD、BOCS、BODY、BPM、BROWNIAN、CG-DNA、CGSDK、CLASS2、COLLOID、COLVARS、COMPRESS、CORESHELL、DIELECTRIC、DIFFRACTION、DIPOLE、DPD-BASIC、DPD-MESO、DPD-REACT、DPD-SMOOTH、DRUDE、EFF、ELECTRODE、EXTRA-COMPUTE、EXTRA-DUMP、EXTRA-FIX、EXTRA-MOLECULE、EXTRA-PAIR、FEP、GRANULAR、H5MD、INTERLAYER、KIM、KSPACE、LATBOLTZ、LATTE、MACHDYN、MANIFOLD、MANYBODY、MC、MDI、MEAM、MESONT、MGPT、MISC、ML-HDNNP、ML-IAP、ML-PACE、 MLRANN、ML-SNAP、MOFFF、MOLECULE、MOLFILE、MSCG、NETCDF、OPT、ORIENT、PERI、PHONON、PLUGIN、POEMS、PTM、PYTHON、QEQ、QTB、REACTION、REAXFF、REPLICA、RIGID、SCAFACOS、SHOCK、SMTBQ、SPH、SPIN、SRD、TALLY、UEF、VORONOI、VTK、YAFF
特殊な例となりますが、LATTEとMSCGはシリアル(逐次)でしか動作せず、さらにBLASとLAPACKのパッケージの要求仕様に違いがあり、それぞれ別にバイナリを用意する必要がありました。
パッケージの改廃
上記のパッケージのうち、23Jun2022で新しく加わったパッケージはBPMとELECTRODEの2つです。
BPM パッケージは、メソスケールの固体をシミュレートするために使用できる結合粒子モデルを実装しています。固体は粒子の集まりとして構築され、それぞれが原子スケールよりもはるかに大きな空間の粗い領域を表します。固体領域内の粒子は、結合のネットワークによって接続され、固体の弾性を提供するものです。
ELECTRODEパッケージは電解質として残りの原子と相互作用する原子グループに対して定電位法を適用できるものです。
新たに加わっただけではなく、無くなったパッケージもあります。
messageは廃止されました。messageで実装されたものと似た機能は、MDIパッケージによって提供されるようになりました。この変更に伴ない、MDIパッケージも仕様に変更が加わっています。
また、以前のバージョンでMEAMは廃止されたハズなのですが、MEAMパッケージが復活しています。lib/meamとtoolsのmeam関連は無くなったままなのですが、MEAMパッケージがソースに含まれていて、pair_style meamは23Jun2022で使用出来ました。
こうしたパッケージの変化がある為、LAMMPSをご使用になりたい場合、目的のパッケージが使えるかどうかを事前にお問い合わせ下さい。
LAMMPS の仕様の変化
LAMMPSは、先にも述べたように、計算手法などの実装実験や、その実装の公開の為のテストベッド的な性格が強い為、同じパッケージが入っていても、仕様が異なる場合が多々あります。
厄介な事に、コードやexampleは異なる開発者の著作物でもある為、仕様を変更した人が、exampleなどを勝手に変更し難い面があります。
実際は、単純にexampleの修正忘れではないかと思うような場合が殆どですが。
MDIのexampleは従来、example/PACKEGES/mdiにあったのですが、これは旧仕様のexampleで、動作させる事は出来ません。動作は出来ないのですが、旧exampleはPACKAGESに残されたままでいます。
23Jun2022の新仕様のMDIのexampleはexample/mdiとして追加されていました。
exampleが仕様変更にともない用意されているのは、LAMMPSでは珍しい部類になりますが、用意しないと扱いに困る程度の変更があったものと考えて頂いて間違い無いと思います。29Sep2021以前のバージョンなどでMDIパッケージをお使いになられていた場合、大幅な変更があり、そのままでは動作しない為、LAMMPSのバージョン選定に注意が必要になります。
LATBOLZも23Jun2022で大きく仕様が変化したパッケージです。
fix lb/filedコマンドはこれまでと互換性の無い形に変更になっています。また、fix lb/pcとfix lb/pc/rigid/sphereが削除され、代りにfix nveとfix rigidを使用するように変更になっています。latboltzを使用しているユーザーにとっては大きな改変になるので、注意して下さい。
例えば、exampleのconfined_colloidのインプットの中のfixの違いを表示してみると、
< fix 1 FluidAtoms lb/fluid 1 1 1.0 1.0 dx 0.06 dm 0.00003 setArea 2 0.0018337299 zwall_velocity -20.0 20.0
---
> fix 1 FluidAtoms lb/fluid 1 1.0 1.0 dx 0.06 zwall_velocity -20.0 20.0
上記のdiffのように変更がありました。
パッケージの変化以外に、LAMMPS本体の仕様の変更もあります。
LAMMPS本体での仕様変更は、個々のパッケージと異なり、影響が広範囲に及ぶのですが、exampleに対して仕様変更へ対応した修正は忘れられたままの場合が多いようです。
注意しなくてはならない仕様変更として、「delete_atoms porosity」が「delete_atom random」に変更になりました。さらに変数も追加されました。
また、「create_atoms rondom」という新しいオプションも加わっています。
具体例として、manifoldのthylakoidの例を示します。23Jun2022で変更になったdelete_atomsの仕様変更の為、動作する為には、以下のdiffのようにインプットの修正が必要でした。
< delete_atoms porosity everywhere 0.2 123
---
> delete_atoms random fraction 0.2 yes all everywhere 123
他に注意が必要な仕様変更として、熱力学出力の出力形式が若干、変更になりました。空白やフィールドの幅が変更になっている為、ログファイルを分析するパーサーは以前の仕様のものはそのまま使用出来ない可能性があるので注意して下さい。例としてtoolsのreplicaのexampleにあるparse_ene.pyを動作させる為に必要な修正部分のdiffを以下に示します。
< start_token = 'Step Temp PotEng'
---
> start_token = ' Step Temp PotEng'
仕様変更した人の気分以外にメリットが無いような変更ですが、自作のツールを使用して計算結果を解析している場合、大した手間ではない変更だとは言えるかとも思います。
LAMMPSのインプットファイルがスクリプトに近いものである事も考えると、スクリプトくらいはプログラミング出来、ツールなどで、こうした変更に簡単に対応出来る人しかLAMMPSはユーザーとして想定していない事を示す例かもしれません。
LAMMPS のビルドにおける注意点
LAMMPSは、ビルドが問題無く終了し、LJなどの代表的なインプットが問題無く動作する事が確認出来たバイナリでも、実際にパッケージのexampleを実行してみると特定のパッケージが動作しないという場合は結構あります。先に上げた例だとLATTEやMSCGなどのパッケージは、その極端な例です。
パッケージごとの微妙な仕様の違いによるものですが、近年はこうしたパッケージ同士のコンフリクトは少なくはなりましたが、安定性なども含めて注意が必要です。
ビルドオプションなどで、複数のパッケージを一つのバイナリに組み込む場合、変な表現ですが、ビルドオプションのパッケージ間の落とし所を探る必要がある場合もあります。
ATCパッケージなどは、そういったパッケージ同士のビルドオプションの落し所を必要とするパッケージです。
こうしたビルドオプション等のパッケージによる違いの為に動かない場合もありますし、exampleが仕様変更に対応していない場合もある為、動作検証が必須なのですが、とても大変です。
他にLAMMPSで注意が必要な点としてはpythonの指定です。
Python2のサポート終了に伴ない、流石にLAMMPSもpython3対応しているのですが、完全ではありません。実際はexampleやtoolsなどで、python2仕様のスクリプトがそのまま放置された形で存在しています。scafacosのように、動作させる場合にはpython3で問題が無いが、ライブラリをビルドしてテストする際、python2でないとテスト出来ないなどは23Jun2022では稀な例ですが、それでも無い訳ではありません。
では、python2を使えば良いかというと、ML-IAPはpythonのtorchを使用する為、python3でないと動作出来ません。python2はサポート終了という事やpython3でないと動作出来ないパッケージがある事から、基本的にpython3を使用して動作するようにビルドしました。
また、動作する為にはLAMMPSだけでなく、python3の側でも多数のサイトパッケージが必要なexampleも多くあります。OSのpython3にRPMパッケージを追加する形では賄えない面がある為、LAMMPS用のpython3を用意し、exampleが動作するのに必要なサイトパッケージを加えました。
LAMMPSはlibLAMMPS.soの形で、python3から使用する事が出来る事もあり、OSのpythonにインストールするよりは独立してpython3を作成した方が、enviroment moduleで設定が簡単にロード出来る事もあり、こういった形としています。
但し、問題もあって、よくLAMMPSと一緒に使用されるSPPARKSは最新版の19Sep22でも、python3に未対応です。libspparks.soをpythonから使用したい場合は、python2が必要である為、その旨をお問い合わせ下さい。
LAMMPS の可視化を paraview で
可視化ツールのpizzaは、python2でしか動作出来ない為、python3 でビルドすると pizza を使用出来ません。
可視化という点では、これは問題があるようにも思えますが、VTKパッケージを組み込んであるので、paraviewで可視化は可能です。
上記は、dump vtkで作成したdumpファイルをparaviewで表示させた例です。
さらにVMDは rubber_rings_3d の図のように、LAMMPS trajectoryファイルをそのまま可視化可能である為、バイナリ配布されているこれらのツールをインストールしてあれば、可視化で困る事は無いと思います。
また、かなり古いアプリですが、atomeye3 も同梱してあるので、pizzaが使用出来ないからといって、可視化で困る事は恐らく無いものと思われます。
どのバージョンのLAMMPSでも言える事ですが、フリーダムに仕様が変化していますので、以前のバージョンで使用していたインプットや解析用のツールがそのまま動作しないといった場合はありえます。
また、LAMMPSは計算手法の実装テストベッドという性格が強い為、計算精度を担保するテストプログラムが存在しません。
計算結果が仕様の変更等で微妙に変化している等の場合もあるので、どうしてもこれが動かないと困るといったインプットを実行した結果を元に、23Jun2022 update1を採用するかどうかを決めた方が良いかもしれません。
LAMMPS の性能検証
さて、性能ですが、
上記は、LAMMPS 23Jun2022 update1で、LJインプットをx=4, y=8, z=8と拡張して第 2 世代インテル® Xeon® スケーラブル・プロセッサーで実行し、1コアでの実行時間を100として表したものです。ノード間は、InfiniBandで接続している環境です。
LAMMPSの売りの一つが並列性ですが、このように、並列数に応じて実行時間が短縮され、スケーラビリティが良い事が分ります。
一つ前のバージョンの 29Sep2021 update3 と比較したのが以下の図です。
29Sep2022 update3の1コアでの実行時間を100として、同様に2ノードで並列数を変化させて実行した結果です。23Jun2022 update1 の計算速度に問題が無い事が分ります。
LAMMPSは小さな計算から、1スレッドがGB級のような大きな計算まで、幅広いスケールで計算が可能ですが、計算手法(パッケージ)によっては、BLASの性能が物を言う場合も多く、Intel MKLを使用する事で、高い性能を出す場合が多々あります。
元々、クラスターでの使用を前提としている為、MKLとの相性も良いように思います。
おわりに
LAMMPSは一般的なパソコンの販売アプリとは異なって、ユーザーがプログラミングが出来る前提です。インプットファイルなど、ほぼLAMMPSスクリプトのプログラムと言えるようなものなので、ユーザーを選ぶようには思います。
しかし、こうした部分が、今までに世にない計算手法などのパッケージを自作するといった目的には、効率が良いようで、LAMMPSのHPに掲載されている論文の多さなどは、その証明かもしれません。
最後にLAMMPSのHPのURLを記載しておきます。