Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}