📄 reflectivity.c
字号:
dd.i = d1d.i + d2d.i; /* 1 / dd */ aux = dd.r * dd.r + dd.i * dd.i; dd.r = dd.r / aux; dd.i = -dd.i / aux; dpda.r = a1.r * dd.r - a1.i * dd.i; dpda.i = a1.r * dd.i + a1.i * dd.r; dpdb.r = b1.r * dd.r - b1.i * dd.i; dpdb.i = b1.r * dd.i + b1.i * dd.r; /* computing the coefficients - first reflection */ auxm1 = d2d.r - d1d.r; auxm2 = d2d.i - d1d.i; /* (d2d - d1d) / (d1d + d2d) */ coeffD[0].r = auxm1 * dd.r - auxm2 * dd.i; coeffD[0].i = auxm1 * dd.i + auxm2 * dd.r; /* Rpp */ auxm1 = a2b2.r * caux3.r - a2b2.i * caux3.i; auxm2 = a2b2.r * caux3.i + a2b2.i * caux3.r; coeffD[1].r = aux1aux2.r + auxm1; coeffD[1].i = aux1aux2.i + auxm2; /* Rsp */ coeffD[2].r = coeffD[1].r; coeffD[2].i = coeffD[1].i; /* Rps*/ auxm3 = dpdb.r * uC2.r - dpdb.i * uC2.i; auxm4 = dpdb.r * uC2.i + dpdb.i * uC2.r; aux = auxm3 * coeffD[1].r - auxm4 * coeffD[1].i; coeffD[1].i = auxm3 * coeffD[1].i + auxm4 * coeffD[1].r; coeffD[1].r = aux; /* Rsp */ auxm3 = -dpda.r * uC2.r + dpda.i * uC2.i; auxm4 = -dpda.r * uC2.i - dpda.i * uC2.r; aux = auxm3 * coeffD[2].r - auxm4 * coeffD[2].i; coeffD[2].i = auxm3 * coeffD[2].i + auxm4 * coeffD[2].r; coeffD[2].r = aux; /* Rps */ auxm1 = d2d.r - d1d.r; auxm2 = d2d.i - d1d.i; auxm3 = 2 * rho1rho2 * (a1b2.r - a2b1.r); auxm4 = 2 * rho1rho2 * (a1b2.i - a2b1.i); coeffD[3].r = auxm1 - auxm3; coeffD[3].i = auxm2 - auxm4; aux = coeffD[3].r * dd.r - coeffD[3].i * dd.i; coeffD[3].i = coeffD[3].r * dd.i + coeffD[3].i * dd.r; coeffD[3].r = aux; /* Rss */ /* now transmition */ auxm1 = b1.r * aux2.r - b1.i * aux2.i; auxm2 = b1.r * aux2.i + b1.i * aux2.r; auxm3 = b2.r * aux3.r - b2.i * aux3.i; auxm4 = b2.r * aux3.i + b2.i * aux3.r; coeffD[4].r = auxm1 - auxm3; coeffD[4].i = auxm2 - auxm4; aux = 2 * rho[i1] * (dpda.r * coeffD[4].r - dpda.i * coeffD[4].i); coeffD[4].i = 2 * rho[i1] * (dpda.r * coeffD[4].i + dpda.i * coeffD[4].r); coeffD[4].r = aux; /* Tpp */ coeffD[5].r = aux1.r + a1b2.r * c.r - a1b2.i * c.i; coeffD[5].i = aux1.i + a1b2.r * c.i + a1b2.i * c.r; auxm1 = rho[i1] * (dpdb.r * uC2.r - dpdb.i * uC2.i); auxm2 = rho[i1] * (dpdb.r * uC2.i + dpdb.i * uC2.r); aux = coeffD[5].r * auxm1 - coeffD[5].i * auxm2; coeffD[5].i = coeffD[5].r * auxm2 + coeffD[5].i * auxm1; /* Tsp */ coeffD[5].r = aux; coeffD[6].r = aux1.r + a2b1.r * c.r - a2b1.i * c.i; coeffD[6].i = aux1.i + a2b1.r * c.i + a2b1.i * c.r; auxm1 = -rho[i1] * (dpda.r * uC2.r - dpda.i * uC2.i); auxm2 = -rho[i1] * (dpda.r * uC2.i + dpda.i * uC2.r); aux = coeffD[6].r * auxm1 - coeffD[6].i * auxm2; coeffD[6].i = coeffD[6].r * auxm2 + coeffD[6].i * auxm1; /* Tsp */ coeffD[6].r = aux; auxm1 = a1.r * aux2.r - a1.i * aux2.i; auxm2 = a1.r * aux2.i + a1.i * aux2.r; coeffD[7].r = auxm1 - (a2.r * aux3.r - a2.i * aux3.i); coeffD[7].i = auxm2 - (a2.r * aux3.i + a2.i * aux3.r); auxm3 = 2 * rho[i1] * dpdb.r; auxm4 = 2 * rho[i1] * dpdb.i; aux = coeffD[7].r * auxm3 - coeffD[7].i * auxm4; coeffD[7].i = coeffD[7].r * auxm4 + coeffD[7].i * auxm3; /* Tss */ coeffD[7].r = aux;}/* *//* Function Rm() *//* *//* Computing reflectivity matrices for a given model at a *//* specific slowness and temporal frequency *//* *//* Input parameters: *//* alpha..................p-wave velocities of the model *//* global variable *//* beta...................s-wave velocities of the model *//* global variable *//* rho....................densities of the elastic model *//* global variable *//* thick..................thicknesses of the model *//* global variable *//* wC.....................complex frequency *//* global variable *//* uC.....................complex slowness *//* global variable *//* *//* Output parameters: *//* rm.....................the reflectivity matrix *//* Wences Gouveia *//* September 1995 */void Rm(){ /* declaration of variables */ int iL; /* counter */ complex aux1; /* auxiliar quantities */ complex am, amI, bm, bmI; /* vertical slownesses for P and S waves */ /* amI = am * I, bmI = bm * I */ complex wThick; /* wC * thickness */ complex E[2][2]; /* phase-shift matrix */ complex mT[2][2]; /* reflectivity matrix at top of layer */ complex mTtD[2][2]; /* mt * tD */ complex tUinv[2][2]; /* tU * inv */ complex mB[2][2]; /* reflectivity matrix at bottom of layer */ complex rD[2][2], tD[2][2]; /* reflec. and transm. coefficients for */ /* downgoing waves */ complex rU[2][2], tU[2][2]; /* reflec. and transm. coefficients for */ /* upgoing waves */ complex mAux[2][2]; /* auxiliar matrix */ complex inv[2][2]; /* inv = (I - mT * rU)^-1 */ /* initializing the reflectivity matrix at the bottom of half space */ mT[0][0] = zeroC; mT[0][1] = zeroC; mT[1][0] = zeroC; mT[1][1] = zeroC; /* initializing the reflectivity matrix at the bottom */ /* of layer nL - 1 */ RTd(nL - 1, nL); mB[0][0] = coeffD[0]; mB[0][1] = coeffD[1]; mB[1][0] = coeffD[2]; mB[1][1] = coeffD[3]; /* main loop over the nL layers */ for (iL = nL - 1; iL >= 1; iL--) { /* square-root of PSlowness^2 - uuC */ auxm1 = PSlowness[iL][0].r - uuC.r; auxm2 = PSlowness[iL][0].i - uuC.i; auxm3 = sqrt(auxm1 * auxm1 + auxm2 * auxm2); auxm3 = sqrt(auxm3); angle = atan2(auxm2, auxm1) / 2; am.r = auxm3 * cos(angle); am.i = auxm3 * sin(angle); /* am * I */ amI.r = -am.i; amI.i = am.r; /* square-root of SSlowness^2 - uuC */ auxm1 = SSlowness[iL][0].r - uuC.r; auxm2 = SSlowness[iL][0].i - uuC.i; auxm3 = sqrt(auxm1 * auxm1 + auxm2 * auxm2); auxm3 = sqrt(auxm3); angle = atan2(auxm2, auxm1) / 2; 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[iL]); wThick.i = wC.i * (-2 * thick[iL]); /* 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; /* bottom-layer matrix - need a sequence of Ref and TRANS coeff. */ RTd(iL - 1, iL); rD[0][0] = coeffD[0]; rD[0][1] = coeffD[1]; rD[1][0] = coeffD[2]; rD[1][1] = coeffD[3]; tD[0][0] = coeffD[4]; tD[0][1] = coeffD[5]; tD[1][0] = coeffD[6]; tD[1][1] = coeffD[7]; /* computing mT * tD */ mTtD[0][0].r = mT[0][0].r * tD[0][0].r - mT[0][0].i * tD[0][0].i + mT[0][1].r * tD[1][0].r - mT[0][1].i * tD[1][0].i; mTtD[0][0].i = mT[0][0].r * tD[0][0].i + mT[0][0].i * tD[0][0].r + mT[0][1].r * tD[1][0].i + mT[0][1].i * tD[1][0].r; mTtD[0][1].r = mT[0][0].r * tD[0][1].r - mT[0][0].i * tD[0][1].i + mT[0][1].r * tD[1][1].r - mT[0][1].i * tD[1][1].i; mTtD[0][1].i = mT[0][0].r * tD[0][1].i + mT[0][0].i * tD[0][1].r + mT[0][1].r * tD[1][1].i + mT[0][1].i * tD[1][1].r; mTtD[1][0].r = mT[1][0].r * tD[0][0].r - mT[1][0].i * tD[0][0].i + mT[1][1].r * tD[1][0].r - mT[1][1].i * tD[1][0].i; mTtD[1][0].i = mT[1][0].r * tD[0][0].i + mT[1][0].i * tD[0][0].r + mT[1][1].r * tD[1][0].i + mT[1][1].i * tD[1][0].r; mTtD[1][1].r = mT[1][0].r * tD[0][1].r - mT[1][0].i * tD[0][1].i + mT[1][1].r * tD[1][1].r - mT[1][1].i * tD[1][1].i; mTtD[1][1].i = mT[1][0].r * tD[0][1].i + mT[1][0].i * tD[0][1].r + mT[1][1].r * tD[1][1].i + mT[1][1].i * tD[1][1].r; RTu(iL - 1, iL); rU[0][0] = coeffU[0]; rU[0][1] = coeffU[1]; rU[1][0] = coeffU[2]; rU[1][1] = coeffU[3]; tU[0][0] = coeffU[4]; tU[0][1] = coeffU[5]; tU[1][0] = coeffU[6]; tU[1][1] = coeffU[7]; /* inv = (I - mT * rU)^-1 */ auxm1 = mT[0][0].r * rU[0][0].r - mT[0][0].i * rU[0][0].i; auxm2 = mT[0][0].r * rU[0][0].i + mT[0][0].i * rU[0][0].r; auxm3 = mT[0][1].r * rU[1][0].r - mT[0][1].i * rU[1][0].i; auxm4 = mT[0][1].r * rU[1][0].i + mT[0][1].i * rU[1][0].r; mAux[0][0].r = 1 - (auxm1 + auxm3); mAux[0][0].i = - (auxm2 + auxm4); auxm1 = mT[0][0].r * rU[0][1].r - mT[0][0].i * rU[0][1].i; auxm2 = mT[0][0].r * rU[0][1].i + mT[0][0].i * rU[0][1].r; auxm3 = mT[0][1].r * rU[1][1].r - mT[0][1].i * rU[1][1].i; auxm4 = mT[0][1].r * rU[1][1].i + mT[0][1].i * rU[1][1].r; mAux[0][1].r = - (auxm1 + auxm3); mAux[0][1].i = - (auxm2 + auxm4); auxm1 = mT[1][0].r * rU[0][0].r - mT[1][0].i * rU[0][0].i; auxm2 = mT[1][0].r * rU[0][0].i + mT[1][0].i * rU[0][0].r; auxm3 = mT[1][1].r * rU[1][0].r - mT[1][1].i * rU[1][0].i; auxm4 = mT[1][1].r * rU[1][0].i + mT[1][1].i * rU[1][0].r; mAux[1][0].r = - (auxm1 + auxm3); mAux[1][0].i = - (auxm2 + auxm4); auxm1 = mT[1][0].r * rU[0][1].r - mT[1][0].i * rU[0][1].i; auxm2 = mT[1][0].r * rU[0][1].i + mT[1][0].i * rU[0][1].r; auxm3 = mT[1][1].r * rU[1][1].r - mT[1][1].i * rU[1][1].i; auxm4 = mT[1][1].r * rU[1][1].i + mT[1][1].i * rU[1][1].r; mAux[1][1].r = 1 - (auxm1 + auxm3); mAux[1][1].i = - (auxm2 + auxm4); /* inverting */ auxm1 = mAux[0][0].r * mAux[1][1].r - mAux[0][0].i * mAux[1][1].i; auxm2 = mAux[0][0].r * mAux[1][1].i + mAux[0][0].i * mAux[1][1].r; auxm3 = mAux[0][1].r * mAux[1][0].r - mAux[0][1].i * mAux[1][0].i; auxm4 = mAux[0][1].r * mAux[1][0].i + mAux[0][1].i * mAux[1][0].r; aux1.r = auxm1 - auxm3; aux1.i = auxm2 - auxm4; /* 1 / aux1 */ aux = aux1.r * aux1.r + aux1.i * aux1.i; aux1.r = aux1.r / aux; aux1.i = -aux1.i / aux; inv[0][0].r = mAux[1][1].r * aux1.r - mAux[1][1].i * aux1.i; inv[0][0].i = mAux[1][1].r * aux1.i + mAux[1][1].i * aux1.r; inv[0][1].r = -1 * (mAux[0][1].r * aux1.r - mAux[0][1].i * aux1.i); inv[0][1].i = -1 * (mAux[0][1].r * aux1.i + mAux[0][1].i * aux1.r); inv[1][0].r = -1 * (mAux[1][0].r * aux1.r - mAux[1][0].i * aux1.i); inv[1][0].i = -1 * (mAux[1][0].r * aux1.i + mAux[1][0].i * aux1.r); inv[1][1].r = mAux[0][0].r * aux1.r - mAux[0][0].i * aux1.i; inv[1][1].i = mAux[0][0].r * aux1.i + mAux[0][0].i * aux1.r; /* computing tU * inv */ tUinv[0][0].r = tU[0][0].r * inv[0][0].r - tU[0][0].i * inv[0][0].i + tU[0][1].r * inv[1][0].r - tU[0][1].i * inv[1][0].i; tUinv[0][0].i = tU[0][0].r * inv[0][0].i + tU[0][0].i * inv[0][0].r + tU[0][1].r * inv[1][0].i + tU[0][1].i * inv[1][0].r; tUinv[0][1].r = tU[0][0].r * inv[0][1].r - tU[0][0].i * inv[0][1].i + tU[0][1].r * inv[1][1].r - tU[0][1].i * inv[1][1].i; tUinv[0][1].i = tU[0][0].r * inv[0][1].i + tU[0][0].i * inv[0][1].r + tU[0][1].r * inv[1][1].i + tU[0][1].i * inv[1][1].r; tUinv[1][0].r = tU[1][0].r * inv[0][0].r - tU[1][0].i * inv[0][0].i + tU[1][1].r * inv[1][0].r - tU[1][1].i * inv[1][0].i; tUinv[1][0].i = tU[1][0].r * inv[0][0].i + tU[1][0].i * inv[0][0].r + tU[1][1].r * inv[1][0].i + tU[1][1].i * inv[1][0].r; tUinv[1][1].r = tU[1][0].r * inv[0][1].r - tU[1][0].i * inv[0][1].i + tU[1][1].r * inv[1][1].r - tU[1][1].i * inv[1][1].i; tUinv[1][1].i = tU[1][0].r * inv[0][1].i + tU[1][0].i * inv[0][1].r + tU[1][1].r * inv[1][1].i + tU[1][1].i * inv[1][1].r; /* finally the matrix */ auxm1 = mTtD[0][0].r * tUinv[0][0].r - mTtD[0][0].i * tUinv[0][0].i; auxm2 = mTtD[0][0].r * tUinv[0][0].i + mTtD[0][0].i * tUinv[0][0].r; auxm3 = mTtD[1][0].r * tUinv[0][1].r - mTtD[1][0].i * tUinv[0][1].i; auxm4 = mTtD[1][0].r * tUinv[0][1].i + mTtD[1][0].i * tUinv[0][1].r; mB[0][0].r = rD[0][0].r + (auxm1 + auxm3); mB[0][0].i = rD[0][0].i + (auxm2 + auxm4); auxm1 = mTtD[0][1].r * tUinv[0][0].r - mTtD[0][1].i * tUinv[0][0].i; auxm2 = mTtD[0][1].r * tUinv[0][0].i + mTtD[0][1].i * tUinv[0][0].r; auxm3 = mTtD[1][1].r * tUinv[0][1].r - mTtD[1][1].i * tUinv[0][1].i; auxm4 = mTtD[1][1].r * tUinv[0][1].i + mTtD[1][1].i * tUinv[0][1].r; mB[0][1].r = rD[0][1].r + (auxm1 + auxm3); mB[0][1].i = rD[0][1].i + (auxm2 + auxm4); auxm1 = mTtD[0][0].r * tUinv[1][0].r - mTtD[0][0].i * tUinv[1][0].i; auxm2 = mTtD[0][0].r * tUinv[1][0].i + mTtD[0][0].i * tUinv[1][0].r; auxm3 = mTtD[1][0].r * tUinv[1][1].r - mTtD[1][0].i * tUinv[1][1].i; auxm4 = mTtD[1][0].r * tUinv[1][1].i + mTtD[1][0].i * tUinv[1][1].r; mB[1][0].r = rD[1][0].r + (auxm1 + auxm3); mB[1][0].i = rD[1][0].i + (auxm2 + auxm4); auxm1 = mTtD[0][1].r * tUinv[1][0].r - mTtD[0][1].i * tUinv[1][0].i; auxm2 = mTtD[0][1].r * tUinv[1][0].i + mTtD[0][1].i * tUinv[1][0].r; auxm3 = mTtD[1][1].r * tUinv[1][1].r - mTtD[1][1].i * tUinv[1][1].i; auxm4 = mTtD[1][1].r * tUinv[1][1].i + mTtD[1][1].i * tUinv[1][1].r; mB[1][1].r = rD[1][1].r + (auxm1 + auxm3); mB[1][1].i = rD[1][1].i + (auxm2 + auxm4); } /* computing final phase-shift matrix */ /* square-root of Pslowness^2 - uuC */ auxm1 = PSlowness[0][0].r - uuC.r; auxm2 = PSlowness[0][0].i - uuC.i; auxm3 = sqrt(auxm1 * auxm1 + auxm2 * auxm2); auxm3 = sqrt(auxm3); angle = atan2(auxm2, auxm1) / 2; am.r = auxm3 * cos(angle); am.i = auxm3 * sin(angle); /* am * I */ amI.r = -am.i; amI.i = am.r; /* square-root of SSlowness^2 - uuC */ auxm1 = SSlowness[0][0].r - uuC.r; auxm2 = SSlowness[0][0].i - uuC.i; auxm3 = sqrt(auxm1 * auxm1 + auxm2 * auxm2); auxm3 = sqrt(auxm3); angle = atan2(auxm2, auxm1) / 2; bm.r = auxm3 * cos(angle); bm.i = auxm3 * sin(angle); /* bm * I */ bmI.r = -bm.i; bmI.i = bm.r;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -