I'm looking for a sparse eigenvalue solver that returns just the number of eigenvalues starting from the lowest one that I specify rather than all of them between emin and emax. For example, I would like to be able to tell it to return the lowest 20 eigenvalues in the range from emin to emax that I specify even though there may be 1000 eigenvalues in that range.
I have looked at the Intel MKL Extended Eigensolver, however the problem for me is that I am dealing with large matrices of n>100000 that may have a huge number of eigenvalues between the range of emin to emax that I am interested in, and I will run out of memory if I try to dimension x (the array in which the eigenvectors are returned) big enough to hold them all. It also defeats the purpose of using a packed CSR array for a and b if x is considerably bigger than both of them.
If I specify m0=20, but there are 1000 eigenvalues between emin and emax, the documentation says that the routines return Info=3. It seems like it wouldn't be too hard a modification for the routines to just return the number of eigenvalues I specify in m0 rather than stopping and returning an error.
Does anyone know if if there is a good way of doing this?
The documentation says info=3 is a Warning not an Error. The computation should continue instead of stopping.
MKL Extended Eigensolver currently returns all eigen pairs within the search interval [emin, emax]. The interface does not allow users to pick only the lowest n eigen pairs among all pairs. Your problem seems to be that the search interval is too big. Would a narrower [emin, emax] range help, probably?
We may ask MKL developers to consider supporting the feature you asked for. It'll be helpful if you provide more details about your use case, for example, which FEAST function you are calling? How are other parameters specified? Can you please attach your test code, and a test matrix, if possible?
Thanks for your reply. I could specify a smaller emin-emax interval, but it is just a shot in the dark as to what to set m0 to and what size to dimension my e, x and res arrays. I would have to call Feast multiple times and this is quite time consuming.
In a structural engineering finite element dynamic frequency analysis, the eigenvalues represent the natural frequencies of a building (or any structure) and the eigenvectors represent the shape of the corresponding vibration modes. In these cases, the engineer generally specifies how many eigenvalues they want to investigate as well as a range of frequencies they are interested in.
Similarly, in a structural buckling analysis, only the first (lowest) eigenvalue is generally of interest because once that has been exceeded then the structure has collapsed.
I have been able to get around the problem by calling Pardiso in a trial and error procedure to find a value of emax that will give me the exact number of eigenvalues I am looking for between emin and emax. I can then allocate my e, x and res arrays and then call Feast knowing exactly what m value it will return. It works well, but it would be nice if Feast could do this internally (and probably more efficiently and quicker than I can).
By the way, if I know what value of m will be returned before calling Feast, can I dimension x as x(n,m) or does it have to be x(n,m0)?
My source code is attached, including the Pardiso trial and error procedure.
Thanks for providing your explanation and test code. The MKL team will consider this feature request. Please looking forward to more communication about this issue sent your registered email address.