Exemplo n.º 1
0
void default1D(struct data *d)
{
  struct file fref;
  struct data ref;
  struct datablockhead *dbh;
  int /*dim1,dim2,*/dim3,nr;
  int i,j;
  int wref=FALSE;

#ifdef DEBUG
  char function[20];
  strcpy(function,"default1D"); /* Set function name */
#endif

  /* Open data and phasefile file pointers for writing */
  openfpw(d,DATA_FILE);
  openfpw(d,PHAS_FILE);

  /* Write data and phasefile file headers */
  wdfh(d,DATA_FILE);
  wdfh(d,PHAS_FILE);

  /* Set data dimensions */
  //dim1=d->np/2;
  //dim2=1;
  dim3=d->fh.ntraces;
  nr=d->nr;

  /* Set nuber of "volumes" */
  d->nvols=d->fh.nblocks/nr;

  /* Check if there is a water reference */
  if (spar(d,"ws","y") && spar(d,"wref","y") && spar(d,"wrefstatus","ws")) wref=TRUE;

  /* Prepare water reference */
  if (wref) {
    setreffile(&fref,d,"waterref"); /* Set reference file */
    getpars(fref.procpar[0],&ref);  /* Get pars from reference procpar */
    opendata(fref.fid[0],&ref);     /* Open reference data file fid */
    getvol1D(&ref,0,NDCC);          /* Get volume without applying dbh.lvl and dbh.tlt */
    weightdata1D(&ref,STD,D1);      /* Weight data using standard VnmrJ parameters */
  }

  /* Allocate memory for blocks headers from all receivers */
  if ((dbh = malloc(nr*sizeof(d->bh))) == NULL) nomem();

  /* For spectra we anticipate there is easily sufficient memory for data
     from all receiver blocks */
  for (d->vol=0;d->vol<d->nvols;d->vol++) { /* loop over "volumes" */

    for (i=0;i<nr;i++) { /* loop over receivers */
      getdbh(d,nr*d->vol+i);       /* Get block header */
      copydbh(&d->bh,&dbh[i]);     /* Store the block headers for writing */
    }

    getvol1D(d,d->vol,NDCC); /* Get data block without applying dbh.lvl and dbh.tlt */

    weightdata1D(d,STD,D1);         /* Weight data using standard VnmrJ parameters */

    if (wref) refcorr1D(d,&ref);    /* Phase correct using the reference */

    else combine1D(d);              /* Combine data from multiple receivers */

    zerofill1D(d,STD,D1);           /* Zero fill data using standard VnmrJ parameters */

    fft1D(d,D1);                    /* 1D fft */

    shiftdata1D(d,STD,D1);          /* Shift data to get spectra */

    for (i=0;i<nr;i++) {            /* loop over receivers */
      copydbh(&dbh[i],&d->bh);      /* Copy block header for writing */
      for (j=0;j<dim3;j++) {
        d->bh.index=d->vol*nr*dim3+i*dim3+j; /* Set block index */
        wdbh(d,DATA_FILE);            /* Write block header */
        wdbh(d,PHAS_FILE);            /* Write block header */
        w1Dtrace(d,i,j,DATA_FILE);    /* Write block */
        w1Dtrace(d,i,j,PHAS_FILE);    /* Write block */
      }
    }

    clear1Ddata(d);               /* Clear data "volume" from memory */

  }

  clear1Dall(d);                /* Clear everything from memory */

  closefp(d,DATA_FILE);
  closefp(d,PHAS_FILE);

}
Exemplo n.º 2
0
int main(int argc, char **argv){
  
  FILE *data;
  double *matriz;
  int x,y,i,j,a;
  int m3=0,m1=0,m2=0;
  data=opendata(argv[1]);
  countdata(data,&x,&y);
  
  //hacer la matriz provisional
  matriz = loaddata(data,x,y);
  gsl_matrix_view P =gsl_matrix_view_array(matriz,y,x);
  // sacar la media para cada dimension
  gsl_vector *m= gsl_vector_alloc(3);
  for(i=0;i<x;i++){
    for(j=0;j<y;j++){
      if(i==0)
	{
	  m1+= gsl_matrix_get(&P.matrix,j,i);
	}
      if(i==1)
	{
	  m2+= gsl_matrix_get(&P.matrix,j,i);
	}
      if(i==2)
	{
	  m3+= gsl_matrix_get(&P.matrix,j,i);
	}
      m1/= y; m2/= y; m3/=y;
    }
  }
  gsl_vector_set(m,0,m1);
  gsl_vector_set(m,1,m2);
  gsl_vector_set(m,2,m3);
  
  // crear la matriz de covarianza COV
  gsl_matrix *COV= gsl_matrix_alloc(x,x);
  for(i=0;i<x;i++){
    for(a=0;a<x;a++){
      double element=0;
      for(j=0;j<y;j++){
	double ei= gsl_matrix_get(&P.matrix,j,i) - gsl_vector_get(m,i);
	double ea= gsl_matrix_get(&P.matrix,j,a) - gsl_vector_get(m,a);
	double ee=ei*ea;
	element+=ee;
      }
      element/= (y-1);
      gsl_matrix_set(COV,i,a,element);
    }
  }
  
  // calcular los valores propios de la matriz COV
  gsl_vector *eval=gsl_vector_alloc(x);
  gsl_matrix *evec=gsl_matrix_alloc(x,x);
  gsl_eigen_symmv_workspace *w= gsl_eigen_symmv_alloc(x);

  gsl_eigen_symmv(COV,eval,evec,w);
  gsl_eigen_symmv_free(w);
  
  gsl_eigen_symmv_sort(eval, evec, GSL_EIGEN_SORT_ABS_DESC);

  //output
  FILE *fileout;
  fileout=fopen("autovectores_3D_data.dat", "w");

  for(i=0;i<x-1;i++){
    double eval_i= gsl_vector_get(eval,i);
    gsl_vector_view evec_i = gsl_matrix_column (evec,i);
    
    printf("eigenvalue %g\n", eval_i);
    printf("eigenvector = \n");
    gsl_vector_fprintf(stdout, &evec_i.vector, "%g");
    
    float evec_i_0= (float) gsl_vector_get(&evec_i.vector,0); 
    float evec_i_1= (float) gsl_vector_get(&evec_i.vector,1);
    float evec_i_2= (float) gsl_vector_get(&evec_i.vector,2);
    fprintf(fileout,"%f %f %f\n", evec_i_0, evec_i_1, evec_i_2); 
    
  } 
  close(fileout);
  return 0;
}