From 39b4ca8d2ba0e6902be208e461ac0676e3719ff1 Mon Sep 17 00:00:00 2001 From: Joseph Weston <joseph@weston.cloud> Date: Mon, 25 Nov 2019 12:31:45 +0100 Subject: [PATCH] rename hamiltonian_term data normalization in 'system' module We will need this normalization in several places, and it is more general than *just* Hamiltonian terms. --- kwant/builder.py | 26 ++------------------------ kwant/system.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/kwant/builder.py b/kwant/builder.py index 01fbc078..8f189ede 100644 --- a/kwant/builder.py +++ b/kwant/builder.py @@ -2153,7 +2153,7 @@ class _VectorizedFinalizedBuilderMixin(_FinalizedBuilderMixin): except Exception as exc: _raise_user_error(exc, val) - ham = _normalize_term_value(ham, len(to_site_array)) + ham = system._normalize_matrix_blocks(ham, len(to_site_array)) return ham @@ -2392,33 +2392,11 @@ class _IdBySite: raise KeyError(site) -def _normalize_term_value(value, expected_n_values): - try: - value = np.asarray(value, dtype=complex) - except TypeError: - raise ValueError( - "Matrix elements declared with incompatible shapes." - ) from None - # Upgrade to vector of matrices - if len(value.shape) == 1: - value = value[:, np.newaxis, np.newaxis] - if len(value.shape) != 3: - msg = ( - "Vectorized value functions must return an array of" - "scalars or an array of matrices." - ) - raise ValueError(msg) - if value.shape[0] != expected_n_values: - raise ValueError("Value functions must return a single value per " - "onsite/hopping.") - return value - - def _sort_term(term, value): term = np.asarray(term) if not callable(value): - value = _normalize_term_value(value, len(term)) + value = system._normalize_matrix_blocks(value, len(term)) # Ensure that values still correspond to the correct # sites in 'term' once the latter has been sorted. value = value[term.argsort()] diff --git a/kwant/system.py b/kwant/system.py index f25761bf..6e77ea67 100644 --- a/kwant/system.py +++ b/kwant/system.py @@ -742,6 +742,36 @@ def is_vectorized(syst): return isinstance(syst, (FiniteVectorizedSystem, InfiniteVectorizedSystem)) +def _normalize_matrix_blocks(matrix_blocks, expected_length): + """Normalize a sequence of matrices into a single 3D numpy array + + Parameters + ---------- + matrix_blocks : sequence of complex array-like + expected_length : int + """ + try: + matrix_blocks = np.asarray(matrix_blocks, dtype=complex) + except TypeError: + raise ValueError( + "Matrix elements declared with incompatible shapes." + ) from None + # Upgrade to vector of matrices + if len(matrix_blocks.shape) == 1: + matrix_blocks = matrix_blocks[:, np.newaxis, np.newaxis] + if len(matrix_blocks.shape) != 3: + msg = ( + "Vectorized value functions must return an array of" + "scalars or an array of matrices." + ) + raise ValueError(msg) + if matrix_blocks.shape[0] != expected_length: + raise ValueError("Value functions must return a single value per " + "onsite/hopping.") + return matrix_blocks + + + class PrecalculatedLead: def __init__(self, modes=None, selfenergy=None): """A general lead defined by its self energy. -- GitLab