kernel.h

动态或静态下计算核函数的函数指针

Author

Zhu Dengda (zhudengda@mail.iggcas.ac.cn)

Date

2025-04-06

Typedefs

typedef void (*GRT_KernelFunc)(GRT_MODEL1D *mod1d, const real_t k, cplx_t QWV[GRT_SRC_M_NUM][GRT_QWV_NUM], bool calc_uiz, cplx_t QWV_uiz[GRT_SRC_M_NUM][GRT_QWV_NUM])

计算核函数的函数指针,动态与静态的接口一致

Functions

void grt_kernel(GRT_MODEL1D *mod1d, const real_t k, cplx_t QWV[GRT_SRC_M_NUM][GRT_QWV_NUM], bool calc_uiz, cplx_t QWV_uiz[GRT_SRC_M_NUM][GRT_QWV_NUM])

kernel函数根据(5.5.3)式递推计算广义反射透射矩阵, 再根据公式得到

1.EX 爆炸源, (P0)

2.VF 垂直力源, (P0, SV0)

3.HF 水平力源, (P1, SV1, SH1)

4.DC 剪切源, (P0, SV0), (P1, SV1, SH1), (P2, SV2, SH2)

\( q_m, w_m, v_m \) 系数( \( m=0,1,2 \)),

eg. DC_qwv[i][j]表示 \( m=i \) 阶时的 \( q_m(j=0), w_m(j=1), v_m(j=2) \) 系数

在递推得到广义反射透射矩阵后,计算位移系数的公式本质是类似的,但根据震源和接受点的相对位置, 空间划分为多个层,公式也使用不同的矩阵,具体为

\[\begin{split} \begin{array}{c} \\\\ \hline \hspace{5cm}\text{Free Surface(自由表面)}\hspace{5cm} \\\\ \text{...} \\\\ \hline \text{Source/Receiver interface(震源/接收虚界面) (A面)} \\\\ \text{...} \\\\ \hline \text{Receiver/Source interface(接收/震源虚界面) (B面)} \\\\ \text{...} \\\\ \hline \text{Lower interface(底界面)} \\\\ \text{...} \\ \text{(无穷深)} \\ \text{...} \\ \end{array} \end{split}\]

界面之间构成一个广义层,每个层都对应2个反射系数矩阵RD/RU和2个透射系数矩阵TD/TU, 根据公式的整理结果,但实际需要的矩阵为:

广义层

台站在震源上方

台站在震源下方

FS (震源 <-> 表面)

RU

RD, RU, TD, TU

FR (接收 <-> 表面)

RD, RU, TD, TU

/

RS (震源 <-> 接收)

RD, RU, TD, TU

RD, RU, TD, TU

SL (震源 <-> 底面)

RD

RD

RL (接收 <-> 底面)

/

RD

为了尽量减少冗余的计算,且保证程序的可读性,可将震源层和接收层抽象为A,B层, 即空间划分为FA,AB,BL, 计算这三个广义层的系数矩阵,再讨论震源层和接收层的深浅, 计算相应的矩阵。

备注

关于与自由表面相关的系数矩阵要注意,FS表示(z1, zR+)之间的效应,但通常我们 定义KP表示(zK+, zP+)之间的效应,所以这里F表示已经加入了自由表面的作用, 对应的我们使用ZR表示(z1+, zR+)的效应,FR和ZR也满足类似的递推关系。

备注

从公式推导上,例如RD_RS,描述的是(zR+, zS-)的效应,但由于我们假定 震源位于介质层内,则z=zS并不是介质的物理分界面,此时 \( D_{j-1}^{-1} * D_j = I \), 故在程序可更方便的编写。(这个在静态情况下不成立,不能以此优化)

备注

接收点位于自由表面的情况 不再单独考虑,合并在接受点浅于震源的情况

参数:
  • mod1d[inout] MODEL1D 结构体指针

  • k[in] 波数

  • QWV[out] 不同震源,不同阶数的核函数 \( q_m, w_m, v_m \)

  • calc_uiz[in] 是否计算ui_z(位移u对坐标z的偏导)

  • QWV_uiz[out] 不同震源,不同阶数的核函数对z的偏导 \( \frac{\partial q_m}{\partial z}, \frac{\partial w_m}{\partial z}, \frac{\partial v_m}{\partial z} \)

void grt_GRT_matrix(GRT_MODEL1D *mod1d, const real_t k)

构建广义反射透射系数矩阵。作为 kernel 函数中的第一部分

void grt_GRT_build_QWV(GRT_MODEL1D *mod1d, cplx_t QWV[GRT_SRC_M_NUM][GRT_QWV_NUM], bool calc_uiz, cplx_t QWV_uiz[GRT_SRC_M_NUM][GRT_QWV_NUM])

从广义 R/T 矩阵出发,计算每个震源对应的核函数 QWV。 作为 kernel 函数中的第二部分

void grt_static_kernel(GRT_MODEL1D *mod1d, const real_t k, cplx_t QWV[GRT_SRC_M_NUM][GRT_QWV_NUM], bool calc_uiz, cplx_t QWV_uiz[GRT_SRC_M_NUM][GRT_QWV_NUM])

静态解的核函数

void grt_static_GRT_matrix(GRT_MODEL1D *mod1d, const real_t k)

静态广义反射透射系数矩阵

void grt_static_GRT_build_QWV(GRT_MODEL1D *mod1d, cplx_t QWV[GRT_SRC_M_NUM][GRT_QWV_NUM], bool calc_uiz, cplx_t QWV_uiz[GRT_SRC_M_NUM][GRT_QWV_NUM])

静态 QWV