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')
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()
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
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(
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')
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))]
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}')
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)
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')