CStrAny Parse::ReadInt(CStrAny &s, int iRadix, bool bSign) { CStrAny sRes; if (bSign) sRes = ReadChars(s, g_sSign, 1); sRes >>= ReadNumerals(s, iRadix); return sRes; }
// Wait function CSR_WAIT_FUNCTION static BOOLEAN ReadCharsThread(IN PLIST_ENTRY WaitList, IN PCSR_THREAD WaitThread, IN PCSR_API_MESSAGE WaitApiMessage, IN PVOID WaitContext, IN PVOID WaitArgument1, IN PVOID WaitArgument2, IN ULONG WaitFlags) { NTSTATUS Status; PGET_INPUT_INFO InputInfo = (PGET_INPUT_INFO)WaitContext; PVOID InputHandle = WaitArgument2; DPRINT("ReadCharsThread - WaitContext = 0x%p, WaitArgument1 = 0x%p, WaitArgument2 = 0x%p, WaitFlags = %lu\n", WaitContext, WaitArgument1, WaitArgument2, WaitFlags); /* * If we are notified of the process termination via a call * to CsrNotifyWaitBlock triggered by CsrDestroyProcess or * CsrDestroyThread, just return. */ if (WaitFlags & CsrProcessTerminating) { Status = STATUS_THREAD_IS_TERMINATING; goto Quit; } /* * Somebody is closing a handle to this input buffer, * by calling ConSrvCloseHandleEntry. * See whether we are linked to that handle (ie. we * are a waiter for this handle), and if so, return. * Otherwise, ignore the call and continue waiting. */ if (InputHandle != NULL) { Status = (InputHandle == InputInfo->HandleEntry ? STATUS_ALERTED : STATUS_PENDING); goto Quit; } /* * If we go there, that means we are notified for some new input. * The console is therefore already locked. */ Status = ReadChars(InputInfo, WaitApiMessage, FALSE); Quit: if (Status != STATUS_PENDING) { WaitApiMessage->Status = Status; ConsoleFreeHeap(InputInfo); } return (Status == STATUS_PENDING ? FALSE : TRUE); }
int ReadLinkString(LinkSocket *linkSocket, LinkString *args) { /* How many characters in a string*/ int check = OK; check = check || ReadInteger(linkSocket, &(args->numberOfChars)); /*Allocate memory. Keep space for NULL*/ args->text = (char *)malloc(args->numberOfChars + 1); if(NULL == args->text) return -1; /* Memory allocation error */ /*Read them from socket. */ if(args->numberOfChars > 0) { check = check || ReadChars(linkSocket, args->text, args->numberOfChars); args->text[args->numberOfChars] = NULL; } return check; }
/*============================================================================= * READ_GADGET *=============================================================================*/ void read_gadget(FILE *icfile, float **out_x,float **out_y,float **out_z) { int i; long no_part; int massflag; char DATA[MAXSTRING]; float fdummy[3]; double ddummy[3]; double x_fac; long pid; /*================= read in GADGET IO header =================*/ if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; fprintf(stderr,"reading... %s\n",DATA); GADGET_SKIP; } GADGET_SKIP; ReadInt(icfile,&(gadget.header.np[0]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[1]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[2]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[3]),SWAPBYTES); /* number of particles in current file */ ReadInt(icfile,&(gadget.header.np[4]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[5]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[0]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[1]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[2]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[3]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[4]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[5]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.expansion),SWAPBYTES); ReadDouble(icfile,&(gadget.header.redshift),SWAPBYTES); ReadInt(icfile,&(gadget.header.flagsfr),SWAPBYTES); ReadInt(icfile,&(gadget.header.flagfeedback),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[0]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[1]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[2]),SWAPBYTES); /* total number of particles in simulation */ ReadInt(icfile,&(gadget.header.nall[3]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[4]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[5]),SWAPBYTES); ReadInt(icfile,&(gadget.header.flagcooling),SWAPBYTES); ReadInt(icfile,&(gadget.header.NumFiles),SWAPBYTES); ReadDouble(icfile,&(gadget.header.BoxSize),SWAPBYTES); ReadDouble(icfile,&(gadget.header.Omega0),SWAPBYTES); ReadDouble(icfile,&(gadget.header.OmegaLambda),SWAPBYTES); ReadDouble(icfile,&(gadget.header.HubbleParam),SWAPBYTES); ReadChars(icfile,&(gadget.header.unused[0]),SIZEOFGADGETHEADER- 6*4- 6*8- 2*8- 2*4- 6*4- 2*4 - 4*8); GADGET_SKIP; /*================= read in GADGET IO header =================*/ /* keep track of no. of particles in each GADGET file */ gadget.np[0][gadget.i_gadget_file] = gadget.header.np[0]; gadget.np[1][gadget.i_gadget_file] = gadget.header.np[1]; gadget.np[2][gadget.i_gadget_file] = gadget.header.np[2]; gadget.np[3][gadget.i_gadget_file] = gadget.header.np[3]; gadget.np[4][gadget.i_gadget_file] = gadget.header.np[4]; gadget.np[5][gadget.i_gadget_file] = gadget.header.np[5]; /* conversion factors to Mpc/h, km/sec, Msun/h */ x_fac = GADGET_LUNIT; //m_fac = GADGET_MUNIT; /* count total no. of particles in current file (and set massflag) */ massflag = 0; no_part = 0; gadget.nall = 0; for(i=0;i<6;i++) { no_part += gadget.header.np[i]; gadget.nall += gadget.header.nall[i]; if(gadget.header.massarr[i] < MZERO && gadget.header.np[i] > 0) massflag=1; } #ifdef _VERB fprintf(stderr,"expansion factor: %lf\n", gadget.header.expansion); fprintf(stderr,"redshift: %lf\n", gadget.header.redshift); fprintf(stderr,"boxsize: %lf (%lf Mpc/h)\n", gadget.header.BoxSize,gadget.header.BoxSize*GADGET_LUNIT); fprintf(stderr,"omega0: %lf\n", gadget.header.Omega0); fprintf(stderr,"lambda0: %lf\n", gadget.header.OmegaLambda); fprintf(stderr,"HubbleParam: %lf\n\n", gadget.header.HubbleParam); fprintf(stderr,"gas: np[0]=%9d\t nall[0]=%9d\t massarr[0]=%g\n",gadget.header.np[0],gadget.header.nall[0],gadget.header.massarr[0]); fprintf(stderr,"halo: np[1]=%9d\t nall[1]=%9d\t massarr[1]=%g\n",gadget.header.np[1],gadget.header.nall[1],gadget.header.massarr[1]); fprintf(stderr,"disk: np[2]=%9d\t nall[2]=%9d\t massarr[2]=%g\n",gadget.header.np[2],gadget.header.nall[2],gadget.header.massarr[2]); fprintf(stderr,"bulge: np[3]=%9d\t nall[3]=%9d\t massarr[3]=%g\n",gadget.header.np[3],gadget.header.nall[3],gadget.header.massarr[3]); fprintf(stderr,"stars: np[4]=%9d\t nall[4]=%9d\t massarr[4]=%g\n",gadget.header.np[4],gadget.header.nall[4],gadget.header.massarr[4]); fprintf(stderr,"bndry: np[5]=%9d\t nall[5]=%9d\t massarr[5]=%g\n",gadget.header.np[5],gadget.header.nall[5],gadget.header.massarr[5]); fprintf(stderr,"\n-> reading %ld/%ld particles from GADGET file #%d/%d...\n\n", no_part,gadget.nall, gadget.i_gadget_file+1, gadget.no_gadget_files); #endif /* allocate particle array (only once when reading the first file, of course!) */ if(gadget.i_gadget_file == 0) { fprintf(stderr,"-> allocating %f GB of RAM for particles\n\n",(float)(gadget.nall*3*sizeof(float))/1024./1024./1024.); if(!((*out_x)=(float *) calloc(gadget.nall, sizeof(float)))) { fprintf(stderr,"\nfailed to allocate memory for GADGET data\n"); exit(1); } if(!((*out_y)=(float *) calloc(gadget.nall, sizeof(float)))) { fprintf(stderr,"\nfailed to allocate memory for GADGET data\n"); exit(1); } if(!((*out_z)=(float *) calloc(gadget.nall, sizeof(float)))) { fprintf(stderr,"\nfailed to allocate memory for GADGET data\n"); exit(1); } } /*================= read in GADGET particles =================*/ if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; fprintf(stderr,"reading... %s",DATA); //GADGET_SKIP; GADGET_SKIP; } else { fprintf(stderr,"reading "); } GADGET_SKIP; fprintf(stderr,"(%8.2g MB) ... ",blklen/1024./1024.); for(i=0;i<no_part;i++) { /* read */ if(DGADGET) { ReadDouble(icfile,&(ddummy[0]),SWAPBYTES); ReadDouble(icfile,&(ddummy[1]),SWAPBYTES); ReadDouble(icfile,&(ddummy[2]),SWAPBYTES); } else { ReadFloat(icfile,&(fdummy[0]),SWAPBYTES); ReadFloat(icfile,&(fdummy[1]),SWAPBYTES); ReadFloat(icfile,&(fdummy[2]),SWAPBYTES); } /* get proper position in array */ pid = get_pid(i); /* storage and conversion to comoving physical units */ (*out_x)[pid] = fdummy[0] * x_fac; (*out_y)[pid] = fdummy[1] * x_fac; (*out_z)[pid] = fdummy[2] * x_fac; } fprintf(stderr,"Pos[X]=%12.6g Pos[Y]=%12.6g Pos[Z]=%12.6g ... ",(*out_x)[no_part-1],(*out_y)[no_part-1],(*out_z)[no_part-1]); GADGET_SKIP; fprintf(stderr,"(%8.2g MB) done.\n",blklen/1024./1024.); /*================= read in GADGET particles =================*/ /* massflag == 1 indicates that massarr[i] = 0 which shouldnt be the case for HALOGEN */ if(massflag==1) { fprintf(stderr,"ERROR: HALOGEN does not expect to encounter variable masses\n If needed, please, contact us to implement it\n"); exit(0); } }
/*============================================================================= * READ_GADGET *=============================================================================*/ void read_gadget(FILE *icfile) { long unsigned ipart; double tot_mass[6]; int i,j,k; long no_part; int massflag; char DATA[MAXSTRING]; float fdummy[3]; double ddummy[3]; double x_fac, v_fac, m_fac; long pid, ldummy; unsigned int idummy; /*================= read in GADGET IO header =================*/ if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; fprintf(stderr,"reading... %s\n",DATA); //GADGET_SKIP; GADGET_SKIP; } GADGET_SKIP; ReadInt(icfile,&(gadget.header.np[0]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[1]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[2]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[3]),SWAPBYTES); /* number of particles in current file */ ReadInt(icfile,&(gadget.header.np[4]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[5]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[0]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[1]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[2]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[3]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[4]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[5]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.expansion),SWAPBYTES); ReadDouble(icfile,&(gadget.header.redshift),SWAPBYTES); ReadInt(icfile,&(gadget.header.flagsfr),SWAPBYTES); ReadInt(icfile,&(gadget.header.flagfeedback),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[0]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[1]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[2]),SWAPBYTES); /* total number of particles in simulation */ ReadInt(icfile,&(gadget.header.nall[3]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[4]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[5]),SWAPBYTES); ReadInt(icfile,&(gadget.header.flagcooling),SWAPBYTES); ReadInt(icfile,&(gadget.header.NumFiles),SWAPBYTES); ReadDouble(icfile,&(gadget.header.BoxSize),SWAPBYTES); ReadDouble(icfile,&(gadget.header.Omega0),SWAPBYTES); ReadDouble(icfile,&(gadget.header.OmegaLambda),SWAPBYTES); ReadDouble(icfile,&(gadget.header.HubbleParam),SWAPBYTES); ReadChars(icfile,&(gadget.header.unused[0]),SIZEOFGADGETHEADER- 6*4- 6*8- 2*8- 2*4- 6*4- 2*4 - 4*8); GADGET_SKIP; /*================= read in GADGET IO header =================*/ //exit(0); /* keep track of no. of particles in each GADGET file */ gadget.np[0][gadget.i_gadget_file] = gadget.header.np[0]; gadget.np[1][gadget.i_gadget_file] = gadget.header.np[1]; gadget.np[2][gadget.i_gadget_file] = gadget.header.np[2]; gadget.np[3][gadget.i_gadget_file] = gadget.header.np[3]; gadget.np[4][gadget.i_gadget_file] = gadget.header.np[4]; gadget.np[5][gadget.i_gadget_file] = gadget.header.np[5]; /* conversion factors to Mpc/h, km/sec, Msun/h */ x_fac = GADGET_LUNIT; v_fac = sqrt(gadget.header.expansion); m_fac = GADGET_MUNIT; /* count total no. of particles in current file (and set massflag) */ massflag = 0; no_part = 0; gadget.nall = 0; for(i=0;i<6;i++) { no_part += gadget.header.np[i]; gadget.nall += gadget.header.nall[i]; if(gadget.header.massarr[i] < MZERO && gadget.header.np[i] > 0) massflag=1; } /* be verbose */ fprintf(stderr,"expansion factor: %lf\n", gadget.header.expansion); fprintf(stderr,"redshift: %lf\n", gadget.header.redshift); fprintf(stderr,"boxsize: %lf (%lf Mpc/h)\n", gadget.header.BoxSize,gadget.header.BoxSize*GADGET_LUNIT); fprintf(stderr,"omega0: %lf\n", gadget.header.Omega0); fprintf(stderr,"lambda0: %lf\n", gadget.header.OmegaLambda); fprintf(stderr,"HubbleParam: %lf\n\n", gadget.header.HubbleParam); fprintf(stderr,"gas: np[0]=%9d\t nall[0]=%9d\t massarr[0]=%g\n",gadget.header.np[0],gadget.header.nall[0],gadget.header.massarr[0]); fprintf(stderr,"halo: np[1]=%9d\t nall[1]=%9d\t massarr[1]=%g\n",gadget.header.np[1],gadget.header.nall[1],gadget.header.massarr[1]); fprintf(stderr,"disk: np[2]=%9d\t nall[2]=%9d\t massarr[2]=%g\n",gadget.header.np[2],gadget.header.nall[2],gadget.header.massarr[2]); fprintf(stderr,"bulge: np[3]=%9d\t nall[3]=%9d\t massarr[3]=%g\n",gadget.header.np[3],gadget.header.nall[3],gadget.header.massarr[3]); fprintf(stderr,"stars: np[4]=%9d\t nall[4]=%9d\t massarr[4]=%g\n",gadget.header.np[4],gadget.header.nall[4],gadget.header.massarr[4]); fprintf(stderr,"bndry: np[5]=%9d\t nall[5]=%9d\t massarr[5]=%g\n",gadget.header.np[5],gadget.header.nall[5],gadget.header.massarr[5]); fprintf(stderr,"\n-> reading %ld particles from GADGET file #%d/%d...\n\n", no_part, gadget.i_gadget_file+1, gadget.no_gadget_files); /* allocate particle array (only once when reading the first file, of course!) */ if(gadget.i_gadget_file == 0) { fprintf(stderr,"-> allocating %f GB of RAM for particles\n\n",(float)(gadget.nall*sizeof(struct particle_data))/1024./1024./1024.); if(!(Part=(struct particle_data *) calloc(gadget.nall, sizeof(struct particle_data)))) { fprintf(stderr,"\nfailed to allocate memory for GADGET data\n"); exit(1); } } /*================= read in GADGET particles =================*/ if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; fprintf(stderr,"reading... %s",DATA); //GADGET_SKIP; GADGET_SKIP; } else { fprintf(stderr,"reading "); } GADGET_SKIP; fprintf(stderr,"(%8.2g MB) ... ",blklen/1024./1024.); for(i=0;i<no_part;i++) { /* read */ if(DGADGET) { ReadDouble(icfile,&(ddummy[0]),SWAPBYTES); ReadDouble(icfile,&(ddummy[1]),SWAPBYTES); ReadDouble(icfile,&(ddummy[2]),SWAPBYTES); } else { ReadFloat(icfile,&(fdummy[0]),SWAPBYTES); ReadFloat(icfile,&(fdummy[1]),SWAPBYTES); ReadFloat(icfile,&(fdummy[2]),SWAPBYTES); ddummy[0] = fdummy[0]; ddummy[1] = fdummy[1]; ddummy[2] = fdummy[2]; } /* get proper position in Part[] array */ pid = get_pid(i); /* storage and conversion to comoving physical units */ Part[pid].Pos[0] = ddummy[0] * x_fac; Part[pid].Pos[1] = ddummy[1] * x_fac; Part[pid].Pos[2] = ddummy[2] * x_fac; } fprintf(stderr,"Pos[X]=%12.6g Pos[Y]=%12.6g Pos[Z]=%12.6g ... ",Part[no_part-1].Pos[X],Part[no_part-1].Pos[Y],Part[no_part-1].Pos[Z]); GADGET_SKIP; fprintf(stderr,"(%8.2g MB) done.\n",blklen/1024./1024.); /*================= read in GADGET particles =================*/ /*================= read in GADGET velocities =================*/ if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; fprintf(stderr,"reading... %s",DATA); //GADGET_SKIP; GADGET_SKIP; } else { fprintf(stderr,"reading "); } GADGET_SKIP; fprintf(stderr,"(%8.2g MB) ... ",blklen/1024./1024.); for(i=0;i<no_part;i++) { /* read */ if(DGADGET) { ReadDouble(icfile,&(ddummy[0]),SWAPBYTES); ReadDouble(icfile,&(ddummy[1]),SWAPBYTES); ReadDouble(icfile,&(ddummy[2]),SWAPBYTES); } else { ReadFloat(icfile,&(fdummy[0]),SWAPBYTES); ReadFloat(icfile,&(fdummy[1]),SWAPBYTES); ReadFloat(icfile,&(fdummy[2]),SWAPBYTES); ddummy[0] = fdummy[0]; ddummy[1] = fdummy[1]; ddummy[2] = fdummy[2]; } /* get proper position in Part[] array */ pid = get_pid(i); /* storage and conversion to comoving physical units */ Part[pid].Vel[0] = ddummy[0] * v_fac; Part[pid].Vel[1] = ddummy[1] * v_fac; Part[pid].Vel[2] = ddummy[2] * v_fac; } fprintf(stderr,"Vel[X]=%12.6g Vel[Y]=%12.6g Vel[Z]=%12.6g ... ",Part[no_part-1].Vel[X],Part[no_part-1].Vel[Y],Part[no_part-1].Vel[Z]); GADGET_SKIP; fprintf(stderr,"(%8.2g MB) done.\n",blklen/1024./1024.); /*================= read in GADGET velocities =================*/ /*================= read in GADGET id's =================*/ if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; fprintf(stderr,"reading... %s",DATA); //GADGET_SKIP; GADGET_SKIP; } else { fprintf(stderr,"reading "); } GADGET_SKIP; fprintf(stderr,"(%8.2g MB) ... ",blklen/1024./1024.); for(i=0;i<no_part;i++) { /* get proper position in Part[] array */ pid = get_pid(i); if(LGADGET) { ReadLong(icfile,&ldummy,SWAPBYTES); Part[pid].ID = ldummy; } else { ReadUInt(icfile,&idummy,SWAPBYTES); Part[pid].ID = (long) idummy; } /* check the ID range of the "halo" particles */ if(gadget.header.np[0] <= i && i < gadget.header.np[0]+gadget.header.np[1]) { if(Part[pid].ID > IDmax) IDmax = Part[pid].ID; if(Part[pid].ID < IDmin) IDmin = Part[pid].ID; } } fprintf(stderr,"ID=%12ld ... ",Part[no_part-1].ID); GADGET_SKIP; fprintf(stderr,"(%8.2g MB) done.\n",blklen/1024./1024.); /*================= read in GADGET id's =================*/ k = 0; /* massflag == 1 indicates that massarr[i] = 0 and hence need to read in particle masses */ if(massflag==1) { /*================= read in GADGET individual particle masses =================*/ if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; fprintf(stderr,"reading... %s",DATA); //GADGET_SKIP; GADGET_SKIP; } else { fprintf(stderr,"reading "); } GADGET_SKIP; fprintf(stderr,"(%8.2g MB) ... ",blklen/1024./1024.); for(i=0;i<6;i++) { tot_mass[i] = 0.; if (gadget.header.np[i] > 0 && gadget.header.massarr[i] < MZERO ) { fprintf(stderr," %d ",i); for(j=0; j<gadget.header.np[i]; j++) { /* read */ if(DGADGET) { ReadDouble(icfile,&(ddummy[0]),SWAPBYTES); } else { ReadFloat(icfile,&(fdummy[0]),SWAPBYTES); ddummy[0] = fdummy[0]; } /* get proper position in Part[] array */ pid = get_pid(k); /* store */ Part[pid].Mass = ddummy[0]; tot_mass[i] += ddummy[0]; k++; } } else { /* simply copy appropriate massarr[i] to particles */ for(j=0; j<gadget.header.np[i]; j++) { /* get proper position in Part[] array */ pid = get_pid(k); /* store */ Part[pid].Mass = gadget.header.massarr[i]; k++; } tot_mass[i] = gadget.header.np[i]*gadget.header.massarr[i]; } } GADGET_SKIP; fprintf(stderr,"(%8.2g MB) done.\n",blklen/1024./1024.); /*================= read in GADGET individual particle masses =================*/ } /* simply copy appropriate massarr[i] to particles */ else { k=0; for(i=0;i<6;i++) { for(j=0;j<gadget.header.np[i];j++) { /* get proper position in Part[] array */ pid = get_pid(k); /* store */ Part[pid].Mass = gadget.header.massarr[i]; k++; } tot_mass[i] = gadget.header.np[i]*gadget.header.massarr[i]; } } /*============ convert masses to Msun/h and set particle type ============*/ k=0; // 1. gas (no fiddling with Part[].u, please!) i=0; for(j=0; j<gadget.header.np[i]; j++) { pid = get_pid(k); Part[pid].Mass *= m_fac; k++; } // 2. all other species for(i=1; i<6; i++) { for(j=0; j<gadget.header.np[i]; j++) { /* get proper position in Part[] array */ pid = get_pid(k); Part[pid].Mass *= m_fac; Part[pid].u = -i; k++; } } /*================= read in GADGET gas particle energies =================*/ if(gadget.header.np[0] > 0) { if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; fprintf(stderr,"reading... %s",DATA); //GADGET_SKIP; GADGET_SKIP; } else { fprintf(stderr,"reading "); } GADGET_SKIP; fprintf(stderr,"(%8.2g MB) ... ",blklen/1024./1024.); for(i=0; i<gadget.header.np[0]; i++) { /* store */ if(DGADGET) { ReadDouble(icfile,&(ddummy[0]),SWAPBYTES); } else { ReadFloat(icfile,&(fdummy[0]),SWAPBYTES); ddummy[0] = fdummy[0]; } /* get proper position in Part[] array */ pid = get_pid(i); /* store additional gas particle property */ Part[pid].u = ddummy[0]; } GADGET_SKIP; fprintf(stderr,"(%8.2g MB) done.\n",blklen/1024./1024.); } /*================= read in GADGET gas particle energies =================*/ /* be verbose */ fprintf(stderr,"\n"); if(gadget.header.np[0] > 0) fprintf(stderr," gas: tot_mass[0]=%16.8g Msun/h (%16.8g Msun/h per particle)\n",tot_mass[0]*GADGET_MUNIT,tot_mass[0]/(double)gadget.header.np[0]*GADGET_MUNIT); if(gadget.header.np[1] > 0) fprintf(stderr," halo: tot_mass[1]=%16.8g Msun/h (%16.8g Msun/h per particle)\n",tot_mass[1]*GADGET_MUNIT,tot_mass[1]/(double)gadget.header.np[1]*GADGET_MUNIT); if(gadget.header.np[2] > 0) fprintf(stderr," disk: tot_mass[2]=%16.8g Msun/h (%16.8g Msun/h per particle)\n",tot_mass[2]*GADGET_MUNIT,tot_mass[2]/(double)gadget.header.np[2]*GADGET_MUNIT); if(gadget.header.np[3] > 0) fprintf(stderr," bulge: tot_mass[3]=%16.8g Msun/h (%16.8g Msun/h per particle)\n",tot_mass[3]*GADGET_MUNIT,tot_mass[3]/(double)gadget.header.np[3]*GADGET_MUNIT); if(gadget.header.np[4] > 0) fprintf(stderr," stars: tot_mass[4]=%16.8g Msun/h (%16.8g Msun/h per particle)\n",tot_mass[4]*GADGET_MUNIT,tot_mass[4]/(double)gadget.header.np[4]*GADGET_MUNIT); if(gadget.header.np[5] > 0) fprintf(stderr," bndry: tot_mass[5]=%16.8g Msun/h (%16.8g Msun/h per particle)\n",tot_mass[5]*GADGET_MUNIT,tot_mass[5]/(double)gadget.header.np[5]*GADGET_MUNIT); fprintf(stderr,"===================================================================\n"); }
CStrAny Parse::ReadWhitespace(CStrAny &s) { return ReadChars(s, g_sWhitespace); }
CStrAny Parse::ReadSign(CStrAny &s) { return ReadChars(s, g_sSign, 1); }
/*============================================================================= * READ_GADGET *=============================================================================*/ int read_gadget(FILE *icfile, float ***out_x,float ***out_y,float ***out_z, float ***out_vx,float ***out_vy,float ***out_vz,int ifile) { int i; long no_part; int massflag; char DATA[MAXSTRING]; float fdummy[3]; double ddummy[3]; double x_fac; // long pid; /*================= read in GADGET IO header =================*/ if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; fprintf(stderr,"\treading... %s\n",DATA); GADGET_SKIP; } GADGET_SKIP; ReadInt(icfile,&(gadget.header.np[0]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[1]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[2]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[3]),SWAPBYTES); /* number of particles in current file */ ReadInt(icfile,&(gadget.header.np[4]),SWAPBYTES); ReadInt(icfile,&(gadget.header.np[5]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[0]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[1]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[2]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[3]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[4]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.massarr[5]),SWAPBYTES); ReadDouble(icfile,&(gadget.header.expansion),SWAPBYTES); ReadDouble(icfile,&(gadget.header.redshift),SWAPBYTES); ReadInt(icfile,&(gadget.header.flagsfr),SWAPBYTES); ReadInt(icfile,&(gadget.header.flagfeedback),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[0]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[1]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[2]),SWAPBYTES); /* total number of particles in simulation */ ReadInt(icfile,&(gadget.header.nall[3]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[4]),SWAPBYTES); ReadInt(icfile,&(gadget.header.nall[5]),SWAPBYTES); ReadInt(icfile,&(gadget.header.flagcooling),SWAPBYTES); ReadInt(icfile,&(gadget.header.NumFiles),SWAPBYTES); ReadDouble(icfile,&(gadget.header.BoxSize),SWAPBYTES); ReadDouble(icfile,&(gadget.header.Omega0),SWAPBYTES); ReadDouble(icfile,&(gadget.header.OmegaLambda),SWAPBYTES); ReadDouble(icfile,&(gadget.header.HubbleParam),SWAPBYTES); ReadChars(icfile,&(gadget.header.unused[0]),SIZEOFGADGETHEADER- 6*4- 6*8- 2*8- 2*4- 6*4- 2*4 - 4*8); GADGET_SKIP; /*================= read in GADGET IO header =================*/ /* keep track of no. of particles in each GADGET file */ gadget.np[0][gadget.i_gadget_file] = gadget.header.np[0]; gadget.np[1][gadget.i_gadget_file] = gadget.header.np[1]; gadget.np[2][gadget.i_gadget_file] = gadget.header.np[2]; gadget.np[3][gadget.i_gadget_file] = gadget.header.np[3]; gadget.np[4][gadget.i_gadget_file] = gadget.header.np[4]; gadget.np[5][gadget.i_gadget_file] = gadget.header.np[5]; /* conversion factors to Mpc/h, km/sec, Msun/h */ x_fac = GADGET_LUNIT; //m_fac = GADGET_MUNIT; /* count total no. of particles in current file (and set massflag) */ massflag = 0; no_part = 0; gadget.nall = 0; for(i=0;i<6;i++) { no_part += gadget.header.np[i]; gadget.nall += gadget.header.nall[i]; if(gadget.header.massarr[i] < MZERO && gadget.header.np[i] > 0) massflag=1; } #ifdef VERB if (ifile==0){ fprintf(stderr,"\n\texpansion factor: %lf\n", gadget.header.expansion); fprintf(stderr,"\tredshift: %lf\n", gadget.header.redshift); fprintf(stderr,"\tboxsize: %lf (%lf Mpc/h)\n", gadget.header.BoxSize,gadget.header.BoxSize*GADGET_LUNIT); fprintf(stderr,"\tomega0: %lf\n", gadget.header.Omega0); fprintf(stderr,"\tlambda0: %lf\n", gadget.header.OmegaLambda); fprintf(stderr,"\tHubbleParam: %lf\n\n", gadget.header.HubbleParam); } #endif #ifdef DEBUG fprintf(stderr,"\n\tgas: np[0]=%9d\t nall[0]=%9d\t massarr[0]=%g\n",gadget.header.np[0],gadget.header.nall[0],gadget.header.massarr[0]); fprintf(stderr,"\thalo: np[1]=%9d\t nall[1]=%9d\t massarr[1]=%g\n",gadget.header.np[1],gadget.header.nall[1],gadget.header.massarr[1]); fprintf(stderr,"\tdisk: np[2]=%9d\t nall[2]=%9d\t massarr[2]=%g\n",gadget.header.np[2],gadget.header.nall[2],gadget.header.massarr[2]); fprintf(stderr,"\tbulge: np[3]=%9d\t nall[3]=%9d\t massarr[3]=%g\n",gadget.header.np[3],gadget.header.nall[3],gadget.header.massarr[3]); fprintf(stderr,"\tstars: np[4]=%9d\t nall[4]=%9d\t massarr[4]=%g\n",gadget.header.np[4],gadget.header.nall[4],gadget.header.massarr[4]); fprintf(stderr,"\tbndry: np[5]=%9d\t nall[5]=%9d\t massarr[5]=%g\n",gadget.header.np[5],gadget.header.nall[5],gadget.header.massarr[5]); fprintf(stderr,"\n\t-> reading %ld/%ld particles from GADGET file #%d/%d...\n\n", no_part,gadget.nall, gadget.i_gadget_file+1, gadget.no_gadget_files); #endif #ifdef DEBUG if (ifile==0) fprintf(stderr,"\t-> allocating %f GB of RAM for particles\n\n",(float)(no_part*6*sizeof(float))/1024./1024./1024.); #endif if(!((*out_x)[ifile]=(float *) calloc(no_part, sizeof(float)))) { fprintf(stderr,"\nfailed to allocate memory for GADGET data\n"); exit(1); } if(!((*out_y)[ifile]=(float *) calloc(no_part, sizeof(float)))) { fprintf(stderr,"\nfailed to allocate memory for GADGET data\n"); exit(1); } if(!((*out_z)[ifile]=(float *) calloc(no_part, sizeof(float)))) { fprintf(stderr,"\nfailed to allocate memory for GADGET data\n"); exit(1); } if(!((*out_vx)[ifile]=(float *) calloc(no_part, sizeof(float)))) { fprintf(stderr,"\nfailed to allocate memory for GADGET data\n"); exit(1); } if(!((*out_vy)[ifile]=(float *) calloc(no_part, sizeof(float)))) { fprintf(stderr,"\nfailed to allocate memory for GADGET data\n"); exit(1); } if(!((*out_vz)[ifile]=(float *) calloc(no_part, sizeof(float)))) { fprintf(stderr,"\nfailed to allocate memory for GADGET data\n"); exit(1); } /*================= read in GADGET particles =================*/ if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; if (ifile==0) fprintf(stderr,"\treading... %s",DATA); //GADGET_SKIP; GADGET_SKIP; } else { if (ifile==0) fprintf(stderr,"\treading "); } GADGET_SKIP; #ifdef DEBUG fprintf(stderr,"(%8.2g MB) ... ",blklen/1024./1024.); #endif fprintf(stderr,"Thread %d/%d\n",omp_get_thread_num(),omp_get_num_threads()); //#pragma omp barrier for(i=0;i<no_part;i++) { /* read */ if(DGADGET) { ReadDouble(icfile,&(ddummy[0]),SWAPBYTES); ReadDouble(icfile,&(ddummy[1]),SWAPBYTES); ReadDouble(icfile,&(ddummy[2]),SWAPBYTES); } else { ReadFloat(icfile,&(fdummy[0]),SWAPBYTES); ReadFloat(icfile,&(fdummy[1]),SWAPBYTES); ReadFloat(icfile,&(fdummy[2]),SWAPBYTES); } //if (i==0) // fprintf(stderr,"Thread %d/%d: nstart = %ld\n",omp_get_thread_num(),omp_get_num_threads(),pid); /* storage and conversion to comoving physical units */ (*out_x)[ifile][i] = fdummy[0] * x_fac; (*out_y)[ifile][i] = fdummy[1] * x_fac; (*out_z)[ifile][i] = fdummy[2] * x_fac; } fprintf(stderr,"\tpositions done: ifile %d\n",ifile); #ifdef DEBUG // fprintf(stderr,"Pos[X]=%12.6g Pos[Y]=%12.6g Pos[Z]=%12.6g ... ",(*out_x)[no_part-1],(*out_y)[no_part-1],(*out_z)[no_part-1]); #endif GADGET_SKIP; #ifdef DEBUG fprintf(stderr,"(%8.2g MB) done.\n",blklen/1024./1024.); #endif /*================= read in GADGET particles =================*/ /*================= read in GADGET velocities =================*/ if(FORMAT == 2) { GADGET_SKIP; fread(DATA,sizeof(char),blklen,icfile); DATA[4] = '\0'; fprintf(stderr,"reading... %s",DATA); GADGET_SKIP; } else { if (ifile==0) fprintf(stderr,"reading "); } GADGET_SKIP; if (ifile==0) fprintf(stderr,"(%8.2g MB) ... ",blklen/1024./1024.); for(i=0;i<no_part;i++) { /* read */ if(DGADGET) { ReadDouble(icfile,&(ddummy[0]),SWAPBYTES); ReadDouble(icfile,&(ddummy[1]),SWAPBYTES); ReadDouble(icfile,&(ddummy[2]),SWAPBYTES); } else { ReadFloat(icfile,&(fdummy[0]),SWAPBYTES); ReadFloat(icfile,&(fdummy[1]),SWAPBYTES); ReadFloat(icfile,&(fdummy[2]),SWAPBYTES); ddummy[0] = fdummy[0]; ddummy[1] = fdummy[1]; ddummy[2] = fdummy[2]; } (*out_vx)[ifile][i] = fdummy[0]; (*out_vy)[ifile][i] = fdummy[1]; (*out_vz)[ifile][i] = fdummy[2]; } fprintf(stderr,"\tvelocities done: ifile %d\n",ifile); /*================= read in GADGET velocities =================*/ /* massflag == 1 indicates that massarr[i] = 0 which shouldnt be the case for HALOGEN */ if(massflag==1) { fprintf(stderr,"ERROR: HALOGEN does not expect to encounter varying masses\n"); exit(0); } return no_part; }