Nutils 5 Farfalle

Nutils 5.0 was released on April 3rd, 2020.

Nutils 5.1 was released on September 3rd, 2019.

Nutils 5.2 was released on June 11th, 2019.

What's New?

These are the main additions and changes since Nutils 4 Eliche.

Matrix matmul operator, solve with multiple right hand sides

The Matrix.matvec method has been deprecated in favour of the new __matmul__ (@) operator, which supports multiplication arrays of any dimension. The nutils.matrix.Matrix.solve method has been extended to support multiple right hand sides:

matrix.matvec(lhs) # deprecated
matrix @ lhs # new syntax
matrix @ numpy.stack([lhs1, lhs2, lhs3], axis=1)
matrix.solve(rhs)
matrix.solve(numpy.stack([rhs1, rhs2, rhs3], axis=1)

MKL's fgmres method

Matrices produced by the MKL backend now support the nutils.matrix.Matrix.solve argument solver='fmgres' to use Intel MKL's fgmres method.

Thetamethod time target

The nutils.solver.thetamethod class, as well as its special cases impliciteuler and cranknicolson, now have a timetarget argument to specify that the formulation contains a time variable:

res = topo.integral('...?t... d:x' @ ns, degree=2)
solver.impliciteuler('dofs', res, ..., timetarget='t')

New leveltopo argument for trimming

In nutils.topology.Topology.trim, in case the levelset cannot be evaluated on the to-be-trimmed topology itself, the correct topology can now be specified via the new leveltopo argument.

New unittest assertion assertAlmostEqual64

nutils.testing.TestCase now facilitates comparison against base64 encoded, compressed, and packed data via the new method nutils.testing.TestCase.assertAlmostEqual64. This replaces numeric.assert_allclose64 which is now deprecated and scheduled for removal in Nutils 6.

Fast locate for structured topology, geometry

A special case nutils.topology.Topology.locate method for structured topologies checks of the geometry is an affine transformation of the natural configuration, in which case the trivial inversion is used instead of expensive Newton iterations:

topo, geom = mesh.rectilinear([2, 3])
smp = topo.locate(geom/2-1, [[-.1,.2]])
# locate detected linear geometry: x = [-1. -1.] + [0.5 0.5] xi ~+2.2e-16

Lazy references, transforms, bases

The introduction of sequence abstractions nutils.elementseq and nutils.transformseq, together with and a lazy implementation of nutils.function.Basis basis functions, help to prevent the unnecessary generation of data. In hierarchically refined topologies, in particular, this results in large speedups and a much reduced memory footprint.

Switch to treelog

The nutils.log module is deprecated and will be replaced by the externally maintained treelog <https://github.com/evalf/treelog>_, which is now an installation dependency.

Replace pariter, parmap by fork, range.

The nutils.parallel module is largely rewritten. The old methods pariter and parmap are replaced by the nutils.parallel.fork context, combined with the shared nutils.parallel.range iterator:

indices = parallel.range(10)
with parallel.fork(nprocs=2) as procid:
  for index in indices:
    print('procid={}, index={}'.format(procid, index))