Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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