Yes, for the DM interaction, you need to write out the cross product explicitly and add the Dx/Dy/Dz terms separately. Note that you got the signs in the cross product wrong, c.f. the code below.
Again, I'm not sure if I understood correctly - it seems you want the D to depend on which pairs of NN you couple, and the D should be e.g. parallel or perpendicular to that direction.
To acchive that, you should reflect this in your code: instead of just looping over the nearest-neighbor pairs without adjusting the D, specialize your model to the triangular model, and hard-code that the D depends on which hopping you have.
To specialize to the Triangular model, you can simply set the
default_lattice and
force_default_lattice. Then you know that they NN pairs are as defined in the source code of the
tenpy.models.lattice.Triangular, i.e. as
Python: Select all
NN = [(0, 0, np.array([1, 0])), (0, 0, np.array([-1, 1])), (0, 0, np.array([0, -1]))]
Note that those couplings have a direction going counter-clockwise, with angles of 30° to the x axis, then 150°, and finally 270°.
Your code could hence look like this:
Python: Select all
class MyModel(CouplingMPOModel):
default_lattice = 'Triangular'
force_default_lattice = True
... # def init_sites()
def init_terms(self, model_params):
Dx = model_params.get("Dx", 0.)
Dy = model_params.get("Dy", 0.)
for (u1, u2, dx), theta in zip(self.lat.pairs['nearest_neighbors'],
np.array([0., 1., 2.])*2.*np.pi/3. + np.pi/6.):
rot_U = np.array([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]])
Dx_p, Dy_p = rot_U @ np.array([Dx, Dy])
self.add_coupling(Dx_p, u1, 'Sy', u2, 'Sz', dx)
self.add_coupling(-Dx_p, u1, 'Sz', u2, 'Sy', dx)
self.add_coupling(Dy_p, u1, 'Sx', u2, 'Sz', dx) # EDIT: wrong sign here, see correct version below
self.add_coupling(-Dy_p, u1, 'Sz', u2, 'Sx', dx) # EDIT: wrong sign here, see correct version below
# similar for Dz, if also needed
If you wanted to be very fancy/general, you could even get the angle of the coupling direction numerically from the (u1, u2, dx) and the lattice unit_cell and basis vectors, with a code very similar to
distance, changing only the last line of that function to calculate the angle instead of the distance of the given vector(s).