HyperBloch package tutorial

Coherent sequences

This notebook provides solved exercises aimed to introduce the functionality of the  HyperBloch package for efficient modeling of tight-binding models on hyperbolic lattices. It is intended to be used in tandem with the HyperBloch coherent sequences tutorial on the HyperCells&HyperBloch website. In this tutorial, the import of quotient sequences structures which specify adjacency matrices that capture the normal subgroup relations between pairwise distinct translation groups of corresponding triangle group quotients (constructed through HyperBloch’s sister package HyperCells) and the construction of normal subgroup tree graphs is showcased. In addition, coherent sequences of translation groups associated with corresponding triangle group quotients are visualized and determined through the built-in Mathematica functions.

Preliminaries:

Remarks:

Before using the notebook to the Coherent sequences tutorial:

Make sure that the HyperBloch package is installed, if this is not the case please follow the instruction on the website HyperCells&HyperBloch installation.

Make sure that the required files .hcqs file is in the current directory:

(2,8,8)-QSS-BBG_66_sparse.hcqs

In case no such file exist in your current directory, please follow the instructions in the HyperBloch coherent sequences tutorial,  or download the file there.

Documentation:

You may want to take a look at the basic usage guide of the HyperBloch package or the available functions within the package, respectively:

Documentation`HelpLookup["PatrickMLenggenhager/HyperBloch/tutorial/BasicUsage"];

Documentation`HelpLookup["PatrickMLenggenhager/HyperBloch/guide/HyperBlochPackage"];

Load the HyperBloch package:

The HyperBloch package can be loaded as follows:

<<PatrickMLenggenhager`HyperBloch`

Set the directory of the needed HyperCells file remarked above, which is assumed to be the directory of this file:

SetDirectory[NotebookDirectory[]];

Normal subgroup tree graphs

Import quotient sequences structure adjacency matrix:

The quotient sequences structure can be imported analogously to cell, model and supercell model graphs. The Import function is used to read the file, while the ImportQuotientSequencesStructureString function is used to parse the string and construct the adjacency matrix of the quotient sequences structure:

QSS=ImportQuotientSequencesStructureString[Import["(2,8,8)-QSS-BBG_66_sparse.hcqs"]];

Extract the adjacency matrix:

The adjacency matrix describing the normal subgroup relation between pairwise distinct translation groups (Γ^((m))), associated with corresponding triangle group quotients Δ/(Γ^((m))), can be extracted by using the string “AdjacencyMatrix” as a key:

QSS["AdjacencyMatrix"]

Visualize the normal subgroup tree graph:

Introduction:

Normal subgroup tree graphs can be visualized with the high-level visualization function VisualizeQuotientSequences. It is convenient to first consider a subgraph with genera of compactified unit cells up to genus 30, which provides an overseeable example. We can achieve this by passing a function to the option VertexFilter, which takes quotient names Tg.n of the form {g, n} as arguments and returns a boolean:

VisualizeQuotientSequences[QSS,
EdgeArrowSize->0.01, ImageSize->1100,VertexFilter->(#[[1]]<30&),
VertexLabelStyle->Directive[Black,Italic,15] ]

Every vertex corresponds to a translation group (Γ^((m))) associated with a corresponding unit cell and denoted with the label of the triangle group quotient Δ/(Γ^((m))),  with quotients in the tabulated list of quotients by Marston Conder. Each  (Γ^((m))) is a normal subgroup of Δ. Vertices highlighted in red indicate that the corresponding unit cell can be assembled mirror symmetrically with Schwarz triangles. Black vertices do not admit a mirror-symmetric unit cell, which limits some of the functionality of HyperCells package for them, namely those functions that construct or rely on symmetric cells (but not those working with generic supercells). Pairwise distinct vertices  (Γ^((m))),  (Γ^((m+1))) connected by a directed edge obey the normal subgroup relation (Γ^((m))) ⊳ (Γ^((m+1))).

Visualize a coherent sequence:

Let us visualize the entire normal subgroup tree graph. We choose to emphasize the vertices associated with compactified unit cells of lower genera. This can be achieved by passing a function to the option LayerDistributionFunction, which distributes the layers of distinct genera in a desired way. In addition, we try to avoid overlapping vertex labels by placing the labels alternately above and below the vertices of the tree graph:

VisualizeQuotientSequences[QSS,
EdgeArrowSize->0.01,ImageSize->1140, 
LayerDistributionFunction->(6.5Log[#]&),
VertexLabelPlacement->"Alternate"]

Let us highlight the supercell sequence we have previously determined in GAP. This can be achieved with the option VertexFilterand HighlightSubgraph set to True:

keepVertices = {{2,6},{3,11},{5,13},{9,20},{17,29},{33,44}, {65,78}};

VisualizeQuotientSequences[QSS,
EdgeArrowSize->0.01,EdgeStyle->Directive[Darker[Blue, 0.25],Thick, Opacity[0.2]], 
HighlightSubgraph->True,ImageSize->1140,LayerDistributionFunction->(6.5Log[#]&),
VertexFilter->(MemberQ[keepVertices, #]&),VertexLabelPlacement->"Alternate"]

Determine coherent sequences:

Preliminaries:

We can determine supercell sequences through the built-in Mathematica functions, such as FindPath or the resource function FindLongestPath, etc.. Let us reconstruct the sequences we have considered in the HyperBloch Supercells tutorial (where we adopt the sequence labels introduced in said tutorial):

fullGraph=VisualizeQuotientSequences[QSS, LayerDistributionFunction->(6.5Log[#]&),
 EdgeArrowSize->0.01,ImageSize->1140,VertexLabelPlacement->"Alternate"];

Supercell sequence 1:

The initial and the final vertex in the first supercell sequence are:

initialVertex={2,6};
finalVertex = {65,78};

FindPath can be used to determine all sequences that connect the initial with the final vertex:

sq1Lst = FindPath[fullGraph, initialVertex, finalVertex, Infinity,All];

The last sequence corresponds to the sequence we have previously considered:

sq1=sq1Lst[[-1]]

Supercell sequence 1A:

The initial and the final vertex in the next supercell sequence are:

initialVertex={3,10};
finalVertex = {65,81};

All sequences that connect the initial with the final vertex:

sq1ALst = FindPath[fullGraph, initialVertex, finalVertex, Infinity,All];

The last sequence corresponds to the sequence we have previously considered:

sq1A=sq1ALst[[1]]

Supercell sequence 2A:

The initial and the final vertex in the next supercell sequence are:

initialVertex={5,12};
finalVertex = {65,79};

All sequences that connect the initial with the final vertex:

sq2ALst = FindPath[fullGraph, initialVertex, finalVertex, Infinity,All];

The second sequence corresponds to the sequence we have previously considered:

sq2A=sq2ALst[[2]]

Highlight multiple coherent sequences (bonus):

We can use the  VisualizeQuotientSequences function to highlight multiple coherent sequences in the full normal subgroup tree graph. In order to avoid the inclusion of superfluous edges, we can use the option EdgeFilter instead of VertexFilter.

The corresponding edges are easily constructed:

sequnceLst={sq1, sq1A,sq2A};
edgeLst=Table[DirectedEdge[sequnceLst[[i,j]],sequnceLst[[i,j+1]]],{i,3},{j, Length[sequnceLst[[i]][[2;;]]]}];
allEdges=Flatten[edgeLst,1];

Let us highlight the three sequences by specifying three color maps:

cfunc=(ColorData["SunsetColors","ColorFunction"]/@(1-Range[3]/3));
colorTables=Flatten[Table[
Style[edgeLst[[i,j]],Directive[cfunc[[i]], AbsoluteThickness[4]], Opacity[1]],
{i,3},{j,Length@edgeLst[[i]]}],1];

Therefore:

VisualizeQuotientSequences[QSS,
EdgeArrowSize->0.01,EdgeFilter->(MemberQ[allEdges,#]&),
EdgeStyle->Directive[Darker[Blue, 0.25],Thick, Opacity[0.2]],
HighlightSubgraph->True,HighlightSubgraphEdgeStyle->colorTables,
ImageSize->1140,LayerDistributionFunction->(6.5Log[#]&),
VertexSize->0.5,VertexLabelPlacement->"Alternate"]

NotebookSave[]