def save(network, filename='', phases=[]): r""" Save network and phase data to a single vtp file for visualizing in Paraview Parameters ---------- network : OpenPNM Network Object The Network containing the data to be written filename : string, optional Filename to write data. If no name is given the file is named after ther network phases : list, optional A list contain OpenPNM Phase object(s) containing data to be written Examples -------- >>> import OpenPNM >>> pn = OpenPNM.Network.Cubic(shape=[3,3,3]) >>> geo = OpenPNM.Geometry.Stick_and_Ball(network=pn, ... pores=pn.pores(), ... throats=pn.throats()) >>> air = OpenPNM.Phases.Air(network=pn) >>> phys = OpenPNM.Physics.Standard(network=pn, phase=air, ... pores=pn.pores(), throats=pn.throats()) >>> import OpenPNM.Utilities.IO as io >>> io.VTK.save(pn,'test_pn.vtp',[air]) >>> # Delete the new file >>> import os >>> os.remove('test_pn.vtp') """ if filename == '': filename = network.name filename = filename.split('.')[0] + '.vtp' root = _ET.fromstring(VTK._TEMPLATE) objs = [] if type(phases) != list: phases = [phases] for phase in phases: objs.append(phase) objs.append(network) am = misc.amalgamate_data(objs=objs) key_list = list(sorted(am.keys())) points = network['pore.coords'] pairs = network['throat.conns'] num_points = len(points) num_throats = len(pairs) piece_node = root.find('PolyData').find('Piece') piece_node.set("NumberOfPoints", str(num_points)) piece_node.set("NumberOfLines", str(num_throats)) points_node = piece_node.find('Points') coords = VTK._array_to_element("coords", points.T.ravel('F'), n=3) points_node.append(coords) lines_node = piece_node.find('Lines') connectivity = VTK._array_to_element("connectivity", pairs) lines_node.append(connectivity) offsets = VTK._array_to_element("offsets", 2*_np.arange(len(pairs))+2) lines_node.append(offsets) point_data_node = piece_node.find('PointData') for key in key_list: array = am[key] if array.dtype == _np.bool: array = array.astype(int) if array.size != num_points: continue element = VTK._array_to_element(key, array) point_data_node.append(element) cell_data_node = piece_node.find('CellData') for key in key_list: array = am[key] if array.dtype == _np.bool: array = array.astype(int) if array.size != num_throats: continue element = VTK._array_to_element(key, array) cell_data_node.append(element) tree = _ET.ElementTree(root) tree.write(filename) # Make pretty with open(filename, 'r+') as f: string = f.read() string = string.replace('</DataArray>', '</DataArray>\n\t\t\t') f.seek(0) # consider adding header: '<?xml version="1.0"?>\n'+ f.write(string)
def save(network, filename='', phases=[]): r''' Save network and phase data to a single vtp file for visualizing in Paraview Parameters ---------- network : OpenPNM Network Object The Network containing the data to be written filename : string, optional Filename to write data. If no name is given the file is named after ther network phases : list, optional A list contain OpenPNM Phase object(s) containing data to be written Examples -------- >>> import OpenPNM >>> pn = OpenPNM.Network.Cubic(shape=[3,3,3]) >>> geo = OpenPNM.Geometry.Stick_and_Ball(network=pn,pores=pn.pores(),throats=pn.throats()) >>> air = OpenPNM.Phases.Air(network=pn) >>> phys = OpenPNM.Physics.Standard(network=pn,phase=air,pores=pn.pores(),throats=pn.throats()) >>> import OpenPNM.Utilities.IO as io >>> io.VTK.save(pn,'test_pn.vtp',[air]) >>> # Delete the new file >>> import os >>> os.remove('test_pn.vtp') ''' if filename == '': filename = network.name filename = filename.split('.')[0] + '.vtp' root = _ET.fromstring(VTK._TEMPLATE) objs = [] if type(phases) != list: phases = [phases] for phase in phases: objs.append(phase) objs.append(network) am = misc.amalgamate_data(objs=objs) key_list = list(sorted(am.keys())) points = network['pore.coords'] pairs = network['throat.conns'] num_points = len(points) num_throats = len(pairs) piece_node = root.find('PolyData').find('Piece') piece_node.set("NumberOfPoints", str(num_points)) piece_node.set("NumberOfLines", str(num_throats)) points_node = piece_node.find('Points') coords = VTK._array_to_element("coords", points.T.ravel('F'), n=3) points_node.append(coords) lines_node = piece_node.find('Lines') connectivity = VTK._array_to_element("connectivity", pairs) lines_node.append(connectivity) offsets = VTK._array_to_element("offsets", 2 * _np.arange(len(pairs)) + 2) lines_node.append(offsets) point_data_node = piece_node.find('PointData') for key in key_list: array = am[key] if array.dtype == _np.bool: array = array.astype(int) if array.size != num_points: continue element = VTK._array_to_element(key, array) point_data_node.append(element) cell_data_node = piece_node.find('CellData') for key in key_list: array = am[key] if array.dtype == _np.bool: array = array.astype(int) if array.size != num_throats: continue element = VTK._array_to_element(key, array) cell_data_node.append(element) tree = _ET.ElementTree(root) tree.write(filename) #Make pretty with open(filename, "r+") as f: string = f.read() string = string.replace("</DataArray>", "</DataArray>\n\t\t\t") f.seek(0) # consider adding header: '<?xml version="1.0"?>\n'+ f.write(string)
def test_amalgamate_data(self): dict_ = misc.amalgamate_data(objs=[self.net, self.air]) assert 'pore.'+self.air.name+'_molecular_weight' in dict_.keys() dict_ = misc.amalgamate_data(objs=[self.net, self.air], delimiter='|') assert 'pore.'+self.air.name+'|molecular_weight' in dict_.keys()
def save(network, filename='', phases=[], legacy=True): r""" Save network and phase data to a single vtp file for visualizing in Paraview Parameters ---------- network : OpenPNM Network Object The Network containing the data to be written filename : string, optional Filename to write data. If no name is given the file is named after ther network phases : list, optional A list contain OpenPNM Phase object(s) containing data to be written legacy : boolean If True (default) the property names will be of the format \'pore.Cubic_asd43_diameter'\, while if False they will be \'pore.diameter|Cubic_asd43\'. The latter style is consistent with all of the other IO methods, while the former is compatible with existing code, such as Paraview State files. Eventually, this option will be derprecated and removed. """ if filename == '': filename = network.name if ~filename.endswith('.vtp'): filename = filename + '.vtp' root = _ET.fromstring(VTK._TEMPLATE) objs = [] if type(phases) != list: phases = [phases] for phase in phases: objs.append(phase) objs.append(network) if legacy: am = _misc.amalgamate_data(objs=objs) else: am = { i: network[i] for i in network.props(mode=['all', 'deep']) + network.labels() } for phase in phases: dict_ = { i + '|' + phase.name: phase[i] for i in phase.props(mode=['all', 'deep']) + phase.labels() } am.update(dict_) key_list = list(sorted(am.keys())) points = network['pore.coords'] pairs = network['throat.conns'] num_points = _sp.shape(points)[0] num_throats = _sp.shape(pairs)[0] piece_node = root.find('PolyData').find('Piece') piece_node.set("NumberOfPoints", str(num_points)) piece_node.set("NumberOfLines", str(num_throats)) points_node = piece_node.find('Points') coords = VTK._array_to_element("coords", points.T.ravel('F'), n=3) points_node.append(coords) lines_node = piece_node.find('Lines') connectivity = VTK._array_to_element("connectivity", pairs) lines_node.append(connectivity) offsets = VTK._array_to_element("offsets", 2 * _np.arange(len(pairs)) + 2) lines_node.append(offsets) point_data_node = piece_node.find('PointData') for key in key_list: array = am[key] if array.dtype == _np.bool: array = array.astype(int) if array.size != num_points: continue element = VTK._array_to_element(key, array) point_data_node.append(element) cell_data_node = piece_node.find('CellData') for key in key_list: array = am[key] if array.dtype == _np.bool: array = array.astype(int) if array.size != num_throats: continue element = VTK._array_to_element(key, array) cell_data_node.append(element) tree = _ET.ElementTree(root) tree.write(filename) # Make pretty with open(filename, 'r+') as f: string = f.read() string = string.replace('</DataArray>', '</DataArray>\n\t\t\t') f.seek(0) # consider adding header: '<?xml version="1.0"?>\n'+ f.write(string)
def save(network, filename='', phases=[], legacy=True): r""" Save network and phase data to a single vtp file for visualizing in Paraview Parameters ---------- network : OpenPNM Network Object The Network containing the data to be written filename : string, optional Filename to write data. If no name is given the file is named after ther network phases : list, optional A list contain OpenPNM Phase object(s) containing data to be written legacy : boolean If True (default) the property names will be of the format \'pore.Cubic_asd43_diameter'\, while if False they will be \'pore.diameter|Cubic_asd43\'. The latter style is consistent with all of the other IO methods, while the former is compatible with existing code, such as Paraview State files. Eventually, this option will be derprecated and removed. """ if filename == '': filename = network.name if ~filename.endswith('.vtp'): filename = filename+'.vtp' root = _ET.fromstring(VTK._TEMPLATE) objs = [] if type(phases) != list: phases = [phases] for phase in phases: objs.append(phase) objs.append(network) if legacy: am = _misc.amalgamate_data(objs=objs) else: am = {i: network[i] for i in network.props(mode=['all', 'deep']) + network.labels()} for phase in phases: dict_ = {i+'|'+phase.name: phase[i] for i in phase.props(mode=['all', 'deep']) + phase.labels()} am.update(dict_) key_list = list(sorted(am.keys())) points = network['pore.coords'] pairs = network['throat.conns'] num_points = _sp.shape(points)[0] num_throats = _sp.shape(pairs)[0] piece_node = root.find('PolyData').find('Piece') piece_node.set("NumberOfPoints", str(num_points)) piece_node.set("NumberOfLines", str(num_throats)) points_node = piece_node.find('Points') coords = VTK._array_to_element("coords", points.T.ravel('F'), n=3) points_node.append(coords) lines_node = piece_node.find('Lines') connectivity = VTK._array_to_element("connectivity", pairs) lines_node.append(connectivity) offsets = VTK._array_to_element("offsets", 2*_np.arange(len(pairs))+2) lines_node.append(offsets) point_data_node = piece_node.find('PointData') for key in key_list: array = am[key] if array.dtype == _np.bool: array = array.astype(int) if array.size != num_points: continue element = VTK._array_to_element(key, array) point_data_node.append(element) cell_data_node = piece_node.find('CellData') for key in key_list: array = am[key] if array.dtype == _np.bool: array = array.astype(int) if array.size != num_throats: continue element = VTK._array_to_element(key, array) cell_data_node.append(element) tree = _ET.ElementTree(root) tree.write(filename) # Make pretty with open(filename, 'r+') as f: string = f.read() string = string.replace('</DataArray>', '</DataArray>\n\t\t\t') f.seek(0) # consider adding header: '<?xml version="1.0"?>\n'+ f.write(string)