C*
PROGRAM LEVEL16
c**** Eigenvalue program LEVEL-16 : as of 5 May 2016 *
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c COPYRIGHT 2005-16 by Robert J. Le Roy +
c Dept. of Chemistry, Univ. of 蓝莓视频, 蓝莓视频, Ontario, Canada +
c This software may not be sold or any other commercial use made +
c of it without the express written permission of the author. +
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Program for calculating eigenvalues and eigenfunctions (and if
c desired, also various expectation values & matrix elements) of a
c one-dimensional potential, and/or matrix elements (& Franck-Condon
c factors) between levels of two different potentials.
c** As with most similar codes, the original version of this program was
c based on the Franck-Condon intensity program of R.N. Zare, report
c UCRL-10925(1963), but the present version is massively modified.
c** This program is unique in that it can: (1) automatically locate &
c calculate the widths of quasibound levels (orbiting resonances);
c (2) can calculate diatomic molecule centrifugal distortion constants;
c (3) can find levels in either well of a double minimum potential;
c (4) starting from a single suitable (almost arbitrary) trial energy,
c it will also automatically generate the eigenvalues etc. for all
c vibrational and/or rotational levels of a given well-behaved
c single-minimum potential.
c Main calling and I/O routines. Last Updated 5 May 2016 ***
c-----------------------------------------------------------------------
c** Dimension for potential arrays and vib. level arrays.
IMPLICIT NONE
cc INCLUDE 'arrsizes.h'
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c** This 'Block' Data Utility routine that governs array dimensioning
c in program LEVEL16 must reside with the name 'arrsizes.h' in the
c same directory containing the FORTRAN file(s) for this Program when
c it is being compiled, **OR** be incorporated into the program
c wherever the statement 'INCLUDE arrsizes.h' appears !!
c-----------------------------------------------------------------------
INTEGER NDIMR, NVIBMX, NTPMX, MAXSP, MORDRMX, RORDR, NbetaMX,
1 LMAX, NBOBmx, NCMMAX
c** NDIMR is maximum size of PEC, wavefx, and various radial arrary
PARAMETER (NDIMR= 250001)
c** NVIBMX is the maximum no. vibrational levels, or rotational sublevel
c for a given 'v' whose energies may be generated and stored
PARAMETER (NVIBMX= 400)
c** NTPMX is maximum no. of PEC or TMF points that may be read-in and
c interplated over; MAXSP = no. cubic spline cfts for these NTPMX pts.
PARAMETER (NTPMX= 2000, MAXSP=4*NTPMX)
c** RORDR is maximum order of rot. constants generated for each vib level
PARAMETER (RORDR = 7)
c** MORDRMX is maximum polynomial order for TMF or martix element argument
PARAMETER (MORDRMX = 20)
c** NbetaMX is the largest no. PEC exponent polynomial parameter
PARAMETER (NbetaMX = 50, LMAX= NbetaMX)
c** NBOBmx is the largest no. of BOB expansion parameters
PARAMETER (NBOBmx = 20)
c** NCMMax is max. no. long-range inverse-power PEC coeffts. allowed
PARAMETER (NCMMax= 20)
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
INTEGER I,J,M,III,IJD,ILEV1,ILEV2,IOMEG1,IOMEG2,INNOD1,INNOD2,
1 INNER,SINNER,IQT,IWR,IRFN,IVD,IVS,IAN1,IAN2,IMN1,IMN2,GEL1,GEL2,
2 GNS1,GNS2,JDJR,JCT,J2DL,J2DU,J2DD,JROT,JROT2,JLEV,JREF, ICOR,
3 CHARGE,hCHARGE1,hCHARGE2,CHARGE3, KV,KV2,KVIN,LCDC,LPRWF,NoPRWF,
4 LNPT,LXPCT,MAXMIN,MORDR,NUSEF,ILRF,IR2F,NUMPOT,NBEG,NBEG2,NEND,
5 NEND2,NPP,NCN1,NCN2,NCNF,NLEV,NLEV1,NLEV2,NJM,NJMM,NFP,NLP,NRFN,
6 NROW,WARN,VMAX,VMAX1,VMAX2,AFLAG,AUTO1,AUTO2, IV(NVIBMX),
7 IJ(NVIBMX),IV2(NVIBMX),JWR(NVIBMX),INNR1(0:NVIBMX),
8 INNR2(0:NVIBMX)
REAL*8 ZK1(0:NVIBMX,0:RORDR),ZK2(0:NVIBMX,0:RORDR),RCNST(RORDR),
1 V1(NDIMR),V2(NDIMR),VJ(NDIMR),WF1(NDIMR),WF2(NDIMR),RFN(NDIMR),
2 RR(NDIMR),RM2(NDIMR),RM22(NDIMR), GV(0:NVIBMX),ESOLN(NVIBMX),
3 ESLJ(NVIBMX), XIF(NTPMX),YIF(NTPMX),DM(0:MORDRMX)
REAL*8 ABUND1,ABUND2,MASS1,MASS2,BZ,BvWN,BFCT,BEFF,DEJ,EPS,EO,EO2,
1 EJ,EJ2,EJP,EJREF,GAMA,MEL,PMAX1,PMAX2,PW,RMIN,RMAX,RH,RMINN,
2 DREF,DREFP,RFLIM,CNNF,RFACTF,MFACTF,SOMEG1,SOMEG2,VLIM1,VLIM2,
3 VD,VDMV,XX,ZMU,GI,GB,GBB,WV
CHARACTER*78 TITL
CHARACTER*2 NAME1,NAME2
DATA MEL/5.4857990945d-4/
c** Default (Q-branch) defining J-increments for matrix element calcn.
DATA J2DL,J2DU,J2DD/0,0,1/
SAVE NLEV1
MAXMIN= 5 !! default limit for ALF test
NoPRWF= 0
CHARGE3= 0
NLEV1= -99
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Begin by reading in the (integer) atomic numbers and mass numbers
c defining the effective reduced mass of the system considered.
c** IAN1 & IAM2, and IMN1 & IMN2 are, respectively, the atomic numbers
c and the mass numbers identifying the atoms forming the molecule.
c Their masses are extracted from data subroutine MASSES and used
c to generate the the reduced mass ZMU.
c** If IMN1 or IMN2 lie outside the range of mass numbers for normal
c stable isotopes of that species, subroutine MASSES returns the
c average atomic mass based on the natural isotope abundance.
c** If the read-in value of IAN1 and/or IAN2 is .LE.0, then instead of
c using the MASS table, read an actual particle mass for it/them.
c** CHARGE (integer) is the charge on the molecule (=0 for neutral).
c If(|CHARGE|.ne.0) read # half-electron-masses to be added to or
c subtracted from standard atomic masses to create standard 2-body
c reduced mass m1*m2/(m1+m2). For Watson's charge-adjusted reduced
c mass, read hCHARGE1= hCHARGE2= 0
c** Parameter NUMPOT specifies whether to calculate eigenvalues etc. for
c a single potential (when NUMPOT.LE.1), or to generate two independent
c potentials & calculate matrix elements coupling levels of one to
c levels of the other (for NUMPOT.GE.2).
c----------------------------------------------------------------------
2 READ(5,*,END=999) IAN1, IMN1, IAN2, IMN2, CHARGE, NUMPOT
IF(CHARGE.NE.0) THEN
READ(5,*) hCHARGE1,hCHARGE2
c----------------------------------------------------------------------
CHARGE3= hCHARGE1 + hCHARGE2
IF(CHARGE3.NE.2*CHARGE) THEN
c... if adding particle charges don't give total charge ... ERROR & STOP
WRITE(6,6065) hCHARGE1,hCHARGE2,CHARGE
STOP
ENDIF
ENDIF
c** Subroutine MASSES returns the name of the atom NAMEi, its ground
c electronic state degeneracy GELi, nuclear spin degeneracy GNSi,
c mass MASSi, and isotopic abundance ABUNDi for a given atomic isotope.
IF((IAN1.GE.0).AND.(IAN1.LE.109)) THEN
CALL MASSES(IAN1,IMN1,NAME1,GEL1,GNS1,MASS1,ABUND1)
ELSE
c** If particle-i is not a normal atomic isotope, read a 2-character
c name (enclosed between '', as in 'mu') and its actual mass.
c----------------------------------------------------------------------
READ(5,*) NAME1, MASS1
c----------------------------------------------------------------------
ENDIF
IF((IAN2.GE.0).AND.(IAN2.LE.109)) THEN
CALL MASSES(IAN2,IMN2,NAME2,GEL2,GNS2,MASS2,ABUND2)
ELSE
c----------------------------------------------------------------------
READ(5,*) NAME2, MASS2
c----------------------------------------------------------------------
ENDIF
IF(CHARGE3.EQ.0) THEN !! Watson charge modified mass
ZMU= MASS1*MASS2/(MASS1+ MASS2- CHARGE*MEL)
ELSE !! standard 2-body mass
IF(CHARGE.NE.0) THEN !! adjust masses for ion
WRITE(6,6066) hCHARGE1,hCHARGE2,hCHARGE1,hCHARGE2
MASS1= MASS1 - hCHARGE1*MEL
MASS2= MASS2 - hCHARGE2*MEL
ELSE
WRITE(6,6067)
ENDIF
ZMU= MASS1*MASS2/(MASS1 + MASS2)
ENDIF
600 FORMAT(//' Input IAN1=',I3,' IAN2=',I3,' is nonsense - so Pro
1gram STOPS?')
6066 FORMAT(' Reduced masses below are based on atoms 1 & 2 with charg
1es (',SP,I2,'/2) and (',I2,'/2),'/8x,'respectively, with subtracti
2on/addition of',SS,I2,' and',I2,' half-electron masses.'/)
6065 FORMAT(' *** ERROR *** atomic charges',SP,I3,'/2 and',I3,"/2 do
1n't add up to total CHARGE=",I3/10x,' !!! so STOP !!!!')
6067 FORMAT(" Reduced masses are Watson's charge-modified reduced mass
1 for diatomic ions"/)
c=======================================================================
c TITL is a title or output header of up to 78 characters, read on a
c single line enclosed between single quotes: e.g. 'title of problem'
c=======================================================================
READ(5,*) TITL
c----------------------------------------------------------------------
c** Numerical factor 16.857629206 (+/- 0.000,000,013) calculated from
c {Compton wavelength of proton }*{proton mass (u)}/{4*Pi} from 2012
c physical constants.
BZ= ZMU/16.857629206D0
BvWN= 1.D0/BZ
WRITE(6,605) TITL,ZMU,BZ,MASS1,MASS2
IF(CHARGE.NE.0) WRITE(6,624) CHARGE,CHARGE
EJ= 0.D0
EJ2= 0.D0
LNPT=1
c** Lower limit (RMIN) and increment (RH) of integration in (Angstroms).
c** The upper limit (RMAX) of the integration range is automatically
c set at the SMALLER of: (i) the read-in value, and (ii) the largest
c value allowed by the array-size dimensions.
c* A hard wall boundary condition may be imposed at a smaller distance
c using an appropriate choice of the read-in level parameter IV (below)
c** EPS (cm-1) is the desired eigenvalue convergence criterion
c---------------------------------------------------------------------
READ(5,*) RH, RMIN, RMAX, EPS
c---------------------------------------------------------------------
BFCT= BZ*RH*RH
c** NPP = no. of points in potential and wavefunction array.
NPP= INT((RMAX-RMIN)/RH+ 1.00001)
NPP= MIN0(NDIMR,NPP)
RMINN= RMIN-RH
RMAX= RMINN+ NPP*RH
WRITE(6,604) RMIN,RMAX,RH,NAME1,IMN1,NAME2,IMN2
DO I= 2,NPP
RR(I)= RMINN+I*RH
WF1(I)= RR(I)
RFN(I)= RR(I)
RM2(I)= 1.D0/RR(I)**2
RM22(I)= RM2(I)
ENDDO
RR(1)= RMIN
WF1(1)= RMIN
RM2(1)= RM2(2)
IF(RMIN.GT.0.D0) RM2(1)= 1.D0/RMIN**2
RM22(1)= RM2(1)
c
c++ Begin reading appropriate parameters & preparing potential(s)
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c+ Subroutine "PREPOT" prepares (and if desired, writes) the potential
c+ array V(i) (cm-1) at the NPP distances RR(i) (Angst).
c** NPP = no. of points in potential and wavefunction array.
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c* If NTP > 0 : define potential by interpolation over & extrapolation
c beyond the NTP read-in turning points using subroutine GENINT.
c If NTP.le.0 : generate a (fully analytic) potential in POTGEN.
c* If LPPOT > 0 : at every |LPPOT|-th point, print potential and
c derivatives-by-differences. *** If LPPOT < 0 write potential
c at every |LPPOT|-th point to channel-8 in a compact format **
c* OMEGA is the electronic contribution to the angular momentum such
c that the reduced centrifugal potential is: (J*(J+1)-OMEGA**2)/R**2
c* Set (OMEGA.GE.99) if wish to use centrifugal factor for rotation
c in two dimensions: (J**2 - 1/4)/R**2 .
c* If (OMEGA.LT.0) use centrifugal strength factor {J*(J+1)+|OMEGA|}
c* VLIM (cm-1) is the energy associated with the potential asymptote.
c-----------------------------------------------------------------------
c++ READ(5,*) NTP, LPPOT, OMEGA, VLIM
c----------------------------------------------------------------------
c** For pointwise potentials, PREPOT uses subroutine GENINT to read
c points and conditions and interpolate (using subroutines NTRPSR,
c SPLINE & SPLINT) and extrapolate to get full potential.
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** For a pointwise potential (NTP > 0), now read points & parameters
c controlling how the interpolation/extrapolation is to be done.
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** NTP (read above) is number of turning points (XI,YI) to be read in.
c** If NUSE > 0 interpolate with NUSE-point piecewise polynomials
c (usually choose NUSE even, say, = 6, 8 or 10). *** If(NUSE.LE.0)
c interpolate with cubic spline instead of local polynomials.
c** If IR2 > 0 , interpolate over YI*XI**2 ; otherwise on YI itself
c This may help if interpolation has trouble on steep repulsive wall.
c** ILR specifies how to extrapolate beyond largest input distance XI(i)
c If ILR < 0 , fit last 3 points to: VLIM - A*exp(-b*(R-R0)**2)
c If ILR = 0 , fit last 3 points to: VLIM - A*R**p *exp(-b*R)
c If ILR = 1 : fit last two points to: VLIM - A/R**B .
c** If(ILR > 1) fit last turning points to: VLIM - sum{of ILR
c inverse-power terms beginning with 1/R**NCN}. *** If CNN.ne.0 ,
c leading coefficient fixed at CNN ; otherwise get it from points too.
c* Assume read-in CNN value has units: [(cm-1)(Angstroms)**'NCN'].
c* If ILR = 2 or 3 , successive higher power terms differ by 1/R**2
c* If ILR > 3 : successive higher power terms differ by factor 1/R
c
c** RFACT & EFACT are factors required to convert units of input turning
c points (XI,YI) to Angstroms & cm-1, respectively (often = 1.d0)
c** Turning points (XI,YI) must be ordered with increasing XI(I)
c** Energy VSHIFT (cm-1) is added to the input potential points to
c make their absolute energy consistent with VLIM (often VSHIFT=Te).
c-----------------------------------------------------------------------
c++ READ(5,*) NUSE, IR2, ILR, NCN, CNN
c++ READ(5,*) RFACT, EFACT, VSHIFT
c++ READ(5,*) (XI(I), YI(I), I= 1,NTP)
c-----------------------------------------------------------------------
c** NCN1 (returned by PREPOT) is the power of the asymptotically-
c dominant inverse-power long range potential term.
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CALL PREPOT(LNPT,IAN1,IAN2,IMN1,IMN2,NPP,IOMEG1,RR,RM2,
1 VLIM1,V1,NCN1)
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** If (NTP.le.0) PREPOT uses subroutine POTGEN to generate a fully
c analytic potential defined by the following read-in parameters.
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c* Potentials generated in cm-1 with equilibrium distance REQ [Angst.],
c and for all cases except IPOTL=2, the potential asymptote energy is
c VLIM and well depth is DSCM. For IPOTL=2, VLIM is the energy at the
c potential minimum and DSCM the leading (quadratic) potential coeft.
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** IPOTL specifies the type of potential function to be generated.
c** PPAR, NSR & NCMM are integers cwcharacterizing the chosen potential
c** NVARB is number of (real*8) potential parameters read in.
c** IBOB specifies whether (if > 0) or not (if .le. 0) atomic mass
c dependent Born-Oppenheimer breakdown corrections will be included
c- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c** If IPOTL=1 generate an L.J.(PPAR,NCN) potential.
c** If IPOTL=2 use Seto's modification of Surkus' GPEF expansion in
c z = [R**PPAR - Re**PPAR]/[a*R**PPAR + b*Re**PPAR] where
c a=PARM(NVARB-1) & b=PARM(NVARB), which incorporates Dunham, SPF,
c O-T and other forms: V(z) = c_0 z^2 [1 + c_1 z + c_2 z^2 + ...]
c where c_0 [cm-1] is read in as DSCM, and the first (NVARB-2)
c PARM(i)'s are the c_i (i > 0). [PPAR is dummy parameter here]
c * For Dunham case: NCN=1, PARM(NVARB-1)= 0.0, PARM(NVARB)= 1.0
c * For SPF case: NCN=1, PARM(NVARB-1)= 1.0, PARM(NVARB)= 0.0
c * For Ogilvie-Tipping: NCN=1, PARM(NVARB-1)= 0.5 = PARM(NVARB)
c * NOTE that for Surkus PPAR < 0 case: z(PPAR,a,b)= z(|PPAR|,-b,-a)
c Generate & return the D_e value implied by these coefficients.
c** If IPOTL=3 generate a Morse or Extended Morse Oscillator potential
c with exponent factor "beta" defined as a power series of order
c (NVARB-1) in y_{QPAR}= (R**QPAR - Re**QPAR)/(R**QPAR + Re**QPAR)
c with NVARB coefficients PARM(i). [!! QPAR .ge.1 !!]
c * For conventional "simple" Morse potential, NVARB=1 & QPAR dummy
c* Special option #1: set QPAR= -1 to produce Wei Hua's 4-parameter
c modified Morse function with b= PARM(1) and C= PARM(2).
c* Special option #2: set QPAR= -2 to produce Coxon's "Generalized
c Morse Oscillator" potential with exponent expansion in (R-Re)]
c ... otherwise, set QPAR.ge.0
c** If IPOTL=4 generate an MLR potential [Mol.Phys. 109, 435 (2011)]
c If QPAR > 0 exponent parameter defined in terms of a polynomial
c of order Nbeta with the (Nbeta+1) coefficients PARM(j).
c in expansion vblr y_{QPAR}= (R**QPAR-Ref**QPAR)/(R**QPAR+Ref**QPAR)
c w. switching fx. y_{PPAR}= (R**PPAR-Ref**PPAR)/(R**PPAR+Ref**PPAR)
c and long-range defined by NCN inverse-power terms with
c If PPAR = 0 exponent polynomial variable is 2*y_{1}= y{O-T}
c If PPAR < 0 exponent polynomial variable is y_{|PPAR|}
c If PPAR.le.0 exponent polynomial connected to limiting inverse-
c power potential exponent by exponential switching function
c with parameters Asw= PARM(NVARB-1) and RSW= PARM(NVARB).
c** If IPOTL=5 generate a Double-Exponential Long-Range (DELR)
c potential [JCP 119, 7398 (2003)] with additive long-range part
c defined by a sum of NCMM damped inverse-power terms, & exponent
c polynomial radial variable defined by parameter QPAR (=q)
c** If IPOTL=6 generate generalized HFD({m_i},i=1,NCMM) potential.
c PARM(1-3) are the parameters defining the HFD damping function
c D(x)=exp[-pparm(1)*(PARM(2)/x - 1)**PARM(3)] {for x < PARM(2)}
c PARM(4) the quadratic coefficient in the exponent, and
c PARM(5) is the power of x=R/Req multiplying the repulsive term
c AREP*x**PARM(5) *exp[-beta*x - PARM(4)*x**2] ;
c** If IPOTL=7 use Tiemann-type polynomial potential attached to an
c inverse-power long-range tail and an 1/R^{12} (or exponential)
c inner wall.
c----------------------------------------------------------------------
c++ READ(5,*) IPOTL, QPAR, PPAR, Nbeta, APSE, IBOB
c++ READ(5,*) DSCM, REQ, Rref
c++ READ(5,*) NCMM, rhoAB, sVSR2, IDSTT
c++ IF(IPOTL.GE.4) THEN
c++ DO I=1,NCMM
c++ READ(5,*) (MMLR(I), CMM(I),I= 1,NCMM)
c++ ENDDO
c++ IF((IPOTL.EQ.4).AND.(APSE.GT.0) THEN
c++ DO I=1,NVARB
c++ READ(5,*) XPARM(I),PARM(I)
c++ ENDDO
c++ ELSE
c++ IF(NVARB.GT.0) READ(5,*) (PARM(I), I=1,NVARB)
c++ IF(IBOB.GT.0) THEN
c++ READ(5,*) MN1R, MN2R, QAD, PAD, NU1, NU2, QNA, NT1, NT2
c++ IF(NU1.GE.0) READ(5,*) (U1(I), I=0,NU1)
c++ IF(NU1.GE.0) READ(5,*) U1INF
c++ IF(NU2.GE.0) READ(5,*) (U2(I), I=0,NU2)
c++ IF(NU2.GE.0) READ(5,*) U2INF
c++ IF(NT1.GE.0) READ(5,*) (T1(I), I=0,NT1)
c++ IF(NT1.GE.0) READ(5,*) T1INF
c++ IF(NT2.GE.0) READ(5,*) (T2(I), I=0,NT2)
c++ IF(NT2.GE.0) READ(5,*) T2INF
c++ ENDIF
c++ ENDIF
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PW= 2.D0
IF((NCN1.GT.0).AND.(NCN1.NE.2)) PW= 2.D0*NCN1/(NCN1-2.D0)
DO I= 1,NPP
V1(I)= V1(I)*BFCT
V2(I)= V1(I)
ENDDO
VLIM2= VLIM1
IF(NUMPOT.LE.1) THEN
WRITE(6,636)
nlev1= 290
IOMEG2= IOMEG1
c** For case in which Potl-1 has centrifugal BOB function, systematize
c definition of centrifugal potential for 'case-2'
DO I= 1,NPP
RM22(I)= RM2(I)
ENDDO
ELSE
WRITE(6,635)
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** For 2-potential Franck-Condon factor calculation, get the second
c potential in this second call to PREPOT (uses the same parameter
c reading sequence so exhaustively described immediately above).
CALL PREPOT(LNPT,IAN1,IAN2,IMN1,IMN2,NPP,IOMEG2,RR,RM22,
1 VLIM2,V2,NCN2)
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Convert potential (in (cm-1)) to form appropriate for SCHRQ
DO I=1,NPP
V2(I)= V2(I)*BFCT
ENDDO
ENDIF
c
c** NLEV1 is the no. of levels {v=IV(i), J=IJ(i)} of potential-1 which
c we wish to find.
c* IF(NLEV1=0) calculate (and print?) potential, and then quit.
c* If read-in value of NLEV1 < 0 , and program (attempts to) find all
c vibrational levels of potential-1 up to v = |NLEV1|. [This case
c assumes AUTO1 > 0.]
c** If (AUTO1.gt.0) read in only (v,J) quantum numbers of NLEV1 desired
c level & subroutine ALF tries to locate them (normal preferred case).
c If (AUTO1.le.0) also read in trial energy for each level. In this
c case, the NLEV.le.0 option does not work.
c If (AUTO1.le.0) and vib. quant. No. IV < 0, seek level nearest to
c given trial energy but for whatever q. number shows up
c** If(LCDC.gt.0) calculate centrifugal distortion constants for each
c level via the Tellinghuisen implementation of Hutson's method.
c** IF(LXPCT=0) calculate no expectation values or matrix elements.
c* IF(LXPCT = -1) only calculate and write compactly to channel-7 the
c eigenvalues and level widths.
c* IF(LXPCT= 1,2 or -2) calculate expectation values, or if |LXPCT| > 2
c the off-diagonal matrix elements, of powers of the distance
c coordinate or radial function defined by parameters IRFN & DREF.
c* For LXPCT > 0 write all these results to channel-6; otherwise
c supress most such printing to channel-6.
c* For |LXPCT| = 2 write eigenvalues and expectation values in
c compact form on channel-7.
c* For |LXPCT| > 2 calculate matrix elements coupling each level
c to all (up to NVIBMX) preceeding levels of the same potential (for
c NUMPOT.le.1), or to NLEV2 (see below) vib. levels of potential-2
c (for NUMPOT.ge.2), and if (|LXPCT| > 3) write the overall
c off-diagonal matrix elements on channel-8.
c* For |LXPCT| > 4 also write to channel-7 the matrix elements of the
c individual powers of the chosen distance coordinate (or radial fx.)
c* For |LXPCT| > 5 WRITE(7,xx) only those matrix element components.
c** IF(NJM > 0), for each vibrational level, calculate all rotational
c levels up to J=NJM or predissociation, whichever comes first.
c Note that AUTO1.le.0 forces NJM= 0
c** When (NJM.GT.0) increase J in increments of JDJR.
c** IF(IWR.NE.0) print error & warning descriptions
c IF(IWR.GE.1) also print final eigenvalues & node count.
c IF(IWR.GE.2) also show end-of-range wave function amplitudes
c IF(IWR.GE.3) print also intermediate trial eigenvalues, etc.
c** IF(LPRWF.GT.0) print wave function every LPRWF-th point.
c** IF(LPRWF.LT.0) compactly write to channel-10 every |LPRWF|-th
c wave function value. ** A lead "card" identifies the level, gives
c the position of 1-st point and radial mesh, & states No. of points
c=======================================================================
c** SINNER specifies whether wave function matching occurs at outermost
c (SINNER.le.0) or innermost well turning point, to facilitate finding
c inner vs. outer wells of a double well potential; controlled internally
c for double-well potentials
SINNER= 0
c ... Use this version of the 'NLEV1' READ to control this option in input
c-----------------------------------------------------------------------
c READ(5,*) NLEV1, AUTO1, LCDC, LXPCT, NJM, JDJR, IWR, LPRWF, SINNER
c-----------------------------------------------------------------------
c** INNOD1 specified wave fx. initiation at RMIN. Normal case of
c INNOD1 > 0 gives initiation with wave fx. node @ RMIN.
c INNOD1.le.0 give initiation with zero slope @ RMIN. This determines
c symmetric eigenfunctions for rare special case when input potential
c is half of a precisely symmetric potential with mid-point at RMIN.
INNOD1= 1
c ... Use this version of the 'NLEV1' READ to control this option in input
c-----------------------------------------------------------------------
c READ(5,*) NLEV1, AUTO1, LCDC, LXPCT, NJM, JDJR, IWR, LPRWF, INNOD1
c-----------------------------------------------------------------------
READ(5,*) NLEV1, AUTO1, LCDC, LXPCT, NJM, JDJR, IWR, LPRWF
c-----------------------------------------------------------------------
INNER= SINNER
INNOD2= INNOD1
IF(INNOD1.GT.0) WRITE(6,686) 1
IF(INNOD1.LE.0) WRITE(6,688) 1
IF(JDJR.LE.0) JDJR=1
IF(AUTO1.LE.0) NJM= 0
WRITE(6,612) EPS
NLEV= NLEV1
IF(NLEV1.LE.0) NLEV= 1
IF(NLEV1.GT.NVIBMX) NLEV= NVIBMX
IF(NLEV1.LT.0) AUTO1=1
SOMEG1= IOMEG1**2
IF(IOMEG1.LT.0) SOMEG1= IOMEG1
IF(IOMEG1.GE.0) THEN
IF(IOMEG1.GE.99) THEN
WRITE(6,609) !! special case of rotation in 2D
ELSE
WRITE(6,608) 1,IOMEG1,IOMEG1*IOMEG1
ENDIF
ELSE !! Alkalis include BOB corrn. in centrifugal potl
WRITE(6,6608) -IOMEG1
ENDIF
VMAX1= 0
IF(LPRWF.LT.0) WRITE(10,605) TITL
c** Read the vibrational & rotational quantum numbers IV(i) & IJ(i) [and
c if AUTO1.le.0 also trial energy GV(I)] of the NLEV levels to be found
c** For IV(i) values < -10, SCHRQ imposes a hard wall boundary
c condition (i.e., a node) at mesh point # |-IV(i)| .
c-----------------------------------------------------------------------
IF(AUTO1.GT.0) READ(5,*) (IV(I), IJ(I), I= 1,NLEV)
IF(AUTO1.LE.0) READ(5,*) (IV(I), IJ(I), GV(I), I= 1,NLEV)
c-----------------------------------------------------------------------
IF(NLEV1.GT.0) THEN
IF(AUTO1.GT.0) WRITE(6,607) NLEV,(IV(I),IJ(I),I=1,NLEV)
IF(AUTO1.LE.0) THEN
WRITE(6,6607) NLEV,(IV(I),IJ(I),GV(I),I=1,NLEV)
DO I= 1,NLEV1
ZK1(IV(I),0)= GV(I)
ENDDO
ENDIF
DO I= 1,NLEV
VMAX1= MAX(VMAX1,IV(I))
ENDDO
JREF= 0
ELSE
IF(NLEV1.LE.-NVIBMX) NLEV1= -NVIBMX+ 1
VMAX1= -NLEV1
NLEV= VMAX1+ 1
WRITE(6,625) IJ(1),NLEV, VLIM1
JREF= IJ(1)
DO I= 1,NLEV
IV(I)= I-1
IJ(I)= JREF
ENDDO
ENDIF
IF(NJM.GT.IJ(1)) WRITE(6,638) JDJR,NJM
IF(LCDC.GT.0) THEN
IF((IOMEG1.NE.0).AND.(NJM.LE.0).AND.(IJ(1).LE.0)) THEN
WRITE(9,903) TITL,NAME1,IMN1,NAME2,IMN2, IOMEG1
WRITE(6,903) TITL,NAME1,IMN1,NAME2,IMN2, IOMEG1
ELSE
WRITE(9,901) TITL, NAME1,IMN1,NAME2,IMN2
ENDIF
ENDIF
IF(LXPCT.EQ.-1) WRITE(7,723) TITL
c** MORDR is the highest power of the radial function (or distance
c coordinate whose expectation values or matrix elements are to be
c calculated. Program currently dimensioned for (MORDR.LE.10). To
c calculate only F-C Factors (when LXPCT>2), set MORDR = -1.
c** IRFN & DREF specify the definition of the radial function or
c distance coordinate RFN(R), powers of which are averaged over in
c expectation value or matrix element calculations.
c* If(IRFN .le. -10) utilize the USER-CHOSEN and CODED radial function
c generated in Lines #500-504 (below)
c* If(IRFN = -4) the function is a power series in R premultiplying a
c first derivative operator acting on the wavefx of Potential-2
c* If(IRFN = -3) the function is the inverse power 1/R**3
c* If(IRFN = -2) the function is the inverse power 1/R**2
c* If(IRFN = -1) the function is the Dunham coordinate X=(R-DREF)/DREF
c* If(IRFN = 0) the function RFN(R) is the distance R itself.
c* If(IRFN = 1-9) use the Surkus-type variable
c X=(R^p - DREF^p)/(R^p + DREF^p) where p= IRFN
c* For IRFN = -1 or 1-9, if DREF.gt.0 the read-in DREF value is the
c reference length used to define the distance coordinate, while
c if DREF.le.0 determine the value of this reference length by
c requiring that the expectation value X**1 of the distance
c coordinate for the first level considered be identically zero.
c* IF(IRFN.ge.10) define RFN(R) by reading in, interpolating over
c (and extrapolating beyond) IRFN read-in values of some known radial
c (transition moment) function, whose asymptotic value is DREF. Do
c this in using the same read statements and GENINT subroutine calls
c used for generating a numerical potential.
IF((LXPCT.NE.0).AND.(LXPCT.NE.-1)) THEN
c-----------------------------------------------------------------------
READ(5,*) MORDR, IRFN, DREF
c-----------------------------------------------------------------------
IF(MORDR.GT.MORDRMX) MORDR= MORDRMX
IF(IABS(LXPCT).EQ.2) WRITE(7,724) TITL,MORDR
IF((IABS(LXPCT).EQ.4).OR.(IABS(LXPCT).EQ.5)) WRITE(8,824) TITL
IF(IABS(LXPCT).GE.5) WRITE(7,725) TITL,MORDR
IF(IABS(IRFN).GE.10) THEN
MORDR= 1
DM(0)= 0.d0
DM(1)= 1.d0
ELSE
IF(MORDR.GE.0) THEN
c** Overall calculated matrix elements are for a power series in the
c radial function RFN(i) (specified by IRFN & DREF), so must read
c coefficients DM(J) of this power series.
c-----------------------------------------------------------------------
READ(5,*) (DM(J), J= 0,MORDR)
c-----------------------------------------------------------------------
ELSE
DO I= 1,NPP
RFN(I)= 1.D0
ENDDO
IF(MORDR.LT.0) WRITE(6,617)
ENDIF
ENDIF
c** Define radial function (distance coordinate) operator RFN(R) for
c expectation values or matrix elements.
c** First ... for matrix elements of an operator consisting of a power
c series in R premultiplying the radial derivative of the wavefx.
IF(IRFN.EQ.-4) WRITE(6,650) MORDR
IF(MORDR.GT.0) THEN
c** If RFN(R) is the distance itself ...
IF(IRFN.EQ.0) WRITE(6,614)
IF((IRFN.EQ.0).OR.(IRFN.EQ.-2).OR.(IRFN.EQ.-3)) DREF=0.D0
IF((IRFN.EQ.-2).OR.(IRFN.EQ.-3)) THEN
c** If RFN(R) is 1/(distance)**|IRFN| ....
J= -IRFN
WRITE(6,616) -IRFN
DO I= 1,NPP
RFN(I)= 1.d0/RFN(I)**J
ENDDO
ENDIF
c%% Any other user-defined matrix element argument radial function
c may be introduced to the code here, and invoked by: IRFN= -4
c Note that the existing RFN(i) array is the radial distances R .
IF(IRFN.LE.-10) THEN
c&&
c&& Illustrative user-defined analysis RFN(R) function
c&& WRITE(6,*) 'Print description of function introduced'
c&& WRITE(6,*) 'Use Freedman Pade DMF for CO'
c&& DO I= 1,NPP
c&&---------------------------------------------------------------------
c&& RFN(I)= {calculate users chosen radial function}
c&& Freedman's DMF for CO ---------------------------------------------
c&& RFN(I)= {calculate users chosen radial function}
c&& data coeff_new /-24.6005858d0,-109.5939637d0,-524.8233323d0,
c&& + 4.5194090d0,19.7954955d0,
c&& + 6.6011985d0,19.7206690d0/
c&& dm = -0.122706d0*(1.+coeff(1)*x+coeff(2)*x*x+coeff(3)*x**3)/
c&& + (1.+coeff(4)*x+coeff(5)*x*x+coeff(6)*x**3
c&& + + coeff(7)*x**6)
c&&---------------------------------------------------------------------
c&& XX= RFN(I)/1.128322714d0 - 1.d0
c&& RFN(I)= -0.122706d0*(1.d0+ XX*(-24.6005858d0
c&& 1 + XX*(-109.5939637d0 + XX*(-524.8233323d0))))/
c&& 2 (1.d0 + XX*(4.5194090d0 + XX*(19.7954955d0 +
c&& 3 XX*(6.6011985d0 + 19.7206690d0*XX**3))))
c&& ENDDO
ENDIF
IF((IRFN.EQ.-1).OR.((IRFN.GE.1).AND.(IRFN.LE.9))) THEN
c** If RFN(R) is the Dunham or Surkus-type distance coordinate
IF(IRFN.EQ.-1) WRITE(6,615)
IF((IRFN.GE.1).AND.(IRFN.LE.9)) WRITE(6,611)
1 IRFN,IRFN,IRFN,IRFN
IF(DREF.GT.0.D0) THEN
DREFP= DREF**IRFN
WRITE(6,613) DREF
DO I=1,NPP
XX= RMINN+I*RH
IF(IRFN.EQ.-1) RFN(I)= (XX- DREF)/DREF
IF(IRFN.GE.1) RFN(I)= (XX**IRFN- DREFP)
1 /(XX**IRFN + DREFP)
ENDDO
ELSE
WRITE(6,610)
ENDIF
ENDIF
c** If RFN(R) is defined by interpolating over read-in points, use
c potential generating routine to do interpolation/extrapolation.
IF(IRFN.GE.10) THEN
MORDR= 1
DM(0)= 0.d0
DM(1)= 1.d0
WRITE(6,603)
c** If the expectation value/matrix element radial function argument to
c be defined by interpolating/extrapolating over read-in points, then
c read input analogous to that for a pointwise potential, and then call
c interpolation/extrapolation routine GENINT (from PREPOT package)
c* NRFN is the number of points [XIF(i),YIF(i)] to be read in
c* RFLIM is the limiting asymptotic value imposed on the extrapolation
c* Interpolate with NUSEF-point piecewise polynomials (or splines for
c NUSEF.le.0), which are extrapolated to the asymptote as specified by
c parameters ILRF, NCNF & CNNF (see read #20).
c* RFACTF - factor converts read-in distances XIF(i) to angstroms
c* MFACTF - factor converts read-in moment values YIF(i) to debye.
c-----------------------------------------------------------------------
READ(5,*) NRFN, RFLIM
READ(5,*) NUSEF, ILRF, NCNF, CNNF
READ(5,*) RFACTF, MFACTF
READ(5,*) (XIF(I), YIF(I), I= 1,NRFN)
c-----------------------------------------------------------------------
WRITE(6,810) NRFN, RFLIM
IF(NUSEF.GT.0) WRITE(6,812) NUSEF, NRFN
IF(NUSEF.LE.0) WRITE(6,814) NRFN
IF((ILRF.GT.1).AND.(DABS(CNNF).GT.0.D0))
1 WRITE(6,816) CNNF, NCNF
WRITE(6,818) RFACTF, MFACTF
NROW= (NRFN+ 2)/3
DO J= 1,NROW
WRITE(6,820) (XIF(I), YIF(I), I=J, NRFN, NROW)
ENDDO
DO I= 1,NRFN
XIF(I)= XIF(I)*RFACTF
YIF(I)= YIF(I)*MFACTF
ENDDO
810 FORMAT(' Transition moment function defined by interpolating over'
1 ,I4,' read-in points'/5x,'and approaching the asymptotic value',
2 f12.6)
812 FORMAT(' Perform',I3,'-point piecewise polynomial interpolation ov
1er',I5,' input points' )
814 FORMAT(' Perform cubic spline interpolation over the',I5,' input p
1oints' )
816 FORMAT('- Beyond read-in points extrapolate to limiting asymptotic
1 behaviour:'/20x,'Y(R) = Y(lim) - (',D16.7,')/R**',I2)
818 FORMAT(' Scale input points: (distance)*',1PD16.9,' & (moment)
1*',D16.9/4x,'to get required units [Angstroms & debye]'/
3 3(' R(i) Y(i) ')/3(3X,11('--')))
820 FORMAT((3(F12.6,F13.6)))
IR2F= 0
CALL GENINT(LNPT,NPP,WF1,RFN,NUSEF,IR2F,NRFN,XIF,YIF,
1 RFLIM,ILRF,NCNF,CNNF)
ENDIF
ENDIF
IF((MORDR.GE.0).AND.(IABS(IRFN).LE.9))
1 WRITE(6,602) (DM(J),J=0,MORDR)
ENDIF
c** For matrix element calculation, couple each level of potential-1 to
c up to (see below) NLEV2 other vibrational levels, subject to
c rotational selection rules: DELTA(J)= J2DL to J2DU with increment
c J2DD (e.g., -1,+1,+2 for P- and R-branches).
c** If (AUTO2.gt.0) read in only (v,J) quantum numbers of desired levels
c and trust subroutine ALF to locate them (normal preferred case).
c If (AUTO2.le.0) also read in a trial pure vib energy for each level.
c* For the one-potential case (NUMPOT.LE.1), automatically truncate to
c avoid redundancy and consider only emission into these NLEV2 levels.
c* Trial level energies are generated internally.
c** IV2(i) are the vibrational quantum numbers of the Potential-2
c levels for which matrix elements are desired.
c** ZK(IV2(i),0) are the associated pure vibrational trial energies
c (which are only read in if AUTO2.le.0!)
c=======================================================================
c** INNOD2 specified wave fx. initiation at RMIN. Normal case of
c INNOD2 > 0 gives initiation with wave fx. node @ RMIN.
c INNOD2.le.0 give initiation with zero slope @ RMIN. This determines
c symmetric eigenfunctions for rare special case when input potential
c is half of a precisely symmetric potential with mid-point at RMIN.
ccc READ(5,*) NLEV2, AUTO2, J2DL, J2DU, J2DD, INNOD2
c=======================================================================
IF(IABS(LXPCT).GE.3) THEN
c-----------------------------------------------------------------------
READ(5,*) NLEV2, AUTO2, J2DL, J2DU, J2DD
c-----------------------------------------------------------------------
IF(NLEV2.GT.NVIBMX) NLEV2= NVIBMX
IF(NLEV2.LE.0) THEN
WRITE(6,644) NLEV2
STOP
ENDIF
c----------------------------------------------------------------------
IF(AUTO2.GT.0) READ(5,*) (IV2(I), I= 1,NLEV2)
IF(AUTO2.LE.0) THEN
READ(5,*) (IV2(I), ZK2(I,1), I= 1,NLEV2)
c----------------------------------------------------------------------
c** Give potential-2 trial energy the correct vibrational label
DO I= 1,NLEV2
ZK2(IV2(I),0)= ZK2(I,1)
ENDDO
ENDIF
IF(NUMPOT.GT.1) THEN
IF(INNOD2.GT.0) WRITE(6,686) 2
IF(INNOD2.LE.0) WRITE(6,688) 2
ENDIF
VMAX2= 0
DO ILEV2= 1,NLEV2
VMAX2= MAX(VMAX2,IV2(ILEV2))
ENDDO
IF(MORDR.LT.0) DM(1)= 1.d0
SOMEG2= IOMEG2**2
IF(IOMEG2.LT.0) SOMEG2= -IOMEG2
IF(J2DD.EQ.0) J2DD= 1
IF(AUTO2.GT.0) WRITE(6,634) J2DL,J2DU,J2DD,NLEV2,(IV2(I),
1 I= 1,NLEV2)
IF(AUTO2.LE.0) WRITE(6,6634) J2DL,J2DU,J2DD,NLEV2,(IV2(I),
1 ZK2(IV2(I),0), I= 1,NLEV2)
IF(NUMPOT.GE.2) THEN
IF(IOMEG2.GE.0) THEN
IF(IOMEG2.GE.99) THEN
WRITE(6,609) !! special case of rotation in 2D
ELSE
WRITE(6,608) 2,IOMEG2,IOMEG2*IOMEG2
ENDIF
ELSE !! Alkali including BOB corrn. in centrifugal potl
WRITE(6,6608) -IOMEG2
ENDIF
ENDIF
ENDIF
c
IF(AUTO1.GT.0) THEN
c** If using automatic search for desired levels, subroutine ALF gets
c eigenvalues ZK1(v,0) for desired vibrational levels of Potential-1,
c centrifugally-distorted to J=JREF.
EJREF= JREF*(JREF+1)*RH**2
DO I= 1,NPP
VJ(I)= V1(I)+ EJREF*RM2(I)
ENDDO
IF((NLEV1.EQ.1).AND.(IV(1).gt.998)) THEN
c** Option to search for the very highest level (within 0.001 of Disoc)
EO= VLIM1- 0.001d0
KV= IV(1)
CALL SCHRQ(KV,JREF,EO,GAMA,PMAX1,VLIM1,VJ,WF1,BFCT,EPS,
1 RMIN,RH,NPP,NBEG,NEND,INNOD1,INNER,IWR,LPRWF)
IV(1)= KV
IF(KV.GE.0) THEN
WRITE(6,622) IJ(1),KV,VLIM1-EO
GV(KV)= EO
VMAX1= KV
ELSE
WRITE(6,626) J, 0.001d0
STOP
ENDIF
ELSE
c** For 'normal' case of automatic search for multiple levels
VMAX= VMAX1
AFLAG= JREF
IF((IABS(LXPCT).GT.2).AND.(NUMPOT.EQ.1)) VMAX=
1 MAX(VMAX1,VMAX2)
CALL ALF(NPP,RH,NCN1,RR,VJ,WF1,VLIM1,MAXMIN,VMAX,NVIBMX,
1 AFLAG,ZMU,EPS,GV,INNOD1,INNR1,IWR)
VMAX1= VMAX
ENDIF
c** Get band constants for v=0-VMAX1 for generating trial eigenvalues
WARN= 0
DO ILEV1= 0,VMAX1
KV= ILEV1
EO= GV(KV)
INNER= INNR1(KV)
CALL SCHRQ(KV,JREF,EO,GAMA,PMAX1,VLIM1,VJ,WF1,BFCT,EPS,
1 RMIN,RH,NPP,NBEG,NEND,INNOD1,INNER,WARN,NoPRWF)
CALL CDJOEL(EO,NBEG,NEND,BvWN,RH,WARN,VJ,WF1,RM2,RCNST)
IF(NLEV1.LT.0) THEN
IV(ILEV1+1)= KV
IJ(ILEV1+1)= JREF
ENDIF
ZK1(ILEV1,0)= GV(ILEV1)
DO M= 1,7
ZK1(ILEV1,M)= RCNST(M)
ENDDO
ENDDO
ENDIF
IF(IABS(LXPCT).GT.2) THEN
IF(AUTO2.GT.0) THEN
c** If using automatic location for levels of potential-2 (AUTO2 > 0)
c for matrix element calculation, also need Potential-2 band constants
c (rotational energy derivatives) ... again, calculate them at J=JREF
IF(NUMPOT.GT.1) THEN
AFLAG= JREF
DO I= 1,NPP
VJ(I)= V2(I)+EJREF*RM22(I)
ENDDO
CALL ALF(NPP,RH,NCN2,RR,VJ,WF1,VLIM2,MAXMIN,VMAX2,
1 NVIBMX,AFLAG,ZMU,EPS,GV,INNOD2,INNR2,IWR)
ENDIF
ENDIF
DO ILEV2= 1,NLEV2
IF(NUMPOT.EQ.1) THEN
c** For matrix elements within a single potl., copy above band constants
DO M= 0,7
ZK2(IV2(ILEV2),M)= ZK1(IV2(ILEV2),M)
ENDDO
ELSE
c ... otherwise, generate them (as above) with SCHRQ & CDJOEL
KV= IV2(ILEV2)
IF(AUTO2.GT.0) EO= GV(KV)
IF(AUTO2.LE.0) EO= ZK2(KV,0)
INNER= INNR2(KV)
CALL SCHRQ(KV,JREF,EO,GAMA,PMAX2,VLIM2,VJ,WF1,
1 BFCT,EPS,RMIN,RH,NPP,NBEG,NEND,INNOD2,INNER,WARN,NoPRWF)
CALL CDJOEL(EO,NBEG,NEND,BvWN,RH,WARN,VJ,WF1,RM2,
1 RCNST)
ZK2(IV2(ILEV2),0)= EO
DO M= 1,7
ZK2(IV2(ILEV2),M)= RCNST(M)
ENDDO
ENDIF
ENDDO
ENDIF
WARN= 1
EJREF= EJREF/RH**2
IF(NLEV1.LE.0) NLEV= VMAX1+1
c
c===== Begin Actual Potential-1 Eigenvalue Calculation Loop Here =======
c** Loop to compute eigenvalues ... etc. for NLEV levels of Potential-1
DO 190 ILEV1= 1,NLEV
KV= IV(ILEV1)
IF(KV.LT.0) EXIT
NJMM= MAX(NJM,IJ(ILEV1))
JROT= IJ(ILEV1)- JDJR
IQT= 0
JCT= 0
DO JLEV= IJ(ILEV1),NJMM,JDJR
JROT= JROT+ JDJR
EJ= JROT*(JROT+1) - SOMEG1
IF(IOMEG1.GE.99) EJ= JROT*JROT - 0.25D0
c** If appropriate (AUTO1>0) use ALF results to generate trial eigenvalue
IF(AUTO1.GT.0) THEN
EO= ZK1(KV,0)
DEJ= EJ- EJREF
EJP= 1.d0
DO M= 1,7
EJP= EJP*DEJ
EO= EO+ EJP*ZK1(KV,M)
ENDDO
ELSE
EO= GV(ILEV1)
ENDIF
c ... or if JLEV > IJ(ILEV1) ... use local Beff to estimate next level
IF(JLEV.GT.IJ(ILEV1)) THEN
BEFF= 0.d0
DO I= NBEG,NEND
BEFF= BEFF+ WF1(I)**2*RM2(I)
ENDDO
BEFF= BEFF*RH*BvWN
EO= ESLJ(JCT)+ (2*JLEV+ 1- JDJR)*JDJR*BEFF
ENDIF
c** Now add centrifugal term to get effective (radial) potential
EJ= EJ*RH**2
DO J= 1,NPP
VJ(J)= V1(J) + EJ*RM2(J)
ENDDO
c** Set wall outer boundary condition, if specified by input IV(ILEV1)
IF(KV.LT.-10) THEN
WF1(-IV(ILEV1))= 0.D0
WF1(-IV(ILEV1)-1)= -1.D0
ENDIF
KVIN= KV
INNER= INNR1(KV)
IF(SINNER.NE.0) INNER= SINNER
c** Call SCHRQ to find Potential-1 eigenvalue EO and eigenfn. WF1(i)
100 CALL SCHRQ(KV,JROT,EO,GAMA,PMAX1,VLIM1,VJ,WF1,BFCT,EPS,
1 RMIN,RH,NPP,NBEG,NEND,INNOD1,INNER,IWR,LPRWF)
IF(KV.LT.0) THEN
c** SCHRQ error condition is (KV.LT.0) .
IF(NJM.GT.IJ(ILEV1)) THEN
c ... in automatic search for ever-higher J levels
IF(IQT.LE.0) THEN
c ... try one more time with E(trial) slightly below barrier maximum
IQT= 1
EO= PMAX1- 0.1d0
GO TO 100
ELSE
KV= KVIN
GO TO 130
ENDIF
ENDIF
GO TO 122
ENDIF
IF((KV.NE.KVIN).AND.
1 ((AUTO1.GT.0))) THEN
c IF(KV.NE.KVIN) THEN
c** If got wrong vib level, do a brute force ALF calculation to find it.
KV= KVIN
AFLAG= JROT
CALL ALF(NPP,RH,NCN1,RR,VJ,WF1,VLIM1,MAXMIN,KV,NVIBMX,
1 AFLAG,ZMU,EPS,GV,INNOD1,INNR1,IWR)
IF(KV.EQ.KVIN) THEN
EO= GV(KVIN)
INNER= INNR1(KVIN)
GO TO 100
ELSE
WRITE(6,618) KVIN,JROT,KV
KV= KVIN
GO TO 130
ENDIF
ENDIF
if(kv.ne.iv(ilev1)) iv(ilev1)= KV
c** If desired, calculate rotational & centrifugal distortion constants
IF(LCDC.GT.0) THEN
IF((IOMEG1.NE.0).AND.(JROT.EQ.0)) THEN
c** Calculate rotationless potential band constants for specified levels
c... For IOMEG.NE.0 this means for [J(J+1)=OMEGA^2] = 0
CALL SCHRQ(KV,0,EO,GAMA,PMAX1,VLIM1,V1,WF1,BFCT,
1 EPS,RMIN,RH,NPP,NBEG,NEND,INNOD1,INNER,IWR,LPRWF)
CALL CDJOEL(EO,NBEG,NEND,BvWN,RH,WARN,V1,WF1,RM2,
1 RCNST)
ELSE
c** Calculate rotational constants for actual (v,J) level of interest.
CALL CDJOEL(EO,NBEG,NEND,BvWN,RH,WARN,VJ,WF1,RM2,
1 RCNST)
ENDIF
IF(DABS(VLIM1-EO).GT.1.d0) THEN
WRITE(6,606) KV,JROT,EO,(RCNST(M),M=1,7)
ELSE
WRITE(6,6055) KV,JROT,EO,(RCNST(M),M=1,7)
ENDIF
IF(LCDC.GT.0) THEN
IF((DABS(VLIM1).GT.0.d0)
1 .OR.(DABS(VLIM1-EO).GT.1.d0)) THEN
WRITE(9,902) KV,JROT,EO,(RCNST(M),M=1,7)
ELSE
WRITE(9,904) KV,JROT,EO,(RCNST(M),M=1,7)
ENDIF
ENDIF
ENDIF
IF(LXPCT.EQ.-1) WRITE(7,703) KV,JROT,EO,GAMA
IF(((LXPCT.EQ.1).OR.(IABS(LXPCT).EQ.2)).OR.
1 ((IABS(LXPCT).GT.2).AND.((IRFN.EQ.-1).OR.
2 (IRFN.GE.1).AND.(IRFN.GE.9)).AND.(DREF.LE.0.d0))) THEN
c** Calculate various expectation values in LEVXPC
CALL LEVXPC(KV,JROT,EO,GAMA,NPP,WF1,VJ,VLIM1,RFN,RMIN,
1 RH,DREF,NBEG,NEND,LXPCT,MORDR,DM,IRFN,BFCT)
IF((LXPCT.GT.0).AND.(MORDR.GT.0)) WRITE(6,632)
ENDIF
IF((IABS(LXPCT).LE.2).OR.(NLEV2.LE.0)) GO TO 122
c=======================================================================
c** If desired, now calculate off-diagonal matrix elements, either
c between levels of different potentials, IF(NUMPOT.GE.2), or between
c levels of a single potential, for (NUMPOT.LE.1).
c** First prepare centrifugally distorted potential, trial energy, etc.,
c and calculate second wave function and matrix element(s)
DO 120 ILEV2= 1,NLEV2
c** For case of a single potential, avoid redundancy by considering
c only emission
IF((NUMPOT.LE.1).AND.(IV2(ILEV2).GT.KV)) GO TO 120
c** Loop over J2's allowed by given selection rule.
DO 116 IJD= J2DL,J2DU,J2DD
KV2= IV2(ILEV2)
KVIN= KV2
JROT2= JROT+IJD
IF(JROT2.LT.0) GO TO 116
IF((NUMPOT.LE.1).AND.(IV2(ILEV2).EQ.KV).AND.
1 (JROT2.GT.JROT)) GO TO 116
EJ2= JROT2*(JROT2+1)- SOMEG2
IF(IOMEG2.GE.99) EJ2=JROT2**2-0.25D0
EO2= ZK2(KV2,0)
DEJ= EJ2- EJREF
EJP= 1.d0
c** Use calculated state-2 CDC's to predict trial eigenvalue
DO M= 1,7
EJP= EJP*DEJ
EO2= EO2+ EJP*ZK2(KV2,M)
ENDDO
c** Now ... update to appropriate centrifugally distorted potential
EJ2= EJ2*RH*RH
DO I=1,NPP
VJ(I)= V2(I)+ EJ2*RM22(I)
ENDDO
INNER= INNR2(KV2)
IF(SINNER.NE.0) INNER= SINNER
ICOR= 0
110 CALL SCHRQ(KV2,JROT2,EO2,GAMA,PMAX2,VLIM2,VJ,WF2,
1 BFCT,EPS,RMIN,RH,NPP,NBEG2,NEND2,INNOD2,INNER,IWR,LPRWF)
IF(KV2.NE.KVIN) THEN
IF(KV2.LT.0) GO TO 114
c** Using CDC's to estimate trial eigenvalue failed:
ICOR= ICOR+1
IF(ICOR.LE.2) THEN
c ... first correction attempt ... use semiclassical dv/dE to improve
GB= -1.d0
GI= -1.d0
WV= 0.d0
XX= EO2*BFCT
DO I= NBEG2,NEND2
GBB= GB
GB= GI
GI= XX-VJ(I)
IF((GBB.GT.0.d0).AND.(GI.GT.0.d0))
1 WV= WV+ 1.d0/DSQRT(GB)
ENDDO
WV= 6.2832d0/(BFCT*WV)
EO2= EO2+ WV*(KVIN- KV2)
GO TO 110
ENDIF
WRITE(6,633) IV2(ILEV2),JROT2,KV2
c ... if that fails, do a brute force ALF calculation to find it.
114 KV2= KVIN
AFLAG= JROT2
CALL ALF(NPP,RH,NCN2,RR,VJ,WF2,VLIM2,MAXMIN,
1 KV2,NVIBMX,AFLAG,ZMU,EPS,GV,INNOD2,INNR2,IWR)
IF(KV2.EQ.KVIN) THEN
EO2= GV(KV2)
INNER= INNR2(KV2)
GO TO 110
ELSE
WRITE(6,618) KVIN,JROT,KV2
GO TO 116
ENDIF
ENDIF
IF(NBEG.GT.NBEG2) NBEG2= NBEG
IF(NEND.LT.NEND2) NEND2= NEND
c IF((NUMPOT.LE.1).AND.(EO2.GT.(EO+EPS))) GO TO 120
CALL MATXEL(KV,JROT,IOMEG1,EO,KV2,JROT2,IOMEG2,
1 IRFN,EO2,NBEG2,NEND2,LXPCT,MORDR,DM,RH,WF1,WF2,RFN)
116 CONTINUE
c** End of Potential-2 rotational selection level loop
120 CONTINUE
c++++ End of Potential-2 vibrational level matrix element loop +++++++++
c
122 CONTINUE
JCT= JCT+1
c ... check to avoid array overflow
IF(JCT.GT.NVIBMX) THEN
WRITE(6,637) NVIBMX
STOP
ENDIF
JWR(JCT)= JROT
ESLJ(JCT)= EO
ENDDO
c++ End of Potential-1 loop over NJM-specified J-sublevels
130 IF(NJM.GT.IJ(ILEV1)) THEN
c** Print rotational sublevels generated for vibrational level ILEV
NROW=(JCT+4)/5
WRITE(6,627) KV
DO J=1,NROW
WRITE(6,628) (JWR(I),ESLJ(I),I=J,JCT,NROW)
ENDDO
WRITE(6,641)
ENDIF
ESOLN(ILEV1)= ESLJ(1)
190 CONTINUE
c++ End of loop over the NLEV Potential-1 input levels
IF(NLEV1.LT.0) THEN
NROW=(NLEV+3)/4
WRITE(6,623) NLEV,IJ(1)
DO J=1,NROW
WRITE(6,630) (IV(I),ESOLN(I),I=J,NLEV,NROW)
ENDDO
IF((NLEV.GT.1).AND.(IJ(1).EQ.0).AND.(NCN1.GT.0)
1 .AND.(ESOLN(NLEV).LT.VLIM1)) THEN
c** In (NLEV1 < 0) option, estimate vD using the N-D theory result that:
c (vD - v) {is proportional to} (binding energy)**((NCN-2)/(2*NCN))
VDMV=1.D0/(((VLIM1-ESOLN(NLEV-1))/
1 (VLIM1-ESOLN(NLEV)))**(1.D0/PW) - 1.D0)
c** Use empirical N-D Expression to predict number and (if there are
c any) energies of missing levels
VD= IV(NLEV)+VDMV
IVD= INT(VD)
IF(IVD.GE.NVIBMX) IVD= NVIBMX-1
IVS= IV(NLEV)+1
WRITE(6,620) NCN1,IV(NLEV-1),IV(NLEV),VD
IF((IVD.GE.IVS).AND.(DFLOAT(IV(NLEV))/VD.GT.0.9d0)) THEN
NFP= NLEV+1
DO I= IVS,IVD
NLEV= NLEV+1
IV(NLEV)= IV(NLEV-1)+1
ESOLN(NLEV)= VLIM1 - (VLIM1 - ESOLN(NLEV-1))*
1 (1.D0 - 1.D0/VDMV)**PW
VDMV= VDMV-1.D0
ENDDO
NLP= NLEV-NFP+1
NROW= (NLP+3)/4
WRITE(6,621) NLP
DO J= 1,NROW
III= NFP+J-1
WRITE(6,630) (IV(I),ESOLN(I),I= III,NLEV,NROW)
ENDDO
ENDIF
ENDIF
ENDIF
IF((NJM.GT.0).AND.(NLEV1.GE.0)) THEN
NLEV= VMAX1+ 1
NROW= (NLEV+2)/3
WRITE(6,619) NLEV
DO J= 1,NROW
WRITE(6,631) (IV(I),IJ(I),ESOLN(I),I= J,NLEV,NROW)
ENDDO
ENDIF
WRITE(6,601)
GO TO 2
999 STOP
c-------------------------------------------------------------------
601 FORMAT(1x,79('=')////)
602 FORMAT( ' Coefficients of expansion for radial matrix element/expe
1ctation value argument:'/(5X,5(1PD14.6)))
603 FORMAT(/' Expectation value/matrix element arguments are powers of
1 a radial function'/5x,'defined by interpolating over read-in poin
2ts'//' Transition moment function:'/1x,9('==='))
604 FORMAT(' Integrate from RMIN=',f7.3,' to RMAX=',f7.2,
1 ' with mesh RH=',f9.6,'(Angst)'//' Potential-1 for ',A2,'(',
2 I3,')-',A2,'(',I3,')'/1x,32('='))
605 FORMAT(/A78/40('=='):/' Generate ZMU=',F15.11,'(u)',
1 ' & BZ=',1PD16.9,'((1/cm-1)(1/Ang**2))'/
2 10x,'from atomic masses:',0Pf16.11,' & ',F16.11,'(u)')
6055 FORMAT(' E(v=',i3,', J=',i3,')=',G12.6,' Bv=',F11.7,
1 ' -Dv=',1PD12.4,' Hv=',D12.4/8x,' Lv=',D12.4,
2 ' Mv=',D12.4,' Nv=',D12.4,' Ov=',D12.4)
606 FORMAT(' E(v=',i3,', J=',i3,')=',f10.3,' Bv=',F11.7,
1 ' -Dv=',1PD12.4,' Hv=',D12.4/8x,' Lv=',D12.4,
2 ' Mv=',D12.4,' Nv=',D12.4,' Ov=',D12.4)
607 FORMAT(/' Solve for the',i4,' vibration-rotation levels of Potenti
1al-1:'/' (v,J) =',6(' (',i3,',',i3,')':)/(10x,6(' (',i3,',',
2 i3,')':)))
6607 FORMAT(/' Solve for',i4,' vibration-rotation levels of Potential-1
1 using Trial energies:'/(2x,3(' E(',I3,',',I3,') =',
2 F11.2:)))
6608 FORMAT(/' Including BOB term makes centrifugal potential strength
1factor [J(J+1) +',I2,']'/)
608 FORMAT(/' Since state-',I1,' has (projected) electronic angular mo
1mentum OMEGA=',I2/ 9x,'eigenvalue calculations use centrifugal p
2otential [J*(J+1) -',I2,']/r**2'/ )
609 FORMAT(' Use centrifugal potential for rotation in two dimensions
1: (J**2 - 1/4)/r**2'/)
610 FORMAT(5X, 'where DREF defined by requiring = 0 for first
1 level considered')
611 FORMAT(/' Matrix element argument expansion vble is X = ((r^',
1 i1,' - DREF^',i1,')/(r^',i1,' + DREF^',i1,'))')
612 FORMAT(/' Eigenvalue convergence criterion is EPS=',1PD8.1,
1 '(cm-1)'/' Airy function at 3-rd turning point is quasibound oute
2r boundary condition')
613 FORMAT(5X,'where reference length is held fixed at DREF =',
1 F13.10,'(Angstroms)')
614 FORMAT(/' Matrix element arguments are powers of the distance r (
1in Angstroms)')
615 FORMAT(/' Matrix element argument expansion variable is: X = (r
1 - DREF)/DREF')
616 FORMAT(/' Matrix element arguments are powers of the squared inver
1se distance X = 1/r**',i1)
617 FORMAT(/' Matrix element argument is fixed as a constant = 1')
618 FORMAT(' *** PROBLEM *** Searching for v=',i3,' , J=',i3,
1 ' ALF only found to v=',i3)
619 FORMAT(/' Find the',i4,' vibration-rotation levels:'/
1 3(' v J E(v) ')/3(2x,7('---')))
620 FORMAT(/' An n=',I2,' N-D theory extrapolation from v=',I4,
1 ' &',I4,' implies vD =',F8.3)
621 FORMAT(5X,'with the',I4,' missing level(s) predicted to be:'/
1 4(' v E(v) ')/4(4x,7('--')))
622 FORMAT(/' Search for highest bound J=',i3,' level finds E(v=',
1 i3,') = VLIM -',1PD12.5/)
623 FORMAT(/' Find',I4,' Potential-1 vibrational levels with J=',i3/
1 4(' v E(v) ')/4(4x,7('--')))
624 FORMAT(4x,'Since the molecule is an ion with charge',SP,I3/6x,"use
1 Watson's charge-adjusted reduced mass mu = M1*M2/[M1 + M2 - (",
2 i2,')*me]')
625 FORMAT(' For J=',i3,', seek the first',i4,' levels of Potential-1
1 with VLIM=',F11.3/)
626 FORMAT(/' *** FAIL to find highest bound J=',i3,' level from tria
1l E = VLIM -',1PD11.4)
627 FORMAT(/' For vibrational level v =',I3,' of Potential-1'/
1 1X,5(' J',6X,'E',7X)/1X,5(7('--'),2X))
628 FORMAT((1X,5(I3,F11.3,2X)))
630 FORMAT((4(I6,F12.4:)))
631 FORMAT((3(I6,I4,F13.5:)))
632 FORMAT(1X,79('-'))
633 FORMAT(' **** Caution: Search for v=',I3,' J=',i3,
1 ' on potential-2 actually found v=',I3)
634 FORMAT(/' Using the rotational selection rule: delta(J)=',
1 i3,' to',i2,' with increment',i2/' calculate matrix elements fo
2r coupling to the',I4,' vibrational levels of'/
3 ' Potential-2: v =',14I4:/(21x,14i4:))
6634 FORMAT(/' Using the rotational selection rule: delta(J)=',
1 i3,' to',i2,' with increment',i2/' calculate matrix elements fo
2r coupling to the',I4,' vibrational levels of'/' Potential-2 usi
3ng trial energies:',2(' E(',I3,')=',F9.2:)/4(' E(',I3,')=',
4 F9.2:))
635 FORMAT(/' Get matrix elements between levels of Potential-1 (above
1) & Potential-2 (below)'/1X,39('--')/' For Potential-2:'/
2 1x,17('='))
636 FORMAT(/' Calculate properties of the single potential described a
1bove')
637 FORMAT(/' *** Array Dimension OVERFLOW *** (Number of J sublevel
1s) > NVIBMX=',i4)
638 FORMAT(' and automatically increment J in steps of',i3, ' to a
1 maximum value of',i4)
641 FORMAT(1X,39('++'))
644 FORMAT(/' *** Input data ERROR *** matrix element calculation need
1s NLEV2=',i3,' > 0')
650 FORMAT(/' Matrix element argument is radial first derivative opera
1tor premultiplied by'/5x,'a power series in r of order',i3)
686 FORMAT(' Potential-',i1,' uses inner boundary condition of zero v
1alue at RMIN')
688 FORMAT(' Potential-',i1,' uses symmetric-well inner boundary condi
1tion of zero slope at RMIN')
703 FORMAT(1X,I4,I5,F13.4,G13.5)
723 FORMAT(/A78/1x,'Output values of: v, J, E & (Level Width)')
724 FORMAT(//A78//' v J E(v,J) Width ',
1 6x,' & for k=1 to',i3/2x,38('=='))
725 FORMAT(//A78//" v' J'",' v" J" FREQ'," for k=0 to MORDR=',i2/2x,37('=='))
824 FORMAT(//A78/30('==')/" Note that (v',J') &",' (v",J") strictly la
1bel the upper and lower levels, resp.,'/6x,'and E(lower)=E"'/
2 ' but E(2)-E(1) is: (energy of State-2 level) - (energy of Sta
3te-1 level)'//12x,'Band'/' dJ(J")',4x,7hv' v",' E(lower) E(2)-
4E(1) A(Einstein) F-C Factor ',13h /
5 1x,3('--'),(' -------'),' --------',3x,4('--'),3x,11('-'),
6 3x,11('-'),3x,11('-') )
901 FORMAT(/1x,A78,' for ',A2,'(',I3,')-',A2,'(',I3,')'/1x,62('==')/
1 ' v J',7x,'E',10x,'Bv',11x,'-Dv',13x,'Hv',13x,'Lv',13x,
2 'Mv',13x,'Nv',13x,'Ov'/1x,62('=='))
903 FORMAT(/1x,A78,' for ',A2,'(',I3,')-',A2,'(',I3,')'/1x,62('==')/
1 ' Although OMEGA=',I4,', these band constants obtained for [J(J
2+1) - OMEGA^2] = 0'/1x,62('==')/
3 ' v J',7x,'E',10x,'Bv',11x,'-Dv',13x,'Hv',13x,'Lv',13x,
4 'Mv',13x,'Nv',13x,'Ov'/1x,62('=='))
902 FORMAT(I4,I5,f12.4,f14.10,6(1PD15.7))
904 FORMAT(I4,I5,1PD12.5,0P,f14.10,1P,6(D15.7))
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE LEVXPC(KV,JR,EPR,GAMA,NPP,WF,V,VLIM,RFN,RMIN,RH,DREF,
1 NBEG,NEND,LXPCT,MORDR,DM,IRFN,BFCT)
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Calculates expectation values of the kinetic energy and of X**IP
c (IP=1,MORDR), denoted XPTKE and XPCTR(IP), respectively, for level
c v=KV, J=JR, E=EPR(cm-1), using wave function WF(i), (i=NBEG,NEND).
c** Assumes units of length are (Angstroms) .
c** Division by BFCT converts potential V(I) to units (cm-1).
c** If (|LXPCT| = 2 or 4), "punch" (WRITE(7,XXX)) results to channel-7
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INTEGER I,K,IRFN,IPNCH,ITRY,JR,KV,LXPCT,NPP,NBEG,NEND,MORDR
REAL*8 WF(NPP),V(NPP),RFN(NPP),XPCTR(0:11),DM(0:20)
REAL*8 BFCT,DS,DRT,DMR,DER,EPR,EINN,GAMA,RMIN,RMINN,RH,DREF,
1 RR,RXPCT,SS2,SF2,VLIM,XPTKE
c
EINN= BFCT*EPR
IPNCH=0
IF((IABS(LXPCT).EQ.2).OR.(IABS(LXPCT).GE.4)) IPNCH=1
c** MORDR is the highest-power expectation value considered.
IF(MORDR.GT.11) MORDR=11
ITRY=20
IF(((IRFN.EQ.-1).OR.((IRFN.GE.1).AND.(IRFN.LE.9)))
1 .AND. (DREF.LE.0.D0)) ITRY=0
c** Start by calculating contributions at end points
2 SS2=WF(NBEG)**2
SF2=WF(NEND)**2
XPTKE= 0.5D0*(SS2*(EINN-V(NBEG)) + SF2*(EINN-V(NEND)))
IF(MORDR.GT.0) THEN
XPCTR(0)= 1.d0/RH
DO K=1,MORDR
SS2=SS2*RFN(NBEG)
SF2=SF2*RFN(NEND)
XPCTR(K)=0.5D0*(SS2+SF2)
ENDDO
ENDIF
IF(IRFN.GT.-4) THEN
c** For regular expectation values of a radial function ...
DO I=NBEG+1,NEND-1
DS=WF(I)**2
XPTKE= XPTKE+ DS*(EINN-V(I))
IF(MORDR.GT.0) THEN
RR= RFN(I)
DO K=1,MORDR
DS=DS*RR
XPCTR(K)=XPCTR(K)+DS
ENDDO
ENDIF
ENDDO
ELSE
c** For expectation values involving partial derivative operator ...
DO K= 0,MORDR
XPCTR(K)= 0.d0
ENDDO
DO I=NBEG+1,NEND-1
DS=WF(I)**2
XPTKE= XPTKE+ DS*(EINN-V(I))
DS= WF(I)*(WF(I+1)- WF(I-1))
IF(MORDR.GT.0) THEN
RR= RFN(I)
DO K=1,MORDR
DS=DS*RR
XPCTR(K)=XPCTR(K)+DS
ENDDO
ENDIF
ENDDO
DO K= 0,MORDR
XPCTR(K)= XPCTR(K)/(2.d0*RH)
ENDDO
ENDIF
XPTKE= XPTKE*RH/BFCT
IF(MORDR.LT.0) GO TO 99
DMR= 0.d0
DO K=0,MORDR
XPCTR(K)=XPCTR(K)*RH
DMR= DMR+ DM(K)*XPCTR(K)
ENDDO
IF((LXPCT.EQ.1).OR.(IABS(LXPCT).EQ.2)) THEN
IF(EPR.LE.VLIM) WRITE(6,600) KV,JR,EPR,DMR,XPTKE
IF(EPR.GT.VLIM) WRITE(6,602) KV,JR,EPR,DMR,XPTKE,GAMA
IF(IABS(IRFN).LE.9) WRITE(6,604) (K,XPCTR(K),K=1,MORDR)
IF(IPNCH.GE.1) WRITE(7,701) KV,JR,EPR,GAMA,XPTKE,DMR,
1 (XPCTR(K),K=1,MORDR)
ENDIF
IF(ITRY.GT.19) GO TO 99
c** If appropriate, iteratively correct DREF value till distance
c coordinate expectation value is identically zero.
IF(IRFN.EQ.-1) THEN
c** For Dunham expansion parameter, define revised function here
DREF=XPCTR(1)
DRT=DREF
WRITE(6,603) ITRY,DRT,DREF
DO I= 1,NPP
RFN(I)= RFN(I)/DREF - 1.D0
ENDDO
ITRY=99
GO TO 2
ENDIF
c** For Surkus-type expansion parameter, define revised function
ITRY=ITRY+1
IF(ITRY.EQ.1) THEN
RXPCT= XPCTR(1)
DREF= 0.D0
DRT= RXPCT
ELSE
DER= -IRFN/(2.d0*DREF)
DRT= -XPCTR(1)/DER
ENDIF
DREF=DREF+DRT
WRITE(6,603) ITRY,DRT,DREF
c** Redefine Surkus-type distance variable RFN using new DREF
RMINN= RMIN- RH
DO I= 1,NPP
RR= RMINN+ I*RH
RFN(I)= (RR**IRFN - DREF**IRFN)/(RR**IRFN + DREF**IRFN)
ENDDO
IF(DABS(DRT/DREF).GE.1.D-12) GO TO 2
99 RETURN
600 FORMAT(' E(v=',i3,', J=',i3,')=',f11.3,' =',G18.10,
1 ' =',F11.3)
602 FORMAT(' E(v=',i3,', J=',i3,')=',f11.3,' =',G18.10,
1 ' =',F11.3/' Tunneling predissociation Width(FWHM)=',
2 G13.6,' =',F13.8)
604 FORMAT((8x,3(' =',F13.8:)))
603 FORMAT(' On iteration #',I2,' change DREF by',1PD10.2,
1 ' to DREF=',0PF13.10,' [Angstroms]')
701 FORMAT(2I4,F11.3,G11.4,F11.3,3(F12.7)/(5X,6F12.7))
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE MATXEL(KV1,JROT1,IOMEG1,EO1,KV2,JROT2,IOMEG2,IRFN,EO2,
1 NBEG,NEND,LXPCT,MORDR,DM,RH,WF1,WF2,RFN)
c** Subroutine to calculate matrix elements of powers of the distance
c coordinate between vib. eigenfunction WF1(i) for v=KV1, J=JROT1 of
c potential-1 & WF2(I), corresponding to KV2 & JROT2 of potentl.-2
INTEGER I,J,IOMEG1,IOMEG2,IOMUP,IOMLW,IRFN,JROT1,JROT2,JUP,JLW,
1 KV1,KV2,KVUP,KVLW,LXPCT,NBEG,NEND,MORDR
REAL*8 ZMAT(0:20),WF1(NEND),WF2(NEND),RFN(NEND),DM(0:MORDR)
REAL*8 AEINST,DEG,DME,DSM,EO1,EO2,ELW,FCF,FREQ,OMUP,RH,RI,SJ,
1 ZJUP
CHARACTER*1 DJ(-3:3)
DATA DJ/'N','O','P','Q','R','S','T'/
ZMAT(0)= 0.D0
IF(MORDR.GE.1) THEN
DO J=1,MORDR
ZMAT(J)=0.D0
ENDDO
ENDIF
IF(IRFN.NE.-4) THEN
c** For regular power series or function matrix elements ...
DO I=NBEG,NEND
DSM=WF2(I)*WF1(I)
ZMAT(0)=ZMAT(0)+DSM
RI= RFN(I)
IF(MORDR.GE.1) THEN
DO J=1,MORDR
DSM=DSM*RI
ZMAT(J)=ZMAT(J)+DSM
ENDDO
ENDIF
ENDDO
ELSE
c** For partial derivative matrix elements ...
DO I=NBEG+1,NEND-1
DSM=WF1(I)*(WF2(I+1)- WF2(I-1))
ZMAT(0)=ZMAT(0)+DSM
RI= RFN(I)
IF(MORDR.GE.1) THEN
DO J=1,MORDR
DSM=DSM*RI
ZMAT(J)=ZMAT(J)+DSM
ENDDO
ENDIF
ENDDO
DO J= 0,MORDR
ZMAT(J)= ZMAT(J)/(2.d0*RH)
ENDDO
ENDIF
DME=0.D0
FCF= (ZMAT(0)*RH)**2
IF(MORDR.GE.0) THEN
DO J=0,MORDR
ZMAT(J)=ZMAT(J)*RH
DME=DME+DM(J)*ZMAT(J)
ENDDO
ENDIF
FREQ= EO2-EO1
ELW= DMIN1(EO1,EO2)
c** Now calculate the Honl-London Factor for the particular transition
c Factors updated as per Hansson & Watson JMS 233, 169 (2005).
SJ= 0.D0
KVUP= KV1
KVLW= KV2
JUP= JROT1
JLW= JROT2
IOMUP= MAX(IOMEG1,0)
IOMLW= MAX(IOMEG2,0)
IF(EO2.GT.EO1) THEN
KVUP= KV2
KVLW= KV1
JUP= JROT2
JLW= JROT1
IOMUP= MAX(IOMEG2,0)
IOMLW= MAX(IOMEG1,0)
ENDIF
ZJUP= JUP
OMUP= IOMUP
DEG= 2*JUP+ 1
IF((JLW.LT.IOMLW).OR.(JUP.LT.IOMUP)) GO TO 50
IF(IOMUP.EQ.IOMLW) THEN
c** Factors for DELTA(LAMBDA) = 0 transitions of spin singlets
IF(JUP.EQ.(JLW+1)) SJ= (ZJUP+ OMUP)*(JUP- IOMUP)/ZJUP
IF((JUP.EQ.JLW).AND.(JUP.GT.0))
1 SJ= DEG*OMUP**2/(ZJUP*(ZJUP+1.D0))
IF(JUP.EQ.(JLW-1)) SJ= (ZJUP+1.D0+OMUP)*(JUP+1-IOMUP)/
1 (ZJUP+1.D0)
ENDIF
IF(IOMUP.EQ.(IOMLW+1)) THEN
c** Factors for DELTA(LAMBDA) = +1 transitions of spin singlets
IF(JUP.EQ.(JLW+1)) SJ= (ZJUP+OMUP)*(JUP-1+IOMUP)/(2.D0*ZJUP)
IF((JUP.EQ.JLW).AND.(JUP.GT.0))
1 SJ= (ZJUP+OMUP)*(JUP+1-IOMUP)*DEG/(2.D0*ZJUP*(ZJUP+1.D0))
IF(JUP.EQ.(JLW-1))
1 SJ= (JUP+1-IOMUP)*(ZJUP+2.D0-OMUP)/(2.D0*ZJUP+2.D0)
ENDIF
IF(IOMUP.LT.IOMLW) THEN
c** Factors for DELTA(LAMBDA) = -1 transitions of spin singlets
IF(JUP.EQ.(JLW+1)) SJ= (JUP-IOMUP)*(JUP-1-IOMUP)/(2.D0*ZJUP)
IF((JUP.EQ.JLW).AND.(JUP.GT.0))
1 SJ= (JUP-IOMUP)*(ZJUP+1.D0+OMUP)*DEG/(2.D0*ZJUP*(ZJUP+1.D0))
IF(JUP.EQ.(JLW-1))
1 SJ= (ZJUP+1.D0+OMUP)*(ZJUP+2.D0+OMUP)/(2.D0*ZJUP+2.D0)
ENDIF
c... finally, include Hansson-Watson w0/w1 term in Honl-London factor
IF((MIN(IOMUP,IOMLW).EQ.0).and.(IOMUP.NE.IOMLW)) SJ= SJ+SJ
c
c** For FREQ in cm-1 and dipole moment in debye , AEINST is the
c absolute Einstein radiative emission rate (s-1) , using the
c rotational intensity factors for sigma-sigma transitions.
50 CONTINUE
AEINST = DABS(3.1361891D-7 *DABS(FREQ)**3*DME**2 * SJ/DEG)
IF(LXPCT.GT.0) THEN
WRITE(6,600) KV1,JROT1,EO1,KV2,JROT2,EO2
IF(IABS(IRFN).LE.9) WRITE(6,602) (J,ZMAT(J),J= 0,MORDR)
WRITE(6,604) FCF,DME,FREQ,AEINST
WRITE(6,606)
ENDIF
IF((IABS(LXPCT).EQ.4).OR.(IABS(LXPCT).EQ.5).AND.(SJ.GT.0.D0)) THEN
IF(IABS(JUP-JLW).LE.3) WRITE(8,801) DJ(JUP-JLW),JLW,KVUP,
1 KVLW,ELW,FREQ,AEINST,FCF,DME
c... Special printout for Iouli of N2 Quadrupole elements
cc elw= elw- 1136.134641d0
cc IF(IABS(JUP-JLW).LE.3) WRITE(8,801) -FREQ,DJ(JUP-JLW),JLW,
cc 1 KVUP,KVLW,ELW,-FREQ,DME
cc801 FORMAT(F15.6,1x,A1,'(',I3,') ',I3,I3,F14.6,F15.6,1PD14.5)
c... Special printout for Hui/LeRoy N2 Quadrupole paper [JCP 1XX (2007)]
cc E00= 1175.7693d0
cc WRITE(11,811) -FREQ,KVUP,JUP,KVLW,JLW,-FREQ,ELW-FREQ-E00,
cc 1 ELW-E00,DME**2
cc811 FORMAT(F14.6,2I4,I6,I4,3f12.4,1PD15.6)
IF(IABS(JUP-JLW).GT.3) WRITE(8,802) JUP-JLW,JLW,KVUP,
1 KVLW,ELW,FREQ,AEINST,FCF,DME
ENDIF
IF(IABS(LXPCT).GE.5)
c 1 WRITE(7,701) KVUP,JUP,KVLW,JLW,(ZMAT(J),J=0,MORDR)
1 WRITE(7,701) KVUP,JUP,KVLW,JLW,FREQ,(ZMAT(J),J=0,MORDR)
RETURN
600 FORMAT(' Coupling E(v=',I3,', J=',I3,')=',F12.4,' to E(v=',
1 I3,', J=',I3,')=',F12.4)
602 FORMAT(5x,'Moment matrix elements:',2(' =',F14.10:),
1 1x/(3x,3(' =',F14.10:),1x))
604 FORMAT(' FCF=',1PD11.4,' =',D12.5,' d(E)=',0PF10.2,
1 ' A(Einst)=',1PD11.4,' s-1')
606 FORMAT(1X,79('+'))
701 FORMAT(4I4,F12.4,4F12.8:/(4X,6F12.8))
801 FORMAT(1x,A1,'(',I3,') ',I3,' -',I3,F10.2,F11.2,3(1PD14.5))
802 FORMAT(i2,'(',I3,') ',I3,' -',I3,F10.2,F11.2,3(1PD14.5))
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE CDJOEL(EO,NBEG,NEND,BvWN,RH,WARN,V,WF0,RM2,RCNST)
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c Subroutine solving the linear inhomogeneous differential equations
c formulated by J.M. Hutson [J.Phys.B14, 851 (1982)] for treating
c centrifugal distortion as a perturbation, to determine centrifugal
c distortion constants of a diatomic molecule. Uses the algorithm of
c J. Tellinghuisen [J.Mol.Spectrosc. 122, 455 (1987)]. The current
c version calculates Bv, Dv, Hv, Lv, Mv, Nv and Ov and writes them out,
c but does not return values to the calling program.
c
c** On entry: EO is the eigenvalue (in units [cm-1])
c NBEG & NEND the mesh point range over which the input
c wavefunction WF0 (in units 1/sqrt(Ang)) has non-negligible values
c BvWn is the numerical factor (hbar^2/2mu) [cm-1 Ang^2]
c RH is the integration stepsize (in units [Ang])
c WARN is an integer flag: > 0 print internal warnings,
c V(i) is the effective potential (including centrifugal
c term if calculation performed at J > 0) in
c 'internal' units, including the factor RH**2/BvWN
c RM2(i) is the array 1/(distance**2) in units [1/Ang**2]
c** On exit: RCNST(i) is the set of 7 rotational constants: Bv, -Dv,
c Hv, Lv, Mv, Nv & Ov
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c COPYRIGHT 1994-2016 by Robert J. Le Roy +
c Dept. of Chemistry, Univ. of 蓝莓视频, 蓝莓视频, Ontario, Canada +
c This software may not be sold or any other commercial use made +
c of it without the express written permission of the author. +
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c Authors: R.J. Le Roy & J. Tellinghuisen Version of 06/04/2016
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Dimension: potential arrays and vib. level arrays.
cc INCLUDE 'arrsizes.h'
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c** This 'Block' Data Utility routine that governs array dimensioning
c in program LEVEL16 must reside with the name 'arrsizes.h' in the
c same directory containing the FORTRAN file(s) for this Program when
c it is being compiled, **OR** be incorporated into the program
c wherever the statement 'INCLUDE arrsizes.h' appears !!
c-----------------------------------------------------------------------
INTEGER NDIMR, NVIBMX, NTPMX, MAXSP, MORDRMX, RORDR, NbetaMX,
1 LMAX, NBOBmx, NCMMAX
c** NDIMR is maximum size of PEC, wavefx, and various radial arrary
PARAMETER (NDIMR= 250001)
c** NVIBMX is the maximum no. vibrational levels, or rotational sublevel
c for a given 'v' whose energies may be generated and stored
PARAMETER (NVIBMX= 400)
c** NTPMX is maximum no. of PEC or TMF points that may be read-in and
c interplated over; MAXSP = no. cubic spline cfts for these NTPMX pts.
PARAMETER (NTPMX= 2000, MAXSP=4*NTPMX)
c** RORDR is maximum order of rot. constants generated for each vib level
PARAMETER (RORDR = 7)
c** MORDRMX is maximum polynomial order for TMF or martix element argument
PARAMETER (MORDRMX = 20)
c** NbetaMX is the largest no. PEC exponent polynomial parameter
PARAMETER (NbetaMX = 50, LMAX= NbetaMX)
c** NBOBmx is the largest no. of BOB expansion parameters
PARAMETER (NBOBmx = 20)
c** NCMMax is max. no. long-range inverse-power PEC coeffts. allowed
PARAMETER (NCMMax= 20)
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c===============================================================
INTEGER I,M,IPASS,M1,M2,NBEG,NEND,WARN
REAL*8 V(NDIMR),WF0(NDIMR),RM2(NDIMR),P(NDIMR),WF1(NDIMR),
1 WF2(NDIMR),RCNST(7)
REAL*8 BvWN,DV,DVV,HVV,HV2,LVV,LV2,MVV,MV2,NVV,OVV,EO,E,RH,RHSQ,
1 ZTW,AR,R2IN,G2,G3,P0,P1,P2,P3,PI,PIF,PRS,PRT,V1,V2,V3,Y1,Y2,Y3,
2 TSTHv,TSTLv,TSTMv,AMB,AMB1,AMB2,
3 OV,OV01,OV02,OV03,OV11,OV12,OV13,OV22,OV23,OV33,
4 PER01,PER02,PER03,PER11,PER12,PER13,PER22,PER23,PER33
c
IF(NEND.GT.NDIMR) THEN
WRITE(6,602) NEND,NDIMR
RETURN
ENDIF
ZTW= 1.D0/12.d0
RHSQ = RH*RH
DV = RHSQ/12.D0
E= EO*RHSQ/BvWN
IPASS = 1
OV01 = 0.D0
OV02 = 0.D0
OV03 = 0.D0
OV11 = 0.D0
OV22 = 0.D0
OV12 = 0.D0
OV33 = 0.D0
OV23 = 0.D0
OV13 = 0.D0
PER01 = 0.D0
PER02 = 0.D0
PER03 = 0.D0
PER11 = 0.D0
PER12 = 0.D0
PER13 = 0.D0
PER22 = 0.D0
PER23 = 0.D0
PER33 = 0.D0
c** First, calculate the expectation value of 1/r**2 and hence Bv
R2IN= 0.5D0*(RM2(NBEG)*WF0(NBEG)**2 + RM2(NEND)*WF0(NEND)**2)
DO I= NBEG+1, NEND-1
R2IN= R2IN+ RM2(I)*WF0(I)**2
ENDDO
R2IN = R2IN*RH
RCNST(1)= R2IN*BvWN
c
c** On First pass IPASS=1 and calculate first-order wavefx., Dv & Hv
c On second pass IPASS=2 and calculate second-order wavefx., Lv & Mv
c On third pass IPASS=3 and calculate third-order wavefx., Nv & Ov
c
10 P1= 0.D0
P2= 0.D0
c
c P1= WF0(NEND)
c P2= WF0(NEND-1)
c
P(NEND) = P1
P(NEND-1) = P2
V1 = V(NEND) - E
V2 = V(NEND-1) - E
IF(IPASS.EQ.1) THEN
Y1 = P1*(1.D0 - ZTW*V1) - DV*(RM2(NEND) - R2IN)*WF0(NEND)
G2 = (RM2(NEND-1) - R2IN)*WF0(NEND-1)
ELSEIF(IPASS.EQ.2) THEN
Y1 = P1*(1.D0 - ZTW*V1) - DV*((RM2(NEND) - R2IN)*WF1(NEND)
1 - DVV*WF0(NEND))
G2 = (RM2(NEND-1) - R2IN)*WF1(NEND-1) - DVV*WF0(NEND-1)
ELSEIF(IPASS.EQ.3) THEN
Y1 = P1*(1.D0 - ZTW*V1) - DV*((RM2(NEND) - R2IN)*WF2(NEND)
1 - DVV*WF1(NEND) - HVV*WF0(NEND))
G2 = (RM2(NEND-1) - R2IN)*WF2(NEND-1) - DVV*WF1(NEND-1)
1 - HVV*WF0(NEND-1)
ENDIF
Y2 = P2*(1.D0 - ZTW*V2) - DV*G2
M= NEND-1
c** Now - integrate inward from outer end of range
DO I = NBEG+2,NEND
M = M-1
Y3 = Y2 + Y2 - Y1 + RHSQ*G2 + V2*P2
IF(IPASS.EQ.1) G3 = (RM2(M) - R2IN)*WF0(M)
IF(IPASS.EQ.2) G3 = (RM2(M) - R2IN)*WF1(M) - DVV*WF0(M)
IF(IPASS.EQ.3) G3 = (RM2(M) - R2IN)*WF2(M) - DVV*WF1(M)
1 - HVV*WF0(M)
V3 = V(M) - E
P3 = (Y3 + DV*G3)/(1.D0 - ZTW*V3)
IF(V3.LT.0.D0) GO TO 32
P(M) = P3
Y1 = Y2
Y2 = Y3
V2 = V3
P2 = P3
G2 = G3
ENDDO
GO TO 90
c** Escaped loop at outer turning point: initialize outward integration
32 PRS = P3
PRT = P(M+1)
P1 = 0.D0
P2 = 0.D0
c
c P1 = WF0(NBEG)
c P2 = WF0(NBEG+1)
c
P(NBEG) = P1
P(NBEG+1) = P2
V1 = V(NBEG) - E
V2 = V(NBEG+1) - E
IF(IPASS.EQ.1) THEN
Y1 = P1*(1.D0 - ZTW*V1) - DV*(RM2(NBEG) - R2IN)*WF0(NBEG)
G2 = (RM2(NBEG+1) - R2IN)*WF0(NBEG+1)
ELSEIF(IPASS.EQ.2) THEN
Y1 = P1*(1.D0 - ZTW*V1) - DV*((RM2(NBEG) - R2IN)*WF1(NBEG)
1 - DVV*WF0(NEND))
G2 = (RM2(NBEG+1) - R2IN)*WF1(NBEG+1) - DVV*WF0(NBEG+1)
ELSEIF(IPASS.EQ.3) THEN
Y1 = P1*(1.D0 - ZTW*V1) - DV*((RM2(NBEG) - R2IN)*WF2(NBEG)
1 - DVV*WF1(NEND) - HVV*WF0(NEND))
G2 = (RM2(NBEG+1) - R2IN)*WF2(NBEG+1) - DVV*WF1(NBEG+1)
2 - HVV*WF0(NBEG+1)
ENDIF
Y2 = P2*(1.D0 - ZTW*V2) - DV*G2
AR = 0.D0
M1 = M+1
c** Now ... integrate outward from inner end of range
DO I = NBEG+2,M1
Y3 = Y2 + Y2 - Y1 + RHSQ*G2 + V2*P2
P0 = WF0(I)
IF(IPASS.EQ.1) G3 = (RM2(I) - R2IN)*P0
IF(IPASS.EQ.2) G3 = (RM2(I)-R2IN)*WF1(I) - DVV*P0
IF(IPASS.EQ.3) G3 = (RM2(I)-R2IN)*WF2(I) - DVV*WF1(I) - HVV*P0
V3 = V(I) - E
P3 = (Y3 + DV*G3)/(1.D0 - ZTW*V3)
P(I) = P3
Y1 = Y2
Y2 = Y3
V2 = V3
P2 = P3
G2 = G3
AR = AR + P0*P3
ENDDO
c** Average for 2 adjacent mesh points to get Joel's "(a-b)"
AMB2 = (P3-PRT)/P0
AMB1 = (P(M)-PRS)/WF0(M)
AMB = (AMB1+AMB2)*0.5D0
M2 = M+2
c** Find the rest of the overlap with zero-th order solution ...
DO I = M2,NEND
P0 = WF0(I)
PI = P(I) + AMB*P0
P(I) = PI
AR = AR + PI*P0
ENDDO
OV = AR*RH
DO I = NBEG,NEND
P0 = WF0(I)
c ... and project out contribution of zero'th-order part of solution
PI = P(I) - OV*P0
PIF = PI*RM2(I)
IF(IPASS.EQ.1) THEN
c** Now - on first pass accumulate integrals for Dv and Hv
WF1(I) = PI
OV01 = OV01 + PI*P0
OV11 = OV11 + PI*PI
PER01 = PER01 + PIF*P0
PER11 = PER11 + PI*PIF
ELSEIF(IPASS.EQ.2) THEN
c ... and on next pass, accumulate integrals for Lv and Mv
WF2(I) = PI
P1 = WF1(I)
OV02 = OV02 + PI*P0
OV12 = OV12 + PI*P1
OV22 = OV22 + PI*PI
PER02 = PER02 + PIF*P0
PER12 = PER12 + PIF*P1
PER22 = PER22 + PI*PIF
ELSEIF(IPASS.EQ.3) THEN
c ... and on next pass, accumulate integrals for Nv and Ov
P1 = WF1(I)
P2 = WF2(I)
OV03 = OV03 + PI*P0
OV13 = OV13 + PI*P1
OV23 = OV23 + PI*P2
OV33 = OV33 + PI*PI
PER03 = PER03 + PIF*P0
PER13 = PER13 + PIF*P1
PER23 = PER23 + PIF*P2
PER33 = PER33 + PIF*PI
ENDIF
ENDDO
IF(IPASS.EQ.1) THEN
DVV = RH*PER01
HVV = RH*(PER11 - R2IN*OV11)
IPASS = 2
RCNST(2) = DVV*BvWN
RCNST(3) = HVV*BvWn
GO TO 10
ELSEIF(IPASS.EQ.2) THEN
HV2 = RH*PER02*BvWN
LVV = RH*(PER12 - R2IN*OV12 - DVV*OV11)
MVV = RH*(PER22 - R2IN*OV22 - 2.D0*DVV*OV12 - HVV*OV11)
IPASS = 3
RCNST(4) = LVV*BvWN
RCNST(5) = MVV*BvWN
GO TO 10
ELSEIF(IPASS.EQ.3) THEN
LV2 = RH*PER03*BvWN
MV2 = RH*(PER13 - R2IN*OV13 - DVV*OV12 - HVV*OV11)*BvWN
NVV = RH*(PER23 - R2IN*OV23 - DVV*(OV13 + OV22)
1 - 2.D0*HVV*OV12 - LVV*OV11)
OVV = RH*(PER33 - R2IN*OV33 - 2.D0*DVV*OV23
1 - HVV*(2.D0*OV13+ OV22) - 2.D0*LVV*OV12 - MVV*OV11)
RCNST(6) = NVV*BvWN
RCNST(7) = OVV*BvWN
ENDIF
IF(WARN.GT.0) THEN
IF(DMAX1(DABS(OV01),DABS(OV02),DABS(OV01)).GT.1.D-9)
1 WRITE(6,604) OV01,OV02,OV03
TSTHV= dabs(RCNST(3)/HV2-1.D0)
TSTLV= dabs(RCNST(4)/LV2-1.D0)
TSTMV= dabs(RCNST(5)/MV2-1.D0)
IF(DMAX1(TSTHV,TSTLV,TSTMV).GT.1.d-5)
1 WRITE(6,603) TSTHV,TSTLV,TSTMV
ENDIF
DO M= 2, 7
c** Kill nonsensical high-order CDCs (which can occur in double-well cases)
IF(DABS(RCNST(M)).GT.DABS(RCNST(M-1))) THEN
DO I= M, 7
RCNST(I)= 0.d0
ENDDO
EXIT
ENDIF
ENDDO
RETURN
90 WRITE(6,601) EO
RETURN
601 FORMAT(' *** ERROR in CDJOEL *** for input energy E =',f12.4,
1 ' never reach outer turning point')
602 FORMAT(/' *** Dimensioning PROBLEM in CDJOEL *** NEND=',i6,
1 ' > NDIMR=',i6)
603 FORMAT(' ** CAUTION ** Comparison tests for Hv, Lv & Mv give:',
1 3(1Pd9.1))
604 FORMAT(' ** CAUTION ** CDJOEL orthogonality tests OV01,OV02 & OV03
1:',3(1Pd9.1))
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE MASSES(IAN,IMN,NAME,GELGS,DGNS,MASS,ABUND)
c*
c** For isotope with (input) atomic number IAN and mass number IMN,
c return (output): (i) as the right-adjusted 2-character variable NAME
c the alphabetic symbol for that element, (ii) the ground state
c electronic degeneracy GELGS, (iii) the nuclear spin degeneracy DGNS,
c (iv) the atomic mass MASS [amu], and (v) the natural isotopic
c abundance ABUND [in percent]. GELGS values based on atomic states
c in Moore's "Atomic Energy Level" tables, the isotope masses are taken
c from the 2012 mass table [Wang, Audi, Wapstra, Kondev, MacCormick, Xu
c & Pfeiffer, Chin.Phys.C 36, 1603-2014 (2012)] ,the proton, deuteron,
c and triton masses are taken from the 2010 fundamental constants table
c [Mohr, Taylor, & Newell, Rev. Mod. Phys. 84, 1587-1591 (2012)] and other
c quantities from Tables 6.2 and 6.3 of "Quantities, Units and Symbols in
c Physical Chemistry", by Mills et al.(Blackwell,2'nd Edition, Oxford,1993).
c** If the input value of IMN does not equal one of the tabulated values
c for atomic species IAN, return the abundance-averaged standard atomic
c weight of that atom and set DGNS=-1 and ABUND=-1.
c** For Atomic number IAN=0 and isotope mass numbers IMN=1-3, return the
c masses of the proton, deuteron, and triton, p,d & t, respectively
c Masses and properties of selected Halo nuclei an unstable nuclei included
c COPYRIGHT 2005-2015 : last updated 10 January 2016
c** By R.J. Le Roy, with assistance from
c G.T. Kraemer, J.Y. Seto and K.V. Slaughter.
c*
REAL*8 zm(0:123,0:15),mass,ab(0:123,15),abund
INTEGER i,ian,imn,gel(0:123),nmn(0:123),mn(0:123,15),
1 gns(0:123,15),DGNS,gelgs
CHARACTER*2 NAME,AT(0:123)
cc
DATA at(0),gel(0),nmn(0),(mn(0,i),i=1,3)/' p',1,3,1,2,3/
DATA (zm(0,i),i=0,3)/1.008d0,1.007276466812d0,2.013553212712d0,
2 3.0155007134d0/
DATA (gns(0,i),i=1,3)/2,3,2/
DATA (ab(0,i),i=1,3)/0.d0, 0.d0, 0.d0/
c
DATA at(1),gel(1),nmn(1),(mn(1,i),i=1,3)/' H',2,3,1,2,3/
DATA (zm(1,i),i=0,3)/1.00794d0, 1.00782503223d0, 2.01410177812d0,
1 3.0160492779d0/
DATA (gns(1,i),i=1,3)/2,3,2/
DATA (ab(1,i),i=1,3)/99.985d0,0.015d0,0.d0/
c
DATA at(2),gel(2),nmn(2),(mn(2,i),i=1,4)/'He',1,4,3,4,6,8/
DATA (zm(2,i),i=0,4)/4.002602d0, 3.0160293201d0, 4.00260325413d0,
1 6.0188891d0, 8.033922d0/
DATA (gns(2,i),i=1,4)/2,1,1,1/
DATA (ab(2,i),i=1,4)/0.000137d0,99.999863d0, 2*0.d0/
c
DATA at(3),gel(3),nmn(3),(mn(3,i),i=1,6)/'Li',2,6,6,7,8,9,11,12/
DATA (zm(3,i),i=0,6)/6.941d0, 6.0151228874d0, 7.016003437d0,
1 8.02248736d0,9.0267895d0,11.043798d0,12.05378d0/
DATA (gns(3,i),i=1,6)/3,4,5,4,4,1/
DATA (ab(3,i),i=1,6)/7.5d0, 92.5d0, 4*0.d0/
c
DATA at(4),gel(4),nmn(4),(mn(4,i),i=1,8)/'Be',1,8,7,9,10,11,12,
1 14,15,16/
DATA (zm(4,i),i=0,8)/9.012182d0, 7.01692983d0, 9.01218307d0,
1 10.0135338d0, 11.021658d0, 12.026921d0, 14.04289d0, 15.05346d0,
2 16.06192d0/
DATA (gns(4,i),i=1,8)/4,4,3,2,1,1,2,1/
DATA (ab(4,i),i=1,8)/0.d0, 100.d0, 6*0.d0/
c
DATA at(5),gel(5),nmn(5),(mn(5,i),i=1,10)/' B',2,10,8,10,11,12,
1 13,14,15,17,18,19/
DATA (zm(5,i),i=0,10)/10.811d0, 8.0246072d0, 10.0129369d0,
1 11.0093054d0, 12.0143521d0, 13.0177802d0, 14.025404d0,
2 15.031103d0, 17.04699d0, 18.05617d0,19.06373d0/
DATA (gns(5,i),i=1,10)/5,7,4,3,4,5,4,4,1,4/
DATA (ab(5,i),i=1,10)/0.d0, 19.9d0,80.1d0, 7*0.d0/
c
DATA at(6),gel(6),nmn(6),(mn(6,i),i=1,14)/' C',1,14,9,10,11,12,13,
1 14,15,16,17,18,19,20,21,22/
DATA (zm(6,i),i=0,14)/12.011d0, 9.0310367d0, 10.0168532d0,
1 11.0114336d0, 12.d0, 13.00335483507d0, 14.003241989d0,
1 15.0105993d0, 16.014701d0, 17.022586d0, 18.02676d0, 19.03481d0,
2 20.04032d0, 21.04934d0, 22.05720d0/
DATA (gns(6,i),i=1,14)/4,1,4,1,2,1,2,1,4,1,2,1,2,1/
DATA (ab(6,i),i=1,14)/3*0.d0, 98.90d0,1.10d0, 9*0.d0/
c
DATA at(7),gel(7),nmn(7),(mn(7,i),i=1,2)/' N',4,2,14,15/
DATA (zm(7,i),i=0,2)/14.00674d0, 14.00307400443d0,15.0001088989d0/
DATA (gns(7,i),i=1,2)/3,2/
DATA (ab(7,i),i=1,2)/99.634d0,0.366d0/
c
DATA at(8),gel(8),nmn(8),(mn(8,i),i=1,3)/' O',5,3,16,17,18/
DATA (zm(8,i),i=0,3)/15.9994d0, 15.99491461957d0, 16.9991317565d0,
1 17.9991596129d0/
DATA (gns(8,i),i=1,3)/1,6,1/
DATA (ab(8,i),i=1,3)/99.762d0, 0.038d0, 0.200d0/
c
DATA at(9),gel(9),nmn(9),(mn(9,i),i=1,1)/' F',4,1,19/
DATA (zm(9,i),i=0,1)/18.9984032d0, 18.9984031627d0/
DATA (gns(9,i),i=1,1)/2/
DATA (ab(9,i),i=1,1)/100.d0/
c
DATA at(10),gel(10),nmn(10),(mn(10,i),i=1,4)/'Ne',1,4,17,20,21,22/
DATA (zm(10,i),i=0,4)/20.1797d0, 17.017672d0, 19.9924401762d0,
1 20.99384669d0,21.991385115d0/
DATA (gns(10,i),i=1,4)/2,1,4,1/
DATA (ab(10,i),i=1,4)/0.d0, 90.48d0, 0.27d0, 9.25d0/
c
DATA at(11),gel(11),nmn(11),(mn(11,i),i=1,1)/'Na',2,1,23/
DATA (zm(11,i),i=0,1)/22.989768d0, 22.9897692820d0/
DATA (gns(11,i),i=1,1)/4/
DATA (ab(11,i),i=1,1)/100.d0/
c
DATA at(12),gel(12),nmn(12),(mn(12,i),i=1,3)/'Mg',1,3,24,25,26/
DATA (zm(12,i),i=0,3)/24.3050d0, 23.985041698d0, 24.98583698d0,
1 25.98259297d0/
DATA (gns(12,i),i=1,3)/1,6,1/
DATA (ab(12,i),i=1,3)/78.99d0, 10.00d0, 11.01d0/
c
DATA at(13),gel(13),nmn(13),(mn(13,i),i=1,1)/'Al',2,1,27/
DATA (zm(13,i),i=0,1)/26.981539d0, 26.98153853d0/
DATA (gns(13,i),i=1,1)/6/
DATA (ab(13,i),i=1,1)/100.d0/
c
DATA at(14),gel(14),nmn(14),(mn(14,i),i=1,3)/'Si',1,3,28,29,30/
DATA (zm(14,i),i=0,3)/28.0855d0, 27.9769265346d0, 28.9764946649d0,
1 29.973770136d0/
DATA (gns(14,i),i=1,3)/1,2,1/
DATA (ab(14,i),i=1,3)/92.23d0, 4.67d0, 3.10d0/
DATA at(15),gel(15),nmn(15),(mn(15,i),i=1,2)/' P',4,2,26,31/
DATA (zm(15,i),i=0,2)/30.973762d0, 26.01178d0, 30.9737619984d0/
DATA (gns(15,i),i=1,2)/15,2/
DATA (ab(15,i),i=1,2)/0.d0, 100.d0/
c
DATA at(16),gel(16),nmn(16),(mn(16,i),i=1,5)/' S',5,5,27,32,33,
1 34,36/
DATA (zm(16,i),i=0,5)/32.066d0, 27.01883d0, 31.9720711744d0,
1 32.9714589098d0,33.96786700d0, 35.96708071d0/
DATA (gns(16,i),i=1,5)/6,1,4,1,1/
DATA (ab(16,i),i=1,5)/0.d0, 95.02d0, 0.75d0, 4.21d0, 0.02d0/
c
DATA at(17),gel(17),nmn(17),(mn(17,i),i=1,2)/'Cl',4,2,35,37/
DATA (zm(17,i),i=0,2)/35.4527d0, 34.96885268d0, 36.96590260d0/
DATA (gns(17,i),i=1,2)/4,4/
DATA (ab(17,i),i=1,2)/75.77d0, 24.23d0/
c
DATA at(18),gel(18),nmn(18),(mn(18,i),i=1,3)/'Ar',1,3,36,38,40/
DATA (zm(18,i),i=0,3)/39.948d0, 35.967545105d0, 37.96273211d0,
1 39.9623831237d0/
DATA (gns(18,i),i=1,3)/1,1,1/
DATA (ab(18,i),i=1,3)/0.337d0, 0.063d0, 99.600d0/
c
DATA at(19),gel(19),nmn(19),(mn(19,i),i=1,3)/' K',2,3,39,40,41/
DATA (zm(19,i),i=0,3)/39.0983d0, 38.963706486d0, 39.96399817d0,
1 40.961825258d0/
DATA (gns(19,i),i=1,3)/4,9,4/
DATA (ab(19,i),i=1,3)/93.2581d0, 0.0117d0, 6.7302d0/
DATA at(20),gel(20),nmn(20),(mn(20,i),i=1,6)/'Ca',1,6,40,42,43,44,
1 46,48/
DATA (zm(20,i),i=0,6)/40.078d0, 39.962590864d0, 41.95861783d0,
1 42.95876644d0, 43.9554816d0, 45.9536890d0, 47.95252277d0/
DATA (gns(20,i),i=1,6)/1,1,8,1,1,1/
DATA (ab(20,i),i=1,6)/96.941d0, 0.647d0, 0.135d0, 2.086d0,
1 0.004d0, 0.187d0/
c
DATA at(21),gel(21),nmn(21),(mn(21,i),i=1,1)/'Sc',4,1,45/
DATA (zm(21,i),i=0,1)/44.955910d0, 44.9559083d0/
DATA (gns(21,i),i=1,1)/8/
DATA (ab(21,i),i=1,1)/100.d0/
c
DATA at(22),gel(22),nmn(22),(mn(22,i),i=1,5)/'Ti',5,5,46,47,48,49,
1 50/
DATA (zm(22,i),i=0,5)/47.88d0, 45.9526277d0, 46.9517588d0,
1 47.9479420d0, 48.9478657d0, 49.9447869d0/
DATA (gns(22,i),i=1,5)/1,6,1,8,1/
DATA (ab(22,i),i=1,5)/8.0d0, 7.3d0, 73.8d0, 5.5d0, 5.4d0/
c
DATA at(23),gel(23),nmn(23),(mn(23,i),i=1,2)/' V',4,2,50,51/
DATA (zm(23,i),i=0,2)/50.9415d0, 49.9471560d0, 50.9439570d0/
DATA (gns(23,i),i=1,2)/13,8/
DATA (ab(23,i),i=1,2)/0.250d0, 99.750d0/
c
DATA at(24),gel(24),nmn(24),(mn(24,i),i=1,4)/'Cr',7,4,50,52,53,54/
DATA (zm(24,i),i=0,4)/51.9961d0, 49.9460418d0, 51.9405062d0,
1 52.9406481d0, 53.9388792d0/
DATA (gns(24,i),i=1,4)/1,1,4,1/
DATA (ab(24,i),i=1,4)/4.345d0, 83.789d0, 9.501d0, 2.365d0/
c
DATA at(25),gel(25),nmn(25),(mn(25,i),i=1,1)/'Mn',6,1,55/
DATA (zm(25,i),i=0,1)/54.93805d0, 54.938049d0/
DATA (gns(25,i),i=1,1)/6/
DATA (ab(25,i),i=1,1)/100.d0/
c
DATA at(26),gel(26),nmn(26),(mn(26,i),i=1,4)/'Fe',9,4,54,56,57,58/
DATA (zm(26,i),i=0,4)/55.847d0, 53.9396090d0, 55.9349363d0,
1 56.9353928d0, 57.9332744d0/
DATA (gns(26,i),i=1,4)/1,1,2,1/
DATA (ab(26,i),i=1,4)/5.8d0, 91.72d0, 2.2d0, 0.28d0/
c
DATA at(27),gel(27),nmn(27),(mn(27,i),i=1,1)/'Co',10,1,59/
DATA (zm(27,i),i=0,1)/58.93320d0, 58.9331943d0/
DATA (gns(27,i),i=1,1)/8/
DATA (ab(27,i),i=1,1)/100.d0/
c
DATA at(28),gel(28),nmn(28),(mn(28,i),i=1,5)/'Ni',9,5,58,60,61,62,
1 64/
DATA (zm(28,i),i=0,5)/58.69d0, 57.9353424d0, 59.9307859d0,
1 60.9310556d0, 61.9283454d0, 63.9279668d0/
DATA (gns(28,i),i=1,5)/1,1,4,1,1/
DATA (ab(28,i),i=1,5)/68.077d0,26.223d0,1.140d0,3.634d0,0.926d0/
c
DATA at(29),gel(29),nmn(29),(mn(29,i),i=1,2)/'Cu',2,2,63,65/
DATA (zm(29,i),i=0,2)/63.546d0, 62.9295977d0,64.9277897d0/
DATA (gns(29,i),i=1,2)/4,4/
DATA (ab(29,i),i=1,2)/69.17d0, 30.83d0/
c
DATA at(30),gel(30),nmn(30),(mn(30,i),i=1,5)/'Zn',1,5,64,66,67,68,
1 70/
DATA (zm(30,i),i=0,5)/65.40d0, 63.9291420d0, 65.9260338d0,
1 66.9271277d0, 67.9248446d0, 69.9253192d0/
DATA (gns(30,i),i=1,5)/1,1,6,1,1/
DATA (ab(30,i),i=1,5)/48.6d0, 27.9d0, 4.1d0, 18.8d0, 0.6d0/
c
DATA at(31),gel(31),nmn(31),(mn(31,i),i=1,2)/'Ga',2,2,69,71/
DATA (zm(31,i),i=0,2)/69.723d0, 68.9255735d0, 70.9247026d0/
DATA (gns(31,i),i=1,2)/4,4/
DATA (ab(31,i),i=1,2)/60.108d0, 39.892d0/
c
DATA at(32),gel(32),nmn(32),(mn(32,i),i=1,5)/'Ge',1,5,70,72,73,74,
1 76/
DATA (zm(32,i),i=0,5)/72.61d0, 69.9242488d0, 71.92207583d0,
1 72.92345896d0, 73.921177762d0, 75.921402726d0/
DATA (gns(32,i),i=1,5)/1,1,10,1,1/
DATA (ab(32,i),i=1,5)/21.23d0, 27.66d0, 7.73d0, 35.94d0, 7.44d0/
c
DATA at(33),gel(33),nmn(33),(mn(33,i),i=1,1)/'As',4,1,75/
DATA (zm(33,i),i=0,1)/74.92159d0, 74.9215946d0/
DATA (gns(33,i),i=1,1)/4/
DATA (ab(33,i),i=1,1)/100.d0/
c
DATA at(34),gel(34),nmn(34),(mn(34,i),i=1,6)/'Se',5,6,74,76,77,78,
1 80,82/
DATA (zm(34,i),i=0,6)/78.96d0, 73.922475935d0, 75.919213704d0,
1 76.91991415d0, 77.91730928d0, 79.9165218d0, 81.9166995d0/
DATA (gns(34,i),i=1,6)/1,1,2,1,1,1/
DATA (ab(34,i),i=1,6)/0.89d0, 9.36d0, 7.63d0, 23.78d0, 49.61d0,
1 8.73d0/
c
DATA at(35),gel(35),nmn(35),(mn(35,i),i=1,2)/'Br',4,2,79,81/
DATA (zm(35,i),i=0,2)/79.904d0, 78.9183376d0, 80.9162897d0/
DATA (gns(35,i),i=1,2)/4,4/
DATA (ab(35,i),i=1,2)/50.69d0, 49.31d0/
c
DATA at(36),gel(36),nmn(36),(mn(36,i),i=1,6)/'Kr',1,6,78,80,82,83,
1 84,86/
DATA (zm(36,i),i=0,6)/83.80d0, 77.9203649d0, 79.9163781d0,
1 81.9134827d0, 82.9141272d0, 83.911497728d0, 85.910610627d0/
DATA (gns(36,i),i=1,6)/1,1,1,10,1,1/
DATA (ab(36,i),i=1,6)/0.35d0, 2.25d0, 11.6d0, 11.5d0, 57.0d0,
1 17.3d0/
c
DATA at(37),gel(37),nmn(37),(mn(37,i),i=1,2)/'Rb',2,2,85,87/
DATA (zm(37,i),i=0,2)/85.4678d0, 84.911789738d0, 86.909180532d0/
DATA (gns(37,i),i=1,2)/6,4/
DATA (ab(37,i),i=1,2)/72.165d0, 27.835d0/
c
DATA at(38),gel(38),nmn(38),(mn(38,i),i=1,4)/'Sr',1,4,84,86,87,88/
DATA (zm(38,i),i=0,4)/87.62d0, 83.9134191d0, 85.9092606d0,
1 86.9088775d0, 87.9056125d0/
DATA (gns(38,i),i=1,4)/1,1,10,1/
DATA (ab(38,i),i=1,4)/0.56d0, 9.86d0, 7.00d0, 82.58d0/
c
DATA at(39),gel(39),nmn(39),(mn(39,i),i=1,1)/' Y',4,1,89/
DATA (zm(39,i),i=0,1)/88.90585d0, 88.9058403d0/
DATA (gns(39,i),i=1,1)/2/
DATA (ab(39,i),i=1,1)/100.d0/
c
DATA at(40),gel(40),nmn(40),(mn(40,i),i=1,5)/'Zr',5,5,90,91,92,94,
1 96/
DATA (zm(40,i),i=0,5)/91.224d0, 89.9046977d0, 90.9056396d0,
1 91.9050347d0, 93.9063108d0, 95.9082714d0/
DATA (gns(40,i),i=1,5)/1,6,1,1,1/
DATA (ab(40,i),i=1,5)/51.45d0, 11.22d0, 17.15d0, 17.38d0, 2.80d0/
c
DATA at(41),gel(41),nmn(41),(mn(41,i),i=1,1)/'Nb',2,1,93/
DATA (zm(41,i),i=0,1)/92.90638d0, 92.9063730d0/
DATA (gns(41,i),i=1,1)/10/
DATA (ab(41,i),i=1,1)/100.d0/
c
DATA at(42),gel(42),nmn(42),(mn(42,i),i=1,7)/'Mo',7,7,92,94,95,96,
1 97,98,100/
DATA (zm(42,i),i=0,7)/95.94d0, 91.9068080d0, 93.9050849d0,
1 94.9058388d0, 95.9046761d0, 96.9060181d0, 97.9054048d0,
2 99.9074718d0/
DATA (gns(42,i),i=1,7)/1,1,6,1,6,1,1/
DATA (ab(42,i),i=1,7)/14.84d0, 9.25d0, 15.92d0, 16.68d0, 9.55d0,
1 24.13d0, 9.63d0/
c
DATA at(43),gel(43),nmn(43),(mn(43,i),i=1,1)/'Tc',6,1,98/
DATA (zm(43,i),i=0,1)/97.907215d0, 97.907212d0/
DATA (gns(43,i),i=1,1)/13/
DATA (ab(43,i),i=1,1)/100.d0/
c
DATA at(44),gel(44),nmn(44),(mn(44,i),i=1,7)/'Ru',11,7,96,98,99,
1 100,101,102,104/
DATA (zm(44,i),i=0,7)/101.07d0, 95.9075903d0, 97.905287d0,
1 98.9059341d0, 99.9042143d0, 100.9055769d0, 101.9043441d0,
2 103.9054275d0/
DATA (gns(44,i),i=1,7)/1,1,6,1,6,1,1/
DATA (ab(44,i),i=1,7)/5.52d0, 1.88d0, 12.7d0, 12.6d0, 17.0d0,
1 31.6d0, 18.7d0/
c
DATA at(45),gel(45),nmn(45),(mn(45,i),i=1,1)/'Rh',10,1,103/
DATA (zm(45,i),i=0,1)/102.90550d0, 102.9054980d0/
DATA (gns(45,i),i=1,1)/2/
DATA (ab(45,i),i=1,1)/100.d0/
c
DATA at(46),gel(46),nmn(46),(mn(46,i),i=1,6)/'Pd',1,6,102,104,105,
1 106,108,110/
DATA (zm(46,i),i=0,6)/106.42d0, 101.9056022d0, 103.9040305d0,
1 104.9050796d0, 105.9034804d0, 107.9038916d0, 109.9051722d0/
DATA (gns(46,i),i=1,6)/1,1,6,1,1,1/
DATA (ab(46,i),i=1,6)/1.02d0, 11.14d0, 22.33d0, 27.33d0, 26.46d0,
1 11.72d0/
c
DATA at(47),gel(47),nmn(47),(mn(47,i),i=1,2)/'Ag',2,2,107,109/
DATA (zm(47,i),i=0,2)/107.8682d0, 106.9050916d0, 108.9047553d0/
DATA (gns(47,i),i=1,2)/2,2/
DATA (ab(47,i),i=1,2)/51.839d0, 48.161d0/
c
DATA at(48),gel(48),nmn(48),(mn(48,i),i=1,8)/'Cd',1,8,106,108,110,
1 111,112,113,114,116/
DATA (zm(48,i),i=0,8)/112.411d0, 105.9064599d0, 107.9041834d0,
1 109.9030066d0, 110.9041829d0, 111.9027629d0, 112.9044081d0,
2 113.9033651d0, 115.90476315d0/
DATA (gns(48,i),i=1,8)/1,1,1,2,1,2,1,1/
DATA (ab(48,i),i=1,8)/1.25d0, 0.89d0, 12.49d0, 12.80d0, 24.13d0,
1 12.22d0, 28.73d0, 7.49d0/
c
DATA at(49),gel(49),nmn(49),(mn(49,i),i=1,2)/'In',2,2,113,115/
DATA (zm(49,i),i=0,2)/114.818d0, 112.9040618d0, 114.903878776d0/
DATA (gns(49,i),i=1,2)/10,10/
DATA (ab(49,i),i=1,2)/4.3d0, 95.7d0/
c
DATA at(50),gel(50),nmn(50),(mn(50,i),i=1,10)/'Sn',1,10,112,114,
1 115,116,117,118,119,120,122,124/
DATA (zm(50,i),i=0,10)/118.710d0, 111.9048239d0, 113.9027827d0,
1 114.903344699d0, 115.90174280d0, 116.9029540d0, 117.9016066d0,
2 118.9033112d0, 119.9022016d0, 121.9034438d0, 123.9052766d0/
DATA (gns(50,i),i=1,10)/1,1,2,1,2,1,2,1,1,1/
DATA (ab(50,i),i=1,10)/0.97d0, 0.65d0, 0.34d0, 14.53d0, 7.68d0,
1 24.23d0, 8.59d0, 32.59d0, 4.63d0, 5.79d0/
c
DATA at(51),gel(51),nmn(51),(mn(51,i),i=1,2)/'Sb',4,2,121,123/
DATA (zm(51,i),i=0,2)/121.757d0, 120.903812d0, 122.9042132d0/
DATA (gns(51,i),i=1,2)/6,8/
DATA (ab(51,i),i=1,2)/57.36d0, 42.64d0/
c
DATA at(52),gel(52),nmn(52),(mn(52,i),i=1,8)/'Te',5,8,120,122,123,
1 124,125,126,128,130/
DATA (zm(52,i),i=0,8)/127.60d0, 119.904059d0, 121.9030435d0,
1 122.9042698d0, 123.9028171d0, 124.9044299d0, 125.9033109d0,
2 127.9044613d0, 129.906222749d0/
DATA (gns(52,i),i=1,8)/1,1,2,1,2,1,1,1/
DATA (ab(52,i),i=1,8)/0.096d0, 2.603d0, 0.908d0, 4.816d0,
1 7.139d0, 18.95d0, 31.69d0, 33.80d0/
c
DATA at(53),gel(53),nmn(53),(mn(53,i),i=1,2)/' I',4,2,127,129/
DATA (zm(53,i),i=0,2)/126.90447d0, 126.904472d0, 128.904984d0/
DATA (gns(53,i),i=1,2)/6,8/
DATA (ab(53,i),i=1,2)/100.d0,0.d0/
c
DATA at(54),gel(54),nmn(54),(mn(54,i),i=1,9)/'Xe',1,9,124,126,128,
1 129,130,131,132,134,136/
DATA (zm(54,i),i=0,9)/131.29d0, 123.9058920d0, 125.904298d0,
1 127.9035310d0, 128.904780861d0,129.903509350d0,130.90508406d0,
2 131.904155086d0, 133.9053947d0, 135.907214484d0/
DATA (gns(54,i),i=1,9)/1,1,1,2,1,4,1,1,1/
DATA (ab(54,i),i=1,9)/0.10d0, 0.09d0, 1.91d0, 26.4d0, 4.1d0,
1 21.2d0, 26.9d0, 10.4d0, 8.9d0/
c
DATA at(55),gel(55),nmn(55),(mn(55,i),i=1,1)/'Cs',2,1,133/
DATA (zm(55,i),i=0,1)/132.90543d0, 132.905451961d0/
DATA (gns(55,i),i=1,1)/8/
DATA (ab(55,i),i=1,1)/100.d0/
c
DATA at(56),gel(56),nmn(56),(mn(56,i),i=1,7)/'Ba',1,7,130,132,134,
1 135,136,137,138/
DATA (zm(56,i),i=0,7)/137.327d0, 129.9063207d0, 131.9050611d0,
1 133.90450818d0, 134.90568838d0, 135.90457573d0, 136.9058271d0,
2 137.9052470d0/
DATA (gns(56,i),i=1,7)/1,1,1,4,1,4,1/
DATA (ab(56,i),i=1,7)/0.106d0, 0.101d0, 2.417d0, 6.592d0,
1 7.854d0, 11.23d0, 71.70d0/
c
DATA at(57),gel(57),nmn(57),(mn(57,i),i=1,2)/'La',4,2,138,139/
DATA (zm(57,i),i=0,2)/138.9055d0, 137.907115d0, 138.9063563d0/
DATA (gns(57,i),i=1,2)/11,8/
DATA (ab(57,i),i=1,2)/0.0902d0, 99.9098d0/
c
DATA at(58),gel(58),nmn(58),(mn(58,i),i=1,4)/'Ce',9,4,136,138,140,
1 142/
DATA (zm(58,i),i=0,4)/140.115d0, 135.9071292d0, 137.905991d0,
1 139.9054431d0, 141.9092504d0/
DATA (gns(58,i),i=1,4)/1,1,1,1/
DATA (ab(58,i),i=1,4)/0.19d0, 0.25d0, 88.48d0, 11.08d0/
c
DATA at(59),gel(59),nmn(59),(mn(59,i),i=1,1)/'Pr',10,1,141/
DATA (zm(59,i),i=0,1)/140.90765d0, 140.9076576d0/
DATA (gns(59,i),i=1,1)/6/
DATA (ab(59,i),i=1,1)/100.d0/
c
DATA at(60),gel(60),nmn(60),(mn(60,i),i=1,7)/'Nd',9,7,142,143,144,
1 145,146,148,150/
DATA (zm(60,i),i=0,7)/144.24d0, 141.9077290d0, 142.9098200d0,
1 143.9100930d0, 144.9125793d0, 145.9131226d0, 147.9168993d0,
2 149.9209022d0/
DATA (gns(60,i),i=1,7)/1,8,1,8,1,1,1/
DATA (ab(60,i),i=1,7)/27.13d0, 12.18d0, 23.80d0, 8.30d0, 17.19d0,
1 5.76d0, 5.64d0/
c
DATA at(61),gel(61),nmn(61),(mn(61,i),i=1,1)/'Pm',6,1,145/
DATA (zm(61,i),i=0,1)/144.912743d0, 144.912756d0/
DATA (gns(61,i),i=1,1)/6/
DATA (ab(61,i),i=1,1)/100.d0/
c
DATA at(62),gel(62),nmn(62),(mn(62,i),i=1,7)/'Sm',1,7,144,147,148,
1 149,150,152,154/
DATA (zm(62,i),i=0,7)/150.36d0, 143.9120065d0, 146.9149044d0,
1 147.9148292d0, 148.9171921d0, 149.9172829d0, 151.9197397d0,
2 153.9222169d0/
DATA (gns(62,i),i=1,7)/1,8,1,8,1,1,1/
DATA (ab(62,i),i=1,7)/3.1d0, 15.0d0, 11.3d0, 13.8d0, 7.4d0,
1 26.7d0, 22.7d0/
c
DATA at(63),gel(63),nmn(63),(mn(63,i),i=1,2)/'Eu',8,2,151,153/
DATA (zm(63,i),i=0,2)/151.965d0, 150.9198578d0, 152.9212380d0/
DATA (gns(63,i),i=1,2)/6,6/
DATA (ab(63,i),i=1,2)/47.8d0, 52.2d0/
c
DATA at(64),gel(64),nmn(64),(mn(64,i),i=1,7)/'Gd',5,7,152,154,155,
1 156,157,158,160/
DATA (zm(64,i),i=0,7)/157.25d0, 151.9197995d0, 153.9208741d0,
1 154.9226305d0, 155.9221312d0, 156.9239686d0, 157.9241123d0,
2 159.9270624d0/
DATA (gns(64,i),i=1,7)/1,1,4,1,4,1,1/
DATA (ab(64,i),i=1,7)/0.20d0, 2.18d0, 14.80d0, 20.47d0, 15.65d0,
1 24.84d0, 21.86d0/
c
DATA at(65),gel(65),nmn(65),(mn(65,i),i=1,1)/'Tb',16,1,159/
DATA (zm(65,i),i=0,1)/158.92534d0, 158.9253547d0/
DATA (gns(65,i),i=1,1)/4/
DATA (ab(65,i),i=1,1)/100.d0/
c
DATA at(66),gel(66),nmn(66),(mn(66,i),i=1,7)/'Dy',17,7,156,158,
1 160,161,162,163,164/
DATA (zm(66,i),i=0,7)/162.50d0, 155.9242847d0, 157.924416d0,
1 159.9252046d0, 160.9269405d0, 161.9268056d0, 162.9287383d0,
2 163.9291819d0/
DATA (gns(66,i),i=1,7)/1,1,1,6,1,6,1/
DATA (ab(66,i),i=1,7)/0.06d0, 0.10d0, 2.34d0, 18.9d0, 25.5d0,
1 24.9d0, 28.2d0/
c
DATA at(67),gel(67),nmn(67),(mn(67,i),i=1,1)/'Ho',16,1,165/
DATA (zm(67,i),i=0,1)/164.93032d0, 164.9303288d0/
DATA (gns(67,i),i=1,1)/8/
DATA (ab(67,i),i=1,1)/100.d0/
DATA at(68),gel(68),nmn(68),(mn(68,i),i=1,6)/'Er',13,6,162,164,
1 166,167,168,170/
DATA (zm(68,i),i=0,6)/167.26d0, 161.9287884d0, 163.9292088d0,
1 165.9302995d0, 166.9320546d0, 167.9323767d0, 169.9354702d0/
DATA (gns(68,i),i=1,6)/1,1,1,8,1,1/
DATA (ab(68,i),i=1,6)/0.14d0, 1.61d0, 33.6d0, 22.95d0, 26.8d0,
1 14.9d0/
c
DATA at(69),gel(69),nmn(69),(mn(69,i),i=1,1)/'Tm',8,1,169/
DATA (zm(69,i),i=0,1)/168.93421d0, 168.9342179d0/
DATA (gns(69,i),i=1,1)/2/
DATA (ab(69,i),i=1,1)/100.d0/
c
DATA at(70),gel(70),nmn(70),(mn(70,i),i=1,7)/'Yb',1,7,168,170,171,
1 172,173,174,176/
DATA (zm(70,i),i=0,7)/173.04d0, 167.9338896d0, 169.9347664d0,
1 170.9363302d0, 171.9363859d0, 172.9382151d0, 173.9388664d0,
2 175.9425764d0/
DATA (gns(70,i),i=1,7)/1,1,2,1,6,1,1/
DATA (ab(70,i),i=1,7)/0.13d0, 3.05d0, 14.3d0, 21.9d0, 16.12d0,
1 31.8d0, 12.7d0/
c
DATA at(71),gel(71),nmn(71),(mn(71,i),i=1,2)/'Lu',4,2,175,176/
DATA (zm(71,i),i=0,2)/174.967d0, 174.9407752d0, 175.9426897d0/
DATA (gns(71,i),i=1,2)/6,15/
DATA (ab(71,i),i=1,2)/97.41d0, 2.59d0/
c
DATA at(72),gel(72),nmn(72),(mn(72,i),i=1,6)/'Hf',5,6,174,176,177,
1 178,179,180/
DATA (zm(72,i),i=0,6)/178.49d0, 173.9400461d0, 175.9414076d0,
1 176.9432277d0, 177.9437058d0, 178.9458232d0, 179.9465570d0/
DATA (gns(72,i),i=1,6)/1,1,8,1,10,1/
DATA (ab(72,i),i=1,6)/0.162d0, 5.206d0, 18.606d0, 27.297d0,
1 13.629d0, 35.100d0/
c
DATA at(73),gel(73),nmn(73),(mn(73,i),i=1,2)/'Ta',4,2,180,181/
DATA (zm(73,i),i=0,2)/180.9479d0, 179.9474648d0, 180.9479958d0/
DATA (gns(73,i),i=1,2)/17,8/
DATA (ab(73,i),i=1,2)/0.012d0, 99.988d0/
c
DATA at(74),gel(74),nmn(74),(mn(74,i),i=1,5)/' W',1,5,180,182,183,
1 184,186/
DATA (zm(74,i),i=0,5)/183.84d0, 179.9467108d0, 181.9482039d0,
1 182.9502227d0, 183.9509309d0, 185.9543628d0/
DATA (gns(74,i),i=1,5)/1,1,2,1,1/
DATA (ab(74,i),i=1,5)/0.13d0, 26.3d0, 14.3d0, 30.67d0, 28.6d0/
c
DATA at(75),gel(75),nmn(75),(mn(75,i),i=1,2)/'Re',6,2,185,187/
DATA (zm(75,i),i=0,2)/186.207d0, 184.9529545d0, 186.9557501d0/
DATA (gns(75,i),i=1,2)/6,6/
DATA (ab(75,i),i=1,2)/37.40d0, 62.60d0/
c
DATA at(76),gel(76),nmn(76),(mn(76,i),i=1,7)/'Os',9,7,184,186,187,
1 188,189,190,192/
DATA (zm(76,i),i=0,7)/190.23d0, 183.9524885d0, 185.9538350d0,
1 186.9557474d0, 187.9558352d0, 188.9581442d0, 189.9584437d0,
2 191.9614770d0/
DATA (gns(76,i),i=1,7)/1,1,2,1,4,1,1/
DATA (ab(76,i),i=1,7)/0.02d0, 1.58d0, 1.6d0, 13.3d0, 16.1d0,
1 26.4d0, 41.0d0/
c
DATA at(77),gel(77),nmn(77),(mn(77,i),i=1,2)/'Ir',10,2,191,193/
DATA (zm(77,i),i=0,2)/192.22d0, 190.9605893d0, 192.9629216d0/
DATA (gns(77,i),i=1,2)/4,4/
DATA (ab(77,i),i=1,2)/37.3d0, 62.7d0/
c
c
DATA at(78),gel(78),nmn(78),(mn(78,i),i=1,6)/'Pt',7,6,190,192,194,
1 195,196,198/
DATA (zm(78,i),i=0,6)/195.08d0, 189.959930d0, 191.961039d0,
1 193.9626809d0, 194.9647917d0, 195.9649521d0, 197.9678949d0/
DATA (gns(78,i),i=1,6)/1,1,1,2,1,1/
DATA (ab(78,i),i=1,6)/0.01d0,0.79d0,32.9d0,33.8d0,25.3d0,7.2d0/
c
DATA at(79),gel(79),nmn(79),(mn(79,i),i=1,1)/'Au',2,1,197/
DATA (zm(79,i),i=0,1)/196.96654d0, 196.9665688d0/
DATA (gns(79,i),i=1,1)/4/
DATA (ab(79,i),i=1,1)/100.d0/
c
DATA at(80),gel(80),nmn(80),(mn(80,i),i=1,7)/'Hg',1,7,196,198,199,
1 200,201,202,204/
DATA (zm(80,i),i=0,7)/200.59d0, 195.965833d0, 197.9667686d0,
1 198.9682806d0, 199.9683266d0, 200.9703028d0, 201.9706434d0,
2 203.9734940d0/
DATA (gns(80,i),i=1,7)/1,1,2,1,4,1,1/
DATA (ab(80,i),i=1,7)/0.15d0, 9.97d0, 16.87d0, 23.10d0, 13.18d0,
1 29.86d0, 6.87d0/
c
DATA at(81),gel(81),nmn(81),(mn(81,i),i=1,2)/'Tl',2,2,203,205/
DATA (zm(81,i),i=0,2)/204.3833d0, 202.9723446d0, 204.9744278d0/
DATA (gns(81,i),i=1,2)/2,2/
DATA (ab(81,i),i=1,2)/29.524d0, 70.476d0/
c
DATA at(82),gel(82),nmn(82),(mn(82,i),i=1,4)/'Pb',1,4,204,206,207,
1 208/
DATA (zm(82,i),i=0,4)/207.2d0, 203.9730440d0, 205.9744657d0,
1 206.9758973d0, 207.9766525d0/
DATA (gns(82,i),i=1,4)/1,1,2,1/
DATA (ab(82,i),i=1,4)/1.4d0, 24.1d0, 22.1d0, 52.4d0/
c
DATA at(83),gel(83),nmn(83),(mn(83,i),i=1,1)/'Bi',4,1,209/
DATA (zm(83,i),i=0,1)/208.98037d0, 208.9803991d0/
DATA (gns(83,i),i=1,1)/10/
DATA (ab(83,i),i=1,1)/100.d0/
c
DATA at(84),gel(84),nmn(84),(mn(84,i),i=1,1)/'Po',5,1,209/
DATA (zm(84,i),i=0,1)/208.982404d0, 208.9824308d0/
DATA (gns(84,i),i=1,1)/2/
DATA (ab(84,i),i=1,1)/100.d0/
c
DATA at(85),gel(85),nmn(85),(mn(85,i),i=1,1)/'At',-1,1,210/
DATA (zm(85,i),i=0,1)/209.987126d0, 209.987148d0/
DATA (gns(85,i),i=1,1)/11/
DATA (ab(85,i),i=1,1)/100.d0/
c
DATA at(86),gel(86),nmn(86),(mn(86,i),i=1,1)/'Rn',1,1,222/
DATA (zm(86,i),i=0,1)/222.017571d0, 222.0175782d0/
DATA (gns(86,i),i=1,1)/1/
DATA (ab(86,i),i=1,1)/100.d0/
c
DATA at(87),gel(87),nmn(87),(mn(87,i),i=1,1)/'Fr',-1,1,223/
DATA (zm(87,i),i=0,1)/223.019733d0, 223.0197360d0/
DATA (gns(87,i),i=1,1)/4/
DATA (ab(87,i),i=1,1)/100.d0/
c
DATA at(88),gel(88),nmn(88),(mn(88,i),i=1,1)/'Ra',1,1,226/
DATA (zm(88,i),i=0,1)/226.025403d0, 226.0254103d0/
DATA (gns(88,i),i=1,1)/1/
DATA (ab(88,i),i=1,1)/100.d0/
c
DATA at(89),gel(89),nmn(89),(mn(89,i),i=1,1)/'Ac',4,1,227/
DATA (zm(89,i),i=0,1)/227.027750d0, 227.0277523d0/
DATA (gns(89,i),i=1,1)/4/
DATA (ab(89,i),i=1,1)/100.d0/
c
DATA at(90),gel(90),nmn(90),(mn(90,i),i=1,1)/'Th',-1,1,232/
DATA (zm(90,i),i=0,1)/232.038d0, 232.0380558d0/
DATA (gns(90,i),i=1,1)/1/
DATA (ab(90,i),i=1,1)/100.d0/
c
DATA at(91),gel(91),nmn(91),(mn(91,i),i=1,1)/'Pa',-1,1,231/
DATA (zm(91,i),i=0,1)/231.03588d0, 231.0358842d0/
DATA (gns(91,i),i=1,1)/4/
DATA (ab(91,i),i=1,1)/100.d0/
c
DATA at(92),gel(92),nmn(92),(mn(92,i),i=1,4)/' U',-1,4,233,234,
1 235,238/
DATA (zm(92,i),i=0,4)/238.0289d0, 233.0396355d0, 234.0409523d0,
1 235.0439301d0, 238.0507884d0/
DATA (gns(92,i),i=1,4)/6,1,8,1/
DATA (ab(92,i),i=1,4)/0.d0, 0.0055d0, 0.7200d0, 99.2745d0/
c
DATA at(93),gel(93),nmn(93),(mn(93,i),i=1,1)/'Np',-1,1,237/
DATA (zm(93,i),i=0,1)/237.0481678d0, 237.0481736d0/
DATA (gns(93,i),i=1,1)/6/
DATA (ab(93,i),i=1,1)/100.d0/
c
DATA at(94),gel(94),nmn(94),(mn(94,i),i=1,1)/'Pu',-1,1,244/
DATA (zm(94,i),i=0,1)/244.064199d0, 244.064205d0/
DATA (gns(94,i),i=1,1)/1/
DATA (ab(94,i),i=1,1)/100.d0/
c
DATA at(95),gel(95),nmn(95),(mn(95,i),i=1,1)/'Am',-1,1,243/
DATA (zm(95,i),i=0,1)/243.061375d0, 243.0613815d0/
DATA (gns(95,i),i=1,1)/6/
DATA (ab(95,i),i=1,1)/100.d0/
c
DATA at(96),gel(96),nmn(96),(mn(96,i),i=1,1)/'Cm',-1,1,247/
DATA (zm(96,i),i=0,1)/247.070347d0, 247.070354d0/
DATA (gns(96,i),i=1,1)/10/
DATA (ab(96,i),i=1,1)/100.d0/
c
DATA at(97),gel(97),nmn(97),(mn(97,i),i=1,1)/'Bk',-1,1,247/
DATA (zm(97,i),i=0,1)/247.070300d0, 247.070307d0/
DATA (gns(97,i),i=1,1)/4/
DATA (ab(97,i),i=1,1)/100.d0/
c
DATA at(98),gel(98),nmn(98),(mn(98,i),i=1,1)/'Cf',-1,1,251/
DATA (zm(98,i),i=0,1)/251.079580d0, 251.079589d0/
DATA (gns(98,i),i=1,1)/2/
DATA (ab(98,i),i=1,1)/100.d0/
c
DATA at(99),gel(99),nmn(99),(mn(99,i),i=1,1)/'Es',-1,1,252/
DATA (zm(99,i),i=0,1)/252.082944d0, 252.082980d0/
DATA (gns(99,i),i=1,1)/11/
DATA (ab(99,i),i=1,1)/100.d0/
c
DATA at(100),gel(100),nmn(100),(mn(100,i),i=1,1)/'Fm',-1,1,257/
DATA (zm(100,i),i=0,1)/257.095099d0, 257.095106d0/
DATA (gns(100,i),i=1,1)/10/
DATA (ab(100,i),i=1,1)/100.d0/
c
DATA at(101),gel(101),nmn(101),(mn(101,i),i=1,1)/'Md',-1,1,258/
DATA (zm(101,i),i=0,1)/258.09857d0, 258.098431d0/
DATA (gns(101,i),i=1,1)/17/
DATA (ab(101,i),i=1,1)/100.d0/
c
DATA at(102),gel(102),nmn(102),(mn(102,i),i=1,1)/'No',-1,1,259/
DATA (zm(102,i),i=0,1)/259.100931d0, 259.101030d0/
DATA (gns(102,i),i=1,1)/10/
DATA (ab(102,i),i=1,1)/100.d0/
c
DATA at(103),gel(103),nmn(103),(mn(103,i),i=1,1)/'Lr',-1,1,260/
DATA (zm(103,i),i=0,1)/260.105320d0, 260.105510d0/
DATA (gns(103,i),i=1,1)/-1/
DATA (ab(103,i),i=1,1)/100.d0/
c
DATA at(104),gel(104),nmn(104),(mn(104,i),i=1,1)/'Rf',-1,1,261/
DATA (zm(104,i),i=0,1)/261.10869d0, 261.108770d0/
DATA (gns(104,i),i=1,1)/-1/
DATA (ab(104,i),i=1,1)/100.d0/
c
DATA at(105),gel(105),nmn(105),(mn(105,i),i=1,1)/'Db',-1,1,262/
DATA (zm(105,i),i=0,1)/262.11376d0, 262.114070d0/
DATA (gns(105,i),i=1,1)/-1/
DATA (ab(105,i),i=1,1)/100.d0/
c
DATA at(106),gel(106),nmn(106),(mn(106,i),i=1,1)/'Sg',-1,1,263/
DATA (zm(106,i),i=0,1)/263.11822d0, 263.118290d0/
DATA (gns(106,i),i=1,1)/-1/
DATA (ab(106,i),i=1,1)/100.d0/
c
DATA at(107),gel(107),nmn(107),(mn(107,i),i=1,1)/'Bh',-1,1,262/
DATA (zm(107,i),i=0,1)/262.12293d0, 262.122970d0/
DATA (gns(107,i),i=1,1)/-1/
DATA (ab(107,i),i=1,1)/100.d0/
c
DATA at(108),gel(108),nmn(108),(mn(108,i),i=1,1)/'Hs',-1,1,265/
DATA (zm(108,i),i=0,1)/265.13016d0, 265.129793d0/
DATA (gns(108,i),i=1,1)/-1/
DATA (ab(108,i),i=1,1)/100.d0/
c
DATA at(109),gel(109),nmn(109),(mn(109,i),i=1,1)/'Mt',-1,1,266/
DATA (zm(109,i),i=0,1)/266.13764d0, 266.137370d0/
DATA (gns(109,i),i=1,1)/-1/
DATA (ab(109,i),i=1,1)/100.d0/
c
IF((IAN.LT.0).OR.(IAN.GT.109)) THEN
MASS= 0.d0
NAME= 'XX'
IMN= 0
WRITE(6,601) IAN
RETURN
ELSE
NAME= AT(IAN)
ENDIF
IF((IAN.EQ.1).AND.(IMN.GT.1)) THEN
c** Special case: insert common name for deuterium or tritium
IF(IMN.EQ.2) NAME=' D'
IF(IMN.EQ.3) NAME=' T'
ENDIF
IF((IAN.EQ.0).AND.(IMN.GT.1)) THEN
IF(IMN.EQ.2) NAME=' d'
IF(IMN.EQ.3) NAME=' t'
ENDIF
GELGS= GEL(IAN)
MASS= -1.d0
DGNS= -1
ABUND = -1.d0
DO I= 1,NMN(IAN)
if(i.gt.15) write(6,606) ian,imn,nmn(ian)
IF(IMN.EQ.MN(IAN,I)) THEN
MASS= ZM(IAN,I)
DGNS= gns(IAN,I)
ABUND = AB(IAN,I)
ENDIF
ENDDO
IF(MASS.LT.0.d0) THEN
MASS= ZM(IAN,0)
IF(IMN.NE.0) WRITE(6,602) AT(IAN),IMN
IMN= 0
ENDIF
RETURN
601 FORMAT(' *** MASSES Data base does not include Atomic Number=',i4)
602 FORMAT(' *** MASSES Data base does not include ',A2,'(',i3,
1 '), so use average atomic mass.')
606 format(/' *** ERROR *** called MASSES for atom with AN=',I4,
1 ' MN=',I4,'n(MN)=',I4)
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE ALF(NDP,RH,NCN,RR,V,SWF,VLIM,MAXMIN,KVMAX,NVIBMX,AFLAG,
1 ZMU,EPS,GV,INNODE,INNR,IWR)
c*
c-----------------------------------------------------------------------
c** The subroutine ALF (Automatic vibrational Level Finder) will
c automatically generate the eigenvalues from the first vibrational
c level (v=0) to a user specified level (v=KVMAX) or the highest
c allowed vibrational level of a given smooth single (or double)
c minimum potential (V). These energies are stored and returned to the
c calling program in the molecular constants array GV(v=0-KVMAX).
c** For any errors that cannot be resolved within the subroutine, ALF
c returns AFLAG with a value that defines which error had occured.
c++++++++++ Version last updated July 16, 2015 ++++++++++++++++++++++
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c+++++++++++++ COPYRIGHT 2008-15 by Robert J. Le Roy +++++++++++++
c Dept. of Chemistry, Univ. of 蓝莓视频, 蓝莓视频, Ontario, Canada +
c This software may not be sold or any other commercial use made +
c of it without the express written permission of the authors. +
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c++++++ Please inform me of any bugs, by phone at: (519)888-4051 +++++++
c+++++++++ by e-mail to: leroy@uwaterloo.ca , or by Post at: +++++++++++
c+++ Dept. of Chemistry, Univ. 蓝莓视频, 蓝莓视频, Ontario N2L 3G1 ++++
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Uses the Schrodinger solver subroutine SCHRQ.
c
c** On entry:
c NDP is the number of datapoints used for the potential.
c RR(i) is the array of radial distances (in Angst.), for i= 1, NDP
c RH is the radial mesh step size (in Angst).
c NCN is the (integer) inverse power defining the linmiting attractive
c long-range behaviour of the potential. For a barrier, set NCN=99
c RR(i) is the array of distances at which V(i) is defined
c V(i) is the scaled input potential (cm-1).
c The scaling factor BFCT is (2*mu/hbar^2)*RH^2.
c VLIM is the potential asymptote (cm-1).
c MAXMIN the code STOPS if a search finds more than MAXMIN potential minima
c KVMAX is v for the highest vibrational level we wish to find.
c NVIBMX defines dimension of the external Gv array: GV(0:NVIBMX)
c AFLAG is rot.quantum J for the (centrifugally distorted) potential
c ZMU is the reduced mass of the diatom (amu).
c EPS is the energy convergence criterion (cm-1).
c INNODE specifies whether wave fx. initiation @ RMIN=RR(1) starts with
c a node (normal case: INNODE > 0) or zero slope (when INNODE.le.0)
c IWR specifies the level of printing inside SCHRQ
c <> 0 : print error & warning descriptions.
c >= 1 : also print final eigenvalues & node count.
c >= 2 : also show end-of-range wave function amplitudes.
c >= 3 : print also intermediate trial eigenvalues, etc.
c
c** On exit:
c KVMAX is vib.quantum number for the highest vibrational level
c found (may be less than the input value of KVMAX).
c AFLAG returns calculation outcome to calling program.
c >= 0 : found all levels to v=KVMAX{input} & AFLAG= J
c = -1 : KVMAX larger than number of levels found.
c GV(v) contains the vibrational energy levels found for v=0-KVMAX
c INNR(v) labels each level as belonging to the inner (INNR = 1) or
c outer (INNR = 0) well.
c
c** Flags: Modify only when debugging.
c AWO specifies the level of printing inside ALF
c < or > 0 : print error & warning descriptions.
c > 0 : also print intermediate ALF messages.
c INNER specifies wave function matching (& initiation) conditions.
c .le.0 : Match inward & outward solutions at outermost well t.p.
c > 0 : Match at innermost well inner turning point
c For most normal cases set INNER = 0, but ......
c To find "inner-well-dominated" solutions of an asymmetric
c double minimum potential, set INNER > 0.
c LPRWF specifies option of printing out generated wavefunction
c > 0 : print wave function every LPRWF-th point.
c < 0 : compactly write to channel-7 every |LPRWF|-th wave
c function value.
c A lead "card" identifies the level, gives the position of
c 1-st point and radial mesh, & states No. of points.
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** The dimensioning parameters must be consistant with the sizes of the
c arrays used in the calling program.
c
c** NF counts levels found in automatic search option
c
IMPLICIT NONE
INTEGER IWR,ICOR,NDP,KVMAX,KV,KVB,KVBB,AFLAG,NF,NBEG,NEND,NVIBMX,
1 INNR(0:NVIBMX),IPMIN(10),IPMINN,I,LTRY,AWO,INNODE,INNER,LPRWF,
2 JROT,NCN,NPMIN,NPMAX,MAXMIN
c
REAL*8 RMIN,RH,RBAR,RR(NDP),V(NDP),SWF(NDP),VLIM,EO,ZMU,EPS,
1 BZ,BFCT,GAMA,VMIN,VMAX,VMAXX,PMAX, ESAV, ZPEHO, DGDV2, BMAX,
2 GV(0:NVIBMX),VPMIN(10),RPMIN(10),VPMAX(0:10),RPMAX(0:10)
c
DATA AWO/1/,LPRWF/0/,KVB/-1/,KVBB/-2/
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Check that the array dimensions are adequate.
RMIN= RR(1)
IF(KVMAX.GT.NVIBMX) THEN
WRITE(6,602) KVMAX, NVIBMX
STOP
ENDIF
c
c** Initialize the remaining variables and flags.
NF= 0 ! NF is label of level being sought
LTRY= 0
c** Initialize level counters for each well.
DO I= 0,KVMAX
INNR(I)= -2
ENDDO
c** Store input rotational quantum number.
JROT= AFLAG
AFLAG= -1
c
c** Numerical factor 16.857629206 (+/- 0.000,000,013) based on Compton
c wavelength of proton & proton mass (u) from 2011 physical constants.
BZ= ZMU/16.857629206d0
BFCT= BZ*RH*RH
c
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Locate the potential minima.
NPMIN= 0
VMIN= 1.d99
DO I= 2,NDP-1
IF((V(I).LT.V(I-1)).AND.(V(I).LT.V(I+1))) THEN
c.... at each minimum located ...
NPMIN= NPMIN + 1
IPMIN(NPMIN)= I
RPMIN(NPMIN)= RR(I)
VPMIN(NPMIN)= V(I)/BFCT
IF(VPMIN(NPMIN).LT.VMIN) THEN
IPMINN= I
VMIN= VPMIN(NPMIN)
ENDIF
IF(NPMIN.EQ.10) GOTO 10
ENDIF
END DO
10 IF(NPMIN.EQ.0) THEN
IF(V(2).LE.V(1)) THEN
c** If NO minimum & potential has negative slope, print a warning and stop
WRITE(6,604) JROT,(V(2)-V(1))/(RR(2)-RR(1))
KVMAX= -1
RETURN
ENDIF
c... but if potl. alway has positive slope, mesh point 1 is minimum
NPMIN= 1
IPMIN(NPMIN)= 1
VPMIN(NPMIN)= V(1)/BFCT
RPMIN(NPMIN)= RR(1)
VMIN= RPMIN(NPMIN)
WRITE(6,606) VPMIN(1),RR(1)
ENDIF
c
c** Locate any potential maxima past innermost minimum (if they exists).
NPMAX= 0
VMAX= -9.d99
DO I= IPMIN(1)+1,NDP-1
IF((V(I).GT.V(I-1)).AND.(V(I).GT.V(I+1))) THEN
NPMAX= NPMAX + 1
RPMAX(NPMAX)= RR(I)
VPMAX(NPMAX)= V(I)/BFCT
IF(VPMAX(NPMAX).GT.VMAX) VMAX= VPMAX(NPMAX)
IF(NPMAX.EQ.10) GOTO 20
ENDIF
END DO
20 IF((NPMAX.EQ.0).OR.
1 ((NPMAX.GT.0).AND.(RPMAX(NPMAX).LT.RPMIN(NPMIN)))) THEN
c** If no maxima found or there is no barrier past outermost minimum,
c set an energy maximum to be the value at the end of the radial range.
NPMAX= NPMAX+ 1
RPMAX(NPMAX)= RR(NDP)
c?? should this end-of-range limit be set at VLIM ?? ... naaahhh
VPMAX(NPMAX)= V(NDP)/BFCT
IF(VPMAX(NPMAX).GT.VMAX) VMAX= VPMAX(NPMAX)
ENDIF
VMAXX= VPMAX(NPMAX)
IF(VMAXX.LT.VLIM) VMAXX= VLIM
c
c** For multiple minima, print out potential extrema count
IF(NPMIN.GT.1) THEN
WRITE(6,614) NPMIN, (VPMIN(I),I= 1,NPMIN)
WRITE(6,616) (RPMIN(I), I= 1,NPMIN)
WRITE(6,618) NPMAX, (VPMAX(I),I= 1,NPMAX)
WRITE(6,616) (RPMAX(I), I= 1,NPMAX)
IF(NPMIN.GT.MAXMIN) THEN
c** If potential has more than MAXMIN minima - print warning & stop
WRITE(6,620)
STOP
ENDIF
ENDIF
c** Set BMAX as barrier height of double-minimum potential
BMAX= -9.d+09
IF(NPMIN.GT.1) THEN
DO I= 1,NPMAX
IF((RPMAX(I).GT.RPMIN(1)).AND.(RPMAX(I).LT.RPMIN(2)))
1 BMAX= VPMAX(I)
ENDDO
ENDIF
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c*** Use harmonic approximation to estimate zero point energy.
ZPEHO= DSQRT((V(IPMINN+20)-V(IPMINN))/400.d0)/BFCT
EO= VMIN + ZPEHO
EO= VMIN + ZPEHO
IF(EO.GT.VLIM) THEN
WRITE(6,612) EO,VLIM
EO= VLIM - 2.d0
ENDIF
c
c=========== Begin Actual Eigenvalue Calculation Loop Here =============
c** Compute eigenvalues ... etc. up to the KVMAX'th vibrational level.
c** When attempts to find the next eigenvalue fails, then perhaps the
c next level is located in a second (inner) well. If so, then the
c subroutine will set INNER = 1, and attempt to find that level.
c
ICOR= 0
INNER= 0
100 KVBB= KVB
KVB= KV
KV= NF
110 ESAV= EO
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Call subroutine SCHRQ to find eigenvalue EO and eigenfunction SWF(I).
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
CALL SCHRQ(KV,JROT,EO,GAMA,PMAX,VLIM,V,SWF,BFCT,EPS,RMIN,RH,NDP,
1 NBEG,NEND,INNODE,INNER,IWR,LPRWF)
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IF(KV.LT.0) THEN
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** The SCHRQ error condition is KV < 0. Allow for 3 cases:
c EO > VMAX : energy from previous trial above potential maximum
c NF = 0 : Looking for the first vibrational level (v = 0)
c NF > 0 : Looking for the other vibrational levels (v > 0)
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IF(EO.GT.VMAX) THEN
c** For the case when the previous trial gave energy above the potential
c maximum/asymptote, make one last ditch attempt to find the highest
c bound level (quasi or otherwise) in the potential.
IF(LTRY.LT.1) THEN
LTRY= 1
KV= 999
EO= VMAX - 0.0001d0
GOTO 110
c... if that was unsuccessful, then print out a warning and exit.
ELSE
WRITE(6,622) NF, EO, VMAX
KV= NF-1
GOTO 200
ENDIF
ENDIF
WRITE(6,624) NF,JROT,ESAV
c.. eigenvalue of -9.9d9 signifies that eigenvalue search failed completely
KVMAX= NF-1
EO= -9.9d9
RETURN
ENDIF
IF((NPMIN.GT.1).AND.(EO.LT.VPMAX(1))) THEN
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Begin by asking if the current level is in a double minimum potential
c and if so, whether it lies below the barrier maximim and if so,
c calculate RBAR = to see which well it lies in
RBAR= 0.d0
DO I= NBEG,NEND
RBAR= RBAR+ RR(I)*SWF(I)**2
ENDDO
RBAR= RBAR*RH
INNER= 0
IF(RBAR.LT.RPMAX(1)) INNER= 1
IF(IWR.GT.0) write(6,777) RBAR,RPMAX(1),INNER
777 FORMAT(' Since RBAR=',F8.3,' and RPMAX=',F8.3,' set INNER
1=',I2)
ENDIF
IF(KV.EQ.NF) THEN
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** If calculated vibrational level is the desired level, NF, then increase
c NF by one and call SCECOR to calculate dG/dv and predict next higher level
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
GV(NF)= EO
INNR(NF)= INNER
120 NF= NF + 1
IF(NF.GT.KVMAX) THEN
c** If we have found all desired levels, then RETURN
IF((AWO.GT.0).AND.(IWR.GT.0)) WRITE(6,626) JROT,KVMAX
AFLAG= JROT
RETURN
ENDIF
c... Check whether the next level had been found earlier in overshoot.
c If so, count it in and skip on to the next one
IF(INNR(NF).GE.0) THEN
EO= GV(NF)
INNER= INNR(NF)
KV= NF
GOTO 120
ENDIF
ICOR= 0
c*** NOW, call SCECOR to calculate dG/dv and predict next higher level
c** EO enters as G(KV) & exits as predicted G(NF=KV+1) w. predicted INNER
CALL SCECOR(KV,NF,JROT,INNER,ICOR,IWR,EO,RH,BFCT,NDP,NCN,V,
1 BMAX,VMAXX,VLIM,DGDV2)
IF(ICOR.GE.11) THEN
KVMAX= KV !! for case when vD-v < 1 for v=KV
GOTO 200
ENDIF
IF(EO.GT.VPMAX(NPMAX)) THEN
c... if estimated energy above highest barrier, set value slightly below it
EO= VPMAX(NPMAX) - 0.10d0*DGDV2
ICOR= ICOR+10
ELSE
IF(DGDV2.LT.0.d0) THEN
c... SCECOR returned negative phase integral, so quit loop & RETURN
WRITE(6,628) JROT,EO
AFLAG= -1
GOTO 200
ENDIF
ENDIF
LTRY= 0
GOTO 100
ENDIF
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IF(KV.NE.NF) THEN
c*** If last level found was not the desired one ...
IF(INNR(KV).LT.-1) THEN
c... Record vibrational level (if haven't already) for posterity.
GV(KV)= EO
INNR(KV)= INNER
ENDIF
ICOR= ICOR+1
IF(ICOR.LE.10) THEN
c... Call subroutine using semiclassical methods to estimate correct energy
CALL SCECOR(KV,NF,JROT,INNER,ICOR,IWR,EO,RH,BFCT,NDP,NCN,
1 V,BMAX,VMAXX,VLIM,DGDV2)
IF(EO.GT.VPMAX(NPMAX)) THEN
c... if estimated energy above highest barrier, set value below it
KV= 999
EO= VPMAX(NPMAX) - 0.05d0*DGDV2
ENDIF
GOTO 100
ENDIF
c** If the calculated wavefunction is still for the wrong vibrational
c level, then write out a warning return
WRITE(6,630) NF,JROT
KVMAX= NF-1
ENDIF
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
200 IF(AFLAG.LT.0) THEN
c** If unable to find all KVMAX+1 levels requested, then return KVMAX as
c v for the highest vibrational level actually found, and print out the
c the energy of that level.
KVMAX= KV !! modified 10/03/15 !! changed back 9/05/15
IF(AWO.NE.0) WRITE(6,632) KV, GV(KVMAX)
ENDIF
RETURN
c-----------------------------------------------------------------------
602 FORMAT(/' *** ALF ERROR ***'/4X,'Number of vib levels requested='
1 ,i4,' exceeds internal ALF array dimension NVIBMX=',i4)
604 FORMAT(/' *** ALF ERROR *** Find NO potential minima for J=',
1 i4,' Slope(RMIN)=',1PD8.1)
606 FORMAT(/' ALF finds onee potential minimum of',1PD15.7,
1 ' at R(1)=',0Pf9.6)
608 FORMAT(/' *** ALF WARNING ***'/4X,'There are',I3,' potential ',
1 A6,' in this potential. Stop searching after 10.')
610 FORMAT(/' *** ALF ERROR ***'/ 4X,'The potential turns over in the
1 short range region at R= ',G15.8)
612 FORMAT(' *** WARNING ... H-O initialization tried to place EO=',
1 f10.2,' above VLIM=',f10.2)
614 FORMAT(' Find',I3,' potential minima: Vmin=',5F12.3)
616 FORMAT(15x,'at mesh points R =',8f11.5)
618 FORMAT(' Find',I3,' potential maxima: Vmax=',5F12.3)
620 FORMAT(' *** So STOP !!!!')
622 FORMAT(/' ALF search finds next estimated trial energy E(v=',I3,
1 ')=',G15.8/8X,'lies above potential maximum or asymptote at VMAX
2=',G15.8)
624 FORMAT(/' *** SCHRQ FAILS in ALF when searching for v=',i3,
1 ' J=',i3,' with EO=',f9.3/5x,'Check range and/or contact R.J
2. Le Roy [leroy@uwaterloo.ca]')
626 FORMAT(/' ALF successfully finds all (J=',i3,') vibrational levels
1 up to v= KVMAX=',I3)
628 FORMAT(/' *** ERROR: at E(J=',i3,')=',f10.3,' SCECOR finds n
1o Phase Integrals')
630 FORMAT(4x,'ALF fails to find level v=',i3,', J=',i3)
632 FORMAT(' ALF finds the highest calculated level is E(v=',I3,
1 ')=',1PD15.7 /)
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE SCECOR(KV,KVLEV,JROT,INNER,ICOR,IWR,EO,RH,BFCT,NDP,
1 NCN,V,BMAX,VMAXX,VLIM,DGDV2)
c** Subroutine calculates (approximate!) semiclassical estimate of
c dG/dv for level v= KV with energy EO [cm-1] on potential
c {V(i),i=1,NDP} (in 'internal BFCT units' {V[cm-1]*BFCT}), and uses
c those results to estimate energy of level KVLEV (usually = KV+1)
c** If the 'clever' semiclassical procedure fails - try a brute force
c step-by-step search, using alternately INNER & OUTER well starting
c** BMAX is internal barrier maximum energy for double-well case,
c and very large negative number for single-well potential
c** VMAXX is height of outermost maximum, or VLIM for barrierless case
c** On return, negative DGDV2 signals error! No phase integrals found
c=======================================================================
c Version date: 2 February 2016
c*
INTEGER I,II,I1,I2,I3,I4,IV1,IV2,INNER,ICOR,JROT,KV,KVB,KVLEV,
1 KVDIF,NDP,NCN,IDIF,BRUTE,IB,IWR,NPMAX
REAL*8 EO,DE0,RH,BFCT,ARG2,ARG3,EINT,VPH1,VPH2,DGDV1,DGDV2,DGDVM,
1 DGDV2P,DGDVB,DGDVBP,EBRUTE,DEBRUTE,DE1,DE2,Y1,Y2,Y3,RT,ANS1,dv1,
2 dv2,ANS2,XDIF,VLIM,VMAXX,BMAX,PNCN,PWCN,PP1,VDMV,ENEXT,V(NDP)
SAVE BRUTE,EBRUTE,DEBRUTE,DGDVB
DATA DGDVB/-1.d0/,KVB/-1/
c
DGDV2= -1.d0
EINT= EO*BFCT
IF(KVLEV.EQ.0) DGDVB= -1.d0
KVDIF= KVLEV- KV
IF(ICOR.EQ.1) BRUTE= 0
PWCN= 2.d0
IF(NCN.NE.2) PWCN= 2.d0*NCN/DABS(NCN- 2.d0)
PNCN= ABS(NCN-2)/DFLOAT(NCN+2)
DGDVBP= DGDVB**PNCN
PP1= 1.d0/pNCN + 1.d0
I3= NDP
IF(EO.GT.VLIM) THEN
c*** For Quasibound levels, first search inward to classically forbidden
PWCN= 2.d0
PNCN= 1.d0
PP1= 1.d0
DO I= NDP,1,-1
I3= I
IF(V(I).GT.EINT) GOTO 8
ENDDO
ENDIF
c*** Now, search inward for outermost well turning point
8 DO I= I3,1,-1
I4= I
IF(V(I).LT.EINT) GOTO 10
ENDDO
c*** If never found an 'outer' turning point (e.g., above qbdd. barier)
c then simply return with negative DGDV2 as error flag
RETURN
c... Now collect vibrational phase and its energy deriv. over outer well
10 Y1= EINT- V(I4+1)
Y2= EINT- V(I4)
Y3= EINT- V(I4-1)
CALL LEVQAD(Y1,Y2,Y3,RH,RT,ANS1,ANS2)
ARG2= DSQRT(Y3)
VPH2= 0.5d0*ARG2 + ANS2/RH
DGDV2= 0.5d0/ARG2 + ANS1/RH
DO I= I4-2,1,-1
c... here collect (v+1/2) and dv/dG integrals over outer well ....
II= I
IF(V(I).GT.EINT) GO TO 12
ARG3= ARG2
ARG2= DSQRT(EINT - V(I))
VPH2= VPH2+ ARG2
DGDV2= DGDV2+ 1.d0/ARG2
ENDDO
12 I3= II+1
Y1= EINT- V(I3-1)
Y2= EINT- V(I3)
Y3= EINT- V(I3+1)
CALL LEVQAD(Y1,Y2,Y3,RH,RT,ANS1,ANS2)
VPH2= (VPH2 - ARG2 - 0.5d0*ARG3 + ANS2/RH)/3.141592654d0
DGDV2= DGDV2 -1.d0/ARG2 - 0.5d0/ARG3 + ANS1/RH
DGDV2= 6.283185308d0/(BFCT*DGDV2)
c*** Next, search outward from RMIN for innermost turning point
DO I= 1,NDP
I1= I
IF(V(I).LT.EINT) GOTO 20
ENDDO
20 IF(I1.EQ.1) THEN
c... but if RMIN is in the classically allowed region ... STOP here
WRITE(6,602) JROT,EO
STOP
ENDIF
IF(I1.GE.I3) THEN
c*** For single-well potential or above barrier of double-well potential
c use N-D theory estimate based on 'vD-v' from ratio of Eb to dG/dv
VDMV= PWCN*(VMAXX-EO)/DGDV2
ENEXT= VMAXX - (VMAXX-EO)*((VDMV- KVDIF)/VDMV)**PWCN
IF(IWR.GE.2) THEN
IF(ABS(EO).GT.1.d0) WRITE(6,600) ICOR,KV,JROT,EO,
1 VPH2-0.5d0,DGDV2
IF(ABS(EO).LE.1.d0) WRITE(6,601) ICOR,KV,JROT,EO,
1 VPH2-0.5d0,DGDV2
WRITE(6,606) VDMV,ENEXT
ENDIF
ccccccc????? Redundant stuff now ???????????????????????????????????????
cc IF((KV.LT.(KVLEV-1)).AND.(DGDVB.GT.0.d0)) THEN
c... If got wrong level (KV not one below KVLEV) and NOT first call ...
cc IF((EO-BMAX).GT.(2.d0*DGDV2)) THEN
c For eneries well above the barrier of a double minimum potrnti
c... 'Normal' case: use B-S plot area to estimate correct energy
cc DE0= KVDIF*(DGDV2- 0.5d0*(DGDV2-DGDVB)/DFLOAT(KV-KVB))
cc EO= EO+ DE0
cc KV= KVB
cc KVLEV= KV+1
cc RETURN
cc ELSE
c... but close to barrier in double-well potential, switch to 'BRUTE'
cc BRUTE=BRUTE+ 1
cc DGDV1= DGDV2
cc XDIF= SIGN(1,KVDIF)
cc GOTO 54
cc ENDIF
cc ENDIF
ccccccc????? Redundant stuff now ???????????????????????????????????????
IF(VDMV.LT.1.d0) THEN
ICOR= 100
IF(IWR.GT.0) WRITE(6,604) KV,EO
ELSE
EO= ENEXT
ENDIF
DGDVB= DGDV2
DGDVBP= DGDVB**PNCN
KVB= KV
INNER= 0
RETURN
ENDIF
c
c*** For a double-well potential, now collect vibrational phase and its
c energy derivative over the inner well
Y1= EINT- V(I1-1)
Y2= EINT- V(I1)
Y3= EINT- V(I1+1)
CALL LEVQAD(Y1,Y2,Y3,RH,RT,ANS1,ANS2)
ARG2= DSQRT(Y3)
VPH1= 0.5d0*ARG2 + ANS2/RH
DGDV1= 0.5d0/ARG2 + ANS1/RH
DO I= I1+2,NDP
c... now, collect integral and count nodes outward to second turning point ...
IF(V(I).GT.EINT) GO TO 22
ARG3= ARG2
ARG2= DSQRT(EINT - V(I))
VPH1= VPH1+ ARG2
DGDV1= DGDV1+ 1.d0/ARG2
ENDDO
22 I2= I-1
Y1= EINT- V(I2+1)
Y2= EINT- V(I2)
Y3= EINT- V(I2-1)
CALL LEVQAD(Y1,Y2,Y3,RH,RT,ANS1,ANS2)
VPH1= (VPH1 - ARG2 - 0.5d0*ARG3 + ANS2/RH)/3.141592654d0
DGDV1= DGDV1 -1.d0/ARG2 - 0.5d0/ARG3 + ANS1/RH
DGDV1= 6.28318531d0/(BFCT*DGDV1)
DGDVM= DGDV1*DGDV2/(DGDV1+DGDV2)
IF(KVDIF.EQ.0) THEN
c** If already at level sought, return
IF(IWR.GE.2) WRITE(6,610) KV,JROT,EO,VPH1-0.5d0,DGDV1,KVLEV,
1 ICOR,VPH2-0.5d0,DGDV2
RETURN
ENDIF
c
c** Not at right level - Check whether looking for higher or lower level ...
IDIF= SIGN(1,KVDIF)
XDIF= IDIF
IF((ICOR.GE.3).AND.((IABS(KVDIF).EQ.1).OR.(BRUTE.GT.0))) GOTO 50
c*** 'Conventional' semiclassical search for nearest INNER or OUTER well level
c... first, determine whether starting level KV was really INNER or OUTER
dv1= (VPH1-0.5d0) - NINT(VPH1-0.5d0)
dv2=(VPH2-0.5d0) - NINT(VPH2-0.5d0)
IF((DABS(dv2).GT.0.1).AND.(DABS(dv1).LT.0.1)) THEN
INNER=1
ENDIF
IF(INNER.EQ.0) THEN
c... and if current energy EO is for an outer-well level ...
DE2= DGDV2*XDIF
IF(IDIF.GT.0) DE1= (Ceiling(VPH1-0.5d0) - (VPH1-0.5d0))*DGDV1
IF(IDIF.LE.0) DE1= -((VPH1-0.5d0)- Floor(VPH1-0.5d0))*DGDV1
IF(IWR.GE.2) WRITE(6,610) KV,JROT,EO,VPH1-0.5d0,DGDV1,KVLEV,
1 ICOR,VPH2-0.5d0,DGDV2
ELSE
c... and if current energy EO is for an inner-well level ...
DE1= DGDV1*XDIF
IF(IDIF.GT.0) DE2= (Ceiling(VPH2-0.5d0) - (VPH2-0.5d0))*DGDV2
IF(IDIF.LE.0) DE2= -(1.d0 - dv2)*DGDV2
IF(IWR.GE.2) WRITE(6,610) KV,JROT,EO,VPH1-0.5d0,DGDV1,KVLEV,
1 ICOR,VPH2-0.5d0,DGDV2
ENDIF
IF(DABS(DE2).LT.DABS(DE1)) THEN
c... for case in which predict that next level will be OUTER
INNER= 0
EO= EO+ DE2
ELSE
c... for case in which predict that next level will be INNER
INNER= 1
EO= EO+ DE1
ENDIF
RETURN
50 BRUTE= BRUTE+ 1
c*** Now .. Brute force search for desired level !
IF(IWR.GE.2) WRITE(6,610) KV,JROT,EO,VPH1-0.5d0,DGDV1,KVLEV,
1 ICOR,VPH2-0.5d0,DGDV2
54 IF(BRUTE.EQ.1) THEN
c... in first brute-force step, use previous energy with opposite INNER
EBRUTE= EO
IF(INNER.EQ.0) THEN
INNER= 1
ELSE
INNER= 0
ENDIF
DEBRUTE= DMIN1(DGDV1,DGDV2)*XDIF*0.3d0
RETURN
ENDIF
IB= BRUTE/2
c... in subsequent EVEN steps, lower EO by DEBRUTE/10 for same INNER
IF((IB+IB).EQ.BRUTE) THEN
EBRUTE= EBRUTE+ DEBRUTE
EO= EBRUTE
RETURN
ELSE
c... in subsequent ODD steps, lower repeat previous EO with INNER changed
IF(INNER.EQ.0) THEN
INNER= 1
ELSE
INNER= 0
ENDIF
EO= EBRUTE
RETURN
ENDIF
c RETURN
600 FORMAT('Single well ICOR=',I2,': E(v=',i3,',J=',I3,')=',f10.2,
1 ' v(SC)=',F8.3,' dGdv=',f8.3)
601 FORMAT('Single well ICOR=',I2,': E(v=',i3,',J=',I3,')=',
1 1PD12.4,' v(SC)=',0PF8.3, /63x,'dGdv=',1PD12.4)
602 FORMAT(/' *** ERROR *** V(1) < E(J=',i3,')=',f10.2 )
604 FORMAT(10x,'Find highest level of this potential is E(v=',i3,
1 ')=',1PD18.10)
606 FORMAT(39x,'(vD-v)=',f10.4,' E(next)=',1PD12.4)
610 FORMAT('Double well E(v=',i3,', J=',I3,')=',f9.3,
1 ': v1(SC)=',F7.3,' dGdv1=',f8.2/8x,'seeking v=',I3,
2 ' (ICOR=',I2,')',8x,': v2(SC)=',F7.3,' dGdv2=',f8.2 )
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
c R.J. Le Roy subroutine SCHRQ, last modified 9 May 2015 ***
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c COPYRIGHT 2008-2014 by Robert J. Le Roy +
c Dept. of Chemistry, Univ. of 蓝莓视频, 蓝莓视频, Ontario, Canada +
c This software may not be sold or any other commercial use made +
c of it without the express written permission of the author. +
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** SCHRQ solves radial Schrodinger equation in dimensionless form
c d2WF/dR2 = - (E-V(R))*WF(R) , where WF(I) is the wave function.
c** Integrate by Numerov method over N mesh points with increment
c H=RH across range beginning at RMIN .
c** Input trial energy EO, eigenvalue convergence criterion EEPS
c potential asymptote VLIM, and all returned energies (EO, GAMA & VMAX)
c have units (cm-1).
c** On entry, the input potential V(I) must include the centrifugal
c term and the factor: 'BFCT'=2*mu*(2*pi*RH/hPLANCK)**2 (1/cm-1) ,
c which is also internally incorporated into EO, VLIM & EEPS.
c* Note that these reduced quantities (& the internal eigenvalue E)
c contain a factor of the squared integration increment RH**2 .
c This saves arithmetic work in the innermost loop of the algorithm.
c** For energy in (cm-1), BFCT=ZMU(u)*H(Angst)**2/16.857629206 (1/cm-1)
c** INNODE > 0 specifies that wavefx. initiates at RMIN with a node
c (normal default case); INNODE.le.0 specifies zero slope at
c RMIN (for finding symmetric eigenfunctions of symmetric potential
c with potential mid-point @ RMIN).
c** INNER specifies wave function matching condition: INNER = 0 makes
c matching of inward & outward solutions occur at outermost turning
c point; INNER > 0 makes matching occur at innermost turning point.
c * Normally use INNER=0 , but to find inner-well levels of double
c minimum potential, set INNER > 0 .
c----------------------------------------------------------------------
SUBROUTINE SCHRQ(KV,JROT,EO,GAMA,VMAX,VLIM,V,WF,BFCT,EEPS,RMIN,
1 RH,N,NBEG,NEND,INNODE,INNER,IWR,LPRWF)
c----------------------------------------------------------------------
c** Output vibrational quantum number KV, eigenvalue EO, normalized
c wave function WF(I), and range, NBEG .le. I .le. NEND over
c which WF(I) is defined. *** Have set WF(I)=0 outside this range.
c* (NBEG,NEND), defined by requiring abs(WF(I)) < RATST=1.D-9 outside.
c** If(LPRWF.gt.0) print wavefunction WF(I) every LPRWF-th point.
c* If(LPRWF.lt.0) "punch" (i.e., WRITE(10,XXX)) every |LPRWF|-th point
c of the wave function on disk starting at R(NBEG) with step size
c of IPSIQ=|LPRWF|*RH.
c** For energies above the potential asymptote VLIM, locate quasibound
c levels using Airy function boundary condition and return the level
c width GAMA and barrier height VMAX, as well as EO.
c** ERROR condition on return is KV < 0 ; usually KV=-1, but return
c KV=-2 if error appears to arise from too low trial energy.
c** If(IWR.ne.0) print error & warning descriptions
c If (IWR.gt.0) also print final eigenvalues & node count.
c If (IWR.ge.2) also show end-of-range wave function amplitudes
c If (IWR.ge.3) print also intermediate trial eigenvalues, etc.
c** If input KV.ge.998 , tries to find highest bound level, and
c trial energy should be only slightly less than VLIM.
c** If input KV < -10 , use log-derivative outer boundary condition at
c mesh point |KV| , based on incoming value of wave function WF(|KV|)
c and of the wavefunction derivative at that point, SPNEND, which is
c brought in as WF(|KV|-1). For a hard wall condition at mesh point
c |KV|, set WF(|KV|)=0 and WF(|KV|-1)= -1 before entry.
c----------------------------------------------------------------------
c++ "SCHRQ" calls subroutineas "QBOUND" and "WIDTH", and the latter
c++ calls "LEVQAD" .
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INTEGER I,IBEGIN,ICOR,IJ,IJK,INNODE,INNER,IPSID,IQTST,IT,
1 ITER,ITP1,ITP1P,ITP3,IWR,J,JJ,J1,J2,JPSIQ,JQTST,JROT,
2 KKV,KV,KVIN,LPRWF,M,MS,MSAVE,N,NBEG,NDN,NEND,NLINES,NPR
REAL*8 BFCT,DE,DEP,DEPRN,DF,DOLD,DSOC,
2 E,EEPS,EO,EPS,F,FX,GAMA,GI,GN,H,HT,PROD,PPROD,
3 RATIN,RATOUT,RATST,RH,RINC,RMIN,RMINN,RR,RSTT,RWR(20),
4 WF(N),SB,SI,SM,SN,SNEND,SPNEND,SRTGI,SRTGN,SWR(20),
5 V(N),VLIM,VMAX,VMX,VPR,
6 WKBTST,XEND,XPR,XPW,DXPW,Y1,Y2,Y3,YIN,YM,YOUT
DATA RATST/1.D-9/,XPW/27.63d0/
DATA NDN/15/
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DXPW= XPW/NDN
ICOR= 0
KVIN= KV
KV= -1
RMINN= RMIN-RH
GAMA= 0.d0
VMAX= VLIM
VMX= VMAX*BFCT
H= RH
HT= 1.d0/12.D+0
E= EO*BFCT
EPS= EEPS*BFCT
DSOC= VLIM*BFCT
DE= 0.d0
RATIN= 0.d0
RATOUT= 0.d0
IF(IWR.GT.2) THEN
IF(KVIN.GE.998) then
WRITE(6,610) EO
ELSE
WRITE(6,601) KVIN,JROT,EO,INNER
ENDIF
WRITE(6,602)
ENDIF
NEND= N
IF(KVIN.LT.-10) THEN
NEND= -KVIN
SNEND= WF(NEND)
SPNEND= WF(NEND-1)
ENDIF
JQTST = 0
c** Start iterative loop; try to converge for up to 30 iterations.
DO 90 IT= 1,30
ITER= IT
IF(INNER.GT.0) GO TO 38
10 IF(KVIN.LT.-10) THEN
c** If desired, (KVIN < -10) outer boundary set at NEND=|KVIN| and
c initialize wavefunction with log-derivative condition based on value
c WF(NEND) & derivative SPNEND at that mesh point (brought in in CALL)
GN= V(NEND)-E
GI= V(NEND-1)-E
SB= SNEND
SI= SB*(1.d0+ 0.5d0*GN)- RH*SPNEND
GO TO 24
END IF
IF(E.GE.DSOC) THEN
c** For quasibound levels, initialize wave function in "QBOUND"
CALL QBOUND(KVIN,JROT,E,EO,VMX,DSOC,V,RMIN,H,GN,GI,
1 SB,SI,N,ITP3,IWR,IQTST,BFCT,IT)
NEND= ITP3
VMAX= VMX/BFCT
IF(IQTST.GT.0) GO TO 24
IF(IQTST.LT.0) THEN
JQTST = JQTST+IQTST
IF((JQTST.LE.-2).OR.(VMAX.LT.VLIM)) GO TO 999
c** Try up to once to find level using trial value just below maximum
EO = VMAX-0.1D0
E = EO*BFCT
GO TO 90
ENDIF
GO TO 20
ENDIF
c** For E < DSOC begin inward integration by using JWKB to estimate
c optimum (minimum) inward starting point which will still give
c RATOUT < RATST = exp(-XPW) (ca. 1.d-9) [not needed after 1'st 2 ITER]
IF(ITER.LE.2) THEN
NEND= N
c ... first do rough inward search for outermost turning point
DO M= N,1,-NDN
MS= M
GI= V(M)- E
IF(GI.LE.0.D0) GO TO 12
GN= GI
ENDDO
IF(IWR.NE.0) WRITE(6,611) JROT,EO
GO TO 999
12 IF(MS.GE.N) GO TO 998
FX= GN/(GI-GN)
SM= 0.5d0*(1.d0+ FX)*DSQRT(GN)
MS= MS+ 2*NDN
IF(MS.GE.N) GO TO 20
c ... now integrate exponent till JWKB wave fx. would be negligible
DO M= MS,N,NDN
NEND= M
SM= SM+ DSQRT(V(M)- E)
IF(SM.GT.DXPW) EXIT
ENDDO
IF(NEND.LT.N) NEND= NEND+ NDN
ENDIF
c** For truly bound state initialize wave function as 1-st order WKB
c solution increasing inward
20 GN= V(NEND)- E
GI= V(NEND-1)- E
MS= NEND-1
IF(GI.LT.0.d0) GO TO 998
SRTGN= DSQRT(GN)
SRTGI= DSQRT(GI)
SB= 1.d0
SI= SB*DSQRT(SRTGN/SRTGI)*DEXP((SRTGN+SRTGI)*0.5d0)
IF(SB.GT.SI) THEN
c WOOPS - JWKB gives inward DEcreasing solution, so initialize with node
IF(IWR.NE.0) WRITE(6,618) JROT,EO,SB/SI
SI= 1.d0
SB= 0.d0
ENDIF
24 M= NEND-1
Y1= (1.d0-HT*GN)*SB
Y2= (1.d0-HT*GI)*SI
WF(NEND)= SB
WF(NEND-1)= SI
MS= NEND
IBEGIN= 3
IF(INNER.GT.0) IBEGIN= ITP1+2
c** Actual inward integration loop starts here
DO I= IBEGIN,NEND
M= M-1
Y3= Y2+Y2-Y1+GI*SI
GI= V(M)-E
SB= SI
SI= Y3/(1.d0-HT*GI)
WF(M)= SI
IF(DABS(SI).GE.1.D+17) THEN
c** Renormalize to prevent overflow of WF(I) in classically
c forbidden region where (V(I) .gt. E)
SI= 1.d0/SI
DO J= M,MS
WF(J)= WF(J)*SI
ENDDO
ccc MS= M
Y2= Y2*SI
Y3= Y3*SI
SB= SB*SI
SI= 1.d0
ENDIF
Y1= Y2
Y2= Y3
c** Test for outermost maximum of wave function.
c... old S{max} matching condition - turning point works OK & is simpler.
ccc IF((INNER.EQ.0).AND.(SI.LE.SB)) GO TO 32
c** Test for outermost well outer turning point
IF((INNER.EQ.0).AND.(GI.lt.0.d0)) GO TO 32
ENDDO
IF(INNER.EQ.0) THEN
c** Error mode ... inward propagation finds no turning point
KV= -2
IF(IWR.NE.0) WRITE(6,616) KV,JROT,EO
GO TO 999
ENDIF
c** Scale outer part of wave function before proceding
32 SI= 1.d0/SI
MSAVE= M
RR= RMINN+MSAVE*H
YIN= Y1*SI
RATOUT= WF(NEND)*SI
DO J= MSAVE,NEND
WF(J)= WF(J)*SI
ENDDO
IF(INNER.GT.0) GO TO 70
c-------------------------------------------------------------------
c** Set up to prepare for outward integration **
38 NBEG= 1
IF(INNODE.LE.0) THEN
c** Option to initialize with zero slope at beginning of the range
SB= 1.d0
GN= V(1)-E
Y1= SB*(1.d0-HT*GN)
Y2= Y1+GN*SB*0.5d0
GI= V(2)-E
SI= Y2/(1.d0-HT*GI)
ELSE
c** Initialize outward integration with a node at beginning of range
40 GN= V(NBEG)-E
IF(GN.GT.10.D0) THEN
c** If potential has [V(1)-E] so high that H is (locally) much too
c large, then shift inner starting point outward.
NBEG= NBEG+1
IF(NBEG.LT.N) GO TO 40
IF(IWR.NE.0) WRITE(6,613)
GO TO 999
ENDIF
IF((ITER.LE.1).AND.(IWR.NE.0)) THEN
IF(NBEG.GT.1) WRITE(6,609) JROT,EO,NBEG
IF(GN.LE.0.d0) WRITE(6,604) JROT,EO,NBEG,V(NBEG)/BFCT
ENDIF
c** Initialize outward wave function with a node: WF(NBEG) = 0.
SB= 0.d0
SI= 1.d0
GI= V(NBEG+1)-E
Y1= SB*(1.d0- HT*GN)
Y2= SI*(1.d0- HT*GI)
ENDIF
c
WF(NBEG)= SB
WF(NBEG+1)= SI
IF(INNER.GT.0) MSAVE= N
c** Actual outward integration loops start here
DO I= NBEG+2,MSAVE
Y3= Y2+Y2-Y1+GI*SI
GI= V(I)-E
SI= Y3/(1.d0- HT*GI)
WF(I)= SI
IF(DABS(SI).GE.1.D+17) THEN
c** Renormalize to prevent overflow of WF(I) in classically forbidden
c region where V(I) .gt. E
SI= 1.d0/SI
DO J= NBEG,I
WF(J)= WF(J)*SI
ENDDO
Y2= Y2*SI
Y3= Y3*SI
SI= 1.d0
ENDIF
Y1= Y2
Y2= Y3
ITP1= I
c** Exit from this loop at onset of classically allowed region
IF(GI.LE.0.d0) GO TO 52
ENDDO
MS= MSAVE
IF((INNER.EQ.0).AND.(GN.LE.0.d0)) GO TO 60
IF(IWR.NE.0) WRITE(6,612) KVIN,JROT,EO,MSAVE
GO TO 999
52 ITP1P= ITP1+1
MS= ITP1
IF(INNER.GT.0) GO TO 60
DO I= ITP1P,MSAVE
Y3= Y2+Y2-Y1+GI*SI
GI= V(I)-E
SI= Y3/(1.d0- HT*GI)
WF(I)= SI
IF(DABS(SI).GT.1.D+17) THEN
c** Renormalize to prevent overflow of WF(I) , as needed.
SI= 1.d0/SI
DO J= NBEG,I
WF(J)= WF(J)*SI
ENDDO
Y2= Y2*SI
Y3= Y3*SI
SI= 1.d0
ENDIF
Y1= Y2
Y2= Y3
ENDDO
MS= MSAVE
c** Finished outward integration. Normalize w.r.t. WF(MSAVE)
60 SI= 1.d0/SI
YOUT= Y1*SI
YM= Y2*SI
RATIN= WF(NBEG+1)*SI
DO I= NBEG,MS
WF(I)= WF(I)*SI
ENDDO
IF(INNER.GT.0) GO TO 10
c----- Finished numerical integration ... now correct trial energy
c** DF*H is the integral of (WF(I))**2 dR
70 DF= 0.d0
DO J= NBEG,NEND
DF= DF+WF(J)**2
ENDDO
c** Add edge correction to DF assuming wave function dies off as simple
c exponential past R(NEND); matters only if WF(NEND) unusually large.
IF((E.LE.DSOC).AND.(WF(NEND).NE.0)) THEN
IF((KVIN.GE.-10).AND.(WF(NEND-1)/WF(NEND).GT.1.d0))
1 DF= DF+ WF(NEND)**2/(2.d0*DLOG(WF(NEND-1)/WF(NEND)))
ENDIF
c... note that by construction, at this point WF(MSAVE)= 1.0
F= (-YOUT-YIN+2.d0*YM+GI)
DOLD= DE
IF(DABS(F).LE.1.D+30) THEN
DE= F/DF
ELSE
F= 9.9D+30
DF= F
DE= DABS(0.01D+0 *(DSOC-E))
ENDIF
IF(IWR.GT.2) THEN
DEPRN = DE/BFCT
XEND= RMINN+NEND*H
c** RATIN & RATOUT are wave fx. amplitude at inner/outer ends of range
c relative to its value at outermost extremum.
cc WRITE(6,603) IT,EO,F,DF,DEPRN,MSAVE,RR,RATIN,RATOUT,
cc 1 XEND,NBEG,ITP1
WRITE(6,603) IT,EO,DEPRN,MSAVE,RR,RATIN,RATOUT,
1 XEND,NBEG,ITP1
ENDIF
c** Test trial eigenvalue for convergence
IF(DABS(DE).LE.DABS(EPS)) GO TO 100
E= E+DE
c** KV.ge.999 Option ... Search for highest bound level. Adjust new
c trial energy downward if it would have been above dissociation.
IF((KVIN.GE.998).AND.(E.GT.VMX)) E= VMX- 2.d0*(VMX-E+DE)
EO= E/BFCT
IF((IT.GT.4).AND.(DABS(DE).GE.DABS(DOLD)).AND.
1 ((DOLD*DE).LE.0.d0)) THEN
c** Adjust energy increment if having convergence difficulties. Not
c usually needed except for some quasibounds extremely near VMAX .
ICOR= ICOR+1
DEP= DE/BFCT
IF(IWR.NE.0) WRITE(6,617) JROT,EO,IT,DEP
DE= 0.5d0*DE
E= E-DE
EO= E/BFCT
ENDIF
90 CONTINUE
c** End of iterative loop which searches for eigenvalue **
c-------------------------------------------------------------------*
c** Convergence fails, so return in error condition
E= E-DE
EO= E/BFCT
DEPRN= DE/BFCT
IF(IWR.NE.0) WRITE(6,620) KVIN,JROT,ITER,DEPRN
GO TO 999
100 IF(IWR.NE.0) THEN
IF(IWR.GE.3) WRITE(6,619)
IF((DABS(RATIN).GT.RATST).AND.(INNODE.GT.0)
1 .AND.(RMIN.GT.0.d0)) WRITE(6,614) JROT,EO,RATIN
IF((E.LT.DSOC).AND.(DABS(RATOUT).GT.RATST)) THEN
WKBTST=0.5d0*DABS(V(NEND)-V(NEND-1))/DSQRT((V(NEND)-E)**3)
IF(WKBTST.GT.1.d-3)WRITE(6,615)JROT,EO,RATOUT,RATST,WKBTST
ENDIF
ENDIF
KKV = 0
c** Perform node count on converged solution
PROD= WF(ITP1)*WF(ITP1-1)
J1= ITP1+1
J2= NEND-1
DO J= J1, J2
PPROD= PROD
PROD= WF(J)*WF(J-1)
IF((PPROD.LE.0.d0).AND.(PROD.GT.0.d0)) KKV= KKV+1
ENDDO
KV = KKV
c** Normalize & find interval (NBEG,NEND) where WF(I) is non-negligible
SN= 1.d0/DSQRT(H*DF)
DO I= NBEG,NEND
WF(I)= WF(I)*SN
ENDDO
IF(ITP1.LE.1) GO TO 122
J= ITP1P
DO I= 1,ITP1
J= J-1
IF(DABS(WF(J)).LT.RATST) GO TO 119
ENDDO
119 NBEG= J
IF(NBEG.LE.1) GO TO 122
J= J-1
DO I= 1,J
WF(I)= 0.d0
ENDDO
122 IF(KVIN.GE.-10) THEN
c** For "non-wall" cases, move NEND inward to where wavefunction
c "non-negligible"
J= NEND-1
DO I= NBEG,NEND
IF(DABS(WF(J)).GT.RATST) GO TO 126
J= J-1
ENDDO
126 NEND= J+1
END IF
IF(NEND.LT.N) THEN
c** Zero out wavefunction array at distances past NEND
DO I= NEND+1,N
WF(I)= 0.d0
ENDDO
ENDIF
IF(LPRWF.LT.0) THEN
c** If desired, write every |LPRWF|-th point of the wave function
c to a file on channel-10, starting at the NBEG-th mesh point.
JPSIQ= -LPRWF
NPR= 1+(NEND-NBEG)/JPSIQ
RINC= RH*JPSIQ
RSTT= RMINN+NBEG*RH
c** Write every JPSIQ-th point of the wave function for level v=KV
c J=JROT , beginning at mesh point NBEG & distance RSTT where
c the NPR values written separated by mesh step RINC=JPSIQ*RH
WRITE(10,701) KV,JROT,EO,NPR,RSTT,RINC,NBEG,JPSIQ
WRITE(10,702) (RMINN+I*RH,WF(I),I=NBEG,NEND,JPSIQ)
GO TO 140
ENDIF
c** Print solutions every LPRWF-th point, 6 to a line, in columns.
IF(LPRWF.GT.0) THEN
NLINES= ((1+(NEND-NBEG)/LPRWF)+3)/4
IPSID= LPRWF*NLINES
WRITE(6,605) KV,JROT,EO
DO J= 1,NLINES
JJ= NBEG+(J-1)*LPRWF
IJK= 0
DO IJ= JJ,NEND,IPSID
IJK= IJK+1
RWR(IJK)= RMINN+IJ*H
SWR(IJK)= WF(IJ)
ENDDO
WRITE(6,606) (RWR(I),SWR(I),I= 1,IJK)
ENDDO
ENDIF
140 IF(IWR.EQ.1) WRITE(6,607) KV,JROT,EO
IF(IWR.GE.2) WRITE(6,607) KV,JROT,EO,ITER,RR,NBEG,RATIN,INNER,
1 NEND,RATOUT
c** For quasibound levels, calculate width in subroutine "WIDTH"
IF((E.GT.DSOC).AND.(KVIN.GT.-10)) CALL WIDTH(KV,JROT,E,EO,DSOC,
1 V,WF,VMX,RMIN,H,BFCT,IWR,ITP1,ITP3,INNER,N,GAMA)
RETURN
c** ERROR condition if E.gt.V(R) at outer end of integration range.
998 XPR= RMINN+MS*H
VPR= V(MS)/BFCT
IF(IWR.NE.0) WRITE(6,608) EO,MS,VPR,XPR,IT
c** Return in error mode
999 KV= -1
RETURN
601 FORMAT(/' Solve for v=',I3,' J=',I3,' ETRIAL=',1PD15.7,
1 ' INNER=',i2,' WF(1st) WF(NEND)' )
602 FORMAT(' ITER ETRIAL',8X,'D(E) M R(M) /WF(M) /WF(M)
1 R(NEND) NBEG ITP1'/1X,79('-'))
603 FORMAT(I3,1PD15.7,D10.2,0P,I7,F8.2,1P2D9.1,0PF8.2,I5,I5)
604 FORMAT(' NOTE: for J=',I3,' EO=',F12.4,' .ge. V(',i3,')=',
1 F12.4)
605 FORMAT(/' Solution of radial Schr. equation for E(v=',I3,',J=',
1 I3,') =',F15.7/2x,4(' R(I) WF(I) ')/2X,38('--') )
606 FORMAT(2X,4(F8.3,F11.7))
607 FORMAT('E(v=',I3,',J=',I3,')=',F11.4,I4,' Iter R(M)=',F6.2,
1 ' WF(NBEG=',i5,')/WF(M)=',1PD8.1/36x,'INNER=',I2,5x,
2 'WF(NEND=',i6,')/WF(M)=',D8.1)
608 FORMAT(' *** SCHRQ Error: E=',F9.2,' > V(',I6,')=',F9.2,
1 ' at Rmax=',F7.2,' for IT=',I2)
609 FORMAT(' *** For J=',I3,' E=',1PD15.7," integration can't",
1 ' start till past mesh'/37x,'point',I5,', so RMIN smaller than n
2eeded')
610 FORMAT(/' Attempt to find the highest bound level starting from',
1 ' ETRIAL =',1PD9.2)
611 FORMAT(' *** SCHRQ inward search at J=',i3,' E=',f11.2,
1 ' finds no classical region')
612 FORMAT(/' *** ERROR *** for v =',I3,' J =',I3,' E =',
1 F12.4,' Innermost turning point not found by M = MSAVE =',I5)
613 FORMAT(/' *** ERROR in potential array ... V(I) everywhere',
1 ' too big to integrate with given increment')
614 FORMAT(' *** CAUTION *** For J=',I3,' E=',G15.8/16x,
1 'WF(first)/WF(Max)=',D9.2,' suggests RMIN may be too large')
615 FORMAT(' ** CAUTION ** For J=',I3,' E=',1PD13.6,
1 ' WF(NEND)/WF(Max)=',D8.1,' >',D8.1/4X,'& initialization ',
2 'quality test ',1PD8.1,' > 1.D-3 so RMAX may be too small')
616 FORMAT(' ** WARNING *** For v=',I2,', J=',I3,' at E=',G14.7,
1 ': inward propagation finds no turning point ... Energy too low
2 or potential too weak' )
617 FORMAT(' ** @ J=',I3,' E=',1PD9.2,' SCHRQ has cgce prob at IT=',
1 0P,I3,', so halve DE=',1PD10.2 )
618 FORMAT(' *** For J=',I3,' E=',F9.2,' JWKB start gives SB/SI=',
1 1PD10.3,' so use a node.')
619 FORMAT(1X,79('-'))
620 FORMAT(' *** CAUTION for v=',I3,' J=',I3," SCHRQ doesn't conver
1ge by ITER=",I2,' DE=',1PD9.2)
701 FORMAT(/2x,'Level v=',I3,' J=',I3,' E=',F12.4,' , wave funct
1ion at',I6,' points.'/7x,'R(1-st)=',F12.8,' mesh=',F12.8,
2 ' NBEG=',I4,' |LPRWF|=',I3)
702 FORMAT((1X,4(0Pf9.4,1PD13.5)))
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE QBOUND(KV,JROT,E,EO,VMX,DSOC,V,RMIN,H,GB,GI,SB,SI,N,
1 ITP3,IWR,IQTST,BFCT,IT)
c*
c** Subroutine to initialize quasibound level wave function as Airy
c function at third turning point (if possible). For the theory see
c J.Chem.Phys. 54, 5114 (1971), J.Chem.Phys. 69, 3622-31 (1978)
c----------------------------------------------------------------------
c** IQTST is error flag. *** If (IQTST.lt.0) initialization fails
c so eigenvalue calculation aborts *** (IQTST.gt.0) for successful
c Airy function initialization. *** (IQTST=0) if Airy function
c initialization prevented because 3-rd turning point beyond
c range, so that WKB initialization is used.
c----------------------------------------------------------------------
INTEGER I,II,IQTST,IT,ITP3,IWR,J,JROT,K,KV,N
REAL*8 A1,A2,A13,A23,BFCT,
1 C1A,C2A,DF,DSOC,E,EO,FBA,FIA,FJ,GB,GBA,GI,GIA,H,
2 RMIN,RMINN,SB,SI,SL,V(N),VMX,VMXPR,XJ1
DATA C1A/0.355028053887817D0/,C2A/0.258819403792807D0/
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IQTST=1
RMINN=RMIN-H
c** Start by searching for third turning point.
J=N
IF(V(N).GT.E) GO TO 22
DO I=2,N
J=J-1
IF(V(J).GT.E) GO TO 10
ENDDO
GO TO 14
10 II=J
c** Check that there is a classically allowed region inside this point
c and determine height of barrier maximum.
VMX=DSOC
DO I=2,J
II=II-1
IF(V(II).LE.E) GO TO 16
IF(V(II).GT.VMX) VMX=V(II)
ENDDO
c** Energy too high ... find no more than one turning point.
14 XJ1=RMINN+J*H
c ... Search outward for barrier height to facilitate energy correction
IF(J.EQ.1) J= 2
K=J-1
DO I=J,N
IF(V(I).GT.V(K)) GO TO 120
K=I
ENDDO
VMX=V(K)
GO TO 130
120 K=K+2
J=K-1
DO I=K,N
IF(V(I).LT.V(J)) GO TO 126
J=I
ENDDO
126 VMX=V(J)
130 VMXPR=VMX/BFCT
IF(IWR.NE.0) WRITE(6,608) JROT,EO,VMXPR,XJ1
ITP3= J
IQTST=-1
GO TO 100
16 ITP3= J+1
c** ITP3 is the first mesh point outside classically forbidden region
GB=V(ITP3)-E
GI=V(ITP3-1)-E
FJ=GI/(GI-GB)
c** Treat quasibound levels as bound using outer boundary condition
c of Airy function at third turning point ... as discussed by
c R.J.Le Roy and R.B.Bernstein in J.Chem.Phys. 54,5114(1971).
c Uses series expansions of Abramowitz & Stegun Eq.(10.4.3)
SL=(GI-GB)**(1.d0/3.d0)/H
IF((SL*H).LT.1.d0) THEN
A1=GI/(SL*H)**2
A2=GB/(SL*H)**2
A13=A1*A1*A1
A23=A2*A2*A2
FIA= 1.d0+ A13*(A13*(A13+72.D0)+2160.D0)/12960.D0
GIA=A1+A1*A13*(A13*(A13+90.D0)+3780.D0)/45360.D0
FBA= 1.d0+ A23*(A23*(A23+72.D0)+2160.D0)/12960.D0
GBA=A2+A2*A23*(A23*(A23+90.D0)+3780.D0)/45360.D0
c** Airy function Bi(X) at points straddling 3-rd turning point
SI=C1A*FIA+C2A*GIA
SB=C1A*FBA+C2A*GBA
GO TO 100
ENDIF
c** If Airy function expansion unreliable, use zero slope at third
c turning point as quasibound outer boundary condition.
DF=GI-GB
SI= 1.d0+ DF*FJ**3/6.d0
SB= 1.d0 -DF*(1.d0- FJ)**3/6.d0
IF(IWR.NE.0) WRITE(6,606) KV,JROT,EO,IT
GO TO 100
c** If 3-rd turning point beyond range start with WKB wave function
c at end of range.
22 IF(IWR.NE.0) WRITE(6,607) JROT,EO
ITP3= N
IQTST=0
GB=V(ITP3)-E
GI=V(ITP3-1)-E
VMX=V(ITP3)
II=ITP3
DO I=2,ITP3
II=II-1
IF(V(II).LT.VMX) GO TO 100
VMX=V(II)
ENDDO
IF(IWR.NE.0) WRITE(6,604)
c** End of quasibound level initialization schemes.
IQTST=-9
100 RETURN
604 FORMAT(" **** QBOUND doesn't work ... no classically allowed regio
1n accessible at this energy.")
606 FORMAT(' *** CAUTION *** v=',I3,' J=',I3,' E=',1PD13.6,
1 ' IT=',I2/5x,'Airy initialization unstable so use zero slope',
2 'at R(3-rd)' )
607 FORMAT(' *** For J=',I3,' E=',F9.2,
1 ' R(3-rd) > RMAX & E < V(N) so try WKB B.C. @ RMAX')
608 FORMAT(' For J=',I3,' ETRY=',F11.4,' > VMAX=',F11.4,
1 ' find onee turn point: R=',F6.2)
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
c** Subroutine to calculates quasibound level tunneling lifetime/width
c** For relevant theory see Le Roy & Liu [J.Chem.Phys.69,3622-31(1978)]
c and Connor & Smith [Mol.Phys. 43, 397 (1981)] and Huang & Le Roy
c [J.Chem.Phys. 119, 7398 (2003); Erratum, ibid, 126, 169904 (2007)]
c** Final level width calculation from Eq.(4.5) of Connor & Smith.
c Rearranged slightly for consistency with PotFit derivatives 9/05/02
c-----------------------------------------------------------------------
SUBROUTINE WIDTH(KV,JROT,E,EO,DSOC,V,S,VMX,RMIN,H,BFCT,IWR,ITP1,
1 ITP3,INNER,N,GAMA)
c++ "WIDTH" calls subroutine "LEVQAD" ++++++++++++++++++++++++++++++++++
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INTEGER I,IMM,INNER,IRM,ITP1,ITP1P,ITP1P1,ITP2,ITP2M,ITP2M2,
1 ITP2P1,ITP2P2,ITP3,IWR,JROT,KV,KVI,KVO,
2 M,M2,N,NN,NST
REAL*8 ANS1,ANS2,ARG,BFCT,COR,
1 D1,D2,D3,DFI,DSGB,DSGN,DSOC,DWEB,OMEGJC,
2 E,EO,EMSC,EMV,G1,G2,G3,GA,GAMA,GAMALG,
3 H,H2,HBW,HBWB,PI,PMX,RMIN,RMINN,RMX,RT,RT1,RT2,
4 S(N),SM,TAU,TAULG,TI,TUN0,U1,U2,V(N),VMAX,VMX,
7 XJ,XX
CHARACTER*5 LWELL(2)
DATA PI/3.141592653589793D0/
DATA LWELL/'INNER','OUTER'/
RMINN= RMIN- H
H2= H*H
c** ITP1 is first mesh point to right of innermost turning point.
40 ITP1P= ITP1+ 1
ITP1P1= ITP1P+ 1
IRM= ITP1- 1
c** Calculate JWKB tunneling probability from quadrature over barrier
c** First must locate 2-nd turning point.
DO I= ITP1P1,ITP3
ITP2= I
IF(V(I).GT.E) GO TO 202
ENDDO
GAMA= 0.d0
GO TO 250
202 ITP2P1= ITP2+ 1
ITP2P2= ITP2+ 2
c** ITP2M is the last mesh point before the 2-nd turning point.
ITP2M= ITP2- 1
ITP2M2= ITP2- 2
G1= V(ITP2M)- E
G2= V(ITP2)- E
GA= V(ITP2P1)- E
c** Quadrature over barrier starts here.
CALL LEVQAD(G1,G2,GA,H,RT,ANS1,ANS2)
SM= ANS2/H
IF(GA.LT.0.d0) GO TO 218
SM= SM+ 0.5d0*DSQRT(GA)
PMX= VMX
M2= ITP2P2
204 DO I=M2,ITP3
M= I
GA= V(I)- E
IF(V(I).GT.PMX) PMX=V(I)
IF(GA.LT.0.d0) GO TO 210
SM= SM+ DSQRT(GA)
ENDDO
IF(V(M).GT.V(M-1)) THEN
IF(IWR.NE.0) WRITE(6,602) KV,JROT
GO TO 250
ENDIF
RMX= RMINN+ M*H
U1= DSQRT(GA/(V(M)- DSOC))
U2= DSQRT((E- DSOC)/(V(M)- DSOC))
SM= SM- 0.5d0*DSQRT(GA)+ (DLOG((1.d0+U1)/U2)-U1)*RMX*
1 DSQRT(V(M)- DSOC)/H
XJ= (DSQRT(1.d0+ 4.d0*(V(M)-DSOC)*(RMX/H)**2)- 1.d0)*0.5d0
IF(IWR.NE.0) WRITE(6,603) JROT,EO,XJ,RMX
GO TO 218
210 IF(M.LT.ITP3) THEN
c** If encounter a double-humped barrier, take care here.
IF(IWR.NE.0) WRITE(6,609) KV,JROT,EO,M
KVO= 0
DSGN= DSIGN(1.d0,S(M-1))
c** Find the effective quantum number for the outer well
DO I= M,ITP3
DSGB= DSGN
DSGN= DSIGN(1.d0,S(I))
IF((DSGN*DSGB).LT.0.d0) KVO=KVO+1
ENDDO
KVI= KV- KVO
IF(INNER.EQ.0) THEN
c** For levels of outer well, get correct width by changing ITP1
ITP1= M
IF(IWR.GT.0) WRITE(6,610) KVO,LWELL(2)
GO TO 40
ENDIF
IF(IWR.GT.0) WRITE(6,610) KVI,LWELL(1)
c** For "inner-well" levels, locate outer barrier
DO I= M,ITP3
M2= I
GA= V(I)- E
IF(GA.GE.0.d0) GO TO 204
ENDDO
GO TO 218
ENDIF
G3= V(M-2)- E
G2= V(M-1)- E
CALL LEVQAD(GA,G2,G3,H,RT,ANS1,ANS2)
SM= SM- 0.5d0*DSQRT(G3)-DSQRT(G2) + ANS2/H
218 EMSC= -SM/PI
IF(INNER.GT.0) VMX= PMX
VMAX= VMX/BFCT
c** Tunneling factors calculated here ** TUN0 is simple WKB result
c as in Child's eqs.(57c) & (59).
c ..... EPSRJ= -2.* PI* EMSC
TUN0= 0.5d0*DEXP(2.d0*PI*EMSC)
c ... for permeability calculate Connor-Smith's Eq.(3.7) \omega=OMEGJC
OMEGJC= DSQRT(1.d0+ 2.d0*TUN0) - 1.d0
c ... alternate calculation to give better precision for small TUN0
IF(TUN0.LT.1.d-5) OMEGJC= TUN0*(1.d0-0.5d0*TUN0*(1.d0-TUN0))
OMEGJC= 4.d0*OMEGJC/(OMEGJC + 2.d0)
c** Quadrature for JWKB calculation of vibrational spacing in well HBW
D1= E- V(IRM)
D2= E- V(ITP1)
D3= E- V(ITP1P)
CALL LEVQAD(D1,D2,D3,H,RT,ANS1,ANS2)
RT1= RT
SM= ANS1/H
IF(D3.LT.0.d0) GO TO 228
SM= SM+ 0.5d0/DSQRT(D3)
DO I= ITP1P1,ITP2M2
IMM= I
EMV= E- V(I)
IF(EMV.LT.0.d0) GO TO 222
SM= SM+ 1.d0/DSQRT(EMV)
ENDDO
D3= E- V(ITP2M2)
D2= E- V(ITP2M)
D1= E- V(ITP2)
GO TO 226
c** If encounter a double-minimum well, take care here.
222 D1= EMV
D2= E- V(IMM-1)
D3= E- V(IMM-2)
IF(IWR.NE.0) WRITE(6,605) KV,JROT,EO
226 CALL LEVQAD(D1,D2,D3,H,RT,ANS1,ANS2)
RT2=RT
SM=SM-0.5d0/DSQRT(D3) + ANS1/H
c** Get HBW in same energy units (1/cm) associated with BFCT
228 HBW=2.d0*PI/(BFCT*SM)
c** HBW fix up suggested by Child uses his eqs.(48)&(62) for HBW
c** Derivative of complex gamma function argument calculated as
c per eq.(6.1.27) in Abramowitz and Stegun.
NST= INT(DABS(EMSC)*1.D2)
NST= MAX0(NST,4)
ARG= -1.963510026021423d0
DO I= 0,NST
NN= I
XX= I + 0.5d0
TI= 1.d0/(XX*((XX/EMSC)**2 + 1.d0))
ARG= ARG+TI
IF(DABS(TI).LT.1.D-10) GO TO 233
ENDDO
c ... and use continuum approximation for tail of summation (???)
233 COR= 0.5d0*(EMSC/(NN+1.d0))**2
ARG= ARG+ COR- COR**2
c** Now use WKL's Weber fx. approx for (?) derivative of barrier integral ..
DWEB= (EO-VMAX)*BFCT/(H2*EMSC)
DFI= (DLOG(DABS(EMSC)) - ARG)*BFCT/(H2*DWEB)
HBWB= 1.d0/(1.d0/HBW + DFI/(2.d0*PI))
c** Width from formula (4.5) of Connor & Smith, Mol.Phys.43,397(1981)
c [neglect time delay integral past barrier in their Eq.(4.16)].
IF(EMSC.GT.-25.D0) THEN
GAMA= (HBWB/(2.d0*PI))* OMEGJC
TAU= 0.D0
IF(GAMA.GT.1.D-60) TAU= 5.308837457D-12/GAMA
c** GAM0 = TUN0*HBW/PI is the simple WKB width GAMMA(0) discussed by
c Le Roy & Liu in J.C.P.69,3622(1978).
IF(IWR.GT.0) WRITE(6,601) TAU,GAMA,HBWB,VMAX
ELSE
GAMALG= DLOG10(HBWB/(2.d0*PI))+2.d0*PI*EMSC/2.302585093D0
TAULG= DLOG10(5.308837457D-12)-GAMALG
IF(IWR.GT.0) WRITE(6,611) TAULG,GAMALG,HBWB,VMAX
ENDIF
250 RETURN
601 FORMAT(' Lifetime=',1PD10.3,'(s) Width=',D10.3,' dG/dv=',
1 0PF7.2,' V(max)=',F9.2)
602 FORMAT(' *** WARNING *** For v =',I3,' J =',I3,' cannot cal
1culate width since barrier maximum beyond range')
603 FORMAT(' *** For J=',I3,' E=',F9.2,' R(3-rd) beyond range so tu
1nneling calculation uses'/8X,'pure centrifugal potential with J(a
2pp)=',F7.2,' for R > R(max)=',F7.2)
605 FORMAT(' **** CAUTION *** Width estimate only qualitative, as have
1 a double-minimum well for E(v=',I3,', J=',I3,')=',F15.7/15X,
2 'a more stable result may be obtained by searching for the quasib
3ound levels using option: INNER > 0 .')
609 FORMAT(' *** CAUTION - Permeability estimate not exact as have a d
1ouble-humped barrier: E(v=',I3,', J=',I3,') =',G15.8,I6)
610 FORMAT(16X,'(NOTE: this has the node count of a v=',I3,2X,A5,
1 '-well level')
611 FORMAT(12X,'Log10(lifetime/sec)=',F10.5,' ; Log10(width/cm-1)=',
1 F10.5,' dG/dv=',G12.5,' V(max)=',G14.7,'(cm-1)')
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE LEVQAD(Y1,Y2,Y3,H,RT,ANS1,ANS2)
c** Subroutine "LEVQAD" fits quadratic Y = A + B*X + C*X**2 through
c function values Y1, Y2, Y3 at equally spaced points separated by
c distance H, where Y1 < 0 and (Y2,Y3 .ge.0), locates the function
c zero (at RT, relative to X1 < X2 = 0) between points X1 & X2, and
c evaluates the integral from RT to R3 of 1/sqrt(Y) , called
c ANS1, and the integral (same range) of sqrt(Y) , which is ANS2
c** Alternately, if Y1 & Y3 both < 0 and only the middle point
c Y2.ge.0 , fit the points to: Y = A - B*(X-X0)**2 , locate the
c turning points between which Y(X) > 0 and evaluate these integrals
c on this interval.
c-----------------------------------------------------------------------
REAL*8 A,ANS1,ANS2,B,C,CQ,H,HPI,R1,R2,RCQ,RR,RT,SL3,SLT,
1 X0,Y1,Y2,Y3,ZT
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DATA HPI/1.570796326794896D0/
IF((Y1.GE.0).OR.(Y2.LT.0)) GO TO 99
IF(Y3.LT.0.d0) GO TO 50
c** Here treat case where both 'Y2' & 'Y3' are positive
IF(DABS((Y2-Y1)/(Y3-Y2) -1.D0).LT.1.d-10) THEN
c ... special case of true (to 1/10^10) linearity ...
RT= -H*Y2/(Y2-Y1)
ANS1= 2.d0*(H-RT)/DSQRT(Y3)
ANS2= ANS1*Y3/3.D0
RETURN
ENDIF
C= (Y3-2.d0*Y2+Y1)/(2.d0*H*H)
B= (Y3-Y2)/H-C*H
A= Y2
CQ= B**2- 4.d0*A*C
RCQ= DSQRT(CQ)
R1= (-B-RCQ)/(2.d0*C)
R2= R1+ RCQ/C
IF((R2.LE.0.d0).AND.(R2.GE.-H)) RT=R2
IF((R1.LE.0.d0).AND.(R1.GE.-H)) RT=R1
SL3= 2.d0*C*H+B
SLT= 2.d0*C*RT+B
IF(C.LT.0.d0) GO TO 10
ANS1= DLOG((2.d0*DSQRT(C*Y3)+SL3)/SLT)/DSQRT(C)
GO TO 20
10 ANS1= -(DASIN(SL3/RCQ)- DSIGN(HPI,SLT))/DSQRT(-C)
20 ANS2= (SL3*DSQRT(Y3)- CQ*ANS1/2.d0)/(4.d0*C)
IF(RT.GE.H) WRITE(6,601) H,R1,R2
601 FORMAT(' *** CAUTION *** in LEVQAD, turning point not between poin
1ts 1 & 2. H =',F9.6,' R1 =',F9.6,' R2 =',F9.6)
RETURN
c** Here treat case when only 'Y2' is non-negative
50 RR= (Y2-Y1)/(Y2-Y3)
X0= H*(RR-1.d0)/((RR+1.d0)*2.d0)
B= (Y2-Y1)/(H*(2.d0*X0+H))
A= Y2+ B*X0**2
ZT= DSQRT(A/B)
RT= X0- ZT
ANS1= 2.d0*HPI/DSQRT(B)
ANS2= ANS1*A*0.5d0
RETURN
99 WRITE(6,602) Y1,Y2
602 FORMAT(' *** ERROR in LEVQAD *** No turning point between 1-st two
1 points as Y1=',D10.3,' Y2=',D10.3)
ANS1= 0.d0
ANS2= 0.d0
RETURN
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE PREPOT(LNPT,IAN1,IAN2,IMN1,IMN2,NPP,OMEGA,RR,
1 RM2,VLIM,VV,NCN)
c** Driver subroutine of package to read parameters and/or generate
c values of a potential V(I) at the NPP input distances RR(I).
c====================== Version of 26 Nov 2013 ========================
c**** Subroutine Input:
c----------------------
c LNPT is an integer specifying the operational mode:
c * LNPT > 0 : for a new case for which all potential-defining
c parameters are read in and a description printed
c * LNPT.le.0 : if potential points are to be generated in exactly
c the same manner as on preceding call, but at
c different distances RR(I) (no reads or writes)
c IAN1 & IAN2 are the atomic numbers and IMN1 & IMN2 the mass numbers
c of atoms #1 & 2, used (if needed) to specify isotope masses for
c calculating adiabatic and/or non-adiabatic BOB correction fx.
c NPP (integer) is the number of input distances RR(i) (in Angstroms)
c at which potential values VV(i) (in cm-1) are to be generated
c RR (real array) is set of NPP distances where potential calculated
c RM2 (real array) on input is the (centrifugal) array of 1/RR(i)**2
c----------------------
c**** Subroutine Output:
c----------------------
c OMEGA is the (integer) electronic angular momentum projection q.no.
c VLIM (cm-1) is the absolute energy at the potential asymptote
c VV (real 1D array) is the set of function values generated (in cm-1)
c RM2 values returned are (if appropriate) be modified to include BOB
c corrections to the (centrifugal) potential 1/RR(i)**2
c NCN is an integer power defining the asymptotically-dominant
c inverse-power long-range potential tail: CNN/R**NCN
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c+ Calls GENINT (which calls PLYINTRP, SPLINT & SPLINE) , or POTGEN ++
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** Set maximum array dimension for the input function values to be
c interpolated over & extrapolated beyond
cc INCLUDE 'arrsizes.h' !! note: needed for NPTMX & NDIMR
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c** This 'Block' Data Utility routine that governs array dimensioning
c in program LEVEL16 must reside with the name 'arrsizes.h' in the
c same directory containing the FORTRAN file(s) for this Program when
c it is being compiled, **OR** be incorporated into the program
c wherever the statement 'INCLUDE arrsizes.h' appears !!
c-----------------------------------------------------------------------
INTEGER NDIMR, NVIBMX, NTPMX, MAXSP, MORDRMX, RORDR, NbetaMX,
1 LMAX, NBOBmx, NCMMAX
c** NDIMR is maximum size of PEC, wavefx, and various radial arrary
PARAMETER (NDIMR= 250001)
c** NVIBMX is the maximum no. vibrational levels, or rotational sublevel
c for a given 'v' whose energies may be generated and stored
PARAMETER (NVIBMX= 400)
c** NTPMX is maximum no. of PEC or TMF points that may be read-in and
c interplated over; MAXSP = no. cubic spline cfts for these NTPMX pts.
PARAMETER (NTPMX= 2000, MAXSP=4*NTPMX)
c** RORDR is maximum order of rot. constants generated for each vib level
PARAMETER (RORDR = 7)
c** MORDRMX is maximum polynomial order for TMF or martix element argument
PARAMETER (MORDRMX = 20)
c** NbetaMX is the largest no. PEC exponent polynomial parameter
PARAMETER (NbetaMX = 50, LMAX= NbetaMX)
c** NBOBmx is the largest no. of BOB expansion parameters
PARAMETER (NBOBmx = 20)
c** NCMMax is max. no. long-range inverse-power PEC coeffts. allowed
PARAMETER (NCMMax= 20)
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c----------------------------------------------------------------------
INTEGER I,J,IAN1,IAN2,IMN1,IMN2,INPTS,ILR,IR2,JWR,LNPT,LPPOT,LWR,
1 NCN,NLIN,NPP,NROW,NTP,NUSE, OMEGA
REAL*8 RFACT,EFACT,RH,RMIN,VLIM,VSHIFT,CNN, VV(NDIMR),RR(NDIMR),
1 RM2(NDIMR),XI(NTPMX),YI(NTPMX),RWR(20),RWRB(3),VWR(20),VWRB(3),
2 D1V(3),D1VB(3),D2V(3),D2VB(3),D3V(3)
c
c** Save variables needed for 'subsequent' LNPT.le.0 calls
SAVE ILR,IR2,LPPOT,NTP,NUSE
SAVE CNN,VSHIFT,XI,YI
c
LPPOT= 0
c
IF(LNPT.GT.0) THEN
c** If NTP > 0 define potential by interpolation over & extrapolation
c beyond the NTP read-in turning points using subroutine GENINT
c If NTP.le.0 generate a (fully analytic) potential in POTGEN.
c** If LPPOT > 0 at every |LPPOT|-th point, print potential and
c derivatives-by-differences. *** If LPPOT < 0 write potential
c at every |LPPOT|-th point to channel-8 in a compact format **
c OMEGA is the (integer) total elextronic angular momentum projection
c quantum number (required for proper rotational intensities)
c** VLIM [cm-1] is the energy associated with the potential asymptote.
c-----------------------------------------------------------------------
READ(5,*) NTP, LPPOT, OMEGA, VLIM
c-----------------------------------------------------------------------
WRITE(6,600) OMEGA,VLIM
IF(NTP.GT.0) THEN
c** For a pointwise potential (NTP > 0), now read points & parameters
c controlling how the interpolation/extrapolation is to be done.
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** NTP (read above) is number of turning points (XI,YI) to be read in.
c** If NUSE > 0 interpolate with NUSE-point piecewise polynomials
c (usually choose NUSE even, say, = 6, 8 or 10). *** If(NUSE.EQ.0)
c interpolate with cubic spline instead of local polynomials.
c** If NTP > NTPMX and NUSE < 0 read in potential function array in
c final form in cm-1 on mesh RH
c** If IR2 > 0 interpolate over YI*XI**2 ; otherwise on YI itself
c IR2 > 0 usually improves interpolation for steep repulsive wall]
c** ILR specifies how to extrapolate beyond largest input distance XI(i)
c If ILR < 0 fit last 3 points to: VLIM - A*exp(-b*(R-R0)**2)
c If ILR = 0 fit last 3 points to: VLIM - A*R**p *exp(-b*R)
c If ILR = 1 fit last two points to: VLIM - A/R**B .
c** If(ILR > 1) fit last turning points to: VLIM - sum{of ILR
c inverse-power terms beginning with 1/R**NCN}. *** If CNN.ne.0 ,
c leading coefficient fixed at CNN ; otherwise get it from points too.
c* Assume read-in CNN value has units: [(cm-1)(Angstroms)**'NCN'].
c* If ILR = 2 or 3 , successive higher power terms differ by 1/R**2
c* If ILR > 3 : successive higher power terms differ by factor 1/R
c-----------------------------------------------------------------------
READ(5,*) NUSE, IR2, ILR, NCN, CNN
c-----------------------------------------------------------------------
IF(NTP.GT.NTPMX) THEN
c** If interpolation being requested, but the number of input points
c exceeds the array size, print a warning and stop.
IF(NUSE.GE.0) THEN
WRITE(6,602) NTP,NTPMX
STOP
ENDIF
c+++++++++++++++++++++++++++++++++++++++++++++++++
c** IF NTP > NTPMX, and NUSE < 0 read in the full final array of NTP
c mesh points {RR(i),VV(i)} in Angst., cm-1.
NPP= NTP
READ(5,*) (RR(I),VV(I),I= 1, NPP)
WRITE(6,626) NPP,RR(1),RR(NPP)
626 FORMAT(/' Potential defined by',I6,'-point input array'/5x,
1 ' on the range ',f9.6,' to',f11.6,'[Angst.] with no interpolati
2on')
DO I= 1,NPP
VV(I)= VV(I)+ VLIM
ENDDO
GOTO 20
ENDIF
IF(NUSE.GT.0) WRITE(6,604) NUSE,NTP
IF(NUSE.LE.0) WRITE(6,606) NTP
IF(IR2.GT.0) WRITE(6,608)
IF((ILR.GT.1).AND.(DABS(CNN).GT.0.D0))WRITE(6,610)CNN,NCN
c** Read in turning points to be interpolated over
c** RFACT & EFACT are factors required to convert units of input turning
c points (XI,YI) to Angstroms & cm-1, respectively (may be = 1.d0)
c** Turning points (XI,YI) must be ordered with increasing XI(I)
c** Energy VSHIFT [cm-1] is added to the input potential points to
c make their absolute energy consistent with VLIM (often VSHIFT=Te).
c-----------------------------------------------------------------------
READ(5,*) RFACT, EFACT, VSHIFT
READ(5,*) (XI(I), YI(I), I= 1,NTP)
c-----------------------------------------------------------------------
WRITE(6,612) VSHIFT, RFACT, EFACT
NROW= (NTP+2)/3
DO J= 1,NROW
IF(EFACT.LE.10.D0) THEN
WRITE(6,614) (XI(I),YI(I),I= J,NTP,NROW)
ELSE
WRITE(6,616) (XI(I),YI(I),I= J,NTP,NROW)
ENDIF
ENDDO
WRITE(6,624)
DO I= 1,NTP
YI(I)= YI(I)*EFACT+ VSHIFT
XI(I)= XI(I)*RFACT
ENDDO
IF(IR2.GT.0) THEN
DO I= 1,NTP
YI(I)= YI(I)*XI(I)**2
ENDDO
ENDIF
IF((DABS(YI(NTP)-YI(NTP-1)).LE.0).AND.
1 (XI(NTP).LT.RR(NPP))) WRITE(6,618)
ENDIF
ENDIF
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
IF(NTP.GT.0) THEN
CALL GENINT(LNPT,NPP,RR,VV,NUSE,IR2,NTP,XI,YI,VLIM,ILR,
1 NCN,CNN)
ELSE
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** If (NTP.le.0) PREPOT uses subroutine POTGEN to generate a fully
c analytic potential defined by the following read-in parameters.
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c* Potentials generated in cm-1 with equilibrium distance REQ [Angst.],
c and for all cases except IPOTL=2, the potential asymptote energy is
c VLIM and well depth is DSCM. For IPOTL=2, VLIM is the energy at the
c potential minimum and DSCM the leading (quadratic) potential coeft.
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c** IPOTL specifies the type of potential function to be generated.
c** PPAR, QPAR, APSE, Nbeta & NCMM integers characterize chosen potential
c** IBOB specifies whether (if > 0) or not (if .le. 0) atomic mass-
c dependent Born-Oppenheimer breakdown corrections will be included
c- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
c** If IPOTL=1 generate an L.J.(PPAR,QPAR) potential.
c** If IPOTL=2 use Seto's modification of Surkus' GPEF expansion in
c z = [R**PPAR - Re**PPAR]/[a*R**PPAR + b*Re**PPAR] where
c a=PARM(Nbeta+1) & b=PARM(Nbeta+2), which incorporates Dunham, SPF,
c O-T and other forms: V(z) = c_0 z^2 [1 + c_1 z + c_2 z^2 + ...]
c where c_0[cm-1] is read in as DSCM and the first Nbeta parameters
c PARM(i)'s are the c_i (i > 0). [PPAR is dummy parameter here]
c * For Dunham case: PPAR=1, PARM(Nbeta+1)= 0.0, PARM(Nbeta+2)= 1.0
c * For SPF case: PPAR=1, PARM(Nbeta+1)= 1.0, PARM(Nbeta+2)= 0.0
c * For Ogilvie-Tipping: PPAR=1, PARM(Nbeta+1)= 0.5 = PARM(Nbeta+2)
c * NOTE that for Surkus PPAR < 0 case: z(PPAR,a,b)= z(|PPAR|,-b,-a)
c Generate & return the D_e value implied by these coefficients.
c** If IPOTL=3 generate a Morse or Extended Morse Oscillator potential
c with exponent factor 'beta' defined as a power series of order
c max{NLR,NSR} with (max{NLR,NSR}+1) coefficients PARM(i) in vble
c y_{QPAR}= (R**QPAR - Rref**QPAR)/(R**QPAR + Rref**QPAR)
c where QPAR.ge.1 and inputing Rref.le.0 sets Rref= REQ.
c PPAR is a dummy variable. ** For the conventional "simple" Morse
c potential, Nbeta=0 and QPAR is a also dummy variable
c* Special option #1: set QPAR=0 to produce Wei Hua's 4-parameter
c modified Morse function with b= PARM(1) and C= PARM(2).
c** If IPOTL=4 generate an MLR potential [Mol.Phys. 105, 691 (2007);
c ibid, 109, 435 (2011)]. If APSE.LE.0 write its exponent
c coefficient function as the constrained polynomial:
c beta(r)= yp*beta_{infty} + [1-yp]*Sum(beta_i{yq}^i in which
c yp= y_{PPAR}= (R**PPAR - Rref**PPAR)/(R**PPAR + Rref**PPAR) ,
c yq= y_{QPAR}= (R**QPAR - Rref**QPAR)/(R**QPAR + Rref**QPAR) ,
c and the polynomial order is Nbeta, so NVARB= [Nbeta+1]. The
c long-range defined by NCMM inverse-power terms CMM(i)/r^{MMLR(i)}
c that may also include dapming functions.
c** If IPOTL=5 generate a Double-Exponential Long-Range (DELR)
c potential [JCP 119, 7398 (2003)] with additive long-range part
c defined by a sum of NCMM undamped or damped inverse-power terms,
c and an exponent coefficient defined as a simple power series in
c y_q^{Rref}(r), as for the EMO case (IPOTL=3)
c** If IPOTL=6 generate generalized HFD({m_i},i=1,NCMM) potential.
c PARM(1-3) are the parameters defining the HFD damping function
c D(x)=exp[-pparm(1)*(PARM(2)/x - 1)**PARM(3)] {for x < PARM(2)}
c PARM(4) the quadratic coefficient in the exponent, and
c PARM(5) is the power of x=R/Req multiplying the repulsive term
c AREP*x**PARM(5) *exp[-beta*x - PARM(4)*x**2]
c** If IPOTL=7 generate Tang-Toennies type potential with NCMM attractive
c damped inverse-power terms D_m(r)*CMM(j)/r**MMLR(j).
c Setting IDF=+2 dnd IDSTT < 0 yields traditional TT damping.
c (a) IF QPAR.le.2 conventional TT function with exponent/damping
c coefficient PARM(2) [Angst^{-1}]. If read-in PARM(1).le.0
c internally determine PARM(1) & PARM(2) from REQ & DSCM
c (b) IF QPAR.gt.0 generate Bich/Vogel modified TT function with
c exponent coefft: PARM(3)*r + PARM(4)*r^2 + PARM(5)/r + PARM(6)/r^2
c** If IPOTL=8 use Tiemann polynomial potential of order NLR with NLR+1
c expansion coefficients a(i) attached to an inverse-power long-range
c tail defined by NCMM read-in coefficients plus one additional term,
c and an 1/R^{12} (or exponential) inner wall. NVARB= NLR+4.
c** IBOB selects whether (IBOB > 0) or not BOB terms are to be included
c** For IPOTL > 3, NCMM is the number of inverse-power long-range terms
c CMM(i)/r**MMLR(i)
c rhoAB > 0 invokes inclusion of damping function
c IDSTT > 0 selects Douketis-type damping function
c IDSTT .le. 0 selects Tang-Toennies-type damping fx.
c & IDF defines limiting short-range behaviour as r**(IDF/2)
c----------------------------------------------------------------------
c++ READ(5,*) IPOTL, PPAR, QPAR, APSE, Nbeta, IBOB
c++ READ(5,*) DSCM, REQ, Rref
c++ IF(IPOTL.GT.3) READ(5,*) NCMM, rhoAB, sVSR2, IDSTT
c++ IF(IPOTL.GT.3) READ(5,*) (MMLR(I), CMM(I),I= 1,NCMM)
c++ IF(NVARB.GT.0) READ(5,*) (PARM(I), I=1,NVARB)
c++ IF(IBOB.GT.0) THEN
c++ READ(5,*) MN1R, MN2R, PAD, QAD, NU1, NU2, PNA, NT1, NT2
c++ IF(NU1.GE.0) READ(5,*) U1INF, (U1(I), I=0,NU1)
c++ IF(NU2.GE.0) READ(5,*) U2INF, (U2(I), I=0,NU2)
c++ IF(NT1.GE.0) READ(5,*) T1INF, (T1(I), I=0,NT1)
c++ IF(NT2.GE.0) READ(5,*) T2INF, (T2(I), I=0,NT2)
c++ ENDIF
c++ ENDIF
c-----------------------------------------------------------------------
NCN= 99
CALL POTGEN(LNPT,NPP,IAN1,IAN2,IMN1,IMN2,VLIM,RR,RM2,VV,
1 NCN,CNN)
ENDIF
20 IF(LPPOT.NE.0) THEN
c** If desired, on the first pass (i.e. if LNPT > 0) print the potential
RH= RR(2)-RR(1)
INPTS= IABS(LPPOT)
IF(LPPOT.LT.0) THEN
c** Option to write resulting function compactly to channel-8.
RMIN= RR(1)
NLIN= NPP/INPTS+ 1
WRITE(8,800) NLIN,VLIM
WRITE(8,802) (RR(I),VV(I),I= 1,NPP,INPTS)
ELSE
c** Option to print potential & its 1-st three derivatives, the latter
c calculated by differences, assuming equally spaced RR(I) values.
DO I= 1,3
RWRB(I)= 0.d0
VWRB(I)= 0.d0
D1V(I)= 0.d0
ENDDO
WRITE(6,620)
NLIN= NPP/(2*INPTS)+1
RH= INPTS*RH
DO I= 1,NLIN
LWR= 1+ INPTS*(I-1)
DO J= 1,2
JWR= LWR+(J-1)*NLIN*INPTS
IF(JWR.LE.NPP) THEN
RWR(J)= RR(JWR)
VWR(J)= VV(JWR)
D1V(J)= (VWR(J)-VWRB(J))/(RWR(J)-RWRB(J))
VWRB(J)= VWR(J)
D2V(J)= (D1V(J)-D1VB(J))/(RWR(J)-RWRB(J))
D1VB(J)= D1V(J)
D3V(J)= (D2V(J)-D2VB(J))/(RWR(J)-RWRB(J))
RWRB(J)= RWR(J)
D2VB(J)= D2V(J)
ELSE
RWR(J)= 0.d0
VWR(J)= 0.d0
ENDIF
IF(I.LE.2) THEN
D2V(J)= 0.d0
IF(I.EQ.1) D1V(J)= 0.d0
ENDIF
ENDDO
WRITE(6,622) (RWR(J),VWR(J),D1V(J),D2V(J),D3V(J),
1 J= 1,2)
ENDDO
ENDIF
ENDIF
IF(LNPT.GT.0) WRITE(6,624)
RETURN
600 FORMAT(' State has OMEGA=',i2,' and energy asymptote: Y(lim)=
1',F12.5,'(cm-1)')
602 FORMAT(/' **** ERROR in dimensioning of arrays required'
1 ,' by GENINT; No. input points ',I5,' > NTPMX =',I4)
604 FORMAT(' Perform',I3,'-point piecewise polynomial interpolation ov
1er',I5,' input points' )
606 FORMAT(' Perform cubic spline interpolation over the',I5,
1 ' input points' )
608 FORMAT(' Interpolation actually performed over modified input arra
1y: Y(I) * r(I)**2')
610 FORMAT( ' Beyond read-in points extrapolate to limiting asymptotic
1 behaviour:'/20x,'Y(r) = Y(lim) - (',D16.7,')/r**',I2)
612 FORMAT(' To make input points Y(i) consistent with Y(lim), add'
1 ,' Y(shift)=',F12.4/' Scale input points: (distance)*',
2 1PD16.9,' & (energy)*',D16.9/13x,'to get required internal unit
3s [Angstroms & cm-1 for potentials]'/
4 3(' r(i) Y(i) ')/3(3X,11('--')))
614 FORMAT((3(F13.8,F12.4)))
616 FORMAT((3(F12.6,F13.8)))
618 FORMAT(/' !!! CAUTION !!! Last two mesh point YI values are equa
1l'/17x,'so extrapolation to large r will be unreliable !!!'/)
620 FORMAT(/' Function and first 2 derivatives by differences'/
1 2(' r Y(r) d1Y/dr1 d2Y/dr2 d3Y/dr3')/
2 2(2X,25('--')))
622 FORMAT(2(0PF8.3,F11.3,1PD11.3,2D11.3))
c 622 FORMAT(2(0PF7.2,F12.5,1PD11.3,2D11.3))
624 FORMAT(1x,38('--'))
800 FORMAT(/I7,' function values with asymptotic value:',F14.6)
802 FORMAT((1X,3(F12.7,F14.6)))
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE GENINT(LNPT,NPP,XX,YY,NUSE,IR2,NTP,XI,YI,VLIM,ILR,
1 NCN,CNN)
c** GENINT produces a smooth function YY(i) at the NPP input distances
c XX(i) by performing numerical interpolation over the range of the
c NTP input function values YI(j) at the distances XI(j), and using
c analytic functions to extrapolate beyond their range to with an
c exponential at short range and a form specified by ILR, NCN & CNN
c** ILR specifies how to extrapolate beyond largest given turning pts
c If ILR < 0 , fit last 3 points to: VLIM - A*exp(-b*(R-R0)**2)
c If ILR = 0 , fit last 3 points to: VLIM - A*R**p *exp(-b*R)
c If ILR = 1 : fit last two points to: VLIM - A/R**B .
c* If(ILR.ge.2) fit last turning points to: VLIM - sum(of ILR
c inverse-power terms beginning with 1/R**NCN). *** If CNN.ne.0 ,
c leading coefficient fixed at CNN ; otherwise get it from points too.
c* Assume read-in CNN value has units: ((cm-1)(Angstroms)**'NCN').
c If ILR = 2 or 3 , successive higher power terms differ by 1/R**2
c If ILR > 3 : this factor is 1/R .
c=== Calls subroutines PLYINTRP, SPLINT & SPLINE ==================
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
INTEGER I,J,IFXCN,IDER,IR2,ILR,ISR,LNPT,MBEG,MFIN,MINNER,
1 NN,NPP,NUSE,NUST,NORD,NCN,NCN2,NCN4,NTP,
2 IMX1,NMX,JR2,JMAX,MI(10),MF(10)
REAL*8 ASR,BSR,CSR,ALR,BLR,CLR,DCSR,ADCSR,PDCSR,VRAT,
1 DX1,DX2,DX3,EX1,EX2,EX3,CNN,VLIM,X1,X2,X3,Y1,Y2,Y3,
1 XX(NPP),YY(NPP),XI(NTP),YI(NTP),XJ(20),YJ(20),DUMM(20)
c
SAVE ASR,BSR,CSR,ISR,ALR,BLR,CLR,IMX1,NMX,JR2,JMAX
c
NUST= NUSE/2
IF(NUSE.LE.0) NUST= 2
IDER= 0
c** Determine if/where need to begin extrapolation beyond input data
c XX(MI(J)) is the 1-st mesh point past turning point XI(J) .
c XX(MF(J)) is the last mesh point before turning point XI(NTP+1-J)
DO 6 J = 1,NUST
MI(J)= 1
MF(J)= 0
DO I= 1,NPP
IF(XX(I).LE.XI(J)) MI(J)= I+ 1
IF(XX(I).GE.XI(NTP+1-J)) GO TO 6
MF(J)= I
ENDDO
6 CONTINUE
IF(NUST.LT.2) THEN
MFIN= MI(1)-1
ELSE
MFIN= MI(2)-1
ENDIF
IF(LNPT.GT.0) THEN
c-----------------------------------------------------------------------
c** For a new case determine analytic functions for extrapolating beyond
c the range of the input points (if necessary) on this or later calls.
c** Try to fit three innermost turning points to V(R)=A+B*DEXP(-C*R).
c** If unsatisfactory, extrapolate inward with inverse power function
IF(IR2.LE.0) THEN
DO I= 1,4
YJ(I)= YI(I)
ENDDO
ELSE
DO I= 1,4
YJ(I)= YI(I)/XI(I)**2
ENDDO
ENDIF
X1= XI(1)
X2= XI(2)
X3= XI(3)
Y1= YJ(1)
Y2= YJ(2)
Y3= YJ(3)
IF((Y1-Y2)*(Y2-Y3).LE.0.d0) THEN
c** If 3 innermost points not monotonic, use A+B/X inward extrapoln.
ISR= 0
WRITE(6,600)
ELSE
c** Use cubic through innermost points to get initial trial exponent
c from ratio of derivatives, Y''/Y'
IDER= 2
ISR= 4
CALL PLYINTRP(XI,YJ,ISR,X2,XJ,ISR,IDER)
CSR= XJ(3)/XJ(2)
DCSR= DABS(CSR*X2)
IF(DCSR.GT.1.5D+2) THEN
c** If exponential causes overflows, use inverse power inward extrapoln.
ISR= 0
WRITE(6,602) CSR
GO TO 20
ENDIF
c** Prepare parameters for inward exponential extrapolation
VRAT= (Y3- Y2)/(Y1- Y2)
DX1= X1- X2
DX3= X3- X2
EX2= 1.D0
ADCSR= 1.d99
c** Now iterate (with actual point) to get exact exponent coefficient
DO J= 1,15
PDCSR= ADCSR
EX1= DEXP( CSR*DX1)
EX3= DEXP( CSR*DX3)
DCSR= (VRAT- (EX3- EX2)/(EX1- EX2)) /
1 ((X3*EX3- X2 - (X1*EX1- X2)*(EX3-EX2)/(EX1- EX2))/(EX1- EX2))
ADCSR= ABS(DCSR)
IF((ADCSR.GT.PDCSR).AND.(ADCSR.LT.1.d-8)) GO TO 12
IF(ADCSR.LT.1.d-12) GO TO 12
CSR= CSR+ DCSR
ENDDO
WRITE(6,604) DCSR
12 BSR= (Y1-Y2)/(EX1-EX2)
ASR= Y2-BSR*EX2
BSR= BSR*DEXP(-CSR*X2)
WRITE(6,606) X2,ASR,BSR,CSR
ENDIF
20 IF(ISR.LE.0) THEN
IF((X1*X2).LE.0.d0) THEN
c** If 1'st two mesh points of opposite sign, extrapolate linearly
ISR= -1
ASR= Y2
BSR= (Y2- Y1)/(X2- X1)
CSR= X2
WRITE(6,608) X2,ASR,BSR,CSR
ELSE
c** For inward extrapolation as inverse power through 1'st two points ..
BSR= (Y1-Y2)* X1*X2/(X2- X1)
ASR= Y1-BSR/X1
CSR= X2
WRITE(6,610) X2,ASR,BSR
ENDIF
ENDIF
ENDIF
600 FORMAT(' ** CAUTION ** Exponential inward extrapolation fails'/
1 16x,'since first 3 points not monotonic, ... so ...')
602 FORMAT(' *** CAUTION ** inward extrapolation exponent coefficient
1 C=',D12.4/10x,'could cause overflows, ... so ...')
604 FORMAT(' *** CAUTION ** after 15 tries inward extrap. exponent coe
1fft change is',1PD9.1)
606 FORMAT(' Extrapolate to X .le.',F7.4,' with'/' Y=',F13.3,
1 SP,1PD15.6,' * exp(',SS,D13.6,'*X)')
608 FORMAT(' Extrapolate to X .le.',F8.4,' with'/' Y=',F13.3,
1 SP,1PD16.7,' * [X - (',SS,F8.4,')]')
610 FORMAT(' Extrapolate to X .le.',F8.4,' with Y=',F12.3,
1 SP,1PD15.6,')/X**1')
c
IF(MFIN.GT.0) THEN
c** If needed, calculate function in inner extrapolation region
IF(ISR.GT.0) THEN
c ... either as an exponential
DO I= 1,MFIN
EX1= CSR*XX(I)
IF(DABS(EX1).GT.1.D+2) EX1= 1.D+2*DSIGN(1.d0,EX1)
YY(I)= ASR+BSR*DEXP(EX1)
ENDDO
ELSEIF(ISR.EQ.0) THEN
c ... or if that fails, as an inverse power
DO I= 1,MFIN
YY(I)= ASR+BSR/XX(I)
ENDDO
ELSEIF(ISR.LT.0) THEN
c ... or if X changes sign, extrapolate inward linearly
DO I= 1,MFIN
YY(I)= ASR+ BSR*(XX(I)- CSR)
ENDDO
ENDIF
ENDIF
c** End of inward extrapolation procedure
c-----------------------------------------------------------------------
MINNER= MFIN
IF(NUST.GT.2) THEN
c** If(NUSE.gt.5) minimize spurious behaviour by interpolating with
c order less than NUSE on intervals near inner end of range
DO J= 3,NUST
NORD= 2*(J-1)
MBEG= MI(J-1)
MFIN= MI(J)-1
IF(MFIN.GE.MBEG) THEN
DO I= MBEG,MFIN
CALL PLYINTRP(XI,YI,NTP,XX(I),DUMM,NORD,IDER)
YY(I)= DUMM(1)
ENDDO
ENDIF
ENDDO
ENDIF
c** Main interpolation step begins here
c=======================================================================
MBEG= MI(NUST)
MFIN= MF(NUST)
IF(MFIN.GE.MBEG) THEN
IF(NUSE.LE.0) THEN
c** Either ... use cubic spline for main interpolation step
CALL SPLINT(LNPT,NTP,XI,YI,MBEG,MFIN,XX,YY)
ELSE
c ... or use piecewise polynomials for main interpolation step
DO I= MBEG,MFIN
CALL PLYINTRP(XI,YI,NTP,XX(I),DUMM,NUSE,IDER)
YY(I)= DUMM(1)
ENDDO
ENDIF
ENDIF
IF(MFIN.LT.NPP) THEN
IF(NUST.LE.2) THEN
c** If(NUSE.gt.5) minimize spurious behaviour by interpolating with
c order less than NUSE on intervals near outer end of range
MBEG= MF(NUST)+1
ELSE
NN= NUST-2
DO J= 1,NN
NORD= 2*(NUST-J)
MBEG= MF(NUST-J+1)+1
MFIN= MF(NUST-J)
IF(MFIN.GE.MBEG) THEN
DO I= MBEG,MFIN
CALL PLYINTRP(XI,YI,NTP,XX(I),DUMM,NORD,IDER)
YY(I)= DUMM(1)
ENDDO
END IF
ENDDO
ENDIF
ENDIF
MBEG= MFIN+1
IF((MFIN.GT.MINNER).AND.(IR2.GT.0)) THEN
c** In (IR2.gt.0) option, now remove X**2 from the interpolated function
DO I= MINNER+1,MFIN
YY(I)= YY(I)/XX(I)**2
ENDDO
ENDIF
c** Print test of smoothness at join with analytic inward extrapolation
c IF(LNPT.GT.0) THEN
c MST= MAX0(MINNER-4,1)
c MFN= MST+8
c IF(MFN.GT.NPP) MFN= NPP
c IF(MFN.GT.MFIN) MFN= MFIN
c IF(MINNER.GT.0) WRITE(6,611) X2,((XX(I),YY(I),I= J,MFN,3),
c 1 J= MST,MST+2)
c 611 FORMAT(' Verify smoothness of inner join at X=',F9.5/
c 1 (3X,3(F10.5,G15.7)))
c ENDIF
c-----------------------------------------------------------------------
c** To extrapolate potential beyond range of given turning points ...
IF(LNPT.GT.0) THEN
c** On first entry, calculate things needed for extrapolation constants
Y1= YI(NTP)
Y2= YI(NTP-1)
Y3= YI(NTP-2)
X1= XI(NTP)
X2= XI(NTP-1)
X3= XI(NTP-2)
IF(IR2.GT.0) THEN
Y1= Y1/X1**2
Y2= Y2/X2**2
Y3= Y3/X3**2
ENDIF
ENDIF
c** Check inverse-power tail power ...
IF(NCN.LE.0) NCN= 6
IF(ILR.LT.0) THEN
IF(LNPT.GT.0) THEN
C** For ILR.lt.0 use Y = VLIM - ALR * exp[-CLR*(X - BLR)**2]
EX1= DLOG((VLIM-Y1)/(VLIM-Y2))/(X1-X2)
EX2= DLOG((VLIM-Y2)/(VLIM-Y3))/(X2-X3)
BLR= (X1+X2 - (X2+X3)*EX1/EX2)/(2.d0- 2.d0*EX1/EX2)
CLR= -EX1/(X1+X2-2.d0*BLR)
ALR= (VLIM-Y1)*DEXP(CLR*(X1-BLR)**2)
WRITE(6,614) X2,VLIM,ALR,CLR,BLR
IF(CLR.LT.0.d0) THEN
c ... but replace it by an inverse power of exponent constant negative
WRITE(6,612)
ILR= 1
GO TO 50
ENDIF
ENDIF
IF(MBEG.LE.NPP) THEN
DO I= MBEG,NPP
YY(I)= VLIM- ALR*DEXP(-CLR*(XX(I) - BLR)**2)
ENDDO
ENDIF
GO TO 90
ENDIF
IF(ILR.EQ.0) THEN
c** For ILR.le.0 use Y = VLIM - ALR * X**p * exp(-CLR*X)
IF(LNPT.GT.0) THEN
EX1= DLOG((VLIM-Y1)/(VLIM-Y2))/(X1-X2)
EX2= DLOG((VLIM-Y2)/(VLIM-Y3))/(X2-X3)
DX1= DLOG(X1/X2)/(X1-X2)
DX2= DLOG(X2/X3)/(X2-X3)
BLR= (EX1-EX2)/(DX1-DX2)
CLR= BLR*DX1- EX1
ALR= (VLIM-Y1)* DEXP(CLR*X1)/X1**BLR
WRITE(6,616) X2,VLIM,ALR,BLR,CLR
IF(CLR.LT.0.d0) THEN
c ... but replace it by an inverse power of exponent constant negative
WRITE(6,612)
ILR= 1
GO TO 50
ENDIF
ENDIF
IF(MBEG.LE.NPP) THEN
DO I= MBEG,NPP
YY(I)= VLIM- ALR*XX(I)**BLR *DEXP(-CLR*XX(I))
ENDDO
ENDIF
GO TO 90
ENDIF
50 IF(ILR.EQ.1) THEN
c** For ILR=1 , use Y = VLIM + ALR/X**BLR
IF(LNPT.GT.0) THEN
BLR= DLOG((VLIM-Y2)/(VLIM-Y1))/DLOG(X1/X2)
ALR= (Y1- VLIM)*X1**BLR
NCN= NINT(BLR)
IF(NCN.LE.0) NCN= 10 !! to ensure SCECOR is sensible
WRITE(6,618) X2,VLIM,ALR,BLR,NCN
ENDIF
IF(MBEG.LE.NPP) THEN
DO I= MBEG,NPP
YY(I)= VLIM+ ALR/XX(I)**BLR
ENDDO
ENDIF
GO TO 90
ENDIF
c** Set constants for long-range extrapolation
IFXCN= 0
IF((CNN.GT.0.d0).OR.(CNN.LT.0.d0)) IFXCN= 1
NCN2= NCN+2
IF(ILR.EQ.2) THEN
c** For ILR=2 , use Y = VLIM - CNN/X**NCN - BSR/X**(NCN+2)
c* If CNN held fixed need ILR > 2 to prevent discontinuity
IF(LNPT.GT.0) THEN
IF(IFXCN.LE.0) THEN
CNN= ((VLIM-Y1)*X1**NCN2 -
1 (VLIM-Y2)*X2**NCN2)/(X1**2-X2**2)
ENDIF
ALR= CNN
BLR= (VLIM-Y1)*X1**NCN2 - CNN*X1**2
WRITE(6,620) X2,VLIM,CNN,NCN,BLR,NCN2
ENDIF
IF(MBEG.LE.NPP) THEN
DO I= MBEG,NPP
YY(I)= VLIM-(ALR+BLR/XX(I)**2)/XX(I)**NCN
ENDDO
ENDIF
GO TO 90
ENDIF
IF(ILR.EQ.3) THEN
c** For ILR=3 , use Y = VLIM - (CN + CN2/X**2 + CN4/X**4)/X**NCN
IF(LNPT.GT.0) THEN
NCN4= NCN+4
IF(IFXCN.GT.0) THEN
ALR= CNN
BLR= (((VLIM-Y1)*X1**NCN-ALR)*X1**4-((VLIM-Y2)
1 *X2**NCN-ALR)*X2**4)/(X1**2-X2**2)
CLR= ((VLIM-Y1)*X1**NCN-ALR-BLR/X1**2)*X1**4
ELSE
EX1= X1**2
EX2= X2**2
EX3= X3**2
DX1= (VLIM-Y1)*X1**NCN4
DX2= (VLIM-Y2)*X2**NCN4
DX3= (VLIM-Y3)*X3**NCN4
BLR= (DX1-DX2)/(EX1-EX2)
ALR= (BLR-(DX2-DX3)/(EX2-EX3))/(EX1-EX3)
BLR= BLR-ALR*(EX1+EX2)
CLR= DX1-(ALR*EX1+BLR)*EX1
ENDIF
WRITE(6,622) X2,VLIM,ALR,NCN,BLR,NCN2,CLR,NCN4
ENDIF
IF(MBEG.LE.NPP) THEN
DO I= MBEG,NPP
EX2= 1.d0/XX(I)**2
YY(I)= VLIM-(ALR+EX2*(BLR+EX2*CLR))/XX(I)**NCN
ENDDO
ENDIF
GO TO 90
ENDIF
IF(ILR.GE.4) THEN
c** For ILR.ge.4, Y = VLIM-SUM(BB(K)/X**K) , (K=NCN,NMX=NCN+ILR-1)
IF(LNPT.GT.0) THEN
IF(NCN.LE.0) NCN= 1
IMX1= ILR-1
NMX= NCN+IMX1
JR2= 0
IF(IR2.GT.0) JR2= 2
IDER= 0
JMAX= ILR
IF(IFXCN.GT.0) JMAX= IMX1
WRITE(6,624) X2,ILR,NCN,VLIM
IF(IFXCN.GT.0) WRITE(6,626) NCN,CNN
ENDIF
c** Actually extrapolate with polynomial fitted to the last JMAX
c values of (VLIM - YI(I))*XI(I)**NMX , & then convert back to YY(I).
IF(MBEG.LE.NPP) THEN
J= NTP- JMAX
DO I= 1,JMAX
J= J+1
XJ(I)= XI(J)
YJ(I)= (VLIM-YI(J)/XI(J)**JR2)*XI(J)**NMX
IF(IFXCN.GT.0) YJ(I)= YJ(I)- CNN*XI(J)**IMX1
ENDDO
DO I= MBEG,NPP
CALL PLYINTRP(XJ,YJ,JMAX,XX(I),DUMM,JMAX,IDER)
YY(I)= DUMM(1)
IF(IFXCN.GT.0) YY(I)= YY(I)+ CNN*XX(I)**IMX1
YY(I)= VLIM-YY(I)/XX(I)**NMX
ENDDO
ENDIF
ENDIF
c** Finished extrapolation section.
90 CONTINUE
c** Test smoothness at outer join to analytic extrapolation function
c IF((LNPT.GT.0).AND.(MBEG.LE.NPP)) THEN
c MST= MBEG-5
c IF(MST.LT.1) MST= 1
c MFN= MST+8
c IF(MFN.GT.NPP) MFN= NPP
c WRITE(6,627) X2,((XX(I),YY(I),I= J,MFN,3),J= MST,MST+2)
c ENDIF
c 627 FORMAT(' Verify smoothness of outer join at X=',F9.5/
c 1 (3X,3(F10.5,G15.7)))
RETURN
612 FORMAT(' *** BUT *** since exponent has positive coefficient, swi
1tch form ...')
614 FORMAT(' Function for X .GE.',F8.4,' generated as'/' Y=',
1 F12.4,' - (',1PD13.6,') * exp{-',0PF10.6,' * (r -',F9.6,')**2}')
616 FORMAT(' Function for X .GE.',F8.4,' generated as'/' Y=',
1 F12.4,' - (',1PD13.6,') * r**',0PF10.6,' * exp{-(',F11.6,'*r)}')
618 FORMAT(' Extrapolate to X .GE.',F8.4,' using'/' Y=',
1 F12.4,SP,1PD15.6,'/X**(',SS,D13.6,')] , yielding NCN=',I3)
620 FORMAT(' Extrapolate to X .GE.',F8.4,' using'/' Y=',
1 F12.4,' - [',1PD13.6,'/X**',I1,SP,D14.6,'/X**',SS,I1,']')
622 FORMAT(' Extrapolate to X .GE.',F8.4,' using'/
1 ' Y=',F12.4,' - [',1PD13.6,'/X**',I1,SP,D14.6,'/X**',
2 SS,I1,SP,D14.6,'/X**',SS,I2,']')
624 FORMAT(' Function for X .GE.',F7.3,' generated by',I3,
1 '-point inverse-power interpolation'/' with leading term 1/r**
2',I1,' relative to dissociation limit YLIM=',F11.3)
626 FORMAT(' and (dimensionless) leading coefficient fixed as C',
1 I1,'=',G15.8)
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE PLYINTRP(XI,YI,NPT,RR,C,NCFT,IDER)
c* From the NPT known mesh points (XI,YI) ,given in order of increasing
c or decreasing XI(I), select the NCFT points (XJ,YJ) surrounding the
c given point RR, and by fitting an (NCFT-1)-th degree polynomial through
c them, interpolate to find the function CC(1) and its first IDER
c derivatives (CC(I+1),I=1,IDER) evaluated at RR.
c* Adapted by R.J. Le Roy from algorithm #416,Comm.A.C.M.; 27/02/1988
c=======================================================================
INTEGER I,J,K,I1,I2,IFC,IM,IDER,J1,NH,NPT,NCFT
REAL*8 RR,XX,XI(NPT),YI(NPT),C(NCFT),XJ(20),YJ(20)
c
IF((NCFT.GT.20).OR.(NCFT.GT.NPT)) GO TO 101
NH= NCFT/2
c** First locate the known mesh points (XJ,YJ) bracketing RR
I1= 1
I2= NCFT
IF(NCFT.NE.NPT) THEN
IF(XI(NPT).LE.XI(1)) THEN
DO I= 1,NPT
IM= I
IF(XI(I).LT.RR) GO TO 20
ENDDO
ELSE
DO I= 1,NPT
IM= I
IF(XI(I).GT.RR) GO TO 20
ENDDO
ENDIF
20 I1= IM-NH
IF(I1.LE.0) I1= 1
I2= I1+NCFT-1
IF(I2.GT.NPT) THEN
I2= NPT
I1= I2-NCFT+1
ENDIF
ENDIF
J= 0
DO I= I1,I2
J= J+1
XJ(J)= XI(I)-RR
YJ(J)= YI(I)
ENDDO
c** Now determine polynomial coefficients C(I).
DO I= 2,NCFT
I1= I-1
K= I1+1
DO J= 1,I1
K= K-1
YJ(K)= (YJ(K+1)-YJ(K))/(XJ(I)-XJ(K))
ENDDO
ENDDO
C(1)= YJ(1)
DO I= 2,NCFT
XX= XJ(I)
C(I)= C(I-1)
IF(I.NE.2) THEN
I1= I-1
K= I1+1
DO J= 2,I1
K= K-1
C(K)= -XX*C(K)+C(K-1)
ENDDO
ENDIF
C(1)= YJ(I)-XX*C(1)
ENDDO
c** Finally, convert polynomial coefficients to derivatives at RR.
IFC= 1
IF(IDER.GE.NCFT) IDER= NCFT-1
IF(IDER.LE.1) GO TO 99
DO I= 2,IDER
J= I+1
IFC= IFC*I
C(J)= C(J)*IFC
ENDDO
IF(J.LT.NCFT) THEN
J1= J+1
DO I= J1,NCFT
C(I)= 0.D+0
ENDDO
ENDIF
99 RETURN
101 WRITE(6,601) NCFT,NCFT,NPT
STOP
601 FORMAT(/' *** Dimensioning ERROR in PLYINTRP : either (NCFT=',
1 I2,' .GT. 20) or (NCFT=',I2,' .GT. NPT=',I3,')')
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c
SUBROUTINE SPLINT(LNPT,NTP,R1,V1,MBEG,MEND,XX,YY)
c** Subroutine to generate (if LNPT.ge.0) 4*NTP coefficients CSP(J)
c of a cubic spline passing through the NTP points (R1(J),V1(J))
c and to then calculate values of the resulting function YY(I) at the
c entering abscissae values XX(I) for I=MBEG to MEND.
c** If LNPT < 0 , generate function values at the given XX(I) using
c the coefficients CSP(J) obtained and SAVEd on a preceding call.
c** Assumes both R1(J) & XX(I) are monotonic increasing.
c+++++ Calls only subroutines SPLINE and PLYINTRP ++++++++++++++++++++++
c=======================================================================
cc INCLUDE 'arrsizes.h' !! needed to define NTPMX & MAXSP=4*NTPMX
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c** This 'Block' Data Utility routine that governs array dimensioning
c in program LEVEL16 must reside with the name 'arrsizes.h' in the
c same directory containing the FORTRAN file(s) for this Program when
c it is being compiled, **OR** be incorporated into the program
c wherever the statement 'INCLUDE arrsizes.h' appears !!
c-----------------------------------------------------------------------
INTEGER NDIMR, NVIBMX, NTPMX, MAXSP, MORDRMX, RORDR, NbetaMX,
1 LMAX, NBOBmx, NCMMAX
c** NDIMR is maximum size of PEC, wavefx, and various radial arrary
PARAMETER (NDIMR= 250001)
c** NVIBMX is the maximum no. vibrational levels, or rotational sublevel
c for a given 'v' whose energies may be generated and stored
PARAMETER (NVIBMX= 400)
c** NTPMX is maximum no. of PEC or TMF points that may be read-in and
c interplated over; MAXSP = no. cubic spline cfts for these NTPMX pts.
PARAMETER (NTPMX= 2000, MAXSP=4*NTPMX)
c** RORDR is maximum order of rot. constants generated for each vib level
PARAMETER (RORDR = 7)
c** MORDRMX is maximum polynomial order for TMF or martix element argument
PARAMETER (MORDRMX = 20)
c** NbetaMX is the largest no. PEC exponent polynomial parameter
PARAMETER (NbetaMX = 50, LMAX= NbetaMX)
c** NBOBmx is the largest no. of BOB expansion parameters
PARAMETER (NBOBmx = 20)
c** NCMMax is max. no. long-range inverse-power PEC coeffts. allowed
PARAMETER (NCMMax= 20)
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
INTEGER I,IER,I1ST,IDER,JK,K,KK,LNPT,N2,N3,NIPT,NTP,MBEG,MEND
REAL*8 EPS,R2,RI,RRR,TTMP,R1(NTPMX),V1(NTPMX),CSP(MAXSP),
1 YY(MEND),XX(MEND)
SAVE CSP
c
IF(4*NTP.GT.MAXSP) THEN
WRITE(6,602) MAXSP,NTP
STOP
ENDIF
EPS= 1.D-6*(R1(2)-R1(1))
N2= 2*NTP
N3= 3*NTP
IF(LNPT.GT.0) THEN
c** On first pass for a given data set, generate spline function
c coefficients in subroutine SPLINE
c** Start by using a cubic polynomial at each end of the range to get
c the first derivative at each end for use in defining the spline.
IDER= 1
NIPT= 4
I1ST= NTP-3
CALL PLYINTRP(R1(I1ST),V1(I1ST),NIPT,R1(NTP),CSP,NIPT,IDER)
TTMP= CSP(2)
CALL PLYINTRP(R1,V1,NIPT,R1(1),CSP,NIPT,IDER)
CSP(1)= CSP(2)
CSP(2)= TTMP
c** Now call routine to actually generate spline coefficients
CALL SPLINE(R1,V1,NTP,3,CSP,MAXSP,IER)
IF(IER .NE. 0) THEN
WRITE(6,604)
STOP
ENDIF
ENDIF
IF(MEND.LT.MBEG) GO TO 99
c** Now, use spline to generate function at desired points XX(I)
DO I= MBEG,MEND
RI= XX(I)
RRR= RI-EPS
KK= 1
c** For a monotonic increasing distance array XX(I), this statement
c speeds up the search for which set of cubic coefficients to use.
IF(I.GT.MBEG) THEN
IF(XX(I).GT.XX(I-1)) KK= JK
ENDIF
DO K= KK,NTP
JK= K
IF(R1(K).GE.RRR) GO TO 64
ENDDO
64 CONTINUE
JK= JK-1
IF(JK.LT.1) JK= 1
R2= RI-R1(JK)
YY(I)= CSP(JK)+R2*(CSP(NTP+JK)+R2*(CSP(N2+JK)+R2*CSP(N3+JK)))
ENDDO
99 RETURN
602 FORMAT(' *** ERROR in SPLINT *** Array dimension MAXSP=',I4,
1 ' cannot contain spline coefficients for NTP=',I4)
604 FORMAT(' *** ERROR in generating spline coefficients in SPLINE')
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c
SUBROUTINE SPLINE(X,Y,N,IOPT,CSP,N4,IER)
c** Subroutine for generating cubic spline coefficients
c CSP(J), (J=1,N4=4*N) through the N points X(I), Y(I).
c** CSP(I+M*N), M=0-3 are the coefficients of order 0-3 of cubic
c polynomial expanded about X(I) so as to describe the interval:
c - X(I) to X(I+1) , if X(I) in increasing order
c - X(I-1) to X(I) , if X(I) in decreasing order.
c** IOPT indicates boundary conditions used in creating the spline .
c* If (IOPT=0) second derivatives = zero at both ends of range.
c* If (IOPT=1) 1st derivative at first point X(1) fixed at CSP(1),
c and 2nd derivative at X(N) = zero.
c* If (IOPT=2) 1st derivative at last point X(N) fixed at CSP(2),
c and 2nd derivative at X(1) = zero.
c* If (IOPT=3) constrain first derivatives at end points to have
c (read in) values CSP(1) at X(1) & CSP(2) at X(N)
c** IER is the error flag. IER=0 on return if routine successful.
c-----------------------------------------------------------------------
INTEGER I,II,IER,IOH,IOL,IOPT,J,J1,J2,J3,NER,N,N4,JMP
REAL*8 A,H,R,DY2,DYA,DYB,XB,XC,YA,YB, X(N),Y(N),CSP(N4)
c
JMP= 1
NER= 1000
IF(N.LE.1) GO TO 250
c** Initialization
XC= X(1)
YB= Y(1)
H= 0.D0
A= 0.D0
R= 0.D0
DYB= 0.D0
NER= 2000
c IOL=0 - given derivative at firstpoint
c IOH=0 - given derivative at last point
IOL= IOPT-1
IOH= IOPT-2
IF(IOH.EQ.1) THEN
IOL= 0
IOH= 0
ENDIF
DY2= CSP(2)
c Form the system of linear equations
c and eliminate subsequentially
J= 1
DO I= 1,N
J2= N+I
J3= J2+N
A= H*(2.D0-A)
DYA= DYB+H*R
IF(I.GE.N) THEN
c set derivative dy2 at last point
DYB= DY2
H= 0.D0
IF(IOH.EQ.0) GOTO 200
DYB= DYA
GOTO 220
ENDIF
J= J+JMP
XB= XC
XC= X(J)
H= XC-XB
c II= 0 - increasing abscissae
c II= 1 - decreasing abscissae
II= 0
IF(H.LT.0) II= 1
IF(H.EQ.0) GO TO 250
YA= YB
YB= Y(J)
DYB= (YB-YA)/H
IF(I.LE.1) THEN
J1= II
IF(IOL.NE.0) GO TO 220
DYA= CSP(1)
ENDIF
200 IF(J1.NE.II) GO TO 250
A= 1.D0/(H+H+A)
220 R= A*(DYB-DYA)
CSP(J3)= R
A= H*A
CSP(J2)= A
CSP(I)= DYB
ENDDO
c back substitution of the system of linear equations
c and computation of the other coefficients
A= 1.D0
J1= J3+N+II-II*N
I= N
DO IOL= 1,N
XB= X(J)
H= XC-XB
XC= XB
A= A+H
YB= R
R= CSP(J3)-R*CSP(J2)
YA= R+R
CSP(J3)= YA+R
CSP(J2)= CSP(I)-H*(YA+YB)
CSP(J1)= (YB-R)/A
CSP(I)= Y(J)
A= 0.D0
J= J-JMP
I= I-1
J2= J2-1
J3= J3-1
J1= J3+N+II
ENDDO
IER= 0
RETURN
250 IER= NER
RETURN
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE POTGEN(LNPT,NPP,IAN1,IAN2,IMN1,IMN2,VLIM,XO,RM2,VV,
1 NCN,CNN)
c** Generate analytic potential VV(i) as specified by the choice
c of parameter IPOTL (see comments in PREPOT (& in main program))
c** All potentials generated in units cm-1 with absolute asymptote at
c (input) energy VLIM for distance array X0(i) Angstroms.
c** Return with NCN equal to power of asymptotically dominant inverse
c power term in long range part of potential
c** Born-Oppenheimer correction functions in IPOTL=3 option may have up
c to NBOBmx+1 terms. || * last updated 5 May 2016 *
c-----------------------------------------------------------------------
IMPLICIT NONE
cc INCLUDE 'arrsizes.h' !! import array dimension parameters
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c** This 'Block' Data Utility routine that governs array dimensioning
c in program LEVEL16 must reside with the name 'arrsizes.h' in the
c same directory containing the FORTRAN file(s) for this Program when
c it is being compiled, **OR** be incorporated into the program
c wherever the statement 'INCLUDE arrsizes.h' appears !!
c-----------------------------------------------------------------------
INTEGER NDIMR, NVIBMX, NTPMX, MAXSP, MORDRMX, RORDR, NbetaMX,
1 LMAX, NBOBmx, NCMMAX
c** NDIMR is maximum size of PEC, wavefx, and various radial arrary
PARAMETER (NDIMR= 250001)
c** NVIBMX is the maximum no. vibrational levels, or rotational sublevel
c for a given 'v' whose energies may be generated and stored
PARAMETER (NVIBMX= 400)
c** NTPMX is maximum no. of PEC or TMF points that may be read-in and
c interplated over; MAXSP = no. cubic spline cfts for these NTPMX pts.
PARAMETER (NTPMX= 2000, MAXSP=4*NTPMX)
c** RORDR is maximum order of rot. constants generated for each vib level
PARAMETER (RORDR = 7)
c** MORDRMX is maximum polynomial order for TMF or martix element argument
PARAMETER (MORDRMX = 20)
c** NbetaMX is the largest no. PEC exponent polynomial parameter
PARAMETER (NbetaMX = 50, LMAX= NbetaMX)
c** NBOBmx is the largest no. of BOB expansion parameters
PARAMETER (NBOBmx = 20)
c** NCMMax is max. no. long-range inverse-power PEC coeffts. allowed
PARAMETER (NCMMax= 20)
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
INTEGER I,J,M,IBOB,IAN1,IAN2,IMN1,IMN2,MN1R,MN2R,IORD,IORDD,
1 IPOTL,IMIN,PAD,QAD,QNA,NU1,NU2,NT1,NT2,NCMAX,PPAR,QPAR,NCN,Nbeta,
2 APSE,NVARB,NPP,LNPT,GNS,GEL,NCMM,MCMM,sVSR2,IDSTT,MM1,
3 MMLR(NCMMAX)
CHARACTER*2 NAME1,NAME2
REAL*8 A0,A1,A2,A3,ALFA,AT,BT,BETA,BINF,B1,B2,CSAV,U1INF,U2INF,
1 T1INF,T2INF,YPAD,YQAD,YQADSM,YQNA,YQNASM,ABUND,CNN,DSCM,DX,DX1,
2 FCT,FC1,FC2,FG1,FG2,MASS1,MASS2,RMASS1,RMASS2,REQ,Rref,Rinn,
3 Rout,SC1,SC2,SG1,SG2,VLIM,DVLIM,VMIN,XDF,X1,XS,XL,XP1,ZZ,ZP,ZQ,
4 ZME,ULR,ULRe,rhoAB,rhoINT,nDSCM,nREQ,Scalc,XXQ,REQp,REQq,RREFp,
5 RREFq,DSUM,DSUMP,bohr,Rbohr,T0,dULRdR,RM3,BFCT2,RH,f2,f2p,GAMMA,
6 dULRdCm(NCMMAX),
7 DM(NCMMAX),DMP(NCMMAX),DMPP(NCMMAX),CmVAL(NCMMAX),CmEFF(NCMMAX),
6 U1(0:NBOBmx),U2(0:NBOBmx),T1(0:NBOBmx),T2(0:NBOBmx),
9 PARM(NbetaMX),XPARM(NbetaMX),rKL(NbetaMX,NbetaMX),XO(NDIMR),
a VV(NDIMR),RM2(NDIMR),bTT(-1:2),cDS(-2:0),bDS(-2:0)
SAVE IBOB,IPOTL,PPAR,QPAR,PAD,QAD,QNA,Nbeta,MMLR,NVARB,NCMM
SAVE DSCM,REQ,Rref,PARM,U1,U2,T1,T2,CSAV,BINF,ALFA,ZME,
1 Rinn,Rout,ULR,ULRe,CmVAL,XPARM
c** Damping function parameters for use and printout .....
DATA bTT/2.44d0,2.78d0,3.13d0,3.47d0/
DATA bDS/3.3d0,3.69d0,3.95d0/
DATA cDS/0.423d0,0.40d0,0.39d0/
SAVE bTT, bDS, cDS
c** Electron mass, as per 2010 physical constants
DATA ZME/5.4857990946d-4/,bohr/0.52917721092d0/
c
IF(LNPT.GT.0) THEN
c** Most parameter definitions listed preceeding CALL in subroutine PREPOT
c-----------------------------------------------------------------------
READ(5,*) IPOTL, QPAR, PPAR, Nbeta, APSE, IBOB
READ(5,*) DSCM, REQ, Rref
IF(IPOTL.GE.4) THEN
c** For MLR, DELR, HFD, Tang-Toennies or Tiemann-polynomial potentials .....
c For each long-range term read power MMLR(i) & coefficient CmVAL(i)
c** For special Aubert-Frecon 2x2 cases, NCMM= 7, MMLR= {x,3,3,6,6,8,8},
c with x= 0 for the A state, x= -1 for the b state, and CmVAL= {Aso,
c C3Sig, C3Pi, C6Sig, C6Pi, C8Sig, C8Pi},
c* while for the 3x3 diagonalization cases, NCMM=10, MMLR= {x,3,3,3,6,6,6,
c 8,8,8} with x= -2 for the (lowest eigenvalue) c(1\,^3\Sigma_g^+ state,
c x= -3 for the (middle root) B^1\Pi_u state, and x=-4 for the
c highest-root state, while CmVal= {Aso, C3Sig, C3Pi1, C3Pi3, C6Sig, C6Pi1,
c C6Pi3, C8Sig, C8Pi1, C8Pi3}
c=======================================================================
READ(5,*) NCMM, rhoAB, sVSR2, IDSTT
DO m=1, NCMM
READ(5,*) MMLR(m), CmVAL(m)
CmEFF(m)= CmVAL(m)
ENDDO
MCMM= NCMM
ENDIF
c-----------------------------------------------------------------------
IF(IPOTL.EQ.1) NVARB= 0
IF(IPOTL.EQ.2) THEN
NVARB= Nbeta+2
ENDIF
IF(IPOTL.EQ.3) THEN
NVARB= Nbeta+1
IF(QPAR.LE.0) NVARB=2
ENDIF
IF(IPOTL.EQ.4) THEN
NVARB= Nbeta+ 1
IF(APSE.GT.0) NVARB= Nbeta
ENDIF
IF(IPOTL.EQ.5) THEN
IORD= Nbeta
NVARB= IORD+ 1
ENDIF
IF(IPOTL.EQ.6) NVARB= Nbeta
IF(IPOTL.EQ.7) NVARB= 9
IF(IPOTL.EQ.8) NVARB= Nbeta+ 4
c-----------------------------------------------------------------------
IF(NVARB.GT.0) THEN
IF((IPOTL.EQ.4).AND.(APSE.GT.0)) THEN
DO I=1, NVARB
READ(5,*) XPARM(I),PARM(I)
ENDDO
ELSE
READ(5,*) (PARM(I),I=1,NVARB)
ENDIF
ENDIF
c-----------------------------------------------------------------------
IF(IBOB.GT.0) THEN
c-----------------------------------------------------------------------
READ(5,*) MN1R, MN2R, qAD, pAD, NU1, NU2, qNA, NT1, NT2
c-----------------------------------------------------------------------
NCMAX= MAX0(NU1,NU2,NT1,NT2)
IF(NCMAX.LT.0) THEN
IBOB= 0
ELSE
c** If appropriate, read parameters & prepare to add mass-dep. BOB corrn
CALL MASSES(IAN1,IMN1,NAME1,GEL,GNS,MASS1,ABUND)
CALL MASSES(IAN1,MN1R,NAME1,GEL,GNS,RMASS1,ABUND)
CALL MASSES(IAN2,IMN2,NAME2,GEL,GNS,MASS2,ABUND)
CALL MASSES(IAN2,MN2R,NAME2,GEL,GNS,RMASS2,ABUND)
c For simplicity, first zero out all correction function coefficients
DO I=0,NCMAX
U1(I)= 0.d0
U2(I)= 0.d0
T1(I)= 0.d0
T2(I)= 0.d0
ENDDO
FC1= 0.d0
FC2= 0.d0
FG1= 0.d0
FG2= 0.d0
U1INF= 0.d0
U2INF= 0.d0
T1INF= 0.d0
T2INF= 0.d0
DVLIM= 0.d0
c=======================================================================
c** Read actual BOB polynomial expansion coefficients
c=======================================================================
IF(NU1.GE.0) THEN
c... use Huang/Le Roy form for atom-1 adiabatic potential BOB radial fx.
c-----------------------------------------------------------------------
READ(5,*) (U1(I), I=0,NU1)
READ(5,*) U1INF
c-----------------------------------------------------------------------
FC1= 1.d0 - RMASS1/MASS1
DVLIM= DVLIM + FC1*U1INF
WRITE(6,630) 1,MASS1,MN1R,NAME1,IMN1,NAME1,
1 1,U1INF,PAD,PAD,PAD,PAD,PAD,PAD,NU1,QAD,QAD,QAD,QAD,QAD,
2 NU1+1,(U1(I),I= 0,NU1)
ENDIF
c
IF(NU2.GE.0) THEN
c... use Huang/Le Roy form for atom-2 adiabatic potential BOB radial fx.
c-----------------------------------------------------------------------
READ(5,*) (U2(I), I=0,NU2)
READ(5,*) U2INF
c-----------------------------------------------------------------------
FC2= 1.d0 - RMASS2/MASS2
DVLIM= DVLIM + FC2*U2INF
WRITE(6,630) 2,MASS2,MN2R,NAME2,IMN2,NAME2,
1 1,U2INF,PAD,PAD,PAD,PAD,PAD,PAD,NU2,QAD,QAD,QAD,QAD,QAD,
2 NU2+1,(U2(I),I= 0,NU2)
ENDIF
c
IF(NT1.GE.0) THEN
c... use Huang/Le Roy centrifugal BOB radial function for atom-1 ...
c-----------------------------------------------------------------------
READ(5,*) (T1(I), I=0,NT1)
READ(5,*) T1INF
c-----------------------------------------------------------------------
WRITE(6,634) 1,MASS1,MN1R,NAME1,IMN1,NAME1,
1 1,T1INF,QNA,QNA,QNA,QNA,QNA,QNA,NT1,QNA,NT1+1,(T1(I),I= 0,NT1)
FG1= RMASS1/MASS1
ENDIF
c
IF(NT2.GE.0) THEN
c... use Huang/Le Roy centrifugal BOB radial function for atom-2 ...
c-----------------------------------------------------------------------
READ(5,*) (T2(I), I=0,NT2)
READ(5,*) T2INF
c-----------------------------------------------------------------------
WRITE(6,634) 2,MASS2,MN2R,NAME2,IMN2,NAME2,
1 2,T2INF,QNA,QNA,QNA,QNA,QNA,QNA,NT2,QNA,NT2+1,(T2(I),I= 0,NT2)
FG2= RMASS2/MASS2
ENDIF
U1INF= U1INF*FC1
U2INF= U2INF*FC2
T1INF= T1INF*FG1
T2INF= T2INF*FG2
c... Now generates scaled expansion parameters all at the same time!
DO I=0,NCMAX
U1(I)= U1(I)*FC1
U2(I)= U2(I)*FC2
T1(I)= T1(I)*FG1
T2(I)= T2(I)*FG2
ENDDO
ENDIF
ENDIF
IF(IPOTL.GE.4) THEN !! now describe long-range tail
IF(rhoAB.GT.0.d0) THEN
IF(IDSTT.GT.0) WRITE(6,660) rhoAB,sVSR2,bDS(sVSR2),
1 cDS(sVSR2),sVSR2
IF(IDSTT.LE.0) THEN
IF(IPOTL.NE.7) WRITE(6,662) rhoAB,sVSR2/2,
1 bTT(sVSR2/2)
IF(IPOTL.EQ.7) WRITE(6,663) rhoAB,sVSR2/2
ENDIF
ELSE
WRITE(6,664)
ENDIF
IF(MMLR(1).LE.0) THEN
c** uLR printout for Lyon 2x2 or 3x3 treatment of 2S + 2p alkali dimers ...
IF((NCMM.NE.7).AND.(NCMM.NE.10)) THEN
WRITE(6,666) MMLR(1),NCMM
STOP
ENDIF
IF(MMLR(1).EQ.0) WRITE(6,668) 'A-state',CmVAL(1),
1 CmVAL(2),(CmVAL(m),m=3,NCMM)
IF(MMLR(1).EQ.-1) WRITE(6,668) 'b-state',CmVAL(1),
1 CmVAL(2),(CmVAL(m),m=3,NCMM)
c... For Lyon treatment of b-state alkali dimers ...
IF(MMLR(1).EQ.-2) WRITE(6,670) 'c-state',CmVAL(1),
1 CmVAL(2),(CmVAL(m),m=3,NCMM)
IF(MMLR(1).EQ.-3) WRITE(6,670) 'B-state',CmVAL(1),
1 CmVAL(2),(CmVAL(m),m=3,NCMM)
IF(MMLR(1).EQ.-4) WRITE(6,670) '1 ^3Pi',CmVAL(1),
1 CmVAL(2),(CmVAL(m),m=3,NCMM)
ELSE
c... uLR printout for 'conventional' (damped or non-damped) inverse-power sum
WRITE(6,672) NCMM,(MMLR(m),CmEFF(m),m= 1,NCMM)
ENDIF
ENDIF
ENDIF
c
c=======================================================================
c** Generate a Lennard-Jones(QPAR,PPAR) potential here.
c=======================================================================
IF(IPOTL.EQ.1) THEN
XS= PPAR
XL= QPAR
XDF= DSCM/(XS-XL)
IF(LNPT.GT.0) WRITE(6,600) QPAR,PPAR,DSCM,REQ
CNN= XS*XDF*REQ**QPAR
NCN= QPAR
DO I= 1,NPP
VV(I)= (XL*(REQ/XO(I))**PPAR - XS*(REQ/XO(I))**QPAR)*XDF
1 +VLIM
ENDDO
ENDIF
c
IF(IPOTL.EQ.2) THEN
c=======================================================================
c** Generate Seto-modified form of Surkus' GPEF function which includes
c Dunham, SPF and OT forms as special cases.
c=======================================================================
VMIN= VLIM
X1= 1.d0
A0= DSCM
IF((PPAR.NE.0).AND.(DABS(PARM(Nbeta+1)).GT.0.d0)) THEN
FCT= 1.d0/PARM(Nbeta+1)
DO J=1,IORD
X1= X1+ PARM(J)*FCT**J
ENDDO
c... Actual Dissoc. limit for this GPEF power series potential
DSCM= A0*X1*FCT**2 + VMIN
ENDIF
IF(PPAR.EQ.1) THEN
c Cases with power =1 (including Dunham, SPF & O-T expansions).
IF(DABS(PARM(Nbeta+1)).LE.0.d0) THEN
c ... print for Dunham expansion ...
WRITE(6,612) PARM(Nbeta+2),REQ,VMIN,A0,Nbeta,
1 (PARM(I),I= 1,Nbeta)
NCN= -99
CNN= 0.d0
ENDIF
IF(DABS(PARM(Nbeta+2)).LE.0.d0) THEN
c ... print for Simons-Parr-Finlan expansion ...
WRITE(6,614) PARM(Nbeta+1),REQ,DSCM,A0,Nbeta,
1 (PARM(I),I= 1,Nbeta)
NCN= 1
ENDIF
IF(DABS(PARM(Nbeta+2)-PARM(Nbeta+1)).LE.0.d0) THEN
c ... print for Ogilvie-Tipping expansion ...
WRITE(6,616) PARM(Nbeta+2),REQ,DSCM,A0,Nbeta,
1 (PARM(I),I= 1,Nbeta)
NCN= 1
ENDIF
ENDIF
IF((PPAR.NE.0).AND.((PPAR.NE.1).OR.
1 ((DABS(PARM(Nbeta+2)-PARM(Nbeta+1)).GT.0.d0).AND.
2 (DABS(PARM(Nbeta+2)*PARM(Nbeta+1)).GT.0.d0)))) THEN
c ... print for general GPEF expansion variable ...
IF(PPAR.LT.0) THEN
c ... for negative PPAR, convert to equivalent positive PPAR case
PPAR= -PPAR
A1= PARM(Nbeta+2)
PARM(Nbeta+2)= -PARM(Nbeta+1)
PARM(Nbeta+1)= -A1
ENDIF
WRITE(6,618) PPAR,PPAR,PARM(Nbeta+1),PPAR,PARM(Nbeta+2),
1 PPAR,REQ,DSCM,A0,Nbeta,(PARM(I),I= 1,Nbeta)
NCN= PPAR
ENDIF
IF(PPAR.EQ.0) THEN
c** For case of simple power series in R itself
NCN= -1
WRITE(6,620) Nbeta,VMIN,(PARM(I),I= 1,Nbeta)
DO I= 1, NPP
ZP= 1.d0
A1= VMIN
DO J= 1,Nbeta
ZP= ZP*XO(I)
A1= A1+ PARM(J)*ZP
ENDDO
VV(I)= A1
ENDDO
c ...Reset asymptote to avoid spurious E > VLIM warnings (e.g. for HO)
cc VLIM= VV(NPP)
RETURN
ENDIF
c ... otherwise - generate potential as a GPEF-type expansion
DO I= 1, NPP
ZZ= (XO(I)**PPAR - REQ**PPAR)/(PARM(Nbeta+1)*XO(I)**PPAR
1 + PARM(Nbeta+2)*REQ**PPAR)
A1= 1.d0
ZP= 1.d0
DO J=1, Nbeta
ZP= ZP*ZZ
A1= A1+ PARM(J)*ZP
ENDDO
VV(I)= A0*ZZ*ZZ*A1 + VMIN
ENDDO
c ...Reset asymptote to avoid spurious E > VLIM warnings (e.g. for HO)
IF(DABS(PARM(Nbeta+1)).LE.0) VLIM= VMIN + MIN(VV(NPP),VV(1))
ENDIF
c
c=======================================================================
c** Generate a simple Morse, or Extended (EMOp) Morse potential, or as
c a special cases, Wei Hua's 4-parameter generalized Morse
c=======================================================================
IF(IPOTL.EQ.3) THEN
IF(Rref.LE.0.d0) Rref= REQ
BETA= PARM(1)
NCN= 99
IF(LNPT.GE.0) THEN
IF(QPAR.GT.0) THEN
c... Normal case is Morse or EMO
IF(Nbeta.EQ.0) THEN
WRITE(6,606) DSCM,REQ,BETA
ELSE
WRITE(6,608) QPAR,DSCM,REQ,Rref,Nbeta,QPAR,QPAR,
1 QPAR,QPAR,NVARB,(PARM(i),i= 1,NVARB)
ENDIF
ELSE
c... Option to generate Wei Hua's extended 4-parameter Morse-type potl.
CSAV= PARM(2)
WRITE(6,605) DSCM,REQ,CSAV,BETA
ENDIF
ENDIF
c Loop over distance array XO(I)
DO I= 1,NPP
c... for Wei Hua's extended Morse function ...
IF(QPAR.LE.0) THEN
VV(I)= DSCM*((1.d0 - DEXP(-BETA*(XO(I)-REQ)))/(1.d0
1 - CSAV*DEXP(-BETA*(XO(I)-REQ))))**2 - DSCM+ VLIM
ELSE
c... for proper Morse or EMO function ...
IF(Nbeta.GE.1) THEN
ZZ= (XO(I)- Rref)/(XO(I)+ Rref)
c... for proper LeRoy-Huang yp(r) expansion ...
IF(QPAR.GT.1) ZZ= (XO(i)**QPAR - Rref**QPAR)/
1 (XO(i)**QPAR + Rref**QPAR)
BETA= 0.d0
DO J= Nbeta,0,-1
BETA= BETA*ZZ+ PARM(J+1)
ENDDO
ENDIF
VV(I)= DSCM*(1.d0 - DEXP(-BETA*(XO(I)-REQ)))**2
1 - DSCM+ VLIM
ENDIF
ENDDO
ENDIF
c=======================================================================
c** Generate an MLR potential [as per J.Chem.Phys. 131, 204309 (2009)]
c=======================================================================
IF(IPOTL.EQ.4) THEN
IF(LNPT.GT.0) THEN
c** for a new case ... define ULRE an print potential description
NCN= MMLR(1)
IF(NCN.LE.0) NCN= MMLR(2)
CNN= CmVAL(1)
ULRe= 0.d0
c*** print for MLR form
WRITE(6,602) QPAR,PPAR,DSCM,REQ
c... for Huang form: \beta(yp)= Binf*yp + [1-yp]*{power series in yq}
IF(APSE.LE.0) WRITE(6,607) PPAR,PPAR,QPAR,Nbeta,RREF,
1 Nbeta+1,(PARM(J),J= 1,Nbeta+1)
c... print for Asen Pashov Spline Exponent (APSE > 0) MLR form
IF(APSE.GT.0) THEN
WRITE(6,604) PPAR,Nbeta,(PARM(J),J= 1,Nbeta)
WRITE(6,610) QPAR,Rref,(XPARM(J),J= 1,Nbeta)
c** Prepare Asen's Rlk array for later use in generating Spline fx.
CALL Lkoef(Nbeta,XPARM,rKL)
ENDIF
c=======================================================================
CALL quadCORR(NCMM,MCMM,NCMMAX,MMLR,DSCM,CmVAL,CmEFF)
c=======================================================================
c** Now - initialize at r= REQ
IF(MMLR(1).LE.0) THEN
c..... for AF 2x2 or 3x3 case ...
CALL AFdiag(REQ,VLIM,NCMM,NCMMax,MMLR,CmEFF,rhoAB,
1 sVSR2,IDSTT,ULRe,dULRdCm,dULRdR)
ELSE
c..... or for 'simple' (damped) inverse-power sum
CALL dampF(REQ,rhoAB,MCMM,NCMMAX,MMLR,sVSR2,IDSTT,DM,
1 DMP,DMPP)
DO J= 1,MCMM
ULRe= ULRe + DM(J)*CmEFF(J)/REQ**MMLR(J)
ENDDO
ENDIF
BINF= DLOG(2.d0*DSCM/ULRe)
WRITE(6,674) BINF,ULRe
ENDIF
REQp= REQ**PPAR
RREFp= Rref**PPAR
RREFq= Rref**QPAR
c Loop over distance array XO(I)
DO I= 1,NPP
ZZ= (XO(i)**PPAR- REQp)/(XO(i)**PPAR+ REQp)
ZP= (XO(i)**PPAR- RREFp)/(XO(i)**PPAR+ RREFp)
ZQ= (XO(i)**QPAR- RREFq)/(XO(i)**QPAR+ RREFq)
IF(APSE.LE.0) THEN
c... for Huang/THEOCHEM constrained polynomial for \beta(r) ...
BETA= 0.d0
DO J= Nbeta,0,-1
BETA= BETA*ZQ+ PARM(J+1)
ENDDO
c... calculate constrained polynomial MLR exponent coefficient
BETA= BINF*ZP + (1.d0- ZP)*BETA
ELSE
c... calculate Pashov cubic spline exponent coefficient ...
BETA= 0.d0
DO m= 1,Nbeta
BETA= BETA + Scalc(ZQ,m,Nbeta,XPARM,rKL,NbetaMX)
1 *PARM(m)
ENDDO
ENDIF
c** Now Calculate local value of uLR(r)
ULR= 0.d0
IF(MMLR(1).LE.0) THEN
c..... for AF 2x2 or 3x3 case ...
CALL AFdiag(XO(i),VLIM,NCMM,NCMMax,MMLR,CmEFF,rhoAB,
1 sVSR2,IDSTT,ULR,dULRdCm,dULRdR)
ELSE
c..... or for 'simple' (damped) inverse-power sum
CALL dampF(XO(i),rhoAB,MCMM,NCMMAX,MMLR,sVSR2,IDSTT,
1 DM,DMP,DMPP)
ULR= 0.d0
DO J= 1,MCMM
ULR= ULR + DM(J)*CmEFF(J)/XO(I)**MMLR(J)
ENDDO
ENDIF
cc write(8,777)xo(i),ulr,ulre,beta,(ULR/ULRe)*DEXP(-BETA*ZZ)
cc777 format(' r=',f9.4,' ulr=',1pd12.5,' uLRe=',d12.5,' beta='
cc 1 ,d12.5,' XP=',D14.7, ' V=',d14.7)
BETA= (ULR/ULRe)*DEXP(-BETA*ZZ)
VV(I)= DSCM*(1.d0 - BETA)**2 - DSCM + VLIM
ENDDO
ENDIF
c=======================================================================
c** Generate a DELR potential [as per JCP 119, 7398 (2003) {revised}]
c=======================================================================
IF(IPOTL.EQ.5) THEN
IF(LNPT.GT.0) THEN
REQq= REQ**QPAR
RREFq= Rref**QPAR
ZZ= (REQq - RREFq)/(REQq + RREFq)
BETA= 0.d0
DO J= Nbeta,0,-1
BETA= BETA*ZZ+ PARM(J+1)
ENDDO
ULRe= 0.0d0
B1= 0.0d0
c... First, calculations @ Re to get AA & BB
CALL dampF(REQ,rhoAB,NCMM,NCMMAX,MMLR,sVSR2,IDSTT,DM,
1 DMP,DMPP)
IF(MMLR(1).LE.0) THEN !! for A-F 2x2 or 3x3 uLR fx,
CALL AFdiag(REQ,VLIM,NCMM,NCMMax,MMLR,CmEFF,rhoAB,
1 sVSR2,IDSTT,ULRe,dULRdCm,dULRdR)
B1= dULRdR
ELSE !! For conventional inverse-power sum
DO J= 1,MCMM
T0= CmEFF(J)/REQ**MMLR(J)
ULRe= ULRe+ T0*DM(J)
B1= B1+ T0*(DMP(J) - DM(J)*MMLR(J)/REQ)
ENDDO
ENDIF
A1= DSCM - ULRe - B1/BETA
B1= 2.d0*A1 + B1/BETA
WRITE(6,650) QPAR,DSCM,REQ,Nbeta,(PARM(I),I= 1,IORD+1)
WRITE(6,652) QPAR,QPAR,QPAR,QPAR,QPAR
IF(Rref.GT.0.d0) WRITE(6,654) Rref
IF(Rref.LE.0.d0) WRITE(6,656) REQ
WRITE(6,658) A1,B1,NCMM
ENDIF
c** Now ... generate potential function array for DELR form
DO I= 1, NPP
XXQ= XO(I)**QPAR
ZZ= (XXQ - RREFq)/(XXQ + RREFq)
BETA= 0.d0
c ... calculate the exponent
DO J= Nbeta,0,-1
BETA= BETA*ZZ+ PARM(J+1)
ENDDO
BETA= DEXP(-BETA*(XO(I)-REQ))
c ... calculate the (damped) long-range tail
CALL dampF(XO(I),rhoAB,NCMM,NCMMAX,MMLR,sVSR2,IDSTT,DM,
1 DMP,DMPP)
IF(MMLR(1).LE.0) THEN !! for A-F 2x2 or 3x3 uLR fx,
CALL AFdiag(XO(i),VLIM,NCMM,NCMMax,MMLR,CmEFF,rhoAB,
1 sVSR2,IDSTT,ULR,dULRdCm,dULRdR)
ELSE
ULR= 0.0d0
DO J= 1, MCMM
ULR= ULR+ DM(J)*CmEFF(J)/XO(I)**MMLR(J)
ENDDO
ENDIF
VV(I)= (A1*BETA - B1)*BETA - ULR + VLIM
ENDDO
ENDIF
c
IF((IPOTL.EQ.6).AND.(Nbeta.EQ.5)) THEN
c=======================================================================
c** For generalized HFDB(m= MMLR(j), j=1,NCMM) potential
c V(r) = ALFA*(r/R_e)**PARM(5) * exp[-BETR*r - PARM(4)*r**2]
c - D(r)*[CmEFF(1)/r**MMLR(1)+ CmEFF(2)/r**sMMLR(2)+ CmEFF(3)/r**MMLR(3)+ ...
c and D(r) = 1 for r > PARM(2) and
c D(x)= exp[-PARM(1)*(PARM(2)/r - 1)**PARM(3)] for r < PARM(2)
c=======================================================================
IF(LNPT.GT.0) THEN
NCN= MMLR(1)
CNN= CmEFF(1)
A1= PARM(1)
A2= PARM(2)
A3= PARM(3)
B2= PARM(4)
DX= 1.d0
DX1= 0.d0
IF(A2.GT.1.d0) THEN !!!!!!!!!!!!!!!!!!! GT.REQ) THEN
DX= DEXP(-A1*(A2/REQ - 1.d0)**A3)
DX1= A1*A2*A3*DX*(A2/REQ - 1.d0)**(A3- 1.d0)/REQ**2
ENDIF
DSUM= 0.d0
DSUMP= 0.d0
DO J= 1, NCMM
B1= CmEFF(J)/REQ**MMLR(j)
DSUM= DSUM + B1
DSUMP= DSUMP + B1*(DX1 - DX*MMLR(j)/REQ)
ENDDO
ALFA= DSUM*DX -DSCM
IF(ALFA.LE.0.d0) THEN
WRITE(6,622) ALFA,(MMLR(J),CmEFF(J),J= 1, NCMM)
STOP
ENDIF
B1= PARM(5)/REQ - 2.d0*B2*REQ - DSUMP/ALFA
ALFA= ALFA*DEXP(REQ*(B1 + B2*REQ))
WRITE(6,624) A1,A2,A3
WRITE(6,626) 'ABC',PARM(5),DSCM,REQ,B1,B2,ALFA
ENDIF
DO I= 1,NPP
X1= XO(I)
XP1= 0.0D0
IF((X1*(B1+ B2*X1)).LT.170.D0) XP1= DEXP(-X1*(B1+ B2*X1))
XP1= XP1*(X1/REQ)**PARM(5)
FC1= 0.d0
DO J= 1, NCMM
FC1= FC1 + CmEFF(J)/X1**MMLR(J)
ENDDO
IF(X1.LT.A2) FC1= FC1*DEXP(-A1*(A2/X1- 1.d0)**A3)
VV(I)= ALFA*XP1- FC1 + VLIM
ENDDO
ENDIF
c
IF((IPOTL.EQ.6).AND.(Nbeta.EQ.2)) THEN
c=======================================================================
c** For generalized HFD-ID(m= MMLR(j), j=1,NCMM) potential
c V(r) = ALFA*x**PARM(5) * exp[-BETR*r - PARM(4)*r**2] - f2(\rho*r) *
c \sum_m{ D_m^{ds}(\rho*r)*CmEFF(m)/r**MMLR(m)} with x=r/R_e and
c f2(\rho*Rbohr)= (\rho*Rbohr)^{1.68} * exp{-0.78*\rho*Rbohr}
c=======================================================================
IF(LNPT.GT.0) THEN
B2= PARM(1)
GAMMA= PARM(2)
NCN= MMLR(1)
CNN= CmEFF(1)
sVSR2= 0
Rbohr= REQ/bohr
f2= 1.d0 - (rhoAB*Rbohr)**1.68d0 *EXP(-0.78d0*rhoAB*Rbohr)
f2p= (f2 - 1.d0)*(1.68d0/REQ - 0.78d0*rhoAB/bohr)
CALL dampF(REQ,rhoAB,NCMM,NCMMAX,MMLR,sVSR2,IDSTT,DM,
1 DMP,DMPP)
DSUM= 0.d0
DSUMP= 0.d0
DO m= 1, NCMM
B1= CmEFF(m)/REQ**MMLR(m)
DSUM= DSUM + DM(m)*B1
DSUMP= DSUMP + B1*(f2p*DM(m) + f2*(DMP(m)
1 - DM(m)*MMLR(m)/REQ))
ENDDO
ALFA= f2*DSUM - DSCM
IF(ALFA.LE.0.d0) THEN
WRITE(6,622) ALFA,(MMLR(J),CmEFF(J),J= 1, NCMM)
STOP
ENDIF
B1= GAMMA/REQ - 2.d0*B2*REQ - DSUMP/ALFA
ALFA= ALFA*DEXP(REQ*(B1 + B2*REQ))
WRITE(6,625)
WRITE(6,626) 'ID ',GAMMA,DSCM,REQ,B1,B2,ALFA
ENDIF
DO I= 1,NPP
X1= XO(I)
Rbohr= X1/bohr
f2= 1.d0 - (rhoAB*Rbohr)**1.68d0 *EXP(-0.78d0*rhoAB*Rbohr)
CALL dampF(X1,rhoAB,NCMM,NCMMAX,MMLR,sVSR2,IDSTT,DM,
1 DMP,DMPP)
DSUM= 0.d0
DO m= 1, NCMM
DSUM = DSUM+ DM(m)*CmEFF(m)/X1**MMLR(m)
ENDDO
XP1= 0.0D0
IF((X1*(B1+ B2*X1)).LT.170.D0) XP1= DEXP(-X1*(B1+ B2*X1))
XP1= XP1*(X1/REQ)**GAMMA
VV(I)= ALFA*XP1- F2*DSUM + VLIM
ENDDO
ENDIF
c
IF(IPOTL.EQ.7) THEN
c=======================================================================
c** Generate Generalized Tang-Toennies (TT) type potential as desribed
c in the LEVEL manual: JQSRT(submitted Feb. 2016)
c NCMM = number of inverse-power long-range terms and NVARB = 9.
c DSCM and Re are the reported PEC minimum parameters. The powers and
c coefficients of the NCMM inverse-power long-range terms are MMCM(j)
c and CmEFF(j), with damping fx defined by rhoAB, IDSTT & sVSR2
c=======================================================================
NCN= MMLR(1)
CNN= CmEFF(1)
IDSTT= 0
sVSR2= 2
c** Define rhoINT for consistency with conventional TT(sVSR2=+2) damping fx.
rhoINT= rhoAB/3.13d0
VMIN= VLIM
IMIN= 1
DO I= 1, NPP
c....generate potential function array
CALL dampF(XO(I),rhoINT,NCMM,NCMMAX,MMLR,sVSR2,IDSTT,DM,
1 DMP,DMPP)
c....calculate the (damped) long range tail
A3= 0.d0
DO J= 1, NCMM
A3= A3+ DM(J)*CmEFF(J)/XO(I)**MMLR(J)
ENDDO
c....For Generalized TT model
XP1= PARM(1)*XO(I)+ PARM(2)*XO(I)**2+ PARM(3)/XO(I)
1 + PARM(4)/XO(I)**2
VV(I)= (PARM(5) + PARM(6)*XO(I) + PARM(7)/XO(I) +
1 PARM(8)*XO(I)**2 +PARM(9)*XO(I)**3)*DEXP(-XP1) - A3 + VLIM
IF(VV(I).LE.VMIN) THEN
c... search for potential minimum ...
VMIN= VV(I)
IMIN= I
ENDIF
ENDDO
WRITE(6,628) (PARM(i),i=1,9)
c*** Use quadratic approximation to determine REQ and DSCM
IF(IMIN.EQ.1) IMIN=2
A1= VV(IMIN-1)
A2= VV(IMIN)
A3= VV(IMIN+1)
RH= XO(IMIN) - XO(IMIN-1)
B1= (A3- 2.d0*A2 + A1)/(2.d0*RH**2) !! curvature
nREQ= XO(IMIN) + 0.5d0*RH - (A3-A2)/(2.d0*RH*B1)
A2= A2- B1*(XO(IMIN)-nREQ)**2
nDSCM= VLIM - A2
WRITE(6,629) DSCM,REQ, nDSCM,nREQ
ENDIF
c
IF(IPOTL.EQ.8) THEN
c=======================================================================
c** Generate Tiemann-type polynomial potential attached to inverse-power
c tail and 1/R^{12} (or exponential) inner wall [PRA 63, 012710 (2000)]
c Polynomial expansion variable is z= [R - Rm]/[R + b*Rm] where
c expansion has constant and linear terms. The read-in DSCM= De (well
c depth), but Rm (read in as REQ) is not precisely Re (for a1 .neq. 0)
c NCMM= number of inverse-power long-range terms;
c NVARB= (polynomial order) + 4. [PPAR and APSE are dummy parameters]
c** Read-in parameters PARM(i) are in order: the (Nbeta+1) polynomial
c coefficients a(0) - a(Nbeta), the expansion variable denominator
c factor b=PARM(Nbeta+2), and the the inner and outer bounds on the
c polynomial domain, Tiemann's Rinn=PARM(Nbeta+3) & Rout=PARM(Nbeta+4),
c respectively. The powers and coefficients (-ve if attractive) of the
c NCMM inverse-power long-range terms are MMCM(j) and CmEFF(j).
c=======================================================================
IF(LNPT.GT.0) THEN
NCN= MMLR(1)
CNN= -CmEFF(1)
A0= VLIM- DSCM
BT= PARM(Nbeta+2)
Rinn= PARM(Nbeta+3)
Rout= PARM(Nbeta+4)
c** Determine analytic function attaching smoothly to inner wall of
c polynomial expansion at R= Rinn < Rm
ZZ= (Rinn - REQ)/(Rinn+ BT*REQ)
ZP= 1.d0
A1= PARM(1)
A2= 0.d0
DO J= 1,Nbeta
A2= A2+ J*ZP*PARM(J+1)
ZP= ZP*ZZ
A1= A1+ ZP*PARM(J+1)
ENDDO
A2= A2*(REQ+ BT*REQ)/(Rinn + BT*REQ)**2
c* If inward extrapolation is exponential: A1*exp(-A2*(R-Rinn))
A2= -A2/A1
c* If inward extrapolation is inverse-power: A1 + A2/R**12
c*** To invoke this version, comment out precious line and UNcomment
c the next 2 lines
c A2= -A2*Rinn**13/12.d0
c A1= A1 - A2/Rinn**12 + VLIM - DSCM
c** With long-range tail an NCMM-term inverse-power sum, add 1 additional
c higher-power term to ensure continuity (not smoothness) at Rout
c** NOTE attractive long-range terms have negative (-) coefficients!
ZZ= (Rout - REQ)/(Rout+ BT*REQ)
ZP= 1.d0
B1= PARM(1)
DO J= 1,Nbeta
ZP= ZP*ZZ
B1= B1+ ZP*PARM(J+1)
ENDDO
A3= DSCM
DO J= 1,NCMM
A3= A3+ CmEFF(J)/Rout**MMLR(J)
ENDDO
PPAR= NCMM+ 1
MMLR(PPAR)= MMLR(NCMM)+ 2
CmEFF(PPAR)= (B1-A3)*Rout**MMLR(PPAR)
c*** Print for Tiemann-type potential
IF(LNPT.GE.0) THEN
WRITE(6,640) DSCM,REQ,PARM(Nbeta+2),Nbeta,Nbeta+1,
1 (PARM(J),J= 1,Nbeta+1)
ccc IF(XO(1).LT.Rinn) WRITE(6,642) PARM(Nbeta+3),A1,A2,A0
IF(XO(1).LT.Rinn) WRITE(6,642) PARM(Nbeta+3),A1,A2
IF(XO(NPP).GT.Rout) WRITE(6,644) PARM(Nbeta+4),
1 (CmEFF(J),MMLR(J),J= 1, PPAR)
ENDIF
ENDIF
c ... now generate potential as a Tiemann-type expansion
DO I= 1, NPP
IF(XO(I).LE.Rinn) THEN
c ... for exponential inward extrapolation ... for consistency with manual
VV(I)= A1*DEXP(-A2*(XO(I)- Rinn)) + A0
c ... for A + B/R**12 inward extrapolation ... possible alternative
c VV(I)= A1 + A2/XO(I)**12
ELSEIF(XO(I).LE.Rout) THEN
ZZ= (XO(I) - REQ)/(XO(I) + BT*REQ)
A3= A0 + PARM(1)
ZP= 1.d0
DO J= 1,Nbeta
ZP= ZP*ZZ
A3= A3+ PARM(J+1)*ZP
ENDDO
VV(I)= A3
ELSEIF(XO(I).GT.Rout) THEN
A3= VLIM
DO J= 1, PPAR
A3= A3+ CmEFF(J)/XO(I)**MMLR(J)
ENDDO
VV(I)= A3
ENDIF
ENDDO
ENDIF
c
IF(IBOB.GT.0) THEN
c=======================================================================
c** If appropriate, generate Born-Oppenheimer breakdown correction
c functions to rotationless and/or centrifugal potential(s) using
c LeRoy/Huang radial functions ...
c=======================================================================
DO I=1,NPP
YPAD= (XO(I)**PAD- REQ**PAD)/(XO(I)**PAD+ REQ**PAD)
YQAD= (XO(I)**QAD- REQ**QAD)/(XO(I)**QAD+ REQ**QAD)
YQNA= (XO(I)**QNA- REQ**QNA)/(XO(I)**QNA+ REQ**QNA)
SC1= U1INF*YPAD
SC2= U2INF*YPAD
SG1= T1INF*YQNA
SG2= T2INF*YQNA
YQADSM= (1.d0- YPAD)
YQNASM= (1.d0- YQNA)
c ... finally, accumulate overall BOB terms ... all at the same time!
DO J= 0,NCMAX
SC1= SC1+ YQADSM*U1(J)
SC2= SC2+ YQADSM*U2(J)
SG1= SG1+ YQNASM*T1(J)
SG2= SG2+ YQNASM*T2(J)
YQADSM= YQADSM*YQAD
YQNASM= YQNASM*YQNA
ENDDO
RM2(I)= (1.d0+ SG1+ SG2)/XO(i)**2
VV(I)= VV(I) + SC1 + SC2
ENDDO
VLIM= VLIM+ DVLIM
IF((IPOTL.EQ.4).AND.(MMLR(1).LE.0)) THEN
c!! For mixed isotopopogue {6,7}Li_2(A) state, shift asymptote! ??? HUH ???
IF((IMN1.NE.IMN2).AND.(MMLR(1).EQ.0)) THEN
DO I= 1,NPP
RM3= (2.d0/3.d0)*CmEFF(1)/XO(I)**3
VV(I)= VV(I)+ RM3- DSQRT(RM3**2+ 3.085959756d-02)
ENDDO
VLIM= VLIM + DSQRT(3.085959756d-02)
ENDIF
c** For special case of A and c states of Li2, add BOB centrifugal term
IF((MMLR(1).EQ.0).OR.(MMLR(1).EQ.-2)) THEN
BFCT2= 2.d0*16.857629206d0*(MASS1+MASS2)/(MASS1*MASS2)
DO I= 1, NPP
VV(I)= VV(I) + BFCT2/XO(I)**2 !!! ??? HUH ???
ENDDO
ENDIF
ENDIF
ENDIF
RETURN
600 FORMAT(/' Lennard-Jones(',I2,',',I2,') potential with De=',
1 F10.3,'(cm-1) Re =',F10.6,'(A)')
602 FORMAT(/' MLR(q=',I1,', p=',I1,') Potential with: De='
1 ,F10.4,'[cm-1] Re=',F12.8,'[A]')
604 FORMAT(' with SE-MLR exponent coefft beta(r)='/22x,'y',I1,
1 '^{eq} *{Spline through the',I3,' function values} beta_i ='/
2 (10x,4D16.8:))
605 FORMAT(/' Potential is a Hua-Wei 4-parameter Morse type function w
1ith De =',F11.4/11x,'Re =',F12.9,' C=',f7.4,' & beta=',
1 F13.10,' [1/Angstroms]')
606 FORMAT(/' Potential is a simple Morse function with De =',F12.4,
1 ' Re =',F12.9/39x,'and beta =',F13.10,' [1/Angstroms]')
607 FORMAT(' with PE-MLR exponent coefft: beta(r)= beta{INF}*y',I1,
1 ' + [1-y',i1,']*Sum{beta_i*y',i1,'^i}'/6x,'exponent power series
2 of order',I3,' in a variable in which Rref=',f8.5/
3 6x,'with',i3,' coefficients:',1PD17.9,2D17.9:/(10x,4D17.9:))
608 FORMAT(/' EMO_',i1,' Potential with De=',F11.4,' Re=',F11.8,
1 ' Rref=',F11.8/3x,'Exponent coeft: order-',i2,
2 ' power series in y=(r**',i1,' - Rref**',i1,')/(r**',i1,
3 ' + Rref**',i1,')'/' with',I3,' coefficients:',1x,1PD17.9,
4 2D17.9:/(7X,4D17.9:))
610 FORMAT(5x,'at distances defined by y_',I1,'(r; RREF) ='/
1 (10x,4D16.8:))
612 FORMAT(/' Potential is a Dunham expansion in (r-Re)/(',f5.2,
1 ' * Re) with Re=',f12.9/' V(Re)=',f12.4,' a0=',1PD16.9,
2 ' and',i3,' a_i coefficients:'/(5D16.8))
614 FORMAT(/' Potential is an SPF expansion in (r-Re)/(',F5.2,
1 '* r) with Re=',f12.9/5x,'De=',g18.10,' b0=',
2 1PD16.9,' and',i3,' b_i coefficients:'/(5D16.8))
616 FORMAT(/' Potential is an O-T expansion in (r-Re)/[',f5.2,
1 '*(r+Re)] with Re=',f12.9/5x,'De=',G18.10,
2 ' c0=',1PD16.9,' and',i3,' c_i coefficients:'/(5D16.8))
618 FORMAT(/' Potential is a general GPEF expansion in (r**',i1,
1 ' - Re**',i1,')/(',SP,F5.2,'*r**',SS,i1,SP,F6.2,'*Re**',SS,i1,
2 ')'/5x,'with Re=',f12.9,' De=',g18.10,' g0=',1PD16.9/
3 5x,'and',i3,' g_i coefficients: ',3D16.8/(5D16.8:))
620 FORMAT(/' Potential is a power series in r of order',i3,
1 ' with V(r=0)=',f11.4/3x,'& coefficients (from linear term):',
2 1P2d16.8:/(5x,4D16.8:))
617 FORMAT(' betaINF=',f16.12,' & uLR defined by C',i1,' =',
1 1PD13.6,'[cm-1 Ang','^',0P,I1,']')
622 FORMAT(/' *** ERROR in generating HFD potential *** generate ALF
1A=',1PD15.7,' from reduced Cm coefficients:'/(3x,3(' C',I2,
2 '=',D15.7:)) )
624 FORMAT(15x,'and overall damping function:'/20x,'D(r)= exp[ -',
1 0P,f8.6,'*(',f11.8,'/r -1.0)**',f5.2,']')
625 FORMAT(15x,'and overall damping function:'/20x,'f2(r)= 1 - {rhoAB*
3r[bohr]^1.68 *exp{0.78*rhoAB*r[bohr]}')
626 FORMAT(/' Potential is Generalized HFD-',a3,' with radial power
1 gamma=',F9.6/ ' De=',f10.4,'[cm-1] Re=',f9.6,'[Ang.], wit
2h exponential-term factors:'
3 5x,'beta1=',f11.8,' beta=',f11.8,' and A(pre-exp)=',1PD16.9)
628 FORMAT(/' Generalized Tang-Tonnies Potential function with exponen
1t function'/' - {{',SP,F15.11,'*r',F15.11,'*r^2',F15.11,'/r',
2 F15.11,'/r^2}}'/' and pre-exp factor:'/3x,'{{',SP,1PD15.8,D16.8,
3 '*r',d16.8,'/r',d16.8,'*r^2'/21x,D16.8,'*r^3}}',S)
629 FORMAT(/10x,'Input DSCM=',F10.4,' REQ=',f9.6/ 10x,
1 'Actual DSCM=',F10.4,' REQ=',f9.6)
630 FORMAT(/' BOB adiabatic potential correction for atom-',I1,
1 ' of mass ',f15.11/' consists of mass factor [1- MASS(',I3,
2 A2,')/MASS(',I3,A2,')] multiplying all of:'/5x,'u',I1,'INF=',
3 f11.6,' times y',i1,'= [(r**',i1,' - Re**',i1,')/(r**',i1,
4 ' + Re**',i1,')] plus'/7x,'[1 - y',i1,'] times an order',I3,
5 ' polynomial in'/7x,'y',i1,'=[(r**',i1,' - Re**',i1,')/(r**',i1,
6 ' + Re**',i1,')] with the ',i3,' coefficients:'/1P,(3x,4D17.9:))
634 FORMAT(/' BOB centrifugal correction for atom-',I1,' of mass ',
1 f15.11/3x,'consists of mass factor [MASS(',I3,A2,')/MASS(',I3,
2 A2,')] multiplying all of:'/5x,'q',i1,'INF=',1PD17.9,
3 ' times y',i1,'= [(r**',i1,' - Re**',i1,')/(r**',i1,' + Re**',
4 i1,')]'/ 3x,'plus [1 - y',i1,'] times an order',I3,' polynomial i
6n y',i1, '(r) with the',i3,' coefficients:'/(3x,1P,4D17.9:))
636 FORMAT(3x,'where fsw(r) = 1/[1 - exp{',f7.4,'*(r -',f7.4,')}]')
638 FORMAT(/' BOB centrifugal correction for atom-',I1,' of mass ',
1 f15.11/3x,'consists of mass factor [mass{electron}/MASS(',I3,
2 A2,')]'/' multiplying q',i1,'INF=',1PD17.9,' times [1 - fsw(
3r)/fsw(Re)]'/ ' plus fsw(r) times an order',0P,i3,' polynomial
4 in z{O-T} with coefficients:'/ 1P,(3x,4D17.9:))
640 FORMAT(/' Tiemann-type potential with De=',F11.4,' Rm=',f9.6,
1 ' is a power series'/10x,'in (r - Re)/(r ',SP,F9.5,
2 '*Re) of order',SS,I3,' with the',I3,' coefficients:'/(5D16.8))
c 642 FORMAT(' where for r < Rinn=',F7.4,' V=',1PD13.6,'*exp[-',
c 1 0P,F9.6,'*(r - Rinn)] ',SP,F10.3)
642 FORMAT(' where for r < Rinn=',F7.4,' V=',SP,F12.4,1x,1PD13.6,
1 '/R**12' )
644 FORMAT(' and for r > Rout=',F7.3,' V= VLIM ',
1 (SP,1PD14.6,'/r**',SS,I2):/(39x,SP,1PD14.6,'/r**',SS,I2))
650 FORMAT(/' DELR(q=',i2,') Potential with De=', F11.4,'[cm-1] Re
1=',F11.8,'[A] where'/3x,'exponent coefft. has power series order
2',I4/6x,'with polynomial coefficients',8x,1PD17.8,D17.8/
3 (8x,4D17.8))
652 FORMAT(6x,'where the radial variable y_',I1,'= (r**',I1,' - Rref
4**',i1,')/(r**',I1,' + Rref**',i1, ')')
654 FORMAT(10x,'is defined w.r.t. Rref=',F11.8)
656 FORMAT(10x,'is defined w.r.t. Rref= Re= ',F11.8)
658 FORMAT(3x,'Generate A(DELR)=',1Pd17.9,' B(DELR)=',D17.9/
1 6x,'from uLR defined by',I2,' inverse-power terms')
660 FORMAT(/' uLR inverse-power terms incorporate DS-type damping with
1 rhoAB=',f9.6/8x,'defined to give very short-range Dm(r)*Cm/r^m
2 behaviour r^{',SS,I2,'/2}'/8x,'Dm(r)= [1 - exp(-',f5.2,
3 '(rhoAB*r)/m -',f6.3,'(rhoAB*r)^2/sqrt{m})]^{m',SP,I3,'/2}')
662 FORMAT(/' uLR inverse-power terms incorporate TT-type damping with
1 rhoAB=',f9.6/8x,'defined to give very short-range Dm(r)*Cm/r^m
2 behaviour r^{',I2,'}'/8x,'Dm(r)= [1 - exp(-bTT*r)*SUM{(bTT*r)^
3k/k!}] where bTT=',f6.3,'*rhoAB')
663 FORMAT(/' uLR inverse-power terms incorporate TT-type damping with
1 rhoAB=',f13.10/8x,'defined to give very short-range Dm(r)*Cm/r
2^m behaviour r^{',I2,'}'/8x,'Dm(r)= [1 - exp(-bTT*r)*SUM{(bTT*r
3)^k/k!}] where bTT= rhoAB')
664 FORMAT(' uLR(r) inverse-power terms inlude NO individual-term damp
1ing')
666 FORMAT(4x,'*** ERROR *** MMLR(1)=',I3,' A-F diagonalization not d
1efined for NCMM=', I3)
668 FORMAT(5x,'Use Lyon 2x2 ',A7,' uLR(r) with Aso=',F11.6/
1 47x,'C_3(^1Sig)=',1PD15.7:/47x,'C_3(^3Pi) =',D15.7:/
1 47x,'C_6(^1Sig)=',1PD15.7:/47x,'C_6(^3Pi) =',D15.7:/
1 47x,'C_8(^1Sig)=',1PD15.7:/47x,'C_8(^3Pi) =',D15.7)
670 FORMAT(' Use Lyon 3x3 ',A7,' uLR(r) with Aso=',F11.6 /
1 47x,'C_3(^3Sig)=',D15.7:/47x,'C_3(^1Pi) =',D15.7:/
2 47x,'C_3(^3Pi) =',D15.7:/
3 47x,'C_6(^3Sig)=',D15.7:/47x,'C_6(^1Pi) =',D15.7:/
4 47x,'C_6(^3Pi) =',D15.7:/
5 47x,'C_8(^3Sig)=',D15.7:/47x,'C_8(^1Pi) =',D15.7:/
6 47x,'C_8(^3Pi) =',D15.7)
672 FORMAT(' uLR(r) has ',I3,' inverse-power terms:',4x,'C',I1,
1 ' =',1PD16.8:/40x,'C',i1,' =',D16.8:/(40x,'C',i2,'=',D16.8:))
674 FORMAT(' Generate betaINF=',f16.12,' from uLR(Re)=',
1 1PD17.10)
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c===========================================================================
SUBROUTINE quadCORR(NCMM,MCMM,NCMMAX,MMLR,De,CmVAL,CmEFF)
c===========================================================================
c** subroutine to generate and print MLR CmEFF values incorporating
c quadratic 'Dattani' corrections to Cm values for both standard 'linear'
c and A-F diagonalized uLR(r) functions for MLR potentials
c** Return MCMM= NCMM+1 for C9{adj} term for m_1= 3 potentials
c===========================================================================
INTEGER NCMM,MCMM,NCMMAX,MMLR(NCMMAX)
REAL*8 De,CmVAL(NCMMAX),CmEFF(NCMMAX)
c----------------------------------------------------------------------
IF(MMLR(1).GT.0) THEN
c** For 'normal' inverse-power sum MLR case, with or without damping,
c set up Dattani's 'Quadratic-corrected' effective Cm values
IF((MMLR(1).EQ.6).AND.(NCMM.GE.4)) THEN
c... First, consider C6/C12adj(C14adj) for MMLR(m)={6,8,10,(11),12,14} case
IF(MMLR(4).EQ.12) THEN ! explicitly MMLR(4)=12
CmEFF(4)= CmVAL(4)+ 0.25D0*CmVAL(1)**2/De
WRITE(6,710) MMLR(4),MMLR(4),CmEFF(4)
ENDIF
IF(NCMM.GE.5) THEN
IF(MMLR(4).EQ.11) THEN ! implicitly MMLR(5)=12
CmEFF(5)= CmVAL(5) + 0.25D0*CmVAL(1)**2/De
WRITE(6,710) MMLR(5),MMLR(5),CmEFF(5)
IF(NCMM.GE.6) THEN ! implicitly MMLR(6)=14
CmEFF(6)= CmVAL(6)+ 0.5D0*CmVAL(1)*CmVAL(2)/De
WRITE(6,710) MMLR(6),MMLR(6),CmEFF(6)
ENDIF
ENDIF
IF(MMLR(4).EQ.12) THEN ! assuming MMLR(5)=14
CmEFF(5)= CmVAL(5) + 0.5D0*CmVAL(1)*CmVAL(2)/De
WRITE(6,710) MMLR(5),MMLR(5),CmEFF(5)
ENDIF
ENDIF
ENDIF
IF((MMLR(1).EQ.5).AND.(NCMM.GE.4)) THEN
c... Then, consider C5/C10adj + C12adj for MMLR(m)={5,6,8,10,12,14} cases
CmEFF(4)= CmVAL(4) + 0.25D0*CmVAL(1)**2/De
WRITE(6,710) MMLR(4),MMLR(4),CmEFF(4)
IF(NCMM.GE.5) THEN ! introduce C12^{adj}
CmEFF(5)= CmVAL(5) + 0.25D0*CmVAL(2)**2/De
WRITE(6,710) MMLR(5),MMLR(5),CmEFF(5)
IF(NCMM.GE.6) THEN ! introduce C14^{adj}
CmEFF(6)= CmVAL(6) + 0.5D0*CmVAL(2)*CmVAL(3)/De
WRITE(6,710) MMLR(6),MMLR(6),CmEFF(6)
ENDIF
ENDIF
ENDIF
IF((MMLR(1).EQ.4).AND.(NCMM.GE.3)) THEN
c... Then, consider C4/C8adj + C12adj for MMLR(m)={4,6,8,10,12,14} cases
CmEFF(3)= CmVAL(3) + 0.25D0*CmVAL(1)**2/De
WRITE(6,712) MMLR(3),MMLR(3),CmEFF(3)
IF(NCMM.GE.4) THEN ! implicitly MMLR(4)=10
CmEFF(4)= CmVAL(4) + 0.5D0*CmVAL(1)*CmVAL(2)/De
WRITE(6,710) MMLR(4),MMLR(4),CmEFF(4)
IF(NCMM.GE.5) THEN ! implicitly MMLR(5)=12
CmEFF(5)= CmVAL(5) + 0.5D0*CmVAL(1)*CmVAL(3)/De
1 + 0.25D0*CmVAL(2)**2/De
WRITE(6,710) MMLR(5),MMLR(5),CmEFF(5)
IF(NCMM.GE.6) THEN ! implicitly MMLR(6)=14
CmEFF(6)= CmVAL(6)+ 0.5D0*CmVAL(2)*CmVAL(3)/De
1 + 0.5D0*CmVAL(1)*CmVAL(4)/De
WRITE(6,710) MMLR(6),MMLR(6),CmEFF(6)
ENDIF
ENDIF
ENDIF
ENDIF
IF((MMLR(1).EQ.3).AND.(NCMM.GE.2)) THEN
c... Then, consider C3/C6adj + C9adj for MMLR(m)={3,6,8,(9),10,12,14} cases
CmEFF(2)= CmVAL(2) + 0.25D0*CmVAL(1)**2/De
WRITE(6,712) MMLR(2),MMLR(2),CmEFF(2)
IF(NCMM.GE.3) THEN ! introduce C9adj & MMLR=9
MCMM= NCMM + 1
MMLR(MCMM)= 9
CmEFF(MCMM)= 0.5d0*CmVAL(1)*CmEFF(2)/De
WRITE(6,714) MMLR(MCMM),CmEFF(MCMM)
IF(NCMM.GE.5) THEN ! implicitly MMLR(5)=12
CmEFF(5)= CmVAL(5) + 0.5D0*CmVAL(1)*CmEFF(MCMM)/De
1 + 0.25D0*CmEFF(2)**2/De
WRITE(6,710) MMLR(5),MMLR(5),CmEFF(5)
IF(NCMM.GE.6) THEN ! implicitly MMLR(6)=14
CmEFF(6)= CmVAL(6)+ 0.5D0*CmEFF(2)*CmVAL(3)/De
WRITE(6,710) MMLR(6),MMLR(6),CmEFF(6)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
c======================================================================= c
c** End of CmEFF= Cm + CmADJ setup for non-AF case ===================
710 Format(" 'Quadratic correction' for C",I2,'(MLR) yields',
1 6x,'C',I2,'{adj}=',1PD15.8)
712 Format(" 'Quadratic correction' for C",I1,'(MLR) yields',
1 7x,'C'I1,'{adj}=',1PD15.8)
714 Format(" 'Quadratic corrn' for MLR(m_1=3) introduces C",
1 I1,'(',A4,',adj)=',1PD15.8)
716 Format(" 'Quadratic correction' for C",I1,'(Sigma) yields C',
1 I1,'(Sigma,adj)=',1PD15.8)
718 Format(" 'Quadratic correction' for C",I1,'(^3Pi) yields C',
1 I1,'(^3Pi,adj) =',1PD15.8)
720 Format(" 'Quadratic correction' for C",I1,'(^1Pi) yields C',
1 I1,'(^1Pi,adj) =',1PD15.8)
c=========================================================================
IF(MMLR(1).LE.0) THEN
c** implement Quadratic 'Dattani' MLR corrections for AF cases
IF(MMLR(1).GE.-1) THEN !! first for the 2x2 cases ...
CmEFF(4)= CmVAL(4) + 0.25*CmVAL(2)**2/De
CmEFF(5)= CmVAL(5) + 0.25*CmVAL(3)**2/De
WRITE(6,716) MMLR(4),MMLR(4),CmEFF(4)
WRITE(6,718) MMLR(5),MMLR(5),CmEFF(5)
c* prepare C9{adj} coefficients for addition to chosen root
MMLR(8)= 9 !! These terms added just
MMLR(9)= 9 !! before exit from AFdiag
Cmeff(8)= 0.5*CmVAL(2)*CmEFF(4)/De
WRITE(6,714) MMLR(8),'Sigm',CmEFF(8)
Cmeff(9)= 0.5*CmVAL(3)*CmEFF(5)/De
WRITE(6,714) MMLR(9),'^3Pi',CmEFF(9)
ENDIF
IF(MMLR(1).LE.-2) THEN !! now for the 3x3 cases ...
CmEFF(5)= CmVAL(5) + 0.25*CmVAL(2)**2/De
WRITE(6,716) MMLR(5),MMLR(5),CmEFF(5)
CmEFF(6)= CmVAL(6) + 0.25*CmVAL(3)**2/De
WRITE(6,720) MMLR(6),MMLR(6),CmEFF(6)
CmEFF(7)= CmVAL(7) + 0.25*CmVAL(4)**2/De
WRITE(6,718) MMLR(7),MMLR(7),CmEFF(7)
c* prepare C9{adj} coefficients for addition to chosen root
MMLR(11)= 9 !! These terms added just
MMLR(12)= 9 !! before exit from AFdiag
MMLR(13)= 9
Cmeff(11)= 0.5*CmVAL(2)*CmEFF(5)/De
IF(MMLR(1).EQ.-2) WRITE(6,714) MMLR(11),'Sigm',CmEFF(11)
Cmeff(12)= 0.5*CmVAL(3)*CmEFF(6)/De
IF(MMLR(1).EQ.-3) WRITE(6,714) MMLR(12),'^3Pi',CmEFF(12)
Cmeff(13)= 0.5*CmVAL(4)*CmEFF(7)/De
IF(MMLR(1).EQ.-4) WRITE(6,714) MMLR(13),'^1Pi',CmEFF(13)
ENDIF
ENDIF
RETURN
END
c23456789012345678901234567890123456789012345678901234567890123456789012
c*
SUBROUTINE dampF(r,rhoAB,NCMM,NCMMAX,MMLR,sVRS2,IDSTT,DM,DMP,DMPP)
c** Subroutine to generate values 'Dm' and its first `Dmp' and second
c 'Dmpp' derivatives w.r.t. r of the chosen form of the damping
c function, for m= 1 to MMAX.
c---------------------- RJL Version of 21 April 2016 -------------------
c-----------------------------------------------------------------------
c Upon Input
c* r - the radial distance in Angsroms (!)
c* RHOab 'universal' scaling coefficient used for systems other than H_2
c RHOab= 2*(RHOa*RHOb)/(RHOa+RHOb) where RHOa = (I_p^A/I_p^H)^0.66
c where I_p^A is the ionization potential of atom A
c and I_p^H is the ionization potential of atomic hydrogen
c* NCMM the number of inverse-power terms to be considered
c* MMLR are the powers of the NCMM inverse-power terms
c* sVRS2 defines damping s.th. Dm(r)/r^m --> r^{sVRS2/2} as r --> 0
c* IDSTT specifies damping function type: > 0 use Douketis et al. form
c if IDSTT .LE. 0 use Tang-Toennies form
c-----------------------------------------------------------------------
c Upon Output
c DM(m) - The value of the damping function for the long range term
c C_MMLR(m)/r^MMLR(m) {m= 1, NCMM}
c DMP(m): 1'st derivative w.r.t. r of the damping function DM(m)
c DMPP(m): 2'nd derivative w.r.t. r of the damping function DM(m)
c IF(rhoAB.LE.0.0) return w. DM(m)= 1.0 & DMP(m)=DMPP(m)=0.0 for all m
c-----------------------------------------------------------------------
INTEGER NCMM,NCMMAX,MMLR(NCMMAX),sVRS2,IDSTT,sVRS2F,FIRST, Lsr,m,
1 MM,MMAX,MMTEMP
REAL*8 r,rhoAB,bTT(-2:2),cDS(-4:4),bDS(-4:4),aTT,br,XP,YP,
1 TK, DM(NCMMAX),DMP(NCMMAX),DMPP(NCMMAX),SM(-3:25),
2 bpm(20,-4:0), cpm(20,-4:0),ZK
c------------------------------------------------------------------------
c The following values for the numerical factors used in both TT and DS
c were normalized to the Hydrogen data presented
c by Kreek and Meath in J.Chem.Phys. 50, 2289 (1969).
c The ratio has been chosen such that b= FACTOR*(I_p^X / I_p^H)^{2/3}
c for the homoatomic diatomic species X_2, where I_p^A is the ionization
c------------------------------------------------------------------------
DATA bTT/2.10d0,2.44d0,2.78d0,3.13d0,3.47d0/
DATA bDS/2.50d0,2.90d0,3.30d0,3.69d0,3.95d0,0.d0,4.53d0,
1 0.d0,4.99d0/
DATA cDS/0.468d0,0.446d0,0.423d0,0.405d0,0.390d0,0.d0,
1 0.360d0,0.d0,0.340d0/
c...For testing: precise Scolegian values of 'b' and 'c' for s=0 ......
cc DATA bDS/2.50d0,2.90d0,3.30d0,3.69d0,3.968424883d0,0.d0,4.53d0,
cc DATA cDS/0.468d0,0.446d0,0.423d0,0.405d0,0.3892460703d0,0.d0,
DATA FIRST/ 1/
SAVE FIRST, bpm, cpm
c-----------------------------------------------------------------------
MMTEMP = MMLR(1)
IF(MMLR(1).LE.0) MMLR(1) = 1
IF(RHOab.LE.0) THEN
DO m=1,NCMMax
DM(m)=1.d0
DMP(m)= 0.d0
DMPP(m)= 0.d0
ENDDO
RETURN
ENDIF
IF(IDSTT.LE.0) THEN
c===========================================
c** For Tang-Toennies type damping functions
c===========================================
Lsr= sVRS2/2
IF((sVRS2.LT.-4).OR.(sVRS2.GT.4).OR.((2*LSR).NE.sVRS2)) THEN
WRITE(6,600) 'TT',sVRS2
STOP
ENDIF
MMAX= MMLR(NCMM) + Lsr - 1
aTT= RHOab*bTT(Lsr)
br= aTT*r
XP= DEXP(-br)
SM(-3)= 0.d0
SM(-2)= 0.d0
SM(-1)= 0.d0
SM(0)= 1.d0
TK= 1.d0
IF(br.GT.0.5d0) THEN
DO m= 1,MMAX
TK= TK*br/DFLOAT(m)
SM(m)= SM(m-1)+ TK
ENDDO
DO m= 1, NCMM
MM= MMLR(m) - 1 + Lsr
DM(m)= 1.d0 - XP*SM(MM)
DMP(m)= aTT*XP*(SM(MM) - SM(MM-1))
DMPP(m)= -aTT*aTT*XP*(SM(MM)
1 - 2.d0*SM(MM-1) + SM(MM-2))
ENDDO
c-----------------------------------------------------------------------
c The above section handles the calculation of the value of the damping
c function for most values of r. However, at very small r that algorithm
c becomes unstable due to numerical noise. To avoid this, if the
c argument is very small it is re-evaluated as a finite sum ...
c-----------------------------------------------------------------------
ELSE
MMAX= MMAX+5
DO m= 1, MMAX
c... NOTE that here SM(m) is the m'th term (b*r)^m/m! [not a sum]
SM(m)= SM(m-1)*br/DFLOAT(m)
ENDDO
DO m= 1, NCMM
MM= MMLR(m) + Lsr
DM(m)= XP*(SM(MM)+ SM(MM+1)+ SM(MM+2)+ SM(MM+3)
1 + SM(MM+4))
DMP(m)= aTT*XP*SM(m-1)
DMPP(m)= aTT*aTT*XP*(SM(m-2)-SM(m-1))
ENDDO
ENDIF
ENDIF
c
IF(IDSTT.GT.0) THEN
c=======================================================================
c** For Douketis-Scoles-Marchetti-Zen-Thakkar type damping function ...
c=======================================================================
IF((sVRS2.LT.-4).OR.(sVRS2.GT.4).OR.(sVRS2.EQ.1).OR.
1 (sVRS2.EQ.3)) THEN
WRITE(6,600) 'DS',sVRS2
STOP
ENDIF
IF(FIRST.EQ.1) THEN
DO m= 1, 20
DO sVRS2F= -4,0
bpm(m,sVRS2F)= bDS(sVRS2F)/DFLOAT(m)
cpm(m,sVRS2F)= cDS(sVRS2F)/DSQRT(DFLOAT(m))
ENDDO
ENDDO
FIRST= 0
ENDIF
br= rhoAB*r
DO m= 1, NCMM
MM= MMLR(m)
XP= DEXP(-(bpm(MM,sVRS2) + cpm(MM,sVRS2)*br)*br)
YP= 1.d0 - XP
ZK= MM + 0.5d0*sVRS2
DM(m)= YP**ZK
TK= (bpm(MM,sVRS2) + 2.d0*cpm(MM,sVRS2)*br)*rhoAB
DMP(m) = ZK*XP*TK*DM(m)/YP
c ... calculate second derivative [for DELR case] {check this!}
DMPP(m)= (ZK-1.d0)*DMP(m)*(XP*TK)/YP
1 - DMP(m)*TK + DMP(m)*2.d0*cpm(MM,sVRS2)*rhoAB**2/TK
ENDDO
ENDIF
MMLR(1) = MMTEMP
RETURN
600 FORMAT(/,' *** ERROR *** For ',A2,'-damping functions not yet de
1fined for sVRS2=',i3)
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE AFdiag(RDIST,VLIM,NCMM,NCMMax,MMLR,Cm,rhoAB,sVSR2,
1 IDSTT,ULR,dULRdCm,dULRdR)
c*
c** Aubert-Frecon Potential Model for u_{LR}(r)
c*
c** Subroutine to generate, at the onee distance RDIST, an eigenvalue
c of the 2x2 or 3x3 long-range interaction matrix described by Eqs.1
c and 10, resp., of J.Mol.Spec.188, 182 (1998) (Aubert-Frecon et al)
c** and its derivatives w.r.t. the C_m long-range parameters.
c*
c==> Input: r= RDIST, VLIM, NCMM, m=MMLR & Cm's, rhoAB, sVSR2, IDSTT
c==> Output: ULR, partial derivatives dULRdCm & radial derivative dULRdR
c-----------------------------------------------------------------------
c** Original Version from Nike Dattani in June 2011 for 3x3 case
c** Generalized to incorporate 2x2 case, removed retardation terms and
c incorporate damping ... by Kai Slaughter: July 2014
c* rj: C6{adj} & C9{adj} included in CmEFF & fixed dampF call Jan 2016
c-----------------------------------------------------------------------
INTEGER NCMMax
c-----------------------------------------------------------------------
REAL*8 RDIST,VLIM,Cm(NCMMax),ULR,dULRdCm(NCMMax),dULRdR,R2,R3,R5,
1 R6,R8,R9,T1,T0,T2,T0P,T0P23,Dm(NCMMax),Dmp(NCMMax),
2 Dmpp(NCMMax),rhoAB,A(3,3),DR(3,3),Q(3,3),DMx(NCMMax,3,3),
3 DMtemp(3,3),DEIGMx(NCMMax,1,1),DEIGMtemp(1,1),DEIGR(1,1),
4 EIGVEC(3,1),RESID(3,1),W(3),RPOW(NCMMax),DELTAE,Modulus,Z
INTEGER H,I,J,K,L,M,X,NCMM,MMLR(NCMMax),sVSR2,IDSTT,MMtemp
c-----------------------------------------------------------------------
DELTAE=Cm(1)
R2= 1.d0/RDIST**2
R3= R2/RDIST
R5= R2*R3
R6= R3*R3
R8= R6*R2
c-----------------------------------------------------------------------
c....... for rhoAB.le.0.0 returns Dm(m)=1 & Dmp(m)=Dmpp(m)=0
CALL dampF(RDIST,rhoAB,NCMM,NCMMAX,MMLR,sVSR2,IDSTT,Dm,Dmp,Dmpp)
c-----------------------------------------------------------------------
IF(MMLR(1).GE.-1) THEN !! For the A (0) or b (-1) state
c*
c*** Aubert Frecon 2x2 case NCMM= 7 and ...
c*** Cm(1) = DELTAE
c*** Cm(2) = C3Sig
c*** Cm(3) = C3Pi
c*** Cm(4) = C6Sig
c*** Cm(5) = C6Pi
c*** Cm(6) = C8Sig
c*** Cm(7) = C8Pi
c*
T1= R3*(Dm(2)*(Cm(2)-Cm(3)) + R3*Dm(4)*(Cm(4)-Cm(5)) +
1 R5*Dm(6)*(Cm(6)-Cm(7)))/3.d0
T0= DSQRT((T1 - Cm(1))**2 + 8.d0*T1**2)
ULR= 0.5d0*(-Cm(1) + R3*(Dm(2)*(Cm(2)+Cm(3)) +
1 R3*Dm(4)*(Cm(4)+Cm(5)) + R5*Dm(6)*(Cm(6)+Cm(7))) + T0)
c-----------------------------------------------------------------------
IF(MMLR(1).EQ.0) THEN
ULR= ULR + Cm(8)*R3*R6 !! add C9{adj correction
ENDIF
c... adjustment for the b-state
IF(MMLR(1).EQ.-1) THEN
ULR=ULR-T0
ULR= ULR + Cm(9)*R3*R6 !! add C9{adj correction
ENDIF
c... now get derivatives
T0P= 0.5d0*(9.d0*T1 - Cm(1))/T0
T0P23= 0.5d0 + T0P/3.d0
c... another adjustment for the b-state
IF(MMLR(1).EQ.-1) T0P23=T0P23-2.d0*T0P/3.d0
dULRdCm(1)= 0.d0
dULRdCm(2)= R3*(T0P23)
dULRdCm(3)= R3*(1.d0-T0P23)
dULRdCm(4)= R6*(T0P23)
dULRdCm(5)= R6*(1.d0 - T0P23)
dULRdCm(6)= R8*T0P23
dULRdCm(7)= R8*(1.d0-T0P23)
T2 =-T0P*R3*((Dm(2)*(Cm(2)-Cm(3))+R3*(Dm(4)*2.d0*(Cm(4)
1 -Cm(5))+R2*Dm(6)*8.d0/3.d0*(Cm(6)-Cm(7))))/RDIST
2 +(Dmp(2)*(Cm(2)-Cm(3))+R3*Dmp(4)*(Cm(4)-Cm(5))+
3 R2*R3*Dmp(6)*(Cm(6)-Cm(7)))/3.d0)
dULRdR = -R3*((1.5d0*Dm(2)*(Cm(2)+Cm(3)) + R3*(Dm(4)*3.d0*
1 (Cm(4)+Cm(5))+4.d0*Dm(6)*R2*(Cm(6)+Cm(7))))/RDIST
2 + 0.5d0*(Dmp(2)*(Cm(2)+Cm(3)) + Dmp(4)*R3*(Cm(4)+
3 Cm(5)) + Dmp(6)*R3*R2*(Cm(6)+Cm(7)))) + T2
c... and a final adjustment for the b-state
IF(MMLR(1).EQ.-1) dULRdR= dULRdR- 2.d0*T2
c-----------------------------------------------------------------------
ELSE
c*
c**** Aubert Frecon 3x3 case NCMM= 10 and ...
c**** Cm(1) = DELTAE
c**** Cm(2) = C3Sig
c**** Cm(3) = C3Pi1
c**** Cm(4) = C3Pi3
c**** Cm(5) = C6Sig
c**** Cm(6) = C6Pi1
c**** Cm(7) = C6Pi3
c**** Cm(8) = C8Sig
c**** Cm(9) = C8Pi1
c**** Cm(10)= C8Pi3
c*
c... Initialize interaction matrix to 0.d0
DO I= 1,3
DO J= 1,3
A(I,J)=0.0D0
DR(I,J)=0.d0
DO K= 1,NCMMax
DMx(K,I,J)=0.d0
ENDDO
ENDDO
ENDDO
c... Prepare interaction matrix A
DO I= 2,NCMM,3
RPOW(I)= RDIST**MMLR(I)
A(1,1)= A(1,1) - Dm(I)*(Cm(I)+Cm(I+1)+Cm(I+2))/(3.d0*RPOW(I))
A(1,2)= A(1,2) - Dm(I)*(Cm(I+2)+Cm(I+1)-2.d0*Cm(I))/(RPOW(I))
A(1,3)= A(1,3) - Dm(I)*(Cm(I+2)-Cm(I+1))/(RPOW(I))
A(2,2)= A(2,2) - Dm(I)*(Cm(I+2)+Cm(I+1)+4.d0*Cm(I))
1 /(6.d0*RPOW(I))
A(3,3)= A(3,3) - Dm(I)*(Cm(I+2)+Cm(I+1))/(2.d0*RPOW(I))
ENDDO
A(1,1) = A(1,1) + VLIM
A(1,2) = A(1,2)/(3.d0*DSQRT(2.d0))
A(2,1) = A(1,2)
A(2,2) = A(2,2) + VLIM + DELTAE
A(2,3) = A(1,3)/(2.d0*DSQRT(3.d0))
A(1,3) = A(1,3)/(DSQRT(6.d0))
A(3,1) = A(1,3)
A(3,2) = A(2,3)
A(3,3) = A(3,3) + VLIM + DELTAE
c... Prepare radial derivative of interaction matrix (? is it needed ?)
DO I= 2,NCMM,3
DR(1,1)= DR(1,1) + Dm(I)*MMLR(I)*(Cm(I)+Cm(I+1)+Cm(I+2))
1 /(3.d0*RPOW(I)*RDIST)
2 -Dmp(I)*(Cm(I)+Cm(I+1)+Cm(I+2))/(3.d0*RPOW(I))
DR(1,2)= DR(1,2) + Dm(I)*MMLR(I)*(Cm(I+2)+Cm(I+1)-2.d0*
1 Cm(I))/(RPOW(I)*RDIST)
2 -Dmp(I)*(Cm(I+2)+Cm(I+1)-2.d0*Cm(I))/(RPOW(I))
DR(1,3)= DR(1,3) + Dm(I)*MMLR(I)*(Cm(I+2)-Cm(I+1))
1 /(RPOW(I)*RDIST)
2 -Dmp(I)*(Cm(I+2)-Cm(I+1))/(RPOW(I))
DR(2,2)= DR(2,2) + Dm(I)*MMLR(I)*(Cm(I+2)+Cm(I+1)+
1 4.d0*Cm(I))/(6.d0*RPOW(I)*RDIST)
2 -Dmp(I)*(Cm(I+2)+Cm(I+1)+4.d0*Cm(I))
3 /(6.d0*RPOW(I))
DR(3,3)= DR(3,3) + Dm(I)*MMLR(I)*(Cm(I+2)+Cm(I+1))
1 /(2.d0*RPOW(I)*RDIST)
2 -Dmp(I)*(Cm(I+2)+Cm(I+1))/(2.d0*RPOW(I))
ENDDO
DR(1,2) = DR(1,2)/(3.d0*DSQRT(2.d0))
DR(2,1) = DR(1,2)
DR(2,3) = DR(1,3)/(2.d0*DSQRT(3.d0))
DR(1,3) = DR(1,3)/(DSQRT(6.d0))
DR(3,1) = DR(1,3)
DR(3,2) = DR(2,3)
c... Partial derivatives of interaction matrix A w.r.t. Cm's
DO I= 2,NCMM,3
DMx(I,1,1)= -Dm(I)/(3.d0*RPOW(I))
DMx(I+1,1,1)= DMx(I,1,1)
DMx(I+2,1,1)= DMx(I,1,1)
DMx(I,1,2)= 2.d0*Dm(I)/(3.d0*DSQRT(2.d0)*RPOW(I))
DMx(I+1,1,2)= -DMx(I,1,2)/2.d0
DMx(I+2,1,2)= DMx(I+1,1,2)
DMx(I,2,1)= DMx(I,1,2)
DMx(I+1,2,1)= DMx(I+1,1,2)
DMx(I+2,2,1)= DMx(I+2,1,2)
DMx(I,1,3)= 0.d0
DMx(I,3,1)= 0.d0
DMx(I+1,1,3)= Dm(I)/(DSQRT(6.d0)*RPOW(I))
DMx(I+1,3,1)= DMx(I+1,1,3)
DMx(I+2,1,3)= -DMx(I+1,1,3)
DMx(I+2,3,1)= DMx(I+2,1,3)
DMx(I,2,2)= 2.d0*Dm(I)/(3.d0*RPOW(I))
DMx(I+1,2,2)= DMx(I,2,2)/4.d0
DMx(I+2,2,2)= DMx(I+1,2,2)
DMx(I,2,3)= 0.d0
DMx(I,3,2)= 0.d0
DMx(I+1,2,3)= Dm(I)/(2.d0*DSQRT(3.d0)*RPOW(I))
DMx(I+1,3,2)= DMx(I+1,2,3)
DMx(I+2,2,3)= -DMx(I+1,2,3)
DMx(I+2,3,2)= DMx(I+2,2,3)
DMx(I,3,3)= 0.d0
DMx(I+1,3,3)= Dm(I)/(2.d0*RPOW(I))
DMx(I+2,3,3)= DMx(I+1,3,3)
ENDDO
c... Call subroutine to prepare and invert interaction matrix A
CALL DSYEVJ3(A,Q,W)
L=1
c... Now - identify the lowest eigenvalue of A and label it L
DO J=2,3
IF (W(J) .LT. W(L)) THEN
L=J
ENDIF
ENDDO
c... Identifiy the highest eigenvalue of A and label it H
H=1
DO J=2,3
IF(W(J).GT.W(H)) THEN
H=J
ENDIF
ENDDO
c... Identify the middle eigenvalue of A and label it M
M=1
DO J=2,3
IF((J.NE.L).AND.(J.NE.H)) M= J
ENDDO
c... Select which eigenvalue to use based on user input
IF(MMLR(1).EQ.-2) THEN
X = L
ELSEIF(MMLR(1).EQ.-3) THEN
X = M
ELSE
X = H
ENDIF
c... determine ULR and eigenvectors
ULR= -W(X)
IF(MMLR(1).EQ.-2) ULR= ULR+ Cm(11)*R3*R6 !! C9adj term
IF((MMLR(1).EQ.-3).OR.(MMLR(1).EQ.-4)) ULR = ULR + DELTAE
IF(MMLR(1).EQ.-3) ULR= ULR+ Cm(12)*R3*R6 !! C9adj term
IF(MMLR(1).EQ.-4) ULR= ULR+ Cm(13)*R3*R6 !! C9adj term
DO I=1,3
EIGVEC(I,1) = Q(I,X)
ENDDO
cc loop over values of m to determine partial derivatives w.r.t. each Cm
DO I=2,NCMM
DMtemp(1:3,1:3) = DMx(I,1:3,1:3)
DEIGMtemp= -MATMUL(TRANSPOSE(EIGVEC),MATMUL(DMtemp,EIGVEC))
dULRdCm(I)= DEIGMtemp(1,1)
ENDDO
DEIGR = -MATMUL(TRANSPOSE(EIGVEC),MATMUL(DR,EIGVEC))
dULRdR= DEIGR(1,1) !! radial derivative w.r.t. r (I think!)
c------------------------------------------------------------------------
ENDIF
c------------------------------------------------------------------------
RETURN
CONTAINS
c=======================================================================
SUBROUTINE DSYEVJ3(A, Q, W)
c ----------------------------------------------------------------------
c** Subroutine to setup and diagonalize the matrix A and return
c eigenvalues W and eigenvector matrix Q
INTEGER N, I, X, Y, R
PARAMETER (N=3)
REAL*8 A(3,3), Q(3,3), W(3)
REAL*8 SD, SO, S, C, T, G, H, Z, THETA, THRESH
c Initialize Q to the identitity matrix
c --- This loop can be omitted if only the eigenvalues are desired ---
DO X = 1, N
Q(X,X) = 1.0D0
DO Y = 1, X-1
Q(X, Y) = 0.0D0
Q(Y, X) = 0.0D0
ENDDO
ENDDO
c Initialize W to diag(A)
DO X = 1, N
W(X) = A(X, X)
ENDDO
c Calculate SQR(tr(A))
SD = 0.0D0
DO X = 1, N
SD = SD + ABS(W(X))
ENDDO
SD = SD**2
c Main iteration loop
DO 40 I = 1, 50
c Test for convergence
SO = 0.0D0
DO X = 1, N
DO Y = X+1, N
SO = SO + ABS(A(X, Y))
ENDDO
ENDDO
IF(SO .EQ. 0.0D0) RETURN
IF(I .LT. 4) THEN
THRESH = 0.2D0 * SO / N**2
ELSE
THRESH = 0.0D0
END IF
c Do sweep
DO 60 X = 1, N
DO 61 Y = X+1, N
G = 100.0D0 * ( ABS(A(X, Y)) )
IF ( I .GT. 4 .AND. ABS(W(X)) + G .EQ. ABS(W(X))
$ .AND. ABS(W(Y)) + G .EQ. ABS(W(Y))) THEN
A(X, Y) = 0.0D0
ELSE IF (ABS(A(X, Y)) .GT. THRESH) THEN
c Calculate Jacobi transformation
H = W(Y) - W(X)
IF ( ABS(H) + G .EQ. ABS(H) ) THEN
T = A(X, Y) / H
ELSE
THETA = 0.5D0 * H / A(X, Y)
IF (THETA .LT. 0.0D0) THEN
T= -1.0D0/(SQRT(1.0D0 + THETA**2)-THETA)
ELSE
T= 1.0D0/(SQRT(1.0D0 + THETA**2) + THETA)
END IF
END IF
C = 1.0D0 / SQRT( 1.0D0 + T**2 )
S = T * C
Z = T * A(X, Y)
c Apply Jacobi transformation
A(X, Y) = 0.0D0
W(X) = W(X) - Z
W(Y) = W(Y) + Z
DO R = 1, X-1
T = A(R, X)
A(R, X) = C * T - S * A(R, Y)
A(R, Y) = S * T + C * A(R, Y)
ENDDO
DO R = X+1, Y-1
T = A(X, R)
A(X, R) = C * T - S * A(R, Y)
A(R, Y) = S * T + C * A(R, Y)
ENDDO
DO R = Y+1, N
T = A(X, R)
A(X, R) = C * T - S * A(Y, R)
A(Y, R) = S * T + C * A(Y, R)
ENDDO
c Update eigenvectors
c --- This loop can be omitted if only the eigenvalues are desired ---
DO R = 1, N
T = Q(R, X)
Q(R, X) = C * T - S * Q(R, Y)
Q(R, Y) = S * T + C * Q(R, Y)
ENDDO
END IF
61 CONTINUE
60 CONTINUE
40 CONTINUE
WRITE(6,'("DSYEVJ3: No convergence.")')
END SUBROUTINE DSYEVJ3
END SUBROUTINE AFdiag
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
c** Asen Pashov's subroutines for constructing spline functions and
c their derivatives.
double precision function Scalc(x,m,n,XGRID,rKL,LMAX)
c** At the position 'x', Scalc is returned as the value of the m'th
c of the 'n' Sm(x) function defining a natural cubic spline through the
c mesh points located at x= XGRID(x_i), for i=1,n. LMAX specifies the
c maximum number of mesh points x= XGRID(x_i) allowed by the calling program
c---------------------------------------------------------------------
INTEGER LMAX,I,K,KK,M,N
REAL*8 x,y1,y2,XGRID(LMAX),rKL(LMAX,LMAX)
k= 0
kk= 0
do i=2,n
c... select interval
if ((x.gt.XGRID(i-1)).and.(x.le.XGRID(i))) k=i
end do
if (x.lt.XGRID(1)) then
k=2
kk=1
end if
if (x.gt.XGRID(n)) then
k=n
kk=1
end if
if(x.eq.XGRID(1)) k=2
y1=XGRID(k-1)
y2=XGRID(k)
Scalc= 0.d0
IF(kk.eq.0)
1 Scalc= rKL(m,k)*((y1-x)*(((y1-x)/(y1-y2))**2-1)/6)*(y1-y2)
2 + rKL(m,k-1)*((x-y2)*(((x-y2)/(y1-y2))**2-1)/6)*(y1-y2)
IF(k.EQ.m) Scalc= Scalc + (y1-x)/(y1-y2)
IF(k-1.EQ.m) Scalc= Scalc + (x-y2)/(y1-y2)
c... Asen's original coding ...
cc Scalc=ndirac(k,m)*A(x,y1,y2)+ndirac(k-1,m)*B(x,y1,y2)+
cc + C(x,y1,y2)*rKL(m,k)+D(x,y1,y2)*rKL(m,k-1)
cc else
cc Scalc=ndirac(k,m)*A(x,y1,y2)+ndirac(k-1,m)*B(x,y1,y2)
cc A=(x1-z)/(x1-x2)
cc B=(z-x2)/(x1-x2)
cc C=((x1-z)*(((x1-z)/(x1-x2))**2-1)/6)*(x1-x2)
cc D=((z-x2)*(((z-x2)/(x1-x2))**2-1)/6)*(x1-x2)
c... Asen's original coding ...
end
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
double precision function Sprime(x,m,n,XGRID,rKL,LMAX)
c** At the position 'x', evaluate the derivative w.r.t. x of the m'th
c Sm(x) function contributing the definition of the the natural cubic
c spline defined by function values at the n points XGRID(i) [i=1,n]
INTEGER i,k,kk,m,n,LMAX
REAL*8 x,del,y1,y2,XGRID(LMAX),rKL(LMAX,LMAX)
k=0
kk=0
do i=2,n
if((x.gt.XGRID(i-1)).and.(x.le.XGRID(i))) k=i
enddo
if(x.lt.XGRID(1)) then
k=2
kk=1
end if
if (x.gt.XGRID(n)) then
k=n
kk=1
end if
if (x.eq.XGRID(1)) k=2
y1=XGRID(k-1)
y2=XGRID(k)
del=y1-y2
Sprime= 0.d0
if(kk.eq.0) Sprime= (del-3.d0*(y1-x)**2/del)*rKL(m,k)/6.d0 +
1 (3.d0*(x-y2)**2/del-del)*rKL(m,k-1)/6.d0
IF(k-1.eq.m) Sprime= Sprime + 1.d0/del
IF(k.eq.m) Sprime= Sprime - 1.d0/del
ccc if(kk.eq.0) then
ccc Sprim=ndirac(k-1,m)/del-ndirac(k,m)/del+
ccc + (del-3*(y1-x)**2/del)*rKL(m,k)/6+
ccc + (3*(x-y2)**2/del-del)*rKL(m,k-1)/6
ccc else
ccc Sprim=ndirac(k-1,m)/del-ndirac(k,m)/del
ccc end if
end
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
subroutine Lkoef(NGRID,XGRID,rKL)
c** Call this subroutine with list of the 'NGRID' spline x_i values in
c array 'XGRID' with maximum dimension 'LMAX', and it will return the
c LMAX x LMAX array of 'rKL' coefficients used for generating the
c 'NGRID' S_{NGRID}(x) spline coefficient functions
c----------------- Based on nespl subroutine ---------------------------
c** CAUTION .. must dimension internal arrays B, INDX & vv @ compilation
cc INCLUDE 'arrsizes.h' !! needed only to define LMAX
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c** This 'Block' Data Utility routine that governs array dimensioning
c in program LEVEL16 must reside with the name 'arrsizes.h' in the
c same directory containing the FORTRAN file(s) for this Program when
c it is being compiled, **OR** be incorporated into the program
c wherever the statement 'INCLUDE arrsizes.h' appears !!
c-----------------------------------------------------------------------
INTEGER NDIMR, NVIBMX, NTPMX, MAXSP, MORDRMX, RORDR, NbetaMX,
1 LMAX, NBOBmx, NCMMAX
c** NDIMR is maximum size of PEC, wavefx, and various radial arrary
PARAMETER (NDIMR= 250001)
c** NVIBMX is the maximum no. vibrational levels, or rotational sublevel
c for a given 'v' whose energies may be generated and stored
PARAMETER (NVIBMX= 400)
c** NTPMX is maximum no. of PEC or TMF points that may be read-in and
c interplated over; MAXSP = no. cubic spline cfts for these NTPMX pts.
PARAMETER (NTPMX= 2000, MAXSP=4*NTPMX)
c** RORDR is maximum order of rot. constants generated for each vib level
PARAMETER (RORDR = 7)
c** MORDRMX is maximum polynomial order for TMF or martix element argument
PARAMETER (MORDRMX = 20)
c** NbetaMX is the largest no. PEC exponent polynomial parameter
PARAMETER (NbetaMX = 50, LMAX= NbetaMX)
c** NBOBmx is the largest no. of BOB expansion parameters
PARAMETER (NBOBmx = 20)
c** NCMMax is max. no. long-range inverse-power PEC coeffts. allowed
PARAMETER (NCMMax= 20)
c%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
c***--------------------------------------------------------------------
INTEGER I,J,NGRID,INDX(1:LMAX)
REAL*8 XGRID(LMAX),rKL(LMAX,LMAX),B(LMAX,LMAX),vv(LMAX), d
c ... note vv dimensioned here, but only used in ludcmp !!
DO i= 1,LMAX
DO j= 1,LMAX
rKL(i,j)= 0.d0
B(i,j)= 0.d0
ENDDO
ENDDO
rKL(1,1)= (XGRID(3)-XGRID(1))/3.d0
rKL(1,2)= (XGRID(3)-XGRID(2))/6.d0
do i= 2,NGRID-3
rKL(i,i-1)= (XGRID(i+1)-XGRID(i))/6.d0
rKL(i,i)= (XGRID(i+2)-XGRID(i))/3.d0
rKL(i,i+1)= (XGRID(i+2)-XGRID(i+1))/6.d0
end do
rKL(NGRID-2,NGRID-3)= (XGRID(NGRID-1)-XGRID(NGRID-2))/6.d0
rKL(NGRID-2,NGRID-2)= (XGRID(NGRID)-XGRID(NGRID-2))/3.d0
do i= 1,NGRID-2
B(i,i)= 1.d0/(XGRID(i+1)-XGRID(i))
B(i,i+1)= -1.d0/(XGRID(i+2)-XGRID(i+1))-1.d0/
1 (XGRID(i+1)-XGRID(i))
B(i,i+2)= 1.d0/(XGRID(i+2)-XGRID(i+1))
end do
call ludcmp(rKL,NGRID-2,LMAX,indx,vv,d)
do i= 1,NGRID
call lubksb(rKL,NGRID-2,LMAX,indx,B(1,i))
end do
do i= 1,NGRID-2
do j= 1,NGRID
rKL(j,i+1)= B(i,j)
end do
end do
do i= 1,NGRID
rKL(i,1)= 0.0d0
rKL(i,NGRID)= 0.0d0
end do
end
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE ludcmp(rKL,NGRID,LMAX,indx,vv,d)
INTEGER NGRID,LMAX,indx(LMAX),NMAX,i,imax,j,k
double precision d,rKL(LMAX,LMAX),vv(LMAX),TINY,aamax,dum,sum
PARAMETER (TINY= 1.0e-20)
d= 1.d0
do i= 1,NGRID
aamax= 0.d0
do j= 1,NGRID
if (abs(rKL(i,j)).gt.aamax) aamax= abs(rKL(i,j))
enddo
if (aamax.eq.0.) WRITE(6,*) 'singular matrix in ludcmp'
vv(i)= 1.d0/aamax
enddo
do j= 1,NGRID
do i= 1,j-1
sum= rKL(i,j)
do k= 1,i-1
sum= sum-rKL(i,k)*rKL(k,j)
enddo
rKL(i,j)= sum
enddo
aamax= 0.d0
do i= j,NGRID
sum= rKL(i,j)
do k= 1,j-1
sum= sum-rKL(i,k)*rKL(k,j)
enddo
rKL(i,j)= sum
dum= vv(i)*abs(sum)
if (dum.ge.aamax) then
imax= i
aamax= dum
endif
enddo
if(j.ne.imax)then
do k= 1,NGRID
dum= rKL(imax,k)
rKL(imax,k)= rKL(j,k)
rKL(j,k)= dum
enddo
d= -d
vv(imax)= vv(j)
endif
indx(j)= imax
if(rKL(j,j).eq.0.)rKL(j,j)= TINY
if(j.ne.NGRID)then
dum= 1.d0/rKL(j,j)
do i= j+1,NGRID
rKL(i,j)= rKL(i,j)*dum
enddo
endif
enddo
return
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c*
SUBROUTINE lubksb(rKL,NGRID,LMAX,indx,b)
INTEGER i,ii,j,ll, NGRID,LMAX,indx(LMAX)
double precision rKL(LMAX,LMAX),b(LMAX), sum
ii= 0
do i= 1,NGRID
ll= indx(i)
sum= b(ll)
b(ll)= b(i)
if (ii.ne.0)then
do j= ii,i-1
sum= sum-rKL(i,j)*b(j)
enddo
else if (sum.ne.0.) then
ii= i
endif
b(i)= sum
enddo
do i= NGRID,1,-1
sum= b(i)
do j= i+1,NGRID
sum= sum-rKL(i,j)*b(j)
enddo
b(i)= sum/rKL(i,i)
enddo
return
END
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12
c23456789 123456789 123456789 123456789 123456789 123456789 123456789 12