Example #1
0
 def SingleParticleDerivativeVector(self, kstate, particle, t):
     #print("\n\n\nInput XYZ state: ", self.state)
     if self.interaction == False:
         rad = farts.xy2rad(kstate[particle])
     elif self.interaction == 'ClassicalNBody':
     	rad = farts.xy2rad(kstate[particle],
             	           self.SingleParticleNewtonianForce(particle, 100, self.cr))
     elif self.interation == True:
     	raise ValueError('Ambiguous interaction specification')
     r = rad[0,0]
     theta = rad[0,1]
     phi = rad[0,2]
     if(r > 999 or r < self.event_horizon+0.2):
         if particle not in self.cleanup:
             self.cleanup.append(particle)
     f = np.array(([rad[0,0],rad[1,0]],
                   [rad[0,1],rad[1,1]],
                   [rad[0,2],rad[1,2]]))
     #print("\nInput RTP state: ", f)
     rdd = (-4*pow(self.M,3) + f[0,0]*(4*pow(self.M,2) + f[0,0]*(-self.M + self.M*pow(f[0,1],2) + f[0,0]*pow(-2*self.M + f[0,0],2)*(pow(f[1,1],2) + pow(f[2,1],2)*pow(np.sin(f[1,0]),2)))))/(pow(f[0,0],3)*(-2*self.M + f[0,0]))
             
     Tdd = (-2*f[0,1]*f[1,1])/f[0,0] + np.cos(f[1,0])*pow(f[2,1],2)*np.sin(f[1,0])
     
     Pdd = (-2*(f[0,1] + (np.cos(f[1,0])/np.sin(f[1,0]))*f[0,0]*f[1,1])*f[2,1])/f[0,0]
     
     # The Kerr metric
     G = np.array([[f[0,1],rdd],
                   [f[1,1],Tdd],
                   [f[2,1],Pdd]])
     #print("\nRTP G: ",G)
     #print("G: \n", G)
     xyG = farts.G2xy(G,r,theta,phi)
     #print("\nXYZ G: ",xyG)
     #print("\nxyG: \n",xyG)
     return(xyG)
Example #2
0
 def TimeEvolve(self,nsteps,comments,write=True):
     self.cleanup = []
     self.nsteps = nsteps
     t=0
     ##Get init_state
     if self.use_state == None:
         self.cleanup = []
         self.state = np.copy(farts.make_initial_conditions2(self.start_particles,
                                                             self.M,
                                                             self.a(0)))
         self.init_state = np.copy(self.state)
         self.Nparticles = len(self.state)
     else:
         self.state = np.copy(self.init_state)
     print("Got initial conditions for {} particles".format(self.start_particles))
     
     primary = self.get_header(nsteps,comments)
     frame0 = self.get_hdu()
     
     filenum = farts.get_filenum(self.save_dir,self.start_particles)
     self.dirname = "{}/nbody_{}_{}".format(self.save_dir,self.start_particles,filenum)
     os.mkdir(self.dirname)
     os.mkdir("{}/data".format(self.dirname))
     hdulist = fits.HDUList([primary,frame0])
     total_time = 0
     savenums = nsteps/1000
     print('\n\n')
     for step in xrange(1, nsteps):
         stepstart = time.time()
         self.state = self.UpdateStateVectorRK4(t)
         framen = self.get_hdu()
         hdulist.append(framen)
         t += self.dt
         end = time.time()
         steptime = end-stepstart
         total_time += steptime
         avg = total_time/step
         perc = 100*((step+1)/nsteps)
         sys.stdout.write('\rFrame {} of {} completed ({}%).  Step: {}s, Total: {}s, Estimated time remaining: {}s. Nparticles: {}'.format(step+1,
             	                	                	           nsteps,
             	                	                	           '%0.1f'%perc,
             	                	                	           '%0.4f'%steptime,
             	                	                	           '%0.4f'%total_time,
             	                	                	           '%i'%(((avg * nsteps)+1)-total_time),
             	                	                	           '%i'%self.Nparticles))
         sys.stdout.flush()
         if step%1000 == 0:
         
             if write == True:
             	print("\nWriting to disk...")
             	fname = "{}/data/{}.fits".format(self.dirname,step)
             	hdulist.writeto(fname,clobber=True)
             	print("Frames {} - {} written at {}".format(step-1000,step,fname))
             	hdulist = fits.HDUList([primary])
             	self.fname_list.append(fname)
         
     if len(hdulist)!=1:
         print("\nWriting to disk...")
         fname = "{}/data/{}.fits".format(self.dirname,step)
         hdulist.writeto(fname,clobber=True)
         print("Frames {} written at {}".format(step+1,fname))
         self.fname_list.append(fname)
     print(self.state)