Source code for yt.utilities.nodal_data_utils

import numpy as np

_index_map = np.array(
    [
        [0, 0, 0, 0, 0, 0, 0, 0],
        [0, 1, 0, 1, 0, 1, 0, 1],
        [0, 0, 1, 1, 0, 0, 1, 1],
        [0, 1, 2, 3, 0, 1, 2, 3],
        [0, 0, 0, 0, 1, 1, 1, 1],
        [0, 1, 0, 1, 2, 3, 2, 3],
        [0, 0, 1, 1, 2, 2, 3, 3],
        [0, 1, 2, 3, 4, 5, 6, 7],
    ]
)


def _get_linear_index(nodal_flag):
    if len(nodal_flag) == 2:
        return 1 * nodal_flag[1] + 2 * nodal_flag[0]
    else:
        return 1 * nodal_flag[2] + 2 * nodal_flag[1] + 4 * nodal_flag[0]


def _get_indices(nodal_flag):
    li = _get_linear_index(nodal_flag)
    return _index_map[li]


[docs] def get_nodal_data(data_source, field): finfo = data_source.ds._get_field_info(field) nodal_flag = finfo.nodal_flag field_data = data_source[field] inds = _get_indices(nodal_flag) return field_data[:, inds]
[docs] def get_nodal_slices(shape, nodal_flag, dim): slices = [] dir_slices = [[] for _ in range(dim)] for i in range(dim): if nodal_flag[i]: dir_slices[i] = [slice(0, shape[i] - 1), slice(1, shape[i])] else: dir_slices[i] = [slice(0, shape[i])] for sl_i in dir_slices[0]: for sl_j in dir_slices[1]: if dim > 2: for sl_k in dir_slices[2]: slices.append([sl_i, sl_j, sl_k]) else: slices.append([sl_i, sl_j]) return tuple(slices)