レナードジョーンズ相互作用
レナードジョーンズ式
を r で微分し、−1 倍することで力 F が得られる。
分子直径の 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