【lammps】 neighborリストに関するエラー

## 系の状況とエラー内容

### 系の状況

以下のpackmolスクリプトで水分子集団を作成

```
tolerance 1.5
filetype pdb
output out.pdb

structure water.pdb
  number 500
 inside box 0 0 - 20 20 20
end structure
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2371660/dd982312-a2e7-35e6-18db-f5c7ddccd3e1.png)

出来た分子手集団に対し次のlammpsスクリプトを実行した。
```
units real
atom_style full
bond_style harmonic
angle_style harmonic
dihedral_style opls
improper_style harmonic
pair_style lj/cut/coul/cut 12.0
pair_modify mix geometric
special_bonds lj/coul 0.0 0.0 0.5

# ----------------- Atom Definition Section -----------------

read_data "water_12HD.data"

# ----------------- Settings Section -----------------

include "water_12HD.in.settings"


# ----------------- Charges Section -----------------

include "water_12HD.in.charges"

timestep 1
minimize 1.0e-4 1.0e-6 100 1000

fix 1 all nvt temp 300.0 300.0 100.0 
dump myDump all atom 10000 dump.lammpstrj

thermo_style custom step temp pe etotal press pzz v_GamNsurf 
thermo 100
run 100000
write_data data.last

```

### エラー内容
```
ERROR on proc 2: Neighbor list overflow, boost neigh_modify one
```

"neighborリストがオーバーフローしています。neigh_modify one の値を増やしてください。"

とのこと。

Neighborリストは、ある原子と相互作用する近接原子のリストのこと。分子動力学法では原子ごとに相互作用する原子のリストを作成することで、計算量オーダーをO(N^2)からO（N）にすることができる。
このリストがオーバーフローとはどういう状況？


## 解決方法
lammpsドキュメントのneigh_modify部分を見てみる。

>説明：
このコマンドは、ペア近傍リストの構築と使用に影響するパラメータを設定します。どのようなペア相互作用や他のコマンドが定義されているかによって、シミュレーションには1つ以上の近傍リストが必要になります。

>every、delay、check、onceオプションは、シミュレーションの実行中にリストを構築する頻度に影響します。delay設定は、前回の構築から少なくともNステップ経過するまで新しいリストを構築しないことを意味します。every設定は、（delayが経過した後）Mステップごとにリストの構築を試みることを意味します。check設定がnoの場合、delay設定とevery設定を満たす最初のステップでリストが構築されます。checkの設定がyesの場合、everyとdelayの設定により、いつビルドが行われるかが決定されますが、実際にビルドが行われるのは、前回のneighborリストビルドから少なくとも1つのアトムがneighbor skin distance（neighborコマンドで指定）の半分以上移動した場合のみです。


さらに下に行くと、

>pageオプションとoneオプションは、近傍リストにどのようにメモリを割り当てるかに影響します。ほとんどのシミュレーションでは、これらのオプションはデフォルトの設定で問題ありませんが、非常に大きな問題を実行する場合や、非常に長いカットオフを使用する場合は、これらのパラメータを調整することができます。近傍原子のインデックスは "ページ "に格納され、"ページ "が一杯になると次々に割り当てられます。各ページのサイズはページ値によって設定される。次のアトムの近傍がリストをオーバーフローする可能性がある場合、新しいページが割り当てられる。このしきい値は、LAMMPSに1つのアトムが持つことができる最大近傍数を指示する1つの値によって設定されます。”

とある。
つまり、各原子において近傍リストに入っている原子数が多くなってしまい、デフォルトで用意されていたリスト格納用のメモリがいっぱいになってしまったということらしい。確かに、今回のシミュレーションでは結構分子をミチミチに詰め込んだ初期構造を作成してしまっていた。そのせいでリストに入る原子が多くなったのだと考えられる。その証拠に、少々密度を少なくした場合は上記のエラーが起こらなくなった。


## 他の解決策
密度を下げるのが穏当な解決策だと思うが、エラーメッセージにもあるようにneigh_modify one NにおけるNの値を大きくとって十分なメモリ量を確保することでもエラーはなくなった。

```
neigh_modify one 10000
```

また、一応neighbor skin binというコマンドで近傍リスト作成時のスキン厚さを変更することでも解決したが

```
neighbor skin bin
```
Neigh_modifyの注意点の部分に次のように書かれていた。

>近傍リストの設定の選択は、LAMMPSの（並列）性能とシミュレーション結果の正しさに大きな影響を与えます。近傍リストの構築には時間がかかるため、頻度を少なくすることで計算を高速化することができます。しかし、リストの再構築頻度が低すぎると、相互作用するペアが欠落し、結果としてペアワイズ相互作用が正しくなくなる可能性があります。最適な設定は、シミュレーションされた系の特性（密度、形状、トポロジー、温度、圧力）、力場のパラメータと設定、タイムステップのサイズ、近傍リストのスキン距離など、多くの要因に依存します。デフォルトの設定は、シミュレーションの正しさを保証するために、非常に保守的な設定になっています。チェックフラグのヒューリスティックに依存し、チェックを実行するためのわずかな費用で近傍リストの再構築の回数を減らすことができます。近傍リストの特定の設定の正しさを決定することは、近傍リストの再構築がペアワイズ相互作用の計算順序を変えるという事実によって複雑になります。
"

neighborリストに関する設定はおいそれと変えてはいけないようだ。

なので、今回のようなエラーが出た場合は分子同士が近すぎる状況をなくすために密度をより小さくして初期状態を作成するのがよいと思われる。