def lanczos(t, y, npsi, nel, nmodes, nspfs, npbfs, psistart, psiend, ham, uopips, copips, spfovs, nvecs=5, return_evecs=True): """ """ # thing to store A tensors V = np.zeros(nvecs, np.ndarray) # TODO V[0] = A / norm(nel, A) T = np.zeros((nvecs, nvecs)) # form krylov vectors and tridiagonal matrix for i in range(nvecs - 1): V[i + 1] = cmfeom_coeffs(t, y, npsi, nel, nmodes, nspfs, npbfs, psistart, psiend, ham.huelterms, ham.hcelterms, uopips, copips, spfovs) #V[i+1] = matel(nel,nmodes,nspfs,npbfs,uopips,copips,ham.huelterms, # ham.hcelterms,spfovs,V[i]) # compute alpha # TODO T[i, i] = inner(nel, V[i], V[i + 1]).real if i > 0: V[i + 1] += -T[i, i] * V[i] - T[i - 1, i] * V[i - 1] else: V[i + 1] += -T[i, i] * V[i] # normalize previous vector # TODO nvprev = norm(nel, V[i + 1]) V[i + 1] /= nvprev # compute beta T[i, i + 1] = nvprev T[i + 1, i] = T[i, i + 1] Vtmp = cmfeom_coeffs(t, y, npsi, nel, nmodes, nspfs, npbfs, psistart, psiend, ham.huelterms, ham.hcelterms, uopips, copips, spfovs) # TODO T[-1, -1] = inner(nel, V[-1], Vtmp) #T[-1,-1] = inner(nel,V[-1], matel(nel,nmodes,nspfs,npbfs,uopips,copips, # ham.huelterms,ham.hcelterms,spfovs,V[-1])).real if return_evecs: return T, V else: return T
def arnoldi(A, nel, nmodes, nspfs, npbfs, ham, uopips, copips, spfovs, nvecs=5, return_evecs=True): """ """ # thing to store A tensors V = np.zeros(nvecs, np.ndarray) V[0] = A/norm(nel,A) # form krylov subspace and upper hessenberg matrix T = np.zeros((nvecs,nvecs), dtype=complex) for j in range(nvecs-1): w = matel(nel,nmodes,nspfs,npbfs,uopips,copips,ham.huelterms, ham.hcelterms,spfovs,V[i]) for i in range(j+1): T[i,j] = inner(nel, w, V[i]) w -= T[i,j]*V[i] if j < nvecs-1: T[j+1,j] = norm(nel,w) V[j+1] = w/T[j+1,j] return T , V
def arnoldi(y, ham, uopips, copips, spfovs, nvecs=5, v0=None, return_evecs=True): """ """ # get wavefunction info nel = y.nel nmodes = y.nmodes nspfs = y.nspfs npbfs = y.npbfs spfstart = y.spfstart spfend = y.spfend A = y.A # thing to store A tensors V = np.zeros(nvecs, np.ndarray) V[0] = A / norm(nel, A) # form krylov subspace and upper hessenberg matrix T = np.zeros((nvecs, nvecs), dtype=complex) for j in range(nvecs - 1): w = matel(nel, nmodes, nspfs, npbfs, uopips, copips, ham.huelterms, ham.hcelterms, spfovs, V[j]) for i in range(j + 1): T[i, j] = inner(nel, w, V[i]) w -= T[i, j] * V[i] if j < nvecs - 1: T[j + 1, j] = norm(nel, w) V[j + 1] = w / T[j + 1, j] return T, V
def lanczos(A, nel, nmodes, nspfs, npbfs, ham, uopips, copips, spfovs, nvecs=5, return_evecs=True): """ """ # thing to store A tensors V = np.zeros(nvecs, np.ndarray) V[0] = A/norm(nel,A) T = np.zeros((nvecs,nvecs)) # form krylov vectors and tridiagonal matrix for i in range(nvecs-1): V[i+1] = matel(nel,nmodes,nspfs,npbfs,uopips,copips,ham.huelterms, ham.hcelterms,spfovs,V[i]) #np.set_printoptions(threshold=np.inf) #print(V[i+1]) #raise ValueError # compute alpha T[i,i] = inner(nel,V[i],V[i+1]).real if i>0: V[i+1] += -T[i,i]*V[i] - T[i-1,i]*V[i-1] else: V[i+1] += -T[i,i]*V[i] # normalize previous vector nvprev = norm(nel,V[i+1]) V[i+1] /= nvprev # compute beta T[i,i+1] = nvprev T[i+1,i] = T[i,i+1] Vtmp = matel(nel,nmodes,nspfs,npbfs,uopips,copips,ham.huelterms, ham.hcelterms,spfovs,V[-1]) T[-1,-1] = inner(nel,V[-1], Vtmp).real if return_evecs: return T , V else: return T