void gen_xsd(propdecl_t &decl, string &xsd) { ofstream o(xsd); gen_head(o, decl); gen_body(o, decl); }
void fix_rejects(PARAMS *p) { FILE *fp; SSIO ssio; SSDATA data; int sh,sd; int rej,nRej=0,i; if (!(fp = fopen(REJECTS_FILE,"r"))) { (void) fprintf(stderr,"Unable to open \"%s\"\n",REJECTS_FILE); exit(1); } (void) fscanf(fp,"%i",&i); if (i != p->N) { (void) fprintf(stderr,"Incompatible rejects file.\n"); exit(1); } if (ssioOpen(OUTPUT_FILE,&ssio,SSIO_UPDATE)) { (void) fprintf(stderr,"Unable to open \"%s\"\n",OUTPUT_FILE); exit(1); } sh = SSHEAD_SIZE; /* NOT sizeof(SSHEAD)! XDR has special data sizes */ sd = SSDATA_SIZE; /* NOT sizeof(SSDATA)! Ditto */ (void) ssioSetPos(&ssio,sh); i = 0; while (fscanf(fp,"%i",&rej) != EOF) { if (rej >= 0) { if (i != rej) { (void) fprintf(stderr,"Corrupted rejects data.\n"); exit(1); } gen_body(p,&data,i); (void) ssioSetPos(&ssio,sh + i*sd); (void) ssioData(&ssio,&data); (void) printf("Particle %i regenerated.\n",rej); ++nRej; } ++i; } (void) ssioClose(&ssio); (void) fclose(fp); (void) printf("%i particle%s regenerated.\n",nRej,nRej==1?"":"s"); }
void generate(PARAMS *p,SSDATA *d) { double GPE,KE,f; int i,j; for (i=0;i<p->N;i++) { gen_body(p,&d[i],i); for (j=0;j<i;j++) if (OVERLAP(d[i].pos,d[i].radius,d[j].pos,d[j].radius)) { (void) printf("Particle %i overlaps particle %i\n" "-- regenerating particle %i\n",i,j,i); --i; break; } } GPE = KE = 0.0; for (i=0;i<p->N;i++) { GPE += d[i].mass*pot(p,d,i); KE += 0.5*d[i].mass*MAG_SQ(d[i].vel); } (void) printf("Starting KE = %g = %g times GPE\n",KE,KE/GPE); assert(KE > 0.0); f = -0.5*p->KEf*GPE/KE; assert(f >= 0.0); for (i=0;i<p->N;i++) reset_vel(p,f,&d[i]); GPE = KE = 0.0; for (i=0;i<p->N;i++) { GPE += d[i].mass*pot(p,d,i); KE += 0.5*d[i].mass*MAG_SQ(d[i].vel); } (void) printf("Adjusted KE = %g = %g times GPE (= %g times virial)\n",KE,KE/GPE,-2*KE/GPE); { double t_dyn,t_step; t_dyn = 2*sqrt(CUBE(p->Rd)/(p->N*p->m)); (void) printf("Dynamical time ~ %g\n",t_dyn); t_step = 2*sqrt(CUBE(p->R)/p->m)/33; (void) printf("Recommended time step < %g\n",t_step); (void) printf("Estimated number of steps needed per t_dyn = %i\n",(int) (t_dyn/t_step + 0.5)); } }