summaryrefslogtreecommitdiff
path: root/sortParticles.f90
diff options
context:
space:
mode:
Diffstat (limited to 'sortParticles.f90')
-rw-r--r--sortParticles.f9053
1 files changed, 53 insertions, 0 deletions
diff --git a/sortParticles.f90 b/sortParticles.f90
new file mode 100644
index 0000000..d69ffef
--- /dev/null
+++ b/sortParticles.f90
@@ -0,0 +1,53 @@
+subroutine makeNR(nr,in)
+ integer :: particle,sector,nr(0:b*b),in(n)
+ nr = 0
+ do particle=1,n
+ sector=indexfxn(x(particle),y(particle))
+ if(sector.eq.b*b) is_tracked(particle)=.False.
+ in(particle)=sector
+ nr(sector)=nr(sector)+1
+ end do
+ return
+end subroutine makeNR
+
+subroutine order(x,y,vx,vy,x0,y0,vhx,vhy,lim)
+! Order the list of positions by sector and find starting and final index for each sector
+! In: x and y coordinates and velocities. Out: ordered lists x, y, vx and vy and array lim with one row
+! for each sector, first column is start index, second is end index so that particles lim(k,1) through lim(k,2) reside in sector k.
+integer :: lim(0:b*b,2),in(n),nr(0:b*b),ct(0:b*b),k
+double precision :: x(n),y(n),d1(n),d2(n),d3(n),d4(n),d5(n),d6(n),d7(n),d8(n),vx(n),vy(n),x0(n),y0(n),vhx(n),vhy(n)
+
+call makeNR(nr,in)
+
+! Set loop limits based on the number of particles in each sector
+lim(0,1)=1
+lim(0,2)=nr(0)
+
+do k=1,b*b
+ lim(k,1)=lim(k-1,2)+1
+ lim(k,2)=lim(k-1,2)+nr(k)
+end do
+
+! Re-order particle list
+d1=x
+d2=y
+d3=vx
+d4=vy
+d5=x0
+d6=y0
+d7=vhx
+d8=vhy
+ct=0
+do k=1,n
+ x(lim(in(k),1)+ct(in(k)))=d1(k)
+ y(lim(in(k),1)+ct(in(k)))=d2(k)
+ vx(lim(in(k),1)+ct(in(k)))=d3(k)
+ vy(lim(in(k),1)+ct(in(k)))=d4(k)
+ x0(lim(in(k),1)+ct(in(k)))=d5(k)
+ y0(lim(in(k),1)+ct(in(k)))=d6(k)
+ vhx(lim(in(k),1)+ct(in(k)))=d7(k)
+ vhy(lim(in(k),1)+ct(in(k)))=d8(k)
+ ct(in(k))=ct(in(k))+1
+end do
+
+end subroutine order