Esempio n. 1
0
mixer = sisl.mixing.PulayMixer(0.7, history=7)

for u in np.arange(5, 0, -0.25):
    # We approach the solutions for different U values
    H.U = u
    mixer.clear()

    # AFM case first
    success = H.read_density(
        'clar-goblet.nc')  # Try reading, if we already have density on file
    if not success:
        H.n = n_AFM.copy()

    dn = H.converge(density.calc_n_insulator, tol=1e-10, mixer=mixer)
    eAFM = H.Etot
    H.write_density('clar-goblet.nc')
    n_AFM = H.n.copy()

    if u == 3.5:
        p = plot.SpinPolarization(H, colorbar=True, vmax=0.4, vmin=-0.4)
        p.savefig('spin_pol_U%i_AFM.pdf' % (H.U * 1000))

    # Now FM case
    H.q[0] += 1  # change to two more up-electrons than down
    H.q[1] -= 1
    success = H.read_density(
        'clar-goblet.nc')  # Try reading, if we already have density on file
    if not success:
        H.random_density()
        H.set_polarization(up=[6, 28])
    mixer.clear()
Esempio n. 2
0
import sisl
import numpy as np

# Build sisl Geometry object only for a subset of atoms
molecule = sisl.get_sile('mol-ref/mol-ref.XV').read_geometry().sub([2,3,5])
molecule.sc.set_nsc([1, 1, 1])

# Build HubbardHamiltonian object
Hsp2 = sp2(molecule)
H = HubbardHamiltonian(Hsp2, U=3.5)
# Generate simple density
H.n = np.ones((2, H.sites))*0.5

print(f'1. Write and read densities under group {H.get_hash()} using the HubbardHamiltonian class\n')
# Write density in file
H.write_density('mol-ref/test.HU.nc', group=H.get_hash(), mode='w')
# Read density using the HubbardHamiltonian class
H.read_density('mol-ref/test.HU.nc', group=H.get_hash())

# Write another density in file under another group
print(f'2. Write another densities under another group\n')
H.n *= 2
H.write_density('mol-ref/test.HU.nc', group='group2', mode='a')


print('3. Read density, U and kT using ncsile from all groups')
fh = sisl.get_sile('mol-ref/test.HU.nc', mode='r')
for g in fh.groups:
    print('group: ', g)
    print('n:', fh.read_density(group=g))
    print('U:', fh.read_U(group=g))
Esempio n. 3
0
# 3NN tight-binding model
Hsp2 = sp2(mol, t1=2.7, t2=0.2, t3=.18)

H = HubbardHamiltonian(Hsp2)

# Plot the single-particle TB (U = 0.0) wavefunction (SO) for Type 1
H.U = 0.0
ev, evec = H.eigh(eigvals_only=False, spin=0)
N = H.q[0]
midgap = H.find_midgap()
ev -= midgap
f = 3800
v = evec[:, int(round(N)) - 1]
j = np.argmax(abs(v))
wf = f * v**2 * np.sign(v[j]) * np.sign(v)
p = plot.Wavefunction(H, wf)
p.set_title(r'$E = %.3f$ eV' % (ev[int(round(N)) - 1]))
p.savefig('Fig3_SOMO.pdf')

# Plot MFH spin polarization for U = 3.5 eV
H.U = 3.5
success = H.read_density(
    'fig3_type1.nc')  # Try reading, if we already have density on file
if not success:
    H.set_polarization([23])
mixer = sisl.mixing.PulayMixer(0.7, history=7)
H.converge(density.calc_n_insulator, mixer=mixer)
H.write_density('fig3_type1.nc')
p = plot.SpinPolarization(H, ext_geom=mol, vmax=0.20)
p.savefig('fig3_pol.pdf')
Esempio n. 4
0
mixer = sisl.mixing.PulayMixer(0.7, history=7)

for u in np.linspace(0.0, 4.0, 5):
    # We approach the solutions from above, starting at U=4eV
    H.U = 4.0 - u

    # AFM case first
    success = H.read_density(
        mol_file + '.nc')  # Try reading, if we already have density on file
    if not success:
        H.random_density()
        H.set_polarization([1, 6, 15])  # polarize lower zigzag edge
    mixer.clear()
    dn = H.converge(density.calc_n_insulator, mixer=mixer)
    eAFM = H.Etot
    H.write_density(mol_file + '.nc')

    p = plot.SpinPolarization(H, colorbar=True, vmax=0.4, vmin=-0.4)
    p.annotate()
    p.savefig('%s-spin-U%i.pdf' % (mol_file, H.U * 1000))

    # Now FM case
    H.q[0] += 1  # change to two more up-electrons than down
    H.q[1] -= 1
    try:
        H.read_density(
            mol_file +
            '.nc')  # Try reading, if we already have density on file
    except:
        H.random_density()
    mixer.clear()
Esempio n. 5
0
print('   dn, Etot: ', dn, etot, '\n')

print('3. Run one iteration with calc_n')
d = H.iterate(density.calc_n, mixer=sisl.mixing.LinearMixer())
e = H.Etot
print('   dn, dEtot: ', d - dn, e - etot, '\n')

# Write fdf-block
print('\n4. Write initspin to fdf-block')
H.write_initspin('test.fdf', mode='w')

import random
print('5. Run one iteration for spin-degenerate calculation')
Hsp2 = sp2(molecule, spin='unpolarized')
H = HubbardHamiltonian(Hsp2, U=3.5, kT=0.025)
n = random.seed(10)
dn = H.iterate(density.calc_n)
print('   dn, Etot: ', dn, H.Etot, '\n')

print('6. Run one iteration for spin-degenerate calculation with NEGF')
Hsp2 = sp2(molecule, spin='unpolarized')
H = HubbardHamiltonian(Hsp2, U=3.5, kT=0.025)
n = random.seed(10)
negf = NEGF(H, [],[])
dn = H.iterate(negf.calc_n_open, qtol=1e-7)
print('   dn, Etot: ', dn, H.Etot, '\n')

# Write new data structure
print('7. Write data in ncfile')
H.write_density('mol-ref/test.nc', mode='w')
Esempio n. 6
0
mixer = sisl.mixing.PulayMixer(0.6, history=7)

# Hubbard Hamiltonian of elecs
MFH_elec = HubbardHamiltonian(H_elec, U=U, nkpt=[102, 1, 1], kT=kT)
# Initial densities
success = MFH_elec.read_density('elec_density.nc')
if not success:
    # If no densities saved, start with random densities with maximized polarization at the edges
    MFH_elec.random_density()
    MFH_elec.set_polarization([0], dn=[9])

# Converge Electrode Hamiltonians
dn = MFH_elec.converge(density.calc_n, mixer=mixer)
# Write also densities for future calculations
MFH_elec.write_density('elec_density.nc')
# Plot spin polarization of electrodes
p = plot.SpinPolarization(MFH_elec, colorbar=True)
p.savefig('spin_elecs.pdf')

# Find Fermi level of reservoirs and write to netcdf file
Ef_elecs = MFH_elec.fermi_level(q=MFH_elec.q)
MFH_elec.H.shift(-Ef_elecs)
MFH_elec.H.write('MFH_elec.nc')

# Build central region TB Hamiltonian
HC = H_elec.tile(16, axis=0)
HC = HC.remove([67, 68, 69, 72, 73, 74, 77, 78, 79, 82, 83, 84, 87, 88, 89])
HC.set_nsc([1, 1, 1])
HC.geometry.write('device.xyz')
Esempio n. 7
0
# FM and AFM solutions
f = open('FM-AFM.dat', 'w')

mixer = sisl.mixing.PulayMixer(0.7, history=7)
H.set_polarization([77], dn=[23])
for u in np.linspace(0.0, 1.4, 15):
    # We approach the solutions from above, starting at U=4eV
    H.U = 4.4 - u
    # AFM case first
    success = H.read_density(
        'fig_S15.nc')  # Try reading, if we already have density on file

    mixer.clear()
    dn = H.converge(density.calc_n_insulator, mixer=mixer, tol=1e-6)
    eAFM = H.Etot
    H.write_density('fig_S15.nc')

    # Now FM case
    H.q[0] += 1  # change to two more up-electrons than down
    H.q[1] -= 1
    success = H.read_density(
        'fig_S15.nc')  # Try reading, if we already have density on file

    mixer.clear()
    dn = H.converge(density.calc_n_insulator, mixer=mixer, tol=1e-6)
    eFM = H.Etot
    H.write_density('fig_S15.nc')

    # Revert the imbalance for next loop
    H.q[0] -= 1
    H.q[1] += 1
Esempio n. 8
0
# Create mixer
mixer = sisl.mixing.PulayMixer(0.7, history=12)

for u in [0.0, 3.5]:
    H.U = u
    if H.U == 0:
        lab = 'Fig_S12'
    else:
        lab = 'Fig_S13'
        success = H.read_density('fig_S11-S13.nc') # Try reading, if we already have density on file
        if not success:
            H.set_polarization([77], dn=[23])
        mixer.clear()
        H.converge(density.calc_n_insulator, mixer=mixer)
        H.write_density('fig_S11-S13.nc')

    # Plot Eigenspectrum
    p = plot.Spectrum(H, ymax=0.12)
    p.set_title(r'3NN, $U=%.2f$ eV'%H.U)
    p.savefig('Fig_S11_eigenspectrum_U%i.pdf'%(H.U*100))

    # Plot H**O and LUMO level wavefunctions for up- and down-electrons
    spin = ['up', 'dn']
    N = H.q
    midgap = H.find_midgap()
    for i in range(2):
        ev, evec = H.eigh(eigvals_only=False, spin=i)
        ev -= midgap

        f = 1