diff --git a/pygrt/C_extension/include/grt/common/model.h b/pygrt/C_extension/include/grt/common/model.h index 59e374b..75eb0d8 100755 --- a/pygrt/C_extension/include/grt/common/model.h +++ b/pygrt/C_extension/include/grt/common/model.h @@ -163,11 +163,12 @@ MODEL1D_STATE * grt_copy_mod1d_state(const MODEL1D_STATE *mstat1); /** * 根据给定频率,设置衰减后的弹性参数;若omega实部小于0则视为弹性介质 * - * @param[in,out] mstat `MODEL1D_STATE` 结构体指针 - * @param[in] omega 圆频率 + * @param[in,out] mstat `MODEL1D_STATE` 结构体指针 + * @param[in] omega 圆频率 + * @param[in] isElastic 是否为忽略层内的Q值 * */ -void grt_update_mod1d_state_omega(MODEL1D_STATE *mstat, const cplx_t omega); +void grt_update_mod1d_state_omega(MODEL1D_STATE *mstat, const cplx_t omega, const bool isElastic); /** * 根据记录好的圆频率,给定波数,计算相速度和每层的 xa, xb, caca, cbcb diff --git a/pygrt/C_extension/src/common/model.c b/pygrt/C_extension/src/common/model.c index 4087c79..781ae29 100755 --- a/pygrt/C_extension/src/common/model.c +++ b/pygrt/C_extension/src/common/model.c @@ -360,7 +360,7 @@ MODEL1D_STATE * grt_copy_mod1d_state(const MODEL1D_STATE *mstat1) } -void grt_update_mod1d_state_omega(MODEL1D_STATE *mstat, const cplx_t omega) +void grt_update_mod1d_state_omega(MODEL1D_STATE *mstat, const cplx_t omega, const bool isElastic) { mstat->omega = omega; @@ -372,10 +372,12 @@ void grt_update_mod1d_state_omega(MODEL1D_STATE *mstat, const cplx_t omega) Va0 = mod1d->Va[i]; Vb0 = mod1d->Vb[i]; - // 圆频率实部为负数表明不考虑模型的 Q 值属性 - // 在读入模型后需要需要运行一次本函数以填充弹性模量,见 grt_read_mod1d_from_file 函数 - atna = (creal(omega) >= 0.0 && mod1d->Qainv[i] > 0.0)? grt_attenuation_law(mod1d->Qainv[i], mod1d->omgref, omega) : 1.0; - atnb = (creal(omega) >= 0.0 && mod1d->Qbinv[i] > 0.0)? grt_attenuation_law(mod1d->Qbinv[i], mod1d->omgref, omega) : 1.0; + if(isElastic) { + atna = atnb = 1.0; + } else { + atna = (mod1d->Qainv[i] > 0.0)? grt_attenuation_law(mod1d->Qainv[i], mod1d->omgref, omega) : 1.0; + atnb = (mod1d->Qbinv[i] > 0.0)? grt_attenuation_law(mod1d->Qbinv[i], mod1d->omgref, omega) : 1.0; + } mstat->atna[i] = atna; mstat->atnb[i] = atnb; diff --git a/pygrt/C_extension/src/dynamic/grn.c b/pygrt/C_extension/src/dynamic/grn.c index aaabbce..f98eaea 100755 --- a/pygrt/C_extension/src/dynamic/grn.c +++ b/pygrt/C_extension/src/dynamic/grn.c @@ -129,7 +129,7 @@ void grt_integ_grn_spec( MODEL1D_STATE *local_mstat = grt_init_mod1d_state(mod1d); // 将 omega 计入模型结构体 - grt_update_mod1d_state_omega(local_mstat, omega); + grt_update_mod1d_state_omega(local_mstat, omega, false); // 是否要输出积分过程文件 bool needfstats = (statsstr!=NULL && (grt_findElement_size_t(statsidxs, nstatsidxs, iw) >= 0)); diff --git a/pygrt/C_extension/src/dynamic/grt_kernel.c b/pygrt/C_extension/src/dynamic/grt_kernel.c index 923e3d9..217b595 100644 --- a/pygrt/C_extension/src/dynamic/grt_kernel.c +++ b/pygrt/C_extension/src/dynamic/grt_kernel.c @@ -435,7 +435,7 @@ int kernel_main(int argc, char **argv) // 将 omega 计入模型结构体 local_mstat->omega = omega; - grt_update_mod1d_state_omega(local_mstat, omega); + grt_update_mod1d_state_omega(local_mstat, omega, false); // 为当前频率创建波数积分记录文件 FILE *fstats = NULL; diff --git a/pygrt/C_extension/src/static/static_grn.c b/pygrt/C_extension/src/static/static_grn.c index 691527f..681ef4f 100644 --- a/pygrt/C_extension/src/static/static_grn.c +++ b/pygrt/C_extension/src/static/static_grn.c @@ -97,7 +97,7 @@ void grt_integ_static_grn( Kmet->kmax = Kmet->k0; // 模型状态 MODEL1D_STATE *mstat = grt_init_mod1d_state(mod1d); - grt_update_mod1d_state_omega(mstat, -1.0); + grt_update_mod1d_state_omega(mstat, 1.0, true); K_INTEG *Kint = grt_wavenumber_integral(mstat, uniq_nr, uniq_rs, Kmet, calc_upar, grt_static_kernel); cplx_t src_mu = mstat->mu[mod1d->isrc];