The principal idea of the AWFD library is that actual numerical operations like basis transforms, finite difference
operators, or quadratures are implemented for the univariate case only. The multivariate data structures are designed
to allow for a relatively fast read/write of data lines along one coordinate direction to univariate data structures.
There are multivariate data structures for uniform, level adaptive and adaptive trial spaces/grids. The univariate numerical algorithms come in two flavours: a nonadaptive one based on simple arrays and an adaptive one based on the data structure AdaptiveB. The reason for this redundancy is twofold. First, we used the non-adaptive (and simple to implement) algorithms to test the more complicated adaptive algorithms. Second, for uniform and level adaptive grids it is faster to use the non-adaptive versions.
This splitting has a number of advantages. As the numerical operations require a frequent and some times
irregular access to the data, the univariate data structures are tuned for speed and not for memory efficiency.
The multivariate data structures, on the other hand, are tuned for memory efficiency and not so much for speed.
Furthermore, we could implement and test the rather difficult numerical operations separately for the simple univariate case.