Beispiel #1
0
int main(int argc, char **argv)
{
  double s1;
  int i, irank, nrank;

  ARGC = argc;
  ARGV = argv;

  OUTPUT=0;
  if(argc==1)
    endrun("./QPM.mock qpm.bat_file > output");

  read_parameter_file(argv[1]);

  SIGMA_8Z0 = SIGMA_8;
  SIGMA_8 = SIGMA_8*growthfactor(REDSHIFT);
  fprintf(stdout,"SIGMA_8(Z=%.2f)= %.3f\n",REDSHIFT,SIGMA_8);
  RESET_COSMOLOGY++;

  if(argc>2)
    {
      if(atoi(argv[2])==999)
	test();
      else
	SUBFRAC = atof(argv[2]);
    }
  
  if(Task.create_halos)
    create_lognormal_halos();
  if(Task.populate_simulation)
    populate_simulation_hod();
  exit(0);

}
Beispiel #2
0
/******************************************************************
 *
 * HOD.free[] also controls which variables will be held constant/vary
 * during MCMC minimization. Since this routine will also so z-space
 * minimization if requested, indices>6 are cosmological.
 *
 *  i     variable
 * ---    --------
 * [1] ->  M_min
 * [2] ->  M1
 * [3] ->  alpha
 * [4] ->  M_cut
 * [5] ->  sigmaM
 * [6] ->  CVIR_FAC
 * [7] ->  MaxCen (or M_cen_max)
 * [8] ->  M_sat_break
 * [9] ->  alpha1
 *
 * [10]->  OMEGA_M
 * [11]->  SIGMA_8
 * [12]->  VBIAS
 * [13]->  VBIAS_C
 * [14]->  GAMMA
 * [15]->  SPECTRAL_INDX
 * [16]->  HUBBLE PARAMETER [used for P(k)]
 *
 * [0] -> The galaxy_density will be considered data with errors on it,
 *         and therefore no variable will be fixed by the galaxy density.
 * 
 */
void m2n_mcmc()
{
  double stepfac=1;
  double error=1,tolerance=0,**cov1,**tmp,*a,*avg1,chi2,chi2prev,
    **evect,*eval,*aprev,*atemp,**tmp1,*opar,x1,fsat,**chain,*start_dev,*eval_prev;
  int n,i,j,k,nrot,niter=0,count=0,imax_chain=100000,NSTEP=50,NSTEP_MAX=10000,convergence=0;
  long IDUM=-555;

  int *pcheck,pcnt,ptot=20,firstflag=1,*iweight,total_weight;
  double t0,tprev,temp,chi2a,chi2b;

  double delta_halo_rhoc = 200;

  int icvir;

  //test_pdf();

  // initialize use of SYSTEMATIC ERROR
  USE_ERRORS = 1;
  M2N.IDUM = -5555;
  
  // fix the value of OEMGA_M fot T(k)
  M2N.fix_omegam = 0;
  M2N.constant_omegam = 0.27;

  opar=dvector(1,100);

  MCMC=Task.MCMC;

  pcheck=calloc(ptot,sizeof(int));

  /* Since we're at constant halo overdensity wrt RHO_CRIT,
   * set the overdensity of the halo
   */
  H2OFZ = 0.27*pow(1.25,3.0)+0.73;
  DELTA_HALO = delta_halo_rhoc/OMEGA_M*(OMEGA_M*1.25*1.25*1.25 + (1-OMEGA_M))/(1.25*1.25*1.25);

  /* read in the wp data for a single luminosity threshold sample.
   */
  wp_input();

  /* read in the M2N data.
   */
  m2n_input();
  //input_maxbcg_counts();

  Work.imodel=2;
  Work.chi2=1;


  srand48(32498793);

  /* Find the number of free parameters in the minimization
   * for the real-space correlation function.
   */
  for(n=0,i=1;i<100;++i)
    {
      n+=HOD.free[i];
      /* if(i>N_HOD_PARAMS && HOD.free[i])MCMC=3;*/
      if(OUTPUT)
	printf("mcmc_min> free[%i] = %d\n",i,HOD.free[i]);
    }
  if(USE_ERRORS)
    n+=3;
  if(USE_VARIABLE_ROZO)
    n+=3;
  wp.ncf=n;

  /* Find out which free parameter is for CVIR_FAC
   */
  j=0;
  if(HOD.free[6])
    for(i=0;i<6;++i)
      if(HOD.free[i])j++;
  icvir=j+1;

  if(HOD.free[0])
    {
      wp.ngal = GALAXY_DENSITY;
      wp.ngal_err = 0.1*wp.ngal;
      FIX_PARAM = 0;
    }

  if(OUTPUT)
    printf("mcmc_min> %d  free parameters\n",n);

  a=dvector(1,n);
  start_dev=dvector(1,n);
  aprev=dvector(1,n);
  atemp=dvector(1,n);
  cov1=dmatrix(1,n,1,n);
  avg1=dvector(1,n);

  tmp=dmatrix(1,n,1,n);
  tmp1=dmatrix(1,n,1,1);
  evect=dmatrix(1,n,1,n);
  eval=dvector(1,n);
  eval_prev=dvector(1,n);

  chain=dmatrix(1,imax_chain,1,n);
  iweight = ivector(1,imax_chain);
  for(i=1;i<=imax_chain;++i)
    iweight[i] = 0;

  IDUM=IDUM_MCMC;

  chi2prev=m2n_initialize(a,cov1,avg1,start_dev);
  niter++;
  for(i=1;i<=n;++i)
    {
      aprev[i] = a[i];
      chain[1][i] = a[i];
    }

  pcnt=0;
  pcheck[pcnt]=1;

  stepfac=1;
  while(niter<NSTEP)
    {
      pcnt++;
      if(pcnt==ptot)
	{
	  for(j=i=0;i<ptot;++i)j+=pcheck[i];
	  stepfac = stepfac*pow(0.9,5-j);
	  if(!ThisTask)printf("STEPFAC %f %d %d\n",stepfac,j,count);
	  pcnt=0;
	}
      stepfac=0.7;
      for(i=1;i<=n;++i)
	a[i] = (1+gasdev(&IDUM)*start_dev[i]*stepfac)*aprev[i];

      
      if(MCMC>1)
	{
	  RESET_COSMOLOGY++;
	  j=0;
	  for(i=1;i<=N_HOD_PARAMS;++i)if(HOD.free[i])j++;
	  i=N_HOD_PARAMS;
	  if(HOD.free[++i])OMEGA_M         = a[++j];
	  if(HOD.free[++i])SIGMA_8         = a[++j];
	  if(HOD.free[++i])VBIAS           = a[++j];
	  if(HOD.free[++i])VBIAS_C         = a[++j];
	  if(HOD.free[++i])GAMMA           = a[++j];
	  if(HOD.free[++i])SPECTRAL_INDX   = a[++j];
	  if(HOD.free[++i])HUBBLE          = a[++j];
	}
      if(VBIAS_C<0)continue;

      if(USE_ERRORS)
	{
	  M2N.mf_amp = a[++j];
	  M2N.bias_amp = a[++j];
	  M2N.scalebias_amp = a[++j];
	}
      if(USE_VARIABLE_ROZO)
	{
	  alpha_rozo = a[++j];
	  B_rozo = a[++j];
	  sig_rozo = a[++j];
	}

      /* Hard-wire CVIR variation
       */
      if(HOD.free[6])
	CVIR_FAC = a[icvir];

      /* Since we're at constant halo overdensity wrt RHO_CRIT,
       * set the overdensity of the halo
       */
      DELTA_HALO = delta_halo_rhoc/OMEGA_M*(OMEGA_M*1.25*1.25*1.25 + (1-OMEGA_M))/(1.25*1.25*1.25);

      // Check to see if any of our parameters are out of range.
      if(parameter_out_of_range(a)){ muh(1); continue; }

 
      /* Draw random value of cvir from prior.
       */
      /* if(CVIR_FAC<0.3 || CVIR_FAC>1.2)continue; */
      /* CVIR_FAC = 0.9*drand48()+0.3;  */
      /* GAMMA = gasdev(&IDUM)*0.02 + 0.15; */


      chi2=m2n_chi2_wp_wrapper(a);
      // reset cosmology for z=0.25
      SIGMA_8 = SIGMA_8*growthfactor(0.25);
      RESET_COSMOLOGY++;
      if(MCMC>1 && chi2<1.0E7)chi2+= chi2a = chi2_m2n();
      if(MCMC>1 && chi2<1.0E7)chi2+= chi2b = chi2_number_profiles();

      if(!ThisTask){
	printf("TRY %d ",++count);
	for(i=1;i<=n;++i)
	  printf("%.4e ",a[i]);
	printf("%e\n",chi2);fflush(stdout);
      }
      pcheck[pcnt]=1;
      if(!(chi2<chi2prev || drand48() <= exp(-(chi2-chi2prev)/2)))
	{
	  /* This for loop puts the prev element in the chain is
	   * the current trial point is rejected.
	   */

	  /* For the initialization, don't use this: we need
	   * separate elements for estimating the covariance matrix.
	   */
	  /*
	  for(i=1;i<=n;++i)
	    a[i] = aprev[i];
	  chi2 = chi2prev;
	  */
	  if(USE_IWEIGHT)
	    iweight[niter+1]++;
	  pcheck[pcnt]=0;
	  continue;
	  
	}

      niter++;
      iweight[niter]++;

      for(i=1;i<=n;++i)
	chain[niter][i]=a[i];
      for(i=1;i<=n;++i)
	avg1[i] += a[i];
      for(i=1;i<=n;++i)
	aprev[i] = a[i];
      for(i=1;i<=n;++i)
	for(j=1;j<=n;++j)
	  cov1[i][j] += a[i]*a[j];
      chi2prev=chi2;

      if(!ThisTask){
	printf("ACCEPT %d %d ",niter,count);
	for(i=1;i<=n;++i)
	  printf("%e ",a[i]);
	printf("%e %e %e %e\n",chi2,chi2a,chi2b,chi2-chi2a-chi2b);fflush(stdout);
	printf("HSTATS %d %e %e %e %e\n",niter,HOD.M_min,number_weighted_halo_mass(),
	       number_weighted_central_mass(),
	       qromo(func_satellite_density,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY);

	fsat = qromo(func_satfrac,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY;
	printf("FSAT %d %e %e %e %e\n",niter,fsat,HOD.M_min,HOD.sigma_logM,qromo(func_galaxy_bias,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY);
      }

    }

  stepfac=1.6/sqrt(n);
  pcnt=-1;
  t0 = second();

  NSTEP = niter;

  while(niter<imax_chain)
    {
      pcnt++;
      if(pcnt==ptot)
	{
	  for(j=i=0;i<ptot;++i)j+=pcheck[i];
	  stepfac=1.6/sqrt(n);
	  if(!ThisTask)printf("STEPFAC %f %d %d\n",stepfac,j,count);
	  pcnt=0;
	}
      stepfac=1.6/sqrt(n)*1.2;

      if(convergence)goto SKIP_MATRIX;

      for(j=1;j<=n;++j)
	{
	  avg1[j]=0;
	  for(k=1;k<=n;++k)
	    cov1[j][k]=0;
	}
      total_weight = 0;
      for(i=1;i<=niter;++i)
	{
	  for(j=1;j<=n;++j)
	    {
	      avg1[j]+=chain[i][j]*iweight[i];
	      for(k=1;k<=n;++k)
		cov1[j][k]+=chain[i][j]*chain[i][k]*iweight[i];
	    }
	  total_weight+=iweight[i];
	}

      for(i=1;i<=n;++i)
	for(j=1;j<=n;++j)
	  tmp[i][j] = cov1[i][j]/total_weight - avg1[i]*avg1[j]/(total_weight*total_weight);

      jacobi(tmp,n,eval,evect,&nrot);
      gaussj(evect,n,tmp1,1);

    SKIP_MATRIX:
      for(i=1;i<=n;++i)
	atemp[i] = gasdev(&IDUM)*sqrt(eval[i])*stepfac;

      for(i=1;i<=n;++i)
	for(a[i]=0,j=1;j<=n;++j)
	  a[i] += atemp[j]*evect[j][i];

      for(i=1;i<=n;++i) 
	a[i] += aprev[i];

      /* We seem to be having a problem with this.
       * So, broadcast the model params from the root processor.
       */
#ifdef PARALLEL      
      MPI_Bcast(&a[1],n,MPI_DOUBLE_PRECISION,0,MPI_COMM_WORLD);
#endif

      if(MCMC>1)
	{
	  RESET_COSMOLOGY++;
	  j=0;
	  for(i=1;i<=N_HOD_PARAMS;++i)if(HOD.free[i])j++;
	  i=N_HOD_PARAMS;
	  if(HOD.free[++i])OMEGA_M         = a[++j];
	  if(HOD.free[++i])SIGMA_8         = a[++j];
	  if(HOD.free[++i])VBIAS           = a[++j];
	  if(HOD.free[++i])VBIAS_C         = a[++j];
	  if(HOD.free[++i])GAMMA           = a[++j];
	  if(HOD.free[++i])SPECTRAL_INDX   = a[++j];
	  if(HOD.free[++i])HUBBLE          = a[++j];
	}
      if(VBIAS_C<0)continue;

      if(USE_ERRORS)
	{
	  M2N.mf_amp = a[++j];
	  M2N.bias_amp = a[++j];
	  M2N.scalebias_amp = a[++j];
	}
      if(USE_VARIABLE_ROZO)
	{
	  alpha_rozo = a[++j];
	  B_rozo = a[++j];
	  sig_rozo = a[++j];
	}
      
      /* Hard-wire CVIR variation
       */
      if(HOD.free[6])
	CVIR_FAC = a[icvir];

      /* Since we're at constant halo overdensity wrt RHO_CRIT,
       * set the overdensity of the halo
       */
      DELTA_HALO = delta_halo_rhoc/OMEGA_M*(OMEGA_M*1.25*1.25*1.25 + (1-OMEGA_M))/(1.25*1.25*1.25);

      // Check to see if any of our parameters are out of range.
      if(parameter_out_of_range(a))continue;


      /* Draw random value of cvir from prior.
       */
      /* CVIR_FAC = a[n]; */
      /* if(CVIR_FAC<0.3 || CVIR_FAC>1.2)continue; */
      /* CVIR_FAC = 0.7*drand48()+0.3; */
      /* GAMMA = gasdev(&IDUM)*0.02 + 0.15; */
      //      printf("GAMMA %d %f %f\n",count+1,GAMMA,CVIR_FAC);

      chi2=m2n_chi2_wp_wrapper(a);
      // reset cosmology for z=0.25
      SIGMA_8 = SIGMA_8*growthfactor(0.25);
      RESET_COSMOLOGY++;
      if(MCMC>1 && chi2<1.0E7)chi2 += chi2a = chi2_m2n();
      if(MCMC>1 && chi2<1.0E7)chi2 += chi2b = chi2_number_profiles();

      tprev = t0;
      t0 = second();
      ++count;
      if(!ThisTask) {
	printf("TRY %d ",count);
	for(i=1;i<=n;++i)
	  printf("%.4e ",a[i]);
	if(RESTART==2) {
	  printf("%e %e %.2f\n",chi2,chi2/(1+exp(-count/100.0)),
		 timediff(tprev,t0));fflush(stdout); }
	else {
	  printf("%e %.2f\n",chi2,
		 timediff(tprev,t0));fflush(stdout); }
      }
      if(0) {
	printf("CPU%02d %d ",ThisTask,count);
	for(i=1;i<=n;++i)
	  printf("%.4e ",a[i]);
	if(RESTART==2) {
	  printf("%e %e %.2f\n",chi2,chi2/(1+exp(-count/100.0)),
		 timediff(tprev,t0));fflush(stdout); }
	else {
	  printf("%e %.2f\n",chi2,
		 timediff(tprev,t0));fflush(stdout); }
      }

      pcheck[pcnt]=0;
      if(!(chi2<chi2prev || drand48() <= exp(-(chi2-chi2prev)/2)))
	{
	  /*
	  for(i=1;i<=n;++i)
	    a[i] = aprev[i];
	  chi2 = chi2prev;
	  */
	  if(USE_IWEIGHT)
	    iweight[niter+1]++;
	  continue;
	}
      pcheck[pcnt]=1;

      //      if(NSTEP<NSTEP_MAX)NSTEP++;
      niter++;
      if(!convergence)NSTEP = niter;
      iweight[niter]++;

      if(niter%NSTEP_MAX==0 && !convergence && niter>NSTEP_MAX)
	{
	  convergence = 1;
	  for(i=1;i<=n;++i)
	    {
	      x1=fabs(eval[i]-eval_prev[i])/eval_prev[i];
	      if(x1>0.01)convergence = 0;
	      printf("CONVERGENCE CHECK %d %d %e %e %e\n",niter/NSTEP_MAX,i,x1,eval[i],eval_prev[i]);
	    }
	  for(i=1;i<=n;++i)
	    eval_prev[i] = eval[i];
	  convergence = 0;

	  if(convergence)
	    printf("CONVERGENCE ACCOMPLISHED %d %d \n",niter,count);	    
	}
      if(niter==NSTEP_MAX)
	{
	  for(i=1;i<=n;++i)
	    eval_prev[i] = eval[i];
	}


      for(i=1;i<=n;++i)
	chain[niter][i]=a[i];
      for(i=1;i<=n;++i)
	avg1[i] += a[i];
      for(i=1;i<=n;++i)
	aprev[i] = a[i];
      for(i=1;i<=n;++i)
	for(j=1;j<=n;++j)
	  cov1[i][j] += a[i]*a[j];
      chi2prev=chi2;

      if(!ThisTask) {
	printf("ACCEPT %d %d ",niter,count);
	for(i=1;i<=n;++i)
	  printf("%e ",a[i]);
	printf("%e %e %e %e\n",chi2,chi2a,chi2b,chi2-chi2a-chi2b);fflush(stdout);
	
	if(MCMC==1)
	  {
	    printf("HSTATS %d %e %e %e %e\n",niter,HOD.M_min,number_weighted_halo_mass(),
		   number_weighted_central_mass(),
		   qromo(func_satellite_density,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY);
	    
	    fsat = qromo(func_satfrac,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY;
	    printf("FSAT %d %e %e %e %e\n",niter,fsat,HOD.M_min,HOD.sigma_logM,qromo(func_galaxy_bias,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY);
	  }
      }

    }
}
Beispiel #3
0
double m2n_initialize(double *a, double **cov1, double *avg1, double *start_dev)
{
  int i,j=0;
  double x1,x2,omega_m;
  long IDUM = -556;

  omega_m = 1;
  //if(MCMC>1)
  //omega_m = OMEGA_M;

  i=0;j=0;
  if(HOD.free[++i]){ a[++j]=log10(HOD.M_min/omega_m);start_dev[j]=0.001; }
  if(HOD.free[++i]){ a[++j]=log10(HOD.M1/omega_m);start_dev[j]=0.001; } //.0005
  if(HOD.free[++i]){ a[++j]=HOD.alpha;start_dev[j]=0.03; } //.005
  if(HOD.free[++i]){ a[++j]=log10(HOD.M_cut/omega_m);start_dev[j]=0.01; } //.001
  if(HOD.free[++i]){ a[++j]=log10(HOD.sigma_logM);start_dev[j]=0.01; }
  if(HOD.free[++i]){ a[++j]=CVIR_FAC;start_dev[j]=0.02; }
  if(HOD.pdfc==7) {
    if(HOD.free[++i])a[++j]=log10(HOD.M_cen_max/omega_m); start_dev[j]=0.001; }
  else {
    if(HOD.free[++i])a[++j]=HOD.MaxCen; start_dev[j]=0.02; }
  if(HOD.free[++i]){ a[++j]=log10(HOD.M_sat_break/omega_m);start_dev[j]=0.001; }
  if(HOD.free[++i]){ a[++j]=HOD.alpha1;start_dev[j]=0.02; }

  if(MCMC>1)
    {
      if(HOD.free[++i])a[++j]=OMEGA_M;
      if(HOD.free[++i])a[++j]=SIGMA_8;
      if(HOD.free[++i])a[++j]=VBIAS;
      if(HOD.free[++i])a[++j]=VBIAS_C;
      if(HOD.free[++i])a[++j]=GAMMA;
       if(HOD.free[++i])a[++j]=SPECTRAL_INDX;
       if(HOD.free[++i])a[++j]=HUBBLE;
    }
  if(USE_ERRORS)
    {
      a[++j]=1;
      a[++j]=1;
      a[++j]=1;
    }
  if(USE_VARIABLE_ROZO)
    {
      a[++j] = alpha_rozo0;
      a[++j] = B_rozo0;
      a[++j] = sig_rozo0;
    }

  if(!ThisTask)
    {
      printf("INITIAL VALUES: ");
      for(i=1;i<=wp.ncf;++i)printf("%e ",a[i]);
      printf("\n");
    }

  for(i=1;i<=wp.ncf;++i)
    {
      avg1[i]=a[i];
      for(j=1;j<=wp.ncf;++j)
	cov1[i][j]=a[i]*a[j];
    }

  if(MCMC>1)
    {
      RESET_COSMOLOGY++;
      j=0;
      for(i=1;i<=N_HOD_PARAMS;++i)if(HOD.free[i])j++;
      i=N_HOD_PARAMS;
      if(HOD.free[++i]){ OMEGA_M = a[++j]; start_dev[j] = 0.01; } 
      if(HOD.free[++i]){ SIGMA_8 = a[++j]; start_dev[j] = 0.01; } 
      if(HOD.free[++i]){ VBIAS   = a[++j]; start_dev[j] = 0.01; } 
      if(HOD.free[++i]){ VBIAS_C = a[++j]; start_dev[j] = 0.02; } 
      if(HOD.free[++i]){ GAMMA   = a[++j]; start_dev[j] = 0.015; } 
      if(HOD.free[++i]){ SPECTRAL_INDX    = a[++j]; start_dev[j] = 0.02; }
      if(HOD.free[++i]){ HUBBLE    = a[++j]; start_dev[j] = 0.02; }
    }

  if(USE_ERRORS)
    {
      M2N.bias_amp = a[++j]; start_dev[j] = 0.01;
      M2N.mf_amp = a[++j]; start_dev[j] = 0.01;
      M2N.scalebias_amp = a[++j]; start_dev[j] = 0.02;
    }
  if(USE_VARIABLE_ROZO)
    {
      alpha_rozo = a[++j]; start_dev[j] = 0.01;
      B_rozo = a[++j]; start_dev[j] = 0.01; 
      sig_rozo = a[++j]; start_dev[j] = 0.01;
    }

  x1=m2n_chi2_wp_wrapper(a);
  // reset cosmology for z=0.25
  SIGMA_8 = SIGMA_8*growthfactor(0.25);
  RESET_COSMOLOGY++;
  if(MCMC>1 && x1<1.0E7)x1+=chi2_m2n();
  if(MCMC>1 && x1<1.0E7)x1+=chi2_number_profiles();
  
  if(!ThisTask) {
    printf("TRY 0 ");
    for(i=1;i<=wp.ncf;++i)
      printf("%.4e ",a[i]);
    printf("%e\n",x1+x2);fflush(stdout);
    printf("INITIAL CHI2: %e\n",x1);
    fflush(stdout);
  }
  return(x1);
}
Beispiel #4
0
int main(int argc, char **argv)
{
    double s1, delta_vir, omega_m, x;
    int i, j;
    FILE *fp;

#ifdef PARALLEL
    printf("STARTING>>>\n");
    fflush(stdout);
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &ThisTask);
    MPI_Comm_size(MPI_COMM_WORLD, &NTask);
    printf("TASK %d reporting for duty.\n",ThisTask);
    fflush(stdout);
#endif

    ARGC = argc;
    ARGV = argv;

    OUTPUT=0;
    HOD.fredc = HOD.freds = 1.0;

    for(i=1; i<=99; ++i)
        HOD.free[i]=0;
    wp.esys=0;

    Work.chi2=0;
    Work.imodel=1;

    USE_ERRORS = 0;
    ITRANS=4;
    HUBBLE=0.7;
    BEST_FIT = 0;
    HOD.M_sat_break = 1.0e14;
    HOD.alpha1 = 1.0;

    if(argc==1)
        endrun("./HOD.x hod.bat_file > output");

    read_parameter_file(argv[1]);

    if(REDSHIFT>0)
    {
        SIGMA_8 = SIGMA_8*growthfactor(REDSHIFT);
        HUBBLEZ = sqrt(OMEGA_M*pow(1+REDSHIFT,3.0)+1-OMEGA_M);
        OMEGA_Z = OMEGA_M*pow(1+REDSHIFT,3.0)/(OMEGA_M*pow(1+REDSHIFT,3.0)+(1-OMEGA_M));
        fprintf(stdout,"SIGMA_8(Z=%.3f)= %.4f\n",REDSHIFT,SIGMA_8);
        fprintf(stdout,"H(Z=%.3f)/H0= %.4f\n",REDSHIFT,HUBBLEZ);
        HOD.M_min = 0;
        RESET_COSMOLOGY++;
        set_HOD_params();
    }

    /* Output the virial overdensity for reference.
     */
    if(OUTPUT)
    {
        omega_m=OMEGA_M*pow(1+REDSHIFT,3.0)/(OMEGA_M*pow(1+REDSHIFT,3.0)+(1-OMEGA_M));
        x=omega_m-1;
        delta_vir=(18*PI*PI+82*x-39*x*x)/(1+x);
        printf("DELTA_VIR(Omega_m,z) = %f\n",delta_vir);
    }

    /* Do some initialization if we're doing SHMR
     */
    if(SHMR_FLAG)
    {
        if(SATELLITE_PARAMETERIZATION)SHMR_PARAMS = 14;
        if(VARIABLE_ALPHA)SHMR_PARAMS += 2;
        if(VARIABLE_EXCLUSION)wpl.a[SHMR_PARAMS+1] = EXCLUSION_RADIUS;
        wpl.ncf = SHMR_PARAMS + VARIABLE_EXCLUSION;

        HOD.pdfs = 100;
        HOD.pdfc = 101;
        wpx.calculate_two_halo = 1;
        input_stellar_mass_bins();
        // if we have input from the prompt, take that
        if(argc>2 && atoi(argv[2])!=999)
        {
            fp = openfile(argv[2]);
            fscanf(fp,"%d %d",&i,&j);
            for(i=1; i<=wpl.ncf; ++i)
                fscanf(fp,"%lf",&wpl.a[i]);
            fclose(fp);
        }
    }

    for(i=1; i<=wpl.ncf; ++i)
        printf("wpl.a[%d]= %e\n",i,wpl.a[i]);

    /* LENSING TESTING FOR ALEXIE
     */
    if(argc>2)
        IDUM_MCMC=atoi(argv[2]);
    SIGMA_8Z0 = 0.8;

    if(argc>2)
        if(atoi(argv[2])==999)
            test(argc,argv);

    /* If there's no cross-correlation function,
     * set the second number density equal to the first
     */
    if(!XCORR)
        GALAXY_DENSITY2 = GALAXY_DENSITY;

    /* Initialize the non-linear power spectrum.
     */
    nonlinear_sigmac(8.0);
    sigmac_interp(1.0E13);
    sigmac_radius_interp(1.0);

    /* Skip the HOD stuff if we're SHMR-ing it:
     */
    if(SHMR_FLAG)
    {
        if(argc>2 && atoi(argv[2])==999)test(argc, argv);
        if(argc>3 && atoi(argv[3])==999)test(argc, argv);
        goto TASKS;
    }

    /* Get the galaxy bias factor
     */
    s1=qromo(func_galaxy_bias,log(HOD.M_low),log(HOD.M_max),midpnt);
    GALAXY_BIAS=s1/GALAXY_DENSITY;
    if(OUTPUT)
        fprintf(stdout,"Galaxy Bias bg= %f\n",GALAXY_BIAS);
    fflush(stdout);

    /* Get the galaxy satellite fraction
     */
    s1=qromo(func_satellite_density,log(HOD.M_low),log(HOD.M_max),midpnt)/
       GALAXY_DENSITY;
    if(OUTPUT)
        fprintf(stdout,"fsat %e\n",s1);
    fflush(stdout);

    /* Mean halo mass.
     */
    if(OUTPUT)
        fprintf(stdout,"M_eff %e\n",number_weighted_halo_mass());
    fflush(stdout);

    /* Set up BETA for wp integration.
     */
    BETA = pow(OMEGA_M,0.6)/GALAXY_BIAS;
    if(OUTPUT)
        printf("BETA = %f\n",BETA);

TASKS:
    tasks(argc,argv);
}
/*
 *  This function parses the parameterfile in a simple way.
 *  Each paramater is defined by a keyword (`tag'), and can be
 *  either of type douple, int, or character string.
 *  The routine makes sure that each parameter appears 
 *  exactly once in the parameterfile.
 */
void read_parameter_file(char *fname)
{
#define DOUBLE 1
#define STRING 2
#define INT 3
#define CHAR 4
#define LONG 4
#define MAXTAGS 300

  FILE *fd,*fdout;

  char buf[200],buf1[200],buf2[200],buf3[200],tempchar;
  int  i,j,nt,ii,nn,ctemp;
  int  id[MAXTAGS];
  void *addr[MAXTAGS];
  char tag[MAXTAGS][200];
  int  errorFlag=0;
  int IDUM_MCMC_TEMP=-555;

  nt=0;
  
  strcpy(tag[nt],"REDSHIFT");
  addr[nt]=&REDSHIFT;
  id[nt++]=DOUBLE;
  
  strcpy(tag[nt],"GAMMA");
  addr[nt]=&GAMMA;
  id[nt++]=DOUBLE;
  
  strcpy(tag[nt],"OMEGA_M");
  addr[nt]=&OMEGA_M;
  id[nt++]=DOUBLE;
  
  strcpy(tag[nt],"OMEGA_B");
  addr[nt]=&OMEGA_B;
  id[nt++]=DOUBLE;
  
  strcpy(tag[nt],"SIGMA_8");
  addr[nt]=&SIGMA_8;
  id[nt++]=DOUBLE;
  
  strcpy(tag[nt],"RHO_CRIT");
  addr[nt]=&RHO_CRIT;
  id[nt++]=DOUBLE;
  
  strcpy(tag[nt],"HUBBLE");
  addr[nt]=&HUBBLE;
  id[nt++]=DOUBLE;
  
  strcpy(tag[nt],"ITRANS");
  addr[nt]=&ITRANS;
  id[nt++]=INT;
    
  strcpy(tag[nt],"SPECTRAL_INDX");
  addr[nt]=&SPECTRAL_INDX;
  id[nt++]=DOUBLE;
  
  strcpy(tag[nt],"DELTA_CRIT");
  addr[nt]=&DELTA_CRIT;
  id[nt++]=DOUBLE;
  
  strcpy(tag[nt],"DELTA_HALO");
  addr[nt]=&DELTA_HALO;
  id[nt++]=DOUBLE;
  
  strcpy(tag[nt],"TF_file"); 
  addr[nt]=Files.TF_file;
  id[nt++]=STRING;

 strcpy(tag[nt],"root_filename");
  addr[nt]=&Task.root_filename;
  id[nt++]=STRING;
   
  if((fd=fopen(fname,"r")))
    {
      nn=filesize(fd);
      sprintf(buf,"%s","hod-usedvalues");
      if(!(fdout=fopen(buf,"w")))
	{
	  fprintf(stdout,"error opening file '%s' \n",buf);
	  errorFlag=1; 
	}
      else
	{
	  /*while(!feof(fd))*/
	  for(ii=1;ii<=nn;++ii)
	    {
	      fgets(buf,200,fd);
	      if(sscanf(buf,"%s%s%s",buf1,buf2,buf3)<2)
		continue;
	      
	      if(buf1[0]=='%')
		continue;
	      
	      for(i=0,j=-1;i<nt;i++)
		if(strcmp(buf1,tag[i])==0)
		  {
		    j=i;
		    tag[i][0]=0;
		    break;
		  }
	      
	      if(j>=0)
		{
		  switch(id[j])
		    {
		    case DOUBLE:
		      *((double*)addr[j])=atof(buf2); 
		      fprintf(fdout,"%-35s%g\n",buf1,*((double*)addr[j]));
		      break;
		    case STRING:
		      strcpy(addr[j],buf2);
		      fprintf(fdout,"%-35s%s\n",buf1,buf2);
		      break;
		    case INT:
		      *((int*)addr[j])=atoi(buf2);
		      fprintf(fdout,"%-35s%d\n",buf1,*((int*)addr[j]));
		      break;
		    case CHAR:
		      *((char*)addr[j])=buf2[0];
		      fprintf(fdout,"%-35s%c\n",buf1,*((int*)addr[j]));
		      break;
		    }
		}
	      else
		{
		  fprintf(stderr,"Error in file %s:   Tag '%s' not allowed or multiple defined.\n",
			  fname,buf1);
		  errorFlag=1;
		}
	    }
	}
      fclose(fd);
      fclose(fdout);

    }
  else
    {
      fprintf(stderr,"Parameter file %s not found.\n", fname);
      exit(1);
    }



  for(i=0;i<nt;i++)
    {      
      if(!strcmp(tag[i],"GAMMA"))
	{
	  if(ITRANS==4) {
	    fprintf(stderr,"No value of GAMMA given for ITRANS=4\n");
	    errorFlag=1;
	  }
	  continue;
	}
      if(!strcmp(tag[i],"TF_file"))
	{
	  if(ITRANS==11) {
	    sprintf(Files.TF_file,"CMBFAST_trans.dat");
	    fprintf(stderr,"No transfer function file, using [%s]\n",Files.TF_file);
	  }
	  continue;
	}

      if(*tag[i])
	{
	  fprintf(stderr,"Error. I miss a value for tag '%s' in parameter file '%s'.\n",
		  tag[i],fname);
	  errorFlag=1;
	}
    }

  if(errorFlag)
    endrun("error in input_params ");

  /* If REDSHIFT>0, calculate the amplitude of fluctuations at the desired z
   */
  if(REDSHIFT>0)
    {
      SIGMA_8 = SIGMA_8*growthfactor(REDSHIFT);
      fprintf(stderr,"SIGMA_8 @ z=%f is %f\n",REDSHIFT,SIGMA_8);
    }

  /* Other initialization stuff.
   */
  MSTAR=mstar();

#undef DOUBLE 
#undef STRING 
#undef INT 
#undef MAXTAGS
}
Beispiel #6
0
void aspen_breakout()
{
  int i,j,k,i1;
  double x1,x2,x3,x4,x5,x6,r,dr,fsat,m1,mcut,mmin,dlogm;
  char fname[100];
  FILE *fp;

  //goto loop_m1;
  //  goto loop_cvir;
  //goto loop_alpha;
  //goto loop_mcut2;

  /* Vary M_min, find M1 such that fsat is fixed.
   */
  OUTPUT=3;
  HOD.alpha = 1.0;
  for(i=1;i<=5;++i)
    {
      muh(0);
      RESET_FLAG_1H++;
      RESET_FLAG_2H++;
      RESET_KAISER++;

      sprintf(Task.root_filename,"fsat.%d",i);

      HOD.M_min = pow(10.0,i+9.0);
      HOD.M_cut = 4*HOD.M_min;
      if(i==1) {
	HOD.M1 = 30*HOD.M_min;
	set_HOD_params();
	fsat = fsat_g1 = qromo(func_satfrac,log(HOD.M_min),log(HOD.M_max),midpnt)/GALAXY_DENSITY;
	fprintf(stderr,"%e %e %e %f %f\n",HOD.M_min,HOD.M1,GALAXY_DENSITY,fsat,HOD.M1/HOD.M_min);
	muh(2);
      }
      set_HOD_params();
      HOD.M1 = exp(zbrent(func_find_mone2,log(HOD.M_low/10),log(HOD.M_max),1.0E-4));
      fsat = qromo(func_satfrac,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY;
      
      fprintf(stdout,"MUH %e %e %e %f %f\n",HOD.M_min,HOD.M1,GALAXY_DENSITY,fsat,HOD.M1/HOD.M_min);

      sprintf(fname,"fsat_1h.%d",i);
      output_wp(fname);
      sprintf(fname,"fsat_wp.%d",i);
      output_wp(fname);
      sprintf(fname,"fsat_hod.%d",i);
      output_hod(fname);

    }
  exit(0);

  /* Vary sigma8 at fixed HOD/ngal (so change mmin)
   */
  for(i=0;i<=3;++i)
    {
      SIGMA_8 = 0.9*growthfactor((double)i);
      fprintf(stderr,"z=%d, sigma8= %f\n",i,SIGMA_8);
      RESET_COSMOLOGY++;
      RESET_FLAG_1H++;
      RESET_FLAG_2H++;
      RESET_KAISER++;
      //HOD.M_min = 0;
      set_HOD_params();
      
      sprintf(fname,"SIGMA8a.%d",i);
      output_wp(fname);
    }
  exit(0);
  SIGMA_8=0.9;
  RESET_COSMOLOGY++;

 loop_m1:

  /* Vary fsat by varying M1
   */

  m1 = HOD.M1;
  i1 = 0;
  for(i=-2;i<=2;++i)
    {
      HOD.M1 = m1*pow(10.0,i/10.0);
      RESET_FLAG_1H++;
      RESET_FLAG_2H++;
      RESET_KAISER++;
      HOD.M_min = HOD.M_low = 0;
      set_HOD_params();
      
      fsat = qromo(func_satfrac,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY;
      fprintf(stderr,"M1= %e fsat=%f\n",HOD.M1,fsat);
      
      sprintf(fname,"M1_wp.%d",++i1);
      output_wp(fname);
      sprintf(fname,"M1_hod.%d",i1);
      output_hod(fname);
    }
  HOD.M1 = m1;
  exit(0);

 loop_mcut1:

  /* Vary M_cut, fix M1 and fsat
   */
  mcut = HOD.M_cut;
  HOD.M_min = 0;
  set_HOD_params();

  dlogm = (log(HOD.M1) - log(HOD.M_min))/4;
  mmin = log(HOD.M_min);

  fsat_g1 = qromo(func_satfrac,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY;
  i1 = 0;
  for(i=0;i<5;++i)
    {
      HOD.M_cut = exp(dlogm*i+mmin);
      HOD.M1 = exp(zbrent(func_find_mone,log(HOD.M_min),log(HOD.M_max),1.0E-4));
      
      RESET_FLAG_1H++;
      RESET_FLAG_2H++;
      RESET_KAISER++;
      HOD.M_min = HOD.M_low = 0;
      set_HOD_params();

      fprintf(stderr,"M_cut= %e M1= %e %f\n",HOD.M_cut,HOD.M1,HOD.M1/HOD.M_cut);
      
      sprintf(fname,"Mcut1_wp.%d",++i1);
      output_wp(fname);
      sprintf(fname,"Mcut1_hod.%d",i1);
      output_hod(fname);
    }

 loop_mcut2:

  /* Vary M_cut/fsat, keep M_cut/M1 = 1
   */
  mcut = 3.0e13;
  m1 = 3.0e13;

  i1 = 0;
  dlogm = (log(3.0e13) - log(10.0e12))/4;
  for(i=0;i<5;++i)
    {
      HOD.M_cut = HOD.M1 = exp(dlogm*i)*10.0e12;

      RESET_FLAG_1H++;
      RESET_FLAG_2H++;
      RESET_KAISER++;
      HOD.M_min = HOD.M_low = 0;
      set_HOD_params();

      fsat = qromo(func_satfrac,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY;
      fprintf(stderr,"M_min= %e M1= %e fsat=%f\n",HOD.M_min,HOD.M1,fsat);
      

      sprintf(fname,"Mcut2_wp.%d",++i1);
      output_wp(fname);
      sprintf(fname,"Mcut2_hod.%d",i1);
      output_hod(fname);
    }

 loop_alpha:
  
  /* Vary Mcut as above, but fix f_sat by varying alpha
   */
  mcut = 3.0e13;
  m1 = 3.0e13;

  i1 = 0;
  mmin = log(6.0e12);
  dlogm = (log(3.0e13) - mmin)/4;
  HOD.M_cut = HOD.M1 = exp(mmin);
  
  HOD.alpha = 0.1;
  HOD.M_min = HOD.M_low = 0;
  set_HOD_params();

  fsat = qromo(func_satfrac,log(HOD.M_low),log(HOD.M_max),midpnt)/GALAXY_DENSITY;
  fprintf(stderr,"fsat = %f %e\n",fsat,HOD.M_min);
  for(i=0;i<5;++i)
    {
      HOD.M_cut = HOD.M1 = exp(dlogm*i + mmin);

      RESET_FLAG_1H++;
      RESET_FLAG_2H++;
      RESET_KAISER++;

      HOD.alpha = zbrent(func_find_alpha,0.05,2.0,1.0E-4);
      fprintf(stderr,"M_cut= %e alpha = %f\n",HOD.M_cut,HOD.alpha);
      

      sprintf(fname,"alpha_wp.%d",++i1);
      output_wp(fname);
      sprintf(fname,"alpha_hod.%d",i1);
      output_hod(fname);
    }
  
 loop_cvir:

  /* Vary cvir with central one above
   */
  HOD.M_cut = HOD.M1 = exp(dlogm*2 + mmin);
  
  HOD.alpha = zbrent(func_find_alpha,0.05,2.0,1.0E-4);
  fprintf(stderr,"M_cut= %e alpha = %f\n",HOD.M_cut,HOD.alpha);

  i1 = 0;
  for(i=0;i<5;++i)
    {
      CVIR_FAC = pow(3.0,i-2);
      RESET_FLAG_1H++;
      RESET_FLAG_2H++;
      RESET_KAISER++;

      sprintf(fname,"cvir_wp.%d",++i1);
      output_wp(fname);
      sprintf(fname,"cvir_hod.%d",i1);
      output_hod(fname);
    }

  exit(0);
}