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()
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))
# 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')
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()
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')
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')
# 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
# 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