pygrt-kit 0.2.0__py3-none-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. pygrt/C_extension/Makefile +137 -0
  2. pygrt/C_extension/bin/grt.exe +0 -0
  3. pygrt/C_extension/bin/grt.syn +0 -0
  4. pygrt/C_extension/bin/grt.travt +0 -0
  5. pygrt/C_extension/include/attenuation.h +24 -0
  6. pygrt/C_extension/include/bessel.h +22 -0
  7. pygrt/C_extension/include/colorstr.h +19 -0
  8. pygrt/C_extension/include/const.h +115 -0
  9. pygrt/C_extension/include/dwm.h +44 -0
  10. pygrt/C_extension/include/fim.h +78 -0
  11. pygrt/C_extension/include/grt.h +128 -0
  12. pygrt/C_extension/include/iostats.h +72 -0
  13. pygrt/C_extension/include/layer.h +123 -0
  14. pygrt/C_extension/include/logo.h +57 -0
  15. pygrt/C_extension/include/matrix.h +205 -0
  16. pygrt/C_extension/include/model.h +165 -0
  17. pygrt/C_extension/include/progressbar.h +22 -0
  18. pygrt/C_extension/include/propagate.h +379 -0
  19. pygrt/C_extension/include/prtdbg.h +13 -0
  20. pygrt/C_extension/include/ptam.h +90 -0
  21. pygrt/C_extension/include/quadratic.h +55 -0
  22. pygrt/C_extension/include/sacio.h +382 -0
  23. pygrt/C_extension/include/search.h +69 -0
  24. pygrt/C_extension/include/signals.h +170 -0
  25. pygrt/C_extension/include/source.h +38 -0
  26. pygrt/C_extension/include/travt.h +28 -0
  27. pygrt/C_extension/include/version.h +14 -0
  28. pygrt/C_extension/lib/libgrt.a +0 -0
  29. pygrt/C_extension/lib/libgrt.so +0 -0
  30. pygrt/C_extension/src/attenuation.c +18 -0
  31. pygrt/C_extension/src/bessel.c +18 -0
  32. pygrt/C_extension/src/dwm.c +135 -0
  33. pygrt/C_extension/src/fim.c +254 -0
  34. pygrt/C_extension/src/grt.c +484 -0
  35. pygrt/C_extension/src/grt_main.c +1215 -0
  36. pygrt/C_extension/src/grt_syn.c +716 -0
  37. pygrt/C_extension/src/grt_travt.c +227 -0
  38. pygrt/C_extension/src/iostats.c +94 -0
  39. pygrt/C_extension/src/layer.c +254 -0
  40. pygrt/C_extension/src/model.c +377 -0
  41. pygrt/C_extension/src/progressbar.c +30 -0
  42. pygrt/C_extension/src/propagate.c +773 -0
  43. pygrt/C_extension/src/ptam.c +347 -0
  44. pygrt/C_extension/src/quadratic.c +59 -0
  45. pygrt/C_extension/src/sacio.c +712 -0
  46. pygrt/C_extension/src/search.c +66 -0
  47. pygrt/C_extension/src/signals.c +350 -0
  48. pygrt/C_extension/src/source.c +88 -0
  49. pygrt/C_extension/src/travt.c +356 -0
  50. pygrt/C_extension/version +1 -0
  51. pygrt/__init__.py +19 -0
  52. pygrt/_version.py +1 -0
  53. pygrt/c_interfaces.py +68 -0
  54. pygrt/c_structures.py +86 -0
  55. pygrt/print.py +17 -0
  56. pygrt/pygrn.py +188 -0
  57. pygrt/pymod.py +442 -0
  58. pygrt/signals.py +196 -0
  59. pygrt/utils.py +685 -0
  60. pygrt_kit-0.2.0.dist-info/LICENSE +674 -0
  61. pygrt_kit-0.2.0.dist-info/METADATA +154 -0
  62. pygrt_kit-0.2.0.dist-info/RECORD +64 -0
  63. pygrt_kit-0.2.0.dist-info/WHEEL +5 -0
  64. pygrt_kit-0.2.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * @file layer.h
3
+ * @author Zhu Dengda (zhudengda@mail.iggcas.ac.cn)
4
+ * @date 2024-07-24
5
+ *
6
+ * 以下代码实现的是 反射透射系数矩阵 ,参考:
7
+ *
8
+ * 1. 姚振兴, 谢小碧. 2022/03. 理论地震图及其应用(初稿).
9
+ * 2. Yao Z. X. and D. G. Harkrider. 1983. A generalized refelection-transmission coefficient
10
+ * matrix and discrete wavenumber method for synthetic seismograms. BSSA. 73(6). 1685-1699
11
+ *
12
+ */
13
+
14
+ #pragma once
15
+
16
+ #include "model.h"
17
+ #include "const.h"
18
+
19
+ /**
20
+ * 计算自由表面的反射系数,公式(5.3.10-14)
21
+ *
22
+ * @param xa0 (in)表层的P波归一化垂直波数 \f$ \sqrt{1 - (k_a/k)^2} \f$
23
+ * @param xb0 (in)表层的S波归一化垂直波数 \f$ \sqrt{1 - (k_b/k)^2} \f$
24
+ * @param kbkb0 (in)表层的S波水平波数的平方 \f$ k_b^2=(\frac{\omega}{V_b})^2 \f$
25
+ * @param k (in)波数
26
+ * @param R_tilt[2][2] (out)P-SV系数矩阵,SH系数为1
27
+ *
28
+ */
29
+ void calc_R_tilt(
30
+ MYCOMPLEX xa0, MYCOMPLEX xb0, MYCOMPLEX kbkb0, MYREAL k, MYCOMPLEX R_tilt[2][2]);
31
+
32
+
33
+ /**
34
+ * 计算接收点位置的接收矩阵,将波场转为位移,公式(5.2.19) + (5.7.7,25)
35
+ *
36
+ * @param xa_rcv (in)接受层的P波归一化垂直波数 \f$ \sqrt{1 - (k_a/k)^2} \f$
37
+ * @param xb_rcv (in)接受层的S波归一化垂直波数 \f$ \sqrt{1 - (k_b/k)^2} \f$
38
+ * @param ircvup (in)接收点是否浅于震源层
39
+ * @param k (in)波数
40
+ * @param R[2][2] (in)P-SV波场
41
+ * @param RL (in)SH波场
42
+ * @param R_EV[2][2] (out)P-SV接收函数矩阵
43
+ * @param R_EVL (out)SH接收函数值
44
+ *
45
+ */
46
+ void calc_R_EV(
47
+ MYCOMPLEX xa_rcv, MYCOMPLEX xb_rcv, bool ircvup,
48
+ MYREAL k,
49
+ const MYCOMPLEX R[2][2], MYCOMPLEX RL,
50
+ MYCOMPLEX R_EV[2][2], MYCOMPLEX *R_EVL);
51
+
52
+
53
+ /**
54
+ * 计算界面的反射系数RD/RDL/RU/RUL, 透射系数TD/TDL/TU/TUL, 包括时间延迟因子,
55
+ * 后缀L表示SH波的系数, 其余表示P-SV波的系数, 根据公式(5.4.14)和(5.4.31)计算系数
56
+ *
57
+ * @note 对公式(5.4.14)进行了重新整理。原公式各项之间的数量级差别过大,浮点数计算损失精度严重。
58
+ *
59
+ * @param Rho1 (in)上层的密度
60
+ * @param xa1 (in)上层的P波归一化垂直波数 \f$ \sqrt{1 - (k_a/k)^2} \f$
61
+ * @param xb1 (in)上层的S波归一化垂直波数 \f$ \sqrt{1 - (k_b/k)^2} \f$
62
+ * @param kbkb1 (in)上层的S波水平波数的平方 \f$ k_b^2=(\frac{\omega}{V_b})^2 \f$
63
+ * @param mu1 (in)上层的剪切模量
64
+ * @param Rho2 (in)下层的密度
65
+ * @param xa2 (in)下层的P波归一化垂直波数 \f$ \sqrt{1 - (k_a/k)^2} \f$
66
+ * @param xb2 (in)下层的S波归一化垂直波数 \f$ \sqrt{1 - (k_b/k)^2} \f$
67
+ * @param kbkb2 (in)下层的S波水平波数的平方 \f$ k_b^2=(\frac{\omega}{V_b})^2 \f$
68
+ * @param mu2 (in)下层的剪切模量
69
+ * @param thk (in)上层层厚
70
+ * @param k (in)波数
71
+ * @param RD[2][2] (out)P-SV 下传反射系数矩阵
72
+ * @param RDL (out)SH 下传反射系数
73
+ * @param RU[2][2] (out)P-SV 上传反射系数矩阵
74
+ * @param RUL (out)SH 上传反射系数
75
+ * @param TD[2][2] (out)P-SV 下传透射系数矩阵
76
+ * @param TDL (out)SH 下传透射系数
77
+ * @param TU[2][2] (out)P-SV 上传透射系数矩阵
78
+ * @param TUL (out)SH 上传透射系数
79
+ *
80
+ */
81
+ void calc_RT_2x2(
82
+ MYREAL Rho1, MYCOMPLEX xa1, MYCOMPLEX xb1, MYCOMPLEX kbkb1, MYCOMPLEX mu1,
83
+ MYREAL Rho2, MYCOMPLEX xa2, MYCOMPLEX xb2, MYCOMPLEX kbkb2, MYCOMPLEX mu2,
84
+ MYREAL thk,
85
+ MYCOMPLEX omega, MYREAL k,
86
+ MYCOMPLEX RD[2][2], MYCOMPLEX *RDL, MYCOMPLEX RU[2][2], MYCOMPLEX *RUL,
87
+ MYCOMPLEX TD[2][2], MYCOMPLEX *TDL, MYCOMPLEX TU[2][2], MYCOMPLEX *TUL);
88
+
89
+
90
+
91
+ /**
92
+ * 【未使用】
93
+ * 被calc_RT_2x2_from_4x4函数调用,生成该层的连接P-SV应力位移矢量与垂直波函数的D矩阵(或其逆矩阵),
94
+ * 见公式(5.2.19-20)
95
+ *
96
+ * @param xa (in)P波归一化垂直波数 \f$ \sqrt{1 - (k_a/k)^2} \f$
97
+ * @param xb (in)S波归一化垂直波数 \f$ \sqrt{1 - (k_b/k)^2} \f$
98
+ * @param kbkb (in)S波水平波数的平方 \f$ k_b^2=(\frac{\omega}{V_b})^2 \f$
99
+ * @param mu (in)剪切模量
100
+ * @param omega (in)复数频率 \f$ \tilde{\omega} =\omega - i\omega_I \f$
101
+ * @param k (in)波数
102
+ *
103
+ * @param D[4][4] (out) D矩阵(或其逆矩阵)
104
+ * @param inverse (in) 是否生成逆矩阵
105
+ *
106
+ */
107
+ void get_layer_D(
108
+ MYCOMPLEX xa, MYCOMPLEX xb, MYCOMPLEX kbkb, MYCOMPLEX mu,
109
+ MYCOMPLEX omega, MYREAL k, MYCOMPLEX D[4][4], bool inverse);
110
+
111
+
112
+
113
+ /**
114
+ * 和calc_RT_2x2函数解决相同问题(但未包含时间延迟因子),但没有使用显式推导的公式,而是直接做矩阵运算,
115
+ * 暂未加入相位延迟矩阵
116
+ * 函数接口也和 calc_RT_2x2函数 类似
117
+ */
118
+ void calc_RT_2x2_from_4x4(
119
+ MYREAL Rho1, MYCOMPLEX xa1, MYCOMPLEX xb1, MYCOMPLEX kbkb1, MYCOMPLEX mu1,
120
+ MYREAL Rho2, MYCOMPLEX xa2, MYCOMPLEX xb2, MYCOMPLEX kbkb2, MYCOMPLEX mu2,
121
+ MYCOMPLEX omega, MYREAL k,
122
+ MYCOMPLEX RD[2][2], MYCOMPLEX *RDL, MYCOMPLEX RU[2][2], MYCOMPLEX *RUL,
123
+ MYCOMPLEX TD[2][2], MYCOMPLEX *TDL, MYCOMPLEX TU[2][2], MYCOMPLEX *TUL);
@@ -0,0 +1,57 @@
1
+ /**
2
+ * @file logo.h
3
+ * @author Zhu Dengda (zhudengda@mail.iggcas.ac.cn)
4
+ * @date 2024-12
5
+ *
6
+ * logo字符串
7
+ *
8
+ */
9
+
10
+ #pragma once
11
+
12
+
13
+ #include <stdio.h>
14
+
15
+ #include "const.h"
16
+ #include "version.h"
17
+ #include "colorstr.h"
18
+
19
+ #if _TEST_WHETHER_WIN32_
20
+ #include <windows.h>
21
+ #endif
22
+
23
+
24
+ inline GCC_ALWAYS_INLINE void print_logo(){
25
+
26
+ #if _TEST_WHETHER_WIN32_
27
+ // 在Windows上设置控制台代码页为UTF-8,以显示下方由特殊字符组成的logo
28
+ SetConsoleOutputCP(65001);
29
+ #endif
30
+
31
+ printf(BOLD_GREEN "\n"
32
+ "╔═══════════════════════════════════════════════════════════════╗\n"
33
+ "║ ║\n"
34
+ "║ ██████╗ ██████╗ ████████╗ ║\n"
35
+ "║ ██╔════╝ ██╔══██╗ ╚══██╔══╝ ║\n"
36
+ "║ ██║ ███╗ ██████╔╝ ██║ ║\n"
37
+ "║ ██║ ██║ ██╔══██╗ ██║ ║\n"
38
+ "║ ╚██████╔╝ ██║ ██║ ██║ ║\n"
39
+ "║ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ║\n"
40
+ "║ ║\n"
41
+ "║ ║\n"
42
+ "║ Author: Zhu Dengda ║\n"
43
+ "║ Email: zhudengda@mail.iggcas.ac.cn ║\n"
44
+ "║ Code Homepage: https://github.com/Dengda98/PyGRT ║\n"
45
+ "║ License: GPL-3.0 license ║\n"
46
+ "║ Version: %-20s ║\n"
47
+ "║ ║\n"
48
+ "║ ║\n"
49
+ "║ A Command-Line Tool for Computing Synthetic Seismograms ║\n"
50
+ "║ in Horizontally Layered Halfspace Model, ║\n"
51
+ "║ using Generalized Reflection-Transmission Method(GRTM) ║\n"
52
+ "║ and Discrete Wavenumber Method(DWM). ║\n"
53
+ "║ ║\n"
54
+ "╚═══════════════════════════════════════════════════════════════╝\n"
55
+ DEFAULT_RESTORE, GRT_VERSION);
56
+
57
+ }
@@ -0,0 +1,205 @@
1
+ /**
2
+ * @file matrix.h
3
+ * @author Zhu Dengda (zhudengda@mail.iggcas.ac.cn)
4
+ * @date 2024-07-24
5
+ *
6
+ * 2x2小矩阵的加、减、乘、除、求逆等操作,由于均为小型数组操作,所有函数均为内联函数
7
+ */
8
+
9
+ #pragma once
10
+
11
+ #include "const.h"
12
+
13
+ /**
14
+ * 计算2x2复矩阵的逆
15
+ *
16
+ * @param M[2][2] (in)原矩阵
17
+ * @param invM[2][2] (out)逆矩阵
18
+ */
19
+ inline GCC_ALWAYS_INLINE void cmat2x2_inv(const MYCOMPLEX M[2][2], MYCOMPLEX invM[2][2]) {
20
+ MYCOMPLEX M00 = M[0][0];
21
+ MYCOMPLEX M11 = M[1][1];
22
+ MYCOMPLEX det = M00*M11 - M[0][1]*M[1][0];
23
+ if ( det == RZERO ){
24
+ // fprintf(stderr, "%.5e+%.5ej %.5e+%.5ej \n", CREAL(M[0][0]), CIMAG(M[0][0]), CREAL(M[0][1]), CIMAG(M[0][1]));
25
+ // fprintf(stderr, "%.5e+%.5ej %.5e+%.5ej \n", CREAL(M[1][0]), CIMAG(M[1][0]), CREAL(M[1][1]), CIMAG(M[1][1]));
26
+ // fprintf(stderr, "matrix2x2 det=0.0, set matrix inv = 0.0.\n");
27
+ det = RZERO;
28
+ } else {
29
+ det = RONE/det;
30
+ }
31
+
32
+ invM[0][0] = M11 * det;
33
+ invM[0][1] = M[0][1] * (-det);
34
+ invM[1][0] = M[1][0] * (-det);
35
+ invM[1][1] = M00 * det;
36
+ }
37
+
38
+ /**
39
+ * 计算2x2复矩阵的和
40
+ *
41
+ * @param M1[2][2] (in)矩阵1
42
+ * @param M2[2][2] (in)矩阵2
43
+ * @param M[2][2] (out)和矩阵
44
+ */
45
+ inline GCC_ALWAYS_INLINE void cmat2x2_add(const MYCOMPLEX M1[2][2], const MYCOMPLEX M2[2][2], MYCOMPLEX M[2][2]){
46
+ M[0][0] = M1[0][0] + M2[0][0];
47
+ M[0][1] = M1[0][1] + M2[0][1];
48
+ M[1][0] = M1[1][0] + M2[1][0];
49
+ M[1][1] = M1[1][1] + M2[1][1];
50
+ }
51
+
52
+ /**
53
+ * 计算2x2复矩阵的差
54
+ *
55
+ * @param M1[2][2] (in)矩阵1
56
+ * @param M2[2][2] (in)矩阵2
57
+ * @param M[2][2] (out)差矩阵 M1-M2
58
+ */
59
+ inline GCC_ALWAYS_INLINE void cmat2x2_sub(const MYCOMPLEX M1[2][2], const MYCOMPLEX M2[2][2], MYCOMPLEX M[2][2]){
60
+ M[0][0] = M1[0][0] - M2[0][0];
61
+ M[0][1] = M1[0][1] - M2[0][1];
62
+ M[1][0] = M1[1][0] - M2[1][0];
63
+ M[1][1] = M1[1][1] - M2[1][1];
64
+ }
65
+
66
+ /**
67
+ * 计算单位阵与2x2复矩阵的差
68
+ *
69
+ * @param M[2][2] (inout)差矩阵 I-M2
70
+ */
71
+ inline GCC_ALWAYS_INLINE void cmat2x2_one_sub(MYCOMPLEX M[2][2]){
72
+ M[0][0] = RONE - M[0][0];
73
+ M[0][1] = - M[0][1];
74
+ M[1][0] = - M[1][0];
75
+ M[1][1] = RONE - M[1][1];
76
+ }
77
+
78
+ /**
79
+ * 计算2x2复矩阵的积(矩阵相乘)
80
+ *
81
+ * @param M1[2][2] (in)矩阵1
82
+ * @param M2[2][2] (in)矩阵2
83
+ * @param M[2][2] (out)积矩阵 M1 * M2
84
+ */
85
+ inline GCC_ALWAYS_INLINE void cmat2x2_mul(const MYCOMPLEX M1[2][2], const MYCOMPLEX M2[2][2], MYCOMPLEX M[2][2]){
86
+ MYCOMPLEX M011, M012, M021, M022;
87
+ MYCOMPLEX M111, M112, M121, M122;
88
+ M011 = M1[0][0]; M012 = M1[0][1];
89
+ M021 = M1[1][0]; M022 = M1[1][1];
90
+ M111 = M2[0][0]; M112 = M2[0][1];
91
+ M121 = M2[1][0]; M122 = M2[1][1];
92
+ M[0][0] = M011 * M111 + M012 * M121;
93
+ M[0][1] = M011 * M112 + M012 * M122;
94
+ M[1][0] = M021 * M111 + M022 * M121;
95
+ M[1][1] = M021 * M112 + M022 * M122;
96
+ }
97
+
98
+ /**
99
+ * 计算2x2复矩阵和常量的积
100
+ *
101
+ * @param M1[2][2] (in)矩阵1
102
+ * @param k (in)常数
103
+ * @param M[2][2] (out)积矩阵 k * M1
104
+ */
105
+ inline GCC_ALWAYS_INLINE void cmat2x2_k(const MYCOMPLEX M1[2][2], MYCOMPLEX k0, MYCOMPLEX M[2][2]){
106
+ M[0][0] = M1[0][0] * k0;
107
+ M[0][1] = M1[0][1] * k0;
108
+ M[1][0] = M1[1][0] * k0;
109
+ M[1][1] = M1[1][1] * k0;
110
+ }
111
+
112
+ /**
113
+ * 计算2x2复矩阵和2x1的复向量的积
114
+ *
115
+ * @param M1[2][2] (in)矩阵1
116
+ * @param M2[2] (in)向量2
117
+ * @param M[2][2] (out)积向量 M1 * M2
118
+ */
119
+ inline GCC_ALWAYS_INLINE void cmat2x1_mul(const MYCOMPLEX M1[2][2], const MYCOMPLEX M2[2], MYCOMPLEX M[2]){
120
+ MYCOMPLEX M00, M10;
121
+ M00 = M1[0][0]*M2[0] + M1[0][1]*M2[1];
122
+ M10 = M1[1][0]*M2[0] + M1[1][1]*M2[1];
123
+ M[0] = M00;
124
+ M[1] = M10;
125
+ }
126
+
127
+ /**
128
+ * 2x2复矩阵赋值
129
+ *
130
+ * @param M1[2][2] (in)源矩阵
131
+ * @param M2[2][2] (out)目标矩阵
132
+ */
133
+ inline GCC_ALWAYS_INLINE void cmat2x2_assign(const MYCOMPLEX M1[2][2], MYCOMPLEX M2[2][2]){
134
+ M2[0][0] = M1[0][0];
135
+ M2[0][1] = M1[0][1];
136
+ M2[1][0] = M1[1][0];
137
+ M2[1][1] = M1[1][1];
138
+ }
139
+
140
+ /**
141
+ * 计算nxn复矩阵的积(小矩阵)(最暴力的方式)
142
+ *
143
+ * @param m1 (in)M1矩阵行数
144
+ * @param n1 (in)M1矩阵列数
145
+ * @param p1 (in)M2矩阵列数
146
+ * @param M1[m1][n1] (in)M1矩阵
147
+ * @param M2[n1][p1] (in)M2矩阵
148
+ * @param M[m1][p1] (out)积矩阵 M1 * M2
149
+ */
150
+ inline GCC_ALWAYS_INLINE void cmatmxn_mul(MYINT m1, MYINT n1, MYINT p1, const MYCOMPLEX M1[m1][n1], const MYCOMPLEX M2[n1][p1], MYCOMPLEX M[m1][p1]){
151
+ MYINT m, n, k;
152
+ MYCOMPLEX M0[m1][p1];
153
+ for(m=0; m<m1; ++m){
154
+ for(n=0; n<p1; ++n){
155
+ M0[m][n] = 0.0;
156
+ for(k=0; k<n1; ++k){
157
+ M0[m][n] += M1[m][k] * M2[k][n];
158
+ }
159
+ }
160
+ }
161
+
162
+ // memcpy(M, M0, sizeof(MYCOMPLEX)*m1*p1);
163
+ for(m=0; m<m1; ++m){
164
+ for(n=0; n<p1; ++n){
165
+ M[m][n] = M0[m][n];
166
+ }
167
+ }
168
+ }
169
+
170
+ /**
171
+ * 从M1大矩阵中划分Q子矩阵
172
+ *
173
+ * @param m1 (in)M1矩阵行数
174
+ * @param n1 (in)M1矩阵列数
175
+ * @param M1[m1][n1] (in)M1矩阵
176
+ * @param im (in)子矩阵起始行索引
177
+ * @param in (in)子矩阵起始列索引
178
+ * @param lm (in)子矩阵行数
179
+ * @param ln (in)子矩阵列数
180
+ * @param Q[lm][ln] (out)子矩阵
181
+ */
182
+ inline GCC_ALWAYS_INLINE void cmatmxn_block(MYINT m1, MYINT n1, const MYCOMPLEX M[m1][n1], MYINT im, MYINT in, MYINT lm, MYINT ln, MYCOMPLEX Q[lm][ln]){
183
+ for(MYINT m=0; m<lm; ++m){
184
+ for(MYINT n=0; n<ln; ++n){
185
+ Q[m][n] = M[im+m][in+n];
186
+ }
187
+ }
188
+ }
189
+
190
+ /**
191
+ * 打印矩阵
192
+ *
193
+ * @param m1 (in)M1矩阵行数
194
+ * @param n1 (in)M1矩阵列数
195
+ * @param M1[m1][n1] (in)M1矩阵
196
+ *
197
+ */
198
+ inline GCC_ALWAYS_INLINE void cmatmxn_print(MYINT m1, MYINT n1, const MYCOMPLEX M1[m1][n1]){
199
+ for(MYINT i=0; i<m1; ++i){
200
+ for(MYINT j=0; j<n1; ++j){
201
+ printf(" %15.5e + J%-15.5e ", CREAL(M1[i][j]), CIMAG(M1[i][j]));
202
+ }
203
+ printf("\n");
204
+ }
205
+ }
@@ -0,0 +1,165 @@
1
+ /**
2
+ * @file model.h
3
+ * @author Zhu Dengda (zhudengda@mail.iggcas.ac.cn)
4
+ * @date 2024-07-24
5
+ *
6
+ * `MODEL1D` 结构体 以及 `PYMODEL1D` 结构体 的相关操作函数
7
+ */
8
+
9
+ #pragma once
10
+
11
+ #include <complex.h>
12
+ #include <stdbool.h>
13
+ #include "const.h"
14
+
15
+ /**
16
+ * 单个水平层的结构体
17
+ */
18
+ typedef struct _LAYER {
19
+ MYREAL thk; ///< 层厚,最后一层厚度不使用(当作正无穷), km
20
+ MYREAL Va; ///< P波速度 km/s
21
+ MYREAL Vb; ///< S波速度 km/s
22
+ MYREAL Rho; ///< 密度 g/cm^3
23
+ MYREAL Qainv; ///< 1/Q_p
24
+ MYREAL Qbinv; ///< 1/Q_s
25
+ MYCOMPLEX mu; ///< \f$ V_b^2 * \rho \f$
26
+ MYCOMPLEX kaka; ///< \f$ (\omega/V_a)^2 \f$
27
+ MYCOMPLEX kbkb; ///< \f$ (\omega/V_b)^2 \f$
28
+ } LAYER;
29
+
30
+ /**
31
+ * 1D模型结构体,包括多个水平层
32
+ */
33
+ typedef struct _MODEL1D {
34
+ LAYER * lays; ///< 不同层的物性参数
35
+ MYINT n; ///< 层数,注意包括了震源和接收点的虚拟层,(n>=3)
36
+ MYINT isrc; ///< 震源所在虚拟层位, isrc>=1
37
+ MYINT ircv; ///< 接收点所在虚拟层位, ircv>=1, ircv != isrc
38
+ MYINT imin; ///< 较浅的虚拟层位,min(isrc, ircv)
39
+ MYINT imax; ///< 较深的虚拟层位,max(isrc, ircv)
40
+ bool ircvup; ///< 接收点是否浅于震源层, ircv < isrc
41
+
42
+ } MODEL1D;
43
+
44
+
45
+ /**
46
+ * 用于从Python传递数据的中间结构体
47
+ */
48
+ typedef struct _PYMODEL1D {
49
+ MYINT n; ///< 层数,注意包括了震源和接收点的虚拟层,(n>=3)
50
+ MYREAL depsrc; ///< 震源深度 km
51
+ MYREAL deprcv; ///< 接收点深度 km
52
+ MYINT isrc; ///< 震源所在虚拟层位, isrc>=1
53
+ MYINT ircv; ///< 接收点所在虚拟层位, ircv>=1, ircv != isrc
54
+ bool ircvup; ///< 接收点位于浅层, ircv < isrc
55
+
56
+ MYREAL *Thk; ///< Thk[n], 最后一层厚度不使用(当作正无穷), km
57
+ MYREAL *Va; ///< Va[n] P波速度 km/s
58
+ MYREAL *Vb; ///< Vb[n] S波速度 km/s
59
+ MYREAL *Rho; ///< Rho[n] 密度 g/cm^3
60
+ MYREAL *Qa; ///< Qa[n] P波Q值
61
+ MYREAL *Qb; ///< Qb[n] S波Q值
62
+ } PYMODEL1D;
63
+
64
+ /**
65
+ * 格林函数的频谱,仅作为将结果返回至Python使用
66
+ */
67
+ typedef struct _GRN {
68
+ MYINT nf; ///< 频点个数
69
+ MYREAL *Re; ///< Re[nf] 实部
70
+ MYREAL *Im; ///< Im[nf] 虚部
71
+ // float *Re;
72
+ // float *Im;
73
+ } GRN;
74
+
75
+
76
+
77
+ /**
78
+ * 打印模型参数信息,主要用于调试程序
79
+ *
80
+ * @param mod1d (in)`MODEL1D` 结构体指针
81
+ *
82
+ */
83
+ void print_mod1d(const MODEL1D *mod1d);
84
+
85
+ /**
86
+ * 打印PYMODEL1D模型参数信息,主要用于调试程序
87
+ *
88
+ * @param pymod (in)`PYMODEL1D` 结构体指针
89
+ *
90
+ */
91
+ void print_pymod(const PYMODEL1D *pymod);
92
+
93
+ /**
94
+ * 释放 `PYMODEL1D` 结构体指针
95
+ *
96
+ * @param pymod (out)`PYMODEL1D` 结构体指针
97
+ */
98
+ void free_pymod(PYMODEL1D *pymod);
99
+
100
+ /**
101
+ * 初始化模型内存空间
102
+ *
103
+ * @param n (in)模型层数
104
+ *
105
+ * @return `MODEL1D` 结构体指针
106
+ *
107
+ */
108
+ MODEL1D * init_mod1d(MYINT n);
109
+
110
+ /**
111
+ * 将 `PYMODEL1D` 结构体信息转到 `MODEL1D` 结构体中
112
+ *
113
+ * @param pymod1d (in)`PYMODEL1D` 结构体指针
114
+ * @param mod1d (out) `MODEL1D` 结构体指针
115
+ *
116
+ */
117
+ void get_mod1d(const PYMODEL1D *pymod1d, MODEL1D *mod1d);
118
+
119
+ /**
120
+ * 复制 `MODEL1D` 结构体,要求都以初始化
121
+ *
122
+ * @param mod1d1 (in)`MODEL1D` 源结构体指针
123
+ * @param mod1d2 (out)`MODEL1D` 目标结构体指针
124
+ *
125
+ */
126
+ void copy_mod1d(const MODEL1D *mod1d1, MODEL1D *mod1d2);
127
+
128
+ /**
129
+ * 释放 `MODEL1D` 结构体指针
130
+ *
131
+ * @param mod1d (out)`MODEL1D` 结构体指针
132
+ */
133
+ void free_mod1d(MODEL1D *mod1d);
134
+
135
+
136
+ /**
137
+ * 根据不同的omega, 更新模型的 \f$ k_a^2, k_b^2 \f$ 参数
138
+ *
139
+ * @param mod1d (inout)`MODEL1D` 结构体指针
140
+ * @param omega (in)复数频率
141
+ */
142
+ void update_mod1d_omega(MODEL1D *mod1d, MYCOMPLEX omega);
143
+
144
+ /**
145
+ * 初始化PYMODEL1D模型内存空间
146
+ *
147
+ * @param n (in)模型层数
148
+ *
149
+ * @return `PYMODEL1D` 结构体指针
150
+ *
151
+ */
152
+ PYMODEL1D * init_pymod(MYINT n);
153
+
154
+ /**
155
+ * 从文件中读取模型文件,以PYMODEL1D结构体形式
156
+ *
157
+ * @param command (in)命令名称
158
+ * @param modelpath (in)模型文件路径
159
+ * @param depsrc (in)震源深度
160
+ * @param deprcv (in)接收深度
161
+ *
162
+ * @return `PYMODEL1D` 结构体指针
163
+ *
164
+ */
165
+ PYMODEL1D * read_pymod_from_file(const char *command, const char *modelpath, double depsrc, double deprcv);
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @file progressbar.h
3
+ * @author Zhu Dengda (zhudengda@mail.iggcas.ac.cn)
4
+ * @date 2024-07-24
5
+ *
6
+ * 以下代码实现进度条的输出
7
+ *
8
+ */
9
+
10
+ #include "const.h"
11
+
12
+
13
+ #define _PROGRESSBAR_WIDTH_ 45 ///< 定义进度条的长度
14
+
15
+
16
+ /**
17
+ * 根据百分比打印进度条
18
+ *
19
+ * @param prefix (in)进度条前缀字符串
20
+ * @param percentage (in)百分比(整数)
21
+ */
22
+ void printprogressBar(const char *prefix, MYINT percentage);