Source code for splipy.utils.nutils

from __future__ import division

__doc__ = 'Implementation of convenience methods with respect to nutils integration.'

from splipy import Curve, Surface, Volume
import numpy as np


[docs]def controlpoints(spline): """ Return controlpoints according to nutils ordering """ n = len(spline) dim = spline.dimension if isinstance(spline, Curve): return np.reshape(spline[:,:] , (n, dim), order='F') elif isinstance(spline, Surface): return np.reshape(spline[:,:,:].swapaxes(0,1) , (n, dim), order='F') elif isinstance(spline, Volume): return np.reshape(spline[:,:,:,:].swapaxes(0,2), (n, dim), order='F')
raise RuntimeError('Non-spline argument detected')
[docs]def multiplicities(spline): """ Returns the multiplicity of the knots at all knot values as a 2D array for all parametric directions, for all knots """
return [[spline.order(d) - spline.bases[d].continuity(k) - 1 for k in spline.knots(d)] for d in range(spline.pardim)]
[docs]def degree(spline): """ Returns polynomial degree (splipy order - 1) for all parametric directions """
return [p-1 for p in spline.order()]
[docs]def splipy_to_nutils(spline): """ Returns nutils domain and geometry object for spline mapping given by the argument """ from nutils import mesh, function domain, geom = mesh.rectilinear(spline.knots()) cp = controlpoints(spline) basis = domain.basis('spline', degree=degree(spline), knotmultiplicities=multiplicities(spline)) geom = function.matmat(basis, cp) #TODO: add correct behaviour for rational and/or periodic geometries
return domain, geom