Example #1
0
File: kd.c Project: N-BodyShop/fof
void kdOutGTP(KD kd,char *pszFile,int bStandard)
{
	FILE *fp;
	GROUP_STAT *grp;
	int pi,i,j;
	struct dump h;
	struct star_particle sp;
	double d,d2;
	XDR xdrs;

	fp = fopen(pszFile,"w");
	assert(fp != NULL);
	grp = malloc(kd->nGroup*sizeof(GROUP_STAT));
	assert(grp != NULL);
	for (i=1;i<kd->nGroup;++i) {
		for (j=0;j<3;++j) grp[i].r[j] = 0.0;
		for (j=0;j<3;++j) grp[i].v[j] = 0.0;
		grp[i].m = 0.0;
		grp[i].rm = 0.0;
		}
	for (pi=0;pi<kd->nActive;++pi) {
		i = kd->p[pi].iGroup;
		if (!i) continue;
		for (j=0;j<3;++j) {
		    grp[i].rel[j] = kd->p[pi].r[j];
			}
		}
	for (pi=0;pi<kd->nActive;++pi) {
		i = kd->p[pi].iGroup;
		if (!i) continue;
		grp[i].m += kd->p[pi].fMass;
		for (j=0;j<3;++j) {
			d = kd->p[pi].r[j] - grp[i].rel[j];
			if (d > 0.5*kd->fPeriod[j]) d -= kd->fPeriod[j];
			if (d <= -0.5*kd->fPeriod[j]) d += kd->fPeriod[j];
			grp[i].r[j] += kd->p[pi].fMass*d;
			}
		for (j=0;j<3;++j) grp[i].v[j] += kd->p[pi].fMass*kd->p[pi].v[j];
		}
	for (i=1;i<kd->nGroup;++i) {
		for (j=0;j<3;++j) {
			grp[i].r[j] /= grp[i].m;
			grp[i].r[j] += grp[i].rel[j];
			if (grp[i].r[j] > kd->fCenter[j]+0.5*kd->fPeriod[j])
				grp[i].r[j] -= kd->fPeriod[j];
			if (grp[i].r[j] <= kd->fCenter[j]-0.5*kd->fPeriod[j])
				grp[i].r[j] += kd->fPeriod[j];
			}
		for (j=0;j<3;++j) grp[i].v[j] /= grp[i].m;
		}
	for (pi=0;pi<kd->nActive;++pi) {
		i = kd->p[pi].iGroup;
		if (!i) continue;
		d2 = 0.0;
		for (j=0;j<3;++j) {
			 d = kd->p[pi].r[j] - grp[i].r[j]; 
			 if (d > 0.5*kd->fPeriod[j]) d -= kd->fPeriod[j];
			 if (d <= -0.5*kd->fPeriod[j]) d += kd->fPeriod[j];
			 d2 += d*d;
			 }
		if (d2 > grp[i].rm) grp[i].rm = d2;
		}
	h.time = kd->fTime;
	h.nbodies = kd->nGroup-1;
	h.nsph = 0;
	h.ndark = 0;
	h.nstar = h.nbodies;
	h.ndim = 3;
	
	if (bStandard) {
		assert(sizeof(Real)==sizeof(float)); /* Else this XDR stuff
							ain't gonna work */
		xdrstdio_create(&xdrs, fp, XDR_ENCODE);
		xdrHeader(&xdrs,&h);
	        }
	else {
		fwrite(&h,sizeof(struct dump),1,fp);
	        }
	for (i=1;i<kd->nGroup;++i) {
		sp.mass = grp[i].m;
		for (j=0;j<3;++j) sp.pos[j] = grp[i].r[j];
		for (j=0;j<3;++j) sp.vel[j] = grp[i].v[j];
		sp.eps = sqrt(grp[i].rm);
		sp.tform = kd->fTime;
		sp.metals = 0.0;
		sp.phi = 0.0;
		if (bStandard) {
			xdr_vector(&xdrs, (char *) &sp,
				   sizeof(struct star_particle)/sizeof(Real),
				   sizeof(Real), (xdrproc_t)xdr_float);
		        }
		else {
			fwrite(&sp,sizeof(struct star_particle),1,fp);
		        }
		}
	if (bStandard) xdr_destroy(&xdrs);
	free(grp);
	fclose(fp);
	}
Example #2
0
File: kd.c Project: N-BodyShop/fof
void kdReadTipsy(KD kd,FILE *fp,int bDark,int bGas,int bStar,int bStandard)
{
	int i,j,nCnt;
	struct dump h;
	struct gas_particle gp;
	struct dark_particle dp;
	struct star_particle sp;
	XDR xdrs;

	if (bStandard) {
	    assert(sizeof(Real)==sizeof(float)); /* Otherwise, this XDR stuff
						    ain't gonna work */
	    xdrstdio_create(&xdrs, fp, XDR_DECODE);
	    xdrHeader(&xdrs,&h);
	} else {
	    fread(&h,sizeof(struct dump),1,fp);
	}
	kd->nParticles = h.nbodies;
	kd->nDark = h.ndark;
	kd->nGas = h.nsph;
	kd->nStar = h.nstar;
	kd->fTime = h.time;
	kd->nActive = 0;
	if (bDark) kd->nActive += kd->nDark;
	if (bGas) kd->nActive += kd->nGas;
	if (bStar) kd->nActive += kd->nStar;
	kd->bDark = bDark;
	kd->bGas = bGas;
	kd->bStar = bStar;
	/*
	 ** Allocate particles.
	 */
	kd->p = (PARTICLE *)malloc(kd->nActive*sizeof(PARTICLE));
	assert(kd->p != NULL);
	/*
	 ** Read Stuff!
	 */
	nCnt = 0;
	for (i=0;i<h.nsph;++i) {
		if (bStandard) {
			xdr_vector(&xdrs, (char *) &gp,
				   sizeof(struct gas_particle)/sizeof(Real),
				   sizeof(Real), (xdrproc_t)xdr_float);
		} else {
			fread(&gp,sizeof(struct gas_particle),1,fp);
		}
		if (bGas) {
			kd->p[nCnt].iOrder = nCnt;
			kd->p[nCnt].fMass = gp.mass;
			for (j=0;j<3;++j) kd->p[nCnt].r[j] = gp.pos[j];
			for (j=0;j<3;++j) kd->p[nCnt].v[j] = gp.vel[j];
			++nCnt;
		}
	}
	for (i=0;i<h.ndark;++i) {
		if (bStandard) {
			xdr_vector(&xdrs, (char *) &dp,
				   sizeof(struct dark_particle)/sizeof(Real),
                       sizeof(Real), (xdrproc_t)xdr_float);
		} else {
		    fread(&dp,sizeof(struct dark_particle),1,fp);
		}
		if (bDark) {
			kd->p[nCnt].iOrder = nCnt;
			kd->p[nCnt].fMass = dp.mass;
			for (j=0;j<3;++j) kd->p[nCnt].r[j] = dp.pos[j];
			for (j=0;j<3;++j) kd->p[nCnt].v[j] = dp.vel[j];
			++nCnt;
		}
	}
	for (i=0;i<h.nstar;++i) {
		if (bStandard) {
			xdr_vector(&xdrs, (char *) &sp,
				   sizeof(struct star_particle)/sizeof(Real),
				   sizeof(Real), (xdrproc_t)xdr_float);
		} else {
			fread(&sp,sizeof(struct star_particle),1,fp);
		}
		if (bStar) {
			kd->p[nCnt].iOrder = nCnt;
			kd->p[nCnt].fMass = sp.mass;
			for (j=0;j<3;++j) kd->p[nCnt].r[j] = sp.pos[j];
			for (j=0;j<3;++j) kd->p[nCnt].v[j] = sp.vel[j];
			++nCnt;
		}
	}
	if (bStandard) xdr_destroy(&xdrs);
}
Example #3
0
struct dump kdReadTipsy(KD kdg, KD kds, KD kdd, char *filename, int bStandard, int bSmbh, int bAux)
{
        PINIT *pg, *pd, *ps;
	int i,j;
	struct dump h;
	struct gas_particle gp;
	struct dark_particle dp;
	struct star_particle sp;
	float *fTimeForm, *fMassForm, *fTimeCoolIsOffUntil, *fNSN, *fMFracOxygen, *fMFracIron, *HI, *HeI, *HeII;
	long *iGasOrder;
	XDR xdrs;
	FILE *fp;
	
	if (kdg->bOutDiag) puts(">> kdReadTipsy()");
	fflush(stdout);
	
	if(fp = fopen(filename,"r"));
	else {
	  fprintf(stderr, "file \'%s\' not found - exiting promptly\n", filename);
	  exit(-1);
	}
	   

	if (bStandard) {
	    assert(sizeof(Real)==sizeof(float)); /* Otherwise, this XDR stuff
						    ain't gonna work */
	    xdrstdio_create(&xdrs, fp, XDR_DECODE);
	    xdrHeader(&xdrs,&h);
	    }
	else {
	    fread(&h,sizeof(struct dump),1,fp);
	    }

	/* 
	** Initialize and allocate arrays for the gas kd
	*/

	kdg->nDark = h.ndark;
	kdg->nGas = h.nsph;
	kdg->nStar = h.nstar;
	kdg->fTime = h.time;
	kdg->inType = GAS;

	kdg->nParticles = kdg->nGas;   // ONLY CONSIDERING GAS IN THIS CASE
	kdg->nInitActive = kdg->nParticles; 
	
	kdg->pInit = (PINIT *)malloc(kdg->nParticles*sizeof(PINIT));
	assert(kdg->pInit != NULL);
	
	/* 
	** Initialize and allocate arrays for the dark matter kd
	*/

	kdd->nDark = h.ndark;
	kdd->nGas = h.nsph;
	kdd->nStar = h.nstar;
	kdd->fTime = h.time;
	kdd->inType = DARK;
	
	kdd->nParticles = kdd->nDark;   // ONLY CONSIDERING DM IN THIS CASE
	kdd->nInitActive = kdd->nParticles; 
	
	kdd->pInit = (PINIT *)malloc(kdd->nParticles*sizeof(PINIT));
	assert(kdd->pInit != NULL);
	
	/* 
	** Initialize and allocate arrays for the stars kd
	*/
	
	kds->nDark = h.ndark;
	kds->nGas = h.nsph;
	kds->nStar = h.nstar;
	kds->fTime = h.time;
	kds->inType = STAR;
	
	kds->nParticles = kds->nStar;   // ONLY CONSIDERING STARS IN THIS CASE
	kds->nInitActive = kds->nParticles; 
	
	kds->pInit = (PINIT *)malloc(kds->nParticles*sizeof(PINIT));
	assert(kds->pInit != NULL);
	
	
	printf("nDark:%d nGas:%d nStar:%d\n",kdg->nDark,kdg->nGas,kdg->nStar);
	fflush(stdout);
	
	pg = kdg->pInit;
	ps = kds->pInit;
	pd = kdd->pInit;
  

	/*
	 ** Read Stuff!
	 */


	/* Read in the auxiliary files */

	if(bAux) {
	  fTimeCoolIsOffUntil = kdReadFloatArray(filename,0,"coolontime");
	  fTimeForm           = kdReadFloatArray(filename, 0, "timeform");
	  fMassForm           = kdReadFloatArray(filename, 0, "massform");
	  fNSN                = kdReadFloatArray(filename, 0, "ESNRate");
	  fMFracOxygen        = kdReadFloatArray(filename, 0, "OxMassFrac");
	  fMFracIron          = kdReadFloatArray(filename, 0, "FeMassFrac");
	  iGasOrder           = kdReadLongArray(filename, 0, "igasorder");
	  HI                  = kdReadFloatArray(filename, 0, "HI");
	  HeI                 = kdReadFloatArray(filename, 0, "HeI");
          HeII                = kdReadFloatArray(filename, 0, "HeII");
	}
	  
	for(i=0;i<kdg->nParticles;i++){
	  pg[i].iOrder = i;
	  pg[i].fDensity = 0.0;
	  if (bStandard) {
	    xdr_vector(&xdrs, (char *) &gp, 12,
		       sizeof(Real), (xdrproc_t) xdr_float);
	  }
	  else {
	    fread(&gp,sizeof(struct gas_particle),1,fp);
	  }
	  pg[i].fMass = gp.mass;
	  pg[i].fSoft = gp.hsmooth;
	  pg[i].fTemp = gp.temp;
	  pg[i].fMetals = gp.metals;
	  for (j=0;j<3;++j) {
	    pg[i].r[j] = gp.pos[j];
	    pg[i].v[j] = gp.vel[j];
	  }
	  
	  if(bAux) {
	    pg[i].fTimeCoolIsOffUntil = fTimeCoolIsOffUntil[i];
	    pg[i].fNSN                = fNSN[i];
	    pg[i].fMFracOxygen        = fMFracOxygen[i];
	    pg[i].fMFracIron          = fMFracIron[i];
	    pg[i].iGasOrder           = iGasOrder[i];
	    pg[i].CoolParticle.Y_HI   = HI[i];
	    pg[i].CoolParticle.Y_HeI  = HeI[i];
	    pg[i].CoolParticle.Y_HeII = HeII[i];
	  }
	}

	for(i=0;i<kdd->nParticles;i++){
	  if (bStandard) {
	    xdr_vector(&xdrs, (char *) &dp, 9,
		       sizeof(Real), (xdrproc_t) xdr_float);
	  }
	  else {
	    fread(&dp,sizeof(struct dark_particle),1,fp);
	  }
	  pd[i].fMass = dp.mass;
	  pd[i].fSoft = dp.eps;
	  pd[i].fTemp = 0.0;
	  for (j=0;j<3;++j) {
	    pd[i].r[j] = dp.pos[j];
	    pd[i].v[j] = dp.vel[j];
	  }
	}
	
	for(i=0;i<kds->nParticles;i++){
	  if (bStandard) {
	    xdr_vector(&xdrs, (char *) &sp, 11,
		       sizeof(Real), (xdrproc_t) xdr_float);
	  }
	  else {
	    fread(&sp,sizeof(struct star_particle),1,fp);
	  }
	  ps[i].fMass = sp.mass;
	  ps[i].fSoft = sp.eps;
	  ps[i].fTemp = 0.0;
	  ps[i].fMetals = sp.metals;
	  ps[i].fTimeForm = sp.tform;
	  for (j=0;j<3;++j) {
	    ps[i].r[j] = sp.pos[j];
	    ps[i].v[j] = sp.vel[j];
	  }
	  
	}
	
	if (bStandard) xdr_destroy(&xdrs);
	
	
	
	

	kdcofm(kdg, kdd, kds, bSmbh);
	
	if (kdg->bOutDiag) puts("<< kdReadTipsy()");
	fflush(stdout);
	fclose(fp);
	return h;
}