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