Example #1
0
globalDataValues* loadCvmDataAll(gridStruct *location, char *outputDirectory)
{
    
    // perform endian check
    int endianInt;
    endianInt = endian();
    
    globalDataValues *globDataVals;
    globDataVals = malloc(sizeof(globalDataValues));

    char veloModDir[128];
    sprintf(veloModDir,"%s/Velocity_Model",outputDirectory);
    
    FILE *fvp, *fvs, *frho;
    char vp3dfile[64];
    sprintf(vp3dfile,"%s/vp3dfile.p",veloModDir);
    
    char vs3dfile[64];
    sprintf(vs3dfile,"%s/vs3dfile.s",veloModDir);
    
    char rho3dfile[64];
    sprintf(rho3dfile,"%s/rho3dfile.d",veloModDir);
    
    float *vp, *vs, *rho;
    int bsize, ip;
    
    fvp = fopen(vp3dfile,"r");
    fvs = fopen(vs3dfile,"r");
    frho = fopen(rho3dfile,"r");
    
    bsize = location->nX*location->nZ*sizeof(float);
    vp = (float*) malloc(bsize);
    vs = (float*) malloc(bsize);
    rho = (float*) malloc(bsize);
    
    float vsRead, vpRead, rhoRead;
    
    printf("Reading binary files.\n");
    for(int iy = 0; iy < location->nY; iy++)
    {
        //increment a counter
//        printf("%d / %d complete \n",iy+1,location->nY);
        printf("\rReading velocity model from file %d%% complete.", iy*100/location->nY);
        fflush(stdout);
        
        //now read the obtained file in binary
        fread(vp,sizeof(vp[0]),location->nX*location->nZ,fvp);
        fread(vs,sizeof(vs[0]),location->nX*location->nZ,fvs);
        fread(rho,sizeof(rho[0]),location->nX*location->nZ,frho);
        for(int iz = 0; iz < location->nZ; iz++)
        {
            for (int ix = 0; ix < location->nX; ix++)
            {
                ip = ix + iz * location->nX;  //index counter
                vpRead = vp[ip];
                vsRead = vs[ip];
                rhoRead = rho[ip];

                if (endianInt == 1) // big endian, implement byteswap
                {
                    globDataVals->Vp[ix][iy][iz] = float_swap(vpRead);
                    globDataVals->Vs[ix][iy][iz] = float_swap(vsRead);
                    globDataVals->Rho[ix][iy][iz] = float_swap(rhoRead);
//                    printf("swappingRead\n");
                }
                else if (endianInt == 0) // system is little endain, read as is.
                {
                    globDataVals->Vp[ix][iy][iz] = vpRead;
                    globDataVals->Vs[ix][iy][iz] = vsRead;
                    globDataVals->Rho[ix][iy][iz] = rhoRead;
                }
            }
        }
    }
    printf("\rReading velocity model from file 100%% complete.");
    fflush(stdout);
    printf("\n");

    
    free(vp);
    free(vs);
    free(rho);
    fclose(fvp);
    fclose(fvs);
    fclose(frho);
    printf("Binary file read complete.\n");
    return globDataVals;
}
Example #2
0
Bool find_centered_folding(float A1[3],float A2[3],
			    float B1[3],float B2[3],
			    float K[3],
			    float V[3])
{
  double eps= 1e-14;
  int swap=0;  /*  0 - no swap, 1 - swaped xy, 2 - swaped yz  */
  double m,p,q, A2B2, A1B1, a, b, c, delta, x1, y1, z1, d1,d2;
  float matrix[3][3];

  A2B2=scalar_product(A2,B2);
  A1B1=scalar_product(A1,B1);



  m=A2[2]*A1[0]-A1[2]*A2[0];

  if(fabs(m)<eps)
    {
      float_swap(&A1[0], &A1[1]);
      float_swap(&A2[0], &A2[1]);
      float_swap(&B1[0], &B1[1]);
      float_swap(&B2[0], &B2[1]);
      float_swap(&K[0], &K[1]);
      m=A2[2]*A1[0]-A1[2]*A2[0];
      swap=1;
    }

  if(fabs(m)<eps)
    {
      float_swap(&A1[0], &A1[1]);
      float_swap(&A2[0], &A2[1]);
      float_swap(&B1[0], &B1[1]);
      float_swap(&B2[0], &B2[1]);
      float_swap(&K[0], &K[1]);
      float_swap(&A1[2], &A1[1]);
      float_swap(&A2[2], &A2[1]);
      float_swap(&B1[2], &B1[1]);
      float_swap(&B2[2], &B2[1]);
      float_swap(&K[2], &K[1]);
      m=A2[2]*A1[0]-A1[2]*A2[0];
      swap=2;
    }



  if(fabs(m)<eps)
    {
      printf("FOLDING REFUSED: the axes are colinear !!\n");
      printf("m=%e\n", m);
      return False;
    }

   /*  m!=0  */

  p=(A1[1]*A2[0]-A2[1]*A1[0])/m;
  q=(A2B2*A1[0]-A1B1*A2[0])/m;

  a=(1+p*p)*A2[0]*A2[0]+(A2[1]+p*A2[2])*(A2[1]+p*A2[2]);
  b=2*(p*q*A2[0]*A2[0]-(A2B2-q*A2[2])*(A2[1]+p*A2[2]));
  c=(q*q-1)*A2[0]*A2[0]+(A2B2-q*A2[2])*(A2B2-q*A2[2]);

  if(fabs(a)<eps)
    {
      a=(1+p*p)*A1[0]*A1[0]+(A1[1]+p*A1[2])*(A1[1]+p*A1[2]);
      b=2*(p*q*A1[0]*A1[0]-(A1B1-q*A1[2])*(A1[1]+p*A1[2]));
      c=(q*q-1)*A1[0]*A1[0]+(A1B1-q*A1[2])*(A1B1-q*A1[2]);
    }

  if(fabs(a)<eps)
    {
    printf("FOLDING REFUSED: the axes are colinear !!!\n");
    return False;
    }

   /*  a!=0 */

  delta= b*b-4*a*c;

  if(delta<0) 
    {
      printf("FOLDING FAILED: probably too large angle between rotated lines !!!\n");
      return False;
    }

  y1= (-b-sqrt(delta))/(2*a);
  z1= p*y1+q;
  x1= (fabs(A2[0]) > fabs(A1[0])) ?
    (A2B2-y1*A2[1]-z1*A2[2])/A2[0]:
    (A1B1-y1*A1[1]-z1*A1[2])/A1[0];
 

  vectorcpy(matrix[0], A1);
  vectorcpy(matrix[1], A2);
  vectorcpy(matrix[2], K);

  d1=matrix3_det(matrix);

  matrix[2][0]=x1;
  matrix[2][1]=y1;
  matrix[2][2]=z1;

  d2=matrix3_det(matrix);

  if(d1*d2 < 0)
    {
      y1= (-b+sqrt(delta))/(2*a);
      z1= p*y1+q;
      x1= (fabs(A2[0]) > fabs(A1[0])) ?
	(A2B2-y1*A2[1]-z1*A2[2])/A2[0]:
	(A1B1-y1*A1[1]-z1*A1[2])/A1[0];
    }


  V[0]=x1;
  V[1]=y1;
  V[2]=z1;

  switch(swap)
    {
    case 1:
      float_swap(&A1[0], &A1[1]);
      float_swap(&A2[0], &A2[1]);
      float_swap(&B1[0], &B1[1]);
      float_swap(&B2[0], &B2[1]);
      float_swap(&K[0], &K[1]);
      float_swap(&V[0], &V[1]);
      break;

    case 2:
      float_swap(&A1[2], &A1[1]);
      float_swap(&A2[2], &A2[1]);
      float_swap(&B1[2], &B1[1]);
      float_swap(&B2[2], &B2[1]);
      float_swap(&K[2], &K[1]);
      float_swap(&V[2], &V[1]);
      break;

    }

  return True;
   /*  DOKONCZYC ... */


}