LCOV - code coverage report
Current view: top level - eigen_soc - eigenso.F90 (source / functions) Hit Total Coverage
Test: combined.info Lines: 51 53 96.2 %
Date: 2019-09-08 04:53:50 Functions: 1 1 100.0 %

          Line data    Source code
       1             : MODULE m_eigenso
       2             :   !
       3             :   !*********************************************************************
       4             :   !     sets ur and solves the spin-orbit eigenvalue problem in the
       5             :   !     second variation procedure.
       6             :   !
       7             :   !     way: takes e.v. and e.f. from previous scalar-rel. calc.
       8             :   !     makes spin-orbit matrix elements solves e.v. and put it on 'eig'
       9             :   !
      10             :   !     Tree:  eigenso-|- readPotential
      11             :   !                    |- spnorb  : sets up s-o parameters 
      12             :   !                    |    |- soinit - sorad  : radial part
      13             :   !                    |    |- sgml            : diagonal angular parts
      14             :   !                    |    |- anglso          : non-diagonal -"-
      15             :   !                    |
      16             :   !                    |- alineso : sets up and solves e.v. problem
      17             :   !                         |- hsohelp
      18             :   !                         |- hsoham
      19             :   !
      20             :   !**********************************************************************
      21             :   !
      22             : CONTAINS
      23          14 :   SUBROUTINE eigenso(eig_id,mpi,DIMENSION,stars,vacuum,atoms,sphhar,&
      24             :                      obsolete,sym,cell,noco,input,kpts,oneD,vTot,enpara,results)
      25             : 
      26             :     USE m_types
      27             :     USE m_eig66_io, ONLY : read_eig,write_eig
      28             :     USE m_spnorb 
      29             :     USE m_alineso
      30             :     USE m_judft
      31             : #ifdef CPP_MPI
      32             :     USE m_mpi_bc_pot
      33             : #endif
      34             :     IMPLICIT NONE
      35             : 
      36             :     TYPE(t_mpi),INTENT(IN)        :: mpi
      37             :     TYPE(t_dimension),INTENT(IN)  :: DIMENSION
      38             :     TYPE(t_oneD),INTENT(IN)       :: oneD
      39             :     TYPE(t_obsolete),INTENT(IN)   :: obsolete
      40             :     TYPE(t_input),INTENT(IN)      :: input
      41             :     TYPE(t_vacuum),INTENT(IN)     :: vacuum
      42             :     TYPE(t_noco),INTENT(IN)       :: noco
      43             :     TYPE(t_sym),INTENT(IN)        :: sym
      44             :     TYPE(t_stars),INTENT(IN)      :: stars
      45             :     TYPE(t_cell),INTENT(IN)       :: cell
      46             :     TYPE(t_kpts),INTENT(IN)       :: kpts
      47             :     TYPE(t_sphhar),INTENT(IN)     :: sphhar
      48             :     TYPE(t_atoms),INTENT(IN)      :: atoms
      49             :     TYPE(t_potden),INTENT(IN)     :: vTot
      50             :     TYPE(t_enpara),INTENT(IN)     :: enpara
      51             :     TYPE(t_results),INTENT(INOUT) :: results
      52             : 
      53             : #ifdef CPP_MPI
      54             :     INCLUDE 'mpif.h'
      55             : #endif
      56             : 
      57             :     !     ..
      58             :     !     .. Scalar Arguments ..
      59             :     INTEGER, INTENT (IN) :: eig_id       
      60             :     !     ..
      61             :     !     ..
      62             :     !     .. Local Scalars ..
      63             :     INTEGER i,j,nk,nk_i,jspin,n ,l
      64             :     ! INTEGER n_loc,n_plus,i_plus,
      65             :     INTEGER nsz,nmat,n_stride
      66             :     LOGICAL l_socvec   !,l_all
      67             :     INTEGER wannierspin
      68          14 :     TYPE(t_usdus)        :: usdus
      69             :     !     ..
      70             :     !     .. Local Arrays..
      71             :     CHARACTER*3 chntype
      72             : 
      73          14 :     TYPE(t_rsoc) :: rsoc
      74          14 :     INTEGER, ALLOCATABLE :: neigBuffer(:,:)
      75          14 :     REAL,    ALLOCATABLE :: eig_so(:), eigBuffer(:,:,:)
      76          14 :     COMPLEX, ALLOCATABLE :: zso(:,:,:)
      77             : 
      78          14 :     TYPE(t_mat)::zmat
      79          14 :     TYPE(t_lapw)::lapw
      80             : 
      81             :     INTEGER :: ierr
      82             :     
      83             :     !  ..
      84             : 
      85          14 :     INQUIRE (4649,opened=l_socvec)
      86             : 
      87             :     ! To be consistent with angles should be redefined here!
      88             :     !noco%theta= -noco%theta
      89             :     !noco%phi=   noco%phi+pi_const
      90             :     ! now the definition of rotation matrices
      91             :     ! is equivalent to the def in the noco-routines
      92             : 
      93             :     ALLOCATE(  usdus%us(0:atoms%lmaxd,atoms%ntype,input%jspins), usdus%dus(0:atoms%lmaxd,atoms%ntype,input%jspins),&
      94             :          usdus%uds(0:atoms%lmaxd,atoms%ntype,input%jspins),usdus%duds(0:atoms%lmaxd,atoms%ntype,input%jspins),&
      95             :          usdus%ddn(0:atoms%lmaxd,atoms%ntype,input%jspins),&
      96             :          usdus%ulos(atoms%nlod,atoms%ntype,input%jspins),usdus%dulos(atoms%nlod,atoms%ntype,input%jspins),&
      97          14 :          usdus%uulon(atoms%nlod,atoms%ntype,input%jspins),usdus%dulon(atoms%nlod,atoms%ntype,input%jspins))
      98             :    
      99          14 :     IF (input%l_wann.OR.l_socvec) THEN
     100             :        wannierspin = 2
     101             :     ELSE
     102          14 :        wannierspin = input%jspins
     103             :     ENDIF
     104             : 
     105             :     !
     106             :     !---> set up and solve the eigenvalue problem
     107             :     ! --->    radial k-idp s-o matrix elements calc. and storage
     108             :     !
     109             : #if defined(CPP_MPI)
     110             :     !RMA synchronization
     111          14 :     CALL MPI_BARRIER(mpi%MPI_COMM,ierr)
     112             : #endif
     113          14 :     CALL timestart("eigenso: spnorb")
     114             :     !  ..
     115             : 
     116             :     !Get spin-orbit coupling matrix elements
     117          14 :     CALL spnorb( atoms,noco,input,mpi, enpara,vTot%mt,usdus,rsoc,.TRUE.)
     118             :     !
     119             : 
     120             : 
     121          14 :     ALLOCATE (eig_so(2*DIMENSION%neigd))
     122          14 :     ALLOCATE (eigBuffer(2*DIMENSION%neigd,kpts%nkpt,wannierspin))
     123          14 :     ALLOCATE (neigBuffer(kpts%nkpt,wannierspin))
     124          14 :     results%eig = 1.0e300
     125          38 :     eigBuffer = 1.0e300
     126          14 :     results%neig = 0
     127          38 :     neigBuffer = 0
     128          14 :     rsoc%soangl(:,:,:,:,:,:) = CONJG(rsoc%soangl(:,:,:,:,:,:))
     129          14 :     CALL timestop("eigenso: spnorb")
     130             :     !
     131             :     !--->    loop over k-points: each can be a separate task
     132          54 :     DO nk_i=1,SIZE(mpi%k_list)
     133          40 :         nk=mpi%k_list(nk_i)
     134             :      !DO nk = mpi%n_start,n_end,n_stride
     135          40 :        CALL lapw%init(input,noco, kpts,atoms,sym,nk,cell,.FALSE., mpi)
     136          40 :        ALLOCATE( zso(lapw%nv(1)+atoms%nlotot,2*DIMENSION%neigd,wannierspin))
     137         116 :        zso(:,:,:) = CMPLX(0.0,0.0)
     138          40 :        CALL timestart("eigenso: alineso")
     139             :        CALL alineso(eig_id,lapw, mpi,DIMENSION,atoms,sym,kpts,&
     140          40 :             input,noco,cell,oneD,nk,usdus,rsoc,nsz,nmat, eig_so,zso)
     141          40 :        CALL timestop("eigenso: alineso")
     142          40 :        IF (mpi%irank.EQ.0) THEN
     143          20 :           WRITE (6,FMT=8010) nk,nsz
     144          20 :           WRITE (6,FMT=8020) (eig_so(i),i=1,nsz)
     145             :        ENDIF
     146             : 8010   FORMAT (1x,/,/,' #k=',i6,':',/,&
     147             :             ' the',i4,' SOC eigenvalues are:')
     148             : 8020   FORMAT (5x,5f12.6)
     149             : 
     150          40 :        IF (mpi%n_rank==0) THEN
     151          38 :           IF (input%eonly) THEN
     152           0 :              CALL write_eig(eig_id, nk,jspin,neig=nsz,neig_total=nsz, eig=eig_so(:nsz))
     153           0 :              STOP 'jspin is undefined here (eigenso - eonly branch)'
     154             :              eigBuffer(:nsz,nk,jspin) = eig_so(:nsz)
     155             :              neigBuffer(nk,jspin) = nsz
     156             :           ELSE
     157          38 :              CALL zmat%alloc(.FALSE.,SIZE(zso,1),nsz)
     158         111 :              DO jspin = 1,wannierspin
     159          73 :                 CALL timestart("eigenso: write_eig")  
     160          73 :                 zmat%data_c=zso(:,:nsz,jspin)
     161          73 :                 CALL write_eig(eig_id, nk,jspin,neig=nsz,neig_total=nsz, eig=eig_so(:nsz),zmat=zmat)
     162          73 :                 eigBuffer(:nsz,nk,jspin) = eig_so(:nsz)
     163          73 :                 neigBuffer(nk,jspin) = nsz
     164         111 :                 CALL timestop("eigenso: write_eig")
     165             :              ENDDO
     166             :           ENDIF ! (input%eonly) ELSE
     167             :        ENDIF ! n_rank == 0
     168          54 :        DEALLOCATE (zso)
     169             :     ENDDO ! DO nk 
     170             : 
     171             : #ifdef CPP_MPI
     172          14 :     CALL MPI_ALLREDUCE(neigBuffer,results%neig,kpts%nkpt*wannierspin,MPI_INTEGER,MPI_SUM,mpi%mpi_comm,ierr)
     173             :     CALL MPI_ALLREDUCE(eigBuffer(:2*dimension%neigd,:,:),results%eig(:2*dimension%neigd,:,:),&
     174          14 :                        2*dimension%neigd*kpts%nkpt*wannierspin,MPI_DOUBLE_PRECISION,MPI_MIN,mpi%mpi_comm,ierr)
     175          14 :     CALL MPI_BARRIER(mpi%MPI_COMM,ierr)
     176             : #else
     177             :     results%neig(:,:) = neigBuffer(:,:)
     178             :     results%eig(:2*dimension%neigd,:,:) = eigBuffer(:2*dimension%neigd,:,:)
     179             : #endif
     180             : 
     181          14 :     RETURN
     182          14 :   END SUBROUTINE eigenso
     183             : END MODULE m_eigenso

Generated by: LCOV version 1.13