Source code for sfepy.postprocess.utils

from __future__ import print_function
from __future__ import absolute_import
import numpy as np
import six

try:
    import enthought.mayavi as mayavi

except ImportError:
    try:
        import mayavi

    except ImportError:
        mayavi = None

if mayavi:
    from mayavi import mlab
    from mayavi.core.source import Source
    from mayavi.core.filter import Filter
    import mayavi.core.dataset_manager as dataset_manager

from sfepy.base.base import basestr

[docs]def get_data_ranges(obj, return_only=False, use_names=None, filter_names=None): """Collect and print information on ranges of data in a dataset. Parameters ---------- obj : a mayavi pipeline object The object to probe for data. return_only : boolean If True, do not print the information, just return it to the caller. use_names : list of strings Consider only data with names in the list. filter_names : list of strings Consider only data with names not in the list. Returns ------- ranges : dict The requested data ranges. """ if isinstance(obj, basestr): mlab.options.offscreen = True scene = mlab.figure(bgcolor=(1,1,1), fgcolor=(0, 0, 0), size=(1, 1)) obj = mlab.pipeline.open(obj) if filter_names is None: filter_names = [] source = obj while not (isinstance(source, Source) and not isinstance(source, Filter)): source = source.parent try: dm = dataset_manager.DatasetManager(dataset=source.outputs[0].output) except AttributeError: # Prior to Mayavi 4.6.2. try: dm = dataset_manager.DatasetManager(dataset=source.outputs[0]) except: # Mayavi 4.7.1. dm = dataset_manager.DatasetManager(dataset=source.data) ranges = {} for attr in ['point_scalars', 'point_vectors', 'point_tensors', 'cell_scalars', 'cell_vectors', 'cell_tensors']: family, kind = attr.split('_') data = getattr(dm, attr) if use_names is None: names = list(data.keys()) else: names = use_names if not return_only and (set(data.keys()).intersection(names)): print(family, kind) for key, arr in six.iteritems(data): if (key in filter_names) or (key not in names): continue shape = arr.shape if arr.ndim == 1: arr = arr[:,np.newaxis] norm = np.sqrt(np.sum(arr*arr, axis=1)) ranges[key] = (family, kind, shape, np.min(arr), np.max(arr), np.min(norm), np.max(norm)) if not return_only: aux = (key,) + ranges[key][2:] print('"%s" %s range: %s %s l2 norm range: %s %s' % aux) return ranges