LCOV - code coverage report
Current view: top level - src/80_tdep - m_tdep_sym.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 98.8 % 347 343
Test Date: 2026-09-21 19:39:32 Functions: 77.8 % 9 7

            Line data    Source code
       1              : 
       2              : #if defined HAVE_CONFIG_H
       3              : #include "config.h"
       4              : #endif
       5              : 
       6              : #include "abi_common.h"
       7              : 
       8              : module m_tdep_sym
       9              : 
      10              :  use defs_basis
      11              :  use m_abicore
      12              :  use m_errors
      13              :  use m_xmpi
      14              :  use m_matrix,           only : mati3inv
      15              :  use m_symtk,            only : symatm
      16              :  use m_symfind,          only : symfind, symanal, symlatt
      17              :  use m_tdep_dataset,     only : atdep_dataset_type, MPI_enreg_type
      18              :  use m_tdep_latt,        only : Lattice_type, tdep_make_inbox
      19              : 
      20              :  implicit none
      21              : 
      22              :  type,public :: Symmetries_type
      23              : 
      24              :    integer :: msym
      25              :    integer :: nptsym
      26              :    integer :: nsym
      27              :    integer :: spgroup
      28              :    integer, allocatable :: ptsymrel(:,:,:)
      29              :    integer, allocatable :: symrec(:,:,:)
      30              :    integer, allocatable :: symrel(:,:,:)
      31              :    integer, allocatable :: symafm(:)
      32              :    integer, allocatable :: indsym(:,:,:)
      33              :    double precision, allocatable :: S_ref(:,:,:,:)
      34              :    double precision, allocatable :: S_inv(:,:,:,:)
      35              :    double precision, allocatable :: tnons(:,:)
      36              :    double precision, allocatable :: xred_zero(:,:)
      37              : 
      38              :  end type Symmetries_type
      39              : 
      40              :  public :: tdep_make_sym
      41              :  public :: tdep_SearchS_1at
      42              :  public :: tdep_SearchS_2at
      43              :  public :: tdep_SearchS_3at
      44              :  public :: tdep_SearchS_4at
      45              :  public :: tdep_destroy_sym
      46              :  public :: tdep_calc_indsym2
      47              : 
      48              : contains
      49              : 
      50              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      51           44 :  subroutine tdep_make_sym(Invar,Lattice,MPIdata,Sym)
      52              : 
      53              :   type(Symmetries_type),intent(out) :: Sym
      54              :   type(atdep_dataset_type),intent(inout) :: Invar
      55              :   type(Lattice_type),intent(in) :: Lattice
      56              :   type(MPI_enreg_type), intent(in) :: MPIdata
      57              : 
      58              :   integer :: nspden,use_inversion,chkprim
      59              :   integer :: ptgroupma,isym,ii,jj,iatom_unitcell
      60              :   integer :: bravais(11)
      61           44 :   integer, allocatable :: symrel(:,:,:),symafm(:)
      62              :   double precision :: genafm(3)
      63              :   double precision :: temp1(3,1), temp2(3,1)
      64           44 :   double precision, allocatable :: spinat(:,:)
      65           44 :   double precision, allocatable :: tnons(:,:)
      66           44 :   double precision, allocatable :: tmp1(:,:)
      67              : 
      68              : 
      69              : ! Compute all the symetries coming from the bravais lattice
      70              : ! The routine used is symlatt (from Abinit code)
      71              : ! GA: FIXME msym needs to be an input variable
      72           44 :   Sym%msym=1000 !msym needs to be very large due to non-primitive cell calculations
      73       572044 :   ABI_MALLOC(Sym%ptsymrel,(3,3,Sym%msym)) ; Sym%ptsymrel(:,:,:)=0
      74           44 :   call symlatt(Invar%bravais,std_out,Sym%msym,Sym%nptsym,Sym%ptsymrel,Lattice%rprimdt,tol8)
      75           44 :   write(Invar%stdout,'(a,1x,11(i4,1x))')' bravais=',Invar%bravais(:)
      76           44 :   Sym%nsym=Sym%nptsym
      77              : 
      78              : ! Initialize all the symetries using the first atom at (0.0;0.0;0.0)
      79          556 :   ABI_MALLOC(Sym%xred_zero,(3,Invar%natom_unitcell))        ; Sym%xred_zero(:,:)=0.d0
      80          150 :   do iatom_unitcell=1,Invar%natom_unitcell
      81          424 :     temp1(:,1)=Invar%xred_unitcell(:,iatom_unitcell)-Invar%xred_unitcell(:,1)
      82          424 :     do ii=1,3
      83          318 :       if (temp1(ii,1).lt.0.d0) then
      84           66 :         jj=int(temp1(ii,1)+1.0)
      85          252 :       else if (temp1(ii,1).ge.0.d0) then
      86          252 :         jj=int(temp1(ii,1)+0.0)
      87              :       end if
      88          424 :       temp2(ii,1)=temp1(ii,1)-real(jj)
      89              :     end do
      90          468 :     Sym%xred_zero(:,iatom_unitcell)=temp2(:,1)
      91              :   end do
      92              : 
      93              : ! Calculation of the (non-symmorphic) translations
      94           44 :   nspden=1
      95          512 :   ABI_MALLOC(spinat,(3,Invar%natom_unitcell)); spinat(:,:)=0.d0
      96           44 :   use_inversion=1
      97       572132 :   ABI_MALLOC(symrel    ,(3,3,Sym%msym)) ; symrel    (:,:,:)=0
      98       176132 :   ABI_MALLOC(tnons       ,(3,Sym%msym)) ; tnons       (:,:)=0.d0
      99        44132 :   ABI_MALLOC(symafm        ,(Sym%msym)) ; symafm        (:)=1
     100              :   call symfind(Lattice%gprimd,Sym%msym,Invar%natom_unitcell,Sym%nptsym,nspden,Sym%nsym,&
     101           44 : &      0,Sym%ptsymrel,spinat,symafm,symrel,tnons,tol8,Invar%typat_unitcell,use_inversion,Sym%xred_zero)
     102           44 :   ABI_FREE(spinat)
     103        21218 :   ABI_MALLOC(Sym%symrel,(3,3,Sym%nsym)) ; Sym%symrel(:,:,:)=0
     104         6620 :   ABI_MALLOC(Sym%tnons   ,(3,Sym%nsym)) ; Sym%tnons   (:,:)=0.d0
     105         1754 :   ABI_MALLOC(Sym%symafm    ,(Sym%nsym)) ; Sym%symafm    (:)=1
     106        21130 :   Sym%symrel(:,:,:)=symrel(:,:,1:Sym%nsym)
     107         6532 :   Sym%tnons   (:,:)=tnons   (:,1:Sym%nsym)
     108         1666 :   Sym%symafm    (:)=symafm    (1:Sym%nsym)
     109           44 :   ABI_FREE(symrel)
     110           44 :   ABI_FREE(tnons)
     111           44 :   ABI_FREE(symafm)
     112           44 :   if (Sym%nptsym.ne.Sym%nsym) then
     113            3 :     write(Invar%stdlog,'(a,i4,a,i4)') 'WARNING: nsym=',Sym%nsym,' is not equal to nptsym=',Sym%nptsym
     114            3 :     write(Invar%stdlog,'(a)') ' Symrel='
     115          293 :     do isym=1,Sym%nsym
     116          290 :       write(Invar%stdlog,*) ' For sym=',isym
     117          290 :       write(Invar%stdlog,*) Sym%symrel(1,:,isym)
     118          290 :       write(Invar%stdlog,*) Sym%symrel(2,:,isym)
     119          293 :       write(Invar%stdlog,*) Sym%symrel(3,:,isym)
     120              :     end do
     121            3 :     write(Invar%stdlog,'(a)') ' Ptsymrel='
     122          111 :     do isym=1,Sym%nptsym
     123          108 :       write(Invar%stdlog,*) ' For sym=',isym
     124          108 :       write(Invar%stdlog,*) Sym%ptsymrel(1,:,isym)
     125          108 :       write(Invar%stdlog,*) Sym%ptsymrel(2,:,isym)
     126          111 :       write(Invar%stdlog,*) Sym%ptsymrel(3,:,isym)
     127              :     end do
     128              :   end if
     129              : 
     130              : ! Calculation of symrec
     131        21218 :   ABI_MALLOC(Sym%symrec,(3,3,Sym%nsym)); Sym%symrec(:,:,:)=0
     132         1666 :   do isym=1,Sym%nsym
     133         1666 :     call mati3inv(Sym%symrel(:,:,isym),Sym%symrec(:,:,isym))
     134              :   end do
     135              : ! Calculation of spgroup
     136           44 :   chkprim=0
     137           44 :   genafm(:)=0.d0
     138              :   ptgroupma=0
     139           44 :   Sym%spgroup=0
     140           44 :   call symanal(bravais,chkprim,genafm,Sym%msym,Sym%nsym,ptgroupma,Lattice%rprimdt,Sym%spgroup,Sym%symafm,Sym%symrel,Sym%tnons,tol8)
     141              : 
     142              : ! Transform S_ref in cartesian coordinates
     143        21262 :   ABI_MALLOC(Sym%S_ref,(3,3,Sym%nsym,2)) ; Sym%S_ref(:,:,:,1)=real(Sym%symrel(:,:,1:Sym%nsym))
     144        21174 :   ABI_MALLOC(Sym%S_inv,(3,3,Sym%nsym,2)) ; Sym%S_inv(:,:,:,1)=zero
     145          572 :   ABI_MALLOC(tmp1,(3,3)); tmp1(:,:)=0.d0
     146           44 :   if (MPIdata%iam_master) open(unit=75,file=trim(Invar%output_prefix)//'_sym.dat')
     147         1666 :   do isym=1,Sym%nsym
     148         1622 :     if (MPIdata%iam_master) then
     149         1622 :       write(75,*) ' '
     150         1622 :       write(75,*) 'For isym=',isym
     151         1622 :       write(75,*) 'In reduced coordinates:'
     152         1622 :       write(75,'(3(f5.2,1x))') Sym%S_ref(1,1,isym,1),Sym%S_ref(1,2,isym,1),Sym%S_ref(1,3,isym,1)
     153         1622 :       write(75,'(3(f5.2,1x))') Sym%S_ref(2,1,isym,1),Sym%S_ref(2,2,isym,1),Sym%S_ref(2,3,isym,1)
     154         1622 :       write(75,'(3(f5.2,1x))') Sym%S_ref(3,1,isym,1),Sym%S_ref(3,2,isym,1),Sym%S_ref(3,3,isym,1)
     155              :     end if
     156         1622 :     call DGEMM('N','N',3,3,3,1.d0,Lattice%rprimdt,3,Sym%S_ref(:,:,isym,1),3,0.d0,tmp1,3)
     157         1622 :     call DGEMM('N','N',3,3,3,1.d0,tmp1,3,Lattice%rprimdtm1,3,0.d0,Sym%S_ref(:,:,isym,1),3)
     158         6488 :     do ii=1,3
     159        21086 :       do jj=1,3
     160        19464 :         if (abs(Sym%S_ref(ii,jj,isym,1)).lt.tol8) Sym%S_ref(ii,jj,isym,1)=zero
     161              :       end do
     162              :     end do
     163              : !   Inversion of S_ref (which is equivalent to the transposition)
     164         6488 :     do ii=1,3
     165        21086 :       do jj=1,3
     166        19464 :         Sym%S_inv(ii,jj,isym,1)=Sym%S_ref(jj,ii,isym,1)
     167              :       end do
     168              :     end do
     169         1666 :     if (MPIdata%iam_master) then
     170         1622 :       write(75,*) 'In cartesian coordinates:'
     171         1622 :       write(75,'(3(f5.2,1x))') Sym%S_ref(1,1,isym,1),Sym%S_ref(1,2,isym,1),Sym%S_ref(1,3,isym,1)
     172         1622 :       write(75,'(3(f5.2,1x))') Sym%S_ref(2,1,isym,1),Sym%S_ref(2,2,isym,1),Sym%S_ref(2,3,isym,1)
     173         1622 :       write(75,'(3(f5.2,1x))') Sym%S_ref(3,1,isym,1),Sym%S_ref(3,2,isym,1),Sym%S_ref(3,3,isym,1)
     174              :     end if
     175              :   end do
     176           44 :   if (MPIdata%iam_master) close(75)
     177           44 :   write(Invar%stdout,'(a)') ' See the sym.dat file'
     178              : 
     179              : ! We verify that S.S^T = Id
     180          572 :   tmp1(:,:)=zero
     181         1666 :   do isym=1,Sym%nsym
     182         1622 :     call DGEMM('T','N',3,3,3,1.d0,Sym%S_ref(:,:,isym,1),3,Sym%S_ref(:,:,isym,1),3,0.d0,tmp1,3)
     183         6532 :     do ii=1,3
     184        21086 :       do jj=1,3
     185        19464 :         if ((ii/=jj.and.abs(tmp1(ii,jj)).gt.tol8).or.(ii==jj.and.abs(tmp1(ii,jj)-1.d0).gt.tol8)) then
     186            0 :           write(Invar%stdout,'(a)') ' STOP : the matrix is not orthogonal : '
     187            0 :           write(Invar%stdout,'(a,1x,i3,1x,i3,1x,f15.10)') ' ii, jj, sym(ii,jj)=',ii,jj,tmp1(ii,jj)
     188            0 :           ABI_ERROR('The matrix is not orthogonal')
     189              :         end if
     190              :       end do
     191              :     end do
     192              :   end do
     193              : 
     194           44 :   ABI_FREE(tmp1)
     195              : 
     196           44 :  end subroutine tdep_make_sym
     197              : 
     198              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     199              : 
     200           44 :  subroutine tdep_SearchS_1at(Invar,MPIdata,Sym,xred_ideal)
     201              : 
     202              :   type(atdep_dataset_type), intent(in) :: Invar
     203              :   type(Symmetries_type), intent(inout) :: Sym
     204              :   type(MPI_enreg_type), intent(in) :: MPIdata
     205              :   double precision, intent(in) :: xred_ideal(3,Invar%natom)
     206              : 
     207              :   integer :: isym,jatom,mu
     208              :   integer :: iatom_unitcell,jatom_unitcell,iatom
     209           88 :   integer :: vecti(3),vectj(3),vectsym(4,Sym%nsym)
     210           44 :   integer, allocatable :: indsym2(:,:,:,:)
     211              :   double precision :: temp3(3,1)
     212           88 :   double precision :: tmpi(3,Invar%natom),tmpj(3,Invar%natom),tmp_store(3,Invar%natom_unitcell)
     213              : 
     214           44 :   write(Invar%stdout,*) ' '
     215           44 :   write(Invar%stdout,*) '#############################################################################'
     216           44 :   write(Invar%stdout,*) '###################### Find the symetry operations ##########################'
     217           44 :   write(Invar%stdout,*) '#################### (connecting the atoms together) ########################'
     218           44 :   write(Invar%stdout,*) '#############################################################################'
     219              : 
     220              : !  write(Invar%stdout,'(a)') 'Begining SearchS'
     221              : ! TODO: Initialize the local variables at 0
     222              : 
     223              : ! Compute the indsym fundamental quantity
     224              : ! === Obtain a list of rotated atoms ===
     225              : ! $ R^{-1} (xred(:,iat)-\tau) = xred(:,iat_sym) + R_0 $
     226              : ! * indsym(4,  isym,iat) gives iat_sym in the original unit cell.
     227              : ! * indsym(1:3,isym,iat) gives the lattice vector $R_0$.
     228           44 :   write(Invar%stdout,'(a)') ' Search the matrix transformation going from (k) to (i)...'
     229      1207538 :   ABI_MALLOC(Sym%indsym,(4,Sym%nsym,Invar%natom)); Sym%indsym(:,:,:)=zero
     230              :   call symatm(Sym%indsym(:,:,1:Invar%natom_unitcell),Invar%natom_unitcell,Sym%nsym,&
     231           44 : &   Sym%symrec,Sym%tnons,tol8,Invar%typat_unitcell,Sym%xred_zero)
     232              : 
     233              : ! Store the positions of the atoms in the motif
     234          150 :   do iatom=1,Invar%natom_unitcell
     235          150 :     call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,iatom),1,0.d0,tmp_store(:,iatom),1)
     236              :   end do
     237              : ! Write the Indsym of the atoms included in the (reference) unitcell (i.e.: the motif)
     238           44 :   if (Invar%debug.and.MPIdata%iam_master) then
     239            2 :     open(unit=40,file=trim(Invar%output_prefix)//'_Indsym-unitcell.dat')
     240           12 :     do iatom=1,Invar%natom_unitcell
     241           10 :       write(40,*) '=========================================='
     242           10 :       write(40,'(a,i4,a,3(f10.5,1x))') 'For iatom=',iatom,' with xred (supercell)=',xred_ideal(:,iatom)
     243          172 :       do isym=1,Sym%nsym
     244          160 :         write(40,'(a,i2,a,i4,a,3(i4,1x),a,i2,a,3(f10.5,1x))') '  indsym(isym=',isym,',',iatom,')=',&
     245          330 : &         Sym%indsym(1:3,isym,iatom),'|iat=',Sym%indsym(4,isym,iatom),'| with tnons=',Sym%tnons(:,isym)
     246              :       end do
     247              :     end do
     248            2 :     close(40)
     249              :   end if
     250              : 
     251              : ! Search the matrix transformation going from (k,l) to (i,j)
     252           44 :   write(Invar%stdout,'(a)') ' Search the matrix transformation going from (k,l) to (i,j)...'
     253    404752562 :   ABI_MALLOC(indsym2,(8,Sym%nsym,Invar%natom,Invar%natom)); indsym2(:,:,:,:)=0
     254        27572 :   tmpi(:,:)=0.d0
     255        27572 :   tmpj(:,:)=0.d0
     256         6926 :   do iatom=1,Invar%natom
     257              : !   For a single iatom
     258         6882 :     call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,iatom),1,0.d0,tmpi(:,iatom),1)
     259         6882 :     iatom_unitcell=mod(iatom-1,Invar%natom_unitcell)+1
     260        27528 :     vecti(:)=nint(tmpi(:,iatom)-tmp_store(:,iatom_unitcell))
     261       247022 :     do isym=1,Sym%nsym
     262     69595616 :       vectsym(:,:)=0
     263       960384 :       do mu=1,3 ! Apply inverse transformation to original coordinates. Note transpose of symrec.
     264       960384 :         vectsym(mu,isym) = Sym%symrec(1,mu,isym)*vecti(1)+Sym%symrec(2,mu,isym)*vecti(2)+Sym%symrec(3,mu,isym)*vecti(3)
     265              :       end do
     266      1200480 :       Sym%indsym(1:4,isym,iatom)=Sym%indsym(1:4,isym,iatom_unitcell)+vectsym(1:4,isym)
     267     45055106 :       do jatom=1,Invar%natom
     268    224280736 :         indsym2(1:4,isym,iatom,jatom)=Sym%indsym(1:4,isym,iatom_unitcell)+vectsym(1:4,isym)
     269              :       end do
     270              :     end do
     271              :   end do
     272           44 :   if (Invar%debug.and.MPIdata%iam_master) then
     273            2 :     open(unit=40,file=trim(Invar%output_prefix)//'_Indsym-supercell.dat')
     274          226 :     do iatom=1,Invar%natom
     275          224 :       write(40,*) '=========================================='
     276          224 :       write(40,'(a,i4,a,3(f10.5,1x))') 'For iatom=',iatom,' with xred (supercell)=',xred_ideal(:,iatom)
     277         7136 :       do isym=1,Sym%nsym
     278         6912 :         write(40,'(a,i2,a,i4,a,3(i4,1x),a,i2,a,3(f10.5,1x))') '  indsym(isym=',isym,',',iatom,')=',&
     279        14048 : &         Sym%indsym(1:3,isym,iatom),'|iat=',Sym%indsym(4,isym,iatom),'| with tnons=',Sym%tnons(:,isym)
     280              :       end do
     281          226 :       write(40,'(a,i4)') ' '
     282              :     end do
     283            2 :     close(40)
     284              :   end if
     285              : 
     286              : ! For a couple of (iatom,jatom). The (iatom,jatom) vector depends on the position of iatom (due to PBC)
     287         6926 :   do iatom=1,Invar%natom
     288      1479234 :     do jatom=1,Invar%natom
     289      5889232 :       temp3(:,1)=xred_ideal(:,jatom)-xred_ideal(:,iatom)
     290      1472308 :       call tdep_make_inbox(temp3(:,1),1,1d-3,temp3(:,1))
     291      5889232 :       temp3(:,1)=xred_ideal(:,iatom)+temp3(:,1)
     292      1472308 :       call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp3(:,1),1,0.d0,tmpj(:,jatom),1)
     293      1472308 :       jatom_unitcell=mod(jatom-1,Invar%natom_unitcell)+1
     294      5889232 :       vectj(:)=nint(tmpj(:,jatom)-tmp_store(:,jatom_unitcell))
     295     46287318 :       do isym=1,Sym%nsym
     296  11296166848 :         vectsym(:,:)=0
     297    179232512 :         do mu=1,3 ! Apply inverse transformation to original coordinates. Note transpose of symrec.
     298    179232512 :           vectsym(mu,isym) = Sym%symrec(1,mu,isym)*vectj(1)+Sym%symrec(2,mu,isym)*vectj(2)+Sym%symrec(3,mu,isym)*vectj(3)
     299              :         end do
     300    225512948 :         indsym2(5:8,isym,iatom,jatom)=Sym%indsym(1:4,isym,jatom_unitcell)+vectsym(1:4,isym)
     301              :       end do
     302              :     end do
     303              :   end do
     304           44 :   if (Invar%debug.and.MPIdata%iam_master) then
     305            2 :     open(unit=40,file=trim(Invar%output_prefix)//'_Indsym-2atoms.dat')
     306          226 :     do iatom=1,Invar%natom
     307          224 :       write(40,*) '=========================================='
     308          224 :       write(40,'(a,i4,a,3(f10.5,1x))') 'For iatom=',iatom,' with xred (supercell)=',xred_ideal(:,iatom)
     309        25824 :       do jatom=1,Invar%natom
     310        25600 :         write(40,*) '  =========================================='
     311        25600 :         write(40,'(a,i4,a,3(f10.5,1x))') '  For jatom=',jatom,' with xred (supercell)=',xred_ideal(:,jatom)
     312       885984 :         do isym=1,Sym%nsym
     313       860160 :           write(40,'(a,i2,a,i4,a,i4,a,3(i4,1x),a,i2,a,3(i4,1x),a,i2,a)') '  indsym2(isym=',isym,',',iatom,',',jatom,')=',&
     314       860160 : &           indsym2(1:3,isym,iatom,jatom),&
     315      1745920 : &           '|iat=',indsym2(4,isym,iatom,jatom),'|',indsym2(5:7,isym,iatom,jatom),'|iat=',indsym2(8,isym,iatom,jatom),'|'
     316              :         end do
     317              :       end do
     318          226 :       write(40,'(a,i4)') ' '
     319              :     end do
     320            2 :     close(40)
     321              :   end if
     322           44 :   ABI_FREE(indsym2)
     323           44 :   write(Invar%stdout,'(a)') ' See the Indsym*.dat files (if debug)'
     324              : 
     325           44 :  end subroutine tdep_SearchS_1at
     326              : 
     327              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     328       306801 :  subroutine tdep_SearchS_2at(Invar,iatom,jatom,eatom,fatom,Isym2at,Sym,xred_ideal)
     329              : 
     330              :   integer, intent(in) :: iatom,jatom,eatom,fatom
     331              :   type(atdep_dataset_type),intent(in) :: Invar
     332              :   type(Symmetries_type),intent(in) :: Sym
     333              :   integer, intent(inout) :: Isym2at(Invar%natom,Invar%natom,2)
     334              :   double precision, intent(in) :: xred_ideal(3,Invar%natom)
     335              : 
     336              :   integer :: isym,ee,ff,ii
     337              :   integer :: iatom_unitcell,jatom_unitcell
     338              :   integer :: vecti(3),vectj(3),latte(3),lattf(3),indsym2(8)
     339       613602 :   double precision :: temp(3),tmp_store(3,Invar%natom_unitcell)
     340       613602 :   double precision :: tmp(3,Invar%natom)
     341              :   logical :: ok
     342              : 
     343              : ! Search the couple of atoms (e,f) obtained through the transformation (R+t)
     344              : ! starting from (i,j)
     345              : ! In that case, note that two cases are possible:
     346              : ! - The bond is just transformed, so indsym(4,e)=i and indsym(4,f)=j
     347              : ! - The bond is transformed and reversed, so indsym(4,e)=j and indsym(4,f)=i
     348              : 
     349              : ! Store the positions of the atoms in the motif
     350       931887 :   do ii=1,Invar%natom_unitcell
     351       931887 :     call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp_store(:,ii),1)
     352              :   end do
     353              : 
     354              : ! Search the atom equivalent to iatom in the (reference) unitcell
     355     77606881 :   do ii=1,Invar%natom
     356     77606881 :     call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp(:,ii),1)
     357              :   end do
     358              : ! Note that in the (present) particular case : iatom_unitcell=iatom and vecti(:)=zero
     359       306801 :   iatom_unitcell=mod(iatom-1,Invar%natom_unitcell)+1
     360      1227204 :   vecti(:)=nint(tmp(:,iatom)-tmp(:,iatom_unitcell))
     361              : 
     362              : ! Search the atom equivalent to jatom in the (reference) unitcell.
     363              : ! jatom can be outside the box (according to the value of iatom)
     364              : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
     365      1227204 :   temp(:)=xred_ideal(:,jatom)-xred_ideal(:,iatom)
     366       306801 :   call tdep_make_inbox(temp,1,1d-3,temp)
     367      1227204 :   temp(:)=xred_ideal(:,iatom)+temp(:)
     368       306801 :   call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,jatom),1)
     369       306801 :   jatom_unitcell=mod(jatom-1,Invar%natom_unitcell)+1
     370      1227204 :   vectj(:)=nint(tmp(:,jatom)-tmp_store(:,jatom_unitcell))
     371              : 
     372              : ! To understand the meaning of "latt", see SearchS_1at
     373       306801 :   ok=.false.
     374      5232538 :   do isym=1,Sym%nsym
     375      5178841 :     indsym2(:)=0
     376      5178841 :     call tdep_calc_indsym2(Invar,eatom,fatom,indsym2,isym,Sym,xred_ideal)
     377      5178841 :     ee=indsym2(4)
     378      5178841 :     ff=indsym2(8)
     379     20715364 :     latte(:)=indsym2(1:3)
     380     20715364 :     lattf(:)=indsym2(5:7)
     381      5178841 :     if (ee==iatom_unitcell.and.ff==jatom_unitcell) then
     382              : !FB      if (Invar%debug) then
     383              : !FB        write(Invar%stdout,*) 'For ee=iatom and ff=jatom, isym=',isym
     384              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vecti(1),' - ',vectj(1),' - ',latte(1),' + ',lattf(1)
     385              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vecti(2),' - ',vectj(2),' - ',latte(2),' + ',lattf(2)
     386              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vecti(3),' - ',vectj(3),' - ',latte(3),' + ',lattf(3)
     387              : !FB      end if
     388     10628184 :       if (sum(abs((vecti(:)-latte(:))-(vectj(:)-lattf(:)))).lt.tol8) then
     389       253104 :         Isym2at(eatom,fatom,1)=isym
     390       253104 :         Isym2at(eatom,fatom,2)=1
     391              :         ok=.true.
     392              :       end if
     393              :     end if
     394        53697 :     if (ok) exit
     395              :   end do
     396              : 
     397       306801 :  end subroutine tdep_SearchS_2at
     398              : 
     399              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     400        36986 :  subroutine tdep_SearchS_3at(Invar,iatom,jatom,katom,eatom,fatom,gatom,Isym3at,Sym,xred_ideal)
     401              : 
     402              :   integer, intent(in) :: iatom,jatom,katom,eatom,fatom,gatom
     403              :   type(atdep_dataset_type),intent(in) :: Invar
     404              :   type(Symmetries_type),intent(in) :: Sym
     405              :   integer, intent(inout) :: Isym3at(2)
     406              :   double precision, intent(in) :: xred_ideal(3,Invar%natom)
     407              : 
     408              :   integer :: isym,ee,ff,gg,ii
     409              :   integer :: iatom_unitcell,jatom_unitcell,katom_unitcell
     410              :   integer :: vecti(3),vectj(3),vectk(3),indsym2(8)
     411              :   integer :: lattef(3),lattfg(3),lattge(3),lattfe(3),lattgf(3),latteg(3)
     412        73972 :   double precision :: temp(3),tmp_store(3,Invar%natom_unitcell)
     413        73972 :   double precision :: tmp(3,Invar%natom)
     414              :   logical :: ok
     415              : 
     416              : ! Search the couple of atoms (e,f) obtained through the transformation (R+t)
     417              : ! starting from (i,j)
     418              : ! In that case, note that two cases are possible:
     419              : ! - The bond is just transformed, so indsym(4,e)=i and indsym(4,f)=j
     420              : ! - The bond is transformed and reversed, so indsym(4,e)=j and indsym(4,f)=i
     421              : 
     422              : ! Store the positions of the atoms in the motif
     423       124446 :   do ii=1,Invar%natom_unitcell
     424       124446 :     call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp_store(:,ii),1)
     425              :   end do
     426              : 
     427              : ! Search the atom equivalent to iatom in the (reference) unitcell
     428      6147570 :   do ii=1,Invar%natom
     429      6147570 :     call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp(:,ii),1)
     430              :   end do
     431              : ! Note that in the (present) particular case : iatom_unitcell=iatom and vecti(:)=zero
     432        36986 :   iatom_unitcell=mod(iatom-1,Invar%natom_unitcell)+1
     433       147944 :   vecti(:)=nint(tmp(:,iatom)-tmp(:,iatom_unitcell))
     434              : 
     435              : ! Search the atom equivalent to jatom in the (reference) unitcell.
     436              : ! jatom can be outside the box (according to the value of iatom)
     437              : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
     438       147944 :   temp(:)=xred_ideal(:,jatom)-xred_ideal(:,iatom)
     439        36986 :   call tdep_make_inbox(temp,1,1d-3,temp)
     440       147944 :   temp(:)=xred_ideal(:,iatom)+temp(:)
     441        36986 :   call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,jatom),1)
     442        36986 :   jatom_unitcell=mod(jatom-1,Invar%natom_unitcell)+1
     443       147944 :   vectj(:)=nint(tmp(:,jatom)-tmp_store(:,jatom_unitcell))
     444              : 
     445              : ! Search the atom equivalent to katom in the (reference) unitcell.
     446              : ! katom can be outside the box (according to the value of iatom)
     447              : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
     448       147944 :   temp(:)=xred_ideal(:,katom)-xred_ideal(:,iatom)
     449        36986 :   call tdep_make_inbox(temp,1,1d-3,temp)
     450       147944 :   temp(:)=xred_ideal(:,iatom)+temp(:)
     451        36986 :   call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,katom),1)
     452        36986 :   katom_unitcell=mod(katom-1,Invar%natom_unitcell)+1
     453       147944 :   vectk(:)=nint(tmp(:,katom)-tmp_store(:,katom_unitcell))
     454              : 
     455              : ! To understand the meaning of "latt", see SearchS_1at
     456        36986 :   ok=.false.
     457       907139 :   do isym=1,Sym%nsym
     458              : !   TODO : A CHECKER!!!!!!!!!!!!!!!!!
     459       892539 :     indsym2(:)=zero
     460       892539 :     call tdep_calc_indsym2(Invar,eatom,fatom,indsym2,isym,Sym,xred_ideal)
     461       892539 :     ee=indsym2(4)
     462      3570156 :     lattef(:)=indsym2(1:3)
     463      3570156 :     lattfe(:)=indsym2(5:7)
     464              : 
     465       892539 :     indsym2(:)=zero
     466       892539 :     call tdep_calc_indsym2(Invar,fatom,gatom,indsym2,isym,Sym,xred_ideal)
     467       892539 :     ff=indsym2(4)
     468      3570156 :     lattfg(:)=indsym2(1:3)
     469      3570156 :     lattgf(:)=indsym2(5:7)
     470              : 
     471       892539 :     indsym2(:)=zero
     472       892539 :     call tdep_calc_indsym2(Invar,gatom,eatom,indsym2,isym,Sym,xred_ideal)
     473       892539 :     gg=indsym2(4)
     474      3570156 :     lattge(:)=indsym2(1:3)
     475      3570156 :     latteg(:)=indsym2(5:7)
     476       892539 :     if (ee==iatom_unitcell.and.ff==jatom_unitcell.and.gg==katom_unitcell) then
     477              : !FB      if (Invar%debug) then
     478              : !FB        write(Invar%stdout,*) 'For ee=iatom, ff=jatom and gg=katom, isym=',isym
     479              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vecti(1),' - ',vectj(1),' - ',lattef(1),' + ',lattfe(1)
     480              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vecti(2),' - ',vectj(2),' - ',lattef(2),' + ',lattfe(2)
     481              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vecti(3),' - ',vectj(3),' - ',lattef(3),' + ',lattfe(3)
     482              : !FB        write(Invar%stdout,*) ' '
     483              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectj(1),' - ',vectk(1),' - ',lattfg(1),' + ',lattgf(1)
     484              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectj(2),' - ',vectk(2),' - ',lattfg(2),' + ',lattgf(2)
     485              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectj(3),' - ',vectk(3),' - ',lattfg(3),' + ',lattgf(3)
     486              : !FB        write(Invar%stdout,*) ' '
     487              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectk(1),' - ',vecti(1),' - ',lattge(1),' + ',latteg(1)
     488              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectk(2),' - ',vecti(2),' - ',lattge(2),' + ',latteg(2)
     489              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectk(3),' - ',vecti(3),' - ',lattge(3),' + ',latteg(3)
     490              : !FB        write(Invar%stdout,*) ' '
     491              : !FB      end if
     492              :       if ((sum(abs((vecti(:)-lattef(:))-(vectj(:)-lattfe(:)))).lt.tol8).and.&
     493      1812760 : &         (sum(abs((vectj(:)-lattfg(:))-(vectk(:)-lattgf(:)))).lt.tol8).and.&
     494              : &         (sum(abs((vectk(:)-lattge(:))-(vecti(:)-latteg(:)))).lt.tol8)) then
     495        22386 :         Isym3at(1)=isym
     496        22386 :         Isym3at(2)=1
     497              :         ok=.true.
     498              :       end if
     499              :     end if
     500        14600 :     if (ok) exit
     501              :   end do
     502              : 
     503        36986 :  end subroutine tdep_SearchS_3at
     504              : 
     505              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     506        66824 :  subroutine tdep_SearchS_4at(Invar,iatom,jatom,katom,latom,eatom,fatom,gatom,hatom,Isym4at,Sym,xred_ideal)
     507              : 
     508              :   integer, intent(in) :: iatom,jatom,katom,latom,eatom,fatom,gatom,hatom
     509              :   type(atdep_dataset_type),intent(in) :: Invar
     510              :   type(Symmetries_type),intent(in) :: Sym
     511              :   integer, intent(inout) :: Isym4at(2)
     512              :   double precision, intent(in) :: xred_ideal(3,Invar%natom)
     513              : 
     514              :   integer :: isym,ee,ff,gg,hh,ii
     515              :   integer :: iatom_unitcell,jatom_unitcell,katom_unitcell,latom_unitcell
     516              :   integer :: vecti(3),vectj(3),vectk(3),vectl(3),indsym2(8)
     517              :   integer :: lattef(3),lattfe(3)
     518              :   integer :: latteg(3),lattge(3)
     519              :   integer :: latteh(3),latthe(3)
     520              :   integer :: lattfg(3),lattgf(3)
     521              :   integer :: lattfh(3),latthf(3)
     522              :   integer :: lattgh(3),latthg(3)
     523       133648 :   double precision :: temp(3),tmp_store(3,Invar%natom_unitcell)
     524       133648 :   double precision :: tmp(3,Invar%natom)
     525              :   logical :: ok
     526              : 
     527              : ! Search the couple of atoms (e,f) obtained through the transformation (R+t)
     528              : ! starting from (i,j)
     529              : ! In that case, note that two cases are possible:
     530              : ! - The bond is just transformed, so indsym(4,e)=i and indsym(4,f)=j
     531              : ! - The bond is transformed and reversed, so indsym(4,e)=j and indsym(4,f)=i
     532              : 
     533              : ! Store the positions of the atoms in the motif
     534       226052 :   do ii=1,Invar%natom_unitcell
     535       226052 :     call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp_store(:,ii),1)
     536              :   end do
     537              : 
     538              : ! Search the atom equivalent to iatom in the (reference) unitcell
     539     10948880 :   do ii=1,Invar%natom
     540     10948880 :     call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp(:,ii),1)
     541              :   end do
     542              : ! Note that in the (present) particular case : iatom_unitcell=iatom and vecti(:)=zero
     543        66824 :   iatom_unitcell=mod(iatom-1,Invar%natom_unitcell)+1
     544       267296 :   vecti(:)=nint(tmp(:,iatom)-tmp(:,iatom_unitcell))
     545              : 
     546              : ! Search the atom equivalent to jatom in the (reference) unitcell.
     547              : ! jatom can be outside the box (according to the value of iatom)
     548              : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
     549       267296 :   temp(:)=xred_ideal(:,jatom)-xred_ideal(:,iatom)
     550        66824 :   call tdep_make_inbox(temp,1,1d-3,temp)
     551       267296 :   temp(:)=xred_ideal(:,iatom)+temp(:)
     552        66824 :   call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,jatom),1)
     553        66824 :   jatom_unitcell=mod(jatom-1,Invar%natom_unitcell)+1
     554       267296 :   vectj(:)=nint(tmp(:,jatom)-tmp_store(:,jatom_unitcell))
     555              : 
     556              : ! Search the atom equivalent to katom in the (reference) unitcell.
     557              : ! katom can be outside the box (according to the value of iatom)
     558              : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
     559       267296 :   temp(:)=xred_ideal(:,katom)-xred_ideal(:,iatom)
     560        66824 :   call tdep_make_inbox(temp,1,1d-3,temp)
     561       267296 :   temp(:)=xred_ideal(:,iatom)+temp(:)
     562        66824 :   call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,katom),1)
     563        66824 :   katom_unitcell=mod(katom-1,Invar%natom_unitcell)+1
     564       267296 :   vectk(:)=nint(tmp(:,katom)-tmp_store(:,katom_unitcell))
     565              : 
     566              : ! Search the atom equivalent to latom in the (reference) unitcell.
     567              : ! latom can be outside the box (according to the value of iatom)
     568              : ! so we use the inbox procedure to put the distance within [-0.5,0.5[
     569       267296 :   temp(:)=xred_ideal(:,latom)-xred_ideal(:,iatom)
     570        66824 :   call tdep_make_inbox(temp,1,1d-3,temp)
     571       267296 :   temp(:)=xred_ideal(:,iatom)+temp(:)
     572        66824 :   call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp(:),1,0.d0,tmp(:,latom),1)
     573        66824 :   latom_unitcell=mod(latom-1,Invar%natom_unitcell)+1
     574       267296 :   vectl(:)=nint(tmp(:,latom)-tmp_store(:,latom_unitcell))
     575              : 
     576              : ! To understand the meaning of "latt", see SearchS_1at
     577        66824 :   ok=.false.
     578      2069687 :   do isym=1,Sym%nsym
     579              : !   TODO : A CHECKER!!!!!!!!!!!!!!!!!
     580      2033675 :     indsym2(:)=zero
     581      2033675 :     call tdep_calc_indsym2(Invar,eatom,fatom,indsym2,isym,Sym,xred_ideal)
     582      2033675 :     ee=indsym2(4)
     583      2033675 :     ff=indsym2(8)
     584      8134700 :     lattef(:)=indsym2(1:3)
     585      8134700 :     lattfe(:)=indsym2(5:7)
     586              : 
     587      2033675 :     indsym2(:)=zero
     588      2033675 :     call tdep_calc_indsym2(Invar,eatom,gatom,indsym2,isym,Sym,xred_ideal)
     589      2033675 :     gg=indsym2(8)
     590      8134700 :     latteg(:)=indsym2(1:3)
     591      8134700 :     lattge(:)=indsym2(5:7)
     592              : 
     593      2033675 :     indsym2(:)=zero
     594      2033675 :     call tdep_calc_indsym2(Invar,eatom,hatom,indsym2,isym,Sym,xred_ideal)
     595      2033675 :     hh=indsym2(8)
     596      8134700 :     latteh(:)=indsym2(1:3)
     597      8134700 :     latthe(:)=indsym2(5:7)
     598              : 
     599      2033675 :     indsym2(:)=zero
     600      2033675 :     call tdep_calc_indsym2(Invar,fatom,gatom,indsym2,isym,Sym,xred_ideal)
     601      8134700 :     lattfg(:)=indsym2(1:3)
     602      8134700 :     lattgf(:)=indsym2(5:7)
     603              : 
     604      2033675 :     indsym2(:)=zero
     605      2033675 :     call tdep_calc_indsym2(Invar,fatom,hatom,indsym2,isym,Sym,xred_ideal)
     606      8134700 :     lattfh(:)=indsym2(1:3)
     607      8134700 :     latthf(:)=indsym2(5:7)
     608              : 
     609      2033675 :     indsym2(:)=zero
     610      2033675 :     call tdep_calc_indsym2(Invar,gatom,hatom,indsym2,isym,Sym,xred_ideal)
     611      8134700 :     lattgh(:)=indsym2(1:3)
     612      8134700 :     latthg(:)=indsym2(5:7)
     613              : 
     614      2033675 :     if (ee==iatom_unitcell.and.ff==jatom_unitcell.and.gg==katom_unitcell.and.hh==latom_unitcell) then
     615              : !FB      if (Invar%debug) then
     616              : !FB        write(Invar%stdout,*) 'For indef=iatom, indfg=jatom and indge=katom, isym=',isym
     617              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vecti(1),' - ',vectj(1),' - ',lattef(1),' + ',lattfe(1)
     618              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vecti(2),' - ',vectj(2),' - ',lattef(2),' + ',lattfe(2)
     619              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vecti(3),' - ',vectj(3),' - ',lattef(3),' + ',lattfe(3)
     620              : !FB        write(Invar%stdout,*) ' '
     621              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectj(1),' - ',vectk(1),' - ',lattfg(1),' + ',lattgf(1)
     622              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectj(2),' - ',vectk(2),' - ',lattfg(2),' + ',lattgf(2)
     623              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectj(3),' - ',vectk(3),' - ',lattfg(3),' + ',lattgf(3)
     624              : !FB        write(Invar%stdout,*) ' '
     625              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectk(1),' - ',vecti(1),' - ',lattge(1),' + ',latteg(1)
     626              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectk(2),' - ',vecti(2),' - ',lattge(2),' + ',latteg(2)
     627              : !FB        write(Invar%stdout,'(4(a,i4))') ' + ',vectk(3),' - ',vecti(3),' - ',lattge(3),' + ',latteg(3)
     628              : !FB        write(Invar%stdout,*) ' '
     629              : !FB      end if
     630              :       if ((sum(abs((vecti(:)-lattef(:))-(vectj(:)-lattfe(:)))).lt.tol8).and.&
     631              : &         (sum(abs((vecti(:)-latteg(:))-(vectk(:)-lattge(:)))).lt.tol8).and.&
     632              : &         (sum(abs((vecti(:)-latteh(:))-(vectl(:)-latthe(:)))).lt.tol8).and.&
     633              : &         (sum(abs((vectj(:)-lattfg(:))-(vectk(:)-lattgf(:)))).lt.tol8).and.&
     634      5712882 : &         (sum(abs((vectj(:)-lattfh(:))-(vectl(:)-latthf(:)))).lt.tol8).and.&
     635              : &         (sum(abs((vectk(:)-lattgh(:))-(vectl(:)-latthg(:)))).lt.tol8)) then
     636        30812 :         Isym4at(1)=isym
     637        30812 :         Isym4at(2)=1
     638              :         ok=.true.
     639              :       end if
     640              :     end if
     641        36012 :     if (ok) exit
     642              :   end do
     643              : 
     644        66824 :  end subroutine tdep_SearchS_4at
     645              : 
     646              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     647     20058508 :  subroutine tdep_calc_indsym2(Invar,iatom,jatom,indsym2,isym,Sym,xred_ideal)
     648              : 
     649              :   integer, intent(in) :: iatom,jatom
     650              :   type(atdep_dataset_type),intent(in) :: Invar
     651              :   type(Symmetries_type),intent(in) :: Sym
     652              :   integer, intent(out) :: indsym2(8)
     653              :   double precision, intent(in) :: xred_ideal(3,Invar%natom)
     654              : 
     655              :   integer :: isym,mu,ii
     656              :   integer :: iatom_unitcell,jatom_unitcell
     657     40117016 :   integer :: vecti(3),vectj(3),vectsym(4,Sym%nsym)
     658     40117016 :   double precision :: tmpi(3,Invar%natom),tmpj(3,Invar%natom),temp3(3,1),tmp_store(3,Invar%natom_unitcell)
     659              : 
     660              : ! Store the positions of the atoms in the motif
     661     66414480 :   do ii=1,Invar%natom_unitcell
     662     66414480 :     call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,ii),1,0.d0,tmp_store(:,ii),1)
     663              :   end do
     664              : 
     665              : ! Search the matrix transformation going from (k,l) to (i,j)
     666  14104154820 :   tmpi(:,:)=0.d0
     667  14104154820 :   tmpj(:,:)=0.d0
     668              : ! For a single iatom
     669     20058508 :   call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,xred_ideal(:,iatom),1,0.d0,tmpi(:,iatom),1)
     670     20058508 :   iatom_unitcell=mod(iatom-1,Invar%natom_unitcell)+1
     671     80234032 :   vecti(:)=nint(tmpi(:,iatom)-tmp_store(:,iatom_unitcell))
     672   4720379728 :   vectsym(:,:)=0
     673     80234032 :   do mu=1,3 ! Apply inverse transformation to original coordinates. Note transpose of symrec.
     674     80234032 :     vectsym(mu,isym) = Sym%symrec(1,mu,isym)*vecti(1)+Sym%symrec(2,mu,isym)*vecti(2)+Sym%symrec(3,mu,isym)*vecti(3)
     675              :   end do
     676    100292540 :   indsym2(1:4)=Sym%indsym(1:4,isym,iatom_unitcell)+vectsym(1:4,isym)
     677              : 
     678              : ! For a couple of (iatom,jatom). The (iatom,jatom) vector depends on the position of iatom (due to PBC)
     679              : !FB  if (Invar%debug) write(Invar%stdout,*) '=========================================='
     680              : !FB  if (Invar%debug) write(Invar%stdout,'(a,i4,a,3(f10.5,x))') 'For iatom=',iatom,' with xred=',xred_ideal(:,iatom)
     681              : !FB  if (Invar%debug) write(Invar%stdout,*) '  =========================================='
     682              : !FB  if (Invar%debug) write(Invar%stdout,'(a,i4,a,3(f10.5,x))') '  For jatom=',jatom,' with xred=',xred_ideal(:,jatom)
     683     80234032 :   temp3(:,1)=xred_ideal(:,jatom)-xred_ideal(:,iatom)
     684     20058508 :   call tdep_make_inbox(temp3(:,1),1,1d-3,temp3(:,1))
     685     80234032 :   temp3(:,1)=xred_ideal(:,iatom)+temp3(:,1)
     686     20058508 :   call DGEMV('T',3,3,1.d0,Invar%multiplicity(:,:),3,temp3(:,1),1,0.d0,tmpj(:,jatom),1)
     687     20058508 :   jatom_unitcell=mod(jatom-1,Invar%natom_unitcell)+1
     688     80234032 :   vectj(:)=nint(tmpj(:,jatom)-tmp_store(:,jatom_unitcell))
     689   4720379728 :   vectsym(:,:)=0
     690     80234032 :   do mu=1,3 ! Apply inverse transformation to original coordinates. Note transpose of symrec.
     691     80234032 :     vectsym(mu,isym) = Sym%symrec(1,mu,isym)*vectj(1)+Sym%symrec(2,mu,isym)*vectj(2)+Sym%symrec(3,mu,isym)*vectj(3)
     692              :   end do
     693    100292540 :   indsym2(5:8)=Sym%indsym(1:4,isym,jatom_unitcell)+vectsym(1:4,isym)
     694              : !FB  if (Invar%debug) then
     695              : !FB    write(Invar%stdout,'(a,i2,a,i4,a,i4,a,3(i4,x),a,i2,a,3(i4,x),a,i2,a)') '  indsym2(isym=',isym,',',iatom,',',jatom,')=',indsym2(1:3),&
     696              : !FB&     '|iat=',indsym2(4),'|',indsym2(5:7),'|iat=',indsym2(8),'|'
     697              : !FB  end if
     698              : 
     699     20058508 :  end subroutine tdep_calc_indsym2
     700              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     701              : 
     702           44 :  subroutine tdep_destroy_sym(Sym)
     703              : 
     704              :   type(Symmetries_type),intent(inout) :: Sym
     705              : 
     706           44 :   ABI_FREE(Sym%ptsymrel)
     707           44 :   ABI_FREE(Sym%S_ref)
     708           44 :   ABI_FREE(Sym%S_inv)
     709           44 :   ABI_FREE(Sym%xred_zero)
     710           44 :   ABI_FREE(Sym%tnons)
     711           44 :   ABI_FREE(Sym%symafm)
     712           44 :   ABI_FREE(Sym%symrec)
     713           44 :   ABI_FREE(Sym%symrel)
     714           44 :   ABI_FREE(Sym%indsym)
     715              : 
     716           44 :  end subroutine tdep_destroy_sym
     717              : 
     718              : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     719            0 : end module m_tdep_sym
        

Generated by: LCOV version 2.3-1