model.h

MODEL1D 结构体相关操作函数

Author

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

Date

2024-07-24

Functions

MODEL1D *grt_init_mod1d(size_t n)

初始化 MODEL1D 内存空间

参数:
  • n[in] 模型层数

返回:

MODEL1D 结构体指针

MODEL1D *grt_copy_mod1d(const MODEL1D *mod1d1)

复制 MODEL1D 结构体

参数:
  • mod1d1[in] MODEL1D 源结构体指针

返回:

复制好的 MODEL1D 结构体指针

void grt_realloc_mod1d(MODEL1D *mod1d, size_t n)

扩容 MODEL1D 结构体

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

  • n[in] 新层数

void grt_free_mod1d(MODEL1D *mod1d)

释放 MODEL1D 结构体指针

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

MODEL1D *grt_read_mod1d_from_file(const char *modelpath, real_t depsrc, real_t deprcv, bool allowLiquid)

从文件中读取模型文件

参数:
  • modelpath[in] 模型文件路径

  • depsrc[in] 震源深度

  • deprcv[in] 接收深度

  • allowLiquid[in] 是否允许液体层

返回:

MODEL1D 结构体指针

void grt_set_mod1d_boundary(MODEL1D *mod1d, GRT_BOUND_TYPE topbound, GRT_BOUND_TYPE botbound)

设置模型的边界条件,并对底界面做检查

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

  • topbound[in] 顶层边界条件

  • botbound[in] 底层边界条件

MODEL1D_STATE *grt_init_mod1d_state(MODEL1D *mod1d)

初始化 MODEL1D_STATE 内存空间

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

返回:

MODEL1D_STATE 结构体指针

MODEL1D_STATE *grt_copy_mod1d_state(const MODEL1D_STATE *mstat1)

复制 MODEL1D_STATE 结构体,但其中 mod1d 指针不变

参数:
返回:

MODEL1D_STATE 结构体指针

void grt_update_mod1d_state_omega(MODEL1D_STATE *mstat, const cplx_t omega, const bool isElastic)

根据给定频率,设置衰减后的弹性参数;若omega实部小于0则视为弹性介质

参数:
  • mstat[inout] MODEL1D_STATE 结构体指针

  • omega[in] 圆频率

  • isElastic[in] 是否为忽略层内的Q值

void grt_update_mod1d_state_k(MODEL1D_STATE *mstat, const real_t k)

根据记录好的圆频率,给定波数,计算相速度和每层的 xa, xb, caca, cbcb

参数:
  • mstat[inout] MODEL1D_STATE 结构体指针

  • k[in] 波数

void grt_free_mod1d_state(MODEL1D_STATE *mstat)

释放 MODEL1D_STATE 结构体指针

参数:
void grt_print_mod1d(const MODEL1D *mod)

打印 MODEL1D 模型参数信息,主要用于调试程序

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

bool grt_check_vel_in_mod(const MODEL1D *mod1d, const real_t vel, const real_t tol)

浮点数比较,检查模型中是否存在该速度(不论Vp,Vs)

参数:
  • mod1d[in] 模型

  • vel[in] 输入速度

  • tol[in] 浮点数比较精度

返回:

是否存在

void grt_get_mod1d_vmin_vmax(const MODEL1D *mod1d, real_t *vmin, real_t *vmax)

计算最大最小速度(非零值)

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

  • vmin[out] 最小速度

  • vmax[out] 最大速度

struct MODEL1D
#include <model.h>

1D 模型结构体,包括多个水平层,以及复数形式的弹性参数

Public Members

size_t n

层数,注意包括了震源和接收点的虚拟层,(n>=3)

real_t depsrc

震源深度 km

real_t deprcv

接收点深度 km

size_t isrc

震源所在虚拟层位, isrc>=1

size_t ircv

接收点所在虚拟层位, ircv>=1, ircv != isrc

bool ircvup

接收点位于浅层, ircv < isrc

bool io_depth

读取的模型首列为每层顶界面深度

bool srcrcv_isInserted

震源和台站是否已经以虚拟层的形式插入

cplx_t omgref

参考圆频率, 用于计算衰减

real_t *Thk

Thk[n], 最后一层厚度不使用(当作正无穷), km.

real_t *Dep

Dep[n], 每一层顶界面深度,第一层必须为 0.0.

real_t *Va

Va[n] P波速度 km/s.

real_t *Vb

Vb[n] S波速度 km/s.

real_t *Rho

Rho[n] 密度 g/cm^3.

real_t *Qa

Qa[n] P波Q值

real_t *Qb

Qb[n] S波Q值

real_t *Qainv

1/Q_p

real_t *Qbinv

1/Q_s

bool *isLiquid

每层是否为液体层

GRT_BOUND_TYPE topbound

顶界面的边界条件

GRT_BOUND_TYPE botbound

底界面的边界条件

struct MODEL1D_STATE

Public Members

MODEL1D *mod1d
cplx_t omega

圆频率

real_t k

波数

cplx_t c_phase

当前相速度

cplx_t *mu

mu[n] \( V_b^2 * \rho \)

cplx_t *lambda

lambda[n] \( V_a^2 * \rho - 2*\mu \)

cplx_t *delta

delta[n] \( (\lambda+\mu)/(\lambda+3*\mu) \)

cplx_t *atna
cplx_t *atnb
cplx_t *xa
cplx_t *xb
cplx_t *caca
cplx_t *cbcb
int stats
RT_MATRIX M_AL
RT_MATRIX M_BL
RT_MATRIX M_RS
RT_MATRIX M_FA
RT_MATRIX M_FB
RT_MATRIX M_top
RT_MATRIX M_bot
cplx_t R_EV[2][2]
cplx_t R_EVL
cplx_t uiz_R_EV[2][2]
cplx_t uiz_R_EVL
size_t neval