pyfwat 0.2.1__py3-none-any.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.
- pyfwat/__init__.py +7 -0
- pyfwat/cpt/ccp.cpt +14 -0
- pyfwat/cpt/dvp.cpt +124 -0
- pyfwat/cpt/kernel.cpt +11 -0
- pyfwat/cpt/kernel_avg.cpt +9 -0
- pyfwat/cpt/vel_norm.cpt +11 -0
- pyfwat/cpt/vs.cpt +13 -0
- pyfwat/data/crust1.0.npz +0 -0
- pyfwat/data/icon.svg +13 -0
- pyfwat/io/__init__.py +0 -0
- pyfwat/io/gllio.py +115 -0
- pyfwat/io/grid_model.py +149 -0
- pyfwat/io/misfit.py +23 -0
- pyfwat/io/xdmf.py +70 -0
- pyfwat/picker/__init__.py +0 -0
- pyfwat/picker/mccc.py +36 -0
- pyfwat/picker/picker_fig.py +297 -0
- pyfwat/picker/picker_ui.py +510 -0
- pyfwat/plot/__init__.py +0 -0
- pyfwat/plot/plot_dlnv.py +88 -0
- pyfwat/plot/plot_dv_sec.py +110 -0
- pyfwat/plot/plot_kernel_sec.py +95 -0
- pyfwat/plot/plot_misfit.py +65 -0
- pyfwat/plot/plot_misfit_linesearch.py +104 -0
- pyfwat/plot/plot_misfit_multistage.py +97 -0
- pyfwat/plot/plot_misfit_surf.py +125 -0
- pyfwat/plot/plot_noise_fit.py +77 -0
- pyfwat/plot/plot_res.py +69 -0
- pyfwat/plot/plot_rf_evts.py +74 -0
- pyfwat/plot/plot_rf_fit.py +53 -0
- pyfwat/plot/plot_stations.py +51 -0
- pyfwat/plot/plot_surf_data.py +93 -0
- pyfwat/plot/plot_tele_fit.py +85 -0
- pyfwat/plot/plot_vel_sec.py +232 -0
- pyfwat/postproc/__init__.py +0 -0
- pyfwat/postproc/clean.py +37 -0
- pyfwat/postproc/joint_kernel.py +83 -0
- pyfwat/postproc/model_update.py +134 -0
- pyfwat/postproc/optimize_ls.py +28 -0
- pyfwat/preproc/__init__.py +0 -0
- pyfwat/preproc/cal_fk_times.py +181 -0
- pyfwat/preproc/ch_fkmodel.py +19 -0
- pyfwat/preproc/checkerboard.py +130 -0
- pyfwat/preproc/create_crustmodel.py +248 -0
- pyfwat/preproc/dis2inc.py +35 -0
- pyfwat/preproc/gen_gauss_stf.py +48 -0
- pyfwat/preproc/gen_virt_fkevts.py +130 -0
- pyfwat/utils/__init__.py +0 -0
- pyfwat/utils/distaz.py +205 -0
- pyfwat/utils/geo.py +256 -0
- pyfwat/utils/pario.py +157 -0
- pyfwat/utils/utils.py +35 -0
- pyfwat-0.2.1.dist-info/METADATA +140 -0
- pyfwat-0.2.1.dist-info/RECORD +57 -0
- pyfwat-0.2.1.dist-info/WHEEL +5 -0
- pyfwat-0.2.1.dist-info/entry_points.txt +28 -0
- pyfwat-0.2.1.dist-info/top_level.txt +1 -0
pyfwat/__init__.py
ADDED
pyfwat/cpt/ccp.cpt
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# cpt file created by: grd2cpt out1.grd -Cpolar1 -Z
|
|
2
|
+
#COLOR_MODEL = RGB
|
|
3
|
+
#
|
|
4
|
+
-1 39 56 113 -0.4 39 56 113
|
|
5
|
+
-0.4 39 56 113 -0.14 80 94 140
|
|
6
|
+
-0.14 80 94 140 -0.01 255 255 255
|
|
7
|
+
-0.01 255 255 255 0 255 255 255
|
|
8
|
+
0 255 255 255 0.01 255 255 255
|
|
9
|
+
0.01 255 255 255 0.14 219 90 97
|
|
10
|
+
0.14 219 90 97 1 206 28 38
|
|
11
|
+
|
|
12
|
+
B 39 56 113
|
|
13
|
+
F 206 28 38
|
|
14
|
+
N 255 255 255
|
pyfwat/cpt/dvp.cpt
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# COLOR_MODEL = rgb
|
|
2
|
+
-12 178/24/43 -11.8 179.5/27/44.417
|
|
3
|
+
-11.8 179.5/27/44.417 -11.6 181/30/45.833
|
|
4
|
+
-11.6 181/30/45.833 -11.4 182.5/33/47.25
|
|
5
|
+
-11.4 182.5/33/47.25 -11.2 184/36/48.667
|
|
6
|
+
-11.2 184/36/48.667 -11 185.5/39/50.083
|
|
7
|
+
-11 185.5/39/50.083 -10.8 187/42/51.5
|
|
8
|
+
-10.8 187/42/51.5 -10.6 188.5/45/52.917
|
|
9
|
+
-10.6 188.5/45/52.917 -10.4 190/48/54.333
|
|
10
|
+
-10.4 190/48/54.333 -10.2 191.5/51/55.75
|
|
11
|
+
-10.2 191.5/51/55.75 -10 193/54/57.167
|
|
12
|
+
-10 193/54/57.167 -9.8 194.5/57/58.583
|
|
13
|
+
-9.8 194.5/57/58.583 -9.6 196/60/60
|
|
14
|
+
-9.6 196/60/60 -9.4 197.5/63/61.417
|
|
15
|
+
-9.4 197.5/63/61.417 -9.2 199/66/62.833
|
|
16
|
+
-9.2 199/66/62.833 -9 200.5/69/64.25
|
|
17
|
+
-9 200.5/69/64.25 -8.8 202/72/65.667
|
|
18
|
+
-8.8 202/72/65.667 -8.6 203.5/75/67.083
|
|
19
|
+
-8.6 203.5/75/67.083 -8.4 205/78/68.5
|
|
20
|
+
-8.4 205/78/68.5 -8.2 206.5/81/69.917
|
|
21
|
+
-8.2 206.5/81/69.917 -8 208/84/71.333
|
|
22
|
+
-8 208/84/71.333 -7.8 209.5/87/72.75
|
|
23
|
+
-7.8 209.5/87/72.75 -7.6 211/90/74.167
|
|
24
|
+
-7.6 211/90/74.167 -7.4 212.5/93/75.583
|
|
25
|
+
-7.4 212.5/93/75.583 -7.2 214/96/77
|
|
26
|
+
-7.2 214/96/77 -7 215.56/99.594/79.76
|
|
27
|
+
-7 215.56/99.594/79.76 -6.8 217.12/103.19/82.521
|
|
28
|
+
-6.8 217.12/103.19/82.521 -6.6 218.69/106.78/85.281
|
|
29
|
+
-6.6 218.69/106.78/85.281 -6.4 220.25/110.38/88.042
|
|
30
|
+
-6.4 220.25/110.38/88.042 -6.2 221.81/113.97/90.802
|
|
31
|
+
-6.2 221.81/113.97/90.802 -6 223.38/117.56/93.562
|
|
32
|
+
-6 223.38/117.56/93.562 -5.8 224.94/121.16/96.323
|
|
33
|
+
-5.8 224.94/121.16/96.323 -5.6 226.5/124.75/99.083
|
|
34
|
+
-5.6 226.5/124.75/99.083 -5.4 228.06/128.34/101.84
|
|
35
|
+
-5.4 228.06/128.34/101.84 -5.2 229.62/131.94/104.6
|
|
36
|
+
-5.2 229.62/131.94/104.6 -5 231.19/135.53/107.36
|
|
37
|
+
-5 231.19/135.53/107.36 -4.8 232.75/139.13/110.12
|
|
38
|
+
-4.8 232.75/139.13/110.12 -4.6 234.31/142.72/112.89
|
|
39
|
+
-4.6 234.31/142.72/112.89 -4.4 235.88/146.31/115.65
|
|
40
|
+
-4.4 235.88/146.31/115.65 -4.2 237.44/149.91/118.41
|
|
41
|
+
-4.2 237.44/149.91/118.41 -4 239/153.5/121.17
|
|
42
|
+
-4 239/153.5/121.17 -3.8 240.56/157.09/123.93
|
|
43
|
+
-3.8 240.56/157.09/123.93 -3.6 242.13/160.69/126.69
|
|
44
|
+
-3.6 242.13/160.69/126.69 -3.4 243.69/164.28/129.45
|
|
45
|
+
-3.4 243.69/164.28/129.45 -3.2 245/171/137.67
|
|
46
|
+
-3.2 245/171/137.67 -3 246.25/178.5/147.25
|
|
47
|
+
-3 246.25/178.5/147.25 -2.8 247.5/186/156.83
|
|
48
|
+
-2.8 247.5/186/156.83 -2.6 248.75/193.5/166.42
|
|
49
|
+
-2.6 248.75/193.5/166.42 -2.4 250/201/176
|
|
50
|
+
-2.4 250/201/176 -2.2 251.25/208.5/185.58
|
|
51
|
+
-2.2 251.25/208.5/185.58 -2 252.5/216/195.17
|
|
52
|
+
-2 252.5/216/195.17 -1.8 253.12/221.25/202.5
|
|
53
|
+
-1.8 253.12/221.25/202.5 -1.6 253.33/225/208.33
|
|
54
|
+
-1.6 253.33/225/208.33 -1.4 253.54/228.75/214.17
|
|
55
|
+
-1.4 253.54/228.75/214.17 -1.2 253.75/232.5/220
|
|
56
|
+
-1.2 253.75/232.5/220 -1 253.96/236.25/225.83
|
|
57
|
+
-1 253.96/236.25/225.83 -0.8 254.17/240/231.67
|
|
58
|
+
-0.8 254.17/240/231.67 -0.6 254.38/243.75/237.5
|
|
59
|
+
-0.6 254.38/243.75/237.5 -0.4 254.58/247.5/243.33
|
|
60
|
+
-0.4 254.58/247.5/243.33 -0.2 254.79/251.25/249.17
|
|
61
|
+
-0.2 254.79/251.25/249.17 0 white
|
|
62
|
+
0 white 0.2 250.21/252.29/253.44
|
|
63
|
+
0.2 250.21/252.29/253.44 0.4 245.42/249.58/251.87
|
|
64
|
+
0.4 245.42/249.58/251.87 0.6 240.62/246.88/250.31
|
|
65
|
+
0.6 240.62/246.88/250.31 0.8 235.83/244.17/248.75
|
|
66
|
+
0.8 235.83/244.17/248.75 1 231.04/241.46/247.19
|
|
67
|
+
1 231.04/241.46/247.19 1.2 226.25/238.75/245.62
|
|
68
|
+
1.2 226.25/238.75/245.62 1.4 221.46/236.04/244.06
|
|
69
|
+
1.4 221.46/236.04/244.06 1.6 216.67/233.33/242.5
|
|
70
|
+
1.6 216.67/233.33/242.5 1.8 211.87/230.62/240.94
|
|
71
|
+
1.8 211.87/230.62/240.94 2 205.5/227.22/239
|
|
72
|
+
2 205.5/227.22/239 2.2 196.75/222.78/236.5
|
|
73
|
+
2.2 196.75/222.78/236.5 2.4 188/218.33/234
|
|
74
|
+
2.4 188/218.33/234 2.6 179.25/213.89/231.5
|
|
75
|
+
2.6 179.25/213.89/231.5 2.8 170.5/209.44/229
|
|
76
|
+
2.8 170.5/209.44/229 3 161.75/205/226.5
|
|
77
|
+
3 161.75/205/226.5 3.2 153/200.56/224
|
|
78
|
+
3.2 153/200.56/224 3.4 145.18/196.48/221.72
|
|
79
|
+
3.4 145.18/196.48/221.72 3.6 141.06/193.88/220.31
|
|
80
|
+
3.6 141.06/193.88/220.31 3.8 136.95/191.27/218.91
|
|
81
|
+
3.8 136.95/191.27/218.91 4 132.83/188.67/217.5
|
|
82
|
+
4 132.83/188.67/217.5 4.2 128.72/186.06/216.09
|
|
83
|
+
4.2 128.72/186.06/216.09 4.4 124.6/183.46/214.69
|
|
84
|
+
4.4 124.6/183.46/214.69 4.6 120.49/180.85/213.28
|
|
85
|
+
4.6 120.49/180.85/213.28 4.8 116.38/178.25/211.88
|
|
86
|
+
4.8 116.38/178.25/211.88 5 112.26/175.65/210.47
|
|
87
|
+
5 112.26/175.65/210.47 5.2 108.15/173.04/209.06
|
|
88
|
+
5.2 108.15/173.04/209.06 5.4 104.03/170.44/207.66
|
|
89
|
+
5.4 104.03/170.44/207.66 5.6 99.917/167.83/206.25
|
|
90
|
+
5.6 99.917/167.83/206.25 5.8 95.802/165.23/204.84
|
|
91
|
+
5.8 95.802/165.23/204.84 6 91.688/162.62/203.44
|
|
92
|
+
6 91.688/162.62/203.44 6.2 87.573/160.02/202.03
|
|
93
|
+
6.2 87.573/160.02/202.03 6.4 83.458/157.42/200.62
|
|
94
|
+
6.4 83.458/157.42/200.62 6.6 79.344/154.81/199.22
|
|
95
|
+
6.6 79.344/154.81/199.22 6.8 75.229/152.21/197.81
|
|
96
|
+
6.8 75.229/152.21/197.81 7 71.115/149.6/196.41
|
|
97
|
+
7 71.115/149.6/196.41 7.2 67/147/195
|
|
98
|
+
7.2 67/147/195 7.4 65.583/145.12/194.04
|
|
99
|
+
7.4 65.583/145.12/194.04 7.6 64.167/143.25/193.08
|
|
100
|
+
7.6 64.167/143.25/193.08 7.8 62.75/141.38/192.12
|
|
101
|
+
7.8 62.75/141.38/192.12 8 61.333/139.5/191.17
|
|
102
|
+
8 61.333/139.5/191.17 8.2 59.917/137.62/190.21
|
|
103
|
+
8.2 59.917/137.62/190.21 8.4 58.5/135.75/189.25
|
|
104
|
+
8.4 58.5/135.75/189.25 8.6 57.083/133.87/188.29
|
|
105
|
+
8.6 57.083/133.87/188.29 8.8 55.667/132/187.33
|
|
106
|
+
8.8 55.667/132/187.33 9 54.25/130.12/186.38
|
|
107
|
+
9 54.25/130.12/186.38 9.2 52.833/128.25/185.42
|
|
108
|
+
9.2 52.833/128.25/185.42 9.4 51.417/126.37/184.46
|
|
109
|
+
9.4 51.417/126.37/184.46 9.6 50/124.5/183.5
|
|
110
|
+
9.6 50/124.5/183.5 9.8 48.583/122.62/182.54
|
|
111
|
+
9.8 48.583/122.62/182.54 10 47.167/120.75/181.58
|
|
112
|
+
10 47.167/120.75/181.58 10.2 45.75/118.88/180.62
|
|
113
|
+
10.2 45.75/118.88/180.62 10.4 44.333/117/179.67
|
|
114
|
+
10.4 44.333/117/179.67 10.6 42.917/115.13/178.71
|
|
115
|
+
10.6 42.917/115.13/178.71 10.8 41.5/113.25/177.75
|
|
116
|
+
10.8 41.5/113.25/177.75 11 40.083/111.38/176.79
|
|
117
|
+
11 40.083/111.38/176.79 11.2 38.667/109.5/175.83
|
|
118
|
+
11.2 38.667/109.5/175.83 11.4 37.25/107.62/174.88
|
|
119
|
+
11.4 37.25/107.62/174.88 11.6 35.833/105.75/173.92
|
|
120
|
+
11.6 35.833/105.75/173.92 11.8 34.417/103.88/172.96
|
|
121
|
+
11.8 34.417/103.88/172.96 12 33/102/172
|
|
122
|
+
B 178/24/43
|
|
123
|
+
F 33/102/172
|
|
124
|
+
N white
|
pyfwat/cpt/kernel.cpt
ADDED
pyfwat/cpt/vel_norm.cpt
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# cpt file created by: grd2cpt out4.grd -Cseis -Z
|
|
2
|
+
#COLOR_MODEL = RGB
|
|
3
|
+
#
|
|
4
|
+
0 145 26 36 1 228 123 47
|
|
5
|
+
1 228 123 47 1.5 233 221 59
|
|
6
|
+
1.5 233 221 59 3 65 166 92
|
|
7
|
+
3 65 166 92 3.6 72 179 193
|
|
8
|
+
3.6 72 179 193 5 34 66 135
|
|
9
|
+
B 145 26 36 2.654193574
|
|
10
|
+
F 34 66 135
|
|
11
|
+
N 128 128 128
|
pyfwat/cpt/vs.cpt
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# cpt file created by: grd2cpt out4.grd -Cseis -Z
|
|
2
|
+
#COLOR_MODEL = RGB
|
|
3
|
+
#
|
|
4
|
+
2 145 26 36 2.654193574 145 26 36
|
|
5
|
+
2.654193574 145 26 36 3.180712338 228 123 47
|
|
6
|
+
3.180712338 228 123 47 3.43 233 221 59
|
|
7
|
+
3.43 233 221 59 3.7 65 166 92
|
|
8
|
+
3.7 65 166 92 4 72 179 193
|
|
9
|
+
4 72 179 193 4.5 34 66 135
|
|
10
|
+
4.5 34 66 135 5 34 66 135
|
|
11
|
+
B 145 26 36 2.654193574
|
|
12
|
+
F 34 66 135
|
|
13
|
+
N 128 128 128
|
pyfwat/data/crust1.0.npz
ADDED
|
Binary file
|
pyfwat/data/icon.svg
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
2
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
3
|
+
<svg width="100%" height="100%" viewBox="0 0 514 514" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
|
4
|
+
<g id="画板1" transform="matrix(1,0,0,1,-931,-1941)">
|
|
5
|
+
<rect x="931" y="1941" width="514" height="514" style="fill:none;"/>
|
|
6
|
+
<g id="icon" transform="matrix(1,0,0,1,931,1941)">
|
|
7
|
+
<use xlink:href="#_Image1" x="3" y="1" width="506px" height="513px"/>
|
|
8
|
+
</g>
|
|
9
|
+
</g>
|
|
10
|
+
<defs>
|
|
11
|
+
<image id="_Image1" width="506px" height="513px" xlink:href="data:image/png;base64,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"/>
|
|
12
|
+
</defs>
|
|
13
|
+
</svg>
|
pyfwat/io/__init__.py
ADDED
|
File without changes
|
pyfwat/io/gllio.py
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import os
|
|
3
|
+
import re
|
|
4
|
+
from glob import glob
|
|
5
|
+
from scipy.interpolate import griddata
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def read_fortran_external_mesh(filename, ngllx=5, nglly=5, ngllz=5):
|
|
9
|
+
with open(filename, "rb") as file:
|
|
10
|
+
data = {}
|
|
11
|
+
data['nspec_ab'] = np.fromfile(file, dtype="int32", offset=4, count=1)[0]
|
|
12
|
+
data['nglob_ab'] = np.fromfile(file, dtype="int32",offset=8, count=1)[0]
|
|
13
|
+
data['nspec_irr'] = np.fromfile(file, dtype="int32",offset=8, count=1)[0]
|
|
14
|
+
nbool = ngllx*nglly*ngllz*data['nspec_ab']
|
|
15
|
+
data['ibool'] = np.fromfile(file, dtype="int32", offset=8, count=nbool).reshape(
|
|
16
|
+
ngllx,nglly,ngllz,data['nspec_ab'], order='F')
|
|
17
|
+
data['xstore'] = np.fromfile(file, dtype="float32", offset=8, count=data['nglob_ab'])
|
|
18
|
+
data['ystore'] = np.fromfile(file, dtype="float32", offset=8, count=data['nglob_ab'])
|
|
19
|
+
data['zstore'] = np.fromfile(file, dtype="float32", offset=8, count=data['nglob_ab'])
|
|
20
|
+
return data
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def read_fortran_model(filename, nspec_ab, ngllx=5, nglly=5, ngllz=5):
|
|
24
|
+
with open(filename, "rb") as file:
|
|
25
|
+
file.seek(0)
|
|
26
|
+
data = np.fromfile(file, dtype="float32", offset=4)[:-1].reshape(
|
|
27
|
+
ngllx,nglly,ngllz,nspec_ab, order='F')
|
|
28
|
+
return data
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class GllModel:
|
|
32
|
+
def __init__(self, inpath, parameters=['vp', 'vs', 'rho'], ngllx=5, nglly=5, ngllz=5) -> None:
|
|
33
|
+
self.inpath = inpath
|
|
34
|
+
self.parameters = parameters
|
|
35
|
+
self.model_data = {}
|
|
36
|
+
for para in parameters:
|
|
37
|
+
self.model_data[para] = []
|
|
38
|
+
self.nglls = {'ngllx': ngllx,
|
|
39
|
+
'nglly': nglly,
|
|
40
|
+
'ngllz': ngllz}
|
|
41
|
+
self.read_external_mesh()
|
|
42
|
+
self.get_minmax()
|
|
43
|
+
|
|
44
|
+
def get_minmax(self):
|
|
45
|
+
self.xmin = np.min([np.min(ex['xstore']) for ex in self.external_meshs])
|
|
46
|
+
self.xmax = np.max([np.max(ex['xstore']) for ex in self.external_meshs])
|
|
47
|
+
self.ymin = np.min([np.min(ex['ystore']) for ex in self.external_meshs])
|
|
48
|
+
self.ymax = np.max([np.max(ex['ystore']) for ex in self.external_meshs])
|
|
49
|
+
self.zmin = np.min([np.min(ex['zstore']) for ex in self.external_meshs])
|
|
50
|
+
self.zmax = np.max([np.max(ex['zstore']) for ex in self.external_meshs])
|
|
51
|
+
|
|
52
|
+
def read_external_mesh(self):
|
|
53
|
+
self.external_meshs = []
|
|
54
|
+
extbins = glob(os.path.join(
|
|
55
|
+
self.inpath, 'proc*_external_mesh.bin')
|
|
56
|
+
)
|
|
57
|
+
self.nproc = len(extbins)
|
|
58
|
+
for _, extbin in enumerate(extbins):
|
|
59
|
+
pname = re.search(r'proc(\d{6})', extbin).groups()[0]
|
|
60
|
+
mesh_data = read_fortran_external_mesh(extbin, **self.nglls)
|
|
61
|
+
self.external_meshs.append(mesh_data)
|
|
62
|
+
for para in self.parameters:
|
|
63
|
+
fname = os.path.join(self.inpath, 'proc{}_{}.bin'.format(pname, para))
|
|
64
|
+
self.model_data[para].append(read_fortran_model(fname, mesh_data['nspec_ab'], **self.nglls))
|
|
65
|
+
|
|
66
|
+
def get_points_data(self):
|
|
67
|
+
self.points = np.empty([0, 3+len(self.parameters)])
|
|
68
|
+
for i in range(self.nproc):
|
|
69
|
+
self.points = np.vstack((self.points, self._get_gll_point(i)))
|
|
70
|
+
|
|
71
|
+
def griddata(self, x, y, z, method='linear'):
|
|
72
|
+
""" grid data with given series of x, y, z.
|
|
73
|
+
|
|
74
|
+
Parameters
|
|
75
|
+
----------
|
|
76
|
+
x : 1D numpy.ndarray
|
|
77
|
+
Series of x
|
|
78
|
+
y : 1D numpy.ndarray
|
|
79
|
+
Series of y
|
|
80
|
+
z : 1D numpy.ndarray
|
|
81
|
+
Series of z
|
|
82
|
+
method : str, optional
|
|
83
|
+
method for interpolation, by default 'linear'
|
|
84
|
+
"""
|
|
85
|
+
# points = np.empty([0, 3+len(self.parameters)])
|
|
86
|
+
x_inter, y_inter, z_inter = np.meshgrid(x, y, z)
|
|
87
|
+
# for i in range(self.nproc):
|
|
88
|
+
# points = np.vstack((points, self._get_gll_point(i)))
|
|
89
|
+
grid_data = {}
|
|
90
|
+
for i, para in enumerate(self.parameters):
|
|
91
|
+
grid_data[para] = griddata(self.points[:, 0:3], self.points[:, i+3],
|
|
92
|
+
(x_inter, y_inter, z_inter), method=method)
|
|
93
|
+
return grid_data
|
|
94
|
+
|
|
95
|
+
def _get_gll_point(self, idx):
|
|
96
|
+
external_mesh = self.external_meshs[idx]
|
|
97
|
+
data = [self.model_data[para][idx] for para in self.parameters]
|
|
98
|
+
points = np.zeros([external_mesh['nspec_ab']* \
|
|
99
|
+
self.nglls['ngllx']*self.nglls['nglly']*self.nglls['ngllz'],
|
|
100
|
+
3+len(self.parameters)]
|
|
101
|
+
)
|
|
102
|
+
n = 0
|
|
103
|
+
for ispec in range(external_mesh['nspec_ab']):
|
|
104
|
+
for k in range(self.nglls['ngllz']):
|
|
105
|
+
for j in range(self.nglls['nglly']):
|
|
106
|
+
for i in range(self.nglls['ngllx']):
|
|
107
|
+
iglob = external_mesh['ibool'][i,j,k,ispec]
|
|
108
|
+
points[n, 0] = external_mesh['xstore'][iglob-1]
|
|
109
|
+
points[n, 1] = external_mesh['ystore'][iglob-1]
|
|
110
|
+
points[n, 2] = external_mesh['zstore'][iglob-1]
|
|
111
|
+
for m, _ in enumerate(self.parameters):
|
|
112
|
+
points[n, m+3] = data[m][i, j, k, ispec]
|
|
113
|
+
n += 1
|
|
114
|
+
return points
|
|
115
|
+
|
pyfwat/io/grid_model.py
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import h5py
|
|
3
|
+
from scipy.interpolate import interpn
|
|
4
|
+
import copy
|
|
5
|
+
|
|
6
|
+
class GridModel():
|
|
7
|
+
def __init__(self, fname:str, key=None) -> None:
|
|
8
|
+
""" Grid model class to handle 3D grid data.
|
|
9
|
+
Parameters
|
|
10
|
+
----------
|
|
11
|
+
fname : str
|
|
12
|
+
File name of the grid model (hdf5 .h5).
|
|
13
|
+
key : str, optional
|
|
14
|
+
Key name to access the model data.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
with h5py.File(fname, 'r') as f:
|
|
18
|
+
if key is None:
|
|
19
|
+
key_list = list(f.keys())
|
|
20
|
+
for tname in ['x', 'y', 'z']:
|
|
21
|
+
key_list.remove(tname)
|
|
22
|
+
self.key_name = key_list[0]
|
|
23
|
+
else:
|
|
24
|
+
self.key_name = key
|
|
25
|
+
self.model = f[self.key_name][:]
|
|
26
|
+
self.x = f['x'][:]
|
|
27
|
+
self.y = f['y'][:]
|
|
28
|
+
self.z = f['z'][:]
|
|
29
|
+
self.dx = np.mean(np.diff(self.x))
|
|
30
|
+
self.dy = np.mean(np.diff(self.y))
|
|
31
|
+
self.dz = np.mean(np.diff(self.z))
|
|
32
|
+
self.dv = None
|
|
33
|
+
self._meshgrid()
|
|
34
|
+
|
|
35
|
+
def copy(self):
|
|
36
|
+
""" Create a deep copy of the GridModel instance.
|
|
37
|
+
|
|
38
|
+
:return: A deep copy of the GridModel instance.
|
|
39
|
+
:rtype: GridModel
|
|
40
|
+
"""
|
|
41
|
+
return copy.deepcopy(self)
|
|
42
|
+
|
|
43
|
+
def _meshgrid(self):
|
|
44
|
+
self.xx, self.yy, self.zz = np.meshgrid(self.x, self.y, self.z, indexing='ij')
|
|
45
|
+
|
|
46
|
+
def trim(self, sup_m):
|
|
47
|
+
""" Trim the model by a specified margin.
|
|
48
|
+
Parameters
|
|
49
|
+
----------
|
|
50
|
+
sup_m : float
|
|
51
|
+
Margin in meters to trim from each side of the model.
|
|
52
|
+
"""
|
|
53
|
+
nsup = int(sup_m/self.dx)
|
|
54
|
+
self.x = self.x[nsup:self.x.size-nsup]
|
|
55
|
+
nsup = int(sup_m/self.dy)
|
|
56
|
+
self.y = self.y[nsup:self.y.size-nsup]
|
|
57
|
+
self._meshgrid()
|
|
58
|
+
self.model= self.model[nsup:-nsup, nsup:-nsup, :]
|
|
59
|
+
if self.dv is not None:
|
|
60
|
+
self.dv = self.dv[nsup:-nsup, nsup:-nsup, :]
|
|
61
|
+
|
|
62
|
+
def to_geo(self, zone:int):
|
|
63
|
+
""" Convert UTM coordinates to geographic coordinates (longitude, latitude).
|
|
64
|
+
Parameters
|
|
65
|
+
----------
|
|
66
|
+
zone : int
|
|
67
|
+
UTM zone number.
|
|
68
|
+
Returns
|
|
69
|
+
-------
|
|
70
|
+
lon : numpy.ndarray
|
|
71
|
+
Longitude values.
|
|
72
|
+
lat : numpy.ndarray
|
|
73
|
+
Latitude values.
|
|
74
|
+
"""
|
|
75
|
+
from pyproj import Proj
|
|
76
|
+
p = Proj(proj='utm', zone=zone, ellps='WGS84')
|
|
77
|
+
return p(self.xx, self.yy, inverse=True)
|
|
78
|
+
|
|
79
|
+
def calc_dv(self, ref_model_fname:str):
|
|
80
|
+
""" Calculate the percentage velocity perturbation (dV/V) compared to a reference model.
|
|
81
|
+
Parameters
|
|
82
|
+
----------
|
|
83
|
+
ref_model_fname : str
|
|
84
|
+
File name of the reference model (hdf5 .h5).
|
|
85
|
+
"""
|
|
86
|
+
with h5py.File(ref_model_fname, 'r') as f:
|
|
87
|
+
ref_model = f[self.key_name][:]
|
|
88
|
+
# self.dv = 100 * (self.model - ref_model) / ref_model
|
|
89
|
+
self.dv = 100 * np.log(self.model / ref_model)
|
|
90
|
+
|
|
91
|
+
def calc_dv_avg(self):
|
|
92
|
+
""" Calculate the percentage velocity perturbation (dV/V) compared to the average model.
|
|
93
|
+
"""
|
|
94
|
+
self.dv = np.zeros_like(self.model)
|
|
95
|
+
for i in range(self.z.size):
|
|
96
|
+
self.dv[:, :, i] = 100 * (self.model[:, :, i] - np.mean(self.model[:, :, i])) / np.mean(self.model[:, :, i])
|
|
97
|
+
|
|
98
|
+
def interp_sec(self, start_point, end_point, is_geo=True, val=5, is_pert=False):
|
|
99
|
+
""" Interpolate the section between two points.
|
|
100
|
+
|
|
101
|
+
:param start_point: The start point.
|
|
102
|
+
:type start_point: tuple
|
|
103
|
+
:param end_point: The end point.
|
|
104
|
+
:type end_point: tuple
|
|
105
|
+
:param val: The interval value.
|
|
106
|
+
:type val: float
|
|
107
|
+
"""
|
|
108
|
+
from pyproj import Geod
|
|
109
|
+
|
|
110
|
+
# Initialize a profile
|
|
111
|
+
if is_geo:
|
|
112
|
+
g = Geod(ellps='WGS84')
|
|
113
|
+
az, _, dist = g.inv(start_point[0],start_point[1],end_point[0],end_point[1])
|
|
114
|
+
sec_range = np.arange(0, dist/1000, val)
|
|
115
|
+
r = g.fwd_intermediate(start_point[0],start_point[1], az, npts=sec_range.size, del_s=val*1000)
|
|
116
|
+
lat = r.lats
|
|
117
|
+
lon = r.lons
|
|
118
|
+
else:
|
|
119
|
+
az = np.arctan2(end_point[1]-start_point[1], end_point[0]-start_point[0])
|
|
120
|
+
dist = np.sqrt((end_point[0]-start_point[0])**2+(end_point[1]-start_point[1])**2)
|
|
121
|
+
sec_range = np.arange(0, dist, val)
|
|
122
|
+
lat = np.zeros(sec_range.size)
|
|
123
|
+
lon = np.zeros(sec_range.size)
|
|
124
|
+
for i, r in enumerate(sec_range):
|
|
125
|
+
lon[i] = start_point[0]+r*np.cos(az)
|
|
126
|
+
lat[i] = start_point[1]+r*np.sin(az)
|
|
127
|
+
|
|
128
|
+
# create points array
|
|
129
|
+
points = np.zeros([sec_range.size*self.z.size, 5])
|
|
130
|
+
offset = 0
|
|
131
|
+
for i, lola in enumerate(zip(lon, lat)):
|
|
132
|
+
for _, dep in enumerate(self.z):
|
|
133
|
+
points[offset] = [lola[0], lola[1], dep, sec_range[i], 0.]
|
|
134
|
+
offset += 1
|
|
135
|
+
|
|
136
|
+
# Interpolation
|
|
137
|
+
if is_pert:
|
|
138
|
+
model = self.dv
|
|
139
|
+
else:
|
|
140
|
+
model = self.model
|
|
141
|
+
points[:, 4] = interpn(
|
|
142
|
+
(self.x,
|
|
143
|
+
self.y,
|
|
144
|
+
self.z),
|
|
145
|
+
model,
|
|
146
|
+
points[:, 0:3],
|
|
147
|
+
bounds_error=False
|
|
148
|
+
)
|
|
149
|
+
return points
|
pyfwat/io/misfit.py
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import numpy as np
|
|
3
|
+
import glob
|
|
4
|
+
from .. import MISFIT_PATH
|
|
5
|
+
|
|
6
|
+
class PeriodBandMisfit():
|
|
7
|
+
def __init__(self, it, band_name) -> None:
|
|
8
|
+
fs = glob.glob(f'{MISFIT_PATH}/M{it:02d}.*_{band_name}_window_chi')
|
|
9
|
+
self.sum_chi = 0.
|
|
10
|
+
self.misfits = []
|
|
11
|
+
for f in fs:
|
|
12
|
+
try:
|
|
13
|
+
self.misfits.append(pd.read_csv(f, sep=r'\s+', header=None))
|
|
14
|
+
except Exception as e:
|
|
15
|
+
raise ValueError(f'error in reading {f}: {e}')
|
|
16
|
+
self.misfits = pd.concat(self.misfits, axis=0)
|
|
17
|
+
# define name of self.misfits columns
|
|
18
|
+
self.misfits.columns = [
|
|
19
|
+
'netwk', 'stnm', 'chan', 'imeas',
|
|
20
|
+
'tstart', 'tend', 'residual', 'misfit',
|
|
21
|
+
]
|
|
22
|
+
self.sum_chi = self.misfits[self.misfits['imeas']!=0]['misfit'].sum()
|
|
23
|
+
self.mean_chi = self.misfits[self.misfits['imeas']!=0]['misfit'].mean()
|
pyfwat/io/xdmf.py
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import h5py
|
|
2
|
+
from os.path import dirname, basename, join
|
|
3
|
+
|
|
4
|
+
class XDMFIO:
|
|
5
|
+
def __init__(self, filename):
|
|
6
|
+
self.filename = filename
|
|
7
|
+
self.basename = basename(filename)
|
|
8
|
+
self.path = dirname(filename)
|
|
9
|
+
self.fname = join(self.path, '_'.join(basename(filename).split('.')[:-1])+'.xmf')
|
|
10
|
+
self.model = {}
|
|
11
|
+
with h5py.File(filename, 'r') as f:
|
|
12
|
+
self.keys = list(f.keys())
|
|
13
|
+
self.keys = [key for key in self.keys if key not in ['x', 'y', 'z']]
|
|
14
|
+
for key in self.keys:
|
|
15
|
+
self.model[key] = f[key][:]
|
|
16
|
+
self.x = f['x'][:]
|
|
17
|
+
self.y = f['y'][:]
|
|
18
|
+
self.z = f['z'][:]
|
|
19
|
+
self.dims = (len(self.x), len(self.y), len(self.z))
|
|
20
|
+
self.dx = self.x[1] - self.x[0]
|
|
21
|
+
self.dy = self.y[1] - self.y[0]
|
|
22
|
+
self.dz = self.z[1] - self.z[0]
|
|
23
|
+
self.ox = self.x[0]
|
|
24
|
+
self.oy = self.y[0]
|
|
25
|
+
self.oz = self.z[0]
|
|
26
|
+
|
|
27
|
+
def create_xdmf(self):
|
|
28
|
+
self.xmf = f'''<?xml version="1.0" ?>
|
|
29
|
+
<Xdmf Version="3.0" xmlns:xi="http://www.w3.org/2001/XInclude">
|
|
30
|
+
<Domain>
|
|
31
|
+
<Grid Name="Model" GridType="Uniform">
|
|
32
|
+
<Topology TopologyType="3DRectMesh" Dimensions="{self.dims[0]} {self.dims[1]} {self.dims[2]}"/>
|
|
33
|
+
<Geometry GeometryType="VxVyVz">
|
|
34
|
+
<DataItem Name="X" Dimensions="{self.dims[0]}" NumberType="Float" Precision="8" Format="HDF">
|
|
35
|
+
{self.basename}:/x
|
|
36
|
+
</DataItem>
|
|
37
|
+
<DataItem Name="Y" Dimensions="{self.dims[1]}" NumberType="Float" Precision="8" Format="HDF">
|
|
38
|
+
{self.basename}:/y
|
|
39
|
+
</DataItem>
|
|
40
|
+
<DataItem Name="Z" Dimensions="{self.dims[2]}" NumberType="Float" Precision="8" Format="HDF">
|
|
41
|
+
{self.basename}:/z
|
|
42
|
+
</DataItem>
|
|
43
|
+
</Geometry>
|
|
44
|
+
'''
|
|
45
|
+
for name in self.keys:
|
|
46
|
+
self.xmf += f''' <Attribute Name="{name}" AttributeType="Scalar" Center="Node">
|
|
47
|
+
<DataItem Dimensions="{self.dims[0]} {self.dims[1]} {self.dims[2]}" NumberType="Float" Precision="8" Format="HDF">
|
|
48
|
+
{self.basename}:/{name}
|
|
49
|
+
</DataItem>
|
|
50
|
+
</Attribute>
|
|
51
|
+
'''
|
|
52
|
+
self.xmf += ''' </Grid>
|
|
53
|
+
</Domain>
|
|
54
|
+
</Xdmf>
|
|
55
|
+
'''
|
|
56
|
+
|
|
57
|
+
def write(self):
|
|
58
|
+
with open(f'{self.fname}', 'w') as f:
|
|
59
|
+
f.write(self.xmf)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def create_xmf():
|
|
63
|
+
import argparse
|
|
64
|
+
|
|
65
|
+
parser = argparse.ArgumentParser(description='Create XDMF file for HDF5')
|
|
66
|
+
parser.add_argument('filename', type=str, help='Path to HDF5 file')
|
|
67
|
+
args = parser.parse_args()
|
|
68
|
+
xio = XDMFIO(args.filename)
|
|
69
|
+
xio.create_xdmf()
|
|
70
|
+
xio.write()
|
|
File without changes
|
pyfwat/picker/mccc.py
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def mccc(data, dt, twin=0):
|
|
5
|
+
nt = data.shape[1] * 2
|
|
6
|
+
ns = data.shape[0]
|
|
7
|
+
mask = np.ones(nt)
|
|
8
|
+
tcc = np.zeros([ns, ns])
|
|
9
|
+
tdel = np.zeros(ns)
|
|
10
|
+
fft_all = np.fft.fft(data, nt, 1)
|
|
11
|
+
fft_conj = fft_all.conj()
|
|
12
|
+
|
|
13
|
+
if twin != 0:
|
|
14
|
+
itw = np.fix(twin/(2*dt))
|
|
15
|
+
mask = np.zeros(nt)
|
|
16
|
+
mask[0:itw] = 1.0
|
|
17
|
+
mask[nt-itw-1:nt] = 1.0
|
|
18
|
+
for i in range(ns-1):
|
|
19
|
+
ffis = fft_conj[i]
|
|
20
|
+
# ffis = np.conj(np.fft.fft(seis[i].data, nt))
|
|
21
|
+
for j in np.arange(i+1, ns):
|
|
22
|
+
ffjs = fft_all[j]
|
|
23
|
+
# ffjs = np.fft.fft(seis[j].data, nt)
|
|
24
|
+
ccf = np.fft.ifft(ffis*ffjs, nt).real*mask
|
|
25
|
+
tcc[i, j] = np.argmax(ccf)
|
|
26
|
+
|
|
27
|
+
(row, col) = np.where(tcc > nt/2)
|
|
28
|
+
for i in range(row.shape[0]):
|
|
29
|
+
tcc[row[i], col[i]] -= (nt+1)
|
|
30
|
+
|
|
31
|
+
tcc *= dt
|
|
32
|
+
|
|
33
|
+
for i in np.arange(0, ns):
|
|
34
|
+
tdel[i] = (-np.sum(tcc[0:i, i]) + np.sum(tcc[i, i+1:ns]))/ns
|
|
35
|
+
|
|
36
|
+
return tdel
|