43 use elpa,
only: elpa_t, elpa_allocate, elpa_deallocate, elpa_init, elpa_uninit, elpa_ok, elpa_solver_2stage
92 subroutine diagonalize_backend_elpa (this, matrix_elements, num_eigenpair, z_mat, w, all_procs, option, integrals)
94 class(elpadiagonalizer) :: this
95 class(scalapackmatrix),
intent(in) :: matrix_elements
96 class(baseintegral),
intent(in) :: integrals
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 get_environment_variable(
'ELPA_DEFAULT_solver', status = ierr)
154 call elpa % set(
"solver", elpa_solver_2stage, success)
155 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to switch ELPA to the 2-stage solver.', success)
159 call elpa % eigenvectors(matrix_elements % a_local_matrix, w, z_mat, success)
160 call elpa_assert(
'diagonalize_backend_ELPA',
'Diagonalization using ELPA failed.', success)
163 call elpa_deallocate(elpa, success)
164 call elpa_assert(
'diagonalize_backend_ELPA',
'Failed to deallocate the ELPA object.', success)