issp-center-dev / mVMC

A numerical solver package for a wide range of quantum lattice models based on many-variable Variational Monte Carlo method

Home Page:http://www.pasums.issp.u-tokyo.ac.jp/mvmc/en/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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

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.