Page 1 of 1

False detection of time reversal symmetry in non collinear magnetism case

Posted: Fri Jan 26, 2024 5:37 am
by batman
Dear developers,

I am bit confused why does YAMBO assumes time reversal symmetry in case of magnetic materials. It also detects time reversal symmetry when quantum espresso turns it off. Looking into a bit, I found that Yambo treats magnetic symmetries as time reversal symmetry( which I guess is not true as it enforces time reversal on ground state hamiltonian for all magnetic materials). Also it looks like QE and Yambo contradict with each other.

In q.e [source file PW/src/setup.f90][https://gitlab.com/QEF/q-e/-/blob/devel ... p.f90#L484]

Code: Select all

  magnetic_sym = noncolin .AND. domag 
  time_reversal = .NOT. noinv .AND. .NOT. magnetic_sym 
Which implies time_reversal and magnetic_sym cannot be true at the same time and is perfectly fine.

Where as in YAMBO [yambo/interfaces/int_modules/mod_com2y.F][https://github.com/yambo-code/yambo/blo ... om2y.F#L85]

Code: Select all

if(any(t_rev(:)==1)) then
         mag_syms=.true.
         i_time_rev=1
       endif
which assumes that mag_syms and i_time_rev are true at the same time.

To add a bit more, the SOC term respects time reversal symmetry, so hamilitoan respects time-reversal in non-magnetic SOC case. I also donot really understand the following line (I mean isn't just "n_spin_den==4" in the if condition?)

Code: Select all

if(l_spin_orbit.and.n_spin_den==4) i_time_rev=0
Please correct me if I completely miss out something.

Best regards,
Murali

Re: False detection of time reversal symmetry in non collinear magnetism case

Posted: Fri Jan 26, 2024 9:20 am
by Davide Sangalli
Dear Murali,
to explain a bit what is in

Code: Select all

interfaces/int_modules/mod_com2y.F
This is the code

Code: Select all

     if(present(t_rev).and.present(trevsym)) then                       
       i_time_rev=0                                                     
       if(trevsym) i_time_rev=1                                         
       if(any(t_rev(:)==1)) then                                        
         mag_syms=.true.                                                
         i_time_rev=1                                                   
       endif                                                            
       double_symmetries=.not.mag_syms                                  
     else                                                               
       i_time_rev=1                                                     
       if(l_spin_orbit.and.n_spin_den==4) i_time_rev=0                  
       double_symmetries=(i_time_rev==1)                                
     endif                                                              
The first "if( present(t_rev).and.present(trevsym) )" is the way the interfaces "p2y" and "a2y" are distinguished.
In case t_rev and trevsym are present we are reading info from QE, in the other case from abinit.

QE case. i_time_rev=1 in yambo means that there are symmetries which include time reversal.
The pure time reversal (i) could be included (mag_syms=.false. and trevsym=.true.) or (ii) not included (mag_syms=.true. and any(t_rev(:)==1)
When a symmetry operation is applied, yambo just checks if such symmetry includes the time_reversal.
In case (i) there exist an operation which is "t_rev" times "identity", while in case (ii) it will always be "t_rev" times "operation in real space" different from identity

Abinit case. For abinit such part of the code is old and to be changed.
Hope this answers the questions

Best,
D.

P.S.: The correct coding for abinit is here:
https://github.com/sangallidavide/yambo ... od_com2y.F
The same algorithm is used both for abinit and QE.
Indeed the abinit call to symmetries_check_and_load has been changed. See this change in interfaces/a2y/a2y_db1.F

Code: Select all

-    call symmetries_check_and_load(asop,a_nsym)
+    YAMBO_ALLOC( symafm, (a_nsym) )
+    varid = netcdf_inquire_varid(ncid, "symafm")
+    netcdf_error = nf90_get_var(ncid, varid, symafm)
+    call netcdf_check(ncid,netcdf_error,varid)
+
+    YAMBO_ALLOC( trev, (a_nsym) )
+    trev=0
+    if (any(symafm==-1)) then
+      trev=-99
+      do is=1,a_nsym
+        det_s=m3det_i(asop(:,:,is))
+        if (symafm(is)*det_s==-1)  trev(is)=1
+        if (symafm(is)*det_s== 1)  trev(is)=0
+      enddo
+      if (any(trev==-99)) call error(" some symmetry has determinant different from 1 or -1")
+    endif
+
+    call symmetries_check_and_load(asop,a_nsym,t_rev=trev)
I hope we will be able to import this change in the forthcoming releases.
However, it just affects the a2y interface.