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
- not yet decided
- support of ELPA for real valued skew-symmetric matrices, please see:
CITATION
Changelog for ELPA 2019.05.001
......
......@@ -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 |
| --enable-pyhton | build and install python wrapper, 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
in a sub-directory:
......
......@@ -514,6 +514,10 @@ dist_man_MANS = \
man/elpa_autotune_save_state.3 \
man/elpa_autotune_load_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
if ENABLE_LEGACY
......@@ -539,10 +543,6 @@ dist_man_MANS += \
man/elpa_solve_evp_real_single.3 \
man/elpa_solve_evp_complex_double.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
......
......@@ -39,7 +39,7 @@ AC_SUBST([$1], ['$2'])
# 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
AC_DEFINE([EARLIEST_AUTOTUNE_VERSION], [20171201], [Earliest ELPA API version, which supports autotuning])
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"
AM_CONDITIONAL([WANT_SINGLE_PRECISION_COMPLEX],[test x"$want_single_precision" = x"yes"])
#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([WITH_MKL])
......
......@@ -111,7 +111,7 @@
!>
!> ! 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"
!> stop
!> endif
......@@ -178,7 +178,7 @@
!>
!> /* 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");
!> exit(1);
!> }
......@@ -233,7 +233,7 @@
!> class(elpa_autotune_t), pointer :: tune_state
!> integer :: success
!>
!> if (elpa_init(20181112) /= ELPA_OK) then
!> if (elpa_init(20191110) /= ELPA_OK) then
!> print *, "ELPA API version not supported"
!> stop
!> endif
......
......@@ -174,9 +174,9 @@ module elpa1_compute
#include "elpa_transpose_vectors.F90"
#define SKEW_SYMMETRIC
#define SKEW_SYMMETRIC_BUILD
#include "elpa_transpose_vectors.F90"
#undef SKEW_SYMMETRIC
#undef SKEW_SYMMETRIC_BUILD
#include "elpa_reduce_add_vectors.F90"
#undef DOUBLE_PRECISION
#undef REALCASE
......@@ -188,9 +188,9 @@ module elpa1_compute
#include "../general/precision_macros.h"
#include "elpa_transpose_vectors.F90"
#define SKEW_SYMMETRIC
#define SKEW_SYMMETRIC_BUILD
#include "elpa_transpose_vectors.F90"
#undef SKEW_SYMMETRIC
#undef SKEW_SYMMETRIC_BUILD
#include "elpa_reduce_add_vectors.F90"
#undef SINGLE_PRECISION
#undef REALCASE
......@@ -202,9 +202,9 @@ module elpa1_compute
#define DOUBLE_PRECISION 1
#include "../general/precision_macros.h"
#include "elpa_transpose_vectors.F90"
#define SKEW_SYMMETRIC
#define SKEW_SYMMETRIC_BUILD
#include "elpa_transpose_vectors.F90"
#undef SKEW_SYMMETRIC
#undef SKEW_SYMMETRIC_BUILD
#include "elpa_reduce_add_vectors.F90"
#undef COMPLEXCASE
#undef DOUBLE_PRECISION
......@@ -215,9 +215,9 @@ module elpa1_compute
#define SINGLE_PRECISION 1
#include "../general/precision_macros.h"
#include "elpa_transpose_vectors.F90"
#define SKEW_SYMMETRIC
#define SKEW_SYMMETRIC_BUILD
#include "elpa_transpose_vectors.F90"
#undef SKEW_SYMMETRIC
#undef SKEW_SYMMETRIC_BUILD
#include "elpa_reduce_add_vectors.F90"
#undef COMPLEXCASE
#undef SINGLE_PRECISION
......
......@@ -78,7 +78,7 @@ function elpa_solve_evp_&
MATH_DATATYPE(kind=rck), optional,target,intent(out) :: q(obj%local_nrows,*)
#else
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)
#else
MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, target, intent(out) :: q(obj%local_nrows,obj%local_ncols)
......
......@@ -51,7 +51,7 @@
#include "../general/sanity.F90"
#undef ROUTINE_NAME
#ifdef SKEW_SYMMETRIC
#ifdef SKEW_SYMMETRIC_BUILD
#define ROUTINE_NAME elpa_transpose_vectors_ss_
#else
#define ROUTINE_NAME elpa_transpose_vectors_
......@@ -198,7 +198,7 @@ subroutine ROUTINE_NAME&
k = (i - nblks_skip - n)/lcm_s_t * nblk + (lc - 1) * auxstride
ns = (i/npt)*nblk ! local start of block i
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)
#else
vmat_t(ns+1:ns+nl,lc) = aux(k+1:k+nl)
......
......@@ -59,12 +59,12 @@
#undef COMPLEXCASE
#include "elpa2_bandred_template.F90"
#define REALCASE 1
#undef SKEW_SYMMETRIC
#undef SKEW_SYMMETRIC_BUILD
#include "elpa2_symm_matrix_allreduce_real_template.F90"
#if SKEWSYMMETRIC == 1
#define SKEW_SYMMETRIC
#ifdef HAVE_SKEWSYMMETRIC
#define SKEW_SYMMETRIC_BUILD
#include "elpa2_symm_matrix_allreduce_real_template.F90"
#undef SKEW_SYMMETRIC
#undef SKEW_SYMMETRIC_BUILD
#endif
#undef REALCASE
#define REALCASE 1
......
......@@ -53,14 +53,14 @@
#include "../general/sanity.F90"
#undef ROUTINE_NAME
#ifdef SKEW_SYMMETRIC
#ifdef SKEW_SYMMETRIC_BUILD
#define ROUTINE_NAME ssymm_matrix_allreduce
#else
#define ROUTINE_NAME symm_matrix_allreduce
#endif
#ifdef SKEW_SYMMETRIC
#ifdef SKEW_SYMMETRIC_BUILD
subroutine ssymm_matrix_allreduce_&
#else
subroutine symm_matrix_allreduce_&
......@@ -100,7 +100,7 @@
nc = 0
do i=1,n
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)
#else
a(i,1:i-1) = a(1:i-1,i)
......@@ -114,7 +114,7 @@
nc = 0
do i=1,n
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)
#else
a(i,1:i-1) = a(1:i-1,i)
......@@ -132,7 +132,7 @@
call obj%timer%stop("ROUTINE_NAME" // PRECISION_SUFFIX)
#ifdef SKEW_SYMMETRIC
#ifdef SKEW_SYMMETRIC_BUILD
end subroutine ssymm_matrix_allreduce_&
#else
end subroutine symm_matrix_allreduce_&
......
......@@ -83,7 +83,7 @@
MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, intent(out), target :: q(obj%local_nrows,*)
#else
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)
#else
MATH_DATATYPE(kind=C_DATATYPE_KIND), optional, target, intent(out) :: q(obj%local_nrows,obj%local_ncols)
......@@ -130,9 +130,8 @@
do_trans_to_band, do_trans_to_full
integer(kind=ik) :: nrThreads
! #if SKEWSYMMETRIC ==1
integer(kind=ik) :: global_index
! #endif
#if REALCASE == 1
#undef GPU_KERNEL
#undef GENERIC_KERNEL
......
......@@ -105,32 +105,32 @@ program test
implicit none
! matrix dimensions
integer :: na, nev, nblk
integer :: na, nev, nblk
! mpi
integer :: myid, nprocs
integer :: na_cols, na_rows ! local matrix size
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 :: mpierr, ierr
integer :: myid, nprocs
integer :: na_cols, na_rows ! local matrix size
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 :: mpierr, ierr
! blacs
character(len=1) :: layout
integer :: my_blacs_ctxt, sc_desc(9), info, nprow, npcol
character(len=1) :: layout
integer :: my_blacs_ctxt, sc_desc(9), info, nprow, npcol
! The Matrix
MATRIX_TYPE, allocatable :: a_skewsymmetric(:,:), as_skewsymmetric(:,:)
MATRIX_TYPE_COMPLEX, allocatable :: a_complex(:,:), as_complex(:,:)
MATRIX_TYPE, allocatable :: a_skewsymmetric(:,:), as_skewsymmetric(:,:)
MATRIX_TYPE_COMPLEX, allocatable :: a_complex(:,:), as_complex(:,:)
! eigenvectors
MATRIX_TYPE, allocatable :: z_skewsymmetric(:,:)
MATRIX_TYPE_COMPLEX, allocatable :: z_complex(:,:)
MATRIX_TYPE, allocatable :: z_skewsymmetric(:,:)
MATRIX_TYPE_COMPLEX, allocatable :: z_complex(:,:)
! 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
class(elpa_t), pointer :: e_complex, e_skewsymmetric
type(output_t) :: write_to_file
class(elpa_t), pointer :: e_complex, e_skewsymmetric
call read_input_parameters(na, nev, nblk, write_to_file)
call setup_mpi(myid, nprocs)
......@@ -220,13 +220,13 @@ program test
assert_elpa_ok(e_complex%setup())
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%timer_stop("eigenvectors: brute force ")
call e_complex%timer_stop("eigenvectors: brute force as complex matrix")
if (myid .eq. 0) then
print *, ""
call e_complex%print_times("eigenvectors: brute force")
call e_complex%print_times("eigenvectors: brute force as complex matrix")
endif
#ifdef WITH_MPI
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