@@ -28,7 +28,8 @@ MODULE cp_fm_diag
2828 cp_fm_upper_to_full
2929 USE cp_fm_struct, ONLY: cp_fm_struct_create,&
3030 cp_fm_struct_release,&
31- cp_fm_struct_type
31+ cp_fm_struct_type,&
32+ cp_fm_struct_get
3233 USE cp_fm_types, ONLY: cp_fm_create,&
3334 cp_fm_release,&
3435 cp_fm_get_info,&
@@ -52,7 +53,7 @@ MODULE cp_fm_diag
5253 ieee_all
5354#endif
5455
55- #if defined (__ELPA) || defined(__ELPA2)
56+ #if defined (__ELPA) || defined(__ELPA2) || defined(__ELPA3 )
5657 USE ELPA2, ONLY: solve_evp_real_2stage
5758#endif
5859
@@ -111,7 +112,7 @@ SUBROUTINE diag_init(diag_lib,switched,k_elpa)
111112 IF (try_library) THEN
112113 IF (diag_lib.EQ. " ELPA" ) THEN
113114
114- #if defined (__ELPA) || defined (__ELPA2)
115+ #if defined (__ELPA) || defined (__ELPA2) || defined (__ELPA3 )
115116 diag_type = 3
116117#else
117118 ! ELPA library not linked, switch to SL
@@ -919,18 +920,19 @@ SUBROUTINE cp_fm_elpa(matrix,eigenvectors,eigenvalues)
919920 routineP = moduleN// ' :' // routineN
920921
921922 INTEGER :: handle
922- #if defined(__SCALAPACK) && (defined(__ELPA) || defined (__ELPA2))
923+ #if defined(__SCALAPACK) && (defined(__ELPA) || defined (__ELPA2) || defined(__ELPA3) )
923924 INTEGER :: comm_col, comm_row, group, &
924- mypcol, &
925- myprow, n, n_rows, nblk, neig
925+ mypcol, myprow, n, &
926+ n_rows, n_cols, &
927+ nblk, neig
926928 LOGICAL :: success
927929 REAL (KIND= dp), DIMENSION (:), POINTER :: eval
928930 REAL (KIND= dp), DIMENSION (:, :), POINTER :: m, v
929931 TYPE(cp_blacs_env_type), POINTER :: context
930932#endif
931933
932934 CALL timeset(routineN,handle)
933- #if defined(__SCALAPACK) && (defined(__ELPA) || defined (__ELPA2))
935+ #if defined(__SCALAPACK) && (defined(__ELPA) || defined (__ELPA2) || defined (__ELPA3) )
934936
935937 success = .TRUE.
936938
@@ -953,23 +955,29 @@ SUBROUTINE cp_fm_elpa(matrix,eigenvectors,eigenvalues)
953955 ! elpa needs the full matrix
954956 CALL cp_fm_upper_to_full(matrix,eigenvectors)
955957
956- n_rows = matrix%matrix_struct%local_leading_dimension
957- nblk = matrix%matrix_struct%nrow_block
958+ CALL cp_fm_struct_get(matrix%matrix_struct,&
959+ local_leading_dimension= n_rows,&
960+ ncol_local= n_cols,&
961+ nrow_block= nblk)
962+
958963 neig = SIZE (eigenvalues,1 )
959964 ! the full eigenvalues vector is needed
960965 ALLOCATE(eval(n))
961966
962967 ! Calculate eigenvalues/ eigenvectors
963968#if defined (__ELPA)
964969 CALL solve_evp_real_2stage(n,neig,m,n_rows,eval,v,n_rows,nblk,comm_row,comm_col,group)
965-
966- #else
970+ #elif defined (__ELPA2)
967971 success = solve_evp_real_2stage(n,neig,m,n_rows,eval,v,n_rows,nblk,comm_row,comm_col,group,&
968972 THIS_REAL_ELPA_KERNEL_API= kernel_type,useQR= .FALSE. )
969- IF (.NOT. success)&
970- CPABORT(" ELPA failed to diagonalize a matrix" )
973+ #else
974+ success = solve_evp_real_2stage(n,neig,m,n_rows,eval,v,n_rows,nblk,n_cols,comm_row,comm_col,group,&
975+ THIS_REAL_ELPA_KERNEL_API= kernel_type,useQR= .FALSE. )
971976#endif
972977
978+ IF (.NOT. success)&
979+ CPABORT(" ELPA failed to diagonalize a matrix" )
980+
973981 eigenvalues(1 :neig) = eval(1 :neig)
974982
975983 DEALLOCATE(eval)
0 commit comments