2016-10-31 4 views
0

私は2つの異なる種の粒子衝突をモデリングしています。私はクラスを使用して、各スペーや粒子の位置と速度を保持する配列のクラスを定義しています。クラスpythonで定義された配列の要素を入れ替えます。

衝突iが

クラスは次のように別のファイルに定義されている種Bの粒子の速度で種Aの粒子の速度を交換する必要が生じる。

class Particle(object): 
    def __init__(self,num): 
     self.x=numpy.zeros((num,1)) #Position 
     self.v=numpy.zeros((num,3)) #Velocity 

class Species(object): 
    def __init__(self): 
     self.mass=[] 
     self.spwt=[] 
     self.np=[] 
     self.np_alloc=[] 
     self.part=[] 

種ですメインファイルで作成された:

#variables to hold species 
A = struct.Species() 
B = struct.Species() 

#set species data 
A.mass = 1  
A.np = 0 
A.spwt=spwt 
A.np_alloc = num 
A.part = struct.Particle(A.np_alloc) 


B.mass = 1  
B.np = 0 
B.spwt=spwt 
B.np_alloc = int(cloud_den/spwt/cloud_len) 
B.part = struct.Particle(B.np_alloc) 

と私は、粒子

のために速度を交換しようとすると、
print A.part.v[p1] 
print B.part.v[p2] 

A.part.v[p1],B.part.v[p2]=B.part.v[p2],A.part.v[p1] 

print A.part.v[p1] 
print B.part.v[p2] 

出力は次のとおりです。

[ 1000. 0. 0.] 
[ 0. 0. 0.] 
[ 0. 0. 0.] 
[ 0. 0. 0.] 

答えて

0

問題は、クラス内の要素を交換するのではなく、numpyのに関連しています。あなたが作る

A.part.v[p1] 

あなたは、配列のビューを作成しています。代わりにコピーを作成する必要があります:

c = numpy.copy(A.part.v[p1]) 
A.part.v[p1] = B.part.v[p2] 
B.part.v[p2] = c 

これは動作するはずです。

多分、スワップを実行するためのより多くの方法がありますが、それはうまくいくはずです。

関連する問題