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)
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)