/* In setup, the options are obtained and passed to execute via the config object.*/ void * setup(c_datablock * options){ DATABLOCK_STATUS status=0; sigma_r_config * config = malloc(sizeof(sigma_r_config)); status |= c_datablock_get_double(options,OPTION_SECTION,"offset",&(config->offset)); status |= c_datablock_get_double(options,OPTION_SECTION,"delta",&(config->delta)); if(status){fprintf(stderr,"Error in setup.\n");exit(status);} return config; }
/* In setup, the options are obtained and passed to execute via the config object.*/ void * setup(c_datablock * options){ DATABLOCK_STATUS status=0; ave_delsig_config*config = malloc(sizeof(ave_delsig_config)); status |= c_datablock_get_double(options,OPTION_SECTION,"bin_min",&(config->bin_min)); status |= c_datablock_get_double(options,OPTION_SECTION,"bin_max",&(config->bin_max)); status |= c_datablock_get_int(options,OPTION_SECTION,"num_bins",&(config->num_bins)); if(status){fprintf(stderr,"Error in setup.\n");exit(status);} return config; }
/* In execute, the options are taken in. Next, data is read from the block that was generated previously. Then, the calculation is kicked off. Then, the program writes to the block.*/ int execute(c_datablock * block, void * config_in){ int i,j,l;//iteration variables DATABLOCK_STATUS status=0; int extents[]={0,0,0};//Used to read in >1D arrays. Note: the extents are zerod out in order to test array lengths int ndims;//Used to read in >1D arrays //Obtain the options from config. sigma_r_config * config = (sigma_r_config *)config_in; double offset = config->offset; double delta = config->delta; //Acquire the cluster mass and scale radius double M; double r_scale; status |= c_datablock_get_double(block,cosmo,"log10_cluster_mass",&M); status |= c_datablock_get_double(block,cosmo,"scale_radius",&r_scale); M = pow(10,M); //Acquire the radii and redshift to evaluate the correlation function at. double *r,*z; int numr; int numz; status |= c_datablock_get_double_array_1d(block,dist,"z",&z,&numz); status |= c_datablock_get_double_array_1d(block,setup_name,"radii",&r,&numr); //Acquire omega_m, the only cosmological parameter that comes into play here double omega_m, H0; status |= c_datablock_get_double(block,cosmo,"omega_m",&omega_m); status |= c_datablock_get_double(block,cosmo,"hubble",&H0); //Acquire the correlation function, xi, from the block status |= c_datablock_get_array_ndim(block,xi_hm,"xi_hm",&ndims); status |= c_datablock_get_double_array_shape(block,xi_hm,"xi_hm",ndims,extents); if(status){fprintf(stderr,"Error on reading in xi (2D) dimensions.\n");exit(status);} int numxi0 = extents[0],numxi1=extents[1]; double xi[numxi0][numxi1]; status |= c_datablock_get_double_array(block,xi_hm,"xi_hm",(double *)xi,ndims,extents); if(status){fprintf(stderr,"Error on reading in xi.\n");exit(status);} //Declare and allocate the resulting array for the surface density, \bar{Delta Sigma}(<R), //and \bar{Delta Sigma}(R) int ndimsd=2; int extentssd[]={numz,numr}; double **sigma_r; sigma_r = (double **)malloc(numz*sizeof(double*)); for(i=0;i<numz;i++) sigma_r[i] = (double *)malloc(numr*sizeof(double)); //Do the surface density calculation //Note: we have to flatten the xi array status |= calc_sigma_r(M,r_scale,delta,z,numz,r,numr,(double *)xi,omega_m,H0,sigma_r,offset); //We have to flatten the sigma_r array in order to write to the block double sigma_r_out[numz][numr]; for(i=0;i<numz;i++) for(j=0;j<numr;j++) sigma_r_out[i][j]=sigma_r[i][j]; //Write sigma_r to the block char *name = "sigma_r"; status |= c_datablock_put_double_array(block,name,name,(double *)sigma_r_out,ndimsd,extentssd); if(status){fprintf(stderr,"Error on writing out sigma_r to the block.\n");exit(status);} //Free the sigma_r array for(i=0;i<numz;i++) free(sigma_r[i]); free(sigma_r); return 0;//No likelihood from this module }
int execute(c_datablock * block, void * config_in){ DATABLOCK_STATUS status=0; covariance_config * config = (covariance_config*) config_in; int i,j,k; int NL; FILE *dat; char name[200]; int corrtype=2; char sec[30]; if (corrtype==1) sprintf(sec, "galaxy_shape_cl"); if (corrtype==2) sprintf(sec, "galaxy_position_cl"); // set covariance parameters double area, neff, sigma_e; //Survey area in deg^2, effective source density, shape dispersion int NZ; status |= c_datablock_get_int(block, config->survey, "nzbin", &NZ); status |= c_datablock_get_double(block, config->survey, "area", &area); status |= c_datablock_get_double(block, config->survey, "ngal", &neff); status |= c_datablock_get_double(block, config->survey, "shape_dispersion", &sigma_e); double ngal[NZ]; double sig[NZ]; for (int i ; i<NZ ; ++i){ ngal[i] = neff/ ((double)NZ); sig[i] = sigma_e; } // allocate arrays double *ell; status |= c_datablock_get_double_array_1d(block, sec, "l_bins", &ell, &NL); double ***ps=bj_alloc_3D(4,NZ*NZ,NL); const int ND=NZ*(2*NZ+1); double ***cov=bj_alloc_3D(ND,ND,NL); // [NZ*NZ][NZ*NZ][NL] suffices for individual WL or clustering covariances // Load power spectra from the datablock char bin[8]; char section[30]; double *cl; int tmp, sp; int lim = 0; for (j=0;j<NZ;j++) { if (corrtype == 1 || corrtype == 2) lim = j; if (corrtype == 1){ sp = 0; sprintf(section, "galaxy_shape_cl"); } if (corrtype == 2){ sp = 3; sprintf(section, "galaxy_position_cl"); } for (k=lim;k<NZ;k++) { status|=c_datablock_get_double_array_1d(block, section, bin, &cl, &tmp); for (i=0;i<NL;i++) { ps[sp][k+j*NZ][i] = cl[i]; ps[sp][j+k*NZ][i]=ps[sp][k+j*NZ][i]; // symmetrise } } } // calculate covariance status=pscov(ell,ps,cov,area,ngal,sig,NZ,NL,2); printf("%i\n",status); // clean up bj_free_3D(ps,4,NZ*NZ,NL); bj_free_3D(cov,ND,ND,NL); free(ell); return 0; }