Skip to content

Commit 9afa354

Browse files
committed
Merge branch '63-add-non-hermitian-rayleigh-ritz-as-backup-for-quasi-hermitian-problem' into 'master'
Resolve "Add Non-Hermitian Rayleigh-Ritz as backup for Quasi-Hermitian problem" Closes #63 See merge request chase/chase-library/ChASE!86
2 parents 1d053f9 + 06169be commit 9afa354

68 files changed

Lines changed: 1306 additions & 801 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CMakeLists.txt

Lines changed: 53 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# -*- Mode: cmake -*-
2-
cmake_minimum_required( VERSION 3.8 )
2+
cmake_minimum_required( VERSION 3.18 )
33

44
project( ChASE LANGUAGES C CXX Fortran VERSION 1.6.1 )
55
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
@@ -28,7 +28,12 @@ option(CHASE_ENABLE_MPI_IO "Enable MPI IO to read Hamiltonian matrix from local"
2828
option(CHASE_USE_NVTX "Enable NVTX for profiling" OFF)
2929
option(CHASE_BUILD_WITH_EXAMPLES "Build the examples" OFF)
3030
option(CHASE_BUILD_WITH_DOCS "Build the docs" OFF)
31+
option(CHASE_SAVE_RESIDUALS "Print the residuals in an external file" OFF)
32+
option(CHASE_ENABLE_XGEEV_RAYLEIGHRITZ "Enable solving pseudo-hermitian problems with XGEEV cusolver" OFF)
3133
option(ChASE_DISPLAY_COND_V_SVD "Compute and display condition number of V from SVD" OFF)
34+
option(CHASE_QR_DOUBLE_PRECISION "Operate QR in Double Precision" ON)
35+
option(CHASE_PRINT_DEBUG "Print additional information for debugging purpose" OFF)
36+
option(CHASE_RR_DOUBLE_PRECISION "Operate HEEVD in RR for pseudo-hermitian matrices in Double Precision" OFF)
3237

3338
if( CHASE_OUTPUT )
3439
target_compile_definitions( chase_algorithm INTERFACE "-DCHASE_OUTPUT" )
@@ -63,10 +68,26 @@ if(CHASE_USE_NVTX)
6368
target_compile_definitions( chase_algorithm INTERFACE "-DUSE_NVTX" )
6469
endif()
6570

71+
if(CHASE_QR_DOUBLE_PRECISION)
72+
add_definitions(-DQR_DOUBLE_PRECISION)
73+
endif()
74+
75+
if(CHASE_RR_DOUBLE_PRECISION)
76+
add_definitions(-DRR_DOUBLE_PRECISION)
77+
endif()
78+
6679
if(ChASE_DISPLAY_COND_V_SVD)
6780
add_definitions(-DChASE_DISPLAY_COND_V_SVD)
6881
endif()
6982

83+
if(CHASE_SAVE_RESIDUALS)
84+
add_definitions(-DCHASE_SAVE_RESIDUALS)
85+
endif()
86+
87+
if(CHASE_PRINT_DEBUG)
88+
add_definitions(-DCHASE_PRINT_DEBUG)
89+
endif()
90+
7091
add_subdirectory(external)
7192
add_subdirectory(grid)
7293
add_subdirectory(linalg)
@@ -85,66 +106,66 @@ add_executable( "chase_driver_gpu" tests/noinput.cpp )
85106
target_link_libraries(chase_driver_gpu chase_gpu)
86107
endif()
87108

88-
#add_executable( "herm_chase_run_cpu" tests/dist_quasi_noinput.cpp )
109+
#add_executable( "herm_chase_run_cpu" tests/dist_pseudo_noinput.cpp )
89110
#target_link_libraries("herm_chase_run_cpu" chase_cpu)
90111

91-
#add_executable( "quasi_chase_run_cpu" tests/dist_quasi_noinput.cpp )
92-
#target_link_libraries("quasi_chase_run_cpu" chase_cpu)
93-
#target_compile_definitions( "quasi_chase_run_cpu" PRIVATE USE_QUASI_HERMITIAN=1)
112+
#add_executable( "pseudo_chase_run_cpu" tests/dist_pseudo_noinput.cpp )
113+
#target_link_libraries("pseudo_chase_run_cpu" chase_cpu)
114+
#target_compile_definitions( "pseudo_chase_run_cpu" PRIVATE USE_PSEUDO_HERMITIAN=1)
94115

95116
#if(TARGET chase_gpu)
96-
#add_executable("herm_chase_run_gpu" tests/dist_quasi_noinput.cpp)
117+
#add_executable("herm_chase_run_gpu" tests/dist_pseudo_noinput.cpp)
97118
#target_link_libraries("herm_chase_run_gpu" chase_gpu)
98119
#target_compile_definitions("herm_chase_run_gpu" INTERFACE "-DHAS_CUDA")
99120

100-
#add_executable("quasi_chase_run_gpu" tests/dist_quasi_noinput.cpp)
101-
#target_link_libraries("quasi_chase_run_gpu" chase_gpu)
102-
#target_compile_definitions("quasi_chase_run_gpu" PRIVATE USE_QUASI_HERMITIAN=1)
103-
#target_compile_definitions("quasi_chase_run_gpu" INTERFACE "-DHAS_CUDA")
121+
#add_executable("pseudo_chase_run_gpu" tests/dist_pseudo_noinput.cpp)
122+
#target_link_libraries("pseudo_chase_run_gpu" chase_gpu)
123+
#target_compile_definitions("pseudo_chase_run_gpu" PRIVATE USE_PSEUDO_HERMITIAN=1)
124+
#target_compile_definitions("pseudo_chase_run_gpu" INTERFACE "-DHAS_CUDA")
104125
#endif()
105126

106127
#if(TARGET pchase_cpu)
107-
#add_executable("herm_block_dist_chase_run_cpu" tests/dist_quasi_noinput.cpp)
128+
#add_executable("herm_block_dist_chase_run_cpu" tests/dist_pseudo_noinput.cpp)
108129
#target_link_libraries("herm_block_dist_chase_run_cpu" pchase_cpu)
109130
#target_compile_definitions("herm_block_dist_chase_run_cpu" PRIVATE USE_MPI=1)
110131

111-
#add_executable("quasi_block_dist_chase_run_cpu" tests/dist_quasi_noinput.cpp)
112-
#target_link_libraries("quasi_block_dist_chase_run_cpu" pchase_cpu)
113-
#target_compile_definitions("quasi_block_dist_chase_run_cpu" PRIVATE USE_QUASI_HERMITIAN=1)
114-
#target_compile_definitions("quasi_block_dist_chase_run_cpu" PRIVATE USE_MPI=1)
132+
#add_executable("pseudo_block_dist_chase_run_cpu" tests/dist_pseudo_noinput.cpp)
133+
#target_link_libraries("pseudo_block_dist_chase_run_cpu" pchase_cpu)
134+
#target_compile_definitions("pseudo_block_dist_chase_run_cpu" PRIVATE USE_PSEUDO_HERMITIAN=1)
135+
#target_compile_definitions("pseudo_block_dist_chase_run_cpu" PRIVATE USE_MPI=1)
115136

116-
#add_executable("herm_cyclic_dist_chase_run_cpu" tests/dist_quasi_noinput.cpp)
137+
#add_executable("herm_cyclic_dist_chase_run_cpu" tests/dist_pseudo_noinput.cpp)
117138
#target_link_libraries("herm_cyclic_dist_chase_run_cpu" pchase_cpu)
118139
#target_compile_definitions("herm_cyclic_dist_chase_run_cpu" PRIVATE USE_BLOCKCYCLIC=1)
119140
#target_compile_definitions("herm_cyclic_dist_chase_run_cpu" PRIVATE USE_MPI=1)
120141

121-
#add_executable("quasi_cyclic_dist_chase_run_cpu" tests/dist_quasi_noinput.cpp )
122-
#target_link_libraries("quasi_cyclic_dist_chase_run_cpu" pchase_cpu)
123-
#target_compile_definitions("quasi_cyclic_dist_chase_run_cpu" PRIVATE USE_BLOCKCYCLIC=1)
124-
#target_compile_definitions("quasi_cyclic_dist_chase_run_cpu" PRIVATE USE_QUASI_HERMITIAN=1)
125-
#target_compile_definitions("quasi_cyclic_dist_chase_run_cpu" PRIVATE USE_MPI=1)
142+
#add_executable("pseudo_cyclic_dist_chase_run_cpu" tests/dist_pseudo_noinput.cpp )
143+
#target_link_libraries("pseudo_cyclic_dist_chase_run_cpu" pchase_cpu)
144+
#target_compile_definitions("pseudo_cyclic_dist_chase_run_cpu" PRIVATE USE_BLOCKCYCLIC=1)
145+
#target_compile_definitions("pseudo_cyclic_dist_chase_run_cpu" PRIVATE USE_PSEUDO_HERMITIAN=1)
146+
#target_compile_definitions("pseudo_cyclic_dist_chase_run_cpu" PRIVATE USE_MPI=1)
126147
#endif()
127148

128149
#if(TARGET pchase_gpu)
129-
#add_executable("herm_block_dist_chase_run_gpu" tests/dist_quasi_noinput.cpp)
150+
#add_executable("herm_block_dist_chase_run_gpu" tests/dist_pseudo_noinput.cpp)
130151
#target_link_libraries("herm_block_dist_chase_run_gpu" pchase_gpu)
131152
#target_compile_definitions("herm_block_dist_chase_run_gpu" INTERFACE "-DHAS_NCCL -DHAS_CUDA")
132153

133-
#add_executable("quasi_block_dist_chase_run_gpu" tests/dist_quasi_noinput.cpp)
134-
#target_link_libraries("quasi_block_dist_chase_run_gpu" pchase_gpu)
135-
#target_compile_definitions("quasi_block_dist_chase_run_gpu" PRIVATE USE_QUASI_HERMITIAN=1)
136-
#target_compile_definitions("quasi_block_dist_chase_run_gpu" INTERFACE "-DHAS_NCCL -DHAS_CUDA")
154+
#add_executable("pseudo_block_dist_chase_run_gpu" tests/dist_pseudo_noinput.cpp)
155+
#target_link_libraries("pseudo_block_dist_chase_run_gpu" pchase_gpu)
156+
#target_compile_definitions("pseudo_block_dist_chase_run_gpu" PRIVATE USE_PSEUDO_HERMITIAN=1)
157+
#target_compile_definitions("pseudo_block_dist_chase_run_gpu" INTERFACE "-DHAS_NCCL -DHAS_CUDA")
137158

138-
#add_executable("herm_cyclic_dist_chase_run_gpu" tests/dist_quasi_noinput.cpp)
159+
#add_executable("herm_cyclic_dist_chase_run_gpu" tests/dist_pseudo_noinput.cpp)
139160
#target_link_libraries("herm_cyclic_dist_chase_run_gpu" pchase_gpu)
140161
#target_compile_definitions("herm_cyclic_dist_chase_run_gpu" PRIVATE USE_BLOCKCYCLIC=1)
141162
#target_compile_definitions("herm_cyclic_dist_chase_run_gpu" INTERFACE "-DHAS_NCCL -DHAS_CUDA")
142163

143-
#add_executable("quasi_cyclic_dist_chase_run_gpu" tests/dist_quasi_noinput.cpp)
144-
#target_link_libraries("quasi_cyclic_dist_chase_run_gpu" pchase_gpu)
145-
#target_compile_definitions("quasi_cyclic_dist_chase_run_gpu" PRIVATE USE_BLOCKCYCLIC=1)
146-
#target_compile_definitions("quasi_cyclic_dist_chase_run_gpu" PRIVATE USE_QUASI_HERMITIAN=1)
147-
#target_compile_definitions("quasi_cyclic_dist_chase_run_gpu" INTERFACE "-DHAS_NCCL" "-DHAS_CUDA")
164+
#add_executable("pseudo_cyclic_dist_chase_run_gpu" tests/dist_pseudo_noinput.cpp)
165+
#target_link_libraries("pseudo_cyclic_dist_chase_run_gpu" pchase_gpu)
166+
#target_compile_definitions("pseudo_cyclic_dist_chase_run_gpu" PRIVATE USE_BLOCKCYCLIC=1)
167+
#target_compile_definitions("pseudo_cyclic_dist_chase_run_gpu" PRIVATE USE_PSEUDO_HERMITIAN=1)
168+
#target_compile_definitions("pseudo_cyclic_dist_chase_run_gpu" INTERFACE "-DHAS_NCCL" "-DHAS_CUDA")
148169
#endif()
149170

150171
option(ENABLE_TESTS "Enable unit tests." OFF)

Impl/chase_cpu/chase_cpu.hpp

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,11 @@ namespace Impl
9393

9494
A_ = chase::matrix::Matrix<T>(3 *nevex_, nevex_);
9595

96-
if constexpr (std::is_same<MatrixType, chase::matrix::QuasiHermitianMatrix<T>>::value)
96+
if constexpr (std::is_same<MatrixType, chase::matrix::PseudoHermitianMatrix<T>>::value)
9797
{
9898
is_sym_ = false;
9999
is_pseudoHerm_ = true;
100-
//Quasi Hermitian matrices require more space for the dual basis
100+
//Pseudo Hermitian matrices require more space for the dual basis
101101
}
102102
else
103103
{
@@ -145,11 +145,11 @@ namespace Impl
145145
resid_ = chase::matrix::Matrix<chase::Base<T>>(nevex_, 1);
146146
ritzvs_ = chase::matrix::Matrix<chase::Base<T>>(nevex_, 1, nevex_, ritzv_);
147147
A_ = chase::matrix::Matrix<T>(3 * nevex_, nevex_);
148-
if constexpr (std::is_same<MatrixType, chase::matrix::QuasiHermitianMatrix<T>>::value)
148+
if constexpr (std::is_same<MatrixType, chase::matrix::PseudoHermitianMatrix<T>>::value)
149149
{
150150
is_sym_ = false;
151151
is_pseudoHerm_ = true;
152-
//Quasi Hermitian matrices require more space for the dual basis
152+
//Pseudo Hermitian matrices require more space for the dual basis
153153
}
154154
else
155155
{
@@ -178,11 +178,16 @@ namespace Impl
178178
std::size_t GetNev() override {return nev_;}
179179

180180
std::size_t GetNex() override {return nex_;}
181+
182+
std::size_t GetLanczosIter() override {return lanczosIter_;}
183+
184+
std::size_t GetNumLanczos() override {return numLanczos_;}
181185

182186
chase::Base<T>* GetRitzv() override {return ritzvs_.data(); }
183187
chase::Base<T>* GetResid() override {return resid_.data(); }
184188
ChaseConfig<T>& GetConfig() override {return config_; }
185189
int get_nprocs() override {return 1;}
190+
int get_rank() override { return 0; }
186191

187192
/**
188193
* @brief Loads matrix data from a binary file.
@@ -263,6 +268,8 @@ namespace Impl
263268

264269
void Lanczos(std::size_t m, chase::Base<T>* upperb) override
265270
{
271+
lanczosIter_ = m;
272+
numLanczos_ = 1;
266273
chase::linalg::internal::cpu::lanczos(m,
267274
Hmat_,
268275
Vec1_.data(),
@@ -273,6 +280,8 @@ namespace Impl
273280
void Lanczos(std::size_t M, std::size_t numvec, chase::Base<T>* upperb,
274281
chase::Base<T>* ritzv, chase::Base<T>* Tau, chase::Base<T>* ritzV) override
275282
{
283+
lanczosIter_ = M;
284+
numLanczos_ = numvec;
276285
chase::linalg::internal::cpu::lanczos(M,
277286
numvec,
278287
Hmat_,
@@ -449,7 +458,7 @@ namespace Impl
449458
Vec2_.data(),
450459
Vec2_.ld());
451460

452-
if constexpr (std::is_same<MatrixType, chase::matrix::QuasiHermitianMatrix<T>>::value)
461+
if constexpr (std::is_same<MatrixType, chase::matrix::PseudoHermitianMatrix<T>>::value)
453462
{
454463
/* The right eigenvectors are not orthonormal in the QH case, but S-orthonormal.
455464
* Therefore, we S-orthonormalize the locked vectors against the current subspace
@@ -559,7 +568,7 @@ namespace Impl
559568

560569
void RR(chase::Base<T>* ritzv, std::size_t block) override
561570
{
562-
if constexpr (std::is_same<MatrixType, chase::matrix::QuasiHermitianMatrix<T>>::value)
571+
if constexpr (std::is_same<MatrixType, chase::matrix::PseudoHermitianMatrix<T>>::value)
563572
{
564573
chase::linalg::internal::cpu::rayleighRitz_v2(Hmat_,
565574
block,
@@ -590,7 +599,7 @@ namespace Impl
590599
void Sort(chase::Base<T> * ritzv, chase::Base<T> * residLast, chase::Base<T> * resid) override
591600
{
592601

593-
if constexpr (std::is_same<MatrixType, chase::matrix::QuasiHermitianMatrix<T>>::value)
602+
if constexpr (std::is_same<MatrixType, chase::matrix::PseudoHermitianMatrix<T>>::value)
594603
{
595604
/* Sorting all the eigenvalues is probably not necessary if Opt = False */
596605

@@ -673,6 +682,8 @@ namespace Impl
673682
std::size_t nev_; ///< Number of eigenvalues to compute.
674683
std::size_t nex_; ///< Number of extra eigenvalues.
675684
std::size_t nevex_; ///< Total number of eigenvalues (nev + nex).
685+
std::size_t lanczosIter_; ///< Number of Lanczos Iterations.
686+
std::size_t numLanczos_; ///< Number of Runs of Lanczos.
676687
ChaseConfig<T> config_; ///< Configuration object for settings.
677688

678689
MatrixType *Hmat_; ///< Matrix for H.

0 commit comments

Comments
 (0)