📄 modslave.c
字号:
/* 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].r - uuC.r; auxm2 = PSlowness[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].r - uuC.r; auxm2 = SSlowness[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[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];}/**/void Rp(){ /* declaration of variables */ complex aux1, aux12; /* auxiliar variables */ complex wThick; /* auxiliar variable */ complex E[2][2]; /* phase shift matrix */ complex am, bm; /* vertical slownesses for P and S waves */ complex amI, bmI; /* amI = I * am, bmI = I * bm */ complex ambm; /* = am * bm */ complex ambm4uu; /* = 4 * am * bm * uC * uC */ complex den; /* denominator of coefficients */ /* square-root of PSlowness - uuC */ auxm1 = PSlowness[0].r - uuC.r; auxm2 = PSlowness[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].r - uuC.r; auxm2 = SSlowness[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; aux1.r = SSlowness[0].r - uuC2.r; aux1.i = SSlowness[0].i - uuC2.i; aux12.r = aux1.r * aux1.r - aux1.i * aux1.i; aux12.i = 2 * aux1.r * aux1.i; /* let ambm = am * bm */ ambm.r = am.r * bm.r - am.i * bm.i; ambm.i = am.r * bm.i + am.i * bm.r; /* and ambm4uu = am * bm * 4 * uu */ ambm4uu.r = 4 * (ambm.r * uuC.r - ambm.i * uuC.i); ambm4uu.i = 4 * (ambm.r * uuC.i + ambm.i * uuC.r); den.r = aux12.r + ambm4uu.r; den.i = aux12.i + ambm4uu.i; /* 1/ den */ aux = den.r * den.r + den.i * den.i; den.r = den.r / aux; den.i = -den.i / aux; auxm1 = ambm4uu.r - aux12.r; auxm2 = ambm4uu.i - aux12.i; rp[0][0].r = auxm1 * den.r - auxm2 * den.i; rp[0][0].i = auxm1 * den.i + auxm2 * den.r; /* Rpp */ auxm1 = bm.r * aux1.r - bm.i * aux1.i; auxm2 = bm.r * aux1.i + bm.i * aux1.r; auxm3 = 4 * (auxm1 * uC.r - auxm2 * uC.i); auxm4 = 4 * (auxm1 * uC.i + auxm2 * uC.r); rp[0][1].r = den.r * auxm3 - den.i * auxm4; rp[0][1].i = den.r * auxm4 + den.i * auxm3; /* Rsp */ auxm1 = am.r * aux1.r - am.i * aux1.i; auxm2 = am.r * aux1.i + am.i * aux1.r; auxm3 = -4 * (auxm1 * uC.r - auxm2 * uC.i); auxm4 = -4 * (auxm1 * uC.i + auxm2 * uC.r); rp[1][0].r = den.r * auxm3 - den.i * auxm4; rp[1][0].i = den.r * auxm4 + den.i * auxm3; /* Rsp */ rp[1][1].r = -rp[0][0].r; rp[1][1].i = -rp[0][0].i; /* Rss */ /* computing phase-shift matrix */ wThick.r = wC.r * (-2 * zs); wThick.i = wC.i * (-2 * zs); /* 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 */ aux = rp[0][0].r * E[0][0].r - rp[0][0].i * E[0][0].i; rp[0][0].i = rp[0][0].r * E[0][0].i + rp[0][0].i * E[0][0].r; rp[0][0].r = aux; aux = rp[0][1].r * E[0][1].r - rp[0][1].i * E[0][1].i; rp[0][1].i = rp[0][1].r * E[0][1].i + rp[0][1].i * E[0][1].r; rp[0][1].r = aux; aux = rp[1][0].r * E[1][0].r - rp[1][0].i * E[1][0].i; rp[1][0].i = rp[1][0].r * E[1][0].i + rp[1][0].i * E[1][0].r; rp[1][0].r = aux; aux = rp[1][1].r * E[1][1].r - rp[1][1].i * E[1][1].i; rp[1][1].i = rp[1][1].r * E[1][1].i + rp[1][1].i * E[1][1].r; rp[1][1].r = aux;}/* Computation of reflection and transmission coefficients for elastic propagation for a solid-solid boundary. Two situations are considered: 1) Wave incident from layer above (medium 1) (Function RTd) 2) Wave incident from layer below (medium 2) (Function RTu) Both functions return 1 if critical angle is reached Input parameters: alpha1: P-wave velocity of layer1 beta1: S-wave velocity of layer1 rho1: Density of layer1 alpha2: P-wave velocity of layer2 beta2: S-wave velocity of layer2 rho2: Density of layer2 u: horizontal slowness*/void RTd(int i1, int i2){ /* declaration of variables */ complex aux1, aux2, aux3, c; complex cuu, caux3, aux1aux2; /* auxiliar quantities */ complex a1, a2, b1, b2; /* all vertical slownesses */ complex a1b1, a1b2, a2b1, a2b2; /* auxiliar quantities */ complex a1a2b1b2; /* auxiliar quantities */ complex d1d, d2d; /* auxiliar quantities */ complex dpda, dpdb; /* auxiliar quantities */ /* square-root of Pslowness^2 - uuC */ auxm1 = PSlowness[i1].r - uuC.r; auxm2 = PSlowness[i1].i - uuC.i; auxm3 = sqrt(auxm1 * auxm1 + auxm2 * auxm2); auxm3 = sqrt(auxm3); angle = atan2(auxm2, auxm1) / 2; a1.r = auxm3 * cos(angle); a1.i = auxm3 * sin(angle); /* square-root of SSlowness^2 - uuC */ auxm1 = SSlowness[i1].r - uuC.r; auxm2 = SSlowness[i1].i - uuC.i; auxm3 = sqrt(auxm1 * auxm1 + auxm2 * auxm2); auxm3 = sqrt(auxm3); angle = atan2(auxm2, auxm1) / 2; b1.r = auxm3 * cos(angle); b1.i = auxm3 * sin(angle); /* square-root of PSlowness^2 - uuC */ auxm1 = PSlowness[i2].r - uuC.r; auxm2 = PSlowness[i2].i - uuC.i; auxm3 = sqrt(auxm1 * auxm1 + auxm2 * auxm2); auxm3 = sqrt(auxm3); angle = atan2(auxm2, auxm1) / 2; a2.r = auxm3 * cos(angle); a2.i = auxm3 * sin(angle); /* square-root of SSlowness^2 - uuC */ auxm1 = SSlowness[i2].r - uuC.r; auxm2 = SSlowness[i2].i - uuC.i; auxm3 = sqrt(auxm1 * auxm1 + auxm2 * auxm2); auxm3 = sqrt(auxm3); angle = atan2(auxm2, auxm1) / 2; b2.r = auxm3 * cos(angle); b2.i = auxm3 * sin(angle); /* computing auxiliary quantities */ rho1rho2 = rho[i1] * rho[i2]; c.r = 2 * (rho[i1] * S2Velocity[i1].r - rho[i2] * S2Velocity[i2].r);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -