Source code for openpnm.io._dict

import logging
from openpnm.utils import NestedDict
from openpnm.utils._misc import is_transient, nbr_to_str


logger = logging.getLogger(__name__)


[docs] def project_to_dict(project, categorize_by=['name'], flatten=False, element=None, delim=' | '): r""" Returns a single dictionary object containing data from the given OpenPNM project, with the keys organized differently depending on optional arguments. Parameters ---------- project : list An OpenPNM project object categorize_by : str or list[str] Indicates how the dictionaries should be organized. The list can contain any, all or none of the following strings: **'object'** : If specified the dictionary keys will be stored under a general level corresponding to their type (e.g. 'network/net_01/pore.all'). **'name'** : If specified, then the data arrays are additionally categorized by their name. This is enabled by default. **'data'** : If specified the data arrays are additionally categorized by ``label`` and ``property`` to separate *boolean* from *numeric* data. **'element'** : If specified the data arrays are additionally categorized by ``pore`` and ``throat``, meaning that the propnames are no longer prepended by a 'pore.' or 'throat.' Returns ------- A dictionary with the data stored in a hierarchical data structure, the actual format of which depends on the arguments to the function. """ network = project.network phases = project.phases algs = project.algorithms if flatten: d = {} else: d = NestedDict(delimiter=delim) def build_path(obj, key): propname = key name = '' prefix = '' datatype = '' arr = obj[key] if 'object' in categorize_by: if hasattr(obj, 'coords'): prefix = 'network' + delim else: prefix = 'phase' + delim if 'element' in categorize_by: propname = key.replace('.', delim) if 'data' in categorize_by: if arr.dtype == bool: datatype = 'labels' + delim else: datatype = 'properties' + delim if 'name' in categorize_by: name = obj.name + delim path = prefix + name + datatype + propname return path for key in network.props(element=element) + network.labels(element=element): path = build_path(obj=network, key=key) d[path] = network[key] for phase in phases: for key in phase.props(element=element) + phase.labels(element=element): path = build_path(obj=phase, key=key) d[path] = phase[key] for alg in algs: try: # 'quantity' is missing for multiphysics algorithm key = alg.settings['quantity'] except AttributeError: break # only for transient algs transient = is_transient(alg) path = build_path(alg, key) if transient: times = alg.soln[key].t for i, t in enumerate(times): d[path + '#' + nbr_to_str(t)] = alg.soln[key][:, i] else: d[path] = alg.soln[key] return d