Spaces:
Runtime error
Runtime error
| import numpy as np | |
| from scipy.interpolate import griddata | |
| def bin_distances(distances, bin_size=10): | |
| # Bin the distances into groups of `bin_size` kilometers | |
| binned_distances = {} | |
| for i, distance in enumerate(distances): | |
| bin_index = distance // bin_size | |
| if bin_index not in binned_distances: | |
| binned_distances[bin_index] = (distance, i) | |
| elif i < binned_distances[bin_index][1]: | |
| binned_distances[bin_index] = (distance, i) | |
| # Select the first distance in each bin and its index | |
| first_distances = [] | |
| for bin_index in binned_distances: | |
| first_distance, first_distance_index = binned_distances[bin_index] | |
| first_distances.append(first_distance_index) | |
| return first_distances | |
| def interpolate_vel_model( | |
| velocity_model, | |
| initial_velocity, | |
| lat_values, | |
| lon_values, | |
| depth_values, | |
| n_lat, | |
| n_lon, | |
| n_depth, | |
| ): | |
| # Create a mask for points with the initial velocity | |
| initial_velocity_mask = velocity_model == initial_velocity | |
| # Find the indices of points with non-initial velocities | |
| non_initial_velocity_indices = np.argwhere(~initial_velocity_mask) | |
| # Extract the coordinates and corresponding velocities of the known points | |
| known_points = np.column_stack( | |
| [ | |
| lat_values[non_initial_velocity_indices[:, 0]], | |
| lon_values[non_initial_velocity_indices[:, 1]], | |
| depth_values[non_initial_velocity_indices[:, 2]], | |
| ] | |
| ) | |
| # Find the maximum depth in the known_points | |
| max_known_depth = np.max(known_points[:, 2]) | |
| known_velocities = velocity_model[~initial_velocity_mask] | |
| # Create a grid of points for the entire volume | |
| grid_points = ( | |
| np.array(np.meshgrid(lat_values, lon_values, depth_values, indexing="ij")) | |
| .reshape(3, -1) | |
| .T | |
| ) | |
| # Create a mask for grid points that are deeper than the maximum known depth | |
| depth_mask = grid_points[:, 2] <= max_known_depth | |
| # Interpolate the velocities at the grid points | |
| interpolated_velocities = griddata( | |
| known_points, known_velocities, grid_points[depth_mask], method="linear" | |
| ) | |
| # Fill nan values with the nearest known velocities | |
| interpolated_velocities_filled = griddata( | |
| known_points, known_velocities, grid_points[depth_mask], method="nearest" | |
| ) | |
| interpolated_velocities[ | |
| np.isnan(interpolated_velocities) | |
| ] = interpolated_velocities_filled[np.isnan(interpolated_velocities)] | |
| # Initialize an array with the same length as grid_points and fill it with nan values | |
| interpolated_velocities_with_depth_limit = np.full(grid_points.shape[0], np.nan) | |
| # Update the array with the interpolated velocities for the masked grid points | |
| interpolated_velocities_with_depth_limit[depth_mask] = interpolated_velocities | |
| # Reshape the interpolated velocities to match the shape of the velocity_model | |
| interpolated_velocity_model = interpolated_velocities_with_depth_limit.reshape( | |
| n_lat, n_lon, n_depth | |
| ) | |
| return interpolated_velocity_model | |
| # Function to find the closest index for a given value in an array | |
| def find_closest_index(array, value): | |
| return np.argmin(np.abs(array - value)) | |