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

📄 frechet.c

📁 su 的源代码库
💻 C
📖 第 1 页 / 共 5 页
字号:
   bm.r = auxm3 * cos(angle);   bm.i = auxm3 * sin(angle);   /* bm * I */   bmI.r = -bm.i;   bmI.i = bm.r;      /* computing phase-shift matrix */   wThick.r = wC.r * (-2 * thick[0]);   wThick.i = wC.i * (-2 * thick[0]);   /* cexp (amI * wThick) */   auxm1 = amI.r * wThick.r - amI.i * wThick.i;   auxm2 = amI.r * wThick.i + amI.i * wThick.r;   E[0][0].r = exp(auxm1) * cos(auxm2);   E[0][0].i = exp(auxm1) * sin(auxm2);   /* cexp((amI + bmI) * (wThick * .5)) */   auxm1 = amI.r + bmI.r;   auxm2 = amI.i + bmI.i;   auxm3 = .5 * (auxm1 * wThick.r - auxm2 * wThick.i);   auxm4 = .5 * (auxm1 * wThick.i + auxm2 * wThick.r);   E[0][1].r = exp(auxm3) * cos(auxm4);   E[0][1].i = exp(auxm3) * sin(auxm4);      E[1][0] = E[0][1];   /* cexp (bmI * wThick) */   auxm1 = bmI.r * wThick.r - bmI.i * wThick.i;   auxm2 = bmI.r * wThick.i + bmI.i * wThick.r;   E[1][1].r = exp(auxm1) * cos(auxm2);   E[1][1].i = exp(auxm1) * sin(auxm2);   /* applying phase-shift */   mT[0][0].r = mB[0][0].r * E[0][0].r - mB[0][0].i * E[0][0].i;   mT[0][0].i = mB[0][0].r * E[0][0].i + mB[0][0].i * E[0][0].r;   mT[0][1].r = mB[0][1].r * E[0][1].r - mB[0][1].i * E[0][1].i;   mT[0][1].i = mB[0][1].r * E[0][1].i + mB[0][1].i * E[0][1].r;   mT[1][0].r = mB[1][0].r * E[1][0].r - mB[1][0].i * E[1][0].i;   mT[1][0].i = mB[1][0].r * E[1][0].i + mB[1][0].i * E[1][0].r;   mT[1][1].r = mB[1][1].r * E[1][1].r - mB[1][1].i * E[1][1].i;   mT[1][1].i = mB[1][1].r * E[1][1].i + mB[1][1].i * E[1][1].r;   /* copying to matrix rm */   rm[0][0] = mT[0][0]; rm[0][1] = mT[0][1];   rm[1][0] = mT[1][0]; rm[1][1] = mT[1][1];   /* applying phase-shift in the FRECHET derivatives as well */   for (iDer = 0; iDer < numberPar; iDer++)   {      /* Vp -> Vs -> rho, if all active */      for (i = 0, iL = MIN(lim[0], 2); i < limRange; iL++, i++)       {	 aux = DmB[0][limRange * iDer + iL][0].r * E[0][0].r - 	       DmB[0][limRange * iDer + iL][0].i * E[0][0].i;	 DmB[0][limRange * iDer + iL][0].i = 	       DmB[0][limRange * iDer + iL][0].r * E[0][0].i + 	       DmB[0][limRange * iDer + iL][0].i * E[0][0].r;	 DmB[0][limRange * iDer + iL][0].r = aux;	 aux = DmB[0][limRange * iDer + iL][1].r * E[0][1].r - 	       DmB[0][limRange * iDer + iL][1].i * E[0][1].i;	 DmB[0][limRange * iDer + iL][1].i = 	       DmB[0][limRange * iDer + iL][1].r * E[0][1].i + 	       DmB[0][limRange * iDer + iL][1].i * E[0][1].r;	 DmB[0][limRange * iDer + iL][1].r = aux;	 aux = DmB[0][limRange * iDer + iL][2].r * E[1][0].r - 	       DmB[0][limRange * iDer + iL][2].i * E[1][0].i;	 DmB[0][limRange * iDer + iL][2].i = 	       DmB[0][limRange * iDer + iL][2].r * E[1][0].i + 	       DmB[0][limRange * iDer + iL][2].i * E[1][0].r;	 DmB[0][limRange * iDer + iL][2].r = aux;	 aux = DmB[0][limRange * iDer + iL][3].r * E[1][1].r - 	       DmB[0][limRange * iDer + iL][3].i * E[1][1].i;	 DmB[0][limRange * iDer + iL][3].i = 	       DmB[0][limRange * iDer + iL][3].r * E[1][1].i + 	       DmB[0][limRange * iDer + iL][3].i * E[1][1].r;	 DmB[0][limRange * iDer + iL][3].r = aux;      }   }}/*                                                              *//*  Function frechetRm()                                        *//*                                                              *//*  Computing Frechet derivatives for the reflectivity          *//*  matrix rm                                                   *//*                                                              *//*  Input parameters:                                           *//*  E[2][2]................phase shift matrix                   *//*  tD[2][2]...............downgoing transmission coefficients  *//*  rU[2][2]...............upgoing reflection coefficients      *//*  mT.....................partial reflectivity matrix          *//*  inv....................(I - mT * rU)^-1                     *//*  wThick.................wC * thickness                       *//*  am.....................p-wave vertical slowness             *//*  bm.....................s-wave vertical slowness             *//*  iL.....................points to the current layer          *//*                                                              *//*  Output parameters:                                          *//*  DmB....................Frechet derivatives of the           *//*                         reflectivity matrix at level iL      *//*                                                              *//*                                              Wences Gouveia  *//*                                              September 1995  */void frechetRm(complex E[2][2], complex tD[2][2], complex tUinv[2][2], 	       complex mTtD[2][2], complex mT[2][2], complex rU[2][2], 	       complex inv[2][2], complex wThick, complex am, 	       complex bm, int iL){   /* declaration of variables */   int iDer, k, kDer=0, kPnt=0;           /* counters */   complex sInv;                          /* 1 / Slowness */   static complex DrD[2][2], DtD[2][2];   /* coefficient derivatives */   static complex DrU[2][2], DtU[2][2];   /* coefficient derivatives */   static complex factor1[2][2], factor2[2][2], factor3[2][2];   static complex A[2][2], B[2][2], C[2][2];                                          /* auxiliar variables */   static complex invmTtD[2][2];          /* inv * mT * tD */      /* inv * mTtD */   matMult(invmTtD, inv, mTtD);   /* pointer to previous derivatives */   for (k = MAX(iL - 1, lim[0]), kDer = 2; k < lim[1]; k++)   {      /* considering special cases */      if (k == iL - 1)      {	 /* differentiating reflection and transmition coefficients */	 frechetRTd(iL - 1, iL, iL - 1);	 frechetRTu(iL - 1, iL, iL - 1);	 	 for (iDer = 0; iDer < numberPar; iDer++)	 {	    /* Vp -> Vs -> rho, if all active */	    DrD[0][0] = coeffDFr[iDer][0]; DrD[0][1] = coeffDFr[iDer][1]; 	    DrD[1][0] = coeffDFr[iDer][2]; DrD[1][1] = coeffDFr[iDer][3];	 	    DtD[0][0] = coeffDFr[iDer][4]; DtD[0][1] = coeffDFr[iDer][5]; 	    DtD[1][0] = coeffDFr[iDer][6]; DtD[1][1] = coeffDFr[iDer][7];	 	    DrU[0][0] = coeffUFr[iDer][0]; DrU[0][1] = coeffUFr[iDer][1]; 	    DrU[1][0] = coeffUFr[iDer][2]; DrU[1][1] = coeffUFr[iDer][3];	 	    DtU[0][0] = coeffUFr[iDer][4]; DtU[0][1] = coeffUFr[iDer][5]; 	    DtU[1][0] = coeffUFr[iDer][6]; DtU[1][1] = coeffUFr[iDer][7];	    /* DtU * invmTtD */	    matMult(factor1, DtU, invmTtD);	    /* mT * DrU */	    matMult(A, mT, DrU);	    /* A * mTtD */	    matMult(B, A, invmTtD);	    /* C * tUinv */	    matMult(factor2, tUinv, B);	    	    /* mT * DtD */	    matMult(A, mT, DtD);	    /* tUinv * A */	    matMult(factor3, tUinv, A);	    	    /* compounding factors */	    /*      [ 0  1 ]       */	    /*      [ 2  3 ]       */	    DmB[iL - 1][limRange * iDer + 0][0].r = DrD[0][0].r + 	       factor1[0][0].r + factor2[0][0].r + factor3[0][0].r;	    DmB[iL - 1][limRange * iDer + 0][0].i = DrD[0][0].i + 	       factor1[0][0].i + factor2[0][0].i + factor3[0][0].i;	    DmB[iL - 1][limRange * iDer + 0][1].r = DrD[0][1].r + 	       factor1[0][1].r + factor2[0][1].r + factor3[0][1].r;	    DmB[iL - 1][limRange * iDer + 0][1].i = DrD[0][1].i + 	       factor1[0][1].i + factor2[0][1].i + factor3[0][1].i;	    DmB[iL - 1][limRange * iDer + 0][2].r = DrD[1][0].r + 	       factor1[1][0].r + factor2[1][0].r + factor3[1][0].r;	    DmB[iL - 1][limRange * iDer + 0][2].i = DrD[1][0].i + 	       factor1[1][0].i + factor2[1][0].i + factor3[1][0].i;	    DmB[iL - 1][limRange * iDer + 0][3].r = DrD[1][1].r + 	       factor1[1][1].r + factor2[1][1].r + factor3[1][1].r;	    DmB[iL - 1][limRange * iDer + 0][3].i = DrD[1][1].i + 	       factor1[1][1].i +  factor2[1][1].i + factor3[1][1].i;	 }      }      else if (k == iL)      {	 /* differentiating reflection and transmition coefficients */	 frechetRTd(iL - 1, iL, iL);	 frechetRTu(iL - 1, iL, iL);	 	 /* saving flags */	 vpF = vpFrechet;	 vsF = vsFrechet;	 rhoF = rhoFrechet;	 for (iDer = 0; iDer < numberPar; iDer++)	 {	    /* Vp -> Vs -> rho */	    DrD[0][0] = coeffDFr[iDer][0]; DrD[0][1] = coeffDFr[iDer][1]; 	    DrD[1][0] = coeffDFr[iDer][2]; DrD[1][1] = coeffDFr[iDer][3];	 	    DtD[0][0] = coeffDFr[iDer][4]; DtD[0][1] = coeffDFr[iDer][5]; 	    DtD[1][0] = coeffDFr[iDer][6]; DtD[1][1] = coeffDFr[iDer][7];	    	    DrU[0][0] = coeffUFr[iDer][0]; DrU[0][1] = coeffUFr[iDer][1]; 	    DrU[1][0] = coeffUFr[iDer][2]; DrU[1][1] = coeffUFr[iDer][3];	    	    DtU[0][0] = coeffUFr[iDer][4]; DtU[0][1] = coeffUFr[iDer][5]; 	    DtU[1][0] = coeffUFr[iDer][6]; DtU[1][1] = coeffUFr[iDer][7];	    	    /* DtU * invmTtD */	    matMult(factor1, DtU, invmTtD);	    	    /* applying phase-shift on D (MB_iL+1) / D (iL+1) */	    /*      [ 0  1 ]       */	    /*      [ 2  3 ]       */	    A[0][0].r = DmB[iL][limRange * iDer + 0][0].r * E[0][0].r  	              - DmB[iL][limRange * iDer + 0][0].i * E[0][0].i;	    A[0][0].i = DmB[iL][limRange * iDer + 0][0].r * E[0][0].i 	              + DmB[iL][limRange * iDer + 0][0].i * E[0][0].r;	    A[0][1].r = DmB[iL][limRange * iDer + 0][1].r * E[0][1].r 	              - DmB[iL][limRange * iDer + 0][1].i * E[0][1].i;	    A[0][1].i = DmB[iL][limRange * iDer + 0][1].r * E[0][1].i 	              + DmB[iL][limRange * iDer + 0][1].i * E[0][1].r;	    A[1][0].r = DmB[iL][limRange * iDer + 0][2].r * E[1][0].r 	              - DmB[iL][limRange * iDer + 0][2].i * E[1][0].i;	    A[1][0].i = DmB[iL][limRange * iDer + 0][2].r * E[1][0].i 	              + DmB[iL][limRange * iDer + 0][2].i * E[1][0].r;	    A[1][1].r = DmB[iL][limRange * iDer + 0][3].r * E[1][1].r 	              - DmB[iL][limRange * iDer + 0][3].i * E[1][1].i;	    A[1][1].i = DmB[iL][limRange * iDer + 0][3].r * E[1][1].i 	              + DmB[iL][limRange * iDer + 0][3].i * E[1][1].r;	    	    /* things now are different if the derivative is being */	    /* taken with respect to P_wave, S_wave velocities or */	    /* densities */	    if (vpFrechet) /* P-wave */	    {	       /* mT * [i wThick] */	       /* note that wThick includes the - sign */	       auxm1 = -wThick.i; auxm2 = wThick.r;	       B[0][0].r = mT[0][0].r * auxm1 - mT[0][0].i * auxm2;	       B[0][0].i = mT[0][0].r * auxm2 + mT[0][0].i * auxm1;	       B[0][1].r = 0.5 * (mT[0][1].r * auxm1 - mT[0][1].i * auxm2);	       B[0][1].i = 0.5 * (mT[0][1].r * auxm2 + mT[0][1].i * auxm1);	       B[1][0].r = 0.5 * (mT[1][0].r * auxm1 - mT[1][0].i * auxm2);	       B[1][0].i = 0.5 * (mT[1][0].r * auxm2 + mT[1][0].i * auxm1);	       B[1][1].r = mT[1][1].r * auxm1 - mT[1][1].i * auxm2;	       B[1][1].i = mT[1][1].r * auxm2 + mT[1][1].i * auxm1;	       	       /* 1 / am */	       aux = am.r * am.r + am.i * am.i;	       sInv.r = am.r / aux;	       sInv.i = -am.i / aux;	       	       /* 1 / am * derFactor[0] */	       auxm1 = sInv.r * derFactor[iL][0].r - 		       sInv.i * derFactor[iL][0].i;	       auxm2 = sInv.r * derFactor[iL][0].i + 		       sInv.i * derFactor[iL][0].r;	       	       C[0][0].r = A[0][0].r - (B[0][0].r * auxm1 - B[0][0].i * auxm2);	       C[0][0].i = A[0][0].i - (B[0][0].r * auxm2 + B[0][0].i * auxm1);	       C[0][1].r = A[0][1].r - (B[0][1].r * auxm1 - B[0][1].i * auxm2);	       C[0][1].i = A[0][1].i - (B[0][1].r * auxm2 + B[0][1].i * auxm1);	       C[1][0].r = A[1][0].r - (B[1][0].r * auxm1 - B[1][0].i * auxm2);	       C[1][0].i = A[1][0].i - (B[1][0].r * auxm2 + B[1][0].i * auxm1);	       C[1][1] = A[1][1];	       vpFrechet = 0;	    }	    else if (vsFrechet) /* S-wave */	    {	       /* mT * [i -wThick] */	       /* note that wThick includes the - sign */	       auxm1 = -wThick.i; auxm2 = wThick.r;	       B[0][0].r = mT[0][0].r * auxm1 - mT[0][0].i * auxm2;	       B[0][0].i = mT[0][0].r * auxm2 + mT[0][0].i * auxm1;	       B[0][1].r = 0.5 * (mT[0][1].r * auxm1 - mT[0][1].i * auxm2);	       B[0][1].i = 0.5 * (mT[0][1].r * auxm2 + mT[0][1].i * auxm1);	       B[1][0].r = 0.5 * (mT[1][0].r * auxm1 - mT[1][0].i * auxm2);	       B[1][0].i = 0.5 * (mT[1][0].r * auxm2 + mT[1][0].i * auxm1);	       B[1][1].r = mT[1][1].r * auxm1 - mT[1][1].i * auxm2;	       B[1][1].i = mT[1][1].r * auxm2 + mT[1][1].i * auxm1;	       /* 1 / bm */	       aux = bm.r * bm.r + bm.i * bm.i;	       sInv.r = bm.r / aux;	       sInv.i = -bm.i / aux;	       	       /* 1 / Slowness * derFactor[1] */	       auxm1 = sInv.r * derFactor[iL][1].r - 		       sInv.i * derFactor[iL][1].i;	       auxm2 = sInv.r * derFactor[iL][1].i + 		       sInv.i * derFactor[iL][1].r;	    	       C[0][0] = A[0][0];	       C[0][1].r = A[0][1].r - (B[0][1].r * auxm1 - B[0][1].i * auxm2);	       C[0][1].i = A[0][1].i - (B[0][1].r * auxm2 + B[0][1].i * auxm1);	       C[1][0].r = A[1][0].r - (B[1][0].r * auxm1 - B[1][0].i * auxm2);	       C[1][0].i = A[1][0].i - (B[1][0].r * auxm2 + B[1][0].i * auxm1);	       C[1][1].r = A[1][1].r - (B[1][1].r * auxm1 - B[1][1].i * auxm2);	       C[1][1].i = A[1][1].i - (B[1][1].r * auxm2 + B[1][1].i * auxm1);	       vsFrechet = 0;	    }	    else if (rhoFrechet) /* Density */	    {	       C[0][0] = A[0][0];	       C[0][1] = A[0][1];	       C[1][0] = A[1][0];	       C[1][1] = A[1][1];	       rhoFrechet = 0;	    }	 	    /* C * rU */	    matMult(A, C, rU);	    /* mT * DrU */	    matMult(B, mT, DrU);	    A[0][0].r += B[0][0].r;	    A[0][0].i += B[0][0].i;	    A[0][1].r += B[0][1].r;

⌨️ 快捷键说明

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