⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 posteriori.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 2 页
字号:
   CD = alloc1float(nDM * (nDM + 1) / 2);   if (PRIOR)   {      if(vpFrechet || ipFrechet)	 CMP = alloc1float(limRange * (limRange + 1) / 2);      if(vsFrechet || isFrechet)	 CMS = alloc1float(limRange * (limRange + 1) / 2);      if(rhoFrechet)	 CMrho = alloc1float(limRange * (limRange + 1) / 2);   }      /* FRECHET derivative operator F */   F = alloc2float(nR * nDM, numberPar * limRange);   if (IMPEDANCE)      CmPostInv = 	 alloc2float(numberParImp * limRange, numberParImp * limRange);   else      CmPostInv = alloc2float(numberPar * limRange, numberPar * limRange);   v1 = alloc2complex(2, numberPar * limRange + 1);   v2 = alloc2complex(2, numberPar * limRange + 1);   DmB = alloc3complex(4, numberPar * (limRange + 2), nL);   derFactor = alloc2complex(2, nL + 1);   aux11 = alloc2complex(nR, numberPar * limRange);   aux12 = alloc2complex(nR, numberPar * limRange);   aux21 = alloc2complex(nR, numberPar * limRange);   aux22 = alloc2complex(nR, numberPar * limRange);   aux11Old = alloc2complex(nR, numberPar * limRange);   aux12Old = alloc2complex(nR, numberPar * limRange);   aux21Old = alloc2complex(nR, numberPar * limRange);   aux22Old = alloc2complex(nR, numberPar * limRange);   /* reading receiver configuration */   fp = fopen(recFile, "r");   if (fp == NULL)   {      /* standard end-on */      if (verbose) fprintf(stderr, "No receiver file available\n");      for (i = 0; i < nR; i++)      {         recArray[i] = r1 + i * dR;      }   }   else      {      if (verbose) fprintf(stderr, "Reading receiver file %s\n", recFile);      for (i = 0; i < nR; i++)      {         fscanf(fp, "%f\n", &recArray[i]);      }   }   fclose(fp);      /* reading the model file */   fp = fopen(modelFile,"r");   if (verbose)           fprintf(stderr,"  Thickness     rho     vP     qP    vS     qS\n");   for (k = 0; k < nL + 1; k++)   {      fscanf(fp, "%f %f %f %f %f %f\n", &thick[k], &rho[k], &alpha[k], 	     &qP[k], &beta[k], &qS[k]);      if (verbose)	fprintf(stderr,"   %7.4f      %4.3f   %3.2f  %5.1f  %3.2f  %5.1f\n",		thick[k], rho[k], alpha[k], qP[k], beta[k], qS[k]);   }   fclose(fp);   /* setting lim[0] and lim[1] */   for (depth = thick[0], i = 1; i <= nL; depth += thick[i], i++)   {      if (NINT(depth / dZ) <= NINT(limZ[0] / dZ)) lim[0] = i;      if (NINT(depth / dZ) < NINT(limZ[1] / dZ)) lim[1] = i;   }   lim[1]++;   /* some modeling parameters */   /* slowness increment */   dU = (u2 - u1) / (float) nU;   /* computing the window length for the slowness domain */   epslon1 = (u2 - u1) * percU;   wL = NINT(epslon1 / dU);   wL = 2 * wL + 1;   u2 += epslon1;   nU = NINT((u2 - u1) / dU);    /* new nU to preserve last slowness */                                 /* w/o being windowed */   taper = alloc1float(nU);   /* building window for slowness integration */   for (i = (wL - 1) / 2, iU = 0; iU < nU; iU++)   {      taper[iU] = 1;      if (iU >= nU - (wL - 1) / 2)      {         i++;	 taper[iU] =	    .42 - .5 * cos(2 * PI * (float) i / ((float) (wL - 1))) +            .08 * cos(4 * PI * (float) i / ((float) (wL - 1)));      }   }   /* filtering in frequency domain */   filter(percW);      /* building frequency filtering */   /* I will assume that the receivers are in line (at z = 0) so phi = 0 */   phi = 0;   epslon1 = F3;   epslon2 = F1 * cos(phi) + F2 * sin(phi);   /* correction for the 1st layer */   thick[0] -= zs;   /* imaginary part of frequency for damping wrap-around */   tau = log(tau) / tMod;   if (tau > TAUMAX)      tau = TAUMAX;   /* normalization for the complex slowness */   if (f1 > 7.5)      wRef = f1 * 2 * PI;   else      wRef = 7.5 * 2 * PI;   /* reading data and model covariance matrixes */   inputCovar(corrDataFile, corrModelFile);      /* starting inverse procedure */   /* FRECHET derivative matrix  */      gradient();      if (!noFrechet)   {      fp = fopen(frechetFile, "w");      for (i = 0; i < numberPar * limRange; i++)      {	 fwrite(&F[i][0], sizeof(float), nR * nDM, fp);      }      fclose(fp);   }   /* building a-posteriori model covariance matrix */   /* prior information is used */   buffer1 = alloc1float(nDM);   buffer2 = alloc1float(nDM * nR);   if (verbose) fprintf(stderr, "Building posteriori covariance...\n");   for (iParam = 0; iParam < nParam; iParam++)   {      for (i = 0; i < nDM; i++)      {	 for (offset = i, k = 0; k < nDM; k++)	 {	    buffer1[k] = CD[offset];	    offset += MAX(SGN0(i - k) * (nDM - 1 - k), 1);	 }	 /* doing the product CD F */  	 for (iR = 0; iR < nR; iR++)	 {	    buffer2[iR * nDM + i] = 0;	    for (k = 0; k < nDM; k++)  	    {	       buffer2[iR * nDM + i] += buffer1[k] * 		                        F[iParam][iR * nDM + k];	    } 	 }      }            for (j = 0; j < nParam; j++)      {	 CmPostInv[j][iParam] = 0;	 for (k = 0; k < nDM * nR; k++)	 {	    CmPostInv[j][iParam] += buffer2[k] * F[j][k];	 }      }   }   if (verbose)      fprintf(stderr, "Posteriori covariance built. Including prior...\n");   free1float(buffer1);   buffer1 = alloc1float(nParam);   /* including prior covariance matrix */   if (PRIOR)   {       shift = 0;      if (IMPEDANCE)      {	 if (ipFrechet)	 {	    for (iParam = 0; iParam < limRange; iParam++)	    {	       for (offset = iParam, k = 0; k < limRange; k++)	       {		  buffer1[k] = CMP[offset];		  offset += MAX(SGN0(iParam - k) * (limRange - 1 - k), 1);	       }	       	       for (k = 0; k < limRange; k++) 	       {		  CmPostInv[iParam][k] += buffer1[k];	       }	    }            shift += limRange;	 }      }      else      {	 if (vpFrechet)	 {	    for (iParam = 0; iParam < limRange; iParam++)	    {	       for (offset = iParam, k = 0; k < limRange; k++)	       {		  buffer1[k] = CMP[offset];		  offset += MAX(SGN0(iParam - k) * (limRange - 1 - k), 1);	       }	       	       for (k = 0; k < limRange; k++) 	       {		  CmPostInv[iParam][k] += buffer1[k];	       }	    }            shift += limRange;	 }      }      if (IMPEDANCE)      {	 if (isFrechet)	 {	    for (iParam = 0; iParam < limRange; iParam++)	    {	       for (offset = iParam, k = 0; k < limRange; k++)	       {		  buffer1[k] = CMS[offset];		  offset += MAX(SGN0(iParam - k) * (limRange - 1 - k), 1);	       }	       	       for (k = 0; k < limRange; k++)	       {		  CmPostInv[iParam + shift][k + shift] += buffer1[k];	       }	    }            shift += limRange;	 }      }      else      {	 if (vsFrechet)	 {	    for (iParam = 0; iParam < limRange; iParam++)	    {	       for (offset = iParam, k = 0; k < limRange; k++)	       {		  buffer1[k] = CMS[offset];		  offset += MAX(SGN0(iParam - k) * (limRange - 1 - k), 1);	       }	       	       for (k = 0; k < limRange; k++)	       {		  CmPostInv[iParam + shift][k + shift] += buffer1[k];	       }	    }            shift += limRange;	 }      }      if (rhoFrechet)      {	 for (iParam = 0; iParam < limRange; iParam++)	 {	    for (offset = iParam, k = 0; k < limRange; k++)	    {	       buffer1[k] = CMrho[offset];	       offset += MAX(SGN0(iParam - k) * (limRange - 1 - k), 1);	    }	    	    for (k = 0; k < limRange; k++) 	    {	       CmPostInv[iParam + shift][k + shift] += buffer1[k];	    }	 }      }   }   if (verbose) fprintf(stderr, "Prior included. Inverting matrix...\n");   /* freeing memory */   free1float(buffer1);   free1float(buffer2);   free1float(alpha);   free1float(beta);   free1float(rho);   free1float(qP);   free1float(qS);   free1float(thick);   free2complex(PSlowness);   free2complex(SSlowness);   free2complex(S2Velocity);   free1float(CD);   free1float(CMP);   free1float(CMS);   free1float(CMrho);   free2float(F);   free2complex(v1);   free2complex(v2);   free3complex(DmB);   free2complex(derFactor);    free2complex(aux11);   free2complex(aux12);   free2complex(aux21);   free2complex(aux22);    free2complex(aux11Old);   free2complex(aux12Old);   free2complex(aux21Old);   free2complex(aux22Old);    /* inverting the matrix */   CmPost = alloc2float(nParam, nParam);   for (i = 0; i < nParam; i++) for (j = 0; j < nParam; j++)      CmPostInv[i][j] = CmPost[i][j];   inverse_matrix(nParam, CmPostInv);   if (verbose) fprintf(stderr, "Done with inverse matrix routine.\n");      buffer1 = alloc1float(nParam);   gp = fopen(postFile, "w");   for (i = 0; i < nParam; i++)   {      fwrite(CmPostInv[i], sizeof(float), nParam, gp);   }   fclose(fp);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -