Exemplo n.º 1
0
def trans_cal():
    from mpi4py import MPI
    from aces.App import App
    m = App().m
    comm = MPI.COMM_WORLD
    rank = comm.Get_rank()
    size = comm.Get_size()
    print("my rank is: %d" % rank)
    if rank == 0:
        print("Reading force constants from cache")
    d = np.load('fcbin.npz')
    fccenter, fcleft, fcright = d['fccenter'], d['fcleft'], d['fcright']

    #fccenter,fcleft,fcright = comm.bcast((fccenter,fcleft,fcright) if rank == 0 else None, root=0)
    print rank, len(fccenter)
    total = 400.0
    fmax = m.fmax
    dm = fmax / total
    intval = dm * size

    omega = np.arange(dm * rank, fmax, intval)  # THz
    factor = 1e12**2 * 1e-20 * 1e-3 / 1.6e-19 / 6.23e23
    energies = (omega * 2.0 * np.pi)**2 * factor
    mkdir('tmp')
    from ase.transport.calculators import TransportCalculator
    # important trick!
    # if eta is too small , there would be infinite value in transmission
    # while if eta is too large, the transmission will be curve.
    #
    if m.eta is None:
        eta = np.abs(fccenter).max() * 1e-5
        eta1 = np.abs(fcleft).max() * 1e-4
        eta2 = np.abs(fcright).max() * 1e-4
    else:
        if hasattr(m.eta, 'extend'):
            eta, eta1, eta2 = m.eta
        else:
            eta, eta1, eta2 = m.eta, m.eta, m.eta
    tcalc = TransportCalculator(
        h=fccenter,
        h1=fcleft,
        h2=fcright,
        energies=energies,
        dos=True,
        logfile='tmp/negf.log' +
        str(rank),
        eta=eta,
        eta1=eta1,
        eta2=eta2)
    if rank == 0:
        print('Calculate Transmission')
    trans = tcalc.get_transmission()
    if rank == 0:
        print('Calculate Dos')
    dos = tcalc.get_dos() * omega
    # np.savez('tmp/result%s.npz'%(rank),x=omega,trans=trans,dos=dos)

    to_txt(['omega', 'trans', 'dos'], np.c_[
           omega, trans, dos], 'tmp/result.txt' + str(rank))
Exemplo n.º 2
0
def trans_cal():
    from mpi4py import MPI
    from aces.App import App
    m = App().m
    comm = MPI.COMM_WORLD
    rank = comm.Get_rank()
    size = comm.Get_size()
    print("my rank is: %d" % rank)
    if rank == 0:
        print("Reading force constants from cache")
    d = np.load('fcbin.npz')
    fccenter, fcleft, fcright = d['fccenter'], d['fcleft'], d['fcright']

    #fccenter,fcleft,fcright = comm.bcast((fccenter,fcleft,fcright) if rank == 0 else None, root=0)
    print rank, len(fccenter)
    total = 400.0
    fmax = m.fmax
    dm = fmax / total
    intval = dm * size

    omega = np.arange(dm * rank, fmax, intval)  # THz
    factor = 1e12**2 * 1e-20 * 1e-3 / 1.6e-19 / 6.23e23
    energies = (omega * 2.0 * np.pi)**2 * factor
    mkdir('tmp')
    from ase.transport.calculators import TransportCalculator
    # important trick!
    # if eta is too small , there would be infinite value in transmission
    # while if eta is too large, the transmission will be curve.
    #
    if m.eta is None:
        eta = np.abs(fccenter).max() * 1e-5
        eta1 = np.abs(fcleft).max() * 1e-4
        eta2 = np.abs(fcright).max() * 1e-4
    else:
        if hasattr(m.eta, 'extend'):
            eta, eta1, eta2 = m.eta
        else:
            eta, eta1, eta2 = m.eta, m.eta, m.eta
    tcalc = TransportCalculator(h=fccenter,
                                h1=fcleft,
                                h2=fcright,
                                energies=energies,
                                dos=True,
                                logfile='tmp/negf.log' + str(rank),
                                eta=eta,
                                eta1=eta1,
                                eta2=eta2)
    if rank == 0:
        print('Calculate Transmission')
    trans = tcalc.get_transmission()
    if rank == 0:
        print('Calculate Dos')
    dos = tcalc.get_dos() * omega
    # np.savez('tmp/result%s.npz'%(rank),x=omega,trans=trans,dos=dos)

    to_txt(['omega', 'trans', 'dos'], np.c_[omega, trans, dos],
           'tmp/result.txt' + str(rank))
Exemplo n.º 3
0
 def test(self):
     dm = .1
     omega = np.arange(dm, 60, dm)  #THz
     factor = 1e12**2 * 1e-20 * 1e-3 / 1.6e-19 / 6.23e23
     energies = (omega * 2.0 * np.pi)**2 * factor
     #energies=np.arange(0,10,.01)
     h = -np.array((-2, 1, 0, 1, -2, 1, 0, 1, -2)).reshape((3, 3))
     h1 = -np.array((-2, 1, 1, -2)).reshape((2, 2))
     #x=1.0/np.sqrt(2)
     #h1=h=-np.array((-2,x,0,0,x,-1,x,0,0,x,-2,x,0,0,x,-1)).reshape((4,4))
     #energies = np.arange(-3, 3, 0.1)
     calc = TransportCalculator(h=h, h1=h1, energies=energies, dos=True)
     T = calc.get_transmission()
     #print T
     dos = calc.get_dos() * omega
     plot([omega, 'Frequency (THz)'], [T, 'Transmission'],
          'test_green_transmission.png')
     plot([omega, 'Frequency (THz)'], [dos, 'Phonon Density of State'],
          'test_green_dos.png')
Exemplo n.º 4
0
    def generate(self):
        self.m.xp = 1
        leadm = self.preLead()
        self.phonopy('lead', leadm)
        centerm = self.preCenter()
        self.phonopy('center', centerm)

        fccenter, fclead = self.collect()
        dm = .5
        omega = np.arange(dm, 60, dm)  #THz
        factor = 1e12**2 * 1e-20 * 1e-3 / 1.6e-19 / 6.23e23
        energies = (omega * 2.0 * np.pi)**2 * factor
        tcalc = TransportCalculator(h=fccenter,
                                    h1=fclead,
                                    h2=fclead,
                                    energies=energies,
                                    logfile='negf.log',
                                    dos=True)
        print 'Calculate Transmission'
        trans = tcalc.get_transmission()
        print 'Calculate Dos'
        dos = tcalc.get_dos() * omega
        print 'Calculate Thermal Conductance'
        self.post()
Exemplo n.º 5
0
def test_transport_calculator():
    H_lead = np.zeros([4, 4])

    # On-site energies are zero
    for i in range(4):
        H_lead[i, i] = 0.0

    # Nearest neighbor hopping is -1.0
    for i in range(3):
        H_lead[i, i + 1] = -1.0
        H_lead[i + 1, i] = -1.0

    # Next-nearest neighbor hopping is 0.2
    for i in range(2):
        H_lead[i, i + 2] = 0.2
        H_lead[i + 2, i] = 0.2

    H_scat = np.zeros([6, 6])
    # Principal layers on either side of S
    H_scat[:2, :2] = H_lead[:2, :2]
    H_scat[-2:, -2:] = H_lead[:2, :2]

    # Scattering region
    H_scat[2, 2] = 0.0
    H_scat[3, 3] = 0.0
    H_scat[2, 3] = -0.8
    H_scat[3, 2] = -0.8

    # External coupling
    H_scat[1, 2] = 0.2
    H_scat[2, 1] = 0.2
    H_scat[3, 4] = 0.2
    H_scat[4, 3] = 0.2

    energies = np.arange(-3, 3, 0.02)
    tcalc = TransportCalculator(h=H_scat,
                                h1=H_lead,
                                eta=0.02,
                                energies=energies)

    T = tcalc.get_transmission()
    tcalc.set(pdos=[2, 3])
    pdos = tcalc.get_pdos()

    tcalc.set(dos=True)
    dos = tcalc.get_dos()

    write('T.dat', tcalc.energies, T)
    write('pdos0.dat', tcalc.energies, pdos[0])
    write('pdos1.dat', tcalc.energies, pdos[1])

    #subdiagonalize
    h_rot, s_rot, eps, u = tcalc.subdiagonalize_bfs([2, 3], apply=True)
    T_rot = tcalc.get_transmission()
    dos_rot = tcalc.get_dos()
    pdos_rot = tcalc.get_pdos()

    write('T_rot.dat', tcalc.energies, T_rot)
    write('pdos0_rot.dat', tcalc.energies, pdos_rot[0])
    write('pdos1_rot.dat', tcalc.energies, pdos_rot[1])

    print('Subspace eigenvalues:', eps)
    assert sum(abs(eps - (-0.8, 0.8))) < 2.0e-15, 'Subdiagonalization. error'
    print('Max deviation of T after the rotation:', np.abs(T - T_rot).max())
    assert max(abs(T - T_rot)) < 2.0e-15, 'Subdiagonalization. error'

    #remove coupling
    h_cut, s_cut = tcalc.cutcoupling_bfs([2], apply=True)
    T_cut = tcalc.get_transmission()
    dos_cut = tcalc.get_dos()
    pdos_cut = tcalc.get_pdos()

    write('T_cut.dat', tcalc.energies, T_cut)
    write('pdos0_cut.dat', tcalc.energies, pdos_cut[0])
    write('pdos1_cut.dat', tcalc.energies, pdos_cut[1])
Exemplo n.º 6
0
# External coupling
H_scat[1, 2] = 0.2
H_scat[2, 1] = 0.2
H_scat[3, 4] = 0.2
H_scat[4, 3] = 0.2

energies = np.arange(-3, 3, 0.02)
tcalc = TransportCalculator(h=H_scat, h1=H_lead, eta=0.02, energies=energies)

T = tcalc.get_transmission()
tcalc.set(pdos=[2, 3])
pdos = tcalc.get_pdos()

tcalc.set(dos=True)
dos = tcalc.get_dos()

write('T.dat', tcalc.energies, T)
write('pdos0.dat', tcalc.energies, pdos[0])
write('pdos1.dat', tcalc.energies, pdos[1])

#subdiagonalize
h_rot, s_rot, eps, u = tcalc.subdiagonalize_bfs([2, 3], apply=True)
T_rot = tcalc.get_transmission()
dos_rot = tcalc.get_dos()
pdos_rot = tcalc.get_pdos()

write('T_rot.dat', tcalc.energies, T_rot)
write('pdos0_rot.dat', tcalc.energies, pdos_rot[0])
write('pdos1_rot.dat', tcalc.energies, pdos_rot[1])
H_scat[2,1] = 0.2
H_scat[3,4] = 0.2
H_scat[4,3] = 0.2

energies = np.arange(-3,3,0.02)
tcalc = TransportCalculator(h=H_scat,
                            h1=H_lead,
                            h2=H_lead,
                            energies=energies)

T = tcalc.get_transmission()
tcalc.set(pdos=[2, 3])
pdos = tcalc.get_pdos()

tcalc.set(dos=True)
dos = tcalc.get_dos()

write('T.dat',tcalc.energies,T)
write('pdos0.dat', tcalc.energies,pdos[0])
write('pdos1.dat', tcalc.energies,pdos[1])

#subdiagonalize
h_rot, s_rot, eps, u = tcalc.subdiagonalize_bfs([2, 3])
tcalc.set(h=h_rot,s=s_rot)
T_rot = tcalc.get_transmission()
dos_rot = tcalc.get_dos()
pdos_rot = tcalc.get_pdos()

write('T_rot.dat', tcalc.energies,T_rot)
write('pdos0_rot.dat', tcalc.energies, pdos_rot[0])
write('pdos1_rot.dat', tcalc.energies, pdos_rot[1])