Bugfixes and extensions for HLib

Bugfixes for HLib 1.3

Patch 21: Incorrect leading dimension in write_supermatrix
The function write_supermatrix was using rows as the leading dimension of s->s instead of block_rows. This patch should fix the error.

Patch 20: Incorrect nearfield quadrature in curvebem and quadrature1d
The nearfield entries of the two-dimensional single and double layer potential matrices were computed incorrectly. This patch should fix the error and adds some functions to curvebem that are handy for solving integral equations on curves in two-dimensional space.

Patch 19: Index error in recfill_surfacebem_supermatrix
The row and column indices in the routine used for filling a supermatrix structure using interpolation were switched. This patch should fix the error and add some assert statements to validate that the correct supermatrix structure is used.

Patch 18: Missing term in setentry_rkmatrix
Instead of setting an entry of an rkmatrix, the function sometimes only added to the matrix. This patch should fix the error.

Patch 17: Integer overflow in hca_surfacebem
An integer overflow in the routine hca_surfacebem could cause it to try to create very large fullmatrix structures, which usually leads to a segmentation fault. This patch tries to detect integer overflows and should avoid these problems.

Patch 16: Portable timing everywhere
There are a number of other references to the now obsolete constant CLK_TCK in the source code. This patch should replace all of them by using sysconf.

Portable timing in basic
The original timing routine in eta_progressbar uses the obsolete constant CLK_TCK. This patch replaces it by a call to the POSIX-conformant sysconf routine. It also fixes a minor issue in the allocmem routine.

Recursive destructor for blockcluster
The old destructor of the blockcluster class deletes only the root of a block cluster tree instead of everything. This patch makes sure that this memory leak no longer occurs.

Modified semantics for getentry_clusterbasis
The sematics of the routine getentry_clusterbasis was a little strange: calling the function repeatedly with identical parameters yielded different results due to the internal processing of the backward transformation. This patch changes the behaviour: the input vector yt has to be passed explicitly, the result is an entry of V yt (where V is given implicitly for non-leaf clusters).

New syntax for SSE2 builtins in gcc 4.x
The GNU compiler collection 4.x uses a new syntax for SSE2 builtins. This means that modules like laplacebem will not compile. This patch should ensure that the new syntax is supported.

Unsuitable quadrature weights in l2norm_surfacebem
The surfacebem class contains not only standard quadrature weights for triangles, but also modified weights adapted to the basis functions of the discretization scheme. The routine l2norm_surfacebem used the latter kind when it should have been using the former. This patch should fix this problem.

Memory leak in krylov routines
The high-level routines (like solve_gmres_sparsematrix) create temporary gmres or conjgrad objects which were not released again. This patch should fix this problem.

Output of strange rkmatrix blocks
If the temporary rank r->kt of an rkmatrix is larger than the number of its rows and columns, the display of the singular values produced by the routine outputleaf_rkmatrix will be incorrect. This patch should fix this problem.

GMRES and invariant subspaces
If the GMRES solver encounters an invariant subspace, it does not compute the exact solution in this subspace, but in a lower-dimensional subspace. This patch cleans this problem up and should make the GMRES implementation more resistent to strange matrices.

Undesired weak admissibility condition
The module blockcluster sometimes uses the weak admissibility condition in situations where the user has requested a more restrictive criterion. This patch should fix the problem.

Virtual H2-matrices with strange cluster trees
The module h2virtual will not work correctly if the cluster tree contains leaves with a very high number of elements. This patch corrects the problem.

Rectangular matrix blocks and an old ACA implementation
In one of the ACA routines in surfacebem, row and column indices of blocks are mixed up. This small patch should correct this bug.

SSE2 detection not reliable
The detection of SSE2 support is not working as intended, which can lead to SSE2 code on machines which do not support it. This patch should lead to a more reliable test. It works only if the previous SSE2-related patch has already been installed.

SSE2 detection leads to internal compiler error
Some versions of the GNU compiler collection produce an internal compiler error when trying to create the module laplacebem. This is not a bug in HLib, but in the compiler. Here is a patch which allows the configure script to detect whether the compiler is buggy and to disable the fast quadrature routines if necessary.

Unreliable computation of integrals for 2D BEM
The routines collocation_slp and collocation_dlp do not give correct results if the collocation point and the start and ending points of the interval lie in a line. This patch should fix the problem.

Missing scaling factor for 2D FEM
The discretization of the principal part of the differential operator in the routine ellipticpde_grid2d misses a scaling factor. This patch should fix the problem.

Extensions for HLib 1.3

H2-matrix conversion of submatrices
The modules h2conversion and h2newconv only work for entire matrices, but not for submatrices. This patch allows them to treat proper submatrices. Note: converting all subblocks of a supermatrix will not automatically yield an H2-matrix.

Generalized H-matrix coarsening routine
Coarsening the structure of a hierarchical matrix adaptively can reduce the storage requirements significantly. It is desirable to have a method for constructing the coarsened matrix without storing the entire original matrix. Until now, this functionality was only available for matrices corresponding to 3D BEM. This patch adds a general coarsening routine which uses the blockcluster structure and suitable callback functions to describe the original matrix and compresses it "on the fly", thus conserving storage.

Steffen Börm and Lars Grasedyck
Max-Planck-Institut für Mathematik in den Naturwissenschaften
Inselstrasse 22-26, 04103 Leipzig, Germany

Valid HTML 4.01