def write_domain_to_hdf5(self, fd, group): """ Save the domain to a hdf5 file. fd: tables.File HDF5 file handle to write the mesh to. group: tables.group.Group HDF5 data group (of file fd) to write the mesh to. """ io.write_iga_data(fd, group, *(self._get_io_data() + (self.name,)))
def write_domain_to_hdf5(self, fd, group): """ Save the domain to a hdf5 file. fd: tables.File HDF5 file handle to write the mesh to. group: tables.group.Group HDF5 data group (of file fd) to write the mesh to. """ io.write_iga_data(fd, group, *(self._get_io_data() + (self.name, )))
def main(): parser = OptionParser(usage=usage, version='%prog') parser.add_option('-o', '', metavar='filename', action='store', dest='filename', default=None, help=helps['filename']) parser.add_option('-d', '--dims', metavar='dims', action='store', dest='dims', default='[1.0, 1.0, 1.0]', help=helps['dims']) parser.add_option('-c', '--centre', metavar='centre', action='store', dest='centre', default='[0.0, 0.0, 0.0]', help=helps['centre']) parser.add_option('-s', '--shape', metavar='shape', action='store', dest='shape', default='[5, 5, 5]', help=helps['shape']) parser.add_option('', '--degrees', metavar='degrees', action='store', dest='degrees', default='[2, 2, 2]', help=helps['degrees']) parser.add_option('', '--continuity', metavar='continuity', action='store', dest='continuity', default=None, help=helps['continuity']) parser.add_option('', '--cp-mode', metavar="'greville' or 'uniform'", action='store', dest='cp_mode', choices=['greville', 'uniform'], default='greville', help=helps['cp_mode']) parser.add_option('-2', '--2d', action='store_true', dest='is_2d', default=False, help=helps['2d']) parser.add_option('-p', '--plot', action='store_true', dest='plot', default=False, help=helps['plot']) parser.add_option('-l', '--label', action='store_true', dest='label', default=False, help=helps['label']) (options, args) = parser.parse_args() dim = 2 if options.is_2d else 3 filename = options.filename if filename is None: filename = 'block%dd.iga' % dim dims = nm.array(eval(options.dims), dtype=nm.float64)[:dim] centre = nm.array(eval(options.centre), dtype=nm.float64)[:dim] shape = nm.array(eval(options.shape), dtype=nm.int32)[:dim] degrees = nm.array(eval(options.degrees), dtype=nm.int32)[:dim] if options.continuity is None: continuity = degrees - 1 else: continuity = nm.array(eval(options.continuity), dtype=nm.int32)[:dim] n_dofs = degrees + 1 + (shape - 2) * (degrees - continuity) output('dimensions:', dims) output('centre: ', centre) output('shape: ', shape) output('degrees: ', degrees) output('continuity:', continuity) output('cp_mode: ', options.cp_mode) output('-> :', filename) output('number of DOFs per axis:', n_dofs) nurbs, bmesh, regions = gen_patch_block_domain(dims, shape, centre, degrees, continuity=continuity, cp_mode=options.cp_mode, name='block', verbose=True) io.write_iga_data(filename, nurbs.knots, nurbs.degrees, nurbs.cps, nurbs.weights, nurbs.cs, nurbs.conn, bmesh.cps, bmesh.weights, bmesh.conn, regions) if options.plot: pn.plt.rcParams['lines.linewidth'] = 2 block = nurbs.nurbs ax = pn.plot_parametric_mesh(None, block.knots) ax.set_title('parametric mesh') ax.axis('equal') points = block.points[..., :dim] ax = pn.plot_control_mesh(None, points, label=options.label) ax = pn.plot_iso_lines(ax, block) ax.set_title('control mesh and iso lines (blue)' ' in Greville abscissae coordinates') ax.axis('equal') points = bmesh.cps ax = pn.plot_bezier_mesh(None, points, bmesh.conn, block.degree, label=options.label) ax = pn.plot_iso_lines(ax, block) ax.set_title('Bezier mesh and iso lines (blue)' ' in Greville abscissae coordinates') ax.axis('equal') pn.plt.rcParams['lines.linewidth'] = 3 line = block.extract(0, 0.5) if dim == 3: line = line.extract(0, 0.5) ax = pn.plot_nurbs_basis_1d(None, line, n_points=1000, legend=options.label) ax.set_xlabel('last parametric coordinate') ax.set_title('1D NURBS basis') ax = pn.plot_nurbs_basis_1d(None, line, n_points=1000, x_axis=dim - 1, legend=options.label) ax.set_xlabel('last physical coordinate') ax.set_title('1D NURBS basis') pn.plt.show()
def main(): parser = OptionParser(usage=usage, version='%prog') parser.add_option('-o', '', metavar='filename', action='store', dest='filename', default=None, help=helps['filename']) parser.add_option('-d', '--dims', metavar='dims', action='store', dest='dims', default='[1.0, 1.0, 1.0]', help=helps['dims']) parser.add_option('-c', '--centre', metavar='centre', action='store', dest='centre', default='[0.0, 0.0, 0.0]', help=helps['centre']) parser.add_option('-s', '--shape', metavar='shape', action='store', dest='shape', default='[5, 5, 5]', help=helps['shape']) parser.add_option('', '--degrees', metavar='degrees', action='store', dest='degrees', default='[2, 2, 2]', help=helps['degrees']) parser.add_option('', '--continuity', metavar='continuity', action='store', dest='continuity', default=None, help=helps['continuity']) parser.add_option('-2', '--2d', action='store_true', dest='is_2d', default=False, help=helps['2d']) parser.add_option('-p', '--plot', action='store_true', dest='plot', default=False, help=helps['plot']) parser.add_option('-l', '--label', action='store_true', dest='label', default=False, help=helps['label']) (options, args) = parser.parse_args() dim = 2 if options.is_2d else 3 filename = options.filename if filename is None: filename = 'block%dd.iga' % dim dims = nm.array(eval(options.dims), dtype=nm.float64)[:dim] centre = nm.array(eval(options.centre), dtype=nm.float64)[:dim] shape = nm.array(eval(options.shape), dtype=nm.int32)[:dim] degrees = nm.array(eval(options.degrees), dtype=nm.int32)[:dim] if options.continuity is None: continuity = degrees - 1 else: continuity = nm.array(eval(options.continuity), dtype=nm.int32)[:dim] output('dimensions:', dims) output('centre: ', centre) output('shape: ', shape) output('degrees: ', degrees) output('continuity:', continuity) output('-> :', filename) dd = centre - 0.5 * dims block = cad.grid(shape - 1, degree=degrees, continuity=continuity) for ia in xrange(dim): block.scale(dims[ia], ia) for ia in xrange(dim): block.translate(dd[ia], ia) # Force uniform control points. This prevents coarser resolution inside the # block. shape = nm.asarray(block.points.shape[:-1]) n_nod = nm.prod(shape) x0 = centre - 0.5 * dims dd = dims / (shape - 1) ngrid = nm.mgrid[[slice(ii) for ii in shape]] ngrid.shape = (dim, n_nod) coors = x0 + ngrid.T * dd coors.shape = shape.tolist() + [dim] block.array[..., :dim] = coors # Compute Bezier extraction data. cs = iga.compute_bezier_extraction(block.knots, block.degree) n_els = [len(ii) for ii in cs] conn, bconn = iga.create_connectivity(n_els, block.knots, block.degree) ccs = iga.combine_bezier_extraction(cs) cps = block.points[..., :dim].copy() cps = cps.reshape((-1, dim)) bcps, bweights = iga.compute_bezier_control(cps, block.weights.ravel(), ccs, conn, bconn) regions = iga.get_patch_box_regions(n_els, block.degree) io.write_iga_data(filename, block.knots, block.degree, cps, block.weights.ravel(), cs, conn, bcps, bweights, bconn, regions) if options.plot: pn.plt.rcParams['lines.linewidth'] = 2 ax = pn.plot_parametric_mesh(None, block.knots) ax.set_title('parametric mesh') ax.axis('equal') points = block.points[..., :dim] ax = pn.plot_control_mesh(None, points, label=options.label) ax = pn.plot_iso_lines(ax, block) ax.set_title('control mesh and iso lines (blue)' ' in Greville abscissae coordinates') ax.axis('equal') points = bcps ax = pn.plot_bezier_mesh(None, points, bconn, block.degree, label=options.label) ax = pn.plot_iso_lines(ax, block) ax.set_title('Bezier mesh and iso lines (blue)' ' in Greville abscissae coordinates') ax.axis('equal') pn.plt.rcParams['lines.linewidth'] = 3 line = block.extract(0, 0) if dim == 3: line = line.extract(0, 0) ax = pn.plot_nurbs_basis_1d(None, line, n_points=1000, legend=options.label) ax.set_xlabel('last parametric coordinate') ax.set_title('1D NURBS basis') ax = pn.plot_nurbs_basis_1d(None, line, n_points=1000, x_axis=dim - 1, legend=options.label) ax.set_xlabel('last physical coordinate') ax.set_title('1D NURBS basis') pn.plt.show()
def main(): parser = OptionParser(usage=usage, version='%prog') parser.add_option('-o', '', metavar='filename', action='store', dest='filename', default=None, help=helps['filename']) parser.add_option('-d', '--dims', metavar='dims', action='store', dest='dims', default='[1.0, 1.0, 1.0]', help=helps['dims']) parser.add_option('-c', '--centre', metavar='centre', action='store', dest='centre', default='[0.0, 0.0, 0.0]', help=helps['centre']) parser.add_option('-s', '--shape', metavar='shape', action='store', dest='shape', default='[5, 5, 5]', help=helps['shape']) parser.add_option('', '--degrees', metavar='degrees', action='store', dest='degrees', default='[2, 2, 2]', help=helps['degrees']) parser.add_option('', '--continuity', metavar='continuity', action='store', dest='continuity', default=None, help=helps['continuity']) parser.add_option('', '--cp-mode', metavar="'greville' or 'uniform'", action='store', dest='cp_mode', choices=['greville', 'uniform'], default='greville', help=helps['cp_mode']) parser.add_option('-2', '--2d', action='store_true', dest='is_2d', default=False, help=helps['2d']) parser.add_option('-p', '--plot', action='store_true', dest='plot', default=False, help=helps['plot']) parser.add_option('-l', '--label', action='store_true', dest='label', default=False, help=helps['label']) (options, args) = parser.parse_args() dim = 2 if options.is_2d else 3 filename = options.filename if filename is None: filename = 'block%dd.iga' % dim dims = nm.array(eval(options.dims), dtype=nm.float64)[:dim] centre = nm.array(eval(options.centre), dtype=nm.float64)[:dim] shape = nm.array(eval(options.shape), dtype=nm.int32)[:dim] degrees = nm.array(eval(options.degrees), dtype=nm.int32)[:dim] if options.continuity is None: continuity = degrees - 1 else: continuity = nm.array(eval(options.continuity), dtype=nm.int32)[:dim] n_dofs = degrees + 1 + (shape - 2) * (degrees - continuity) output('dimensions:', dims) output('centre: ', centre) output('shape: ', shape) output('degrees: ', degrees) output('continuity:', continuity) output('cp_mode: ', options.cp_mode) output('-> :', filename) output('number of DOFs per axis:', n_dofs) nurbs, bmesh, regions = gen_patch_block_domain(dims, shape, centre, degrees, continuity=continuity, cp_mode=options.cp_mode, name='block', verbose=True) io.write_iga_data(filename, nurbs.knots, nurbs.degrees, nurbs.cps, nurbs.weights, nurbs.cs, nurbs.conn, bmesh.cps, bmesh.weights, bmesh.conn, regions) if options.plot: pn.plt.rcParams['lines.linewidth'] = 2 block = nurbs.nurbs ax = pn.plot_parametric_mesh(None, block.knots) ax.set_title('parametric mesh') ax.axis('equal') points = block.points[..., :dim] ax = pn.plot_control_mesh(None, points, label=options.label) ax = pn.plot_iso_lines(ax, block) ax.set_title('control mesh and iso lines (blue)' ' in Greville abscissae coordinates') ax.axis('equal') points = bmesh.cps ax = pn.plot_bezier_mesh(None, points, bmesh.conn, block.degree, label=options.label) ax = pn.plot_iso_lines(ax, block) ax.set_title('Bezier mesh and iso lines (blue)' ' in Greville abscissae coordinates') ax.axis('equal') pn.plt.rcParams['lines.linewidth'] = 3 line = block.extract(0, 0.5) if dim == 3: line = line.extract(0, 0.5) ax = pn.plot_nurbs_basis_1d(None, line, n_points=1000, legend=options.label) ax.set_xlabel('last parametric coordinate') ax.set_title('1D NURBS basis') ax = pn.plot_nurbs_basis_1d(None, line, n_points=1000, x_axis=dim-1, legend=options.label) ax.set_xlabel('last physical coordinate') ax.set_title('1D NURBS basis') pn.plt.show()
def create_patch(R1, R2, C1, C2, order=2, viewpatch=False): """ Create a single 2d NURBS-patch of the area between two coplanar nested circles using igakit. Parameters ---------- R1 : float Radius of the inner circle. R2 : float Radius of the outer circle. C1 : list of two floats Coordinates of the center of the inner circle given as [x1, y1]. C2 : list of two floats Coordinates of the center of the outer circle given as [x2, y2]. order : int, optional Degree of the NURBS basis functions. The default is 2. viewpatch : bool, optional When set to True, display the NURBS patch. The default is False. Returns ------- None. """ from sfepy.discrete.iga.domain_generators import create_from_igakit import sfepy.discrete.iga.io as io from igakit.cad import circle, ruled from igakit.plot import plt as iplt from numpy import pi # Assert the inner circle is inside the outer one inter_centers = nm.sqrt((C2[0] - C1[0])**2 + (C2[1] - C1[1])**2) assert R2 > R1, "Outer circle should have a larger radius than the inner one" assert inter_centers < R2 - R1, "Circles are not nested" # Geometry Creation centers_direction = [C2[0] - C1[0], C2[1] - C1[1]] if centers_direction[0] == 0 and centers_direction[1] == 0: start_angle = 0.0 else: start_angle = nm.arctan2(centers_direction[1], centers_direction[0]) c1 = circle(radius=R1, center=C1, angle=(start_angle, start_angle + 2 * pi)) c2 = circle(radius=R2, center=C2, angle=(start_angle, start_angle + 2 * pi)) srf = ruled(c1, c2).transpose() # make the radial direction first # Refinement insert_U = insert_uniformly(srf.knots[0], 6) insert_V = insert_uniformly(srf.knots[1], 6) srf.refine(0, insert_U).refine(1, insert_V) # Setting the NURBS-surface degree srf.elevate(0, order - srf.degree[0] if order - srf.degree[0] > 0 else 0) srf.elevate(1, order - srf.degree[1] if order - srf.degree[1] > 0 else 0) # Sfepy .iga file creation nurbs, bmesh, regions = create_from_igakit(srf, verbose=True) # Save .iga file in sfepy/meshes/iga filename_domain = data_dir + '/meshes/iga/concentric_circles.iga' io.write_iga_data(filename_domain, None, nurbs.knots, nurbs.degrees, nurbs.cps, nurbs.weights, nurbs.cs, nurbs.conn, bmesh.cps, bmesh.weights, bmesh.conn, regions) if viewpatch: try: iplt.use('mayavi') iplt.figure() iplt.plot(srf) iplt.show() except ImportError: iplt.use('matplotlib') iplt.figure() iplt.plot(srf) iplt.show()
def main(): parser = OptionParser(usage=usage, version='%prog') parser.add_option('-o', '', metavar='filename', action='store', dest='filename', default=None, help=helps['filename']) parser.add_option('-d', '--dims', metavar='dims', action='store', dest='dims', default='[1.0, 1.0, 1.0]', help=helps['dims']) parser.add_option('-c', '--centre', metavar='centre', action='store', dest='centre', default='[0.0, 0.0, 0.0]', help=helps['centre']) parser.add_option('-s', '--shape', metavar='shape', action='store', dest='shape', default='[5, 5, 5]', help=helps['shape']) parser.add_option('', '--degrees', metavar='degrees', action='store', dest='degrees', default='[2, 2, 2]', help=helps['degrees']) parser.add_option('', '--continuity', metavar='continuity', action='store', dest='continuity', default=None, help=helps['continuity']) parser.add_option('-2', '--2d', action='store_true', dest='is_2d', default=False, help=helps['2d']) parser.add_option('-p', '--plot', action='store_true', dest='plot', default=False, help=helps['plot']) parser.add_option('-l', '--label', action='store_true', dest='label', default=False, help=helps['label']) (options, args) = parser.parse_args() dim = 2 if options.is_2d else 3 filename = options.filename if filename is None: filename = 'block%dd.iga' % dim dims = nm.array(eval(options.dims), dtype=nm.float64)[:dim] centre = nm.array(eval(options.centre), dtype=nm.float64)[:dim] shape = nm.array(eval(options.shape), dtype=nm.int32)[:dim] degrees = nm.array(eval(options.degrees), dtype=nm.int32)[:dim] if options.continuity is None: continuity = degrees - 1 else: continuity = nm.array(eval(options.continuity), dtype=nm.int32)[:dim] output('dimensions:', dims) output('centre: ', centre) output('shape: ', shape) output('degrees: ', degrees) output('continuity:', continuity) output('-> :', filename) dd = centre - 0.5 * dims block = cad.grid(shape - 1, degree=degrees, continuity=continuity) for ia in xrange(dim): block.scale(dims[ia], ia) for ia in xrange(dim): block.translate(dd[ia], ia) # Force uniform control points. This prevents coarser resolution inside the # block. shape = nm.asarray(block.points.shape[:-1]) n_nod = nm.prod(shape) x0 = centre - 0.5 * dims dd = dims / (shape - 1) ngrid = nm.mgrid[[slice(ii) for ii in shape]] ngrid.shape = (dim, n_nod) coors = x0 + ngrid.T * dd coors.shape = shape.tolist() + [dim] block.array[..., :dim] = coors # Compute Bezier extraction data. cs = iga.compute_bezier_extraction(block.knots, block.degree) n_els = [len(ii) for ii in cs] conn, bconn = iga.create_connectivity(n_els, block.knots, block.degree) ccs = iga.combine_bezier_extraction(cs) cps = block.points[..., :dim].copy() cps = cps.reshape((-1, dim)) bcps, bweights = iga.compute_bezier_control(cps, block.weights.ravel(), ccs, conn, bconn) regions = iga.get_patch_box_regions(n_els, block.degree) io.write_iga_data(filename, block.knots, block.degree, cps, block.weights.ravel(), cs, conn, bcps, bweights, bconn, regions) if options.plot: pn.plt.rcParams['lines.linewidth'] = 2 ax = pn.plot_parametric_mesh(None, block.knots) ax.set_title('parametric mesh') ax.axis('equal') points = block.points[..., :dim] ax = pn.plot_control_mesh(None, points, label=options.label) ax = pn.plot_iso_lines(ax, block) ax.set_title('control mesh and iso lines (blue)' ' in Greville abscissae coordinates') ax.axis('equal') points = bcps ax = pn.plot_bezier_mesh(None, points, bconn, block.degree, label=options.label) ax = pn.plot_iso_lines(ax, block) ax.set_title('Bezier mesh and iso lines (blue)' ' in Greville abscissae coordinates') ax.axis('equal') pn.plt.rcParams['lines.linewidth'] = 3 line = block.extract(0, 0) if dim == 3: line = line.extract(0, 0) ax = pn.plot_nurbs_basis_1d(None, line, n_points=1000, legend=options.label) ax.set_xlabel('last parametric coordinate') ax.set_title('1D NURBS basis') ax = pn.plot_nurbs_basis_1d(None, line, n_points=1000, x_axis=dim-1, legend=options.label) ax.set_xlabel('last physical coordinate') ax.set_title('1D NURBS basis') pn.plt.show()