LJ相互作用

レナードジョーンズ相互作用

レナードジョーンズ式

 \displaystyle U(r) = 4 \varepsilon \left\{ \left( \frac{\sigma}{r} \right)^{12} - \left( \frac{\sigma}{r} \right)^6 \right\}  

r で微分し、−1 倍することで力 F が得られる。

 \displaystyle F(r) = 4 \varepsilon \left\{ 6 \left( \frac{\sigma^{12}}{r^{13}} \right) - 6\left( \frac{\sigma^6}{r^7} \right) \right\}  

分子直径の 0.9 倍より近づいたときに前項の弾性衝突処理を、
0.9 ~ 10 倍の範囲の時に LJ 相互作用が働くようにする。

    #他の粒子との衝突処理
    def interact(self):
        for n in range(0, ballnum): #他(自分自身のレプリカを含む)の粒子の相互作用を計算する
            for ix in range(-1, 2): #ix= -1, 0, 1
                for iy in range(-1, 2): #iy = -1, 0, 1
                    if ix==0 and iy==0 and self.id==n: #自分自身との相互作用は計算しない
                        pass
                    else:
                        ox = ball[n].x+ix*grtor(width) #相手のx座標
                        oy = ball[n].y+iy*grtor(height) #相手のy座標

                        dx = ox-self.x #相対位置
                        dy = oy-self.y

                        dvx = ball[n].vx-self.vx #相対速度
                        dvy = ball[n].vy-self.vy

                        r = math.sqrt(dx**2.0+dy**2.0) #距離
                        rn = r/(ball[n].r+self.r) #規格化した距離

                        if(rn < 0.9): #衝突半径より近い
                                #弾性衝突ルーチン
                                pass

                        elif(rn<10.0): #衝突半径の10倍より近い
                            #LJ相互作用
                            rsig = (self.r+ball[n].r)/2.0 #ローレンツベルテロ則
                            reps = math.sqrt(self.eps*ball[n].eps)

                            f = 24.0*reps/r*(2.0*rn**(-12.0)-rn**(-6.0)) #Fを算出
                            fx = f*dx/r #x成分とy成分に分ける
                            fy = f*dy/r

                            self.vx -= fx/self.m*t_scale #速度を変更
                            self.vy -= fy/self.m*t_scale