32 use blas_lapack,
only: blasint
33 use const,
only: stdout
34 use mpi_mod,
only: mpi_xermsg, nprocs, myrank
42 use iso_c_binding,
only: c_int
43 use elpa,
only: elpa_t, elpa_allocate, elpa_deallocate, elpa_init, elpa_uninit, elpa_ok, elpa_solver_1stage
74 integer(elpaint),
parameter :: elpa_api = 20181112
75 integer(elpaint) :: success
77 success = elpa_init(elpa_api)
78 call elpa_assert(
'initialize_elpa',
'ELPA API version not supported', success)
97 type(
options),
intent(in) :: option
98 integer,
intent(in) :: num_eigenpair
99 logical,
intent(in) :: all_procs
100 real(wp),
allocatable,
intent(inout) :: z_mat(:,:), w(:)
103 integer(elpaint) :: success, nb, loc_r, loc_c, mat_dimen, myrow, mycol, nev, comm
104 class(elpa_t),
pointer :: elpa
106 write (stdout,
"('Diagonalization will be done with ELPA')")
109 myrow = grid % mygrow
110 mycol = grid % mygcol
113 mat_dimen = matrix_elements % get_matrix_size()
114 loc_r = matrix_elements % local_row_dimen
115 loc_c = matrix_elements % local_col_dimen
116 nb = matrix_elements % scal_block_size
119 allocate(z_mat(loc_r, loc_c), w(mat_dimen), stat = ierr)
121 call mpi_xermsg(
'ELPADiagonalizer_module',
'diagonalize_backend_ELPA',
'Memory allocation error.', ierr, 1)
125 elpa => elpa_allocate(success)
126 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to create ELPA object.', success)
129 call elpa % set(
'na', mat_dimen, success)
130 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to set "na" for ELPA.', success)
131 call elpa % set(
'nev', mat_dimen, success)
132 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to set "nev" for ELPA.', success)
133 call elpa % set(
'local_nrows', loc_r, success)
134 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to set "local_nrows" for ELPA.', success)
135 call elpa % set(
'local_ncols', loc_c, success)
136 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to set "local_ncols" for ELPA.', success)
137 call elpa % set(
'nblk', nb, success)
138 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to set "nblk" for ELPA.', success)
139 call elpa % set(
'mpi_comm_parent', comm, success)
140 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to set "mpi_comm_parent" for ELPA.', success)
141 call elpa % set(
'process_row', myrow, success)
142 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to set "process_row" for ELPA.', success)
143 call elpa % set(
'process_col', mycol, success)
144 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to set "process_col" for ELPA.', success)
147 success = elpa % setup()
148 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to set up the ELPA object.', success)
151 call elpa % eigenvectors(matrix_elements % a_local_matrix, w, z_mat, success)
152 call elpa_assert(
'diagonalize_backend_ELPA',
'Diagonalization using ELPA failed.', success)
155 call elpa_deallocate(elpa, success)
156 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to deallocate the ELPA object.', success)
170 character(len=*),
intent(in) :: sub, msg
171 integer(elpaint),
intent(in) :: err
173 if (err /= elpa_ok)
then
174 call mpi_xermsg(
'ELPADiagonalizer_module', sub, msg, int(err), 1)