Source code for openpnm.phase._phase
import logging
import numpy as np
from openpnm.core import Domain
from openpnm.utils import Workspace, Docorator
docstr = Docorator()
logger = logging.getLogger(__name__)
ws = Workspace()
__all__ = [
'Phase',
]
@docstr.get_sections(base='PhaseSettings', sections=['Parameters'])
@docstr.dedent
class PhaseSettings:
r"""
Parameters
----------
%(BaseSettings.parameters)s
auto_interpolate : boolean
If ``True`` then calls to a missing 'throat.<prop>' will automatically
interpolate 'pore.<prop>', if present, and vice versa. If ``False``
a normal ``KeyError`` is raised.
"""
auto_interpolate = True
default_domain = 'all'
[docs]
@docstr.get_sections(base='Phase', sections=['Parameters'])
@docstr.dedent
class Phase(Domain):
r"""
This class produces an empty object with no pore-scale models for
calculating any thermophysical properties. Users must add models and
specify parameters for all the properties they require.
Parameters
----------
%(Base.parameters)s
"""
def __init__(self, network, name='phase_?', **kwargs):
super().__init__(network=network, name=name, **kwargs)
self.settings._update(PhaseSettings())
# Set standard conditions on the phase
self['pore.all'] = np.ones([network.Np, ], dtype=bool)
self['throat.all'] = np.ones([network.Nt, ], dtype=bool)
self['pore.temperature'] = 298.0
self['pore.pressure'] = 101325.0
def __setitem__(self, key, value):
if '@' not in key:
super().__setitem__(key, value)
else:
# Deal with the fact that the label might only exist on the network
propname, domain = key.split('@')
element, prop = propname.split('.', 1)
try: # Fetch array from self if present
temp = self[element + '.' + prop]
except KeyError: # Otherwise create it
temp = self._initialize_empty_array_like(value, element)
self[element + '.' + prop] = temp
# Insert values into masked locations
mask = self.project._get_locations(element + '.' + domain)
temp[mask] = value
def __getitem__(self, key):
try: # If key exists, just get it
return super().__getitem__(key)
except KeyError:
pass
try: # Allow look-up from network mostly for label/domain info
return self.network[key]
except (KeyError, AttributeError):
pass
# Parse the key
element, prop = key.split('.', 1)
if '@' in prop:
prop, domain = prop.split('@')
else:
domain = 'all'
# Get params directly if appropriate
if element == 'param':
return self.params[prop]
# Next get the data arrays, this is the case if @ notation was used
if element + '.' + prop in self.keys():
vals = super().__getitem__(element + '.' + prop)
else: # If above are not triggered then try to interpolate
try:
if self.settings['auto_interpolate']:
if (element == 'pore') and ('throat.'+prop not in self.keys()):
raise KeyError(key)
elif (element == 'throat') and ('pore.'+prop not in self.keys()):
raise KeyError(key)
vals = self.interpolate_data(element + '.' + prop)
else:
raise KeyError(key)
except AttributeError:
raise KeyError(key)
# Finally get locs
if domain == 'all':
locs = np.ones(self._count(element), dtype=bool)
else:
locs = self.project._get_locations(element + '.' + domain)
return vals[locs]