Logo


せん断変形を行う


はじめに

この講座からは少しずつ材料力学的な内容になっていくが、それほど専門的な内容ではないので大学の教養物理学程度の知識があれば問題ないであろう。

ある材料に関してその強度の情報が必要な場合、実験装置を用いて試料を強制的に変形しその応答を調べる方法がとられることが多い。そのような変形をMDによって実現すればこれまで実験的に行ってきた研究をMDで代替できるようになる。この講座では、そのような解析に用いる変形の一つであるせん断変形をMDで行う方法を学ぶ。

せん断変形とは材料のある2つの平行な面で、例えば上下の面で、異なった横方向の力を加える種類の変形である。例えば、下の図のように材料の下部を固定し、上部を強制的に横方向に移動させる変形がせん断変形に属する。以下で、鉄の結晶をせん断変形するMDを紹介していく。





Fig. 1: せん断変形MDを行う方法


せん断変形MDの実行

このMDを行うための大まかな手続きの流れを述べると、まず鉄の結晶を絶対0度で構造緩和させ、そしてある有限温度にてアニールする。このコースを最初から順番に学んできた人は、これらを行う方法はすでに学んだはずだ。その後、上図のように試料の下部を固定し、図の黒い矢印で示されたように上部を一定の速度で移動させることによってせん断変形を実現することができる。このMDを実行するためのスクリプトがscriptディレクトリの中のbccFe_shear.lcmである。以下のコマンドラインを標準入力に入れることによりこのMDが実行される。
$work> lmp_serial -v x_lattice 25 -v y_lattice 25 -v z_lattice 25 -v max_step 5000
-in script/bccFe_shear.lcm
上のコマンドラインの-vはすでに紹介した-inと同じようにフラグの一種である。この-vフラグを使うことによって実行前にLAMMPSで使われる変数を定義することができる。この方法は1つのスクリプトで異なったケースを計算できる便利な方法なのでぜひ覚えておいて欲しい。以下で改めて説明するが、このケースではボックスのサイズが25aaは格子定数)、およびせん断変形の持続時間長さ(5000 fs)が定義されている。

LAMMPSでの計算が成功すると、workディレクトリにbccFe_shear_*.outという形式のファイルが多数できる。ただし、"*"の部分は時刻に関する情報(すなわち計算ステップ数)が入る。これのどれかをOVITOで読み込めば、この形式のファイルは全て読み込まれる。前回と同様に動画を実行すればせん断変形の様子を観察することができる。下にxz面で見た動画を置いておくので自分のと見比べて欲しい。



Video 1: せん断変形MDから得られた動画

スクリプトの説明

基本結晶を作る

さて、いつものようにスクリプトを見ていこう。まずは最初のブロックを表示する。
# variable x_lattice equal 25
# variable y_lattice equal 25
# variable z_lattice equal 25
# variable max_step equal 5000
最初の4行はコメント文でLAMMPSの実行には何も影響を与えない。ここでコメントアウトされたvariableコマンドの変数は上記のコマンドラインにおける-vフラグで定義され、値が与えられる。そのことを忘れないようにここに記述した。すなわち上の実行コマンドのように-vフラグ使うということは、上記4つのコメント文をアンコメントしてこれら4変数を定義したことと等価になる。

次のブロックを表示する。
units metal
boundary p p p
atom_style atomic
lattice bcc 2.83 orient x 1 0 0 orient y 0 1 0 orient z 0 0 1
region sim_box block 0 ${x_lattice} 0 ${y_lattice} 0 ${z_lattice} units lattice
create_box 1 sim_box
create_atoms 1 box
この部分はすでに構造緩和を行うで説明したスクリプトの最初の部分とほぼ同じなので、改めて説明の必要はないはずだ。違うところはregionコマンドにおいて変数が使われていることだけである。LAMMPSのスクリプトでは、${a}という記述は変数aを参照する時に使われる。よって、このregionコマンドは、x_latticeなどの変数が代入されて実行されたことになる。(厳密にはx_latticeで定義された文字列が代入されただけだが、結果的に数値が代入されたことと等価なので、今そのことを気にする必要はない。)このように-vフラグを使えば、LAMMPSを実行させるごとにボックスの大きさを変えたりでき、1つのスクリプトを柔軟に運用できる。

上下の面を“削る”

variable boundary_width equal 3
variable vacuum_high equal ${z_lattice}-${boundary_width}
region lower_vacuum block INF INF INF INF INF ${boundary_width} units lattice
region upper_vacuum block INF INF INF INF ${vacuum_high} INF units lattice
delete_atoms region lower_vacuum
delete_atoms region upper_vacuum
さてこの部分はちょっと複雑なので以下をじっくり読んで欲しい。1つ前のブロックにおけるboundaryコマンドでは、3方向で周期的境界条件が指定されている。これは上の図の上下の面が連続していることを意味している。よってこのままで上の図のようなせん断変形を行うと上の面の動きに下の面が引きずられてしまう。これを避けるためには、上下の面を乖離させる必要がある。そのため、上下それぞれの面を少しずつ削ることにする。それを行なっているのがこのブロックである。

最初のvariableコマンドではその削り幅boundary_width"3"と定義した。後のコマンドでわかるが数値の単位は格子定数である。よって材料サンプルの上下の面は格子定数の6倍の距離だけ離されることになりお互いの影響はなくなる。次のvariableコマンドでは削られたあとの新たな上面の位置が定義されている。

次の2つのregionコマンドは、削られる上下の領域、lower_vacuumupper_vacuumを定義している。すでに学んだがblockは領域の種類を表すキーワードでここでは直方体の空間で、続く6つの値によって具体的な領域が定義される。INFもすでに出てきたが限界の値をとることを意味している。それに続く、units latticeではregionコマンドで使われる数値の単位を格子定数に指定している。これは上で意図した通りである。

最後の2つのdelete_atoms regionコマンドは指定された領域の中の全原子を削除するコマンドで、これで上下の面を少しずつ削ることができる。

次に行く。

強制的に動かす部分を定義

variable	lower_board equal ${boundary_width}+${boundary_width}
variable	upper_board equal ${vacuum_high}-${boundary_width}
region		lower block INF INF INF INF INF ${lower_board} units lattice
region		upper block INF INF INF INF ${lower_board} INF units lattice
group		lower region lower
group		upper region upper
group		boundary union lower upper
group		mobile subtract all boundary
このコマンドブロックではFig. 1のグレーの部分、すなわち固定する底板と移動させる天板を定義する。

最初の2つのvariableコマンドは底板の一番上の位置と天板の一番下の位置を定義している。

次に底板と天板の領域をregionコマンドで定義する。この領域には上で作った真空の部分も含まれるが、もうそこには原子はないのでこの後の処理において気にする必要なない。

次の2つのgroup ... regionコマンドはregionの後に記述された領域(ここではlowerupper)内にある全ての原子をグループ化するコマンドである。

次のgroup ... unionコマンドはunionの後に記述された複数のクループを足し合わせて新たなグループを作るコマンドである。ここで底板と天板のグループを足し合わせて新たにboundaryというグループを作った。

次のgroup ... subtractコマンドはgroup ... unionの逆でグループの引き算である。ここでは全体ボックス内の全ての原子allグループからboundaryグループに属する原子を削除し、残った原子グループを新たにmobileと定義する。

なお、regiongroupは混同しやすいが、regionは空間、groupは原子の集まりと覚えておこう。

次に行く。

原子間相互作用の定義

pair_style eam/fs
pair_coeff * * ./potentials/Fe_mm.eam.fs Fe
neigh_modify every 1 delay 0 check yes
最初の2行は鉄の原子間ポテンシャルの定義であり、構造緩和を行うのところで説明したので繰り返さない。

次は、neigh_modifyコマンドであるが、1つの講座で学習することが多くならないようにこれまでこのコマンドの説明を避けてきた。この講座ではきちんと説明しよう。

実はこのコマンドの前に隠れたコマンドがあり、それを最初に説明する。それはNeighborリストの定義である。LAMMPSにおいて使われる原子間ポテンシャルではある距離より遠い原子ペアでは原子間力を無視するとするcutoff距離が定義されている。これにより不要な計算を避けることができる。逆に言えば、cutoff距離より近い原子ペアでは原子間ポテンシャルが計算される。Neighborリストとはその計算を行うペアのリストである。

ここまでは建前で、しかし現実的には、原子が移動するので、少し余裕を持たせてcutoff距離より少し離れている原子ペアも原子間ポテンシャルを計算させなければならない。この余裕のことをskinと呼ぶ。 隠れたコマンドはスクリプト全体の最初にunits metalが選ばれた場合のディフォルトはneighbor 2.0 binとなる。このコマンドの意味するところは、厚さ2.0 Angstromのskinを用いる。 また、ここで記述されたbinはネイバーリストを作るアルゴリズの種類であり詳しいことは説明しないが、興味のある受講者はSteve Plimpton氏による発表スライドのp13を参照して欲しい。

よって実際にはこのコマンドがすでに実行されている。ちなみに、skinが増えれば使用するメモリが増えるので計算中メモリがいっぱいになってしまう場合は、許される範囲でskinを薄くすることを考えてもいい。

本題のneighbor_modifyコマンドの説明にもどろう。ここでは、every "n" delay "m"は新しいNeighborリストがビルドされてからmステップ数の後、nステップ数の度にリストが更新されることを意味している。ただし、check yesはある条件を満したときのみリストを更新することを指定している。この条件とは原子の移動距離がskinに達した場合である。ディフォルトはevery 1 delay 0 check yesである。よって元々このコマンドラインは不要なのだが、ここに書いておいたのはこれらのパラメータを変えることによって計算時間を短縮できる可能性があるからだ。例えば、原子が激しく動いていない場合にはリスト更新を間引きしてもよいし、逆に原子が激しく動く場合はいちいちチェックする計算時間がもったいないのでcheck noがいいかもしれない。

以上少し細かい設定の話で辟易したかもしれない。初心者は問題がなければディフォルトの設定にしておくのが良い。次に行く。

構造緩和を行う

fix 1 all box/relax iso 0.0 vmax 0.001
thermo		200
thermo_style custom step pe lx ly lz press
min_style cg
minimize 1.e-25 1.0e-12 10000 50000
unfix 1
fix ... box/relaxコマンドは体積緩和を行うためのコマンドで、すでに習った。

次のthermoコマンドは系の熱力学的変数を計算するインターバルを指定するコマンドであり、200計算ステップごとにそれらの変数が計算されその結果が標準出力に出力されることになる。

次のthermo_style customコマンドはその標準出力への出力フォーマットを定義する。この例ではstep(シミュレーションステップ)、pe(全ポテンシャルエネルギー)、lx ly lz(ボックスの3方向のサイズ)、press(圧力)が表示されるようになる。

次のmin_styleコマンドとminimizeコマンドは構造緩和を行うのところで出てきたので説明を繰り返さない。

次のunfixコマンドもすでに学んだ。これはfixコマンドが使われてその役目を終えた時、それを無効化する手続きである。ここでは構造緩和の計算が終了したのでこのブロック先頭のfix ... box/rescaleコマンドを無効化している。

次のブロックに行く。

アニーリングを行う

variable set_temp equal 10.
velocity 	mobile create ${set_temp} 1582775
fix		1 all nve
fix		2 boundary setforce 0.0 0.0 0.0
fix		3 mobile temp/rescale 10 ${set_temp} ${set_temp} 0.1 1.0
reset_timestep 	0
run 		1000
このスクリプト部分では底板と天板に挟まれたmobileグループに属する原子群を設定温度でアニールする。

次のvariableコマンドではset_tempという変数を定義し"10"を代入している。

次のvelocity ... createコマンドはアニーリングを行うですでに述べたが温度を設定するためのコマンドである。ここではmobileグループの原子群にset_tempで定義された温度(K)を入れている。mobileグループは底板と天板に挟まれた場所にある原子群である。

次のfix ... nveコマンドは系全体(すなわちallグループ)を原子数一定、体積一定、エネルギー一定で(すなわちミクノカノニカルアンサンブルで)時間積分を行うことを指定している。お分かりと思うが、ここでは計算法を指定しただけで、実際の計算はまだ始まらない。

次のfix ... setforceコマンドは原子間力を強制的に与えるためのコマンドで底板と天板を合わせたboundaryグループでは原子間力が消滅する。すでに述べたが、これらの部分の原子の運動は原子間ポテンシャルによって決まるのではなく強制的に固定したり動かしたりする部分なのでこのような設定にしておく。材料変形のMDでは、このように強制的に原子群を固定したり動かしたりする場面が出てくるが、その時このfix ... setforceコマンドが大いに役に立つだろう。ここでfixコマンドの識別子が"2"になっていることに注目しよう。fixコマンドは複数実行することができ、識別子によって区別される。無論、同じ識別子を持つ2つ以上のfixコマンドを同時に実行することはできない。

次のfix ... temp/rescaleコマンドはアニーリングを行うで既出であるので詳しい説明はしないが、温度調整がmobileグループだけになっている。これは原子間ポテンシャルによって有限温度で時間発展するのがmobileグループだけだからである。

次のreset_timestepコマンドもすでに説明したが、シミュレーションの時間ステップを初期化している。実は何もしなくても最初は時刻"0"に初期化されるので、このコマンドは必要ないのだが、スクリプトの意図を明確にするために書いておいても良い。

さてここまで準備ができて、やっとアニールをrunコマンドで実行する。ここでは計算の負荷を減らすために1000ステップ(1 ps)の長さにしてあるが、本来ならこの100倍の100 ps程度にした方が良いだろう。これでmobileグループの中の原子がアニーリングされることになる。ただ、fix ... setforceコマンドによってFig. 1の上下のグループは動かないので、boundaryグループ原子がmobileグループの中に入り込んだり、その逆の現象も起きない。

次に行こう。

せん断変形を行う

velocity	upper set 0.1 0. 0.
reset_timestep 	0
dump 		1 all custom 200 bccFe_shear_*.out id type xs ys zs
run		${max_step}
これがスクリプトの最後の部分である。まずvelocity ... setコマンドだが、前出のvelocity ... createととは異なって指定されたグループに一様な速度を与えるコマンドである。最初の引数のupperは速度が与えられるグループで、Fig. 1の天板に属する原子群である。setに続く3つの数字はそれぞれ(x,y,z)方向の速度である。速度の単位だが、スクリプトの最初でunits metalが宣言されたいるのでAngstrom/psになる。

次のreset_timestepコマンドはすでに説明した。この場合は時刻はすでに1000ステップ(1 ps)まで進んでいるので"0"にしたい場合は省略することはできない。

次のdumpコマンドもこれまでの説明からほぼ理解できるだろう。これまでと違う点はファイル名に"_*"という部分を加えたことである。これまではdumpコマンドで出力されたファイルは1つのファイルであったが、この方法だと1つのファイルのサイズが大きくなりすぎる場合がある。今回のようにすると、上で見たようにbccFe_shear_0.outから200ステップ刻みで複数のファイルができることになり、1個のファイルが大きくなるのを防ぐことができる。

そして最後のrunコマンドで上の標準入力へのコマンドラインで指定された時間長さだけシミュレーションが行われる。これでスクリプトの説明は終わりだ。このスクリプトに限らないが、おおよその内容がわかったらパラメータを変化させて様々なケースを行なうと理解が進むだろう。

構造緩和とアニーリングを行った後、興味ある現象のMDを行うという流れはよく使うので、今回のスクリプトは様々なスクリプトの雛形となるだろう。



目次へ 前はアニーリングを行う 次は引っ張り変形を行う