Planned maintenance on Wednesday, 2021-01-20, 17:00-18:00. Expect some interruptions during that time

Commit aebf900d authored by Andreas Marek's avatar Andreas Marek

Merge branch 'master' into ELPA_KNL

parents 005b7687 48760118
This diff is collapsed.
......@@ -32,6 +32,7 @@ libelpa@SUFFIX@_private_la_SOURCES = \
src/mod_pack_unpack_complex.F90 \
src/aligned_mem.F90 \
src/elpa1_compute_private.F90 \
src/elpa2_determine_workload.F90 \
src/elpa2_compute.F90 \
src/elpa2_kernels/mod_fortran_interfaces.F90 \
src/elpa2_kernels/mod_single_hh_trafo_real.F90 \
......@@ -48,10 +49,19 @@ libelpa@SUFFIX@_private_la_SOURCES = \
EXTRA_libelpa@SUFFIX@_private_la_DEPENDENCIES = \
src/elpa_reduce_add_vectors.X90 \
src/elpa_transpose_vectors.X90 \
src/elpa1_compute_complex_template.X90 \
src/elpa1_compute_real_template.X90 \
src/elpa1_compute_template.X90 \
src/elpa2_compute_real_template.X90 \
src/elpa2_compute_complex_template.X90 \
src/elpa2_bandred_real_template.X90 \
src/elpa2_symm_matrix_allreduce_real_template.X90 \
src/elpa2_trans_ev_band_to_full_real_template.X90 \
src/elpa2_tridiag_band_real_template.X90 \
src/elpa2_trans_ev_tridi_to_band_real_template.X90 \
src/elpa2_bandred_complex_template.X90 \
src/elpa2_herm_matrix_allreduce_complex_template.X90 \
src/elpa2_trans_ev_band_to_full_complex_template.X90 \
src/elpa2_tridiag_band_complex_template.X90 \
src/elpa2_trans_ev_tridi_to_band_complex_template.X90 \
src/elpa2_kernels/elpa2_kernels_real_template.X90 \
src/elpa2_kernels/elpa2_kernels_complex_template.X90 \
src/elpa2_kernels/elpa2_kernels_simple_template.X90 \
......@@ -78,7 +88,7 @@ if HAVE_DETAILED_TIMINGS
src/ftimings/papi.c
else
libelpa@SUFFIX@_private_la_SOURCES += \
src/timer_dummy.F90
src/timer_dummy.F90
endif
if WITH_GPU_VERSION
......@@ -924,18 +934,24 @@ EXTRA_DIST = \
test/Fortran/elpa_print_headers.X90 \
src/elpa_reduce_add_vectors.X90 \
src/elpa_transpose_vectors.X90 \
src/elpa1_compute_real_template.X90 \
src/elpa1_compute_template.X90 \
src/elpa1_merge_systems_real_template.X90 \
src/elpa1_solve_tridi_real_template.X90 \
src/elpa1_tools_real_template.X90 \
src/elpa1_trans_ev_real_template.X90 \
src/elpa1_tridiag_real_template.X90 \
src/elpa1_compute_complex_template.X90 \
src/elpa1_tools_complex_template.X90 \
src/elpa1_trans_ev_complex_template.X90 \
src/elpa1_tridiag_complex_template.X90 \
src/elpa1_tools_template.X90 \
src/elpa1_trans_ev_template.X90 \
src/elpa1_tridiag_template.X90 \
src/elpa2_compute_real_template.X90 \
src/elpa2_compute_complex_template.X90 \
src/elpa2_bandred_complex_template.X90 \
src/elpa2_bandred_real_template.X90 \
src/elpa2_herm_matrix_allreduce_complex_template.X90 \
src/elpa2_symm_matrix_allreduce_real_template.X90 \
src/elpa2_trans_ev_band_to_full_complex_template.X90 \
src/elpa2_trans_ev_band_to_full_real_template.X90 \
src/elpa2_trans_ev_tridi_to_band_complex_template.X90 \
src/elpa2_trans_ev_tridi_to_band_real_template.X90 \
src/elpa2_tridiag_band_complex_template.X90 \
src/elpa2_tridiag_band_real_template.X90 \
src/precision_macros.h \
src/precision_macros_complex.h \
src/elpa2_kernels/elpa2_kernels_real_template.X90 \
......
......@@ -12,7 +12,7 @@
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
%define so_version 4
%define so_version 8
# OpenMP support requires an MPI implementation with MPI_THREAD_MULTIPLE support,
# which is only available for a sufficiently configured openmpi >= 1.8
......
#!/usr/bin/python
import sys
simple_tokens = [
"elpa_transpose_vectors_NUMBER_PRECISION",
"elpa_reduce_add_vectors_NUMBER_PRECISION",
"bandred_NUMBER_PRECISION",
"trans_ev_band_to_full_NUMBER_PRECISION",
"tridiag_band_NUMBER_PRECISION",
"trans_ev_tridi_to_band_NUMBER_PRECISION",
"band_band_NUMBER_PRECISION",
"tridiag_NUMBER_PRECISION",
"trans_ev_NUMBER_PRECISION",
"solve_tridi_PRECISION",
"solve_tridi_col_PRECISION",
"solve_tridi_single_problem_PRECISION",
"qr_pdgeqrf_2dcomm_PRECISION",
"hh_transform_NUMBER_PRECISION",
"symm_matrix_allreduce_PRECISION",
"redist_band_NUMBER_PRECISION",
"unpack_row_NUMBER_cpu_PRECISION",
"unpack_row_NUMBER_cpu_openmp_PRECISION",
"unpack_and_prepare_row_group_NUMBER_gpu_PRECISION",
"extract_hh_tau_NUMBER_gpu_PRECISION",
"compute_hh_dot_products_NUMBER_gpu_PRECISION",
"compute_hh_trafo_NUMBER_cpu_openmp_PRECISION",
"compute_hh_trafo_NUMBER_cpu_PRECISION",
"pack_row_group_NUMBER_gpu_PRECISION",
"pack_row_NUMBER_cpu_openmp_PRECISION",
"pack_row_NUMBER_cpu_PRECISION",
"wy_gen_PRECISION",
"wy_right_PRECISION",
"wy_left_PRECISION",
"wy_symm_PRECISION",
"merge_recursive_PRECISION",
"merge_systems_PRECISION",
"distribute_global_column_PRECISION",
"check_monotony_PRECISION",
"global_gather_PRECISION",
"resort_ev_PRECISION",
"transform_columns_PRECISION",
"solve_secular_equation_PRECISION",
"global_product_PRECISION",
"add_tmp_PRECISION",
"v_add_s_PRECISION",
]
blas_tokens = [
"PRECISION_GEMV",
"PRECISION_TRMV",
"PRECISION_GEMM",
"PRECISION_TRMM",
"PRECISION_HERK",
"PRECISION_SYRK",
"PRECISION_SYMV",
"PRECISION_SYMM",
"PRECISION_SYR2",
"PRECISION_SYR2K",
"PRECISION_GEQRF",
"PRECISION_STEDC",
"PRECISION_STEQR",
"PRECISION_LAMRG",
"PRECISION_LAMCH",
"PRECISION_LAPY2",
"PRECISION_LAED4",
"PRECISION_LAED5",
"cublas_PRECISION_GEMM",
"cublas_PRECISION_TRMM",
"cublas_PRECISION_GEMV",
]
explicit_tokens_complex = [
("PRECISION_SUFFIX", "\"_double\"", "\"_single\""),
("MPI_COMPLEX_PRECISION", "MPI_DOUBLE_COMPLEX", "MPI_COMPLEX"),
("MPI_REAL_PRECISION", "MPI_REAL8", "MPI_REAL4"),
("KIND_PRECISION", "rk8", "rk4"),
("PRECISION_CMPLX", "DCMPLX", "CMPLX"),
("PRECISION_IMAG", "DIMAG", "AIMAG"),
("PRECISION_REAL", "DREAL", "REAL"),
("CONST_REAL_0_0", "0.0_rk8", "0.0_rk4"),
("CONST_REAL_1_0", "1.0_rk8", "1.0_rk4"),
("CONST_COMPLEX_0_0", "0.0_ck8", "0.0_ck4"),
("size_of_PRECISION_complex", "size_of_double_complex_datatype", "size_of_single_complex_datatype"),
]
explicit_tokens_real = [
("PRECISION_SUFFIX", "\"_double\"", "\"_single\""),
("CONST_0_0", "0.0_rk8", "0.0_rk4"),
("CONST_0_5", "0.5_rk8", "0.5_rk4"),
("CONST_1_0", "1.0_rk8", "1.0_rk4"),
("CONST_2_0", "2.0_rk8", "2.0_rk4"),
("CONST_8_0", "8.0_rk8", "8.0_rk4"),
("size_of_PRECISION_real", "size_of_double_real_datatype", "size_of_single_real_datatype"),
("MPI_REAL_PRECISION", "MPI_REAL8", "MPI_REAL4"),
]
explicit_order = {"single":2, "double":1}
blas_prefixes = {("real","single") : "S", ("real","double") : "D", ("complex","single") : "C", ("complex","double") : "Z"}
def print_variant(number, precision, explicit):
for token in simple_tokens:
print "#define ", token.replace("NUMBER", number), token.replace("PRECISION", precision).replace("NUMBER", number)
for token in blas_tokens:
print "#define ", token, token.replace("PRECISION_", blas_prefixes[(number, precision)])
for token in explicit:
print "#define ", token[0], token[explicit_order[precision]]
def print_undefs(number, explicit):
for token in simple_tokens:
print "#undef ", token.replace("NUMBER", number)
for token in blas_tokens:
print "#undef ", token
for token in explicit:
print "#undef ", token[0]
if(sys.argv[1] == "complex"):
print "#ifdef DOUBLE_PRECISION_COMPLEX"
print_undefs("complex", explicit_tokens_complex)
print_variant("complex", "double", explicit_tokens_complex)
print "#else"
print_undefs("complex", explicit_tokens_complex)
print_variant("complex", "single", explicit_tokens_complex)
print "#endif"
elif(sys.argv[1] == "real"):
print "#ifdef DOUBLE_PRECISION_REAL"
print_undefs("real", explicit_tokens_real)
print_variant("real", "double", explicit_tokens_real)
print "#else"
print_undefs("real", explicit_tokens_real)
print_variant("real", "single", explicit_tokens_real)
print "#endif"
else:
assert(False)
\ No newline at end of file
#!/usr/bin/python
simple_tokens = ["tridiag_complex_PRECISION",
"trans_ev_complex_PRECISION",
"solve_complex_PRECISION",
"hh_transform_complex_PRECISION",
"elpa_transpose_vectors_complex_PRECISION",
"elpa_reduce_add_vectors_complex_PRECISION",
]
blas_tokens = ["PRECISION_GEMV",
"PRECISION_TRMV",
"PRECISION_GEMM",
"PRECISION_TRMM",
"PRECISION_HERK",
"cublas_PRECISION_gemm",
"cublas_PRECISION_trmm",
"cublas_PRECISION_gemv",
]
explicit_tokens = [("PRECISION_SUFFIX", "\"_double\"", "\"_single\""),
("MPI_COMPLEX_PRECISION", "MPI_DOUBLE_COMPLEX", "MPI_COMPLEX"),
("MPI_REAL_PRECISION", "MPI_REAL8", "MPI_REAL4"),
("KIND_PRECISION", "rk8", "rk4"),
("PRECISION_CMPLX", "DCMPLX", "CMPLX"),
("PRECISION_IMAG", "DIMAG", "AIMAG"),
("PRECISION_REAL", "DREAL", "REAL"),
("CONST_REAL_0_0", "0.0_rk8", "0.0_rk4"),
("CONST_REAL_1_0", "1.0_rk8", "1.0_rk4"),
("size_of_PRECISION_complex", "size_of_double_complex_datatype", "size_of_single_complex_datatype"),
]
print "#ifdef DOUBLE_PRECISION_COMPLEX"
for token in simple_tokens:
print "#define ", token, token.replace("PRECISION", "double")
for token in blas_tokens:
print "#define ", token, token.replace("PRECISION_", "Z")
for token in explicit_tokens:
print "#define ", token[0], token[1]
print "#else"
for token in simple_tokens:
print "#undef ", token
for token in blas_tokens:
print "#undef ", token
for token in explicit_tokens:
print "#undef ", token[0]
for token in simple_tokens:
print "#define ", token, token.replace("PRECISION", "single")
for token in blas_tokens:
print "#define ", token, token.replace("PRECISION_", "C")
for token in explicit_tokens:
print "#define ", token[0], token[2]
print "#endif"
This diff is collapsed.
......@@ -212,10 +212,14 @@ module ELPA1_COMPUTE
#define DOUBLE_PRECISION_REAL 1
#define REAL_DATATYPE rk8
#include "elpa1_compute_real_template.X90"
#define REALCASE 1
#undef COMPLEXCASE
#include "elpa1_compute_template.X90"
#undef DOUBLE_PRECISION_REAL
#undef REAL_DATATYPE
#undef REALCASE
! real single precision
#if defined(WANT_SINGLE_PRECISION_REAL)
......@@ -223,7 +227,12 @@ module ELPA1_COMPUTE
#undef DOUBLE_PRECISION_REAL
#define REAL_DATATYPE rk4
#include "elpa1_compute_real_template.X90"
#define REALCASE 1
#undef COMPLEXCASE
#include "elpa1_compute_template.X90"
#undef REALCASE
#undef DOUBLE_PRECISION_REAL
#undef REAL_DATATYPE
......@@ -234,7 +243,12 @@ module ELPA1_COMPUTE
#define DOUBLE_PRECISION_COMPLEX 1
#define REAL_DATATYPE rk8
#define COMPLEX_DATATYPE ck8
#include "elpa1_compute_complex_template.X90"
#define COMPLEXCASE 1
#undef REALCASE
#include "elpa1_compute_template.X90"
#undef COMPLEXCASE
#undef DOUBLE_PRECISION_COMPLEX
#undef REAL_DATATYPE
......@@ -248,7 +262,12 @@ module ELPA1_COMPUTE
#define REAL_DATATYPE rk4
#define COMPLEX_DATATYPE ck4
#include "elpa1_compute_complex_template.X90"
#define COMPLEXCASE 1
#undef REALCASE
#include "elpa1_compute_template.X90"
#undef COMPLEXCASE
#undef DOUBLE_PRECISION_COMPLEX
#undef COMPLEX_DATATYPE
......
......@@ -52,16 +52,39 @@
! distributed along with the original code in the file "COPYING".
#endif
#if REALCASE == 1
#include "precision_macros.h"
#endif
#if COMPLEXCASE == 1
#include "precision_macros_complex.h"
#endif
#if REALCASE == 1
!cannot use __FILE__ because filename with path can be too long for gfortran (max line length)
#define check_memcpy_cuda(file, success) call check_memcpy_CUDA_f(file, __LINE__, success)
#define check_alloc_cuda(file, success) call check_alloc_CUDA_f(file, __LINE__, success)
#define check_dealloc_cuda(file, success) call check_dealloc_CUDA_f(file, __LINE__, success)
#include "elpa1_tridiag_real_template.X90"
#include "elpa1_trans_ev_real_template.X90"
#endif
#if REALCASE == 1
#include "elpa1_tridiag_template.X90"
#include "elpa1_trans_ev_template.X90"
#include "elpa1_solve_tridi_real_template.X90"
#include "elpa1_merge_systems_real_template.X90"
#include "elpa1_tools_real_template.X90"
#include "elpa1_tools_template.X90"
#endif
#if COMPLEXCASE == 1
#include "elpa1_tridiag_template.X90"
#include "elpa1_trans_ev_template.X90"
#include "elpa1_tools_template.X90"
#define ALREADY_DEFINED 1
#endif
This diff is collapsed.
This diff is collapsed.
subroutine hh_transform_complex_PRECISION(alpha, xnorm_sq, xf, tau)
! Similar to LAPACK routine ZLARFP, but uses ||x||**2 instead of x(:)
! and returns the factor xf by which x has to be scaled.
! It also hasn't the special handling for numbers < 1.d-300 or > 1.d150
! since this would be expensive for the parallel implementation.
use precision
#ifdef HAVE_DETAILED_TIMINGS
use timings
#else
use timings_dummy
#endif
implicit none
complex(kind=COMPLEX_DATATYPE), intent(inout) :: alpha
real(kind=REAL_DATATYPE), intent(in) :: xnorm_sq
complex(kind=COMPLEX_DATATYPE), intent(out) :: xf, tau
real(kind=REAL_DATATYPE) :: ALPHR, ALPHI, BETA
call timer%start("hh_transform_complex" // PRECISION_SUFFIX)
ALPHR = real( ALPHA, kind=REAL_DATATYPE )
ALPHI = PRECISION_IMAG( ALPHA )
if ( XNORM_SQ==0. .AND. ALPHI==0. ) then
if ( ALPHR>=0. ) then
TAU = 0.
else
TAU = 2.
ALPHA = -ALPHA
endif
XF = 0.
else
BETA = SIGN( SQRT( ALPHR**2 + ALPHI**2 + XNORM_SQ ), ALPHR )
ALPHA = ALPHA + BETA
IF ( BETA<0 ) THEN
BETA = -BETA
TAU = -ALPHA / BETA
ELSE
ALPHR = ALPHI * (ALPHI/real( ALPHA , kind=KIND_PRECISION))
ALPHR = ALPHR + XNORM_SQ/real( ALPHA, kind=KIND_PRECISION )
TAU = PRECISION_CMPLX( ALPHR/BETA, -ALPHI/BETA )
ALPHA = PRECISION_CMPLX( -ALPHR, ALPHI )
END IF
XF = CONST_REAL_1_0/ALPHA
ALPHA = BETA
endif
call timer%stop("hh_transform_complex" // PRECISION_SUFFIX)
end subroutine hh_transform_complex_PRECISION
......@@ -51,17 +51,19 @@
! with their original authors, but shall adhere to the licensing terms
! distributed along with the original code in the file "COPYING".
#endif
subroutine M_v_add_s_PRECISION(v,n,s)
#if REALCASE == 1
subroutine v_add_s_PRECISION(v,n,s)
use precision
implicit none
integer(kind=ik) :: n
real(kind=REAL_DATATYPE) :: v(n),s
v(:) = v(:) + s
end subroutine M_v_add_s_PRECISION
end subroutine v_add_s_PRECISION
subroutine M_distribute_global_column_PRECISION(g_col, l_col, noff, nlen, my_prow, np_rows, nblk)
subroutine distribute_global_column_PRECISION(g_col, l_col, noff, nlen, my_prow, np_rows, nblk)
use precision
implicit none
......@@ -86,9 +88,9 @@
l_col(l_off+js:l_off+je) = g_col(g_off+js-noff:g_off+je-noff)
enddo
end subroutine M_distribute_global_column_PRECISION
end subroutine distribute_global_column_PRECISION
subroutine M_solve_secular_equation_PRECISION(n, i, d, z, delta, rho, dlam)
subroutine solve_secular_equation_PRECISION(n, i, d, z, delta, rho, dlam)
!-------------------------------------------------------------------------------
! This routine solves the secular equation of a symmetric rank 1 modified
! diagonal matrix:
......@@ -157,7 +159,7 @@
! Upper and lower bound of the shifted solution interval are a and b
call timer%start("solve_secular_equation" // M_PRECISION_SUFFIX)
call timer%start("solve_secular_equation" // PRECISION_SUFFIX)
if (i==n) then
! Special case: Last eigenvalue
......@@ -167,15 +169,15 @@
dshift = d(n)
delta(:) = d(:) - dshift
a = M_CONST_0_0 ! delta(n)
b = rho*SUM(z(:)**2) + M_CONST_1_0 ! rho*SUM(z(:)**2) is the lower bound for the guess
a = CONST_0_0 ! delta(n)
b = rho*SUM(z(:)**2) + CONST_1_0 ! rho*SUM(z(:)**2) is the lower bound for the guess
else
! Other eigenvalues: lower bound is d(i), upper bound is d(i+1)
! We check the sign of the function in the midpoint of the interval
! in order to determine if eigenvalue is more close to d(i) or d(i+1)
x = M_CONST_0_5*(d(i)+d(i+1))
y = M_CONST_1_0 + rho*SUM(z(:)**2/(d(:)-x))
x = CONST_0_5*(d(i)+d(i+1))
y = CONST_1_0 + rho*SUM(z(:)**2/(d(:)-x))
if (y>0) then
! solution is next to d(i)
dshift = d(i)
......@@ -195,7 +197,7 @@
do iter=1,200
! Interval subdivision
x = M_CONST_0_5*(a+b)
x = CONST_0_5*(a+b)
if (x==a .or. x==b) exit ! No further interval subdivisions possible
#ifdef DOUBLE_PRECISION_REAL
if (abs(x) < 1.e-200_rk8) exit ! x next to pole
......@@ -221,27 +223,73 @@
dlam = x + dshift
delta(:) = delta(:) - x
call timer%stop("solve_secular_equation" // M_PRECISION_SUFFIX)
call timer%stop("solve_secular_equation" // PRECISION_SUFFIX)
end subroutine M_solve_secular_equation_PRECISION
end subroutine solve_secular_equation_PRECISION
!-------------------------------------------------------------------------------
#endif
subroutine M_hh_transform_real_PRECISION(alpha, xnorm_sq, xf, tau)
#if REALCASE == 1
subroutine hh_transform_real_PRECISION(alpha, xnorm_sq, xf, tau)
! Similar to LAPACK routine DLARFP, but uses ||x||**2 instead of x(:)
#endif
#if COMPLEXCASE == 1
subroutine hh_transform_complex_PRECISION(alpha, xnorm_sq, xf, tau)
! Similar to LAPACK routine ZLARFP, but uses ||x||**2 instead of x(:)
#endif
! and returns the factor xf by which x has to be scaled.
! It also hasn't the special handling for numbers < 1.d-300 or > 1.d150
! since this would be expensive for the parallel implementation.
use precision
#ifdef HAVE_DETAILED_TIMINGS
use timings
#else
use timings_dummy
#endif
implicit none
real(kind=REAL_DATATYPE), intent(inout) :: alpha
real(kind=REAL_DATATYPE), intent(in) :: xnorm_sq
real(kind=REAL_DATATYPE), intent(out) :: xf, tau
#if REALCASE == 1
real(kind=REAL_DATATYPE), intent(inout) :: alpha
#endif
#if COMPLEXCASE == 1
complex(kind=COMPLEX_DATATYPE), intent(inout) :: alpha
#endif
real(kind=REAL_DATATYPE), intent(in) :: xnorm_sq
#if REALCASE == 1
real(kind=REAL_DATATYPE), intent(out) :: xf, tau
#endif
#if COMPLEXCASE == 1
complex(kind=COMPLEX_DATATYPE), intent(out) :: xf, tau
real(kind=REAL_DATATYPE) :: ALPHR, ALPHI
#endif
real(kind=REAL_DATATYPE) :: BETA
real(kind=REAL_DATATYPE) :: BETA
#if REALCASE == 1
call timer%start("hh_transform_real" // PRECISION_SUFFIX )
#endif
#if COMPLEXCASE == 1
call timer%start("hh_transform_complex" // PRECISION_SUFFIX )
#endif
#if COMPLEXCASE == 1
ALPHR = real( ALPHA, kind=REAL_DATATYPE )
ALPHI = PRECISION_IMAG( ALPHA )
#endif
#if REALCASE == 1
if ( XNORM_SQ==0. ) then
#endif
#if COMPLEXCASE == 1
if ( XNORM_SQ==0. .AND. ALPHI==0. ) then
#endif
#if REALCASE == 1
if ( ALPHA>=0. ) then
#endif
#if COMPLEXCASE == 1
if ( ALPHR>=0. ) then
#endif
TAU = 0.
else
TAU = 2.
......@@ -251,17 +299,48 @@
else
#if REALCASE == 1
BETA = SIGN( SQRT( ALPHA**2 + XNORM_SQ ), ALPHA )
#endif
#if COMPLEXCASE == 1
BETA = SIGN( SQRT( ALPHR**2 + ALPHI**2 + XNORM_SQ ), ALPHR )
#endif
ALPHA = ALPHA + BETA
IF ( BETA<0 ) THEN
BETA = -BETA
TAU = -ALPHA / BETA
TAU = -ALPHA / BETA
ELSE
#if REALCASE == 1
ALPHA = XNORM_SQ / ALPHA
#endif
#if COMPLEXCASE == 1
ALPHR = ALPHI * (ALPHI/real( ALPHA , kind=KIND_PRECISION))
ALPHR = ALPHR + XNORM_SQ/real( ALPHA, kind=KIND_PRECISION )
#endif
#if REALCASE == 1
TAU = ALPHA / BETA
ALPHA = -ALPHA
#endif
#if COMPLEXCASE == 1
TAU = PRECISION_CMPLX( ALPHR/BETA, -ALPHI/BETA )
ALPHA = PRECISION_CMPLX( -ALPHR, ALPHI )
#endif
END IF
XF = 1./ALPHA
XF = 1.0/ALPHA
ALPHA = BETA
endif
end subroutine M_hh_transform_real_PRECISION
#if REALCASE == 1
call timer%stop("hh_transform_real" // PRECISION_SUFFIX )
#endif
#if COMPLEXCASE == 1
call timer%stop("hh_transform_complex" // PRECISION_SUFFIX )
#endif
#if REALCASE == 1
end subroutine hh_transform_real_PRECISION
#endif
#if COMPLEXCASE == 1
end subroutine hh_transform_complex_PRECISION
#endif
This diff is collapsed.
This diff is collapsed.
......@@ -581,6 +581,14 @@ module ELPA2
endif
endif