Source code for openpnm.io._pergeos
import logging
import numpy as np
from openpnm.io import _parse_filename
from openpnm.network import Network
logger = logging.getLogger(__name__)
[docs]
def network_to_pergeos(network, filename=''):
# avoid printing truncated array
np.set_printoptions(threshold=np.inf)
# Ensure network has PerGeos' expected properties
if 'pore.EqRadius' not in network.props():
try:
network['pore.EqRadius'] = network['pore.diameter']/2
except KeyError:
network['pore.EqRadius'] = np.ones([network.Np, ])
s = ["# Avizo 3D ASCII 3.0\n\n"]
s.append("define VERTEX " + str(network.Np) + '\n')
s.append("define EDGE " + str(network.Nt) + '\n')
s.append("define POINT " + str(2*network.Nt) + '\n\n')
s.append("Parameters {\n\tContentType \"HxPoreNetworkModel\"\n}\n\n")
types = {'b': 'int', 'i': 'int', 'f': 'float'}
typemap = {}
namemap = {}
shapemap = {}
propmap = {}
i = 1
NumEdgePoints = 1
for item in network.keys():
typemap[item] = types[str(network[item].dtype)[0]]
ncols = int(network[item].size/network[item].shape[0])
if ncols > 1:
shapemap[item] = '[' + str(ncols) + ']'
else:
shapemap[item] = ''
if item.startswith('pore'):
element = 'pore', 'VERTEX'
if item.startswith('throat'):
element = 'throat', 'EDGE'
n = item.replace(element[0] + '.', '').replace('.', '_').split('_')
n = ''.join([i[0].upper()+i[1:] for i in n if len(i)])
namemap[item] = n
temp = element[1] + " { " + typemap[item] + shapemap[item] + " " \
+ namemap[item] + " } @" + str(i) + '\n'
if temp.find('EdgeConnectivity') == -1:
# replaces openpnm tags with the mandatory am file's tags
if "Conns" in temp:
temp = temp.replace("Conns", "EdgeConnectivity")
elif "Coords" in temp:
temp = temp.replace("Coords", "VertexCoordinates")
s.append(temp)
propmap[item] = str(i)
if "NumEdgePoints" in temp:
NumEdgePoints = 0
i += 1
if NumEdgePoints:
temp = "EDGE { int NumEdgePoints" + " } @" + str(i) + '\n'
s.append(temp)
tempat = "@" + str(i) + '\n'
i += 1
# Add POINT data
s.append("POINT { float[3] EdgePointCoordinates } @" + str(i))
s.append("\n\n# Data section follows")
for item in network.keys():
data = network[item]
if item != 'throat.EdgeConnectivity':
s.append('\n\n@' + propmap[item] + '\n')
if shapemap[item] == '':
data = np.atleast_2d(data).T
if typemap[item] == 'float':
formatter = {'float_kind': lambda x: "%.15E" % x}
else:
formatter = None
if data.dtype == 'bool':
data = data.astype(int)
d = np.array2string(data, formatter=formatter)
s.append(d.replace('[', '').replace(']', '').replace('\n ', '\n'))
# Add POINT data
s.append('\n\n@' + str(i) + '\n')
formatter = {'float_kind': lambda x: "%.15E" % x}
conns = network['throat.conns']
d = np.array2string(network['pore.coords'][conns], formatter=formatter)
for r in (('[', ''), (']', ''), ('\n\n', '\n'), ('\n ', '\n'),
('\n ', '\n')):
d = d.replace(*r)
d += '\n'
s.append(d)
# Add NumEdgePoints
if NumEdgePoints:
s.append('\n\n' + tempat)
s.append(''.join(['2' + '\n']*network.Nt))
# Write to file
if filename == '':
filename = network.name
fname = _parse_filename(filename=filename, ext='am')
with open(fname, 'w') as f:
f.write(''.join(s))
[docs]
def network_from_pergeos(filename):
r"""
Loads a network from a PerGeos file.
Notes
-----
PerGeos is the format used by the Avizo software. See `here for more
details <https://cases.pergeos.com/>`_.
"""
net = {}
# ---------------------------------------------------------------------
# Parse the link1 file
filename = _parse_filename(filename=filename, ext='am')
with open(filename, mode='r') as f:
Np = None
Nt = None
while (Np is None) or (Nt is None):
s = f.readline()[:-1].split(' ')
if s[0] == 'define':
if s[1] == 'VERTEX':
Np = int(s[2])
if s[1] == 'EDGE':
Nt = int(s[2])
net = {}
propmap = {}
typemap = {}
shapemap = {}
while True:
s = f.readline()[:-1].split(' ')
if s[0] == 'VERTEX':
dshape = [Np]
if s[2].endswith(']'):
ncols = int(s[2].split('[', 1)[1].split(']')[0])
dshape.append(ncols)
dtype = s[2].split('[')[0]
temp = np.zeros(dshape, dtype=dtype)
net['pore.'+s[3]] = temp
key = int(s[-1].replace('@', ''))
propmap[key] = 'pore.'+s[3]
typemap[key] = dtype
shapemap[key] = dshape
elif s[0] == 'EDGE':
dshape = [Nt]
if s[2].endswith(']'):
ncols = int(s[2].split('[', 1)[1].split(']')[0])
dshape.append(ncols)
dtype = s[2].split('[')[0]
temp = np.zeros(dshape, dtype=dtype)
net['throat.'+s[3]] = temp
key = int(s[-1].replace('@', ''))
propmap[key] = 'throat.'+s[3]
typemap[key] = dtype
shapemap[key] = dshape
elif s[0] == '#':
break
s = f.read().split('@')
for key in propmap.keys():
if key in s:
data = s[key].split('\n')[1:]
data = ' '.join(data)
arr = np.fromstring(data, dtype=typemap[key], sep=' ')
arr = np.reshape(arr, newshape=shapemap[key])
net[propmap[key]] = arr
# End file parsing
net['pore.coords'] = net['pore.VertexCoordinates']
net['throat.conns'] = np.sort(net['throat.EdgeConnectivity'], axis=1)
network = Network()
network.update(net)
return network