From d5ac4fc67fde44bd0c5e02df8e83033f9d716e59 Mon Sep 17 00:00:00 2001 From: Chulwoo Jung Date: Wed, 26 Nov 2025 22:13:27 +0000 Subject: [PATCH] Starting to modified KS --- Grid/algorithms/iterative/KrylovSchur.h | 34 +++++++++++++++++-------- examples/Example_krylov_schur.cc | 26 ++++++++++--------- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/Grid/algorithms/iterative/KrylovSchur.h b/Grid/algorithms/iterative/KrylovSchur.h index d5bf6a20..a83983dc 100644 --- a/Grid/algorithms/iterative/KrylovSchur.h +++ b/Grid/algorithms/iterative/KrylovSchur.h @@ -89,6 +89,14 @@ struct ComplexComparator RitzFilter RF; ComplexComparator (RitzFilter _rf) : RF(_rf) {} bool operator()(std::complex z1, std::complex z2) { + RealD tmp1, tmp2; + tmp1=std::abs(std::imag(z1)); + tmp2=std::abs(std::imag(z2)); +// if ( std::abs(std::real(z1)) <0.76) tmp1 +=4.; +// if ( std::abs(std::real(z2)) <0.76) tmp2 +=4.; + if ( std::abs(std::real(z1)) >2.) tmp1 +=4.; + if ( std::abs(std::real(z2)) >2.) tmp2 +=4.; + switch (RF) { case EvalNormSmall: return std::abs(z1) < std::abs(z2); @@ -103,9 +111,11 @@ struct ComplexComparator case EvalImLarge: return std::imag(z1) > std::imag(z2); case EvalImNormSmall: - return std::abs(std::imag(z1)) < std::abs(std::imag(z2)); + return tmp1 < tmp2; +// return std::abs(std::imag(z1)) < std::abs(std::imag(z2)); case EvalImNormLarge: - return std::abs(std::imag(z1)) > std::abs(std::imag(z2)); + return tmp1 > tmp2; +// return std::abs(std::imag(z1)) > std::abs(std::imag(z2)); default: assert(0); } @@ -224,8 +234,8 @@ class ComplexSchurDecomposition { */ // void schurReorder(int Nk, std::function compare) { int schurReorder(int Nk) { - for (int i = 0; i < Nm; i++) { - for (int k = 0; k <= Nm - 2; k++) { + for (int i = 0; i < Nk; i++) { + for (int k = 0; k <= Nm - 2-i ; k++) { int idx = Nm - 2 - k; // TODO use RitzFilter enum here // if (std::abs(S(idx, idx)) < std::abs(S(idx+1, idx+1))) { // sort by largest modulus of eigenvalue @@ -235,10 +245,10 @@ class ComplexSchurDecomposition { } } } - int temp=1; - for (int i = 0; i < Nm-1; i++) { + int temp=Nk/2; + for (int i = temp; i < Nk; i++) { std::cout << GridLogMessage << "S " << i << " "<= Nstop || i == MaxIter - 1) { std::cout << GridLogMessage << "Converged with " << Nconv << " / " << Nstop << " eigenvectors on iteration " @@ -469,7 +482,6 @@ class KrylovSchur { u = Zero(); } else { std::cout << GridLogMessage << "start= " < src(Nu,FGrid); for(int i=0;i