Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Parametric bandstructures with cuts #52

Merged
merged 4 commits into from
May 4, 2020
Merged

Parametric bandstructures with cuts #52

merged 4 commits into from
May 4, 2020

Conversation

pablosanjose
Copy link
Owner

@pablosanjose pablosanjose commented May 4, 2020

Closes #28

This implements the bandstructure(::ParametricHamiltonian, mesh) and the bandstructure(::Union{Hamiltonian,ParametricHamiltonian}, mesh; cut =...) functionality.

This new feature is quite powerful. It allows to treat parameters in a ParametricHamiltonian as equivalent to Bloch phases when computing bandstructure(ph::ParametricHamiltonian, mesh). The mesh should be a discretization of the parameter space ⊗ Brillouin zone for ph. Each vertex v of mesh is interpreted as v = (p₁,..., pᵢ, ϕ₁,..., ϕⱼ), with parameter values p coming before Bloch phases ϕ.

A possible application: obtain the bandstructure of a planar Josephson junction as a function of parallel momentum and superconductor phase difference. In general, this is useful when needing to compute the bandstructure of a system (or any associated observable) as a function of external parameters.

When providing a cut of the form cut = (mesh_coordinates...) -> v, with mesh_coordinates a Tuple of coordinates of mesh and v the corresponding Bloch phases in the full Brillouin zone v = (ϕ₁,..., ϕⱼ) (or v = (p₁,..., pᵢ, ϕ₁,..., ϕⱼ) in parameter space ⊗ Brillouin zone for ParametricHamiltonians), a section of the bandstructure in the target space of cut is constructed.

The machinery of degeneracy resolution and band reconnection has been generalized to work with cuts and parametric spaces, resulting in clean reconnected bands even when mixing Bloch phases and parameters in an arbitrary way.

There is a rather small performance penalty for using cuts or parameter sampling. Essentially, the user should not have to worry about performance when using this feature. Example:

julia> h = LatticePresets.square() |> hamiltonian(hopping(1)+onsite(0)) |> unitcell(2);

julia> ph = parametric(h, @onsite!((o; μ) -> o - μ));

julia> mesh1D = marchingmesh(0:0.1:1);

julia> cut12 = k -> (k, k)

julia> cut13 = k -> (k, k, k);

julia> @btime bandstructure(h, mesh1D, cut = cut12);
  144.948 μs (876 allocations: 130.44 KiB)

julia> @btime bandstructure(ph, mesh1D, cut = cut13);
  184.907 μs (1161 allocations: 141.66 KiB)

@pablosanjose
Copy link
Owner Author

pablosanjose commented May 4, 2020

A note on implementation: this introduced a new bloch!(matrix, ph::ParametricHamiltonian, pϕs, [axis]) where pϕs = (p₁,..., pᵢ, ϕ₁,..., ϕⱼ), which injects parameters p into ph, producing h=ph(pnames = p...) (where pnames = parameters(ph)), and then calls bloch!(matrix, ph(pnames = ps...), ϕs, [axis]). The bloch! generalization also applies to bloch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

bandstructure(::ParametricHamiltonian) + mesh cuts
1 participant