msspec_python3/msspec/phagen/fortran/phagen_scf.f

14918 lines
434 KiB
Fortran

subroutine phagen()
c program phagen
c ....................................
C .. ..
c .. Generates atomic phase shifts ..
c .. for inequivalent atoms in a ..
c .. given cluster. Prototypical ..
c .. atoms selected automatically. ..
c .. Muffin-tin radii and type of ..
c .. final state potential selected ..
c .. via input option ..
C .. ..
c .. By C.R. Natoli 15/10/93 ..
C .. ..
c .. This version can handle ES ..
c .. ES = Empty Spheres 28/09/2007 ..
C .. ..
C .. Scalar-relativistic version ..
C .. with spin-orbit selection ..
C .. by C.R. Natoli 9 june 2011 ..
C .. ..
C ....................................
c ....................................
C
c .. INCOMING WAVE BOUNDARY CONDITIONS
c
C ....................................
C
C bug corrected in subroutine
C GET_CORE_STATE
C (FDP 18th May 2006)
C
C bug corrected in subroutine
C ALPHA0 (DS : 7th May 2007)
C 2nd dimension r: 150 ---> UA_
C
C LEED case (calctype = 'led')
C added (DS : 30th May 2007).
C
C bug corrected in subroutine
C SETEQS (DS+CRN 30th May 2007) :
C z_shift=5.0 and i_z_shift=5
C instead of 0.0 and 0.
C
C bug corrected in subroutines
C MOLDAT,GRPNEI,WRIDAT :
C NEIMAX set to nat_ instead
C of 350 in PARAMETER statement
C (FDP+DS 4th June 2007)
C
C all error output redirected to
C unit 6 (DS 4th March 2008).
C
C modified to handle high Z elements
C (CRN : september 2008)
C
C cleaned : DS 17th November 2008
C
C modified to impose lmaxt externally
C (CRN : july 2009)
C
C modified to include quadrupole
C radial matrix elements
C (CRN : june 2012)
C
C File formats for radial integrals
C modified (DS 8th january 2013)
C
C modified to introduce t-matrix
C calculation in the eikonal approximation
C (CRN : march 2013)
C
C bug corrected in routine linlogmesh: rhon ---> r_sub
C (CRN : april 2013)
C
C modified to calculate tmatrix, radial integrals
C and atomic cross sections on linearlog mesh
C (CRN: september 2012 and april 2013)
C
C bug corrected in routine pgenll2: complex*16 dnm.
C v potential converted to complex*16 in routines
C pgenll1m and pgenll2
C (CRN: april 2013)
C
C bug corrected in the calculation of the total mfp = amfpt
C (CRN: april 2014)
C
C modified to calculate eels regular radial matrix elements
C (CRN: november 2014)
C
C modified to convert energy input data in data3.ms to Ryd
C (CRN: november 2014)
C
C modified to calculate eels and xas/rexs irregular radial matrix elements
C (CRN: juin 2015)
C
C modified to calculate e2e regular radial matrix elements
C (CRN: december 2015) modification in subroutine smtxllm
C statement 13824
C
C bug corrected in subroutine calc_edge (xion = 0 for ground state)
C (CNR: June 2017)
implicit real*8 (a-h,o-z)
c
include 'msxas3.inc'
include 'msxasc3.inc'
c
c.. constants
c
antoau = 0.52917715d0
pi = 3.141592653589793d0
ev = 13.6058d0
zero = 0.d0
c
c.. threshold for linearity
c
thresh = 1.d-4
c
c.. fortran io units
c
idat = 5
iwr = 6
c iwr = 16
iwf=32
iphas = 30
iedl0 = 31
iof = 17
c.......................................................
c open (iwr,file='results.dat',form='formatted',status='unknown')
write(iwr,1000)
c...
c open (idat,file='data/auger.ms',status='old')
c open (iphas,file='phases.dat',status='unknown')
c if (calctype.eq.'xpd') then
call system('mkdir -p div/wf')
call system('mkdir -p plot')
call system('mkdir -p tl')
C!!!! INPUT FILE TO LOAD
open (idat,file='../input/input.ms',status='old')
C!!!!
open (iphas,file='div/phases.dat',form='formatted',
1 status='unknown')
open (iedl0,file='div/exdl0.dat',form='unformatted',
1 status='unknown')
open (iof,file='div/inf.xas',form='unformatted',status='unknown')
c open (iwr,file='phagen_3.lis',status='unknown')
open (unit=21,form='unformatted',status='scratch')
open (60,file='div/file060.dat',form='formatted',status='unknown')
open (50,file='div/filerme.dat',form='formatted',
1 status='unknown')
c open (56,file='div/eelsrme.dat',form='formatted',
c 1 status='unknown')
open (unit=13,file='div/filepot.dat',form='formatted',
1 status='unknown')
open (unit=14,file='div/filesym.dat',form='formatted',
1 status='unknown')
open(unit=11,file='div/fort.11',status='unknown')
c open(unit=56,file='div/nchannels.dat',status='unknown')
open(unit=32,file='div/wf/wf1.dat',status='unknown')
open(unit=33,file='div/wf/wf2.dat',status='unknown')
open(unit=66,file='div/file066',status='unknown')
c open(unit=15,file='div/vrel.dat',status='unknown') !in sub vrel
c open(unit=34,file='wf3.dat',status='unknown')
open(unit=70,file='div/tl-nr.dat',status='unknown')
open(unit=71,file='div/phases-nr.dat',status='unknown')
c
open(unit=80,file='div/tl-sr.dat',status='unknown')
open(unit=81,file='div/phases-sr.dat',status='unknown')
c
open(unit=90,file='div/tl-so.dat',status='unknown')
open(unit=91,file='div/phases-so.dat',status='unknown')
C
C Storage of old t_l calculation (subroutine smtx) for reference
C
open(unit=95,file='div/tl_ref.dat',status='unknown')
c
open(unit=98,file='div/cshsm.dat',status='unknown')
c
open(unit=99,file='div/csllm.dat',status='unknown')
c open(unit=69,file='check.log',status='unknown')
c else
c open(iphas,file='phasesaed.dat',form='formatted',status='unknown'
c open (iwf,file='wfaed.dat',form='formatted',status='unknown')
c open(iedl0,file='exdl0aed.dat',form='unformatted',
c * status='unknown')
c open (iof,file='infaed.xas',form='unformatted',status='unknown')
c open (iwr,file='phagen_12aed.lis',status='unknown')
c write(iwr,*)'ciao'
c open (unit=21,form='unformatted',status='scratch')
c open (60,file='file060aed.dat',form='formatted',status='unknown')
c open (50,file='fileatcsaed.dat',form='formatted',status='unknown'
c open (unit=13,file='filepotaed.dat',form='formatted',
c 1 status='unknown')
c open (unit=14,file='filesymaed.dat',form='formatted',
c 1 status='unknown')
c open(unit=11,file='fortaed.11',status='unknown')
c open(unit=32,file='wf1aed.dat',status='unknown')
c open(unit=33,file='wf2aed.dat',status='unknown')
c open(unit=66,file='fortaed.66',status='unknown')
c open(unit=34,file='wf3aed.dat',status='unknown')
c open(unit=35,file='tlaedmio3.dat',status='unknown')
c open(unit=55,file='radaedmio3.dat',status='unknown')
c endif
c
rewind idat
rewind iwf
rewind iphas
rewind iedl0
rewind iof
c
c read control cards
c
call inctrl
c
c read title cards
c
call intit(iof)
c
c read atomic coordinates cards (internal or cartesian)
c
call incoor
c
c compute atomic phase shifts if required
c
call calphas
c
c normal end
c
write(iwr,1100)
c
c..
c close(69)
close(70)
close(71)
close(80)
close(81)
close(90)
close(91)
close(21)
close(60)
close(13)
close(14)
close(15)
close(7)
close(50)
close(56)
close(35)
close(iwf)
close(iphas)
close(55)
c
1000 format(1x,65('_'),//,31x,'PHAGEN',/,1x,65('_'),/)
1100 format(//,15x,' ** phagen terminated normally ** ',//)
c
end
c
subroutine inctrl
implicit real*8 (a-h,o-z)
include 'msxas3.inc'
c
include 'msxasc3.inc'
c
real*4 emin,emax,delta,cip,gamma,eftri,db
common/continuum/emin,emax,delta,cip,gamma,eftri,iexcpot,db
common/eels/einc,esct,scangl,qt,lambda,eelsme(npss,npss,npss),
& p1(rdx_,npss,nef_),p2(rdx_,npss,nef_),
& p3(rdx_,npss,nef_),ramfsr1(npss,nef_),
& ramfsr2(npss,nef_),ramfsr3(npss,nef_),
& lmxels(3,ua_),p3irreg(rdx_,7),p2irreg(rdx_,7)
complex eelsme,p1,p2,p3,ramfsr1,ramfsr2,ramfsr3,p3irreg,p2irreg
real*4 einc,esct,scangl,qt,lambda
c
common/typot/ ipot
c
c I define the shells and orbitals of the primary core hole, and the
c two holes in the final state:
c
character shell,shell1,shell2,orbital1,orbital,orbital2
c................................................................
namelist/job/edge,edge1,edge2,l2h,potype,norman,absorber,coor,
$ emin,emax,delta,gamma,eftri,cip,vc0,rs0,vinput,eikappr,rsh,db,
$ lmaxt,ovlpfac,ionzst,charelx,calctype,potgen,lmax_mode,relc,
$ einc,esct,scangl,optrsh,enunit,lambda,expmode
c
c initialize namelist
c
vinput = .false.
potype='hedin'
potgen='in'
cip=0.0
relc='nr'
eikappr=' no'
coor='angs'
edge='k'
edge1='k'
edge2='k'
lmaxt=60
lmax_mode=2
l2h=0
absorber = 1
charelx = 'ex'
norman = 'stdcrm'
ovlpfac=0.d0
ionzst='neutral'
c mode = 0
calctype='xpd'
expmode='cis'
optrsh='n'
enunit='Ryd'
c
vc0 = -0.7d0
rs0 = 3.d0
c
emin = 0.5
emax = 40.0
delta= 0.05
gamma= 0.0
eftri= 0.0
rsh = 0.0d0 !used as a flag; set below to default in au
db = 0.01
c
c data initialization for calctype='els' or 'e2e'
c if(calctype.eq.'els'.or.calctype.eq.'e2e') then
c
einc= 1200.0
esct= 1000.0
scangl= 7.0/180.0*3.1415926
lambda = 0.0 !used as a flag; set below to default in au
c endif
c
c.....definition of lmax_mode:
c..... lmax_mode = 0: lmaxn(na)=lmax_, independent of energy and atom number
c..... lmax_mode = 1: lmaxn(na)= km*rs(na)+1, where km=(emax)^{1/2}
c..... lmax_mode = 2: lmaxn(na)= ke*rs(na)+1, where ke=(e)^{1/2}, where
c..... e is the running energy
c
c.. read control cards in namelist &job
c
read(idat,job)
read(idat,*)
c
c.....convert lengths in au if coor='angs'. Coordinates will be converted
c in subroutine inoor
if(coor.eq.'angs'.and.lambda.ne.0) then
lambda = lambda/real(antoau)
else
lambda = 20.0 ! in au corresponding to kappa = 0.05 (see subroutine cont)
endif
c
if(coor.eq.'angs'.and.rsh.ne.0) then
rsh = rsh/antoau
else
rsh = 1.0d0 ! in au
endif
c.....convert all energies to Ryd (when they are inputed in eV)
c
if(enunit.eq.' ev') then
c vc0 = vc0/ev
c
cip = cip/real(ev)
emin = emin/real(ev)
emax = emax/real(ev)
delta= delta/real(ev)
gamma= gamma/real(ev)
eftri= eftri/real(ev)
einc= einc/real(ev)
esct= esct/real(ev)
endif
c
if(lmax_mode.gt.2) then
write(iwr,*) 'lmax_mode should be less than 3'
call exit
endif
c
if(calctype.eq.'els') then
lmax_mode = 2
einl = dble(einc - esct - cip)
if(cip.ne.0.0.and.einl.lt.0.0d0) then
write(6,*)' unable to excite chosen edge:',
& ' einc - esct - cip less than zero =', einl
call exit
endif
endif
c
if(calctype.eq.'led') charelx = 'gs'
if ((calctype.eq.'xpd').or.(calctype.eq.'led').or.
& (calctype.eq.'els')) then
c
write(iwr,1000) calctype
write(iwr,1001)
if(calctype.eq.'xpd'.or.calctype.eq.'xas'.or.
& calctype.eq.'rex'.or.calctype.eq.'els') write(iwr,1005)edge
write(iwr,1010)potype,norman,absorber
write(iwr,1015)coor,emin,emax
write(iwr,1020)delta,gamma,eftri
c write(iwr,1025)cip,lmax
write(iwr,1038) ionzst
c if (mode.eq.0) write(iwr,1036)
if (potgen.eq.'in') write(iwr,1036)
c if (mode.eq.1) write(iwr,1037)
if (potgen.eq.'ex') write(iwr,1037)
1000 format(' parameters for this ',a3,' calculation:')
1001 format(1x,65('-'))
1005 format(2x,'edge= ',a2)
1010 format(2x,'potype= ',a5,5x,'norman= ',a6,4x,'absorber= ',i2)
1015 format(2x,'coor= ',a4,8x,'emin= ',f7.2,' Ry',2x,'emax= ',
$ f7.2,' Ry')
1020 format(2x,'delta= ',f6.3,' Ry',2x,'gamma= ',f5.2,
$ 2x,'Ry',2x,'eftri= ',f6.3,2x,'Ry')
1025 format(2x,'cip= ',f7.2,2x,'Ry',2x,'lmax= ',i2)
1036 format(2x,'final state potential generated internally')
1037 format(2x,'final state potential read in from extnl file')
1038 format(2x,'ionization state : ',a7)
c
else
c
write(iwr,10001) calctype
write(iwr,10011)
write(iwr,10051)edge,edge1,edge2
write(iwr,10101)potype,norman,absorber
write(iwr,10151)coor,emin,emax
write(iwr,10201)delta,gamma,eftri
c write(iwr,10251)cip,lmax
write(iwr,10381) ionzst
c if (mode.eq.0) write(iwa,10361)
c if (mode.eq.1) write(iwa,10371)
10001 format(' parameters for this 'a3,' calculation:')
10011 format(52('-'))
10051 format(2x,'edge= ',a2,2x,'edge1= ',a2,2x,'edge2= ',a2)
10101 format(2x,'potype= ',a5,5x,'norman= ',a6,4x,'absorber= ',i2)
10151 format(2x,'coor= ',a4,8x,'emin= ',f7.2,' Ry',2x,'emax= ',
$ f7.2,' Ry')
10201 format(2x,'delta= ',f6.3,' Ry',2x,'gamma= ',f5.2,
$ 2x,'Ry',2x,'eftri= ',f6.3,2x,'Ry')
10251 format(2x,'cip= ',f7.2,2x,'Ry',2x,'lmax= ',i2)
10381 format(2x,'ionization state :',a7)
c
end if
c
c......check number of energy points
c
kxe = nint((emax-emin)/delta + 1.)
if(kxe.gt.nep_)then
write(6,731) kxe
731 format(//,
& ' increase the dummy dimensioning variable, nep_. ',
& /,' it should be at least equal to: ', i5,/)
call exit
end if
c
c.. set other options and seek for errors
c
ierror=0
c
c potgen determines whether the potential is generated internally
c by the present program or read in externally
c potype determines which which kind of exchange-correlation potential
c is used
c mode is 0 if the potential is to be computed and 1 if the
c potential is to be read
c iexcpot is defined after the potential type according to
c the values found below
c
mode = 0
if (potgen.eq.'ex') mode=1
c
iexcpot = 0
ipot = 0
c
if(potype.eq.'xalph')then
iexcpot=1
else
if(potype.eq.'hedin')then
ipot = 1
iexcpot=5
else
if(potype.eq.'dhrel')then
iexcpot=2
else
if(potype.eq.'dhcmp')then
ipot = 1
iexcpot=4
else
if(potype.eq.'hdrel')then
iexcpot=3
else
if(potype.eq.' lmto') then
iexcpot=6
else
ierror=1
endif
endif
endif
endif
endif
endif
c
shell=edge(1:1)
orbital=edge(2:2)
c
if(shell.eq.'k')then
lin=0
hole=1
else
if(shell.eq.'l')then
if(orbital.eq.'1') then
lin=0
hole=2
else
if(orbital.eq.'2')then
lin=1
hole=3
else
if(orbital.eq.'3')then
lin=1
hole=4
else
ierror=1
endif
endif
endif
c
else
if(shell.eq.'m')then
if(orbital.eq.'1')then
lin=0
hole=5
else
if(orbital.eq.'2')then
lin=1
hole=6
else
if(orbital.eq.'3')then
lin=1
hole=7
else
if(orbital.eq.'4')then
lin= 2
hole=8
else
if(orbital.eq.'5')then
lin=2
hole=9
else
ierror=1
endif
endif
endif
endif
endif
c
else
c
if(shell.eq.'n')then
if(orbital.eq.'1')then
lin=0
hole=10
else
if(orbital.eq.'2')then
lin=1
hole=11
else
if(orbital.eq.'3')then
lin=1
hole=12
else
if(orbital.eq.'4')then
lin= 2
hole=13
else
if(orbital.eq.'5')then
lin=2
hole=14
else
if(orbital.eq.'6')then
lin=3
hole=15
else
if(orbital.eq.'7')then
lin=3
hole=16
else
ierror=1
endif
endif
endif
endif
endif
endif
endif
c
else
c
if(shell.eq.'o')then
if(orbital.eq.'1')then
lin=0
hole=17
else
if(orbital.eq.'2')then
lin=1
hole=18
else
if(orbital.eq.'3')then
lin=1
hole=19
else
if(orbital.eq.'4')then
lin= 2
hole=20
else
if(orbital.eq.'5')then
lin=2
hole=21
else
if(orbital.eq.'6')then
lin=3
hole=22
else
if(orbital.eq.'7')then
lin=3
hole=23
else
ierror=1
endif
endif
endif
endif
endif
endif
endif
c
endif
endif
endif
endif
endif
c
if (calctype.eq.'aed') then
c
c We take the substrings of the final holes in the Auger decay
c
shell1=edge1(1:1)
orbital1=edge1(2:2)
shell2=edge2(1:1)
orbital2=edge2(2:2)
c
if(shell1.eq.'k')then
lin1=0
hole1=1
else
if(shell1.eq.'l')then
if(orbital1.eq.'1') then
lin1=0
hole1=2
else
if(orbital1.eq.'2')then
lin1=1
hole1=3
else
if(orbital1.eq.'3')then
lin1=1
hole1=4
else
ierror=1
endif
endif
endif
c
else
c
if(shell1.eq.'m')then
if(orbital1.eq.'1')then
lin1=0
hole1=5
else
if(orbital1.eq.'2')then
lin1=1
hole1=6
else
if(orbital1.eq.'3')then
lin1=1
hole1=7
else
if(orbital1.eq.'4')then
lin1= 2
hole1=8
else
if(orbital1.eq.'5')then
lin1=2
hole1=9
else
ierror=1
endif
endif
endif
endif
endif
c
else
c
if(shell1.eq.'n')then
if(orbital1.eq.'1')then
lin1=0
hole1=10
else
if(orbital1.eq.'2')then
lin1=1
hole1=11
else
if(orbital1.eq.'3')then
lin1=1
hole1=12
else
if(orbital1.eq.'4')then
lin1= 2
hole1=13
else
if(orbital1.eq.'5')then
lin1=2
hole1=14
else
if(orbital1.eq.'6')then
lin1=3
hole1=15
else
if(orbital1.eq.'7')then
lin1=3
hole1=16
else
ierror=1
endif
endif
endif
endif
endif
endif
endif
c
else
c
if(shell1.eq.'o')then
if(orbital1.eq.'1')then
lin1=0
hole1=17
else
if(orbital1.eq.'2')then
lin1=1
hole1=18
else
if(orbital1.eq.'3')then
lin1=1
hole1=19
else
if(orbital1.eq.'4')then
lin1= 2
hole1=20
else
if(orbital1.eq.'5')then
lin1=2
hole1=21
else
if(orbital1.eq.'6')then
lin1=3
hole1=22
else
if(orbital1.eq.'7')then
lin1=3
hole1=23
else
ierror=1
endif
endif
endif
endif
endif
endif
endif
c
endif
endif
endif
endif
endif
c
if(shell2.eq.'k')then
c
lin2=0
hole2=1
c
else
c
if(shell2.eq.'l')then
if(orbital2.eq.'1') then
lin2=0
hole2=2
else
if(orbital2.eq.'2')then
lin2=1
hole2=3
else
if(orbital2.eq.'3')then
lin2=1
hole2=4
else
ierror=1
endif
endif
endif
c
else
c
if(shell2.eq.'m')then
if(orbital2.eq.'1')then
lin2=0
hole2=5
else
if(orbital2.eq.'2')then
lin2=1
hole2=6
else
if(orbital2.eq.'3')then
lin2=1
hole2=7
else
if(orbital2.eq.'4')then
lin2= 2
hole2=8
else
if(orbital2.eq.'5')then
lin2=2
hole2=9
else
ierror=1
endif
endif
endif
endif
endif
c
else
c
if(shell2.eq.'n')then
if(orbital2.eq.'1')then
lin2=0
hole2=10
else
if(orbital2.eq.'2')then
lin2=1
hole2=11
else
if(orbital2.eq.'3')then
lin2=1
hole2=12
else
if(orbital2.eq.'4')then
lin2= 2
hole2=13
else
if(orbital2.eq.'5')then
lin2=2
hole2=14
else
if(orbital2.eq.'6')then
lin2=3
hole2=15
else
if(orbital2.eq.'7')then
lin2=3
hole2=16
else
ierror=1
endif
endif
endif
endif
endif
endif
endif
c
else
c
if(shell2.eq.'o')then
if(orbital2.eq.'1')then
lin2=0
hole2=17
else
if(orbital2.eq.'2')then
lin2=1
hole2=18
else
if(orbital2.eq.'3')then
lin2=1
hole2=19
else
if(orbital2.eq.'4')then
lin2= 2
hole2=20
else
if(orbital2.eq.'5')then
lin2=2
hole2=21
else
if(orbital2.eq.'6')then
lin2=3
hole2=22
else
if(orbital2.eq.'7')then
lin2=3
hole2=23
else
ierror=1
endif
endif
endif
endif
endif
endif
endif
c
endif
endif
endif
endif
endif
c
endif
c
c.. stop if errors occurred
c
if(ierror.eq.0)goto 10
c
write(iwr,*) ' '
write(iwr,*) ' '
write(iwr,*)' ** error in inctrl **'
write(iwr,*)' -> check namelist values'
write(iwr,*) ' '
write(iwr,*) ' '
c
stop
10 continue
c
c.. check dimensions for lmax
c
if(lmaxt.gt.lmax_) then
write(iwr,*) ' '
write(iwr,*) ' '
write(iwr,*)' ** error in inctrl **'
write(iwr,*)' -> check dimensions for lmax_'
write(iwr,*) ' '
write(iwr,*) ' '
stop
endif
c
end
c
subroutine intit(iof)
C
c... read title cards until a blank card is encountered
C
implicit real*8 (a-h,o-z)
include 'msxas3.inc'
c
include 'msxasc3.inc'
c
logical blank
logical line1
character*1 card(80)
c
write(iwr,1001)
line1=.true.
c
1 call incard (idat,card,ierr)
if(ierr.eq.0) goto 3
if(ierr.eq.1) then
write(iwr,2000)
if(ierr.eq.2) then
write(iwr,2001)
endif
endif
2000 format(//,' ** intit : end input -> stop **',//)
2001 format(//,' ** intit : input error -> stop **',//)
stop
3 continue
c
c.. write the 1st line of title into iof
c
if (line1) write(iof) (card(j),j=1,79)
line1=.false.
if ( blank(card) ) goto 2
write(iwr,1000) (card(j),j=1,79)
goto 1
2 continue
write(iwr,1001)
1000 format(1x,80a1)
1001 format(/)
end
c
subroutine incard (idat,card,ierr)
c
character*1 card(80)
ierr=0
do 2 i=1,80
2 card(i)=' '
read(idat,1000,end=9,err=10) (card(i),i=1,80)
return
9 ierr=1
return
10 ierr=2
return
1000 format(80a1)
end
c
logical function blank(card)
character*1 card(80)
data iasc/32/
c
c iasc is the ascii code for ' ' (32)
c here a blank card is a card with ascii codes < 32
c i.e., control characters are ignored
c
blank=.true.
do 1 i=1,80
if (ichar(card(i)).gt.iasc) then
blank=.false.
return
endif
1 continue
end
c
subroutine incoor
c
implicit real*8 (a-h,o-z)
include 'msxas3.inc'
c
include 'msxasc3.inc'
c
common/lmto/ rdsymbl,tag(nat_)
character*2 tag,tagi
logical rdsymbl
c
if( coor.eq.'au ') write(iwr,2000)
if( coor.eq.'angs') write(iwr,2001)
write(iwr,2002)
i=1
1 continue
c
rdsymbl=.false.
read (idat,*,iostat=ios) tagi,nzi
backspace(idat)
if (ios.eq.0) rdsymbl=.true.
c
if (rdsymbl) then
c
if (norman.eq.'stdcrm') then
radi = 0.0d0
redfi = 0.0d0
read (idat,*,err=2) tagi,nzi,ci1,ci2,ci3
endif
c
if (norman.eq.'stdfac') then
radi = 0.d0
redfi = 0.8d0
read (idat,*,err=2) tagi,nzi,ci1,ci2,ci3
endif
c
if (norman.eq.'scaled') then
radi = 0.0d0
read (idat,*,err=2) tagi,nzi,ci1,ci2,ci3,redfi
endif
c
if (norman.eq.'extrad') then
redfi = 0.0d0
read (idat,*,err=2) tagi,nzi,ci1,ci2,ci3,radi
endif
c
else
c
if (norman.eq.'stdcrm') then
radi = 0.0d0
redfi = 0.0d0
read (idat,*,err=2) nzi,ci1,ci2,ci3
endif
c
if (norman.eq.'stdfac') then
radi = 0.d0
redfi = 0.8d0
read (idat,*,err=2) nzi,ci1,ci2,ci3
endif
c
if (norman.eq.'scaled') then
radi = 0.0d0
read (idat,*,err=2) nzi,ci1,ci2,ci3,redfi
endif
c
if (norman.eq.'extrad') then
redfi = 0.0d0
read (idat,*,err=2) nzi,ci1,ci2,ci3,radi
endif
c
endif
c
if (nzi.lt.0) goto 2
c
if (i.gt.natoms) then
write(iwr,*) ' '
write(iwr,*) ' '
write(iwr,*)' ** error in incoor **'
write(iwr,*)' -> too many atoms, ',
1 'check dimensions'
write(iwr,*) ' '
write(iwr,*) ' '
stop
endif
c
nz(i) = nzi
c(i,1) = ci1
c(i,2) = ci2
c(i,3) = ci3
rad(i) = radi
redf(i) = redfi
tag(i) = tagi
if(rdsymbl) then
write (iwr,101) tag(i),nz(i),c(i,1),c(i,2),c(i,3),rad(i),redf(i)
else
write (iwr,100) nz(i),c(i,1),c(i,2),c(i,3),rad(i),redf(i)
endif
100 format(2x,i3,3f10.4,3x,2f7.4)
101 format(2x,a2,3x,i3,3f10.4,3x,2f7.4)
i=i+1
goto 1
2 nat = i-1
C print *, 'nat =', nat
write(iwr,2002)
write(iwr,2003)
if(ionzst.eq.' ionic') then
10 read(idat,*) nzat
if(nzat.lt.0) goto 20
backspace(idat)
read(idat,*) ndummy,charge_ion(nzat)
goto 10
endif
20 continue
c
c.. default units are angtroms, convert to a.u. if necessary
c
if (coor.eq.'au ') return
if (coor.eq.'angs') then
do 3 i=1,nat
if (norman.eq.'extrad')
& rad(i) = rad(i)/antoau
do 3 iz=1,3
c(i,iz)= c(i,iz) / antoau
3 continue
return
endif
c
write(iwr,*) ' '
write(iwr,*) ' '
write(iwr,*)' ** incoor: unit type unknown -> ',
1 'stop ** '
write(iwr,*) ' '
write(iwr,*) ' '
c
2000 format(' coordinates in a.u. ',25x,'Radii')
2001 format(' coordinates in angstroms',25x,'Radii')
2002 format(1x,65('-'))
2003 format(/)
stop
end
c
subroutine calphas
c
implicit real*8 (a-h,o-z)
include 'msxas3.inc'
c
include 'msxasc3.inc'
c
c
real*4 emin,emax,delta,cip,gamma,eftri,db
common/continuum/emin,emax,delta,cip,gamma,eftri,iexcpot,db
common/eels/einc,esct,scangl,qt,lambda,eelsme(npss,npss,npss),
& p1(rdx_,npss,nef_),p2(rdx_,npss,nef_),
& p3(rdx_,npss,nef_),ramfsr1(npss,nef_),
& ramfsr2(npss,nef_),ramfsr3(npss,nef_),
& lmxels(3,ua_),p3irreg(rdx_,7),p2irreg(rdx_,7)
complex eelsme,p1,p2,p3,ramfsr1,ramfsr2,ramfsr3,p3irreg,p2irreg
real*4 einc,esct,scangl,qt,lambda
c
character*8 nsymbl
c
c ######## Modified to introduce the two state wave functions for the
c Auger decay
c ######## let's introduce i_absorber_hole1 and i_absorber_hole2
c
common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1,
* i_absorber_hole2,i_norman,i_alpha,
1 i_outer_sphere,i_exc_pot,i_mode
common/dimens/nats,ndat,nout,lmaxx,irreps
c
common/aparms/xv(natoms),yv(natoms),zv(natoms),z(natoms),
u nsymbl(natoms),nzeq(natoms),neq(natoms),ncores(natoms),
u lmaxat(natoms), ktau(ua_),natau(neq_,ua_)
c
common/aparms_extra/rs_(natoms),redf_(natoms),ovlf
c
c real*4 emin,emax,delta,cip,gamma,eftri
c
write(iwr,*) ' ** enter calphas **'
c
if(cip.eq.0.0) then
c
c calculate edge ionization potential
c
call calc_edge(cip)
write(6,*) ' calculated ionization potential (ryd) =',cip
else
write(6,*) ' given ionization potential (ryd) =',cip
endif
write(6,*) ' ---'
c
c check consistency of input data in case of calctype = 'els'
c
if(calctype.eq.'els') then
einl = dble(einc - esct - cip)
if(einl.lt.0.0d0) then
write(6,*)' unable to excite chosen edge:',
& ' einc - esct - cip less than zero =', einl
call exit
endif
endif
c
c phase shifts computation
c initializes some variables for symmetry+potential programs
c nat is the total number of physical atoms as read in in
c subroutine incoor and is listed in common/atoms/
c
nats=nat
i_absorber = absorber
i_absorber_hole = hole
c
c ################## Modified to introduce the two state wave functions
c for the Auger decay
c ################## hole1 is the electron that will go down to fill
c the primary core hole
c
i_absorber_hole1 = hole1
i_absorber_hole2 = hole2
i_norman = 1
c if (norman.eq.'extrad') i_norman = 0
i_mode = mode
do 100 i=2,nat+1
nzeq(i) = nz(i-1)
xv(i) = c(i-1,1)
yv(i) = c(i-1,2)
zv(i) = c(i-1,3)
rs_(i)=rad(i-1)
redf_(i)=redf(i-1)
100 continue
ovlf = ovlpfac
c
write(iwr,*) ' '
write(iwr,*) ' '
write(iwr,*) ' symmetrizing coordinates... '
open (7,file='div/sym.out',status='unknown')
call xasymfn_sub
c
c.....Warning: in subroutine xasymfn_sub nats has been assigned
c.....the value (nat+1) to take into account the outer sphere.
c
c create equivalence table neqat
c i=1 is the outer sphere in xasym programs
c
do 200 i=1,nat
if (neq(i+1).eq.0) then
neqat(i)=i
else
neqat(i)=neq(i+1)-1
endif
200 continue
c
c.....Write out atomic coordinates in symmetry-program order:
c each prototypical atom is followed by its sym-equivalent atoms
c
c open (10,file='clus/clus.out',status='unknown')
if( coor.eq.'au ') then
ipha=1
coef=1.d0
endif
if( coor.eq.'angs') then
ipha=2
coef=0.529177d0
endif
write(10,888) ipha
888 format(30x,i1)
write(7,10) (neqat(i),i=1,nat)
10 format (/,16i5,//)
c
c write(7,10) nat, ndat-1
c
x0 = xv(2)
y0 = yv(2)
z0 = zv(2)
c
no = 0
do na = 1, ndat-1
do k = 2, nat+1
if (neqat(k-1).eq.na) then
no = no + 1
write(7,20) no,nsymbl(k),nzeq(k),xv(k)-x0,
& yv(k)-y0,zv(k)-z0,neqat(k-1)
write(10,20) no,nsymbl(k),nzeq(k),(xv(k)-x0)*coef,
& (yv(k)-y0)*coef,(zv(k)-z0)*coef,neqat(k-1)
endif
continue
enddo
enddo
c
close(10)
c
20 format (i5,6x,a4,i5,3f10.4,i5)
c
write(iwr,*)
write(iwr,*)' computing muffin tin potential and phase shifts'
call cont_sub(potype,potgen,lmax_mode,lmaxt,relc,eikappr,db)
c
ctn write(iwr,*)'calphas: neq', (neq(i),i=1,nat+1)
ctn write(iwr,*)'calphas: neqat', (neqat(i),i=1,nat)
c tstop=cputim()
c elapsed=tstop-tstart
c write(iwr,2000)elapsed
c 2000 format(' ** end calphas ** elapsed time ',f10.3,' seconds')
return
end
c
c
subroutine exit
c
write(6,*) ' '
write(6,*) ' '
write(6,*)' ** stop via call exit **'
write(6,*) ' '
write(6,*) ' '
stop
end
c
subroutine xasymfn_sub
c
c***********************************************************************
c
c xasymfn: xalpha symmetry function program (version 3, 11 feb 1981)
c
c written by m. cook, 1981.
c
c calls: input(at input,outpot),seteqs,symops,closur,ctable,basfns
c
c***********************************************************************
c
implicit real*8 (a-h,o-z)
c include 'mscalc.inc'
include 'msxas3.inc'
integer op_,ord_,two_npr_
parameter (natm2_=nat_-2,npr_=24,op_=48,ntax_=250,
1 ir_=14,ib_=28,ord_=8,l_=3,lp1_=4,
2 nms_=7,nfac_=9,nbf_=nat_*4,ncs_=24)
parameter(two_npr_=2*npr_,npr_p1_=npr_+1)
c
common/maxdim/natmx,ndatmx,neqsmx,nprmx,nopmx,nimp1,
u nordmx,nirpmx,nibmx,lbasmx,nbfmx,ncsmx,ntaxmx
c
c !flag for reformatted output
common/sym_out/isym_format
c
c----- define maximum array dimensions ---------------------------------
c warning : natmx est dans le common
cman data natmx,ndatmx,neqsmx,nprmx,nopmx,nimp1,
cman u nordmx,nirpmx,nibmx,lbasmx,nbfmx,ncsmx,ntaxmx
cman u /nat_,ua_,neq_,npr_,two_npr_,npr_p1_,
cman u ord_,ir_,ib_,l_,nbf_,ncs_,ntax_/
c
data natm2m,nopmax,lp1mx,nmsmx,mxfct
u /natm2_,op_,lp1_,nms_,nfac_/
cman
natmx = nat_
ndatmx = ua_
neqsmx = neq_
nprmx = npr_
nopmx = two_npr_
nimp1 = npr_p1_
nordmx = ord_
nirpmx = ir_
nibmx = ib_
lbasmx = l_
nbfmx = nbf_
ncsmx = ncs_
ntaxmx = ntax_
c
c
if (natm2m.lt.natmx-2) go to 10
if (nopmax.ne.2*nprmx) go to 20
if (lp1mx.ne.lbasmx+1) go to 30
if (nmsmx.ne.2*lbasmx+1) go to 40
if (mxfct.lt.2*lbasmx+1) go to 50
if (nordmx.lt.3) go to 60
c
c----- call major calculational subroutines ----------------------------
c
call input_xasymfn
call seteqs
call outpot_xasymfn
c
return
c
c----- error prints and stops ------------------------------------------
c
10 write (6,500) natm2m
stop
20 write (6,510) nopmax
stop
30 write (6,520) lp1mx
stop
40 write (6,530) nmsmx
stop
50 write (6,540) mxfct
stop
60 write (6,550) nordmx
stop
c
500 format (//,' error stop: natm2m =',i6,' is less than',
u ' natmx-2 : redimension',//)
510 format (//,' error stop: nopmax =',i6,' is not equal to',
u ' 2*nprmx : redimension',//)
520 format (//,' error stop: lp1mx =',i6,' is not equal to',
u ' lbasmx+1 : redimension',//)
530 format (//,' error stop: nmsmx =',i6,' is not equal to',
u ' 2*lbasmx+1 : redimension',//)
540 format (//,' error stop: mxfct =',i6,' is less than',
u ' 2*lbasmx+1 : redimension',//)
550 format (//,' error stop: nordmx =',i6,' : must be',
u ' redimensioned to 3 or greater',//)
end
c
c
subroutine input_xasymfn
c
c***********************************************************************
c
c reads in the molecular geometry information, desired
c l-values, and mode control variables. modes of operation:
c
c iprt=0, rot'n matrices not printed
c iprt=1, rot'n matrices will be printed out from ctable
c
c mdin=0, geometry, nz, neq data all read from card input
c mdin=1, non-sym data read from a molec stpot; sym data from cards
c
c mdou=0, only 1st col of degenerate irreps output to ktape
c mdou=1, all columns of degenerate irreps will be written
c
c mdco=0, single-atom core functions will be generated
c mdco=1, symmetry-adapted core functions will be generated
c
c mdeq=0, calc'd symmetry-eq list (neq) overrides any input neq
c mdeq=1, input list of symmetry-equivalences will be used
c
c if mdin=1, mdeq=1 is automatically enforced by this program
c because the form of the stpot depends on the list of sym-eq ats.
c
c called by: main (at input,outpot)
c
c***********************************************************************
c
implicit real*8(a-h,o-z)
c include 'mscalc.inc'
include 'msxas3.inc'
c
logical cmplxc,frezeq,inpot,nonint,onecol,symcor
character*8 nsymbl,nsymbl2
common/aparms_extra/rs(nat_),redf(nat_)
common/aparms/xv(nat_),yv(nat_),zv(nat_),z(nat_),
u nsymbl(nat_),nz(nat_),neq(nat_),ncores(nat_),lmax(nat_),
u ktau(ua_),natau(neq_,ua_)
common/aparms2/xv2(nat_),yv2(nat_),zv2(nat_),rs2(nat_),
u alpha2(nat_),redf2(nat_),z2(nat_),q2(nat_),qspnt2(2),
u qint2(2),
u watfac(nat_),alpha02,volint2,ovout2,rmxout2,nsymbl2(nat_),
u nz2(nat_),neq2(nat_),kmax2(nat_),kplace2(nat_),ktau2(ua_)
common/lparam/lmax2(nat_),l0i
common/coords/s(3,nat_)
dimension s2(3,nat_)
common/dimens/nat,ndat,nout,lmaxx,irreps
common/dimens2/nat2,ndat2
common/logicl/cmplxc,iprt,frezeq,inpot,nonint,onecol,symcor
common/maxdim/natmx,ndatmx,neqsmx,nprmx,nopmx,nimp1,
u nordmx,nirpmx,nibmx,lbasmx,nbfmx,ncsmx,ntaxmx
c !flag for reformatted output
common/sym_out/isym_format
c
common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1,
* i_absorber_hole2,i_norman,i_alpha,
1 i_outer_sphere,i_exc_pot,i_mode
c !generate potential file
common/out_ascii/iout_ascii
c
common/charge_center/cc_dif(3,1),z_shift,i_z_shift,shift_cc
logical shift_cc
c
common/lmto/ rdsymbl,tag(nat_)
character*2 tag
logical rdsymbl
character*2 nameat
dimension nameat(100)
c
DATA NAMEAT/' H','He','Li','Be',' B',' C',' N',' O',' F','Ne',
1 'Na','Mg','Al','Si',' P',' S','Cl','Ar',' K','Ca',
1 'Sc','Ti',' V','Cr','Mn','Fe','Co','Ni','Cu','Zn',
1 'Ga','Ge','As','Se','Br','Kr','Rb','Sr',' Y','Zr',
1 'Nb','Mo','Tc','Ru','Rh','Pd','Ag','Cd','In','Sn',
1 'Sb','Te',' I','Xe','Cs','Ba','La','Ce','Pr','Nd',
1 'Pm','Sm','Eu','Gd','Tb','Dy','Ho','Er','Tm','Yb',
1 'Lu','Hf','Ta',' W','Re','Os','Ir','Pt','Au','Hg',
1 'Tl','Pb','Bi','Po','At','Rn','Fr','Ra','Ac','Th',
1 'Pa',' U','Np','Pu','Am','Cm','Bk','Cf','Es','Fm'/
c
data thr/0.001d0/
data zero/0.d0/
data lunout,lunout2/7,60/
c
iprt=0
mdou=0
mdco=0
mdeq=0
isym_format=0
c !nout defined
nout=1
c !same as nout but global
i_outer_sphere=1
c
frezeq=.false.
symcor=.false.
onecol=.true.
if (mdeq.eq.1) frezeq=.true.
if (mdco.eq.1) symcor=.true.
if (mdou.eq.1) onecol=.false.
c
c-----------------------------------------------------------------------
c mdin = 0 : only geometry & atomic # data, from card input
c-----------------------------------------------------------------------
c
inpot=.false.
c !nout defined
nout=1
ctn
ctn Values passed through the subroutines parameters
ctn read (lunin,*) nat,i_absorber,i_absorber_hole,i_norman,
ctn &i_mode
c
nat=nat+i_outer_sphere
if (nout.eq.0) write (lunout,570) nat
if (nout.ne.0) write (lunout,580) nat
if (nat.gt.natmx) go to 140
write (lunout,530)
c
r_sphere=0.0d0
do 10 na=2,nat
ctn read (lunin,*) nsymbl(na),nz(na),xv(na),yv(na),zv(na),
ctn u rs(na),redf(na)
ctn modifs :
c nsymbl(na)=nameat(nz(na))
c......modification for Empty Spheres
c
if(rdsymbl) then
nsymbl(na)=tag(na-1)
else
if(nz(na).eq.0) then
nsymbl(na)='ES'
else
nsymbl(na)=nameat(nz(na))
endif
endif
z(na)=dfloat(nz(na))
neq(na)=0
c !needed to determine point group
lmax(na)=3
ncores(na)=0
write (lunout,550) na,nsymbl(na),nz(na),xv(na),yv(na),zv(na),
u neq(na),lmax(na),ncores(na)
10 continue
c
c define outer sphere parameters (i. e. atomic center)
c
na=1
nsymbl(na)='osph'
nz(na)=0
z(na)=0.0d0
neq(na)=0
rs(na)=0.0d0
redf(na)=0.0d0
c !needed to determine point group
lmax(na)=3
ncores(na)=0
c
c define outer sphere coordinates at center of charge
c
xo=zero
yo=zero
zo=zero
wt=zero
do 910 na1=2,nat
xo=xo+z(na1)*xv(na1)
yo=yo+z(na1)*yv(na1)
zo=zo+z(na1)*zv(na1)
wt=wt+z(na1)
910 continue
xo=xo/wt
yo=yo/wt
zo=zo/wt
if (dabs(xo).lt.thr) xo=zero
if (dabs(yo).lt.thr) yo=zero
if (dabs(zo).lt.thr) zo=zero
xv(na)=xo
yv(na)=yo
zv(na)=zo
c
if(i_norman.ne.1)then
do 15 na1=2,nat
r_sphere_temp=sqrt((xv(na1)-xv(1))**2+
u (yv(na1)-yv(1))**2+
u (zv(na1)-zv(1))**2)+rs(na1)
if(r_sphere.lt.r_sphere_temp)then
r_sphere=r_sphere_temp
end if
15 continue
rs(1)=r_sphere
end if
write (lunout,550) na,nsymbl(na),nz(na),xv(na),yv(na),zv(na),
u neq(na),lmax(na),ncores(na)
write (lunout,560)
c
c*** check coordinates of atoms
c
do 1150 na1=1,nat
do 1140 na2=1,na1
dist =dsqrt((xv(na1)-xv(na2))**2
u +(yv(na1)-yv(na2))**2 + (zv(na1)-zv(na2))**2 )
if((na2.gt.1).and.(na1.ne.na2)) then
if(dist.lt.thr)then
write(6,562)na1,na2
call exit
end if
end if
1140 continue
1150 continue
c
return
c
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c entry outpot_xasymfn
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c
c----- molecule will usually have been rotated:
c print the new atomic coordinates in standard orientation ------
c
entry outpot_xasymfn
write (lunout,590)
print 595
write (lunout,530)
print 535
nashf=1
c
nat2=nat
ndat2=ndat
i_absorber_real=i_absorber+i_outer_sphere
c
c set z on absorbing atom back to original value
c
z(i_absorber_real)=z(i_absorber_real)-z_shift
nz(i_absorber_real)=nz(i_absorber_real)-i_z_shift
c !symmetry distinct atoms
do 70 nda=1,ndat
if(shift_cc)then
c !go back to real cente
s2(1,nashf)=s(1,nashf)-cc_dif(1,1)
c !of charge
s2(2,nashf)=s(2,nashf)-cc_dif(2,1)
s2(3,nashf)=s(3,nashf)-cc_dif(3,1)
if (dabs(s2(1,nashf)).lt.thr) s2(1,nashf)=zero
if (dabs(s2(2,nashf)).lt.thr) s2(2,nashf)=zero
if (dabs(s2(3,nashf)).lt.thr) s2(3,nashf)=zero
else
s2(1,nashf)=s(1,nashf)
s2(2,nashf)=s(2,nashf)
s2(3,nashf)=s(3,nashf)
endif
write (lunout,550) nda,nsymbl(nda),nz(nda),
u s2(1,nashf),s2(2,nashf),s2(3,nashf),neq(nda),
u lmax(nda),ncores(nda)
print 555, nda,nsymbl(nda),nz(nda),
u s2(1,nashf),s2(2,nashf),s2(3,nashf),neq(nda)
if(nda.ne.1)write (lunout2,552) s2(1,nashf),s2(2,nashf),
u s2(3,nashf),nsymbl(nda)
c
rs2(nda)=rs(nda)
redf2(nda)=redf(nda)
nsymbl2(nda)=nsymbl(nda)
xv2(nda)=s2(1,nashf)
yv2(nda)=s2(2,nashf)
zv2(nda)=s2(3,nashf)
nz2(nda)=nz(nda)
z2(nda)=z(nda)
neq2(nda)=neq(nda)
ktau2(nda)=ktau(nda)
nashf=nashf+ktau(nda)
70 continue
nashf=0
do 90 nda=1,ndat
nashf=nashf+1
neqs=ktau(nda)
if (neqs.eq.1) go to 90
do 80 ne=2,neqs
c !equivalent sets
nashf=nashf+1
na=natau(ne,nda)
if(shift_cc)then
c !go back to real cente
s2(1,nashf)=s(1,nashf)-cc_dif(1,1)
c !of charge
s2(2,nashf)=s(2,nashf)-cc_dif(2,1)
s2(3,nashf)=s(3,nashf)-cc_dif(3,1)
if (dabs(s2(1,nashf)).lt.thr) s2(1,nashf)=zero
if (dabs(s2(2,nashf)).lt.thr) s2(2,nashf)=zero
if (dabs(s2(3,nashf)).lt.thr) s2(3,nashf)=zero
else
s2(1,nashf)=s(1,nashf)
s2(2,nashf)=s(2,nashf)
s2(3,nashf)=s(3,nashf)
endif
write (lunout,550) na,nsymbl(na),nz(na),
u s2(1,nashf),s2(2,nashf),s2(3,nashf),neq(na),lmax(na),ncores(na)
print 555, na,nsymbl(na),nz(na),
u s2(1,nashf),s2(2,nashf),s2(3,nashf),neq(na)
write (lunout2,552) s2(1,nashf),s2(2,nashf),s2(3,nashf),
u nsymbl(na)
rs2(na)=rs(na)
redf2(na)=redf(na)
nsymbl2(na)=nsymbl(na)
xv2(na)=s2(1,nashf)
yv2(na)=s2(2,nashf)
zv2(na)=s2(3,nashf)
nz2(na)=nz(na)
z2(na)=z(na)
neq2(na)=neq(na)
80 continue
90 continue
if(nout.eq.1) then
z2(1)=1.0d0
nz2(1)=1
end if
write (lunout,560)
return
c
c----- error prints and stops ------------------------------------------
c
140 write (6,600) natmx,nat
stop
c
530 format (t53,'position'/30x,'atom no.',4x,'x',9x,'y',9x,'z',8x,
u 'eq',5x,'lmax',5x,'#cores'/)
535 format (t35,'position'/12x,'atom no.',4x,'x',9x,'y',9x,'z',8x,
u 'eq'/)
550 format (26x,i4,2x,a4,i6,3f10.4,i6,i8,i9)
552 format (3(2x,f10.3),2x,a4)
555 format (8x,i4,2x,a4,i6,3f10.4,i6)
560 format (/46x,6('*****')/)
562 format (//,'error: check coordinates of atoms # ',i4,
& ' and # ',i4,//)
570 format (//38x,'number of centers=',i5,' no outer sphere'/)
580 format (//38x,'number of centers=',i5,' outer sphere at '
u ,'center 1'/)
590 format (///38x,'molecular orientation for basis fn projection:'/)
595 format (//14x,' symmetrized atomic coordinates of cluster '/)
600 format (//' error stop: variable nat is .gt.',i6,
u ' : redimension natmx to',i6,//)
end
c
subroutine seteqs
c
c***********************************************************************
c
c translates the molecule to the center of nuclear charge
c and tentatively identifies symmetry-equivalent sets of atoms
c on the basis of interatomic distances.
c checks that the atoms are arranged in correct order for
c xascf: nda's first and eq atoms following. if input is from
c a molec starting pot, error stop if order is not correct. if
c input is not from a pot, the atoms will be shuffled into
c the appropriate xascf order at output time.
c note that during the execution of the symmetry program, the
c atoms are not kept in the scf order: they are in sym-program
c order, each nda followed immediately by its sym-eq partners.
c
c called by: main
c
c***********************************************************************
c
implicit real*8 (a-h,o-z)
c include 'mscalc.inc'
include 'msxas3.inc'
parameter (natm2_=nat_-2)
c
character*8 nsymbl
logical doshuf,equiv,found,match,frezeq
logical cmplxc,inpot,nonint,onecol,symcor
dimension neqt(nat_)
dimension found(natm2_),nbrz(natm2_,nat_),dnbr(natm2_,nat_)
integer trans(nat_)
common/aparms_extra/rs(nat_),redf(nat_)
common/aparms/xv(nat_),yv(nat_),zv(nat_),z(nat_),
u nsymbl(nat_),nz(nat_),neq(nat_),ncores(nat_),lmax(nat_),
u ktau(ua_),natau(neq_,ua_)
common/coords/s(3,nat_)
common/dimens/nat,ndat,nout,lmaxx,irreps
common/logicl/cmplxc,iprt,frezeq,inpot,nonint,onecol,symcor
common/maxdim/natmx,ndatmx,neqsmx,nprmx,nopmx,nimp1,
u nordmx,nirpmx,nibmx,lbasmx,nbfmx,ncsmx,ntaxmx
c
common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1,
* i_absorber_hole2,i_norman,i_alpha,
1 i_outer_sphere,i_exc_pot,i_mode
c
common/charge_center/cc_dif(3,1),z_shift,i_z_shift,shift_cc
common/transform/trans
logical shift_cc
c
data zero,thr/0.0d0,0.001d0/
c
data jtape/21/
data lunout/7/
c
c-----------------------------------------------------------------------
c find the center of charge of the nuclear framework and
c translate the molecule to that origin
c-----------------------------------------------------------------------
c !define nuclear charge shift
z_shift=5.0d0
i_z_shift=5
shift_cc=.true.
c
xo=zero
yo=zero
zo=zero
wt=zero
nastrt=nout+1
c !set up to make absorbing atom unique by addin
cc_dif(1,1)=zero
c !z_shift units of charge to its nucleus
cc_dif(2,1)=zero
cc_dif(3,1)=zero
wt_real=zero
do 5 na=nastrt,nat
cc_dif(1,1)=cc_dif(1,1)+z(na)*xv(na)
cc_dif(2,1)=cc_dif(2,1)+z(na)*yv(na)
cc_dif(3,1)=cc_dif(3,1)+z(na)*zv(na)
wt_real=wt_real+z(na)
5 continue
cc_dif(1,1)=cc_dif(1,1)/wt_real
cc_dif(2,1)=cc_dif(2,1)/wt_real
cc_dif(3,1)=cc_dif(3,1)/wt_real
c
i_absorber_real=i_absorber+i_outer_sphere
c increase z value of absorbing atom
z(i_absorber_real)=z(i_absorber_real)+z_shift
nz(i_absorber_real)=nz(i_absorber_real)+i_z_shift
c
do 10 na=nastrt,nat
xo=xo+z(na)*xv(na)
yo=yo+z(na)*yv(na)
zo=zo+z(na)*zv(na)
wt=wt+z(na)
10 continue
xo=xo/wt
yo=yo/wt
zo=zo/wt
if (dabs(xo).lt.thr) xo=zero
if (dabs(yo).lt.thr) yo=zero
if (dabs(zo).lt.thr) zo=zero
c !cc_dif is difference between
cc_dif(1,1)=cc_dif(1,1)-xo
c !real and shifted centers of
cc_dif(2,1)=cc_dif(2,1)-yo
c !charge
cc_dif(3,1)=cc_dif(3,1)-zo
if (dabs(cc_dif(1,1)).lt.thr) cc_dif(1,1)=zero
if (dabs(cc_dif(2,1)).lt.thr) cc_dif(2,1)=zero
if (dabs(cc_dif(3,1)).lt.thr) cc_dif(3,1)=zero
r_dif_cc=sqrt( cc_dif(1,1)*cc_dif(1,1)+cc_dif(2,1)*
u cc_dif(2,1)+cc_dif(3,1)*cc_dif(3,1) )/dsqrt(3.0d0)
if(r_dif_cc.lt.thr)shift_cc=.false.
do 20 na=1,nat
xv(na)=xv(na)-xo
yv(na)=yv(na)-yo
zv(na)=zv(na)-zo
if (dabs(xv(na)).lt.thr) xv(na)=zero
if (dabs(yv(na)).lt.thr) yv(na)=zero
if (dabs(zv(na)).lt.thr) zv(na)=zero
20 continue
c
c-----------------------------------------------------------------------
c classify sym-eq sets of atoms: two atoms are eqiv
c if they have same number of neighbors of same nz at same distances
c-----------------------------------------------------------------------
c
c----- calculate the distances of each atom from the others ------------
c
neqt(1)=0
do 40 na1=nastrt,nat
nabor=0
neqt(na1)=0
do 30 na2=nastrt,nat
if (na1.eq.na2) go to 30
nabor=nabor+1
nbrz(nabor,na1)=nz(na2)
rab=dsqrt((xv(na1)-xv(na2))**2
u +(yv(na1)-yv(na2))**2 + (zv(na1)-zv(na2))**2 )
dnbr(nabor,na1)=rab
30 continue
40 continue
c
c----- compare the neighbor charges and distances ----------------------
c
nabors=nat-(nout+1)
do 90 na1=nastrt,nat
na1p1=na1+1
if (na1p1.gt.nat) go to 90
do 80 na2=na1p1,nat
if (nz(na1).ne.nz(na2)) go to 80
if (neqt(na2).ne.0) go to 80
do 50 nabor=1,nabors
50 found(nabor)=.false.
equiv=.true.
c
c----- try to match the neighbors of na1 & na2 one-to-one --------------
c
do 70 nabor1=1,nabors
nzt= nbrz(nabor1,na1)
rabt=dnbr(nabor1,na1)
match=.false.
do 60 nabor2=1,nabors
if (found(nabor2)) go to 60
if (nbrz(nabor2,na2).ne.nzt) go to 60
if (dabs(dnbr(nabor2,na2)-rabt).gt.thr) go to 60
found(nabor2)=.true.
match=.true.
go to 65
60 continue
65 if (match) go to 70
equiv=.false.
go to 75
70 continue
c
c----- if all nabor2 found and each nabor1 had match=.true.,
c na1 and na2 have equivalent sets of neighbors -----------------
c
75 if (equiv) neqt(na2)=na1
80 continue
90 continue
c
c-----------------------------------------------------------------------
c compare the calculated and input neq arrays
c-----------------------------------------------------------------------
c
write (lunout,500)
write (lunout,510) (na,neqt(na),na=1,nat)
equiv=.true.
do 100 na=1,nat
if (neqt(na).ne.neq(na)) equiv=.false.
if (.not.frezeq) neq(na)=neqt(na)
100 continue
if (equiv) write (lunout,520)
if (.not.equiv.and.frezeq) write (lunout,530)
if (.not.equiv.and..not.frezeq) write (lunout,540)
c
c-----------------------------------------------------------------------
c check that the atoms are arranged in the correct scf order:
c all nda's first, then the sym-eq atoms for each nda in same order
c-----------------------------------------------------------------------
c
doshuf=.false.
do 110 na=nastrt,nat
if (neq(na).eq.0.and.neq(na-1).ne.0) doshuf=.true.
if (neq(na).lt.neq(na-1)) doshuf=.true.
110 continue
if (inpot.and.doshuf) go to 230
c
c----- if not running from a molecular starting pot,
c shuffle the atoms into xascf order ----------------------------
c
rewind jtape
nda=0
do 130 na=1,nat
if (neq(na).gt.0) go to 130
nda=nda+1
write (jtape) nsymbl(na),neq(na),nz(na),xv(na),yv(na),zv(na)
write (jtape) lmax(na),ncores(na),rs(na),redf(na),z(na)
do 120 na2=1,nat
if (neq(na2).eq.na) neq(na2)=nda
120 continue
130 continue
ndat=nda
if (ndat.gt.ndatmx) go to 240
do 150 nda=1,ndat
do 140 na=1,nat
if (neq(na).ne.nda) go to 140
write (jtape) nsymbl(na),neq(na),nz(na),xv(na),yv(na),zv(na)
write (jtape) lmax(na),ncores(na),rs(na),redf(na),z(na)
140 continue
150 continue
nda=0
do 310 i=2,nat
if (neq(i).eq.0) then
nda=nda+1
trans(i-1)=nda
endif
310 continue
do 320 na=2,ndat
do 325 i=2,nat
if (neq(i).eq.na) then
nda=nda+1
trans(i-1)=nda
endif
325 continue
320 continue
c
c----- read the shuffled atomic parameters back in ---------------------
c
rewind jtape
do 160 na=1,nat
read (jtape) nsymbl(na),neq(na),nz(na),xv(na),yv(na),zv(na)
read (jtape) lmax(na),ncores(na),rs(na),redf(na),z(na)
160 continue
rewind jtape
c
c-----------------------------------------------------------------------
c calculate the final symmetry-equivalence list ( natau )
c-----------------------------------------------------------------------
c
do 200 nda=1,ndat
neqs=1
natau(1,nda)=nda
do 190 na=1,nat
if (neq(na).ne.nda) go to 190
neqs=neqs+1
if (neqs.gt.neqsmx) go to 250
natau(neqs,nda)=na
190 continue
ktau(nda)=neqs
200 continue
c
c-----------------------------------------------------------------------
c arrange the atomic x,y,z coords in symmetry-program order:
c each nda is followed immediately by its sym-equivalent atoms
c-----------------------------------------------------------------------
c
nashuf=0
do 220 nda=1,ndat
neqs=ktau(nda)
do 210 ne=1,neqs
na=natau(ne,nda)
nashuf=nashuf+1
s(1,nashuf)=xv(na)
s(2,nashuf)=yv(na)
s(3,nashuf)=zv(na)
210 continue
220 continue
return
c
c----- error prints and stops ------------------------------------------
c
230 write (6,550)
stop
240 write (6,560) ndatmx,ndat
stop
250 write (6,570) neqsmx
stop
c
500 format (//25x,'calculated atomic symmetry equivalences,'/
u 30x,'based on interatomic distance matrix:',7x,'na',
u 4x,'neq(na)'/)
510 format (69x,i7,i8)
520 format (/t35,'the calculated symmetry-eq sets agree with',
u ' the input'/)
530 format (/t25,'calculated & input symmetry-eq sets do not',
u ' agree: input sets will be used'/)
540 format (/t22,'calculated & input symmetry-eq sets do not',
u ' agree: calculated sets will be used'/)
550 format (//t25,'input molecular pot does not have distinct',
u ' & sym-eq atoms in correct order for input to xascf',//)
560 format (//' error stop: variable ndat is .gt.',i6,
u ' : redimension ndatmx to',i6,//)
570 format (//' error stop: variable neqs is .gt.',i6,
u ' : redimension neqsmx',//)
end
c
c
subroutine vgen
c write(6,*) 'check1'
call rhoat
c write(6,*) 'check2'
call molpot
c write(6,*) 'check3'
call inpot
c write(6,*) 'check4'
return
end
c
C***********************************************************************
SUBROUTINE RHOAT
C***********************************************************************
C
C MAY-92
C
C GENERATES ATOMIC CHARGE DENSITY FOR PROTOTYPICAL ATOMS
C
C DICTIONARY :
C NDAT Number of prototypical atoms
C INV Logical unit on which to write the output [8]
C ZAT Atomic number
C MESH Number of radial mesh points [441]
C
C************************************************
implicit real*8 (a-h,o-z)
c
include 'msxas3.inc'
include 'msxasc3.inc'
c
common/dimens/nats,ndat
c
character*8 nsymbl
c..
c common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1
c *i_absorber_hole2,i_norman,i_alpha,
c 1i_outer_sphere,i_exc_pot,i_mode
COMMON/POT_TYPE/I_ABSORBER,I_ABSORBER_HOLE,I_ABSORBER_HOLE1,
* I_ABSORBER_HOLE2,I_NORMAN,I_ALPHA,
1 I_OUTERSPHERE,I_EXC_POT,I_MODE
C COMMON/APARMS/XV(NATOMS),YV(NATOMS),ZV(NATOMS),Z(NATOMS),
C u NSYMBOL(NATOMS),NZEQ(NATOMS),NEQ(NATOMS),NCORES(NATOMS),
C . LMAXAT(NATOMS)
C COMMON/APARMS_EXTRA/RS_(NATOMS),REDF_(NATOMS),OVLF
common/aparms/xv(natoms),yv(natoms),zv(natoms),z(natoms),
u nsymbl(natoms),nzeq(natoms),neq(natoms),ncores(natoms),
u lmaxat(natoms),ktau(ua_),natau(neq_,ua_)
C
COMMON/CRHOAT/RO(441,UA_,1)
c
DIMENSION X(441),RMESH(441)
C
REAL*4 XC,YC,ZC
DIMENSION XC(NAT_),YC(NAT_),ZC(NAT_)
C
DIMENSION NPAC(100)
C
LOGICAL OK
C
OK = .TRUE.
C
C* * * Initialize variables for subroutine molpot * * *
C
MESH = 441
C
C Prepare coordinate vectors to input subroutine moldat
C
DO 10 I=1,NAT
XC(I) = sngl(XV(I+1))
YC(I) = sngl(YV(I+1))
10 ZC(I) = sngl(ZV(I+1))
C Initialize to zero the vector indicating for which atom the density
C has already been calculated
DO N = 1, 100
NPAC(N) = 0
ENDDO
C
C compute x and r mesh (441 points)
C
NBLOCK=11
I=1
X(I)=0.0D0
RMESH(I)=0.0D0
DELTAX=0.0025D0
DO 120 J=1,NBLOCK
DO 121 K=1,40
I=I+1
X(I)=X(I-1)+DELTAX
121 CONTINUE
C
C For each new block, double the increment
C
DELTAX=DELTAX+DELTAX
120 CONTINUE
C
C Loop over prototypical atoms excluding outer sphere
C
NDAT1 = NDAT-1
DO 100 M=2,NDAT
DO NR = 1, 441
RO(NR,M,1) = 0.D0
ENDDO
IHOLE = 0
IF (M.EQ.2.AND.CHARELX.EQ.'ex') IHOLE=HOLE
NZAT = NZEQ(M)
IF(NZAT.NE.0) CION=CHARGE_ION(NZAT)
ZAT = Z(M)
C
C.....CHANGE FOR EMPTY SPHERES; CHS=0.88534138D0/ZAT**(1.D0/3.D0)
C
IF(ZAT.NE.0.D0) THEN
CHS=0.88534138D0/ZAT**(1.D0/3.D0)
ELSE
CHS=0.88534138D0
ENDIF
C
C Factor CHS is to go from X values to R values
C (the latter in atomic units; See Herman-Skillman p.5-3)
C
DO 130 I=2,MESH
RMESH(I)=CHS*X(I)
130 CONTINUE
C
IF(NZAT.EQ.0) GO TO 100
IF(NPAC(NZAT).EQ.0) THEN
CALL atom_sub(NZAT,IHOLE,RMESH(1),RO(1,M,1),0,0,CION)
IF(M.NE.2) NPAC(NZAT) = M
GO TO 100
ELSE
DO I = 1, 441
RO(I,M,1) = RO(I,NPAC(NZAT),1)
ENDDO
ENDIF
C
100 CONTINUE
C
C* * * * Generate input structural parameters for subroutine molpot * *
C
C
CALL MOLDAT(XC,YC,ZC,NZEQ(1),NEQAT(1),NAT,NDAT1,OK)
C
RETURN
C
END
C
C*******************************
C
subroutine atom_sub(iz,ihole,r_hs,rho0_hs,i_mode_atom,
$ i_radial,xion)
c
c i_mode_atom = 1 pass_back P_nK corresponding to neutr
c atom. i_radial designates radial function
c which is passed back in array rho0_hs re
c to mesh r_hs.
c I_radial has same label convention
c as ihole (1 = 1s1/2 ...).
c = all else pass back charge density in rho0_hs.
c
c
implicit real*8(a-h,o-z)
c
parameter ( mp = 251, ms = 30 )
c
character*40 title
c
common/mesh_param/jlo
common dgc(mp,ms),dpc(mp,ms),bidon(630),IDUMMY
c
c common /pass/ passd, passvt(251), passvc(251), passc(251)
c rho0 not renormalized
c common /rho/rho0(251)
c dgc contains large component radial functions
c common /deux/ dvn(251), dvf(251), d(251), dc(251), dgc(251,30)
c passc and rho0 contain 4*pi*r^2*rho(r)
c
dimension r(mp),r_hs(441),rho0_hs(441)
C
dimension dum1(mp), dum2(mp)
dimension vcoul(mp), rho0(mp), enp(ms)
c
title = ' '
c
ifr=1
iprint=0
C
amass=0.0d0
beta=0.0d0
c
c There are no nodes in relativistic radial charge density
c
small=1.0d-11
c !Hence a lower limit on rho(r) can be used.
dpas=0.05d0
dr1=dexp(-8.8d0)
dex=exp(dpas)
r_max=44.447d0
c
c compute relativistic Hartree-Fock charge density (on log mesh)
C and core state orbital wave function
c open(unit=543,file='atom_.dat',status='unknown')
c
call scfdat (title, ifr, iz, ihole, xion, amass, beta, iprint,
1 vcoul, rho0, dum1, dum2, enp, eatom)
c
c compute radial log mesh (see subroutine phase in J.J. Rehr's progr
c FEFF.FOR)
c
ddex=dr1
do 10 i=1,251
r(i)=ddex
ddex=ddex*dex
10 continue
C
DO JMP=1,MP
WRITE(66,*) R(JMP),RHO0(JMP)
ENDDO
c
do 15 i=1,441
rho0_hs(i)=0.0d0
15 continue
c
cman if(i_mode_atom.eq.1)goto 30
c
if(i_mode_atom.eq.1)goto 31
c
c using mesh form xainpot (r=0 not included)
c
do 30 i=1,441
if(r_hs(i).gt.r_max) goto 30
c
c find nearest points
c initialize hunting parameter (subroututine nearest)
c
jlo=1
call nearest(r,251,r_hs(i),
1 i_point_1,i_point_2,i_point_3)
if(abs(rho0(i_point_3)).lt.small) goto 30
c interpolate charge density
call interp_quad( r(i_point_1),rho0(i_point_1),
1 r(i_point_2),rho0(i_point_2),
1 r(i_point_3),rho0(i_point_3),
1 r_hs(i),rho0_hs(i) )
c
c branch point
c
30 continue
31 continue
c
c
if(i_mode_atom.ne.1)goto 50
c
c wave function generation
c using mesh form xainpot (r=0 not included)
c
do 40 i=1,441
if(r_hs(i).gt.r_max) goto 50
c
c find nearest points
c initialize hunting parameter (subroututine nearest)
c
jlo=1
call nearest(r,251,r_hs(i),
1 i_point_1,i_point_2,i_point_3)
c interpolate wavefunction
call interp_quad(
1 r(i_point_1),dgc(i_point_1,i_radial),
1 r(i_point_2),dgc(i_point_2,i_radial),
1 r(i_point_3),dgc(i_point_3,i_radial),
1 r_hs(i),rho0_hs(i)
1 )
40 continue
c
c branch point
c
50 continue
c
return
end
SUBROUTINE NEAREST(XX,N,X,I_POINT_1,I_POINT_2,I_POINT_3)
C
C FIND NEAREST THREE POINTS IN ARRAY XX(N), TO VALUE X
C AND RETURN INDICES AS I_POINT_1,I_POINT_2 AND I_POINT_3
C This subroutine was taken from Numerical Recipes,
C W. H. Press, B. F. Flanney, S. A. Teukolsky and W. T.
C Vetterling, page 91. Originally called HUNT
c
IMPLICIT REAL*8(A-H,O-Z)
COMMON/MESH_PARAM/JLO
C
DIMENSION XX(N)
LOGICAL ASCND
ASCND=XX(N).GT.XX(1)
C
C EXTRAPOLATE BELOW LOWEST POINT
C
IF(X.LE.XX(1))THEN
I_POINT_1=1
I_POINT_2=2
I_POINT_3=3
RETURN
END IF
C
C EXTRAPOLATE BEYOND HIGHEST POINT
C
IF(X.GE.XX(N))THEN
I_POINT_1=N-2
I_POINT_2=N-1
I_POINT_3=N
RETURN
END IF
IF(JLO.LE.0.OR.JLO.GT.N)THEN
JLO=0
JHI=N+1
GO TO 3
ENDIF
INC=1
IF(X.GE.XX(JLO).EQV.ASCND)THEN
1 JHI=JLO+INC
IF(JHI.GT.N)THEN
JHI=N+1
ELSE IF(X.GE.XX(JHI).EQV.ASCND)THEN
JLO=JHI
INC=INC+INC
GO TO 1
ENDIF
ELSE
JHI=JLO
2 JLO=JHI-INC
IF(JLO.LT.1)THEN
JLO=0
ELSE IF(X.LT.XX(JLO).EQV.ASCND)THEN
JHI=JLO
INC=INC+INC
GO TO 2
ENDIF
ENDIF
3 IF(JHI-JLO.EQ.1)THEN
IF((JLO+1).EQ.N)THEN
I_POINT_1=JLO-1
I_POINT_2=JLO
I_POINT_3=JLO+1
ELSE
I_POINT_1=JLO
I_POINT_2=JLO+1
I_POINT_3=JLO+2
END IF
RETURN
END IF
JM=(JHI+JLO)/2
IF(X.GT.XX(JM).EQV.ASCND)THEN
JLO=JM
ELSE
JHI=JM
ENDIF
GO TO 3
END
C
C
SUBROUTINE INTERP_QUAD(X1,Y1,X2,Y2,X3,Y3,X4,Y4)
C
C INTERPOLATE BETWEEN POINTS Y1=F(X1) AND Y2=F(X2)
C TOP FIND Y4=F(X4) GIVEN X1,Y1,X2,Y2,X3,Y3 AND X4 AS INPUT
C PARAMETERS. THE FUNCTIONAL FORM USED IS Y = AX^2+BX+C
C
IMPLICIT REAL*8(A-H,O-Z)
C
TOP = (Y2-Y1)*(X3*X3-X2*X2)- (Y3-Y2)*(X2*X2-X1*X1)
BOTTOM = (X2-X1)*(X3*X3-X2*X2)- (X3-X2)*(X2*X2-X1*X1)
B = TOP/BOTTOM
A = ( (Y2-Y1)- B*(X2-X1) )/(X2*X2-X1*X1)
C = Y3 - A*X3*X3 - B*X3
Y4 = A*X4*X4 + B*X4 + C
C
RETURN
END
C***********************************************************************
C
SUBROUTINE MOLDAT(XCOORD,YCOORD,ZCOORD,ZNUMBE,GROUPN,NATOMSM,
1 NTYPES,OK)
C
C 8-dec-86 C.Brouder
C This subroutine builds the file containing the additional input
C required for MOLPOT once CLEM has been run.
C 15-dec-86 If program CONTINUUM is to be run with complex
C potential, set all alpha parametres to zero.
C If program MOLPOT is to be run with an outer sphere,
C write corresponding parametres.
C
C Arguments description :
C XCOORD,YCOORD,ZCOORD Array of the coordinates of the atoms
C ZNUMBE Array of the atomic numbers of the atoms
C GROUPN Array of the number of the group to which the
C atoms belong. (A group is a class of atoms equivalent
C by the symmetry operations of the symmetry group)
C NATOMSM Number of atoms
C NTYPES Number of groups (prototypical atoms)
C
C DATA description (Value of data is [value]) :
C NRUNS Number of cluster for which potential is computed [1]
C INV Logical unit from which output from CLEM is read [8]
C
C NOUT 0 No outer sphere, 1 an outer sphere [0]
C NWR1 Punched output to be punched [PCH]
C NWR2 Print charge densities, charge, potential [PRT]
C 1NSPINS 1 spin restricted potential, 2 spin polarized potential [1]
C EXAFCO Slater alpha parameter for exchange for the interstitial regi
C OVLF Overlap factor of neighbouring spheres [.10]
C CHPERC The charge radius of the atom, is defined as the radius
C for which the integrated density of charge is Z*(1+CHPER
C This is used to compute the muffin-tin radii [0.005]
C NCUT A control number intended to change the mesh size for high
C energy calculations [0] (= no change)
C
C NSYMBL 4 character description of the atom (Symbol + number)
C NEQ 0 for prototypical atoms
C NTYPE of the prototypical atom for atoms equivalent to N
C NGBR The number of neighbours surrounding the atom.
C NTYPE Type of the atom (Group number)
C XV,YV,ZV Coordinates in atomic units
C EXFACT Slater alpha parameter
C
C ALPHAP Alpha Parameter of elements, from Schwarz, (Phys.Rev.B 5(7)
C 2466 (1972)) up to Z=41 (Nb), some possible "interpolation"
C for the other elements.
C NAMEAT Name of atoms
C OUTER Logical. .TRUE. if MOLPOT is to be run with an outer sphere
C BOHRAD Bohr radius in Angstrom
C
C***********************************************************************
C
INCLUDE 'msxas3.inc'
C
COMMON/CONTINUUM/EMIN,EMAX,DELTA,CIP,GAMMA,EFTRI,IEXCPOT
C
REAL*8 EXAFCOM,EXFCTM,OVLFM,CHPERCM
C
COMMON/MOLINP/
1 EXAFCOM,EXFCTM(NAT_),OVLFM,CHPERCM,IITYPE,IIATOM,
1 NGBRM(NAT_),NTYPEM(NAT_),NATAN(NAT_,UA_),
1 NAM(NAT_,UA_),NAT1(NAT_,UA_),NWR1,NWR2
C
PARAMETER (NEIMAX=nat_)
REAL XCOORD(NATOMS),YCOORD(NATOMS),ZCOORD(NATOMS)
INTEGER ZNUMBE(NATOMS),ZNBRE,GROUPN(NATOMS)
INTEGER NEIGHB(NEIMAX),NUMNEI(NEIMAX)
LOGICAL OK,OUTER,PROTO,DEUX
CHARACTER*5 NWR1,NWR2
REAL ALPHAP(100)
DATA NRUNS/1/,INV/8/
DATA NOUT/0/,NSPINS/1/
DATA OVLF/0.0/,CHPERC/0.005/,NCUT/1/
C DATA BOHRAD/.529177/
DATA BOHRAD/1.0/
C H-Ne,Na-Ca,Sc-Zn,Ga-Zr,Nb-Sn,Sb-Nd,Pm-Yb
DATA ALPHAP/.978,.773,.781,.768,.765,.759,.752,.744,.737,.731,
1 .731,.729,.728,.727,.726,.725,.723,.722,.721,.720,
1 .718,.717,.716,.714,.713,.712,.710,.709,.707,.707,
1 .707,.707,.707,.706,.706,.706,.706,.705,.705,.704,
1 .704,.704,.704,.704,.704,.704,.704,.704,.704,.704,
1 .703,.703,.703,.703,.703,.703,.703,.703,.703,.703,
1 .702,.702,.702,.702,.702,.702,.702,.702,.702,.702,
1 30*.702/
NWR1=' PCH'
NWR2=' PRT'
C
C Check whether complex potential will be used
C
IF (IEXCPOT.EQ.4.OR.IEXCPOT.EQ.5) THEN
DO 100 I=1,100
ALPHAP(I)=0.
100 CONTINUE
END IF
C
C Ask whether an outer sphere is to be used.
C 13-APR-87 In this new version, the file is always generated with an o
C sphere.
C
OUTER=.TRUE.
C
C* * * * Open file and write header * * * * * * *
C
OPEN(UNIT=2,FILE='div/STRPARM.DAT',STATUS='UNKNOWN',
& FORM='FORMATTED')
C
C Write first line
C
WRITE(2,2000) NRUNS,INV
2000 FORMAT(2I5)
C
C Compute EXAFCO (EXAFCO is taken as the average of all alpha parametr
C and write second line.
C
C Correction for the presence of empty spheres: 27th Sept 2007
C
NPA = 0
EXAFCO=0.
DO 200 I=1,NATOMSM
NZAT = ZNUMBE(I)
IF(NZAT.NE.0) THEN
NPA = NPA + 1
EXAFCO=EXAFCO+ALPHAP(NZAT)
ENDIF
200 CONTINUE
EXAFCO=EXAFCO/NPA
IF (OUTER) THEN
IITYPE=NTYPES+1
IIATOM=NATOMSM+1
NOUT=1
ELSE
IITYPE=NTYPES
IIATOM=NATOMSM
NOUT=0
END IF
WRITE(2,2010) IITYPE,IIATOM,NOUT,NWR1,NWR2,NSPINS,EXAFCO,OVLF,
1 CHPERC,NCUT
2010 FORMAT(3I5,2A5,I5,3F10.5,I5)
C
EXAFCOM=DBLE(EXAFCO)
OVLFM=DBLE(OVLF)
CHPERCM=DBLE(CHPERC)
C
C* * * * * * Write outer sphere description if any * * * *
C
IF (OUTER) THEN
XV=0.
YV=0.
ZV=0.
ITYPE=0
CALL GRPNEI(ITYPE,XCOORD,YCOORD,ZCOORD,GROUPN,NATOMSM,
1 NGBR,NEIGHB,NUMNEI,OK)
IF (.NOT.OK) THEN
CLOSE(UNIT=2)
RETURN
END IF
EXFACT=EXAFCO
ZNBRE=0
PROTO=.TRUE.
N = 1
CALL WRIDAT(XV,YV,ZV,ITYPE,ZNBRE,NGBR,EXFACT,GROUPN,
1 NUMNEI,NEIGHB,NATOMSM,OUTER,PROTO,N)
END IF
C
C* * * * * * Write prototypical atom description * * * * *
C
DO 300 NTYPE=1,NTYPES
XV=XCOORD(NTYPE)/BOHRAD
YV=YCOORD(NTYPE)/BOHRAD
ZV=ZCOORD(NTYPE)/BOHRAD
C
C
CALL GRPNEI(NTYPE,XCOORD,YCOORD,ZCOORD,GROUPN,NATOMSM,
1 NGBR,NEIGHB,NUMNEI,OK)
IF (.NOT.OK) THEN
CLOSE(UNIT=2)
RETURN
END IF
ZNBRE=ZNUMBE(NTYPE)
C
C.......CHANGE FOR ES
C
IF(ZNBRE.EQ.0.D0) THEN
EXFACT=EXAFCO
ELSE
EXFACT=ALPHAP(ZNBRE)
ENDIF
PROTO=.TRUE.
N=NTYPE+1
CALL WRIDAT(XV,YV,ZV,NTYPE,ZNBRE,NGBR,EXFACT,GROUPN,
1 NUMNEI,NEIGHB,NATOMSM,OUTER,PROTO,N)
300 CONTINUE
C
C* * * * * Write non prototypical atom description * * * * * *
C
IF (NATOMSM.GT.NTYPES) THEN
DO 400 I=NTYPES+1,NATOMSM
XV=XCOORD(I)/BOHRAD
YV=YCOORD(I)/BOHRAD
ZV=ZCOORD(I)/BOHRAD
ZNBRE=ZNUMBE(I)
C
C.......CHANGE FOR ES
C
IF(ZNBRE.EQ.0.D0) THEN
EXFACT=EXAFCO
ELSE
EXFACT=ALPHAP(ZNBRE)
ENDIF
CALL GRPNEI(I,XCOORD,YCOORD,ZCOORD,GROUPN,NATOMSM,
1 NGBR,NEIGHB,NUMNEI,OK)
IF (.NOT.OK) THEN
C CLOSE(UNIT=2)
RETURN
END IF
PROTO=.FALSE.
N = I + 1
CALL WRIDAT(XV,YV,ZV,I,ZNBRE,NGBR,EXFACT,GROUPN,
1 NUMNEI,NEIGHB,NATOMSM,OUTER,PROTO,N)
400 CONTINUE
END IF
C CLOSE (UNIT=2)
C
C * * * * * * * Create MOLSYM.COO * * * * * * * *
C
C Now we create a file called MOLSYM.COO which lists the coordinates
C and the number of each atom in the cluster, according to the
C FORMAT required by MOLSYM. This file will be used later on to
C make the input file of MOLSYM. In this file, the atoms must be
C ordered according to their group (all equivalent atoms must follow
C each other), and numbered according to the way their are declared
C in the input of MOLPOT. If an outer sphere is to be used, it must
C be declared to be atom number 1.
C According to the FORMAT required by MOLSYM, the atoms must
C be written in pairs. The logical variable DEUX is here to say
C that two atoms are available and it is time to write them.
C
OPEN(UNIT=2,FILE='div/molsym.coo',STATUS='unknown')
C***************************************************
C***************************************************
DEUX=.TRUE.
C**** IF (OUTER) THEN
C**** XX1=0.
C**** YY1=0.
C** ZZ1=0.
C** NN1=1
C** DEUX=.FALSE.
C** END IF
C
X0 = XCOORD(1)
Y0 = YCOORD(1)
Z0 = ZCOORD(1)
C
DO 500 ITYPE=1,NTYPES
DO 500 I=1,NATOMSM
C
C Order atoms according to their groups
C
IF (GROUPN(I).EQ.ITYPE) THEN
IF (DEUX) THEN
XX1=XCOORD(I)/BOHRAD - X0
YY1=YCOORD(I)/BOHRAD - Y0
ZZ1=ZCOORD(I)/BOHRAD - Z0
C*** IF (OUTER) THEN
C*** NN1=I+1
C*** ELSE
NN1=I
C*** END IF
DEUX=.FALSE.
ELSE
XX2=XCOORD(I)/BOHRAD - X0
YY2=YCOORD(I)/BOHRAD - Y0
ZZ2=ZCOORD(I)/BOHRAD - Z0
C*** IF (OUTER) THEN
C*** NN2=I+1
C*** ELSE
NN2=I
C*** END IF
WRITE (2,3000) XX1,YY1,ZZ1,NN1,XX2,YY2,ZZ2,NN2
3000 FORMAT(2(3F10.6,I5,5X))
DEUX=.TRUE.
END IF
END IF
500 CONTINUE
C
C If the number of atoms written in the file (including possibly
C the outer sphere) is not even, there is an atom that is left
C to be written, so write it. In any case, close the file.
C
IF (.NOT.DEUX) THEN
WRITE (2,3010) XX1,YY1,ZZ1,NN1
3010 FORMAT(3F10.6,I5,5X)
END IF
CLOSE (UNIT=2)
RETURN
END
C
C***********************************************************************
C
SUBROUTINE GRPNEI(ITYPE,XCOORD,YCOORD,ZCOORD,GROUPN,NATOMSM,
1 NGBR,NEIGHB,NUMNEI,OK)
C
C 9-dec-86 C.Brouder
C This subroutine finds the groups of neighbours of atom number ITYPE
C A group of neighbours of atom ITYPE is a set of all atoms
C at the same distance from atom ITYPE and belonging to the same group
C (i.e. equivalent to the same prototypical atom, i.e.having the same
C group number GROUPN).
C At the end, the groups of neigbours are sorted according to increasi
C distances.
C
C Arguments description :
C ITYPE # of atom (0 if outer sphere) whose neighbours
C are to be determined.
C XCOORD,YCOORD,ZCOORD Array of the coordinates of the atoms.
C GROUPN Array of the number of the group to which the
C atoms belong. (A group is a class of atoms equivalent
C by the symmetry operations of the symmetry group).
C NATOMSM Number of atoms
C NGBR Number of groups of neighbours
C NEIGHB # of an atom in the group of neigbours
C NUMNEI Number of atoms in the group of neighbours
C NEIMAX Maximum number of groups of neighbours.
C
C DISTAN Array of distances of neigbours
C EPSILO If the distances are smaller than EPSILO, they are
C supposed to be identical.
C
C*********************************************************************
C
INCLUDE 'msxas3.inc'
C
PARAMETER (NEIMAX=nat_)
REAL XCOORD(NATOMS),YCOORD(NATOMS),ZCOORD(NATOMS)
REAL DISTAN(NEIMAX)
INTEGER GROUPN(NATOMS),NEIGHB(NEIMAX),NUMNEI(NEIMAX)
LOGICAL OK,NEW
DATA EPSILO/1.E-5/
NGBR=1
C
C Initialize arrays
C
DO 100 I=1,NATOMSM
NEIGHB(I)=0
NUMNEI(I)=0
100 CONTINUE
IF (ITYPE.EQ.0) THEN
X0=0.
Y0=0.
Z0=0.
ELSE
X0=XCOORD(ITYPE)
Y0=YCOORD(ITYPE)
Z0=ZCOORD(ITYPE)
END IF
C
C Scan all other atoms
C
DO 200 I=1,NATOMSM
IF (I.NE.ITYPE) THEN
C
C Compute distance
C
NEW=.TRUE.
DISTAN(NGBR)=(XCOORD(I)-X0)*(XCOORD(I)-X0)
DISTAN(NGBR)=DISTAN(NGBR)+(YCOORD(I)-Y0)*(YCOORD(I)-Y0)
DISTAN(NGBR)=DISTAN(NGBR)+(ZCOORD(I)-Z0)*(ZCOORD(I)-Z0)
DISTAN(NGBR)=SQRT(DISTAN(NGBR))
IF (NGBR.NE.1) THEN
C
C Check whether this distance already exists and the corresponding
C atom belongs to the same group.
C
DO 210 I2=1,NGBR-1
IF ((ABS(DISTAN(I2)-DISTAN(NGBR)).LT.EPSILO).AND.
1 (GROUPN(NEIGHB(I2)).EQ.GROUPN(I))) THEN
NEW=.FALSE.
NUMNEI(I2)=NUMNEI(I2)+1
END IF
210 CONTINUE
END IF
C
C If it does not, this is a new group
C
IF (NEW) THEN
NUMNEI(NGBR)=1
NEIGHB(NGBR)=I
NGBR=NGBR+1
IF (NGBR.GT.NEIMAX) THEN
PRINT 4000
4000 FORMAT(' Too many neighbours, increase NEIMAX in',
1 ' subroutines GRPNEI and MOLDAT')
OK=.FALSE.
RETURN
END IF
END IF
END IF
200 CONTINUE
NGBR=NGBR-1
C
C Order groups of neighbours according to increasing distances
C
DO 300 I=1,NGBR
C
C Look for the smallest remaining distance
C
DISMIN=1.E20
IDISMI=I
DO 310 J=I,NGBR
IF (DISTAN(J).LT.DISMIN) THEN
DISMIN=DISTAN(J)
IDISMI=J
END IF
310 CONTINUE
C
C Transpose values
C
IF (IDISMI.NE.I) THEN
N1TEMP=NEIGHB(I)
N2TEMP=NUMNEI(I)
DTEMPO=DISTAN(I)
NEIGHB(I)=NEIGHB(IDISMI)
NUMNEI(I)=NUMNEI(IDISMI)
DISTAN(I)=DISTAN(IDISMI)
NEIGHB(IDISMI)=N1TEMP
NUMNEI(IDISMI)=N2TEMP
DISTAN(IDISMI)=DTEMPO
END IF
300 CONTINUE
RETURN
END
C
C***********************************************************************
C
SUBROUTINE WRIDAT(XV,YV,ZV,ITYPE,ZNBRE,NGBR,EXFACT,GROUPN,
1 NUMNEI,NEIGHB,NATOMSM,OUTER,PROTO,N)
C
C This subroutine writes on file 2 the data collected by MOLDAT,
C for each atom. There are many cases to consider : the outer sphere
C (ITYPE=0), prototypical atoms (PROTO=.TRUE.), non prototypical atoms
C (PROTO=.FALSE.) and in the latter cases, the outputs are different
C if there is an outer sphere (OUTER=.TRUE.) or not.
C Variable description
C XV,YV,ZV Position
C ITYPE # of atom whose data are involved
C ZNBRE Z number of atom
C NGBR Number of neighbours
C EXFACT Alpha parametre
C GROUPN Group numbers
C NUMNEI Number of neighbours
C NEIGHB Example of neighbour
C NATOMSM Number of atoms
C OUTER .TRUE. if there is an outer sphere
C PROTO .TRUE. if this is a prototypical atom
C
C NSYMBL Symbol
C
C********************************************************************
C
INCLUDE 'msxas3.inc'
C
REAL*8 EXAFCOM,EXFCTM,OVLFM,CHPERCM
C
COMMON/MOLINP/
1 EXAFCOM,EXFCTM(NAT_),OVLFM,CHPERCM,IITYPE,IIATOM,
1 NGBRM(NAT_),NTYPEM(NAT_),NATAN(NAT_,UA_),
1 NA(NAT_,UA_),NAT1(NAT_,UA_),NWR1,NWR2
C
PARAMETER (NEIMAX=nat_)
INTEGER GROUPN(NATOMS),ZNBRE
INTEGER NEIGHB(NEIMAX),NUMNEI(NEIMAX)
LOGICAL PROTO,OUTER
CHARACTER*5 NWR1,NWR2
C
C* * * * * * Initialize data * * * * * * *
C
C
C NEQ (0 if prototypical atom, NTYPE of prototypical atom otherwise
C
IF (PROTO) THEN
NEQ=0
ELSE
IF (OUTER) THEN
NEQ=GROUPN(ITYPE)+1
ELSE
NEQ=GROUPN(ITYPE)
END IF
END IF
C
C NTYPE (if outer sphere, outer sphere is number 1, so add 1 to
C all group numbers)
C
IF (PROTO) THEN
IF (OUTER) THEN
NTYPE=ITYPE+1
ELSE
NTYPE=ITYPE
END IF
ELSE
NTYPE=NEQ
END IF
C
C* * * Initialize variables for subroutine molpot * * *
C
NGBRM(N)=NGBR
NTYPEM(N)=NTYPE
EXFCTM(N)=DBLE(EXFACT)
C
C* * * Initialize variables for subroutine molpot * * *
C
IF (PROTO) THEN
DO 300 K=1,NGBR
IF (OUTER) THEN
NATAN(K,N) = GROUPN(NEIGHB(K)) + 1
NAT1(K,N) = NEIGHB(K) + 1
ELSE
NATAN(K,N) = GROUPN(NEIGHB(K))
NAT1(K,N) = NEIGHB(K)
ENDIF
300 NA(K,N) = NUMNEI(K)
ENDIF
C
RETURN
END
C
C***********************************************************************
C
SUBROUTINE MOLPOT
C
C SPIN-RESTRICTED MOLECULAR POTENTIAL PROGRAM
C GENERATES SUPERPOSED-ATOM POTENTIAL USED TO START SCF CALCULATION
C
implicit real*8 (a-h,o-z)
include 'msxas3.inc'
c
include 'msxasc3.inc'
c
character*8 nsymbl
c..
c common/dimens/nats,ndat,nout,lmaxx,irreps
common/aparms/xv(natoms),yv(natoms),zv(natoms),z(natoms),
u nsymbl(natoms),nzeq(natoms),neq(natoms),ncores(natoms),
u lmaxat(natoms)
common/aparms_extra/rs_(natoms),redf_(natoms),ovlf
c
integer trans
common/transform/trans(natoms)
C
COMMON/MOLINP/
* EXFAC0,EXFACT(NAT_),OVLFM,CHPERC,NTYPES,NATOMSM,
* NGBR(NAT_),NTYPE(NAT_),NATAN(NAT_,UA_),
* NA(NAT_,UA_),NAT1(NAT_,UA_),NWR1,NWR2
C
COMMON/CRHOAT/ RO(441,UA_,1)
C
COMMON/MPARMS/ RADION,QION,NCUT,NOUT,MOUT,NSAT
C
COMMON/MTRAD/ RS(NAT_)
C
COMMON/STRUCT/NTNABS(NAT_),NGBRABS
C
DIMENSION R(441,UA_),V(441,1),RV(441,UA_),Q(441),ALPHA(441),
1 BETA(441),GAMMA(441,1),SNLO(441),XI(441),XJ(441),
2 ZPALPH(441),ROTOTL(441,1),ROT(441)
C
DIMENSION ZM(NAT_),NZM(NAT_),NIMAX(NAT_),AN(NAT_,NAT_),
* FAC2(NAT_),RSC(NAT_)
C
CHARACTER*5 NWR1,NWR2
C
c DATA PI/3.14159265358979/
c DATA PI4/12.56637061435916/,THIRD/.333333333333333/
C
LOGICAL SKIP
PI=3.14159265358979D0
PI4=12.56637061435916D0
THIRD=.333333333333333D0
NRUNS = 1
DO 999 IRUNS=1,NRUNS
1002 FORMAT(15I5)
SKIP=.FALSE.
C
C.....MOUT: CONTROLS THE OUTPUT OF PROGRAM INPOT. IF MOUT=1 THIS
C..... OUTPUT WILL CONTAIN THE OUTER SPHERE. IF MOUT=0 IT
C..... WILL NOT. THIS VERSION INITIALIZED TO MOUT=0
C.....0VLF: THIS IS THE OVERLAP FACTOR FOR THE MUFFIN-TIN RADII
C..... DEFAULT=0.1 IN SUBROUTINE MOLDAT
C.....CHPERC: THIS IS THE PERCENTAGE OF ATOMIC CHARGE INSIDE THE
C..... ATOMIC SPHERES WHEN APPLYING NORMAN CRITERIUM
C..... DEFAULT=0.005 IN SUBROUTINE MOLDAT
C
MOUT=0
NOUT=1
NSPINS=1
NSAT=1
NCUT=1
FAC1=NSPINS
NDAT=NATOMSM
OPEN (UNIT=7,FILE='div/molinpot3.out',STATUS='unknown')
DO 43 N=1,NATOMSM
C READ(5,1001) NSYMBL(N),NEQ(N),NGBR(N),NTYPE(N),XV(N),YV(N),ZV(N),
C 1 EXFACT(N)
1001 FORMAT(1X,A8,3I5,4F10.6)
WRITE(7,1001) NSYMBL(N),NEQ(N),NGBR(N),NTYPE(N),XV(N),YV(N),ZV(N),
1 EXFACT(N)
FAC2(N)=6.D0*EXFACT(N)*(FAC1*3.D0/(32.D0*PI*PI))**THIRD
IF(NEQ(N).NE.0) GO TO 443
NGBRS=NGBR(N)
C READ(5,1002) (NATAN(I,N),NA(I,N),NAT1(I,N),I=1,NGBRS)
C NATAN=TYPE OF NEIGHBOR NA=NUMBER OF ATOMS IN GROUP NAT1=LABEL OF
C ONE OF THE NEIGHBORS
C
WRITE(7,1002) (NATAN(I,N),NA(I,N),NAT1(I,N),I=1,NGBRS)
IF(SKIP) GO TO 4511
GO TO 43
4511 WRITE(7,1045)
1045 FORMAT(' DIFFERENT ATOMS MUST COME FIRST')
SKIP=.FALSE.
GO TO 43
443 IF(SKIP) GO TO 43
SKIP=.TRUE.
NDAT=N-1
43 CONTINUE
C
C AN(I,N): DISTANCE OF PROTOTYPICAL ATOM N FROM NEIGHBORS OF TYPE I
C
WRITE(7,*)
WRITE(7,*) 'DIST. OF PROTOTYPICAL ATOM N FROM NEIGHBORS OF TYPE I'
ANMAX = 0.0D0
DO 44 N=1,NDAT
ANPR=0.0D0
NGBRS=NGBR(N)
IF(N.EQ.2) NGBRABS=NGBRS
DO 44 I=1,NGBRS
NT = NATAN(I,N)
IF(N.EQ.2) NTNABS(I)=NT-1
C write(6,*) i,nt,ntnabs(i),ngbrabs
NB=NAT1(I,N)
AN(I,N)=DSQRT((XV(NB)-XV(N))**2+(YV(NB)-YV(N))**2+(ZV(NB)-ZV(N))**
1 2)
WRITE(7,*) N, NT, AN(I,N)
IF(I.EQ.1) THEN
ANPR=AN(I,N)
GO TO 440
ENDIF
IF(AN(I,N).LT.ANPR) THEN
WRITE(7,30) I,N
30 FORMAT(' **WARNING** : NEIGHBOR OF TYPE',I3,' TO ATOM',I3,
* ' NOT ARRANGED IN ASCENDING ORDER OF DISTANCE')
C
C CALL EXIT
C
ENDIF
440 IF(N.NE.1) GO TO 44
IF(AN(I,N).GT.ANMAX) ANMAX = AN(I,N)
44 CONTINUE
SKIP=NOUT.NE.0
WRITE(7,104) NATOMSM,NDAT,FAC1
104 FORMAT(30X,I3,7H ATOMS,,I3,17H DIFFERENT, FAC1=,F11.7)
WRITE(7,105) (NSYMBL(N),NEQ(N),XV(N),YV(N),ZV(N),EXFACT(N),N=1,
1 NATOMSM)
105 FORMAT(//28X,6HSYMBOL,4X,2HEQ,5X,1HX,11X,1HY,11X,1HZ,7X,6HEXFACT
1 /(30X,A5,I6,4F11.7))
DO 1 N=1,NTYPES
IF(SKIP) GO TO 89
WRITE(7,2002) NZEQ(N),NSAT
2002 FORMAT(6I4)
KMAX=441
ZM(N)=NZEQ(N)
NZM(N)=NZEQ(N)
TZ=2.D0*ZM(N)
GO TO 90
89 DELTAR=.88534138D0*.0025D0
NZM(1)=1
GO TO 91
90 IF(ZM(N).EQ.0.D0) THEN
DELTAR=.88534138D0*.0025D0
ELSE
DELTAR=.88534138D0*.0025D0/ZM(N)**THIRD
ENDIF
91 I=1
R(1,N)=0.D0
DO 87 J=1,11
DO 88 K=1,40
I=I+1
88 R(I,N)=R(I-1,N)+DELTAR
87 DELTAR=2.0D0*DELTAR
IF(SKIP) GO TO 49
DO 52 K=1,441
52 ROT(K)=RO(K,N,1)
CALL MINTEGR(ROT,XI,R(1,N),441)
Q(1)=0.D0
DO 10 I=2,441
10 Q(I)=ROT(I)/R(I,N)
CALL MINTEGR(Q,XJ,R(1,N),441)
C
C RV=R*( COULOMB POTENTIAL )
C
DO 12 I=1,441
12 RV(I,N)=-TZ+2.D0*(XI(I)+R(I,N)*(XJ(441)-XJ(I)))
IF(NSPINS.EQ.1.AND.ZM(N).NE.0)
1 WRITE(7,101) N,(I,R(I,N),RV(I,N),ROT(I),XI(I),I=1,KMAX)
101 FORMAT(1H1,40X,22HATOMIC DATA FOR CENTER,I3,4X,/,
& 2(9X,1HR,15X,2HRV,
1 14X,3HRHO,11X,6HCHARGE,3X),/,2(I4,1P4E15.6))
GO TO 1
49 DO 50 J=1,441
50 RV(J,N)=0.D0
1 SKIP=.FALSE.
IF(NWR1.NE.' PCH') GO TO 1041
OPEN (UNIT=4,FORM='UNFORMATTED',STATUS='unknown')
REWIND(4)
WRITE(4) NATOMSM,NDAT,NOUT,EXFAC0,NSPINS
KC=2
1041 DO 1000 M=1,NDAT
N=NTYPE(M)
NZM(M)=NZM(N)
NIMAX(M)=441
IF(M.EQ.1.AND.NOUT.NE.0) GO TO 450
DO 1043 J=1,441
IF(R(J,N).LT.AN(1,M)) GO TO 1043
NIMAX(M)=J
GO TO 450
1043 CONTINUE
450 NBRS=NGBR(M)
IMAX=NIMAX(M)
DO 600 I=1,441
ZPALPH(I)=0.D0
BETA(I)=0.D0
DO 600 ISPIN=1,NSPINS
ROTOTL(I,ISPIN)=0.D0
600 GAMMA(I,ISPIN)=0.D0
DO 45 I=1,NBRS
MVAL=NATAN(I,M)
IF(NOUT.NE.0.AND.MVAL.EQ.1) GO TO 45
C
C ITH SET OF NEIGHBORS TO CENTER M
C N IS TYPE OF CENTER M
C MVAL IS THE TYPE OF ITH SET OF NEIGHBORS TO CENTER M
C
IF(AN(I,M).GT..00001D0) GO TO 650
C
C FOR A CENTER COINCIDING WITH THE MOLECULAR CENTER
C AVERAGE VALUES ARE EQUAL TO THE VALUES AT THE POINT
C
DO 652 J=2,IMAX
CALL MINTERP(R(J,N),RV(1,MVAL),XVAL,R(1,MVAL))
ZPALPH(J)=ZPALPH(J)+NA(I,M)*XVAL
BETA(J)=BETA(J)-0.5D0*XVAL*NA(I,M)*R(J,N)**2
DO 652 ISPIN=1,NSPINS
CALL MINTERP(R(J,N),RO(1,MVAL,ISPIN),XVAL,R(1,MVAL))
ROTOTL(J,ISPIN)=ROTOTL(J,ISPIN)+NA(I,M)*XVAL/R(J,N)
652 GAMMA(J,ISPIN)=GAMMA(J,ISPIN)-0.5D0*XVAL*NA(I,M)*R(J,N)
DO 451 ISPIN=1,NSPINS
CALL MINTEGR(RO(1,MVAL,ISPIN),SNLO,R(1,MVAL),441)
DO 451 J=1,441
CALL MINTERP(R(J,N),SNLO,XVAL,R(1,MVAL))
XJ(J)=R(J,MVAL)*RV(J,MVAL)
451 GAMMA(J,ISPIN)=GAMMA(J,ISPIN)+NA(I,M)*XVAL
CALL MINTEGR(XJ,SNLO,R(1,MVAL),441)
DO 452 J=1,441
CALL MINTERP(R(J,N),SNLO,XVAL,R(1,MVAL))
452 BETA(J)=BETA(J)+NA(I,M)*XVAL
GO TO 45
C
C FOR SEPARATED CENTERS CALCULATE SPHERICAL AVERAGES AROUND CENTER M
C
650 CALL MINTEGR(RV(1,MVAL),SNLO,R(1,MVAL),441)
CALL ALPHA0(AN(I,M),SNLO,ALPHA,R,IMAX,N,MVAL)
DO 65 J=2,IMAX
65 ZPALPH(J)=NA(I,M)*ALPHA(J)+ZPALPH(J)
Q(1)=0.D0
C
C SPHERICAL AVERAGE CHARGE DENSITY
C
DO 95 ISPIN=1,NSPINS
DO 901 J=2,441
901 Q(J)=RO(J,MVAL,ISPIN)/R(J,MVAL)
CALL MINTEGR(Q,SNLO,R(1,MVAL),441)
CALL ALPHA0(AN(I,M),SNLO,ALPHA,R,IMAX,N,MVAL)
DO 95 J=2,IMAX
95 ROTOTL(J,ISPIN)=ROTOTL(J,ISPIN)+NA(I,M)*ALPHA(J)
IF(N.NE.1.OR.NOUT.EQ.0) GO TO 45
XJ(1)=0.D0
C
C TOTAL CHARGE FOR OUTER SPHERE
C
DO 37 ISPIN=1,NSPINS
DO 36 J=2,441
36 XJ(J)=-RO(J,MVAL,ISPIN)*(R(J,MVAL)-AN(I,M))**2/R(J,MVAL)
CALL MINTEGR(XJ,SNLO,R(1,MVAL),441)
CALL ALPHA0(AN(I,M),SNLO,Q,R,441,N,MVAL)
CALL MINTEGR(RO(1,MVAL,ISPIN),XJ,R(1,MVAL),441)
DO 37 J=2,441
CALL MINTERP(R(J,N)-AN(I,M),XJ,XVAL,R(1,MVAL))
37 GAMMA(J,ISPIN)=GAMMA(J,ISPIN)+NA(I,M)*(XVAL+0.5D0*Q(J))
C
C INTEGRATED POTENTIAL FOR OUTER SPHERE
C
XI(1)=0.D0
XJ(1)=-RV(1,MVAL)*AN(I,M)**2
DO 46 J=2,441
XI(J)=RV(J,MVAL)*R(J,MVAL)
46 XJ(J)=-RV(J,MVAL)*(R(J,MVAL)-AN(I,M))**2
CALL MINTEGR(XI,Q,R(1,MVAL),441)
CALL MINTEGR(XJ,SNLO,R(1,MVAL),441)
CALL ALPHA0(AN(I,M),SNLO,ALPHA,R,441,N,MVAL)
DO 47 J=2,441
CALL MINTERP(R(J,N)-AN(I,M),Q,XVAL,R(1,MVAL))
47 BETA(J)=BETA(J)+NA(I,M)*(XVAL+0.5D0*ALPHA(J))
45 CONTINUE
IF(N.NE.1.OR.NOUT.EQ.0) GO TO 2003
DO 2005 J=1,IMAX
BETA(J)=(BETA(J)+0.5D0*ZPALPH(J)*R(J,N)**2)*PI4
DO 2005 ISPIN=1,NSPINS
ROTOTL(J,ISPIN)=ROTOTL(J,ISPIN)*R(J,N)
2005 GAMMA(J,ISPIN)=GAMMA(J,ISPIN)+0.5D0*ROTOTL(J,ISPIN)*R(J,N)
GO TO 112
C
C INTEGRATED POTENTIAL AND TOTAL CHARGE FOR MUFFIN-TIN SPHERE
C GAMMA(I,ISPIN) IS TOTAL INTEGRATED CHARGE, BETA(I) IS INTEGRATED
C POTENTIAL, ZPALPH(I) IS R*VCOULOMB CALCULATED WITH PROJECTED
C DENSITY
C
2003 DO 2001 J=1,IMAX
ZPALPH(J)=ZPALPH(J)+RV(J,N)
Q(J)=PI4*R(J,N)*ZPALPH(J)
DO 2001 ISPIN=1,NSPINS
2001 ROTOTL(J,ISPIN)=ROTOTL(J,ISPIN)*R(J,N)+RO(J,N,ISPIN)
DO 2004 ISPIN=1,NSPINS
2004 CALL MINTEGR(ROTOTL(1,ISPIN),GAMMA(1,ISPIN),R(1,N),IMAX)
CALL MINTEGR(Q,BETA,R(1,N),IMAX)
112 DO 111 ISPIN=1,NSPINS
V(1,ISPIN)=0
DO 111 J=2,IMAX
C
C VC(J) = ZPALPH(J)/R(J,N)
C
111 V(J,ISPIN)=(ZPALPH(J)-FAC2(M)*(R(J,N)*DABS(ROTOTL(J,ISPIN)))**THIR
1D)/R(J,N)
C
C...FIND RADIUS CONTAINING THE ATOMIC NUMBER OF ELECTRONS WITHIN CHPERC
C
RSC(M) = AN(1,M)/2.D0
IF(M.EQ.1.AND.NOUT.EQ.1) GO TO 14
IF(NZM(M).EQ.0) GO TO 14
DO 13 I=1,IMAX
C IF(M.EQ.1.AND.NOUT.EQ.1) GO TO 13
CHPCI=(ZM(M)-GAMMA(I,1))/ZM(M)
IF(CHPCI.GT.CHPERC)GO TO 13
RSC(M) = R(I,M)
GO TO 14
13 CONTINUE
14 IF(NWR2.NE.' PRT') GO TO 1032
WRITE(7,6)M
6 FORMAT(1H1,35X,11HATOM NUMBER,I6)
WRITE(7,7) (NA(I,M),NATAN(I,M),AN(I,M),I=1,NBRS)
7 FORMAT(/ 23H NO. OF CENTERS TYPE,7X,8HDISTANCE/(5X,I4,10X,I
1 4,F17.8))
IF(NSPINS.EQ.1) WRITE(7,9)(J,R(J,N),ZPALPH(J),BETA(J),GAMMA(J,1),V
1 (J,1),ROTOTL(J,1),J=1,IMAX)
9 FORMAT(16X,1HR,16X,6HZPALPH,5X,20HINTEGRATED POTENTIAL,7X,12HTOTAL
1 CHARGE,13X,1HV,18X,3HRHO/(I4,6E20.8))
1032 IF(NWR1.NE.' PCH') GO TO 1000
NIMAX(M)=NIMAX(M)-1
WRITE(4) NSYMBL(M),NEQ(M),NZM(M),NIMAX(M),XV(M),YV(M),
1 ZV(M),EXFACT(M),KC
KC=KC+1
DO 1014 ISPIN=1,NSPINS
DO 1014 K=2,IMAX,5
KCARD=MIN0(IMAX,K+4)
WRITE(4) KC,( V(I,ISPIN),I=K,KCARD)
1014 KC=KC+1
C DO 1020 K=2,IMAX,5
C KCARD=MIN0(IMAX,K+4)
C WRITE(4,1015) KC,( VC(I),I=K,KCARD)
C 1020 KC=KC+1
DO 2214 ISPIN=1,NSPINS
DO 2214 K=2,IMAX,5
KCARD=MIN0(IMAX,K+4)
WRITE(4) KC,(ROTOTL(I,ISPIN) ,I=K,KCARD)
2214 KC=KC+1
DO 1016 K=2,IMAX,5
KCARD=MIN0(IMAX,K+4)
WRITE(4) KC,(BETA(I),I=K,KCARD)
1016 KC=KC+1
DO 1019 ISPIN=1,NSPINS
DO 1019 K=2,IMAX,5
KCARD=MIN0(IMAX,K+4)
WRITE(4) KC,(GAMMA(I,ISPIN) ,I=K,KCARD)
1019 KC=KC+1
1000 CONTINUE
C
WRITE(7,*) 'CHECKING MUFFIN-TIN RADII'
IF(OPTRSH.EQ.'y') THEN
WRITE(6,*) ' MT radii for Hydrogen atoms set to rsh'
WRITE(7,*) ' MT radii for Hydrogen atoms set to rsh =', RSH
ELSE
WRITE(6,*) ' MT radii for Hydrogen atoms determined by stdcrm',
& ' unless other options are specified'
WRITE(7,*) ' MT radii for Hydrogen atoms determined by stdcrm',
& ' unless other options are specified'
ENDIF
WRITE(7,*) ' M, Z(M), MN, Z(MN), AN(MN,M),',
& ' RSC(M), RSC(MN), RS(M), RS(MN)'
C
C FIND MUFFIN-TIN RADIUS FOR PAIR IJ ACCORDING TO NORMAN CRITERIUM (STDCRM)
C
DO 18 M=1,NDAT
IF(M.EQ.1.AND.NOUT.EQ.1) GO TO 18
NBRS=NGBR(M)
IF(NZM(M).NE.0) THEN
DO NG = 1, NBRS
MN=NATAN(NG,M)
IF(NZM(MN).NE.0) GO TO 191
ENDDO
191 RS(M)=AN(NG,M)*(1.D0+OVLF)/(1.D0+RSC(MN)/RSC(M))
C
C IF OPTRSH='y' MT RADIUS FOR H ATOMs SET TO RSH IN INPUT ! Added 16 Jul 2013
C
IF(NZM(M).EQ.1.AND.OPTRSH.EQ.'y') THEN
WRITE(6,*) ' MT radius', RS(M),' for H atom', M,
& ' set to', RSH
RS(M) = RSH
ENDIF
WRITE(7,190) M, NZM(M), MN, NZM(MN), AN(NG,M),
& RSC(M), RSC(MN), RS(M), RS(MN)
GO TO 18
ENDIF
MN = NATAN(1,M)
IF (NZM(MN).EQ.0.D0) THEN
RS(M) = AN(1,M)*(1.D0+OVLF)/2.D0
ELSE
RS(M) = (AN(1,M)-RS(MN))*(1.D0+OVLF)
ENDIF
WRITE(7,190) M, NZM(M), MN, NZM(MN), AN(1,M),
& RSC(M), RSC(MN), RS(M), RS(MN)
190 FORMAT(4I5, 5F10.5)
IF(NORMAN.EQ.'stdfac'.OR.NORMAN.EQ.'scaled')
*RS(M)=REDF_(M)*RSC(M)
18 CONTINUE
IF(NOUT.EQ.1) RS(1) = ANMAX + RS(NDAT)
IF(NDAT.EQ.NATOMSM) GO TO 5001
NDAT1=NDAT+1
DO 221 M=NDAT1,NATOMSM
NZM(M)= NZM(NEQ(M))
RS(M)= RS(NEQ(M))
NIMAX(M)=0
WRITE(4) NSYMBL(M),NEQ(M),NZM(M),NIMAX(M),XV(M),YV(M),
1 ZV(M),EXFACT(M),KC
221 KC=KC+1
5001 CONTINUE
IF (NORMAN.EQ.'extrad') THEN
RS(1) = ANMAX + RS_(NDAT)
DO 5002 M=2,NATOMSM
5002 RS(M)=RS_(M)
END IF
IF (NORMAN.NE.'extrad') THEN
WRITE(6,*)
WRITE(6,5003)
5003 FORMAT(1X,65('-'))
WRITE(6,*) ' i rs(i) i=1,natoms '
WRITE(6,5004) (I, RS(I), I=1,NATOMSM)
WRITE(6,*) ' N.B.: Order of atoms as reshuffled by',
* ' symmetry routines '
5004 FORMAT(8(I5,1X,F7.2))
WRITE(6,5003)
WRITE(6,*)
END IF
IF(NWR1.NE.' PCH') GO TO 999
WRITE(7,*)
WRITE(7,*) ' Radion, qion, ncut, rs(i), i=1,nat'
WRITE(7,19) RADION,QION,NCUT,(RS(M),M=1,NATOMSM)
19 FORMAT(/,1X,2F10.5,I5/(8F10.5),//)
999 CONTINUE
C
REWIND(4)
C
RETURN
END
C
CLAGRNG
SUBROUTINE LAGRNG(F,LPLACE,B,RES)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION F(4),B(4)
RES=0.D0
DO 5 N=1,4
M=LPLACE-2+N
5 RES=RES+B(N)*F(M)
RETURN
END
CBSET
SUBROUTINE BSET(PINTRP,B)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION B(4)
PM=PINTRP*(PINTRP**2-1.D0)*(PINTRP-2.D0)
B(1)=-PM/(6.D0*(PINTRP+1.D0))
B(2)= PM/(2.D0*PINTRP)
B(3)=-PM/(2.D0*(PINTRP-1.D0))
B(4)= PM/(6.D0*(PINTRP-2.D0))
RETURN
END
CINTERP
C L.F. MATTHEISS SUBROUTINE INTERP(B,X1,M2,D,R)
C B IS THE RADIAL DISTANCE
C X1 IS THE INTEGRATED FUNCTION
C D IS THE INTERPOLATED VALUE OF THE INTEGRAL FROM 0 TO B.
C R IS THE RADIAL MESH
C
SUBROUTINE MINTERP(B,X1,D,R)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION X1(441),R(441),B1(4),C(4)
IF(B-R(2 ))10,11,12
10 D=0.0D0
GOTO 100
11 D=X1(2)
GOTO 100
12 IF(B-R(440 ))15,14,13
13 D=X1(441)
GOTO 100
14 D=X1(440)
GOTO 100
15 DO 22 I=1,441
L=441+1-I
IF(R(L)-B) 23,24,22
22 CONTINUE
23 LPLACE=L
DO 29 N=1,11
ISCALE=41+40*(N-1)-LPLACE
IF(ISCALE)25,46,25
25 IF(ISCALE-1)29,48,29
29 CONTINUE
B1(1)=X1(LPLACE-1)
B1(2)=X1(LPLACE)
B1(3)=X1(LPLACE+1)
B1(4)=X1(LPLACE+2)
H=R(LPLACE+1 )-R(LPLACE )
50 PINTRP=(B-R(LPLACE ))/H
51 CALL BSET(PINTRP,C)
CALL LAGRNG(B1,2,C,D)
100 RETURN
24 D=X1(L)
RETURN
46 B1(1)=X1(LPLACE-2)
B1(2)=X1(LPLACE)
B1(3)=X1(LPLACE+1)
B1(4)=X1(LPLACE+2)
H=R(LPLACE+1 )-R(LPLACE )
GOTO 50
48 B1(1)=X1(LPLACE-3)
B1(2)=X1(LPLACE-1)
B1(3)=X1(LPLACE+1)
B1(4)=X1(LPLACE+2)
H=R(LPLACE+2 )-R(LPLACE+1 )
PINTRP=(B-R(LPLACE-1 ))/H
GO TO 51
END
CINTEGR
C SIMPSON'S RULE INTEGRATION
C
SUBROUTINE MINTEGR(X,Y,R,M2)
IMPLICIT REAL*8(A-H,O-Z)
DIMENSION X(441),Y(441),R(441)
H=R(2)
Y(1)=0.D0
Y(2)=H*(5.D0*X(1 )+8.D0*X(2 )-X(3 ))/12.D0
DO 20 J=1,11
DO 10 K=1,40
I=40*(J-1)+K
IF(I.GT.M2) RETURN
IF(I-440) 5,10,10
5 Y(I+2)=Y(I)+H*(X(I )+4.D0*X(I+1 )+X(I+2 ))/3.D0
10 CONTINUE
H=H+H
IF (I-440) 15,20,15
15 Y(I+2)=Y(I+1)+H*(5.D0*X(I+1 )+8.D0*X(I+2 )-X(I+3 ))/12.D0
20 CONTINUE
RETURN
END
CALPHAO
C L.F. MATTHEISS SUBROUTINE ALPHA0(AP,ZINT,ALPHA,R,IMAX,M1,M2)
C AP IS THE DISTANCE OF THE NEIGHBORING ATOM
C ZINT IS THE INDEFINITE INTEGRAL
C ALPHA IS A TABLE OF THE DESIRED ALPHA FUNCTIONS
C R IS THE RADIAL DISTANCE
C IMAX IS THE NUMBER OF ALPHA FUNCTIONS TO BE COMPUTED
C M1 IS THE ATOM NO. AT THE ORIGIN
C M2 IS THE ATOM NO. AT AP
C
SUBROUTINE ALPHA0(AP,ZINT,ALPHA,R,IMAX,M1,M2)
C
IMPLICIT REAL*8(A-H,O-Z)
C
include 'msxas3.inc'
C
DIMENSION ZINT(441),ALPHA(441),R(441,UA_)
DO 100 I=2,IMAX
APLUSR=AP+R(I,M1)
AMINSR=DABS(AP-R(I,M1))
CALL MINTERP(APLUSR,ZINT,XVAL1,R(1,M2))
CALL MINTERP(AMINSR,ZINT,XVAL2,R(1,M2))
ALPHA(I)=(XVAL1-XVAL2)/(2.0D0*AP)
100 CONTINUE
RETURN
END
C
SUBROUTINE INPOT
C
IMPLICIT REAL*8 (A-H,O-Z)
C
INCLUDE 'msxas3.inc'
C
character*2 potgen
character*4 coor
character*5 potype
character*7 ionzst
character*2 edge,charelx
character*6 norman
integer absorber,hole
logical*4 vinput
common/options/rsh,ovlpfac,vc0,rs0,vinput,absorber,hole,mode,
& ionzst,potype,norman,coor,charelx,edge,potgen
C
C**** CONT_SUB DIMENSIONING VARIABLES
C
INTEGER AT_,D_,RD_,SD_
PARAMETER ( AT_=NAT_-1,D_=UA_-1,RD_=440,SD_=UA_-1)
C
C****
C
COMMON/MPARMS/ RADION,QION,NCUT,NOUT,MOUT,NSAT
C
COMMON/MTRAD/ RS(NAT_)
C
DIMENSION XV(NAT_),YV(NAT_),ZV(NAT_),Z(NAT_),NEQ1(NAT_),
1EXFACT(NAT_),NZ(NAT_),NSYMBL(NAT_),NEQ(NAT_),H(NAT_),
2VCONS(2),R(441,UA_),V(441,UA_),ICHG(10,UA_),KPLACE(NAT_),
3KMAX(NAT_),VINT(UA_),CHARGE(UA_,2),ROCON(2),RHO(441,UA_)
C 4,VC(441,UA_)
C
DIMENSION RTEMP(440),VTEMP(441,2),GAMMA(440,2),DENSTEMP(441,2)
EQUIVALENCE (VTEMP(1,1),BETA(1)),(ROTEMP(1,1),GAMMA(1,1))
DIMENSION BETA(440),ROTEMP(440,2)
C DIMENSION VCTEMP(441)
C
C
CC**** CONT_SUB COMMON BLOCKS
C
COMMON /DENS/ IRHO2,RHOTOT2(RD_,SD_),RHOINT2(2),
$ vcoul(rd_,sd_),vcoulint(2)
REAL*4 RHOTOT2,RHOINT2,vcoul,vcoulint
C
COMMON /FCNR/KXE2, H2(D_),VCONS2(2),R2(RD_,D_),V2(2,RD_,SD_),
$ ICHG2(10,D_),KPLACE2(AT_),KMAX2(AT_)
REAL*4 H2,R2,V2
COMPLEX VCONS2
C
COMMON /FLAG/ INMSH,INV,INRHO,INSYM,IOVRHO,IOSYM,
1 IMVHL,NEDHLP
C
CHARACTER*8 NAME0 ,NSYMBL2
C
REAL*4 EFTR2,GAMMA2,E2,RS2,XV2,YV2,ZV2
REAL*4 EXFACT2,Z2,CIP,EMAX,EMIN,DE
COMPLEX VCON2,XE2,EV2
COMMON/PARAM/EFTR2,GAMMA2,VCON2,XE2,EV2,E2,IOUT2,NAT2,
1 NDAT2,NSPINS2,NAS2,RS2(AT_),XV2(AT_),YV2(AT_),ZV2(AT_),
2 EXFACT2(AT_),Z2(AT_),LMAXX2(AT_),NZ2(AT_),NSYMBL2(AT_),
4 NEQ2(AT_),NAME0,CIP,EMAX,EMIN,DE
C
C ############MODIFIED TO INCLUDE THE TWO CORE STATE WAVE FUNCTIONS
c ############FOR THE AUGER CALCULATION
c
common/pot_type/i_absorber,i_absorber_hole,
1 i_absorber_hole1,i_absorber_hole2,
2 i_norman,i_alpha,i_outer_sphere,
3 i_exc_pot,i_mode
C
C*****
C
C
CHARACTER*8 NSYMBL
C
DATA PI/3.14159265358979D0/,THIRD/.333333333333333D0/
C
C FORMAT FOR ALL FUNCTIONS OF RADIAL MESH POINTS
C FORMAT FOR ERROR MESSAGE IF INPUT CARD IS OUT OF ORDER
C
400 FORMAT(' CARD',I5,' OUT OF SEQUENCE')
LOGICAL OUTER
READ(4) NAT,NDAT,NOUT,EXFAC0,NSPINS
C READ(10,8853)RADION,QION,NCUT,MOUT
IF(NCUT.EQ.0) NCUT=2
C READ(10,8854)(RS(I),I=1,NAT)
IF (NAT.EQ.0) STOP 4602
FAC1=NSPINS
IF(NOUT.EQ.0) WRITE(7,110) NAT
ROCON(2)=0
ROCON(1)=0
VCON=0.0D0
IN = 0
C
C IN=1 SECTION. INPUT DATA FROM MOLECULAR POTENTIAL PROGRAM
C
IF (IN.GT.1) GO TO 4300
NC0=1
113 FORMAT(1H1,30X,18HNUMBER OF CENTERS=,I5,26H OUTER SPHERE AT CENTE
*R 1 )
110 FORMAT(1H1,30X,18HNUMBER OF CENTERS=,I5,17H NO OUTER SPHERE)
IF(NOUT.NE.0) WRITE(7,113)NAT
WRITE(7,8852)NCUT,RADION,QION
8852 FORMAT(30X,'NCUT=',I3,' RADION=',F7.3,' QION=', F7.1)
VOLUME=0.0D0
DO 422 N=1,NAT
OUTER=NOUT.NE.0.AND.N.EQ.1
READ(4) NSYMBL(N),NEQ(N),NZ(N),KMAX(N),XV(N),YV(N),
U ZV(N),EXFACT(N),NC
IF(NC.EQ.NC0+1) GO TO 423
WRITE(7,400) NC
423 NC0=NC
Z(N)=NZ(N)
IF(NEQ(N).NE.0) GO TO 439
KMAXN=KMAX(N)
KMAXL=KMAXN
C
C CALCULATE RADIAL MESH FOR INPUT DATA
C
ZINO=Z(N)
IF(NZ(N) .EQ. 0) ZINO=1.D0
HH=.0025D0*.88534138D0/ZINO**THIRD
RTEMP(1)=HH
KK=1
K0=2
DO 4285 I=1,11
DO 4286 K=K0,40
KK=KK+1
IF(KK.GT.KMAXN) GO TO 1014
4286 RTEMP(KK)=RTEMP(KK-1)+HH
K0=1
4285 HH=2.0D0*HH
1014 DO 1020 ISPIN=1,NSPINS
C
C READ STARTING POTENTIAL
C
DO 1019 K=1,KMAXN,5
KCARD=MIN0(K+4,KMAXN)
READ(4) NC,( VTEMP(I,ISPIN),I=K,KCARD)
IF(NC.EQ.NC0+1) GO TO 1019
WRITE(7,400) NC
1019 NC0=NC
1020 CONTINUE
C DO 1200 K=1,KMAXN,5
C KCARD=MIN0(K+4,KMAXN)
C READ(4,1015) NC,( VCTEMP(I),I=K,KCARD)
C IF(NC.EQ.NC0+1) GO TO 1200
C WRITE(7,400) NC
C ERROR=.TRUE.
C 1200 NC0=NC
DO 2720 ISPIN=1,NSPINS
C
C READ STARTING CH[AARGE DENSITY
C
DO 2723 K=1,KMAXN,5
KCARD=MIN0(K+4,KMAXN)
READ(4) NC,(DENSTEMP(I,ISPIN),I=K,KCARD)
IF(NC.EQ.NC0+1) GO TO 2723
WRITE(7,400) NC
2723 NC0=NC
2720 CONTINUE
C
C CONVERT INPUT DATA TO FORM FOR MOLECULAR CALCULATION
C
KMIN=1
428 KPL=(KMAXN+KMIN)/2
IF(RTEMP(KPL)-RS(N)) 424,434,426
424 KMIN=KPL
IF(KMAXN-KMIN-1) 427,427,428
426 KMAXN=KPL
IF(KMAXN-KMIN-1) 427,427,428
427 KPL=KMIN
434 KPL0=KPL
N40=40/NCUT
KPL=KPL/NCUT
IF(RTEMP(KPL*NCUT+NCUT)+RTEMP(KPL*NCUT)-2.D0*RS(N)) 429,430,430
429 KPL=KPL+1
430 IF(OUTER) GO TO 433
KMAX(N)=KPL+3
KMAXN=KMAX(N)
NMOD=MOD(KMAXN,N40)
IF(NMOD.GE.5.OR.NMOD.EQ.0) GO TO 431
KMAXN=KMAXN-NMOD
431 ICHGN=KMAXN
DO 432 K=1,KMAXN
KN=NCUT*K
R(K,N)=RTEMP(KN)
NS=N
DO 4320 IS=1,NSPINS
V(K,NS)=VTEMP(KN,IS)
C VC(K,NS)=VCTEMP(KN)
RHO(K,NS)=DENSTEMP(KN,IS)
4320 NS=NS+NDAT
432 CONTINUE
IF(KMAXN.EQ.KMAX(N)) GO TO 441
KX1=KMAXN+1
KMAXN=KMAX(N)+1
IF(NCUT.EQ.1) GO TO 435
DO 436 K=KX1,KMAXN
KN=(KX1+K-1)*NCUT/2
R(K,N)=RTEMP(KN)
NS=N
DO 4360 IS=1,NSPINS
V(K,NS)=VTEMP(KN,IS)
C VC(K,NS)=VCTEMP(KN)
RHO(K,NS)=DENSTEMP(KN,IS)
4360 NS=NS+NDAT
436 CONTINUE
GO TO 440
435 DO 437 K=KX1,KMAXN
KN=(KX1+K-1)/2
IF(2*((K-KX1+1)/2).EQ.(K-KX1+1)) GO TO 438
R(K,N)=.5D0*(RTEMP(KN)+RTEMP(KN+1))
NS=N
DO 4310 IS=1,NSPINS
CALL DINTERP(RTEMP(KN-3),VTEMP(KN-3 ,IS),7,R(K,N),V(K,NS),DUMMY,
1 .FALSE.)
C CALL DINTERP(RTEMP(KN-3),VCTEMP(KN-3 ),7,R(K,N),VC(K,NS),DUMMY,
C 1 .FALSE.)
CALL DINTERP(RTEMP(KN-3),DENSTEMP(KN-3 ,IS),7,R(K,N),
1 RHO(K,NS),DUMMY,.FALSE.)
4310 NS=NS+NDAT
GO TO 437
438 R(K,N)=RTEMP(KN)
NS=N
DO 4311 IS=1,NSPINS
V(K,NS)=VTEMP(KN,IS)
C VC(K,NS)=VCTEMP(KN)
RHO(K,NS)=DENSTEMP(KN,IS)
4311 NS=NS+NDAT
437 CONTINUE
440 IF( ABS(R(KPL,N)-RS(N)).LE. ABS(R(KPL+1,N)-RS(N))) GO TO 441
KPL=KPL+1
KMAX(N)=KMAX(N)+1
441 KPLACE(N)=KPL
ICHG(1,N)=N40
DO 443 K=2,10
ICHG(K,N)=ICHG(K-1,N)+N40
IF(ICHG(K,N).GE.ICHGN) ICHG(K,N)=400/NCUT
443 CONTINUE
GO TO 448
C
C.....FOR OUTER REGION
C
433 KMIN=(KPL-3)*NCUT
KMAX(N)=MIN0((440/NCUT-KPL+4),200)
ICHG(1,N)=(40-MOD(KMIN,40))/NCUT+1
ICHGN=1
IF(ICHG(1,N).GT.4) GO TO 444
ICHGN=ICHG(1,N)-1
DO 445 K=1,ICHGN
KN=KMIN+NCUT*(2*K-ICHG(1,N)-1)
R(K,N)=RTEMP(KN)
NS=N
DO 445 IS=1,NSPINS
V(K,NS)=VTEMP(KN,IS)
C VC(K,NS)=VCTEMP(KN)
RHO(K,NS)=DENSTEMP(KN,IS)
445 NS=NS+NDAT
ICHG(1,N)=ICHG(1,N)+N40
ICHGN=ICHGN+1
444 KMAXN=KMAX(N)
DO 446 K=ICHGN,KMAXN
KN=KMIN+(K-1)*NCUT
R(K,N)=RTEMP(KN)
NS=N
DO 446 IS=1,NSPINS
V(K,NS)=VTEMP(KN,IS)
C VC(K,NS)=VCTEMP(KN)
RHO(K,NS)=DENSTEMP(KN,IS)
446 NS=NS+NDAT
DO 447 K=2,10
447 ICHG(K,N)=ICHG(K-1,N)+N40
KPLACE(N)=4
C
C.....FOR ATOMIC SPHERES
C
448 NQ=N
K=KPL0
IF(RTEMP(K+1)+RTEMP(K)-2.D0*RS(N).LT.0.0D0 ) K=KPL0+1
C
C READ INTEGRATED POTENTIAL AND INTERPOLATE FOR VALUE ON BOUNDARY
C
DO 1016 KK=1,KMAXL,5
KCARD=MIN0(KK+4,KMAXL)
READ(4) NC,(BETA(I),I=KK,KCARD)
IF(NC.EQ.NC0+1) GO TO 1016
WRITE(7,400) NC
1016 NC0=NC
CALL DINTERP(RTEMP(K-3), BETA(K-3),7,RS(N), VINT(N),DUMMY,.FALSE.)
C
C READ TOTAL CHARGE AND INTERPOLATE FOR VALUE ON BOUNDARY
C
DO 1022 ISPIN=1,NSPINS
DO 1021 KK=1,KMAXL,5
KCARD=MIN0(KK+4,KMAXL)
READ(4) NC, (GAMMA(I,ISPIN),I=KK,KCARD)
IF(NC.EQ.NC0+1) GO TO 1021
WRITE(7,400) NC
1021 NC0=NC
1022 CALL DINTERP(RTEMP(K-3),GAMMA(K-3,ISPIN),7,RS(N),CHARGE(N,ISPIN),
1 DUMMY,.FALSE.)
GO TO 4281
C
C.....FOR EQUIVALENT ATOMS
C
439 NQ=NEQ(N)
KPLACE(N)=KPLACE(NQ)
4281 IF(OUTER) GO TO 4280
VOLUME=VOLUME-RS(N)**3
VCON=VCON-VINT(NQ)
DO 455 IS=1,NSPINS
455 ROCON(IS)=ROCON(IS)-CHARGE(NQ,IS)
IF(NEQ(N).NE.0) GO TO 422
GO TO 4221
4280 VCON=VCON+VINT(NQ)
VOLUME=VOLUME+RS(N)**3
DO 456 IS=1,NSPINS
456 ROCON(IS)=ROCON(IS)+CHARGE(NQ,IS)
4221 H(N)=R(2,N)-R(1,N)
422 CONTINUE
VOLUME=1.3333333333333D0*PI*VOLUME
VCON=VCON/VOLUME
VCONC=VCON
IF (RADION.NE.0) THEN
DVSPH = -2.D0*QION/RADION
VCONC = VCONC + DVSPH
ENDIF
NS=1
RH0 = 3.D0 / (NSPINS*4.D0*PI*RS0**3)
c write (*,*) ' vc0 =', vc0, ' rs0 =',rs0
DO 453 IS=1,NSPINS
ROCON(IS)=ROCON(IS)/VOLUME
VCONS(IS)=VCON-6*EXFAC0*(3*FAC1*ROCON(IS)/(8*PI))**THIRD
VC0X = VC0 - 6*EXFAC0*(3*FAC1*RH0/(8*PI))**THIRD
IF(RADION.EQ.0) GO TO 453
VCONS(IS)=VCONS(IS)+DVSPH
KX=KMAX(1)
DO 451 K=1,KX
IF(R(K,1).LT.RADION) GO TO 452
V(K,NS)=V(K,NS)-2.D0*QION/R(K,1)
C VC(K,NS)=VC(K,NS)-2.*QION/R(K,1)
GO TO 451
452 V(K,NS)=V(K,NS)+DVSPH
C VC(K,NS)=VC(K,NS)+DVSPH
451 CONTINUE
NS=NS+1
DO 454 N=2,NDAT
KX=KMAX(N)
DO 450 K=1,KX
C VC(K,NS)=VC(K,NS)+DVSPH
450 V(K,NS)=V(K,NS)+DVSPH
454 NS=NS+1
453 CONTINUE
GO TO 4220
4300 WRITE(7,105)
105 FORMAT(' IN IS EQUAL 2')
C
C OUTPUT AND CHECK FOR CONSISTENCY OF INPUT DATA
C
4220 WRITE(7,111)
111 FORMAT(30X,10HATOM NO.,12X,8HPOSITION,14X,13HRADIUS EQ )
WRITE(7,112) (I,NSYMBL(I),NZ(I),XV(I),YV(I),ZV(I),RS(I),NEQ(I),
1 I=1,NAT)
112 FORMAT(26X,I3,A6,I6,4F10.4,I6)
C IF(NOUT.NE.0.AND.NOUT.NE.1) GO TO 205
C GO TO 1130
C 205 WRITE(7,200) I,J
C ERROR=.TRUE.
DO 211 I=1,NAT
IF(RS(I).LT.0.0D0) GO TO 213
IF(NEQ(I).EQ.0)GO TO 210
IF(NEQ(I).GE.I) GO TO 213
210 I1=I+1
IF(NOUT.EQ.0) GO TO 212
IF(NEQ(I).EQ.1) GO TO 213
212 IF(I1.GT.NAT) GO TO 216
GO TO 2135
213 CONTINUE
C WRITE(6,200) I,J
2135 DO 211 J=I1,NAT
RIJ = SQRT((XV(J)-XV(I))**2+(YV(J)-YV(I))**2+(ZV(J)-ZV(I))**2)
IF(NOUT.EQ.1.AND.I.EQ.1) GO TO 214
RSUM = RS(I)+RS(J)
IF (RSUM.GT.RIJ) GO TO 215
GO TO 211
214 RSUM = RIJ+RS(J)
IF (RSUM.GT.RS(1)) GO TO 215
GO TO 211
215 CONTINUE
C WRITE (6,200) I,J,RSUM,RIJ,RDIF
211 CONTINUE
216 IF(RADION.EQ.0.0D0) GO TO 217
IF(RADION.EQ.RS(1)) GO TO 217
KX=KMAX(1)
DO 219 K=1,KX
IF(RADION.GT.R(K,1)) GO TO 219
219 CONTINUE
217 CONTINUE
NDUMMY = 0
C
C SHIFT BACK ORIGIN TO PHOTOABSORBER
C
X0=XV(2)
Y0=YV(2)
Z0=ZV(2)
C
DO 150 N=1,NAT
XV(N)=XV(N)-X0
YV(N)=YV(N)-Y0
ZV(N)=ZV(N)-Z0
NEQ1(N)=0
IF(NEQ(N).NE.0) NEQ1(N)=NEQ(N)-1
150 CONTINUE
C
C WRITE OUT POTENTIAL AND DENSITY FILES
C
IF (potype.EQ.'xalph') THEN
OPEN (19, FILE = 'div/XALPHA.POT', STATUS = 'unknown')
ELSE
OPEN (20, FILE = 'div/COUL.POT', STATUS = 'unknown')
OPEN (9, FILE = 'div/RHO.DENS', STATUS = 'unknown')
ENDIF
C
INV = 20
IF (potype.EQ.'xalph') INV = 19
INRHO= 9
NST=2
NC=2
DO 4401 N=NST,NAT
WRITE(INV,311) NSYMBL(N),NEQ1(N),NZ(N),NDUMMY,KMAX(N),KPLACE(N),
1 XV(N),YV(N),ZV(N),RS(N),EXFACT(N),NC
311 FORMAT(A5,3I2,2I4,5F11.6,T76,I5)
NC=NC+1
IF(NEQ(N).NE.0) GO TO 4401
WRITE(INV,308) (ICHG(I,N),I= 1,10),NC
308 FORMAT(10I5,T76,I5)
NC=NC+1
WRITE(INV,319) NC,(R(I,N),I=1,5)
319 FORMAT(T76,I5,T2,1P5E14.7)
NS=N
NC=NC+1
KX=KMAX(N)
NS = N
DO 142 ISPIN=1,NSPINS
DO 141 K=1,KX,5
KCARD=MIN0(KX,K+4)
WRITE(INV,319) NC,(V(I,NS),I=K,KCARD)
141 NC=NC+1
142 NS=NS+NDAT
NS=N
IF (potype.NE.'xalph') THEN
DO 555 ISPIN=1,NSPINS
DO 551 K=1,KX,5
KCARD=MIN0(KX,K+4)
WRITE(INRHO,319) NC,(RHO(I,NS),I=K,KCARD)
551 NC=NC+1
555 NS=NS+NDAT
ENDIF
4401 CONTINUE
C
IF(INV.EQ.19) WRITE( INV,319) NC,(VCONS(IS),IS=1,NSPINS)
C
IF (INV.EQ.20) THEN
WRITE(INV,319) NC, VCONC
WRITE( INRHO,319) NC,(ROCON(IS),IS=1,NSPINS)
ENDIF
C
c CLOSE (4)
IF(potype.EQ.'xalph') THEN
CLOSE (UNIT=19)
ELSE
CLOSE (UNIT=20)
CLOSE (UNIT=9)
ENDIF
C
C CLOSE (UNIT=7)
C
C-----------------------------------------------------------------------
C
C PASS POTENTIAL AND/OR CHARGE DENSITY TO CONT_SUB.
C
C990 IF(IOUT_ASCII.NE.2) GO TO 999
C
C-----------------------------------------------------------------------
NAT2=NAT-NOUT
NDAT2=NDAT-NOUT
NSPINS2=NSPINS
c
c A.Kuzmin 10.06.93
c Correction of the atomic coordinates due to the outer
c sphere non central position
c
xv0=0.D0
yv0=0.D0
zv0=0.D0
c if(nout.eq.1)then
c xv0=xv(1)
c yv0=yv(1)
c zv0=zv(1)
c endif
c
c End of correction
c
DO 780 I=1,NAT2
C
C SKIP OUTER SPHERE
C
J=I+NOUT
NSYMBL2(I)=NSYMBL(J)
NZ2(I)=NZ(J)
IF(NEQ(J).EQ.0)THEN
NEQ2(I)=0
ELSE
NEQ2(I)=NEQ(J)-NOUT
END IF
XV2(I)=SNGL(XV(J)-xv0)
YV2(I)=SNGL(YV(J)-yv0)
ZV2(I)=SNGL(ZV(J)-zv0)
Z2(I)=SNGL(Z(J))
RS2(I)=SNGL(RS(J))
EXFACT2(I)=SNGL(EXFACT(J))
KMAX2(I)=KMAX(J)
KPLACE2(I)=KPLACE(J)
IF(NEQ(J).NE.0)GOTO 780
DO 735 K=1,10
ICHG2(K,I)=ICHG(K,J)
735 CONTINUE
H2(I)=SNGL(R(2,J)-R(1,J))
ISDA=I
JSDA=J
DO 745 IS=1,NSPINS
DO 740 K=1,KMAX(J)
IF(IS.EQ.1)R2(K,ISDA)=SNGL(R(K,JSDA))
RHOTOT2(K,ISDA)=SNGL(RHO(K,JSDA))
V2(1,K,ISDA)=SNGL(V(K,JSDA))
V2(2,K,ISDA)=0.0
740 CONTINUE
ISDA=ISDA+NDAT2
JSDA=JSDA+NDAT
745 CONTINUE
780 CONTINUE
C
RHKM1 = DBLE(RHOTOT2(KMAX2(1),1))/
1 (4.D0*PI*DBLE(R2(KMAX2(1),1))**2)
RHKM2 = DBLE(RHOTOT2(KMAX2(2),2))/
1 (4.D0*PI*DBLE(R2(KMAX2(2),2))**2)
RHKM = ( RHKM1 + RHKM2 ) / 2.D0
RSKM = (3.D0 / ( 4.D0 * PI * RHKM * NSPINS ) ) ** THIRD
VCKM = DBLE((V2(1,KMAX2(1),1)+V2(1,KMAX2(2),2)))/2.D0
WRITE(*,*) ' input value for coulomb interst. potential =',
1 real(vc0)
WRITE(*,*) ' and interstitial rs =', real(rs0)
WRITE(*,*) ' lower bound for coulomb interst. potential =',
1 real(vckm)
WRITE(*,*) ' and for interst. rs =',real(rskm)
DO 790 M=1,NSPINS
IF (VINPUT) THEN
VCONS2(M) = CMPLX(VC0X)
RHOINT2(M) = REAL(RH0)
ELSE
VCONS2(M)=CMPLX(SNGL(VCONS(M)))
RHOINT2(M)=SNGL(ROCON(M))
ENDIF
790 CONTINUE
C
C
C BRANCH POINT
C
RETURN
END
C
SUBROUTINE DINTERP(R,P,N,RS,PS,DPS,DERIV)
IMPLICIT REAL*8 (A-H,O-Z)
LOGICAL DERIV,NODRIV
DIMENSION R(N),P(N)
NODRIV=.NOT.DERIV
DPS=0.0D0
PS=0.0D0
DO 1 J=1,N
TERM=1.0D0
DENOM=1.0D0
DTERM=0.0D0
DO 2 I=1,N
IF(I.EQ.J) GO TO 2
DENOM=DENOM*(R(J)-R(I))
TERM=TERM*(RS-R(I))
IF(NODRIV) GO TO 2
DTERM1=1.0D0
DO 3 K=1,N
IF(K.EQ.J.OR.K.EQ.I) GO TO 3
DTERM1=DTERM1*(RS-R(K))
3 CONTINUE
DTERM=DTERM+DTERM1
2 CONTINUE
IF(NODRIV) GO TO 1
DPS=DPS+DTERM*P(J)/DENOM
1 PS=PS+TERM*P(J)/DENOM
RETURN
END
c-----------------------------------------------------------------------
C
SUBROUTINE CSBF(X0,Y0,MAX,SBF,DSBF)
IMPLICIT REAL*8(A-H,O-Z)
REAL*8 XF1
COMPLEX*8 X0,Y0
COMPLEX*16 X,Y,RAT,DSBF1,Z,SBFJ,B,A
COMPLEX*16 SBFK,SBF1,SBF2
COMPLEX*16 SBF,DSBF
INTEGER MAX,K,JMIN,KMAX
DIMENSION SBF(MAX), DSBF(MAX)
C
C
C GENERATES SPHERICAL BESSEL FUNCTIONS OF ORDER 0 - MAX-1 AND THEIR
C FIRST DERIVATIVES WITH RESPECT TO R. X=ARGUMENT= Y*R.
C IF Y=0, NO DERIVATIVES ARE CALCULATED. MAX MUST BE AT LEAST 3.
C OSBF GENERATES ORDINARY SPHERICAL BESSEL FUNCTIONS. MSBF - MODI-
C FIED SPHERICAL BESSEL FUNCTIONS; OSNF - ORD. SPH. NEUMANN FCNS;
C MSNF - MOD. SPH. NEUMANN FCNS; MSHF - MOD. SPH HANKEL FCNS
C
C
C
X=DCMPLX(X0)
Y=DCMPLX(Y0)
IF (MAX.LT.1.OR.MAX.GT.2000) GO TO 99
IF(ABS(X).LT.0.50D0 ) GO TO 18
C
C BESSEL FUNCTIONS BY DOWNWARD RECURSION
C
SBF2=(0.0D0,0.0D0)
SBF1=1.0D-25*(0.5D0,0.5D0)
IF(ABS(X).LT.2.0D0) SBF1=1.0D-38*(0.5D0,0.5D0)
JMIN=10+INT(ABS(X))
KMAX=MAX+JMIN-1
K=MAX
XF1=2*KMAX+1
DO 10 J=1,KMAX
SBFK=XF1*SBF1/X-SBF2
SBF2=SBF1
SBF1=SBFK
XF1=XF1-2.0D0
IF (J.LT.JMIN) GO TO 10
SBF(K)=SBFK
K=K-1
10 CONTINUE
RAT=SIN(X)/(X*SBF(1))
DO 17 K=1,MAX
17 SBF(K)=RAT*SBF(K)
DSBF1=-SBF(2)
GO TO 26
C
C SMALL ARGUMENTS
C
18 Z=-(X*X*0.50D0)
A=(1.0D0,0.0D0)
MMX=MAX
IF (MAX.EQ.1.AND.Y.NE.(0.0D0,0.0D0)) MMX=2
DO 30 J=1,MMX
SBFJ=A
B=A
DO 31 I=1,20
B=B*Z/(I*(2*(J+I)-1))
SBFJ=SBFJ+B
IF (ABS(B).LE.1.0D-07*ABS(SBFJ)) GO TO 29
31 CONTINUE
29 IF (J.EQ.2) DSBF1=-SBFJ
IF (J.LE.MAX) SBF(J)=SBFJ
30 A=A*X/DCMPLX(FLOAT(2*J+1))
C
C
26 IF (Y.EQ.(0.0D0,0.0D0)) RETURN
DSBF(1)=Y*DSBF1
IF (MAX.EQ.1) RETURN
DO 9 I=2,MAX
9 DSBF(I)=Y*(SBF(I-1)- DCMPLX(FLOAT(I))*SBF(I)/X)
RETURN
99 WRITE(6,100) MAX
100 FORMAT (' SPHERICAL BESSEL FUNCTION ROUTINE - MAX=',I8)
STOP
END
C
c
subroutine cshf2(x0,y0,max,sbf,dsbf)
implicit real*8(a-h,o-z)
real*8 xf1
complex*8 x0,y0
complex*16 x,y,rat,z,sbfj,b,a
complex*16 sbfk,sbf1,sbf2,cplu
complex*16 sbf,dsbf
integer max,k,jmin,kmax
dimension sbf(max), dsbf(max)
c
c cshf2 - May 1992
c generates spherical hankel functions of type 2 of order 0 - max-1.
c max must be at least 3. cshf2 is calculated as csbf - i*csnf, wher
c csbf(csnf) are spherical Bessel(Neuman) functions. csbf(csnf) are
c calculated using downward(upward) recurrence realations.
c ***** This subroutine returns i*cshf2 = csnf + i*csbf and its
c derivative if y0 ne. 0. In this case dsbf = i*y0*(cshf")'***
c
c
cplu = (0.d0,1.d0)
c
x=dcmplx(x0)
y=dcmplx(y0)
if (max.lt.1.or.max.gt.2000) go to 99
if(abs(x).lt.0.50D0 ) go to 18
c
c bessel functions sbf by downward recursion
c
sbf2=(0.0D0,0.0D0)
sbf1=1.0D-25*(0.5D0,0.5D0)
if(abs(x).lt.2.0D0) sbf1=1.0d-38*(0.5D0,0.5D0)
jmin=10+int(abs(x))
kmax=max+jmin-1
k=max
xf1=2*kmax+1
do 10 j=1,kmax
sbfk=xf1*sbf1/x-sbf2
sbf2=sbf1
sbf1=sbfk
xf1=xf1-2.0d0
if (j.lt.jmin) go to 10
sbf(k)=sbfk
k=k-1
10 continue
rat=sin(x)/(x*sbf(1))
do 17 k=1,max
17 sbf(k)=rat*sbf(k)
go to 2
c
c sbf for small arguments
c
18 z=-(x*x*0.50D0)
a=(1.0D0,0.0D0)
mmx=max
if (max.eq.1.and.y.ne.(0.0D0,0.0D0)) mmx=2
do 30 j=1,mmx
sbfj=a
b=a
do 31 i=1,20
b=b*z/(i*(2*(j+i)-1))
sbfj=sbfj+b
if (abs(b).le.1.0d-07*abs(sbfj)) go to 29
31 continue
29 if (j.le.max) sbf(j)=sbfj
30 a=a*x/ dcmplx(float(2*j+1))
c
c spherical neumann functions snf by upward recursion
c damped in dsbf
c
2 sbf2=-cos(x)/x
sbf1=(sbf2-sin(x))/x
dsbf(1)=sbf2
if (max.eq.1) go to 26
dsbf(2)=sbf1
if (max.eq.2) go to 26
xf1=3.0d0
do 22 i=3,max
sbfk=xf1*sbf1/x-sbf2
dsbf(i)=sbfk
sbf2=sbf1
sbf1=sbfk
22 xf1=xf1+2.0d0
c
c hankel functions as sbf + i*snf
c
do 3 i=1,max
3 sbf(i) = cplu*sbf(i) + dsbf(i)
26 if (y.eq.(0.0D0,0.0D0)) return
c
c calculate derivative of shf
c
dsbf(1) = -y*sbf(2)
if (max.eq.1) return
do 9 i=2,max
9 dsbf(i)=y*(sbf(i-1)- dcmplx(float(i))*sbf(i)/x)
return
99 write(6,100) max
100 format (' spherical bessel function routine - max=',i8)
stop
end
c
SUBROUTINE DEFINT(F,R,KMAX,ICHG,A,ID)
DIMENSION F(KMAX),R(KMAX),ICHG(10)
COMPLEX F,A,F0
C
DATA S720,S251,S646,S264 /720.,251.,646.,264./
C
DATA S106,S19,S346,S456,S74,S11/106.0,19.0,346.0,456.0,74.0,11.0/
C
H=R(2)-R(1)
A0=0.0
K0=0
IF (ID.NE.1) GO TO 11
F0=(0.0,0.0)
GO TO 12
11 F0=5.0*F(1)-10.0*F(2)+10.0*F(3)-5.0*F(4)+F(5)
12 KX=KMAX
N=1
A=A0+H*(S251*F0+S646*F(K0+1)-S264*F(K0+2)+S106*F(K0+3)-S19*
1 F(K0+4))/S720
A=A+H*(-S19*F0+S346*F(K0+1)+S456*F(K0+2)-S74*F(K0+3)+S11*
1 F(K0+4))/S720
A=A+H*(S11*F0-S74*F(K0+1)+S456*F(K0+2)+S346*F(K0+3)-S19*
1 F(K0+4))/S720
K0=K0+4
DO 50 K=K0,KX
KICH=K-ICHG(N)
IF (KICH.EQ.1) GO TO 30
IF (KICH.EQ.2) GO TO 40
A=A+H*( 9.0*F(K)+19.0*F(K-1)- 5.0*F(K-2)+ F(K-3))/24.0
GO TO 50
30 H=H+H
A=A+H*( 2.0*F(K)+ 7.0*F(K-1)- 4.0*F(K-2)+ F(K-3))/ 6.0
GO TO 50
40 N=N+1
A=A+H*(11.0*F(K)+25.0*F(K-1)-10.0*F(K-2)+4.0*F(K-3))/30.0
50 CONTINUE
RETURN
END
C
C
C
SUBROUTINE defint0(F,DX,KMAX,A,ID)
COMPLEX F, A, A0, F0
DIMENSION F(KMAX)
C
DATA S720,S251,S646,S264 /720.,251.,646.,264./
C
DATA S106,S19,S346,S456,S74,S11/106.0,19.0,346.0,456.0,74.0,11.0/
C
H=DX
A0=0.0
K0=0
IF (ID.NE.1) GO TO 11
F0=(0.0,0.0)
GO TO 12
11 F0=5.0*F(1)-10.0*F(2)+10.0*F(3)-5.0*F(4)+F(5)
c 11 F0 = F(1)
c K0 = 1
c write(6,*) 'defint', f0
12 KX=KMAX
N=1
A=A0+H*(S251*F0+S646*F(K0+1)-S264*F(K0+2)+S106*F(K0+3)-S19*
1 F(K0+4))/S720
A=A+H*(-S19*F0+S346*F(K0+1)+S456*F(K0+2)-S74*F(K0+3)+S11*
1 F(K0+4))/S720
A=A+H*(S11*F0-S74*F(K0+1)+S456*F(K0+2)+S346*F(K0+3)-S19*
1 F(K0+4))/S720
K0=K0+4
DO 50 K=K0,KX
A=A+H*( 9.0*F(K)+19.0*F(K-1)- 5.0*F(K-2)+ F(K-3))/24.0
50 CONTINUE
RETURN
C
END
C
C
SUBROUTINE defint1(F,DX,KMAX,A,ID)
COMPLEX F, A, A0, F0
DIMENSION F(KMAX)
C
DATA S720,S251,S646,S264 /720.,251.,646.,264./
C
DATA S106,S19,S346,S456,S74,S11/106.0,19.0,346.0,456.0,74.0,11.0/
C
H=DX
A0=0.0
K0=0
IF (ID.NE.1) GO TO 11
F0=(0.0,0.0)
GO TO 12
c 11 F0=5.0*F(1)-10.0*F(2)+10.0*F(3)-5.0*F(4)+F(5)
11 F0 = F(1)
K0 = 1
12 KX=KMAX
N=1
A=A0+H*(S251*F0+S646*F(K0+1)-S264*F(K0+2)+S106*F(K0+3)-S19*
1 F(K0+4))/S720
A=A+H*(-S19*F0+S346*F(K0+1)+S456*F(K0+2)-S74*F(K0+3)+S11*
1 F(K0+4))/S720
A=A+H*(S11*F0-S74*F(K0+1)+S456*F(K0+2)+S346*F(K0+3)-S19*
1 F(K0+4))/S720
K0=K0+4
DO 50 K=K0,KX
A=A+H*( 9.0*F(K)+19.0*F(K-1)- 5.0*F(K-2)+ F(K-3))/24.0
50 CONTINUE
RETURN
C
END
C
C
SUBROUTINE INTEGR(F,R,KMAX,ICHG,A,ID)
DIMENSION F(KMAX),R(KMAX),ICHG(10),A(KMAX)
C
DATA S720,S251,S646,S264 /720.,251.,646.,264./
C
DATA S106,S19,S346,S456,S74,S11/106.0,19.0,346.0,456.0,74.0,11.0/
C
H=R(2)-R(1)
A0=0.0
IF (ID.NE.1) GO TO 11
K0=0
F0=0.0
GO TO 12
11 K0=1
A(1)=0.0
F0=F(1)
12 KX=KMAX
N=1
A(K0+1)=A0+H*(S251*F0+S646*F(K0+1)-S264*F(K0+2)+S106*F(K0+3)-S19*F
1 (K0+4))/S720
A(K0+2)=A(K0+1)+H*(-S19*F0+S346*F(K0+1)+S456*F(K0+2)-S74*F(K0+3)+S
1 11*F(K0+4))/S720
A(K0+3)=A(K0+2)+H*(S11*F0-S74*F(K0+1)+S456*F(K0+2)+S346*F(K0+3)-S1
1 9*F(K0+4))/S720
K0=K0+4
DO 50 K=K0,KX
KICH=K-ICHG(N)
IF (KICH.EQ.1) GO TO 30
IF (KICH.EQ.2) GO TO 40
A(K)=A(K-1)+H*( 9.0*F(K)+19.0*F(K-1)- 5.0*F(K-2)+ F(K-3))/24.0
GO TO 50
30 H=H+H
A(K)=A(K-1)+H*( 2.0*F(K)+ 7.0*F(K-1)- 4.0*F(K-2)+ F(K-3))/ 6.0
GO TO 50
40 N=N+1
A(K)=A(K-1)+H*(11.0*F(K)+25.0*F(K-1)-10.0*F(K-2)+4.0*F(K-3))/30.0
50 CONTINUE
IF (MOD(ID,2).NE.0) RETURN
DO 150 K=1,KMAX
150 A(K)=A(KMAX)-A(K)
RETURN
C #
END
C
SUBROUTINE CINTEGR(F,R,KMAX,ICHG,A,ID)
COMPLEX F,A,F0
DIMENSION F(KMAX),R(KMAX),ICHG(10),A(KMAX)
C
DATA S720,S251,S646,S264 /720.,251.,646.,264./
C
DATA S106,S19,S346,S456,S74,S11/106.0,19.0,346.0,456.0,74.0,11.0/
C
H=R(2)-R(1)
A0=0.0
IF (ID.NE.1) GO TO 11
K0=0
F0=(0.0,0.0)
GO TO 12
11 K0=1
A(1)=(0.0,0.0)
F0=F(1)
12 KX=KMAX
N=1
A(K0+1)=A0+H*(S251*F0+S646*F(K0+1)-S264*F(K0+2)+S106*F(K0+3)-S19*F
1 (K0+4))/S720
A(K0+2)=A(K0+1)+H*(-S19*F0+S346*F(K0+1)+S456*F(K0+2)-S74*F(K0+3)+S
1 11*F(K0+4))/S720
A(K0+3)=A(K0+2)+H*(S11*F0-S74*F(K0+1)+S456*F(K0+2)+S346*F(K0+3)-S1
1 9*F(K0+4))/S720
K0=K0+4
DO 50 K=K0,KX
KICH=K-ICHG(N)
IF (KICH.EQ.1) GO TO 30
IF (KICH.EQ.2) GO TO 40
A(K)=A(K-1)+H*( 9.0*F(K)+19.0*F(K-1)- 5.0*F(K-2)+ F(K-3))/24.0
GO TO 50
30 H=H+H
A(K)=A(K-1)+H*( 2.0*F(K)+ 7.0*F(K-1)- 4.0*F(K-2)+ F(K-3))/ 6.0
GO TO 50
40 N=N+1
A(K)=A(K-1)+H*(11.0*F(K)+25.0*F(K-1)-10.0*F(K-2)+4.0*F(K-3))/30.0
50 CONTINUE
IF (MOD(ID,2).NE.0) RETURN
DO 150 K=1,KMAX
150 A(K)=A(KMAX)-A(K)
RETURN
C #
END
C
C
SUBROUTINE INTEGRCM(F,DX,KMAX,A,ID)
COMPLEX F,A,F0
DIMENSION F(KMAX),A(KMAX)
C
DATA S720,S251,S646,S264 /720.,251.,646.,264./
C
DATA S106,S19,S346,S456,S74,S11/106.0,19.0,346.0,456.0,74.0,11.0/
C
H=DX
A0=0.0
IF (ID.NE.1) GO TO 11
K0=0
F0=(0.0,0.0)
GO TO 12
11 K0=1
A(1)=(0.0,0.0)
F0=F(1)
12 KX=KMAX
A(K0+1)=A0+H*(S251*F0+S646*F(K0+1)-S264*F(K0+2)+S106*F(K0+3)-S19*F
1 (K0+4))/S720
A(K0+2)=A(K0+1)+H*(-S19*F0+S346*F(K0+1)+S456*F(K0+2)-S74*F(K0+3)+S
1 11*F(K0+4))/S720
A(K0+3)=A(K0+2)+H*(S11*F0-S74*F(K0+1)+S456*F(K0+2)+S346*F(K0+3)-S1
1 9*F(K0+4))/S720
K0=K0+4
DO 50 K=K0,KX
A(K)=A(K-1)+H*( 9.0*F(K)+19.0*F(K-1)- 5.0*F(K-2)+ F(K-3))/24.0
50 CONTINUE
IF (MOD(ID,2).NE.0) RETURN
DO 150 K=1,KMAX
150 A(K)=A(KMAX)-A(K)
RETURN
C #
END
C
C
SUBROUTINE INTEGRCMDP(F,DX,KMAX,A,ID)
COMPLEX*16 F,A,F0
REAL*8 S106,S19,S346,S456,S74,S11,S720,S251,S646,S264,A0
DIMENSION F(KMAX),A(KMAX)
C
DATA S720,S251,S646,S264 /720.D0,251.D0,646.,264.D0/
C
DATA S106,S19,S346,S456,S74,S11 /106.0D0,19.0D0,346.0D0,456.0D0,
1 74.0D0,11.0D0/
C
H=DX
A0=0.0D0
IF (ID.NE.1) GO TO 11
K0=0
F0=(0.0D0,0.0D0)
GO TO 12
11 K0=1
A(1)=(0.0D0,0.0D0)
F0=F(1)
12 KX=KMAX
A(K0+1)=A0+DBLE(H)*(S251*F0+S646*F(K0+1)-S264*F(K0+2)+
1 S106*F(K0+3)-S19*F(K0+4))/S720
A(K0+2)=A(K0+1)+DBLE(H)*(-S19*F0+S346*F(K0+1)+S456*F(K0+2)-
1 S74*F(K0+3)+S11*F(K0+4))/S720
A(K0+3)=A(K0+2)+DBLE(H)*(S11*F0-S74*F(K0+1)+S456*F(K0+2)+
1 S346*F(K0+3)-S19*F(K0+4))/S720
K0=K0+4
DO 50 K=K0,KX
A(K)=A(K-1)+DBLE(H)*( 9.0D0*F(K)+19.0D0*F(K-1)-5.0D0*F(K-2)+
1 F(K-3))/24.0D0
50 CONTINUE
IF (MOD(ID,2).NE.0) RETURN
DO 150 K=1,KMAX
150 A(K)=A(KMAX)-A(K)
RETURN
C #
END
C
C
SUBROUTINE INTERP(R,P,N,RS,PS,DPS,DERIV)
LOGICAL DERIV,NODRIV
DIMENSION R(N),P(N)
COMPLEX P,PS,DPS
NODRIV=.NOT.DERIV
DPS=(0.0,0.0)
PS=(0.0,0.0)
DO 1 J=1,N
TERM=1.0
DENOM=1.0
DTERM=0.0
DO 2 I=1,N
IF(I.EQ.J) GO TO 2
DENOM=DENOM*(R(J)-R(I))
TERM=TERM*(RS-R(I))
IF(NODRIV) GO TO 2
DTERM1=1.0
DO 3 K=1,N
IF(K.EQ.J.OR.K.EQ.I) GO TO 3
DTERM1=DTERM1*(RS-R(K))
3 CONTINUE
DTERM=DTERM+DTERM1
2 CONTINUE
IF(NODRIV) GO TO 1
DPS=DPS+DTERM*P(J)/DENOM
1 PS=PS+TERM *P(J)/DENOM
RETURN
C
END
C
SUBROUTINE INTERPR(R,P,N,RS,PS,DPS,DERIV)
LOGICAL DERIV,NODRIV
DIMENSION R(N),P(N)
NODRIV=.NOT.DERIV
DPS=0.0
PS=0.0
DO 1 J=1,N
TERM=1.0
DENOM=1.0
DTERM=0.0
DO 2 I=1,N
IF(I.EQ.J) GO TO 2
DENOM=DENOM*(R(J)-R(I))
TERM=TERM*(RS-R(I))
IF(NODRIV) GO TO 2
DTERM1=1.0
DO 3 K=1,N
IF(K.EQ.J.OR.K.EQ.I) GO TO 3
DTERM1=DTERM1*(RS-R(K))
3 CONTINUE
DTERM=DTERM+DTERM1
2 CONTINUE
IF(NODRIV) GO TO 1
DPS=DPS+DTERM*P(J)/DENOM
1 PS=PS+TERM *P(J)/DENOM
RETURN
C
END
C
C
C
SUBROUTINE SORT(NINI,VALIN,NFIN,VALFIN)
C
C Given a set of **real** numbers VALINI, this routine orders them and
C suppresses the values appearing more than once. The remaining
C values are stored in VALFIN.
C
C VALINI(K+1).GT.VALINI(K) : decreasing order
C VALINI(K+1).LT.VALINI(K) : increasing order
C
C
DIMENSION VALIN(NINI),VALINI(NINI),VALFIN(NINI)
C
LOGICAL BUBBLE
C
DATA SMALL /0.00001/
C
C.....STORE INPUT ARRAY
C
DO I=1,NINI
VALINI(I)=VALIN(I)
ENDDO
C
DO J=1,NINI-1
K=J
BUBBLE=.TRUE.
150 IF(K.GE.1.AND.BUBBLE) THEN
IF(VALINI(K+1).LT.VALINI(K)) THEN
R1=VALINI(K)
VALINI(K)=VALINI(K+1)
VALINI(K+1)=R1
ELSE
BUBBLE=.FALSE.
END IF
K=K-1
GOTO 150
ENDIF
ENDDO
C
JFIN=1
VALFIN(1)=VALINI(1)
DO J=1,NINI-1
IF(ABS(VALFIN(JFIN)-VALINI(J+1)).GT.SMALL) THEN
JFIN=JFIN+1
VALFIN(JFIN)=VALINI(J+1)
ENDIF
ENDDO
NFIN=JFIN
C
RETURN
C
END
C
C
SUBROUTINE STARTP(ZZ0,L,E,R,V,KMAX,KI,P)
C
IMPLICIT COMPLEX*16 (A-B)
REAL*4 ZZ0,R
REAL*8 XL,Z0,H,RC
C
COMPLEX*8 V
COMPLEX*16 P,Z
C
DIMENSION R(KMAX),V(KMAX),Z(300),P(KMAX)
C 1,ZA(150)
C
Z0=DBLE(ZZ0)
RC = 1.0D0
C IF(L.GT.10) RC = 0.01/R(1)
KM=KI/4
IF(KI.EQ.1) KM=1
KI1=KI+2
DO 1 K=1,KI1
1 Z(K)=DCMPLX(R(K)*V(K))
XL=DFLOAT(L)
H=DBLE(KM*R(1))
B1=-2.0D0*Z0
B2=(22.D0*Z0+18.D0*Z(KM)-9.D0*Z(2*KM)+2.D0*Z(3*KM))/(6.D0*H)-
1 DBLE(E)
B3=(-12.D0*Z0-15.D0*Z(KM)+12.D0*Z(2*KM)-3.D0*Z(3*KM))/(6.D0*H*H)
B4=(2.D0*Z0+3.D0*Z(KM)-3.D0*Z(2*KM)+Z(3*KM))/(6.D0*H**3)
A1=-Z0/(XL+1.0D0)
A2=(B1*A1+B2)/(4.0D0*XL+6.0D0)
A3=(B1*A2+B2*A1+B3)/(6.0D0*XL+12.0D0)
A4=(B1*A3+B2*A2+B3*A1+B4)/(8.0D0*XL+20.0D0)
A5=(B1*A4+B2*A3+B3*A2+B4*A1)/(10.D0*XL+30.D0)
A6=(B1*A5+B2*A4+B3*A3+B4*A2)/(12.D0*XL+42.D0)
A7=(B1*A6+B2*A5+B3*A4+B4*A3)/(14.D0*XL+56.D0)
DO 4 K=1,KI1
4 P(K)=DCMPLX((1.0D0+DBLE(R(K))*(A1+DBLE(R(K))*(A2+DBLE(R(K))*
1 (A3+DBLE(R(K))*(A4+DBLE(R(K))*(A5+DBLE(R(K))*
2 (A6+DBLE(R(K))*A7)))))))*(DBLE(R(K))*RC)**(L+1))
C DO 2 K=1,KI1
C 2 ZA(K)=B1+R(K)*(B2+(R(K)*(B3+R(K)*B4)))
C WRITE(6,3) (I,(R(I+J-1),Z(I+J-1),ZA(I+J-1),J=1,2),I=1,KI1,2)
RETURN
END
C
subroutine rhl(erl,eim,pi)
c
c
c this is a new hl subroutine, using interpolation for the
c real part while calculating the imaginary part is calculated
c analitically.
c it uses hl to calculate values at the mesh points for the inter
c polation of the real part. the imaginary part is calculated
c using subroutine imhl.
c
c written by jose mustre
c polynomial in rs has a 3/2 power term. j.m.
c
implicit double precision (a-h,o-z)
common /corr/ rs,blt,xk1,vii,index2
common /hlin/ xk
common /cusp/ icusp
c
c for the right branch the interpolation has the form:
c hl(rs,x) = e/x + f/x**2 + g/x**3
c where e is known and
c f = sum (i=1,3) ff(i) rs**(i+1)/2
c g = sum (i=1,3) gg(i) rs**(i+1)/2
c
c
c lrs=number of rs panels, in this case one has 4 panels
c nrs=number of standard rs values, also order of rs expansion
c if you change nrs you need to change the expansion of hl
c in powers of rs that only has 3 terms!
c nleft=number of coefficients for x<x0
c nright=number of coefficients for x>x0
c
parameter (lrs=4,nrs=3,nleft=4,nright=2)
dimension rcfl(lrs,nrs,nleft),rcfr(lrs,nrs,nright)
dimension cleft(nleft),cright(nright)
data conv /1.9191583/
data rcfr/-0.173963d+00,-0.173678d+00,-0.142040d+00,-0.101030d+00,
1 -0.838843d-01,-0.807046d-01,-0.135577d+00,-0.177556d+00,
2 -0.645803d-01,-0.731172d-01,-0.498823d-01,-0.393108d-01,
3 -0.116431d+00,-0.909300d-01,-0.886979d-01,-0.702319d-01,
4 0.791051d-01,-0.359401d-01,-0.379584d-01,-0.419807d-01,
5 -0.628162d-01, 0.669257d-01, 0.667119d-01, 0.648175d-01/
data rcfl/ 0.590195d+02, 0.478860d+01, 0.812813d+00, 0.191145d+00,
1 -0.291180d+03,-0.926539d+01,-0.858348d+00,-0.246947d+00,
2 0.363830d+03, 0.460433d+01, 0.173067d+00, 0.239738d-01,
3 -0.181726d+03,-0.169709d+02,-0.409425d+01,-0.173077d+01,
4 0.886023d+03, 0.301808d+02, 0.305836d+01, 0.743167d+00,
5 -0.110486d+04,-0.149086d+02,-0.662794d+00,-0.100106d+00,
6 0.184417d+03, 0.180204d+02, 0.450425d+01, 0.184349d+01,
7 -0.895807d+03,-0.318696d+02,-0.345827d+01,-0.855367d+00,
8 0.111549d+04, 0.156448d+02, 0.749582d+00, 0.117680d+00,
9 -0.620411d+02,-0.616427d+01,-0.153874d+01,-0.609114d+00,
1 0.300946d+03, 0.109158d+02, 0.120028d+01, 0.290985d+00,
2 -0.374494d+03,-0.535127d+01,-0.261260d+00,-0.405337d-01/
c
c calcualte hl using interplation coefficients
c
rkf=conv/rs
ef=rkf*rkf*0.5D0
wp=sqrt(3.0D0/rs**3)
call imhl (erl,eim,pi)
eim=eim
c
c eim already has a factor of ef in it j.m.
c eim also gives the position of the cusp
c
xx=xk1/rkf
c
c calculate right hand side coefficients
c
if (rs .lt. 0.2D0) then
mrs=1
go to 209
endif
if (rs .ge. 0.2D0 .and. rs .lt. 1.0D0) then
mrs=2
go to 209
endif
if (rs .ge. 1.0D0 .and. rs .lt. 5.0D0) then
mrs=3
go to 209
endif
if (rs .ge. 5.0D0) mrs=4
209 do 210 j=1,nright
cright(j)=rcfr(mrs,1,j)*rs+rcfr(mrs,2,j)*rs*sqrt(rs)
1 +rcfr(mrs,3,j)*rs*rs
c
c jm written this way to calculate powers of rs quicker.
c cright(j)=0.0
c do 205 k=1,nrs
c 205 cright(j)=cright(j)+rcfr(mrs,k,j)*rs**((k+1.)/2.)
210 continue
eee=-pi*wp/(4.0D0*rkf*ef)
c
if (icusp .ne. 1) then
do 230 j=1,nleft
cleft(j)=rcfl(mrs,1,j)*rs+rcfl(mrs,2,j)*rs*sqrt(rs)
1 +rcfl(mrs,3,j)*rs*rs
c cleft(j)=0.0
c do 225 k=1,nrs
c 225 cleft(j)=cleft(j)+rcfl(mrs,k,j)*rs**((k+1.)/2.)
230 continue
c
erl=cleft(1)
do 250 j=2,nleft
250 erl=erl+cleft(j)*xx**(j-1)
c
else
c
c right branch
c
erl=eee/xx
do 280 j=1,nright
280 erl=erl+cright(j)/xx**(j+1)
endif
c
erl=erl*ef
return
end
c
c
c
subroutine imhl(erl,eim,pi)
C
c**********************************************************************
c**********************************************************************
C
c writen by j. mustre march 1988 based on analytical expression derived
c by john rehr.
c it leaves the real part unchanged.
C
c**********************************************************************
c**********************************************************************
implicit double precision (a-h,o-z)
common /corr/rs,blt,xk1,vii,index2
common/hlin/xk
common /cusp/ icusp
common/inter/wp,alph,ef,xf
common/cube/a0,a1,a2
external ffq
icusp=0
fa=1.9191583D0
xf=fa/rs
ef=xf*xf/2.0D0
xk=xk1
xk=xk/xf
c
c wp is given in units of the fermi energy in the formula below.
c
wp=sqrt(3.0D0/(rs*rs*rs))/ef
alph=4.0D0/3.0D0
c write(*,225)
c 225 format(1x'xk,wp')
c write(*,*)xk,wp
xs=wp*wp-(xk*xk-1.0D0)**2
c write (*,*)xs
if (xs .ge. 0.D0) go to 10
q2=sqrt((sqrt(alph*alph-4.0D0*xs)-alph)/2.0D0)
qu=min(q2,(1.0D0+xk))
d1=qu-(xk-1.0D0)
if(d1.gt.0.D0) goto 11
10 eim=0.0D0
go to 20
11 eim=ffq(qu)-ffq((xk-1.0D0))
c write(*,223)
c 223 format(1x'xk,eim,d1')
c write(*,*)xk,eim,d1
20 call cubic (rad,qplus,qminus)
c write(*,224)
c 224 format(1x'xk,rad,qplus,qminus')
c write(*,*)xk,rad,qplus,qminus
if (rad.gt. 0.0D0) goto 32
d2=qplus-(xk+1.0D0)
if(d2.gt.0.D0)go to 21
eim=eim
go to 30
21 eim=eim+ffq(qplus)-ffq((xk+1.0D0))
c write(*,221)
c 221 format(1x'xk,eim,d2')
c write (*,*)xk,eim,d2
30 d3=(xk-1.0D0)-qminus
if(d3.gt.0.D0)go to 31
return
31 eim=eim+ffq((xk-1.0D0))-ffq(qminus)
c
c beginning of the imaginary part and position of the cusp x0
c
icusp=1
c write(*,222)
c 222 format(1x'xk,eim,d3')
c write (*,*)xk,eim,d3
32 return
end
c
c
c
subroutine cubic ( rad,qplus,qminus)
implicit double precision (a-h, o-z)
complex*16 s1,s13
common/hlin/xk
common/inter/wp,alph,ef,xf
common/cube/a0,a1,a2
c
c this subroutine finds the roots of the equation
c 4xk*q^3+(alph-4xk^2)q^2+wp^2=0.
c see abramowitz and stegun for formulae.
a2=(alph/(4.0D0*xk*xk)-1.0D0)*xk
a0=wp*wp/(4.0D0*xk)
a1=0.0D0
q=a1/3.0D0-a2**2/9.0D0
r=(a1*a2-3.0D0*a0)/6.0D0-a2**3/27.0D0
rad=q**3+r**2
if (rad .gt. 0.0D0) then
qplus=0.0D0
qminus=0.0D0
return
endif
s13=dcmplx(r,sqrt(-rad))
s1=s13**(1.0D0/3.0D0)
qz1=2.0D0*dreal(s1)-a2/3.0D0
qz3=-(dreal(s1)-dsqrt(3.0D0)*dimag(s1)+a2/3.0D0)
qplus=qz1
qminus=qz3
return
end
c
c
c
double precision function ffq(q)
implicit double precision (a-h,o-z)
common /corr/rs,blt,xk1,vii,index2
common /hlin/xk
common /inter/wp,alph,ef,xf
wq=sqrt(wp*wp+alph*q*q+q*q*q*q)
ffq=(wp+wq)/(q*q)+alph/(2.0D0*wp)
c
c check prefactor (wp/4xk) to see if units are correct.
c
ffq=(ef*wp/(4.0D0*xk1))*log(ffq)
return
end
subroutine cont_sub(potype,potgen,lmax_mode,lmaxt,relc,
& eikappr,db)
c
c.... continuum program version for phase shift calculation:
c.... february 1990
c
include 'msxas3.inc'
c include 'msxasc3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$ n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
common /dens/ irho,rhotot(rd_,sd_),rhoint(2),
$ vcoul(rd_,sd_),vcoulint(2)
c
common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1,
* i_absorber_hole2,i_norman,i_alpha,
1 i_outer_sphere,i_exc_pot,i_mode
common /fcnr/kxe, h(d_),vcons(2),r(rd_,d_),v(rd_,sd_),
$ ichg(10,d_),kplace(at_),kmax(at_)
complex v,vcons
c
COMMON /FCNRLM/X(RDX_,D_), RX(RDX_,D_), HX(D_), VX(RDX_,SD_),
& VXR(RDX_,SD_), DVX(RDX_,SD_), BX(RDX_,SD_),
& VXSO(RDX_,SD_), KMX(AT_), KPLX(AT_)
COMPLEX VX, VXR, DVX, BX, VXSO
C
COMMON /LLM/ ALPHA, BETA
c
common /flag/ inmsh,inv,inrho,insym,iovrho,iosym,
1 imvhl,nedhlp
c
character*8 name0 ,nsymbl
c
common /param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,xe,ev
c
common /pdq/ p(rd_,f_),ps(n_),dps(n_),
* ramf(n_),pss(6),dpss(6)
complex p,ps,dps,ramf,pss,dpss
c
c ##############common /pdqi/ modified to include the two wavefuncti
c ############### for the final two holes state in the Auger decay r
c
common /pdqi/rpi(rd_),rpi1(rd_),rpi2(rd_)
c
common /state/ natom(n_),ln(n_),nleq(at_),
1 nns,nuatom,ndg,nls(at_),n0l(at_),n0(at_),
2 nterms(at_),lmaxn(at_),ndim,lmxne(at_,nep_)
c
character*2 potgen,relc
character*3 eikappr
character*5 potype
c
logical do_r_in
c
c write(6,11) jat,jd,jf,jlmax,jn,jrd,jsd,j1d
c
c 11 format('0 final state parameters:'
c $ /'0 jat =',i6,2x,'number of centers (tb)'
c $ /'0 jd =',i6,2x,'number of inequivalent centers (nun)'
c $ /'0 jf =',i6,2x,'storage location for radial functions:=10'
c $ /'0jlmax =',i6,2x,'maximum l-value on any atomic sphere'
c $ /'0 jn =',i6,2x,'number of basis functions on all atoms'
c $ /'0 jrd =',i6,2x,'maximum number of radial mesh points (npt)'
c $ /'0 jsd =',i6,2x,'nspins*jd (for spin restriction)'
c $ /'0 j1d =',i6,2x,'is jd+1')
c
c
c
ctn write(30,13)
ctn 13 format(2x,' e xe natom l '
ctn $ ' atmat ')
c
C WARNING: COMMONS /FCNR/ AND /PARAM/ ARE AVAILABLE ONLY AFTER SUBROUTINE
C INPUT_CONT IS CALLED
c
c do not change in this version!
nns=1
c***********************************************************************
c get initial state radial function
c***********************************************************************
c
print 660
660 format( 1x,' generating core state wavefunction ')
c
call get_core_state
c
c***********************************************************************
c compute parameters for final state and call subroutine cont
c***********************************************************************
c
id=1
c
call input_cont(id,potype,potgen,lmax_mode,lmaxt)
call output_cont(id)
c
call setup
c
vcon=vcons(nns)
c
write(6,10) eftr
10 format(/,1x,' fermi level =', f10.5,/)
c
emmef=emin-eftr
if(emmef.lt.0.0) write(6,556) emin,eftr
556 format(/,' ***warning***: emin=',f10.5,' less than the fermi ',
* 'level eftr=',f10.5, 'a stop is caused in the case ',
* 'of hedin-lundqvist potential')
if(emmef.lt.0.0.and.irho.ne.0) then
print 780
780 format (//,1x, 'emin less than the Fermi level; see file: ',
* ' results.dat',//)
stop
endif
c
print 770
770 format( 1x,' generating t_l (for030) and',
&' atomic cross section (for050)')
c
c construct log-linear x mesh
c
call llmesh
c
c and generate core state wavefunction on log-linear x-mesh
c
call corewf(nas,nz(nas),i_absorber_hole)
c
call cont(potype,potgen,lmax_mode,lmaxt,relc,eikappr,db)
c
return
end
c
c
subroutine cont(potype,potgen,lmax_mode,lmaxt,relc,eikappr,db)
c
c include 'mscalc.inc'
include 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
c
common/bessel/sbf(ltot_),dsbf(ltot_),snf(ltot_),dsnf(ltot_)
complex*16 sbf,dsbf,snf,dsnf
c
common /dens/ irho,rhotot(rd_,sd_),rhoint(2),
$ vcoul(rd_,sd_),vcoulint(2)
c
common /fcnr/kxe, h(d_),vcons(2),r(rd_,d_),v(rd_,sd_),
$ ichg(10,d_),kplace(at_),kmax(at_)
complex vcons,v
c
COMMON /FCNRLM/X(RDX_,D_), RX(RDX_,D_), HX(D_), VX(RDX_,SD_),
& VXR(RDX_,SD_), DVX(RDX_,SD_), BX(RDX_,SD_),
& VXSO(RDX_,SD_), KMX(AT_), KPLX(AT_)
COMPLEX VX, VXR, DVX, BX, VXSO
C
COMMON /LLM/ ALPHA, BETA
c
COMMON /PDQX/PX(RDX_,F_), PX0(RDX_,F_), PPX(RDX_,F_),
& PAX(RDX_,F_), RAMFNR(N_), RAMFSR(N_), RAMFSOP(N_),
& RAMFSOA(N_)
COMPLEX PX, PX0, PPX, PAX, RAMFNR, RAMFSR, RAMFSOP, RAMFSOA
c
common /seculrx/ atmnr(n_), atmsr(n_), atmsop(n_), atmsoa(n_)
complex atmnr, atmsr, atmsop, atmsoa
c
common /flag/ inmsh,inv,inrho,insym,iovrho,iosym,
1 imvhl,nedhlp
c
common/mtxele/ nstart,nlast,dmx(2),dmx1(2),qmx(3),qmx1(3),
$ dxdir,dxexc,nfis,nfis1,nfis2
real nfis,nfis2,nfis1
complex dmx,dmx1,qmx,qmx1,dxdir,dxexc
c
common/mtxelex/ dmxx(2),dmxx1(2),dmxxa(2),dmxxa1(2),
& qmxx(3),qmxx1(3),qmxxa(3),qmxxa1(3),
& dxxdir,dxxexc
complex dmxx,dmxx1,dmxxa,dmxxa1,qmxx,qmxx1,qmxxa,qmxxa1,
& dxxdir,dxxexc
c
character*8 name0 ,nsymbl
c
common/param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,xe,ev
c
common/eels/einc,esct,scangl,qt,lambda,eelsme(npss,npss,npss),
& p1(rdx_,npss,nef_),p2(rdx_,npss,nef_),
& p3(rdx_,npss,nef_),ramfsr1(npss,nef_),
& ramfsr2(npss,nef_),ramfsr3(npss,nef_),
& lmxels(3,ua_),p3irreg(rdx_,7),p2irreg(rdx_,7)
complex eelsme,p1,p2,p3,ramfsr1,ramfsr2,ramfsr3,argc,yc,p3irreg,
& p2irreg
real*4 einc,esct,scangl,qt,lambda
c
common/msbhf/ il(rdx_,lexp_,d_), kl(rdx_,lexp_,d_), kappa
dimension msbfi(lexp_), mshfk(lexp_), ylc(lexp_*(lexp_+1))
dimension dmsbfi(lexp_), dmshfk(lexp_)
real*8 kappa, arg, y, msbfi, mshfk, il, kl, dmsbfi, dmshfk
c
common/struct/ntnabs(nat_),ngbrabs
c
c ############# I include the common auger to take into account also the
c ############# to make the auger calculation
c
common/auger/calctype,expmode,edge1,edge2
character*3 calctype, expmode
character*2 edge1,edge2
common /pdq/ p(rd_,f_),ps(n_),dps(n_),
* ramf(n_),pss(6),dpss(6)
complex p,ps,dps,ramf,pss,dpss
c ###################common /pdqi/ modified to include the two core hole
c ##################of the electrons which interacts and give rise
c
common /pdqi/rpi(rd_),rpi1(rd_),rpi2(rd_)
c
common /seculr/ atm(n_)
complex*16 atm
c
common /state/ natom(n_),ln(n_),nleq(at_),
1 nns,nuatom,ndg,nls(at_),n0l(at_),n0(at_),
2 nterms(at_),lmaxn(at_),ndim,lmxne(at_,nep_)
c
common/lparam/lmax2(nat_),l0i
c
common/typot/ ipot
c
complex amem,amem1,pamel,pamel0,cofct,vrr,qcofct,rexsrme,rexssme
c
dimension es(nep_),xkrn(rd_),xkri(rd_),xkrs(d_),cofct(nep_,2)
dimension qcofct(nep_,3)
c
logical*4 doit, do_r_in
logical*4 xasxpd
c
c fortran units
c
common/funit/idat,iwr,iphas,iedl0,iwf
c
complex atmd
c
dimension distin(d_), distor(d_), ntnabs1(nat_)
character*20 correction
character*9 reg_type,irr_type
character*5 potype
character*4 spectro
character*2 potgen,relc
character*8 filename
character*3 eikappr
c
data facts/8.067/,ot/.3333333/,pai/3.1415927/
data fsc,fscs4 /7.29735e-3,1.331283e-5/
c
c.....facts=4.*(pi)**2/137*(0.529)**2*100.0 if cross section is expresse
c..... in megabarns = 10.e-18 cm**2
c
c
c start energy do loop:
c
c 67 if( irho .eq. 0 ) write(6,40) vcon
c 40 format(//,' interstitial potential vcon = (',E12.6,E12.6,')',//)
c
reg_type='regular '
irr_type='irregular'
c
if(relc.eq.'nr') then
correction='non relativistic '
elseif(relc.eq.'sr') then
correction='scalar relativistic '
elseif(relc.eq.'so') then
correction='spin-orbit '
else
correction=' '
endif
c
if (calctype.eq.'xpd') then
spectro='PED '
elseif (calctype.eq.'xas') then
spectro='XAS '
elseif (calctype.eq.'aed') then
spectro='AED '
elseif (calctype.eq.'led') then
spectro='LEED'
elseif (calctype.eq.'rex') then
spectro='REXS'
elseif (calctype.eq.'els') then
spectro='EELS'
elseif (calctype.eq.'e2e') then
spectro='E,2E'
endif
c
if (emin.lt.real(vcon)) then
write(6,45)
stop
endif
c
45 format(//,' emin less than the interstitial potential vcon',//)
c
xasxpd = (calctype.eq.'xpd'.or.calctype.eq.'xas')
c
if(irho.eq.0) go to 68
ot = 1./3.
rsint = (3./(4.*pai*rhoint(1)))**ot
write(6,41) gamma,rsint
41 format(/,1x,' gamma =',f10.6,' rsint =',f10.6,/)
68 doit = .true.
if(calctype.eq.'xas') then
write(50,803)
elseif(calctype.eq.'rex') then
write(50,804)
elseif(calctype.eq.'xpd') then
write(50,807)
endif
c
803 format(2x,' e vcon mfp ',
$ ' sigma0 regrme singrme ')
c
804 format(2x,' e vcon mfp ',
$ ' rexsrme rexssme ')
c
807 format(2x,' e vcon mfp ',
$ ' sigma0 regrme ')
c
c
c de = alog(emax - emin + 1.)/(kxe - 1.)
c con = 27.2116/7.62
c wvb = sqrt(con*emin)
c wve = sqrt(con*emax)
c kxe = nint((wve-wvb)/0.05 + 1.)
kxe = nint((emax-emin)/de + 1.)
c
nval=1
do jat=1,nuatom
nval=max0(nval,nterms(jat))
enddo
write(35,111) nuatom,kxe,1,ipot,lmax_mode
write(95,111) nuatom,kxe,1,ipot,lmax_mode
write(70,111) nuatom,kxe,1,ipot,lmax_mode
write(80,111) nuatom,kxe,1,ipot,lmax_mode
write(90,111) nuatom,kxe,1,ipot,lmax_mode
111 format(5(5x,i4))
c
if(potgen.eq.'in') then
write(6,*) ' check in subroutine cont'
c
write(6,*) ' order of neighb. -- symb. -- dist. from absorber'
write(6,*) ' '
c
c.....check with molpot data: ok (14/12/2007)
c
do i=1,ngbrabs
nb=ntnabs(i)
dist=sqrt((xv(nb)-xv(1))**2+(yv(nb)-yv(1))**2+(zv(nb)-zv(1))**2)
write(6,*) nb, nsymbl(nb), dist
enddo
c
endif
c
write(6,*) ' ---------------------------------------------------',
1 '--------------'
c
do nb=1,ndat
dist=sqrt((xv(nb)-xv(1))**2+(yv(nb)-yv(1))**2+(zv(nb)-zv(1))**2)
distin(nb) = dist
enddo
c
c endif
c
c.....Order prototypical atoms in order of increased distance from absor
c
call sort(ndat,distin,ndiff,distor)
small=0.00001
c nbrs=ngbrabs
nbrs = ndiff
c nbrs=8
c
do i=1,nbrs
do j=1,ndat
if(abs(distin(j)-distor(i)).lt.small) then
ntnabs1(i)=j
write(6,12) j, nsymbl(j), distin(j)
endif
enddo
enddo
12 format(5X,I4,12X,A2,10X,F10.6)
c
c do i=2,nbrs
c write(6,*) ntnabs1(i), ntnabs(i-1)
c enddo
c
c
c write(6,*) 'irho =', irho
c write(6,*) '----------------------------------'
nunit=40
nunit1=nunit+1
c
c.....write out potential and density file for first neighbors to absorb
c
100 format(1x,a5,a5,a6,f10.5,a10,3f10.5)
c
if(irho.ne.0) then
c
open(unit=nunit,file='plot/plot_vc.dat',status='unknown')
open(unit=nunit1,file='plot/plot_dens.dat',status='unknown')
c
do i=1,nbrs
c
j = ntnabs1(i)
write(6,12) j, nsymbl(j), distin(j)
write(nunit,100) 'atom ',nsymbl(j), 'dist =',distin(j),
& ' coord = ', xv(j), yv(j), zv(j)
write(nunit1,100) 'atom ',nsymbl(j), 'dist =',distin(j),
& ' coord ', xv(j), yv(j), zv(j)
do k=1,kmax(j)
write(nunit,*) r(k,j), vcoul(k,j)
c
c do ith=0,nthe
c theta = dthe*float(ith)
c do iph=0,nphi
c phi = dphi*float(iph)
c write(nunit1,*) r(k,j), theta, phi, rhotot(k,j)
write(nunit1,*) r(k,j), rhotot(k,j)
c enddo
c enddo
c
enddo
c close(nunit)
c close(nunit1)
c nunit=nunit+2
c nunit1=nunit1+2
enddo
c
else
c
open(unit=nunit,file='plot/plot_v.dat',status='unknown')
open(unit=nunit1,file='plot/plot_dens.dat',status='unknown')
do i=1,nbrs
c
j = ntnabs1(i)
write(6,12) j, nsymbl(j), distin(j)
write(nunit,100) 'atom ',nsymbl(j), 'dist =',distin(j),
& ' coord = ', xv(j), yv(j), zv(j)
write(nunit1,100) 'atom ',nsymbl(j), 'dist =',distin(j),
& ' coord ', xv(j), yv(j), zv(j)
do k=1,kmax(j)
write(nunit,*) r(k,j), real(v(k,j))
c
c do ith=0,nthe
c theta = dthe*float(ith)
c do iph=0,nphi
c phi = dphi*float(iph)
c write(nunit1,*) r(k,j), theta, phi, rhotot(k,j)
write(nunit1,*) r(k,j), rhotot(k,j)
c enddo
c enddo
c
enddo
c close(nunit)
c close(nunit1)
c nunit=nunit+2
c nunit1=nunit1+2
enddo
c
c
endif
c
close(nunit)
close(nunit1)
c
c endif
c write(6,*) '----------------------------------'
c do i=1,ndat
c write(6,*) i, nsymbl(i),distin(i),distor(i)
c enddo
C
c
c
cl = (l0i + 1.5)**2
nid = 1
write(6,*) ' '
c
c nels = 1
if(calctype.eq.'els'.or.calctype.eq.'e2e') then
c nels = 3
c
c calculate cluster size for effective integration of eels tme
c
kappa = 1.d0/dble(lambda) ! to account for thomas-fermi screening
! length = 2.9*0.529/(r_s)^(1/2)
! default = 1/20 = 0.05 (au)^{-1}
c
do i = 1, ndat
rcut = distor(i)
scrcoul = exp(-real(kappa)*rcut)/rcut
if(scrcoul.le.0.05) go to 11
enddo
11 neff = i - 1
c
ltc = lexp_
y = 0.0d0
do na = 1, ndat
do k = 1, kmx(na)
arg = kappa*dble(rx(k,na))
call msbf(arg,y,ltc,msbfi,dmsbfi)
call mshf(arg,y,ltc,mshfk,dmshfk)
do l = 1, ltc
il(k,l,na) = msbfi(l)
kl(k,l,na) = mshfk(l)*(-1)**(l-1)*kappa !correction 15 march 2014
enddo
enddo
enddo
c
scangl = scangl/180.0*pai
qt2 = einc + esct - 2.0*sqrt(einc*esct)*cos(scangl)
qt = sqrt(qt2)
write(6,*) ' '
write(6,*)' Calculating eels in DWBA. einc =',einc,
& ' esct =', esct,' einl =', einc - esct - cip
write(6,*)' Momentum transfer qt =', qt, ' au^{-1}'
write(6,*)' Scattering angle', scangl, 'radians'
write(6,*)' Scattering angle', scangl*180.0/pai, 'degrees'
write(6,*) ' '
write(6,*) ' Coulomb screening inverse length kappa =', kappa
write(6,*) ' '
c
endif
c
c.....Calculation of tl and rme for xpd, xas and rexs
c
c
if (calctype.eq.'xpd'.or.calctype.eq.'xas'.or.
1 calctype.eq.'rex' .or. calctype.eq.'aed'.or.
2 calctype.eq.'led') then
c
nks = 1 !ficticious: in this section only for writing purposes
c
c writing the headers of the rme file
c
write(55,821)
write(55,822) spectro,correction
write(55,821)
c
if(calctype.eq.'xpd'.or.calctype.eq.'xas'.or.
1 calctype.eq.'rex') then
write(55,830)
write(55,840)
write(55,850)
write(55,840)
endif
c
do 9 ne=1,kxe
es(ne) = emin + float(ne-1)*de
e=es(ne)
ev=e-vcon
c
c calculate energy dependent potential:
c
if( irho .ne. 0 ) then
if(ne.eq.1) write(6,*) ' irho =', irho,
& ' entering vxc to calculate energy',
& ' dependent exchange'
call vxc ( doit )
else
if(ne.eq.1.and.nks.eq.1) then
write(6,*) ' irho =', irho, ' energy independent potential'
write(6,*)' constant interstitial potential vcon =', vcon
endif
endif
ev=e-vcon
write(6,*) ' energy dependent vcon = ', vcon,' at energy', e
C
C CONSTRUCT RELATIVISTIC POTENTIAL ON LINEAR-LOG MESH
C
CALL VREL
C
xe=csqrt(ev)
c
c.....write out potential ans rs files for first neighbors to
c.....absorber for the first energy point
c
nunit=40
nunit1=nunit+1
open(unit=nunit,file='plot/plot_v(e).dat',status='unknown')
open(unit=nunit1,file='plot/plot_rs.dat',status='unknown')
c
if(ne.eq.1) then
c
do i=1,nbrs
c
j = ntnabs1(i)
c write(6,*) j, nsymbl(j), distin(j)
write(nunit,100) 'atom ',nsymbl(j), 'dist =',distin(j),
& ' coord = ', xv(j), yv(j), zv(j)
write(nunit1,100) 'atom ',nsymbl(j), 'dist =',distin(j),
& ' coord ', xv(j), yv(j), zv(j)
do k=1,kmax(j)
write(nunit,*) r(k,j), real(v(k,j))
write(nunit1,*) r(k,j), rhotot(k,j)
enddo
c close(nunit)
c close(nunit1)
c nunit=nunit+2
c nunit1=nunit1+2
enddo
c
endif
c
close(nunit)
close(nunit1)
c
c calculate maximum l-value lmxne(n,ne) for each prototipical atom
c at the energy e=es(ne)
c
c if(lmax_mode.eq.2.or.calctype.eq.'els'.or.calctype.eq.'e2e') then
if(lmax_mode.eq.2) then
do n=1,nuatom
lmxne(n,ne) = nint(sqrt(e)*rs(n))+2
if(lmxne(n,ne).lt.l0i+1) lmxne(n,ne)=l0i+2
c lmxels(nks,n) = lmxne(n,ne)
c write(6,*) nks, n, e, rs(n), lmxne(n,ne)
enddo
endif
c
NBL1=NUATOM/4
XNBL1=FLOAT(NBL1)+0.0001
XNBL2=FLOAT(NUATOM)/4.
IF(XNBL1.LT.XNBL2) NBL1=NBL1+1
112 FORMAT(4(7X,I2))
if (lmax_mode.eq.2) then
DO JL=1,NBL1
JLN=4*(JL-1)+1
write(35,112) lmxne(jln,ne),lmxne(jln+1,ne),
& lmxne(jln+2,ne),lmxne(jln+3,ne)
write(95,112) lmxne(jln,ne),lmxne(jln+1,ne),
& lmxne(jln+2,ne),lmxne(jln+3,ne)
write(70,112) lmxne(jln,ne),lmxne(jln+1,ne),
& lmxne(jln+2,ne),lmxne(jln+3,ne)
write(80,112) lmxne(jln,ne),lmxne(jln+1,ne),
& lmxne(jln+2,ne),lmxne(jln+3,ne)
write(90,112) lmxne(jln,ne),lmxne(jln+1,ne),
& lmxne(jln+2,ne),lmxne(jln+3,ne)
ENDDO
else if (lmax_mode.eq.1) then
DO JL=1,NBL1
JLN=4*(JL-1)+1
write(35,112) lmax2(jln),lmax2(jln+1),
& lmax2(jln+2),lmax2(jln+3)
write(95,112) lmax2(jln),lmax2(jln+1),
& lmax2(jln+2),lmax2(jln+3)
write(70,112) lmax2(jln),lmax2(jln+1),
& lmax2(jln+2),lmax2(jln+3)
write(80,112) lmax2(jln),lmax2(jln+1),
& lmax2(jln+2),lmax2(jln+3)
write(90,112) lmax2(jln),lmax2(jln+1),
& lmax2(jln+2),lmax2(jln+3)
ENDDO
else
DO JL=1,NBL1
JLN=4*(JL-1)+1
write(35,112) lmaxt,lmaxt,lmaxt,lmaxt
write(95,112) lmaxt,lmaxt,lmaxt,lmaxt
write(70,112) lmaxt,lmaxt,lmaxt,lmaxt
write(80,112) lmaxt,lmaxt,lmaxt,lmaxt
write(90,112) lmaxt,lmaxt,lmaxt,lmaxt
ENDDO
endif
c
c calculate atomic t-matrix elements atm(n)
C
c if(ne.eq.1.and.nks.eq.1) write(6,*)
if(ne.eq.1) write(6,*)
& ' calculating atomic t-matrix elements atm(n)'
c
call smtx(ne,lmax_mode)
c
c calculate the radial integrals of transition matrix elements:
c
if(calctype.ne.'led') then
call radial(doit,imvhl)
endif
c
c calculate atomic t-matrix with relativistic corrections
c
call smtxllm(ne,lmax_mode,relc,nks,px,px0,ppx,pax,
& ramfnr,ramfsr,ramfsop,ramfsoa)
c
c and corresponding radial integrals of transition matrix elements:
c
call radialx(ne,relc,eikappr)
c
c modified to write the continuum radial wavefunction for eels
c
lxp = lmxne(nas,ne)
if(lxp.gt.f_) lxp=f_ - 1
call writewf(lxp)
c
c energy dependent factors for dipole and quadrupole absoprtion;
c factor 1/3 for unpolarized absorption
c
if(ne.eq.1)
& write(6,*) ' check ionization potential:', cip
edfct= facts*(cip+e)*2./3.0
edfctq = 2.0/5.0*3.0/16.0*edfct*((cip+e)*fsc)**2
dafsfct = (cip+e)**4 * pai**2
c
write(6,*) ' '
write(6,*) ' '
write(6,*) ' value of the mean free path:'
write(6,44)
44 format(' --------------------------------------------------',
1 '---------------')
if(gamma.ne.0.0.and.ne.eq.1.and.nks.eq.1) then
amfph = 0.529/gamma/2
write(6,43) amfph,e
43 format(' average mean free path due to finite gamma: mfp ='
* ,f10.5,' angstrom at energy ', f10.5 ,/)
endif
c
if(irho.eq.0.and.imvhl.eq.0.and.nks.eq.1) then
write(6,*)' infinite cluster mfp for real potential'
go to 802
endif
ctn write(6,40) vcon,eftr
xeim = -aimag(xe)
c
c calculate average mean free path (= amfp). define r-dependent
c wave vector xkr and its indefinite integral xkri
c
amfpi = 0.0
do 20 n = 1,ndat
kxn = kmax(n)
do 30 k = 1,kxn
vrr = v(k,n) + cl/r(k,n)**2
if ((e-real(vrr)).lt.0.0) then
xkrn(k) = 0.0
go to 30
endif
xkrn(k) = -aimag(csqrt(e-vrr))
30 continue
c
c calculate integral of xkr
c
call integr (xkrn(1),r(1,n),kxn,ichg(1,n),xkri,nid)
call interpr (r(kplace(n)-3,n),xkri(kplace(n)-3),7,rs(n),
* xkrs(n),dummy,.false.)
xkrs(n) = xkrs(n)/rs(n)
20 amfpi = amfpi + xkrs(n)
c
c it is assumed that the average interstitial path is 2/3 of the total
c
amfpi = 1./3.*amfpi/ndat + 2.0*xeim/3.
if (amfpi.ne.0.0) then
amfp = 0.529/amfpi/2.
write(6,42) amfp, e
42 format(' average mean free path in the cluster : mfp ='
* ,f10.5,' angstrom at energy ', f10.5 ,/)
endif
802 continue
if(gamma.ne.0.0.and.ne.eq.1) then
amfpt = 0.529/(amfpi + gamma)/2.0
write(6,46) amfpt, e
endif
46 format(' total mean free path due to Im V and gamma: mfp ='
* ,f10.5,' angstrom at energy ', f10.5)
if(ne.eq.1.and.amfpt.eq.0.0.and.nks.eq.1) write(6,*)
& ' infinite mean free path for gamma: mfp = 0.0 and Im V = 0.0 '
write(6,44)
write(6,*) ' '
c
c.....calculate dipole cross section and atomic matrix elements
c
write(50,*)' ------------------------- '
write(50,*)' &&&&&&&&&&&&&&&&&&&&&&&&& '
write(50,*)' ------------------------- '
c
if (xasxpd) then
write(50,*) ' dipole atomic cross section'
else
write(50,*) ' dipole rexs matrix elements'
endif
c
sigmasum = 0.0
c
do 800 i=1,2
if((l0i.eq.0).and.(i.eq.1)) goto 800
np= l0i + (-1)**i
amem = dmx(i)
amem1 = dmx1(i)
pamel = amem1*cmplx(atm(nstart+np))*edfct
c write(50,*)'nr ', amem1*xe/pai/(l0i - 1 + i)
cofct(ne,i) = amem*cmplx(atm(nstart+np))**2*edfct*xe/pai
pamel0 = cofct(ne,i)/cmplx(atm(nstart+np))
sigma0 = -aimag(pamel)
sigmasum = sigmasum + sigma0
sigma0r = -aimag(pamel0)
rexsrme = dmx(i)*xe/pai/(l0i-1+i)
rexssme = dmx1(i)/(l0i-1+i)
c cofct(ne,i) = cofct(ne,i)/sigma0
c write(6,*) sigma0,sigma0r
if (calctype.eq.'xas') then
write(50,805) e,vcon,amfpt,sigma0,rexsrme,rexssme
else
write(50,806) e,vcon,amfpt,rexsrme,rexssme
endif
c
if(i.eq.2) write(98,*) e*13.6, sigma0
800 continue
c
do i=1,2
cofct(ne,i) = cofct(ne,i)/sigmasum
enddo
c
c.....calculate quadrupole atomic matrix elements for cross section (temp)
c
if (xasxpd) then
write(50,*) ' quadrupole atomic cross section '
else
write(50,*) ' quadrupole rexs matrix elements '
endif
c
n = 0
sigmasum = 0.0
do 900 i=-2,2,2
n = n + 1
lf = l0i + i
if(lf.le.0) go to 900
np = l0i + i
amem = qmx(n)
amem1 = qmx1(n)
pamel = amem1*cmplx(atm(nstart+np))*edfctq
qcofct(ne,n) = amem*cmplx(atm(nstart+np))**2*edfctq*xe/pai
pamel0 = qcofct(ne,n)/cmplx(atm(nstart+np))
sigma0 = -aimag(pamel)
sigmasum = sigmasum + sigma0
sigma0r = -aimag(pamel0)
rexsrme = qmx(n)*xe/pai
rexssme = qmx1(n)
c qcofct(ne,i) = qcofct(ne,n)/sigma0
c write(6,*) sigma0,sigma0r
if (calctype.eq.'xas') then
write(50,805) e,vcon,amfpt,sigma0,rexsrme,rexssme
else
write(50,806) e,vcon,amfpt,rexsrme,rexssme
endif
900 continue
c
if (xasxpd) then
write(50,*)' ------------------------- '
write(50,*) ' dipole and quadrupole cross section with ',
& 'relativistic corrections of type: ', relc
write(50,*)' ------------------------- '
else
write(50,*)' ------------------------- '
write(50,*) ' dipole and quadrupole rexs matrix elements',
& ' with relativistic corrections of type: ', relc
write(50,*)' ------------------------- '
endif
c
c
if (xasxpd) then
write(50,*) ' dipole atomic cross section with rel. corr.s'
else
write(50,*) ' dipole rexs matrix elements with rel. corr.s'
endif
c
sigmasum = 0.0
c
do 910 i=1,2
if((l0i.eq.0).and.(i.eq.1)) goto 910
np= l0i + (-1)**i
amem = dmxx(i)
amem1 = dmxx1(i)
if(relc.eq.'nr') then
atmd = atmnr(nstart+np)
else if (relc.eq.'sr') then
atmd = atmsr(nstart+np)
else
atmd = atmsop(nstart+np)
endif
pamel = amem1*atmd*edfct
c write(50,*)'nr-rc ', amem1*xe/pai/(l0i - 1 + i)
cofct(ne,i) = amem*atmd**2*edfct*xe/pai
pamel0 = cofct(ne,i)/atmd
sigma0 = -aimag(pamel)
sigmasum = sigmasum + sigma0
sigma0r = -aimag(pamel0)
rexsrme = dmxx(i)*xe/pai/(l0i-1+i)
rexssme = dmxx1(i)/(l0i-1+i)
c cofct(ne,i) = cofct(ne,i)/sigma0
c write(6,*) sigma0,sigma0r
if (calctype.eq.'xas') then
write(50,805) e,vcon,amfpt,sigma0,rexsrme,rexssme
else
write(50,806) e,vcon,amfpt,rexsrme,rexssme
endif
c
if(i.eq.2) write(99,*) e*13.6, sigma0
910 continue
c
do i=1,2
cofct(ne,i) = cofct(ne,i)/sigmasum
enddo
c
c.....calculate quadrupole atomic matrix elements for cross section (temp)
c
if (xasxpd) then
write(50,*) ' quadrupole atomic cross section with rel. corr.s'
else
write(50,*) ' quadrupole rexs matrix elements with rel. corr.s'
endif
c
n = 0
sigmasum = 0.0
do 920 i=-2,2,2
n = n + 1
lf = l0i + i
if(lf.le.0) go to 920
np = l0i + i
amem = qmxx(n)
amem1 = qmxx1(n)
if(relc.eq.'nr') then
atmd = atmnr(nstart+np)
else if (relc.eq.'sr') then
atmd = atmsr(nstart+np)
else
atmd = atmsop(nstart+np)
endif
pamel = amem1*atmd*edfctq
qcofct(ne,n) = amem*atmd**2*edfctq*xe/pai
pamel0 = qcofct(ne,n)/atmd
sigma0 = -aimag(pamel)
sigmasum = sigmasum + sigma0
sigma0r = -aimag(pamel0)
rexsrme = qmxx(n)*xe/pai
rexssme = qmxx1(n)
c qcofct(ne,i) = qcofct(ne,n)/sigma0
c write(6,*) sigma0,sigma0r
if (calctype.eq.'xas') then
write(50,805) e,vcon,amfpt,sigma0,rexsrme,rexssme
else
write(50,806) e,vcon,amfpt,rexsrme,rexssme
endif
c
920 continue
c
if(relc.eq.'so') then
c
if (xasxpd) then
write(50,*)' dipole atomic cross section for second so component'
else
write(50,*)' dipole rexs matrix elements for second so component'
endif
c
do 930 i=1,2
if((l0i.eq.0).and.(i.eq.1)) goto 930
np= l0i + (-1)**i
amem = dmxxa(i)
amem1 = dmxxa1(i)
atmd = atmsoa(nstart+np)
pamel = amem1*atmd*edfct
cofct(ne,i) = amem*atmd**2*edfct*xe/pai
pamel0 = cofct(ne,i)/atmd
sigma0 = -aimag(pamel)
sigmasum = sigmasum + sigma0
sigma0r = -aimag(pamel0)
rexsrme = dmxxa(i)*xe/pai/(l0i-1+i)
rexssme = dmxxa1(i)/(l0i-1+i)
c cofct(ne,i) = cofct(ne,i)/sigma0
c write(6,*) sigma0,sigma0r
if (calctype.eq.'xas') then
write(50,805) e,vcon,amfpt,sigma0,rexsrme,rexssme
else
write(50,806) e,vcon,amfpt,rexsrme,rexssme
endif
c
930 continue
c
do i=1,2
cofct(ne,i) = cofct(ne,i)/sigmasum
enddo
c
c.....calculate quadrupole atomic matrix elements for cross section (temp)
c
if (xasxpd) then
write(50,*)'quadrupole atomic cross section for second so ',
& 'component'
else
write(50,*)'quadrupole rexs matrix elements for second so ',
& 'component'
endif
c
n = 0
sigmasum = 0.0
do 940 i=-2,2,2
n = n + 1
lf = l0i + i
if(lf.le.0) go to 940
np = l0i + i
amem = qmxxa(n)
amem1 = qmxxa1(n)
atmd = atmsoa(nstart+np)
pamel = amem1*atmd*edfctq
qcofct(ne,n) = amem*atmd**2*edfctq*xe/pai
pamel0 = qcofct(ne,n)/atmd
sigma0 = -aimag(pamel)
sigmasum = sigmasum + sigma0
sigma0r = -aimag(pamel0)
rexsrme = qmxxa(n)*xe/pai
rexssme = qmxxa1(n)
c qcofct(ne,i) = qcofct(ne,n)/sigma0
c write(6,*) sigma0,sigma0r
if (calctype.eq.'xas') then
write(50,805) e,vcon,amfpt,sigma0,rexsrme,rexssme
else
write(50,806) e,vcon,amfpt,rexsrme,rexssme
endif
c
940 continue
c
endif
C
C Writing the radial integrals in unit 55
C eliminated division of dmx (qmx) by nfis: 29-3-2013 due to reorganization
C of normalization of initial core state
C
if(l0i.eq.0) then
C
c write(55,860) 0.0,0.0,
c 1 csqrt(dmx(2)*xe/pai),
c 2 0.0,0.0,
c 3 0.0,0.0,
c 4 csqrt(qmx(3)*xe/pai)
C
elseif(l0i.eq.1) then
C
c write(55,860) csqrt(dmx(1)*xe/pai/l0i),
c 1 csqrt(dmx(2)*xe/pai/(l0i+1)),
c 2 0.0,0.0,
c 3 csqrt(qmx(2)*xe/pai),
c 4 csqrt(qmx(3)*xe/pai)
C
else
C
c write(55,860) csqrt(dmx(1)*xe/pai/l0i),
c 1 csqrt(dmx(2)*xe/pai/(l0i+1)),
c 2 csqrt(qmx(1)*xe/pai),
c 3 csqrt(qmx(2)*xe/pai),
c 4 csqrt(qmx(3)*xe/pai)
C
endif
C
if(calctype.eq.'xpd'.or.calctype.eq.'xas'.or.
1 calctype.eq.'rex') then
if(l0i.eq.0) then
C
write(55,860) 0.0,0.0,
1 csqrt(dmxx(2)*xe/pai),
2 0.0,0.0,
3 0.0,0.0,
4 csqrt(qmxx(3)*xe/pai),reg_type
C
elseif(l0i.eq.1) then
C
write(55,860) csqrt(dmxx(1)*xe/pai/l0i),
1 csqrt(dmxx(2)*xe/pai/(l0i+1)),
2 0.0,0.0,
3 csqrt(qmxx(2)*xe/pai),
4 csqrt(qmxx(3)*xe/pai),reg_type
C
else
C
write(55,860) csqrt(dmxx(1)*xe/pai/l0i),
1 csqrt(dmxx(2)*xe/pai/(l0i+1)),
2 csqrt(qmxx(1)*xe/pai),
3 csqrt(qmxx(2)*xe/pai),
4 csqrt(qmxx(3)*xe/pai),reg_type
C
endif
c
if(relc.eq.'so') then
write(55,*) ' second component of so matrix element '
C
if(l0i.eq.0) then
C
write(55,860) 0.0,0.0,
1 csqrt(dmxxa(2)*xe/pai),
2 0.0,0.0,
3 0.0,0.0,
4 csqrt(qmxxa(3)*xe/pai)
C
elseif(l0i.eq.1) then
C
write(55,860) csqrt(dmxxa(1)*xe/pai/l0i),
1 csqrt(dmxxa(2)*xe/pai/(l0i+1)),
2 0.0,0.0,
3 csqrt(qmxxa(2)*xe/pai),
4 csqrt(qmxxa(3)*xe/pai)
C
else
C
write(55,860) csqrt(dmxxa(1)*xe/pai/l0i),
1 csqrt(dmxxa(2)*xe/pai/(l0i+1)),
2 csqrt(qmxxa(1)*xe/pai),
3 csqrt(qmxxa(2)*xe/pai),
4 csqrt(qmxxa(3)*xe/pai)
C
endif
c
endif
c
if(calctype.ne.'xpd') then
if(l0i.eq.0) then
c write(55,*) '========dq irregular me: hs mesh==============='
C
c write(55,860) 0.0,0.0,
c 1 dmx1(2)/(l0i+1),
c 2 qmx1(1),
c 3 qmx1(2),
c 4 qmx1(3)
C
c write(55,*) '========dq irregular me: ll mesh==============='
C
write(55,860) 0.0,0.0,
1 dmxx1(2)/(l0i+1),
2 qmxx1(1),
3 qmxx1(2),
4 qmxx1(3),irr_type
else
c write(55,*) '========dq irregular me: hs mesh==============='
C
c write(55,860) dmx1(1)/l0i,
c 1 dmx1(2)/(l0i+1),
c 2 qmx1(1),
c 3 qmx1(2),
c 4 qmx1(3)
C
c write(55,*) '========dq irregular me: ll mesh==============='
C
write(55,860) dmxx1(1)/l0i,
1 dmxx1(2)/(l0i+1),
2 qmxx1(1),
3 qmxx1(2),
4 qmxx1(3),irr_type
endif
endif
endif
C
c
c 810 format(29x,2f8.5,4x,2f8.5)
c
doit = .false.
c
9 continue !end energy loop
c
write(iedl0) ((cofct(ne,i),ne=1,kxe),i=1,2)
c
else !perform eels or e2e calculation
c
write(6,*)' calculating eels radial matrix elements'
write(6,*)' n. of prototypical atoms in the effective cluster',
& ' chosen for eels (e2e) radial matrix elements',neff
write(6,*) ' '
write(6,*) ' '
c
c
write(55,821)
write(55,822) spectro,correction
write(55,821)
c
c
c write(55,815)
c
c 815 format(2x,'single and two-site eels (e2e) radial matrix elements')
c
do ne = 1, kxe
deltae = float(ne-1)*de
write(6,*) ' ---> start of calculation of eels (e2e) rme at',
1 ' energy point ',ne
c
c nks: loop on the 3 electrons involved:
c = 1 : incoming electron
c = 2 : scattered electron
c = 3 : excited electron
c
do 10 nks = 1, 3
if(expmode.eq.'cis') then
if(nks.eq.1) e = einc
if(nks.eq.2) e = einc - cip - emin - deltae
if(nks.eq.3) e = emin + deltae
elseif(expmode.eq.'cfs') then
if(nks.eq.1) e = esct + cip + emin + deltae
if(nks.eq.2) e = esct
if(nks.eq.3) e = emin + deltae
elseif(expmode.eq.'cel') then
if(nks.eq.1) e = einc + deltae
if(nks.eq.2) e = einc - cip - emin + deltae
if(nks.eq.3) e = emin
endif
c
ev=e-vcon
c
if(nks.eq.1) write(6,*)' einc =',e,' Ryd'
if(nks.eq.2) write(6,*)' esct =',e,' Ryd'
if(nks.eq.3) write(6,*)' eloss =',e,' Ryd',
1 ' (excluding the ion. pot.)'
c
c calculate energy dependent potential:
c
if( irho .ne. 0 ) then
if(ne.eq.1) write(6,*) ' irho =', irho,
& ' entering vxc to calculate energy',
& ' dependent exchange'
call vxc ( doit )
else
if(ne.eq.1.and.nks.eq.1) then
write(6,*) ' irho =', irho, ' energy independent',
1 ' potential'
write(6,*)' constant interstitial potential vcon =',
1 vcon
endif
endif
ev=e-vcon
if( irho .ne. 0 )
& write(6,*) ' energy dependent vcon = ', vcon,
1 ' at energy', e,' Ryd'
C
C CONSTRUCT RELATIVISTIC POTENTIAL ON LINEAR-LOG MESH
C
CALL VREL
C
xe=csqrt(ev)
c
c.....write out potential ans rs files for first neighbors to
c.....absorber for the first energy point
c
nunit=40
nunit1=nunit+1
open(unit=nunit,file='plot/plot_v(e).dat',status='unknown')
open(unit=nunit1,file='plot/plot_rs.dat',status='unknown')
c
if(ne.eq.1) then
c
do i=1,nbrs
c
j = ntnabs1(i)
c write(6,*) j, nsymbl(j), distin(j)
write(nunit,100) 'atom ',nsymbl(j), 'dist =',distin(j),
& ' coord = ', xv(j), yv(j), zv(j)
write(nunit1,100) 'atom ',nsymbl(j), 'dist =',distin(j),
& ' coord ', xv(j), yv(j), zv(j)
do k=1,kmax(j)
write(nunit,*) r(k,j), real(v(k,j))
write(nunit1,*) r(k,j), rhotot(k,j)
enddo
c close(nunit)
c close(nunit1)
c nunit=nunit+2
c nunit1=nunit1+2
enddo
c
endif
c
close(nunit)
close(nunit1)
c
c calculate maximum l-value lmxne(n,ne) for each prototipical atom
c at the energy e=es(ne)
c
if(lmax_mode.eq.2) then
do n=1,nuatom
lmxne(n,ne) = nint(sqrt(e)*rs(n))+2
lmxels(nks,n) = lmxne(n,ne)
if(lmxne(n,ne).lt.l0i+1) lmxne(n,ne)=l0i+2
write(6,*) nks, n, e, rs(n), lmxne(n,ne)
enddo
endif
c
NBL1=NUATOM/4
XNBL1=FLOAT(NBL1)+0.0001
XNBL2=FLOAT(NUATOM)/4.
IF(XNBL1.LT.XNBL2) NBL1=NBL1+1
c 112 FORMAT(4(7X,I2))
if (lmax_mode.eq.2) then
DO JL=1,NBL1
JLN=4*(JL-1)+1
write(35,112) lmxne(jln,ne),lmxne(jln+1,ne),
& lmxne(jln+2,ne),lmxne(jln+3,ne)
write(95,112) lmxne(jln,ne),lmxne(jln+1,ne),
& lmxne(jln+2,ne),lmxne(jln+3,ne)
write(70,112) lmxne(jln,ne),lmxne(jln+1,ne),
& lmxne(jln+2,ne),lmxne(jln+3,ne)
write(80,112) lmxne(jln,ne),lmxne(jln+1,ne),
& lmxne(jln+2,ne),lmxne(jln+3,ne)
write(90,112) lmxne(jln,ne),lmxne(jln+1,ne),
& lmxne(jln+2,ne),lmxne(jln+3,ne)
ENDDO
else if (lmax_mode.eq.1) then
DO JL=1,NBL1
JLN=4*(JL-1)+1
write(35,112) lmax2(jln),lmax2(jln+1),
& lmax2(jln+2),lmax2(jln+3)
write(95,112) lmax2(jln),lmax2(jln+1),
& lmax2(jln+2),lmax2(jln+3)
write(70,112) lmax2(jln),lmax2(jln+1),
& lmax2(jln+2),lmax2(jln+3)
write(80,112) lmax2(jln),lmax2(jln+1),
& lmax2(jln+2),lmax2(jln+3)
write(90,112) lmax2(jln),lmax2(jln+1),
& lmax2(jln+2),lmax2(jln+3)
ENDDO
else
DO JL=1,NBL1
JLN=4*(JL-1)+1
write(35,112) lmaxt,lmaxt,lmaxt,lmaxt
write(95,112) lmaxt,lmaxt,lmaxt,lmaxt
write(70,112) lmaxt,lmaxt,lmaxt,lmaxt
write(80,112) lmaxt,lmaxt,lmaxt,lmaxt
write(90,112) lmaxt,lmaxt,lmaxt,lmaxt
ENDDO
endif
c
c
c calculate atomic t-matrix with relativistic corrections
c
call smtxllm(ne,lmax_mode,relc,nks,px,px0,ppx,pax,
& ramfnr,ramfsr,ramfsop,ramfsoa)
c
if(eikappr.eq.'yes') then
write(6,*) ' '
write(6,*) ' calculating phases in the eikonal approximation'
call eikonal(nuatom,xe,z,rs,db)
endif
c
c and corresponding radial integrals of transition matrix elements:
c
if(nks.eq.3) then
write(55,823) ne ! energy point
call radialx_eels(neff)
call writeelswf
endif
c
c
doit = .false.
c
10 continue !end loop for eels
c
write(6,*) ' ---> end of calculation of eels (e2e) rme',
1 ' at energy point ',ne
write(6,*) ' '
c
enddo !end energy do loop
c
c
endif !end of if clause beginning at line 5606
c
c
801 format(1x,f10.5,2x,2f10.5,2x,f10.5,2x,f10.5,2x,2f10.5)
805 format(1x,f10.5,2x,2f10.5,2x,f10.5,2x,f10.5,2x,2e15.6,2x,2e15.6)
806 format(1x,f10.5,2x,2f10.5,2x,f10.5,2x,2e15.6,2x,2e15.6)
810 FORMAT(29X,F8.5,1X,F8.5,4X,F8.5,1X,F8.5)
820 FORMAT(29X,f8.5,1X,f8.5,4X,f8.5,1X,f8.5,4X,f8.5,1X,f8.5)
821 FORMAT(138('-'))
822 FORMAT(35x,'matrix elements of ',a4,' with corrections of type: ',
1 a20)
823 FORMAT(50x,'---> energy point number ',i5,' <---')
830 FORMAT(' electric dipole radial integrals +',
1 ' electric quadrupole radial ',
2 'integrals')
840 FORMAT('------------------------------------------------------',
1 '-+----------------------------------------------------',
2 '------------------------------')
850 FORMAT(' R(li --> li - 1) R(li --> li + 1) +',
1 ' R(li --> li - 2) R(li --> li) ',
2 ' R(li --> li + 2)')
860 FORMAT(1X,e12.5,1X,e12.5,2X,e12.5,1X,e12.5,4X,e12.5,1X,e12.5,
1 2X,e12.5,1X,e12.5,2X,e12.5,1X,e12.5,4x,a9)
c
c ######### the auger matrix elements are written in the output file
c radaed.dat directly from the subroutine radial, since they m
c for each interaction momentum lk
c
return
c
end
c
c
c
subroutine output_cont(iq)
c include 'mscalc.inc'
include 'msxas3.inc'
integer at_,d_,rd_,sd_
parameter (at_=nat_-1,d_=ua_-1,rd_=440,sd_=ua_-1)
c
c modified output subroutine for complex potentials
c
common /dens/ irho,rhotot(rd_,sd_),rhoint(2),
$ vcoul(rd_,sd_),vcoulint(2)
c
common /fcnr/kxe, h(d_),vcons(2),r(rd_,d_),v(2,rd_,sd_),
$ ichg(10,d_),kplace(at_),kmax(at_)
complex vcons
c
common /flag/ inmsh,inv,inrho,insym,iovrho,iosym,
1 imvhl,nedhlp
c
character*8 name0 ,nsymbl
common/param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex ev,xe,vcon
c
c
character*4 label(2)
logical pott,rhoo
data label/'down',' up '/
c
pott=(irho .ne. 1)
rhoo=(irho .ne. 0)
c
write (6,5) iovrho
5 format(1x,' starting potentials and/or charge densities',
x ' written to file',i3)
ctn if(radion.ne.0.0. and . nout.eq.1) write(6,10) radion,qion
15 format(7x,'constant potential=(',1pe14.6,' , ',1pe14.6,')')
20 format(7x,'interstitial charge=',1pe14.6)
c
c
do 300 ispin=1,nspins
if(nspins.eq.2) write(6,25) label(ispin)
25 format(///40x,'spin ',a4,' potential')
if( pott ) write (iovrho,15) vcons(ispin)
if( rhoo ) write (iovrho,20) rhoint(ispin)
do 200 n=1,nat
if(neq(n).eq.0) goto 35
write(iovrho,30) n,neq(n)
30 format(' mesh and potential for',i4,' same as for',i4)
goto 200
35 write(iovrho,40) n,h(n),(ichg(i,n),i=1,10),kplace(n),exfact(n)
40 format(///i8,' h=',f10.4,' change points:',10i4,' kplace='
1 ,i4,' exchange=',f8.6)
kmaxn=kmax(n)
m=n+(ispin-1)*ndat
if( rhoo ) goto 55
write(iovrho,45)
45 format(72x/12x,4('r',11x,'real(v)',11x))
write(iovrho,50) (i,(r(i+j-1,n),v(1,i+j-1,m),j=1,4),i=1,kmaxn,4)
50 format(1x,i3,8e15.7)
goto 200
55 if( pott ) goto 65
write(iovrho,60)
60 format(72x/12x,4('r',13x,'rho',13x))
write(iovrho,50) (i,(r(i+j-1,n),rhotot(i+j-1,m),j=1,4),
x i=1,kmaxn,4)
goto 200
65 write(iovrho,70)
70 format(72x/27x,2('r',11x,'real(v)',10x,'rho',13x))
write(iovrho,75) (i,(r(i+j-1,n),v(1,i+j-1,m),rhotot(i+j-1,m),
x j=1,2),i=1,kmaxn,2)
75 format(16x,i3,6e15.7)
goto 200
c 80 if( rhoo ) goto 90
c write(iovrho,85)
c 85 format(72x/27x,2('r',11x,'real(v)',9x,'lcore',12x))
c write(iovrho,75) (i,(r(i+j-1,n),v(1,i+j-1,m),
c x j=1,2),i=1,kmaxn,2)
c goto 200
c 90 if( pott ) goto 100
c write(iovrho,95)
c 95 format(72x/27x,2('r',13x,'rho',11x,'lcore',12x))
c write(iovrho,75) (i,(r(i+j-1,n),rhotot(i+j-1,m),
c x j=1,2),i=1,kmaxn,2)
c goto 200
c 100 write(iovrho,105)
c 105 format(72x/27x,2('r',11x,'real(v)',10x,'rho',
c x 10x))
c write(iovrho,50) (i,(r(i+j-1,n),v(1,i+j-1,m),
c x rhotot(i+j-1,m),j=1,2),i=1,kmaxn,2)
200 continue
300 continue
c
c
return
c
end
c
c
subroutine radial(doit,imvhl)
c
c include 'mscalc.inc'
include 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
c
c.....this subroutine calculates the radial matrix elements d(i)
c.....(i=1,2) for lfin=l0i-1 (i=1) and lfin=l0i+1 (i=2) both for
c.....the regular (dmx) and irregular solution (dmx1)
c
common /fcnr/kxe, h(d_),vcons(2,2),r(rd_,d_),v(2,rd_,sd_),
$ ichg(10,d_),kplace(at_),kmax(at_)
c
common/mtxele/ nstart,nlast,dmx(2),dmx1(2),qmx(3),qmx1(3),
$ dxdir,dxexc,nfis,nfis1,nfis2
real nfis,nfis2,nfis1
complex dmx,dmx1,qmx,qmx1,dxdir,dxexc
c
c ######### I introduce a new common with the orbital momentum of
c ######### the two electrons which interacts and give rise to
c ######### to the auger decay; these two momentum are necessary
c ######### to do the loop over the interaction momentum when I perf
c the integrals
c
common/l2holes/l01i,l02i
integer l01i,l02i
character*8 name0 ,nsymbl
c
common/param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,ev,xe
c
common /pdq/ p(rd_,f_),ps(n_),dps(n_),ramf(n_),pss(6),dpss(6)
complex p,ps,dps,ramf,pss,dpss
c
c ########## common pdqi modified to include also the Auger two
c wavefunctions
common/pdqi/rpi(rd_),rpi1(rd_),rpi2(rd_)
c
common /state/ natom(n_),ln(n_),nleq(at_),
1 nns,nuatom,ndg,nls(at_),n0l(at_),n0(at_),
2 nterms(at_),lmaxn(at_),ndim,lmxne(at_,nep_)
c
c ######### common pottype modified to consider also the Auger calcu
c
common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1,
* i_absorber_hole2,i_norman,i_alpha,
1 i_outer_sphere,i_exc_pot,i_mode
common/auger/calctype,expmode,edge1,edge2
character*3 calctype, expmode
character*2 edge1,edge2
integer nct,l2hmin,l2hmax
data pai/3.1415927/
c
common /lparam/lmax2(nat_),l0i
c
c
c
dimension rid(rd_),rid0(rd_),riq0(rd_),cri(rd_),cri1(rd_)
dimension rid2(rd_),cri2(rd_)
complex rid,cri,cri1,dx,qx,dx1,dx2,dx3,dx4
c
logical*4 doit
c
integer nchannel,lkmaxdir1,lkmaxdir2,lkminexc2
integer lkmindir1,lkmindir2,lkmaxexc1,lkmaxexc2,lkminexc1
integer lamin,lamax,lkmin,lkmin1,lkmax,lkmax1,lkm,lkmn
c
c iout = 5
id=1
n = nas
c
c kx = kmax(n) ! value used in older versions (contains the 3 points
C outside the muffin-tin radius that were used for interpolation)
c
kx = kmax(n) - 3
c
c ################# Modified the subsequent "if" to take into account
c also the possibility to make an auger calcula
c
if(.not.doit) go to 21
c go to 20
c
c***********************************************************************
c find normalization factor for initial state: nfis
c***********************************************************************
c
c
c if (calctype.eq.'xpd') then
if (calctype.eq.'xpd'.or.calctype.eq.'xas'.or.
& calctype.eq.'rex') then
c n=nas
c kx=kmax(n)
do 156 k=1,kx
156 rid(k)=rpi(k)**2
call defint(rid,r(1,n),kx,ichg(1,n),dx,id)
nfis=sqrt(real(dx))
if(iout .eq. 5) write(6,*) (i, r(i,n), rpi(i)/nfis, i=1,kx)
WRITE(33,*) CIP
write(33,*) l0i
do i=1,kx
write(33,*) r(i,n), rpi(i)/(nfis*r(i,n))
enddo
nfis = nfis**2
else
c
c ######## normalization of primary core hole wave function
c
c n=nas
c kx=kmax(n)
do 1560 k=1,kx
1560 rid(k)=rpi(k)**2
c
call defint(rid,r(1,n),kx,ichg(1,n),dx,id)
c
nfis=sqrt(real(dx))
if(iout .eq. 5) write(6,*) (i, r(i,n), rpi(i)/nfis, i=1,kx)
c WRITE(33,*) CIP
c write(33,*) l0i
do i=1,kx
write(33,*) r(i,n), rpi(i)/(nfis*r(i,n))
enddo
c
c ######### Auger normalization
c
rid(k)=rpi1(k)**2
call defint(rid,r(1,n),kx,ichg(1,n),dx1,id)
rid(k)=rpi2(k)**2
call defint(rid,r(1,n),kx,ichg(1,n),dx2,id)
c
nfis1=sqrt(real(dx1))
nfis2=sqrt(real(dx2))
end if
c
c***********************************************************************
c note that for the initial state rpi(k) = r*pi(k)
c***********************************************************************
c
c ################ I introduce an if condition to take into account
c ################ also the possibility to make an Auger calculation
c
c 21 if(calctype.eq.'xpd') then
21 if (calctype.eq.'xpd'.or.calctype.eq.'xas'.or.
& calctype.eq.'rex') then
C
do 30 k=1,kx
rid0(k) = r(k,n)**2*rpi(k)
30 riq0(k) = r(k,n)*rid0(k)
c
c.....calculate regular and irregular dipole matrix elements
c
do 100 i=1,2
dmx(i)=(0.,0.)
dmx1(i)=(0.,0.)
if((l0i.eq.0).and.(i.eq.1))goto 100
np = l0i + (-1)**i
do 110 k=1,kx
110 rid(k) = rid0(k)*p(k,np+1)
call cintegr(rid,r(1,n),kx,ichg(1,n),cri,id)
dmx(i) = (cri(kx)/ramf(nstart+np))**2*(l0i-1+i)/nfis
do 120 k=1,kx
120 rid(k) = rid0(k)*p(k,np+1+npss)
call cintegr(rid,r(1,n),kx,ichg(1,n),cri1,id)
do 130 k=1,kx
130 rid(k) = rid(k)*cri(k)
call defint(rid,r(1,n),kx,ichg(1,n),dx,id)
do 140 k=1,kx
140 rid(k) = rid0(k)*p(k,np+1)*(cri1(kx)-cri1(k))
call defint(rid,r(1,n),kx,ichg(1,n),dx1,id)
dmx1(i) = (dx+dx1)*(l0i-1+i)/ramf(nstart+np)/nfis
100 continue
C
c write(6,*) 'radial matrix elements from shell li = ', l0i
c write(6,*) (real(dmx(l)),aimag(dmx(l)),l=1,2)
c write(6,*) (real(dmx1(l)),aimag(dmx1(l)),l=1,2)
c.....calculate regular and irregular quadrupole matrix elements
c
m = 0
do 10 i=-2,2,2
m = m + 1
qmx(m)=(0.,0.)
qmx1(m)=(0.,0.)
lf = l0i + i
if(lf.le.0) go to 10
np = l0i + i
do 11 k=1,kx
11 rid(k) = riq0(k)*p(k,np+1)
call cintegr(rid,r(1,n),kx,ichg(1,n),cri,id)
qmx(m) = (cri(kx)/ramf(nstart+np))**2/nfis
do 12 k=1,kx
12 rid(k) = riq0(k)*p(k,np+1+npss)
call cintegr(rid,r(1,n),kx,ichg(1,n),cri1,id)
do 13 k=1,kx
13 rid(k) = rid(k)*cri(k)
call defint(rid,r(1,n),kx,ichg(1,n),dx,id)
do 14 k=1,kx
14 rid(k) = riq0(k)*p(k,np+1)*(cri1(kx)-cri1(k))
call defint(rid,r(1,n),kx,ichg(1,n),dx1,id)
qmx1(m) = (dx+dx1)/ramf(nstart+np)/nfis
10 continue
C
else
c
c ######## start the auger part; first write
c ######## the orbital momentum of the electrons involved
c
write(55,8110)l0i,l01i,l02i
8110 format(5x,i2,5x,i2,5x,i2)
c
c ######### Start calculation of auger matrix elements
C ######### rpi is the wavefunction of the primary core hole
C ######### rpi1 and rpi2 are the wavefunction for the two holes in t
c ######### nchannel is the number of channels allowed for
c ######### the Auger continuum electron;
c ######### l2h is the orbital angular momentum given by the coupling
c ######### two orbital momentum of the two final holes
c ######### lk is the 'angular momentum' of the interaction-transferr
c ######### here we count the u_er and lower bound for l of the cont
c
l2hmin=abs(l01i-l02i)
l2hmax=l01i+l02i
lamin=abs(l0i-l2hmin)
lamax=l0i+l2hmax
c
c here we count the number of the channels for the continuum auger e
c
nchannel=0
do 101 np=lamin,lamax
nchannel=nchannel+1
101 continue
write(55,8120) lamin,nchannel
8120 format(12x,i2,5x,i2)
c
c loop over the number of continuum channels
c
nct=0
do 1 i=1,nchannel
np=lamin+(i-1)
c
c ###### establish the range for the interaction momentum for
c ###### the direct integral
c ###### from the selection rules we have:
c ###### abs(np-l01i)<lk<np+l01i and abs(l0i-l02i)<lk<l0i+l02i
c ###### and moreover lk must run with a step of 2
c
lkmaxdir1=np+l01i
lkmaxdir2=l0i+l02i
lkmindir1=abs(np-l01i)
lkmindir2=abs(l0i-l02i)
lkmax=min(lkmaxdir1,lkmaxdir2)
lkmin=max(lkmindir2,lkmindir1)
c
c ###### establish the range for the interaction momentum for
c ###### the exchange integral
c ###### from the selection rules we have:
c ###### abs(np-l02i)<lk<np+l02i and abs(l0i-l01i)<lk<l0i+l01i
c ###### and moreover lk must run with a step of 2
c
lkmaxexc1=np+l02i
lkmaxexc2=l0i+l01i
lkminexc1=abs(np-l02i)
lkminexc2=abs(l0i-l01i)
lkmax1=min(lkmaxexc1,lkmaxexc2)
lkmin1=max(lkminexc2,lkminexc1)
c
c ####### establish the bigger range for the interaction momentum be
c the range for the direct integral and the range for the
c exchange integral
c
lkm=max(lkmax,lkmax1)
lkmn=min(lkmin,lkmin1)
write(55,8119)' L =',np,' LB_MIN = ',lkmn,' LB_MAX = ',lkm
8119 format(a4,1x,i2,1x,a11,i2,a11,i2)
do 2 lk=lkmn,lkm
c
c ###### count the number of total channels, below this number is st
c in the file nchannels.dat
c
nct=nct+1
c
c ###### initialize the integrals
c
dxdir=(0.,0.)
dxexc=(0.,0.)
c
c ###### calculation of the direct integral; if selection rules are
c satisfied then the integral is set equal to zero
c
lsum1=np+lk+l01i
lsum2=l0i+lk+l02i
if((lk.lt.lkmin).or.(lk.gt.lkmax).or.
* ((lsum1/2)*2.ne.lsum1).or.((lsum2/2)*2.ne.lsum2)) then
dxdir=(0.,0.)
else
do 1020 k=1,kx
1020 rid(k)=r(k,n)*rpi1(k)*p(k,np+1)*(r(k,n)**lk)
c
call cintegr(rid,r(1,n),kx,ichg(1,n),cri,id)
c
do 1030 k=1,kx
1030 rid(k)=rpi(k)*rpi2(k)*cri(k)/(r(k,n)**(lk+1))
call defint(rid,r(1,n),kx,ichg(1,n),dx,id)
c
c ####### now the other region where r'>r
c
do 1040 k=1,kx
1040 rid2(k)=rpi(k)*rpi2(k)*(r(k,n)**lk)
call integr(rid2,r(1,n),kx,ichg(1,n),cri2,id)
do 1050 k=1,kx
1050 rid(k)=r(k,n)*rpi1(k)*p(k,np+1)*cri2(k)/(r(k,n)**(lk+1))
call defint(rid,r(1,n),kx,ichg(1,n),dx1,id)
dxdir=(dx+dx1)*2*
* sqrt(xe/pai)/(nfis*nfis1*nfis2*ramf(nstart+np))
end if
c
c ###### now the exchange integral
c
lsum3=np+lk+l02i
lsum4=l0i+lk+l01i
if((lk.lt.lkmin1).or.(lk.gt.lkmax1).or.
* (((lsum3/2)*2).ne.lsum3).or.(((lsum4/2)*2).ne.lsum4)) then
dxexc=(0.,0.)
else
do 1060 k=1,kx
1060 rid(k)=r(k,n)*rpi1(k)*p(k,np+1)*(r(k,n)**lk)
call cintegr (rid,r(1,n),kx,ichg(1,n),cri,id)
do 1070 k=1,kx
1070 rid(k)=rpi(k)*rpi1(k)*cri(k)/(r(k,n)**(lk+1))
call defint(rid,r(1,n),kx,ichg(1,n),dx3,id)
c
c ####### now the other region where r'>r
c
do 1788 k=1,kx
1788 rid2(k)=rpi(k)*rpi1(k)*(r(k,n)**lk)
call integr(rid2,r(1,n),kx,ichg(1,n),cri2,id)
do 1799 k=1,kx
1799 rid(k)=r(k,n)*rpi2(k)*p(k,np+1)*cri2(k)/(r(k,n)**(lk+1))
call defint(rid,r(1,n),kx,ichg(1,n),dx4,id)
dxexc=(dx3+dx4)*2*
* sqrt(xe/pai)/(nfis1*nfis2*nfis*ramf(nstart+np))
end if
c
c ############## Write the auger matrix elements
c
c write(55,8111) 'L =',np,'LB =',lk,dxdir,dxexc
c8111 format(2x,a3,i2,4x,a4,3x,i2,8x,f8.5,1x,f8.5,4x,f8.5,1x,f8.5)
write(55,8111) 'LB =',lk,dxdir,dxexc
8111 format(12x,a4,3x,i2,8x,f8.5,1x,f8.5,4x,f8.5,1x,f8.5)
2 continue
1 continue
c write(55,*) 'nct=',nct
end if
return
end
c
subroutine radialx_eels(neff)
c
include 'msxas3.inc'
c
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
C
c.....this subroutine calculates the radial matrix elements
c.....necessary for eels cross-section
c.....using a linear-log mesh
c
common/mtxele/ nstart,nlast
c
common/mtxelex/ dmxx(2),dmxx1(2),dmxxa(2),dmxxa1(2),
& qmxx(3),qmxx1(3),qmxxa(3),qmxxa1(3),
& dxxdir,dxxexc
complex dmxx,dmxx1,dmxxa,dmxxa1,qmxx,qmxx1,qmxxa,qmxxa1,
& dxxdir,dxxexc
c
common/param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,ev,xe
character*8 nsymbl,name0
c
common/bessel/sbf(ltot_),dsbf(ltot_),shf(ltot_),dshf(ltot_)
complex*16 sbf,dsbf,shf,dshf
C
COMMON /LLM/ ALPHA, BETA
C
COMMON /FCNRLM/X(RDX_,D_), RX(RDX_,D_), HX(D_), VX(RDX_,SD_),
& VXR(RDX_,SD_), DVX(RDX_,SD_), BX(RDX_,SD_),
& VXSO(RDX_,SD_), KMX(AT_), KPLX(AT_)
COMPLEX VX, VXR, DVX, BX, VXSO
C
C COMMON /PDQX/ PX(RDX_,F_),DPX(RDX_,F_),PSX(F_),DPSX(F_),RAMFX(N_)
C COMPLEX PX,DPX,PSX,DPSX,RAMFX
c
COMMON /PDQX/PX(RDX_,F_), PX0(RDX_,F_), PPX(RDX_,F_),
& PAX(RDX_,F_), RAMFNR(N_), RAMFSR(N_), RAMFSOP(N_),
& RAMFSOA(N_)
COMPLEX PX, PX0, PPX, PAX, RAMFNR, RAMFSR, RAMFSOP, RAMFSOA
c
C
COMMON/PDQIX/RPIX(RDX_), FNISX
COMPLEX RPIX
C
common /state/ natom(n_),ln(n_),nleq(at_),
1 nns,nuatom,ndg,nls(at_),n0l(at_),n0(at_),
2 nterms(at_),lmaxn(at_),ndim,lmxne(at_,nep_)
C
c ######### common pottype modified to consider also the Auger calcu
c
common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1,
* i_absorber_hole2,i_norman,i_alpha,
1 i_outer_sphere,i_exc_pot,i_mode
c
common/auger/calctype,expmode,edge1,edge2
c
common/eels/einc,esct,scangl,qt,lambda,eelsme(npss,npss,npss),
& p1(rdx_,npss,nef_),p2(rdx_,npss,nef_),
& p3(rdx_,npss,nef_),ramfsr1(npss,nef_),
& ramfsr2(npss,nef_),ramfsr3(npss,nef_),
& lmxels(3,ua_),p3irreg(rdx_,7),p2irreg(rdx_,7)
complex eelsme,p1,p2,p3,ramfsr1,ramfsr2,ramfsr3,ramfprd,ramfprx,
& p3irreg,p2irreg,trop1(rdx_)
complex*16 trop(rdx_)
real*4 einc,esct,scangl,qt,lambda
complex qtc, arg, ydf, scprod
c
common/msbhf/ il(rdx_,lexp_,d_), kl(rdx_,lexp_,d_), kappa
double precision kappa, il, kl
c
character*3 calctype, expmode, eikappr
character*2 edge1,edge2
C
common /lparam/lmax2(nat_),l0i
c
DIMENSION RID(RDX_),CRI(RDX_),CRI1(RDX_)
DIMENSION RID1(RDX_),RID2(RDX_),RID3(RDX_),RID4(RDX_)
COMPLEX RID,RID1,RID2,RID3,RID4
COMPLEX VC,VCX,VCD,VCDX,VCDR,VCDXR
C
CHARACTER*2 RELC
C
C
c***************************************************************************
c note that here rpix(k) = r**3*pi(k).
c wf rpix(k) is already normalized
c (see subroutine corewf)
c***************************************************************************
c
pi = 3.1415926
c
id = 1
na = nas
c
c.....calculate direct and exchange Coulomb integral on absorber and different
c.....spheres
c
nt0a=n0(na)
ntxa=nt0a+nterms(na)-1
dxa = hx(na)
nstart = nt0a
nlast = ntxa
c write(6,*) 'in radialx_eels', nt0a, ntxa
c
write(6,*) ' '
write(6,*)' writing eels (e2e) regular direct terms'
write(55,100)
write(55,821)
c
do 20 n1 = nt0a, ntxa
l=ln(n1)
if(l.gt.lmxels(3,na)) goto 20
do k = 1, kmx(na)
rid1(k) = rpix(k)*p3(k,l+1,na)/(alpha*rx(k,na) + beta)
enddo
c
do 30 nat2 = 1, neff
nb = nat2
if(neq(nat2).ne.0) nb = neq(nat2)
nt0b=n0(nb)
ntxb=nt0b+nterms(nb)-1
dxb = hx(nb)
do 40 n2 = nt0b, ntxb
lp = ln(n2)
if(lp.gt.lmxels(1,nb)) goto 40
do 50 n3 = nt0b, ntxb
ls = ln(n3)
if(ls.gt.lmxels(2,nb)) goto 50
do k = 1, kmx(nb)
rid2(k) = p1(k,lp+1,nb)*p2(k,ls+1,nb)*rx(k,nb)**3
& /(alpha*rx(k,nb) + beta)
enddo
c
ramfprd = ramfsr3(l+1,na)*ramfsr1(lp+1,nb)*ramfsr2(ls+1,nb)
lc_min=max(abs(l-l0i), abs(lp-ls))
lc_max=min(l+l0i, lp+ls)
c
if(na.eq.nb) then
do lc = lc_min, lc_max, 2
l1 = lc + 1
if(l1.gt.lexp_) cycle
call coulss(rid1,rid2,il(1,l1,na),
& kl(1,l1,na),kmx(na),dxa,pi,vc)
write(55,10) na, l, lp, ls, lc, vc/ramfprd !, vc
enddo
endif
c
50 continue
c
40 continue
c
30 continue
20 continue
c
write(55,821)
write(55,104)
write(55,821)
c
do 120 n1 = nt0a, ntxa
l=ln(n1)
if(l.gt.lmxels(3,na)) goto 120
do k = 1, kmx(na)
rid1(k) = rpix(k)*p3(k,l+1,na)/(alpha*rx(k,na) + beta)
enddo
c
do 130 nat2 = 1, neff
nb = nat2
if(neq(nat2).ne.0) nb = neq(nat2)
nt0b=n0(nb)
ntxb=nt0b+nterms(nb)-1
dxb = hx(nb)
do 140 n2 = nt0b, ntxb
lp = ln(n2)
if(lp.gt.lmxels(1,nb)) goto 140
do 150 n3 = nt0b, ntxb
ls = ln(n3)
if(ls.gt.lmxels(2,nb)) goto 150
do k = 1, kmx(nb)
rid2(k) = p1(k,lp+1,nb)*p2(k,ls+1,nb)*rx(k,nb)**3
& /(alpha*rx(k,nb) + beta)
enddo
c
ramfprd = ramfsr3(l+1,na)*ramfsr1(lp+1,nb)*ramfsr2(ls+1,nb)
lc_min=max(abs(l-l0i), abs(lp-ls))
lc_max=min(l+l0i, lp+ls)
c
if(na.ne.nb) then
do lc=abs(l-l0i), l+l0i, 2
l1 = lc + 1
if(l1.gt.lexp_) cycle
do lcp=abs(lp-ls), lp+ls, 2
l1p = lcp + 1
if(l1p.gt.lexp_) cycle
call coulds(rid1,rid2,dxa,dxb,il(1,l1,na),
& il(1,l1p,nb),kmx(na),kmx(nb),pi,vcd)
vcdr = vcd/ramfprd
if(abs(vcdr).lt.1.e-9) cycle
write(55,11) na, nb, l, lp, ls, lc, lcp, vcdr
enddo
enddo
endif
c
150 continue
c
140 continue
c
130 continue
120 continue
c
write(6,*)' writing eels (e2e) regular exchange terms'
write(55,821)
write(55,102)
write(55,821)
c
do 21 n1 = nt0a, ntxa
l=ln(n1)
if(l.gt.lmxels(2,na)) goto 21
do k = 1, kmx(na)
rid3(k) = rpix(k)*p2(k,l+1,na)/(alpha*rx(k,na) + beta)
enddo
c
do 31 nat2 = 1, neff
nb = nat2
if(neq(nat2).ne.0) nb = neq(nat2)
nt0b=n0(nb)
ntxb=nt0b+nterms(nb)-1
dxb = hx(nb)
do 41 n2 = nt0b, ntxb
lp = ln(n2)
if(lp.gt.lmxels(1,nb)) goto 41
do 51 n3 = nt0b, ntxb
ls = ln(n3)
if(ls.gt.lmxels(3,nb)) goto 51
do k = 1, kmx(nb)
rid4(k) = p1(k,lp+1,nb)*p3(k,ls+1,nb)*rx(k,nb)**3
& /(alpha*rx(k,nb) + beta)
enddo
c
ramfprx = ramfsr3(ls+1,nb)*ramfsr1(lp+1,nb)*ramfsr2(l+1,na)
lc_min=max(abs(l-l0i), abs(lp-ls))
lc_max=min(l+l0i, lp+ls)
c
if(na.eq.nb) then
do lc = lc_min, lc_max, 2
l1 = lc + 1
if(l1.gt.lexp_) cycle
call coulss(rid3,rid4,il(1,l1,na),
& kl(1,l1,na),kmx(na),dxa,pi,vcx)
write(55,10) na, l, lp, ls, lc, vcx/ramfprx
enddo
endif
c
51 continue
c
41 continue
c
31 continue
21 continue
c
write(55,821)
write(55,106)
write(55,821)
C
do 121 n1 = nt0a, ntxa
l=ln(n1)
if(l.gt.lmxels(2,na)) goto 121
do k = 1, kmx(na)
rid3(k) = rpix(k)*p2(k,l+1,na)/(alpha*rx(k,na) + beta)
enddo
c
do 131 nat2 = 1, neff
nb = nat2
if(neq(nat2).ne.0) nb = neq(nat2)
nt0b=n0(nb)
ntxb=nt0b+nterms(nb)-1
dxb = hx(nb)
do 141 n2 = nt0b, ntxb
lp = ln(n2)
if(lp.gt.lmxels(1,nb)) goto 141
do 151 n3 = nt0b, ntxb
ls = ln(n3)
if(ls.gt.lmxels(3,nb)) goto 151
do k = 1, kmx(nb)
rid4(k) = p1(k,lp+1,nb)*p3(k,ls+1,nb)*rx(k,nb)**3
& /(alpha*rx(k,nb) + beta)
enddo
c
ramfprx = ramfsr3(ls+1,nb)*ramfsr1(lp+1,nb)*ramfsr2(l+1,na)
lc_min=max(abs(l-l0i), abs(lp-ls))
lc_max=min(l+l0i, lp+ls)
c
if(na.ne.nb) then
do lc=abs(l-l0i), l+l0i, 2
l1 = lc + 1
if(l1.gt.lexp_) cycle
do lcp=abs(lp-ls), lp+ls, 2
l1p = lcp + 1
if(l1p.gt.lexp_) cycle
call coulds(rid3,rid4,dxa,dxb,il(1,l1,na),
& il(1,l1p,nb),kmx(na),kmx(nb),pi,vcdx)
vcdxr = vcdx/ramfprx
if(abs(vcdxr).lt.1.e-9) cycle
write(55,11) na, nb, l, lp, ls, lc, lcp, vcdxr
enddo
enddo
endif
c
151 continue
c
141 continue
c
131 continue
121 continue
c
10 format(5i5,4e15.7)
11 format(7i5,4e15.7)
c
c write(6,*) alpha, beta
c
if(calctype.eq.'els') then
write(6,*) ' '
write(6,*)' writing eels irregular direct terms'
write(55,821)
write(55,101)
write(55,821)
c
do 22 n1 = nt0a, ntxa
l=ln(n1)
if(l.gt.lmxels(3,na)) goto 22
do k = 1, kmx(na)
rid1(k) = rpix(k)*p3(k,l+1,na)/(alpha*rx(k,na) + beta)
if(l.le.5) then
rid(k) = rpix(k)*p3irreg(k,l+1)/(alpha*rx(k,na) + beta)
else
rid(k) = (0.0,0.0)
endif
enddo
c
do 32 nat2 = 1, neff
nb = nat2
if(neq(nat2).ne.0) nb = neq(nat2)
nt0b=n0(nb)
ntxb=nt0b+nterms(nb)-1
dxb = hx(nb)
do 42 n2 = nt0b, ntxb
lp = ln(n2)
if(lp.gt.lmxels(1,nb)) goto 42
do 52 n3 = nt0b, ntxb
ls = ln(n3)
if(ls.gt.lmxels(2,nb)) goto 52
c
do k = 1, kmx(nb)
rid2(k) = p1(k,lp+1,nb)*p2(k,ls+1,nb)*rx(k,nb)**3
& /(alpha*rx(k,nb) + beta)
& /ramfsr1(lp+1,nb)/ramfsr2(ls+1,nb)
enddo
c
c ramfprd = ramfsr3(l+1,na)*ramfsr1(lp+1,nb)*ramfsr2(ls+1,nb)
c
lc_min=max(abs(l-l0i), abs(lp-ls))
lc_max=min(l+l0i, lp+ls)
c
if(na.eq.nb) then
do lc = lc_min, lc_max, 2
l1 = lc + 1
if(l1.gt.lexp_) cycle
call sstrop(rid2,il(1,l1,na),
& kl(1,l1,na),kmx(na),dxa,pi,trop)
do k = 1, kmx(na)
rid4(k) = rid1(k)*trop(k)
rid3(k) = rid(k)*trop(k)
enddo
call irregint1(rid3,rid4,kmx(na),dxa,vc)
if(abs(vc/ramfsr3(l+1,na)).lt.1.e-10) cycle
write(55,10) na, l, lp, ls, lc, vc/ramfsr3(l+1,na)
enddo
else
do lc=abs(l-l0i), l+l0i, 2
l1 = lc + 1
if(l1.gt.lexp_) cycle
do lcp=abs(lp-ls), lp+ls, 2
l1p = lcp + 1
if(l1p.gt.lexp_) cycle
call dstrop(rid2,dx2,il(1,l1,na),
& il(1,l1p,nb),kmx(na),kmx(nb),pi,trop1)
do k = 1, kmx(na)
rid4(k) = rid1(k)*trop1(k)
rid3(k) = rid(k)*trop1(k)
enddo
call irregint1(rid3,rid4,kmx(na),dxa,vcd)
vcdr = vcd/ramfsr3(l+1,na)
if(abs(vcdr).lt.1.e-10) cycle
write(55,11) na, nb, l, lp, ls, lc, lcp, vcdr
enddo
enddo
endif
c
52 continue
c
42 continue
c
32 continue
22 continue
c
c
write(6,*)' writing eels irregular exchange terms'
write(55,821)
write(55,103)
write(55,821)
c
do 23 n1 = nt0a, ntxa
l=ln(n1)
if(l.gt.lmxels(2,na)) goto 23
do k = 1, kmx(na)
rid1(k) = rpix(k)*p2(k,l+1,na)/(alpha*rx(k,na) + beta)
if(l.le.5) then
rid(k) = rpix(k)*p2irreg(k,l+1)/(alpha*rx(k,na) + beta)
else
rid(k) = (0.0,0.0)
endif
enddo
c
do 33 nat2 = 1, neff
nb = nat2
if(neq(nat2).ne.0) nb = neq(nat2)
nt0b=n0(nb)
ntxb=nt0b+nterms(nb)-1
dxb = hx(nb)
do 43 n2 = nt0b, ntxb
lp = ln(n2)
if(lp.gt.lmxels(1,nb)) goto 43
do 53 n3 = nt0b, ntxb
ls = ln(n3)
if(ls.gt.lmxels(3,nb)) goto 53
c
do k = 1, kmx(nb)
rid2(k) = p1(k,lp+1,nb)*p3(k,ls+1,nb)*rx(k,nb)**3
& /(alpha*rx(k,nb) + beta)
& /ramfsr1(lp+1,nb)/ramfsr3(ls+1,nb)
enddo
c
c ramfprd = ramfsr3(l+1,na)*ramfsr1(lp+1,nb)*ramfsr2(ls+1,nb)
c
lc_min=max(abs(l-l0i), abs(lp-ls))
lc_max=min(l+l0i, lp+ls)
c
if(na.eq.nb) then
do lc = lc_min, lc_max, 2
l1 = lc + 1
if(l1.gt.lexp_) cycle
call sstrop(rid2,il(1,l1,na),
& kl(1,l1,na),kmx(na),dxa,pi,trop)
do k = 1, kmx(na)
rid4(k) = rid1(k)*trop(k)
rid3(k) = rid(k)*trop(k)
enddo
call irregint1(rid3,rid4,kmx(na),dxa,vc)
if(abs(vc/ramfsr2(l+1,na)).lt.1.e-10) cycle
write(55,10) na, l, lp, ls, lc, vc/ramfsr2(l+1,na)
enddo
else
do lc=abs(l-l0i), l+l0i, 2
l1 = lc + 1
if(l1.gt.lexp_) cycle
do lcp=abs(lp-ls), lp+ls, 2
l1p = lcp + 1
if(l1p.gt.lexp_) cycle
call dstrop(rid2,dx2,il(1,l1,na),
& il(1,l1p,nb),kmx(na),kmx(nb),pi,trop1)
do k = 1, kmx(na)
rid4(k) = rid1(k)*trop1(k)
rid3(k) = rid(k)*trop1(k)
enddo
call irregint1(rid3,rid4,kmx(na),dxa,vcd)
vcdr = vcd/ramfsr2(l+1,na)
if(abs(vcdr).lt.1.e-10) cycle
write(55,11) na, nb, l, lp, ls, lc, lcp, vcdr
enddo
enddo
endif
c
53 continue
c
43 continue
c
33 continue
23 continue
c
endif !end of if clause to write irregular terms in case of calctype = els
c
write(55,821)
c
100 format(10x,'single site regular direct terms:')
101 format(10x,'irregular direct terms:')
102 format(10x,'single site regular exchange terms:')
103 format(10x,'irregular exchange terms')
104 format(10x,'two-site regular direct terms:')
106 format(10x,'two-site regular exchange terms:')
821 FORMAT(138('-'))
c
return
end
c
c
subroutine coulss(rho1,rho2,il,kl,kmx,dx,pi,vc)
c
include 'msxas3.inc'
c
dimension rho1(kmx), rho2(kmx), il(kmx), kl(kmx)
dimension rid(rdx_), a(rdx_), p(rdx_)
complex rho1, rho2, vc, vc1, vc2
complex*16 rid, a, p
real*8 il, kl
c
id = 1
do k = 1, kmx
rid(k) = il(k)*dcmplx(rho2(k))
enddo
call integrcmdp(rid,dx,kmx,a,id)
do k = 1, kmx
rid(k) = kl(k)*dcmplx(rho2(k))
enddo
call integrcmdp(rid,dx,kmx,p,id)
c
do k = 1, kmx
rid(k) = (p(kmx)-p(k))*il(k)*dcmplx(rho1(k))
enddo
call integrcmdp(rid,dx,kmx,p,id)
c
vc1 = cmplx(p(kmx))
c write(6,*) 'vc1 = ',vc1
do k = 1, kmx
rid(k) = a(k)*kl(k)*dcmplx(rho1(k))
enddo
call integrcmdp(rid,dx,kmx,p,id)
c
vc2 = cmplx(p(kmx))
c write(6,*) 'vc2 = ',vc2
vc = (vc1 + vc2)*8.0*pi
c
return
end
c
c
subroutine coulds(rho1,rho2,dx1,dx2,ila,ilb,
& kmx1,kmx2,pi,vc)
c
include 'msxas3.inc'
c
dimension rho1(kmx1), rho2(kmx2), ila(kmx1), ilb(kmx2)
dimension a1(rdx_), a2(rdx_), rid(rdx_)
complex rho1, rho2, a1, a2, rid, vc1, vc2, vc
real*8 ila, ilb
c
id = 1
do k = 1, kmx1
rid(k) = rho1(k)*real(ila(k))
enddo
call integrcm(rid,dx1,kmx1,a1,id)
c call interp(r1(kpl1-3),a1(kpl1-3),7,rs1,vc1,dummy,.false.)
vc1 = a1(kmx1)
c
id = 1
do k = 1, kmx2
rid(k) = rho2(k)*real(ilb(k))
enddo
call integrcm(rid,dx2,kmx2,a2,id)
c call interp(r2(kpl2-3),a2(kpl2-3),7,rs2,vc2,dummy,.false.)
vc2 = a2(kmx2)
c
vc = vc1*vc2*8.0*pi
return
end
c
c
subroutine sstrop(rho2,il,kl,kmx,dx,pi,trop)
c
include 'msxas3.inc'
c
dimension rho2(kmx), il(kmx), kl(kmx), trop(kmx)
dimension rid(rdx_), a(rdx_), p(rdx_)
complex rho2
complex*16 rid, a, p, trop
real*8 il, kl
c
id = 1
do k = 1, kmx
rid(k) = il(k)*dcmplx(rho2(k))
enddo
call integrcmdp(rid,dx,kmx,a,id)
do k = 1, kmx
rid(k) = kl(k)*dcmplx(rho2(k))
enddo
call integrcmdp(rid,dx,kmx,p,id)
c
do k = 1, kmx
rid(k) = (p(kmx)-p(k))*il(k)
enddo
c
do k = 1, kmx
trop(k) = (rid(k) + a(k)*kl(k))*8.0*pi
enddo
c
c
return
end
c
c
subroutine dstrop(rho2,dx2,ila,ilb,kmx1,kmx2,pi,rid)
c
include 'msxas3.inc'
c
dimension rho2(kmx2), ila(kmx1), ilb(kmx2)
dimension a2(rdx_), rid(rdx_)
complex rho2, a2, rid
real*8 ila, ilb
c
id = 1
do k = 1, kmx2
rid(k) = rho2(k)*real(ilb(k))
enddo
call integrcm(rid,dx2,kmx2,a2,id)
c call interp(r2(kpl2-3),a2(kpl2-3),7,rs2,vc2,dummy,.false.)
do k = 1, kmx1
rid(k) = ila(k)*a2(kmx2)*8.0*pi
enddo
c
return
end
c
c
subroutine irregint(rho1,rho2,rl,hl,kmx,dx,vc)
c
include 'msxas3.inc'
c
dimension rho1(kmx), rho2(kmx), il(kmx), kl(kmx)
dimension rid(rdx_), a(rdx_), p(rdx_)
complex rho1, rho2, vc, vc1, vc2
complex rid, a, p, rl, hl
c
id = 1
do k = 1, kmx
rid(k) = rl(k)*dcmplx(rho2(k))
enddo
call integrcm(rid,dx,kmx,a,id)
do k = 1, kmx
rid(k) = hl(k)*dcmplx(rho2(k))
enddo
call integrcm(rid,dx,kmx,p,id)
c
do k = 1, kmx
rid(k) = (p(kmx)-p(k))*rl(k)*dcmplx(rho1(k))
enddo
call integrcm(rid,dx,kmx,p,id)
c
vc1 = cmplx(p(kmx))
c write(6,*) 'vc1 = ',vc1
do k = 1, kmx
rid(k) = a(k)*hl(k)*dcmplx(rho1(k))
enddo
call integrcm(rid,dx,kmx,p,id)
c
vc2 = cmplx(p(kmx))
c write(6,*) 'vc2 = ',vc2
vc = (vc1 + vc2)
c
return
end
c
c
subroutine irregint1(rho1,rho2,kmx,dx,vc)
c
include 'msxas3.inc'
c
dimension rho1(kmx), rho2(kmx)
dimension rid(rdx_), a(rdx_), p(rdx_)
complex rho1, rho2, vc, vc1, vc2
complex rid, a, p
c
id = 1
do k = 1, kmx
rid(k) = dcmplx(rho2(k))
enddo
call integrcm(rid,dx,kmx,a,id)
do k = 1, kmx
rid(k) = dcmplx(rho1(k))
enddo
call integrcm(rid,dx,kmx,p,id)
c
do k = 1, kmx
rid(k) = (p(kmx)-p(k))*dcmplx(rho2(k))
enddo
call integrcm(rid,dx,kmx,p,id)
c
vc1 = cmplx(p(kmx))
c write(6,*) 'vc1 = ',vc1
do k = 1, kmx
rid(k) = a(k)*dcmplx(rho1(k))
enddo
call integrcm(rid,dx,kmx,p,id)
c
vc2 = cmplx(p(kmx))
c
vc = (vc1 + vc2)
c
return
end
c
c
subroutine setup
c
c include 'mscalc.inc'
include 'msxas3.inc'
integer at_,ltot_
parameter ( at_=nat_-1,ltot_=lmax_+1,n_=ltot_*ua_)
c
common /flag/ inmsh,inv,inrho,insym,iovrho,iosym,
1 imvhl,nedhlp
c
common/funit/idat,iwr,iphas,iedl0,iwf
c
character*8 name0, name0i, nsymbl
c
common/param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,xe,ev
c
common /state/ natom(n_),ln(n_),nleq(at_),
1 nns,nuatom,ndg,nls(at_),n0l(at_),n0(at_),
2 nterms(at_),lmaxn(at_),ndim,lmxne(at_,nep_)
c
common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1,
* i_absorber_hole2,i_norman,i_alpha,
1 i_outer_sphere,i_exc_pot,i_mode
common/auger/calctype,expmode,edge1,edge2
character*3 calctype, expmode
character*2 edge1,edge2
common/lparam/lmax2(nat_),l0i
c
c ########## I introduce a common/l2holes to take into account the
c ########## the orbital momentum of the two electrons which interac
c ########## and give rise to the Auger decay; the two orbital momen
c ########## are necessary in subroutine radial to do the loop over
c ########## the interaction momentum
c
common/l2holes/l01i,l02i
integer l01i,l02i
c
character*8 core_basis_name(25)
integer core_basis_l(25)
character*8 exc_basis_name
integer exc_basis_l(lmax_+1),exc_basis_dim
integer exc_basis_ndg
c
data core_basis_name/'1s1/2','2s1/2','2p1/2','2p3/2',
1'3s1/2','3p1/2','3p3/2','3d3/2','3d5/2','4s1/2','4p1/2',
2 '4p3/2','4d3/2','4d5/2','4f5/2','4f7/2','5s1/2','5p1/2',
3 '5p3/2','5d3/2','5d5/2','5f5/2','5f7/2','5g7/2','5g9/2'/
c
data core_basis_l/0,0,1,1,0,1,1,2,2,0,1,1,2,2,3,3,0,
1 1,1,2,2,3,3,4,4/
c
data exc_basis_name/'no sym'/
data lmaximum/lmax_/
data exc_basis_ndg/1/
c
do 7001 i=1,lmaximum+1
exc_basis_l(i)=i-1
7001 continue
exc_basis_dim=0
do 7002 i=1,ndat
exc_basis_dim=exc_basis_dim+lmax2(i)+1
7002 continue
c
do 59 n=1,nat
lmaxx(n)=0
n0(n)=0
n0l(n)=0
lmaxn(n)=0
nterms(n)=0
59 nls(n)=0
nuatom=0
write (6,327)iosym
327 format(1x,' symmetry information generated internally'/,
x 1x,' symmetry information written to file',i3)
c
name0i=core_basis_name(i_absorber_hole)
write(iwr,120) name0i
write(iosym,120) name0i
120 format(1x,//,' core initial state of type: ',a5)
c
ndim=exc_basis_dim
ndg=exc_basis_ndg
name0=exc_basis_name
c
write (iosym,103) ndim,ndg,name0
103 format(' # basis function including o.s. =',i4,' degeneracy=',
1 i3,5x,a6)
i_l=1
i_atom=1
l0i = core_basis_l(i_absorber_hole)
c
c ############## Modified to consider also the Auger part
c
if (calctype.eq.'aed') then
l01i = core_basis_l(i_absorber_hole1)
l02i = core_basis_l(i_absorber_hole2)
end if
c
c
do 125 n=1,ndim
ln(n)=exc_basis_l(i_l)
write (iosym,104) n, ln(n)
104 format ( 1x,'basis function no.',i5,' l=',i3)
natom(n)=i_atom
i_l=i_l+1
if(i_l.gt.(lmax2(i_atom)+1))then
i_l=1
i_atom=i_atom+1
endif
c
write(iosym,106) natom(n)
106 format (30x, ' atom no.=',i3)
c
na=natom(n)
lmaxn(na)=max0(lmaxn(na),ln(n))
nuatom=max0(nuatom,na)
nterms(na)=nterms(na)+1
nls(na)=nls(na)+1
125 continue
ctn write(6,1099) ndim
write(iosym,112) nuatom, name0
112 format(' number of inequivalent atoms =',i4,
* ' for representation:',a6)
if (nuatom.ne.ndat) then
write(6,122) nuatom, ndat
stop
endif
122 format(//,' fatal error: nuatom not equal ndat',2i5,//)
c
n0(1)=1
n0l(1)=1
lmaxx(1)=max0(lmaxx(1),lmaxn(1))
if(nuatom.eq.1) go to 127
do 124 na=2,nuatom
n0(na)=n0(na-1)+nterms(na-1)
n0l(na)=n0l(na-1)+nls(na-1)
124 lmaxx(na)=max0(lmaxn(na),lmaxx(na))
c branch point
127 continue
return
c
end
c
c
subroutine smtx(ne,lmax_mode)
c
c include 'mscalc.inc'
include 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
common/bessel/sbf(ltot_),dsbf(ltot_),shf(ltot_),dshf(ltot_)
complex*16 sbf,dsbf,shf,dshf
complex*16 sbfrs(ltot_),dsbfrs(ltot_)
c
common /fcnr/kxe, h(d_),vcons(2),r(rd_,d_),v(rd_,sd_),
$ ichg(10,d_),kplace(at_),kmax(at_)
complex vcons,v
c
common /flag/ inmsh,inv,inrho,insym,iovrho,iosym,
1 imvhl,nedhlp
c
common /pdq/ p(rd_,f_),ps(n_),dps(n_),ramf(n_),pss(6),dpss(6)
complex p,ps,dps,ramf,pss,dpss
c
character*8 name0 ,nsymbl
c
common/param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,ev,xe
c
common /seculr/ atm(n_)
complex*16 atm,stmat
c
common /state/ natom(n_),ln(n_),nleq(at_),
1 nns,nuatom,ndg,nls(at_),n0l(at_),n0(at_),
2 nterms(at_),lmaxn(at_),ndim,lmxne(at_,nep_)
c
common/mtxele/ nstart,nlast,dmx(2),dmx1(2),qmx(3),qmx1(3),
$ dxdir,dxexc,nfis,nfis1,nfis2
real nfis,nfis2,nfis1
complex dmx,dmx1,qmx,qmx1,dxdir,dxexc
c
complex csqrt,arg,ramf0
c
common/auger/calctype,expmode,edge1,edge2
character*3 calctype, expmode
character*2 edge1,edge2
c
xe= csqrt(ev)
ns=(nns-1)*ndat
c
do 5 j=1,ndim
5 atm(j)=(0.0D0,0.0D0)
c
c calculate t-matrix elements:
c stmat: inverse t-m elements (atomic spheres)
c ramf: for normalization of ps(k) functions
c
do 60 na=1,nuatom
WRITE(95,77) NA
ns=ns+1
mout=1
nt0a=n0(na)
ntxa=nt0a+nterms(na)-1
if (na.eq.nas) then
nstart=nt0a
nlast=ntxa
endif
l=-1
nlat=-1
arg=xe*rs(na)
ml=lmaxn(na)+1
call csbf(arg,xe,ml,sbf,dsbf)
call cshf2(arg,xe,ml,shf,dshf)
npabs=0
do 45 nn=nt0a,ntxa
l=ln(nn)
nlat=nlat+1
npabs=npabs+1
if(na.ne.nas.or.npabs.gt.npss-1) npabs=npss
if(lmax_mode.eq.2.and.l.gt.lmxne(na,ne)) goto 45
call tmat(l,rs(na),kmax(na),z(na),h(na),r(1,na),v(1,ns),
1 ichg(1,na),mout,kplace(na),p(1,npabs),stmat,ps(nn),
2 dps(nn),ramf0)
c
atm(nn)=stmat
ramf(nn)=ramf0
IF(LMAX_MODE.EQ.0) THEN
write(95,1001)xe/0.52917715,stmat
ELSE
write(95,1002)xe/0.52917715,stmat
ENDIF
c
C definition of stmat as exp(-i*delta)*sin(delta)
c
fasi=sign(-1.,real(cmplx(stmat)))*
1 real(asin(sqrt(abs(dimag(stmat)))))
if(fasi.lt.0.0) fasi=fasi+3.1415926
write(30,1000)e,xe,na,nlat,stmat,fasi
c write(30)e,xe,na,nlat,stmat
c write(*,*)e,xe,na,nlat,stmat
1000 format(2x,f10.5,2x,2f10.5,2x,i3,2x,i3,2x,2e16.6,f10.5)
1001 format(3x,f9.4,1x,f9.4,5x,e12.6,5x,e12.6)
1002 format(3x,f9.4,1x,f9.4,5x,f12.9,5x,f12.9)
45 continue
60 continue
C
77 FORMAT('-------------------------- ATOM ',I3,
1 ' -----------------------')
c
c calculate singular solution inside muffin tin sphere for the absorbing
c atom, matching to sbf in interstitial region
c
nl=0
lmsing=5
mout=4
kp=kplace(nas)
kpx=kmax(nas)
do 92 k=kp-3,kpx
if(r(k,nas)-rs(nas)) 92,93,93
92 continue
c
c define points (first) kp1 and kp2 outside the absorbing sphere
c and use them to start computation of singular solution (s_l)
c
93 kp1=k+1
kpl=kp1-3
nst=n0(nas)
nlst=n0(nas)+nterms(nas)-1
l=-1
ml=lmaxn(nas)+1
arg=xe*r(kp1,nas)
call cshf2(arg,xe,ml,sbf,dsbf)
arg=xe*r(kp1-1,nas)
call cshf2(arg,xe,ml,shf,dshf)
arg=xe*rs(nas)
call cshf2(arg,xe,ml,sbfrs,dsbfrs)
do 95 n=nst,nlst
l=ln(n)
c
c skip high and divergent l-values of
c singular solution h_l
c
if(l.gt.lmsing)go to 95
nl=nl+1
np=npss+nl
np1=nl
c
call tmat(l,rs(nas),kp1,z(nas),h(nas),r(1,nas),v(1,nas),
$ichg(1,nas),mout,kpl,p(1,np),stmat,pss(np1),dpss(np1),ramf0)
c
c shfp = shf(l+1)*xepi
c dshfp = dshf(l+1)*xepi
c print *, ps(np),dps(np),shfp,dshfp
c do 96 k=1,kpx
c if(k.lt.kp2)then
c p(k,np)=p(k,np)*(sbfrs(l+1)/pss(np1))*xepi !rescale h_l
c else ! to match h_l at rs
c p(k,np)=(0.,0.)
c end if
c 96 continue
95 continue
c
return
end
c
subroutine tmat(l,rs,kmax,z,delh,r,v,ichg,mout,kplace,p,stmat,
1 ps,dps,ramf)
c
c include 'mscalc.inc'
include 'msxas3.inc'
integer ltot_, rd_
parameter (ltot_=lmax_+1, rd_=440)
c
c
c
c t-matrix calculation - integrates radial schrodinger equation
c using numerov procedure - does outward and inward integration
c for atomic spheres - gives inverse of t-matrix and log deriva-
c tive at sphere surface.
c
c modified for complex potentials
c
c calculates :
c
c mout=4 solution matching to (0.,1.)*hf2 at r=rs
c
c
c mout=1 atomic spheres t-matrix elements
c returns:
c stmat=[sbfc,ps]/[shfc,ps] (@rs atomic sphere
c ramf=[sbfc,ps]*xe*rs**2 (@rc atomic sphere
c
c
c
common/bessel/sbfc(ltot_),dsbfc(ltot_),shfc(ltot_),
1 dshfc(ltot_)
complex*16 sbfc,shfc,dsbfc,dshfc
c
common/param/eftr,gamma,vcon,xe,ev,e,iout
complex vcon,xe,ev
c
c
dimension v(kmax),p(kmax),r(kmax),ichg(10)
complex v,p,ps,dps,ramf
complex*16 stmat,x,ramff
complex*16 pk,pk1,pkm,dkm,dk1,dk,gk,gk1,gkm
complex*16 pn(rd_)
data pi/3.141592653589793d0/
c
c
c
kstop=1
a=l*(l+1)
if(mout.eq.4) go to 60
c
c outward integration for atomic spheres
c
ki=1
if(l.ge.5) ki=ichg(1)
call startp(z,l,e,r,v,kmax,ki,pn)
h=r(ki+1)-r(ki)
hsq=h**2
pkm=pn(ki)
pk1=pn(ki+1)
dkm=-dcmplx((e-v(ki)-a/r(ki)**2)*hsq)*pn(ki)/12.d0
dk1=-dcmplx((e-v(ki+1)-a/r(ki+1)**2)*hsq)*pn(ki+1)/12.d0
kis=ki+2
n=1
if(ki.eq.ichg(1)) n=2
do 34 k=kis,kmax
gk=dcmplx((e-v(k)-a/r(k)**2)*hsq)/12.d0
pk=dcmplx((2.d0*(pk1+5.d0*dk1)-(pkm-dkm))/(1.d0+gk))
pn(k)=pk
if(k.lt.ichg(n)) go to 30
n=n+1
hsq=4.*hsq
dkm=4.d0*dkm
dk1=-4.d0*gk*pk
pk1=pk
go to 34
30 pkm=pk1
dkm=dk1
dk1=-gk*pk
pk1=pk
34 continue
c
go to 78
c
c inward integration to find solution matching to (0.,1.)*hf2 at r=rs
c
60 n=11
61 n=n-1
if(n.eq.0) go to 66
kn=ichg(n)
if(kn.ge.kmax) go to 61
c
66 kn=kmax
pkm=sbfc(l+1)*dcmplx(xe/pi*r(kn))
pk1=shfc(l+1)*dcmplx(xe/pi*r(kn-1))
hsq=delh**2*4**n
pn(kn)=pkm
pn(kn-1)=pk1
dkm=-dcmplx((e-a/r(kn)**2-vcon))*pkm*dble(hsq)/12.d0
dk1=-dcmplx((e-a/r(kn-1)**2-vcon))*pk1*dble(hsq)/12.d0
k=kn+1
if(k.gt.kmax) go to 79
do 76 i=k,kmax
76 pn(i)=(0.0d0,0.0d0)
79 k=kn-1
73 k=k-1
74 gk=dcmplx((e-v(k)-a/r(k)**2))*dble(hsq)/12.d0
pk=dcmplx((2.d0*(pk1+5.d0*dk1)-pkm+dkm)/(1.d0+gk))
pn(k)=pk
if(k.eq.kstop) go to 78
if(n.eq.0) go to 69
if(k.gt.ichg(n)) go to 69
if(k.le.2) go to 75
n=n-1
dk=-pk*gk
gk1=dcmplx((e-v(k-2)-a/r(k-2)**2))*dble(hsq)/12.d0
pk1=dcmplx((2.d0*(pk+5.d0*dk)-pk1+dk1)/(1.d0+gk1))
dk1=-pk1*gk1/4.d0
hsq=hsq/4.
gkm=dcmplx((e-v(k-1)-a/r(k-1)**2))*dble(hsq)/12.d0
dk=dk/4.d0
pkm=0.5d0*((pk-dk)+(pk1-dk1))/(1.d0-5.d0*gkm)
dkm=-pkm*gkm
k=k-3
c
c keller modification subroutine tmat
c
pn(k+2)=pkm
if(k+1.lt.kstop) go to 78
pn(k+1) = pk1
if(k+1.eq.kstop) go to 78
go to 74
69 pkm=pk1
dkm=dk1
dk1=-pk*gk
pk1=pk
go to 73
75 write(6,103)
stop
103 format(//,18h error stop - tmat,//)
c
c
78 continue
do 77 k=1,kmax
77 p(k)=cmplx(pn(k)/dble(r(k)))
call interp(r(kplace-3),p(kplace-3),7,rs,ps,dps,.true.)
if(mout.eq.4) return
x=dcmplx(dps/ps)
ramff=sbfc(l+1)*x-dsbfc(l+1)
stmat=ramff/(shfc(l+1)*x-dshfc(l+1))
ramf=cmplx(ramff)*ps*rs*rs*xe
return
c
end
c
c
subroutine eikonal(nuatom,xe,z,rs,db)
c
include 'msxas3.inc'
c
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
dimension z(at_), rs(at_)
c
common /fcnr/kxe, h(d_),vcons(2),r(rd_,d_),v(rd_,sd_),
$ ichg(10,d_),kplace(at_),kmax(at_)
complex vcons,v
c
complex xe
c
open(unit=45, file='tl/tbmat.dat',status='unknown')
c
write(45,*) 'impinging electron wave vector kappa =', real(xe)
write(35,*) 'impinging electron wave vector kappa =', real(xe)
write(6,*) ' impinging electron wave vector kappa =', real(xe)
c
do na=1,nuatom
write(45,*)'atom number ', na,'(z =', z(na),')'
write(35,*)'atom number ', na,'(z =', z(na),')'
c write(6,*)' atom number ', na,'(z =', z(na),')'
z0 = z(na)
call tbmat(db,rs(na),kplace(na),z0,r(1,na),v(1,na),real(xe))
enddo
c
close(45)
c
c write(6,*) ' normal exit in subroutine eikonal '
c stop
c
return
end
c
c
subroutine tbmat(db,rs,kmax,z0,r,v,xer)
c
integer rd_
parameter (rd_=440, nt_=1500)
c
dimension v(kmax),r(kmax), z(rd_)
complex v, z
c
dimension x(nt_), rx(nt_), rid(nt_), rid1(nt_)
c
complex cu, tb, zb, z1, zx, dzx, d2zx, rid, rid1, dbf, dbs
c
data pi/3.1415926/
c
do i = 1, kmax
z(i) = r(i)*v(i)
c write(45,*) r(i), z(i)
enddo
c
id = 1 !for subroutine defint
idr = 0 !for subroutine defint
cu = (0.0,1.0)
c write(6,*)
twz = -2.0*z0
c write(6,*) ' twz =', twz
c
c db = 0.01
c b0 = -5.3
c nb = (-b0 + log(rs))/db
c do ib = 1, nb
c b = exp((ib-1)*db + b0)
nb = nint(rs/db)
c write(6,*) 'nb =', nb
do ib = 1, nb - 1
b = (ib-1)*db + db
c
dx = 0.005
nx = nint(rs/dx)
rmx = nx*dx
t = rmx/b
rt = log(t + sqrt(t**2-1.0))
c
nt = nint(rt/dx)
c write(6,*) 'nt =', nt,' for ib =', ib
if(nt.gt.nt_) then
write(6,*) ' '
write(6,*) ' '
write(6,*) ' stop in subroutine tbmat '
write(6,*) ' increase dimension nt_; ',
& ' it should be greater than nt =', nt
write(6,*) ' '
write(6,*) ' '
call exit
endif
if(nt.le.4) cycle
x(1) = dx
rx(1) = b*(exp(dx) + exp(-dx))/2.0
c write(2,*) x(1), rx(1)
do i = 2, nt
x(i) = x(i-1) + dx
rx(i) = b*(exp(x(i)) + exp(-x(i)))/2.0
c write(2,*) x(i), rx(i)
enddo
c
do i = 1, nt
jlo = 1
call nearest1(r, kmax, rx(i), ip1, ip2, ip3, jlo)
c
call cinterp_quad( r(ip1), z(ip1), r(ip2), z(ip2),
& r(ip3),z(ip3),rx(i),zx,dzx,d2zx)
rid(i) = zx - twz
rid1(i) = zx
enddo
c
call defint0(rid,dx,nt,zb,id)
call defint0(rid1,dx,nt,z1,idr)
c
zbc = twz*rt
dbf = zb + zbc
c write(6,*) ' coulomb eikonal phase zbc =', zbc
c write(6,*) ' eikonal phase zb =', zb
c write(6,*) ' total eikonal phase dbf =', dbf
c
c write(6,*) ' integrated zx =', z1
c
dbs = -dbf/xer/2.0
tb = cu/pi*(cexp(2.0*cu*dbs) - 1.0)
c
c write(6,*) ' eikonal t(b) =', tb,' at b =', b
c
write(45,'(3e15.7)') b, tb
write(35,'(3e15.7)') b, tb
c
enddo
c
c
return
end
c
c
subroutine vxc ( doit )
c include 'mscalc.inc'
include 'msxas3.inc'
integer at_,d_,rd_,sd_
parameter ( at_=nat_-1,d_=ua_-1,rd_=440,sd_=ua_-1)
c
c calculation of ex-correlation h-l potential
c
c
c
common /dens/ irho,rs(rd_,sd_),rsint(2),
$ vcoul(rd_,sd_),vcoulint(2)
common /fcnr/kxe, h(d_),vcons(2,2),r(rd_,d_),v(2,rd_,sd_),
$ ichg(10,d_),kplace(at_),kmax(at_)
c
common /flag/ inmsh,inv,inrho,insym,iovrho,iosym,
1 imvhl,nedhlp
c
common /hedin/ wp2,xk,e,eta2,pi,ot,kdens
c
c x_k_0 not divided by k_f
c
common/corr/r_s,blt,x_k_0
c
character*8 name0 ,nsymbl
common/param/eftr,gamma,vcon(2),xe,ev,ekn,iout,nat,ndat,
1 nspins,nas,rmuftin(at_),xv(at_),yv(at_),zv(at_),exfact(at_),
3 z(at_),lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex xe,ev
external f1,f2,f3
real*8 r_s,blt,x_k_0,im_vxc,re_vxc,pi_8
real*4 re_vxc_4,im_vxc_4
logical doit, iskip
nout = 0
anns=float(nspins)
eps=1.e-3
eta=1.e-3
eta2=eta*eta
ot=1./3.
ts2=27.*27.
t2=32.
sqr3=sqrt(3.)
pi=3.1415926
pi_8 = dble(pi)
a=(4./(9.*pi))**ot
eken=ekn-eftr
c
c do na = 1, ndat
c print *, ' atom number =', na
c do k = 1 , kmax(na)
c print *, k, r(k,na), rs(k,na)
c enddo
c enddo
c
c calculate rs from charge density first time through subroutine:
c remember that rhotot read in input is actually 4*pi*rho*r**2
c
c print *, nspins, ndat, kmax(1), 'check point'
if( .not. doit ) goto 100
do 50 isp=1,nspins
do 40 nb=1,ndat
ns=nb+(isp-1)*ndat
do 30 k=1,kmax(nb)
rs(k,ns)=((3.*(r(k,nb)**2))/(rs(k,ns)*anns))**ot
c if(ns.eq.1)
c & print *, 'r, rs(k,1) =', r(k,1), rs(k,1)
30 continue
40 continue
rsint(isp)=(3./(pi*4.*rsint(isp)*anns))**ot
50 continue
c
c
c calculate self-energy
c
100 do 300 isp=1,nspins
iskip=.false.
do 280 nb=1,ndat+1
ns=nb+(isp-1)*ndat
if(.not.iskip)then
c
c compute vxc for atomic and outer spheres
c
km=kmax(nb)
else
c
c compute vxc for interstitial region
c
km=1
endif
do 260 k=1,km
if(.not.iskip)then
rsp=rs(k,ns)
else
rsp=rsint(isp)
endif
ef=1./(a*rsp)**2
xk=sqrt(1.0+eken/ef)
if(eken.lt.0.0) xk=1.0
wp2=4.*a*rsp/(3.*pi)
wp=sqrt(wp2)
xk2=xk*xk
e=.5*xk2
xkp=xk+1.
xkm=xk-1.
xkpi=1./xkp
if(nedhlp.eq.2)then
c
c define variables used by rehr's subroutine rhl
c
x_k_0=dble(xk/(a*rsp))
r_s=dble(rsp)
call rhl(re_vxc,im_vxc,pi_8)
c
c conversion to single precision and ryd
c
re_vxc_4 = 2.0*sngl(re_vxc)
c
c conversion to single precision and ryd
c
im_vxc_4 = 2.0*sngl(im_vxc)
if (iskip) goto 1200
v(1,k,ns)=vcoul(k,ns) + re_vxc_4
if(imvhl.ne.0)v(2,k,ns)=-im_vxc_4 + gamma
goto 1210
1200 vcons(1,isp)=vcoulint(isp) + re_vxc_4
if(imvhl.ne.0)vcons(2,isp)=-im_vxc_4 + gamma
1210 continue
if(imvhl.ne.0)goto 260
goto 210
end if
c
flg=alog((xkp+eta2)/(xkm+eta2))
edxc=(1.-xk2)/xk*.5*flg
vedx=1.5*wp2*(1.+edxc)
vsex = 0.0
vch = 0.0
if(nedhlp.ne.0) go to 199
if(nb.eq.1.and.nout.eq.1) go to 199
vsex=.75*wp2**2/xk*gauss(f2,xkm,xkp,eps)
vch1=gauss(f3,0.,xkp,eps)
vch2=gauss(f1,0.,xkpi,eps)
vch=.75*wp2**2/xk*(vch1+vch2)
199 continue
if (iskip) goto 200
v(1,k,ns)=vcoul(k,ns) - ef*(vedx+vsex+vch)
goto 210
200 vcons(1,isp)=vcoulint(isp) - ef*(vedx+vsex+vch)
210 continue
c
c calculate vim, imaginary part of self energy:
c
if(imvhl.eq.0) goto 260
rfct = 1.0 ! renormalizes the imaginary part
c if((icplxv.eq.1).and.(.not.iskip)) go to 260
if(wp2.ge.t2/ts2) go to 215
c1=ts2*wp2/16.
phi=acos(1.-c1)
phit=phi*ot
xkl=1.+2./9.*(-1.+cos(phit)+sqr3*sin(phit))
goto 216
215 q=(16.-ts2*wp2)/54.
del=(ts2*wp2-t2)*wp2/4.
srdel=sqrt(del)
v2=-q-srdel
v2m=abs(-q-srdel)
xkl=7./9.+ot*((-q+srdel)**ot+sign(1.,v2)*v2m**ot)
216 xkl2m=xkl**2-1.
xkmm=1.+sqrt(-2./3.+sqrt(4./9.-4.*wp2+xkl2m**2))
if(abs(xkl-xkmm).gt.1.e-4)
x write(iovrho,221) xkl,xkmm,nb,k,rsp
221 format(' xkl(=',e14.6,') not equal to xkmm(=',e14.6,') for ',
x ' nb,k,rs=',2i10,e20.6)
xmm=sqrt(1.+2.*wp)
if(xkl.lt.xmm) write(iovrho,222) xkl,xmm,nb,k,rsp
222 format(' xkl(=',e14.6,') less than xmm(=',e14.6,') for ',
x 'nb,k,rs=',2i10,e20.6)
if(.not.iskip) v(2,k,ns)=gamma
if(iskip) vcons(2,isp)=gamma
if(xk.le.xkl) go to 260
del1=27.*xk2*wp2-4.*(xk2-ot)**3
if(del1.ge.0.) write(iovrho,223) nb,k,rsp
223 format(' discriminant del1 positive for nb,k,rs=',2i10,e20.6)
xm2=-2*ot+sqrt(4./9.-4.*wp2+(xk2-1.)**2)
c1=27.*xk2*wp2/(2.*(xk2-ot)**3)
if(c1.gt.2.) write(iovrho,224) c1,nb,k,rsp
224 format(' c1(=',e14.6,') gt 2. for nb,k,rs=',2i10,e20.6)
phi=acos(1.-c1)
phit=ot*phi
xk1=(1.-cos(phit)+sqr3*sin(phit))*(xk2-ot)/(3.*xk)
xk12=xk1*xk1
an=xm2*(xk12*(1.-3.*wp)+6.*wp*(wp+xk*xk1))
ad=xk12*(xm2+3.*wp*(xk2-1.+2.*wp))
if (iskip) goto 258
v(2,k,ns)= rfct*ef*(3.*pi/8.*wp**3/xk*alog(an/ad))+gamma
goto 260
258 vcons(2,isp)= rfct*ef*(3.*pi/8.*wp**3/xk*alog(an/ad))+gamma
260 continue
if(nb.eq.ndat)iskip=.true.
280 continue
300 continue
c
c transfer constant for interstitial potential
c
vcon(1)=vcons(1,1)
vcon(2)=vcons(2,1)
c
return
end
c
FUNCTION F1(X)
COMMON /HEDIN/ WP2,XK,E,ETA2,PI,OT
YI=1./X
YI2=YI*YI
WQ=SQRT(WP2+OT*YI2+(.5*YI2)**2)
T1=.5*(XK+YI)**2-E+WQ
T2=.5*(XK-YI)**2-E+WQ
R=(T1*T1+ETA2)/(T2*T2+ETA2)
F1=.5*ALOG(R)*YI/WQ
RETURN
END
FUNCTION F2(X)
COMMON /HEDIN/ WP2,XK,E,ETA2,PI,OT
X2=X*X
WQ=SQRT(WP2+OT*X2+(.5*X2)**2)
T1=.5-E-WQ
T2=.5*(XK-X)**2-E-WQ
T3=T2+2.*WQ
T4=.5-E+WQ
R=(T1*T1+ETA2)*(T3*T3+ETA2)/((T2*T2+ETA2)*(T4*T4+ETA2))
F2=.5*ALOG(R)/(WQ*X)
RETURN
END
FUNCTION F3(X)
COMMON /HEDIN/ WP2,XK,E,ETA2,PI,OT
X2=X*X
WQ=SQRT(WP2+OT*X2+(.5*X2)**2)
T1=.5*(XK+X)**2-E+WQ
T2=.5*(XK-X)**2-E+WQ
R=(T1*T1+ETA2)/(T2*T2+ETA2)
F3=.5*ALOG(R)/(WQ*X)
RETURN
END
FUNCTION GAUSS(F,A,B,EPS)
LOGICAL MFLAG,RFLAG
EXTERNAL F
DIMENSION W(12),X(12)
C
C ******************************************************************
C
C ADAPTIVE GAUSSIAN QUADRATURE.
C
C GAUSS IS SET EQUAL TO THE APPROXIMATE VALUE OF THE INTEGRAL OF
C THE FUNCTION F OVER THE INTERVAL (A,B), WITH ACCURACY PARAMETER
C EPS.
C
C ******************************************************************
C
DATA W
*/1.01228536E-01, 2.22381034E-01, 3.13706646E-01,
* 3.62683783E-01, 2.71524594E-02, 6.22535239E-02,
* 9.51585117E-02, 1.24628971E-01, 1.49595989E-01,
* 1.69156519E-01, 1.82603415E-01, 1.89450610E-01/
DATA X
*/9.60289856E-01, 7.96666477E-01, 5.25532410E-01,
* 1.83434642E-01, 9.89400935E-01, 9.44575023E-01,
* 8.65631202E-01, 7.55404408E-01, 6.17876244E-01,
* 4.58016778E-01, 2.81603551E-01, 9.50125098E-02/
C
C ******************************************************************
C
C START.
C
GAUSS=0.
IF(B.EQ.A) RETURN
CONST=0.005/(B-A)
BB=A
C
C COMPUTATIONAL LOOP.
C
1 AA=BB
BB=B
2 C1=0.5*(BB+AA)
C2=0.5*(BB-AA)
S8=0.
DO 3 I=1,4
U=C2*X(I)
S8=S8+W(I)*(F(C1+U)+F(C1-U))
3 CONTINUE
S8=C2*S8
S16=0.
DO 4 I=5,12
U=C2*X(I)
S16=S16+W(I)*(F(C1+U)+F(C1-U))
4 CONTINUE
S16=C2*S16
IF( ABS(S16-S8) .LE. EPS*(1.+ABS(S16)) ) GO TO 5
BB=C1
IF( 1.+ABS(CONST*C2) .NE. 1. ) GO TO 2
GAUSS=0.
CALL KERMTR('D103.1',LGFILE,MFLAG,RFLAG)
IF(MFLAG) THEN
IF(LGFILE.EQ.0) THEN
WRITE(*,6)
ELSE
WRITE(LGFILE,6)
ENDIF
ENDIF
IF(.NOT. RFLAG) CALL ABEND
RETURN
5 GAUSS=GAUSS+S16
IF(BB.NE.B) GO TO 1
RETURN
C
6 FORMAT( 4X, 'FUNCTION GAUSS ... TOO HIGH ACCURACY REQUIRED')
END
C
SUBROUTINE KERSET(ERCODE,LGFILE,LIMITM,LIMITR)
PARAMETER(KOUNTE = 28)
CHARACTER*6 ERCODE, CODE(KOUNTE)
LOGICAL MFLAG, RFLAG
INTEGER KNTM(KOUNTE), KNTR(KOUNTE)
DATA LOGF / 0 /
DATA CODE(1), KNTM(1), KNTR(1) / 'C204.1', 100, 100 /
DATA CODE(2), KNTM(2), KNTR(2) / 'C204.2', 100, 100 /
DATA CODE(3), KNTM(3), KNTR(3) / 'C204.3', 100, 100 /
DATA CODE(4), KNTM(4), KNTR(4) / 'C205.1', 100, 100 /
DATA CODE(5), KNTM(5), KNTR(5) / 'C205.2', 100, 100 /
DATA CODE(6), KNTM(6), KNTR(6) / 'C205.3', 100, 100 /
DATA CODE(7), KNTM(7), KNTR(7) / 'C305.1', 100, 100 /
DATA CODE(8), KNTM(8), KNTR(8) / 'C308.1', 100, 100 /
DATA CODE(9), KNTM(9), KNTR(9) / 'C312.1', 100, 100 /
DATA CODE(10),KNTM(10),KNTR(10) / 'C313.1', 100, 100 /
DATA CODE(11),KNTM(11),KNTR(11) / 'C336.1', 100, 100 /
DATA CODE(12),KNTM(12),KNTR(12) / 'C337.1', 100, 100 /
DATA CODE(13),KNTM(13),KNTR(13) / 'C341.1', 100, 100 /
DATA CODE(14),KNTM(14),KNTR(14) / 'D103.1', 100, 100 /
DATA CODE(15),KNTM(15),KNTR(15) / 'D106.1', 100, 100 /
DATA CODE(16),KNTM(16),KNTR(16) / 'D209.1', 100, 100 /
DATA CODE(17),KNTM(17),KNTR(17) / 'D509.1', 100, 100 /
DATA CODE(18),KNTM(18),KNTR(18) / 'E100.1', 100, 100 /
DATA CODE(19),KNTM(19),KNTR(19) / 'E104.1', 100, 100 /
DATA CODE(20),KNTM(20),KNTR(20) / 'E105.1', 100, 100 /
DATA CODE(21),KNTM(21),KNTR(21) / 'E208.1', 100, 100 /
DATA CODE(22),KNTM(22),KNTR(22) / 'E208.2', 100, 100 /
DATA CODE(23),KNTM(23),KNTR(23) / 'F010.1', 100, 0 /
DATA CODE(24),KNTM(24),KNTR(24) / 'F011.1', 100, 0 /
DATA CODE(25),KNTM(25),KNTR(25) / 'F012.1', 100, 0 /
DATA CODE(26),KNTM(26),KNTR(26) / 'F406.1', 100, 0 /
DATA CODE(27),KNTM(27),KNTR(27) / 'G100.1', 100, 100 /
DATA CODE(28),KNTM(28),KNTR(28) / 'G100.2', 100, 100 /
LOGF = LGFILE
IF(ERCODE .EQ. ' ') THEN
L = 0
ELSE
DO 10 L = 1, 6
IF(ERCODE(1:L) .EQ. ERCODE) GOTO 12
10 CONTINUE
12 CONTINUE
ENDIF
DO 14 I = 1, KOUNTE
IF(L .EQ. 0) GOTO 13
IF(CODE(I)(1:L) .NE. ERCODE(1:L)) GOTO 14
13 KNTM(I) = LIMITM
KNTR(I) = LIMITR
14 CONTINUE
RETURN
ENTRY KERMTR(ERCODE,LOG,MFLAG,RFLAG)
LOG = LOGF
DO 20 I = 1, KOUNTE
IF(ERCODE .EQ. CODE(I)) GOTO 21
20 CONTINUE
WRITE(*,1000) ERCODE
CALL ABEND
RETURN
21 RFLAG = KNTR(I) .GE. 1
IF(RFLAG .AND. (KNTR(I) .LT. 100)) KNTR(I) = KNTR(I) - 1
MFLAG = KNTM(I) .GE. 1
IF(MFLAG .AND. (KNTM(I) .LT. 100)) KNTM(I) = KNTM(I) - 1
IF(.NOT. RFLAG) THEN
IF(LOGF .LT. 1) THEN
WRITE(*,1001) CODE(I)
ELSE
WRITE(LOGF,1001) CODE(I)
ENDIF
ENDIF
IF(MFLAG .AND. RFLAG) THEN
IF(LOGF .LT. 1) THEN
WRITE(*,1002) CODE(I)
ELSE
WRITE(LOGF,1002) CODE(I)
ENDIF
ENDIF
RETURN
1000 FORMAT(' KERNLIB LIBRARY ERROR. ' /
+ ' ERROR CODE ',A6,' NOT RECOGNIZED BY KERMTR',
+ ' ERROR MONITOR. RUN ABORTED.')
1001 FORMAT(/' ***** RUN TERMINATED BY CERN LIBRARY ERROR ',
+ 'CONDITION ',A6)
1002 FORMAT(/' ***** CERN LIBRARY ERROR CONDITION ',A6)
END
C
SUBROUTINE ABEND
C
C CERN PROGLIB# Z035 ABEND .VERSION KERNVAX 1.10 811126
STOP '*** ABEND ***'
END
C====================================================================
C
SUBROUTINE GET_CORE_STATE
C
IMPLICIT REAL*8(A-H,O-Z)
C
c INCLUDE 'mscalc.inc'
include 'msxas3.inc'
c
c ############ I include the file msxasc3.inc
c
include 'msxasc3.inc'
cman
integer rd_
PARAMETER(RD_=440)
C
COMMON/APARMS2/XV2(NAT_),YV2(NAT_),ZV2(NAT_),RS2(NAT_),
U ALPHA2(NAT_),REDF2(NAT_),Z2(NAT_),Q2(NAT_),QSPNT2(2),
U QINT2(2),
U WATFAC(NAT_),ALPHA02,VOLINT2,OVOUT2,RMXOUT2,NSYMBL2(NAT_),
U NZ2(NAT_)
CHARACTER*8 NSYMBL2
C
c #############common/pot_type modified to include the core states
c #############to the two hole in the final state of Auger decay i_
c ##############common /pdqi modified to consider also the two auger wav
C
C common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1,
C * i_absorber_hole2,i_norman,i_alpha,
C 1 i_outer_sphere,i_exc_pot,i_mode
C
COMMON/POT_TYPE/I_ABSORBER,I_ABSORBER_HOLE,I_ABSORBER_HOLE1,
* I_ABSORBER_HOLE2,I_NORMAN,I_ALPHA,
1 I_OUTER_SPHERE,I_EXC_POT,I_MODE
C
COMMON/PDQI/RPI(RD_),RPI1(RD_),RPI2(RD_)
REAL*4 RPI,RPI1,RPI2
INTEGER I_HOLE
c INTEGER HOLE
C
DIMENSION R(440),P_NK(440),P_NK1(440),P_NK2(440),ICHG(12)
C
DATA THIRD,XINCR,CTFD
&/0.3333333333333333D0,0.0025D0,0.885341377000114D0/
C
DATA KMX,MESH/RD_,440/
C
IZ=NZ2(I_ABSORBER+I_OUTER_SPHERE)
c open(unit=697,file='get1.dat',status='unknown')
if(iz.eq.0) then
iz=1 ! in case an empty sphere is the first atom
write(6,*) ' warning check! empty sphere is the first atom '
endif
I_RADIAL=I_ABSORBER_HOLE
C
C ######### Modified to consider also the Auger calculation
C
I_RADIAL1=I_ABSORBER_HOLE1
I_RADIAL2=I_ABSORBER_HOLE2
I_HOLE=0
NCUT=1
C
C SET-UP HERMAN-SKILLMAN MESH FOR Z OF ABSORBING ATOM
C
MESH=MESH/NCUT
H=XINCR*CTFD/(DFLOAT(IZ)**THIRD)*NCUT
R(1)=H
DO 10 N=1,12
10 ICHG(N)=(40/NCUT)*N
N=1
DO 20 K=2,MESH
R(K)=R(K-1)+H
IF (K.LT.ICHG(N)) GO TO 20
H=H+H
N=N+1
20 CONTINUE
C
C*** COMPUTE FUNCTION P_NK ON RADIAL MESH R
C
CALL ATOM_SUB(IZ,I_HOLE,R,P_NK,1,I_RADIAL,0.d0)
C
C
C*** PASS VIA COMMON BLOCK THE FIRST KMX POINTS. NOTE THAT
C P_NK IS NOT NORMALIZED SINCE Q_NK MUST ALSO BE CONSIDERED.
C ALSO NOTE THE RELATION TO THE SCHRODINGER RADIAL FUNCTION
C R*R_L = P_NK. THIS RELATION HOLDS IN THE LIMIT C --> INFINITY.
C
DO 30 I=1,KMX
RPI(I)=SNGL(P_NK(I))
30 CONTINUE
c
c ############# modified to make the calculations also for the two
c ############# wave functions necessary for the auger decay calcula
c ############# these two wavefunction are calculated with Z+1 appro
c ############# with one hole=to the deeper first core hole (hole)
c
IF (calctype.EQ.'aed') THEN
I_HOLE=HOLE2
CALL ATOM_SUB(IZ,I_HOLE,R,P_NK1,1,I_RADIAL1,0.d0)
CALL ATOM_SUB(IZ,I_HOLE,R,P_NK2,1,I_RADIAL2,0.d0)
DO 3011 I=1,KMX
RPI1(I)=SNGL(P_NK1(I))
RPI2(I)=SNGL(P_NK2(I))
3011 CONTINUE
END IF
C
RETURN
END
c
C
SUBROUTINE COREWF(NAS,IZC,HOLE)
C
INCLUDE 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
C
C
COMMON /FCNRLM/X(RDX_,D_), RX(RDX_,D_), HX(D_), VX(RDX_,SD_),
& VXR(RDX_,SD_), DVX(RDX_,SD_), BX(RDX_,SD_),
& VXSO(RDX_,SD_), KMX(AT_), KPLX(AT_)
COMPLEX VX, VXR, DVX, BX, VXSO
C
COMMON /LLM/ ALPHA, BETA
C
COMMON/PDQIX/RPIX(RDX_), FNISX
COMPLEX RPIX
C
DOUBLE PRECISION CWFX(RDX_),RXD(RDX_),XION
COMPLEX RIDX(RDX_),DX
C
INTEGER HOLE
C
DATA THIRD,XINCR,CTFD
&/0.3333333333333333D0,0.0025D0,0.885341377000114D0/
C
C
IZ=IZC
ITYRADIAL=HOLE
C
XION=0
ITYHOLE=0
C
KMXN = KMX(NAS)
DO I = 1, KMXN
RXD(I) = DBLE(RX(I,NAS))
ENDDO
c write(6,*) ' corewf: kmx = ', kmxn
C
C*** COMPUTE FUNCTION P_NK ON RADIAL MESH RD AND LL MESH RX
C
XION = 0.D0
CALL GET_INTRP_CORE(IZ,ITYHOLE,ITYRADIAL,XION,CWFX,RXD,KMXN)
C
C*** NOTE THAT CWFX=P_NK (UPPER COMPONENT OF DIRAC EQU.) IS NOT NORMALIZED
C SINCE ALSO Q_NK (LOWER COMPONENT) MUST ALSO BE CONSIDERED.
C ALSO NOTE THE RELATION TO THE SCHRODINGER RADIAL FUNCTION R*R_L = P_NK.
C THIS RELATION HOLDS IN THE LIMIT C --> INFINITY.
c
c.....Find normalization constant in ll-mesh.
c
do i = 1, kmxn
xi = sngl(cwfx(i))
rpix(i)=cmplx(xi)
c write(6,*) rx(i,nas), xi
enddo
c dh = x(2,n) - x(1,n)
c write(6,*) ' dh ', dh, hx(n), alpha, beta
n = nas
id = 1
do k = 1,kmxn
ridx(k)=rpix(k)**2*rx(k,n)/(alpha*rx(k,n) + beta)
enddo
call defint0(ridx,hx(n),kmxn,dx,id)
fnisx=sqrt(real(dx))
c
c write(6,*) 'corewf: fnisx = ', fnisx
c
do k=1,kmxn
rpix(k)=rx(k,n)**2*rpix(k)/fnisx
enddo
c
RETURN
END
C
C
C***********************************************************************
C
subroutine get_intrp_core(iz,ihole,i_radial,xion,cwfx,rx,kmxn)
c
c
implicit real*8(a-h,o-z)
c
c
parameter ( mp = 251, ms = 30 )
c
character*40 title
c
common/mesh_param/jlo
common dgc(mp,ms),dpc(mp,ms),bidon(630),idummy
c
c For interpolation on rx mesh
c
dimension rx(kmxn), cwfx(kmxn)
dimension p(0:mp), rat(0:mp), r(mp)
c
c
dimension dum1(mp), dum2(mp)
dimension vcoul(mp), rho0(mp), enp(ms)
c
title = ' '
c
ifr=1
iprint=0
C
amass=0.0d0
beta=0.0d0
c
c There are no nodes in relativistic radial charge density
c
small=1.0d-11
c !Hence a lower limit on rho(r) can be used.
dpas=0.05d0
dr1=dexp(-8.8d0)
dex=exp(dpas)
r_max=44.447d0
c
radius=10.0d0
c
xion=0.d0
c
c compute relativistic Hartrer-Fock-Slater charge density (on log mesh)
c
call scfdat (title, ifr, iz, ihole, xion, amass, beta, iprint,
1 vcoul, rho0, dum1, dum2, enp, eatom)
c
c compute radial log mesh (see subroutine phase in J.J. Rehr's program
c FEFF.FOR)
c
ddex=dr1
do 10 i=1,251
r(i)=ddex
ddex=ddex*dex
10 continue
c
c write(6,*) ' interpolating on rx mesh '
c Dump upper componen of Dirac wf into p
c
p(0) = 0.d-8
rat(0) = 0.d-8
do i = 1, 251
p(i) = dgc(i,i_radial)
rat(i) = r(i)
c write(6,*) rat(i), p(i)
enddo
c
do i=1,kmxn
if(rx(i).gt.r_max) goto 60
c find nearest points
c initialize hunting parameter (subroututine nearest)
c
jlo=1
call nearest(rat,252,rx(i),
1 i_point_1,i_point_2,i_point_3)
c
i_point_1 = i_point_1 -1
i_point_2 = i_point_2 -1
i_point_3 = i_point_3 -1
c
c interpolate wavefunction
c
call interp_quad( rat(i_point_1),p(i_point_1),
1 rat(i_point_2),p(i_point_2),
1 rat(i_point_3),p(i_point_3),
1 rx(i),cwfx(i) )
enddo
c
60 continue
c
return
end
C
C
C***********************************************************************
c
subroutine input_cont(id,potype,potgen,lmax_mode,lmaxt)
c
include 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
c modified input subroutine for (optionally) complex potentials
c
common /dens/ irho,rhotot(rd_,sd_),rhoconi(2),
$ vcoul(rd_,sd_),vcoulint(2)
common/auger/calctype,expmode,edge1,edge2
c
common /fcnr/kxe, h(d_),vcons(2),r(rd_,d_),v(2,rd_,sd_),
$ ichg(10,d_),kplace(at_),kmax(at_)
complex vcons
c
common /flag/ inmsh,inv,inrho,insym,iovrho,iosym,
1 imvhl,nedhlp
c
character*8 name0 ,nsymbl
character*3 calctype, expmode
character*5 potype
character*2 potgen
character*2 edge1,edge2
c
ctn common block from msxas3.inc
c .... redundant variables with param....
c
common/continuum/xemin,xemax,xdelta,xcip,xgamma,xeftri,iexcpot
c
common/param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,xe,ev
c
common /state/ natom(n_),ln(n_),nleq(at_),
1 nns,nuatom,ndg,nls(at_),n0l(at_),n0(at_),
2 nterms(at_),lmaxn(at_),ndim,lmxne(at_,nep_)
c
common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1,
* i_absorber_hole2,i_norman,i_alpha,
1 i_outer_sphere,i_exc_pot,i_mode
c !pass pots and rhos to this sub
common/out_ascii/iout_ascii
c
common/lparam/lmax2(nat_),l0i
c
logical check
c
character*65 exc_pot_label(5)
character*65 exc_pot_label_extnl(6)
data exc_pot_label/
&'generating final potential (x_alpha exchange)',
&'generating final potential (real dirac-hara exchange)',
&'generating final potential (real hedin-lundqvist exchange)',
&'generating final potential (complex dirac-hara exchange)',
&'generating final potential (complex hedin-lundqvist exchange)'
&/
data exc_pot_label_extnl/
&'potential from extnl file (x_alpha exchange)',
&'potential from extnl file (real dirac-hara exchange)',
&'potential from extnl file (real hedin-lundqvist exchange)',
&'potential form extnl file (complex dirac-hara exchange)',
&'potential form extnl file (complex hedin-lundqvist exchange)',
&'potential form extnl file (potential from lmto calculation)'
&/
c
data lunout/7/, ot/.333333/, pi/3.1415926/
c
c**** definitions for this version of continuum
c
iout=2
nspins=1
iout_ascii=2
c !output check files
iovrho=13
iosym=14
c
c*** define state dependent parameters
c read cip (core ionization potential),emin,emax and deltae
c in order to check array sizes.
ctn read(5,*) cip,emin_exc,emax_exc,de_exc
ctn read(5,*) i_exc_pot,gamma,eftri
ctn initializes from common continuum
c
emin_exc=xemin
emax_exc=xemax
de_exc=xdelta
cip=xcip
gamma=xgamma
eftri=xeftri
i_exc_pot=iexcpot
ctn write(*,*)'dans inpot_cont:'
ctn write(*,*) cip,emin_exc,emax_exc,de_exc
ctn write(*,*) i_exc_pot,gamma,eftri
c
c de_exc = 0.05
c con = 27.2116/7.62
c wvb = sqrt(con*emin_exc)
c wve = sqrt(con*emax_exc)
c kxe = nint((wve-wvb)/0.05 + 1.)
c kxe = nint(alog(emax_exc - emin_exc + 1.)/de_exc + 1.)
kxe = nint((xemax-xemin)/xdelta + 1.)
if(kxe.gt.nep_)then
c write(lunout,730) kxe
write(6,730) kxe
730 format(//,
& ' increase the dummy dimensioning variable, nep_. ',
& /,'it should be at least equal to: ', i5,/)
write(6,'(3f10.5)') xemax, xemin, xdelta
call exit
end if
c !define absorbing atom
nas=i_absorber
c
emin=emin_exc
emax=emax_exc
de=de_exc
if(i_exc_pot.eq.1)then
c !define exchange potential types
nedhlp=0
irho=0
imvhl=0
if(i_mode.eq.1)then
print 745,exc_pot_label_extnl(1)
else
print 745,exc_pot_label(1)
end if
745 format(2x,a65)
else if(i_exc_pot.eq.2)then
nedhlp=1
irho=2
imvhl=0
if(i_mode.eq.1)then
print 745,exc_pot_label_extnl(2)
else
print 745,exc_pot_label(2)
end if
else if(i_exc_pot.eq.3)then
c
c nedhlp=2 !use rehr's approximation to re(vxc)
c
nedhlp=0 !use exact integral expression for re(vxc)
irho=2
imvhl=0
if(i_mode.eq.1)then
print 745,exc_pot_label_extnl(3)
else
print 745,exc_pot_label(3)
end if
else if(i_exc_pot.eq.4)then
nedhlp=1
irho=2
imvhl=1
if(i_mode.eq.1)then
print 745,exc_pot_label_extnl(4)
else
print 745,exc_pot_label(4)
end if
else if(i_exc_pot.eq.5) then
c
c nedhlp=2 !use rehr's approximation to re(vxc) and im(vxc)
c
nedhlp=0 !use exact integral expression for vxc
c
irho=2
imvhl=1
if(i_mode.eq.1)then
print 745,exc_pot_label_extnl(5)
else
print 745,exc_pot_label(5)
end if
else if(i_exc_pot.eq.6) then
irho = 0
print 745, exc_pot_label_extnl(6)
c
end if
c
if(irho.ne.0)then
i_alpha=0
else
i_alpha=1
end if
if (i_mode.eq.1)then
c call get_external_pot
if(potype.eq.' lmto') print 745, exc_pot_label_extnl(6)
call get_ext_pot_lmto(potype)
else
call vgen
end if
c
c... calculate fermi level eftr = vcint + kf**2 - .72*3./2.*kf/pi*2.
c
if (irho.eq.0) then
eftr = real(vcons(1))/2.
else
fmkf = (3.*pi**2*rhoconi(1))**ot
eftr = real(vcons(1)) + fmkf*(fmkf - 2.16/pi)
endif
c
if (eftri.ne.0.0) eftr = eftri
c
if (lmax_mode.eq.0) then
c write(lunout,741)
write(6,741) lmaxt
741 format(/,1x,' lmax constant on each atom equal to: ', i5)
c
else if (lmax_mode.eq.1) then
c write(lunout,741)
write(6,742) emax
742 format(/,1x,' lmax assignment based on',
& ' lmax = r_mt * k_max + 2',/,
& ' at energy emax =',f12.6)
c
else
c write(lunout,741)
write(6,743)
743 format(/,1x,' lmax assignment based on',
& ' l_max = r_mt * k_e + 2',/,
& ' where e is the running energy')
c
endif
c ###### problem: for low energy continuum auger electron it can happen
c that lmax2 is less than the higher value of the orbital mom
c allowed for the continuum auger electron; thus I set the lm
c value equal to the lmax_ value given in the include file
c msxas3.inc
c
l_max = 0
c
if ((calctype.eq.'xpd').or.(calctype.eq.'xas').or.
& (calctype.eq.'rex').or.(calctype.eq.'led')) then
c
c !assign lmax values and check max(lm)
c
if (lmax_mode.eq.0) then
do i=1,ndat
lmax2(i) = lmaxt
c write(lunout,842) lmax2(i),i
write(6,842) lmax2(i),i
842 format(10x,' lmax =', i3, ' on center =', i3)
enddo
c
else if (lmax_mode.eq.1) then
do i=1,ndat
lmax2(i) = nint(rs(i)*sqrt(emax)) + 2
if(l_max.lt.lmax2(i)) l_max=lmax2(i)
c write(lunout,843) lmax2(i),i
write(6,843) lmax2(i),i
843 format(10x,' optimal lmax =', i3, ' on center =', i3)
enddo
c
else
do i=1,ndat
lmax2(i) = nint(rs(i)*sqrt(emax)) + 2
if(l_max.lt.lmax2(i)) l_max=lmax2(i)
if(i.eq.ndat) then
c write(lunout,844)
write(6,844)
endif
844 format(1x,' optimal lmax chosen according to the running',
& ' energy e for each atom')
enddo
c
endif
c
c...give warning for insufficient lmax dimensions
c
check = .false.
if(lmax_mode.ne.0) then
if(l_max.gt.lmax_) then
c manolo
check=.true.
c write(lunout,746)l_max
write(6,746)l_max
746 format(///,
& ' increase the dummy dimensioning variable, lmax_. ',
& /,' it should be at least equal to: ', i5)
call exit
endif
else
if(lmaxt.gt.lmax_) then
c manolo
check=.true.
c write(lunout,746)lmaxt
write(6,746)lmaxt
call exit
endif
endif
c
c
else
c
c ##### auger part:
c
do i=1,ndat
lmax2(i)=lmax_
l_max=lmax_
enddo
end if
c
c...set lmax equal on any atom if check='true'
c
if ((calctype.eq.'xpd').or.(calctype.eq.'xas').or.
& (calctype.eq.'rex').or.(calctype.eq.'led')) then
if(check) then
do i=1,ndat
lmax2(i) = l_max
write(6,7422)lmax2(i),i
7422 format(10x,' lmax =', i3, ' on center =', i3)
enddo
c
write(6,*) ' '
write(6,*)' ** input_cont warning **'
write(6,*)' -> estimated l_max is greater than lmax_'
write(6,*)' computation proceeds with l_max=lmax_'
write(6,*)' but convergence is not guaranteed'
c
endif
c
else
c do i=1,ndat
c lmax2(i) = l_max
c write(6,7422)lmax2(i),i
c enddo
endif
c
write(6,*)
c
c
write (iovrho,408) nedhlp,irho,imvhl,eftr,gamma
408 format(' nedhlp=',i5,' irho=',i5,' imvhl=',i5,
x /,' eftr = ',f10.6,' gamma =',f10.6)
write (iovrho,409) nat,ndat,nspins,
1 inmsh,inv,inrho,insym,iovrho,iosym
409 format(9i5)
c
write(iovrho,110) nat
if (iovrho .ne. 6 ) write(6,110) nat
110 format(/,2x,18hnumber of centers=,i5,/)
c
c store coulomb potential if energy dependent exchange is to be used
c
if(irho.ne.0)then
do 4304 isp=1,nspins
do 4303 nb=1,ndat
ns=nb+(isp-1)*ndat
do 4302 k=1,kmax(nb)
vcoul(k,ns)=v(1,k,ns)
4302 continue
4303 continue
vcoulint(isp)=real(vcons(isp))
4304 continue
end if
c
c check for consistency of input data:
c
write(iovrho,111)
111 format(30x,10hatom no.,12x,8hposition,14x,13hradius eq )
write(iovrho,112) (i,nsymbl(i),nz(i),xv(i),yv(i),zv(i),rs(i),
1 neq(i),i=1,nat)
write (iovrho,112)
112 format(26x,i3,2x,a4,i6,4f10.4,i6)
do 211 i=1,nat
if(rs(i).lt.0.0) then
write(iovrho,201) i, rs(i)
write(6,201) i, rs(i)
call exit
endif
if(neq(i).eq.0)go to 210
if(neq(i).ge.i) go to 213
210 i1=i+1
if(i1.gt.nat) go to 5000
go to 2135
213 write(iovrho,202) neq(i), i
write(6,202) neq(i), i
call exit
2135 do 211 j=i1,nat
rij = sqrt((xv(j)-xv(i))**2+(yv(j)-yv(i))**2+(zv(j)-zv(i))**2)
rsum = rs(i)+rs(j)
rdif = rsum-rij
if (rsum.gt.rij) go to 215
go to 211
215 write (iovrho,200) i,j,rsum,rij,rdif
200 format(' spheres',2i5,' overlap ',3f12.6)
201 format(' sphere',i5,' has negative rs', f12.6)
202 format(' neq(i)',i5,' for atom i=', i5,' is inconsistent' )
211 continue
c
5000 return
end
c
C
SUBROUTINE GET_EXTERNAL_POT
C
c INCLUDE 'mscalc.inc'
include 'msxas3.inc'
INTEGER AT_,D_,RD_,SD_
PARAMETER ( AT_=NAT_-1,D_=UA_-1,RD_=440,SD_=UA_-1)
COMMON /DENS/ IRHO,RHOTOT(RD_,SD_),RHOCONI(2),
$ VCOUL(RD_,SD_),VCOULINT(2)
C
COMMON /FCNR/KXE, H(D_),VCONS(2),R(RD_,D_),V(2,RD_,SD_),
$ ICHG(10,D_),KPLACE(AT_),KMAX(AT_)
COMPLEX VCONS
C
COMMON /FLAG/ INMSH,INV,INRHO,INSYM,IOVRHO,IOSYM,
1 IMVHL,NEDHLP
C
CHARACTER*8 NAME0 ,NSYMBL
C
COMMON/PARAM/EFTR,GAMMA,VCON,XE,EV,E,IOUT,NAT,NDAT,NSPINS,
1 NAS,RS(AT_),XV(AT_),YV(AT_),ZV(AT_),EXFACT(AT_),Z(AT_),
3 LMAXX(AT_),NZ(AT_),NSYMBL(AT_),
4 NEQ(AT_),NAME0,CIP,EMAX,EMIN,DE
COMPLEX VCON,XE,EV
C
COMMON/DIMENS2/NAT2,NDAT2
C
cman DATA INV,INRHO/2,3/
inv=2
inrho=3
C
NAT = NAT2 - 1
NDAT = NDAT2 - 1
C
OPEN(INV, status='unknown')
DO 4444 N=1,NAT
READ (INV,311) NSYMBL(N),NEQ(N), NZ(N),IDUMMY,KMAX(N),
1 KPLACE(N),XV(N),YV(N),ZV(N),RS(N),EXFACT(N),NC
311 FORMAT (1X,A4,3I2,2I4,5F11.6,T76,I5)
Z(N)=NZ(N)
IF(NEQ(N).NE.0) GO TO 4444
C
C RECONSTRUCT RADIAL MESH
C
READ (INV,308) (ICHG(I,N),I=1,10),NC
308 FORMAT(10I5,T76,I5)
KX=KMAX(N)
READ (INV,319) NC,(R(I,N),I=1,5)
H(N)=R(2,N)-R(1,N)
HH=H(N)
ICH=1
KICH=ICHG(ICH,N)
DO 133 K=3,KX
R(K,N)=R(K-1,N)+HH
IF (K.LT.KICH) GO TO 133
ICH=ICH+1
KICH=ICHG(ICH,N)
HH=HH+HH
133 CONTINUE
319 FORMAT(T76,I5,T2,1P5E14.7)
H(N)=R(2,N)-R(1,N)
NS=N
C
DO 142 ISPIN=1,NSPINS
DO 141 K=1,KX,5
KCARD=MIN0(KX,K+4)
READ (INV,319) NC,(V(1,I,NS),I=K,KCARD)
DO 7474 KKK=K,KCARD
7474 V(2,KKK,NS) = 0.000
141 CONTINUE
142 NS=NS+NDAT
C
IF(IRHO.EQ.0) GOTO 4444
OPEN(INRHO, status='unknown')
DO 423 ISPIN=1,NSPINS
NS=N+(ISPIN-1)*NDAT
DO 424 K=1,KX,5
KCARD=MIN0(KX,K+4)
READ(INRHO,319) NC,(RHOTOT(I,NS),I=K,KCARD)
424 CONTINUE
423 CONTINUE
4444 CONTINUE
C
C READ INTERSTITIAL V AND RHO
C
READ (INV,319) NC,(VCONS(ISPIN),ISPIN=1,NSPINS)
IF(IRHO.NE.0)READ (INRHO,319) NC,(RHOCONI(ISPIN),ISPIN=1,NSPINS)
C
WRITE(6,120) INV
120 FORMAT (' STARTING POTENTIAL READ IN FROM FILE',I4)
IF( IRHO .NE. 0) WRITE(6,121) INRHO
121 FORMAT (' STARTING CHARGE DENSITY READ IN FROM FILE',I4)
C
REWIND(INV)
REWIND(INRHO)
C
RETURN
END
C
SUBROUTINE GET_EXT_POT_LMTO(potype)
C
include 'msxas3.inc'
C
INTEGER AT_,D_,RD_,SD_
PARAMETER ( AT_=NAT_-1,D_=UA_-1,RD_=440,SD_=UA_-1)
C
PARAMETER (MRP = 500)
C
COMMON /DENS/ IRHO,RHOTOT(RD_,SD_),RHOCONI(2),
$ VCOUL(RD_,SD_),VCOULINT(2)
C
COMMON /FCNR/KXE, H(D_),VCONS(2),R(RD_,D_),V(2,RD_,SD_),
$ ICHG(10,D_),KPLACE(AT_),KMAX(AT_)
COMPLEX VCONS
C
COMMON /FLAG/ INMSH,INV,INRHO,INSYM,IOVRHO,IOSYM,
1 IMVHL,NEDHLP
C
CHARACTER*8 NAME0 ,NSYMBL
C
COMMON/PARAM/EFTR,GAMMA,VCON,XE,EV,E,IOUT,NAT,NDAT,NSPINS,
1 NAS,RS(AT_),XV(AT_),YV(AT_),ZV(AT_),EXFACT(AT_),Z(AT_),
3 LMAXX(AT_),NZ(AT_),NSYMBL(AT_),
4 NEQ(AT_),NAME0,CIP,EMAX,EMIN,DE
COMPLEX VCON,XE,EV
C
COMMON/DIMENS2/NAT2,NDAT2
C
common/aparms/xa(natoms),ya(natoms),za(natoms),zat(natoms),
& nsymbla(natoms),nzeq(natoms),neqa(natoms),ncores(natoms),
& lmaxat(natoms)
C
REAL*8 xa,ya,za,zat
CHARACTER*8 nsymbla
C
DIMENSION RL(MRP,D_), VCL(MRP,SD_), RHOL(MRP,SD_), HL(D_),
& VLMTO(MRP,SD_), KMXP(SD_), KPLP(SD_), RSL(SD_),
& NPAC(-10:100), NZL(D_), KMX(SD_), ICHGL(SD_,D_)
C
DIMENSION RHS(MRP,D_), VHS(MRP,SD_), RHOHS(MRP,SD_)
C
REAL*8 RL, VCL, RHOL, HL, VLMTO, RSL, RHS, VHS, RHOHS,
& HR, VINT, RHOINT, DVT, DVTRHOINT
C
EXTERNAL NEAREST
C
CHARACTER*5 POTYPE
CHARACTER*5 CHECK
C
DATA THIRD,XINCR,CTFD
&/0.33333333,0.0025E0,0.88534137E0/
C
INP=2
C
NDUMMY = 0
NSPINS = 1
NAT = NAT2 - 1
NDAT = NDAT2 - 1
C
OPEN(INP, file='data/inpot.ext',status='unknown')
C
C Initialize to zero the vector indicating for which atomic species
C the lmto data have been already interpolated. Positions from 1 to
C 100 indicates physical atoms, from 0 to -1010 empty inequivalent
C spheres
C
DO N = -10, 100
NPAC(N) = 0
ENDDO
C
C VCOULINT : interstitial Coulomb potential in Ry
C RHOCONI : interstitial charge density in Ry
C VCLMTO : intsrstitial LMTO potential in Ry
C
READ(INP,*) VCOULINT(1), RHOCONI(1), VCLMTO
C
NES=1
C
DO N=1,NDAT
C
READ(INP,*,END=50) NZL(N), KMX(N), RSL(N)
WRITE(6,*) 'N=',N,'ZATL(N)=', NZL(N),'KMX(N)=',KMX(N),
& 'RS(N)=',RSL(N)
IF (KMX(N).GT.MRP) THEN
WRITE(6,*) ' '
WRITE(6,*) ' '
WRITE(6,*)' MRP =', MRP,' TOO SMALL, INCREASE UP TO ', KMX(N)
WRITE(6,*) ' '
WRITE(6,*) ' '
CALL EXIT
ENDIF
C
IF(NZL(N).NE.0) THEN
NPAC(NZL(N)) = N
C WRITE(6,*) 'N, NZL(N), NPAC(NZL(N))', N, NZL(N) , NPAC(NZL(N))
ELSE
NES=NES-1
NPAC(NES)=N
C WRITE(6,*) 'N, NZL(N), NES, NPAC(NES)', N,NZL(N),NES,NPAC(NES)
ENDIF
C
C NOTE: COULOMB AND LMTO POTENTIALS ARE MULTIPLIED BY RL
C
DO K = 1, KMX(N)
READ(INP,*) RL(K,N), VCL(K,N), RHOL(K,N), VLMTO(K,N)
C WRITE(6,*) K, RL(K,N), VCL(K,N), RHOL(K,N), VLMTO(K,N)
ENDDO
C
C SET-UP HERMAN-SKILLMAN MESH FOR ATOM OF ATOMIC NUMBER Z
C
MESH=400
NCUT=1
MESH=MESH/NCUT
IF(NZL(N).EQ.0) THEN
HL(N)=DBLE(XINCR*CTFD*NCUT)
ELSE
HL(N)=DBLE(XINCR*CTFD/(FLOAT(NZL(N))**THIRD)*NCUT)
ENDIF
HR = HL(N)
RHS(1,N)=HR
DO 10 K=1,12
10 ICHGL(K,N)=(40/NCUT)*K
I=1
DO 20 K=2,MESH
RHS(K,N)=RHS(K-1,N)+HR
IF (K.LT.ICHGL(I,N)) GO TO 20
HR=HR+HR
I=I+1
20 CONTINUE
C
C FIND KMAX(N) IN THE H-S MESH ACCORDING TO RS(N)
C
KMXP(N) = 0
KPLP(N) = 0
DO K = 1, MESH
IF (RHS(K,N).GT.RSL(N)) GO TO 40
ENDDO
40 KPLP(N) = K - 1
KMXP(N) = K + 2
C
WRITE(6,*) 'ATOMIC SPECIES, HS KPLACE AND KMAX'
WRITE(6,*) 'N=',N, 'KPLP(N)= ',KPLP(N), ' KMXP(N)= ', KMXP(N)
C WRITE(6,*) 'RHSMAX=', RHS(400,N), 'RSL(N) =', RSL(N)
C
DO I=1,KMXP(N)
C FIND NEAREST POINTS
C INITIALIZE HUNTING PARAMETER (SUBROUTUTINE NEAREST)
C
CALL NEAREST(RL(1,N), KMX(N), RHS(I,N), IP1, IP2, IP3)
C
IF(IRHO.NE.0) THEN
C
C INTERPOLATE COULOMB POTENTIAL
C
CALL INTERP_QUAD( RL(IP1,N),VCL(IP1,N),RL(IP2,N),VCL(IP2,N),
& RL(IP3,N),VCL(IP3,N),RHS(I,N),VHS(I,N))
C
C INTERPOLATE CHARGE DENSITY
C
CALL INTERP_QUAD( RL(IP1,N),RHOL(IP1,N),RL(IP2,N),
& RHOL(IP2,N),RL(IP3,N),RHOL(IP3,N),
& RHS(I,N),RHOHS(I,N))
ELSE
C
C INTERPOLATE LMTO POTENTIAL
C
CALL INTERP_QUAD( RL(IP1,N),VLMTO(IP1,N),
& RL(IP2,N),VLMTO(IP2,N),
& RL(IP3,N),VLMTO(IP3,N),RHS(I,N),VHS(I,N))
ENDIF
ENDDO
C
WRITE(6,*) 'INTERPOLATED VALUES ON HS MESH'
C
DO I = 1, KMXP(N)
C WRITE(6,*) I, RHS(I,N), VHS(I,N), RHOHS(I,N)
IF(RHOHS(I,N).LT.0.D0) THEN
WRITE(6,*) ' WARNING: DENSITY INTERPOLATED TO NEGATIVE',
& ' VALUES AT RHS =', RHS(I,N),' FOR ATOM',
& ' NUMBER N =', N
CALL EXIT
ENDIF
ENDDO
C
C......TEST LAST THREE INTERPOLATED VALUES
C
SMALL=0.005
C
DO I = KPLP(N) + 1, KMXP(N)
KP = KMX(N)
C
IF(IRHO.NE.0) THEN
CALL DINTERP(RL(KP-5,N),VCL(KP-5,N),5,RHS(I,N),VINT,DVT,
& .TRUE.)
CALL DINTERP(RL(KP-5,N),RHOL(KP-5,N),5,RHS(I,N),RHOINT,
& DVTRHOINT,.TRUE.)
IF(DABS(VHS(I,N)-VINT).LT.DBLE(SMALL)) THEN
CHECK='OK'
WRITE(6,*) 'CHECK ON THE INTERPOLATED VALUE AT I =',I,
& 'FOR VC ', CHECK
ELSE
CHECK='NOTOK'
WRITE(6,*) 'CHECK ON THE INTERPOLATED VALUE AT I =',I,
& 'FOR VC ', CHECK
WRITE(6,*) I, RHS(I,N), VINT, VHS(I,N)
ENDIF
C
IF(DABS(RHOHS(I,N)-RHOINT).LT.DBLE(SMALL)) THEN
CHECK='OK'
WRITE(6,*) 'CHECK ON THE INTERPOLATED VALUE AT I =',I,
& 'FOR RHO ', CHECK
ELSE
CHECK='NOTOK'
WRITE(6,*) 'CHECK ON THE INTERPOLATED VALUE AT I =',I,
& 'FOR DENSITY RHO ', CHECK
WRITE(6,*) I, RHS(I,N), RHOINT, RHOHS(I,N)
ENDIF
C
ELSE
C
CALL DINTERP(RL(KP-5,N),VLMTO(KP-5,N),5,RHS(I,N),VINT,DVT,
& .TRUE.)
IF(DABS(VHS(I,N)-VINT).LT.DBLE(SMALL)) THEN
CHECK='OK'
WRITE(6,*) 'CHECK ON THE INTERPOLATED VALUE AT I =',I,
& 'FOR VLMTO ', CHECK
ELSE
CHECK='NOTOK'
WRITE(6,*) 'CHECK ON THE INTERPOLATED VALUE AT I =',I,
& 'FOR VLMTO ', CHECK
WRITE(6,*) I, RHS(I,N), VINT, VHS(I,N)
ENDIF
C
ENDIF
C
ENDDO
C
C
ENDDO
C
50 CONTINUE
C
CLOSE(2)
C
C write(6,*) npac(22), npac(8), npac(0), npac(-1)
DO 60 I=1,NAT
XV(I) = SNGL(XA(I+1)) - SNGL(XA(2))
YV(I) = SNGL(YA(I+1)) - SNGL(YA(2))
ZV(I) = SNGL(ZA(I+1)) - SNGL(ZA(2))
NSYMBL(I) = NSYMBLA(I+1)
NEQ(I) = NEQA(I+1)
c write(6,*) NEQ(I), NSYMBL(I)
IF(NEQ(I).NE.0) NEQ(I) = NEQ(I) - 1
NZ(I) = NZEQ(I+1)
C N = NPAC(NZ(I))
IF(NZ(I).NE.0) THEN
C
N = NPAC(NZ(I))
C WRITE(6,*) 'N, NZ(I), NPAC(NZ(I))', N, NZ(I), NPAC(NZ(I))
C
ELSE
C
IF(NSYMBL(I).EQ.'ES') THEN
N=NPAC(0)
ELSE
NES=ICHAR('0')-ICHAR(NSYMBL(I)(2:2))
N=NPAC(NES)
C WRITE(6,*) ICHAR('0'),ICHAR(NSYMBL(I)(2:2))
C WRITE(6,*) ' NES = ',NES, ' N = ', N
ENDIF
C
ENDIF
KPLACE(I) = KPLP(N)
KMAX(I) = KMXP(N)
RS(I) = REAL(RSL(N))
EXFACT(I) = 0.0
C
IF(NEQ(I).NE.0) GO TO 60
C
H(I) = REAL(HL(N))
DO K = 1,10
ICHG(K,I) = ICHGL(K,N)
ENDDO
DO K = 1, KMAX(I)
R(K,I) = SNGL(RHS(K,N))
V(2,K,I) = 0.0
IF(IRHO.NE.0) THEN
V(1,K,I) = SNGL(VHS(K,N)/RHS(K,N))
RHOTOT(K,I) = SNGL(RHOHS(K,N))
ELSE
V(1,K,I) = SNGL(VHS(K,N)/RHS(K,N))
ENDIF
ENDDO
IF(IRHO.NE.0) THEN
VCONS(1) = CMPLX(VCOULINT(1))
ELSE
VCONS(1) = CMPLX(VCLMTO)
ENDIF
60 CONTINUE
C
C.....WRITE OUT POTENTIAL AND DENSITY FILES
C
IF (potype.EQ.' lmto') THEN
OPEN (19, FILE = 'div/LMTO.POT', STATUS = 'unknown')
ELSE
OPEN (20, FILE = 'div/COUL.POT', STATUS = 'unknown')
OPEN (9, FILE = 'div/RHO.DENS', STATUS = 'unknown')
ENDIF
C
INV = 20
IF (potype.EQ.' lmto') INV = 19
INRHO= 9
NST=1
NC=2
DO 4401 N=NST,NAT
WRITE(INV,311) NSYMBL(N),NEQ(N),NZ(N),NDUMMY,KMAX(N),KPLACE(N),
1 XV(N),YV(N),ZV(N),RS(N),EXFACT(N),NC
311 FORMAT(A5,3I2,2I4,5F11.6,T76,I5)
NC=NC+1
IF(NEQ(N).NE.0) GO TO 4401
WRITE(INV,308) (ICHG(I,N),I= 1,10),NC
308 FORMAT(10I5,T76,I5)
NC=NC+1
WRITE(INV,319) NC,(R(I,N),I=1,5)
319 FORMAT(T76,I5,T2,1P5E14.7)
NS=N
NC=NC+1
KX=KMAX(N)
NS = N
DO 142 ISPIN=1,NSPINS
DO 141 K=1,KX,5
KCARD=MIN0(KX,K+4)
WRITE(INV,319) NC,(V(1,I,NS),I=K,KCARD)
141 NC=NC+1
142 NS=NS+NDAT
NS=N
IF (potype.NE.' lmto') THEN
DO 555 ISPIN=1,NSPINS
DO 551 K=1,KX,5
KCARD=MIN0(KX,K+4)
WRITE(INRHO,319) NC,(RHOTOT(I,NS),I=K,KCARD)
551 NC=NC+1
555 NS=NS+NDAT
ENDIF
4401 CONTINUE
C
IF(INV.EQ.19) WRITE( INV,319) NC,(VCONS(IS),IS=1,NSPINS)
C
IF (INV.EQ.20) THEN
WRITE(INV,319) NC, REAL(VCONS(1))
WRITE( INRHO,319) NC,(RHOCONI(IS),IS=1,NSPINS)
ENDIF
C
IF(potype.EQ.' lmto') THEN
CLOSE (UNIT=19)
ELSE
CLOSE (UNIT=20)
CLOSE (UNIT=9)
ENDIF
C
C STOP
RETURN
END
C
C
C--------------------------------------------------------------
subroutine writewf(lxp)
include 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
COMMON/PARAM/EFTR,GAMMA,VCON,XE,EV,E,IOUT,NAT,NDAT,NSPINS,
1 NAS,RS(AT_),XV(AT_),YV(AT_),ZV(AT_),EXFACT(AT_),Z(AT_),
3 LMAXX(AT_),NZ(AT_),NSYMBL(AT_),
4 NEQ(AT_),NAME0,CIP,EMAX,EMIN,DE
COMPLEX VCON,XE,EV
CHARACTER*8 NSYMBL,NAME0
c
common /pdq/ p(rd_,f_),ps(n_),dps(n_),
* ramf(n_),pss(6),dpss(6)
complex p,ps,dps,ramf,pss,dpss
c
common /fcnr/kxe, h(d_),vcons(2),r(rd_,d_),v(rd_,sd_),
$ ichg(10,d_),kplace(at_),kmax(at_)
complex vcons,v
c
common/funit/idat,iwr,iphas,iedl0,iwf
common/mtxele/ nstart,nlast,dmx(2),dmx1(2),qmx(3),qmx1(3),
$ dxdir,dxexc,nfis,nfis1,nfis2
real nfis,nfis2,nfis1
complex dmx,dmx1,qmx,qmx1,dxdir,dxexc
c
nlastl = nstart + lxp
c
c write(6,*) 'iwf,iwr,iphas,iedl0,iwf', idat,iwr,iphas,iedl0,iwf
write(iwf,*) 'energy -- xe (complex wv) -- vcon (real part ip)'
write(iwf,*) e, xe, real(vcon)
c
c write(iwf,*) lxp, kmax(nas), (ichg(i,1),i=1,10)
c
write(iwf,*)
write(iwf,*) ' -- absorber excited regular wf for all l -- '
write(iwf,*)
c
do 1 i=nstart,nlastl
write(iwf,*) ' l= ', i-1
do 2 j=1,kmax(nas)
write(iwf,*) r(j,1),p(j,i)/ramf(i)
2 continue
1 continue
c
write(iwf,*)
write(iwf,*) ' -- absorber irregular wf for l less than 6 -- '
write(iwf,*) ' radial coor --- wf '
write(iwf,*)
c
do 3 i= 1, 6
write(iwf,*) ' l= ', i-1
do 4 j=1,kmax(nas)
write(iwf,*) r(j,1),p(j,i+npss)
4 continue
3 continue
c
return
end
c
c
C--------------------------------------------------------------
subroutine writeelswf
include 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
COMMON/PARAM/EFTR,GAMMA,VCON,XE,EV,E,IOUT,NAT,NDAT,NSPINS,
1 NAS,RS(AT_),XV(AT_),YV(AT_),ZV(AT_),EXFACT(AT_),Z(AT_),
3 LMAXX(AT_),NZ(AT_),NSYMBL(AT_),
4 NEQ(AT_),NAME0,CIP,EMAX,EMIN,DE
COMPLEX VCON,XE,EV
CHARACTER*8 NSYMBL,NAME0
C
COMMON /FCNRLM/X(RDX_,D_), RX(RDX_,D_), HX(D_), VX(RDX_,SD_),
& VXR(RDX_,SD_), DVX(RDX_,SD_), BX(RDX_,SD_),
& VXSO(RDX_,SD_), KMX(AT_), KPLX(AT_)
COMPLEX VX, VXR, DVX, BX, VXSO
C
c
common/eels/einc,esct,scangl,qt,lambda,eelsme(npss,npss,npss),
& p1(rdx_,npss,nef_),p2(rdx_,npss,nef_),
& p3(rdx_,npss,nef_),ramfsr1(npss,nef_),
& ramfsr2(npss,nef_),ramfsr3(npss,nef_),
& lmxels(3,ua_),p3irreg(rdx_,7),p2irreg(rdx_,7)
complex eelsme,p1,p2,p3,ramfsr1,ramfsr2,ramfsr3,p3irreg,p2irreg
real*4 einc,esct,scangl,qt,lambda
c
c
common/funit/idat,iwr,iphas,iedl0,iwf
c
c write(6,*) 'iwf,iwr,iphas,iedl0,iwf', idat,iwr,iphas,iedl0,iwf
write(iwf,*) 'energy -- xe (complex wv) -- vcon (real part ip)'
write(iwf,*) e, xe, real(vcon)
c
c write(iwf,*) lxp, kmax(nas), (ichg(i,1),i=1,10)
c
write(iwf,*)
write(iwf,*) ' -- absorber excited regular wf for all l -- '
write(iwf,*)
c
do i=1,lmxels(1,nas)
write(iwf,*) ' inc l= ', i-1
do j=1,kmx(nas)
write(iwf,10) rx(j,1),p1(j,i,nas)/ramfsr1(i,nas)
enddo
enddo
c
c
do i=1,lmxels(2,nas)
write(iwf,*) ' sct l= ', i-1
do j=1,kmx(nas)
write(iwf,10) rx(j,1),p2(j,i,nas)/ramfsr2(i,nas)
enddo
enddo
c
c
do i=1,lmxels(3,nas)
write(iwf,*) ' exc l= ', i-1
do j=1,kmx(nas)
write(iwf,10) rx(j,1),p3(j,i,nas)/ramfsr3(i,nas)
enddo
enddo
c
c
10 format(7e15.7)
c
write(iwf,*)
write(iwf,*) ' -- absorber irregular wf for l less than 6 -- '
write(iwf,*) ' radial coor --- wf '
write(iwf,*)
c
do 3 i= 1, 6
write(iwf,*) ' l= ', i-1
do 4 j=1,kmx(nas)
write(iwf,10) rx(j,1),p3irreg(j,i)
4 continue
3 continue
c
return
end
c
c
c**********************************************************************
c
subroutine scfdat (title, ifr, iz, ihole, xion,amass, beta,iprint,
1 vcoul, srho, dgc0, dpc0, enp, eatom)
c
c single configuration dirac-fock atom code
c
c input:
c title - any name that will be written into output files.
c ifr - specify aadditional output file atom(ifr).dat
c iz - atomic number
c ihole - remove one electron from orbital #ihole.
c complete list is in subroutine getorb.
c xion - ionicity (iz-number of electrons)
c amass - mass of nucleus; 0. - for point nucleus.
c beta - thickness parameter for nuclear charge distribution
c beta=0. for uniform distribution
c iprint - if iprint>0 additional output is written into atom(ifr).dat
c output:
c vcoul - total coulomb potential (hartrees)
c srho - total charge density (bohr**-3)
c dgc0 - upper components of dirac spinors
c dpc0 - lower components of dirac spinors
c enp - energy eigenvalues (hartrees)
c eatom - total atomic energy (hartrees)
c written by a. ankudinov, univ. of washington
c
c programming language fortran 77
c
c based on modifications of the code ACRV of J.P. Desclaux
c [Comp Phys Comm. 9, 31 (1975)] and some subroutines from
c the FEFF code, J.J. Rehr, J. Mustre de Leon, S.I. Zabinsky
c and R.C. Albers, [J. Am. Chem. Soc 113,5135(1991)
c
c version 1 (5-22-96)
c
c**********************************************************************
implicit double precision (a-h,o-z)
parameter ( mp = 251, ms = 30 )
c
c save central atom dirac components, see comments below.
c
dimension dgc0(mp), dpc0(mp)
dimension vcoul(mp), srho(mp), enp(ms)
character*(*) title
character*40 ttl
character*512 slog
common /charact/ ttl
character*30 fname
c
c this programm uses cofcon cofdat dsordf ictime iowrdf
c lagdat messer nucdev ortdat potrdf soldir
common cg(mp,ms),cp(mp,ms),bg(10,ms),bp(10,ms),fl(ms),ibgp
c cg (cp) large (small) components
c bg (bp) development coefficients at the origin of large
c (small) component
c fl power of the first term of development limits.
c ibgp first dimension of the arrays bg and bp
c
c gg,gp are the output from soldir
c
common/comdir/cl,dz,gg(mp),ag(10),gp(mp),ap(10),bid(3*mp+30)
common/itescf/testy,rap(2),teste,nz,norb,norbsc
common/mulabk/afgk
common/inelma/nem
dimension afgk( 30, 30, 0:3)
common/messag/dlabpr,numerr
character*8 dprlab, dlabpr
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
common/scrhf1/eps(435),nre(30),ipl
common/snoyau/dvn(251),anoy(10),nuc
common/tabtes/hx,dr(251),test1,test2,ndor,np,nes,method,idim
data dprlab/' scfdat'/
c
c *** copy input parameters to common blocks
c
ttl = title
lttl = istrln(title)
if (lttl.le.0) ttl='atomic data'
nz=iz
dz=nz
c
c *** desclaux standard opinion. be careful when changing.
c
nuc=11
c
c nuc - number of points inside nucleus (suggested value 11)
c
nes=50
c
c nes number of attempts in program soldir
c differ from desclaux nes=40
c
niter=30
c
c equivalent to desclaux niter=1130
c niter =1000*n1+100*n2+n3
c n3 is the number of iterations per orbital
c
testy=1.d-5
c
c testy precision for the wave functions
c
hx=5.d-2
dr(1)=exp(-8.8D0)*iz
c
c dr(1)=exp(-8.8)
c hx exponential step
c dr1 first tabulation point multiplied by nz
c desclaux dr1=0.01 correspond to iz=66
c
teste=5.d-6
rap(1)=1.d2
rap(2)=1.d1
c
c teste precision for the one-electron energies
c rap tests of precision for soldir
c
ido=1
c
c equivalent to ido=ndep=1
c calculate initial orbitals using thomas-fermi model ido=1
c option to read from cards(ido=2) destroyed
c nmax=251 - set in subroutine inmuat
c scc=0.3 - set in subroutine inmuat
c *** end of desclaux standard opinion on parameters
c
if (iprint .ge. 1) then
c
c prepare file for atom output
c
write(fname,14) ifr
14 format('atom', i2.2, '.dat')
open (unit=16, file=fname, status='unknown')
c call chopen (ios, fname, 'atom')
c call head (16)
write(16,*) ' free atom ', ifr
lttl = istrln(ttl)
if (iprint .ge. 1) write(16,40) ttl(1:lttl)
40 format (1h1,40x,a)
endif
c
c initialize the rest of the data and calculate initial w.f.
c
jfail = 0
ibgp = 10
numerr = 0
nz = iz
call inmuat (ihole, xion)
c
c iholep is the index for core hole orbital in all arrays
c for 90% of atoms iholep=ihole
c
a = - xion - 1
call wfirdf ( en, a, nq, kap, nmax, ido, amass, beta)
j = 1
ind = 1
nter = 0
do 41 i=1, norb
41 scw(i) = 0.D0
test1 = testy / rap(1)
test2 = testy / rap(2)
netir = abs(niter) * norb
if (iprint .ge. 1) then
write(16,210) niter, teste, testy
210 format (5x,'number of iterations',i4,//,
1 5x,'precision of the energies',1pe9.2,//,
2 23x,'wave functions ',1pe9.2,/)
write(16,220) idim, dr(1), hx
220 format (' the integration is made on ', i3,
1 ' points-the first is equal to ' ,f7.4,/,
2 ' and the step-size pas = ',f7.4,/)
write(16,230) test1, nes
230 format ('matching of w.f. with precision', 1pe9.2,
2 ' in ',i3,' attempts ',/)
if (nuc.gt.1) write(16,250)
250 format (1h0,30x,'finite nucleus case used'/)
endif
c
c muatco - programm to calculate angular coefficients
c
call muatco
if (numerr .ne. 0) go to 711
c
c iteration over the number of cycles
c
101 iort = 0
nter = nter + 1
if (niter .ge. 0) go to 105
c
c orthogonalization by schmidt procedure
c
104 call ortdat (j)
105 method = 1
c
c calculate lagrange parameters
c
if (nre(j).gt.0 .and. ipl.ne.0) call lagdat (j,1)
c
c calculate electron potential
c
call potrdf (j)
e = en(j)
np = idim
c
c resolution of the dirac equation
c
ifail = 0
ainf = cg(nmax(j),j)
call soldir (en(j), fl(j), bg(1,j), bp(1,j), ainf,
1 nq(j), kap(j), nmax(j), ifail)
if (ifail .ne. 0 .and. jfail .eq. 0) jfail = j
if (jfail .eq. j .and. ifail .eq.0 ) jfail = 0
if (numerr.eq.0) go to 111
if (iort.ne.0 .or. niter.lt.0) go to 711
iort = 1
go to 104
111 sce(j) = abs((e-en(j)) / en(j))
c
c variation of the wave function using two iterations
c
k = nmax(j)
pr = 0.D0
do 121 i = 1, k
w = cg(i,j) - gg(i)
if (abs(w).le.abs(pr)) go to 115
pr = w
a = cg(i,j)
b = gg(i)
115 w = cp(i,j) - gp(i)
if (abs(w).le.abs(pr)) go to 121
pr = w
a = cp(i,j)
b = gp(i)
121 continue
write(slog,'(i4,i3,2(1pe11.2),2(1pd16.6),4x,a,i2)')
1 nter, j, sce(j), pr, a, b, 'method', method
call wlog(slog,0)
c
c acceleration of the convergence
c
b = scc(j)
call cofcon (a, b, pr, scw(j))
scc(j) = b
do 151 i = 1,k
gg(i) = b*gg(i) + a*cg(i,j)
151 gp(i) = b*gp(i) + a*cp(i,j)
do 155 i=1,ndor
ag(i) = b*ag(i) + a*bg(i,j)
155 ap(i) = b*ap(i) + a*bp(i,j)
c
c normalization of the wave function
c
a = dsordf (j,k,0,4,fl(j))
a = sqrt(a)
do 171 i=1, np
cg(i,j) = gg(i) / a
171 cp(i,j) = gp(i) / a
do 175 i=1, ndor
bg(i,j) = ag(i) / a
175 bp(i,j) = ap(i) / a
c
c determination of the next orbital to calculate
c
if (nter.lt.norbsc .or. (ind.lt.0 .and. j.lt.norbsc) ) then
j = j+1
go to 451
endif
j = j+1
pr=0.D0
do 301 i=1, norbsc
w = abs(scw(i))
if (w.gt.pr) then
pr = w
j = i
endif
301 continue
if (j.gt.norbsc) j = 1
if (pr.gt.testy) go to 421
pr = 0.D0
do 321 i=1, norbsc
w = abs(sce(i))
if (w.gt.pr) then
pr = w
j = i
endif
321 continue
if (pr.ge.teste) go to 421
if (ind.lt.0) go to 999
ind = -1
j = 1
go to 451
421 ind = 1
451 if (nter.le.netir) go to 101
numerr = 192011
c
c **** number of iterations exceeded the limit
c
dlabpr = dprlab
711 call messer
stop
999 if (numerr .eq. 0) then
if (jfail.ne.0) then
call wlog(
1 'failed to match lower component, results are meaningless',1)
stop
endif
c
c tabulation of the results
c
if (iprint .ge. 1) call tabrat
call etotal( kap, xnel, en, iprint, eatom)
c
c return coulomb potential
c
do 800 i=1, idim
800 srho(i) = 0.0D0
do 830 j=1, norb
do 830 i=1, nmax(j)
830 srho(i) = srho(i) + xnel(j) * (cg(i,j)**2 + cp(i,j)**2)
call potslw( vcoul, srho, dr, hx, idim)
do 810 i=1, 251
810 vcoul(i) = vcoul(i) - nz/dr(i)
c
c return srho as density instead of 4*pi*density*r**2
c do 860 i = 1, 251
c srho(i) = srho(i) / (dr(i)**2) / 4. / pi
c srho(i) = srho(i) / 4. / pi
c 860 continue
c
do 870 ispinr = 1, 30
do 852 i = 1, 251
dgc0(i) = cg( i, ispinr)
dpc0(i) = cp( i, ispinr)
852 continue
enp(ispinr) = en(ispinr)
870 continue
endif
if (iprint .ge. 1) close(unit=16)
return
end
double precision function akeato (i,j,k)
c angular coefficient by the direct coulomb integral fk
c for orbitals i and j
implicit double precision (a-h,o-z)
common/mulabk/afgk
dimension afgk(30,30,0:3)
c
c afgk angular coefficients by integrales fk and gk
c coefficient of integral fk(i;j) is in afgk(min,max)
c and that of integral gk(i;j) is in afgk(max,min)
c max=max(i,j) min=min(i,j)
c
if (i .le. j) then
akeato=afgk(i,j,k/2)
else
akeato=afgk(j,i,k/2)
endif
return
entry bkeato (i,j,k)
c
c angular coefficient at the exchange coulomb integral gk
c
bkeato=0.0d 00
if (i .lt. j) then
bkeato=afgk(j,i,k/2)
elseif (i.gt.j) then
bkeato=afgk(i,j,k/2)
endif
return
end
double precision function aprdev (a,b,l)
c
c the result of this function is the coefficient of the term of
c power for the product of two polynomes, whose coefficients are
c in rows a and b
c
implicit double precision (a-h,o-z)
dimension a(10),b(10)
aprdev=0.0d 00
do 11 m=1,l
11 aprdev=aprdev+a(m)*b(l+1-m)
return
end
subroutine bkmrdf (i,j,k)
c
c angular coefficients for the breit term
c i and j are the numbers of orbitals
c k is the value of k in uk(1,2)
c this programm uses cwig3j
c coefficients for magnetic interaction are in cmag
c and those for retarded term are in cret
c the order correspond to -1 0 and +1
c
implicit double precision (a-h,o-z)
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
common/tabre/cmag(3),cret(3)
do 12 l=1,3
cmag(l)=0.0d 00
12 cret(l)=0.0d 00
ji=2* abs(kap(i))-1
jj=2* abs(kap(j))-1
kam=kap(j)-kap(i)
l=k-1
do 51 m=1,3
if (l.lt.0) go to 51
a=cwig3j(ji,jj,l+l,-1,1,2)**2
if (a.eq.0.0d 00) go to 51
c=l+l+1
if (m-2) 14,16,17
14 cm=(kam+k)**2
cz=kam*kam-k*k
cp=(k-kam)**2
n=k
15 l1=l+1
am=(kam-l)*(kam+l1)/c
az=(kam*kam+l*l1)/c
ap=(l+kam)*(kam-l1)/c
d=n*(k+k+1)
go to 31
16 d=k*(k+1)
cm=(kap(i)+kap(j))**2
cz=cm
cp=cm
go to 41
17 cm=(kam-l)**2
cz=kam*kam-l*l
cp=(kam+l)**2
n=l
c=-c
go to 15
31 c= abs(c)*d
if (c.ne.0.0d 00) c=n/c
cret(1)=cret(1)+a*(am-c*cm)
cret(2)=cret(2)+(a+a)*(az-c*cz)
cret(3)=cret(3)+a*(ap-c*cp)
41 if (d.eq.0.0d 00) go to 51
a=a/d
cmag(1)=cmag(1)+cm*a
cmag(2)=cmag(2)+cz*(a+a)
cmag(3)=cmag(3)+cp*a
51 l=l+1
return
end
subroutine cofcon (a,b,p,q)
c
c acceleration of the convergence in the iterative process
c b is the part of final iteration n is a function of the error (p)
c (p) at iteration n and the error (q) at the iteration n-1.
c if the product p*q is positive b is increased by 0.1
c zero b is unchanged
c negative b is decreased by 0.1
c b is between 0.1 and 0.9
c a = 1. - b
c ** at the end makes q=p
c
implicit double precision (a-h,o-z)
if (p*q) 11,31,21
11 if (b .ge. 0.2D0) b = b - 0.1D0
go to 31
21 if (b .le. 0.8D0) b = b + 0.1D0
31 a = 1.0D0 - b
q=p
return
end
double precision function cwig3j (j1,j2,j3,m1,m2,ient)
c
c wigner 3j coefficient for integers (ient=1)
c or semiintegers (ient=2)
c other arguments should be multiplied by ient
c
implicit double precision (a-h,o-z)
save
character*512 slog
dimension al(32),m(12)
data ini/1/,idim/31/
c
c idim-1 is the largest argument of factorial in calculations
c
m3=-m1-m2
if (ini) 1,21,1
c
c initialisation of the log's of the factorials
c
1 ini=0
al(1)=0.0d 00
do 11 i=1,idim
b=i
11 al(i+1)=al(i)+ log(b)
21 cwig3j=0.0d 00
if (((ient-1)*(ient-2)).ne.0) go to 101
ii=ient+ient
c
c test triangular inequalities, parity and maximum values of m
c
if (( abs(m1)+ abs(m2)).eq.0.and.mod(j1+j2+j3,ii).ne.0) go to 99
m(1)=j1+j2-j3
m(2)=j2+j3-j1
m(3)=j3+j1-j2
m(4)=j1+m1
m(5)=j1-m1
m(6)=j2+m2
m(7)=j2-m2
m(8)=j3+m3
m(9)=j3-m3
m(10)=j1+j2+j3+ient
m(11)=j2-j3-m1
m(12)=j1-j3+m2
do 41 i=1,12
if (i.gt.10) go to 31
if (m(i).lt.0) go to 99
31 if (mod(m(i),ient).ne.0) go to 101
m(i)=m(i)/ient
if (m(i).gt.idim) go to 101
41 continue
c
c calculate 3j coefficient
c
max0= max(m(11),m(12),0)+1
min0= min(m(1),m(5),m(6))+1
isig=1
if (mod(max0-1,2).ne.0) isig=-isig
c=-al(m(10)+1)
do 61 i=1,9
61 c=c+al(m(i)+1)
c=c/2.0d 00
do 71 i=max0,min0
j=2-i
b=al(i)+al(j+m(1))+al(j+m(5))+al(j+m(6))+al(i-m(11))+al(i-m(12))
cwig3j=cwig3j+isig* exp(c-b)
71 isig=-isig
if (mod(j1-j2-m3,ii).ne.0) cwig3j=-cwig3j
99 return
101 write(slog,'(a,6i5)') 'error in cwig3j ',j1,j2,j3,m1,m2,ient
call wlog(slog,1)
stop
end
double precision function dentfa (dr,dz,ch)
c
c analitical approximation of potential is created for electrons in
c thomas-fermi model for atom or free ion. dr distance from nucleus
c with charge dz
c ch=ionicity = number of electrons-dz-1
c
implicit double precision (a-h,o-z)
dentfa=0.0d 00
if ((dz+ch).lt.1.0d-04) return
w=dr*(dz+ch)**(1.D0/3.D0)
w=sqrt(w/0.8853D0)
t=w*(0.60112D0*w+1.81061D0)+1.D0
w=w*(w*(w*(w*(0.04793D0*w+0.21465D0)+0.77112D0)+1.39515D0)+
1 1.81061D0)+1D0
dentfa=(dz+ch)*(1.0d 00-(t/w)**2)/dr
return
end
double precision function dsordf (i,j,n,jnd,a)
c
c * calculation of diff. integrals*
c integration by simpson method of the hg*(r**n)
c hg(l)=cg(l,i)*cg(l,j)+cp(l,i)*cp(l,j) if jnd=1
c hg=expression above multiplied by dg if jnd=-1
c hg(l)=cg(l,i)*cp(l,j) if jnd=2
c hg=expression above multiplied by dg if jnd=-2
c hg(l)=dg(l)*cg(l,i)+dp(l)*cp(l,j) if jnd=3
c hg(l)=dg(l)*dg(l)+dp(l)*dp(l) if jnd=4
c hg is constructed by calling program if jnd>=5
c cg(l,i) large component of the orbital i
c cp(l,j) small component of the orbital j
c a is such that dg,dp or hg following the case
c behave at the origin as cte*r**a
c the integration is made as far as dr(j) for jnd>3
c
c the development limits at the origin (used for calculation
c of integral form 0 to dr(1) ) of functions dg,dp and hg are
c supposed to be in blocks ag,ap and chg respectively
c this program utilises aprdev
c
implicit double precision (a-h,o-z)
common cg(251,30),cp(251,30),bg(10,30),bp(10,30),fl(30),ibgp
common/comdir/cl,dz,dg(251),ag(10),dp(251),ap(10),bidcom(783)
dimension hg(251),chg(10)
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
common/tabtes/hx,dr(251),test1,test2,ndor,np,nes,method,idim
dimension bgi(10),bgj(10),bpi(10),bpj(10)
c
c construction of the array hg
c
if (jnd.le.3) go to 11
max0=j
b=a
go to 101
11 max0= min(nmax(i),nmax(j))
do 15 l= 1,ibgp
bgi(l) = bg(l,i)
bgj(l) = bg(l,j)
bpi(l) = bp(l,i)
15 bpj(l) = bp(l,j)
if ( abs(jnd)-2) 21,55,101
21 do 31 l=1,max0
31 hg(l)=cg(l,i)*cg(l,j)+cp(l,i)*cp(l,j)
do 45 l=1,ndor
45 chg(l)=aprdev(bgi,bgj,l)+aprdev(bpi,bpj,l)
go to 81
55 do 61 l=1,max0
61 hg(l)=cg(l,i)*cp(l,j)
do 71 l=1,ndor
71 chg(l)=aprdev(bgi,bpj,l)
81 b=fl(i)+fl(j)
if (jnd.gt.0) go to 301
do 85 l=1,max0
85 hg(l)=hg(l)*dg(l)
do 87 l=1,ndor
87 ap(l)=chg(l)
b=b+a
do 95 l=1,ndor
95 chg(l)=aprdev(ap,ag,l)
go to 301
101 if (jnd-4) 201,111,301
111 do 121 l=1,max0
121 hg(l)=dg(l)*dg(l)+dp(l)*dp(l)
b=b+b
do 131 l=1,ndor
131 chg(l)=aprdev(ag,ag,l)+aprdev(ap,ap,l)
go to 301
201 do 221 l=1,max0
221 hg(l)=dg(l)*cg(l,i)+dp(l)*cp(l,j)
b=a+fl(i)
do 241 l=1,ndor
241 chg(l)=aprdev(bgi,ag,l)+aprdev(bpj,ap,l)
c
c integration of the hg
c
301 dsordf=0.0d 00
io=n+1
do 305 l=1,max0
305 hg(l)=hg(l)*(dr(l)**io)
do 311 l=2,max0,2
311 dsordf=dsordf+hg(l)+hg(l)+hg(l+1)
dsordf=hx*(dsordf+dsordf+hg(1)-hg(max0))/3.0d 00
c
c integral from 0 to dr(1)
c
b=b+n
do 331 l=1,ndor
b=b+1.0d 00
331 dsordf=dsordf+chg(l)*(dr(1)**b)/b
return
end
subroutine etotal (kap,xnel,en,iprint,eatom)
c
c combined from original subroutines tabfgk,tabbre,tabrat.
c kap quantique number "kappa"
c xnel occupation of orbitales (can be fractional)
c en one-electron energies
c fdrirk function calculating radial integrals rk
c akeato angular coefficient for integrals fk, for the
c integrals fk(i;i) gives angular coefficients multiplied by 2
c bkeato angular coefficient for integrals gk
c coul ener(1) direct coulomb interaction
c ech ener(2) exchange coulomb interaction
c * average value of the breit hamiltonian *
c fdrocc function of the orbitals' occupations.
c bkmrdf is a programm to calculate angular coefficients
c ema ener(3) magnetic energy
c ere ener(4) retardation term
c sous programmes utilises akeato,bkeato
c fdrocc fdrirk bkmrdf
c
implicit double precision (a-h,o-z)
dimension kap(30),xnel(30),en(30)
common/itescf/testy,rap(2),teste,nz,norb,norbsc
dimension ener(4)
dimension cer(17)
common/tabre/cmag(3),cret(3)
common/inelma/nem
character*4 iner(4)
character*512 slog
data iner/'coul','ech.','mag.','ret.'/
do 10 i = 1,4
10 ener(i)=0.0d 00
iv=0
c
c fk integrales
c
do 40 i=1,norb
l= abs(kap(i))-1
do 40 j=1,i
a=1.0d 00
if (j.eq.i) a=a+a
m= abs(kap(j))-1
kmi=2* min(l,m)
k=0
20 iv=iv+1
cer(iv)=fdrirk(i,i,j,j,k)
ener(1)=ener(1)+cer(iv)*akeato(i,j,k)/a
if (iv.lt.3) go to 30
iv=0
30 k=k+2
if (k.le.kmi) go to 20
40 continue
iv=0
if (norb.gt.1) then
c
c gk integrales
c
do 70 i=2,norb
i1=i-1
do 70 j=1,i1
l= abs(kap(i))
m= abs(kap(j))
k= abs(l-m)
if ((kap(i)*kap(j)).lt.0) k=k+1
kmi=l+m-1
50 iv=iv+1
cer(iv)=fdrirk(i,j,i,j,k)
ener(2) = ener(2) -cer(iv)*bkeato(i,j,k)
if (iv.lt.3) go to 60
iv=0
60 k=k+2
if (k.le.kmi) go to 50
70 continue
endif
c
nem=1
c
c direct integrales
c
ik=0
do 140 j=1,norb
jj=2* abs(kap(j))-1
do 140 i=1,j
ji=2* abs(kap(i))-1
k=1
kma= min(ji,jj)
110 ik=ik+1
cer(ik)=fdrirk(j,j,i,i,k)
if (i.ne.j) go to 120
call bkmrdf (j,j,k)
ener(3)=ener(3)+(cmag(1)+cmag(2)+cmag(3))*cer(ik)*
1 fdmocc(j,j)/2.0d 00
120 if (ik.lt.3) go to 130
ik=0
130 k=k+2
if (k.le.kma) go to 110
140 continue
if (norb.gt.1) then
c
c exchange integrales
c
do 201 j=2,norb
lj= abs(kap(j))
na=-1
if (kap(j).gt.0) go to 121
na=-na
lj=lj-1
121 jp=j-1
do 201 l=1,jp
ll= abs(kap(l))
nb=-1
if (kap(l).gt.0) go to 131
nb=-nb
ll=ll-1
131 b=fdmocc(j,l)
nm1= abs(lj+na-ll)
nmp1=ll+lj+nb
nmm1=ll+lj+na
np1= abs(ll+nb-lj)
k= min(nm1,np1)
kma=max(nmp1,nmm1)
if (mod(k+ll+lj,2).eq.0) k=k+1
nb= abs(kap(j))+ abs(kap(l))
141 call bkmrdf (j,l,k)
do 151 i=1,3
151 cer(i)=0.0d 00
if (nb.le.k.and.kap(l).lt.0.and.kap(j).gt.0) go to 161
cer(1)=fdrirk(l,j,l,j,k)
cer(2)=fdrirk(0,0,j,l,k)
161 if (nb.le.k.and.kap(l).gt.0.and.kap(j).lt.0) go to 171
cer(3)=fdrirk(j,l,j,l,k)
if (cer(2).ne.0.0d 00) go to 171
cer(2)=fdrirk(0,0,l,j,k)
171 do 185 i=1,3
ener(3) =ener(3) +cmag(i)*cer(i)*b
185 ener(4) =ener(4) +cret(i)*cer(i)*b
k=k+2
if (k.le.kma) go to 141
201 continue
endif
c
c total energy
c
eatom = -(ener(1)+ener(2))+ener(3)+ener(4)
do 212 j=1,norb
212 eatom = eatom + en(j)*xnel(j)
if (iprint .ge. 1) write(16,'(a,1pd18.7)') 'etot',eatom
write(slog,'(a,1pd18.7)') 'etot',eatom
call wlog(slog,0)
do 215 i=1,4
if (iprint .ge. 1) write(16,'(a4,1pd18.7)') iner(i),ener(i)
write(slog,'(a4,1pd18.7)') iner(i),ener(i)
215 call wlog(slog,0)
return
end
c
double precision function fdmocc (i,j)
c
c product of the occupation numbers of the orbitals i and j
c
implicit double precision (a-h,o-z)
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
if (j.eq.i) then
fdmocc=xnel(i)*(xnel(j)-1)
a=2* abs(kap(i))
fdmocc=fdmocc*a/(a-1.0D0)
else
fdmocc=xnel(i)*xnel(j)
endif
return
end
c
double precision function fdrirk (i,j,l,m,k)
c
c * calculate radial integrales rk *
c rk = integral of f(r) * uk(r,s) * g(s)
c uk(r,s) = rinf**k / rsup**(k+1) rinf=min(r,s) rsup=max(r,s)
c if nem=0 f(.)=cg(.,i)*cg(.,j)+cp(.,i)*cp(.,j)
c g(.)=cg(.,l)*cg(.,m)+cp(.,l)*cp(.,m)
c if nem non zero f(.)=cg(.,i)*cp(.,j)
c g(.)=cg(.,l)*cp(.,m)
c cg (cp) large (small) componenents of the orbitales
c moreover if nem > or =0 the integration is made from 0 to infinity,
c and otherwise from 0 to r.
c this programm uses yzkrdf and dsordf
c
implicit double precision (a-h,o-z)
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
common/comdir/cl,dz,dg(251),ag(10),dp(251),ap(10),bidcom(783)
c
c comdir is used just to exchange variables between dsordf,yzkrdf,fdrirk
c
dimension hg(251)
common/inelma/nem
common/tabtes/hx,dr(251),test1,test2,ndor,np,nes,method,idim
save
fdrirk=0.0d 00
if (i.le.0.or.j.le.0) go to 201
call yzkrdf (i,j,k)
nn= abs(kap(i))+ abs(kap(j))
nn=max(nn-k,1)
a=k+1
do 21 n=1,ndor
21 hg(n)=0.0d 00
do 31 n=1,ndor
if (nn.gt.ndor) go to 31
hg(nn)=-ag(n)
31 nn=nn+1
do 41 n=1,ndor
41 ag(n)=hg(n)
ag(1)=ag(1)+ap(1)
201 if (l.le.0.or.m.le.0) return
n=-1
if (nem.ne.0) n=-2
fdrirk=dsordf(l,m,-1,n,a)
return
end
c
subroutine getorb (iz, ihole, xion, norb, norbco,
1 iholep, den, nqn, nk, xnel, xnval)
c
c Gets orbital data for chosen element. Input is iz, atomic number
c of desired element, other arguments are output.
c Feel free to change occupation numbers for element of interest.
c ival(i) is necessary only for partly nonlocal exchange model.
c iocc(i) and ival(i) can be fractional
c But you have to keep the sum of iocc(i) equal to nuclear charge.
c Also ival(i) should be equal to iocc(i) or zero.
c Otherwise you have to change this subroutine or contact authors
c for help.
c
implicit double precision (a-h, o-z)
c
c Written by Steven Zabinsky, July 1989
c modified (20 aug 1989) table increased to at no 97
c Recipe for final state configuration is changed. Valence
c electron occupations are added. ala 17.1.1996
c Table for each element has occupation of the various levels.
c The order of the levels in each array is:
c element level principal qn (nqn), kappa qn (nk)
c 1 1s 1 -1
c 2 2s 2 -1
c 3 2p1/2 2 1
c 4 2p3/2 2 -2
c 5 3s 3 -1
c 6 3p1/2 3 1
c 7 3p3/2 3 -2
c 8 3d3/2 3 2
c 9 3d5/2 3 -3
c 10 4s 4 -1
c 11 4p1/2 4 1
c 12 4p3/2 4 -2
c 13 4d3/2 4 2
c 14 4d5/2 4 -3
c 15 4f5/2 4 3
c 16 4f7/2 4 -4
c 17 5s 5 -1
c 18 5p1/2 5 1
c 19 5p3/2 5 -2
c 20 5d3/2 5 2
c 21 5d5/2 5 -3
c 22 5f5/2 5 3
c 23 5f7/2 5 -4
c 24 6s 6 -1
c 25 6p1/2 6 1
c 26 6p3/2 6 -2
c 27 6d3/2 6 2
c 28 6d5/2 6 -3
c 29 7s 7 -1
c
dimension den(30), nqn(30), nk(30), xnel(30), xnval(30)
dimension kappa (29)
real iocc, ival
dimension iocc (97, 29), ival (97, 29)
dimension nnum (29)
character*512 slog
c
c kappa quantum number for each orbital
c k = - (j + 1/2) if l = j - 1/2
c k = + (j + 1/2) if l = j + 1/2
c
data kappa /-1,-1, 1,-2,-1, 1,-2, 2,-3,-1, 1,-2, 2,-3, 3,
1 -4,-1, 1,-2, 2, -3, 3,-4,-1, 1, -2, 2,-3,-1/
c
c principal quantum number (energy eigenvalue)
c
data nnum /1,2,2,2,3, 3,3,3,3,4, 4,4,4,4,4,
1 4,5,5,5,5, 5,5,5,6,6, 6,6,6,7/
c
c occupation of each level for z = 1, 97
c
data (iocc( 1,i),i=1,29) /1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival( 1,i),i=1,29) /1,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc( 2,i),i=1,29) /2,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival( 2,i),i=1,29) /2,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc( 3,i),i=1,29) /2,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival( 3,i),i=1,29) /0,1,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc( 4,i),i=1,29) /2,2,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival( 4,i),i=1,29) /0,2,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc( 5,i),i=1,29) /2,2,1,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival( 5,i),i=1,29) /0,2,1,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc( 6,i),i=1,29) /2,2,2,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival( 6,i),i=1,29) /0,2,2,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc( 7,i),i=1,29) /2,2,2,1,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival( 7,i),i=1,29) /0,2,2,1,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc( 8,i),i=1,29) /2,2,2,2,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival( 8,i),i=1,29) /0,2,2,2,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc( 9,i),i=1,29) /2,2,2,3,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival( 9,i),i=1,29) /0,2,2,3,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(10,i),i=1,29) /2,2,2,4,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(10,i),i=1,29) /0,2,2,4,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(11,i),i=1,29) /2,2,2,4,1, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(11,i),i=1,29) /0,0,0,0,1, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(12,i),i=1,29) /2,2,2,4,2, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(12,i),i=1,29) /0,0,0,0,2, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(13,i),i=1,29) /2,2,2,4,2, 1,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(13,i),i=1,29) /0,0,0,0,2, 1,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(14,i),i=1,29) /2,2,2,4,2, 2,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(14,i),i=1,29) /0,0,0,0,2, 2,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(15,i),i=1,29) /2,2,2,4,2, 2,1,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(15,i),i=1,29) /0,0,0,0,2, 2,1,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(16,i),i=1,29) /2,2,2,4,2, 2,2,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(16,i),i=1,29) /0,0,0,0,2, 2,2,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(17,i),i=1,29) /2,2,2,4,2, 2,3,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(17,i),i=1,29) /0,0,0,0,2, 2,3,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(18,i),i=1,29) /2,2,2,4,2, 2,4,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(18,i),i=1,29) /0,0,0,0,2, 2,4,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(19,i),i=1,29) /2,2,2,4,2, 2,4,0,0,1, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(19,i),i=1,29) /0,0,0,0,0, 0,0,0,0,1, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(20,i),i=1,29) /2,2,2,4,2, 2,4,0,0,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(20,i),i=1,29) /0,0,0,0,0, 0,0,0,0,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(21,i),i=1,29) /2,2,2,4,2, 2,4,1,0,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(21,i),i=1,29) /0,0,0,0,0, 0,0,1,0,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(22,i),i=1,29) /2,2,2,4,2, 2,4,2,0,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(22,i),i=1,29) /0,0,0,0,0, 0,0,2,0,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(23,i),i=1,29) /2,2,2,4,2, 2,4,3,0,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(23,i),i=1,29) /0,0,0,0,0, 0,0,3,0,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(24,i),i=1,29) /2,2,2,4,2, 2,4,4,1,1, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(24,i),i=1,29) /0,0,0,0,0, 0,0,4,1,1, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(25,i),i=1,29) /2,2,2,4,2, 2,4,4,1,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(25,i),i=1,29) /0,0,0,0,0, 0,0,4,1,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(26,i),i=1,29) /2,2,2,4,2, 2,4,4,2,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(26,i),i=1,29) /0,0,0,0,0, 0,0,4,2,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(27,i),i=1,29) /2,2,2,4,2, 2,4,4,3,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(27,i),i=1,29) /0,0,0,0,0, 0,0,4,3,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(28,i),i=1,29) /2,2,2,4,2, 2,4,4,4,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(28,i),i=1,29) /0,0,0,0,0, 0,0,4,4,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(29,i),i=1,29) /2,2,2,4,2, 2,4,4,6,1, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(29,i),i=1,29) /0,0,0,0,0, 0,0,4,6,1, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(30,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(30,i),i=1,29) /0,0,0,0,0, 0,0,4,6,2, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(31,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 1,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(31,i),i=1,29) /0,0,0,0,0, 0,0,0,0,2, 1,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(32,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(32,i),i=1,29) /0,0,0,0,0, 0,0,0,0,2, 2,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(33,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,1,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(33,i),i=1,29) /0,0,0,0,0, 0,0,0,0,2, 2,1,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(34,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,2,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(34,i),i=1,29) /0,0,0,0,0, 0,0,0,0,2, 2,2,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(35,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,3,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(35,i),i=1,29) /0,0,0,0,0, 0,0,0,0,2, 2,3,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(36,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(36,i),i=1,29) /0,0,0,0,0, 0,0,0,0,2, 2,4,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(37,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,0,0,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(37,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(38,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,0,0,0,
1 0,2,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(38,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,2,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(39,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,1,0,0,
1 0,2,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(39,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,1,0,0,
1 0,2,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(40,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,2,0,0,
1 0,2,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(40,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,2,0,0,
1 0,2,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(41,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,0,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(41,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,4,0,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(42,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,1,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(42,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,4,1,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(43,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,1,0,
1 0,2,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(43,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,4,1,0,
1 0,2,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(44,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,3,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(44,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,4,3,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(45,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,4,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(45,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,4,4,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(46,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(46,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,4,6,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(47,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(47,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,4,6,0,
1 0,1,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(48,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,2,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(48,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,4,6,0,
1 0,2,0,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(49,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,2,1,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(49,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,2,1,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(50,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,2,2,0,0, 0,0,0,0,0, 0,0,0,0/
data (ival(50,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,2,2,0,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(51,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,2,2,1,0, 0,0,0,0,0, 0,0,0,0/
data (ival(51,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,2,2,1,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(52,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,2,2,2,0, 0,0,0,0,0, 0,0,0,0/
data (ival(52,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,2,2,2,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(53,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,2,2,3,0, 0,0,0,0,0, 0,0,0,0/
data (ival(53,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,2,2,3,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(54,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,2,2,4,0, 0,0,0,0,0, 0,0,0,0/
data (ival(54,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,2,2,4,0, 0,0,0,0,0, 0,0,0,0/
data (iocc(55,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,2,2,4,0, 0,0,0,1,0, 0,0,0,0/
data (ival(55,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,1,0, 0,0,0,0/
data (iocc(56,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(56,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(57,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,0,
1 0,2,2,4,1, 0,0,0,2,0, 0,0,0,0/
data (ival(57,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,1, 0,0,0,2,0, 0,0,0,0/
data (iocc(58,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,2,
1 0,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(58,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,2,
1 0,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(59,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,3,
1 0,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(59,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,3,
1 0,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(60,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,4,
1 0,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(60,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,4,
1 0,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(61,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,5,
1 0,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(61,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,5,
1 0,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(62,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 0,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(62,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,6,
1 0,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(63,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 1,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(63,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,6,
1 1,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(64,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 1,2,2,4,1, 0,0,0,2,0, 0,0,0,0/
data (ival(64,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,6,
1 1,0,0,0,1, 0,0,0,2,0, 0,0,0,0/
data (iocc(65,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 3,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(65,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,6,
1 3,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(66,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 4,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(66,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,6,
1 4,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(67,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 5,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(67,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,6,
1 5,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(68,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 6,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(68,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,6,
1 6,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(69,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 7,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(69,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,6,
1 7,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(70,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,0, 0,0,0,2,0, 0,0,0,0/
data (ival(70,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,6,
1 8,0,0,0,0, 0,0,0,2,0, 0,0,0,0/
data (iocc(71,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,1, 0,0,0,2,0, 0,0,0,0/
data (ival(71,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,1, 0,0,0,2,0, 0,0,0,0/
data (iocc(72,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,2, 0,0,0,2,0, 0,0,0,0/
data (ival(72,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,2, 0,0,0,2,0, 0,0,0,0/
data (iocc(73,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,3, 0,0,0,2,0, 0,0,0,0/
data (ival(73,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,3, 0,0,0,2,0, 0,0,0,0/
data (iocc(74,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 0,0,0,2,0, 0,0,0,0/
data (ival(74,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,4, 0,0,0,2,0, 0,0,0,0/
data (iocc(75,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 1,0,0,2,0, 0,0,0,0/
data (ival(75,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,4, 1,0,0,2,0, 0,0,0,0/
data (iocc(76,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 2,0,0,2,0, 0,0,0,0/
data (ival(76,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,4, 2,0,0,2,0, 0,0,0,0/
data (iocc(77,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 3,0,0,2,0, 0,0,0,0/
data (ival(77,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,4, 3,0,0,2,0, 0,0,0,0/
data (iocc(78,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 5,0,0,1,0, 0,0,0,0/
data (ival(78,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,4, 5,0,0,1,0, 0,0,0,0/
data (iocc(79,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,1,0, 0,0,0,0/
data (ival(79,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,4, 6,0,0,1,0, 0,0,0,0/
data (iocc(80,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,0, 0,0,0,0/
data (ival(80,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,4, 6,0,0,2,0, 0,0,0,0/
data (iocc(81,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,1, 0,0,0,0/
data (ival(81,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,2,1, 0,0,0,0/
data (iocc(82,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,2, 0,0,0,0/
data (ival(82,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,2,2, 0,0,0,0/
data (iocc(83,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,2, 1,0,0,0/
data (ival(83,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,2,2, 1,0,0,0/
data (iocc(84,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,2, 2,0,0,0/
data (ival(84,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,2,2, 2,0,0,0/
data (iocc(85,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,2, 3,0,0,0/
data (ival(85,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,2,2, 3,0,0,0/
data (iocc(86,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,2, 4,0,0,0/
data (ival(86,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,2,2, 4,0,0,0/
data (iocc(87,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,2, 4,0,0,1/
data (ival(87,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,1/
data (iocc(88,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,2, 4,0,0,2/
data (ival(88,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,0,0,2/
data (iocc(89,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,2, 4,1,0,2/
data (ival(89,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,1,0,2/
data (iocc(90,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,0,0,2,2, 4,2,0,2/
data (ival(90,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,0,0,0,0, 0,2,0,2/
data (iocc(91,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,2,0,2,2, 4,1,0,2/
data (ival(91,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,2,0,0,0, 0,1,0,2/
data (iocc(92,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,3,0,2,2, 4,1,0,2/
data (ival(92,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,3,0,0,0, 0,1,0,2/
data (iocc(93,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,4,0,2,2, 4,1,0,2/
data (ival(93,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,4,0,0,0, 0,1,0,2/
data (iocc(94,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,6,0,2,2, 4,0,0,2/
data (ival(94,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,6,0,0,0, 0,0,0,2/
data (iocc(95,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,6,1,2,2, 4,0,0,2/
data (ival(95,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,6,1,0,0, 0,0,0,2/
data (iocc(96,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,6,2,2,2, 4,0,0,2/
data (ival(96,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,6,2,0,0, 0,0,0,2/
data (iocc(97,i),i=1,29) /2,2,2,4,2, 2,4,4,6,2, 2,4,4,6,6,
1 8,2,2,4,4, 6,6,3,2,2, 4,0,0,2/
data (ival(97,i),i=1,29) /0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0,
1 0,0,0,0,0, 0,6,3,0,0, 0,0,0,2/
if (iz .lt. 1 .or. iz .ge. 97) then
8 format(' Atomic number ', i5, ' not available.')
write(slog,8) iz
call wlog(slog,1)
stop
endif
ion = nint(xion)
delion=xion-ion
index = iz - ion
ilast = 0
iscr = 0
iion = 0
iholep = ihole
c
c find last occupied orbital (ilast) and iion for delion.ge.0
c
do 30 i=29,1,-1
if (iion.eq.0 .and. dble(iocc(index,i)).gt.delion) iion=i
if (ilast.eq.0 .and. iocc(index,i).gt.0) ilast=i
30 continue
c open(unit=91,file='getorbtuo.dat',status='unknown')
c iz=29
if (ihole.eq.0) go to 11
if (ihole.gt.0 .and. iocc(index,ihole) .lt. 1 .or.
1 (ihole.eq.ilast .and. iocc(index,ihole)-real(delion).lt.1) ) then
c call wlog(' Cannot remove an electron from this level',1)
write(6,*)' Cannot remove an electron from level =', ihole
write(6,*) ' stop in getorb '
stop 'GETORB-1'
endif
11 continue
c
c the recipe for final state atomic configuration is changed
c from iz+1 prescription, since sometimes it changed occupation
c numbers in more than two orbitals. This could be consistent
c only with s02=0.0. New recipe remedy this deficiency.
c
c find where to put screening electron
c
index1 = index + 1
do 10 i = 1, 29
10 if (iscr.eq.0 .and. (iocc(index1,i)-iocc(index,i)).gt.0.5) iscr=i
c
c special case of hydrogen like ion
c if (index.eq.1) iscr=2
c
c find where to add or subtract charge delion (iion).
c if (delion .ge. 0) then
c removal of electron charge
c iion is already found
c
if (delion .lt. 0) then
c
c addition of electron charge
c
iion = iscr
c
c except special cases
c
if (ihole.ne.0 .and.
1 iocc(index,iscr)+1-real(delion).gt.2*abs(kappa(iscr))) then
iion = ilast
if (ilast.eq.iscr .or. iocc(index,ilast)-real(delion).gt.
1 2*abs(kappa(ilast)) ) iion = ilast + 1
endif
endif
norb = 0
do 20 i = 1, 29
if (iocc(index,i).gt.0 .or. (i.eq.iscr .and. ihole.gt.0)
1 .or. (i.eq.iion .and. iocc(index,i)-real(delion).gt.0)) then
if (i.ne.ihole .or. iocc(index,i).ge.1) then
norb = norb + 1
nqn(norb) = nnum(i)
nk(norb) = kappa(i)
xnel(norb) = dble(iocc(index,i))
if (i.eq.ihole) then
xnel(norb) = xnel(norb) - 1
iholep = norb
endif
if (i.eq.iscr .and. ihole.gt.0) xnel(norb)=xnel(norb)+1
xnval(norb)= dble(ival(index,i))
if (i.eq.ihole .and. xnval(norb).ge.1)
1 xnval(norb) = xnval(norb) - 1
if (i.eq.iscr .and. ihole.gt.0)
1 xnval(norb) = xnval(norb) + 1
if (i.eq.iion) xnel(norb) = xnel(norb) - delion
if (i.eq.iion) xnval(norb) = xnval(norb) - delion
den(norb) = 0.0D0
endif
endif
20 continue
norbco = norb
c
c check that all occupation numbers are within limits
c
do 50 i = 1, norb
if ( xnel(i).lt.0 .or. xnel(i).gt.2*abs(nk(i)) .or.
1 xnval(i).lt.0 .or. xnval(i).gt.2*abs(nk(i)) ) then
write (slog,55) i
55 format(' error in getorb.f. Check occupation number for ',
1 i3, '-th orbital. May be a problem with ionicity.')
call wlog(slog,1)
stop
endif
50 continue
c do 60 i=1,norb
c60 xnval(i) = 0.0d0
c60 xnval(i) = xnel(i)
return
end
subroutine inmuat (ihole, xionin)
implicit double precision (a-h,o-z)
common/itescf/testy,rap(2),teste,nz,norb,norbsc
c the meaning of common variables is described below
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
c
dimension xnval(30)
c
c en one-electron energies
c scc factors for acceleration of convergence
c scw precisions of wave functions
c sce precisions of one-electron energies
c nmax number of tabulation points for orbitals
c
common/scrhf1/eps(435),nre(30),ipl
c
c eps non diagonal lagrange parameters
c nre distingue: - the shell is closed (nre <0)
c the shell is open (nre>0)
c - the orbitals in the integral rk if abs(nre) > or =2
c ipl define the existence of lagrange parameters (ipl>0)
c
common/snoyau/dvn(251),anoy(10),nuc
c
c dvn nuclear potential
c anoy development coefficients at the origin of nuclear potential
c this development is supposed to be written anoy(i)*r**(i-1)
c nuc index of nuclear radius (nuc=1 for point charge)
c
common/tabtes/hx,dr(251),test1,test2,ndor,np,nes,method,idim
data ideps/435/
ndor=10
call getorb( nz, ihole, xionin, norb, norbsc,
1 iholep, en, nq, kap, xnel, xnval)
xk=0
do 411 i=1,norb
411 xk=xk+xnel(i)
if ( abs(nz-xionin-xk) .gt. 0.001D0) then
call wlog('check number of electrons in getorb.f',1)
stop
endif
norbsc=norb
c
c nz atomic number noi ionicity (nz-number of electrons)
c norb number of orbitals
c xnel(i) number of electrons on orbital i.
c first norbsc orbitals will be determined selfconsistently,
c the rest of orbitals are orthogonolized if iorth is non null,
c and their energies are those on cards if iene is non null
c or otherwise are the values obtained from solving dirac equation
c nes number of attempts in program soldir
c nuc number of points inside nucleus (11 by default)
c
do 171 i=1,ideps
171 eps(i)=0.0d 00
idim = 251
if (mod(idim,2) .eq. 0) idim=idim-1
ipl=0
c
c ipl=0 means no orbitals with the same kappa and no
c orthogonalization needed. Thus it will remain zero only
c for hydrogen atom.
c
do 401 i=1,norb
nre(i)=-1
llq= abs(kap(i))
l=llq+llq
if (kap(i).lt.0) llq=llq-1
if (llq.lt.0.or.llq.ge.nq(i).or.llq.gt.3) then
call wlog('kappa out of range, check getorb.f',1)
stop
endif
nmax(i)=idim
scc(i)=0.3d0
if (xnel(i) .lt. l) nre(i)=1
do 385 j=1,i-1
if (kap(j).ne.kap(i)) go to 385
if (nre(j).gt.0.or.nre(i).gt.0) ipl=ipl+1
385 continue
401 continue
return
end
c
subroutine intdir(gg,gp,ag,ap,ggmat,gpmat,en,fl,agi,api,ainf,max0)
c
c solution of the inhomogenios dirac equation
c gg gp initially exchage terms, at the time of return - wave functions
c ag and ap development coefficients of gg and gp
c ggmat gpmat values at the matching point for the inward integration
c en one-electron energy
c fl power of the first development term at the origin
c agi (api) initial values of the first development coefficients
c at the origin of a large (small) component
c ainf initial value for large component at point dr(max0)
c - at the end of tabulation of gg gp
c
implicit double precision (a-h,o-z)
save
common/comdir/cl,dz,bid1(522),dv(251),av(10),bid2(522)
common/tabtes/hx,dr(251),test1,test2,ndor,np,nes,method,idim
common/subdir/ell,fk,ccl,imm,nd,node,mat
common/messag/dlabpr,numerr
character*8 dlabpr
dimension gg(251),gp(251),ag(10),ap(10),coc(5),cop(5),dg(5),dp(5)
data cop/2.51d+02,-1.274d+03,2.616d+03,-2.774d+03,1.901d+03/,
1coc/-1.9d+01,1.06d+02,-2.64d+02,6.46d+02,2.51d+02/,
2cmixn/4.73d+02/,cmixd/5.02d+02/,hxd/7.2d+02/,npi/5/,icall/0/
c
c numerical method is a 5-point predictor-corrector method
c predicted value p(n) = y(n-1) + c * somme de i=1,5 cop(i)*y'(n-i)
c corrected value c(n) = y(n-1) + c * somme de i=1,4 coc(i)*y'(n-i)
c + coc(5)*p'(n)
c final value y(n) = cmix*c(n) + (1.-cmix)*p(n)
c cmix=cmixn/cmixd
c
if (icall.eq.0) then
icall=1
c=cmixn/cmixd
a=1.0d 00-c
cmc=c*coc(5)
f=coc(1)
do 1 j=2,npi
g=coc(j)
coc(j)=c*f+a*cop(j)
1 f=g
coc(1)=c*cop(1)
endif
c=hx/hxd
ec=en/cl
ag(1)=agi
ap(1)=api
if (imm) 81,15,26
c
c search for the second sign change point
c
15 mat=npi
j=1
16 mat=mat+2
if (mat.ge.np) then
c
c i had trouble with screened k-hole for la, for f-electrons.
c below i still define matching point if one electron energy is
c not less than -1ev. ala, january 1995
c
if (ec .gt. -0.0003D0) then
mat = np - 12
go to 25
endif
numerr=56011
c
c * fail to find matching point
c if you got this error with fractional ionicity, try
c slightly different.(xion=xion+0.01)
c
return
endif
f=dv(mat)+ell/(dr(mat)*dr(mat))
f=(f-ec)*j
if (f) 25,25,16
25 j=-j
if (j.lt.0) go to 16
if (mat .ge. np-npi) mat=np-12
c
c initial values for the outward integration
c
26 do 35 j=2,ndor
k=j-1
a=fl+fk+k
b=fl-fk+k
ep=a*b+av(1)*av(1)
f=(ec+ccl)*ap(k)+ap(j)
g=ec*ag(k)+ag(j)
do 31 i=1,k
f=f-av(i+1)*ap(j-i)
31 g=g-av(i+1)*ag(j-i)
ag(j)=(b*f+av(1)*g)/ep
35 ap(j)=(av(1)*f-a*g)/ep
do 41 i=1,npi
gg(i)=0.0d 00
gp(i)=0.0d 00
dg(i)=0.0d 00
dp(i)=0.0d 00
do 41 j=1,ndor
a=fl+j-1
b=dr(i)**a
a=a*b*c
gg(i)=gg(i)+b*ag(j)
gp(i)=gp(i)+b*ap(j)
dg(i)=dg(i)+a*ag(j)
41 dp(i)=dp(i)+a*ap(j)
i=npi
k=1
ggmat=gg(mat)
gpmat=gp(mat)
c
c integration of the inhomogenious system
c
51 cmcc=cmc*c
55 continue
a=gg(i)+dg(1)*cop(1)
b=gp(i)+dp(1)*cop(1)
i=i+k
ep=gp(i)
eg=gg(i)
gg(i)=a-dg(1)*coc(1)
gp(i)=b-dp(1)*coc(1)
do 61 j=2,npi
a=a+dg(j)*cop(j)
b=b+dp(j)*cop(j)
gg(i)=gg(i)+dg(j)*coc(j)
gp(i)=gp(i)+dp(j)*coc(j)
dg(j-1)=dg(j)
61 dp(j-1)=dp(j)
f=(ec-dv(i))*dr(i)
g=f+ccl*dr(i)
gg(i)=gg(i)+cmcc*(g*b-fk*a+ep)
gp(i)=gp(i)+cmcc*(fk*b-f*a-eg)
dg(npi)=c*(g*gp(i)-fk*gg(i)+ep)
dp(npi)=c*(fk*gp(i)-f*gg(i)-eg)
if (i.ne.mat) go to 55
if (k.lt.0) go to 999
a=ggmat
ggmat=gg(mat)
gg(mat)=a
a=gpmat
gpmat=gp(mat)
gp(mat)=a
if (imm.ne.0) go to 81
c
c initial values for inward integration
c
a=test1* abs(ggmat)
if (ainf.gt.a) ainf=a
max0=np+2
73 a=7.0d+02/cl
75 max0=max0-2
if ((max0+1).le.(mat+npi)) then
numerr=138021
c
c *the last tabulation point is too close to the matching point
c
return
endif
if (((dv(max0)-ec)*dr(max0)*dr(max0)).gt.a) go to 75
81 c=-c
a=- sqrt(-ec*(ccl+ec))
if ((a*dr(max0)).lt.-1.7d+02) go to 73
b=a/(ccl+ec)
f=ainf/ exp(a*dr(max0))
if (f.eq.0.0d 00) f=1.0d 00
do 91 i=1,npi
j=max0+1-i
gg(j)=f* exp(a*dr(j))
gp(j)=b*gg(j)
dg(i)=a*dr(j)*gg(j)*c
91 dp(i)=b*dg(i)
i=max0-npi+1
k=-1
go to 51
999 return
end
c
subroutine lagdat (ia,iex)
c
c * non diagonal lagrange parameteres *
c lagrange parameters involving orbital ia if ia is positive
c all lagrange parameters are calculated if ia is negative or zero
c contribution of the exchange terms is omitted if iex=0
c this program uses akeato(bkeato) fdrirk multrk
c
implicit double precision (a-h,o-z)
common/itescf/testy,rap(2),teste,nz,norb,norbsc
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1 nq(30),kap(30),nmax(30)
common/scrhf1/eps(435),nre(30),ipl
i1= max(ia,1)
idep=1
if (ia.gt.0) go to 15
11 idep=i1+1
15 ji1=2* abs(kap(i1))-1
do 201 i2=idep,norbsc
if (i2.eq.i1.or.kap(i2).ne.kap(i1)) go to 201
if (nre(i1).lt.0.and.nre(i2).lt.0) go to 201
c
c the following line was included to handle the case of single
c electron in 2 s-shells
c probably need to use schmidt orthogonalization in this case
c
if (xnel(i1).eq.xnel(i2)) go to 201
d=0.0d 00
do 101 l=1,norbsc
k=0
jjl=2* abs(kap(l))-1
kma= min(ji1,jjl)
41 a=akeato(l,i1,k)/xnel(i1)
b=a-akeato(l,i2,k)/xnel(i2)
c=b
if (a.ne.0.0d 00) c=c/a
if ( abs(c).lt.1.0d-07) go to 51
d=d+b*fdrirk(l,l,i1,i2,k)
51 k=k+2
if (k.le.kma) go to 41
if (iex.eq.0) go to 101
kma=(ji1+jjl)/2
k= abs(jjl-kma)
if ((kap(i1)*kap(l)).lt.0) k=k+1
61 a=bkeato(l,i2,k)/xnel(i2)
b=a-bkeato(l,i1,k)/xnel(i1)
c=b
if (a.ne.0.0d 00) c=c/a
if ( abs(c).lt.1.0d-07) go to 71
d=d+b*fdrirk(i1,l,i2,l,k)
71 k=k+2
if (k.le.kma) go to 61
101 continue
i= min(i1,i2)
j= max(i1,i2)
eps(i+((j-1)*(j-2))/2)=d/(xnel(i2)-xnel(i1))
201 continue
if (ia.gt.0) go to 999
i1=i1+1
if (i1.lt.norbsc) go to 11
999 return
end
c
subroutine messer
c
c prints error message on the output device
c
implicit double precision (a-h,o-z)
common/messag/dlabpr,numerr
character*8 dlabpr
character*512 slog
ilig=numerr/1000
ier=numerr-1000*ilig
write(slog,'(a,i6,a,i6,a,a8)') 'error number ',ier,
1 ' detected on a line ',ilig,'in the program',dlabpr
call wlog(slog,1)
return
end
c
subroutine muatco
c
c * angular coefficients *
c sous programmes utilises cwig3j
c
implicit double precision (a-h,o-z)
common/itescf/testy,rap(2),teste,nz,norb,norbsc
common/mulabk/afgk
dimension afgk(30,30,0:3)
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
do 511 i=1,30
do 511 j=1,30
do 511 k=0,3
511 afgk(i,j,k)=0.0d 00
do 701 i=1,norb
li= abs(kap(i))*2-1
do 701 j=1,i
lj= abs(kap(j))*2-1
kmax=(li+lj)/2
kmin= abs(li-lj)/2
if ((kap(i)*kap(j)).lt.0) kmin=kmin+1
c
c calculate a_k(i,j)
c
m=0
if (j.eq.i) m=1
afgk(j,i,0)=afgk(j,i,0)+xnel(i)*(xnel(j)-m)
c
c calculate b_k(i,j)
c
b=afgk(j,i,0)
if (j.eq.i) then
a=li
b=-b*(a+1.0d 00)/a
kmin = kmin+2
endif
do 675 k = kmin, kmax,2
afgk(i,j,k/2)=b*(cwig3j(li,k*2,lj,1,0,2)**2)
675 continue
701 continue
return
end
c
subroutine nucdev (a,epai,av,dr,dv,dz,hx,nuc,np,ndor,dr1)
c
c * construction of nuclear potential *
c a atomic mass (negative or null for the point charge)
c epai parameter of the fermi density distribution
c (negative or null for uniform distribution), which is
c cte / (1. + exp((r-rn)/epai) )
c with nuclear radius rn= 2.2677e-05 * (a**(1/3))
c av coefficients of the development at the origin of nuclear potential
c dr tabulation points
c dv nuclear potential
c dz nuclear charge
c hx exponential step
c nuc index of the nuclear radius
c np number of tabulation points
c ndor number of the coefficients for development at the origin
c the declared below arguments are saved, dr1 is the first
c
implicit double precision (a-h,o-z)
dimension av(10),dr(251),dv(251),at(251)
c
c calculate radial mesh
c
if (a.le.1.0d-01) then
nuc=1
else
c dr(nuc)=nuclear radius
c
a=dz*(a**(1.D0/3.D0))*2.2677d-05
b=a/ exp(hx*(nuc-1))
if (b.le.dr1) then
dr1=b
else
c
c increase value of nuc
c
b=log(a/dr1)/hx
nuc=3+2*int(b/2.0D0)
if (nuc.ge.np) stop 'dr1 too small'
c
c index of atomic radius larger than dimension of dr
c
dr1=a*exp(-(nuc-1)*hx)
endif
endif
dr(1)=dr1/dz
do 181 l=2,np
181 dr(l)=dr(1)* exp(hx*(l-1))
if (ndor.lt.5) then
c
c * there should be at least 5 development coefficients
c
call wlog('stopped in programm nucdev, ndor should be > 4.',1)
stop
endif
c
c calculate nuclear potential on calculated radial mesh
c
do 11 i=1,ndor
11 av(i)=0.0d 00
if (epai.le.0.0D0) then
do 15 i=1,np
15 dv(i)=-dz/dr(i)
if (nuc.le.1) then
av(1)=-dz
else
av(2)=-3.0d 00*dz/(dr(nuc)+dr(nuc))
av(4)=-av(2)/(3.0d 00*dr(nuc)*dr(nuc))
l=nuc-1
do 25 i=1,l
25 dv(i)=av(2)+av(4)*dr(i)*dr(i)
endif
else
b= exp(-dr(nuc)/epai)
b=1.0d 00/(1.0d 00+b)
av(4)=b
av(5)=epai*b*(b-1.0d 00)
if (ndor.le.5) go to 45
at(1)=1.0d 00
at(2)=1.0d 00
nf=1
do 41 i=6,ndor
n=i-4
nf=n*nf
dv(1)=n*at(1)
n1=n+1
dv(n1)=1.0d 00
do 35 j=2,n
35 dv(j)=(n-j+2)*at(j-1)+(n-j+1)*at(j)
do 37 j=1,n1
m=n+1-j
l=1
if (mod(j,2).eq.0) l=-l
av(i)=av(i)+l*dv(j)*(b**m)
37 at(j)=dv(j)
41 av(i)=b*av(i)*(epai**n)/nf
45 do 47 i=1,np
b=1.0d 00+ exp((dr(i)-dr(nuc))/epai)
if ((b*av(4)).gt.1.0d+15) go to 51
dv(i)=dr(i)*dr(i)*dr(i)/b
47 l=i
51 if (l.ge.(np-1)) l=np-2
k=l+1
do 55 i=k,np
55 dv(i)=0.0d 00
at(1)=0.0d 00
at(2)=0.0d 00
k=2
do 61 i=4,ndor
k=k+1
do 58 j=1,2
58 at(j)=at(j)+av(i)*(dr(j)**k)/k
av(i)=av(i)/(k*(k-1))
61 av(2)=av(2)+av(i)*(dr(1)**k)
a=hx/2.4d+01
b=a*1.3d+01
k=l+1
do 71 i=3,k
71 at(i)=at(i-1)+b*(dv(i-1)+dv(i))-a*(dv(i-2)+dv(i+1))
dv(l)=at(l)
do 75 i=k,np
75 dv(i)=dv(l)
e= exp(hx)
c=1.0d 00/(e*e)
i=l-1
83 dv(i)=dv(i+1)/e+b*(at(i+1)/e+at(i))-a*(at(i+2)*c+at(i-1)*e)
i=i-1
if (i-1) 85,85,83
85 dv(1)=dv(3)*c+hx*(at(1)+4.0d 00*at(2)/e+at(3)*c)/3.0d 00
av(2)=(av(2)+dv(1))/dr(1)
a=-dz/dv(l)
do 95 i=4,ndor
95 av(i)=-a*av(i)
av(2)=a*av(2)
do 97 i=1,np
97 dv(i)=a*dv(i)/dr(i)
endif
return
end
c
subroutine ortdat (ia)
c
c * orthogonalization by the schmidt procedure*
c the ia orbital is orthogonalized toa all orbitals of the same
c symmetry if ia is positive, otherwise all orbitals of the same
c symmetry are orthogonalized
c this program uses dsordf
c
implicit double precision (a-h,o-z)
common cg(251,30),cp(251,30),bg(10,30),bp(10,30),fl(30),ibgp
common/comdir/cl,dz,dg(251),ag(10),dp(251),ap(10),bidcom(783)
c dg,ag,dp,ap are used to exchange data only with dsordf
common/itescf/testy,rap(2),teste,nz,norb,norbsc
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
common/tabtes/hx,dr(251),test1,test2,ndor,np,nes,method,idim
m=norb
l= max(ia,1)
if (ia.gt.0) go to 11
5 m=l
l=l+1
if (l.gt.norb) go to 999
11 do 15 i=1,idim
dg(i)=0.0d 00
15 dp(i)=0.0d 00
maxl=nmax(l)
do 21 i=1,maxl
dg(i)=cg(i,l)
21 dp(i)=cp(i,l)
do 25 i=1,ndor
ag(i)=bg(i,l)
25 ap(i)=bp(i,l)
do 51 j=1,m
if (j.eq.l.or.kap(j).ne.kap(l)) go to 51
max0=nmax(j)
a=dsordf (j,j,0,3,fl(l))
do 41 i=1,max0
dg(i)=dg(i)-a*cg(i,j)
41 dp(i)=dp(i)-a*cp(i,j)
do 45 i=1,ndor
ag(i)=ag(i)-a*bg(i,j)
45 ap(i)=ap(i)-a*bp(i,j)
maxl= max(maxl,max0)
51 continue
max0= maxl
nmax(l)=max0
a=dsordf (l,max0,0,4,fl(l))
a= sqrt(a)
do 71 i=1,max0
cg(i,l)=dg(i)/a
71 cp(i,l)=dp(i)/a
do 75 i=1,ndor
bg(i,l)=ag(i)/a
75 bp(i,l)=ap(i)/a
if (ia.le.0) go to 5
999 return
end
c
subroutine potrdf (ia)
c
c this programm uses akeato(bkeato),aprdev,multrk,yzkrdf
c
implicit double precision (a-h,o-z)
common cg(251,30),cp(251,30),bg(10,30),bp(10,30),fl(30),ibgp
common/comdir/cl,dz,dg(251),ag(10),dp(251),ap(10),dv(251),av(10),
2 eg(251),ceg(10),ep(251),cep(10)
c dg,dp to get data from yzkrdf, dv,eg,ep -output for soldir
dimension at(251),bt(251)
common/itescf/testy,rap(2),teste,nz,norb,norbsc
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
common/scrhf1/eps(435),nre(30),ipl
common/snoyau/dvn(251),anoy(10),nuc
common/tabtes/hx,dr(251),test1,test2,ndor,np,nes,method,idim
dimension bgj(10),bpj(10)
do 9 i=1,ndor
cep(i)=0.0d 00
ceg(i)=0.0d 00
9 av(i)=anoy(i)
do 11 i=1,idim
at(i)=0.0d 00
bt(i)=0.0d 00
ep(i)=0.0d 00
eg(i)=0.0d 00
11 dv(i)=0.0d 00
c
c coulomb terms
c
jia=2* abs(kap(ia))-1
k=0
21 do 25 i=1,idim
25 dg(i)=0.0d 00
do 31 i=1,ndor
31 ag(i)=0.0d 00
max0=0
do 51 j=1,norb
do 33 i = 1,10
bgj(i) = bg(i,j)
33 bpj(i) = bp(i,j)
m=2* abs(kap(j))-1
if (k.gt.m) go to 51
a=akeato(ia,j,k)/xnel(ia)
if (a.eq.0.0d 00) go to 51
m=nmax(j)
do 35 i=1,m
35 dg(i)=dg(i)+a*(cg(i,j)*cg(i,j)+cp(i,j)*cp(i,j))
n=2* abs(kap(j))-k
l=ndor+2-n
if (l.le.0) go to 51
do 41 i=1,l
m=n-2+i
41 ag(m)=ag(m)+a*(aprdev(bgj,bgj,i)+
1 aprdev(bpj,bpj,i))
51 max0= max(max0,nmax(j))
call yzkrdf (0,max0,k)
do 61 i=1,ndor
l=k+i+3
if (l.gt.ndor) go to 61
av(l)=av(l)-ag(i)
61 continue
do 81 i=1,idim
81 dv(i)=dv(i)+dg(i)
k=k+2
if (k.le.ndor) av(k)=av(k)+ap(1)
if (k.lt.jia) go to 21
c
c exchange terms
c
if (method.eq.0) go to 411
do 201 j=1,norb
if (j-ia) 105,201,105
105 max0=nmax(j)
jj=2* abs(kap(j))-1
kma=(jj+jia)/2
k= abs(jj-kma)
if ((kap(j)*kap(ia)).lt.0) k=k+1
111 a=bkeato(j,ia,k)/xnel(ia)
if (a.eq.0.0d 00) go to 151
call yzkrdf (j,ia,k)
do 121 i=1,max0
eg(i)=eg(i)+a*dg(i)*cg(i,j)
121 ep(i)=ep(i)+a*dg(i)*cp(i,j)
n=k+1+ abs(kap(j))- abs(kap(ia))
if (n.gt.ndor) go to 141
do 135 i=n,ndor
ceg(i)=ceg(i)+bg(i+1-n,j)*a*ap(1)
135 cep(i)=cep(i)+bp(i+1-n,j)*a*ap(1)
141 i=2* abs(kap(j))+1
if (i.gt.ndor) go to 151
do 143 i = 1,10
bgj(i) = bg(i,j)
143 bpj(i) = bp(i,j)
do 145 n=i,ndor
ceg(n)=ceg(n)-a*aprdev(ag,bgj,n+1-i)
145 cep(n)=cep(n)-a*aprdev(ag,bpj,n+1-i)
151 k=k+2
if (k.le.kma) go to 111
201 continue
411 if (ipl.eq.0) go to 511
do 481 j=1,norbsc
if (kap(j).ne.kap(ia).or.j.eq.ia) go to 481
if (nre(j).lt.0.and.nre(ia).lt.0) go to 481
m= max(j,ia)
i= min(j,ia)+((m-1)*(m-2))/2
a=eps(i)*xnel(j)
max0=nmax(j)
do 461 i=1,max0
at(i)=at(i)+a*cg(i,j)
461 bt(i)=bt(i)+a*cp(i,j)
do 471 i=1,ndor
ceg(i)=ceg(i)+bg(i,j)*a
471 cep(i)=cep(i)+bp(i,j)*a
481 continue
c
c addition of nuclear potential and division of potentials and
c their development limits by speed of light
c
511 do 527 i=1,ndor
av(i)=av(i)/cl
cep(i)=cep(i)/cl
527 ceg(i)=ceg(i)/cl
do 531 i=1,idim
dv(i)=(dv(i)/dr(i)+dvn(i))/cl
ep(i)=(ep(i)+bt(i)*dr(i))/cl
531 eg(i)=(eg(i)+at(i)*dr(i))/cl
return
end
c
subroutine potslw (dv,d,dr,dpas,np)
c
c coulomb potential uses a 4-point integration method
c dv=potential; d=density; dp=bloc de travail; dr=radial mesh
c dpas=exponential step;
c np=number of points
c **********************************************************************
c
implicit double precision (a-h,o-z)
save
dimension dv(251), d(251), dp(251), dr(251)
das=dpas/24.0D0
do 10 i=1,np
10 dv(i)=d(i)*dr(i)
dlo=exp(dpas)
dlo2=dlo*dlo
dp(2)=dr(1)*(d(2)-d(1)*dlo2)/(12.0D0*(dlo-1.0D0))
dp(1)=dv(1)/3.0D0-dp(2)/dlo2
dp(2)=dv(2)/3.0D0-dp(2)*dlo2
j=np-1
do 20 i=3,j
20 dp(i)=dp(i-1)+das*(13.0D0*(dv(i)+dv(i-1))-(dv(i-2)+dv(i+1)))
dp(np)=dp(j)
dv(j)=dp(j)
dv(np)=dp(j)
do 30 i=3,j
k=np+1-i
30 dv(k)=dv(k+1)/dlo+das*(13.0D0*(dp(k+1)/dlo+dp(k))-(dp(k+2)/dlo2+dp
1 (k-1)*dlo))
dv(1)=dv(3)/dlo2+dpas*(dp(1)+4.0D0*dp(2)/dlo+dp(3)/dlo2)/3.0D0
do 40 i=1,np
40 dv(i)=dv(i)/dr(i)
return
end
c
subroutine soldir (en,fl,agi,api,ainf,nq,kap,max0,ifail)
c
c resolution of the dirac equation
c p' - kap*p/r = - ( en/cl-v )*g - eg/r
c g' + kap*g/r = ( 2*cl+en/cl-v )*p + ep/r
c at the origin v approximately is -z/(r*cl) due to the point nucleus
c en one-electron energy in atomic units and negative
c fl power of the first term in development at the origin
c agi (api) initial values of the first development coefficient
c at the origin of the large(small)component
c ainf initial value for the large component at the point dr(max0)
c nq principal quantum number kap quantum number kappa
c max0 the last point of tabulation of the wave function
c this programm uses intdir
c
implicit double precision (a-h,o-z)
save
common/comdir/cl,dz,gg(251),ag(10),gp(251),ap(10),dv(251),av(10),
2eg(251),ceg(10),ep(251),cep(10)
c
c gg,gp -output, dv,eg,ep - input
c
dimension hg(251),agh(10),
1hp(251),aph(10),bg(251),bgh(10),bp(251),bph(10)
c
c cl speed of light (approximately 137.037 in atomic units)
c dz nuclear charge
c gg (gp) large (small) component
c hg,hp,bg et bp working space
c dv direct potential (v) eg and ep exchange potentials
c ag,ap,agh,aph,bgh,bph,av,ceg and cep are respectively the
c development coefficients for gg,gp,hg,hp,bg,bp,dv,eg et ep
c
common/tabtes/hx,dr(251),test1,test2,ndor,np,nes,method,idim
c
c hx exponential step
c dr radial mesh
c test1 precision for the matching the small component if method=1
c test2 precision for the normalisation if method=2
c ndor number of terms for the developments at the origin
c np maximum number of the tabulation points
c nes maximum number of attempts to ajust the small component
c method at the initial time distinguish the homoginious (method=0)
c from inhomoginious system. at the end is the index of method used.
c idim dimension of the block dr
c
common/subdir/ell,fk,ccl,imm,nd,node,mat
c
c ell fk*(fk+1)/ccl fk=kap ccl=cl+cl
c imm a flag for the determination of matching point
c nd number of nodes found node number of nodes to be found
c mat index of the matching point
c
common/messag/dlabpr,numerr
character*8 dprlab,dlabpr, drplab
c
c at the time of return numerr should be zero if integration is correct,
c otherwise numerr contains the number of instruction, which
c indicate the sourse and reason for abnornal return.
c
character*512 slog
c
data dprlab/' soldir'/,drplab/' intdir'/
dlabpr=dprlab
enav=1.0d 00
ainf= abs(ainf)
ccl=cl+cl
iex=method
if (method.le.0) method=1
c
c notice that below iex=0,1 and method=1,2 only.
c this was used to simplify block structure of program. ala 11/22/94
c
fk=kap
if (av(1).lt.0.0d 00.and.kap.gt.0) api=-agi*(fk+fl)/av(1)
if (av(1).lt.0.0d 00.and.kap.lt.0) api=-agi*av(1)/(fk-fl)
ell=fk*(fk+1.0d 00)/ccl
node=nq- abs(kap)
if (kap.lt.0) node=node+1
emin=0.0D0
do 91 i=1,np
a=(ell/(dr(i)*dr(i))+dv(i))*cl
if (a.lt.emin) emin=a
91 continue
if (emin .ge. 0.0D0) then
numerr=75011
c
c *potential is apparently positive
c
return
endif
if (en.lt.emin) en=emin*0.9d 00
edep=en
101 numerr=0
test=test1
if (method.gt.1) test=test2
einf=1.0d 00
esup=emin
en=edep
ies=0
nd=0
105 jes=0
106 modmat=0
imm=0
if ( abs((enav-en)/en).lt.1.0d-01) imm=1
enav=en
c
c integration of the inhomogenious system
c
107 do 111 i=1,idim
gg(i)=eg(i)
111 gp(i)=ep(i)
do 115 i=2,ndor
ag(i)=ceg(i-1)
115 ap(i)=cep(i-1)
call intdir (gg,gp,ag,ap,ggmat,gpmat,en,fl,agi,api,ainf,max0)
if (numerr.ne.0) then
dlabpr=drplab
return
endif
if (iex.ne.0) go to 141
c
c match large component for the homogenios system(method=0)
c
a=ggmat/gg(mat)
do 135 i=mat,max0
gg(i)=a*gg(i)
135 gp(i)=a*gp(i)
j=mat
go to 215
c
c integration of the homogenios system
c
141 do 151 i=1,idim
hg(i)=0.0d 00
151 hp(i)=0.0d 00
do 155 i=1,ndor
agh(i)=0.0d 00
155 aph(i)=0.0d 00
imm=1
if (method.eq.1) imm=-1
call intdir (hg,hp,agh,aph,hgmat,hpmat,en,fl,agi,api,ainf,max0)
c
c match the large component for inhomogenious system(method=1)
c
a=gg(mat)-ggmat
if (method.lt.2) then
b=-a/hg(mat)
else
b=gp(mat)-gpmat
ah=hpmat*hg(mat)-hgmat*hp(mat)
if (ah.eq.0.0d 00) go to 263
c=(b*hg(mat)-a*hp(mat))/ah
b=(b*hgmat-a*hpmat)/ah
do 165 i=1,ndor
ag(i)=ag(i)+c*agh(i)
165 ap(i)=ap(i)+c*aph(i)
j=mat-1
do 168 i=1,j
gg(i)=gg(i)+c*hg(i)
168 gp(i)=gp(i)+c*hp(i)
endif
do 173 i=mat,max0
gg(i)=gg(i)+b*hg(i)
173 gp(i)=gp(i)+b*hp(i)
if (method.ge.2) then
c
c integration of the system derived from disagreement in energy
c
do 175 i=2,ndor
bgh(i)=ag(i-1)/cl
175 bph(i)=ap(i-1)/cl
do 177 i=1,max0
bg(i)=gg(i)*dr(i)/cl
177 bp(i)=gp(i)*dr(i)/cl
call intdir (bg,bp,bgh,bph,bgmat,bpmat,en,fl,agi,api,ainf,max0)
c
c match both components for inhomogenious system (method=2)
c
f=bg(mat)-bgmat
g=bp(mat)-bpmat
a=(g*hg(mat)-f*hp(mat))/ah
g=(g*hgmat-f*hpmat)/ah
do 181 i=1,j
bg(i)=bg(i)+a*hg(i)
181 bp(i)=bp(i)+a*hp(i)
do 182 i=1,ndor
bgh(i)=bgh(i)+a*agh(i)
182 bph(i)=bph(i)+a*aph(i)
do 183 i=mat,max0
bg(i)=bg(i)+g*hg(i)
183 bp(i)=bp(i)+g*hp(i)
c
c calculate the norm
c
call norm(b,hp,dr,gg,gp,ag,ap,method,hx,ndor,
1 gpmat,fl,max0,mat)
c
c correction to the energy (method=2)
c
do 186 i=1,max0
186 hg(i)=(gg(i)*bg(i)+gp(i)*bp(i))*dr(i)
ah=0.0d 00
c=0.0d 00
do 187 i=2,max0,2
187 ah=ah+hg(i)+hg(i)+hg(i+1)
ah=hx*(ah+ah+hg(1)-hg(max0))/3.0d 00+hg(1)/(fl+fl+1.0d 00)
f=(1.0d 00-b)/(ah+ah)
c=1.0d 00-b
do 191 i=1,max0
gg(i)=gg(i)+f*bg(i)
191 gp(i)=gp(i)+f*bp(i)
do 195 i=1,ndor
ag(i)=ag(i)+f*bgh(i)
195 ap(i)=ap(i)+f*bph(i)
endif
c
c search for the maximum of the modulus of large component
c
a=0.0d 00
bgh(1)=b
bph(1)=ah
do 211 i=1,max0
g=gg(i)*gg(i)
if (g.le.a) go to 211
a=g
j=i
211 continue
if (j.gt.mat .and. modmat.eq.0) then
modmat=1
mat=j
if (mod(mat,2).eq.0) mat=mat+1
imm=1
if (mat.lt.(max0-10)) go to 107
mat=max0-12
j=mat
if (mod(mat,2).eq.0) mat=mat+1
write(slog,'(a,i4,a,i4)') ' warning mat=',mat,' max0=',max0
call wlog(slog,1)
endif
c
c this case can happen due to bad starting point in scf procedure.
c ignore this warning unless you are getting it at final norb calls of
c soldir. redirected by ala 11/21/94.
c numerr=220021
c * impossible matching point
c go to 899
c compute number of nodes
c
215 nd=1
j= max(j,mat)
do 231 i=2,j
if (gg(i-1).eq.0.0d 00) go to 231
if ((gg(i)/gg(i-1)).le.0.0d 00) nd=nd+1
231 continue
if (nd-node) 251,305,261
251 esup=en
if (einf.lt.0.0d 00) go to 271
en=en*8.0d-01
if ( abs(en).gt.test1) go to 285
numerr=238031
c *zero energy
go to 899
261 einf=en
if (esup.gt.emin) go to 271
263 en=en*1.2d 00
if (en.gt.emin) go to 285
numerr=245041
c
c *energy is lower than the minimum of apparent potential
c
go to 899
271 if ( abs(einf-esup).gt.test1) go to 281
numerr=249051
c
c *the upper and lower limits of energy are identical
c
go to 899
281 en=(einf+esup)/2.0d 00
285 jes=jes+1
if (jes.le.nes) go to 106
c
c *number of attempts to find good number of nodes is over the limit
c this case can happen due to bad starting point in scf procedure.
c ignore this warning unless you are getting it at final norb calls of
c soldir
c
call wlog('warning jes>nes',1)
ifail=1
c
c *redirected by ala 11/21/94.
c numerr=255061
c go to 899
c
c calculation of the norm
c
305 call norm(b,hp,dr,gg,gp,ag,ap,method,hx,ndor,
1 gpmat,fl,max0,mat)
if (method.eq.1) then
c
c correction to the energy (method=1)
c
c=gpmat-gp(mat)
f=gg(mat)*c*cl/b
if (gpmat.ne.0.0d 00) c=c/gpmat
endif
en=en+f
g= abs(f/(en-f))
371 if ((en.ge.0 .or. g.gt.2.0d-01) .or.
1 (abs(c).gt.test .and. (en.lt.esup.or.en.gt.einf))) then
c
c try smaller step in enrgy under above conditions
c
f=f/2.0d 00
g=g/2.0d 00
en=en-f
if (g.gt.test1) go to 371
numerr=29071
c
c *zero energy
c
go to 899
endif
if ( abs(c).gt.test) then
ies=ies+1
if (ies.le.nes) go to 105
ifail=1
call wlog('warning: iteration stopped because ies=nes',1)
c
c everything is fine unless you are getting this message
c on the latest stage selfconsistent process.
c just stopped trying to match lower component
c because number of trials exceeded limit.
c lines below were commented out. ala 11/18/94
c
endif
c
c numerr=298081
c *number of attempts to match the lower component is over the limit
c go to 899
c
c divide by a square root of the norm, and test the sign of w.f.
c
b= sqrt(b)
c=b
if ((ag(1)*agi).lt.0.0d 00.or.(ap(1)*api).lt.0.0d 00) c=-c
do 711 i=1,ndor
ag(i)=ag(i)/c
711 ap(i)=ap(i)/c
if ((gg(1)*agi).lt.0.0d 00.or.(gp(1)*api).lt.0.0d 00) b=-b
do 721 i=1,max0
gg(i)=gg(i)/b
721 gp(i)=gp(i)/b
if (max0.ge.np) return
j=max0+1
do 741 i=j,np
gg(i)=0.0d 00
741 gp(i)=0.0d 00
c
c if everything o'k , exit is here.
c
return
c
c abnormal exit is here, if method.ne.1
c
899 if (iex.eq.0 .or. method.eq.2) go to 999
method=method+1
go to 101
999 return
end
c
subroutine norm(b,hp,dr,gg,gp,ag,ap,method,hx,ndor,
1 gpmat,fl,max0,mat)
c
c calculate norm b. this part of original code was used twice,
c causing difficult block structure. so it was rearranged into
c separate subroutine. ala
c
implicit double precision (a-h, o-z)
dimension hp(251),dr(251),gg(251),gp(251),ag(10),ap(10)
b=0.0d 00
do 311 i=1,max0
311 hp(i)=dr(i)*(gg(i)*gg(i)+gp(i)*gp(i))
if (method.ne.1) go to 315
hp(mat)=hp(mat)+dr(mat)*(gpmat**2-gp(mat)**2)/2.0d 00
315 do 321 i=2,max0,2
321 b=b+hp(i)+hp(i)+hp(i+1)
b=hx*(b+b+hp(1)-hp(max0))/3.0d 00
do 325 i=1,ndor
g=fl+fl+i
g=(dr(1)**g)/g
do 325 j=1,i
325 b=b+ag(j)*g*ag(i+1-j)+ap(j)*g*ap(i+1-j)
return
end
C FUNCTION ISTRLN (STRING) Returns index of last non-blank
C character. Returns zero if string is
C null or all blank.
FUNCTION ISTRLN (STRING)
CHARACTER*(*) STRING
CHARACTER BLANK, TAB
PARAMETER (BLANK = ' ', TAB = ' ')
C there is a tab character here ^
C -- If null string or blank string, return length zero.
ISTRLN = 0
IF (STRING (1:1) .EQ. CHAR(0)) RETURN
IF (STRING .EQ. ' ') RETURN
C -- Find rightmost non-blank character.
ILEN = LEN (STRING)
DO 20 I = ILEN, 1, -1
IF (STRING(I:I).NE.BLANK .AND. STRING(I:I).NE.TAB) GOTO 30
20 CONTINUE
30 ISTRLN = I
RETURN
END
subroutine tabrat
c
c tabulation of the results
c do identifications of orbitals
c nmax number of tabulation points for wave function
c this programm uses dsordf
c
implicit double precision (a-h,o-z)
common/itescf/testy,rap(2),teste,nz,norb,norbsc
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
common /charact/ ttl
character*40 ttl
character*2 titre(30)
character*2 ttire(9)
dimension at(8),mbi(8)
parameter (zero=0)
data ttire /'s ', 'p*', 'p ', 'd*', 'd ', 'f*', 'f ','g*', 'g '/
c
do 110 i=1,norb
if (kap(i) .gt. 0) then
j=2*kap(i)
else
j=-2*kap(i)-1
endif
titre(i)=ttire(j)
110 continue
c
c tabulation of number of points and of average values of
c r**n (n=6,4,2,1,-1,-2,-3)
c
do 201 i=2,8
201 mbi(i)=8-i-i/3-i/4+i/8
lttl = istrln(ttl)
write(16,11) ttl(1:lttl)
11 format (10x,a)
write(16,*)
1'number of electrons nel and average values of r**n in a.u.'
write(16,2061) (mbi(k),k=2,8)
2061 format (4x,'nel',' n=',7(i2,8x))
do 251 i=1,norb
llq= abs(kap(i))-1
j=8
if (llq.le.0) j=7
do 241 k=2,j
241 at(k)=dsordf(i,i,mbi(k),1, zero)
251 write(16,2071) nq(i),titre(i),xnel(i),(at(k),k=2,j)
2071 format(i2,a2,f7.3,7(1pe10.3))
c
c overlap integrals
c
if (norb.le.1) return
write(16,11) ttl(1:lttl)
write(16,321)
321 format(10x,'overlap integrals')
do 351 i=1,norb-1
do 331 j=i+1,norb
if (kap(j).ne.kap(i)) go to 331
at(1)=dsordf(i,j,0,1, zero)
write(16,2091) nq(i),titre(i),nq(j),titre(j),at(1)
331 continue
351 continue
2091 format (4x,i3,a2,i3,a2,f14.7)
return
end
c
subroutine wfirdf (en,ch,nq,kap,nmax,ido,amass,beta)
c
c calculate initial orbiatls from integration of dirac equation
c cg (cp) large (small) radial components
c bg (bp) development coefficients at the origin of cg (cp)
c en one-electron energies
c fl power of the first term of development at the origin
c ch ionicity (nuclear charge - number of electrons)
c nq principal quantum number
c kap quantum number "kappa"
c nmax number of tabulation points for the orbitals
c ibgp first dimension of the arrays bg and bp
c this programmes utilises nucdev,dentfa,soldir et messer
c
implicit double precision (a-h,o-z)
common cg(251,30),cp(251,30),bg(10,30),bp(10,30),fl(30),ibgp
dimension en(30),nq(30),kap(30),nmax(30)
common/comdir/cl,dz,dg(251),ag(10),dp(251),ap(10),
1dv(251),av(10),eg(251),ceg(10),ep(251),cep(10)
common/itescf/testy,rap(2),teste,nz,norb,norbsc
common/inelma/nem
common/messag/dlabpr,numerr
character*8 dlabpr
character*512 slog
common/snoyau/dvn(251),anoy(10),nuc
common/tabtes/hx,dr(251),test1,test2,ndor,np,nes,method,idim
c
c speed of light in atomic units
c
cl=1.370373d+02
c
c make r-mesh and calculate nuclear potential
c hx exponential step
c dr1 first tabulation point multiplied by nz
c
dr1=dr(1)
call nucdev (amass, beta,anoy,dr,dvn,dz,hx,nuc,idim,ndor,dr1)
c
c notice that here nuc=1,
c unless you specified nonzero nuclear mass in nucdev.f
c
a=(dz/cl)**2
if (nuc.gt.1) a=0.0d 00
do 11 j=1,norb
b=kap(j)*kap(j)-a
11 fl(j)= sqrt(b)
c
c calculate potential from thomas-fermi model
c
do 21 i=1,idim
21 dv(i)=(dentfa(dr(i),dz,ch)+dvn(i))/cl
if (numerr.ne.0) return
do 51 i=1,idim
eg(i)=0.0d 00
51 ep(i)=0.0d 00
do 61 i=1,ibgp
ceg(i)=0.0d 00
cep(i)=0.0d 00
61 av(i)=anoy(i)/cl
av(2)=av(2)+dentfa(dr(nuc),dz,ch)/cl
test1=testy/rap(1)
b=test1
c
c resolution of the dirac equation to get initial orbitals
c
if (ido.ne.1) then
call wlog('only option ido=1 left',1)
ido = 1
endif
c
c here was a piece to read orbitals from cards
c
do 281 j=1,norb
bg(1,j)=1.0d 00
i=nq(j)- abs(kap(j))
if (kap(j).lt.0) i=i-1
if (mod(i,2).eq.0) bg(1,j)=-bg(1,j)
if (kap(j).lt.0) go to 201
bp(1,j)=bg(1,j)*cl*(kap(j)+fl(j))/dz
if (nuc.gt.1) bg(1,j)=0.0d 00
go to 211
201 bp(1,j)=bg(1,j)*dz/(cl*(kap(j)-fl(j)))
if (nuc.gt.1) bp(1,j)=0.0d 00
211 np=idim
en(j)=-dz*dz/nq(j)*nq(j)
method=0
call soldir
1 (en(j),fl(j),bg(1,j),bp(1,j),b,nq(j),kap(j),nmax(j),0)
if (numerr.eq.0) go to 251
call messer
write(slog,'(a,2i3)')
1 'soldir failed in wfirdf for orbital nq,kappa ',nq(j),kap(j)
call wlog(slog,1)
go to 281
251 do 261 i=1,ibgp
bg(i,j)=ag(i)
261 bp(i,j)=ap(i)
do 271 i=1,np
cg(i,j)=dg(i)
271 cp(i,j)=dp(i)
281 continue
nem=0
return
end
c
subroutine wlog (string,iprint)
character*(*) string
c
c This output routine is used to replace the PRINT statement
c for output that "goes to the terminal", or to the log file.
c If you use a window based system, you can modify this routine
c to handle the running output elegantly.
c Handle carriage control in the string you pass to wlog.
c
c The log file is also written here, hard coded here.
c
c The log file is unit 11. The log file is opened in the
c main program, program feff.
c
c make sure not to write trailing blanks
c
10 format (a)
il = istrln (string)
if (il .eq. 0) then
if(iprint.eq.1) print 10
write(11,10)
else
if(iprint.eq.1) print 10, string(1:il)
write(11,10) string(1:il)
endif
return
end
c
subroutine yzkrdf (i,j,k)
c
c * calculate function yk *
c yk = r * integral of f(s)*uk(r,s)
c uk(r,s) = rinf**k/rsup**(k+1) rinf=min(r,s) rsup=max(r,s)
c f(s)=cg(s,i)*cg(s,j)+cp(s,i)*cp(s,j) if nem=0
c f(s)=cg(s,i)*cp(s,j) if nem is non zero
c f(s) is constructed by the calling programm if i < or =0
c in the last case a function f (lies in the block dg) is supposedly
c tabulated untill point dr(j), and its' devlopment coefficients
c at the origin are in ag and the power in r of the first term is k+2
c the output functions yk and zk are in the blocks dp and dg.
c at the origin yk = cte * r**(k+1) - developement limit,
c cte lies in ap(1) and development coefficients in ag.
c this programm uses aprdev and yzkteg
c
implicit double precision (a-h,o-z)
common cg(251,30),cp(251,30),bg(10,30),bp(10,30),fl(30),ibgp
common/comdir/cl,dz,dg(251),ag(10),dp(251),ap(10),bidcom(783)
dimension chg(10)
common/ratom1/xnel(30),en(30),scc(30),scw(30),sce(30),
1nq(30),kap(30),nmax(30)
common/tabtes/hx,dr(251),test1,test2,ndor,np,nes,method,idim
common/inelma/nem
dimension bgi(10),bgj(10),bpi(10),bpj(10)
c
if (i.le.0) go to 51
c
c construction of the function f
c
do 5 l= 1,ibgp
bgi(l) = bg(l,i)
bgj(l) = bg(l,j)
bpi(l) = bp(l,i)
5 bpj(l) = bp(l,j)
id= min(nmax(i),nmax(j))
ap(1)=fl(i)+fl(j)
if (nem.ne.0) go to 31
do 11 l=1,id
11 dg(l)=cg(l,i)*cg(l,j)+cp(l,i)*cp(l,j)
do 21 l=1,ndor
21 ag(l)=aprdev(bgi,bgj,l)+aprdev(bpi,bpj,l)
go to 55
31 do 35 l=1,id
35 dg(l)=cg(l,i)*cp(l,j)
do 41 l=1,ndor
41 ag(l)=aprdev(bgi,bpj,l)
go to 55
c
51 ap(1)=k+2
id=j
55 call yzkteg (dg,ag,dp,chg,dr,ap(1),hx,k,ndor,id,idim)
return
end
c
subroutine yzkteg (f,af,g,ag,dr,ap,h,k,nd,np,idim)
c
c calculation of yk(r)=zk(r)+ r**(k+1) * integral from r to
c infinity of f(u) * u**(-k-1)
c zk(r) = r**(-k) * integral from 0 to r of f(u) * u**k
c at the origin f(r)=sum from i=1 to nd of af(i)*r**(ap+i-1)
c dr tabulation points h exponential step
c np number of tabulation points for f
c idim dimension of the blocks f,g and dr
c at the origin yk=cte*r**(k+1)-developement limit
c the constant for yk lies in ap
c output functions yk and zk lie in f and g, and their
c development coefficients at the origin in af and ag.
c integration from point to point by a 4 points method.
c integral from r to r+h = h*(-f(r-h)+13*f(r)+13*f(r+h)-f(r+h+h))/24
c
implicit double precision (a-h,o-z)
dimension f(251),af(10),g(251),ag(10),dr(251)
c
c initialisation and development coefficients of yk
c
np= min(np,idim-2)
b=ap
ap=0.0d 00
g(1)=0.0d 00
g(2)=0.0d 00
do 15 i=1,nd
b=b+1.0d 00
ag(i)=af(i)/(b+k)
if (af(i).ne.0.0d 00) then
c=dr(1)**b
g(1)=g(1)+ag(i)*c
g(2)=g(2)+ag(i)*(dr(2)**b)
af(i)=(k+k+1)*ag(i)/(b-k-1)
ap=ap+af(i)*c
endif
15 continue
do 21 i=1,np
21 f(i)=f(i)*dr(i)
np1=np+1
f(np1)=0.0d 00
f(np1+1)=0.0d 00
c
c calcualation of zk
c
eh= exp(h)
e=eh**(-k)
b=h/2.4d+01
c=1.3d+01*b
ee=e*e*b
b=b/e
do 51 i=3,np1
51 g(i)=g(i-1)*e+(c*(f(i)+f(i-1)*e)-(f(i-2)*ee+f(i+1)*b))
c
c calcualation of yk
c
f(np)=g(np)
do 61 i=np1,idim
61 f(i)=f(i-1)*e
i=k+k+1
b=i*b*eh
ee=i*ee/(eh*eh)
e=e/eh
c=i*c
do 71 i=np-1,2,-1
71 f(i)=f(i+1)*e+(c*(g(i)+g(i+1)*e)-(g(i+2)*ee+g(i-1)*b))
ee=e*e
c=8.0d 00*c/1.3d+01
f(1)=f(3)*ee+c*(g(3)*ee+4.0d 00*e*g(2)+g(1))
ap=(ap+f(1))/(dr(1)**(k+1))
return
end
c
subroutine llmesh
c
include 'msxas3.inc'
c include 'msxasc3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$ n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
common /fcnr/kxe, h(d_),vcons(2),r(rd_,d_),v(rd_,sd_),
$ ichg(10,d_),kplace(at_),kmax(at_)
complex v,vcons
c
COMMON /FCNRLM/X(RDX_,D_), RX(RDX_,D_), HX(D_), VX(RDX_,SD_),
& VXR(RDX_,SD_), DVX(RDX_,SD_), BX(RDX_,SD_),
& VXSO(RDX_,SD_), KMX(AT_), KPLX(AT_)
COMPLEX VX, VXR, DVX, BX, VXSO
C
COMMON /LLM/ ALPHA, BETA
c
character*8 name0 ,nsymbl !added 29/3/2013
c
common /param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,xe,ev
c
logical do_r_in
c
c--------------------------------------------------------
c
c write(69,*) ' in sub cont_sub nat = ', nat
C
C CONSTRUCT LINEAR-LOG MESH
C
DO_R_IN = .FALSE.
C
DO N = 1, NDAT
C
ZAT = FLOAT(NZ(N))
IF(ZAT.EQ.0.0) THEN
X0 = 9.0
C X0 = 10.0
ELSE
X0 = 9.0 + LOG(ZAT)
C X0 = 10.0 + LOG(ZAT)
ENDIF
RKMX = R(KMAX(N),N)
DPAS = 0.1/RKMX
! IF(DPAS.GT.0.03) DPAS = 0.03
IF(DPAS.GT.0.02) DPAS = 0.02
ALPHA = 0.5
BETA = 1.0
RHO_1 = -BETA*X0
R_SUB = RS(N)
XMAX = ALPHA*R_SUB + BETA*LOG(R_SUB)
KMX(N) = NINT ( (XMAX + X0 + DPAS) / DPAS )
IF(KMX(N).GT.RDX_) THEN
WRITE(6,*)
& 'INCREASE PARAMETER RDX_. IT SHOULD BE AT LEAST ', KMX(N)
CALL EXIT
ENDIF
NR = KMX(N)
KPLX(N) = KMX(N)-3
C
C CHECK IN LLMESH
c write(6,'(2i5,4e15.6)') n,kmx(n),rkmx,r_sub,xmax,rho_1
c flush(6)
C
CALL LINLOGMESH ( I_END, HX(N), X(1,N), RX(1,N), DO_R_IN,
& KMX(N), KPLX(N), NR, RHO_1, R_SUB, R_IN,
& ALPHA, BETA )
c
c if(n.eq.ndat) then
c if(n.eq.ndat) write(6,*) (x(i,n), rx(i,n), i=1,kmx(n))
c endif
C
c print *, ' inside llmesh loop ', kmx(n)
c do i = 1, kmx(n)
c write(69,*) x(i,n), rx(i,n)
c print *, x(i,n), rx(i,n)
c enddo
c
ENDDO
c
c----------------------------------------------------------
c
return
end
c
subroutine linlogmesh ( i_end, drho, rho, r_real, do_r_in,
& kmax, kplace, nr, rho_1, r_sub, r_in,
& alpha, beta )
!
! Set up log + linear radial mesh.
!
! rho = alpha * r_real + beta * log ( r_real )
!
! rho_i = rho_{i-1} + drho
!
!
! i_end : point at inscribed sphere, for outersphere not used always 0.
! drho : constant step in loglinear space
! rho : log + linear mesh with constant step.
! r_real : real radial mesh correponding to the step of loglinear mesh
! do_r_in : option for outer sphere
! kmax : three points after kplace
! kplace : point on the bounding sphere where the Wronskian is estimated.
! nr : number of radial mesh points
! rho_1 : the first point in loglinear space
! r_sub : radius of bounding sphere in loglinear space, r_sub => rho(kplace)
! r_in :
! alpha : parameter for linear part
! beta : parameter for log part
c implicit double precision (a-h,o-z)
!...input
! logical, intent ( in ) :: do_r_in
! integer, intent ( in ) :: nr, kmax, kplace
! real ( kind = double ), intent ( in ) :: rho_1, r_sub, r_in, alpha, beta
!...output
! integer, intent ( out ) :: i_end
! real ( kind = double ), intent ( out ) :: drho
! real ( kind = double ), intent ( out ), dimension ( : ) :: rho, r_real
!...local
! logical :: check
! integer :: i, k
! real ( kind = double ) :: rn, rhon, epsilon
c
dimension rho(kmax), r_real(kmax)
c
logical do_r_in, check
myrank = 0
dzero = 0.0
check = .false.
c check = .true.
rho ( kplace ) = alpha * r_sub + beta * log ( r_sub )
rho ( 1 ) = rho_1
drho = ( rho ( kplace ) - rho ( 1 ) ) / real ( kmax - 4 )
rho ( kmax ) = rho ( kplace ) + 3.00 * drho
!
! write(6,*) rho(1), rho(kmax), drho
! write(6,*) ' ** '
! if ( myrank .eq. 0 ) then
! write ( unit = 6, fmt = * ) " alpha =", alpha, " beta ", beta
! write ( unit = 6, fmt = * ) "rho_1 =", rho ( 1 ), &
! & " rho ( kplace ) =", rho ( kplace ), " rho ( kmax ) = ", rho ( kmax )
! write ( unit = 6, fmt = * ) "drho =", drho, " nr =", nr
! end if
!
do i = 2, nr
rho ( i ) = rho ( i - 1 ) + drho
end do
!
!.....Solve non-linear equation by Newton method
!
rhon = rho ( kplace )
r_real ( kplace ) = r_sub
! rn = ( rhon - beta * log ( rhon ) ) / alpha ! correction 2nd April 2013
rn = ( rhon - beta * log ( r_sub ) ) / alpha
!
do i = kplace - 1, 1, - 1
k = 0
!
do
!
! MPI
!
if ( check .and. myrank .eq. 0 ) then
write ( unit = 98, fmt = * ) i, rn
end if
!
! MPI
!
if ( rn .eq. dzero ) then
!
! MPI
!
if ( myrank .eq. 0 ) then
write ( unit = 6, fmt = * ) "Error occurred at radialmesh!",
& "rn = 0"
end if
!
! MPI
!
stop
end if
!
epsilon = ( alpha * rn + beta * log ( rn ) - rho ( i ) ) /
& ( alpha * rn + beta )
!
! MPI
!
if ( check .and. myrank .eq. 0 ) then
write ( unit = 98, fmt = * ) i, rn, epsilon
end if
!
! MPI
!
rn = rn * ( 1.00 - epsilon )
!
if ( rn .lt. 0.0 ) then
rn = r_real ( i + 1 ) * 0.100 ** k
k = k + 1
end if
!
!
if ( abs ( epsilon ) .le. 1.0e-6 ) then
exit
end if
!
end do
!
r_real ( i ) = rn
! write(6,*) i, r_real ( i )
end do
!
rhon = rho ( kplace )
! rn = ( rhon - beta * log ( rhon ) ) / alpha ! correction 2nd April 2013
rn = ( rhon - beta * log ( r_sub ) ) / alpha
!
do i = kmax - 2, nr
k = 0
!
do
!
! MPI
!
if ( check .and. myrank .eq. 0 ) then
write ( unit = 98, fmt = * ) i, rn
end if
!
! MPI
!
epsilon = ( alpha * rn + beta * log ( rn ) - rho ( i ) ) /
& ( alpha * rn + beta )
!
! MPI
!
if ( check .and. myrank .eq. 0 ) then
write ( unit = 98, fmt = * ) i, rn, epsilon
end if
!
! MPI
!
rn = rn * ( 1.00 - epsilon )
!
if ( rn .lt. 0.0 ) then
rn = r_real ( i - 1 ) * 10.00 ** k
k = k + 1
end if
!
if ( abs ( epsilon ) .le. 1.0e-6 ) then
exit
end if
!
end do
!
r_real ( i ) = rn
end do
!
! MPI
!
if ( check .and. myrank .eq. 0 ) then
write ( unit = 99, fmt = * ) '# i rho r rho ( r )',
& ' dr'
i = 1
write ( unit = 99, fmt = "( i4, 4es20.10 )" ) i, rho ( i ),
& r_real ( i ),
& alpha * r_real ( i ) + beta * log ( r_real ( i ) )
!
do i = 2, nr
write ( unit = 99, fmt = "( i4, 4es20.10 )" ) i,rho ( i ),
& r_real ( i ),
& alpha * r_real ( i ) + beta * log ( r_real ( i ) ),
& r_real ( i ) - r_real ( i - 1 )
end do
!
end if
!
! MPI
!
C! if ( .not. do_r_in ) then
if ( do_r_in ) then
i = 1
!
do
!
if ( r_real ( i ) > r_in ) then
exit
end if
!
i = i + 1
end do
!
i_end = i
else
i_end = 0
end if
!
! if ( myrank .eq. 0 ) then
! write ( unit = 6, fmt = * )
! write ( unit = 6, fmt = "( a7, i5, a20, f12.7 )" ) &
! & "kplace = ", kplace, ", r_real ( kplace ) = ", r_real ( kplace )
! write ( unit = 6, fmt = "( a7, i5, a20, f12.7, a10, f12.7 )" ) &
! & "kmax = ", kmax, ", r_real ( kmax ) = ", r_real ( kmax ), &
! & ", r_sub = ", r_sub
! write ( unit = 6, fmt = * )
! write ( unit = 6, fmt = * ) "**** r_in = r_real (",i_end,")= ", &
! & r_real ( i_end )
! end if
end subroutine linlogmesh
C
C
SUBROUTINE VREL
C
include 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
C
COMMON /FCNR/KXE,H(D_),VCONS(2),
1 R(RD_,D_),V(RD_,SD_),ICHG(10,D_),KPLACE(AT_),KMAX(AT_)
COMPLEX VCONS,V
C
COMMON /FCNRLM/X(RDX_,D_), RX(RDX_,D_), HX(D_), VX(RDX_,SD_),
& VXR(RDX_,SD_), DVX(RDX_,SD_), BX(RDX_,SD_),
& VXSO(RDX_,SD_), KMX(AT_), KPLX(AT_)
COMPLEX VX, VXR, DVX, BX, VXSO
C
c
common/param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,xe,ev
character*8 nsymbl,name0
c
COMPLEX ZTMP(0:RD_), ZX, DZX, D2ZX
REAL*4 RTMP(0:RD_)
C
DATA FSC,FSCS4 /7.29735E-3,1.331283E-5/
C
C INTERPOLATE POTENTIAL ON THE LOG-LINEAR MESH
C AND ADD RELATIVISTIC CORRECTIONS, INCLUDING SPIN-ORBIT INTERACTION
C
C WRITE(7,*) ' I RX(I), VX(I), VXSR(I), VXSO(I), BX(I) '
C
RTMP(0) = 0.0
C
DO N = 1, NDAT
C
ZAT = FLOAT(NZ(N))
ZTMP(0) = CMPLX(2.0*ZAT,0.0)
C
DO I = 1, KMAX(N)
RTMP(I) = R(I,N)
ENDDO
C
NS = N
DO IS=1,NSPINS
DO I = 1, KMAX(N)
ZTMP(I) = -V(I,NS) * RTMP(I)
C WRITE(6,*) N, IS, I, RTMP(I), ZTMP(I)
ENDDO
C
DO I=1,KMX(N)
C
C FIND NEAREST POINTS - INITIALIZE HUNTING PARAMETER (SUBROUTINE NEAREST)
C
JLO=1
CALL NEAREST1(RTMP(0), KMAX(N)+1, RX(I,N),
& IP1, IP2, IP3, JLO)
IP1 = IP1 - 1
IP2 = IP2 - 1
IP3 = IP3 - 1
C
C INTERPOLATE ZR(I) AND RHOTOT(I)
C
CALL CINTERP_QUAD( RTMP(IP1),ZTMP(IP1),
& RTMP(IP2),ZTMP(IP2),
& RTMP(IP3),ZTMP(IP3),
& RX(I,N),ZX,DZX,D2ZX )
VX(I,NS) = -ZX/RX(I,N)
BX(I,NS) = FSCS4/(1.0 + FSCS4*(E - VX(I,NS)))
DVX(I,NS) = -(DZX/RX(I,N) - ZX/RX(I,N)**2)
VXR(I,NS) = VX(I,NS) - FSCS4*(E - VX(I,NS))**2 +
& 0.5*BX(I,NS)*( -D2ZX/RX(I,N) +
& 1.5*BX(I,NS)*(DVX(I,NS))**2 )
VXSO(I,NS) = BX(I,NS)*DVX(I,NS)/RX(I,N)
C WRITE(15,1) I, RX(I,N), VX(I,NS), VXR(I,NS),
C & VXSO(I,NS), BX(I,NS)
1 FORMAT(I5,9E15.6)
ENDDO
NS=NS+NDAT
ENDDO
C
ENDDO
C
RETURN
C
END
C
C
SUBROUTINE NEAREST1(XX,N,X,I_POINT_1,I_POINT_2,I_POINT_3,
& JLO)
C
C FIND NEAREST THREE POINTS IN ARRAY XX(N), TO VALUE X
C AND RETURN INDICES AS I_POINT_1,I_POINT_2 AND I_POINT_3
C This subroutine was taken from Numerical Recipes,
C W. H. Press, B. F. Flanney, S. A. Teukolsky and W. T.
C Vetterling, page 91. Originally called HUNT
C IMPLICIT DOUBLE PRECISION (A-H,O-Z)
C COMMON/MESH_PARAM/JLO
C
DIMENSION XX(*)
LOGICAL ASCND
ASCND=XX(N).GT.XX(1)
C
C EXTRAPOLATE BELOW LOWEST POINT
C
IF(X.LE.XX(1))THEN
I_POINT_1=1
I_POINT_2=2
I_POINT_3=3
RETURN
END IF
C
C EXTRAPOLATE BEYOND HIGHEST POINT
C
IF(X.GE.XX(N))THEN
I_POINT_1=N-2
I_POINT_2=N-1
I_POINT_3=N
RETURN
END IF
IF(JLO.LE.0.OR.JLO.GT.N)THEN
JLO=0
JHI=N+1
GO TO 3
ENDIF
INC=1
IF(X.GE.XX(JLO).EQV.ASCND)THEN
1 JHI=JLO+INC
IF(JHI.GT.N)THEN
JHI=N+1
ELSE IF(X.GE.XX(JHI).EQV.ASCND)THEN
JLO=JHI
INC=INC+INC
GO TO 1
ENDIF
ELSE
JHI=JLO
2 JLO=JHI-INC
IF(JLO.LT.1)THEN
JLO=0
ELSE IF(X.LT.XX(JLO).EQV.ASCND)THEN
JHI=JLO
INC=INC+INC
GO TO 2
ENDIF
ENDIF
3 IF(JHI-JLO.EQ.1)THEN
IF((JLO+1).EQ.N)THEN
I_POINT_1=JLO-1
I_POINT_2=JLO
I_POINT_3=JLO+1
ELSE
I_POINT_1=JLO
I_POINT_2=JLO+1
I_POINT_3=JLO+2
END IF
RETURN
END IF
JM=(JHI+JLO)/2
IF(X.GT.XX(JM).EQV.ASCND)THEN
JLO=JM
ELSE
JHI=JM
ENDIF
GO TO 3
END
C
C
SUBROUTINE CINTERP_QUAD(X1,Y1,X2,Y2,X3,Y3,X4,Y4,DY4,D2Y4)
C
C INTERPOLATE BETWEEN POINTS Y1=F(X1) AND Y2=F(X2)
C TOP FIND Y4=F(X4) GIVEN X1,Y1,X2,Y2,X3,Y3 AND X4 AS INPUT
C PARAMETERS. THE FUNCTIONAL FORM USED IS Y = AX^2+BX+C
C
COMPLEX Y1, Y2, Y3, Y4, DY4, D2Y4
COMPLEX TOP, A, B, C
C
TOP = (Y2-Y1)*(X3*X3-X2*X2)- (Y3-Y2)*(X2*X2-X1*X1)
BOTTOM = (X2-X1)*(X3*X3-X2*X2)- (X3-X2)*(X2*X2-X1*X1)
B = TOP/BOTTOM
A = ( (Y2-Y1)- B*(X2-X1) )/(X2*X2-X1*X1)
C = Y3 - A*X3*X3 - B*X3
Y4 = A*X4*X4 + B*X4 + C
DY4 = 2.0*A*X4 + B
D2Y4 = 2.0*A
C
RETURN
END
C
C
subroutine smtxllm(ne,lmax_mode,relc,nks,px,px0,ppx,pax,
& ramfnr,ramfsr,ramfsop,ramfsoa)
c
include 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
C
C
COMMON/BESSEL/SBF(LTOT_),DSBF(LTOT_),SHF(LTOT_),DSHF(LTOT_)
COMPLEX*16 SBF,DSBF,SHF,DSHF
COMPLEX*16 SBFX(LTOT_),DSBFX(LTOT_),SHFX(LTOT_),DSHFX(LTOT_)
C
COMPLEX*16 Y0(0:LMAX_), Y1(0:LMAX_)
DOUBLE PRECISION RX1, RX2, EXPR
C
COMMON /FCNR/KXE, H(D_),VCONS(2),
1 R(RD_,D_),V(RD_,SD_),ICHG(10,D_),KPLACE(AT_),KMAX(AT_)
COMPLEX VCONS,V
C
COMMON /FCNRLM/X(RDX_,D_), RX(RDX_,D_), HX(D_), VX(RDX_,SD_),
& VXR(RDX_,SD_), DVX(RDX_,SD_), BX(RDX_,SD_),
& VXSO(RDX_,SD_), KMX(AT_), KPLX(AT_)
COMPLEX VX, VXR, DVX, BX, VXSO
C
COMPLEX VXP(RDX_), VXA(RDX_), BD(RDX_)
C
COMPLEX PX(RDX_,F_), PX0(RDX_,F_), PPX(RDX_,F_), PAX(RDX_,F_)
COMPLEX PSX(N_), DPSX(N_), STMAT, RAMFX(N_)
COMPLEX PS0(N_), DPS0(N_), STMAT0, RAMF0(N_)
COMPLEX PS1(N_), DPS1(N_), STMAT1, RAMF1(N_)
COMPLEX PS2(N_), DPS2(N_), STMAT2, RAMF2(N_)
COMPLEX RAMF00, RAMF01, RAMF02
C
COMPLEX PKMX, PKMX1
C
COMMON /LLM/ ALPHA, BETA
c
common /flag/ inmsh,inv,inrho,insym,iovrho,iosym,
1 imvhl,nedhlp
c
complex pss(6),dpss(6),
& ramfnr(n_), ramfsr(n_), ramfsop(n_), ramfsoa(n_)
c
character*8 name0 ,nsymbl !added 29/3/2013
common/param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,ev,xe
c
common /seculrx/ atmnr(n_), atmsr(n_), atmsop(n_), atmsoa(n_)
complex atmnr, atmsr, atmsop, atmsoa
c
common /state/ natom(n_),ln(n_),nleq(at_),
1 nns,nuatom,ndg,nls(at_),n0l(at_),n0(at_),
2 nterms(at_),lmaxn(at_),ndim,lmxne(at_,nep_)
c
common/eels/einc,esct,scangl,qt,lambda,eelsme(npss,npss,npss),
& p1(rdx_,npss,nef_),p2(rdx_,npss,nef_),
& p3(rdx_,npss,nef_),ramfsr1(npss,nef_),
& ramfsr2(npss,nef_),ramfsr3(npss,nef_),
& lmxels(3,ua_),p3irreg(rdx_,7),p2irreg(rdx_,7)
complex eelsme,p1,p2,p3,ramfsr1,ramfsr2,ramfsr3,p3irreg,p2irreg
real*4 einc,esct,scangl,qt,lambda
c
common/auger/calctype,expmode,edge1,edge2
character*3 calctype, expmode
character*2 edge1,edge2
c
complex csqrt,arg,arg1
COMPLEX ONEC
c
character*2 relc
c
data zero,one,two/0.0,1.0,2.0/
data pi/3.14159265358979/,srt2/1.414213562/
c
data fsc,fscs4 /7.29735e-3,1.331283e-5/
c
c.....Define bd for non relativistic calculation
c
do i = 1, rdx_
bd(i) = cmplx(fscs4,0.0)
enddo
C
onec = (1.0,0.0)
if(e.eq.0.0) e = 1.0e-8
ns=(nns-1)*ndat
C
do 5 j=1,ndim
atmnr(j)=(0.00,0.00)
atmsr(j)=(0.00,0.00)
atmsop(j)=(0.00,0.00)
5 atmsoa(j)=(0.00,0.00)
c
c write(70,*) ' non relativistic stmat and phase shifts '
c write(80,*) ' scalar relativistic stmat and phase shifts '
c write(90,*) ' spin-orbit stmat and phase shifts '
c
c calculate t-matrix elements:
c stmat: inverse t-m elements (atomic spheres)
c ramf: for normalization of ps(k) functions
c
c write(19,18) e, xe
write(81,*) ' e, vcon, xe, relc =', e, real(vcon),
& real(xe), relc
c write(84,*) ' e, vcon, xe =', e, vcon, xe
c 18 FORMAT(' E =', F10.5,5X,' XE =',2F10.5,' GAMMA =',F10.5)
c
do 60 na=1,nuatom
write(35,77) na
write(70,77) na
write(80,77) na
write(90,77) na
ns=ns+1
25 nt0a=n0(na)
ntxa=nt0a+nterms(na)-1
if (na.eq.nas) then
nstart=nt0a
nlast=ntxa
endif
l=-1
nlat=-1
arg=xe*rs(na)
ml=lmaxn(na)+1
if (ml.lt.3) ml = 3
call csbf(arg,xe,ml,sbf,dsbf)
call cshf2(arg,xe,ml,shf,dshf)
npabs = 0
C
43 do 45 nn=nt0a,ntxa
l=ln(nn)
nlat=nlat+1
npabs=npabs+1
if(na.ne.nas.or.npabs.gt.npss-1) npabs=npss
if(lmax_mode.eq.2.and.l.gt.lmxne(na,ne)) goto 45
np=npabs
C
c if(relc.eq.'nr') then
c
rx1 = dble(rx(1,na))
rx2 = dble(rx(2,na))
y0(l) = dcmplx(rx1**(l+1),0.d0)
y1(l) = dcmplx(rx2**(l+1),0.d0)
c
call pgenll1m(l, e, hx(na), rx(1,na), vx(1,ns), bd,
& kmx(na), kplx(na), rs(na), px(1,np), psx(nn),
& dpsx(nn), ramf00, stmat, y0(l),y1(l))
c
atmnr(nn)=stmat
ramfx(nn)=ramf00
ramfnr(nn) = ramf00
write(70,1000) xe/0.52917715, stmat
if(relc.eq.'nr') write(35,1000) xe/0.52917715, stmat
c definition of stmat as exp(-i*delta)*sin(delta)
phase=sign(-1.,real(stmat))*
1 asin(sqrt(abs(aimag(stmat))))
if(phase.lt.0.0) phase=phase+3.1415926
write(71,1001)e,xe,na,nlat,stmat,phase
1001 format(2x,f10.5,2x,2f10.5,2x,i3,2x,i3,
& 2x,2e12.6,f10.5,2x,2e12.6,f10.5)
1000 format(3x,f9.4,1x,f9.4,5x,e12.6,5x,e12.6,5x,e12.6,5x,e12.6)
c 1000 format(3x,f9.4,1x,f9.4,5x,f12.9,5x,f12.9,5x,f12.9,5x,f12.9)
c
c elseif(relc.eq.'sr') then
c
rx1 = dble(rx(1,na))
rx2 = dble(rx(2,na))
expr = 0.5d0 + sqrt( dfloat(l*(l+1)) +1 - dble(fsc*z(na))**2 )
y0(l) = dcmplx(rx1**expr,0.d0)
y1(l) = dcmplx(rx2**expr,0.d0)
call pgenll1m(l, e, hx(na), rx(1,na), vxr(1,ns), bx(1,ns),
& kmx(na), kplx(na), rs(na), px0(1,np), ps0(nn),
& dps0(nn), ramf00, stmat0, y0(l),y1(l))
c
if(calctype.eq.'els'.or.calctype.eq.'e2e') then
do k = 1, kmx(na)
if(nks.eq.1) p1(k,l+1,na) = px0(k,np) !npabs = np
if(nks.eq.2) p2(k,l+1,na) = px0(k,np)
if(nks.eq.3) p3(k,l+1,na) = px0(k,np)
enddo
if(nks.eq.1) ramfsr1(l+1,na) = ramf00
if(nks.eq.2) ramfsr2(l+1,na) = ramf00
if(nks.eq.3) ramfsr3(l+1,na) = ramf00
endif
c
atmsr(nn)=stmat0
ramfsr(nn)=ramf00
write(80,1000) xe/0.52917715, stmat0
if(relc.eq.'sr') write(35,1000) xe/0.52917715, stmat0
C
c definition of stmat as exp(-i*delta)*sin(delta)
C
phase=sign(-1.,real(stmat0))*
1 asin(sqrt(abs(aimag(stmat0))))
if(phase.lt.0.0) phase=phase+3.1415926
write(81,1001)e,xe,na,nlat,stmat,phase
c
c elseif(relc.eq.'so') then
c
ilm = 2
if(l.eq.0) ilm = 1
do il = 1, ilm
c
if(il.eq.1) then
do i = 1, kmx(na)
vxp(i) = vxr(i,ns) + float(l)*vxso(i,ns)
enddo
rx1 = dble(rx(1,na))
rx2 = dble(rx(2,na))
expr = 0.5d0 + sqrt( dfloat(l+1)**2 -dble(fsc*z(na))**2 )
y0(l) = dcmplx(rx1**expr,0.d0)
y1(l) = dcmplx(rx2**expr,0.d0)
call pgenll1m(l, e, hx(na), rx(1,na), vxp, bx(1,ns),
& kmx(na), kplx(na), rs(na), ppx(1,np),
& ps1(nn), dps1(nn), ramf01, stmat1,
& y0(l),y1(l))
if(na.eq.nas)
& write(81,1) 'rp', na, l, real(stmat1), 1.0/stmat1,
& real(ramf01), e
else
do i = 1, kmx(na)
vxa(i) = vxr(i,ns) - float(l+1)*vxso(i,ns)
enddo
rx1 = dble(rx(1,na))
rx2 = dble(rx(2,na))
expr = 0.5d0 + sqrt( dfloat(l)**2 - dble(fsc*z(na))**2 )
if(l.eq.0) expr = 0.5d0 +sqrt( 1.0d0 -dble(fsc*z(na))**2)
y0(l) = dcmplx(rx1**expr,0.d0)
y1(l) = dcmplx(rx2**expr,0.d0)
call pgenll1m(l, e, hx(na), rx(1,na), vxa, bx(1,ns),
& kmx(na), kplx(na), rs(na), pax(1,np),
& ps2(nn), dps2(nn), ramf02, stmat2,
& y0(l),y1(l))
c
endif
c
enddo
c
c
atmsop(nn)=stmat1
ramfsop(nn)=ramf01
atmsoa(nn)=stmat2
ramfsoa(nn)=ramf02
write(90,1000) xe/0.52917715, stmat1, stmat2
if(relc.eq.'so') write(35,1000) xe/0.52917715, stmat1, stmat2
C
c definition of stmat as exp(-i*delta)*sin(delta)
C
phase1=sign(-1.,real(stmat1))*
1 asin(sqrt(abs(aimag(stmat1))))
phase2=sign(-1.,real(stmat2))*
1 asin(sqrt(abs(aimag(stmat2))))
if(phase.lt.0.0) phase=phase+3.1415926
write(91,1001)e,xe,na,nlat,stmat1,phase1,stmat2,phase2
c
c endif
1 format(a3,2i5,10e13.5)
30 format(5i3,8e13.5)
c
c
45 continue
60 continue
c
77 FORMAT('-------------------------- ATOM ',I3,
1 ' -----------------------')
c
c
c calculate singular solution inside muffin tin sphere for the absorbing
c atom, matching to shf in interstitial region
c
if(calctype.eq.'els'.and.nks.eq.3)
& write(6,*)' store irregular solution'
90 nl=0
lmsing=5
mout=4
nst=n0(nas)
nlst=n0(nas)+nterms(nas)-1
c if(nks.eq.3) write(6,*)' nst =',nst,' nlst =',nlst
l=-1
ml=lmaxn(nas)+1
if (ml.lt.3) ml = 3
kpp = kmx(nas) -2
arg=xe*rx(kpp,nas)
call cshf2(arg,xe,ml,sbfx,dsbfx)
arg1=xe*rx(kpp-1,nas)
call cshf2(arg1,xe,ml,shfx,dshfx)
c
do n=nst,nlst
l=ln(n)
if(l.gt.lmsing) cycle
nl=nl+1
np=npss+nl
np1=nl
c
pkmx = cmplx(sbfx(l+1))*arg/pi
pkmx1 = cmplx(shfx(l+1))*arg1/pi
c
call pgenll2( l, e, hx(nas), rx(1,nas), vx(1,nas), bd,
& kpp, px(1,np), pkmx, pkmx1 )
call pgenll2( l, e, hx(nas), rx(1,nas), vxr(1,nas),
& bx(1,nas), kpp, px0(1,np), pkmx, pkmx1 )
ilm = 2
if(l.eq.0) ilm = 1
c
do i = 1, kmx(nas)
vxp(i) = vxr(i,nas) + float(l)*vxso(i,nas)
vxa(i) = vxr(i,nas) - float(l+1)*vxso(i,nas)
enddo
c
do il = 1, ilm
if(il.eq.1)
& call pgenll2( l, e, hx(nas), rx(1,nas), vxp,
& bx(1,nas), kpp, ppx(1,np), pkmx, pkmx1 )
if(il.eq.2)
& call pgenll2( l, e, hx(nas), rx(1,nas), vxa,
& bx(1,nas), kpp, pax(1,np), pkmx, pkmx1 )
enddo
c
if(calctype.eq.'els') then
if(nks.eq.2) then
do k = 1, kmx(nas)
p2irreg(k,l+1) = px0(k,np)
c write(6,*) l, rx(k,nas), px0(k,np)
enddo
elseif(nks.eq.3) then
do k = 1, kmx(nas)
p3irreg(k,l+1) = px0(k,np)
c write(6,*) l, rx(k,nas), px0(k,np)
enddo
endif
endif
c
enddo
c
c
return
c
end
c
c
subroutine pgenll1m(l, en, h, rx, v, b, kmax, kplx, rs,
& p, ps, dps, ramf, stmat, y0, y1 )
c
c
include 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
c
common/bessel/sbf(ltot_),dsbf(ltot_),shf(ltot_),dshf(ltot_)
complex*16 sbf,dsbf,shf,dshf
c
common/param/eftr,gamma,vcon,xe,ev,e,iout
complex vcon,xe,ev
c
common /llm/ alpha, beta
c
complex v(kmax), p(kmax), b(kmax), ps, dps, ramff, ramf, stmat, x
complex*16 y0, y1, pd(kmax)
c
dimension rx(kmax)
c
double precision dfl, a, hd, hsq12, rxi, den, arb2,
& alphad, betad, rlv, amv
complex*16 dvi
c
complex*16 um(0:kmax), vm(0:kmax),
& am(0:kmax), bm(0:kmax)
c
c
data pi/3.141592653589793d0/, fsc/7.29735E-3/
c
c calculate coefficients um(m) and vm(m).
c inv = .true. : y0 first starting point; y1 last starting point
c inv = .false. : y0, y1 first two starting points at rx(1) and rx(2)
c In this particular case um=/0.
c
vm(1) = (0.d0,0.d0)
um(1) = (1.d0,0.d0)
am(0) = (0.d0,0.d0)
bm(0) = (0.d0,0.d0)
c
alphad = dble(alpha)
betad = dble(beta)
den = dble(en)
dfl = dble(float(l))
a = (dfl + 1)*dfl
hd = dble(h)
hsq12 = hd*hd/12.d0
c
do i = 1, kmax
rxi = dble(rx(i))
arb2 = (alphad*rxi + betad)**2
dvi = dcmplx(v(i))
am(i) = 1.d0 + 1.d0/arb2 * ( rxi**2 * (den-dvi) - a -
& betad*(alphad*rxi + betad/4.d0)/arb2 )*hsq12
bm(i) = 2.d0*(6.d0 - 5.d0*am(i))
enddo
do i = 2, kmax-1
vm(i) = am(i+1) / ( bm(i) - am(i-1)*vm(i-1) )
enddo
do i = 2, kmax
um(i) = um(i-1)*am(i-1) / ( bm(i) - am(i-1)*vm(i-1) )
enddo
c
pd(1) = y0 * sqrt( alphad + betad/dble(rx(1)) )
pd(2) = y1 * sqrt( alphad + betad/dble(rx(2)) )
do i = 2, kmax - 1
pd(i+1) = (pd(i) - um(i)*pd(1))/vm(i)
enddo
c
do i = 1, kmax
pd(i) = pd(i)*sqrt(dble(rx(i))/(alphad*dble(rx(i))+betad) ) *
& dble(fsc)/2.0D0 /sqrt(dcmplx(b(i)))/ dble(rx(i))
p(i) = cmplx(pd(i))
enddo
c
kplx3 = kplx - 3
call interp(rx(kplx3),p(kplx3),7,rs,ps,dps,.true.)
c
x=dps/ps
ramff=cmplx(sbf(l+1))*x-cmplx(dsbf(l+1))
c stmat=(shf(l+1)*x-dshf(l+1))/ramff
stmat=ramff/(cmplx(shf(l+1))*x-cmplx(dshf(l+1)))
ramf=ramff*ps*rs*rs*pi
ramf=ramf*xe/pi
c
c
return
end
c
c
subroutine pgenll2( l, en, h, rx, v, b, kmax, p, pkmx, pkmx1 )
c
c This subroutine for inward integration toward the origin
c
common /llm/ alpha, beta
c
complex v(kmax), p(kmax), b(kmax), pkmx, pkmx1
dimension rx(kmax)
c
double precision dfl, a, hd, hsq12, rxi, den, arb2,
& alphad, betad
c
complex*16 um(0:kmax), vm(0:kmax), am(0:kmax), bm(0:kmax)
complex*16 dvi, dnm
c
data pi/3.14159265/, fsc/7.29735E-3/
c
c calculate coefficients um(m) and vm(m).
c
vm(kmax) = (0.d0,0.d0)
um(kmax) = dcmplx(pkmx*sqrt( alpha + beta/rx(kmax) ))
alphad = dble(alpha)
betad = dble(beta)
den = dble(en)
dfl = dble(float(l))
a = (dfl + 1)*dfl
hd = dble(h)
hsq12 = hd*hd/12.d0
c
do i = 1, kmax
rxi = dble(rx(i))
arb2 = (alphad*rxi + betad)**2
dvi = dcmplx(v(i))
am(i) = 1.d0 + 1.d0/arb2 * ( rxi**2 * (den-dvi) - a -
& betad*(alphad*rxi + betad/4.d0)/arb2 )*hsq12
bm(i) = 2.d0*(6.d0 - 5.d0*am(i))
enddo
do i = kmax-1, 2, -1
dnm = ( bm(i) - am(i+1)*vm(i+1) )
vm(i) = am(i-1) / dnm
um(i) = am(i+1) * um(i+1) / dnm
c write(6,*) vm(i), um(i)
enddo
p(kmax) = pkmx * sqrt( alpha + beta/rx(kmax) )
p(kmax-1) = pkmx1 * sqrt( alpha + beta/rx(kmax-1) )
do i = kmax-1, 2, -1
p(i-1) = ( p(i) - cmplx(um(i))) / cmplx(vm(i))
enddo
do i = 1, kmax
p(i) = p(i) * sqrt( rx(i)/(alpha*rx(i) + beta) ) *
& fsc/2.0 /sqrt(b(i))/ rx(i)
enddo
return
end
c
C
subroutine get_edge_gap(iz,ihole,i_radial,xion,eatom)
c
c
implicit real*8(a-h,o-z)
c
c
parameter ( mp = 251, ms = 30 )
c
character*40 title
c
common dgc(mp,ms),dpc(mp,ms),bidon(630),idummy
c
dimension dum1(mp), dum2(mp)
dimension vcoul(mp), rho0(mp), enp(ms)
c
title = ' '
c
ifr=1
iprint=0
C
amass=0.0d0
beta=0.0d0
c
call scfdat (title, ifr, iz, ihole, xion, amass, beta, iprint,
1 vcoul, rho0, dum1, dum2, enp, eatom)
c
return
end
C
C
subroutine calc_edge(cip)
implicit real*8 (a-h,o-z)
real*4 cip
c
include 'msxas3.inc'
include 'msxasc3.inc'
c
dimension etot(2)
c
c.....Find out ionization potential for chosen edge
c
xion=0.0d0 !corrected 23 June 2017
iz = nz(1)
ihole1 = 0
c
if(edge.eq.'k ') ihole2 = 1
if(edge.eq.'l1') ihole2 = 2
if(edge.eq.'l2') ihole2 = 3
if(edge.eq.'l3') ihole2 = 4
if(edge.eq.'m1') ihole2 = 5
if(edge.eq.'m2') ihole2 = 6
if(edge.eq.'m3') ihole2 = 7
if(edge.eq.'m4') ihole2 = 8
if(edge.eq.'m5') ihole2 = 9
if(edge.eq.'n2') ihole2 = 11
if(edge.eq.'n3') ihole2 = 12
if(edge.eq.'n4') ihole2 = 13
if(edge.eq.'n5') ihole2 = 14
if(edge.eq.'n6') ihole2 = 15
if(edge.eq.'n7') ihole2 = 16
c
write(6,*) ' ---'
do i = 1, 2
c
ityhole = ihole1
c if(i.eq.2) ityhole = ihole2 ----- corrected 23th June 2017
if(i.eq.2) then
ityhole = ihole2
xion = 1.0d0
endif
c
if(i.eq.1) write(6,*) ' total energy for atom in ground state '
if(i.eq.2) write(6,*) ' total energy for atom with a hole in ',
& edge, ' edge'
c
call get_edge_gap(iz,ityhole,ityhole,xion,etot(i))
c
enddo
c
cip = real(etot(2) - etot(1))*2.0
cip = sign(cip,1.0)
write(6,*) ' calculated ionization energy for edge ', edge,
& ' = ', cip*13.6, ' eV'
c
c.....Find out energy distance between edges and construct two edge
c dipole cross section
c
xion=1.0d0
c
if(edge.eq.'k '.or.edge.eq.'l1'.or.edge.eq.'m1'.or.edge.eq.'n1')
& go to 15
if(edge.eq.'l2'.or.edge.eq.'l3') then
ihole1 = 3
ihole2 = 4
else if(edge.eq.'m2'.or.edge.eq.'m3') then
ihole1 = 6
ihole2 = 7
else if(edge.eq.'m4'.or.edge.eq.'m5') then
ihole1 = 8
ihole2 = 9
else if(edge.eq.'n2'.or.edge.eq.'n3') then
ihole1 = 11
ihole2 = 12
else if(edge.eq.'n4'.or.edge.eq.'n5') then
ihole1 = 13
ihole2 = 14
else if(edge.eq.'n6'.or.edge.eq.'n7') then
ihole1 = 15
ihole2 = 16
endif
c
do i = 1, 2
ityhole = ihole1
if(i.eq.2) ityhole = ihole2
c
call get_edge_gap(iz,ityhole,ityhole,xion,etot(i))
c
enddo
c
detot = (etot(1) - etot(2))*2.0d0
detot = sign(detot,1.0d0)
if(edge.eq.'l2'.or.edge.eq.'l3') then
write(6,*) ' energy distance between edges l2 and l3 = ',
& real( etot(1) - etot(2) )* 27.2, 'eV'
elseif(edge.eq.'m2'.or.edge.eq.'m3') then
write(6,*) ' energy distance between edges m2 and m3 = ',
& real( etot(1) - etot(2) )* 27.2, 'eV'
elseif(edge.eq.'m4'.or.edge.eq.'m5') then
write(6,*) ' energy distance between edges m4 and m5 = ',
& real( etot(1) - etot(2) )* 27.2, 'eV'
endif
c
15 continue
c
write(6,*) ' ---'
c
end
C
C
SUBROUTINE RADIALX(NE,RELC,EIKAPPR)
INCLUDE 'msxas3.inc'
integer at_,d_,rd_,ltot_,sd_
parameter ( at_=nat_-1,d_=ua_-1,ltot_=lmax_+1,
$n_=ltot_*ua_,rd_=440,sd_=ua_-1)
C
c.....this subroutine calculates the radial matrix elements d(i)
c.....(i=1,2) for lfin=l0i-1 (i=1) and lfin=l0i+1 (i=2) both for
c.....the regular (dmxx) and irregular solution (dmxx1) using a
c.....linear-log mesh
c
common/mtxele/ nstart,nlast
c
common/mtxelex/ dmxx(2),dmxx1(2),dmxxa(2),dmxxa1(2),
& qmxx(3),qmxx1(3),qmxxa(3),qmxxa1(3),
& dxxdir,dxxexc
complex dmxx,dmxx1,dmxxa,dmxxa1,qmxx,qmxx1,qmxxa,qmxxa1,
& dxxdir,dxxexc
c
common/param/eftr,gamma,vcon,xe,ev,e,iout,nat,ndat,nspins,
1 nas,rs(at_),xv(at_),yv(at_),zv(at_),exfact(at_),z(at_),
3 lmaxx(at_),nz(at_),nsymbl(at_),
4 neq(at_),name0,cip,emax,emin,de
complex vcon,ev,xe
character*8 nsymbl,name0
c
common/bessel/sbf(ltot_),dsbf(ltot_),shf(ltot_),dshf(ltot_)
complex*16 sbf,dsbf,shf,dshf
C
COMMON /LLM/ ALPHA, BETA
C
COMMON /FCNRLM/X(RDX_,D_), RX(RDX_,D_), HX(D_), VX(RDX_,SD_),
& VXR(RDX_,SD_), DVX(RDX_,SD_), BX(RDX_,SD_),
& VXSO(RDX_,SD_), KMX(AT_), KPLX(AT_)
COMPLEX VX, VXR, DVX, BX, VXSO
C
C COMMON /PDQX/ PX(RDX_,F_),DPX(RDX_,F_),PSX(F_),DPSX(F_),RAMFX(N_)
C COMPLEX PX,DPX,PSX,DPSX,RAMFX
c
COMMON /PDQX/PX(RDX_,F_), PX0(RDX_,F_), PPX(RDX_,F_),
& PAX(RDX_,F_), RAMFNR(N_), RAMFSR(N_), RAMFSOP(N_),
& RAMFSOA(N_)
COMPLEX PX, PX0, PPX, PAX, RAMFNR, RAMFSR, RAMFSOP, RAMFSOA
c
C
COMMON/PDQIX/RPIX(RDX_), FNISX
COMPLEX RPIX
C
common /state/ natom(n_),ln(n_),nleq(at_),
1 nns,nuatom,ndg,nls(at_),n0l(at_),n0(at_),
2 nterms(at_),lmaxn(at_),ndim,lmxne(at_,nep_)
C
c ######### common pottype modified to consider also the Auger calcu
c
common/pot_type/i_absorber,i_absorber_hole,i_absorber_hole1,
* i_absorber_hole2,i_norman,i_alpha,
1 i_outer_sphere,i_exc_pot,i_mode
c
common/auger/calctype,expmode,edge1,edge2
c
common/eels/einc,esct,scangl,qt,lambda,eelsme(npss,npss,npss),
& p1(rdx_,npss,nef_),p2(rdx_,npss,nef_),
& p3(rdx_,npss,nef_),ramfsr1(npss,nef_),
& ramfsr2(npss,nef_),ramfsr3(npss,nef_),
& lmxels(3,ua_),p3irreg(rdx_,7),p2irreg(rdx_,7)
complex eelsme,p1,p2,p3,ramfsr1,ramfsr2,ramfsr3,p3irreg,p2irreg
real*4 einc,esct,scangl,qt,lambda
complex qtc, arg, ydf, scprod
c
character*3 calctype, expmode, eikappr
character*2 edge1,edge2
C
common /lparam/lmax2(nat_),l0i
c
DIMENSION RID(RDX_),CRI(RDX_),CRI1(RDX_)
COMPLEX RID,CRI,CRI1,DX,DX1,SMX0,SMX1
C
CHARACTER*2 RELC
C
C
c***************************************************************************
c note that here rpix(k) = r**3*pi(k).
c wf rpix(k) is already normalized
c (see subroutine corewf)
c***************************************************************************
c
pi = 3.1415926
c
id = 1
nq = nas
kx = kmx(nq) - 3
dh = hx(nq)
c
write(6,*)' check orthogonality between core and continuum',
& ' state'
np = l0i + 1
do k = 1, kx
if(relc.eq.'nr')
& rid(k)=rpix(k)*px(k,np+1)/(alpha*rx(k,nq) + beta)
if(relc.eq.'sr')
& rid(k)=rpix(k)*px0(k,np+1)/(alpha*rx(k,nq) + beta)
enddo
call defint1(rid,dh,kx,scprod,id)
write(6,*)' scalar product between core and continuum',
& ' state =', scprod/ramfsr(nstart+np) !*sqrt(xe/pi)
write(6,*) ' sqrt(xe/pi) =', sqrt(xe/pi)
c
if((calctype.eq.'els'.or.calctype.eq.'e2e')
& .and.eikappr.eq.'yes') then
ydf=(0.0,0.0)
qtc = cmplx(qt,0.0)
ml=lmxne(nq,ne)+1
if (ml.lt.3) ml = 3
do np = 0, ml-1
do k = 1, kx
arg=qtc*rx(k,nq)
call csbf(arg,ydf,ml,sbf,dsbf)
if(relc.eq.'nr')
& rid(k)=rpix(k)*px(k,np+1)*cmplx(sbf(np+1))/
1 (alpha*rx(k,nq) + beta)
if(relc.eq.'sr')
& rid(k)=rpix(k)*px0(k,np+1)*cmplx(sbf(np+1))/
1 (alpha*rx(k,nq) + beta)
enddo
c call defint1(rid,dh,kx,eelsme(np+1),id)
c eelsme(np+1) = (eelsme(np+1)/ramfsr(nstart+np))**2*xe/pi
c write(6,*) 'l =',np,'eelsme =', eelsme(np+1)
c write(6,*) 'l =',np,'sqrt(eelsme) =', sqrt(eelsme(np+1))
enddo
c
endif
c
c 21 if(calctype.eq.'xpd'.or.eikappr.eq.' no') then
21 if (calctype.eq.'xpd'.or.calctype.eq.'xas'.or.
& calctype.eq.'rex'.or.eikappr.eq.' no') then
c
do 100 i=1,2
dmxx(i)=(0.,0.)
dmxx1(i)=(0.,0.)
if((l0i.eq.0).and.(i.eq.1))goto 100
np = l0i + (-1)**i
C
if(relc.eq.'nr') then
c
DO 116 K=1,KX
116 RID(K)=RPIX(K)*PX(K,NP+1)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL INTEGRCM(RID,DH,KX,CRI,ID)
DMXX(I) = (CRI(KX)/RAMFNR(NSTART+NP))**2*(L0I-1+I)
c dmx(i) = (cri(kx)/ramf(nstart+np))**2*(l0i-1+i)
DO 117 K=1,KX
117 RID(K)=RPIX(K)*PX(K,NP+1+NPSS)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL INTEGRCM(RID,DH,KX,CRI1,ID)
DO 118 K=1,KX
118 RID(K)=RID(K)*CRI(K)
CALL DEFINT1(RID,DH,KX,SMX0,ID)
DO 119 K=1,KX
119 RID(K)=RPIX(K)*PX(K,NP+1)*(CRI1(KX) - CRI1(K))*
& RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL DEFINT1(RID,DH,KX,SMX1,ID)
DMXX1(I) = (SMX0 + SMX1)*(L0I-1+I)/RAMFNR(NSTART+NP)
c dmx1(i) = (dx+dx1)*(l0i-1+i)/ramf(nstart+np)
c
else if(relc.eq.'sr') then
DO K=1,KX
RID(K)=RPIX(K)*PX0(K,NP+1)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
ENDDO
CALL INTEGRCM(RID,DH,KX,CRI,ID)
DMXX(I) = (CRI(KX)/RAMFSR(NSTART+NP))**2*(L0I-1+I)
DO 120 K=1,KX
120 RID(K)=RPIX(K)*PX0(K,NP+1+NPSS)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL INTEGRCM(RID,DH,KX,CRI1,ID)
DO 121 K=1,KX
121 RID(K)=RID(K)*CRI(K)
CALL DEFINT1(RID,DH,KX,SMX0,ID)
DO 122 K=1,KX
122 RID(K)=RPIX(K)*PX0(K,NP+1)*(CRI1(KX) - CRI1(K))*
& RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL DEFINT1(RID,DH,KX,SMX1,ID)
DMXX1(I) = (SMX0 + SMX1)*(L0I-1+I)/RAMFSR(NSTART+NP)
c
else if(relc.eq.'so') then
DO K=1,KX
RID(K)=RPIX(K)*PPX(K,NP+1)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
ENDDO
CALL INTEGRCM(RID,DH,KX,CRI,ID)
DMXX(I) = (CRI(KX)/RAMFSOP(NSTART+NP))**2*(L0I-1+I)
DO 123 K=1,KX
123 RID(K)=RPIX(K)*PPX(K,NP+1+NPSS)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL INTEGRCM(RID,DH,KX,CRI1,ID)
DO 124 K=1,KX
124 RID(K)=RID(K)*CRI(K)
CALL DEFINT1(RID,DH,KX,SMX0,ID)
DO 125 K=1,KX
125 RID(K)=RPIX(K)*PPX(K,NP)*(CRI1(KX) - CRI1(K))*
& RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL DEFINT1(RID,DH,KX,SMX1,ID)
DMXX1(I) = (SMX0 + SMX1)*(L0I-1+I)/RAMFSOP(NSTART+NP)
C
DO K=1,KX
RID(K)=RPIX(K)*PAX(K,NP+1)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
ENDDO
CALL INTEGRCM(RID,DH,KX,CRI,ID)
DMXXA(I) = (CRI(KX)/RAMFSOA(NSTART+NP))**2*(L0I-1+I)
DO 126 K=1,KX
126 RID(K)=RPIX(K)*PAX(K,NP+1+NPSS)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL INTEGRCM(RID,DH,KX,CRI1,ID)
DO 127 K=1,KX
127 RID(K)=RID(K)*CRI(K)
CALL DEFINT1(RID,DH,KX,DX,ID)
DO 128 K=1,KX
128 RID(K)=RPIX(K)*PAX(K,NP+1)*(CRI1(KX) - CRI1(K))*
& RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL DEFINT1(RID,DH,KX,DX1,ID)
DMXXA1(I) = (DX + DX1)*(L0I-1+I)/RAMFSOA(NSTART+NP)
c
endif
100 continue
C
c write(6,*) ' radialx matrix elements from shell li = ', l0i
c write(6,*) (real(dmxx(l)),aimag(dmxx(l)),l=1,2)
c write(6,*) (real(dmxx1(l)),aimag(dmxx1(l)),l=1,2)
C
C.....CALCULATE RADIAL QUADRUPOLAR TRANSITION MATRIX ELEMENT
C
DO K = 1, KX
RPIX(K) = RPIX(K) * RX(K,NQ)
ENDDO
C
M = 0
DO 200 I=-2,2,2
M = M + 1
QMXX(M)=(0.,0.)
QMXX1(M)=(0.,0.)
LF = L0I + I
IF(LF.LE.0) GO TO 200
NP = L0I + I
C
if(relc.eq.'nr') then
c
DO 216 K=1,KX
216 RID(K)=RPIX(K)*PX(K,NP+1)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL INTEGRCM(RID,DH,KX,CRI,ID)
QMXX(M) = (CRI(KX)/RAMFNR(NSTART+NP))**2
c dmx(i) = (cri(kx)/ramf(nstart+np))**2*(l0i-1+i)
DO 217 K=1,KX
217 RID(K)=RPIX(K)*PX(K,NP+1+NPSS)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL INTEGRCM(RID,DH,KX,CRI1,ID)
DO 218 K=1,KX
218 RID(K)=RID(K)*CRI(K)
CALL DEFINT1(RID,DH,KX,SMX0,ID)
DO 219 K=1,KX
219 RID(K)=RPIX(K)*PX(K,NP+1)*(CRI1(KX) - CRI1(K))*
& RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL DEFINT1(RID,DH,KX,SMX1,ID)
QMXX1(M) = (SMX0 + SMX1)/RAMFNR(NSTART+NP)
c dmx1(i) = (dx+dx1)*(l0i-1+i)/ramf(nstart+np)
c
else if(relc.eq.'sr') then
DO K=1,KX
RID(K)=RPIX(K)*PX0(K,NP+1)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
ENDDO
CALL INTEGRCM(RID,DH,KX,CRI,ID)
QMXX(M) = (CRI(KX)/RAMFSR(NSTART+NP))**2
DO 220 K=1,KX
220 RID(K)=RPIX(K)*PX0(K,NP+1+NPSS)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL INTEGRCM(RID,DH,KX,CRI1,ID)
DO 221 K=1,KX
221 RID(K)=RID(K)*CRI(K)
CALL DEFINT1(RID,DH,KX,SMX0,ID)
DO 222 K=1,KX
222 RID(K)=RPIX(K)*PX0(K,NP+1)*(CRI1(KX) - CRI1(K))*
& RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL DEFINT1(RID,DH,KX,SMX1,ID)
QMXX1(M) = (SMX0 + SMX1)/RAMFSR(NSTART+NP)
c
else if(relc.eq.'so') then
DO K=1,KX
RID(K)=RPIX(K)*PPX(K,NP+1)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
ENDDO
CALL INTEGRCM(RID,DH,KX,CRI,ID)
QMXX(M) = (CRI(KX)/RAMFSOP(NSTART+NP))**2
DO 223 K=1,KX
223 RID(K)=RPIX(K)*PPX(K,NP+1+NPSS)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL INTEGRCM(RID,DH,KX,CRI1,ID)
DO 224 K=1,KX
224 RID(K)=RID(K)*CRI(K)
CALL DEFINT1(RID,DH,KX,SMX0,ID)
DO 225 K=1,KX
225 RID(K)=RPIX(K)*PPX(K,NP)*(CRI1(KX) - CRI1(K))*
& RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL DEFINT1(RID,DH,KX,SMX1,ID)
QMXX1(M) = (SMX0 + SMX1)/RAMFSOP(NSTART+NP)
C
DO K=1,KX
RID(K)=RPIX(K)*PAX(K,NP+1)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
ENDDO
CALL INTEGRCM(RID,DH,KX,CRI,ID)
QMXXA(M) = (CRI(KX)/RAMFSOA(NSTART+NP))**2
DO 226 K=1,KX
226 RID(K)=RPIX(K)*PAX(K,NP+1+NPSS)*RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL INTEGRCM(RID,DH,KX,CRI1,ID)
DO 227 K=1,KX
227 RID(K)=RID(K)*CRI(K)
CALL DEFINT1(RID,DH,KX,DX,ID)
DO 228 K=1,KX
228 RID(K)=RPIX(K)*PAX(K,NP+1)*(CRI1(KX) - CRI1(K))*
& RX(K,NQ)/(ALPHA*RX(K,NQ) + BETA)
CALL DEFINT1(RID,DH,KX,DX1,ID)
QMXXA1(M) = (DX + DX1)/RAMFSOA(NSTART+NP)
c
endif
C
200 CONTINUE
C
C.....RESET RPI(K) TO INITIAL VALUE
C
DO K = 1, KX
RPIX(K) = RPIX(K) / RX(K,NQ)
ENDDO
C
else !PUT AUGER PART HERE
C
endif
C
RETURN
END
C
C
SUBROUTINE OSBF(X,Y,MAX,SBF,DSBF)
C REAL*8 SBFK,SBF1,SBF2,XF1,PSUM
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
C
C GENERATES SPHERICAL BESSEL FUNCTIONS OF ORDER 0 - MAX-1 AND THEIR
C FIRST DERIVATIVES WITH RESPECT TO R. X=ARGUMENT= Y*R.
C IF Y=0, NO DERIVATIVES ARE CALCULATED. MAX MUST BE AT LEAST 3.
C OSBF GENERATES ORDINARY SPHERICAL BESSEL FUNCTIONS. MSBF - MODI-
C FIED SPHERICAL BESSEL FUNCTIONS; OSNF - ORD. SPH. NEUMANN FCNS;
C MSNF - MOD. SPH. NEUMANN FCNS; MSHF - MOD. SPH HANKEL FCNS
C
DIMENSION SBF(MAX), DSBF(MAX)
LOGICAL ORD
ORD=.TRUE.
GO TO 1
ENTRY MSBF(X,Y,MAX,SBF,DSBF)
ORD=.FALSE.
1 IF (MAX.LT.1.OR.MAX.GT.2000) GO TO 99
IF( ABS(X).LT.0.50D0 ) GO TO 18
C
C BESSEL FUNCTIONS BY DOWNWARD RECURSION
C
SBF2=0.0D0
SBF1=1.0D-25
IF( ABS(X).LT.2.0D0) SBF1=1.0D-38
JMIN=10+X
KMAX=MAX+JMIN-1
K=MAX
XF1=2*KMAX+1
IF (ORD) GO TO 11
DO 10 J=1,KMAX
SBFK=XF1*SBF1/X+SBF2
SBF2=SBF1
SBF1=SBFK
IF (J.LT.JMIN) GO TO 10
SBF(K)=SBFK
K=K-1
10 XF1=XF1-2.0D0
RAT=SINH(X)/(X*SBF(1))
DSBF1=SBF2*RAT
GO TO 16
11 CONTINUE
DO 12 J=1,KMAX
SBFK=XF1*SBF1/X-SBF2
SBF2=SBF1
SBF1=SBFK
XF1=XF1-2.0D0
IF (J.LT.JMIN) GO TO 12
SBF(K)=SBFK
K=K-1
12 CONTINUE
15 RAT=SIN(X)/(X*SBF(1))
DSBF1=-SBF2*RAT
16 DO 17 K=1,MAX
17 SBF(K)=RAT*SBF(K)
GO TO 26
C
C SMALL ARGUMENTS
C
18 Z=X*X*0.50D0
IF(ORD) Z=-Z
A=1.0D0
MMX=MAX
IF (MAX.EQ.1.AND.Y.NE.0.0D0) MMX=2
DO 30 J=1,MMX
SBFJ=A
B=A
DO 31 I=1,20
B=B*Z/(I*(2*(J+1)-1))
SBFJ=SBFJ+B
IF ( ABS(B).LE.1.0D-07* ABS(SBFJ )) GO TO 29
31 CONTINUE
29 IF (J.EQ.2) DSBF1=SBFJ
IF (J.LE.MAX) SBF(J)=SBFJ
30 A=A*X/ DFLOAT(2*J+1)
IF (ORD) DSBF1=-DSBF1
GO TO 26
ENTRY OSNF(X,Y,MAX,SBF,DSBF)
ORD=.TRUE.
SBF2=-COS(X)/X
IF (MAX.EQ.1 .AND. Y.EQ.0.0D0) GO TO 2
SBF1=(SBF2-SIN(X))/X
DSBF1=-SBF1
GO TO 2
ENTRY MSNF(X,Y,MAX,SBF,DSBF)
ORD=.FALSE.
SBF2=COSH(X)/X
IF (MAX.EQ.1 .AND. Y.EQ.0.0D0) GO TO 2
SBF1=(SINH(X)-SBF2)/X
DSBF1= SBF1
GO TO 2
ENTRY MSHF(X,Y,MAX,SBF,DSBF)
ORD=.FALSE.
SBF2=EXP(-X)/X
SBF1=-SBF2/X-SBF2
DSBF1= SBF1
2 SBF(1)=SBF2
IF (MAX.LT.1.OR.MAX.GT.2000) GO TO 99
IF (MAX.EQ.1) GO TO 26
SBF(2)=SBF1
IF (MAX.EQ.2) GO TO 26
XF1=3.0D0
IF (ORD) GO TO 21
DO 8 I=3,MAX
SBFK=SBF2-XF1*SBF1/X
SBF(I)=SBFK
SBF2=SBF1
SBF1=SBFK
8 XF1=XF1+2.0D0
GO TO 26
21 DO 22 I=3,MAX
SBFK=XF1*SBF1/X-SBF2
SBF(I)=SBFK
SBF2=SBF1
SBF1=SBFK
22 XF1=XF1+2.0D0
26 IF (Y.EQ.0.0D0) RETURN
DSBF(1)=Y*DSBF1
IF (MAX.EQ.1) RETURN
DO 9 I=2,MAX
9 DSBF(I)=Y*(SBF(I-1)- DFLOAT(I)*SBF(I)/X)
RETURN
99 WRITE(6,100) MAX
100 FORMAT (' SPHERICAL BESSEL FUNCTION ROUTINE - MAX=',I8)
STOP 2013
C
END
C