/*! \file tipsyio.cxx * \brief this file contains routines for tipsy io */ //-- TIPSY SPECIFIC IO #include "stf.h" #include "tipsy_structs.h" #include "endianutils.h" ///reads a tipsy file void ReadTipsy(Options &opt, vector &Part, const Int_t nbodies,Particle *&Pbaryons, Int_t nbaryons) { struct tipsy_dump tipsyheader; struct tipsy_gas_particle gas; struct tipsy_dark_particle dark; struct tipsy_star_particle star; Int_t count,oldcount,ngas,nstar,ndark, Ntot; double time,aadjust,z,Hubble,Hubbleflow,mtotold; double MP_DM=MAXVALUE, MP_B=MAXVALUE; int temp; Double_t mscale,lscale,lvscale,LN=1.0; Double_t posfirst[3]; fstream Ftip; #ifndef USEMPI int ThisTask=0,NProcs=1; #endif //if MPI is used, Processor zero opens the file and loads the data into a particle buffer //this particle buffer is used to broadcast data to the appropriate processor #ifdef USEMPI MPI_Status status; Particle *Pbuf; Int_t BufSize=opt.mpiparticlebufsize; Pbuf=new Particle[BufSize*NProcs]; if (ThisTask==0) Pbuf=new Particle[BufSize*NProcs]; Int_t Nlocalbuf,ibuf=0,*Nbuf; if (ThisTask==0) { Nbuf=new Int_t[NProcs]; for (int j=0;j1e-2) { cout<<"Note that atime provided != to time in tipsy file (a,t): "<0) { count=0; Ftip.open(opt.fname, ios::in | ios::binary); Ftip.read((char*)&tipsyheader,sizeof(tipsy_dump)); tipsyheader.SwitchtoBigEndian(); for (Int_t i=0;i0.0) { for (int j=0;j<3;j++) { if (gas.pos[j]-posfirst[j]>opt.p/2.0) gas.pos[j]-=opt.p; else if (gas.pos[j]-posfirst[j]<-opt.p/2.0) gas.pos[j]+=opt.p; } } if (opt.partsearchtype==PSTALL||opt.partsearchtype==PSTGAS) { #ifndef USEMPI Part[count]=Particle(gas.mass*mscale, gas.pos[0]*lscale,gas.pos[1]*lscale,gas.pos[2]*lscale, gas.vel[0]*opt.velocityinputconversion+Hubbleflow*gas.pos[0], gas.vel[1]*opt.velocityinputconversion+Hubbleflow*gas.pos[1], gas.vel[2]*opt.velocityinputconversion+Hubbleflow*gas.pos[2], count,GASTYPE); #else //if using MPI, determine ibuf, store particle in particle buffer and if buffer full, broadcast data //unless ibuf is 0, then just store locally ibuf=MPIGetParticlesProcessor(opt, gas.pos[0],gas.pos[1],gas.pos[2]); Pbuf[ibuf*BufSize+Nbuf[ibuf]]=Particle(gas.mass*mscale, gas.pos[0]*lscale,gas.pos[1]*lscale,gas.pos[2]*lscale, gas.vel[0]*opt.velocityinputconversion+Hubbleflow*gas.pos[0], gas.vel[1]*opt.velocityinputconversion+Hubbleflow*gas.pos[1], gas.vel[2]*opt.velocityinputconversion+Hubbleflow*gas.pos[2], count,GASTYPE); Nbuf[ibuf]++; if(ibuf==0){ Nbuf[ibuf]--; Part[Nlocal++]=Pbuf[ibuf*BufSize+Nbuf[ibuf]]; } else { if(Nbuf[ibuf]==BufSize) { MPI_Ssend(&Nbuf[ibuf], 1, MPI_Int_t, ibuf, ibuf+NProcs, MPI_COMM_WORLD); MPI_Ssend(&Pbuf[ibuf*BufSize],sizeof(Particle)*Nbuf[ibuf],MPI_BYTE,ibuf,ibuf,MPI_COMM_WORLD); Nbuf[ibuf] = 0; } } #endif count++; } } cout<<"Finished storing "<dark.mass) MP_DM=dark.mass; //if particle is closer do to periodicity then alter position if (opt.partsearchtype==PSTALL||opt.partsearchtype==PSTDARK) { #ifndef USEMPI Part[count]=Particle(dark.mass*mscale, dark.pos[0]*lscale,dark.pos[1]*lscale,dark.pos[2]*lscale, dark.vel[0]*opt.velocityinputconversion+Hubbleflow*dark.pos[0], dark.vel[1]*opt.velocityinputconversion+Hubbleflow*dark.pos[1], dark.vel[2]*opt.velocityinputconversion+Hubbleflow*dark.pos[2], count,DARKTYPE); #else ibuf=MPIGetParticlesProcessor(opt, dark.pos[0],dark.pos[1],dark.pos[2]); Pbuf[ibuf*BufSize+Nbuf[ibuf]]=Particle(dark.mass*mscale, dark.pos[0]*lscale,dark.pos[1]*lscale,dark.pos[2]*lscale, dark.vel[0]*opt.velocityinputconversion+Hubbleflow*dark.pos[0], dark.vel[1]*opt.velocityinputconversion+Hubbleflow*dark.pos[1], dark.vel[2]*opt.velocityinputconversion+Hubbleflow*dark.pos[2], count,DARKTYPE); Nbuf[ibuf]++; if(ibuf==0){ Nbuf[ibuf]--; Part[Nlocal++]=Pbuf[ibuf*BufSize+Nbuf[ibuf]]; } else { if(Nbuf[ibuf]==BufSize) { MPI_Ssend(&Nbuf[ibuf], 1, MPI_Int_t, ibuf, ibuf+NProcs, MPI_COMM_WORLD); MPI_Ssend(&Pbuf[ibuf*BufSize],sizeof(Particle)*Nbuf[ibuf],MPI_BYTE,ibuf,ibuf,MPI_COMM_WORLD); Nbuf[ibuf] = 0; } } #endif count++; } } cout<<"Finished storing "<0.0) { for (int j=0;j<3;j++) { if (star.pos[j]-posfirst[j]>opt.p/2.0) star.pos[j]-=opt.p; else if (star.pos[j]-posfirst[j]<-opt.p/2.0) star.pos[j]+=opt.p; } } if (opt.partsearchtype==PSTALL||opt.partsearchtype==PSTSTAR) { #ifndef USEMPI Part[count]=Particle(star.mass*mscale, star.pos[0]*lscale,star.pos[1]*lscale,star.pos[2]*lscale, star.vel[0]*opt.velocityinputconversion+Hubbleflow*star.pos[0], star.vel[1]*opt.velocityinputconversion+Hubbleflow*star.pos[1], star.vel[2]*opt.velocityinputconversion+Hubbleflow*star.pos[2], count,STARTYPE); #else ibuf=MPIGetParticlesProcessor(opt, star.pos[0],star.pos[1],star.pos[2]); Pbuf[ibuf*BufSize+Nbuf[ibuf]]=Particle(star.mass*mscale, star.pos[0]*lscale,star.pos[1]*lscale,star.pos[2]*lscale, star.vel[0]*opt.velocityinputconversion+Hubbleflow*star.pos[0], star.vel[1]*opt.velocityinputconversion+Hubbleflow*star.pos[1], star.vel[2]*opt.velocityinputconversion+Hubbleflow*star.pos[2], count,STARTYPE); Nbuf[ibuf]++; if(ibuf==0){ Nbuf[ibuf]--; Part[Nlocal++]=Pbuf[ibuf*BufSize+Nbuf[ibuf]]; } else { if(Nbuf[ibuf]==BufSize) { MPI_Ssend(&Nbuf[ibuf], 1, MPI_Int_t, ibuf, ibuf+NProcs, MPI_COMM_WORLD); MPI_Ssend(&Pbuf[ibuf*BufSize],sizeof(Particle)*Nbuf[ibuf],MPI_BYTE,ibuf,ibuf,MPI_COMM_WORLD); Nbuf[ibuf]=0; } } #endif count++; } } cout<<"Finished storing "<