LAMMPSのつかいかた.

Slides:



Advertisements
Similar presentations
G ゼミ 2010/5/14 渡辺健人. パフォーマンスの測定 CUDA Visual Profiler CUDA の SDK に標準でついているパフォーマン ス測定用のツール 使い方: exe ファイルのパスと作業ディレクトリ指定して実 行するだけ 注意点 : GPU のコード実行後にプログラム終了前に,
Advertisements

LAMMPS 実装編.
実習1:コマンドシェルの使い方.
TeX で数式を書くための PowerPoint アドイン Ver (2011/06/26) Ver. 0.1 (2007/5/30)
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
連続系アルゴリズム演習 第2回 OpenMPによる課題.
JXTA Shell (3) P2P特論 (ソフトウェア特論) 第6回 /
知能機械工学科 担当:長谷川晶一 TA:新・後藤・ナンバ
東京工科大学 コンピュータサイエンス学部 亀田弘之
SHA-1の高速化tips 2007/9/15
プログラミング入門 電卓番外編 ~エクセルで関数表示~.
プログラミング基礎I(再) 山元進.
プログラミング言語としてのR 情報知能学科 白井 英俊.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
1.1 C/C++言語 Hello.ccを作りコンパイルしてa.outを作り出し実行する
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
システムプログラミング 第5回 情報工学科 篠埜 功 ヒアドキュメント レポート課題 main関数の引数 usageメッセージ
報告 (2006/9/6) 高橋 慧.
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
画像の作成と編集.
ParaViewを用いたPHITS 計算結果の3次元表示
シミュレーション物理5 運動方程式の方法: サブルーチンの使い方.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
データ構造と アルゴリズム 第二回 知能情報学部 新田直也.
シミュレーション物理7 乱数.
第7章 データベース管理システム 7.1 データベース管理システムの概要 7.2 データベースの格納方式 7.3 問合せ処理.
第3回:ボールを上下に動かそう! (オブジェクトの移動、一次元)
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
高山建志 五十嵐健夫 テクスチャ合成の新たな応用と展開 k 情報処理 vol.53 No.6 June 2012 pp
TA 高田正法 B10 CPUを作る 2日目 SPIMのコンパイル TA 高田正法
スクリプト言語を用いたPHITSの連続実行
基幹理工学研究科 情報理工学専攻 後藤研究室 修士1年 魏 元
シミュレーション演習 G. 総合演習 (Mathematica演習) システム創成情報工学科
2003年度 データベース論 安藤 友晴.
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
Borland Delphi 6 でビジュアルプログラミング
3-10. MySQLシステムの管理  2004年6月10日  大北高広                01T6010F.
その他の図 Chapter 7.
暗黙的に型付けされる構造体の Java言語への導入
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
プログラミング 4 記憶の割り付け.
デバッガ dbx の使い方.
TA 高田正法 B10 CPUを作る 3日目 SPIMの改造 TA 高田正法
創造設計演習(S&V演習) 提出課題 課題内容
22章以降 化学反応の速度 本章 ◎ 反応速度の定義とその測定方法の概観 ◎ 測定結果 ⇒ 反応速度は速度式という微分方程式で表現
デジタル画像とC言語.
VBで始めるプログラミング こんにちは、世界。 /28 NARC.
JXTA Shell (1) P2P特論 (ソフトウェア特論) 第4回 /
TA 高田正法 B10 CPUを作る   実験の前に TA 高田正法
地域情報学 C言語プログラミング 第1回 導入、変数、型変換、printf関数 2016年11月11日
プロジェクト演習Ⅱ インタラクティブゲーム制作
情報処理Ⅱ 第2回:2003年10月14日(火).
ソフトウェア保守のための コードクローン情報検索ツール
情報工学科 3年生対象 専門科目 システムプログラミング 第4回 シェルスクリプト 情報工学科 篠埜 功.
統計ソフトウエアRの基礎.
第1章 いよいよプログラミング!! ~文章の表示 printf~
★C++/オブジェクト指向実践企画★ Othelloゲーム作成
今後の予定 (日程変更あり!) 5日目 10月21日(木) 小テスト 4日目までの内容 小テスト答え合わせ 質問への回答・前回の復習
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
全体ミーティング (5/23) 村田雅之.
プログラミング入門 電卓を作ろう・パートI!!.
本当は消去できていない!? ~データを完全消去する方法~
本当は消去できていない!? ~データを完全消去する方法~
情報処理Ⅱ 第7回 2004年11月16日(火).
コンパイラ 2012年10月11日
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
Molecular Devices Japan
情報工学科 3年生対象 専門科目 システムプログラミング 第3回 makeコマンド 動的リンクライブラリ 情報工学科 篠埜 功.
情報処理Ⅱ 2005年11月25日(金).
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

LAMMPSのつかいかた

LAMMPSについて LAMMPSとは? LAMMPSの中身について MDの基本機能が揃ったソフト “Large-scale Atomic/Molecular Massively Parallel Simulator “(大規模原子・分子超並列シミュレータ)の略 スクリプト形式でコマンドを書いて実行できる 実装の詳細を知らなくても使える 並列計算の効率が非常に高いことで有名 スパコンや新しいCPU・コンパイラ等のベンチマークにも使われる LAMMPSの中身について C++で記述されている。Sandia研究所で開発・メンテナンス中 開発のペースが速い。このスライドの内容もいつか変わる可能性があります オープンソース(GPL)なのでソースコード自体を好きに修正・追加できる

LAMMPS インストール方法 とりあえず本家Webページからソースがダウンロードできる。マニュアルも充実している http://lammps.sandia.gov/ あとはマニュアルに従って手元でコンパイルするだけ (以下はLinuxの説明) 最新版ではsrcディレクトリにて ”make mpi” コマンドを叩くとコンパイルされる(環境による) ポテンシャルやコマンドによってはLAMMPSにパッケージの追加が必要 “make yes-hogehoge” のようにして入れる。現状の確認は ”make package-status” より lmp_mpiのような名前の実行ファイルができる どこからでも簡単に呼べるようPATHを通しておこう tcshユーザー: ホームの.cshrcファイルの末尾に “setenv PATH $PATH”:(置いてある場所)” bash/zshユーザー:ホームの.bashrc/.zshrcファイルの末尾に”export PATH=$PATH:(場所)”

LAMMPS 第一歩 とりあえず実行してみる いろいろ書いたファイルを入力に渡せばよい $lmp_mpi スクリプト言語のように、コマンドの入力待機状態になる 1行ずつ手書きしても動くが、間違えるとエラー出力とともに実行終了する いろいろ書いたファイルを入力に渡せばよい リダイレクトを使いましょう 実行オプション指定でも大丈夫です $lmp_mpi LAMMPS (21 Sep 2012) > $lmp_mpi < hogehoge.txt $lmp_mpi -in hogehoge.txt

LAMMPS 全体の流れ 系の初期条件の設定をする 系の実行中における条件の設定をする 実行する 計算格子に関するもの (例: ~_box) 原子に関するもの (例: ~atoms) 系の実行中における条件の設定をする 力場(ポテンシャル)の設定 (例: ~coeff) 実行中の拘束条件、計算する値等の設定 (例: fix, compute, variable) 実行する 動力学計算(run)あるいは構造最適化(minimize)

LAMMPS 最小構成 エラーの起きない最低限のスクリプト エラーなくrunまでたどり着く ただし原子数は0 init.lammps shell region region1 block 0 1 0 1 0 1 units box create_box 1 region1 mass 1 1.0 pair_style lj/cut 1.0 pair_coeff * * 1 1 run 0 $lmp_mpi < init.lammps LAMMPS (21 Sep 2012) Created orthogonal box = (0 0 0) to (1 1 1) 1 by 1 by 1 MPI processor grid WARNING: No fixes defined, atoms won't move (verlet.cpp:54) Setting up run ... Memory usage per processor = 0.451927 Mbytes Step Temp E_pair E_mol TotEng Press 0 0 0 0 0 0 Loop time of 9.53674e-07 on 1 procs for 0 steps with 0 atoms Pair time (%) = 0 (0) Neigh time (%) = 0 (0) Comm time (%) = 0 (0) Outpt time (%) = 0 (0) Other time (%) = 9.53674e-07 (100) Nlocal: 0 ave 0 max 0 min Histogram: 1 0 0 0 0 0 0 0 0 0 Nghost: 0 ave 0 max 0 min Neighs: 0 ave 0 max 0 min Total # of neighbors = 0 Neighbor list builds = 0 Dangerous builds = 0

最小構成解説 右では暗黙に設定されるものも#コメントで掲載 units: 単位系の設定 boundary: 境界条件 (p: period) init.lammps 右では暗黙に設定されるものも#コメントで掲載 units: 単位系の設定 boundary: 境界条件 (p: period) region: 領域の定義 create_box: シミュレーション空間の設置 mass, pair_****: 原子の設定 run: MD計算開始 #atom_style atomic #dimension 3 #newton on #processors * * * grid onelevel map cart #units lj #boundary p p p region region1 block 0 1 0 1 0 1 units box create_box 1 region1 mass 1 1.0 pair_style lj/cut 1.0 pair_coeff * * 1 1 run 0

原子を配置してみる Ni原子をFCC 5x5x5で並べる 右はEAMなのでポテンシャルファイルが必要 atom.lammps #atom_style atomic #dimension 3 #newton on #processors * * * grid onelevel map cart units metal #boundary p p p lattice fcc 3.5 region region1 block 0 5 0 5 0 5 units lattice create_box 1 region1 create_atoms 1 box mass 1 58.69 pair_style eam pair_coeff 1 1 Ni_u3.eam #neighbor 2.0 bin run 0 Ni原子をFCC 5x5x5で並べる 右はEAMなのでポテンシャルファイルが必要 実行する場所に該当のファイルを置けばよい ここではNi_u3.eam (Lammps内にあります) LAMMPSのバージョンによってはパッケージの追加が必要 lattice: 結晶構造を指定 (create_atomsが楽になる) create_atoms: 原子を作成 neighbor: 近隣原子のリスト作成方法(高速化に関わる)

構造最適化 構造のエネルギー最小化計算 timestep: 1ステップの時間 ms.lammps #atom_style atomic #dimension 3 #newton on #processors * * * grid onelevel map cart units metal #boundary p p p lattice fcc 3.5 region region1 block 0 5 0 5 0 5 units lattice create_box 1 region1 create_atoms 1 box mass 1 58.69 pair_style eam pair_coeff 1 1 Ni_u3.eam #neighbor 2.0 bin #neigh_modify delay 10 every 1 timestep 0.0001 thermo_style custom step etotal temp press lx vol thermo 500 fix f1 all box/relax iso 0.0 vmax 0.01 #min_style cg minimize 0.0 1.0e-20 1000 100000 #run 0 構造のエネルギー最小化計算 系のサイズなどを緩和しておく 初期状態を変な状態にしないために timestep: 1ステップの時間 thermo, thermo_style: MD実行中情報の出力設定 fix: run中に実行されるもの(系の制御) 非常に多くの種類がある。値を計算するだけのものも fix box/relax: minimizeのときのMD格子の扱い minimize: エネルギー最小化問題を解く runの特殊版のようなもの

動力学計算 fixコマンドで系の制御を決定しておく あとはrunするだけ unfix: fix取り消し md.lammps #atom_style atomic #dimension 3 #newton on #processors * * * grid onelevel map cart units metal #boundary p p p lattice fcc 3.5 region region1 block 0 5 0 5 0 5 units lattice create_box 1 region1 create_atoms 1 box mass 1 58.69 pair_style eam pair_coeff 1 1 Ni_u3.eam #neighbor 2.0 bin #neigh_modify delay 10 every 1 timestep 0.0005 thermo_style custom step etotal temp press lx vol thermo 500 fix f1 all box/relax iso 0.0 vmax 0.01 #min_style cg minimize 0.0 1.0e-20 1000 100000 unfix f1 fix f2 all nve restart 1000 out/result_md velocity all create 300 12345 dist gaussian mom yes run 10000 fixコマンドで系の制御を決定しておく fix nve: 体積・エネルギー固定。つまり何も制御しない 他にはnvt, npt, nph, あるいはfreezeなどいろいろ あとはrunするだけ 初期速度を与えておかないと0 Kのまま永久に動かない unfix: fix取り消し write_restart/restart: 計算途中ファイル出力 read_restartで読み込める fixが保存されるかは種類による velocity: 適当に初期速度付加

動力学計算 ところで、右のスクリプトは初期温度を300 Kに設定して NVEアンサンブルにてMD計算を行っている md.lammps #atom_style atomic #dimension 3 #newton on #processors * * * grid onelevel map cart units metal #boundary p p p lattice fcc 3.5 region region1 block 0 5 0 5 0 5 units lattice create_box 1 region1 create_atoms 1 box mass 1 58.69 pair_style eam pair_coeff 1 1 Ni_u3.eam #neighbor 2.0 bin #neigh_modify delay 10 every 1 timestep 0.0005 thermo_style custom step etotal temp press lx vol thermo 500 fix f1 all box/relax iso 0.0 vmax 0.01 #min_style cg minimize 0.0 1.0e-20 1000 100000 unfix f1 fix f2 all nve restart 1000 out/result_md velocity all create 300 12345 dist gaussian mom yes run 10000 ところで、右のスクリプトは初期温度を300 Kに設定して NVEアンサンブルにてMD計算を行っている しかし、実行すると系の温度は下がる おおよそ150 Kくらいになる (LAMMPSのバグではない) 理由を考えてみよう

他によく使う命令 compute: 値の計算 variable: 変数の設定 group: 原子の集合の名前付け 熱膨張算出スクリプトin.expansion.Niの例 compute: 値の計算 大量にある。系全体や原子ごとなど 様々な物性値の計算 variable: 変数の設定 computeの値、thermoの値なども使って演算ができる group: 原子の集合の名前付け dump: 何かの値のファイルへの書き出し 原子の位置を書き出して可視化ツールで見たり label, jump: いわゆるgoto文。ループもできる include: 他のスクリプトファイルを読み込む units metal atom_style atomic boundary p p p lattice fcc 3.5 region region1 block 0 5 0 5 0 5 create_box 1 region1 create_atoms 1 box variable atomname string Ni mass 1 58.69 pair_style eam pair_coeff 1 1 ${atomname}.eam neighbor 0.5 bin timestep 0.0005 thermo_style custom step etotal temp lx ke pe thermo 500 fix 1 all box/relax iso 0.0 vmax 0.01 minimize 0.0 1.0e-20 1000 100000 unfix 1 variable myTemp equal temp variable myLx equal lx fix ftemplx all ave/time 10 9999 100000 v_myTemp v_myLx file ${atomname}.templx velocity all create 50 12345 dist gaussian mom yes label thermo_loop variable i loop 30 variable envtherm equal 50*${i} fix 1 all npt temp ${envtherm} ${envtherm} 0.05 iso 0.0 0.0 0.5 run 1000000 next i jump in.expansion.${atomname} thermo_loop

コマンド: group, variable, etc. LAMMPSにはregion(空間に定義した範囲)とgroup(原子の集合)の概念がある fix, compute, variableなど定義した式それぞれにもID(名前)がつく 大多数のコマンドが2つ目に自分自身のID、3つ目に適用先のgroup IDを書くようになっている なお、原子全体を指すgroup ID “all”がはじめから定義されている variableコマンドで変数定義のようなものができる グローバル値や原子ごとの値など。例えば”ある条件に当てはまるgroup”を作るときなどに便利 実は値ではなく計算式を記憶している。そのため呼ばれるごとに計算され、毎回値が異なる (本来variableを書くのに適さない位置に)variableの値そのものが欲しいときには、”${}”で囲む そこに計算された値を直書きしたような振る舞いをする

コマンド: fix run実行中におけるほぼ全ての処理を行う 位置・速度の更新すらfixで行う(NVEやNVTなど。実装を見るとわかりやすい) そのため、fixなしだと原子が動かない(動かないよ、とWarningが出る) むしろrunコマンドの実態はfix, computeやpairによる力の計算を順次呼び出しているだけ 例として以下のようなものがある アンサンブルを決める: nve, nvt, npt 固定する、動かす、外力を加える: setforce, move 壁を作る、運動を制限する: wall, planeforce 原子を加える: append 値を計算する、出力する: ave, print

コマンド: compute MD中に様々な値を計算する 例によって計算式の定義のみで、値は必要に応じて計算される 例えば動径分布関数、原子応力など variable, fixなどと組み合わせて使える 例によって計算式の定義のみで、値は必要に応じて計算される そのため、runが終わってからcompute IDを参照するともう計算していないと文句を言われる 後で必要なら例えばfix ave/timeなどと組み合わせて(run中に計算されるようにして)使う

困ったときは エラーが出たとき やりたいことの実現方法がわからないとき LAMMPSが内部で何をしているかわからないとき エラーの文字列・これができないという文章(英語)で検索 世界のどこかで同じ悩みを持っていた人がいたかもしれない やりたいことの実現方法がわからないとき 本家マニュアル(英語) コマンド一覧のページなどから探せる LAMMPSが内部で何をしているかわからないとき 可能なら実装まで戻って読むのが早い

重い計算をしたいとき 並列計算 LAMMPSは空間分割により並列計算を行う 使うプロセス数は割り切りやすい数にしましょう -np オプションで使うコア数を指定 LAMMPSは空間分割により並列計算を行う 計算の規模が大きいほど並列計算の効率が良くなる 使うプロセス数は割り切りやすい数にしましょう 11や13でなく12で、など 余裕があれば本当に速くなるか確認してみてください $mpirun –np 10 lmp_mpi < hogehoge.txt

可視化 見えないと何が起きているかわからない 可視化はLAMMPSの外で行う おかしい…と思って可視化した瞬間に察することもよくある 一例として、Atomeyeの導入により可視化できる。別途手元にX環境(Xmingとか)を用意しておこう Atomeyeの使い方はAtomeyeのページを参照。起動しただけではわからないが結構多機能 LAMMPS側からは構造を書いたファイルを書き出すようにすればよい ちょうどAtomeye用に書き出すコマンドがある 追加で原子ごとの情報を書いておける(Atomeyeから色分けして見れる) dump d1 all cfg 10 hoge.*.cfg mass type xs ys zs v_hoge c_hoge dump_modify d1 element Ni Atomeye Webページより

MDにおいて気をつけるべきこと 扱う空間・時間スケールが非常に小さい 熱の影響が出る 非常に急峻な現象を見ている 系が平衡状態になり、初期条件の不自然さがなくなるまで緩和計算を行う必要がある (たとえ周期境界でも)計算格子は十分な大きさか検討をするべき 相変態や拡散・反応など、時間スケールの長い現象を見るときは注意が必要 熱の影響が出る 原子の一部を固定するなどの条件が妥当でないこともある 熱膨張の影響など 温度によって反応の速度が異なる、場合によっては反応の種類が変わる(溶けるなど)

MDにおいて気をつけるべきこと ポテンシャルについて 時間ステップ幅について 計算結果はポテンシャルに依存する。以下は一例。何を目的としたポテンシャルかを確認する必要がある 2体間系列: Lennard-Jones, Morseなど。分子系など他のポテンシャルと組み合わせても使われる EAM系列: 2体と異なり欠陥・表面エネルギーなどを表現できる。金属結合によく使われる Tersoff系列: 角度依存項を明示的に持ちSiやCなど共有結合の表現に使われる イオン結合: 1/rで効く性質上カットオフが長く計算が重い。他のポテンシャルとも合わせて使われる ReaxFF系列: 複雑なポテンシャル。化学反応など。 分子結合: 分子の結合を手動で定義する。(反応は見ない。)分子系 時間ステップ幅について 目安として1fs以下程度。一番短い時間スケールは格子振動(~数10THz)なのでそれが追えるくらい Hのような軽い元素があるときは注意

やってみよう: 融点の計算 単に温度を上げるだけではなかなか溶けない 界面を作り平衡状態の温度をみるという方法がある きっかけの無いところから突然融解したり凝固したりはしない 界面を作り平衡状態の温度をみるという方法がある 系の半分だけを液体にしてそれぞれ貼り合わせる

融点の計算 スクリプトの例 最後のvelocityで設定する温度は適当(界面がなくならない範囲で) units metal boundary p p p atom_style charge lattice diamond 5.3 region sim_box block 0 4 0 4 0 6 region crystal_box block 0 4 0 4 0 2 create_box 1 sim_box create_atoms 1 region sim_box group gcrystal region crystal_box group gam subtract all gcrystal mass 1 28.0855 pair_style tersoff/mod pair_coeff * * Si.tersoff.mod Si shell mkdir cfg timestep 0.0005 dump d1 all cfg 1000 cfg/melt.crystal.*.cfg mass type xs ys zs id dump_modify d1 element Si thermo 100 thermo_style custom step temp etotal pe ke lx ly lz vol press fix f1 all box/relax iso 0.0 vmax 0.001 minimize 1.0e-15 1.0e-15 1000 100000 unfix f1 variable randseed equal 10002 velocity gam create 6000.0 ${randseed} dist gaussian mom yes fix fc gcrystal setforce 0.0 0.0 0.0 fix f1 gam nvt temp 3000 3000 0.05 run 1000 fix f1 gam nvt temp 3000 1500 0.05 run 3000 unfix fc write_restart cfg/dump01 velocity all create 2200.0 ${randseed} dist gaussian mom yes fix f1 all nph iso 0.0 0.0 0.5 run 1000000

いろいろ考えるべきこと:設定編 表面 圧力 表面をつくると表面特有の現象(再構成、表面エネルギーの影響)が起きる 表面の影響がないくらい極端に大きい系を作るか、周期境界にして表面をなくす 後者がおすすめ。ただし外界とやりとりをするもの(温度や圧力)は別途考える必要がある 圧力 圧力の解放が行われているか、また行うべきか 例えば体積固定・表面のモデルなどでは解放しないほうが正しいことも

いろいろ考えるべきこと:実行時編 緩和 可視化 平衡状態になるまで計算したか 一応何が起きているか見ておきましょう 全てが固体か液体になってしまっているかもしれない ひょっとすると気体とかになってしまっているかも