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.
Files changed (57) hide show
  1. pyfwat/__init__.py +7 -0
  2. pyfwat/cpt/ccp.cpt +14 -0
  3. pyfwat/cpt/dvp.cpt +124 -0
  4. pyfwat/cpt/kernel.cpt +11 -0
  5. pyfwat/cpt/kernel_avg.cpt +9 -0
  6. pyfwat/cpt/vel_norm.cpt +11 -0
  7. pyfwat/cpt/vs.cpt +13 -0
  8. pyfwat/data/crust1.0.npz +0 -0
  9. pyfwat/data/icon.svg +13 -0
  10. pyfwat/io/__init__.py +0 -0
  11. pyfwat/io/gllio.py +115 -0
  12. pyfwat/io/grid_model.py +149 -0
  13. pyfwat/io/misfit.py +23 -0
  14. pyfwat/io/xdmf.py +70 -0
  15. pyfwat/picker/__init__.py +0 -0
  16. pyfwat/picker/mccc.py +36 -0
  17. pyfwat/picker/picker_fig.py +297 -0
  18. pyfwat/picker/picker_ui.py +510 -0
  19. pyfwat/plot/__init__.py +0 -0
  20. pyfwat/plot/plot_dlnv.py +88 -0
  21. pyfwat/plot/plot_dv_sec.py +110 -0
  22. pyfwat/plot/plot_kernel_sec.py +95 -0
  23. pyfwat/plot/plot_misfit.py +65 -0
  24. pyfwat/plot/plot_misfit_linesearch.py +104 -0
  25. pyfwat/plot/plot_misfit_multistage.py +97 -0
  26. pyfwat/plot/plot_misfit_surf.py +125 -0
  27. pyfwat/plot/plot_noise_fit.py +77 -0
  28. pyfwat/plot/plot_res.py +69 -0
  29. pyfwat/plot/plot_rf_evts.py +74 -0
  30. pyfwat/plot/plot_rf_fit.py +53 -0
  31. pyfwat/plot/plot_stations.py +51 -0
  32. pyfwat/plot/plot_surf_data.py +93 -0
  33. pyfwat/plot/plot_tele_fit.py +85 -0
  34. pyfwat/plot/plot_vel_sec.py +232 -0
  35. pyfwat/postproc/__init__.py +0 -0
  36. pyfwat/postproc/clean.py +37 -0
  37. pyfwat/postproc/joint_kernel.py +83 -0
  38. pyfwat/postproc/model_update.py +134 -0
  39. pyfwat/postproc/optimize_ls.py +28 -0
  40. pyfwat/preproc/__init__.py +0 -0
  41. pyfwat/preproc/cal_fk_times.py +181 -0
  42. pyfwat/preproc/ch_fkmodel.py +19 -0
  43. pyfwat/preproc/checkerboard.py +130 -0
  44. pyfwat/preproc/create_crustmodel.py +248 -0
  45. pyfwat/preproc/dis2inc.py +35 -0
  46. pyfwat/preproc/gen_gauss_stf.py +48 -0
  47. pyfwat/preproc/gen_virt_fkevts.py +130 -0
  48. pyfwat/utils/__init__.py +0 -0
  49. pyfwat/utils/distaz.py +205 -0
  50. pyfwat/utils/geo.py +256 -0
  51. pyfwat/utils/pario.py +157 -0
  52. pyfwat/utils/utils.py +35 -0
  53. pyfwat-0.2.1.dist-info/METADATA +140 -0
  54. pyfwat-0.2.1.dist-info/RECORD +57 -0
  55. pyfwat-0.2.1.dist-info/WHEEL +5 -0
  56. pyfwat-0.2.1.dist-info/entry_points.txt +28 -0
  57. pyfwat-0.2.1.dist-info/top_level.txt +1 -0
pyfwat/__init__.py ADDED
@@ -0,0 +1,7 @@
1
+ import os
2
+
3
+ DATA_PATH = 'DATA'
4
+ MISFIT_PATH = 'misfits'
5
+ SOLVER_PATH = 'solver'
6
+ FWAT_PARA_FILE = os.path.join(DATA_PATH, 'fwat_params.yml')
7
+ COLORS = ['47/127/193', '150/195/125', '196/151/178', '73/108/136', 'olivedrab', 'burlywood', 'thistle']
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
@@ -0,0 +1,11 @@
1
+ # cpt file created by: grd2cpt out1.grd -Cpolar1 -Z
2
+ #COLOR_MODEL = RGB
3
+ #
4
+ -1 39 56 113 -0.3 80 94 140
5
+ -0.3 80 94 140 0 255 255 255
6
+ 0 255 255 255 0.3 219 90 97
7
+ 0.3 219 90 97 1 206 28 38
8
+
9
+ B 39 56 113
10
+ F 206 28 38
11
+ N 255 255 255
@@ -0,0 +1,9 @@
1
+ # cpt file created by: grd2cpt out1.grd -Cpolar1 -Z
2
+ #COLOR_MODEL = RGB
3
+ #
4
+ -1 39 56 113 0 255 255 255
5
+ 0 255 255 255 1 206 28 38
6
+
7
+ B 39 56 113
8
+ F 206 28 38
9
+ N 255 255 255
@@ -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
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
+
@@ -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