1+ import pygrt
2+ import numpy as np
3+ import matplotlib .pyplot as plt
4+
5+ plt .rcParams .update ({
6+ "font.sans-serif" : "Times New Roman" ,
7+ "mathtext.fontset" : "cm"
8+ })
9+
10+ # 定义半无限空间模型
11+ Vp = 8 # km/s
12+ Vs = 4.62 # km/s
13+ Rho = 3.3 # g/cm^3
14+
15+ # 泊松比
16+ nu = 0.5 * (1 - 2 * (Vs / Vp )** 2 ) / (1 - (Vs / Vp )** 2 )
17+
18+ # 模型数组,半无限空间
19+ modarr = np .array ([
20+ [0. , Vp , Vs , Rho , 9e10 , 9e10 ],
21+ ])
22+
23+ # 剪切模量
24+ mu = Vs ** 2 * Rho
25+
26+ depsrc = 0.0 # 震源深度 km
27+ deprcv = 0.0 # 台站深度 km
28+
29+ rs = np .array ([10 ]) # 震中距数组,km
30+
31+ nt = 1000 # 总点数,不要求2的幂次
32+ dt = 0.005 # 采样时间间隔(s)
33+
34+ idx = 0 # 震中距索引
35+ r = rs [idx ]
36+
37+ t = np .arange (0 , nt )* dt * Vs / r
38+
39+
40+ pymod = pygrt .PyModel1D (modarr , depsrc , deprcv ) # 整理好的模型对象
41+ # 计算格林函数频谱
42+ st = pymod .compute_grn (
43+ distarr = rs ,
44+ nt = nt ,
45+ dt = dt ,
46+ )[0 ]
47+
48+ # 卷积阶跃函数
49+ pygrt .utils .stream_integral (st )
50+
51+
52+ # 时域解
53+ u = pygrt .utils .solve_lamb1 (nu , t , 0 ).reshape (- 1 , 9 )
54+ u = u [:, [0 ,2 ,4 ,6 ,8 ]]
55+ u .shape
56+
57+ # 频域解
58+ v = np .zeros_like (u )
59+ coef = np .pi * np .pi * mu * r
60+ v [:,0 ] = st .select (channel = 'HFR' )[0 ].data * coef
61+ v [:,1 ] = st .select (channel = 'VFR' )[0 ].data * coef
62+ v [:,2 ] = st .select (channel = 'HFT' )[0 ].data * coef
63+ v [:,3 ] = st .select (channel = 'HFZ' )[0 ].data * coef * (- 1 )
64+ v [:,4 ] = st .select (channel = 'VFZ' )[0 ].data * coef * (- 1 )
65+
66+ fig , axs = plt .subplots (5 , 2 , figsize = (10 , 10 ), sharex = True )
67+ labels = [r"$\bar{{G}}^H_{11}$" , r"$\bar{{G}}^H_{13}$" , r"$\bar{{G}}^H_{22}$" , r"$\bar{{G}}^H_{31}$" , r"$\bar{{G}}^H_{33}$" ]
68+ for i in range (5 ):
69+ ax = axs [i , 0 ]
70+ ax .plot (t , u [:,i ])
71+ ax .set_ylim (- 2 , 2 )
72+ ax .set_xlim (0 , 2 )
73+ ax .grid ()
74+ ax .text (0.05 , 0.92 , labels [i ], transform = ax .transAxes , ha = 'left' , va = 'top' , fontsize = 12 )
75+
76+ ax = axs [i , 1 ]
77+ ax .plot (t , v [:,i ])
78+ ax .set_ylim (- 2 , 2 )
79+ ax .set_xlim (0 , 2 )
80+ ax .grid ()
81+ ax .text (0.05 , 0.92 , labels [i ], transform = ax .transAxes , ha = 'left' , va = 'top' , fontsize = 12 )
82+
83+ axs [0 ,0 ].set_title ("From Time-Domain" )
84+ axs [0 ,1 ].set_title ("From Frequency-Domain" )
85+
86+ fig .savefig ("lamb1_compare_freq_time.png" , dpi = 100 , bbox_inches = 'tight' )
0 commit comments