From 2103cd5bd5327a19a1a0636c1af50c13cd925fc1 Mon Sep 17 00:00:00 2001
From: Anton Akhmerov <anton.akhmerov@gmail.com>
Date: Sat, 27 Apr 2013 00:27:43 -0400
Subject: [PATCH] add ModesLead, a modes analog of SelfEnergy lead

---
 kwant/builder.py | 35 +++++++++++++++++++++++++++++++----
 kwant/system.py  |  3 ++-
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/kwant/builder.py b/kwant/builder.py
index 82462dc9..53b3bd62 100644
--- a/kwant/builder.py
+++ b/kwant/builder.py
@@ -9,7 +9,7 @@
 from __future__ import division
 
 __all__ = ['Builder', 'Site', 'SiteFamily', 'SimpleSiteFamily', 'Symmetry',
-           'HoppingKind', 'Lead', 'BuilderLead', 'SelfEnergy']
+           'HoppingKind', 'Lead', 'BuilderLead', 'SelfEnergy', 'ModesLead']
 
 import abc
 import sys
@@ -18,7 +18,7 @@ import operator
 from itertools import izip, islice, chain
 import tinyarray as ta
 import numpy as np
-from . import system, graph
+from . import system, graph, physics
 
 
 ################ Sites and site families
@@ -450,7 +450,7 @@ class SelfEnergy(Lead):
     interface : sequence of `Site` instances
     """
     def __init__(self, self_energy_func, interface):
-        self.self_energy_func = self_energy_func
+        self._self_energy_func = self_energy_func
         self.interface = tuple(interface)
 
     def finalized(self):
@@ -458,7 +458,34 @@ class SelfEnergy(Lead):
         return self
 
     def self_energy(self, energy, args=()):
-        return self.self_energy_func(energy, args)
+        return self._self_energy_func(energy, args)
+
+
+class ModesLead(Lead):
+    """A general lead defined by its modes wave functions.
+
+    Parameters
+    ----------
+    modes_func : function
+        Function which returns the modes of the lead in the format required by
+        a solver given the energy and optionally a list of extra arguments.
+    interface : sequence of `Site` instances
+    """
+    def __init__(self, modes_func, interface):
+        self._modes_func = modes_func
+        self.interface = tuple(interface)
+
+    def finalized(self):
+        """Trivial finalization: the object is returned itself."""
+        return self
+
+    def modes(self, energy, args=()):
+        return self._modes_func(energy, args)
+
+    def self_energy(self, energy, args=()):
+        modes = self.modes(energy, args)
+        return physics.selfenergy(modes=modes)
+        
 
 
 ################ Builder class
diff --git a/kwant/system.py b/kwant/system.py
index 09a36296..134bdcf2 100644
--- a/kwant/system.py
+++ b/kwant/system.py
@@ -80,7 +80,8 @@ class FiniteSystem(System):
 
     For lead ``n``, the method leads[n].self_energy must return a square matrix
     whose size is ``sum(self.num_orbitals(neighbor) for neighbor in
-    self.lead_interfaces[n])``.
+    self.lead_interfaces[n])`` the output format for ``leads[n].modes is more
+    complicated, and it should match the output of `kwant.physics.modes`.
 
     Often, the elements of `leads` will be instances of `InfiniteSystem`.  If
     this is the case for lead ``n``, the sites ``lead_interfaces[n]`` match
-- 
GitLab