def latlon_axis(ax, xbounds, ybounds, proj, latlon_step): inv_latlon_step = 1.0 / latlon_step lon_edges = collect_dem.project(xbounds, [ybounds[0]] * 2, [0, 0], proj, inverse=True) min_lon = int(np.floor(lon_edges[0][0])) max_lon = int(np.ceil(lon_edges[1][0])) lon = np.linspace(min_lon, max_lon, inv_latlon_step * (max_lon - min_lon) + 1) lon_proj = collect_dem.project(lon, [lon_edges[0][1]] * len(lon), [0] * len(lon), proj) ax.set_xticks(lon_proj[:, 0]) ax.set_xticklabels( ['$\\mathrm{' + str(x) + '}^{\circ} ~ \mathrm{E}$' for x in lon]) ax.set_xlabel('$\\mathrm{Longitude}$') lat_edges = collect_dem.project([xbounds[0]] * 2, ybounds, [0, 0], proj, inverse=True) min_lat = int(np.floor(lat_edges[0][1])) max_lat = int(np.ceil(lat_edges[1][1])) lat = np.linspace(min_lat, max_lat, inv_latlon_step * (max_lat - min_lat) + 1) lat_proj = collect_dem.project([lat_edges[0][0]] * len(lat), lat, [0] * len(lat), proj) ax.set_yticks(lat_proj[:, 1]) ax.set_yticklabels( ['$\\mathrm{' + str(y) + '}^{\circ} ~ \mathrm{N}$' for y in lat]) ax.set_ylabel('$\\mathrm{Latitude}$')
def build_proj_rotate(m, from_proj, to_proj): all_pts = [m.pts.copy()] for d in range(3): moved = m.pts.copy() moved[:, d] += 1.0 all_pts.append(moved) all_pts = np.concatenate(all_pts) lonlatz = collect_dem.project(all_pts[:, 0], all_pts[:, 1], all_pts[:, 2], from_proj, inverse=True) to_coords = collect_dem.project(lonlatz[:, 0], lonlatz[:, 1], lonlatz[:, 2], to_proj) npts = m.pts.shape[0] to_pts = to_coords[:npts] from_to_dirs = [ to_coords[((d + 1) * npts):((d + 2) * npts)] - to_pts for d in range(3) ] all_dirs = np.array(from_to_dirs) dir_map = np.swapaxes(np.swapaxes(all_dirs, 0, 1), 1, 2) dir_map[m.tris].shape proj_rotate = scipy.sparse.dok_matrix((m.n_dofs(), m.n_dofs())) dir_map_tris = dir_map[m.tris] for i in range(m.tris.shape[0]): for b in range(3): for d1 in range(3): for d2 in range(3): proj_rotate[i * 9 + b * 3 + d1, i * 9 + b * 3 + d2] = dir_map_tris[i, b, d1, d2] return proj_rotate
def set_surf_elevations(m, n_dem_interp_pts, zoom, proj): surf_pt_idxs = m.get_pt_idxs('surf') lonlat_pts = collect_dem.project(m.pts[:,0], m.pts[:,1], m.pts[:,2], proj, inverse = True) bounds = collect_dem.get_dem_bounds(lonlat_pts) proj_dem = collect_dem.project(*collect_dem.get_dem(zoom, bounds, n_dem_interp_pts), proj) new_m = copy.copy(m) new_m.pts[surf_pt_idxs,2] = scipy.interpolate.griddata( (proj_dem[:,0], proj_dem[:,1]), proj_dem[:,2], (m.pts[surf_pt_idxs,0], m.pts[surf_pt_idxs,1]) ) return new_m
def to_sphere_xyz(m, proj): lonlatz = collect_dem.project(m.pts[:, 0], m.pts[:, 1], m.pts[:, 2], proj, inverse=True) xyz_sphere = collect_dem.project(lonlatz[:, 0], lonlatz[:, 1], lonlatz[:, 2], 'ellps') m_xyz = copy.copy(m) m_xyz.pts = xyz_sphere return m_xyz
def moment_analysis(m, inverse_soln, proj): slip = inverse_soln[0].reshape((-1, 2)) total_slip = np.sqrt(np.sum(slip**2, axis=1)) total_slip_m = total_slip / 100.0 from tectosaur.ops.mass_op import MassOp fault_mass = MassOp(2, m.pts, m.get_tris('fault')) tri_potency = fault_mass.dot( np.concatenate( (total_slip_m, np.zeros(total_slip.shape[0] * 2))))[:total_slip.shape[0]] potency = np.sum(tri_potency) avg_tri_potency = np.sum(tri_potency.reshape((-1, 3)), axis=1) mu = 30e9 M0 = potency * mu M = magnitude(M0) print('potency: ' + str(potency)) print('M0: ' + str(M0)) print('M: ' + str(M)) tri_centers = np.mean(m.get_tri_pts('fault'), axis=1) tri_lonlat = collect_dem.project(tri_centers[:, 0], tri_centers[:, 1], tri_centers[:, 2], proj, inverse=True) surf_elev = collect_dem.get_pt_elevations(tri_lonlat, 5) tri_depth = surf_elev - tri_centers[:, 2] avg_tri_moment = avg_tri_potency * mu return tri_depth, avg_tri_moment