SUBROUTINE GENPOTSTART(NSPIN,IFILE,I13,INS,NBEGIN,NATOMS,ZATOM, & SITEAT,KSHAPE,IDSHAPE,VOLUMECL,LPOT, & AOUT_ALL,RWSCL,RMTCL,RMTCORE,MESHN,XRN,DRN, & IRWS,IRNS, & ALATNEW,QBOUND,KXC,TXC,LJELL) c ****************************************************** c * This subroutine reads a general potential format 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 potential initialization input-output include 'inc.geometry' INTEGER NPOTD PARAMETER (NPOTD=NSPIND*NATYPD) INTEGER LMPOTD PARAMETER (LMPOTD= (LPOTD+1)**2) INTEGER IRMIND,INSLPD PARAMETER (IRMIND=IRMD-IRNSD,INSLPD= (IRNSD+1)*LMPOTD) INTEGER LMXSPD PARAMETER (LMXSPD= (2*LPOTD+1)**2) LOGICAL LJELL C .. C .. Scalar Arguments .. REAL*8 ALAT,C,EFERMI,HFIELD,VCONST,ALATNEW, & QBOUND 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) INTEGER IRNS(NATYPD),IRWS(NATYPD),ITITLE(20), + LCORE(20),NCORE,IDSHAPE(*),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 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,NFUN,NR,IAT,IRNS1,NCORE1,LCORE1(20),IRC, & I1,I2,ISITE LOGICAL TEST,POTLM(LMPOTD) C .. C .. Local Arrays .. REAL*8 U(IRMD),DRDI(IRMD),ECORE(20), & RMESH(IRMD),RWS,VINS(IRMIND:IRMD,LMPOTD), & VM2Z(IRMD),VINSOUT(IRMIND:IRMD,LMPOTD), & VM2ZOUT(IRMD),VM2ZB(IRMD),ROUT(IRMD), & VINSB(IRMD,LMPOTD),DRDIOUT(IRMD), & WORK(IRMD,LMPOTD),RA(IRMD) CHARACTER*40 BANER,TEXT,I13 CHARACTER*4 ELEM_NAME CHARACTER*124 TXC(3) c -------------------------------------------------------------- WRITE(6,*) ' **** READING POTENTIAL **** ' OPEN(IFILE,STATUS='OLD',FILE=I13,ERR=1000) 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,IRMD 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 READ (IFILE,FMT=8000) BANER WRITE(6,999) BANER(2:23) 999 FORMAT ('###',A22,'###') IF (BANER(2:23).NE.'GENERAL POTENTIAL MESH') THEN WRITE(6,*) ' Input potential is not in the ' WRITE(6,*) ' GENERAL POTENTIAL MESH format' WRITE(6,*) '* It cannot be interpolated *' STOP END IF READ(IFILE,8010) ELEM_NAME,Z1 IF (NSPIN.EQ.1) THEN WRITE (6,8011) ELEM_NAME,Z1 ELSEIF (ISPIN.EQ.1) THEN WRITE (6,8012) ELEM_NAME,Z1 ELSEIF (ISPIN.EQ.2) THEN WRITE (6,8013) ELEM_NAME,Z1 END IF READ(IFILE,8020) TEXT READ(IFILE,8030) ALAT,RMAX,RMTNW1,RMT1 !WRITE(6,*) ALAT,RMAX,RMTNW1,RMT1 READ(IFILE,8040) NR,IMT1,IRNS1 !WRITE(6,*) NR,IMT1,IRNS1 READ(IFILE,8050) A1,B1 !WRITE(6,*) A1,B1 READ(IFILE,8060) EFERMI,VBC(ISPIN),VCON !WRITE(6,*) EFERMI,VBC(ISPIN),VCON READ(IFILE,8070) NCORE1,LMPOT !WRITE(6,*) NCORE1,LMPOT IF (NCORE1.GE.1) READ (IFILE,FMT=9140) (LCORE1(ICORE), + ECORE1(ICORE),ICORE=1,NCORE1) ! WRITE(6,*) (LCORE1(ICORE), !+ ECORE1(ICORE),ICORE=1,NCORE1) IF (IRNS1.EQ.0) THEN c c--- > store only the spherically averaged potential c (in mt or as - case) c this is done always for the host c READ (IFILE,9051) (VM2Z(IR),IR=1,NR) ELSE ! (IRNS1.EQ.0) c c--- > store the full potential , but the non spherical contribution c only from irns1 up to irws1 ; c remember that the lm = 1 contribution is multiplied c by a factor 1/sqrt(4 pi) c READ (IFILE,9160) IRT1P,IRNS1P,LMPOTP,ISAVE IRMINP = IRT1P - IRNS1P IRMINM = MAX(IRMINP,IRMIND) READ (IFILE,FMT=9100) (VM2Z(IR),IR=1,NR) IF (LMPOTP.GT.1) THEN LM1 = 2 DO 50 LM = 2,LMPOTP IF (LM1.NE.1) THEN IF (ISAVE.EQ.1) THEN READ (IFILE,FMT=9090) LM1 ELSE LM1 = LM END IF IF (LM1.GT.1) THEN READ (IFILE,FMT=9100) (U(IR),IR=IRMINP,NR) IF (LM1.LE.LMPOT) THEN POTLM(LM1) = .TRUE. DO 40 IR = IRMINM,NR VINS(IR,LM1) = U(IR) 40 CONTINUE END IF END IF END IF 50 CONTINUE END IF ! (LMPOTP.GT.1) END IF ! (IRNS1.EQ.0) c c Now create mesh information c !write(6,*) ' info info info : potential read in!' IRWS1 = NR if (irns1.ne.0) then ! bug corrected 5.10.2000 IRWS1 = IMT1 END IF c c--- > generate radial mesh - potential only is stored in potential card c RMESH(1) = 0.0D0 DRDI(1) = A1*B1 DO 70 IR = 2,IRWS1 EA = EXP(A1*REAL(IR-1)) RMESH(IR) = B1* (EA-1.0D0) DRDI(IR) = A1*B1*EA 70 CONTINUE IF (IRNS1.NE.0) THEN MESHN0 = NR - IMT1 DIST = RMAX - RMTNW1 DR = DIST/MESHN0 DO 80 IRI = 1,MESHN0 IR = IRI + IMT1 RMESH(IR) = RMTNW1 + DR*FLOAT(IRI) DRDI(IR) = DR 80 CONTINUE END IF c c c The input mesh is constructed now Construct the output mesh c ID = IDSHAPE(IAT) 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) ! 22.1.12 Changed from IRNS(ID) to IRNS(IAT) 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 c Ok now interpolate c MAXA = 1.D35 CALL spline_real(IRMD,RMESH,VM2Z,NR,MAXA,MAXA,VM2ZB) IF (INS.GT.0) THEN DO LM1=1,LMPOTD IF (POTLM(LM1)) THEN IRNSTOT = NR - IRMINM ! same as IRNS1 c map it DO I=1,IRNS1 WORK(I,LM1) = VINS(NR - IRNS1 + I - 1,LM1) RA(I) = RMESH(NR - IRNS1 + I - 1) END DO CALL spline_real(IRMD,RA,WORK(1,LM1),IRNSTOT,MAXA, & MAXA,VINSB(1,LM1)) END IF ENDDO ! LM1 END IF 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 IF (POTLM(LM1)) THEN DO IR = IRC+1,IRWSOUT R0 = ROUT(IR) CALL splint_real(RA,WORK(1,LM1), & VINSB(1,LM1),IRNSTOT,R0,PARSUM,PARSUMDERIV) VINSOUT(IR,LM1) = PARSUM END DO END IF END DO END IF c All interpolation ok now write 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_NAME,NSPIN) c 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 WRITE(6,*) 'Will use jellium starting potentials.' LJELL = .TRUE. RETURN 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