Commit 263b7c83 authored by Pavel Kus's avatar Pavel Kus
Browse files

real and complex macros generated into one file

parent 136081c1
......@@ -65,8 +65,7 @@ EXTRA_libelpa@SUFFIX@_private_la_DEPENDENCIES = \
src/elpa2_kernels/elpa2_kernels_complex_template.X90 \
src/elpa2_kernels/elpa2_kernels_simple_template.X90 \
src/redist_band.X90 \
src/precision_macros.h \
src/precision_macros_complex.h
src/precision_macros.h
lib_LTLIBRARIES = libelpa@SUFFIX@.la
libelpa@SUFFIX@_la_LINK = $(FCLINK) $(AM_LDFLAGS) -version-info $(ELPA_SO_VERSION)
......@@ -911,7 +910,6 @@ EXTRA_DIST = \
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 \
src/elpa2_kernels/elpa2_kernels_complex_template.X90 \
src/elpa2_kernels/elpa2_kernels_simple_template.X90 \
......
......@@ -2,6 +2,7 @@
import sys
simple_tokens = [
"PRECISION",
"elpa_transpose_vectors_NUMBER_PRECISION",
"elpa_reduce_add_vectors_NUMBER_PRECISION",
......@@ -133,21 +134,41 @@ def print_undefs(number, 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
print "#ifdef REALCASE"
print "#undef MATH_DATATYPE"
print "#define MATH_DATATYPE real"
print_undefs("real", explicit_tokens_real)
#print_undefs("complex", explicit_tokens_complex)
print "#ifdef DOUBLE_PRECISION"
print_variant("real", "double", explicit_tokens_real)
print "#endif"
print "#ifdef SINGLE_PRECISION"
print_variant("real", "single", explicit_tokens_real)
print "#endif"
print "#endif"
print "#ifdef COMPLEXCASE"
print "#undef MATH_DATATYPE"
print "#define MATH_DATATYPE complex"
#print_undefs("real", explicit_tokens_real)
print_undefs("complex", explicit_tokens_complex)
print "#ifdef DOUBLE_PRECISION"
print_variant("complex", "double", explicit_tokens_complex)
print "#endif"
print "#ifdef SINGLE_PRECISION"
print_variant("complex", "single", explicit_tokens_complex)
print "#endif"
print "#endif"
#print "#elif MACROS_TYPE == COMPLEX_DOUBLE"
#print "#undef NUMBER"
#print_undefs("complex", explicit_tokens_complex)
#print "#define NUMBER complex"
#print_variant("complex", "double", explicit_tokens_complex)
#print "#elif MACROS_TYPE == COMPLEX_SINGLE"
#print "#undef NUMBER"
#print_undefs("complex", explicit_tokens_complex)
#print "#define NUMBER complex"
#print_variant("complex", "single", explicit_tokens_complex)
#print "#endif"
......@@ -159,12 +159,14 @@ module ELPA1_COMPUTE
#define DATATYPE REAL(kind=rk8)
#define BYTESIZE 8
#define REALCASE 1
#define DOUBLE_PRECISION 1
#include "elpa_transpose_vectors.X90"
#include "elpa_reduce_add_vectors.X90"
#undef DOUBLE_PRECISION_REAL
#undef DATATYPE
#undef BYTESIZE
#undef REALCASE
#undef DOUBLE_PRECISION
! single precision
#ifdef WANT_SINGLE_PRECISION_REAL
......@@ -173,11 +175,13 @@ module ELPA1_COMPUTE
#define DATATYPE REAL(kind=rk4)
#define BYTESIZE 4
#define REALCASE 1
#define SINGLE_PRECISION 1
#include "elpa_transpose_vectors.X90"
#include "elpa_reduce_add_vectors.X90"
#undef DATATYPE
#undef BYTESIZE
#undef REALCASE
#undef SINGLE_PRECISION
#endif
......@@ -187,11 +191,13 @@ module ELPA1_COMPUTE
#define DATATYPE COMPLEX(kind=ck8)
#define BYTESIZE 16
#define COMPLEXCASE 1
#define DOUBLE_PRECISION 1
#include "elpa_transpose_vectors.X90"
#include "elpa_reduce_add_vectors.X90"
#undef DATATYPE
#undef BYTESIZE
#undef COMPLEXCASE
#undef DOUBLE_PRECISION
#undef DOUBLE_PRECISION_COMPLEX
#ifdef WANT_SINGLE_PRECISION_COMPLEX
......@@ -200,11 +206,13 @@ module ELPA1_COMPUTE
#undef DOUBLE_PRECISION_REAL
#define DATATYPE COMPLEX(kind=ck4)
#define COMPLEXCASE 1
#define SINGLE_PRECISION 1
#include "elpa_transpose_vectors.X90"
#include "elpa_reduce_add_vectors.X90"
#undef DATATYPE
#undef BYTESIZE
#undef COMPLEXCASE
#undef SINGLE_PRECISION
#endif /* WANT_SINGLE_PRECISION_COMPLEX */
......@@ -213,6 +221,9 @@ module ELPA1_COMPUTE
#define REAL_DATATYPE rk8
#define REALCASE 1
#define DOUBLE_PRECISION 1
! remove? :
#undef COMPLEXCASE
#include "elpa1_compute_template.X90"
......@@ -220,6 +231,7 @@ module ELPA1_COMPUTE
#undef DOUBLE_PRECISION_REAL
#undef REAL_DATATYPE
#undef REALCASE
#undef DOUBLE_PRECISION
! real single precision
#if defined(WANT_SINGLE_PRECISION_REAL)
......@@ -228,11 +240,15 @@ module ELPA1_COMPUTE
#define REAL_DATATYPE rk4
#define REALCASE 1
#define SINGLE_PRECISION 1
!remove? :
#undef COMPLEXCASE
#include "elpa1_compute_template.X90"
#undef REALCASE
#undef SINGLE_PRECISION
#undef DOUBLE_PRECISION_REAL
#undef REAL_DATATYPE
......@@ -245,10 +261,14 @@ module ELPA1_COMPUTE
#define COMPLEX_DATATYPE ck8
#define COMPLEXCASE 1
#define DOUBLE_PRECISION 1
! remove? :
#undef REALCASE
#include "elpa1_compute_template.X90"
#undef COMPLEXCASE
#undef DOUBLE_PRECISION
#undef DOUBLE_PRECISION_COMPLEX
#undef REAL_DATATYPE
......@@ -263,11 +283,14 @@ module ELPA1_COMPUTE
#define COMPLEX_DATATYPE ck4
#define COMPLEXCASE 1
#define SINGLE_PRECISION 1
!remove ? :
#undef REALCASE
#include "elpa1_compute_template.X90"
#undef COMPLEXCASE
#undef SINGLE_PRECISION
#undef DOUBLE_PRECISION_COMPLEX
#undef COMPLEX_DATATYPE
......
......@@ -52,13 +52,7 @@
! 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
......
......@@ -400,6 +400,14 @@ module ELPA2
!> \result success logical, false if error occured
!-------------------------------------------------------------------------------
! #undef PRECISION
! #undef MATH_DATATYPE
! #define MATH_DATATYPE real
! #define PRECISION double
! #include "elpa2_template.X90"
#define DOUBLE_PRECISION_REAL
#ifdef DOUBLE_PRECISION_REAL
......@@ -599,6 +607,7 @@ module ELPA2
else
nbw = (63/nblk+1)*nblk
endif
write(*,*) "nbw", nbw
num_blocks = (na-1)/nbw + 1
......
......@@ -167,8 +167,12 @@ module ELPA2_compute
#define DOUBLE_PRECISION_REAL 1
#define REAL_DATATYPE rk8
#define REALCASE 1
#define DOUBLE_PRECISION 1
#include "precision_macros.h"
#include "elpa2_compute_real_template.X90"
#undef REALCASE
#undef DOUBLE_PRECISION
#undef DOUBLE_PRECISION_REAL
#undef REAL_DATATYPE
......@@ -179,8 +183,12 @@ module ELPA2_compute
#undef DOUBLE_PRECISION_REAL
#define REAL_DATATYPE rk4
#define REALCASE 1
#define SINGLE_PRECISION 1
#include "precision_macros.h"
#include "elpa2_compute_real_template.X90"
#undef REALCASE
#undef SINGLE_PRECISION
#undef DOUBLE_PRECISION_REAL
#undef REAL_DATATYPE
......@@ -192,8 +200,12 @@ module ELPA2_compute
#define REAL_DATATYPE rk8
#define COMPLEX_DATATYPE ck8
#include "precision_macros_complex.h"
#define COMPLEXCASE 1
#define DOUBLE_PRECISION 1
#include "precision_macros.h"
#include "elpa2_compute_complex_template.X90"
#undef COMPLEXCASE
#undef DOUBLE_PRECISION
#undef DOUBLE_PRECISION_COMPLEX
#undef REAL_DATATYPE
......@@ -207,8 +219,12 @@ module ELPA2_compute
#define REAL_DATATYPE rk4
#define COMPLEX_DATATYPE ck4
#include "precision_macros_complex.h"
#define COMPLEXCASE 1
#define SINGLE_PRECISION 1
#include "precision_macros.h"
#include "elpa2_compute_complex_template.X90"
#undef COMPLEXCASE
#undef SINGLE_PRECISION
#undef DOUBLE_PRECISION_COMPLEX
#undef COMPLEX_DATATYPE
......
#undef PRECISION
#undef MATH_DATATYPE
#define MATH_DATATYPE real
#ifdef DOUBLE_PRECISION_REAL
#define PRECISION double
#else
#define PRECISION single
#endif
#ifdef DOUBLE_PRECISION_REAL
#ifdef REALCASE
#undef MATH_DATATYPE
#define MATH_DATATYPE real
#undef PRECISION
#undef elpa_transpose_vectors_real_PRECISION
#undef elpa_reduce_add_vectors_real_PRECISION
#undef bandred_real_PRECISION
......@@ -17,12 +10,14 @@
#undef trans_ev_tridi_to_band_real_PRECISION
#undef band_band_real_PRECISION
#undef tridiag_real_PRECISION
#undef trans_ev_real_PRECISION
#undef solve_tridi_PRECISION
#undef solve_tridi_col_PRECISION
#undef solve_tridi_single_problem_PRECISION
#undef qr_pdgeqrf_2dcomm_PRECISION
#undef hh_transform_real_PRECISION
#undef symm_matrix_allreduce_PRECISION
#undef herm_matrix_allreduce_PRECISION
#undef redist_band_real_PRECISION
#undef unpack_row_real_cpu_PRECISION
#undef unpack_row_real_cpu_openmp_PRECISION
......@@ -49,6 +44,12 @@
#undef global_product_PRECISION
#undef add_tmp_PRECISION
#undef v_add_s_PRECISION
#undef launch_compute_hh_trafo_c_kernel_real_PRECISION
#undef compute_hh_trafo_real_gpu_PRECISION
#undef launch_my_pack_c_kernel_real_PRECISION
#undef launch_my_unpack_c_kernel_real_PRECISION
#undef launch_compute_hh_dotp_c_kernel_real_PRECISION
#undef launch_extract_hh_tau_c_kernel_real_PRECISION
#undef PRECISION_GEMV
#undef PRECISION_TRMV
#undef PRECISION_GEMM
......@@ -57,6 +58,8 @@
#undef PRECISION_SYRK
#undef PRECISION_SYMV
#undef PRECISION_SYMM
#undef PRECISION_HEMV
#undef PRECISION_HER2
#undef PRECISION_SYR2
#undef PRECISION_SYR2K
#undef PRECISION_GEQRF
......@@ -78,6 +81,8 @@
#undef CONST_8_0
#undef size_of_PRECISION_real
#undef MPI_REAL_PRECISION
#ifdef DOUBLE_PRECISION
#define PRECISION double
#define elpa_transpose_vectors_real_PRECISION elpa_transpose_vectors_real_double
#define elpa_reduce_add_vectors_real_PRECISION elpa_reduce_add_vectors_real_double
#define bandred_real_PRECISION bandred_real_double
......@@ -86,12 +91,14 @@
#define trans_ev_tridi_to_band_real_PRECISION trans_ev_tridi_to_band_real_double
#define band_band_real_PRECISION band_band_real_double
#define tridiag_real_PRECISION tridiag_real_double
#define trans_ev_real_PRECISION trans_ev_real_double
#define solve_tridi_PRECISION solve_tridi_double
#define solve_tridi_col_PRECISION solve_tridi_col_double
#define solve_tridi_single_problem_PRECISION solve_tridi_single_problem_double
#define qr_pdgeqrf_2dcomm_PRECISION qr_pdgeqrf_2dcomm_double
#define hh_transform_real_PRECISION hh_transform_real_double
#define symm_matrix_allreduce_PRECISION symm_matrix_allreduce_double
#define herm_matrix_allreduce_PRECISION herm_matrix_allreduce_double
#define redist_band_real_PRECISION redist_band_real_double
#define unpack_row_real_cpu_PRECISION unpack_row_real_cpu_double
#define unpack_row_real_cpu_openmp_PRECISION unpack_row_real_cpu_openmp_double
......@@ -118,6 +125,12 @@
#define global_product_PRECISION global_product_double
#define add_tmp_PRECISION add_tmp_double
#define v_add_s_PRECISION v_add_s_double
#define launch_compute_hh_trafo_c_kernel_real_PRECISION launch_compute_hh_trafo_c_kernel_real_double
#define compute_hh_trafo_real_gpu_PRECISION compute_hh_trafo_real_gpu_double
#define launch_my_pack_c_kernel_real_PRECISION launch_my_pack_c_kernel_real_double
#define launch_my_unpack_c_kernel_real_PRECISION launch_my_unpack_c_kernel_real_double
#define launch_compute_hh_dotp_c_kernel_real_PRECISION launch_compute_hh_dotp_c_kernel_real_double
#define launch_extract_hh_tau_c_kernel_real_PRECISION launch_extract_hh_tau_c_kernel_real_double
#define PRECISION_GEMV DGEMV
#define PRECISION_TRMV DTRMV
#define PRECISION_GEMM DGEMM
......@@ -126,6 +139,8 @@
#define PRECISION_SYRK DSYRK
#define PRECISION_SYMV DSYMV
#define PRECISION_SYMM DSYMM
#define PRECISION_HEMV DHEMV
#define PRECISION_HER2 DHER2
#define PRECISION_SYR2 DSYR2
#define PRECISION_SYR2K DSYR2K
#define PRECISION_GEQRF DGEQRF
......@@ -147,77 +162,9 @@
#define CONST_8_0 8.0_rk8
#define size_of_PRECISION_real size_of_double_real_datatype
#define MPI_REAL_PRECISION MPI_REAL8
#else
#undef elpa_transpose_vectors_real_PRECISION
#undef elpa_reduce_add_vectors_real_PRECISION
#undef bandred_real_PRECISION
#undef trans_ev_band_to_full_real_PRECISION
#undef tridiag_band_real_PRECISION
#undef trans_ev_tridi_to_band_real_PRECISION
#undef band_band_real_PRECISION
#undef tridiag_real_PRECISION
#undef solve_tridi_PRECISION
#undef solve_tridi_col_PRECISION
#undef solve_tridi_single_problem_PRECISION
#undef qr_pdgeqrf_2dcomm_PRECISION
#undef hh_transform_real_PRECISION
#undef symm_matrix_allreduce_PRECISION
#undef redist_band_real_PRECISION
#undef unpack_row_real_cpu_PRECISION
#undef unpack_row_real_cpu_openmp_PRECISION
#undef unpack_and_prepare_row_group_real_gpu_PRECISION
#undef extract_hh_tau_real_gpu_PRECISION
#undef compute_hh_dot_products_real_gpu_PRECISION
#undef compute_hh_trafo_real_cpu_openmp_PRECISION
#undef compute_hh_trafo_real_cpu_PRECISION
#undef pack_row_group_real_gpu_PRECISION
#undef pack_row_real_cpu_openmp_PRECISION
#undef pack_row_real_cpu_PRECISION
#undef wy_gen_PRECISION
#undef wy_right_PRECISION
#undef wy_left_PRECISION
#undef wy_symm_PRECISION
#undef merge_recursive_PRECISION
#undef merge_systems_PRECISION
#undef distribute_global_column_PRECISION
#undef check_monotony_PRECISION
#undef global_gather_PRECISION
#undef resort_ev_PRECISION
#undef transform_columns_PRECISION
#undef solve_secular_equation_PRECISION
#undef global_product_PRECISION
#undef add_tmp_PRECISION
#undef v_add_s_PRECISION
#undef PRECISION_GEMV
#undef PRECISION_TRMV
#undef PRECISION_GEMM
#undef PRECISION_TRMM
#undef PRECISION_HERK
#undef PRECISION_SYRK
#undef PRECISION_SYMV
#undef PRECISION_SYMM
#undef PRECISION_SYR2
#undef PRECISION_SYR2K
#undef PRECISION_GEQRF
#undef PRECISION_STEDC
#undef PRECISION_STEQR
#undef PRECISION_LAMRG
#undef PRECISION_LAMCH
#undef PRECISION_LAPY2
#undef PRECISION_LAED4
#undef PRECISION_LAED5
#undef cublas_PRECISION_GEMM
#undef cublas_PRECISION_TRMM
#undef cublas_PRECISION_GEMV
#undef PRECISION_SUFFIX
#undef CONST_0_0
#undef CONST_0_5
#undef CONST_1_0
#undef CONST_2_0
#undef CONST_8_0
#undef size_of_PRECISION_real
#undef MPI_REAL_PRECISION
#endif
#ifdef SINGLE_PRECISION
#define PRECISION single
#define elpa_transpose_vectors_real_PRECISION elpa_transpose_vectors_real_single
#define elpa_reduce_add_vectors_real_PRECISION elpa_reduce_add_vectors_real_single
#define bandred_real_PRECISION bandred_real_single
......@@ -226,12 +173,14 @@
#define trans_ev_tridi_to_band_real_PRECISION trans_ev_tridi_to_band_real_single
#define band_band_real_PRECISION band_band_real_single
#define tridiag_real_PRECISION tridiag_real_single
#define trans_ev_real_PRECISION trans_ev_real_single
#define solve_tridi_PRECISION solve_tridi_single
#define solve_tridi_col_PRECISION solve_tridi_col_single
#define solve_tridi_single_problem_PRECISION solve_tridi_single_problem_single
#define qr_pdgeqrf_2dcomm_PRECISION qr_pdgeqrf_2dcomm_single
#define hh_transform_real_PRECISION hh_transform_real_single
#define symm_matrix_allreduce_PRECISION symm_matrix_allreduce_single
#define herm_matrix_allreduce_PRECISION herm_matrix_allreduce_single
#define redist_band_real_PRECISION redist_band_real_single
#define unpack_row_real_cpu_PRECISION unpack_row_real_cpu_single
#define unpack_row_real_cpu_openmp_PRECISION unpack_row_real_cpu_openmp_single
......@@ -258,6 +207,12 @@
#define global_product_PRECISION global_product_single
#define add_tmp_PRECISION add_tmp_single
#define v_add_s_PRECISION v_add_s_single
#define launch_compute_hh_trafo_c_kernel_real_PRECISION launch_compute_hh_trafo_c_kernel_real_single
#define compute_hh_trafo_real_gpu_PRECISION compute_hh_trafo_real_gpu_single
#define launch_my_pack_c_kernel_real_PRECISION launch_my_pack_c_kernel_real_single
#define launch_my_unpack_c_kernel_real_PRECISION launch_my_unpack_c_kernel_real_single
#define launch_compute_hh_dotp_c_kernel_real_PRECISION launch_compute_hh_dotp_c_kernel_real_single
#define launch_extract_hh_tau_c_kernel_real_PRECISION launch_extract_hh_tau_c_kernel_real_single
#define PRECISION_GEMV SGEMV
#define PRECISION_TRMV STRMV
#define PRECISION_GEMM SGEMM
......@@ -266,6 +221,8 @@
#define PRECISION_SYRK SSYRK
#define PRECISION_SYMV SSYMV
#define PRECISION_SYMM SSYMM
#define PRECISION_HEMV SHEMV
#define PRECISION_HER2 SHER2
#define PRECISION_SYR2 SSYR2
#define PRECISION_SYR2K SSYR2K
#define PRECISION_GEQRF SGEQRF
......@@ -288,3 +245,282 @@
#define size_of_PRECISION_real size_of_single_real_datatype
#define MPI_REAL_PRECISION MPI_REAL4
#endif
#endif
#ifdef COMPLEXCASE
#undef MATH_DATATYPE
#define MATH_DATATYPE complex
#undef PRECISION
#undef elpa_transpose_vectors_complex_PRECISION
#undef elpa_reduce_add_vectors_complex_PRECISION
#undef bandred_complex_PRECISION
#undef trans_ev_band_to_full_complex_PRECISION
#undef tridiag_band_complex_PRECISION
#undef trans_ev_tridi_to_band_complex_PRECISION
#undef band_band_complex_PRECISION
#undef tridiag_complex_PRECISION
#undef trans_ev_complex_PRECISION
#undef solve_tridi_PRECISION
#undef solve_tridi_col_PRECISION
#undef solve_tridi_single_problem_PRECISION
#undef qr_pdgeqrf_2dcomm_PRECISION
#undef hh_transform_complex_PRECISION
#undef symm_matrix_allreduce_PRECISION
#undef herm_matrix_allreduce_PRECISION
#undef redist_band_complex_PRECISION
#undef unpack_row_complex_cpu_PRECISION
#undef unpack_row_complex_cpu_openmp_PRECISION
#undef unpack_and_prepare_row_group_complex_gpu_PRECISION
#undef extract_hh_tau_complex_gpu_PRECISION
#undef compute_hh_dot_products_complex_gpu_PRECISION
#undef compute_hh_trafo_complex_cpu_openmp_PRECISION
#undef compute_hh_trafo_complex_cpu_PRECISION
#undef pack_row_group_complex_gpu_PRECISION
#undef pack_row_complex_cpu_openmp_PRECISION
#undef pack_row_complex_cpu_PRECISION
#undef wy_gen_PRECISION
#undef wy_right_PRECISION
#undef wy_left_PRECISION
#undef wy_symm_PRECISION
#undef merge_recursive_PRECISION
#undef merge_systems_PRECISION
#undef distribute_global_column_PRECISION
#undef check_monotony_PRECISION
#undef global_gather_PRECISION
#undef resort_ev_PRECISION
#undef transform_columns_PRECISION
#undef solve_secular_equation_PRECISION
#undef global_product_PRECISION
#undef add_tmp_PRECISION
#undef v_add_s_PRECISION
#undef launch_compute_hh_trafo_c_kernel_complex_PRECISION
#undef compute_hh_trafo_complex_gpu_PRECISION
#undef launch_my_pack_c_kernel_complex_PRECISION
#undef launch_my_unpack_c_kernel_complex_PRECISION
#undef launch_compute_hh_dotp_c_kernel_complex_PRECISION
#undef launch_extract_hh_tau_c_kernel_complex_PRECISION
#undef PRECISION_GEMV
#undef PRECISION_TRMV
#undef PRECISION_GEMM
#undef PRECISION_TRMM
#undef PRECISION_HERK
#undef PRECISION_SYRK
#undef PRECISION_SYMV
#undef PRECISION_SYMM
#undef PRECISION_HEMV
#undef PRECISION_HER2
#undef PRECISION_SYR2
#undef PRECISION_SYR2K
#undef PRECISION_GEQRF
#undef PRECISION_STEDC
#undef PRECISION_STEQR
#undef PRECISION_LAMRG
#undef PRECISION_LAMCH
#undef PRECISION_LAPY2
#undef PRECISION_LAED4
#undef PRECISION_LAED5
#undef cublas_PRECISION_GEMM
#undef cublas_PRECISION_TRMM
#undef cublas_PRECISION_GEMV
#undef PRECISION_SUFFIX
#undef MPI_COMPLEX_PRECISION
#undef MPI_COMPLEX_EXPLICIT_PRECISION
#undef MPI_REAL_PRECISION
#undef KIND_PRECISION
#undef PRECISION_CMPLX
#undef PRECISION_IMAG
#undef PRECISION_REAL
#undef CONST_REAL_0_0
#undef CONST_REAL_1_0
#undef CONST_REAL_0_5
#undef CONST_COMPLEX_PAIR_0_0
#undef CONST_COMPLEX_PAIR_1_0
#undef CONST_COMPLEX_PAIR_NEGATIVE_1_0
#undef CONST_COMPLEX_PAIR_NEGATIVE_0_5
#undef CONST_COMPLEX_0_0
#undef CONST_COMPLEX_1_0
#undef size_of_PRECISION_complex
#ifdef DOUBLE_PRECISION
#define PRECISION double
#define elpa_transpose_vectors_complex_PRECISION elpa_transpose_vectors_complex_double
#define elpa_reduce_add_vectors_complex_PRECISION elpa_reduce_add_vectors_complex_double
#define bandred_complex_PRECISION bandred_complex_double
#define trans_ev_band_to_full_complex_PRECISION trans_ev_band_to_full_complex_double
#define tridiag_band_complex_PRECISION tridiag_band_complex_double
#define trans_ev_tridi_to_band_complex_PRECISION trans_ev_tridi_to_band_complex_double
#define band_band_complex_PRECISION band_band_complex_double
#define tridiag_complex_PRECISION tridiag_complex_double
#define trans_ev_complex_PRECISION trans_ev_complex_double
#define solve_tridi_PRECISION solve_tridi_double
#define solve_tridi_col_PRECISION solve_tridi_col_double
#define solve_tridi_single_problem_PRECISION solve_tridi_single_problem_double
#define qr_pdgeqrf_2dcomm_PRECISION qr_pdgeqrf_2dcomm_double
#define hh_transform_complex_PRECISION hh_transform_complex_double
#define symm_matrix_allreduce_PRECISION symm_matrix_allreduce_double
#define herm_matrix_allreduce_PRECISION herm_matrix_allreduce_double
#define redist_band_complex_PRECISION redist_band_complex_double
#define unpack_row_complex_cpu_PRECISION unpack_row_complex_cpu_double
#define unpack_row_complex_cpu_openmp_PRECISION unpack_row_complex_cpu_openmp_double
#define unpack_and_prepare_row_group_complex_gpu_PRECISION unpack_and_prepare_row_group_complex_gpu_double
#define extract_hh_tau_complex_gpu_PRECISION extract_hh_tau_complex_gpu_double
#define compute_hh_dot_products_complex_gpu_PRECISION compute_hh_dot_products_complex_gpu_double
#define compute_hh_trafo_complex_cpu_openmp_PRECISION compute_hh_trafo_complex_cpu_openmp_double
#define compute_hh_trafo_complex_cpu_PRECISION compute_hh_trafo_complex_cpu_double
#define pack_row_group_complex_gpu_PRECISION pack_row_group_complex_gpu_double
#define pack_row_complex_cpu_openmp_PRECISION pack_row_complex_cpu_openmp_double
#define pack_row_complex_cpu_PRECISION pack_row_complex_cpu_double
#define wy_gen_PRECISION wy_gen_double
#define wy_right_PRECISION wy_right_double
#define wy_left_PRECISION wy_left_double
#define wy_symm_PRECISION wy_symm_double
#define merge_recursive_PRECISION merge_recursive_double
#define merge_systems_PRECISION merge_systems_double
#define distribute_global_column_PRECISION distribute_global_column_double
#define check_monotony_PRECISION check_monotony_double
#define global_gather_PRECISION global_gather_double
#define resort_ev_PRECISION resort_ev_double
#define transform_columns_PRECISION transform_columns_double
#define solve_secular_equation_PRECISION solve_secular_equation_double
#define global_product_PRECISION global_product_double
#define add_tmp_PRECISION add_tmp_double
#define v_add_s_PRECISION v_add_s_double
#define launch_compute_hh_trafo_c_kernel_complex_PRECISION launch_compute_hh_trafo_c_kernel_complex_double
#define compute_hh_trafo_complex_gpu_PRECISION compute_hh_trafo_complex_gpu_double
#define launch_my_pack_c_kernel_complex_PRECISION launch_my_pack_c_kernel_complex_double
#define launch_my_unpack_c_kernel_complex_PRECISION launch_my_unpack_c_kernel_complex_double
#define launch_compute_hh_dotp_c_kernel_complex_PRECISION launch_compute_hh_dotp_c_kernel_complex_double
#define launch_extract_hh_tau_c_kernel_complex_PRECISION launch_extract_hh_tau_c_kernel_complex_double
#define PRECISION_GEMV ZGEMV