@@ -186,10 +186,14 @@ function _spectrum(
186186 Ivec = SparseVector (D^ 2 , [1 + n * (D + 1 ) for n in 0 : (D- 1 )], ones (cT, D)) # same as vec(system_identity_matrix)
187187 wₖ = spre (A). data' * vT (Ivec)
188188
189- # Store the norm of the Green's function before renormalizing |v₁> and <w₁|
190- gfNorm = abs (dot (wₖ, vₖ))
191- vₖ ./= sqrt (gfNorm)
192- wₖ ./= sqrt (gfNorm)
189+ # Store the normalization factor for the Green's function before renormalizing |v₁> and <w₁|
190+ gfNorm = dot (wₖ, vₖ)
191+ if gfNorm ≈ 0.0
192+ throw (AssertionError (" ⟨w₀|v₀⟩ = 0, please check your A and B operators." ))
193+ end
194+ scalingF = sqrt (abs (gfNorm))
195+ vₖ ./= scalingF
196+ wₖ ./= conj (gfNorm/ scalingF)
193197
194198 # Handle input frequency range
195199 ωList = vT (convert (Vector{fT}, ωlist)) # Make sure they're real frequencies and potentially on GPU
@@ -203,6 +207,7 @@ function _spectrum(
203207 αₖ = cT (0 )
204208 βₖ = cT (- 1 )
205209 δₖ = fT (+ 1 )
210+ βₖδₖ = βₖ * δₖ
206211
207212 # Current and up to second-to-last A and B Euler sequences
208213 A₋₂ = vT (ones (cT, Length))
@@ -232,8 +237,8 @@ function _spectrum(
232237 αₖ = dot (w₊₁, vₖ)
233238
234239 # Update A(k), B(k) and continuous fraction; normalization avoids overflow
235- Aₖ .= (- 1im .* ωList .+ αₖ) .* A₋₁ .- (βₖ * δₖ) .* A₋₂
236- Bₖ .= (- 1im .* ωList .+ αₖ) .* B₋₁ .- (βₖ * δₖ) .* B₋₂
240+ Aₖ .= (- 1im .* ωList .+ αₖ) .* A₋₁ .- βₖδₖ .* A₋₂
241+ Bₖ .= (- 1im .* ωList .+ αₖ) .* B₋₁ .- βₖδₖ .* B₋₂
237242 lanczosFactor₋₁ .= lanczosFactor
238243 lanczosFactor .= Aₖ ./ Bₖ
239244
@@ -268,9 +273,16 @@ function _spectrum(
268273 wₖ, w₊₁ = w₊₁, wₖ
269274
270275 # k-th off-diagonal elements
271- buf = dot (wₖ, vₖ)
272- δₖ = sqrt (abs (buf))
273- βₖ = buf / δₖ
276+ βₖδₖ = dot (wₖ, vₖ)
277+ if βₖδₖ ≈ 0.0
278+ if solver. verbose > 0
279+ @warn " spectrum(): solver::Lanczos experienced orthogonality breakdown after $(k) iterations"
280+ @warn " spectrum(): βₖδₖ = $(βₖδₖ) "
281+ end
282+ break
283+ end
284+ δₖ = sqrt (abs (βₖδₖ))
285+ βₖ = βₖδₖ / δₖ
274286
275287 # Normalize (k+1)-th left/right vectors
276288 vₖ ./= δₖ
0 commit comments