jellstart12.f Source File


Source Code

      SUBROUTINE JELLSTART(NSPIN,IFILE,I13,INS,NBEGIN,NATOMS,
     &                 ZATOM,SITEAT,KSHAPE,IDSHAPE,
     &                 VOLUMECL,LPOT,
     &                AOUT_ALL,RWSCL,RMTCL,RMTCORE,MESHN,XRN,DRN,THETAS,
     &                 LMIFUN,NFUN,IRWS,IRNS,
     &                 ALATNEW,QBOUND,KXC,TXC, EFSET)
c ******************************************************
c * This subroutine reads a jellium potential from the database
c * file. and interpolates to the new mesh 
c ******************************************************
      use mod_splint, only: splint_real
      use mod_spline, only: spline_real

      implicit none
c#@# KKRtags: VORONOI initialization potential core-electrons
      include 'inc.geometry'
      INTEGER NPOTD
      PARAMETER (NPOTD=NSPIND*NATYPD)
      INTEGER LMPOTD
      PARAMETER (LMPOTD= (LPOTD+1)**2)
      INTEGER IBMAXD
      PARAMETER (IBMAXD=(LMAXD1+1)*(LMAXD1+1))
      INTEGER IRMIND,INSLPD
      PARAMETER (IRMIND=IRMD-IRNSD,INSLPD= (IRNSD+1)*LMPOTD)
      INTEGER LMXSPD
      PARAMETER (LMXSPD= (2*LPOTD+1)**2)
      INTEGER IRMDJJ
      PARAMETER(IRMDJJ=1501)
C     ..
C     .. Scalar Arguments ..
      REAL*8           ALAT,C,EFERMI,HFIELD,VCONST,ALATNEW,
     &                 QBOUND
      REAL*8           EFSET
      INTEGER IFILE,IINFO,INS,IPE,IPF,IPFE,
     +        KHFELD,KSHAPE,KVREL,KWS,
     +        LMAX,LPOT,
     +        NBEG,NEND,NSPIN,KXC,NBEGIN
C     ..
C     .. Array Arguments ..
      REAL*8           ZATOM(NATYPD),VOLUMECL(*),RWSCL(*),RMTCL(*),
     &                 AOUT_ALL(NATYPD),
     &                 RMTCORE(*),XRN(IRID,NSHAPED),DRN(IRID,NSHAPED),
     &                 THETAS(IRID,IBMAXD,NSHAPED)
      INTEGER IRNS(NATYPD),IRWS(NATYPD),ITITLE(20),
     &        LCORE(20),NCORE,IDSHAPE(*),LMIFUN(IBMAXD,NSHAPED),
     &        NFUN(NSHAPED),SITEAT(*)
C     ..
C     .. Local Scalars ..
      REAL*8           A1,B1,EA,EFNEW,S1,Z1,DUMMY,RMAX,RMTNW1,RMT1,
     &                 VBC(2),VCON,ECORE1(20),MAXA,AOUT,BOUT,RMTOUT,
     &                 PARSUM,PARSUMDERIV,R0,DIST,DR,RMAXOUT,RMTNEW
      REAL*8           RWS0,BR,ZA,ZVALI,EINF,AR,AMSH,RFPI,ZZOR
      REAL*8           EFSHIFT
      INTEGER I,IA,ICELL,ICORE,IFUN,IH,IMT1,INEW,IO,IPAN1,IR,IRC1,IRI,
     +        IRMINM,IRMINP,IRNS1P,IRT1P,IRWS1,ISAVE,ISPIN,ISUM,
     +        J,NATOMS,IPOT,IRNSTOT,MESHN(NSHAPED),MESHN0,ID,
     +        L,LM,LM1,LMPOT,LMPOTP,IRNSOUT,IRMTOUT,IRWSOUT,
     +        N,NCELL,NR,IAT,IRNS1,NCORE1,LCORE1(20),IRC,NZ,
     &        IRS1,NSEC,NZVALI,NC,II,I1,I2,ISITE
      LOGICAL TEST,POTLM(LMPOTD)
C     ..
C     .. Local Arrays ..
      REAL*8           U(IRMD),DRDI(IRMDJJ),ECORE(20),
     &           RMESH(IRMDJJ),RWS,VINS(IRMIND:IRMD,LMPOTD),
     &                 VM2Z(IRMDJJ),VINSOUT(IRMIND:IRMD,LMPOTD),
     &                 VM2ZOUT(IRMD),VM2ZB(IRMDJJ),ROUT(IRMD),
     &             VINSB(IRMD,LMPOTD),DRDIOUT(IRMD),            
     &             WORK(IRMD,LMPOTD),RA(IRMD) 
      CHARACTER*40 BANER,TEXT,I13
      CHARACTER*4 ELEM_NAME,AAAA,TRAN,exte 
      CHARACTER*124 TXC(3)
      CHARACTER*4 ELEM_FILE(0:113)
      CHARACTER*26 ATOMPOT
      CHARACTER*2 TXTC(20)
      CHARACTER*20 DATA1
       DATA ELEM_FILE/'Vac0',
     & 'H_01','He02','Li03','Be04','B_05','C_06','N_07','O_08',
     & 'F_09','Ne10',
     & 'Na11','Mg12','Al13','Si14','P_15','S_16','Cl17','Ar18',
     & 'K_19','Ca20','Sc21','Ti22',
     & 'V_23','Cr24','Mn25','Fe26','Co27','Ni28',
     & 'Cu29','Zn30',
     & 'Ga31','Ge32','As33','Se34','Br35','Kr36','Rb37','Sr38',
     & 'Y_39','Zr40',
     & 'Nb41','Mo42','Tc43','Ru44','Rh45','Pd46','Ag47','Cd48',
     & 'In49','Sn50',
     & 'Sb51','Te52','I_53','Xe54','Cs55','Ba56','La57','Ce58',
     & 'Pr59','Nd60',
     & 'Pm61','Sm62','Eu63','Gd64','Tb65','Dy66','Ho67','Er68',
     & 'Tm69','Yb70',
     & 'Lu71','Hf72','Ta73','W_74','Re75','Os76','Ir77','Pt78',
     & 'Au79','Hg80',
     & 'Tl81','Pb82','Bi83','Po84','At85','Rn86','Fr87','Ra88',
     & 'Ac89','Th90',
     & 'Pa91','U_92','Np93','Pu94','Am95','Cm96','Bk97','Cf98',
     & 'Es99','Fm__',
     & 'Md__','No__','Lr__','Rf__','Db__','Sg__','Bh__','Hs__',
     & 'Mt__','Uun_',
     & 'Uuu_','Uub_','NoE_'/
c     --------------------------------------------------------------
      

      RFPI = 4.D0*DSQRT(DATAN(1.D0))

      WRITE(6,*) ' ****  JELLSTART POTENTIALS **** '
      WRITE(6,*) 'From atom No.',NBEGIN,'to atom No.',NATOMS

      OPEN(19,STATUS='UNKNOWN',FILE='output.pot')
      DO I2=1,LMPOTD
         DO I1=IRMIND,IRMD
            VINS(I1,I2) = 0.D0
         END DO
      END DO
      DO I1=1,IRMDJJ
         VM2Z(I1) = 0.D0
      END DO

      DO IAT = NBEGIN,NATOMS
         ISITE = SITEAT(IAT)
         ID = IDSHAPE(ISITE)

         WRITE(*,FMT='(A$,I6,A$,I6,A$,I6,A1)') 
     &              'Generating potential for atom',IAT,
     &              ' at site',ISITE,
     &              ' with shape',ID
         WRITE(*,*) ' '

         DO ISPIN=1,NSPIN
            DO LM=1,LMPOTD
               POTLM(LM) =.FALSE.
            END DO
            IPOT =  NSPIN* (IAT-1) + ISPIN    

c Find out what atom is needed            
c            
            NZ = ZATOM(IAT)
            IF (((NZ.GE.24.AND.NZ.LE.28).OR.(NZ.GE.57.AND.NZ.LE.70))
     &                                          .AND.ISPIN.EQ.2) THEN
            ATOMPOT = 'ElementDataBase/'//ELEM_FILE(NZ)//'.pots2'
            ELSE
            ATOMPOT = 'ElementDataBase/'//ELEM_FILE(NZ)//'.pot  '
            END IF
            WRITE(6,*) 'Using database ....: ',ATOMPOT
            OPEN(21,STATUS='OLD',FILE=ATOMPOT,ERR=1010)
c           IRWS1 =  NR
            
c --------------------------------------------------------------------
          
            EFERMI = .409241D+00
            VBC(1)    = .500D0
            VBC(2)    = .500D0

            ! for EFSET in input: set Fermi level to whished value
            if (EFSET>0.0d0) then
              EFSHIFT = EFSET - EFERMI ! calculate shift
              EFERMI = EFERMI + EFSHIFT
              VBC(1) = VBC(1) + EFSHIFT
              VBC(2) = VBC(2) + EFSHIFT
            end if

c           read potential from jellium
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c
            READ(21,141) BANER,AAAA,AAAA
            READ(21,142) RWS0,S1,IRS1,BR
            READ(21,142) ZA,ZVALI,NSEC,EINF
c     Calculate number of core states
            NZ = ZA             ! make integer
            NZVALI = ZVALI      ! make integer
            NC = NZ - NZVALI
            NCORE = 0
            IF (NC.EQ.2 ) NCORE = 1 ! 1s
            IF (NC.EQ.4 ) NCORE = 2 ! 1s2s
            IF (NC.EQ.10) NCORE = 3 ! 1s2s2p
            IF (NC.EQ.12) NCORE = 4 ! 1s2s2p3s
            IF (NC.EQ.18) NCORE = 5 ! 1s2s2p3s3p
            IF (NC.EQ.28) NCORE = 6 ! 1s2s2p3s3p3d
            IF (NC.EQ.30) NCORE = 7 ! 1s2s2p3s3p3d4s
            IF (NC.EQ.36) NCORE = 8 ! 1s2s2p3s3p3d4s4p
            IF (NC.EQ.46) NCORE = 9 ! 1s2s2p3s3p3d4s4p4d
            IF (NC.EQ.48) NCORE = 10 ! 1s2s2p3s3p3d4s4p4d4s
            IF (NC.EQ.54) NCORE = 11 ! 1s2s2p3s3p3d4s4p4d4s4p
            IF (NC.EQ.68) NCORE = 12 ! 1s2s2p3s3p3d4s4p4d4s4p4f
            IF (NC.EQ.78) NCORE = 13 ! 1s2s2p3s3p3d4s4p4d4s4p4f5d  
            IF (NC.EQ.80) NCORE = 14 ! 1s2s2p3s3p3d4s4p4d4s4p4f5d6s
            IF (NC.EQ.86) NCORE = 15 ! 1s2s2p3s3p3d4s4p4d4s4p4f5d6s4p 
            WRITE(6,*) '*************************************'
            WRITE(6,*) '   Potential Interpolation Program   '
            WRITE(6,*) '   Using the Jellium Database v1.0   '
            WRITE(6,*) '*************************************'
            WRITE(6,163) EFERMI
            WRITE(6,161) ZA  
            WRITE (6,162) NCORE
            READ(21,133)(LCORE(NC),TXTC(NC),ECORE(NC),NC=1,NCORE)

            ! shift core levels accordingly
            if (EFSET>0.0d0) then
              do nc=1,ncore
                ecore(nc) = ecore(nc) + EFSHIFT
              end do
            end if

            IF (TEST('verb0   '))
     &              WRITE(6,*) ' ** Position of the Core States ** '
            DO I=1,NCORE
               IF (TEST('verb0   ')) 
     &              WRITE(6,135) LCORE(I),TXTC(I),ECORE(I)
               IF (TXTC(I).eq.'s ') LCORE(I) = 0
               IF (TXTC(I).eq.'p ') LCORE(I) = 1
               IF (TXTC(I).eq.'d ') LCORE(I) = 2
               IF (TXTC(I).eq.'f ') LCORE(I) = 3
            END DO
            NCORE1 = NCORE
            DO I=1,NCORE1
               LCORE1(I) = LCORE(I)
               ECORE1(I) = ECORE(I)
            END DO              
            WRITE(6,134) EINF
            WRITE(6,*) '**********************************************'  
c 
            READ(21,131)(VM2Z(II),II=1,IRS1)
            READ(21,132)TRAN
            CLOSE (21)
c     make mesh r0
            AR = LOG(S1/BR+1.D0)/FLOAT(IRS1-1)
            EA=EXP(AR)
            AMSH=1.D0
            RMESH(1)=0.D0
            DRDI(1)=BR*AR
            DO 1 I=2,IRS1
               AMSH=AMSH*EA
               RMESH(I)=BR*(AMSH-1.D0)
               DRDI(I)=DRDI(1)*AMSH
 1          CONTINUE
            WRITE(6,*) 'Jellium Potential Read In ',IRS1,' points'
            NR = IRS1
            Z1 = ZA
C     
 131        FORMAT(4D15.8)
 132        FORMAT(A4)
 133        FORMAT(I3,A2,D15.8)
 135        FORMAT(I3,A2,F15.6,' Ry')
 134        FORMAT('All other states are above :',F8.4,' Ry in Energy')
 141        FORMAT(3X,A40,3X,A4,3X,A4)
 142        FORMAT(7X,F8.4,7X,F8.4,7X,I5,7X,F8.4)
 161        FORMAT('Potential Atomic Number :',F7.2)
 162        FORMAT('Number of Core   States :',I4)
 163        FORMAT('Jellium Fermi Energy :',F10.5,' Ry')
c --------------------------------------------------------------------
c     
c     The input mesh has been constructed. Now construct the output mesh.
c     
            ROUT(1) = 0.D0
            AOUT = AOUT_ALL(ISITE)   
            RMAXOUT = RWSCL(ID) 
            RMTOUT  = RMTCL(ID)
            IRWSOUT = IRWS(ISITE)
            IRMTOUT = IRWS(ISITE) - MESHN(ID)
            IRNSOUT = IRNS(ISITE)


            IF (KSHAPE.EQ.0) THEN
               BOUT = RMAXOUT / (EXP(AOUT*REAL(IRWSOUT-1))-1.0D0)
               DO IR=2,IRWSOUT
                  EA = EXP(AOUT*REAL(IR-1))
                  ROUT(IR) = BOUT* (EA-1.0D0)
                  DRDIOUT(IR) = AOUT*BOUT*EA
               END DO 
               DO I=1,IRWSOUT
                  IF (ROUT(I).LT.RMTOUT) IRMTOUT = I
               END DO
               IF (MOD(IRMTOUT,2).EQ.0) IRMTOUT = IRMTOUT+1
               RMTNEW = ROUT(IRMTOUT)
               RMAXOUT = ROUT(IRWSOUT)
            ELSE
               BOUT = RMTOUT /  (EXP(AOUT*REAL(IRMTOUT-1))-1.0D0)
               DO IR=2,IRMTOUT
                  EA = EXP(AOUT*REAL(IR-1))
                  ROUT(IR) = BOUT* (EA-1.0D0)
                  DRDIOUT(IR) = AOUT*BOUT*EA
               END DO
               DO IRI=1,MESHN(ID)
                  IR = IRI + IRMTOUT
                  ROUT(IR) = ALATNEW*XRN(IRI,ID)   ! scaling is always 1.0d0
                  DRDIOUT(IR) = ALATNEW*DRN(IRI,ID)
               END DO
               RMTNEW = ROUT(IRMTOUT)
               RMAXOUT = ROUT(IRWSOUT)
            END IF
c
c  Ok now interpolate
c
                   
            MAXA = 1.D35
            CALL spline_real(IRMDJJ,RMESH,VM2Z,NR,MAXA,MAXA,VM2ZB)            
c
c OK with spline
c
            VM2ZOUT(1) = VM2Z(1)
            DO IR = 2,IRWSOUT
               R0 = ROUT(IR)
               CALL splint_real(RMESH,VM2Z,VM2ZB,NR,R0,PARSUM,
     &                          PARSUMDERIV)
               VM2ZOUT(IR) = PARSUM
            END DO
c

        
c
            IF (INS.GT.0) THEN
               IRC = IRWSOUT - IRNSOUT
               DO LM1=1,LMPOTD
                  DO IR = IRC,IRWSOUT  
                     VINSOUT(IR,LM1) = 0.d0                   
                  END DO
               END DO
            END IF

! Convolute with shapes
            IF (KSHAPE.GT.0) THEN 
               LMPOT = (LPOT + 1)**2
               DO IRI=1,MESHN(ID)
                  IR = IRI + IRMTOUT
                  ZZOR = 2.D0 * ZATOM(IAT) / ROUT(IR) 
                  DO IFUN = 2,NFUN(ID)
                     LM1 = LMIFUN(IFUN,ID)
                     IF (LM1.LE.LMPOT) THEN
                        VINSOUT(IR,LM1) = ! (VM2ZOUT(IR) - ZZOR) * 
     &                                    THETAS(IRI,IFUN,ID) 
                     ENDIF
                  ENDDO
                  VM2ZOUT(IR) = (VM2ZOUT(IR) - ZZOR ) * 
     &                           THETAS(IRI,1,ID) / RFPI + ZZOR ! Because the ratial solver adds -2*Z/R by default without shape convolution
                                                                ! and assumes that the spher. component is without sqrt(4pi) factor.
               END DO
            ENDIF

            CALL RITESONE(19,ISPIN,Z1,ALATNEW,RMTOUT,RMTNEW,RMAXOUT,
     &                    ITITLE,ROUT,DRDIOUT,VM2ZOUT,IRWSOUT,AOUT,BOUT,
     &                    TXC,KXC,INS,IRNSOUT,
     &                    LPOT,VINSOUT,QBOUND,IRWSOUT,KSHAPE,EFERMI,VBC,
     &                    ECORE1,LCORE1,NCORE1,ELEM_FILE(NZ),NSPIN) 
c
c Next atom or next spin
c
         END DO  ! ISPIN=1,NSPIN
      END DO     ! IAT = NBEGIN,NATOMS
   
      RETURN


 1000  WRITE(6,*) 'Error read file......... ',I13
       WRITE(6,*) 'Error occured on atom... ',iat
       STOP
 1010  WRITE(6,*) ' Error in JELLSTART '
       WRITE(6,*) ' Potential.............',ELEM_FILE(NZ)
       WRITE(6,*) ' Does not exist in the database'
       STOP
 8000 format (A40)
 8010 format (3X,A4,26X,F8.3)
 8011 Format ('#  ',A4,'POTENTIAL             Z = ',F8.3)
 8012 format ('#  ',A4,'POTENTIAL SPIN UP     Z=  ',F8.3)
 8013 format ('#  ',A4,'POTENTIAL SPIN DOWN   Z=  ',F8.3)
 8020  FORMAT(A40)
 8030 format (4f12.8)
 8040 format (1X,3I6)
 8050 format (2D15.8)
 8060 format (3f12.8)
 8070 format (2I5)
 9051 FORMAT (1p,4d20.12)
 9000 FORMAT (7a4,6x,'  exc:',a24,3x,a10)
 9010 FORMAT (3f12.8)
 9020 FORMAT (f10.5,/,f10.5,2f15.10)
 9030 FORMAT (i3,/,2d15.8,/,2i2)
 9140 FORMAT (i5,1p,d20.11)
 9040 FORMAT (f10.5,/,f10.5,2f15.10)
 9050 FORMAT (i3,/,2d15.8,/,2i2)
 9060 FORMAT (1p,2d15.6,1p,d15.8)
 9160 FORMAT (10i5)
 9061 FORMAT (1p,5d15.8)
 9070 FORMAT (i5,1p,d20.11)
c 9080 FORMAT (10x,20a4)
 9080 FORMAT (' < ',20a4)
 9081 FORMAT (' <#',20a4)
 9090 FORMAT (10i5)
 9100 FORMAT (1p,4d20.13)
        END