Commit e2ea52e9 authored by Andreas Marek's avatar Andreas Marek
Browse files

start to update documentation for skew-symmetric

parent cf514bab
Changelog for upcoming release Changelog for upcoming release
- not yet decided - support of ELPA for real valued skew-symmetric matrices, please see:
CITATION
Changelog for ELPA 2019.05.001 Changelog for ELPA 2019.05.001
......
...@@ -85,7 +85,7 @@ An excerpt of the most important (*ELPA* specific) options reads as follows: ...@@ -85,7 +85,7 @@ An excerpt of the most important (*ELPA* specific) options reads as follows:
| --disable-Fortran2008-features | disable Fortran 2008 if compiler does not support it | | --disable-Fortran2008-features | disable Fortran 2008 if compiler does not support it |
| --enable-pyhton | build and install python wrapper, default no | | --enable-pyhton | build and install python wrapper, default no |
| --enable-python-tests | enable python tests, default no. | | --enable-python-tests | enable python tests, default no. |
| --enable-skew-symmetric-support | enable support for real valued skew-symmetric matrices |
We recommend that you do not build ELPA in its main directory but that you use it We recommend that you do not build ELPA in its main directory but that you use it
in a sub-directory: in a sub-directory:
......
...@@ -514,6 +514,10 @@ dist_man_MANS = \ ...@@ -514,6 +514,10 @@ dist_man_MANS = \
man/elpa_autotune_save_state.3 \ man/elpa_autotune_save_state.3 \
man/elpa_autotune_load_state.3 \ man/elpa_autotune_load_state.3 \
man/elpa_autotune_print_state.3 \ man/elpa_autotune_print_state.3 \
man/elpa_autotune_setup.3 \
man/elpa_autotune_step.3 \
man/elpa_autotune_set_best.3 \
man/elpa_autotune_deallocate.3 \
man/elpa_uninit.3 man/elpa_uninit.3
if ENABLE_LEGACY if ENABLE_LEGACY
...@@ -539,10 +543,6 @@ dist_man_MANS += \ ...@@ -539,10 +543,6 @@ dist_man_MANS += \
man/elpa_solve_evp_real_single.3 \ man/elpa_solve_evp_real_single.3 \
man/elpa_solve_evp_complex_double.3 \ man/elpa_solve_evp_complex_double.3 \
man/elpa_solve_evp_complex_single.3 \ man/elpa_solve_evp_complex_single.3 \
man/elpa_autotune_setup.3 \
man/elpa_autotune_step.3 \
man/elpa_autotune_set_best.3 \
man/elpa_autotune_deallocate.3
endif endif
......
...@@ -39,7 +39,7 @@ AC_SUBST([$1], ['$2']) ...@@ -39,7 +39,7 @@ AC_SUBST([$1], ['$2'])
# API Version # API Version
AC_DEFINE([EARLIEST_API_VERSION], [20170403], [Earliest supported ELPA API version]) AC_DEFINE([EARLIEST_API_VERSION], [20170403], [Earliest supported ELPA API version])
AC_DEFINE_SUBST(CURRENT_API_VERSION, 20190524, "Current ELPA API version") AC_DEFINE_SUBST(CURRENT_API_VERSION, 20191110, "Current ELPA API version")
# Autotune Version # Autotune Version
AC_DEFINE([EARLIEST_AUTOTUNE_VERSION], [20171201], [Earliest ELPA API version, which supports autotuning]) AC_DEFINE([EARLIEST_AUTOTUNE_VERSION], [20171201], [Earliest ELPA API version, which supports autotuning])
AC_DEFINE([CURRENT_AUTOTUNE_VERSION], [20190524], [Current ELPA autotune version]) AC_DEFINE([CURRENT_AUTOTUNE_VERSION], [20190524], [Current ELPA autotune version])
...@@ -1369,7 +1369,25 @@ AM_CONDITIONAL([WANT_SINGLE_PRECISION_REAL],[test x"$want_single_precision" = x" ...@@ -1369,7 +1369,25 @@ AM_CONDITIONAL([WANT_SINGLE_PRECISION_REAL],[test x"$want_single_precision" = x"
AM_CONDITIONAL([WANT_SINGLE_PRECISION_COMPLEX],[test x"$want_single_precision" = x"yes"]) AM_CONDITIONAL([WANT_SINGLE_PRECISION_COMPLEX],[test x"$want_single_precision" = x"yes"])
#always define SKEWSYMMETRIC for the moment #always define SKEWSYMMETRIC for the moment
AC_DEFINE([SKEWSYMMETRIC],[1],[build for skewsyemmtric case])
AC_MSG_CHECKING(whether we should enable skew-symmetric support)
AC_ARG_ENABLE([skew-symmetric-support],
AS_HELP_STRING([--enable-skew-symmetric-support],
[enable support for real valued skew-symmetric matrices]),
[if test x"$enableval" = x"yes"; then
enable_skewsymmetric=yes
else
enable_skewsymmetric=no
fi],
[enable_skewsymmetric=no])
AC_MSG_RESULT([${enable_skewsymmetric}])
AM_CONDITIONAL([HAVE_SKEWSYMMETRIC],[test x"$enable_skewsymmetric" = x"yes"])
if test x"${enable_skewsymmetric}" = x"yes"; then
if test x"${USE_ASSUMED_SIZE}" = x"no"; then
AC_MSG_ERROR(you have to enable assumed size arrays, if you want to build with skew-symmetric support)
fi
AC_DEFINE([HAVE_SKEWSYMMETRIC],[1],[build for skewsyemmtric case])
fi
AC_SUBST([MPI_BINARY]) AC_SUBST([MPI_BINARY])
AC_SUBST([WITH_MKL]) AC_SUBST([WITH_MKL])
......
...@@ -111,7 +111,7 @@ ...@@ -111,7 +111,7 @@
!> !>
!> ! We urge the user to always check the error code of all ELPA functions !> ! We urge the user to always check the error code of all ELPA functions
!> !>
!> if (elpa_init(20181112) /= ELPA_OK) then !> if (elpa_init(20191110) /= ELPA_OK) then
!> print *, "ELPA API version not supported" !> print *, "ELPA API version not supported"
!> stop !> stop
!> endif !> endif
...@@ -178,7 +178,7 @@ ...@@ -178,7 +178,7 @@
!> !>
!> /* We urge the user to always check the error code of all ELPA functions */ !> /* We urge the user to always check the error code of all ELPA functions */
!> !>
!> if (elpa_init(20181113) != ELPA_OK) { !> if (elpa_init(20191110) != ELPA_OK) {
!> fprintf(stderr, "Error: ELPA API version not supported"); !> fprintf(stderr, "Error: ELPA API version not supported");
!> exit(1); !> exit(1);
!> } !> }
...@@ -233,7 +233,7 @@ ...@@ -233,7 +233,7 @@
!> class(elpa_autotune_t), pointer :: tune_state !> class(elpa_autotune_t), pointer :: tune_state
!> integer :: success !> integer :: success
!> !>
!> if (elpa_init(20181112) /= ELPA_OK) then !> if (elpa_init(20191110) /= ELPA_OK) then
!> print *, "ELPA API version not supported" !> print *, "ELPA API version not supported"
!> stop !> stop
!> endif !> endif
......
...@@ -174,9 +174,9 @@ module elpa1_compute ...@@ -174,9 +174,9 @@ module elpa1_compute
#include "elpa_transpose_vectors.F90" #include "elpa_transpose_vectors.F90"
#define SKEW_SYMMETRIC #define SKEW_SYMMETRIC_BUILD
#include "elpa_transpose_vectors.F90" #include "elpa_transpose_vectors.F90"
#undef SKEW_SYMMETRIC #undef SKEW_SYMMETRIC_BUILD
#include "elpa_reduce_add_vectors.F90" #include "elpa_reduce_add_vectors.F90"
#undef DOUBLE_PRECISION #undef DOUBLE_PRECISION
#undef REALCASE #undef REALCASE
...@@ -188,9 +188,9 @@ module elpa1_compute ...@@ -188,9 +188,9 @@ module elpa1_compute
#include "../general/precision_macros.h" #include "../general/precision_macros.h"
#include "elpa_transpose_vectors.F90" #include "elpa_transpose_vectors.F90"
#define SKEW_SYMMETRIC #define SKEW_SYMMETRIC_BUILD
#include "elpa_transpose_vectors.F90" #include "elpa_transpose_vectors.F90"
#undef SKEW_SYMMETRIC #undef SKEW_SYMMETRIC_BUILD
#include "elpa_reduce_add_vectors.F90" #include "elpa_reduce_add_vectors.F90"
#undef SINGLE_PRECISION #undef SINGLE_PRECISION
#undef REALCASE #undef REALCASE
...@@ -202,9 +202,9 @@ module elpa1_compute ...@@ -202,9 +202,9 @@ module elpa1_compute
#define DOUBLE_PRECISION 1 #define DOUBLE_PRECISION 1
#include "../general/precision_macros.h" #include "../general/precision_macros.h"
#include "elpa_transpose_vectors.F90" #include "elpa_transpose_vectors.F90"
#define SKEW_SYMMETRIC #define SKEW_SYMMETRIC_BUILD
#include "elpa_transpose_vectors.F90" #include "elpa_transpose_vectors.F90"
#undef SKEW_SYMMETRIC #undef SKEW_SYMMETRIC_BUILD
#include "elpa_reduce_add_vectors.F90" #include "elpa_reduce_add_vectors.F90"
#undef COMPLEXCASE #undef COMPLEXCASE
#undef DOUBLE_PRECISION #undef DOUBLE_PRECISION
...@@ -215,9 +215,9 @@ module elpa1_compute ...@@ -215,9 +215,9 @@ module elpa1_compute
#define SINGLE_PRECISION 1 #define SINGLE_PRECISION 1
#include "../general/precision_macros.h" #include "../general/precision_macros.h"
#include "elpa_transpose_vectors.F90" #include "elpa_transpose_vectors.F90"
#define SKEW_SYMMETRIC #define SKEW_SYMMETRIC_BUILD
#include "elpa_transpose_vectors.F90" #include "elpa_transpose_vectors.F90"
#undef SKEW_SYMMETRIC #undef SKEW_SYMMETRIC_BUILD
#include "elpa_reduce_add_vectors.F90" #include "elpa_reduce_add_vectors.F90"
#undef COMPLEXCASE #undef COMPLEXCASE
#undef SINGLE_PRECISION #undef SINGLE_PRECISION
......
...@@ -78,7 +78,7 @@ function elpa_solve_evp_& ...@@ -78,7 +78,7 @@ function elpa_solve_evp_&
MATH_DATATYPE(kind=rck), optional,target,intent(out) :: q(obj%local_nrows,*) MATH_DATATYPE(kind=rck), optional,target,intent(out) :: q(obj%local_nrows,*)
#else #else
MATH_DATATYPE(kind=rck), intent(inout) :: a(obj%local_nrows,obj%local_ncols) MATH_DATATYPE(kind=rck), intent(inout) :: a(obj%local_nrows,obj%local_ncols)
#if SKEWSYMMETRIC == 1 #ifdef HAVE_SKEWSYMMETRIC
MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, target, intent(out) :: q(obj%local_nrows,2*obj%local_ncols) MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, target, intent(out) :: q(obj%local_nrows,2*obj%local_ncols)
#else #else
MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, target, intent(out) :: q(obj%local_nrows,obj%local_ncols) MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, target, intent(out) :: q(obj%local_nrows,obj%local_ncols)
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
#include "../general/sanity.F90" #include "../general/sanity.F90"
#undef ROUTINE_NAME #undef ROUTINE_NAME
#ifdef SKEW_SYMMETRIC #ifdef SKEW_SYMMETRIC_BUILD
#define ROUTINE_NAME elpa_transpose_vectors_ss_ #define ROUTINE_NAME elpa_transpose_vectors_ss_
#else #else
#define ROUTINE_NAME elpa_transpose_vectors_ #define ROUTINE_NAME elpa_transpose_vectors_
...@@ -198,7 +198,7 @@ subroutine ROUTINE_NAME& ...@@ -198,7 +198,7 @@ subroutine ROUTINE_NAME&
k = (i - nblks_skip - n)/lcm_s_t * nblk + (lc - 1) * auxstride k = (i - nblks_skip - n)/lcm_s_t * nblk + (lc - 1) * auxstride
ns = (i/npt)*nblk ! local start of block i ns = (i/npt)*nblk ! local start of block i
nl = min(nvr-i*nblk,nblk) ! length nl = min(nvr-i*nblk,nblk) ! length
#ifdef SKEW_SYMMETRIC #ifdef SKEW_SYMMETRIC_BUILD
vmat_t(ns+1:ns+nl,lc) = - aux(k+1:k+nl) vmat_t(ns+1:ns+nl,lc) = - aux(k+1:k+nl)
#else #else
vmat_t(ns+1:ns+nl,lc) = aux(k+1:k+nl) vmat_t(ns+1:ns+nl,lc) = aux(k+1:k+nl)
......
...@@ -59,12 +59,12 @@ ...@@ -59,12 +59,12 @@
#undef COMPLEXCASE #undef COMPLEXCASE
#include "elpa2_bandred_template.F90" #include "elpa2_bandred_template.F90"
#define REALCASE 1 #define REALCASE 1
#undef SKEW_SYMMETRIC #undef SKEW_SYMMETRIC_BUILD
#include "elpa2_symm_matrix_allreduce_real_template.F90" #include "elpa2_symm_matrix_allreduce_real_template.F90"
#if SKEWSYMMETRIC == 1 #ifdef HAVE_SKEWSYMMETRIC
#define SKEW_SYMMETRIC #define SKEW_SYMMETRIC_BUILD
#include "elpa2_symm_matrix_allreduce_real_template.F90" #include "elpa2_symm_matrix_allreduce_real_template.F90"
#undef SKEW_SYMMETRIC #undef SKEW_SYMMETRIC_BUILD
#endif #endif
#undef REALCASE #undef REALCASE
#define REALCASE 1 #define REALCASE 1
......
...@@ -53,14 +53,14 @@ ...@@ -53,14 +53,14 @@
#include "../general/sanity.F90" #include "../general/sanity.F90"
#undef ROUTINE_NAME #undef ROUTINE_NAME
#ifdef SKEW_SYMMETRIC #ifdef SKEW_SYMMETRIC_BUILD
#define ROUTINE_NAME ssymm_matrix_allreduce #define ROUTINE_NAME ssymm_matrix_allreduce
#else #else
#define ROUTINE_NAME symm_matrix_allreduce #define ROUTINE_NAME symm_matrix_allreduce
#endif #endif
#ifdef SKEW_SYMMETRIC #ifdef SKEW_SYMMETRIC_BUILD
subroutine ssymm_matrix_allreduce_& subroutine ssymm_matrix_allreduce_&
#else #else
subroutine symm_matrix_allreduce_& subroutine symm_matrix_allreduce_&
...@@ -100,7 +100,7 @@ ...@@ -100,7 +100,7 @@
nc = 0 nc = 0
do i=1,n do i=1,n
a(1:i,i) = h2(nc+1:nc+i) a(1:i,i) = h2(nc+1:nc+i)
#ifdef SKEW_SYMMETRIC #ifdef SKEW_SYMMETRIC_BUILD
a(i,1:i-1) = - a(1:i-1,i) a(i,1:i-1) = - a(1:i-1,i)
#else #else
a(i,1:i-1) = a(1:i-1,i) a(i,1:i-1) = a(1:i-1,i)
...@@ -114,7 +114,7 @@ ...@@ -114,7 +114,7 @@
nc = 0 nc = 0
do i=1,n do i=1,n
a(1:i,i) = h1(nc+1:nc+i) a(1:i,i) = h1(nc+1:nc+i)
#ifdef SKEW_SYMMETRIC #ifdef SKEW_SYMMETRIC_BUILD
a(i,1:i-1) = - a(1:i-1,i) a(i,1:i-1) = - a(1:i-1,i)
#else #else
a(i,1:i-1) = a(1:i-1,i) a(i,1:i-1) = a(1:i-1,i)
...@@ -132,7 +132,7 @@ ...@@ -132,7 +132,7 @@
call obj%timer%stop("ROUTINE_NAME" // PRECISION_SUFFIX) call obj%timer%stop("ROUTINE_NAME" // PRECISION_SUFFIX)
#ifdef SKEW_SYMMETRIC #ifdef SKEW_SYMMETRIC_BUILD
end subroutine ssymm_matrix_allreduce_& end subroutine ssymm_matrix_allreduce_&
#else #else
end subroutine symm_matrix_allreduce_& end subroutine symm_matrix_allreduce_&
......
...@@ -83,7 +83,7 @@ ...@@ -83,7 +83,7 @@
MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, intent(out), target :: q(obj%local_nrows,*) MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, intent(out), target :: q(obj%local_nrows,*)
#else #else
MATH_DATATYPE(kind=C_DATATYPE_KIND), intent(inout) :: a(obj%local_nrows,obj%local_ncols) MATH_DATATYPE(kind=C_DATATYPE_KIND), intent(inout) :: a(obj%local_nrows,obj%local_ncols)
#if SKEWSYMMETRIC == 1 #ifdef HAVE_SKEWSYMMETRIC
MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, target, intent(out) :: q(obj%local_nrows,2*obj%local_ncols) MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, target, intent(out) :: q(obj%local_nrows,2*obj%local_ncols)
#else #else
MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, target, intent(out) :: q(obj%local_nrows,obj%local_ncols) MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, target, intent(out) :: q(obj%local_nrows,obj%local_ncols)
...@@ -130,9 +130,8 @@ ...@@ -130,9 +130,8 @@
do_trans_to_band, do_trans_to_full do_trans_to_band, do_trans_to_full
integer(kind=ik) :: nrThreads integer(kind=ik) :: nrThreads
! #if SKEWSYMMETRIC ==1
integer(kind=ik) :: global_index integer(kind=ik) :: global_index
! #endif
#if REALCASE == 1 #if REALCASE == 1
#undef GPU_KERNEL #undef GPU_KERNEL
#undef GENERIC_KERNEL #undef GENERIC_KERNEL
......
...@@ -105,32 +105,32 @@ program test ...@@ -105,32 +105,32 @@ program test
implicit none implicit none
! matrix dimensions ! matrix dimensions
integer :: na, nev, nblk integer :: na, nev, nblk
! mpi ! mpi
integer :: myid, nprocs integer :: myid, nprocs
integer :: na_cols, na_rows ! local matrix size integer :: na_cols, na_rows ! local matrix size
integer :: np_cols, np_rows ! number of MPI processes per column/row integer :: np_cols, np_rows ! number of MPI processes per column/row
integer :: my_prow, my_pcol ! local MPI task position (my_prow, my_pcol) in the grid (0..np_cols -1, 0..np_rows -1) integer :: my_prow, my_pcol ! local MPI task position (my_prow, my_pcol) in the grid (0..np_cols -1, 0..np_rows -1)
integer :: mpierr, ierr integer :: mpierr, ierr
! blacs ! blacs
character(len=1) :: layout character(len=1) :: layout
integer :: my_blacs_ctxt, sc_desc(9), info, nprow, npcol integer :: my_blacs_ctxt, sc_desc(9), info, nprow, npcol
! The Matrix ! The Matrix
MATRIX_TYPE, allocatable :: a_skewsymmetric(:,:), as_skewsymmetric(:,:) MATRIX_TYPE, allocatable :: a_skewsymmetric(:,:), as_skewsymmetric(:,:)
MATRIX_TYPE_COMPLEX, allocatable :: a_complex(:,:), as_complex(:,:) MATRIX_TYPE_COMPLEX, allocatable :: a_complex(:,:), as_complex(:,:)
! eigenvectors ! eigenvectors
MATRIX_TYPE, allocatable :: z_skewsymmetric(:,:) MATRIX_TYPE, allocatable :: z_skewsymmetric(:,:)
MATRIX_TYPE_COMPLEX, allocatable :: z_complex(:,:) MATRIX_TYPE_COMPLEX, allocatable :: z_complex(:,:)
! eigenvalues ! eigenvalues
EV_TYPE, allocatable:: ev_skewsymmetric(:), ev_complex(:) EV_TYPE, allocatable :: ev_skewsymmetric(:), ev_complex(:)
integer :: error, status, i, j integer :: error, status, i, j
type(output_t) :: write_to_file type(output_t) :: write_to_file
class(elpa_t), pointer :: e_complex, e_skewsymmetric class(elpa_t), pointer :: e_complex, e_skewsymmetric
call read_input_parameters(na, nev, nblk, write_to_file) call read_input_parameters(na, nev, nblk, write_to_file)
call setup_mpi(myid, nprocs) call setup_mpi(myid, nprocs)
...@@ -220,13 +220,13 @@ program test ...@@ -220,13 +220,13 @@ program test
assert_elpa_ok(e_complex%setup()) assert_elpa_ok(e_complex%setup())
call e_complex%set("solver", elpa_solver_2stage, error) call e_complex%set("solver", elpa_solver_2stage, error)
call e_complex%timer_start("eigenvectors: brute force ") call e_complex%timer_start("eigenvectors: brute force as complex matrix")
call e_complex%eigenvectors(a_complex, ev_complex, z_complex, error) call e_complex%eigenvectors(a_complex, ev_complex, z_complex, error)
call e_complex%timer_stop("eigenvectors: brute force ") call e_complex%timer_stop("eigenvectors: brute force as complex matrix")
if (myid .eq. 0) then if (myid .eq. 0) then
print *, "" print *, ""
call e_complex%print_times("eigenvectors: brute force") call e_complex%print_times("eigenvectors: brute force as complex matrix")
endif endif
#ifdef WITH_MPI #ifdef WITH_MPI
call MPI_BARRIER(MPI_COMM_WORLD, ierr) call MPI_BARRIER(MPI_COMM_WORLD, ierr)
......
Supports Markdown
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