Exemple #1
0
def test_quick():
    molecule = sisl.geom.agnr(7).tile(3, 0)
    molecule.set_nsc([1, 1, 1])
    Hsp2 = sp2(molecule)
    H = hh.HubbardHamiltonian(Hsp2, U=3.5)
    H.random_density()
    dn = H.iterate(density.calc_n_insulator, mixer=sisl.mixing.LinearMixer())
    H.write_density('test.nc')
    H.write_initspin('test.fdf')
Exemple #2
0
from hubbard import HubbardHamiltonian, density, sp2, plot
import sys
import numpy as np
import sisl

# Build sisl Geometry object
mol = sisl.get_sile('clar-goblet.xyz').read_geometry()
mol.sc.set_nsc([1, 1, 1])
mol = mol.move(-mol.center(what='xyz'))

# 3NN tight-binding model
Hsp2 = sp2(mol, t1=2.7, t2=0.2, t3=.18, dim=2)
H = HubbardHamiltonian(Hsp2)
H.random_density()
H.set_polarization(up=[6], dn=[28])
n_AFM = H.n

f = open('FM-AFM.dat', 'w')

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()
Exemple #3
0
from hubbard import HubbardHamiltonian, sp2, density, plot
import numpy as np
import sisl

# Test all plot functionalities of hubbard module
# using a reference molecule (already converged)

# Build sisl Geometry object
molecule = sisl.get_sile('mol-ref/mol-ref.XV').read_geometry()
molecule.sc.set_nsc([1, 1, 1])
molecule = molecule.move(-molecule.center(what='xyz')).rotate(220, [0, 0, 1])
H_mol = sp2(molecule)

p = plot.BondHoppings(H_mol, annotate=False, off_diagonal_only=False, cmap_e='winter')
p.legend()
p.savefig('bondHoppings.pdf')

H = HubbardHamiltonian(H_mol, U=3.5)
H.read_density('mol-ref/density.nc')
H.iterate(density.calc_n_insulator)

p = plot.Charge(H, ext_geom=molecule, colorbar=True)
p.savefig('chg.pdf')

p = plot.ChargeDifference(H, ext_geom=molecule, colorbar=True)
p.savefig('chgdiff.pdf')

p = plot.SpinPolarization(H, ext_geom=molecule, colorbar=True, vmax=0.2)
p.annotate()
p.savefig('pol.pdf')
import sisl
from sisl import geom, Atom
import numpy as np
import os
from hubbard import HubbardHamiltonian, sp2, density, plot

W = 7
bond = 1.42

# single-orbital
g = geom.zgnr(W)
TBHam = sp2(g, t1=2.7, t2=0, t3=0)
HH = HubbardHamiltonian(TBHam, U=3, nkpt=[100, 1, 1])
HH.set_polarization([0], dn=[-1])
HH.converge(density.calc_n, print_info=True, tol=1e-10, steps=3)
n_single = HH.n * 1

# Start bands-plot, the single-orbital case will be plotted in black
p = plot.Bandstructure(HH, c='k')


class OrbitalU(sisl.Orbital):
    __slots__ = ('U', )

    def __init__(self, *args, U=0., **kwargs):
        super().__init__(*args, **kwargs)
        self.U = U

    def copy(self, *args, **kwargs):
        copy = super().copy(*args, **kwargs)
        copy.U = self.U
Exemple #5
0
from hubbard import HubbardHamiltonian, plot, density, sp2
import sys
import numpy as np
import sisl

# Build sisl Geometry object
mol = sisl.get_sile('type1.xyz').read_geometry()
mol.sc.set_nsc([1, 1, 1])
mol = mol.move(-mol.center(what='xyz')).rotate(220, [0, 0, 1])
# 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(
Exemple #6
0
from hubbard import HubbardHamiltonian, sp2, ncsile
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))
from hubbard import HubbardHamiltonian, sp2, density, NEGF
import sisl

# Build sisl Geometry object
molecule = sisl.get_sile('mol-ref/mol-ref.XV').read_geometry()
molecule.sc.set_nsc([1, 1, 1])

print('1. Run one iteration with calc_n_insulator')
Hsp2 = sp2(molecule)
H = HubbardHamiltonian(Hsp2, U=3.5)
H.random_density()
dn = H.iterate(density.calc_n_insulator, mixer=sisl.mixing.LinearMixer())
print('   dn, Etot: ', dn, H.Etot, '\n')

print('2. Run one iteration with data from ncfile')
H.read_density('mol-ref/density.nc', group='3abe772')
dn = H.iterate(density.calc_n_insulator, mixer=sisl.mixing.LinearMixer())
etot = 1 * H.Etot
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')
Exemple #8
0
from hubbard import HubbardHamiltonian, plot, sp2
import sys
import numpy as np
import sisl

# Build sisl Geometry object
mol = sisl.get_sile('junction-2-2.XV').read_geometry()
mol.sc.set_nsc([1, 1, 1])
mol = mol.move(-mol.center(what='xyz')).rotate(220, [0, 0, 1])
Hsp2 = sp2(mol)

# 3NN tight-binding model
H = HubbardHamiltonian(Hsp2, U=0)

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

# Plot H**O and LUMO level wavefunctions for up- and down-electrons for U=3.5 eV
spin = ['up', 'dn']
N = H.q
for i in range(1):
    ev, evec = H.eigh(eigvals_only=False, spin=i)
# Use midgap as energy reference
midgap = H.find_midgap()
ev -= midgap
f = 1
v = evec[:, int(round(N[i])) - 1]
j = np.argmax(abs(v))
wf = f * v**2 * np.sign(v[j]) * np.sign(v)
import sisl
import numpy as np
import sys
import matplotlib.pyplot as plt
from hubbard import HubbardHamiltonian, density, sp2, NEGF

# Set U and kT for the whole calculation
U = 3.
kT = 0.025

# Build zigzag GNR
ZGNR = sisl.geom.zgnr(2)

# and 3NN TB Hamiltonian
H_elec = sp2(ZGNR, t1=2.7, t2=0.2, t3=0.18)

# Hubbard Hamiltonian of elecs
MFH_elec = HubbardHamiltonian(H_elec, U=U, nkpt=[102, 1, 1], kT=kT)

# Start with random densities
MFH_elec.random_density()
# Converge Electrode Hamiltonians
dn = MFH_elec.converge(density.calc_n, mixer=sisl.mixing.PulayMixer(weight=.7, history=7), tol=1e-10)

# Central region is a repetition of the electrodes without PBC
HC = H_elec.tile(3, axis=0)
HC.set_nsc([1, 1, 1])

# Map electrodes in the device region
elec_indx = [range(len(H_elec)), range(len(HC.H)-len(H_elec), len(HC.H))]
Exemple #10
0
from hubbard import HubbardHamiltonian, sp2
import numpy as np
import sisl

for w in range(1, 25, 2):
    g = sisl.geom.agnr(w)
    H0 = sp2(g)
    H = HubbardHamiltonian(H0, U=0)
    zak = H.get_Zak_phase()
    print(f'width={w:3}, zak={zak:7.3f}')

# SSH model, topological cell
g = sisl.Geometry([[0, 0, 0], [0, 1.65, 0]],
                  sisl.Atom(6, 1.001),
                  sc=[10, 3, 10])
g.set_nsc([1, 3, 1])
H0 = sp2(g)
H = HubbardHamiltonian(H0, U=0)
zak = H.get_Zak_phase(axis=1)
print(f'SSH topo : zak={zak:7.3f}')

# SSH model, trivial cell
g = sisl.Geometry([[0, 0, 0], [0, 1.42, 0]],
                  sisl.Atom(6, 1.001),
                  sc=[10, 3, 10])
g.set_nsc([1, 3, 1])
H0 = sp2(g)
H = HubbardHamiltonian(H0, U=0)
zak = H.get_Zak_phase(axis=1)
print(f'SSH triv : zak={zak:7.3f}')
Exemple #11
0
import hubbard.hamiltonian as hh
import hubbard.plot as plot
import hubbard.sp2 as sp2
import sisl

mol = sisl.get_sile('benzene.xyz').read_geometry()

# 1NN tight-binding model
geom = sp2(mol, t1=2.7, t2=0., t3=0.)

H = hh.HubbardHamiltonian(geom, U=0.)

ev, evec = H.eigh(eigvals_only=False, spin=0)

print('Eigenvalues:')
print(ev)

# Plot wavefunctions
for i in range(6):
    p = plot.Wavefunction(H, 500 * evec[:, i], figsize=(10, 3))
    p.set_title('State %i' % i)
    p.annotate()
    p.savefig('state%i.pdf' % i)

bo = H.get_bond_order(format='csr')

print('Bond order:')
print(bo)
Exemple #12
0
import sisl
from hubbard import HubbardHamiltonian, sp2, density, plot
import numpy as np
import os

""" Script to benchmark the Generalized TB method of Ref. Phys. Rev. B 81, 245402 (2010) """

# Create geometry of the periodic (along x-axis) ribbon
agnr = sisl.geom.agnr(14)
zgnr = sisl.geom.zgnr(16)

lab = ['14-AGNR', '16-ZGNR']
mixer = sisl.mixing.PulayMixer(0.7, history=7)
for i, geom in enumerate([agnr, zgnr]):
    # Build TB Hamiltonian, one can use the parameters from the Ref.
    H0 = sp2(geom, t1=2.7, t2=0.2, t3=0.18, s1=0, s2=0, s3=0)

    # Find self-consistent solution with MFH
    H = HubbardHamiltonian(H0, U=2, nkpt=[100, 1, 1])
    # Start with random densities
    H.random_density()
    mixer.clear()
    dn = H.converge(density.calc_n, mixer=mixer, print_info=True)

    # Plot banstructure of Hubbard Hamiltonian
    p = plot.Bandstructure(H, ymax=3)
    p.savefig('%s_bands.pdf'%(lab[i]))
    print('\n')