void construct_galaxies(int halonr, int tree) { static int halosdone = 0; int prog, fofhalo, ngal; HaloAux[halonr].DoneFlag = 1; halosdone++; prog = Halo[halonr].FirstProgenitor; while(prog >= 0) { if(HaloAux[prog].DoneFlag == 0) construct_galaxies(prog, tree); prog = Halo[prog].NextProgenitor; } fofhalo = Halo[halonr].FirstHaloInFOFgroup; if(HaloAux[fofhalo].HaloFlag == 0) { HaloAux[fofhalo].HaloFlag = 1; while(fofhalo >= 0) { prog = Halo[fofhalo].FirstProgenitor; while(prog >= 0) { if(HaloAux[prog].DoneFlag == 0) construct_galaxies(prog, tree); prog = Halo[prog].NextProgenitor; } fofhalo = Halo[fofhalo].NextHaloInFOFgroup; } } // At this point, the galaxies for all progenitors of this halo have been // properly constructed. Also, the galaxies of the progenitors of all other // halos in the same FOF group have been constructed as well. We can hence go // ahead and construct all galaxies for the subhalos in this FOF halo, and // evolve them in time. fofhalo = Halo[halonr].FirstHaloInFOFgroup; if(HaloAux[fofhalo].HaloFlag == 1) { ngal = 0; HaloAux[fofhalo].HaloFlag = 2; while(fofhalo >= 0) { ngal = join_galaxies_of_progenitors(fofhalo, ngal); fofhalo = Halo[fofhalo].NextHaloInFOFgroup; } evolve_galaxies(Halo[halonr].FirstHaloInFOFgroup, ngal, tree); } }
/**@brief construct_galaxies() recursively runs the semi-analytic model. * For each halo it checks if its main progenitor has been done, then * if all the halos in the FOF of its main progenitor have been * done and then runs the SAM in the current halo. This means that * for the first time its called it will walk up the tree into the * haloes in the earliest snapshot. * * When it finds a halo that needs to be done it calls * join_galaxies_of_progenitors and evolve_galaxies. */ void construct_galaxies(int filenr, int treenr, int halonr) { static int halosdone = 0; int prog, fofhalo, ngal, cenngal, p; HaloAux[halonr].DoneFlag = 1; halosdone++; prog = Halo[halonr].FirstProgenitor; while(prog >= 0) //If halo has a progenitor { if(HaloAux[prog].DoneFlag == 0) //If progenitor hasn't been done yet construct_galaxies(filenr, treenr, prog); prog = Halo[prog].NextProgenitor; //Jump to next halo in progenitors FOF } //Now check for the progenitors of all the halos in the current FOF group fofhalo = Halo[halonr].FirstHaloInFOFgroup; //Starting at the first halo in current FOF if(HaloAux[fofhalo].HaloFlag == 0) //If it hasn't been done { HaloAux[fofhalo].HaloFlag = 1; //mark as to do while(fofhalo >= 0) //go through all the halos in current FOF { prog = Halo[fofhalo].FirstProgenitor; while(prog >= 0) //build its progenitors { if(HaloAux[prog].DoneFlag == 0) construct_galaxies(filenr, treenr, prog); prog = Halo[prog].NextProgenitor; } fofhalo = Halo[fofhalo].NextHaloInFOFgroup; //Jump to next halo in FOF } } /* At this point, the galaxies for all progenitors of this halo have been * properly constructed. Also, the galaxies of the progenitors of all other * halos in the same FOF-group have been constructed as well. We can hence go * ahead and construct all galaxies for the subhalos in this FOF halo, and * evolve them in time. */ fofhalo = Halo[halonr].FirstHaloInFOFgroup; if(HaloAux[fofhalo].HaloFlag == 1) //If it is marked as an halo to do { ngal = 0; HaloAux[fofhalo].HaloFlag = 2; cenngal = set_merger_center(fofhalo); //Find type 0 for type 1 to merge into /*For all the halos in the current FOF join all the progenitor galaxies together * ngals will be the total number of galaxies in the current FOF*/ while(fofhalo >= 0) { ngal = join_galaxies_of_progenitors(fofhalo, ngal, &cenngal); fofhalo = Halo[fofhalo].NextHaloInFOFgroup; } /*Evolve the Galaxies -> SAM! */ evolve_galaxies(Halo[halonr].FirstHaloInFOFgroup, ngal, treenr, cenngal); for (p =0;p<ngal;p++) mass_checks("Construct_galaxies #1",p); } }