From: Thomas Klimpel (Thomas.Klimpel_at_[hidden])
Date: 2008-05-01 06:26:28
Attached are bindings for syevd, heevd, syevx and heevx, so that they can be reviewed if desired.
These bindings require integer workspaces in addition to the real/complex workspaces normally required. This is solved by using "std::pair<detail::workspace2<WC,WR>, detail::workspace1<WI> > work" as parameter in case of user given workarrays, and minimal_workspace or optimal_workspace in case of automatically allocated temporary arrays.
The workspace for optimal_workspace is determined by a workspace query with lwork=-1, because it seems to work just fine.
These bindings use the logic from hbev.hpp, that a real symmetric matrix is also a real hermitian matrix. The files syevd.hpp and syevx.hpp just forward the function call to heevd and heevx, but check that the value type is a real type (not complex).
The tests ublas_heevd.cpp and ublas_heevx.cpp are just slightly modified versions of ublas_heev.cpp, but they also test for do_value_type< float >() and do_value_type< double >() in addition to do_value_type< std::complex<float> >() and do_value_type< std::complex<double> >().
I only tested these bindings with lapack 3.1, but I guess they will also work with lapack 3.0. I don't expect these bindings to work with lapack 2.x, but I don't think that supporting lapack 2.x is still required.
I will commit these bindings to the sandbox version of the bindings sooner or later, if no strong objections occur. Feel free to comment on them and give suggestions.