def slice_2d(field3d, settings): if isinstance(field3d, np.ndarray): field3d = CenteredGrid(field3d) if isinstance(field3d, StaggeredGrid): component = settings.get('component', 'length') if component in ('z', 'y', 'x'): field3d = field3d.unstack()[('z', 'y', 'x').index(component)] else: field3d = field3d.at_centers() assert isinstance(field3d, CenteredGrid) and field3d.rank == 3 depth = settings.get('depth', 0) projection = settings.get('projection', FRONT) if projection == FRONT: # Remove Y axis data = field3d.data[:, :, min(depth, field3d.resolution[1]), :, :] field2d = CenteredGrid(data, box=field3d.box.without_axis(1)) elif projection == RIGHT: # Remove X axis data = field3d.data[:, :, min(depth, field3d.resolution[2]), :, :] data = np.transpose(data, axes=(0, 2, 1, 3)) field2d = CenteredGrid(data, box=field3d.box.without_axis(2)) elif projection == TOP: # Remove Z axis data = field3d.data[:, min(depth, field3d.resolution[0]), :, :, :] field2d = CenteredGrid(data, box=field3d.box.without_axis(0)) else: raise ValueError('Unknown projection: %s' % projection) return field2d
def slice_2d(field3d, settings): if isinstance(field3d, np.ndarray): field3d = CenteredGrid(field3d) if isinstance(field3d, StaggeredGrid): component = settings.get('component', 'length') if component in ('z', 'y', 'x'): field3d = field3d.unstack()[{ 'z': physics_config.z, 'y': physics_config.y, 'x': physics_config.x }[component] % 3] else: field3d = field3d.at_centers() assert isinstance(field3d, CenteredGrid) and field3d.rank == 3 depth = settings.get('depth', 0) projection = settings.get('projection', FRONT) removed_axis = { FRONT: physics_config.y, RIGHT: physics_config.x, TOP: physics_config.z }[projection] % 3 data = field3d.data[(slice(None), ) + tuple([ min(depth, field3d.resolution[i]) if i == removed_axis else slice(None) for i in range(3) ]) + (slice(None), )] if projection == RIGHT and not physics_config.is_x_first: data = np.transpose(data, axes=(0, 2, 1, 3)) return CenteredGrid(data, box=field3d.box.without_axis(removed_axis))