私は数百万の原子のシステムを含むいくつかのMDシミュレーションを実行しています。
XYZ原子座標のリストであるファイルを生成するためのコードをいくつか作成しました。次に、原子間に結合を生成する必要があります。2つの原子が互いに一定の距離内にある場合、それは結合と見なされます。
XYZファイルの例:
1 0 0
2 0 0
7 0 0
10 0 0
9 0 0
だから私は5つの原子を持っています。距離のしきい値が2単位の場合、債券のリストは次のようになります。
1 2
3 5
4 5
(ここで、番号はXYZファイルの座標のインデックスに対応します)。
このリストを生成するための素朴なアプローチは次のとおりです。
for i = 1:numAtoms
for j = i+1:numAtoms
if distance(atom[i], atom[j]) < 2
bonds.push [i, j]
ただし、これはすぐにアルゴリズムの限界に達し、数百万の原子に対して高度に最適化されたCでも、少なくともこのプロセスを実行するのと同じくらい頻繁に遅くなります。
スペースパーティションデータ構造で私が経験したのは、フォトンマッパーを一度作成したときのkdツリーでの経験だけなので、この問題の最善の解決策が何であるかはわかりません。しかし、これに最適なものがおそらくそこにあると確信しています。
また、シミュレーションボックスは周期的です。つまり、(0.5、0、0)の原子は、2などの距離しきい値で(boxWidth --0.5、0、0)の原子に結合します。