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