261 lines
9.8 KiB
Python
261 lines
9.8 KiB
Python
# %%
|
|
import pygmt
|
|
pygmt.config(FONT="16p", IO_SEGMENT_MARKER="<<<")
|
|
|
|
import os
|
|
|
|
# %%
|
|
from pytomoatt.model import ATTModel
|
|
from pytomoatt.data import ATTData
|
|
import numpy as np
|
|
|
|
# %%
|
|
# read model files
|
|
|
|
Ngrid = [121,121,121]
|
|
data_file = '2_models/model_init_N%d_%d_%d.h5'%(Ngrid[0],Ngrid[1],Ngrid[2])
|
|
par_file = '3_input_params/input_params_real.yaml'
|
|
model = ATTModel.read(data_file, par_file)
|
|
init_model = model.to_xarray()
|
|
|
|
data_file = 'OUTPUT_FILES/OUTPUT_FILES_real/final_model.h5'
|
|
model = ATTModel.read(data_file, par_file)
|
|
inv_model = model.to_xarray()
|
|
|
|
# %%
|
|
# # read earthquakes and stations
|
|
|
|
# from pytomoatt.src_rec import SrcRec
|
|
|
|
# # read src_rec_file
|
|
# sr = SrcRec.read("1_src_rec_files/src_rec_file.dat")
|
|
|
|
# # get the coordinates of the stations and earthquakes
|
|
# stations = sr.receivers[['stlo','stla','stel']].values.T
|
|
# earthquakes = sr.sources[['evlo','evla','evdp']].values.T
|
|
|
|
# print(stations.shape)
|
|
# print(earthquakes.shape)
|
|
|
|
# %%
|
|
# read earthquakes and stations
|
|
|
|
import sys
|
|
sys.path.append('../utils')
|
|
import functions_for_data as ffd
|
|
|
|
ev, st = ffd.read_src_rec_file('1_src_rec_files/src_rec_file.dat')
|
|
# earthquake location
|
|
ev_lon, ev_lat, ev_dep , _ = ffd.data_lon_lat_dep_wt_ev(ev)
|
|
# station location
|
|
st_lon, st_lat, _, _ = ffd.data_lon_lat_ele_wt_st(ev,st)
|
|
|
|
# %%
|
|
# load topography
|
|
region = [97,106,12,21]
|
|
grid_topo = pygmt.datasets.load_earth_relief(resolution="01m", region=region)
|
|
grid_gra = pygmt.grdgradient(grid = grid_topo, azimuth = 0)
|
|
|
|
# %%
|
|
def line_read(file):
|
|
doc=open(file,'r')
|
|
file = doc.readlines()
|
|
doc.close()
|
|
lat = []; lon = [];
|
|
for info in file:
|
|
tmp = info.split()
|
|
lon.append(float(tmp[0]))
|
|
lat.append(float(tmp[1]))
|
|
return((lat,lon))
|
|
|
|
# %%
|
|
# plot imgaing results
|
|
|
|
fig = pygmt.Figure()
|
|
try:
|
|
os.mkdir("img")
|
|
except:
|
|
pass
|
|
|
|
|
|
# ------------------ Sub fig 1. topography ------------------
|
|
region = [97,106,12,21]
|
|
projection = "B101.5/16.5/12/21/10c"
|
|
frame = ["xa2+lLongitude", "ya2+lLatitude", "nSWe"]
|
|
spacing = [0.1, 0.1]
|
|
|
|
# topography
|
|
pygmt.makecpt(cmap="globe", series=[-4000,4000], background = True)
|
|
fig.grdimage(grid=grid_topo, shading = grid_gra, projection=projection, frame=frame,region=region)
|
|
|
|
# station
|
|
fig.plot(x = st_lon, y = st_lat, style = "t0.4c", fill = "blue", pen = "1p,white", label = "Station")
|
|
|
|
|
|
# tectonic setting
|
|
(lat,lon) = line_read('tectonics/Khorat_new.txt') # Khorat Plateau
|
|
fig.plot(x = lon, y = lat, pen = "1p,black")
|
|
fig.text(text = "Khorat", x = 103.5, y = 17.5, font = "15p,Helvetica-Bold,black", angle = 0)
|
|
fig.text(text = "Plateau", x = 103.5, y = 16.5, font = "15p,Helvetica-Bold,black", angle = 0)
|
|
(lat,lon) = line_read('tectonics/WangChaoFault.txt') # Wang-Chao Fault
|
|
fig.plot(x = lon, y = lat, pen = "1p,black,-")
|
|
fig.text(text = "WCF", x = 100, y = 16, font = "20p,Helvetica-Bold,white=1p", angle = 315)
|
|
(lat,lon) = line_read('tectonics/3PagodasFault.txt') # Three Pagodas Fault
|
|
fig.plot(x = lon, y = lat, pen = "1p,black,-")
|
|
fig.text(text = "TPF", x = 98.5, y = 14.5, font = "20p,Helvetica-Bold,white=1p", angle = 315)
|
|
(lat,lon) = line_read('tectonics/DBPF.txt') # Dien Bien Phu Fault
|
|
fig.plot(x = lon, y = lat, pen = "1p,black,-")
|
|
fig.text(text = "DBPF", x = 102, y = 19.5, font = "20p,Helvetica-Bold,white=1p", angle = 55)
|
|
(lat,lon) = line_read('tectonics/SongMaSuture.txt') # Song Ma Suture
|
|
fig.plot(x = lon, y = lat, pen = "1p,black,-")
|
|
fig.text(text = "Shan-Thai", x = 99, y = 20, font = "18p,Helvetica-Bold,black=0.5p,white", angle = 0)
|
|
fig.text(text = "Block", x = 99, y = 19.3, font = "18p,Helvetica-Bold,black=0.5p,white", angle = 0)
|
|
fig.text(text = "Indochina Block", x = 103.5, y = 15, font = "18p,Helvetica-Bold,black=0.5p,white", angle = 315)
|
|
|
|
|
|
fig.shift_origin(xshift= 1, yshift=-1.5)
|
|
fig.colorbar(frame = ["a%f"%(4000),"y+lElevation (m)"], position="+w4c/0.3c+h")
|
|
fig.shift_origin(xshift=-1, yshift=+1.5)
|
|
|
|
fig.shift_origin(xshift=0, yshift=-13)
|
|
|
|
|
|
# ------------------ Sub fig 2. earthquakes ------------------
|
|
|
|
region = "g"
|
|
projection = "E101/16/90/10c" # centerlon/centerlat/distnace_range/fig_size
|
|
frame = ["ya180"]
|
|
spacing = [0.1, 5]
|
|
|
|
fig.basemap(region=region, projection=projection, frame=frame)
|
|
fig.coast(region=region, projection=projection, frame=frame, water="white", land="gray", A=10000)
|
|
|
|
fig.plot(x=101.5, y=16.5, pen="1p,black,-", style="E-60d")
|
|
fig.plot(x=101.5, y=16.5, pen="1p,black,-", style="E-120d")
|
|
fig.plot(x=101.5, y=16.5, pen="1p,black,-", style="E-180d")
|
|
fig.text(x = [101.5, 101.5, 101.5], y = [-8.0, -38.0, -68], text = ['30', '60', '90'], font="13p")
|
|
|
|
fig.plot(x=[97,97,106,106,97], y=[11,21,21,11,11], pen="1p,red")
|
|
pygmt.makecpt(cmap="jet", series=[0, 100], background=True)
|
|
fig.plot(x = ev_lon, y = ev_lat, size = [0.4]*len(ev_lon), fill = ev_dep, style = "a", cmap = True, pen = "0.5p,white")
|
|
|
|
|
|
fig.shift_origin(xshift= 1, yshift=-1)
|
|
fig.colorbar(frame = ["a%f"%(50),"y+lFocal depth (km)"], position="+w4c/0.3c+h")
|
|
fig.shift_origin(xshift=-1, yshift=+1)
|
|
|
|
fig.shift_origin(xshift= 13, yshift= 13)
|
|
|
|
|
|
# ------------------ Sub fig 3. depth and vertical profile ------------------
|
|
|
|
region = [97,106,12,21]
|
|
projection = "B101.5/16.5/12/21/10c"
|
|
frame = ["xa2+lLongitude", "ya2+lLatitude", "nSWe"]
|
|
spacing = [0.1, 0.1]
|
|
|
|
depth_list = [100,200,300,400]
|
|
start_list = [ [97, 19], [97, 17.2], [101.8, 12] ]
|
|
end_list = [ [106, 15], [106, 13.2], [101.8, 21] ]
|
|
|
|
# depth profiles
|
|
for idepth, depth in enumerate(depth_list):
|
|
|
|
# read models
|
|
vel_init = init_model.interp_dep(depth, field='vel')
|
|
vel_inv = inv_model.interp_dep(depth, field='vel')
|
|
|
|
if idepth == 3:
|
|
fig.shift_origin(xshift=-39, yshift=-13)
|
|
|
|
pygmt.makecpt(cmap="../utils/svel13_chen.cpt", series=[-2, 2], background=True)
|
|
x = vel_inv[:,0]; y = vel_inv[:,1]; value = (vel_inv[:,2] - vel_init[:,2])/vel_init[:,2]*100
|
|
grid = pygmt.surface(x=x, y=y, z=value, spacing=spacing,region=region)
|
|
fig.grdimage(frame=frame,grid = grid,projection=projection, region=region) # nan_transparent may work
|
|
|
|
(lat,lon) = line_read('tectonics/Khorat_new.txt') # Khorat Plateau
|
|
fig.plot(x = lon, y = lat, pen = "1p,black")
|
|
|
|
# vertical profile location
|
|
fig.plot(x = [start_list[0][0],end_list[0][0]], y = [start_list[0][1],end_list[0][1],], pen = "2p,green,-")
|
|
fig.text(text = "A", x = start_list[0][0] + 0.5, y = start_list[0][1], font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0)
|
|
fig.text(text = "A@+'@+", x = end_list[0][0] - 0.5, y = end_list[0][1] + 0.5, font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0)
|
|
|
|
fig.plot(x = [start_list[1][0],end_list[1][0]], y = [start_list[1][1],end_list[1][1],], pen = "2p,green,-")
|
|
fig.text(text = "B", x = start_list[1][0] + 0.5, y = start_list[1][1], font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0)
|
|
fig.text(text = "B@+'@+", x = end_list[1][0] - 0.5, y = end_list[1][1] + 0.5, font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0)
|
|
|
|
fig.plot(x = [start_list[2][0],end_list[2][0]], y = [start_list[2][1],end_list[2][1],], pen = "2p,green,-")
|
|
fig.text(text = "C", x = start_list[2][0] - 0.5, y = start_list[2][1] + 0.5, font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0)
|
|
fig.text(text = "C@+'@+", x = end_list[2][0] - 0.5, y = end_list[2][1] - 0.5, font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0)
|
|
|
|
# depth label
|
|
fig.text(text="%d km"%(depth), x = 98 , y = 12.5, font = "14p,Helvetica-Bold,black", fill = "white")
|
|
|
|
|
|
fig.shift_origin(xshift=13)
|
|
|
|
fig.shift_origin(yshift=6)
|
|
|
|
# vertical profiles
|
|
for iprof in range(len(start_list)):
|
|
|
|
# generate topography data
|
|
Npoints = 100
|
|
point_x = np.linspace(start_list[iprof][0],end_list[iprof][0],Npoints)
|
|
point_y = np.linspace(start_list[iprof][1],end_list[iprof][1],Npoints)
|
|
points = np.hstack((point_x.reshape(-1,1),point_y.reshape(-1,1)))
|
|
topo = np.array(pygmt.grdtrack(points=points, grid=grid_topo)[2])
|
|
topo_dis = [0]
|
|
for ip in range(1, Npoints):
|
|
dis = ffd.cal_dis(point_y[0], point_x[0], point_y[ip], point_x[ip])
|
|
topo_dis.append(dis)
|
|
topo_dis = np.array(topo_dis)
|
|
|
|
# read models
|
|
vel_init_sec = init_model.interp_sec(start_list[iprof], end_list[iprof], field='vel', val=10)
|
|
vel_inv_sec = inv_model.interp_sec(start_list[iprof], end_list[iprof], field='vel', val=10)
|
|
|
|
|
|
# plot topography
|
|
max_dis = np.max(vel_init_sec[:,2])
|
|
|
|
region = [0,max_dis,0,2000]
|
|
projection = "X%f/1c"%(max_dis/400*4)
|
|
frame = ["ya2000+lElevation (m)", "sW"]
|
|
|
|
fig.shift_origin(yshift=4)
|
|
fig.basemap(region=region, projection=projection, frame=frame)
|
|
fig.plot(x = topo_dis, y = topo, pen = "1p,black", frame = frame, projection = projection, region = region)
|
|
fig.shift_origin(yshift=-4)
|
|
|
|
# plot model
|
|
region = [0,max_dis,0,400]
|
|
projection = "X%f/-4c"%(max_dis/400*4)
|
|
frame = ["xa300+lDistance (km)", "ya100+lDepth (km)", "nSWe"]
|
|
spacing = [10, 5]
|
|
|
|
x_sec = vel_inv_sec[:,2]; y_sec = vel_inv_sec[:,3]; value_sec = (vel_inv_sec[:,4] - vel_init_sec[:,4])/vel_init_sec[:,4]*100
|
|
grid = pygmt.surface(x=x_sec, y=y_sec, z=value_sec, spacing=spacing,region=region)
|
|
fig.grdimage(frame=frame,grid = grid,projection=projection, region=region) # nan_transparent may work
|
|
|
|
label_list = ['A', 'B', 'C']
|
|
fig.text(text = "%s"%(label_list[iprof]), x = 50, y = 50 , font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0)
|
|
fig.text(text = "%s@+'@+"%(label_list[iprof]), x = np.max(x) - 50, y = 50, font = "18p,Helvetica-Bold,black", fill = "lightblue", angle = 0)
|
|
|
|
|
|
if (iprof == 0):
|
|
fig.shift_origin(xshift=0, yshift=-6.5)
|
|
elif (iprof == 1):
|
|
fig.shift_origin(xshift=13, yshift=6.5)
|
|
|
|
fig.shift_origin(xshift= 2, yshift=-2.5)
|
|
fig.colorbar(frame = ["a%f"%(2),"y+ldlnVp (%)"], position="+w4c/0.3c+h")
|
|
fig.shift_origin(xshift=-2, yshift=+2.5)
|
|
|
|
fig.show()
|
|
|
|
fig.savefig("img/imaging_result.png")
|
|
|
|
|