Hi,

`two_deg_params` is a helper I wrote to handle two-dimensional heterostructures.
It is materials are translation invariant in two-dimensions and different materials are stacked along the third dimension -> therefore output parameter functions depend on one coordinate

`coords` in `semicon.models.foreman` will set which parameter it is (the above)

`coords` in `kwant.continuum.discretize` will specify dimensionality of kwant system, one of this coordinates, specified above, will be fed to the parameter functions.

After modifying your `hamiltonian` definition to

``````hamiltonian = semicon.models.foreman(
components=['foreman'],
bands=bands,
coords='z',
)
``````

and adding two missing arrays before the loop at the end of your code

``````energies = []
data = []
for ie in range(100):
energy = ie * 0.01
# compute the scattering matrix at a given energy
p = {'k_y': 0, **two_deg_params}
smatrix = kwant.smatrix(syst, energy, params=p)

# compute the transmission probability from lead 0 to
energies.append(energy)
data.append(smatrix.transmission(1, 0))
``````

I obtained the following Figure.

Regards,
Rafal

--
Rafał Skolasiński
Software Engineer

On Tue, 4 Dec 2018 at 16:43, Ali Asgharpour <asgharpour@sabanciuniv.edu> wrote:
Dear Rafal,

Ok, thanks! But, if I just set `coords` of `semicon.models.foreman` to the single coordinate along which I want to
change my parameters and use discretization in two dimensions, Is everything ok? I mean, I can see reducing of some factors in onsite and hopping functions. I think I will miss some information, don't you think so? In my opinion, creating parameter functions seems fine, but I do not know how I can merge it to two_deg_params. Would you please give me a hint? Thanks in advance.

Best regards,

Ali

On Tue, Dec 4, 2018 at 7:23 PM Rafal Skolasinski <r.j.skolasinski@gmail.com> wrote:

Hi Ali,

A quick reply from my side. This

``````hamiltonian = semicon.models.foreman(
components=['foreman'],
bands=bands,
coords='xz',
)
``````

specify what will be spatial dependence of the parameters in the symbolic Hamiltonian that is used.
As far as I remember, `two_deg_params` provides you a single coordinate dependent parameters.
I suggest you either create parameter functions returned by `two_deg_params` by hand or
try to set `coords` of `semicon.models.foreman` to the single coordinate along which you want to

I will be able to look more in details into that next week.

Regards,
Rafal

--
Rafał Skolasiński
Software Engineer

On Tue, 4 Dec 2018 at 16:14, Ali Asgharpour <asgharpour@sabanciuniv.edu> wrote:
Thanks for the feedback! If you find the bug, would you please let me know? Thanks in advance. By the way, I am also trying to code it myself from the beginning. Thanks again.

Best regards,

Ali

On Tue, Dec 4, 2018 at 6:57 PM Joseph Weston <joseph.weston08@gmail.com> wrote:

Thanks for the information!

Thank you for your quick response. I am using kwant 1.3.3 version and semicon 0.1.0 version. I think the error is related to calling parameters function which are stored as a tuple. By the way, this is the error I encountered:

```TypeError                                 Traceback (most recent call last)
/home/ali/anaconda3/lib/python3.6/site-packages/kwant/builder.py in hamiltonian(self, i, j, params, *args)
1995                     try:
-> 1996                         value = value(self.sites[i], **params)
1997                     except Exception as exc:

<string> in onsite(site, Delta_0, E_0, E_v, P, gamma_0, gamma_1, gamma_2, hbar, k_y, m_0)

TypeError: __call__() takes 2 positional arguments but 3 were given

The above exception was the direct cause of the following exception:

UserCodeError                             Traceback (most recent call last)
<ipython-input-5-9c34d828bfe1> in <module>()
59     # compute the scattering matrix at a given energy
60     p = {'k_y': 0, **two_deg_params}
---> 61     smatrix = kwant.smatrix(syst, energy, params=p)
62
63     # compute the transmission probability from lead 0 to

371                                                   check_hermiticity, False,
--> 372                                                   params=params)
373
374         kept_vars = np.concatenate([coords for i, coords in

/home/ali/anaconda3/lib/python3.6/site-packages/kwant/solvers/common.py in _make_linear_sys(self, sys, in_leads, energy, args, check_hermiticity, realspace, params)
162         lhs, norb = syst.hamiltonian_submatrix(args, sparse=True,
163                                                return_norb=True,
--> 164                                                params=params)[:2]
165         lhs = getattr(lhs, 'to' + self.lhsformat)()
166         lhs = lhs - energy * sp.identity(lhs.shape[0], format=self.lhsformat)

kwant/_system.pyx in kwant._system.hamiltonian_submatrix()

/home/ali/anaconda3/lib/python3.6/site-packages/kwant/builder.py in hamiltonian(self, i, j, params, *args)
1996                         value = value(self.sites[i], **params)
1997                     except Exception as exc:
-> 1998                         _raise_user_error(exc, value)
1999                 else:
2000                     try:

/home/ali/anaconda3/lib/python3.6/site-packages/kwant/builder.py in _raise_user_error(exc, func)
1883     msg = ('Error occurred in user-supplied value function "{0}".\n'
1884            'See the upper part of the above backtrace for more information.')
-> 1885     raise UserCodeError(msg.format(func.__name__)) from exc
1886
1887

UserCodeError: Error occurred in user-supplied value function "onsite".