understanding symmetries
nikita-astronaut opened this issue · comments
Dear MVMC developers,
I am trying to understand how to use your package and came with the following problem. When I use
test_HubbardTetragonal.py
if generates the file with translations qptransidx.def
:
=============================================
NQPTrans 4
=============================================
======== TrIdx_TrWeight_and_TrIdx_i_xi ======
=============================================
0 1.00000
1 1.00000
2 1.00000
3 1.00000
0 0 0
0 1 1
0 2 2
0 3 3
0 4 4
0 5 5
0 6 6
0 7 7
1 0 1
1 1 2
1 2 3
1 3 0
1 4 5
1 5 6
1 6 7
1 7 4
2 0 4
2 1 5
2 2 6
2 3 7
2 4 0
2 5 1
2 6 2
2 7 3
3 0 5
3 1 6
3 2 7
3 3 4
3 4 1
3 5 2
3 6 3
3 7 0
It consists of 4 symmetries: identity, Tx, Ty and TxTy. I do not understand why adding TxTy? Does your code probe symmetries combinations? Or if I want any combination of two symmetries A and B, I need to explicitly state how AB acts?
Thanks!
Hello,
Thanks for your question.
Yes, it's required that you explicitly specify all results of the lattice symmetries.
The 4 points in qptransidx.def
is no automated input of symmetry, but just tells the program to project to total momentum = some value (in this case, zero) by summing up states according to manual section 5.18.
The reason why test_HubbardTetragonal.py
generates only 4 terms in qptransidx.def
is that it is calculating a 4x4 square lattice with parameters inside the same for each 2x2 small plaquette. A little confusing expressed in words so I'm drawing a simple cartoon here:
+---+---+---+---+
| 0 | 1 | 0 | 1 |
+---+---+---+---+
| 2 | 3 | 2 | 3 |
+---+---+---+---+
| 0 | 1 | 0 | 1 |
+---+---+---+---+
| 2 | 3 | 2 | 3 |
+---+---+---+---+
Hence translational operations like (0, 0) -> (3, 1) is in fact the same as (0, 0) -> (1, 1). You might also want to check output generated from vmcdry.out
for input with Wsub=4
.
Best,
RuQing
Dear RuQing,
thanks for your answer!
but that example uses W = 4, L = 2
and operates on the lattice of size 8. Are you sure the cartoon you sketched refers to that case?
Sorry I made a mistake.
It should be like:
+---+---+---+---+
| 0 | 1 | 0 | 1 |
+---+---+---+---+
| 2 | 3 | 2 | 3 |
+---+---+---+---+
Dear RuQing,
thanks a lot for explanation. Still, the idea is not quite clear. Let us consider the following example. We have a 4x4 lattice with periodic boundary conditions. We have Tx, Ty translational symmetries, R -- rotation by the angle of pi/2 and M -- mirror symmetry with respect to one of high-symmetry lines.
Now I have 4 symmetry generators Tx
, Ty
, R
, M
. Each of these generators is given by some permutation of 16 elements. The question is: how should I fill the qptransidx.def
in this case? I want a fully translational-rotational-mirror invariant solution.
In principle, there are 16 x 4 x 2 = 128
elements in this group in total. Should I define all 128 elements and put them to the qptransidx.def
file? That is, I will define 128 weights of 1.0 and I will have 16 x 128 lines later, each defining an image of every site under the action of any of these 128 symmetries?
Thanks a lot!
Well... It depends how one plans to use it.
If one calculates in full sublattice Wsub=4, Lsub=4
and requires all symmetries of the lattice conserved, specifying all 128 points is necessary. (Your format is right, BTW.) However, usually using only translational symmetry projection gives us energy low enough. (And sometimes even no translational symmetry is needed.)
In these cases, using qptransidx.def
given by vmcdry.out
and specifying NMPTrans = 1
or NMPTrans = {Number of Points in qptransidx.def}
does the work.
In any sense, the idea is that in variational wavefunction:
the term can be expanded to:
The four contains 4, 4, 4 and 2 summations respectively. Omission of any one of the 4 does no harm.
Dear RuQing,
thanks a lot. Now it becomes much clearer. So, the last my question is about the parameters defined in modpara.def
. Supposing, I went for 128 symmetries and I use vmc.out
output file. Then, in modpara.def
should I set NMPTrans = 128?
Thanks!
Dear RuQing,
another question is as follows. In the code, how actually the symmetries are used? Do you go to the symmetry basis or just on every iteration use the projector to average?
Best wishes,
Nikita
As far as exposed by output, the program's just averaging up the transformed results every iteration.
Then, in modpara.def should I set NMPTrans = 128?
Right. It could be somehow time consuming so utilizing sublattice to impose implicit symmetry is suggested in most cases.
Best,
RuQing
Thanks!
Dear RuQing
another question appeared. If in my system I have 3-fold rotation symmetry with eigenvalues 1, exp {2 \pi i / 3} and exp {-2 \pi i / 3} and I want to project onto the sector of lambda = exp {2 \pi i / 3}, what should I do?
Does mvmc support imaginary eigenvalue projections?
Thanks a lot!
Hi.
As far as I know qptransidx.def
supports only real input.
(At least the interface looks so. Sorry but I'm no user on the complex number side.)
cos {2 \pi / 3} should work fine but if a global parity symmetry broken state is what you're looking for, specifying NMPTrans = 1
to skip the projection seems the only way available currently.
Best,
RuQing
Dear RuQing,
thanks for your response. I guess, this is similar to the way of translation symmetry with eigenvalues exp{-i k R}, where one also must write cos kR to the qptransidx.def
. Since eigenvalues of any lattice symmetry are always unit-norm, |\lambda| = 1, this is sufficient unless one really wants to probe \lambda^* instead \lambda.
Thanks! I think this is clear.