Bases

In Nutils, a basis is a vector-valued function object that evaluates, in any given point \( ξ \) on the topology, to the full array of basis function values \( φ_0(ξ), φ_1(ξ), \dots, φ_{n-1}(ξ) \). It must be pointed out that Nutils will in practice operate only on the basis functions that are locally non-zero, a key optimization in Finite Element computations. But as a concept, it helps to think of a basis as evaluating always to the full array.

Several nutils.topology.Topology objects support creating bases via the Topology.basis() method. A nutils.topology.StructuredTopology, as generated by nutils.mesh.rectilinear, can create a spline basis with arbitrary degree and arbitrary continuity. The following generates a degree one spline basis on our previously created unit line topology topo:

basis = topo.basis('spline', degree=1)

The five basis functions are

plot_line(basis)

output

We will use this basis throughout the following sections.

Change the degree argument to 2 for a quadratic spline basis:

plot_line(topo.basis('spline', degree=2))

output

By default the continuity of the spline functions at element edges is the degree minus one. To change this, pass the desired continuity via keyword argument continuity. For example, a quadratic spline basis with \( C^0 \) continuity is generated with

plot_line(topo.basis('spline', degree=2, continuity=0))

output

\( C^0 \) continuous spline bases can also be generated by the 'std' basis:

plot_line(topo.basis('std', degree=2))

output

The 'std' basis is supported by topologies with square and/or triangular elements without hanging nodes.

Discontinuous basis functions are generated using the 'discont' type, e.g.

plot_line(topo.basis('discont', degree=2))

output