SfePy NTC

Source code for sfepy.discrete.iga.io

"""
IO for NURBS and Bezier extraction data.
"""
import numpy as nm
import tables as pt

[docs]def write_iga_data(filename, knots, degrees, control_points, weights, cs, conn, bezier_control_points, bezier_weights, bezier_conn, regions): """ Write IGA-related data into a HDF5 file using pytables. """ if isinstance(degrees, int): degrees = [degrees] degrees = nm.asarray(degrees) fd = pt.openFile(filename, mode='w', title='SfePy IGA data file') nurbs = fd.createGroup('/', 'nurbs', 'nurbs') fd.createArray(nurbs, 'dim', control_points.shape[1], 'dim') fd.createArray(nurbs, 'tdim', len(degrees), 'tdim') for ii, kv in enumerate(knots): name = 'knots_%d' % ii fd.createArray(nurbs, name, kv, name) fd.createArray(nurbs, 'degrees', degrees, 'degrees') fd.createArray(nurbs, 'control_points', control_points, 'control_points') fd.createArray(nurbs, 'weights', weights, 'weights') bezier = fd.createGroup('/', 'bezier', 'bezier') fd.createArray(bezier, 'bezier_control_points', bezier_control_points, 'bezier_control_points') fd.createArray(bezier, 'bezier_weights', bezier_weights, 'bezier_weights') for ii, op in enumerate(cs): name = 'extraction_%d' % ii fd.createArray(bezier, name, op, name) fd.createArray(bezier, 'global_connectivity', conn, 'global_connectivity') fd.createArray(bezier, 'bezier_connectivity', bezier_conn, 'bezier_connectivity') regs = fd.createGroup('/', 'regions', 'regions') for key, val in regions.iteritems(): fd.createArray(regs, key, val, key) fd.close()
[docs]def read_iga_data(filename): """ Read IGA-related data from a HDF5 file using pytables. """ fd = pt.openFile(filename, mode='r') nurbs = fd.root.nurbs tdim = nurbs.tdim.read() knots = [] for ii in xrange(tdim): name = 'knots_%d' % ii knots.append(nurbs._f_getChild(name).read()) knots = tuple(knots) degrees = nurbs.degrees.read() control_points = nurbs.control_points.read() weights = nurbs.weights.read() bezier = fd.root.bezier cs = [] for ii in xrange(tdim): name = 'extraction_%d' % ii cs.append(bezier._f_getChild(name).read()) conn = bezier.global_connectivity.read() bezier_control_points = bezier.bezier_control_points.read() bezier_weights = bezier.bezier_weights.read() bezier_conn = bezier.bezier_connectivity.read() regions = {} for region in fd.root.regions: regions[region.name] = region.read() fd.close() return (knots, degrees, control_points, weights, cs, conn, bezier_control_points, bezier_weights, bezier_conn, regions)