Unpack a condensed representation of cell widths or time steps.

For a list of numbers, if the same value is repeat or expanded by a constant factor, it may be represented in a condensed form using list of floats and/or tuples. unpack_widths takes a list of floats and/or tuples in condensed form, e.g.:

[ float, (cellSize, numCell), (cellSize, numCell, factor) ]

and expands the representation to a list containing all widths in order. That is:

[ w1, w2, w3, …, wn ]

valuelist of float and/or tuple

The list of floats and/or tuples that are to be unpacked


The unpacked list with all widths in order


Time stepping for time-domain codes can be represented in condensed form, e.g.:

>>> from discretize.utils import unpack_widths
>>> dt = [ (1e-5, 10), (1e-4, 4), 1e-3 ]

The above means to take 10 steps at a step width of 1e-5 s and then 4 more at 1e-4 s, and then one step of 1e-3 s. When unpacked, the output is of length 15 and is given by:

>>> unpack_widths(dt)
array([1.e-05, 1.e-05, 1.e-05, 1.e-05, 1.e-05, 1.e-05, 1.e-05, 1.e-05,
       1.e-05, 1.e-05, 1.e-04, 1.e-04, 1.e-04, 1.e-04, 1.e-03])

Each axis of a tensor mesh can also be defined as a condensed list of floats and/or tuples. When a third number is defined in any tuple, the width value is successively expanded by that factor, e.g.:

>>> dt = [ 6., 8., (10.0, 3), (8.0, 4, 2.) ]
>>> unpack_widths(dt)
array([  6.,   8.,  10.,  10.,  10.,  16.,  32.,  64., 128.])