int main(int argc, char **argv) { unsigned int i,j,m,n; /* variables to iterate over */ int iter_num = 0; /* * To avoid the memory limitation, here we use a LOW_NI and UP_NI to get enough iteration times. * The total iteration times should be LOW_NI*UP_NI. */ unsigned long LOW_NI = 10000; /* lower iteration times for each scatterer*/ unsigned long UP_NI = 20000; /*Upper iteration times for each scatterer*/ camera_t cam = {0.20,0.20,512,512}; /* initialize the cam struct*/ field_t field; /* seed the scatterers */ scatterer_t *scatts = NULL; scatts = malloc(NSCAT*sizeof(scatterer_t)); check_mem(scatts); /* the locations */ scatterer_t location; /* the radiation counting for NSCATS */ int *visiting_array = NULL; visiting_array = calloc(NSCAT,sizeof(int)); check_mem(visiting_array); double *distance_array = NULL; distance_array = calloc(UP_NI*LOW_NI,sizeof(double)); check_mem(distance_array); complex double *ccd_all = NULL; ccd_all = calloc(cam.cam_sx*cam.cam_sy,sizeof(complex double)); check_mem(ccd_all); /* check memory, should probably */ //long page_size = sysconf(_SC_PAGE_SIZE); //long pages_avail = sysconf(_SC_AVPHYS_PAGES); //long pages_tot = sysconf(_SC_PHYS_PAGES); //if(pages_tot*page_size<8*cam.cam_sx*cam.cam_sy*2*sizeof(complex double)){ // error("Size of output arrays exceed avaliable memory."); //} unsigned long *gaussian_beam = calloc(NSCAT,sizeof(unsigned long)); check_mem(gaussian_beam); /* To read the scatterers positions from the file into the scatterer array*/ char filename[FILENAME_MAX]; bzero(filename,FILENAME_MAX*sizeof(char)); sprintf(filename,"%s","Scatterers.txt"); log_info("Reading from %s.",filename); /* use tsvread to get list of scatterers */ tsv_t *tsv = tsv_fread(filename); for(i=0;i<NSCAT;++i){ memcpy(scatts,*tsv->data,sizeof(scatterer_t)); tsv->data++; scatts++; } tsv->data-=i; scatts-=i; tsv_free(tsv); index_bounds **Matrix = NULL; Matrix = (index_bounds**)malloc(NSCAT*sizeof(index_bounds*)); check_mem(Matrix); for(i=0;i<NSCAT;++i){ Matrix[i] = (index_bounds*)malloc(NSCAT*sizeof(index_bounds)); check_mem(Matrix[i]); conduc_matrix(NSCAT, scatts, i, Matrix[i]); } log_info("Conductance matrix finished"); /* initialize the random number generator */ int rseed = (int)time(NULL); const gsl_rng_type *T; gsl_rng *r; gsl_rng_env_setup(); T = gsl_rng_default; r = gsl_rng_alloc(T); srand(rseed); gsl_rng_set(r,rseed); int gaussian_sum = 0; j = 0; n = 1; gaussian_profile_creator(scatts,waist, UP_NI*LOW_NI,NSCAT,gaussian_beam); for (m = 0; m < UP_NI; ++m) { for (i = 0; i < LOW_NI; ++i) { if (gaussian_sum < gaussian_beam[j]) { ++gaussian_sum; if((m*UP_NI+i+1)%100==0) { ++iter_num; } field = single_field_spp(j, scatts, NSCAT,r,Matrix[j],iter_num, distance_array); ++visiting_array[field.scatterer_index]; location = fst_transfer(field,z0,scatts[field.scatterer_index]); field_on_ccd(z0,location,scatts[field.scatterer_index],field,cam,ccd_all); } else { ++j; gaussian_sum = 0; if (j == (int)(0.1*n*NSCAT)) { log_info("Process %d0 percent done.",n); ++n; } } } } log_info("iter_num is %d", iter_num); log_info("Field generated."); bzero(filename,FILENAME_MAX*sizeof(char)); sprintf(filename,"%s","distance_1000.txt"); FILE *fp_dis = fopen(filename,"w"); check(fp_dis, "Failed to open %s for writing.", filename); log_info("Writing to %s.",filename); for (i = 0; i < iter_num; ++i) { fprintf(fp_dis,"%-12.12f\n",distance_array[i]); } fclose(fp_dis); double *tmp = NULL; tmp = malloc(cam.cam_sx*cam.cam_sy*sizeof(double)); check_mem(tmp); /* normalize tmp, first by finding max */ double max = 0; for(i=0;i<cam.cam_sx*cam.cam_sy;++i){ tmp[i]=cabs(ccd_all[i])*cabs(ccd_all[i]); if(tmp[i]>max){ max=tmp[i]; } } /* then dividing by max */ for(i=0;i<cam.cam_sx*cam.cam_sy;++i){ tmp[i]/=max; //printf("%d",tmp[i]); } /** * Write the tmp array as a way to do the * cross-correlation function. */ bzero(filename,FILENAME_MAX*sizeof(char)); sprintf(filename,"%s","tmp.txt"); FILE *fp_tmp = fopen(filename,"w"); check(fp_tmp, "Failed to open %s for writing.", filename); log_info("Writing to %s.",filename); for (i = 0; i < cam.cam_sx*cam.cam_sy; ++i) { fprintf(fp_tmp,"%-12.12f\n",tmp[i]); } fclose(fp_tmp); /* output file */ hid_t file,dataset,dataspace; herr_t status = 0; hsize_t dims[2]; /* dimensionality of the set */ dims[0]=cam.cam_sx; dims[1]=cam.cam_sy; dataspace = H5Screate_simple(2,dims,NULL); bzero(filename,FILENAME_MAX*sizeof(char)); sprintf(filename,"%s","out_s300_w50_5000_10000_20n.h5"); file = H5Fcreate(filename,H5F_ACC_TRUNC,H5P_DEFAULT,H5P_DEFAULT); dataset = H5Dcreate1(file,"/e2",H5T_NATIVE_DOUBLE,dataspace,H5P_DEFAULT); log_info("Writing to HDF5 file %s.",filename); status = H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, tmp); check(status>=0,"Can't write dataset /e2 to %s",filename); /* write the real and imaginary parts as well */ dataset = H5Dcreate1(file,"/er",H5T_NATIVE_DOUBLE,dataspace,H5P_DEFAULT); for(i=0;i<cam.cam_sx*cam.cam_sy;++i){ tmp[i]=creal(ccd_all[i]); } status = H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, tmp); check(status>=0,"Can't write dataset /er to %s",filename); dataset = H5Dcreate1(file,"/ei",H5T_NATIVE_DOUBLE,dataspace,H5P_DEFAULT); for(i=0;i<cam.cam_sx*cam.cam_sy;++i){ tmp[i]=cimag(ccd_all[i]); } status = H5Dwrite(dataset, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, tmp); check(status>=0,"Can't write dataset /ei to %s",filename); /* clean up */ log_info("Cleaning up."); free(tmp); status = H5Dclose(dataset); status = H5Sclose(dataspace); status = H5Fclose(file); gsl_rng_free(r); free(scatts); //free(free_path); free(visiting_array); free(ccd_all); for(i=0;i<NSCAT;++i){ free(Matrix[i]); } free(Matrix); log_info("Program finished."); return 0; error: return 1; }
int main(int argc, char *argv[]) { int rc = 0; const char* data_file = NULL; FILE *fh = NULL; tsv *t = NULL; myc c; if(argc != 2) { fprintf(stderr, "USAGE: %s [TSV FILE]\n", program); rc = 1; goto tidy; } data_file = (const char*)argv[1]; if(access(data_file, R_OK)) { fprintf(stderr, "%s: Failed to find data file %s\n", program, data_file); rc = 1; goto tidy; } fh = fopen(data_file, "r"); if(!fh) { fprintf(stderr, "%s: Failed to read data file %s: %s\n", program, data_file, strerror(errno)); rc = 1; goto tidy; } c.count = 0; /* save first line as header not data */ t = tsv_init(&c, my_tsv_fields_callback, TSV_FLAGS_SAVE_HEADER); if(!t) { fprintf(stderr, "%s: Failed to init TSV library", program); rc = 1; goto tidy; } while(!feof(fh)) { char buffer[1024]; size_t len = fread(buffer, 1, sizeof(buffer), fh); if(tsv_parse_chunk(t, buffer, len)) break; } fclose(fh); fh = NULL; fprintf(stderr, "%s: Saw %d records\n", program, c.count); tidy: if(t) tsv_free(t); if(fh) { fclose(fh); fh = NULL; } return rc; }