#!/usr/bin/env python
from pylab import *
import arraydef ReadGadgetICFile(filename):# Reads an initial conditions file
class ICfile:
pass
icfile = ICfile()
file = open(filename,"rb")
icfile.header = ReadGadgetHeader(file) # Header data
icfile.data = ReadGadgetData(file, icfile.header,1)
file.close()
return icfile
def ReadGadgetHeader(file): # Reads the header of the snapshot or IC file
class HeadData:
pass
header=HeadData()
header.blocksize = array.array("i")
header.Npart = array.array("I")
header.Massarr = array.array("d")
header.Time = array.array("d")
header.Redshift = array.array("d")
header.FlagSfr = array.array("i")
header.FlagFeedback = array.array("i")
header.Nall = array.array("i")
header.FlagCooling = array.array("i")
header.NumFiles = array.array("i")
header.BoxSize = array.array("d")
header.Omega0 = array.array("d")
header.OmegaLambda = array.array("d")
header.HubbleParam = array.array("d")
header.FlagAge = array.array("i")
header.FlagMetals = array.array("i")
header.NallHW = array.array("i")
header.flag_entr_ics = array.array("i")
header.unused = array.array("i")
header.blocksize.fromfile(file,1)
header.Npart.fromfile(file,6)
header.Massarr.fromfile(file,6)
header.Time.fromfile(file,1)
header.Redshift.fromfile(file,1)
header.FlagSfr.fromfile(file,1)
header.FlagFeedback.fromfile(file,1)
header.Nall.fromfile(file,6)
header.FlagCooling.fromfile(file,1)
header.NumFiles.fromfile(file,1)
header.BoxSize.fromfile(file,1)
header.Omega0.fromfile(file,1)
header.OmegaLambda.fromfile(file,1)
header.HubbleParam.fromfile(file,1)
header.FlagAge.fromfile(file,1)
header.FlagMetals.fromfile(file,1)
header.NallHW.fromfile(file,6)
header.flag_entr_ics.fromfile(file,1)
header.unused.fromfile(file,15)
header.blocksize.fromfile(file,1)
return header
def ReadGadgetData(file,header,filetype):
# Reads the data (position, velocity, mass, ...)
# filetype=0->snapshot file, filetype=1->IC file
class Data:
pass
data=Data()
Npart=header.Npart
Massarr=header.Massarr
Ngas=header.Npart[0]
N=0
for i in range(6):
N = N+Npart[i]
Nm=0
for i in range(6):
if Massarr[i]==0:
Nm = Nm+Npart[i]
data.blocksize = array.array("i")
data.pos = array.array("f")
data.vel = array.array("f")
data.id = array.array("i")
data.masses = array.array("f")
data.u = array.array("f")
data.rho = array.array("f")
if header.FlagCooling[0]==1:
data.ne = array.array("f")
data.np = array.array("f")
data.hsml = array.array("f")
data.blocksize.fromfile(file,1)
data.pos.fromfile(file,3*N)
data.blocksize.fromfile(file,1)
data.blocksize.fromfile(file,1)
data.vel.fromfile(file,3*N)
data.blocksize.fromfile(file,1)
data.blocksize.fromfile(file,1)
data.id.fromfile(file,N)
data.blocksize.fromfile(file,1)
if Nm!=0:
data.blocksize.fromfile(file,1)
data.masses.fromfile(file,Nm)
data.blocksize.fromfile(file,1)
if Ngas!=0:
data.blocksize.fromfile(file,1)
data.u.fromfile(file,Ngas)
data.blocksize.fromfile(file,1)
if filetype==0:
data.blocksize.fromfile(file,1)
data.rho.fromfile(file,Ngas)
data.blocksize.fromfile(file,1)
if header.FlagCooling[0]==1:
data.blocksize.fromfile(file,1)
data.ne.fromfile(file,Ngas)
data.blocksize.fromfile(file,1)
data.blocksize.fromfile(file,1)
data.np.fromfile(file,Ngas)
data.blocksize.fromfile(file,1)
data.blocksize.fromfile(file,1)
data.hsml.fromfile(file,Ngas)
data.blocksize.fromfile(file,1)
return data
icfile = ReadGadgetICFile('bullet.dat')
id = 17
print "Particle # %d has mass %f, position (%f,%f,%f), and velocity (%f,%f,%f)"%(icfile.data.id[id], icfile.data.masses[id], icfile.data.pos[id], icfile.data.pos[id+1], icfile.data.pos[id+2], icfile.data.vel[id], icfile.data.vel[id+1], icfile.data.vel[id+2])