Thanks! This is exactly what I needed. On Sat, Dec 17, 2016 at 4:31 AM, Joseph Weston <joseph.westo...@gmail.com> wrote:
> Hi, > > > I'm doing a self consistent calculation and I need the matrix element > for a > > site when setting the coupling. > > I got it working but I wanted to know if there was a correct way. > > Here is my code which uses scipy.spatial. > > > > def onsite(site, Delta=None, coords=None): > > if (Delta is None and coords is None): > > Delta_r = Delta_0 > > else: > > _, i = spatial.KDTree(coords).query(site.pos) > > Delta_r = Delta[i] > > return -mu * tau_z + Delta_r * tau_x > > Ok, so you essentially need to map from site -> site_index in order to > index into your array, right? I guess the solution will depend on > whether your sites are moving around or not during your self-consistent > loop. My guess is "no", as you appear to be self-consistently > determining some superconducting order parameter, and I guess your sites > correspond to a discretisation of the continuous problem. > > In this case I would say that the simplest thing to do would be to use > a `dict` data structure to do the mapping site -> site_index. The reason > is that lookups in a dict have O(1) complexity, unlike a KDTree. In > addition, this mapping can be constructed once, when the system is > finalized, and then passed to the `onsite` function as a parameter. > > In Kwant 1.3 systems will have an attribute `id_by_site`, which stores > this dictionary, but constructing it is also trivial: > > id_by_site = {site: i for i, site in enumerate(syst.sites)} > > > So a full example would look like: > > def onsite(site, id_by_site, Delta=None): > Delta_r = Delta_0 if Delta is None else Delta[id_by_site[site]] > return -mu * tau_z + Delta_r * tau_x > > builder = kwant.Builder(...) > builder[...] = onsite > ... > > syst = builder.finalize() > > id_by_site = {site: i for i, site in enumerate(syst.sites)} > Delta = [0.1] * len(syst.sites) # trivial example > ... > syst.smatrix(syst, args=(id_by_site, Delta)) > > > Hope that helps, > > Joe >