Thanks for your report. Your findings are absolutely correct.

I only fixed the normalization for non-spinpolarized SO calculations, but not the spin-polarized ones.

The new opmain.f (SRC_optic) should correct this.

Regards

PS: WIEN2k_17.1 will be released very soon (and will contain all the fixes)

On 07/02/2017 02:38 PM, Osama Yassin wrote:

Dear Prof Blaha


Two months ago, you have fixed  problems with OPTIC and JOINT files.

http://www.mail-archive.com/wien@zeus.theochem.tuwien.ac.at/msg15724.html


To calculate the optical properties of Au using DFT+U/EECE , we should
do spin polarized calculations as we know. However, I noted that the
values of the dielectric constant from the spin-polarized calculation is
twice that of the non-spin polarized one.


To confirm my notice I copied case.jointup file to case.joint then
proceeded as usual. I found that the values obtained from the spin-up
only is equal to that of the non-spin polarized calculations.


- Does the step of adding the spin up and the spin down calculation
produce the correct normalization?.


Best regards


Osama


Sent from Outlook <http://aka.ms/weboutlook>


_______________________________________________
Wien mailing list
Wien@zeus.theochem.tuwien.ac.at
http://zeus.theochem.tuwien.ac.at/mailman/listinfo/wien
SEARCH the MAILING-LIST at:  
http://www.mail-archive.com/wien@zeus.theochem.tuwien.ac.at/index.html


--

                                      P.Blaha
--------------------------------------------------------------------------
Peter BLAHA, Inst.f. Materials Chemistry, TU Vienna, A-1060 Vienna
Phone: +43-1-58801-165300             FAX: +43-1-58801-165982
Email: bl...@theochem.tuwien.ac.at    WIEN2k: http://www.wien2k.at
WWW:   http://www.imc.tuwien.ac.at/TC_Blaha
--------------------------------------------------------------------------
      PROGRAM optic
      use struk
      use potnlc
      use xrpar
      use fermi
      use comi
!
!               O P T I C A L   M A T R I X  E L E M E N T S
!                         
!     written by Robert Ab
!
!     LAST UPDATES: March    1996   Robert Abt: local orbital
!                   December 1998   Claudia Ambrosch-Draxl: SO
!                   May      1999   Jan Kunes, spin-polarized SO
!                   August   1999   cad: modifications
!ole                November 2001   !ole Bernd Olejnik : p^a_nm NLO
!
!          FILE  3         MATRIX ELEMENTS
!          FILE  5         INPUT
!          FILE  6         OUTPUT
!          FILE 10         VECTOR
!          FILE 18         VSP
!          FILE 20         STRUCT
!ole       FILE 24         case.mme       simple momentum matrix elements
!ole       FILE 25         case.symop     symmetry matrices
!
!
!
      INCLUDE 'param.inc' 
      PARAMETER (NCASE=9)                     
      IMPLICIT REAL*8 (A-H,O-Z)
!      COMPLEX*16       OPMATX,OPMATY,OPMATZ,MX_,MY_,MZ_,SX_,SY_,SZ_
      CHARACTER*4      LATTIC,IREL,RELA
      CHARACTER*3      MODUS,OUTME,edge    ! edge added LP
      CHARACTER*9      HEADER(NCASE),amodus
      CHARACTER*11     STATUS,FORM                                
      CHARACTER*67     ERRMSG
      CHARACTER*80     TITLE                                    
      CHARACTER*180    FNAME                                    
      CHARACTER*90     DEFFN,ERRFN
      character*300    title1
!ole ##### Begin #####
!ole  LOGICAL          REL,LSO,SPIN
      LOGICAL          REL,LSO,SPIN,MME_FLAG 
!ole #####  End  #####
      INTEGER(4) :: atom_num,xlo	!LP
      real*8           xms(3)

      COMMON /outop/ Ncol,icol(NCASE)                                  
      COMMON /LEAD/ K1,K2,KEND,KSTEP,KOUT,KSTOP   
!      COMMON /STRUK/  POS(3,NDIF),AA,BB,CC,ALPHA(3),RMT(NATO),V(NATO), &
!                      PIA(3),VOL,ZZ(NATO), &
!                      IATNR(NATO),MULT(NATO),ISPLIT(NATO)
      COMMON /COM/  EMIN,EMAX,ELECN,EULIMIT,EDLIMIT, &
                    NK,IOUT,NSPIN,NAT,NBAND,ix,NB(NKPT),MINWAV,MAXWAV,ifpmat
!Clas-end
!      COMMON /OPME/ OPMATX(NUMEO,2),OPMATY(NUMEO,2),OPMATZ(NUMEO,2)
!      COMMON /OP/   OPMX(NUMEO,2),OPMY(NUMEO,2),OPMZ(NUMEO,2)
      COMMON /MIM / MIMA(2)         
!      COMMON /CHAR/   TITLE,LATTIC,MODUS,ANAME(NATO)
      COMMON /CHAR/   TITLE,LATTIC,MODUS,OUTME                   
      COMMON /GENER/  BR1(3,3),BR2(3,3)                                 
      COMMON /RADFU/  RRAD1(NRAD,LMAX1),RADE1(NRAD,LMAX1), &
                      RRAD2(NRAD,LMAX1),RADE2(NRAD,LMAX1)
      COMMON /UHELP/  UDUM(NRAD,6)                      
!      COMMON /POTNLC/ DUMMY2(NRAD),R0(NATO),DX(NATO),JRI(NATO)
      COMMON /SYM2/   TAU(3,NSYM),IORD,IMAT(3,3,NSYM)
      COMMON /SYMo/   opimat(3,3,NSYM)
      COMMON /so/     theta,fi
      COMMON /SYMd/   det(NSYM)
!ole ##### Begin #####
!ole  COMMON /CLOGIC/ LSO,SPIN,REL
      COMMON /CLOGIC/ LSO,SPIN,REL,MME_FLAG
!ole #####  End  #####
!      COMMON /MXYZ/ MX_(NUMEO),MY_(NUMEO),MZ_(NUMEO), &
!                    SX_(NUMEO),SY_(NUMEO),SZ_(NUMEO)
!                  
      EXTERNAL GTFNAM                                                     
      DATA             RELA/'RELA'/                                     

!-----------------------------------------------------------------------       
!
      LSOUP=.FALSE.
      LSO=.FALSE.
      SPIN=.FALSE.
!ad
!ad
!ad_____________________________ OPEN FILES ____________________________
!ad

      call GTFNAM(DEFFN,ERRFN)
      call ERRFLG(ERRFN,'Error in OPTIC')
      OPEN (1,FILE=DEFFN,STATUS='OLD',ERR=910)
   10 CONTINUE
      READ (1,*,END=20,ERR=960) IUNIT,FNAME,STATUS,FORM,IRECL
      OPEN (IUNIT,FILE=FNAME,STATUS=STATUS,FORM=FORM,ERR=920)
!ad
!jan
!LO
        if(iunit.eq.10.) then
        do i=180,8,-1
          if(fname(i-5:i).eq.'ctorup') then
            LSOUP=.true.
            SPIN=.true.
          else 
             if(fname(i-5:i).eq.'ctordn') then
               LSOUP=.false.
               SPIN=.true.
             endif
          endif
        enddo
        endif
!LO
        if((iunit.eq.10.).or.(iunit.eq.11)) then
        do i=180,8,-1
          if(fname(i-7:i).eq.'ctorsoup') then
          LSO=.true.
          SPIN=.TRUE.
          goto 10
          endif
        enddo
      endif
!jan
!ad
      if(iunit.eq.10) then
        do i=80,8,-1
          if(fname(i-7:i).eq.'vectorso') then
          LSO=.true.
          goto 10
          endif
        enddo
      endif
!ad

      GOTO 10  
  20  CONTINUE
      CLOSE (1)
!ad
!ad
!ad _________________ INITIALIZE VARIABLES AND ARRAYS __________________
!ad
      EEF=0.0
      DEEF=0.0
      TSTART=0.0
      TOPMAT=0.0
!ad
!ad _____________________ READ STRUCTURAL INFORMATION __________________
!ad
      READ(20,1000) TITLE
      READ(20,1010) LATTIC,NAT,IREL    
!
      nato=nat
      natti=nat   ! LP: natti in "comi" module 
      allocate (ANAME(nato),POS(3,48*nato),RMT(NATO),V(NATO),ZZ(NATO))
      allocate (IATNR(NATO),MULT(NATO),ISPLIT(NATO))
      allocate (Rnot(NATO),DX(NATO),JRI(NATO),imodus(NATO))
      DO 100 I=1,NATO                                                   
      MULT(I)=0                                                         
      V(I)=0.D0                                                         
  100 RMT(I)=0.D0                               
!                    
!      if(nat.gt.nato) stop 'NATO too small!'
!.....READ IN LATTICE CONSTANTS                                         
      READ(20,1020) AA,BB,CC,ALPHA(1),ALPHA(2),ALPHA(3)
      IF(ABS(ALPHA(1)).LT.1.D-5) ALPHA(1)=90.0D0
      IF(ABS(ALPHA(2)).LT.1.D-5) ALPHA(2)=90.0D0
      IF(ABS(ALPHA(3)).LT.1.D-5) ALPHA(3)=90.0D0
!C
      IF(IREL.EQ.'RELA') REL=.TRUE.                                     
      IF(IREL.EQ.'NREL') REL=.FALSE.                                    
      WRITE(6,800)                                                      
      WRITE(6,805)  TITLE                                               
      WRITE(6,810)  LATTIC                                              
      WRITE(6,820)  AA,BB,CC                                            
      WRITE(6,840)  NAT                                                 
      WRITE(6,850)  IREL                                                
      REL=.FALSE.                                                       
      IF(IREL.EQ.RELA) REL=.TRUE.   
!     INDEX COUNTS ALL ATOMS IN THE UNIT CELL, JATOM COUNTS ONLY THE    
!     NOTEQUIVALENT ATOMS                                               
      INDEX=0                                                           
      DO 50 JATOM = 1,NAT                                               
         INDEX=INDEX+1
!         if(index.gt.NDIF) stop 'NDIF too small!'                            
         READ(20,1030) IATNR(JATOM),( POS(J,INDEX),J=1,3 ),MULT(JATOM),  &
                       ISPLIT(JATOM)                                    
         IF (MULT(JATOM).EQ.0) THEN                                     
            WRITE(6,1040) JATOM,INDEX,MULT(JATOM)                       
            STOP ' OPTIC: MULT EQ 0'                                    
         ENDIF 
            DO 55 M=1,MULT(JATOM)-1                                     
               INDEX=INDEX+1                                            
!               if(index.gt.NDIF) stop 'NDIF too small!'
               READ(20,1031) IATNR(JATOM),( POS(J,INDEX),J=1,3)         
 55         CONTINUE                                                    
         READ(20,1050) ANAME(JATOM),JRI(JATOM),Rnot(JATOM),RMT(JATOM)   &
                       ,ZZ(JATOM)
         DX(JATOM)=LOG(RMT(JATOM)/Rnot(JATOM)) / (JRI(JATOM)-1)    
         RMT(JATOM)=Rnot(JATOM)*EXP( DX(JATOM)*(JRI(JATOM)-1) ) 
         do i=1,3      
         READ(20,*)  
         end do         
 50   CONTINUE                                                       
!.....reading symmetry operations
         READ(20,12) IORD
         do j=1,IORD
         READ(20,11) ( (IMAT(j1,j2,j),j1=1,3),TAU(j2,j), j2=1,3 )
         end do
 12      FORMAT(I4)
 11      FORMAT(3(3I2,F15.8/))                                                                   
      MODUS='ALL'
!ad
!ad   KUPLIMIT gives maximal k-points to calculate 
!ad   KFIRST gives the k-point to start calculation 
!ad
      READ(5,*) KUPLIMIT,KFIRST
      kuplimit=kuplimit+kfirst-1
!ad
      EDLIMIT=EEF-DEEF                                           
      EULIMIT=EEF+DEEF                                           
      nbvalmax=9999999        
      read(5,'(a)') errmsg                               
      READ(errmsg,*,end=1,err=1) EMIN,EMAX,nbvalmax
 1    print *, 'emin,emax,nbvalmax', emin,emax,nbvalmax
      errmsg=''
!      READ(5,*) EMIN,EMAX
!      READ(5,*)
      xmcd=0
      read(5,'(a)') errmsg   
      do i=1,10
        if(errmsg(i:i+3).eq.'XMCD') then
           READ(errmsg(i+4:67),*,end=1,err=1) atom_num,edge
           xmcd=1
           print*, 'XMCD selected for atom',atom_num,edge
        endif
      enddo
      if(xmcd.eq.1)then

!      READ(5,*) xmcd
!      READ(5,444) atom_num
!      READ(5,*) edge 
!      READ(5,*)

      select case (edge)

      case ('K  ')

      core_name1='1s'
      xlo=1

      case ('L1 ')

      core_name1='2s'
      xlo=1
      
      case ('L23')

      core_name1='2p'
      core_name2='2ps'
      xlo=2

      case ('M1 ')

      core_name1='3s'
      xlo=1

      case ('M23')

      core_name1='3p'
      core_name2='3ps'
      xlo=2

      case ('M45')

      core_name1='3d'
      core_name2='3ds'
      xlo=2

      case default

      write(6,*)'Error: check edge!'
      stop

      end select
!ad
!jan
!jan  isp=0 non spinpol isp=1 spinpol
!jan
      READ(5,*) NCOL
      else
      read(errmsg,*) ncol
      endif
!ole ##### Start #####
!ole  output matrix elements p^a_nm (a=x,y,z)
!ole
      header(1)='Re <x>'
      header(2)='Im <x>'
      header(3)='Re <y>'
      header(4)='Im <y>'
      header(5)='Re <z>'
      header(6)='Im <z>'
      
      DO i=1,NCASE
         icol(i)=i
      END DO

      SELECT CASE (NCOL)

      CASE (0) ! ### get simple momentum matrix elements
         MME_FLAG=.TRUE.
         NCOL=6

!        if(.not.spin.and.lso) then
        if(lso) then
         WRITE(24,330) 'SO',ncol,(header(icol(i)),i=1,ncol)
        else
         WRITE(24,330) '  ',ncol,(header(icol(i)),i=1,ncol)
        endif

      CASE (1,2,3,4,5,6,7,8,9) 
         MME_FLAG=.FALSE.

!ole ##### End #####
      do i=1,NCOL
	read(5,*)icol(i)
	if (icol(i).gt.NCASE) stop 'col number too large'
      end do
        if(xmcd.eq.1) then
          write(*,*)'LSO= ',LSO
          if(.not.LSO) then 
            write(6,*) 'XMCD calculation requires spin-polarized AND spin-orbit setup'
            stop
          endif
      NCOL=2
      do i=1,NCOL
      icol(i)=i
      enddo
      endif
      outme='OFF'
      read(5,'(A3,a9)',end=777) OUTME,amodus
      if(OUTME.eq.'on ' ) OUTME = 'ON '
        moddo = outme   !LO
!      do i=1,9
!        if(amodus(i:i+1).eq.'PW') modus='PW '
!      enddo
      nmodus=0
      read(amodus,*,err=777,end=777) nmodus
!      read(amodus,'(i)',err=777) nmodus
      if(nmodus.gt.0.and.nmodus.le.nat+1) then
         read(5,*) (imodus(i),i=1,nmodus)
         print*, 'optical matrix elements for atoms:',(imodus(i),i=1,nmodus)
         modus='ato'
      endif

!ad
!ad _______________________________ HEADERS ____________________________
!ad
 777  write(6,*) '  MODUS',modus
      if(xmcd.eq.1) then
      modus='ALL'
!      write(6,*) '  MODUS-xmcd: ',modus
      endif
      if(modus.eq.'ATO') then
         write(6,*) 'optical matrix elements for atoms:',(imodus(i),i=1,nmodus)
      endif
      header(1)='Re <x><x>'
      header(2)='Re <y><y>'
      header(3)='Re <z><z>'
      header(4)='Re <x><y>'
      header(5)='Re <x><z>'
      header(6)='Re <y><z>'
      header(7)='Im <x><y>'
      header(8)='Im <x><z>'
      header(9)='Im <y><z>'
      if(modus.eq.'ALL') then
!        if(.not.spin.and.lso) then
        if(lso) then
        WRITE(3,330) 'SO',ncol,(header(icol(i)),i=1,ncol),modus
        WRITE(9,330) 'SO',ncol,(header(icol(i)),i=1,ncol),modus
        else
        WRITE(3,330) '  ',ncol,(header(icol(i)),i=1,ncol),modus
        WRITE(9,330) '  ',ncol,(header(icol(i)),i=1,ncol),modus
        endif
      if(xmcd.eq.1) then
!        WRITE(13,332) LSO,edge,(header(icol(i)),i=1,ncol),modus
!        WRITE(14,332) LSO,edge,(header(icol(i)),i=1,ncol),modus
        WRITE(13,332) LSO,edge,modus
        WRITE(14,332) LSO,edge,modus
!      else
!        WRITE(3,330) ncol,(header(icol(i)),i=1,ncol),modus
!        WRITE(9,330) ncol,(header(icol(i)),i=1,ncol),modus
      endif

      else
        j=11+13*(ncol+1)+1
        nmodus1=min(80/3,nmodus)
!        if(.not.spin.and.lso) then
        if(lso) then
        write(title1,330) 'SO',ncol,(header(icol(i)),i=1,ncol),modus
        else
        write(title1,330) '  ',ncol,(header(icol(i)),i=1,ncol),modus
        endif
        write(title,'(30i3)') (imodus(i),i=1,nmodus1)
        WRITE(3,'(A,a)') title1(1:j),title(1:3*nmodus1)
        WRITE(9,'(A,a)') title1(1:j),title(1:3*nmodus1)
      endif
      if(OUTME.EQ.'ON ') WRITE(4,9044)
!
!Clas-start: I have also included ifpmat in COMMON block /COM/
      read(5,*,end=333,err=333) ifpmat
      goto 334
 333  ifpmat=0
 334  continue
      if(ifpmat.eq.1) write(6,*) " Outputs <j,k|-i*grad|j',k> to case.pmat"
!Clas-end
!
!ole ##### Start #####
! default error
      CASE DEFAULT
         GOTO 970
      END SELECT
!ole ##### End #####

!
!ad ____________________________________________________________________
!ad
      iout=1
      ix=1
!ad
      if(SPIN) write(6,*) '  spin-polarized calculation'
      if(LSO)  write(6,*) '  spin-orbit coupling included'
!ad
!jan
!jan   read *.inso
!jan
      call LATGEN (NAT)                                                 
      if (lso.AND.spin) then
      do i=1,3
      read(28,*)
      end do
      read(28,*) xms(1),xms(2),xms(3)
      call angle(xms,theta,fi)

!      read(28,*) theta,fi
 111  format(2F10.3)
      write(6,*)'read inso:'
      write(6,*)'theta=',theta
      write(6,*)'phi=',fi
      end if
!jan
!
!      call LATGEN (NAT)                                                 
      call SYMOP (NAT,OUTME)
!jan
      if (lso.AND.spin) then
      call SYM
      else
      do i=1,IORD
      det(i)=1
      end do
      end if
!ad
      call CPUTIM(TTIME)
      TSTART0=TTIME
!ad 
!ad...CALCULATE OPTICAL MATRIXELEMENTS ................     
!ad
      if(xmcd.eq.0) then
        call MOM_MAT(KUPLIMIT,KFIRST,IEF,topmat,nbvalmax) 
      else

       do i=1,xlo
       if(i.eq.1) core_name=core_name1
       if(i.eq.2) core_name=core_name2
        write(91,*) 'i=',i,'atom_num=',atom_num,'KUPLIMIT=',KUPLIMIT,'KFIRST=',KFIRST,'IEF=',IEF
        call COR_MAT(i,atom_num,KUPLIMIT,KFIRST,IEF)
       enddo
       TOPMAT=TOPMAT-TSTART

      endif
!ad
      call CPUTIM(TTIME)
      TOUTP=TTIME
!                                                                       
!.....CALCULATE CPUTIME REQUIRED                                        
      TTOTAL=TOUTP -TSTART0 
!      TOPMAT=TOPMAT-TSTART
      WRITE(6,2000) 
      WRITE(6,2020) TOPMAT,TOPMAT/TTOTAL*100.
      WRITE(6,2010) TTOTAL,100.0                                        
      call ERRCLR(ERRFN)
      STOP ' OPTIC END'                

!
!        error handling
!
  910 INFO = 1
!
!     optic.def couldn't be opened
!
      WRITE (ERRMSG,9000) DEFFN
      call OUTERR('OPTIC',ERRMSG)
      GOTO 999
!
  920 INFO = 2
!
!     file FNAME couldn't be opened
!
      WRITE (ERRMSG,9010) IUNIT
      call OUTERR('OPTIC',ERRMSG)
      WRITE (ERRMSG,9020) FNAME
      call OUTERR('OPTIC',ERRMSG)
      WRITE (ERRMSG,9030) STATUS, FORM
      call OUTERR('OPTIC',ERRMSG)
      GOTO 999
!
  960 INFO = 7
!
!     error reading file *.def
!
      WRITE (ERRMSG,9040) FNAME
      call OUTERR('OPTIC',ERRMSG)
!ole ##### Start #####
      GOTO 999
!
!     bad number of choices in <case>.inop 
!
 970  WRITE (ERRMSG,9050)  
      CALL OUTERR('OPTIC',ERRMSG)
!ole ##### End #####
  999 STOP 'OPTIC - ERROR'
!ad

  43  FORMAT(3X,A77)
  44  FORMAT(I3,A77)
 330  format(A2,8X,I1,10(2X,A9,2X))
! 331  format(L5,3X,A3,10(2X,A9,2X))
 332  format(L5,3X,A3,'     LEFT        RIGHT       ',A5)
 444  format(I4)	 
 700  FORMAT(I3,A77)
 701  FORMAT('CPU TIME (',2I3,') -> ',F9.2)
 800  FORMAT(////,30X,50(1H-),/,33X,'S T R U C T U R A L   ', &
             'I N F O R M A T I O N',/,30X,50(1H-),//)
 805  FORMAT(3X,'SUBSTANCE',20X,'= ',A80,/)
 810  FORMAT(3X,'LATTICE',22X,'= ',A4)
 820  FORMAT(3X,'LATTICE CONSTANTS ARE',8X,'= ',3F12.7)
 830  FORMAT(3X,'SYMMETRY ATTITUDE IS',9X,'= ',A4)
 840  FORMAT(3X,'NUMBER OF ATOMS IN UNITCELL  = ',I3)
 850  FORMAT(3X,'MODE OF CALCULATION IS',7X,'= ',A4)
 860  FORMAT(3X,'SELFCONSISTENT CYCLE-NUMBER  = ',I3,/)
 1000 FORMAT(A80)
 1010 FORMAT(A4,23X,I3,/,13X,A4)
 1020 FORMAT(6F10.5)
 1030 FORMAT(4X,I4,4X,F10.7,3X,F10.7,3X,F10.7,/,15X,I2,17X,I2)          
 1031 FORMAT(4X,I4,4X,F10.7,3X,F10.7,3X,F10.7)                          
 1040 FORMAT(///,3X,'ERROR IN LAPW2 : MULT(JATOM)=0 ...',                &
             /, 20X,'JATOM=',I3,3X,'INDEX=',I3,3X,'MULT=',I3)           
 1050 FORMAT(A10,5X,I5,5X,F10.9,5X,F10.5,5X,F10.5)                      
 2000 FORMAT(//,3X,'=====>>> CPU TIME SUMMARY',/)                       
 2010 FORMAT(12X,'TOTAL          : ',F8.1,5X,'... ',F4.0,' PERCENT')       
! 2020 FORMAT(12X,'MATRIX ELEMENTS: ',F8.1,5X,'... ',F4.0,' PERCENT')       
 2020 FORMAT(12X,'Interst. MatEl : ',F8.1,5X,'... ',F4.0,' PERCENT')       
 9000 FORMAT(' can''t open definition file ',A40)
 9010 FORMAT(' can''t open unit: ',I2)
 9020 FORMAT(' filename: ',A50)
 9030 FORMAT(' status: ',A,'  form: ',A)
 9040 FORMAT('Error reading file: ',A47)
 9044 FORMAT(3X,'Complex momentum matrix elements: (Re_x,Im_x),(Re_y,Im_y),(Re_z,Im_z)')
!ole ##### Start #####
 9050 FORMAT('error : bad number of choices in <case>.inop')
!ole ##### End #####
      END                                                               


_______________________________________________
Wien mailing list
Wien@zeus.theochem.tuwien.ac.at
http://zeus.theochem.tuwien.ac.at/mailman/listinfo/wien
SEARCH the MAILING-LIST at:  
http://www.mail-archive.com/wien@zeus.theochem.tuwien.ac.at/index.html

Reply via email to