Commit 2daa533b authored by Uliana Alekseeva's avatar Uliana Alekseeva

elpa-2017.05.003 interface implemented

parent b065f991
...@@ -32,12 +32,15 @@ LINK_LIBRARIES ${FLEUR_LIBRARIES}) ...@@ -32,12 +32,15 @@ LINK_LIBRARIES ${FLEUR_LIBRARIES})
try_compile(FLEUR_USE_ELPA_201605003 ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/cmake/tests/test_ELPA_201605003.f90 try_compile(FLEUR_USE_ELPA_201605003 ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/cmake/tests/test_ELPA_201605003.f90
LINK_LIBRARIES ${FLEUR_LIBRARIES}) LINK_LIBRARIES ${FLEUR_LIBRARIES})
try_compile(FLEUR_USE_ELPA_201605004 ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/cmake/tests/test_ELPA_201605004.f90 try_compile(FLEUR_USE_ELPA_201605004 ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/cmake/tests/test_ELPA_201605004.f90
LINK_LIBRARIES ${FLEUR_LIBRARIES})
try_compile(FLEUR_USE_ELPA_201705003 ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR}/cmake/tests/test_ELPA_201705003.f90
LINK_LIBRARIES ${FLEUR_LIBRARIES}) LINK_LIBRARIES ${FLEUR_LIBRARIES})
message("Version check for ELPA:") message("Version check for ELPA:")
message("OLD ELPA : ${FLEUR_USE_ELPA_OLD}") message("OLD ELPA : ${FLEUR_USE_ELPA_OLD}")
message("NEW ELPA : ${FLEUR_USE_ELPA_NEW}") message("NEW ELPA : ${FLEUR_USE_ELPA_NEW}")
message("201605003 ELPA: ${FLEUR_USE_ELPA_201605003}") message("201605003 ELPA: ${FLEUR_USE_ELPA_201605003}")
message("201605004 ELPA: ${FLEUR_USE_ELPA_201605004}") message("201605004 ELPA: ${FLEUR_USE_ELPA_201605004}")
message("201705003 ELPA: ${FLEUR_USE_ELPA_201705003}")
#Set preprocessor switches #Set preprocessor switches
if (FLEUR_USE_ELPA_OLD) if (FLEUR_USE_ELPA_OLD)
set(FLEUR_USE_ELPA TRUE) set(FLEUR_USE_ELPA TRUE)
...@@ -55,4 +58,8 @@ LINK_LIBRARIES ${FLEUR_LIBRARIES}) ...@@ -55,4 +58,8 @@ LINK_LIBRARIES ${FLEUR_LIBRARIES})
set(FLEUR_USE_ELPA TRUE) set(FLEUR_USE_ELPA TRUE)
set(FLEUR_MPI_DEFINITIONS ${FLEUR_MPI_DEFINITIONS} "CPP_ELPA" "CPP_ELPA2" "CPP_ELPA_201605004") set(FLEUR_MPI_DEFINITIONS ${FLEUR_MPI_DEFINITIONS} "CPP_ELPA" "CPP_ELPA2" "CPP_ELPA_201605004")
endif() endif()
if (FLEUR_USE_ELPA_201705003)
set(FLEUR_USE_ELPA TRUE)
set(FLEUR_MPI_DEFINITIONS ${FLEUR_MPI_DEFINITIONS} "CPP_ELPA" "CPP_ELPA2" "CPP_ELPA_201705003")
endif()
endif() endif()
program test
use elpa
implicit none
class(elpa_t),pointer :: elpa1
integer :: success,na
call elpa1%set("na",na,success)
end
...@@ -128,9 +128,9 @@ CONTAINS ...@@ -128,9 +128,9 @@ CONTAINS
!print *,"priv_create_blacsgrid" !print *,"priv_create_blacsgrid"
! determine block size ! determine block size
! !
nb = 20 nb = 64
IF (m.GT.2048) nb = 30 !2 !IF (m.GT.2048) nb = 30 !2
IF (m.GT.8*2048) nb = 60 !4 !IF (m.GT.8*2048) nb = 60 !4
! compute processor grid, as square as possible ! compute processor grid, as square as possible
! If not square with more rows than columns ! If not square with more rows than columns
...@@ -200,7 +200,10 @@ CONTAINS ...@@ -200,7 +200,10 @@ CONTAINS
!Create communicators for ELPA !Create communicators for ELPA
!print *,"creating ELPA comms" !print *,"creating ELPA comms"
#if defined (CPP_ELPA_201605004) || defined (CPP_ELPA_201605003)||defined(CPP_ELPA_NEW) #if defined (CPP_ELPA_201705003)
mpi_comm_rows = -1
mpi_comm_cols = -1
#elif defined (CPP_ELPA_201605004) || defined (CPP_ELPA_201605003)||defined(CPP_ELPA_NEW)
ierr=get_elpa_row_col_comms(mpi_subcom, myrowblacs, mycolblacs,mpi_comm_rows, mpi_comm_cols) ierr=get_elpa_row_col_comms(mpi_subcom, myrowblacs, mycolblacs,mpi_comm_rows, mpi_comm_cols)
#else #else
CALL get_elpa_row_col_comms(mpi_subcom, myrowblacs, mycolblacs,mpi_comm_rows, mpi_comm_cols) CALL get_elpa_row_col_comms(mpi_subcom, myrowblacs, mycolblacs,mpi_comm_rows, mpi_comm_cols)
......
...@@ -10,7 +10,10 @@ ...@@ -10,7 +10,10 @@
#ifdef CPP_ELPA2 #ifdef CPP_ELPA2
USE elpa2 USE elpa2
#endif #endif
IMPLICIT NONE #ifdef CPP_ELPA_201705003
USE elpa
#endif
IMPLICIT NONE
INCLUDE 'mpif.h' INCLUDE 'mpif.h'
INTEGER, INTENT (IN) :: m INTEGER, INTENT (IN) :: m
...@@ -37,10 +40,33 @@ ...@@ -37,10 +40,33 @@
CPP_REALCOMPLEX, ALLOCATABLE :: asca(:,:), bsca(:,:),tmp2(:,:) CPP_REALCOMPLEX, ALLOCATABLE :: asca(:,:), bsca(:,:),tmp2(:,:)
CPP_REALCOMPLEX, ALLOCATABLE :: eigvec(:,:) CPP_REALCOMPLEX, ALLOCATABLE :: eigvec(:,:)
INTEGER, EXTERNAL :: numroc, indxl2g !SCALAPACK functions INTEGER, EXTERNAL :: numroc, indxl2g !SCALAPACK functions
#ifdef CPP_ELPA_201705003
CLASS(elpa_t),pointer :: elpa_obj
err = elpa_init(20170403)
elpa_obj => elpa_allocate()
#endif
num2=num
CALL priv_create_blacsgrid(sub_comm,m, np,nb,myid,npcol,nprow,mycol,myrow,myrowssca,mycolssca,& CALL priv_create_blacsgrid(sub_comm,m, np,nb,myid,npcol,nprow,mycol,myrow,myrowssca,mycolssca,&
ictextblacs,sc_desc,mpi_comm_rows,mpi_comm_cols) ictextblacs,sc_desc,mpi_comm_rows,mpi_comm_cols)
#ifdef CPP_ELPA_201705003
CALL elpa_obj%set("na", m, err)
CALL elpa_obj%set("nev", num2, err)
CALL elpa_obj%set("local_nrows", myrowssca, err)
CALL elpa_obj%set("local_ncols", mycolssca, err)
CALL elpa_obj%set("nblk", nb, err)
CALL elpa_obj%set("mpi_comm_parent", sub_comm, err)
CALL elpa_obj%set("process_row", myrow, err)
CALL elpa_obj%set("process_col", mycol, err)
#ifdef CPP_ELPA2
CALL elpa_obj%set("solver", ELPA_SOLVER_2STAGE)
#else
CALL elpa_obj%set("solver", ELPA_SOLVER_1STAGE)
#endif
err = elpa_obj%setup()
#endif
! Number of columns the local process gets in ScaLAPACK distribution ! Number of columns the local process gets in ScaLAPACK distribution
ALLOCATE ( asca(myrowssca,mycolssca), stat=err ) ALLOCATE ( asca(myrowssca,mycolssca), stat=err )
...@@ -84,7 +110,11 @@ ...@@ -84,7 +110,11 @@
! Please note: cholesky_complex/invert_trm_complex are not trimmed for speed. ! Please note: cholesky_complex/invert_trm_complex are not trimmed for speed.
! The only reason having them is that the Scalapack counterpart ! The only reason having them is that the Scalapack counterpart
! PDPOTRF very often fails on higher processor numbers for unknown reasons! ! PDPOTRF very often fails on higher processor numbers for unknown reasons!
#if defined(CPP_ELPA_201605003) || defined(CPP_ELPA_201605004)
#if defined(CPP_ELPA_201705003)
CALL elpa_obj%cholesky(bsca, err)
CALL elpa_obj%invert_triangular(bsca, err)
#elif defined(CPP_ELPA_201605003) || defined(CPP_ELPA_201605004)
ok=CPP_CHOLESKY (m,bsca,SIZE(bsca,1),nb,mycolssca,mpi_comm_rows,mpi_comm_cols,.false.) ok=CPP_CHOLESKY (m,bsca,SIZE(bsca,1),nb,mycolssca,mpi_comm_rows,mpi_comm_cols,.false.)
ok=CPP_invert_trm(m,bsca,SIZE(bsca,1),nb,mycolssca,mpi_comm_rows,mpi_comm_cols,.false.) ok=CPP_invert_trm(m,bsca,SIZE(bsca,1),nb,mycolssca,mpi_comm_rows,mpi_comm_cols,.false.)
#elif defined CPP_ELPA_NEW #elif defined CPP_ELPA_NEW
...@@ -109,22 +139,28 @@ ...@@ -109,22 +139,28 @@
n_row = numroc (n_col, nb, myrow, 0, nprow) n_row = numroc (n_col, nb, myrow, 0, nprow)
asca(n_row+1:myrowssca,i) = eigvec(n_row+1:myrowssca,i) asca(n_row+1:myrowssca,i) = eigvec(n_row+1:myrowssca,i)
ENDDO ENDDO
#ifdef CPP_ELPA_201605004
#if defined (CPP_ELPA_201705003)
CALL elpa_obj%hermitian_multiply('U','L', m, bsca, asca, myrowssca, mycolssca, eigvec, myrowssca, mycolssca, err)
#elif defined (CPP_ELPA_201605004)
ok=CPP_mult ('U', 'L',m, m,bsca,myrowssca,mycolssca,asca,SIZE(asca,1),SIZE(asca,2),nb,& ok=CPP_mult ('U', 'L',m, m,bsca,myrowssca,mycolssca,asca,SIZE(asca,1),SIZE(asca,2),nb,&
mpi_comm_rows, mpi_comm_cols,eigvec,myrowssca,mycolssca) mpi_comm_rows, mpi_comm_cols,eigvec,myrowssca,mycolssca)
#elif CPP_ELPA_201605003 #elif defined (CPP_ELPA_201605003)
ok=CPP_mult ('U', 'L',m, m,bsca,myrowssca,asca,SIZE(asca,1),nb, mpi_comm_rows, mpi_comm_cols,eigvec,myrowssca) ok=CPP_mult ('U', 'L',m, m,bsca,myrowssca,asca,SIZE(asca,1),nb, mpi_comm_rows, mpi_comm_cols,eigvec,myrowssca)
#else #else
CALL CPP_mult ('U', 'L',m, m,bsca,myrowssca,asca,SIZE(asca,1),nb, mpi_comm_rows, mpi_comm_cols,eigvec,myrowssca) CALL CPP_mult ('U', 'L',m, m,bsca,myrowssca,asca,SIZE(asca,1),nb, mpi_comm_rows, mpi_comm_cols,eigvec,myrowssca)
#endif #endif
! 2b. tmp2 = eigvec**T ! 2b. tmp2 = eigvec**T
CALL CPP_transpose(m,m,CPP_ONE,eigvec,1,1,sc_desc,CPP_ZERO,tmp2,1,1,sc_desc) CALL CPP_transpose(m,m,CPP_ONE,eigvec,1,1,sc_desc,CPP_ZERO,tmp2,1,1,sc_desc)
! 2c. A = U**-T * tmp2 ( = U**-T * Aorig * U**-1 ) ! 2c. A = U**-T * tmp2 ( = U**-T * Aorig * U**-1 )
#ifdef CPP_ELPA_201605004 #if defined (CPP_ELPA_201705003)
CALL elpa_obj%hermitian_multiply('U','U', m, bsca, tmp2, myrowssca, mycolssca, asca, myrowssca, mycolssca, err)
#elif defined (CPP_ELPA_201605004)
ok=CPP_mult ('U', 'U', m, m, bsca, SIZE(bsca,1),SIZE(bsca,2), tmp2,& ok=CPP_mult ('U', 'U', m, m, bsca, SIZE(bsca,1),SIZE(bsca,2), tmp2,&
SIZE(tmp2,1),SIZE(tmp2,2),nb, mpi_comm_rows, mpi_comm_cols, asca, SIZE(asca,1),SIZE(asca,2)) SIZE(tmp2,1),SIZE(tmp2,2),nb, mpi_comm_rows, mpi_comm_cols, asca, SIZE(asca,1),SIZE(asca,2))
#elif CPP_ELPA_201605003 #elif defined (CPP_ELPA_201605003)
ok=CPP_mult ('U', 'U', m, m, bsca, SIZE(bsca,1), tmp2,& ok=CPP_mult ('U', 'U', m, m, bsca, SIZE(bsca,1), tmp2,&
SIZE(tmp2,1),nb, mpi_comm_rows, mpi_comm_cols, asca, SIZE(asca,1)) SIZE(tmp2,1),nb, mpi_comm_rows, mpi_comm_cols, asca, SIZE(asca,1))
#else #else
...@@ -132,7 +168,6 @@ ...@@ -132,7 +168,6 @@
SIZE(tmp2,1),nb, mpi_comm_rows, mpi_comm_cols, asca, SIZE(asca,1)) SIZE(tmp2,1),nb, mpi_comm_rows, mpi_comm_cols, asca, SIZE(asca,1))
#endif #endif
! A is only set in the upper half, solve_evp_real needs a full matrix ! A is only set in the upper half, solve_evp_real needs a full matrix
! Set lower half from upper half ! Set lower half from upper half
...@@ -149,8 +184,9 @@ ...@@ -149,8 +184,9 @@
! 3. Calculate eigenvalues/eigenvectors of U**-T * A * U**-1 ! 3. Calculate eigenvalues/eigenvectors of U**-T * A * U**-1
! Eigenvectors go to eigvec ! Eigenvectors go to eigvec
num2=num #if defined (CPP_ELPA_201705003)
#if defined(CPP_ELPA_201605003) || defined(CPP_ELPA_201605004) CALL elpa_obj%eigenvectors(asca, eig2, eigvec, err)
#elif defined(CPP_ELPA_201605003) || defined(CPP_ELPA_201605004)
#ifdef CPP_ELPA2 #ifdef CPP_ELPA2
ok=CPP_solve_evp_2stage(m,num2,asca,SIZE(asca,1),& ok=CPP_solve_evp_2stage(m,num2,asca,SIZE(asca,1),&
eig2,eigvec,SIZE(asca,1), nb,mycolssca, mpi_comm_rows, mpi_comm_cols,sub_comm) eig2,eigvec,SIZE(asca,1), nb,mycolssca, mpi_comm_rows, mpi_comm_cols,sub_comm)
...@@ -181,7 +217,9 @@ ...@@ -181,7 +217,9 @@
! mult_ah_b_complex needs the transpose of U**-1, thus tmp2 = (U**-1)**T ! mult_ah_b_complex needs the transpose of U**-1, thus tmp2 = (U**-1)**T
CALL CPP_transpose(m,m,CPP_ONE,bsca,1,1,sc_desc,CPP_ZERO,tmp2,1,1,sc_desc) CALL CPP_transpose(m,m,CPP_ONE,bsca,1,1,sc_desc,CPP_ZERO,tmp2,1,1,sc_desc)
#ifdef CPP_ELPA_201605004 #if defined (CPP_ELPA_201705003)
CALL elpa_obj%hermitian_multiply('L','N', num2, tmp2, eigvec, myrowssca, mycolssca, asca, myrowssca, mycolssca, err)
#elif defined (CPP_ELPA_201605004)
ok= CPP_mult ('L', 'N',m, num2, tmp2, SIZE(asca,1),SIZE(asca,2),& ok= CPP_mult ('L', 'N',m, num2, tmp2, SIZE(asca,1),SIZE(asca,2),&
eigvec, SIZE(asca,1),SIZE(asca,2),nb,mpi_comm_rows, mpi_comm_cols, asca, SIZE(asca,1),SIZE(asca,2)) eigvec, SIZE(asca,1),SIZE(asca,2),nb,mpi_comm_rows, mpi_comm_cols, asca, SIZE(asca,1),SIZE(asca,2))
#elif CPP_ELPA_201605003 #elif CPP_ELPA_201605003
...@@ -191,10 +229,17 @@ ...@@ -191,10 +229,17 @@
CALL CPP_mult ('L', 'N',m, num2, tmp2, SIZE(asca,1),& CALL CPP_mult ('L', 'N',m, num2, tmp2, SIZE(asca,1),&
eigvec, SIZE(asca,1),nb,mpi_comm_rows, mpi_comm_cols, asca, SIZE(asca,1)) eigvec, SIZE(asca,1),nb,mpi_comm_rows, mpi_comm_cols, asca, SIZE(asca,1))
#endif #endif
#if defined (CPP_ELPA_201705003)
CALL elpa_deallocate(elpa_obj)
CALL elpa_uninit()
#endif
! END of ELPA stuff ! END of ELPA stuff
CALL BLACS_GRIDEXIT(ictextblacs,ierr) CALL BLACS_GRIDEXIT(ictextblacs,ierr)
#if ( !defined (CPP_ELPA_201705003))
CALL MPI_COMM_FREE(mpi_comm_rows,ierr) CALL MPI_COMM_FREE(mpi_comm_rows,ierr)
CALL MPI_COMM_FREE(mpi_comm_cols,ierr) CALL MPI_COMM_FREE(mpi_comm_cols,ierr)
#endif
!print *,"elpa done" !print *,"elpa done"
! !
...@@ -226,4 +271,4 @@ ...@@ -226,4 +271,4 @@
DEALLOCATE ( asca ) DEALLOCATE ( asca )
DEALLOCATE ( bsca ) DEALLOCATE ( bsca )
DEALLOCATE (eigvec, tmp2, eig2) DEALLOCATE (eigvec, tmp2, eig2)
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