Add SimplicialNonHermitianLLT and SimplicialNonHermitianLDLT

This PR adds two new sparse matrix solvers: SimplicialNonHermitianLLT and SimplicialNonHermitianLDLT. These are similar to the existing LLT and LDLT solvers, but work with complex symmetric rather than complex hermitian matrices. Such matrices arise in some physics problems (e.g. electromagnetic FEM simulations).

These solvers are just a minor variation of the existing solvers, the only difference is that (1) a regular transpose should be used instead of a conjugate transpose, and (2) it can't be assumed that the main diagonal is real.

I think I managed to implement this in a way that doesn't break any public API. The only user-visible API change is the fact that SparseSolverBase::setShift now takes arguments of type DiagonalScalar rather than RealScalar, but for the existing solvers this is merely a typedef for RealScalar so this shouldn't break anything.

I had to make some changes to the internals though, in particular I didn't want to make far-reaching changes to the SelfAdjointView class to support non-conjugate transpose views, so I changed the code in SparseSolverBase to use the lower-level internal functions permute_symm_to_symm and permute_symm_to_fullsymm instead.

I've also added tests for the new solvers to test/simplicial_cholesky.cpp.

Edited by Maarten Baert

Merge request reports

Loading