前回イオントラップシミュレーションにて、分子動力学のopenGLを使った可視化を行った。この処理にかかるほぼすべての時間はクーロン力計算の箇所であり、各粒子同士の計算が必要となる。粒子数をN個とすると、計算量は1ステップあたりNC2回が必要となる。methodの様な高速化の方法も用いることができない。今回はこのイオントラップにおけるクーロン力計算の高速化を検討してみたいと思う。高速化対象のコードだけを抜き出してきたのが下記。"__main__":init_lattice()find_pair()上記コードの処理時間は手元の環境で約8.18[sec](10回実行した平均)このコードのfind_pair関数内のitertools箇所を下記の様にシンプルにforループを2重で処理する様書き替えた場合が下記。dz/(r*r*r)上記コードの処理時間は約7.93[sec](10回実行した平均)。itertoolsを使った方が高速になるのかなと思ってたけど、シンプルにforの2重ループの方が高速な結果になった。次に、forループ範囲をrangeコマンドで作っているのを、xrangeに変更してみる。rangeは内部でリストを生成してから要素参照するのに対して、xrangeはリストを作らず要素参照するらしい。dz/(r*r*r)上記コードで約7.89[sec](10回実行した平均)。気持ち速くなった程度だった。今回は粒子数15^3個で試しているが、数を増やしたら効果が出てくるかもしれない。最後、numpyを使ってみる。しても上手い使い方が思い浮かばず、forループの中の演算を無理矢理numpyを使った処理に書き替えた。(vvv/r3)上記コードで約78.46[sec](10回実行した平均)。多重ループの内周で、何度も実行されるような場所にnumpyの処理を配置するととんでもなく遅くなる。遅くなるとは思っていたが予想以上の重さ。78.46あと考えられる手法はスレッド化。これはまた今度試してみたいと思う。コメントをキャンセルメールアドレスが公開されることはありません。最近の投稿ある点(x,y)が多角形の内部にあるかどうかを判定するアルゴリズムボロノイ図を使いポリゴン図形の中に中心線を引くpolygonを形成する頂点列からボロノイ図を作成する頂点列で表すPolygonを構成する長いエッジに対しエッジ分割し、頂点を追加する。