diff --git a/kwant/continuum/_common.py b/kwant/continuum/_common.py index 62a03c1720fa3e9ccc267728e84b40f0bdb38bac..0eabf86a13b35bb9e7a5501528229e4cc51d3e21 100644 --- a/kwant/continuum/_common.py +++ b/kwant/continuum/_common.py @@ -42,7 +42,7 @@ del _clash['pi'] ################ Various helpers to handle sympy -def lambdify(hamiltonian, *, substitutions=None): +def lambdify(hamiltonian, substitutions=None): """Return a callable object for computing continuum Hamiltonian. Parameters diff --git a/kwant/continuum/discretizer.py b/kwant/continuum/discretizer.py index 716d0eb5bbc31cdfc6b1b5a43e4dca9b8030c78a..f7a7ef1dced251ebf225b4d5ee8b366b222cc1b6 100644 --- a/kwant/continuum/discretizer.py +++ b/kwant/continuum/discretizer.py @@ -38,7 +38,7 @@ _displacements = {s: sympy.Symbol('_internal_a_{}'.format(s)) for s in 'xyz'} ################ Interface functions -def discretize(hamiltonian, discrete_coordinates=None, lattice_constant=1, +def discretize(hamiltonian, discrete_coordinates=None, *, grid_spacing=1, substitutions=None, verbose=False): """Construct a tight-binding model from a continuum Hamiltonian. @@ -56,8 +56,8 @@ def discretize(hamiltonian, discrete_coordinates=None, lattice_constant=1, If not provided they will be obtained from the input hamiltonian by reading present coordinates and momentum operators. Order of discrete coordinates is always lexical, even if provided otherwise. - lattice_constant : int or float, default: 1 - Lattice constant for the template Builder. + grid_spacing : int or float, default: 1 + Grid spacing for the template Builder. substitutions : dict, defaults to empty A namespace of substitutions to be performed on the input ``hamiltonian``. Values can be either strings or ``sympy`` objects. @@ -74,13 +74,14 @@ def discretize(hamiltonian, discrete_coordinates=None, lattice_constant=1, which can be used as a template. """ - args = hamiltonian, discrete_coordinates, substitutions, verbose - tb_hamiltonian, discrete_coordinates = discretize_symbolic(*args) - return build_discretized(tb_hamiltonian, discrete_coordinates, - lattice_constant, substitutions, verbose) + tb, coords = discretize_symbolic(hamiltonian, discrete_coordinates, + substitutions=substitutions, verbose=verbose) + return build_discretized(tb, coords, grid_spacing=grid_spacing, + substitutions=substitutions, verbose=verbose) -def discretize_symbolic(hamiltonian, discrete_coordinates=None, + +def discretize_symbolic(hamiltonian, discrete_coordinates=None, *, substitutions=None, verbose=False): """Discretize a continuous Hamiltonian into a tight-binding representation. @@ -123,7 +124,7 @@ def discretize_symbolic(hamiltonian, discrete_coordinates=None, atoms_names = [s.name for s in hamiltonian.atoms(sympy.Symbol)] if any( s == 'a' for s in atoms_names): raise TypeError("'a' is a symbol used internally to represent " - "lattice spacing; please use a different symbol.") + "grid spacing; please use a different symbol.") hamiltonian = sympy.expand(hamiltonian) if discrete_coordinates is None: @@ -175,8 +176,8 @@ def discretize_symbolic(hamiltonian, discrete_coordinates=None, return tb, discrete_coordinates -def build_discretized(tb_hamiltonian, discrete_coordinates, - lattice_constant=1, substitutions=None, verbose=False): +def build_discretized(tb_hamiltonian, discrete_coordinates, *, + grid_spacing=1, substitutions=None, verbose=False): """Create a template Builder from a symbolic tight-binding Hamiltonian. Parameters @@ -189,8 +190,8 @@ def build_discretized(tb_hamiltonian, discrete_coordinates, discrete_coordinates : sequence of strings Set of coordinates for which momentum operators will be treated as differential operators. For example ``discrete_coordinates=('x', 'y')``. - lattice_constant : int or float, default: 1 - Lattice constant for the template Builder. + grid_spacing : int or float, default: 1 + Grid spacing for the template Builder. substitutions : dict, defaults to empty A namespace of substitutions to be performed on the values of input ``tb_hamiltonian``. Values can be either strings or ``sympy`` objects. @@ -227,13 +228,13 @@ def build_discretized(tb_hamiltonian, discrete_coordinates, name = 'hopping_{}'.format(n) tb[offset] = _value_function(hopping, discrete_coordinates, - lattice_constant, onsite, name, + grid_spacing, onsite, name, verbose=verbose) dim = len(discrete_coordinates) onsite_zeros = (0,) * dim - prim_vecs = lattice_constant * np.eye(dim) + prim_vecs = grid_spacing * np.eye(dim) random_element = next(iter(tb_hamiltonian.values())) norbs = (1 if isinstance(random_element, sympy.Expr) else random_element.shape[0]) @@ -462,7 +463,7 @@ def _return_string(expr, discrete_coordinates): return 'return {}'.format(output), map_func_calls, const_symbols, _cache -def _assign_symbols(map_func_calls, lattice_constant, +def _assign_symbols(map_func_calls, grid_spacing, discrete_coordinates, onsite): """Generate a series of assignments. @@ -470,7 +471,7 @@ def _assign_symbols(map_func_calls, lattice_constant, ---------- map_func_calls : dict mapping of function calls to assigned constants. - lattice_constant : int or float + grid_spacing : int or float Used to get site.pos from site.tag discrete_coordinates : sequence of strings If left as None coordinates will not be read from a site. @@ -486,7 +487,7 @@ def _assign_symbols(map_func_calls, lattice_constant, if discrete_coordinates: site = 'site' if onsite else 'site1' - args = ', '.join(discrete_coordinates), str(lattice_constant), site + args = ', '.join(discrete_coordinates), str(grid_spacing), site lines.append('({}, ) = {} * {}.tag'.format(*args)) for k, v in map_func_calls.items(): @@ -495,7 +496,7 @@ def _assign_symbols(map_func_calls, lattice_constant, return lines -def _value_function(expr, discrete_coordinates, lattice_constant, onsite, +def _value_function(expr, discrete_coordinates, grid_spacing, onsite, name='_anonymous_func', verbose=False): """Generate a numeric function from a sympy expression. @@ -505,7 +506,7 @@ def _value_function(expr, discrete_coordinates, lattice_constant, onsite, Expr that from which value function will be generated. discrete_coordinates : sequence of strings List of coodinates present in the system. - lattice_constant : int or float + grid_spacing : int or float Lattice spacing of the system verbose : bool, default: False If True, the function body is printed. @@ -515,7 +516,7 @@ def _value_function(expr, discrete_coordinates, lattice_constant, onsite, numerical function that can be used with Kwant. """ - expr = expr.subs({sympy.Symbol('a'): lattice_constant}) + expr = expr.subs({sympy.Symbol('a'): grid_spacing}) return_string, map_func_calls, const_symbols, _cache = \ _return_string(expr, discrete_coordinates=discrete_coordinates) @@ -543,7 +544,7 @@ def _value_function(expr, discrete_coordinates, lattice_constant, onsite, return output lines = _assign_symbols(map_func_calls, onsite=onsite, - lattice_constant=lattice_constant, + grid_spacing=grid_spacing, discrete_coordinates=discrete_coordinates) lines.append(return_string) diff --git a/kwant/continuum/tests/test_discretizer.py b/kwant/continuum/tests/test_discretizer.py index 66a29a2d0c7dbb0250b69ee7a75d454ac114888e..1592dac455a029f247205cf6b59035b83f9e4c8a 100644 --- a/kwant/continuum/tests/test_discretizer.py +++ b/kwant/continuum/tests/test_discretizer.py @@ -319,13 +319,13 @@ def test_numeric_functions_basic_symbolic(): p = dict(t=i) tb = {(0,): sympy.sympify("2*t"), (1,): sympy.sympify('-t')} - builder = build_discretized(tb, {'x'}, lattice_constant=1) + builder = build_discretized(tb, {'x'}, grid_spacing=1) lat = next(iter(builder.sites()))[0] assert 2*p['t'] == builder[lat(0)](None, **p) assert -p['t'] == builder[lat(1), lat(0)](None, None, **p) tb = {(0,): sympy.sympify("0"), (1,): sympy.sympify('-1j * t')} - builder = build_discretized(tb, {'x'}, lattice_constant=1) + builder = build_discretized(tb, {'x'}, grid_spacing=1) lat = next(iter(builder.sites()))[0] assert -1j * p['t'] == builder[lat(0), lat(1)](None, None, **p) assert +1j * p['t'] == builder[lat(1), lat(0)](None, None, **p) @@ -375,19 +375,19 @@ def test_numeric_functions_basic_string(): p = dict(t=i) tb = {(0,): "2*t", (1,): "-t"} - builder = build_discretized(tb, {'x'}, lattice_constant=1) + builder = build_discretized(tb, {'x'}, grid_spacing=1) lat = next(iter(builder.sites()))[0] assert 2*p['t'] == builder[lat(0)](None, **p) assert -p['t'] == builder[lat(1), lat(0)](None, None, **p) tb = {(0,): "0", (1,): "-1j * t"} - builder = build_discretized(tb, {'x'}, lattice_constant=1) + builder = build_discretized(tb, {'x'}, grid_spacing=1) lat = next(iter(builder.sites()))[0] assert -1j * p['t'] == builder[lat(0), lat(1)](None, None, **p) assert +1j * p['t'] == builder[lat(1), lat(0)](None, None, **p) tb = {(0,): "0", (-1,): "+1j * t"} - builder = build_discretized(tb, {'x'}, lattice_constant=1) + builder = build_discretized(tb, {'x'}, grid_spacing=1) lat = next(iter(builder.sites()))[0] assert -1j * p['t'] == builder[lat(0), lat(1)](None, None, **p) assert +1j * p['t'] == builder[lat(1), lat(0)](None, None, **p) @@ -411,7 +411,7 @@ def test_numeric_functions_advance(): for a in [1, 2, 5]: for fA in [lambda x: x, lambda x: x**2, lambda x: x**3]: symbolic, coords = discretize_symbolic(hamiltonian, {'x'}) - builder = build_discretized(symbolic, coords, lattice_constant=a) + builder = build_discretized(symbolic, coords, grid_spacing=a) lat = next(iter(builder.sites()))[0] p = dict(A=fA, B=5, sin=np.sin) @@ -456,7 +456,7 @@ def test_numeric_functions_with_parameter(): for a in [1, 2, 5]: for fA in [lambda c, x: x+c, lambda c, x: x**2 + c]: symbolic, coords = discretize_symbolic(hamiltonian, {'x'}) - builder = build_discretized(symbolic, coords, lattice_constant=a) + builder = build_discretized(symbolic, coords, grid_spacing=a) lat = next(iter(builder.sites()))[0] p = dict(A=fA, B=5)