Commit a43ac6d6 authored by Andreas Marek's avatar Andreas Marek
Browse files

Introduce public method eigenvalues

parent 692d8cd8
......@@ -128,8 +128,9 @@ the user application):
6. do the desired task with the *ELPA* library, which could be
a) e%eigenvectors ! solve EV problem with solver as set by "set" method; returns eigenvalues AND eigenvectors
a) e%eigenvectors ! solve EV problem with solver as set by "set" method; computes eigenvalues AND eigenvectors
! (replaces a) and b) from legacy API)
b) e%eigenvalues ! solve EV problem with solver as set by "set" method; computes eigenvalues only
b) e%solve_tridi ! solve problem with tridiagonal matrix (replacement for c) from legacy API)
c) e%choleksy ! do a cholesky decomposition (replaces d) from legacy API)
d) e%invert_tridiagonal ! invert triangular matrix (replaces e) from legacy API)
......
......@@ -59,7 +59,6 @@ Using *ELPA* with the latest API is done in the following steps
of the ELPA library has been build with GPU support enables
- "timings" can be either 0 or 1, switches time measurements off or on
- "debug" can be either 0 or 1, switches detailed debug messages off/on
- "eigenvalues_only" can be either 0 or 1. In case of 1 only compute the eigenvalues
- call ELPA-type function solve or others
......@@ -67,6 +66,8 @@ Using *ELPA* with the latest API is done in the following steps
- "eigenvectors" solves the eigenvalue problem for single/double real/complex valued matrices and
returns the eigenvalues AND eigenvectors
- "eigenvalues" solves the eigenvalue problem for single/double real/complex valued matrices and
returns the eigenvalues
- "hermetian_multipy" computes C = A^T * B (real) or C = A^H * B (complex) for single/double
real/complex matrices
- "cholesky" does a cholesky factorization for a single/double real/complex matrix
......
......@@ -102,8 +102,6 @@ function elpa_solve_evp_&
logical :: useGPU
logical :: success
logical :: solve_eigenvectors
logical :: do_useGPU
integer(kind=ik) :: numberOfGPUDevices
......@@ -114,7 +112,6 @@ function elpa_solve_evp_&
character(200) :: errorMessage
integer(kind=ik) :: na, nev, lda, ldq, nblk, matrixCols, &
mpi_comm_rows, mpi_comm_cols, mpi_comm_all
integer(kind=ik) :: eigenvalues_only
call obj%timer%start("elpa_solve_evp_&
&MATH_DATATYPE&
......@@ -124,9 +121,9 @@ function elpa_solve_evp_&
if (present(q)) then
solve_eigenvectors =.true.
obj%eigenvalues_only = .false.
else
solve_eigenvectors = .false.
obj%eigenvalues_only = .true.
endif
na = obj%na
......@@ -206,7 +203,7 @@ function elpa_solve_evp_&
endif
! allocate a dummy q_intern, if eigenvectors should not be commputed and thus q is NOT present
if ((solve_eigenvectors)) then
if (.not.(obj%eigenvalues_only)) then
q_actual => q(1:obj%local_nrows,1:obj%local_ncols)
else
allocate(q_dummy(obj%local_nrows,obj%local_ncols))
......@@ -261,15 +258,14 @@ function elpa_solve_evp_&
call obj%timer%stop("solve")
if (.not.(success)) return
call obj%get("eigenvalues_only",eigenvalues_only)
if (eigenvalues_only .eq. 1) then
if (obj%eigenvalues_only) then
return
endif
if ((solve_eigenvectors) ) then
if (.not.(obj%eigenvalues_only) ) then
! q must be given thats why from here on we can use q and not q_actual
#if COMPLEXCASE == 1
ql(1:l_rows,1:l_cols_nev) = q_real(1:l_rows,1:l_cols_nev)
q(1:l_rows,1:l_cols_nev) = q_real(1:l_rows,1:l_cols_nev)
#endif
call obj%timer%start("back")
......@@ -279,7 +275,7 @@ function elpa_solve_evp_&
&PRECISION&
& (obj, na, nev, a, lda, tau, q, ldq, nblk, matrixCols, mpi_comm_rows, mpi_comm_cols, do_useGPU)
call obj%timer%stop("back")
endif ! .not.solve_eigenvectors
endif ! .not.(obj%eigenvalues_only
#if COMPLEXCASE == 1
deallocate(q_real, stat=istat, errmsg=errorMessage)
......@@ -303,7 +299,7 @@ function elpa_solve_evp_&
stop 1
endif
if (.not.(solve_eigenvectors)) then
if (obj%eigenvalues_only) then
deallocate(q_dummy, stat=istat, errmsg=errorMessage)
if (istat .ne. 0) then
print *,"solve_evp_&
......
......@@ -100,7 +100,7 @@
integer(kind=c_intptr_t) :: tmat_dev, q_dev, a_dev
integer(kind=c_int) :: i
logical :: success, successCUDA, solve_eigenvectors
logical :: success, successCUDA
logical :: wantDebug
integer(kind=c_int) :: istat, gpu, debug, qr
character(200) :: errorMessage
......@@ -112,7 +112,6 @@
&MATH_DATATYPE
integer(kind=ik) :: na, nev, lda, ldq, nblk, matrixCols, &
mpi_comm_rows, mpi_comm_cols, mpi_comm_all
integer(kind=ik) :: eigenvalues_only
call obj%timer%start("elpa_solve_evp_&
&MATH_DATATYPE&
......@@ -121,9 +120,9 @@
&")
if (present(q)) then
solve_eigenvectors = .true.
obj%eigenvalues_only = .false.
else
solve_eigenvectors = .false.
obj%eigenvalues_only = .true.
endif
na = obj%na
......@@ -264,7 +263,7 @@
call obj%timer%start("bandred")
if (solve_eigenvectors) then
if (.not. obj%eigenvalues_only) then
q_actual => q(1:obj%local_nrows,1:obj%local_ncols)
else
allocate(q_dummy(1:obj%local_nrows,1:obj%local_ncols))
......@@ -392,12 +391,11 @@
stop 1
endif
call obj%get("eigenvalues_only",eigenvalues_only)
if (eigenvalues_only .eq. 1) then
if (obj%eigenvalues_only) then
return
endif
if (solve_eigenvectors) then
if (.not. obj%eigenvalues_only) then
#if COMPLEXCASE == 1
! q must be given thats why from here on we can use q and not q_actual
......@@ -471,9 +469,9 @@
endif
endif
call obj%timer%stop("trans_ev_to_full")
endif ! solve_eigenvectors
endif ! .not. obj%eigenvalue_only
if (.not.(solve_eigenvectors)) then
if (obj%eigenvalues_only) then
deallocate(q_dummy, stat=istat, errmsg=errorMessage)
if (istat .ne. 0) then
print *,"solve_evp_&
......
......@@ -77,6 +77,7 @@ module elpa_abstract_impl
#endif
type(c_ptr) :: index = C_NULL_PTR
logical :: eigenvalues_only
contains
! set private fields in the index
generic, public :: set_private => &
......
......@@ -113,9 +113,10 @@ static int elpa_double_value_to_string(char *name, double value, const char **st
BASE_ENTRY(option_name, option_description, 0, 0, 0), \
}
#define PRIVATE_INT_ENTRY(option_name, option_description) \
#define PRIVATE_INT_ENTRY(option_name, default) \
{ \
BASE_ENTRY(option_name, option_description, 0, 0, 1), \
BASE_ENTRY(option_name, NULL, 0, 0, 1), \
.default_value = default, \
}
static const elpa_index_int_entry_t int_entries[] = {
......@@ -145,7 +146,7 @@ static const elpa_index_int_entry_t int_entries[] = {
BOOL_ENTRY("timings", "Enable time measurement", 0),
BOOL_ENTRY("debug", "Emit verbose debugging messages", 0),
BOOL_ENTRY("print_flops", "Print FLOP rates on task 0", 0),
BOOL_ENTRY("eigenvalues_only", "Only compute the eigenvalues and return", 0),
PRIVATE_INT_ENTRY("eigenvalues_only", 0),
};
#define READONLY_DOUBLE_ENTRY(option_name, option_description) \
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment