Topological Bands I.


Topology is the study of geometry minus the wiggles. More specifically topology studies continuous maps.

Topology separates into a number of sub fields.

  • General Topology – Studies the set theoretic properties and definitions of topology
  • Algebraic Topology – Studies

The piece of topology that is most relevant to physics (partially because it is the most computational) is the notion of the notion of the topological invariant. Topological invariants are numbers that can be computed. If they disagree for two objects, then the two objects are not topologically equivalent. The reverse is not true.

An example of a topological invariant is the winding number of a closed curve around a point in 2d. This can also be interpreted as a classification of mappings from circles to circles.

Another example is the Euler number. The Euler number kind of counts the number of holes in a surface. It is defined as \chi = V-E+F , the number of vertices minus edges plus the number of faces in a tessellation of a surface. If one considers the Euler number of possibly disconnected surfaces or edges or vertices, the Euler number does a decent job of counting the number of objects.

Nick Read has published a review article in Physics Today. Physics Todays is a pretty excellent introduction to modern topics if you can find an article on that topic.

Topological Matter has one or more of the following

  1. An energy gap above the ground state
  2. A number of degenerate ground states that depends on the topology of the surface on which they live (Torus vs Sphere).
  3. Anyonic Quasiparticles.
  4. Quantized Response functions (quantized Hall conductance for example)
  5. Unavoidable Edge Modes


Two objects that are far apart need to be brought together in order to be compared. A Connection is a specification on how to transport something around in space. This connection is defined differentially. Given a tiny displacement dx, what is the tiny change $dO$ in the corresponding object.

There are three examples of connections of different flavor.

The first is the connection defining parallel transport of vectors in a curved geometry.

The game goes like so: Suppose you want to transport a little arrow in the surface of a sphere  to a new point on a sphere. You want a procedure to keep the arrow in the surface of the sphere. The simplest procedure is to project the arrow back into the sphere after moving it a tiny bit dx. Move, project. Move, project. This procedure keeps the arrow in the surface of the sphere the whole way. This procedure is the connection for parallel transporting the arrow on the sphere. (This procedure defines what it means for two arrows to be parallel at nearby points).

When one actually does this however, a curious thing results. The arrow upon returning to the original point after a closed loop, may have been rotated relative to the original arrow. Different paths of transport result in different amounts of turning. This turning is a result of the curvature of the sphere and the parallel transport procedure is a method by which to probe the curvature.

Rather that integrating the connection along the entire closed route, there is an alternative but equivalent way of doing the accounting. Consider a tiny loop or area dA. This loop causes a correspondingly tiny rotation d\theta . Because the rotation gets cancelled from traverse the same path in opposite directions, the sum of all the tiny loop rotations in an area will equal the rotation calculated for the bounding edge of that area. This is Stokes theorem about the curl if that helps.

Another connection is that of the electromagnetic vector potential A. The vector potential specifies how to transport quantum amplitudes and compare them at different positions. This is the Aharonov-Bohm effect. When a particle travels through the vector potential it gets an extra phase \Delta \phi = q/\hbar \int A\cdot dx.

A final connection is that connected to Berry Phase. Instead of talking about transport in physical geometrical space, Berry phase refers to transport in parameter space. This is analogous to the transition from cartesian coordinates in Newtonian mechanics to that of generalized coordinates in Lagrangian mechanics, which may not have a simple geometrical interpretation necessarily.

Berry phase can be interpreted as being similar to the extra phase that an oscillator might receive upon a cyclic change in its parameters for example slowly changing the length and mass of a pendulum. This seems like a small effect and it typically is a drop in the bucket compared to all the ordinary dynamic phase accumulated \int \omega(t)dt but it nevertheless exists and actually has a lot of conceptual importance.

A particularly important example of Berry phase is that of the spin-1/2. This occurs when you rotate the magnetic field that the spin is in for example.

u=\begin{array}{c}\cos (\theta/2)\\ \sin (\theta/2) e^{i \phi}\end{array}

A=i<u|\partial|u>=(0, - sin^2(\theta/2) )

\int A_\phi d\phi = -2\pi sin^2(\theta/2) =-\Omega/2

$\Omega=\int \sin(\theta) d\theta \phi $ plus use some half angle identities.

In summary, the Berry phase is half of the solid angle \Omega enclosed by the path.


Next Time: Discretizing the Schrodinger Equation






Based on

767 was the value checked for at 25Mhz. This is a count of 768.

I doubled it to 1535. and added one to all references to Counter X.

I am confused on these values. References I’m finding say to shoot for 31.5kHz but this works out to 32.5khz?

50e6/31.46875e3 gives 1588.87785501. Ok. That works too. I guess the monitor is just flexible.





I got an error for can’t use pin 101 which is V sync

This helped

Need to disable nCEO which is using that pin


module vga_test (
	output vga_h_sync,
	output vga_v_sync,
	output R,
	output G,
	output B,
	input clk

reg [10:0] CounterX;
reg [8:0] CounterY;
wire CounterXmaxed = (CounterX==1535);

always @(posedge clk)
  CounterX <= 0;
  CounterX <= CounterX + 1;

always @(posedge clk)
    CounterY <= CounterY + 1;

reg vga_HS, vga_VS;
always @(posedge clk)
  vga_HS <= (CounterX[10:5]==0);   // active for 16 clocks
  vga_VS <= (CounterY==0);   // active for 768 clocks

assign vga_h_sync = ~vga_HS;
assign vga_v_sync = ~vga_VS;

assign R =  CounterX[9];//CounterY[3] | (CounterX==256);
assign G = CounterX[8];//(CounterX[6] ^ CounterX[7]) | (CounterX==256);
assign B = CounterX[7]; //CounterX[5] | (CounterX==256);


Alright. It appears to work. That is a good start.


FEM again

  • Sfepy
  • Fenics
  • BEM++
  • OpenFoam
  • Elmer
  • Moose
  • Code-Aster
  • Gerris
  • ASL
  • meshpy
  • SolidPython
  • Salome
  • FreeCad
  • KiCad
  • Qucs
  • Skidl

I kind of cribbed from the wikipedia CAE listing

I think it would be cool to integrate all of these better. Simulate full EM equations.

Fenics uses Docker now? My how the world turns.

So that’s nice. Docker for Mac got slick as hell.

docker ps -a lists all guys

docker run -it –rm ubuntu

docker info

-v shares folders

They wrote stuff to this all for you

Sfepy also seems nice though. I hope that two seemingly equal options doesn’t cripple me.

I had to reinstall mayavi and vtk in order to get it working. I was just ripping at my distros. Hope that doesn’t bite me later.


Installed openfoam docker image

$FOAM_TUTORIALS is a variable with tutorial location

cp -R elbow ~/OpenFOAM/elbow

The 0 directory is the starting time drectory

has a file with the name of fields

pressure and velocity in this case



icoFoam runs simulation




switch to geometry mode.

STEP files preferred?

Create new entity

select surfaces that you want special

go into mesh mode

msh -> create mesh


Hypothesis sets paramters

Warning triangle right click compute mesh

create group


group on geometry

select wall from before

right click and export unv file

ideasUNVToFoam convertst this to an openfoam file






OpenCV Android

Setup OpenCV SDK in Android Studio project

A summary of the video

Get the SDK from

Make new project with regular settings

new > import module

select java folder in sdk folder

got an erro

had to install android-sdk by clickign isntall missing platforms

copy all stuff from native > libs into a JNILibs folder by dragging and dropping

Changed the SDK version to after 21 to remove camera2 error


I was having an NDK error

Go to tools > SDK manager and download cmake lldb and ndk

still have errors.

Have to go into files as far as I can tell. This gradle isn’t around

Topological Data Analysis

I’m watching these lectures

I am skeptical that this is useful, but it does seem interesting. Also, since their intent is for practical use, it won’t be so high falutin’

Lec 1. Sensor fusion and cross correlating sensors seems to be the idea. Tracking multiple objects. CoSheafs are something? More meat to come


Lec2. edges and faces are sources to be checked for consistency

Flag complexes or clique complex – every set of edges that could have a face has a face

star – all the higher dimensional simplices that contain that object

alexandrov topology – open sets are unions of stars

Nerve – open cover of X. for every set U in cover is vertex. for every intersection that is nonempy, there is a simplex. Leray Theorem

Lec3. Sheaves. you can associate a diagram of inclusion with your simplices. if every simplex has some space associated with it, then you can put functions on these inclusions. Then

SAT solving and SMT

I’ve been playing around with Coq and Agda and Idris, doing the exercises in the Software Foundations book. These have similar flavor, using the Curry-Howard isomorphism to use the type system as a way of proving stuff. It may not be an entire coincidence that the systems put in place to tell when you have a float int smash can be extended to full proving systems. The property of never having a float int collision is a proposition that requires proof. And somehow the compiler systematically guarantees it when type checking, without exhaustively running the program.

I came across The Little Prover, which talks about ACL and Dracula, theorem provers in the tradition of Lisp. There is not obviously types involved. This feels like an alternative tradition. More ad hoc?

There is another approach. More automated and not type theory based. They limit themselves to specialized domains. SAT solvers tell whether there exists a set of vairable values that can make

SAT is how you

My impression is that surprisingly often you are better off mapping your problem to the SAT form and then handing it off to really good solvers.

Check out this sudoku solver.

I brew installed minisat (it’s not clear to me if this is a top of the line solver. The competition page pegs it as pretty old, which isn’t necessarily bad) and pip installed satispy.


I’ve heard that Z3 can be used in capture the flag competitions and cracking stuff 

Z3 has a python interface.

This has an interesting

Liquid Types? I’ve heard that mentioned before. Some kind of merging of the type theory tradition and SMT. I wonder if guys in the know would not emphasize such a dichotomy.

Fenics and gmsh

I downloaded docker and set it up using their script.

fenicsproject notebook testbook

creates a notebook


fenicsproject start testbook.

Starts a jupyter server.

You need to use python 2. Fenics is not installed for python 3 as far as I can tell.

I took the first example out of the tutorial book

You need

%matplotlib inline

in order to see the plots.

I installed solidpython which is a pythony version of openscad.

So you can output a scad file, but then you need to run openscad to convert it further.

brew install Caskroom/cask/openscad

puts it into an app folder and not in the path of the terminal

import os

os.system('/Applications/ -o test.stl test.scad')

pip install numpy-stl


%matplotlib notebook

makes an interactive plot. nice.

gmsh is necessary. Perhaps a better tool chain would just use gmsh and ignore the scad stuff.

you can take a mesh from gmsh


first click add points. add them in in by pressing e.

thenadd line

the add plane surface.

add physical group to start labelling boundaries.

click 2d under mesh.

refine it a couple times maybe then save the .msh

dolfin-convert untitled.msh test.xml

This is an answer as to how to grab these xml files

So here’s a start

This is not the cleanest workflow.

Hackathon: Matter.js

For the Brown hackathon, we made a multiplayer browser video game called Enceladus using node, raw javascript,, and matter.js as a physics engine.

I think we’ll keep working on it, so I’ll post more when it isn’t a pile of Hackathon garbage.

Here are some scattered, totally worthless to anyone else notes as I started exploring the documentation of Matter.js:

Engine.update updates by dt


Bodies – factory methods for creating new bodies

Bounds – Axis aligned bounding box = min and max x and y values

Body. whatever lets you set almost anything about a body.

set to static can be useful

bodies hold velocity prev velocity other things. I bet you mostly should not update these values manually.


Common – useful random crap. Random picks random values. chaining seems useful? clone. topological sort. sign function.


Constraint – fix distance between two points. No rotation contraints?


SAT – seperating axis theorem – convex shapes –

SAT (Separating Axis Theorem)


Engine – clear resets



broad phase collision detection?




Install WebPack ISE 14.7 on Ubuntu & Spartan AX309 FPGA Board

Downloaded Webpack ISE, the free Xilinx guy that works with

Tried to install usb drivers. But it failed. I saw a board that said it should work if libusb is installed. We’ll see.

It wasn’t readily apparent to me how to run the thing. The Mojo site helped

You need to source a file.

You have to get a license from the license manager. It did not automatically navigate my browser. Select webpack license and load it in the license manager. It will be emailed to you.

A Series of errors upon trying to plan pins:

/opt/Xilinx/14.7/ISE_DS/ISE/bin/lin64/_pace_old: error while loading shared libraries: cannot open shared object file: No such file or directory

sudo apt-get install libmotif3


/opt/Xilinx/14.7/ISE_DS/ISE//lib/lin64/ version `GLIBCXX_3.4.15′ not found (required by /usr/lib/firefox/

sudo apt-get install libstdc++5

Wind/U Error (193): X-Resource: DefaultGUIFontSpec (-*-helvetica-medium-r-normal-*-14-*) does not fully specify a font set for this locale
Wind/U Error (248): Failed to connect to the registry on server philip-desktop

Warning!!: XKEYSYMDB environment variable is set to a wrong location

sudo apt-get install xfonts-75dpi xfonts-100dpi


rebooted computer.

Hey! It works after a good 30 seconds. Oh my good this looks like garbage. What is going on here? Some weirdo windows port?


Ok. I have a Spartan 6 AX309 board now and a xilinx platform usb cable. Let’s see if we can program it. I asked the seller for the link to their files. It’s  got datasheets and example code. That’s nice.

The programming software is apparently called impact. That’s helpful. SARCASM

Ok. I left this on my desk for a week and forgot what I did. As I recall the installation process did not appear to be working.

Ok. So I think it might be working.

I had concern about getting some kind of ESN error, but I think I was doing things in the wrong order.

First click boundary scan.

Then find Initialize chain.

Then my chip shows up. Then I added a .bit file configuration.


Why do I do this to myself? My Altera toolchain was working just fine. Oh well. Onwards and upwards.