From 6467f81cc46dfbeeebe189be60dfd425fc8c1d21 Mon Sep 17 00:00:00 2001
From: Christoph Groth <christoph.groth@cea.fr>
Date: Wed, 22 May 2013 16:03:12 +0200
Subject: [PATCH] hamiltonian_submatrix: eliminate zeros in sparse matrices

---
 kwant/_system.pyx | 52 +++++++++++++++++++++++++++++------------------
 1 file changed, 32 insertions(+), 20 deletions(-)

diff --git a/kwant/_system.pyx b/kwant/_system.pyx
index d14f075b..9e4ea271 100644
--- a/kwant/_system.pyx
+++ b/kwant/_system.pyx
@@ -31,6 +31,7 @@ def make_sparse(ham, args, CGraph gr, diag,
     cdef complex [:, :] h
     cdef gint [:, :] rows_cols
     cdef complex [:] data
+    cdef complex value
 
     matrix = ta.matrix
 
@@ -59,10 +60,12 @@ def make_sparse(ham, args, CGraph gr, diag,
                 raise ValueError(msg.format(fs, fs))
             for i in xrange(h.shape[0]):
                 for j in xrange(h.shape[1]):
-                    data[k] = h[i, j]
-                    rows_cols[0, k] = i + to_off[n_ts]
-                    rows_cols[1, k] = j + from_off[n_fs]
-                    k += 1
+                    value = h[i, j]
+                    if value != 0:
+                        data[k] = value
+                        rows_cols[0, k] = i + to_off[n_ts]
+                        rows_cols[1, k] = j + from_off[n_fs]
+                        k += 1
 
         nbors = gr.out_neighbors(fs)
         for ts in nbors.data[:nbors.size]:
@@ -74,12 +77,15 @@ def make_sparse(ham, args, CGraph gr, diag,
                 raise ValueError(msg.format(fs, ts))
             for i in xrange(h.shape[0]):
                 for j in xrange(h.shape[1]):
-                    data[k] = h[i, j]
-                    rows_cols[0, k] = i + to_off[n_ts]
-                    rows_cols[1, k] = j + from_off[n_fs]
-                    k += 1
+                    value = h[i, j]
+                    if value != 0:
+                        data[k] = value
+                        rows_cols[0, k] = i + to_off[n_ts]
+                        rows_cols[1, k] = j + from_off[n_fs]
+                        k += 1
 
-    return sp.coo_matrix((data, rows_cols), shape=(to_off[-1], from_off[-1]))
+    return sp.coo_matrix((data[:k], rows_cols[:, :k]),
+                         shape=(to_off[-1], from_off[-1]))
 
 
 @cython.boundscheck(False)
@@ -93,6 +99,7 @@ def make_sparse_full(ham, args, CGraph gr, diag,
     cdef complex [:, :] h
     cdef gint [:, :] rows_cols
     cdef complex [:] data
+    cdef complex value
 
     matrix = ta.matrix
     n = gr.num_nodes
@@ -116,10 +123,12 @@ def make_sparse_full(ham, args, CGraph gr, diag,
             raise ValueError(msg.format(fs, fs))
         for i in xrange(h.shape[0]):
             for j in xrange(h.shape[1]):
-                data[k] = h[i, j]
-                rows_cols[0, k] = i + to_off[fs]
-                rows_cols[1, k] = j + from_off[fs]
-                k += 1
+                value = h[i, j]
+                if value != 0:
+                    data[k] = value
+                    rows_cols[0, k] = i + to_off[fs]
+                    rows_cols[1, k] = j + from_off[fs]
+                    k += 1
 
         nbors = gr.out_neighbors(fs)
         for ts in nbors.data[:nbors.size]:
@@ -130,13 +139,16 @@ def make_sparse_full(ham, args, CGraph gr, diag,
                 raise ValueError(msg.format(fs, ts))
             for i in xrange(h.shape[0]):
                 for j in xrange(h.shape[1]):
-                    data[k] = h[i, j]
-                    data[k + 1] = h[i, j].conjugate()
-                    rows_cols[1, k + 1] = rows_cols[0, k] = i + to_off[ts]
-                    rows_cols[0, k + 1] = rows_cols[1, k] = j + from_off[fs]
-                    k += 2
-
-    return sp.coo_matrix((data, rows_cols), shape=(to_off[-1], from_off[-1]))
+                    value = h[i, j]
+                    if value != 0:
+                        data[k] = value
+                        data[k + 1] = h[i, j].conjugate()
+                        rows_cols[1, k + 1] = rows_cols[0, k] = i + to_off[ts]
+                        rows_cols[0, k + 1] = rows_cols[1, k] = j + from_off[fs]
+                        k += 2
+
+    return sp.coo_matrix((data[:k], rows_cols[:, :k]),
+                         shape=(to_off[-1], from_off[-1]))
 
 
 @cython.boundscheck(False)
-- 
GitLab