#include #include #include #include #ifdef PARALLEL #include #endif #include "header.h" /* These are the parameters for creating the pdf table. */ int nv1,nr1,nphi1; void create_pdf_table(); double ***ppp,*vvv,*rbin,*phibin,***yy2,FIRSTFLAG=1; double BINSIZE; double galaxy_prob_vz(double vel, double rad, double theta) { static int flag=0,prev_cosmo=0; static double *y,*ya,*yb,*y2b,*xb,rv[21],rmin,rmax,dlogr; int i,j,k,irad,iphi; double vprob,m1,m2; if(!flag || RESET_PVZ || RESET_COSMOLOGY!=prev_cosmo) { rmin=1.7*pow(3*HOD.M_low/(4*DELTA_HALO*PI*OMEGA_M*RHO_CRIT),1.0/3.0); rmax=XI_MAX_RADIUS; dlogr=log(rmax/rmin)/(nr1-1); if((RESET_PVZ || RESET_COSMOLOGY!=prev_cosmo) && !ThisTask) { printf("RESET: creating new table for:\n"); printf(" > OMEGA_M = %f\n",OMEGA_M); printf(" > SIGMA_8 = %f\n",SIGMA_8); printf(" > VBIAS = %f\n",VBIAS); printf(" > VBIAS_C = %f\n",VBIAS_C); fflush(stdout); } RESET_PVZ=0; prev_cosmo=RESET_COSMOLOGY; create_pdf_table(); if(!flag) { y=dvector(1,nphi1); ya=dvector(1,nphi1); yb=dvector(1,4); y2b=dvector(1,4); xb=dvector(1,4); } flag=1; for(i=1;i<=nr1;++i) for(j=1;j<=nphi1;++j) spline(vvv,ppp[i][j],nv1,1.0E+30,1.0E+30,yy2[i][j]); } if(fabs(vel)>MAXVEL)return(0); if(theta<0)theta*=-1; for(i=1;i<=nr1;++i) if(radnr1-1)i=nr1-1; irad=i; while(rbin[irad-2]==0)irad++; if(irad>nr1-1) { printf("ERROR CANNOT ITERPOLATE FOR r=%f\n",rad); exit(0); } for(j=1,i=irad-2;i<=irad+1;++i,++j) { for(k=1;k<=nphi1;++k) { splint(vvv,ppp[i][k],yy2[i][k],nv1,vel,&y[k]); } spline(phibin,y,nphi1,1.0E+30,1.0E+30,ya); splint(phibin,y,ya,nphi1,theta,&yb[j]); xb[j]=rbin[i]; } spline(xb,yb,4,1.0E30,1.0E30,y2b); splint(xb,yb,y2b,4,rad,&vprob); if(vprob<0)vprob=0; return(vprob); irad=i; if(irad<2)irad=2; if(irad>nr1)irad=nr1; iphi = (int)theta/(PI/18.0)+1; if(iphi==nphi1)iphi=nphi1-1; for(j=1,i=irad-1;i<=irad;++i) { for(k=iphi;k<=iphi+1;++k) { splint(vvv,ppp[i][k],yy2[i][k],nv1,vel,&y[j++]); } } m1 = (y[1]-y[2])/(phibin[iphi]-phibin[iphi+1])*(theta-phibin[iphi])+y[1]; m2 = (y[3]-y[4])/(phibin[iphi]-phibin[iphi+1])*(theta-phibin[iphi])+y[3]; vprob = (m2-m1)/(rbin[irad]-rbin[irad-1])*(rad-rbin[irad-1])+m1; if(vprob<0)vprob=0; return(vprob); } /* For consistency, the MAXVEL and BINSIZE variables will be scaled by * OMEGA_M^0.6. * */ void create_pdf_table() { #define NZMASS 19 int TEST=1; FILE *fp; double dlogr,vbias1,vbias2; static int CNT=0; double sgal[NZMASS][NZMASS],sgal_cs[NZMASS][NZMASS],sgal_cc[NZMASS][NZMASS], *cf,fdat[10],s2gal[4],wgal[3],**mtemp, ***ptemp,*vtemp,*temp,*p1temp,*p2temp,*precv,*rvir,*ngal,**ngal2,**ngal2x,*mbin; double binsize,ptot,vprob,p0,p1,p2,p3,s1,s2,s3,s4,v1,v, mass,mlo,mhi,qromo(),midpnt(),sgal1[NZMASS][NZMASS],hmass[NZMASS], sgal2[NZMASS][NZMASS],w1[NZMASS][NZMASS],w2[NZMASS][NZMASS],mass1,mass2,wsum,fac, w3[NZMASS][NZMASS],t0,tsum=0,t1,tdiff,frac1,frac2,frac3,frac4,x1,x2,deltar, haloweight,immax,mmax,rmax,rmin,exfac,xx1=0,weightsum; int i,j,k,n,nzmass,imass=0,irad,im1,im2,istep=1,istart=1,jstart=1,jstep=1, idat[10],nitems; float f1; CNT++; #ifdef PARALLEL istep = 1; istart = 1; jstart = ThisTask + 1; jstep = NTask; #endif BINSIZE=20*pow(OMEGA_M/0.3,0.6); rmin=R_MIN_2HALO; rmin=1.1*pow(3*HOD.M_low/(4*DELTA_HALO*PI*OMEGA_M*RHO_CRIT),1.0/3.0); rmax=XI_MAX_RADIUS; nr1=30; nv1=301; nphi1=9; MAXVEL=BINSIZE*floor(nv1/2); /* This assumes that even if the cosmology is changed, that * the dimensions of these arrays won't change. */ if(FIRSTFLAG) { vvv=dvector(1,nv1); rbin=dvector(1,nr1); phibin=dvector(1,nphi1); yy2=d3tensor(1,nr1,1,nphi1,1,nv1); ppp=d3tensor(1,nr1,1,nphi1,1,nv1); FIRSTFLAG=0; } if(TEST) { HOD.pdfs=0; HOD.M_min = HOD.M_low = 4.4e11; rmin=1.1*pow(3*HOD.M_low/(4*DELTA_HALO*PI*OMEGA_M*RHO_CRIT),1.0/3.0); } dlogr=log(rmax/rmin)/(nr1-1); for(i=1;i<=nr1;++i) rbin[i]=rmin*exp((i-1)*dlogr); for(i=1;i<=nphi1;++i) phibin[i]=(i-0.5)/nphi1*PI/2; for(i=1;i<=nv1;++i) vvv[i]=-MAXVEL+(i-1)*BINSIZE; nzmass=NUM_POW2MASS_BINS-1; ptemp=d3tensor(0,nzmass-1,0,nzmass-1,1,nv1); vtemp=dvector(1,nv1); temp=dvector(1,nv1); p1temp=dvector(1,nv1); p2temp=dvector(1,nv1); precv=dvector(1,nv1); rvir=dvector(0,nzmass); mbin=dvector(0,nzmass); for(i=1;i<=nr1;++i) for(j=1;j<=nphi1;++j) for(k=1;k<=nv1;++k) ppp[i][j][k]=0; binsize=BINSIZE; fac=sqrt(4.499E-48/2.0)*pow(4*DELTA_HALO*PI*OMEGA_M*RHO_CRIT/3,1.0/6.0)*3.09E19; fac=fac*fac; /* w1 -> number of i_sat + j_cen pairs * w2 -> number of j_sat + i_cen pairs * w3 -> number of i_sat + j_sat pairs * * Okay, I know that all you have to do is switch the indices on * w1 to get w2, but just to keep things really clear, I'll have three * different matrices. */ for(i=0;i mass threshold */ /* vbias1=1; if(mass1 mass threshold */ /* vbias2=1; if(mass2nphi1) { i++; j=j-nphi1; } if(i>nr1)break; jstart=j; for(j=jstart;j<=nphi1;j+=jstep) { t1=second(); tdiff=timediff(t0,t1); tsum+=tdiff; t0=second(); if(NTask==1 && OUTPUT) { fprintf(stdout,"P(v_z) r[%d]= %5.2f phi[%d]=%4.1f [dt= %.2f T=%7.2f] (task= %d)\n", i,rbin[i],j,phibin[j]*180/PI,tdiff,tsum,ThisTask); fflush(stdout); } for(im1=0;im1rvir[im2]*0.75) { ppp[i][j][k]+=ptemp[im1][im2][k]*ngal2[im1][im2]* (bias_interp(hmass[im1],-1)*bias_interp(hmass[im2],-1)); if(k==1)weightsum+=ngal2[im1][im2]* (bias_interp(hmass[im1],-1)*bias_interp(hmass[im2],-1)); } continue; if(rbin[i]/(rvir[im1]+rvir[im2])>0.5) { exfac=1; if(rbin[i]/(rvir[im1]+rvir[im2])<1.5) exfac=ellipsoidal_exclusion_probability(rvir[im2]/rvir[im1], rbin[i]/(rvir[im1]+rvir[im2])); /* if(rbin[i]<(rvir[im1]+rvir[im2])) exfac = 0; if(rvir[im2]/rvir[im1]>pow(100.0,.333) && rbin[i]>(rvir[im1]+rvir[im2])*0.5) exfac = 1; */ ppp[i][j][k]+=ptemp[im1][im2][k]*ngal2[im1][im2]*exfac*1* sqrt(bias_interp(hmass[im1],-1)*bias_interp(hmass[im2],-1)); if(k==1)weightsum+=ngal2[im1][im2]*exfac*1* sqrt(bias_interp(hmass[im1],-1)*bias_interp(hmass[im2],-1)); } } //printf("WEIGHTSUM %d %d %e %.0f\n", // i,j,weightsum,weightsum*BOX_SIZE*BOX_SIZE*BOX_SIZE); if(weightsum>0) { for(k=1;k<=nv1;++k) ppp[i][j][k]/=weightsum; // for(k=1;k<=nv1;++k) //printf("yTEST %d %d %f %e\n",i,j,vvv[k],ppp[i][j][k]); for(ptot=0,k=1;k<=nv1;++k) ptot+=ppp[i][j][k]*binsize; } else for(k=1;k<=nv1;++k) ppp[i][j][k]=0; } } #ifdef PARALLEL for(i=1;i<=nr1;++i) for(j=1;j<=nphi1;++j) { for(k=1;k<=nv1;++k) temp[k]=ppp[i][j][k]; MPI_Allreduce(&temp[1],&precv[1],nv1,MPI_DOUBLE,MPI_SUM,MPI_COMM_WORLD); for(k=1;k<=nv1;++k) ppp[i][j][k]=precv[k]; } #endif free_d3tensor(ptemp,0,nzmass-1,0,nzmass-1,1,nv1); free_dvector(vtemp,1,nv1); free_dvector(temp,1,nv1); free_dvector(p1temp,1,nv1); free_dvector(p2temp,1,nv1); free_dvector(precv,1,nv1); free_dvector(rvir,0,nzmass); free_dvector(mbin,0,nzmass); free_dvector(ngal,0,nzmass-1); free_dmatrix(ngal2,0,nzmass-1,0,nzmass-1); }