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; }
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 ... */ }