109 subroutine dispatchmatrixanddiagonalizer (diag_choice, force_serial, matrix_size, number_of_eigenpairs, matrix, diagonalizer, &
112 use parallelization_module,
only: grid => process_grid
114 class(basematrix),
pointer,
intent(out) :: matrix
115 class(basediagonalizer),
pointer,
intent(out) :: diagonalizer
116 class(baseintegral),
intent(in) :: integral
118 integer,
intent(in) :: diag_choice, force_serial
119 integer,
intent(in) :: matrix_size, number_of_eigenpairs
120 integer,
intent(in) :: matrix_io
121 integer :: final_choice
125 final_choice = diag_choice
127 if (number_of_eigenpairs > real(matrix_size) * 0.2)
then
129 else if (number_of_eigenpairs <= 3)
then
138 if (nprocs > 1 .and. force_serial == 0)
then
139 select case (final_choice)
143 write (stdout,
"('ELPA chosen as diagonalizer of choice. Hohoho!')")
144 if (grid % gprows > matrix_size .or. grid % gpcols > matrix_size)
then
145 write (stdout,
"('Too many processes for ELPA (BLACS grid size > matrix size). Defaulting to SCALAPACK.')")
146 write (stdout,
"(3(a,i0))")
'nprocs = ', grid%gprows,
'×', grid%gpcols,
' and matrix_size = ', matrix_size
147 allocate(scalapackmatrix::matrix)
148 allocate(scalapackdiagonalizer::diagonalizer)
150 allocate(elpamatrix::matrix)
151 allocate(elpadiagonalizer::diagonalizer)
154 write (stdout,
"('ScaLAPACK chosen as diagonalizer of choice. Nice!')")
155 allocate(scalapackmatrix::matrix)
156 allocate(scalapackdiagonalizer::diagonalizer)
159 call mpi_xermsg(
'Dispatcher_module',
'DispatchMatrixAndDiagonalizer', &
160 'ScaLAPACK needed for dense diagonalization!', 1, 1)
163 write (stdout,
"('Davidson chosen as diagonalizer of choice. Sweet!')")
165 write (stdout,
"('SLEPc chosen as diagonalizer of choice. Amazing!')")
166 allocate(slepcmatrix::matrix)
167 allocate(slepcdiagonalizer::diagonalizer)
168#elif defined(scalapack)
170 write (stdout,
"('Compiled without SLEPc, defaulting to ELPA')")
171 if (grid % gprows > matrix_size .or. grid % gpcols > matrix_size)
then
172 write (stdout,
"('Too many processes for ELPA (BLACS grid size > matrix size). Defaulting to SCALAPACK.')")
173 write (stdout,
"(3(a,i0))")
'nprocs = ', grid%gprows,
'×', grid%gpcols,
' and matrix_size = ', matrix_size
174 allocate(scalapackmatrix::matrix)
175 allocate(scalapackdiagonalizer::diagonalizer)
177 allocate(elpamatrix::matrix)
178 allocate(elpadiagonalizer::diagonalizer)
181 write (stdout,
"('Compiled without SLEPc, defaulting to ScaLAPACK')")
182 allocate(scalapackmatrix::matrix)
183 allocate(scalapackdiagonalizer::diagonalizer)
186 call mpi_xermsg(
'Dispatcher_module',
'DispatchMatrixAndDiagonalizer', &
187 'SLEPc or ScaLAPACK needed for distributed diagonalization!', 1, 1)
191 write (stdout,
"('SLEPc chosen as diagonalizer of choice. Amazing!')")
192 allocate(slepcmatrix::matrix)
193 allocate(slepcdiagonalizer::diagonalizer)
194#elif defined(scalapack)
196 write (stdout,
"('Compiled without SLEPc, defaulting to ELPA')")
197 if (grid % gprows > matrix_size .or. grid % gpcols > matrix_size)
then
198 write (stdout,
"('Too many processes for ELPA (BLACS grid size > matrix size). Defaulting to SCALAPACK.')")
199 write (stdout,
"(3(a,i0))")
'nprocs = ', grid%gprows,
'×', grid%gpcols,
' and matrix_size = ', matrix_size
200 allocate(scalapackmatrix::matrix)
201 allocate(scalapackdiagonalizer::diagonalizer)
203 allocate(elpamatrix::matrix)
204 allocate(elpadiagonalizer::diagonalizer)
207 write (stdout,
"('Compiled without SLEPc, defaulting to ScaLAPACK')")
208 allocate(scalapackmatrix::matrix)
209 allocate(scalapackdiagonalizer::diagonalizer)
212 call mpi_xermsg(
'Dispatcher_module',
'DispatchMatrixAndDiagonalizer', &
213 'SLEPc or ScaLAPACK needed for distributed diagonalization!', 1, 1)
216 write (stdout,
"('That is not a diagonalizer I would have chosen tbh, lets not do it')")
217 call mpi_xermsg(
'Dispatcher_module',
'DispatchMatrixAndDiagonalizer', &
218 'Invalid diagonalizer flag chosen', 1, 1)
224 select case (final_choice)
226 write (stdout,
"('LAPACK chosen as diagonalizer of choice. Nice!')")
228 call integral % write_matrix_header(matrix_io, matrix_size)
229 allocate(writermatrix::matrix)
230 allocate(lapackdiagonalizer::diagonalizer)
232 write (stdout,
"('Davidson chosen as diagonalizer of choice. Sweet!')")
233 call integral % write_matrix_header(matrix_io, matrix_size)
234 allocate(writermatrix::matrix)
235 allocate(davidsondiagonalizer::diagonalizer)
238 write (stdout,
"('ARPACK chosen as diagonalizer of choice. Amazing!')")
239 call integral % write_matrix_header(matrix_io, matrix_size)
240 allocate(writermatrix::matrix)
241 allocate(arpackdiagonalizer::diagonalizer)
243 write (stdout,
"('ARPACK not available - using LAPACK. Sorry!')")
244 call integral % write_matrix_header(matrix_io, matrix_size)
245 allocate(writermatrix::matrix)
246 allocate(lapackdiagonalizer::diagonalizer)
249 write (stdout,
"('That is not a diagonalizer I would have chosen tbh, lets not do it')")
250 stop
"Invalid diagonalizer flag chosen"
264 subroutine dispatchintegral (sym_group_flag, ukrmolplus_integrals, integral)
265 class(baseintegral),
pointer,
intent(out) :: integral
266 integer,
intent(in) :: sym_group_flag
267 logical,
intent(in) :: ukrmolplus_integrals
270 allocate(alchemyintegral::integral)
272 if (ukrmolplus_integrals)
then
273 allocate(ukrmolintegral::integral)
275 allocate(swedenintegral::integral)