Skip to content
Snippets Groups Projects
Forked from kwant / kwant
281 commits behind the upstream repository.
superconductor.py.diff 5.35 KiB
@@ -1,132 +1,141 @@
 # Tutorial 2.6. "Superconductors": orbitals, conservation laws and symmetries
 # ===========================================================================
 #
 # Physics background
 # ------------------
 # - conductance of a NS-junction (Andreev reflection, superconducting gap)
 #
 # Kwant features highlighted
 # --------------------------
 # - Implementing electron and hole ("orbital") degrees of freedom
 #   using conservation laws.
 # - Use of discrete symmetries to relate scattering states.
 
+import _defs
 import kwant
 
 import tinyarray
 import numpy as np
 
 # For plotting
 from matplotlib import pyplot
+from contextlib import redirect_stdout
 
 tau_x = tinyarray.array([[0, 1], [1, 0]])
 tau_y = tinyarray.array([[0, -1j], [1j, 0]])
 tau_z = tinyarray.array([[1, 0], [0, -1]])
 
 #HIDDEN_BEGIN_nbvn
 def make_system(a=1, W=10, L=10, barrier=1.5, barrierpos=(3, 4),
                 mu=0.4, Delta=0.1, Deltapos=4, t=1.0):
     # Start with an empty tight-binding system. On each site, there
     # are now electron and hole orbitals, so we must specify the
     # number of orbitals per site. The orbital structure is the same
     # as in the Hamiltonian.
     lat = kwant.lattice.square(norbs=2)
     syst = kwant.Builder()
 
     #### Define the scattering region. ####
     # The superconducting order parameter couples electron and hole orbitals
     # on each site, and hence enters as an onsite potential.
     # The pairing is only included beyond the point 'Deltapos' in the scattering region.
     syst[(lat(x, y) for x in range(Deltapos) for y in range(W))] = (4 * t - mu) * tau_z
     syst[(lat(x, y) for x in range(Deltapos, L) for y in range(W))] = (4 * t - mu) * tau_z + Delta * tau_x
 
     # The tunnel barrier
     syst[(lat(x, y) for x in range(barrierpos[0], barrierpos[1])
          for y in range(W))] = (4 * t + barrier - mu) * tau_z
 
     # Hoppings
     syst[lat.neighbors()] = -t * tau_z
 #HIDDEN_END_nbvn
 #HIDDEN_BEGIN_ttth
     #### Define the leads. ####
     # Left lead - normal, so the order parameter is zero.
     sym_left = kwant.TranslationalSymmetry((-a, 0))
     # Specify the conservation law used to treat electrons and holes separately.
     # We only do this in the left lead, where the pairing is zero.
     lead0 = kwant.Builder(sym_left, conservation_law=-tau_z, particle_hole=tau_y)
     lead0[(lat(0, j) for j in range(W))] = (4 * t - mu) * tau_z
     lead0[lat.neighbors()] = -t * tau_z
 #HIDDEN_END_ttth
 #HIDDEN_BEGIN_zuuw
     # Right lead - superconducting, so the order parameter is included.
     sym_right = kwant.TranslationalSymmetry((a, 0))
     lead1 = kwant.Builder(sym_right)
     lead1[(lat(0, j) for j in range(W))] = (4 * t - mu) * tau_z + Delta * tau_x
     lead1[lat.neighbors()] = -t * tau_z
 
     #### Attach the leads and return the system. ####
     syst.attach_lead(lead0)
     syst.attach_lead(lead1)
 
     return syst
 #HIDDEN_END_zuuw
 
 #HIDDEN_BEGIN_jbjt
 def plot_conductance(syst, energies):
     # Compute conductance
     data = []
     for energy in energies:
         smatrix = kwant.smatrix(syst, energy)
         # Conductance is N - R_ee + R_he
         data.append(smatrix.submatrix((0, 0), (0, 0)).shape[0] -
                     smatrix.transmission((0, 0), (0, 0)) +
                     smatrix.transmission((0, 1), (0, 0)))
 #HIDDEN_END_jbjt
-    pyplot.figure()
+    fig = pyplot.figure()
     pyplot.plot(energies, data)
     pyplot.xlabel("energy [t]")
     pyplot.ylabel("conductance [e^2/h]")
-    pyplot.show()
+    pyplot.setp(fig.get_axes()[0].get_xticklabels(),
+                fontsize=_defs.mpl_tick_size)
+    pyplot.setp(fig.get_axes()[0].get_yticklabels(),
+                fontsize=_defs.mpl_tick_size)
+    fig.set_size_inches(_defs.mpl_width_in, _defs.mpl_width_in * 3. / 4.)
+    fig.subplots_adjust(left=0.15, right=0.95, top=0.95, bottom=0.15)
+    for extension in ('pdf', 'png'):
+        fig.savefig("superconductor_transport_result." + extension,
+                    dpi=_defs.dpi)
 
 #HIDDEN_BEGIN_pqmp
 def check_PHS(syst):
     # Scattering matrix
     s = kwant.smatrix(syst, energy=0)
     # Electron to electron block
     s_ee = s.submatrix((0,0), (0,0))
     # Hole to hole block
     s_hh = s.submatrix((0,1), (0,1))
     print('s_ee: \n', np.round(s_ee, 3))
     print('s_hh: \n', np.round(s_hh[::-1, ::-1], 3))
     print('s_ee - s_hh^*: \n',
           np.round(s_ee - s_hh[::-1, ::-1].conj(), 3), '\n')
     # Electron to hole block
     s_he = s.submatrix((0,1), (0,0))
     # Hole to electron block
     s_eh = s.submatrix((0,0), (0,1))
     print('s_he: \n', np.round(s_he, 3))
     print('s_eh: \n', np.round(s_eh[::-1, ::-1], 3))
     print('s_he + s_eh^*: \n',
           np.round(s_he + s_eh[::-1, ::-1].conj(), 3))
 #HIDDEN_END_pqmp
 
 def main():
     syst = make_system(W=10)
 
-    # Check that the system looks as intended.
-    kwant.plot(syst)
-
     # Finalize the system.
     syst = syst.finalized()
 
     # Check particle-hole symmetry of the scattering matrix
-    check_PHS(syst)
+    with open('check_PHS_out.txt', 'w') as f:
+        with redirect_stdout(f):
+            check_PHS(syst)
 
     # Compute and plot the conductance
     plot_conductance(syst, energies=[0.002 * i for i in range(-10, 100)])
 
 
 # Call the main function if the script gets executed (as opposed to imported).
 # See <http://docs.python.org/library/__main__.html>.
 if __name__ == '__main__':
     main()