19257 lines
632 KiB
Fortran
19257 lines
632 KiB
Fortran
C THIS ROUTINE IS THE MAIN PROGRAM FOR MOLSCAT VERSION 14
|
|
C WITH DYNAMIC SPACE ALLOCATION CAPABILITY.
|
|
C
|
|
C INCREASE MXDIM AS NECESSARY TO PROVIDE SUFFICIENT WORKSPACE.
|
|
C IXNEXT,NIPR ARE INITIALIZED IN DRIVER
|
|
C IVLFL IS ALSO SET IN DRIVER; COULD BE CHANGED BY BASIN ROUTINES
|
|
C
|
|
PARAMETER (MXDIM=100000000)
|
|
DOUBLE PRECISION X
|
|
DIMENSION X(MXDIM)
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X
|
|
C
|
|
MX=MXDIM
|
|
C
|
|
C CALL PRINCIPAL MOLSCAT/BOUND SUBROUTINE
|
|
C
|
|
CALL DRIVER
|
|
STOP
|
|
END
|
|
SUBROUTINE DRIVER
|
|
C***********************************************************************
|
|
C
|
|
C ------ MOLSCAT - J.M. HUTSON AND S.GREEN - VERSION 14 - JUL 94 -----
|
|
C
|
|
C MAIN DRIVER FOR QUANTUM MOLECULAR SCATTERING PROGRAM
|
|
C
|
|
C REVISION HISTORY SINCE VERSION 7 OF SHELDON GREEN'S QCPE PROGRAM
|
|
C (MAY 79):
|
|
C
|
|
C VARIOUS NEW PROPAGATORS HAVE BEEN ADDED SINCE EARLY VERSIONS.
|
|
C THE COMPLETE LIST IN VERSION 12 IS:
|
|
C
|
|
C INTFLG =-1 : WKB METHOD FOR SINGLE CHANNEL, SINGLE TURNING POINT
|
|
C INTFLG = 2 : DEVOGELAERE'S PROPAGATOR
|
|
C INTFLG = 3 : WALKER-LIGHT R-MATRIX PROPAGATOR
|
|
C INTFLG = 4 : HYBRID LOG-DERIVATIVE / VIVS (VIVAS) PROPAGATOR
|
|
C INTFLG = 5 : JOHNSON'S LOG-DERIVATIVE PROPAGATOR
|
|
C INTFLG = 6 : MANOLOPOULOS'S DIABATIC MODIFIED
|
|
C LOG-DERIVATIVE PROPAGATOR
|
|
C INTFLG = 7 : MANOLOPOULOS'S QUASIADIABATIC MODIFIED
|
|
C LOG-DERIVATIVE PROPAGATOR
|
|
C INTFLG = 8 : ALEXANDER-MANOLOPOLOUS MODIFIED LOG-DERIVATIVE
|
|
C AIRY PROPAGATOR (HIBRIDON)
|
|
|
|
C VERSION 8: CHANGES MADE BY CHRIS ASHTON (1982) AND JEREMY HUTSON
|
|
C (1982-4) AT WATERLOO AND CAMBRIDGE UNIVERSITIES.
|
|
C
|
|
C (1) ENTIRE PROGRAM CONVERTED TO DOUBLE PRECISION
|
|
C
|
|
C (2) GORDON ALGORITHM (INTFLG=1) REMOVED.
|
|
C
|
|
C (3) LOOP OVER "PARITY CASES" IN DRIVER HAS BEEN MADE EXPLICIT
|
|
C FOR CLARITY.
|
|
C
|
|
C (4) EIGENPHASE SUM CALCULATION AND RESONANCE SEARCH OPTION
|
|
C INCORPORATED. NEW OUTPUT CHANNEL (KSAVE) WITH OPTIONAL
|
|
C UNFORMATTED OUTPUT ON CHANNEL ISAVEU.
|
|
C
|
|
C (5) COLLISION TYPE ITYPE=10*N+7 HAS BEEN ADDED,
|
|
C FOR AN ATOM HITTING A DIATOMIC VIB-ROTOR, WHERE THE
|
|
C POTENTIAL MATRIX IS CONSTRUCTED BY DOING PROPERLY THE
|
|
C AVERAGING OF POTENTIAL TERMS OVER (V,J) AND (V',J') DIATOM
|
|
C INTERNAL STATES.
|
|
C
|
|
C (6) COLLISION TYPE ITYPE=8 ADDED, FOR ELASTIC SCATTERING OF ATOMS
|
|
C FROM CORRUGATED SURFACES. USES SUBROUTINE SURBAS TO SET UP
|
|
C THE BASIS SET. THE LOOPS IN DRIVER OVER JTOT AND M ARE USED
|
|
C TO LOOP OVER ANGLES THETA AND PHI RESPECTIVELY.
|
|
C
|
|
C (7) THE STORAGE OF THE COUPLING ARRAY VL HAS BEEN REARRANGED. THE
|
|
C METHOD OF CONSTRUCTING POTENTIAL MATRICES FROM IT HAS BEEN
|
|
C CHANGED, AND IN PARTICULAR A NEW INDEXING ARRAY IV HAS BEEN
|
|
C INTRODUCED.
|
|
C
|
|
C***********************************************************************
|
|
C
|
|
C VERSION 9 (APR 86): JMH AND SG CODES UNIFIED
|
|
C
|
|
C (9) IOS CODE RE-INCORPORATED FROM SG'S PROGRAM.
|
|
C IT IS ACCESSED BY SETTING ITYPE = 100 + 'ITYPE'
|
|
C
|
|
C (10) MANOLOPOULOS'S DIABATIC AND ADIABATIC MODIFIED LOG-DERIVATIVE
|
|
C PROPAGATORS ADDED (INTFLG=6 AND 7 RESPECTIVELY).
|
|
C
|
|
C***********************************************************************
|
|
C
|
|
C SG VERSION 10 (AUG 91):
|
|
C
|
|
C (10) NEW PRBR/IOSPB FOR OFF-DIAGONAL LINESHAPE CROSS SECTIONS,
|
|
C WITH HAS IN-CORE SIMULATION OF DIRECT ACCESS FILES.
|
|
C OUTPUT CROSS-SECTIONS NOW MULTIPLIED BY JSTEP (FOR JTOT).
|
|
C
|
|
C (11) ALEXANDER/MANOLOPOULOS MODIFIED LOG-DERIVATIVE/AIRY PROPAGATOR
|
|
C ADDED AS INTFLG=8. INTERFACED BY TIM PHILLIPS (NASA/GISS)
|
|
C
|
|
C VERSION 11 (JUN 92): JMH AND SG CODES INTEGRATED AGAIN.
|
|
C
|
|
C (12) LOOP OVER ENERGY IN DRIVER MODIFIED TO SIMPLIFY PARALLELISATION
|
|
C
|
|
C (13) ISAVEU OUTPUT MODIFIED TO USE UNFORMATTED WRITES
|
|
C
|
|
C (14) USAGE OF LINEAR ALGEBRA AND BLAS ROUTINES UNIFIED
|
|
C
|
|
C AND THE FOLLOWING ENHANCEMENTS ADDED FROM JMH'S CODE:
|
|
C
|
|
C (15) BASE9 INTERFACE ADDED
|
|
C
|
|
C (16) POTENL ENHANCED TO EVALUATE RADIAL STRENGTH FUNCTIONS BY
|
|
C QUADRATURE FOR ITYPE=1, 2, 5 AND 6.
|
|
C
|
|
C (17) CODE ADDED TO CALCULATE ASYMMETRIC TOP ENERGIES AND WAVEFUNCTION
|
|
C FROM ROTATIONAL CONSTANTS. MECHANISM FOR SELECTING ASYMMETRIC
|
|
C TOP STATES TO BE INCLUDED GENERALISED
|
|
C
|
|
C (18) CODE FOR ATOM-SPHERICAL TOP SCATTERING ADDED
|
|
C
|
|
C***********************************************************************
|
|
C
|
|
C VERSION 12 (MAY 93)
|
|
C
|
|
C (19) DYNAMIC STORAGE HANDLING COMPLETELY REORGANIZED.
|
|
C
|
|
C (20) VECTOR/MATRIX ROUTINES RATIONALIZED TO USE LAPACK AND BLAS.
|
|
C
|
|
C (21) IV() ARRAY USED ONLY FOR 'NON-TRIVIAL' CASES.
|
|
C
|
|
C (22) OPTION TO WRITE VL ARRAY TO DISC TO AVOID EXCESSIVE MEMORY USE.
|
|
C
|
|
C (23) SOME CODE FOR COUPLING VL MATRIX ELEMENTS MODIFIED TO AVOID
|
|
C UNNECESSARY RECALCULATION OF NJ COEFFICIENTS
|
|
C
|
|
C***********************************************************************
|
|
C
|
|
C VERSTION 13 (SG EXPERIMENTAL VERSION) APR 94, BUT CONTAINED IN V14
|
|
C
|
|
C (24) IV ARRAY INTRODUCED FOR ITYPE=2 CASES
|
|
C
|
|
C (25) EXPANDED POTENL CAPABILITIES
|
|
C
|
|
C (26) BIGGER DIMENSIONS: /CMBASE/ ...ELEVEL(1000),...,JLEVEL(4000),...
|
|
C ALSO ADD ISYM(10),ISYM2(10); REORGANIZED ORDERING
|
|
C
|
|
C (27) CHANGES TO CALLING SEQUENCE FOR OUTINT/OUTPCH; IEXCH NOW CORRECT
|
|
C ON ISAVEU TAPE; BASE/OUTPCH RECOGNIZE CS SIGMA WHICH ARE
|
|
C NOT COMPLETE.
|
|
C
|
|
C***********************************************************************
|
|
C
|
|
C VERSION 14 (JUL 94)
|
|
C
|
|
C (28) ISAVEU TAPE FORMAT CHANGE: NOPEN WITH JTOT,INRG,...,M,NOPEN REC
|
|
C
|
|
C (29) FILE='FILENAME' REMOVED FROM OPEN STATEMENTS
|
|
C
|
|
C (30) FLAG FOR NCAC,DTOL,OTOL INCREASED TO JTOTU=999999
|
|
C
|
|
C (31) RESTART ABILITIES (IRSTRT) FROM ISAVEU
|
|
C
|
|
C (32) ITYPE=4 CODE (ASYMMETRIC TOP - LINEAR ROTOR) ADDED
|
|
C
|
|
C (33) COMMON /CMBASE/ ALTERED TO ALLOW MORE SPACE FOR LEVELS AND
|
|
C INTRODUCE EXTRA INPUT VARIABLES FOR HANDLING FUTURE EXTENSIONS.
|
|
C THIS CHANGE REQUIRES SIMILAR CHANGES IN BASE9 ROUTINES.
|
|
C
|
|
C (34) HANDLING OF TOTAL ENERGIES CHANGED IN PRESSURE BROADENING WITH
|
|
C IFEGEN=2 OPTION: AVOID CALCULATING S MATRICES THAT ARE NOT USED.
|
|
C
|
|
C***********************************************************************
|
|
C
|
|
C EXTERNAL UNITS FOR MASSES ARE ATOMIC MASS UNITS (CARBON MASS/12)
|
|
C EXTERNAL UNITS FOR ENERGIES ARE WAVENUMBERS
|
|
C EXTERNAL UNITS FOR LENGTH RM ARE ANGSTROMS
|
|
C ALL OTHER LENGTHS ARE IN UNITS OF RM
|
|
C
|
|
C INTFLG CONTROLS METHOD OF SOLVING EQUATIONS. NPOTL AND MXLAM
|
|
C FOR SUM OVER ANGULAR DEPENDENCE OF POTENTIAL, NQN IS NO. OF
|
|
C QUANTUM NUMBERS NECESSARY TO DESCRIBE COLLISION PARTNERS.
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C ***** PROGRAM DIMENSION LIMITATIONS *****
|
|
C ENERGY,TEMP,LINE DIMENSIONS LIMITED BY VALUES ...
|
|
PARAMETER(MXNRG=100,MXLN=200,MXTEMP=5)
|
|
C
|
|
INTEGER EUNITS,PRNTLV,PRINT,SHRINK
|
|
CHARACTER*4 EUNITC
|
|
C
|
|
C ARRAY TO HOLD TIME AND DATE
|
|
C INTEGER CTIME(2),CDATE(4)
|
|
CHARACTER CTIME*9,CDATE*11
|
|
C
|
|
C TYPES FOR COMMON/LDVVCM/
|
|
LOGICAL IALFP,IV,IVP,IVPP,NUMDER,ISHIFT,IDIAG,IPERT,ISYM
|
|
LOGICAL LCALC,ALDONE
|
|
LOGICAL IREAD,IWRITE
|
|
LOGICAL LWARN
|
|
C
|
|
C DOUBLE PRECISION LABEL(10)
|
|
CHARACTER*80 LABEL
|
|
CHARACTER*80 LABL
|
|
CHARACTER*1 TITLE(80),TIT(120),TIT2(120),BL
|
|
CHARACTER*8 PDATE
|
|
CHARACTER*8 CWD(2)
|
|
EQUIVALENCE (LABL,TITLE(1))
|
|
C
|
|
C FOLLOWING ARRAYS ALL HAVE DIMENSION MXNRG. MXNRG IS THE MAXIMUM
|
|
C ALLOWED NUMBER OF TOTAL ENERGIES PER RUN.
|
|
DIMENSION ENERGY(MXNRG)
|
|
DIMENSION IECONV(MXNRG),ISST(MXNRG),MINJT(MXNRG),MAXJT(MXNRG)
|
|
C
|
|
C VARIABLES DIMENSIONED FOR NO. OF LINES IN PRES. BROAD. CALC.
|
|
C N.B. PRBRIN STILL MAX NO. LINES = 2*MXLN DESPITE OFF-DIAG CHANGES
|
|
DIMENSION LINE(2*MXLN),LTYPE(MXLN)
|
|
EQUIVALENCE (ILSU,IPRBRU), (NLPRBR,IFLS)
|
|
C
|
|
DIMENSION TEMP(MXTEMP)
|
|
C
|
|
C VARIABLES TO TEST PARTIAL WAVE CONVERGENCE
|
|
DIMENSION TEST(2)
|
|
EQUIVALENCE (TEST(1),DTOL),(TEST(2),OTOL)
|
|
C
|
|
DIMENSION NLABV(9)
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C MX,IXNEXT ARE MAX AND NEXT AVAILABLE LOCATION IN X() ARRAY
|
|
C IVLFL FLAGS WHETHER IV() ARRAY IS USED AS POINPER W/ VL ARRAY.
|
|
C NIPR IS NUMBER OF INTEGERS PER REAL; SHOULD BE 1 OR 2.
|
|
C E.G. FOR IBM R*8/I*4, NIPR=2. AN INTEGER ARRAY OF DIM. N
|
|
C CAN BE STORED IN A REAL ARRAY OF DIMENSION (N+NIPR-1)/NIPR.
|
|
C
|
|
C COMMON BLOCK FOR COMMUNICATING WITH COUPLED EQUATION SOLVERS
|
|
COMMON/DRIVE/STEST,STEPS,STABIL,CONV,RSTART,RSTOP,XEPS,
|
|
1 DR,DRMAX,RMID,TOLHI,RTURN,VTOL,ESHIFT,ERED,RMLMDA,
|
|
2 NOPEN,JKEEP,ISCRU,MAXSTP
|
|
C
|
|
C EXTRA COMMON BLOCK FOR LDVIVS
|
|
COMMON/LDVVCM/XSQMAX,ALPHA1,ALPHA2,IALPHA,IALFP,IV,IVP,IVPP,
|
|
1 NUMDER,ISHIFT,IDIAG,IPERT,ISYM,IREAD,IWRITE
|
|
C
|
|
C COMMON BLOCK FOR WKB INTEGRATOR
|
|
COMMON/WKBCOM/NGMP(3)
|
|
C
|
|
C COMMON BLOCK TO SUBROUTINE OUTPUT FOR USE IN RESONANCE SEARCHES
|
|
COMMON/EIGSUM/EPSM(5)
|
|
C
|
|
C COMMON BLOCK FOR AIRPRP ARGUMENTS IN MANOLOPOLOUS/ALEXANDER
|
|
C PROPAGATOR
|
|
COMMON/HIBRIN/POWRX,DRAIRY,IABSDR
|
|
C
|
|
COMMON/VLSAVE/IVLU
|
|
C
|
|
NAMELIST /INPUT/ LABEL,RMIN,RMAX,IRMSET,IRXSET,URED,ISCRU,ISIGPR
|
|
1 ,ITHROW,STEST,NNRG,ENERGY,DNRG,JTOTL,JTOTU,JSTEP,MSET,MHI,NCAC
|
|
2 ,PRNTLV,INTFLG,MXSIG,STEPS,STABIL,NTEMP,NGAUSS,TEMP,EUNITS
|
|
3 ,ISIGU,IPARTU,ILSU,IPRBRU,IFLS,NLPRBR,LINE,IFEGEN,LTYPE,MAXSTP
|
|
4 ,TOLHI,RVIVAS,RVFAC,XSQMAX,ALPHA1,ALPHA2,IALPHA,EUNITC
|
|
5 ,IALFP,IV,IVP,IVPP,NUMDER,ISHIFT,IDIAG,IPERT,ISYM
|
|
6 ,ISAVEU,DTOL,OTOL,KSAVE,DR,DRNOW,DRMAX,RMID,VTOL,ICONV
|
|
7 ,THETLW,THETST,PHILW,PHIST,MXPHI,SHRINK,LASTIN
|
|
8 ,MMAX,LMAX,NGMP
|
|
9 ,VMAX,TMAX,TOLLO,CTOL,UTEST,TOLER,TOL,MXXX,MNNN
|
|
A ,POWRX,DRAIRY,IABSDR,NNRGPG,IRSTRT
|
|
C
|
|
EQUIVALENCE (MXPAR,MXPHI), (RMID,RVIVAS), (DR,DRNOW),
|
|
1 (TOL,TOLER,TOLHI)
|
|
C
|
|
C NGPT,LMAX, MMAX, AND NGMP(3) ARE VARIABLES ADDED FOR
|
|
C COMPATIBILITY WITH THE IOS PROGRAMS
|
|
C VARIABLES VMAX,...,MNNN ADDED FOR COMPATIBILITY WITH S.GREEN CODE
|
|
C (MOSTLY GORDON INTEGRATOR). ALSO TOL, TOLER, DRNOW
|
|
C
|
|
C RMIN IS THE RADIUS AT WHICH THE INTEGRATION IS BEGUN
|
|
C RMAX IS THE OUTER RADIUS TO WHICH THE INTEGRATION MUST EXTEND
|
|
C MAXSTP IS MAX NO. OF STEPS IN RADIAL INTEGRATION (INTFLG=3 ONLY)
|
|
C
|
|
C ARRAYS FOR NAMELIST SIMULATOR
|
|
C CHARACTER*6 INAMES
|
|
C DIMENSION INAMES(89),LOCN(89),INDX(89)
|
|
C
|
|
C DATA INAMES/'LABEL','RMIN','RMAX','IRMSET','IRXSET',
|
|
C 1 'URED','ISCRU','ISIGPR',
|
|
C 1 'ITHROW','STEST','NNRG','ENERGY','DNRG',
|
|
C 2 'JTOTL','JTOTU','JSTEP','MSET','MHI','NCAC',
|
|
C 2 'PRNTLV','INTFLG','MXSIG','STEPS','STABIL',
|
|
C 3 'NTEMP','NGAUSS','TEMP','EUNITS','ISIGU','IPARTU','ILSU',
|
|
C 4 'IPRBRU','IFLS','NLPRBR','LINE','IFEGEN','LTYPE','MAXSTP',
|
|
C 4 'TOLHI','RVIVAS','RVFAC','XSQMAX','ALPHA1','ALPHA2','IALPHA',
|
|
C 5 'IALFP','IV','IVP','IVPP','NUMDER','ISHIFT','IDIAG','IPERT',
|
|
C 6 'ISYM','ISAVEU','DTOL','OTOL','KSAVE','DR','DRNOW','DRMAX',
|
|
C 7 'RMID','VTOL','ICONV','THETLW','THETST','PHILW','PHIST',
|
|
C 8 'MXPHI','SHRINK','LASTIN','MMAX','LMAX','NGMP','VMAX',
|
|
C 9 'TMAX','TOLLO','CTOL','UTEST','TOLER','TOL','MXXX','MNNN'
|
|
C A 'PWRX','DRAIRY','IABSDR','NNRGPG','IRSTRT','EUNITC'/
|
|
C DATA INDX/88*0/
|
|
C
|
|
C DATA LABEL/10*' '/
|
|
DATA CWD/' ','(8-BYTE)'/
|
|
DATA CTIME/' '/,CDATE/' '/
|
|
DATA IPROGM/14/, PDATE/'(MAR 95)'/
|
|
DATA TITLE/80*' '/, BL/' '/
|
|
DATA TIT/120*'='/, TIT2/120*'-'/
|
|
C
|
|
DATA LTYPE/MXLN*-1/
|
|
|
|
C
|
|
C NLABV ARRAY CONTAINS NUMBER OF LABELS PER SYMMETRY TERM FOR EACH
|
|
C VALUE OF ITYPE (ITYPE=4 ADDED JUL 94 TRP/SG)
|
|
DATA NLABV/1,3,3,4,2,2,5,2,1/
|
|
C
|
|
C THE PHYSICAL CONSTANTS USED ARE COMBINED IN THE SINGLE NUMBER BFCT.
|
|
C BFCT IS 0.5*(HBAR**2) IN UNITS OF (ATOMIC MASS UNITS)*(WAVENUMBERS)
|
|
C *(ANGSTROMS**2).
|
|
C THE FOLLOWING VALUE IS FROM THE 1973 PHYSICAL CONSTANTS.
|
|
DATA BFCT/16.857630D0/
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
C CALL ROUTINE TO MASK FLOATING-POINT UNDERFLOW.
|
|
CALL MASK
|
|
C
|
|
C STORE VALUE OF MX IN CASE IT NEEDS TO BE RESET;
|
|
C NEEDED IN FUTURE CODE WHICH USES MAXMAX/MX TO ALLOCATE
|
|
C 'PERMANENT' STORAGE FOR A RUN W/ MULTIPLE (LASTIN=0) INPUT DECKS
|
|
MXSAVE=MX
|
|
|
|
100 MX=MXSAVE
|
|
CALL GCLOCK(TFIRST)
|
|
CALL GDATE(CDATE)
|
|
CALL GTIME(CTIME)
|
|
WRITE(6,110) IPROGM,PDATE,CDATE,CTIME,IPROGM,PDATE
|
|
110 FORMAT(2X,8('----MOLSCAT----')/' |',120X,'|'/' |',24X,
|
|
1 'COUPLED CHANNEL MOLECULAR SCATTERING PROGRAM OF J. M. HUTSON ',
|
|
2 'AND S. GREEN',23X,'|'/' |',29X,'VERSION 1 BY S. GREEN ',
|
|
3 '(NOV 1973); THIS IS VERSION',I3,1X,A8,29X,'|'/
|
|
4 ' |',120X,'|'/' |',44X,'RUN ON ',A11,2X,
|
|
5 'AT ',A9,44X,'|'/' |',120X,'|'/2X,8('----MOLSCAT----')//
|
|
6 2X,'PUBLICATIONS RESULTING FROM THE USE OF THIS PROGRAM SHOULD ',
|
|
7 'REFER TO'/2X,'J. M. HUTSON AND S. GREEN, MOLSCAT COMPUTER ',
|
|
8 'CODE, VERSION',I3,1X,A8 /
|
|
9 2X,'DISTRIBUTED BY COLLABORATIVE COMPUTATIONAL PROJECT NO. 6 ',
|
|
A 'OF THE SCIENCE AND ENGINEERING RESEARCH COUNCIL (UK)')
|
|
C
|
|
C INITIALIZE STORAGE PARAMETERS IN /MEMORY/
|
|
NIPR=2
|
|
IXNEXT=1
|
|
C SET IVLFL TO 1 TO ENSURE STORAGE COMPATIBILITY W/ VERSION 11
|
|
IVLFL=1
|
|
C SET NUSED.LT.0 AND CALL CHKSTR TO RESET COUNTER FOR EACH &INPUT.
|
|
NUSED=-1
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
C SET INITIAL VALUES BEFORE READ(5,INPUT) . . .
|
|
C
|
|
LWARN=.FALSE.
|
|
IOSFLG=0
|
|
NGMP(1)=8
|
|
NGMP(2)=1
|
|
NGMP(3)=16
|
|
NNRG=0
|
|
NNRGPG=1
|
|
DNRG=0.D0
|
|
NTEMP=0
|
|
NGAUSS=3
|
|
JSTEP=1
|
|
JTOTL=-1
|
|
JTOTU=-1
|
|
MSET=0
|
|
MHI=0
|
|
MXSIG=0
|
|
ISIGPR=0
|
|
ITHROW=0
|
|
DTOL=0.3D0
|
|
OTOL=.005D0
|
|
NCAC=4
|
|
ISIGU = 0
|
|
IPARTU=0
|
|
ISAVEU=0
|
|
KSAVE=0
|
|
ILSU=11
|
|
IFLS=0
|
|
IFEGEN=0
|
|
ICONV=0
|
|
INTFLG=4
|
|
RMIN=0.8D0
|
|
RMAX=10.D0
|
|
STEST=1.D-4
|
|
STEPS=10.D0
|
|
STABIL=5.D0
|
|
ISCRU=0
|
|
IRMSET=9
|
|
IRXSET=1
|
|
DR=2.D-2
|
|
RMID=9999.D0
|
|
RVFAC=0.D0
|
|
DRMAX=5.D0
|
|
VTOL=1.D-06
|
|
MAXSTP=10000
|
|
TOLHI=0.001D0
|
|
XSQMAX=1.D04
|
|
ALPHA1=1.D0
|
|
ALPHA2=1.5D0
|
|
IALPHA=6
|
|
IALFP=.FALSE.
|
|
IV=.TRUE.
|
|
IVP=.FALSE.
|
|
IVPP=.FALSE.
|
|
NUMDER=.FALSE.
|
|
ISHIFT=.FALSE.
|
|
IDIAG=.FALSE.
|
|
IPERT=.TRUE.
|
|
ISYM=.TRUE.
|
|
EUNITS=0
|
|
EUNITC=' '
|
|
PRNTLV=0
|
|
MXPHI=1
|
|
THETLW=0.D0
|
|
THETST=0.D0
|
|
PHILW=0.D0
|
|
PHIST=0.D0
|
|
SHRINK=1
|
|
LASTIN=1
|
|
PI=ACOS(-1.D0)
|
|
POWRX=3.D0
|
|
DRAIRY=-1.D0
|
|
IABSDR=0
|
|
IRSTRT=0
|
|
C
|
|
C READ &INPUT DATA.
|
|
C OPEN(5,STATUS='OLD',SHARED,READONLY)
|
|
C----------------------------------------------------------------
|
|
C ARRAYS FOR NAMELIST SIMULATOR
|
|
C LOCN(1)=LOC(LABEL)
|
|
C LOCN(2)=LOC(RMIN)
|
|
C LOCN(3)=LOC(RMAX)
|
|
C LOCN(4)=LOC(IRMSET)
|
|
C LOCN(5)=LOC(IRXSET)
|
|
C LOCN(6)=LOC(URED)
|
|
C LOCN(7)=LOC(ISCRU)
|
|
C LOCN(8)=LOC(ISIGPR)
|
|
C LOCN(9)=LOC(ITHROW)
|
|
C LOCN(10)=LOC(STEST)
|
|
C LOCN(11)=LOC(NNRG)
|
|
C LOCN(12)=LOC(ENERGY)
|
|
C LOCN(13)=LOC(DNRG)
|
|
C LOCN(14)=LOC(JTOTL)
|
|
C LOCN(15)=LOC(JTOTU)
|
|
C LOCN(16)=LOC(JSTEP)
|
|
C LOCN(17)=LOC(MSET)
|
|
C LOCN(18)=LOC(MHI)
|
|
C LOCN(19)=LOC(NCAC)
|
|
C LOCN(20)=LOC(PRNTLV)
|
|
C INDX(20)=4
|
|
C LOCN(21)=LOC(INTFLG)
|
|
C LOCN(22)=LOC(MXSIG)
|
|
C LOCN(23)=LOC(STEPS)
|
|
C LOCN(24)=LOC(STABIL)
|
|
C LOCN(25)=LOC(NTEMP)
|
|
C LOCN(26)=LOC(NGAUSS)
|
|
C LOCN(27)=LOC(TEMP)
|
|
C LOCN(28)=LOC(EUNITS)
|
|
C INDX(28)=4
|
|
C LOCN(29)=LOC(ISIGU)
|
|
C LOCN(30)=LOC(IPARTU)
|
|
C LOCN(31)=LOC(ILSU)
|
|
C LOCN(32)=LOC(IPRBRU)
|
|
C LOCN(33)=LOC(IFLS)
|
|
C LOCN(34)=LOC(NLPRBR)
|
|
C LOCN(35)=LOC(LINE)
|
|
C LOCN(36)=LOC(IFEGEN)
|
|
C LOCN(37)=LOC(LTYPE)
|
|
C LOCN(38)=LOC(MAXSTP)
|
|
C LOCN(39)=LOC(TOLHI)
|
|
C LOCN(40)=LOC(RVIVAS)
|
|
C LOCN(41)=LOC(RVFAC)
|
|
C LOCN(42)=LOC(XSQMAX)
|
|
C LOCN(43)=LOC(ALPHA1)
|
|
C LOCN(44)=LOC(ALPHA2)
|
|
C LOCN(45)=LOC(IALPHA)
|
|
C LOCN(46)=LOC(IALFP)
|
|
C LOCN(47)=LOC(IV)
|
|
C LOCN(48)=LOC(IVP)
|
|
C LOCN(49)=LOC(IVPP)
|
|
C LOCN(50)=LOC(NUMDER)
|
|
C LOCN(51)=LOC(ISHIFT)
|
|
C LOCN(52)=LOC(IDIAG)
|
|
C LOCN(53)=LOC(IPERT)
|
|
C LOCN(54)=LOC(ISYM)
|
|
C DO 115 I=46,54
|
|
C 115 INDX(I)=3
|
|
C LOCN(55)=LOC(ISAVEU)
|
|
C LOCN(56)=LOC(DTOL)
|
|
C LOCN(57)=LOC(OTOL)
|
|
C LOCN(58)=LOC(KSAVE)
|
|
C LOCN(59)=LOC(DR)
|
|
C LOCN(60)=LOC(DRNOW)
|
|
C LOCN(61)=LOC(DRMAX)
|
|
C LOCN(62)=LOC(RMID)
|
|
C LOCN(63)=LOC(VTOL)
|
|
C LOCN(64)=LOC(ICONV)
|
|
C LOCN(65)=LOC(THETLW)
|
|
C LOCN(66)=LOC(THETST)
|
|
C LOCN(67)=LOC(PHILW)
|
|
C LOCN(68)=LOC(PHIST)
|
|
C LOCN(69)=LOC(MXPHI)
|
|
C LOCN(70)=LOC(SHRINK)
|
|
C INDX(70)=4
|
|
C LOCN(71)=LOC(LASTIN)
|
|
C LOCN(72)=LOC(MMAX)
|
|
C LOCN(73)=LOC(LMAX)
|
|
C LOCN(74)=LOC(NGMP)
|
|
C LOCN(75)=LOC(VMAX)
|
|
C LOCN(76)=LOC(TMAX)
|
|
C LOCN(77)=LOC(TOLLO)
|
|
C LOCN(78)=LOC(CTOL)
|
|
C LOCN(79)=LOC(UTEST)
|
|
C LOCN(80)=LOC(TOLER)
|
|
C LOCN(81)=LOC(TOL)
|
|
C LOCN(82)=LOC(MXXX)
|
|
C LOCN(83)=LOC(MNNN)
|
|
C LOCN(84)=LOC(POWRX)
|
|
C LOCN(85)=LOC(DRAIRY)
|
|
C LOCN(86)=LOC(IABSDR)
|
|
C LOCN(87)=LOC(NNRGPG)
|
|
C LOCN(88)=LOC(IRSTRT)
|
|
C LOCN(89)=LOC(EUNITC)
|
|
C
|
|
C CALL NAMLIS('&INPUT',INAMES,LOCN,INDX,89,IEOF)
|
|
C IF(IEOF.EQ.1) GOTO 1040
|
|
C--------------------------------------------------------------
|
|
READ(5,INPUT,END=1040)
|
|
C
|
|
WRITE(6,120)
|
|
120 FORMAT(//' /INPUT/ DATA ARE --')
|
|
WRITE(LABL,'(A80)') LABEL
|
|
WRITE(6,130) LABL
|
|
130 FORMAT(/' RUN LABEL = ',A80)
|
|
DO 140 IST=1,80
|
|
IF(TITLE(IST).NE.BL) GOTO 150
|
|
140 CONTINUE
|
|
GOTO 190
|
|
150 DO 160 IND=1,80
|
|
IF(TITLE(81-IND).NE.BL) GOTO 170
|
|
160 CONTINUE
|
|
GOTO 190
|
|
170 IND=81-IND
|
|
NST=(119-IND+IST)/2
|
|
TIT(NST)=BL
|
|
TIT2(NST)=BL
|
|
DO 180 I=IST,IND
|
|
NST=NST+1
|
|
TIT(NST)=TITLE(I)
|
|
TIT2(NST)=TITLE(I)
|
|
180 CONTINUE
|
|
TIT(NST+1)=BL
|
|
TIT2(NST+1)=BL
|
|
C
|
|
190 AMXKB=MX/128.D0
|
|
IF (NIPR.EQ.1.OR.NIPR.EQ.2) THEN
|
|
WRITE(6,200) MX,CWD(NIPR),AMXKB
|
|
200 FORMAT(/' SCRATCH CORE STORAGE ALLOCATION IS',I10,A8,
|
|
1 ' WORDS (',F10.2,' KBYTES)')
|
|
WRITE(6,202) NIPR
|
|
202 FORMAT(2X,I1,' INTEGER(S) CAN BE STORED IN EACH WORD.')
|
|
ELSE
|
|
WRITE(6,204) NIPR
|
|
204 FORMAT(/' *** ILLEGAL NIPR =',I10)
|
|
ENDIF
|
|
C
|
|
PRINT=PRNTLV
|
|
C
|
|
C PROCESS INTFLG -- REQUESTED PROPAGATOR -- AND ITS INPUT DATA.
|
|
C
|
|
WRITE(6,210) INTFLG
|
|
210 FORMAT(/' INTEGRATOR REQUESTED BY INPUT VALUE INTFLG =',I3)
|
|
220 FORMAT(/' ***** ERROR - NO IMPLEMENTATION FOR THIS INTFLG'
|
|
1 ,' - RUN HALTED.')
|
|
240 FORMAT(/' COUPLED EQUATIONS SOLVED BY METHOD OF DEVOGELAERE.')
|
|
250 FORMAT(/' INTEGRATION PARAMETERS ARE RMIN =',F7.2/
|
|
1 30X,'RMAX =',F7.2/30X,'STEST =',D11.2/30X,'STEPS =',
|
|
2 F6.1,' (PER WAVELENGTH)'/30X,'STABIL =',F6.1,' (STEPS PER',
|
|
3 ' STABILIZATION)')
|
|
270 FORMAT(/' COUPLED EQUATIONS SOLVED BY WALKER-LIGHT R-MATRIX',
|
|
1 ' PROPAGATOR ALGORITHM'//' PARAMETERS ARE',5X,'RMIN =',
|
|
2 F7.2,8X,'DR = ',G8.2/21X,'RMAX =',F7.2,8X,
|
|
3 'VTOL =',D9.2/21X,'RMID =',F7.2,8X,'MAXSTP =',I9)
|
|
271 FORMAT(/' RVFAC =',F7.2,' OVERRIDES INPUT RMID')
|
|
300 FORMAT(/' COUPLED EQUATIONS SOLVED BY LOG DERIVATIVE METHOD ',
|
|
1 'OF JOHNSON')
|
|
310 FORMAT(/' INTEGRATION PARAMETERS ARE RMIN =',F7.2,8X,
|
|
1 'STEPS = ',F7.1/33X,'RMAX =',F7.2)
|
|
320 FORMAT(/' CHANGING TO VARIABLE INTERVAL / VARIABLE STEP METHOD',
|
|
1 ' AT LONG RANGE'//' INTEGRATION PARAMETERS ARE RVIVAS =',
|
|
2 F7.2,8X,'DR =',G8.2/
|
|
3 33X,'RMAX =',F7.2,8X,'DRMAX =',F8.2/
|
|
4 56X,'ALPHA1 = ',F7.2/33X,'XSQMAX =',G7.1,8X,'ALPHA2 = ',F7.2/
|
|
5 33X,'TOLHI =',G7.1,8X,'IALPHA =',I8/33X,'ISHIFT =',L7,8X,
|
|
6 'IV =',L8/33X,'IPERT =',L7,8X,'IVP =',L8/33X,
|
|
7 'IALFP =',L7,8X,'IVPP =',L8/33X,'ISYM =',L7,8X,
|
|
8 'NUMDER =',L8)
|
|
340 FORMAT(/' COUPLED EQUATIONS SOLVED BY DIABATIC ',
|
|
1 'MODIFIED LOG DERIVATIVE METHOD OF MANOLOPOULOS')
|
|
350 FORMAT(/' COUPLED EQUATIONS SOLVED BY QUASIADIABATIC ',
|
|
1 'MODIFIED LOG DERIVATIVE METHOD OF MANOLOPOULOS')
|
|
352 FORMAT(33X,'IABSDR =',I4)
|
|
353 FORMAT(33X,'OVERRIDES STEPS PARAMETER WITH DR =',F9.3)
|
|
354 FORMAT(/' AIRY PARAMETERS ','RMID =',F10.4/
|
|
2 33X,'DRAIRY=',F10.4/33X,'TOLHI=',F13.6/
|
|
3 33X,'POWRX =',F8.2)
|
|
355 FORMAT(/' DRAIRY.LT.0 TAKES INITIAL AIRY STEP SIZE FROM'
|
|
1 ,' MODIFIED LOG-DERIVATIVE VALUE.')
|
|
356 FORMAT(/' TOLHI.GE.1 -- AIRY STEP SIZE INCREASED BY'
|
|
1 ,' FACTOR OF TOLHI AT EACH STEP')
|
|
357 FORMAT(/' TOLHI.LT.1 -- AIRY STEPS ADJUSTED TO MAINTAIN'
|
|
1 ,' APPROX. ACCURACY VIA PERTURBATION THEORY AND POWRX.')
|
|
370 FORMAT(/' EQUATIONS SOLVED BY WKB APPROXIMATION WITH GAUSS-'
|
|
1 ,'MEHLER INTEGRATION. SEE R. T PACK, JCP 60, 633 (1974).'/
|
|
2 /' NOTE THAT THIS IS IMPLEMENTED ONLY FOR ONE CHANNEL',
|
|
3 ' CASES, E.G., IOS CALCULATIONS.'/
|
|
4 /' INTEGRATION PARAMETERS ARE RMIN =',D15.4/
|
|
5 30X,'STEST =',D14.4/30X,'NGMP =',I6,' (',I2,')',I3)
|
|
C
|
|
IF(INTFLG.EQ.2) THEN
|
|
WRITE(6,240)
|
|
C STABIL=MIN(STABIL,STEPS/2.D0)
|
|
WRITE(6,250) RMIN,RMAX,STEST,STEPS,STABIL
|
|
GO TO 380
|
|
ENDIF
|
|
C
|
|
IF(INTFLG.EQ.3) THEN
|
|
WRITE(6,270) RMIN,DR,RMAX,VTOL,RMID,MAXSTP
|
|
IF(RVFAC.GT.0.D0 .AND. IRMSET.GT.0) WRITE(6,271) RVFAC
|
|
GO TO 380
|
|
ENDIF
|
|
C
|
|
IF(INTFLG.EQ.4 .OR. INTFLG.EQ.5) THEN
|
|
IF(IDIAG) THEN
|
|
IV=.TRUE.
|
|
IVP=.TRUE.
|
|
IVPP=.TRUE.
|
|
ISHIFT=.TRUE.
|
|
IPERT=.TRUE.
|
|
ENDIF
|
|
IF(INTFLG.EQ.5) RVIVAS=RMAX
|
|
WRITE(6,300)
|
|
WRITE(6,310) RMIN,STEPS,RVIVAS
|
|
IF(INTFLG.EQ.4) WRITE(6,320) RVIVAS,DR,RMAX,DRMAX,ALPHA1,XSQMAX,
|
|
1 ALPHA2,TOLHI,IALPHA,ISHIFT,IV,IPERT,IVP,IALFP,IVPP,ISYM,NUMDER
|
|
GO TO 380
|
|
ENDIF
|
|
C
|
|
IF(INTFLG.EQ.6) THEN
|
|
WRITE(6,340)
|
|
WRITE(6,310) RMIN,STEPS,RMAX
|
|
GO TO 380
|
|
ENDIF
|
|
C
|
|
IF(INTFLG.EQ.7) THEN
|
|
WRITE(6,350)
|
|
WRITE(6,310) RMIN,STEPS,RMAX
|
|
GO TO 380
|
|
ENDIF
|
|
C
|
|
IF(INTFLG.EQ.8) THEN
|
|
CALL MHAACK(6)
|
|
WRITE(6,310) RMIN,STEPS,RMAX
|
|
WRITE(6,352) IABSDR
|
|
IF(IABSDR.EQ.1) WRITE(6,353) DR
|
|
WRITE(6,354) RMID,DRAIRY,TOLHI,POWRX
|
|
IF(RVFAC.GT.0.D0.AND.IRMSET.GT.0) WRITE(6,271) RVFAC
|
|
IF(DRAIRY.LT.0.D0) WRITE(6,355)
|
|
IF(TOLHI.GE.1.D0) THEN
|
|
WRITE(6,356)
|
|
ELSE
|
|
WRITE(6,357)
|
|
ENDIF
|
|
GO TO 380
|
|
ENDIF
|
|
C
|
|
IF(INTFLG.EQ.-1) THEN
|
|
WRITE(6,370) RMIN,STEST,NGMP
|
|
GO TO 380
|
|
ENDIF
|
|
C
|
|
WRITE(6,220)
|
|
STOP
|
|
C
|
|
380 JKEEP=-1
|
|
XEPS=-1.D0
|
|
DEEP=1.D30
|
|
IF(IRXSET.GT.0) WRITE(6,381) IRXSET
|
|
381 FORMAT(/' IRXSET =',I3,' OPTION. RMAX ADJUSTED AUTOMATICALLY ',
|
|
1 'FOR EACH NEW JTOT,MVAL')
|
|
IF(IRMSET.LE.0) GOTO 420
|
|
WRITE(6,390) IRMSET
|
|
390 FORMAT(/' IRMSET =',I3,' OPTION. RMIN CHOSEN AUTOMATICALLY ',
|
|
1 'FOR EACH NEW JTOT')
|
|
C
|
|
C XEPS IS SUCH THAT AIRY(XEPS) APPROX. EQUALS 10**(-IRMSET)
|
|
C
|
|
XEPS=(-1.5D0*LOG(4.D0*SQRT(PI)*
|
|
1 10.D0**(-IRMSET)))**(2.D0/3.D0)
|
|
C>>SG 1/18/93 BELOW REMOVED AT SUGGESTION OF JMH
|
|
C IF(ISCRU.EQ.0 .AND. NNRG.NE.1) SHRINK=0
|
|
IF(INTFLG.NE.3 .OR. SHRINK.NE.1) GOTO 420
|
|
DEEP=2.D0+XEPS**1.5D0/1.5D0
|
|
WRITE(6,400)
|
|
400 FORMAT(22X,'AND DEEPLY CLOSED CHANNELS ',
|
|
1 'DROPPED IN LONG-RANGE REGION')
|
|
IF(NNRG.NE.1 .AND. ISCRU.NE.0) WRITE(6,410)
|
|
410 FORMAT(22X,'NOTE THAT BASIS SET CONTRACTION IS PERFORMED FOR ',
|
|
1 'ENERGY(1),'/22X,'SO THAT SUBSEQUENT ENERGIES MUST NOT BE ',
|
|
2 'SIGNIFICANTLY HIGHER.')
|
|
C
|
|
420 ISAV=0
|
|
IF(JTOTL.EQ.JTOTU .AND. MSET.GT.0) ISAV=1
|
|
IF(ISCRU.LT.0) ISAV=-ISAV
|
|
ISCRU=IABS(ISCRU)
|
|
C
|
|
IF(ISCRU.EQ.0) THEN
|
|
IF(NNRG.GT.1.OR.NTEMP.GT.0) WRITE(6,430)
|
|
430 FORMAT(/' ***** WARNING - NO SCRATCH FILE SPECIFIED BY ISCRU ',
|
|
1 'PARAMETER - FULL CALCULATION WILL BE DONE AT EACH ENERGY')
|
|
ELSE
|
|
IF(ISAV.EQ.-1) THEN
|
|
WRITE(6,440) ISCRU
|
|
440 FORMAT(/' ENERGY-INDEPENDENT MATRICES SAVED FROM A ',
|
|
1 'PREVIOUS RUN WILL BE READ FROM UNIT',I3)
|
|
OPEN(ISCRU,FORM='UNFORMATTED',STATUS='OLD')
|
|
ELSE
|
|
WRITE(6,450) ISCRU
|
|
450 FORMAT(/' ENERGY-INDEPENDENT MATRICES WILL BE SAVED ',
|
|
1 'TEMPORARILY ON UNIT',I3)
|
|
OPEN(ISCRU,FORM='UNFORMATTED',STATUS='UNKNOWN')
|
|
ENDIF
|
|
ENDIF
|
|
C
|
|
WRITE(6,470) URED
|
|
470 FORMAT(/' REDUCED MASS FOR COLLISION =',F14.9,' A.M.U.')
|
|
IF(JTOTL.LT.0) JTOTL=0
|
|
IF(JTOTU.LT.JTOTL) JTOTU=999999
|
|
WRITE(6,480) JTOTL,JTOTU,JSTEP
|
|
480 FORMAT(/' CONTROL DATA FOR TOTAL ANGULAR MOMENTUM IS'/
|
|
1 7X,'JTOT FROM',I4,' TO',I6,' IN STEPS OF',I4)
|
|
IF(JTOTU.GE.999999) WRITE(6,490) NCAC,DTOL,OTOL
|
|
490 FORMAT(/' JTOT SERIES WILL BE TERMINATED WHEN MAX CHANGE IN ',
|
|
1 'CROSS SECTIONS IS LESS THAN TOLERANCE FOR NCAC =',I3,
|
|
2 ' CONSECUTIVE JTOT'/25X,
|
|
3 'DIAGONAL (DTOL) AND OFF-DIAGONAL (OTOL) TOLERANCES ARE',2F9.5)
|
|
IF(JTOTU.GE.999999.AND.NNRGPG.GT.1) WRITE(6,491) NNRGPG
|
|
491 FORMAT(/' N.B. CONVERGENCE CHECKING IS DONE FOR ENERGY GROUPS',
|
|
1 ' OF NNRGPG =',I4)
|
|
IF(MSET.GT.0 .AND. MHI.LE.0) MHI=MSET
|
|
IF(MSET.GT.0) WRITE(6,500) MSET,MHI
|
|
500 FORMAT(/' CALCULATIONS WILL BE FOR SYMMETRY BLOCK ("PARITY ',
|
|
1 'CASES")',I4,' TO',I4)
|
|
C
|
|
C PROCESS TOTAL ENERGIES
|
|
C
|
|
CALL ECNV(EUNITS,EUNITC,EFACT)
|
|
IF(NNRG.GT.0 .AND. DNRG.EQ.0.D0 .AND. ABS(EFACT-1.D0).GT.1.D-3
|
|
1 .AND. ICONV.EQ.0) WRITE(6,510) (ENERGY(I),I=1,NNRG)
|
|
510 FORMAT(/' INPUT ENERGY LIST IS'/(16X,7D16.6))
|
|
IF(NTEMP.LE.0) GOTO 520
|
|
C OVERRIDE ENERGY INPUT WITH TEMP INPUT
|
|
NTEMP=MIN0(NTEMP,MXTEMP)
|
|
CALL EAVG(NTEMP,TEMP,NGAUSS,ENERGY,NNRG,MXNRG)
|
|
NPR=NNRG
|
|
GOTO 590
|
|
520 ISRCH=0
|
|
NPR=NNRG
|
|
C
|
|
C PROCESS A NEGATIVE INPUT NNRG FOR RESONANCE SEARCH OPTION
|
|
C
|
|
IF(NNRG.GE.0 .OR. DNRG.EQ.0.D0 .OR. JTOTL.NE.JTOTU .OR.
|
|
1 MSET.LE.0 .OR. KSAVE.LE.0) GOTO 530
|
|
ISRCH=1
|
|
NNRG=5*(IABS(NNRG)/5)
|
|
MXN=5*(MXNRG/5)
|
|
NNRG=MIN0(NNRG,MXN)
|
|
NNRGPG=5
|
|
NPR=5
|
|
C
|
|
530 NNRG=MIN0(MXNRG,NNRG)
|
|
NPR=MIN0(MXNRG,NPR)
|
|
IF(NNRG.GT.0) GOTO 550
|
|
WRITE(6,540)
|
|
540 FORMAT(/' ***** ERROR - NO INPUT ENERGIES SPECIFIED - RUN HALTED')
|
|
STOP
|
|
550 IF(NNRG.LE.1 .OR. (DNRG.EQ.0.D0 .AND. ICONV.EQ.0)) GOTO 570
|
|
DO 560 I=2,NPR
|
|
560 ENERGY(I)=ENERGY(1)+(I-1)*DNRG
|
|
570 DO 580 I=1,NPR
|
|
580 ENERGY(I)=ENERGY(I)*EFACT
|
|
590 WRITE(6,600) NNRG
|
|
600 FORMAT(/' CONTROL DATA FOR TOTAL ENERGIES. CALCULATIONS WILL ',
|
|
1 'BE PERFORMED FOR',I4,' VALUES')
|
|
DO 610 I=1,NPR
|
|
ENEV=ENERGY(I)/8065.5410D0
|
|
610 WRITE(6,620) I,ENERGY(I),ENEV
|
|
620 FORMAT(7X,'ENERGY NO.',I4,' =',F17.9,' (1/CM) =',F17.12,' E.V.')
|
|
C
|
|
IF(ISRCH.EQ.1) WRITE(6,630)
|
|
630 FORMAT(/' RESONANCE SEARCH OPTION. ONLY FIRST 5 ENERGIES ',
|
|
1 'GIVEN. OTHERS WILL BE DETERMINED INTERACTIVELY.')
|
|
C
|
|
IF(IFLS.GT.0 .AND. IFEGEN.GT.0) WRITE(6,640)
|
|
640 FORMAT(/' THESE ENERGY VALUES WILL BE USED AS RELATIVE (CENTER',
|
|
1 ' OF MASS) VALUES AND LIST MAY BE MODIFIED ACCORDINGLY.')
|
|
C
|
|
IF(NUMDER) WRITE(6,641)
|
|
641 FORMAT(/' NUMDER=.TRUE. POTENTIAL DERIVATIVE WILL BE COMPUTED',
|
|
& ' NUMERICALLY FROM POTENTIAL.')
|
|
WRITE(6,650) PRINT,ISIGPR,ITHROW
|
|
650 FORMAT(/' PRINT LEVEL (PRNTLV) =',I3,' OTHER PRINT CONTROLS',
|
|
1 ' ISIGPR =',I2,' ITHROW =',I2)
|
|
WRITE(6,660)
|
|
660 FORMAT(/' ',30('===='))
|
|
C
|
|
C INITIALIZE BASIS (BASIN/IOSBIN)
|
|
C COMBINED MOLSCAT (BASIN) AND IOS (IOSBIN) -- APR 86
|
|
C IOSBIN GRABS STORAGE IN ATAU=JLEV=X (ITYPE=6 ONLY). MAX AVAILABLE
|
|
C PASSED INITIALLY IN NLEV; SET6I/IOSBIN MUST UPDATE
|
|
C IC ACCORDINGLY. N.B. IOS CASE ALSO USES NLEV TO PASS 'NVC'
|
|
C FROM BASIN/IOSBIN TO IOSDRV.
|
|
C BASIN TAKES STORAGE FOR JLEV=X, AND ALSO RESETS IC ACCORDINGLY;
|
|
C FOR THIS CASE, NLEV INITIALIZED TO MAXIMUM AVAILABLE IN X().
|
|
IXJLEV=IXNEXT
|
|
NLEV=MX
|
|
C IXNEXT REMOVED FROM ARGUMENT LIST: JMH, 10 NOV 93
|
|
CALL BASIN(NLEV,X(IXJLEV),URED,NQN,NLABV(9),MXPAR,ITYPE,IOSFLG)
|
|
C BASE ROUTINE INCREMENTS IXNEXT BY AMOUNT OF STORAGE IN JLEV.
|
|
CALL CHKSTR(NUSED)
|
|
WRITE(6,660)
|
|
C
|
|
C INITIALIZE POTENTIAL.
|
|
C
|
|
ILAM=IXNEXT
|
|
MXLAM=NIPR*(MX-ILAM+1)
|
|
CALL POTENL(-1,MXLAM,NPOTL,X(ILAM),RM,EPSIL,ITYPE)
|
|
|
|
C THIS READS (5, POTL). RM AND EPSIL ARE SET HERE.
|
|
C RM IS A LENGTH PARAMETER (IN ANGSTROMS)
|
|
C EPSIL IS AN ENERGY PARAMETER IN WAVENUMBERS.
|
|
ITYP=MOD(ITYPE,10)
|
|
C INCREMENT IXNEXT FOR STORAGE TAKEN FOR LAM(NLABV,MXLAM)
|
|
IXNEXT=IXNEXT+(MXLAM*NLABV(ITYP)+NIPR-1)/NIPR
|
|
CALL IVCHK(IVLFL,PRNTLV,ITYPE,NLABV,MXLAM,NPOTL,X(ILAM))
|
|
WRITE(6,660)
|
|
C
|
|
C COMPUTE SOME DIMENSIONLESS PARAMETERS
|
|
C
|
|
C RMLMDA IS THE SQUARE OF THE RATIO OF RM TO DEBROGLIE WAVELENGTH
|
|
RMLMDA=URED*RM*RM*EPSIL/BFCT
|
|
C CINT IS THE FACTOR TO REDUCE THE ROTATIONAL CONSTANTS
|
|
CINT = RMLMDA/EPSIL
|
|
C
|
|
C ***
|
|
IF(IOSFLG.LE.0) GOTO 670
|
|
C ***
|
|
C *** THIS IS WHERE IOS CODE DIVERGES - CALL IOS CODE AND SKIP TO EXIT
|
|
C ***
|
|
IF (IRSTRT.NE.0) THEN
|
|
WRITE(6,*) ' *** RESTART REQUESTED WITH IOS RUN - NOT ALLOWED'
|
|
WRITE(6,*) ' *** MODIFY INPUT DECK AND RESUBMIT'
|
|
STOP
|
|
ENDIF
|
|
CALL IOSDRV(NNRG,NPR,ENERGY,JTOTL,JTOTU,JSTEP,TEST,NCAC,
|
|
1 IFLS,LINE,LTYPE,MXLN,INTFLG,ITYPE,LMAX,MMAX,
|
|
2 IPROGM,URED,LABL,NUMDER,
|
|
3 X(ILAM),MXLAM,NPOTL,CINT,IRMSET,IRXSET,RVFAC,
|
|
4 DEEP,PRINT,NLEV,ISAVEU,TFIRST,RM,EPSIL,RMIN,RMAX)
|
|
CALL GCLOCK(TLAST)
|
|
TOTIME=TLAST-TFIRST
|
|
GOTO 1020
|
|
C
|
|
C PROCESS PRESSURE-BROADENING LINE-SHAPE INPUT PARAMETERS.
|
|
C
|
|
670 IF(IFLS.GT.0) THEN
|
|
CALL PRBRIN(IFLS,LINE,LTYPE,MXLN,ILSU,NNRG,ENERGY,MXNRG,IFEGEN,
|
|
1 X(IXJLEV),PRINT)
|
|
IF(IFEGEN.GT.0) NPR=NNRG
|
|
WRITE(6,660)
|
|
IF(KSAVE.EQ.0) GOTO 690
|
|
WRITE(6,680) IFLS,KSAVE
|
|
680 FORMAT(/' ****** WARNING. IFLS =',I3,' AND KSAVE =',I3,' ARE ',
|
|
1 'INCOMPATIBLE. KSAVE IS RESET TO ZERO')
|
|
KSAVE=0
|
|
ENDIF
|
|
C
|
|
C INITIALIZE OUTPUT ROUTINE.
|
|
C OUTPUT TAKES AN ADDITIONAL AMOUNT OF STORAGE
|
|
C FOR SIG AT X(IXNEXT) AND INCREASES IXNEXT ACCORDINGLY.
|
|
C
|
|
690 IOUT=IXNEXT
|
|
C NOTE THAT IXNEXT WILL BE CHANGED BY OUTINT
|
|
CALL OUTINT(LABL,ENERGY,NNRG,NLEV,NQN,X(IXJLEV),X(IOUT),IXNEXT,
|
|
1 IECONV,URED,ITYPE,KSAVE,ISST,MINJT,MAXJT,ISIGU,IPARTU,ISAVEU,
|
|
2 IPROGM,MXSIG,ISIGPR,JSTEP,IRSTRT)
|
|
CALL CHKSTR(NUSED)
|
|
IC1=IXNEXT
|
|
C PROCESS RESTART REQUEST ...
|
|
MXP=0
|
|
CALL RESTRT(IRSTRT,ISAVEU,JTOTL,JSTEP,MXPAR,MSET,MHI,
|
|
1 LABEL,ITYPE,NLEV,NQN,URED,IPROGM,
|
|
2 X(IXJLEV),NNRG,ENERGY,MXNRG,
|
|
3 X(IOUT),ISST,IECONV,MINJT,MAXJT,ISIGU,IPARTU,KSAVE,
|
|
4 OTOL,DTOL,X(IC1),X(IC1),MRSTRT,IERST,MXP,PRINT)
|
|
WRITE(6,660)
|
|
C
|
|
EFIRST=ENERGY(1)*CINT
|
|
CALL GCLOCK(TITIME)
|
|
TTIME=TITIME-TFIRST
|
|
WRITE(6,700) TTIME,NUSED
|
|
700 FORMAT(/' INITIALIZATION DONE. TIME WAS',F7.2,' CPU SECS.',I10,
|
|
1 ' WORDS OF STORAGE USED.')
|
|
IF(PRINT.LT.4) WRITE(6,710) TIT
|
|
710 FORMAT('1',120A1)
|
|
IF(PRINT.GE.4.AND.ITHROW.EQ.0) WRITE(6,720)
|
|
720 FORMAT('1')
|
|
C
|
|
C ************** LOOP OVER JTOT VALUES BEGINS HERE. ******************
|
|
C
|
|
DO 990 JTOT=JTOTL,JTOTU,JSTEP
|
|
IF(PRINT.GE.1 .AND. PRINT.LE.4) WRITE(6,730) JTOT
|
|
730 FORMAT(/' ANGULAR MOMENTUM JTOT =',I4/2X,7('****'))
|
|
THETA=THETLW+THETST*DBLE(JTOT)
|
|
C
|
|
C *************** LOOP OVER SYMMETRY BLOCKS BEGINS HERE **************
|
|
C
|
|
DO 980 M=1,MXPAR
|
|
PHI=PHILW+PHIST*DBLE(M-1)
|
|
IF(MSET.GT.0.AND.(M.LT.MSET.OR.M.GT.MHI)) GO TO 980
|
|
IF (IRSTRT.GE.2.AND.JTOT.EQ.JTOTL.AND.M.LT.MRSTRT) THEN
|
|
WRITE(6,736) M,IRSTRT
|
|
736 FORMAT(' *** SKIPPING MVALUE =',I3,' DUE TO IRSTRT =',I3)
|
|
GO TO 980
|
|
ENDIF
|
|
IF(PRINT.LT.4) GOTO 760
|
|
IF(ITHROW.NE.0) WRITE(6,710) TIT
|
|
IF(ITHROW.EQ.0) WRITE(6,740) TIT
|
|
740 FORMAT(/' ',120A1)
|
|
WRITE(6,750) JTOT,M
|
|
750 FORMAT(/' TOTAL ANGULAR MOMENTUM, JTOT =',I5,' SYMMETRY',
|
|
1 ' BLOCK =',I4)
|
|
760 CONTINUE
|
|
C
|
|
C CHOOSE BASIS FUNCTIONS
|
|
C
|
|
CALL BASE (JTOT,X(IXJLEV),N,X,X,CINT,X,X,X,X,MXLAM,NPOTL,X(ILAM),
|
|
1 X,WGHT,IEXCH,THETA,PHI,M,.TRUE.,EFIRST,NLEV,PRINT)
|
|
C
|
|
C MOLD IS A REMNANT OF THE PREVIOUS "PARITY CASE" PROCESSING.
|
|
C MXP IS USED IN CONVERGENCE CHECKING, MOLD IS PASSED TO PRBR
|
|
C
|
|
MOLD=-M
|
|
IF(M.EQ.MXPAR.AND.N.LE.0) MOLD=0
|
|
MXP=MAX0(MXP,IABS(MOLD))
|
|
IF(M.EQ.MXPAR) MOLD=0
|
|
C
|
|
C N IS THE NUMBER OF BASIS FUNCTIONS
|
|
C SKIP THIS JTOT,M IF NO CHANNELS
|
|
C
|
|
C IF(N.LE.0) GOTO 980 <<- SG: FIXES ISIGU BUG
|
|
IF(N.LE.0) GOTO 770
|
|
NSQ = N*N
|
|
C
|
|
C ALLOCATE STORAGE FOR COUPLED EQUATION SOLVER.
|
|
C
|
|
C ALLOCATE STORAGE COMMON TO ALL SCATTERING. . .
|
|
C IS0-IS9 ARE SREAL,SIMAG,K-MATRIX,VL,IV,EINT,CENT,WVEC,L,NBASIS
|
|
C NOTE THAT INTEGER ARRAYS OF LENGTH N ARE NOT REDUCED BY NIPR
|
|
C IC1 IS IXNEXT AFTER ALLOCATIONS OF BASIN, POTENL, OUTINT ...
|
|
ISJ=IC1
|
|
IS0=ISJ+N
|
|
IS1=IS0+NSQ
|
|
IS2=IS1+NSQ
|
|
IS3=IS2+NSQ
|
|
NV=N*(N+1)/2
|
|
IF(IVLU.EQ.0) NV=NV*NPOTL
|
|
IS4=IS3+NV
|
|
IS5=IS4
|
|
IF(IVLFL.GT.0) IS5=IS4+(NV+NIPR-1)/NIPR
|
|
IS6=IS5+N
|
|
IS7=IS6+N
|
|
IS8=IS7+N
|
|
IS9=IS8+N
|
|
IXNEXT=IS9+N
|
|
C
|
|
C SET UP SOME STORAGE POINTERS FOR LATER USE IN CONVRG
|
|
C
|
|
IF(ICONV.GT.0) THEN
|
|
IS10=IXNEXT
|
|
IS11=IS10+NSQ
|
|
IXNEXT=IS11+NSQ
|
|
ENDIF
|
|
IC2=IXNEXT
|
|
CALL CHKSTR(NUSED)
|
|
C IXNEXT/IC2 REFLECT STORAGE ALWAYS NEEDED FOR THIS JTOT,PARITY.
|
|
C
|
|
C SET UP BASIS FUNCTIONS IN ALLOCATED STORAGE
|
|
C
|
|
CALL BASE(JTOT,X(IXJLEV),N,X(ISJ),X(IS8),CINT,X(IS5),X(IS6),
|
|
1 X(IS3),X(IS4),MXLAM,NPOTL,X(ILAM),X(IS7),WGHT,IEXCH,THETA,
|
|
2 PHI,M,.FALSE.,EFIRST,NLEV,PRINT)
|
|
C
|
|
C CHECK THAT RMAX IS BEYOND CENTRIFUGAL BARRIER
|
|
C
|
|
CALL FINDRX(ENERGY,X(IS5),X(IS6),NPR,N,CINT,RMAX,RSTOP,
|
|
1 NOPMAX,IRXSET,PRINT)
|
|
IF(INTFLG.EQ.5) RVIVAS=RSTOP
|
|
RSTART=RMIN
|
|
C
|
|
C ****************** LOOP OVER ENERGIES BEGINS HERE ******************
|
|
C
|
|
770 NELOOP=(NNRG+NNRGPG-1)/NNRGPG
|
|
JHI=0
|
|
ICODE=0
|
|
ALDONE=.TRUE.
|
|
DO 966 IEL=1,NELOOP
|
|
JLO=JHI+1
|
|
JHI=MIN(JHI+NNRGPG,NNRG)
|
|
C
|
|
C SEE WHETHER THIS BLOCK OF ENERGIES CAN BE SKIPPED
|
|
C
|
|
LCALC=.FALSE.
|
|
DO 775 J=JLO,JHI
|
|
IF(IECONV(J).LT.0 .AND. IECONV(J).GT.-2*MXP) THEN
|
|
WRITE(6,772) JTOT,J
|
|
772 FORMAT(/' * * * WARNING. JTOT =',2I5,'-TH ENERGY PREVIOUSLY ',
|
|
1 'FAILED TO CONVERGE.')
|
|
LCALC=.TRUE.
|
|
ELSEIF(IECONV(J).EQ.0) THEN
|
|
LCALC=.TRUE.
|
|
ELSEIF(IECONV(J).GT.0) THEN
|
|
IF(JTOTU.LT.999999 .OR. IECONV(J).LT.NCAC*MXP) LCALC=.TRUE.
|
|
ENDIF
|
|
775 CONTINUE
|
|
C
|
|
IF(.NOT.LCALC) GOTO 966
|
|
ALDONE=.FALSE.
|
|
DO 960 J=JLO,JHI
|
|
IF(N.LE.0) THEN
|
|
CALL OUTSIG(ISIGU,M,MXPAR,J,ENERGY,MINJT,MAXJT,X(IOUT))
|
|
GOTO 960
|
|
ENDIF
|
|
C
|
|
C IF THIS IS A PRESSURE BROADENING CALC AND THIS S-MATRIX
|
|
C WILL NOT BE USED, SKIP IT
|
|
C
|
|
IF(IFLS.GT.0 .AND. IFEGEN.GE.2) THEN
|
|
CALL PRBCNT(J,X(ISJ),N,IUSE)
|
|
IF(IUSE.EQ.0) THEN
|
|
LWARN=.TRUE.
|
|
IF(PRINT.GE.4) WRITE(6,777) JTOT,M,J,ENERGY(J)
|
|
777 FORMAT(/' ****** S MATRIX FOR JTOT =',I5,' M =',I4,3X,
|
|
1 'ENERGY(',I3,') =',F18.9,/9X,'WILL NOT BE USED ',
|
|
2 'IN PRESSURE BROADENING CALCULATION: SKIPPING')
|
|
IF(IECONV(J).GE.0) IECONV(J)=IECONV(J)+1
|
|
CALL OUTSIG(ISIGU,M,MXPAR,J,ENERGY,MINJT,MAXJT,X(IOUT))
|
|
GOTO 960
|
|
ENDIF
|
|
ENDIF
|
|
C
|
|
IF (IRSTRT.EQ.3.AND.JTOT.EQ.JTOTL.AND.M.EQ.MRSTRT.AND.J.LT.IERST)
|
|
1 GO TO 960
|
|
ETOT=ENERGY(J)
|
|
ERED=ETOT*CINT
|
|
IF(ICODE.EQ.0) THEN
|
|
EFIRST=ERED
|
|
ICODE=1
|
|
ENDIF
|
|
ESHIFT=ERED-EFIRST
|
|
C
|
|
C ICODE CONTROLS WHETHER POTENTIAL INFORMATION IS READ FROM CHANNEL
|
|
C ICODE=1 CALCULATES INFORMATION AND STORES IT
|
|
C ICODE=2 (SET AFTER 1ST ENERGY) READS STORED INFORMATION
|
|
C
|
|
IF(PRINT.GE.4) THEN
|
|
IF(ITHROW.EQ.0) THEN
|
|
WRITE(6,740) TIT2
|
|
ELSE
|
|
WRITE(6,710) TIT2
|
|
ENDIF
|
|
WRITE(6,780) JTOT,M,J,ETOT
|
|
780 FORMAT(/' JTOT =',I5,' SYMMETRY BLOCK =',I4,' ENERGY(',
|
|
1 I3,') =',F18.9,' (1/CM)')
|
|
ENDIF
|
|
C
|
|
C FOR SURFACE SCATTERING AT SUBSEQUENT ENERGY,
|
|
C GET CORRESPONDING THETA FOR PRINTING
|
|
C
|
|
IF(ITYPE.EQ.8 .AND. J.NE.1) THEN
|
|
SINTH=SIN(THETA*PI/180.D0)
|
|
SINTH=SINTH**2*ENERGY(1)/ETOT
|
|
IF(SINTH.GT.1.D0) GOTO 960
|
|
THETJ=ASIN(SQRT(SINTH))*180.D0/PI
|
|
WRITE(6,795) J,ETOT,THETJ
|
|
795 FORMAT(/' NOTE: K VECTORS PARALLEL TO SURFACE WERE ',
|
|
1 'CALCULATED FOR ENERGY(1)'/' SUBSEQUENT ENERGY(',I3,') =',
|
|
2 F10.4,' CORRESPONDS TO THETA =',F10.4,' DEGREES')
|
|
ENDIF
|
|
C
|
|
C TEMPORARY STORAGE FOR HEADER, FINDRM
|
|
C
|
|
IT1=IXNEXT
|
|
IT2=IT1+MXLAM
|
|
IT3=IT2+N
|
|
IT4=IT3+N
|
|
IT5=IT4+N
|
|
IXNEXT=IT5+N
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
CALL HEADER(X(IS1),X(IS2),N,NSQ,X(IT1),X(IS3),X(IS4),X(IS5),
|
|
1 X(IS6),X(IT2),MXLAM,NPOTL,ICODE,ISAV,EFIRST)
|
|
C
|
|
IF(ICODE.EQ.1 .AND. IRMSET.GT.0) THEN
|
|
C FOR IRMSET > 0 OPTION, CHOOSE APPROPRIATE RMIN
|
|
RSTART=RMIN
|
|
CALL FINDRM(X(IS1),N,RSTART,RTURN,IK,X(IT1),X(IS3),X(IS4),ERED,
|
|
1 X(IS5),X(IS6),RMLMDA,X(IT2),X(IT3),X(IT4),X(IT5),MXLAM,NPOTL,
|
|
2 IRMSET,ITYPE,PRINT)
|
|
IF(RVFAC.NE.0.D0) THEN
|
|
RMID=RVFAC*RTURN
|
|
IF(PRINT.GE.3.AND.RSTOP.GT.RMAX) WRITE(6,799) RSTOP,RMAX
|
|
799 FORMAT(' RMID OBTAINED FROM RTURN EVEN THOUGH RSTOP.GT.RMAX',
|
|
1 2F8.2)
|
|
IF(PRINT.GE.3) WRITE(6,800) RMID,RVFAC
|
|
800 FORMAT(/' RMID =',F7.2,' OBTAINED FROM RVFAC =',F6.3)
|
|
ENDIF
|
|
ELSE
|
|
RTURN=RMIN
|
|
IK=1
|
|
ENDIF
|
|
C
|
|
C RESET IXNEXT TO RECOVER TEMPORARY STORAGE FROM HEADER AND FINDRM
|
|
C
|
|
IXNEXT=IT1
|
|
C
|
|
C SOLVE COUPLED EQUATIONS.
|
|
C PROPAGATORS ARE CALLED FROM SUBROUTINE STORAG
|
|
C
|
|
CALL STORAG(INTFLG,N,MXLAM,NV,NPOTL,
|
|
1 ISJ,IS0,IS1,IS2,IS3,IS4,IS5,IS6,IS7,IS8,IS9,
|
|
2 ESHIFT,NOPMAX,DEEP,IK,ICODE,PRINT,NUMDER)
|
|
C
|
|
CALL GCLOCK(TJTIME)
|
|
TTIME=(TJTIME-TITIME)
|
|
TITIME=TJTIME
|
|
C
|
|
IF(NOPEN.GT.0) THEN
|
|
C RESET ICODE TO ALLOW "SUBSEQUENT ENERGY" CALCULATIONS
|
|
ICODE=2
|
|
ELSE
|
|
IF(PRINT.GE.4) WRITE(6,900) JTOT,M,J,ETOT,TTIME
|
|
900 FORMAT(/' ****** NO OPEN CHANNELS FOR JTOT =',I5,3X,
|
|
1 'M =',I4,' ENERGY(',I3,') =',F18.9,10X,'STEP TIME =',
|
|
2 F6.2,' SECS')
|
|
IF(IECONV(J).GE.0) IECONV(J)=IECONV(J)+1
|
|
GOTO 960
|
|
ENDIF
|
|
C
|
|
C FORCE IRSTRT=0 SO THAT ISAVEU WILL BE UPDATED.
|
|
IRSTRX=0
|
|
C AUG 95 (SG) ADDED N TO PAREMETER LIST SO IT CAN BE PRINTED
|
|
CALL OUTPUT(JTOT,X(IS9),X(ISJ),X(IS8),X(IS7),X(IS0),X(IS1),
|
|
1 X(IS2),CONV,NOPEN,M,MXPAR,WGHT,IEXCH,J,RM,PRINT,TTIME,
|
|
2 ENERGY,X(IOUT),X(IXJLEV),ISST,IECONV,MINJT,MAXJT,
|
|
3 NLEV,NQN,OTOL,DTOL,KSAVE,ISIGU,IPARTU,ISAVEU,ISIGPR,IRSTRX,N)
|
|
C
|
|
IF(ICONV.GT.0) CALL CONVRG(J,X(IS0),X(IS1),X(IS10),X(IS11))
|
|
IF(IECONV(J).LT.0 .OR. IFLS.LE.0) GOTO 940
|
|
C
|
|
C TEMPORARY STORAGE FOR PRBR -- THESE ARE INTEGERS, COULD USE NIPR
|
|
IT1=IXNEXT
|
|
IT2=IT1+N
|
|
IT3=IT2+N
|
|
IT4=IT3+N
|
|
IXNEXT=IT4+N
|
|
CALL CHKSTR(NUSED)
|
|
CALL PRBR(JTOT,MOLD,NOPEN,J,RM,
|
|
1 X(IS9),X(ISJ),X(IS8),X(IS7),
|
|
2 X(IS0),X(IS1),X(IT1),X(IT2),X(IT3),X(IT4),
|
|
3 X(IXJLEV),MXPAR,WGHT,PRINT,ILSU)
|
|
C RECOVER TEMPORARY STORAGE ...
|
|
IXNEXT=IT1
|
|
C
|
|
940 IF(PRINT.GE.5) WRITE(6,950) JTOT,M,J,ETOT,TTIME
|
|
950 FORMAT(/' FINISHED JTOT =',I5,' M =',I4,' ENERGY(',I3,
|
|
1 ') =',F18.9,10X,'STEP TIME =',F8.2,' SECS')
|
|
C
|
|
960 CONTINUE
|
|
C
|
|
C RESONANCE SEARCH OPTION - GENERATE NEXT 5 ENERGIES
|
|
C
|
|
IF(ISRCH.EQ.0) GOTO 964
|
|
CALL NEXTE(ENERGY(JLO),EPSM,ENEW,DNRG,KSAVE)
|
|
IF(JHI.EQ.NNRG) GOTO 964
|
|
IF(ENEW.LE.0.D0) GOTO 1000
|
|
JST=JHI+1
|
|
JND=JHI+5
|
|
WRITE(6,600) NNRG
|
|
DO 962 JJ=JST,JND
|
|
ENERGY(JJ)=ENEW+(JJ-JST)*DNRG
|
|
ENEV=ENERGY(JJ)/8065.541D0
|
|
WRITE(6,620) JJ,ENERGY(JJ),ENEV
|
|
962 CONTINUE
|
|
964 CONTINUE
|
|
C
|
|
966 CONTINUE
|
|
C
|
|
C ******************** END OF LOOP OVER ENERGIES *********************
|
|
C
|
|
IF(ALDONE) THEN
|
|
WRITE(6,968) DTOL,OTOL,NCAC
|
|
968 FORMAT(///' CALCULATION TERMINATED BY CONVERGENCE OF TOTAL ',
|
|
1 'CROSS SECTIONS.'//' DIAGONAL AND OFF-DIAGONAL TOLERANCES ',
|
|
2 'WERE ',2F9.5,' NCAC =',I3)
|
|
GOTO 1000
|
|
ENDIF
|
|
C
|
|
IF(PRINT.GE.2 .AND. PRINT.LT.5) WRITE(6,970)
|
|
970 FORMAT(/)
|
|
C RESTORE ERED TO FIRST ENERGY VALUE.
|
|
ERED = EFIRST
|
|
980 CONTINUE
|
|
C
|
|
C ****************** END OF LOOP OVER SYMMETRY BLOCKS ****************
|
|
C
|
|
IF(IFLS.GT.0) CALL PRBOUT(JSTEP)
|
|
990 CONTINUE
|
|
C
|
|
C ******************** END OF LOOP OVER JTOT VALUES ******************
|
|
C
|
|
C END OF RUN BOOKKEEPING
|
|
C
|
|
1000 CALL OUTPCH(X(IOUT),ENERGY,NNRG,MINJT,MAXJT,ISIGPR,LABL,ISIGU,
|
|
1 LWARN)
|
|
IF(IFLS.GT.0) WRITE(6,710) TIT
|
|
IF(IFLS.GT.0) CALL PRBOUT(JSTEP)
|
|
IF(IFLS.GT.0) CALL DACLOS
|
|
CALL GCLOCK(TLAST)
|
|
TOTIME=TLAST-TFIRST
|
|
C MAKE SURE WE HAVE NUSED FOR KSAVE BY CALLING CHKSTR
|
|
CALL CHKSTR(NUSED)
|
|
IF(KSAVE.GT.0) WRITE(KSAVE,1010) TOTIME,TTIME,NUSED
|
|
1010 FORMAT(/' TOTAL CPU =',F9.2,' SECS LAST CYCLE =',
|
|
1 F8.2,' SECS NUSED =',I8)
|
|
C
|
|
C *** IOS CALCULATION (IOSFLG.GT.0) REJOINS CODE BELOW
|
|
C ASCERTAIN 'HIGH-WATER' MARK IN STORAGE FROM CHKSTR.
|
|
C MX MAY HAVE BEEN REDUCED, SO USE MXSAVE FOR ALLOCATED STORAGE
|
|
C
|
|
1020 CALL CHKSTR(NUSED)
|
|
WRITE(6,1030) IPROGM,PDATE,TOTIME,NUSED,MXSAVE
|
|
1030 FORMAT(///' ',8('----MOLSCAT----')/' |',120X,'|'/' |',13X,
|
|
1 'COUPLED CHANNEL MOLECULAR SCATTERING PROGRAM OF J. M. HUTSON ',
|
|
2 'AND S. GREEN, VERSION',I3,1X,A8,13X,'|'/
|
|
3 ' |',120X,'|'/' |',13X,'THIS RUN USED',F11.2,' CPU SECS ',
|
|
4 'AND',I10,' OF THE ALLOCATED',I10,' WORDS OF STORAGE',14X,
|
|
5 '|'/' |',120X,'|'/' ',8('----MOLSCAT----') )
|
|
IF(LASTIN.EQ.0) GOTO 100
|
|
1040 RETURN
|
|
END
|
|
SUBROUTINE AIRPRP (Z, W, TMAT, VECNOW, VECNEW,
|
|
+ EIGOLD, EIGNOW, HP, Y1, Y2, CC, Y4, XF, REND, DRNOW, EN,
|
|
+ TOLAI, POWR, ESHIFT, NCH, ITWO, IREAD, IWRITE, IPRINT,
|
|
$ ISCRU, P, MXLAM, VL, IV, RMLMDA, EINT, CENT, NPOTL)
|
|
C
|
|
* AIRY ZEROTH-ORDER PROPAGATOR FROM R=XF TO R=REND
|
|
* FOR REFERENCE SEE M. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGORITHMS
|
|
* J. CHEM. PHYS. 81, 4510 (1984)
|
|
* AND M. ALEXANDER AND D. MANOLOPOULOS, "A STABLE LINEAR
|
|
* REFERENCE POTENTIAL ALGORITHM FOR SOLUTION ..."
|
|
* J. CHEM. PHYS. 86, 2044 (1987)
|
|
* AUTHOR: MILLARD ALEXANDER
|
|
* CURRENT REVISION DATE: 4-FEB-1991
|
|
* ----------------------------------------------------------------------
|
|
* ADAPTED TO MOLSCAT 4/91 BY TRP@NASAGISS
|
|
* ADAPTED TO MOLSCAT VERSION 11 BY JMH, JUN 92
|
|
*-----------------------------------------------------------------------
|
|
* DEFINITION OF VARIABLES IN CALL LIST:
|
|
* Z: MATRIX OF MAXIMUM DIMENSION NCH*NCH
|
|
* ON ENTRY Z CONTAINS THE INITIAL Z-MATRIX AT R=XF
|
|
* ON RETURN Z CONTAINS THE Z-MATRIX AT R=REND
|
|
* W, TMAT, VECNOW
|
|
* , VECNEW: SCRATCH MATRICES OF DIMENSION AT LEAST NCH*NCH
|
|
* EIGOLD, EIGNOW
|
|
* , HP, Y1, Y2
|
|
* , CC, Y4: SCRATCH VECTORS OF DIMENSION AT LEAST NCH
|
|
* XF: ON ENTRY: CONTAINS INITIAL VALUE OF INTERPARTICLE D
|
|
* ON EXIT: CONTAINS FINAL VALUE OF INTERPARTICLE DIS
|
|
* THIS IS EQUAL TO REND IF NORMAL TERMINATI
|
|
* OTHERWISE AN ERROR MESSAGE IS PRINTED
|
|
* DRNOW: ON ENTRY: CONTAINS INITIAL INTERVAL SIZE
|
|
* ON EXIT: CONTAINS FINAL INTERVAL SIZE
|
|
* EN: COLLISION ENERGY IN ATOMIC UNITS
|
|
* TOLAI: PARAMETER TO DETERMINE STEP SIZES
|
|
* IF TOLAI .LT. 1, THEN ESTIMATED ERRORS ARE USED TO
|
|
* DETERMINE NEXT STEP SIZES FOLLOWING THE PROCEDURE O
|
|
* IN M.H. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGOR
|
|
* IF TOLAI .GE. 1, THEN STEP SIZES ARE CONTROLLED BY
|
|
* ALGORITHM: DRNEXT = TOLAI * DRNOW
|
|
* POWR: POWER AT WHICH STEP SIZES INCREASE
|
|
C
|
|
C
|
|
* LOGICAL VARIABLES:
|
|
* ISYM: IF .TRUE., PROPAGATION ASSUMES SYMMETRY OF Y MATRIX
|
|
* ----------------------------------------------------------------------
|
|
IMPLICIT DOUBLE PRECISION (A-H, O-Z)
|
|
LOGICAL ISYM
|
|
INTEGER I, IEND, IERR, ITWO, IZERO, KSTEP, MAXSTP,
|
|
: NCH, NPT, NSKIP
|
|
* REAL CDIAG, CMAX, COFF, DRFIR, DRMID, DRNOW, EN, ESHIFT, FACT,
|
|
* : ONE, POWR, REND, RLAST, RMIN, RNEW, RNEXT, RNOW, ROLD,
|
|
* : SPCMN, SPCMX, TOLAI, XF, XLARGE, ZERO
|
|
* REAL CC, EIGNOW, EIGOLD, HP,Y1, Y2, Y4
|
|
* REAL TMAT, VECNEW, VECNOW, W, Z
|
|
EXTERNAL CORR, TRNSFM, OUTMAT, POTENT, DAXPY, DCOPY,
|
|
: SYMINV, SPROPN, DSCAL, TRNSP, WAVEIG
|
|
* MATRIX DIMENSIONS (ROW DIMENSION = NCH, MATRICES STORED COLUMN BY CO
|
|
DIMENSION Z(1), W(1), TMAT(1), VECNOW(1), VECNEW(1)
|
|
* VECTORS DIMENSIONED NCH
|
|
DIMENSION EIGOLD(1), EIGNOW(1), HP(1), Y1(1), Y2(1), CC(1), Y4(1)
|
|
DIMENSION P(1),VL(1),IV(1),EINT(1),CENT(1)
|
|
C
|
|
DATA IZERO, IONE, ZERO, ONE /0, 1, 0.D0, 1.D0/
|
|
DATA ISYM /.TRUE./
|
|
C
|
|
* ----------------------------------------------------------------------
|
|
C
|
|
ERED = EN
|
|
RMIN = XF
|
|
SPCMX = 0.D0
|
|
SPCMN = 0.D0
|
|
IF (ITWO .GT. 0) GO TO 60
|
|
SPCMN = REND - RMIN
|
|
* DETERMINE LOCAL WAVEVECTORS AT RMIN TO USE IN ESTIMATING SECOND DERIV
|
|
* HP AND Y1 ARE USED AS SCRATCH VECTORS HERE
|
|
CALL WAVEIG (W, EIGOLD, HP, Y1, RMIN, NCH, P, MXLAM, VL, IV,
|
|
1 RMLMDA, ERED, EINT, CENT, NPOTL)
|
|
* LOCAL WAVEVECTORS AT RMIN ARE RETURNED IN EIGOLD
|
|
DRFIR = DRNOW
|
|
DRMID = DRNOW * 0.5D0
|
|
RLAST = XF
|
|
ROLD = XF
|
|
RNOW = RLAST + DRMID
|
|
RNEXT = RLAST + DRNOW
|
|
* DEFINE LOCAL BASIS AT RNOW AND CARRY OUT TRANSFORMATIONS
|
|
* VECNEW IS USED AS SCRATCH MATRIX AND Y1 IS USED AS SCRATCH VECTOR HER
|
|
CALL POTENT (W, VECNOW, VECNEW, EIGNOW, HP, Y1,
|
|
+ RNOW, DRNOW, EN, XLARGE, NCH,
|
|
$ P, MXLAM, VL, IV, RMLMDA, ERED, EINT, CENT, NPOTL)
|
|
* VECNOW IS TRANSFORMATION FROM FREE BASIS INTO LOCAL BASIS
|
|
* IN FIRST INTERVAL
|
|
* E.G. P1=VECNOW ; SEE EQ.(23) OF
|
|
* M.H. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGORITHMS ..."
|
|
* STORE VECNOW IN TMAT
|
|
CALL DCOPY (NCH*NCH, VECNOW, 1, TMAT, 1)
|
|
* DETERMINE APPROXIMATE VALUES FOR DIAGONAL AND OFF-DIAGONAL
|
|
* CORRECTION TERMS
|
|
CALL CORR (EIGNOW, EIGOLD, HP, DRNOW, DRMID, XLARGE, CDIAG,
|
|
: COFF, NCH)
|
|
MAXSTP = ( (REND-XF) / DRNOW ) * 5
|
|
XF = REND
|
|
IF (IPRINT.GT.40) THEN
|
|
WRITE (6, 40)
|
|
40 FORMAT(/' ** AIRY PROPAGATION (NO DERIVATIVES):')
|
|
WRITE (6, 50)
|
|
50 FORMAT(' STEP RNOW', 5X, 5HDRNOW, 5X, 5HCDIAG, 6X, 4HCOFF)
|
|
END IF
|
|
60 IEND = 0
|
|
IF (ITWO .LT. 0) GO TO 70
|
|
IF (ITWO .EQ. 0) WRITE(ISCRU) MAXSTP
|
|
IF (ITWO. GT. 0) READ(ISCRU) MAXSTP
|
|
* WRITE OR READ RELEVANT INFORMATION
|
|
CALL OUTMAT (TMAT, EIGOLD, HP, ESHIFT, DRNOW, RNOW,
|
|
: NCH, NCH, ITWO, ISCRU)
|
|
C
|
|
C
|
|
* START AIRY PROPAGATION
|
|
C
|
|
* ----------------------------------------------------------------------
|
|
70 DO 200 KSTEP = 1, MAXSTP
|
|
NSTEP=KSTEP
|
|
C
|
|
* TRANSFORM LOG-DERIV MATRIX FROM LOCAL BASIS IN LAST INTERVAL TO
|
|
* LOCAL BASIS IN PRESENT INTERVAL. SEE EQ.(23) OF
|
|
* M.H. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGORITHMS ..."
|
|
* W IS USED AS SCRATCH MATRIX HERE, AND Y1 IS SCRATCH ARRAY
|
|
C
|
|
CALL TRNSP ( TMAT, NCH)
|
|
CALL TRNSFM ( TMAT, Z, W, NCH, .FALSE., ISYM )
|
|
C
|
|
* TMAT IS NO LONGER NEEDED
|
|
* SOLVE FOR LOG-DERIVATIVE MATRIX AT RIGHT-HAND SIDE OF
|
|
* PRESENT INTERVAL. THIS USES NEW ALGORITHM OF MANALOPOULOS AND ALEXAN
|
|
* NAMELY
|
|
* (N) (N) -1 (N) (N)
|
|
* Z = - Y [ Y + Z ] Y + Y
|
|
* N+1 2 1 N 2 4
|
|
* WHERE Y , Y , AND Y ARE THE (DIAGONAL) ELEMENTS OF THE "IMBEDDING
|
|
* 1 2 4
|
|
* PROPAGATOR DEFINED IN ALEXANDER AND MANOLOPOULOS
|
|
* DETERMINE THESE DIAGONAL MATRICES FOR PROPAGATION OF LOG-DERIV MATRIX
|
|
* EQS. (38)-(44) OF M. ALEXANDER AND D. MANOLOPOULOS, "A STABLE LINEAR
|
|
* REFERENCE POTENTIAL ALGORITHM FOR SOLUTION ..."
|
|
C
|
|
CALL SPROPN ( DRNOW, EIGOLD, HP, Y1, Y4, Y2, NCH)
|
|
C
|
|
* SET UP MATRIX TO BE INVERTED
|
|
* NSKIP IS SPACING BETWEEN DIAGONAL ELEMENTS OF MATRIX STORED COLUMN BY
|
|
C
|
|
NSKIP = NCH + 1
|
|
CALL DAXPY (NCH, ONE, Y1, 1, Z, NSKIP)
|
|
C
|
|
* INVERT (Y + Z )
|
|
* 1 N
|
|
C
|
|
CALL SYMINV (Z, NCH, NCH, IERR)
|
|
CALL DSYFIL ('U', NCH, Z, NCH)
|
|
IF (IERR .GT. NCH) THEN
|
|
WRITE (6, 80)
|
|
80 FORMAT (' *** INSTABILITY IN SYMINV IN AIRPRP.')
|
|
STOP
|
|
END IF
|
|
C
|
|
* -1
|
|
* EVALUATE - Y ( Y + Z ) Y
|
|
* 2 1 N 2
|
|
* IN THE NEXT LOOPS EVALUATE THE FULL, RATHER THAN LOWER TRIANGLE
|
|
C
|
|
NPT = 1
|
|
DO 85 I = 1, NCH
|
|
FACT = Y2(I)
|
|
CALL DSCAL (NCH, FACT, Z(NPT), 1)
|
|
NPT = NPT + NCH
|
|
85 CONTINUE
|
|
* -1
|
|
* Z NOW CONTAINS ( Y + Z ) Y , THIS IS G(N-1,N) IN THE LOCAL BASI
|
|
* 1 N 2
|
|
C
|
|
DO 110 I = 1, NCH
|
|
FACT = - Y2(I)
|
|
CALL DSCAL (NCH, FACT, Z(I), NCH)
|
|
110 CONTINUE
|
|
C
|
|
* ADD ON Y
|
|
* 4
|
|
CALL DAXPY (NCH, ONE, Y4, 1, Z, NSKIP)
|
|
C
|
|
IF (ITWO .GT. 0) GO TO 160
|
|
C
|
|
C
|
|
* OBLIGATORY WRITE OF STEP INFORMATION IF DEVIATIONS FROM LINEAR
|
|
* POTENTIAL ARE UNUSUALLY LARGE
|
|
* THIS IS ONLY DONE IF TOLAI .LT. 1, IN WHICH CASE THE LARGEST CORRECTI
|
|
* IS USED TO ESTIMATE THE NEXT STEP
|
|
C
|
|
IF (TOLAI .LT. 1.) THEN
|
|
CMAX = MAX (CDIAG, COFF)
|
|
IF (CMAX .GT. (5. * TOLAI)) THEN
|
|
WRITE (6,125)
|
|
125 FORMAT
|
|
: (' ** ESTIMATED CORRECTIONS LARGER THAN 5*TOLAI IN AIRPRP')
|
|
IF (KSTEP .EQ. 1) THEN
|
|
WRITE (6, 130)
|
|
130 FORMAT (' THE INITIAL VALUE OF DRNOW (SPAC*FSTFAC) IS',
|
|
: ' PROBABLY TOO LARGE')
|
|
ELSE
|
|
WRITE (6, 140)
|
|
140 FORMAT
|
|
: (' CHECK FOR DISCONTINUITIES OR UNPHYSICAL OSCILLATIONS',
|
|
: /,' IN YOUR POTENTIAL')
|
|
END IF
|
|
IF (IPRINT.LT.41) THEN
|
|
WRITE (6, 50)
|
|
WRITE (6,150) KSTEP, RNOW, DRNOW, CDIAG, COFF
|
|
END IF
|
|
END IF
|
|
END IF
|
|
C
|
|
C
|
|
* WRITE OUT INFORMATION ABOUT STEP JUST COMPLETED
|
|
C
|
|
IF (IPRINT.GT.40) THEN
|
|
WRITE (6,150) KSTEP, RNOW, DRNOW, CDIAG, COFF
|
|
150 FORMAT (I6, 4E10.3)
|
|
END IF
|
|
C
|
|
C
|
|
* GET SET FOR NEXT STEP
|
|
C
|
|
160 IF (IEND .EQ. 1) GO TO 250
|
|
IF (ITWO .GT. 0) GO TO 180
|
|
C
|
|
C
|
|
* IF TOLAI .LT. 1, PREDICT NEXT STEP SIZE FROM LARGEST CORRECTION
|
|
C
|
|
IF (TOLAI .LT. 1.) THEN
|
|
C
|
|
* NOTE THAT THE FOLLOWING STATEMENT IS SLIGHTLY DIFFERENT FROM EQ. (30
|
|
* OF M.H. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGORITHMS ... AND THA
|
|
* THE STEP-SIZE ALGORITHM IS ONLY APPROXIMATELY RELATED TO ANY REAL
|
|
* ESTIMATE OF THE ERROR COFF AND CDIAG SHOULD BE APPROXIMATELY TOLAI, S
|
|
* FROM EQ. (27):
|
|
* DRNOW(AT N+1) = (12 TOLAI/KBAR(N+1)W(N+1)-TILDA')**(1/3)
|
|
* WHICH IS APPROXIMATELY = (12 TOLAI/KBAR(N)W(N)-TILDA')**(1/3)
|
|
* = ((12 COFF/KBAR W-TILDA') (TOLAI/COFF))**(1/3
|
|
* = DRNOW(AT N) (TOLAI/COFF)**(1/3)
|
|
* OR FROM EQ. (29):
|
|
* DRNOW = DRNOW (TOLAI/CDIAG)**(1/3)
|
|
* THEN, USING THE LARGER ERROR AND ALLOWING POW TO VARY:
|
|
C
|
|
CSG>>
|
|
FACTOR=(TOLAI/CMAX) ** (1./POWR)
|
|
CSG LIMIT INCREMENT/DECREMENT FOR STABILITY ...
|
|
IF (FACTOR.GT.2.D0) FACTOR=2.D0
|
|
IF (FACTOR.LE.0.1D0) FACTOR=1.D-1
|
|
DRNOW = DRNOW * FACTOR
|
|
CSG<< DRNOW = DRNOW * (TOLAI/CMAX) ** (1. / POWR)
|
|
ELSE
|
|
C
|
|
* IF TOLAI .GE. 1, THEN
|
|
* MINIMUM STEP SIZE IS FIRST INTERVAL WIDTH
|
|
C
|
|
IF (KSTEP .EQ. 1) SPCMN = DRNOW
|
|
C
|
|
* AND NEXT STEP SIZE IS TOLAI * PRESENT STEP SIZE
|
|
C
|
|
DRNOW = TOLAI * DRNOW
|
|
END IF
|
|
C
|
|
* DRNOW IS STEP SIZE IN NEXT INTERVAL
|
|
C
|
|
RLAST = RNEXT
|
|
RNEXT = RNEXT + DRNOW
|
|
IF (RNEXT .LT. REND) GO TO 170
|
|
IEND = 1
|
|
RNEXT = REND
|
|
DRNOW = RNEXT - RLAST
|
|
170 RNEW = RLAST + 0.5D0 * DRNOW
|
|
IF (KSTEP .GT. 1 .AND. IEND .NE. 1) THEN
|
|
IF (TOLAI .LT. 1) THEN
|
|
IF (DRNOW .LT. SPCMN) SPCMN = DRNOW
|
|
END IF
|
|
IF (DRNOW .GT. SPCMX) SPCMX = DRNOW
|
|
END IF
|
|
DRMID = RNEW - RNOW
|
|
C
|
|
C
|
|
* RESTORE EIGENVALUES
|
|
C
|
|
CALL DCOPY (NCH, EIGNOW, 1, EIGOLD, 1)
|
|
C
|
|
* DEFINE LOCAL BASIS AT RNEW AND CARRY OUT TRANSFORMATIONS
|
|
* TMAT IS USED AS SCRATCH MATRIX AND Y1 IS USED AS SCRATCH VECTOR HERE
|
|
C
|
|
CALL POTENT (W, VECNEW, TMAT, EIGNOW, HP, Y1,
|
|
+ RNEW, DRNOW, EN, XLARGE, NCH,
|
|
$ P, MXLAM, VL, IV, RMLMDA, ERED, EINT, CENT, NPOTL)
|
|
C
|
|
C
|
|
* DETERMINE MATRIX TO TRANSFORM LOG-DERIV MATRIX INTO NEW INTERVAL
|
|
* SEE EQ. (22) OF M.H. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGORITHMS
|
|
C
|
|
CALL DGEMUL(VECNEW, NCH, 'N', VECNOW, NCH, 'T', TMAT, NCH,
|
|
1 NCH, NCH, NCH)
|
|
CALL DCOPY (NCH*NCH, VECNEW, 1, VECNOW, 1)
|
|
C
|
|
C
|
|
* RESTORE RADIUS VALUES
|
|
C
|
|
RNOW = RNEW
|
|
C
|
|
C
|
|
* DETERMINE APPROXIMATE VALUES FOR DIAGONAL AND OFF-DIAGONAL
|
|
* CORRECTION TERMS
|
|
C
|
|
CALL CORR (EIGNOW, EIGOLD, HP, DRNOW, DRMID, XLARGE, CDIAG,
|
|
: COFF, NCH)
|
|
IF (ITWO .LT. 0) GO TO 200
|
|
IF (IEND .EQ. 1) RNOW = - RNOW
|
|
C
|
|
C
|
|
* WRITE OR READ RELEVANT INFORMATION
|
|
C
|
|
180 CALL OUTMAT (TMAT, EIGOLD, HP, ESHIFT, DRNOW, RNOW,
|
|
: NCH, NCH, ITWO, ISCRU)
|
|
IF (ITWO .EQ. 0) GO TO 200
|
|
C
|
|
C
|
|
* NEGATIVE RNOW IS CUE FOR LAST STEP IN SECOND ENERGY CALCULATION
|
|
C
|
|
IF (RNOW .GT. 0.D0) GO TO 200
|
|
RNOW = - RNOW
|
|
IEND = 1
|
|
C
|
|
C
|
|
* GO BACK TO START NEW STEP
|
|
C
|
|
200 CONTINUE
|
|
C
|
|
C
|
|
* THE FOLLOWING STATEMENT IS REACHED ONLY IF THE INTEGRATION HAS
|
|
* NOT REACHED THE ASYMPTOTIC REGION IN MAXSTP STEPS
|
|
C
|
|
WRITE (6,210) MAXSTP, RNEXT
|
|
C
|
|
IF(IPRINT.GT.40) WRITE(6,210) MAXSTP,RNEXT
|
|
C
|
|
210 FORMAT (' *** AIRY PROPAGATION NOT FINISHED IN', I4,
|
|
: ' STEPS: R-FIN SET TO', F8.4,' ***',/)
|
|
XF = RNEXT
|
|
250 CONTINUE
|
|
IF (ITWO .LT. 0) GO TO 260
|
|
CALL OUTMAT (VECNOW, EIGOLD, HP, ESHIFT, DRNOW, XF, NCH,
|
|
: NCH, ITWO, ISCRU)
|
|
C
|
|
C
|
|
* TRANSFORM LOG-DERIV MATRIX INTO FREE BASIS. TRANSFORMATION MATRIX IS
|
|
* JUST VECNOW-TRANSPOSE; SEE EQ.(24) OF M.H. ALEXANDER, "HYBRID QUANTUM
|
|
* SCATTERING ALGORITHMS ..."
|
|
260 CALL TRNSFM (VECNOW, Z, W, NCH, .FALSE., ISYM )
|
|
C
|
|
IF (IPRINT.LT.41) GO TO 318
|
|
IF (ITWO .LT. 0) WRITE (6,280)
|
|
IF (ITWO .EQ. 0) WRITE (6,290)
|
|
IF (ITWO .GT. 0) WRITE (6,300)
|
|
280 FORMAT (' ** AIRY PROPAGATION - FIRST ENERGY;',
|
|
: ' TRANSFORMATION MATRICES NOT WRITTEN')
|
|
290 FORMAT (' ** AIRY PROPAGATION - FIRST ENERGY;',
|
|
: ' TRANSFORMATION MATRICES WRITTEN')
|
|
300 FORMAT (' ** AIRY PROPAGATION - SECOND ENERGY;',
|
|
: ' TRANSFORMATION MATRICES READ')
|
|
WRITE (6,305) RMIN, REND, TOLAI, NSTEP
|
|
WRITE (6,310) SPCMN, SPCMX, POWR
|
|
305 FORMAT (' RBEGIN =', F7.3, ' REND =', F7.3,
|
|
: ' TOLAI =', 1PE8.1, ' NINTERVAL =', I3)
|
|
310 FORMAT (' DR-MIN =', F7.3, ' DR-MAX =', F8.3,
|
|
: ' POWER =', F4.1)
|
|
C
|
|
318 CONTINUE
|
|
IF(IPRINT.LT.35) GO TO 319
|
|
IF (ITWO .LT. 0) WRITE (6,280)
|
|
IF (ITWO .EQ. 0) WRITE (6,290)
|
|
IF (ITWO .GT. 0) WRITE (6,300)
|
|
319 CONTINUE
|
|
C
|
|
IF(IPRINT.LT.3) GO TO 320
|
|
WRITE (6, 315) RMIN, REND, SPCMN, SPCMX, NSTEP
|
|
315 FORMAT (' ** AIRY: RSTART =' ,F7.3,' REND =',F7.3,
|
|
: ' DRMIN =',F7.3, ' DRMAX =',F7.3,' NSTEP =', I4)
|
|
320 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE AIRYMP (X, FTHETA, FPHI, XMMOD, XNMOD)
|
|
* SUBROUTINE TO RETURN THE MODULI AND PHASES OF THE AIRY FUNCTIONS AND
|
|
* DERIVATIVES
|
|
* AUTHOR: MILLARD ALEXANDER
|
|
* CURRENT REVISION DATE: 23-SEPT-87
|
|
* ----------------------------------------------------------------------
|
|
* VARIABLES IN CALL LIST:
|
|
* X ARGUMENT OF AIRY FUNCTIONS
|
|
* FTHETA, XMMOD ON RETURN: CONTAIN THE (DOUBLE PRECISION)
|
|
* PHASE AND MODULUS OF AI(X) AND BI(X) (
|
|
* BELOW).
|
|
* FPHI, XNMOD ON RETURN: CONTAIN THE (DOUBLE PRECISION)
|
|
* PHASE AND MODULUS OF AI'(X) AND BI'(X)
|
|
* BELOW).
|
|
* ----------------------------------------------------------------------
|
|
* FOR NEGATIVE X
|
|
* ----------------------------------------------------------------------
|
|
* THE MODULI AND PHASES ARE DEFINED BY
|
|
* AI(-X) = M(X) COS[THETA(X)]
|
|
* BI(-X) = M(X) SIN[THETA(X)]
|
|
* AI'(-X) = N(X) COS[PHI(X)]
|
|
* BI'(-X) = N(X) SIN[PHI(X)]
|
|
* IN OTHER WORDS
|
|
* 2 2 2
|
|
* M(X) = SQRT[ AI(X) + BI(X) ]
|
|
* 2 2 2
|
|
* N(X) = SQRT[ AI'(X) + BI'(X) ]
|
|
* THETA(X) = ATAN [ BI(X) / AI(X) ]
|
|
* PHI(X) = ATAN [ BI'(X) / AI'(X) ]
|
|
* TO DETERMINE THESE MODULI AND PHASES WE USE THE SUBROUTINE
|
|
* SCAIRY, WRITTEN BY D. MANOLOPOULOS (SEPT. 1986)
|
|
* THIS SUBROUTINE RETURNS THE FOLLOWING QUANTITIES:
|
|
* SCAI, SCBI, SCAIP, SCPIB, AND ZETA, WHERE
|
|
C FOR X .LT. -5.0
|
|
C AI(X) = SCAI * COS(ZETA) + SCBI * SIN(ZETA)
|
|
C BI(X) = SCBI * COS(ZETA) - SCAI * SIN(ZETA)
|
|
C AI'(X) = SCAIP * COS(ZETA) + SCBIP * SIN(ZETA)
|
|
C BI'(X) = SCBIP * COS(ZETA) - SCAIP * SIN(ZETA)
|
|
C WHERE ZETA = (2/3) * (-X) ** (3/2) + PI/4
|
|
C
|
|
C FOR -5.0 .LE. X .LE. 0.0
|
|
C
|
|
C AI(X) = SCAI
|
|
C BI(X) = SCBI
|
|
C AI'(X) = SCAIP
|
|
C BI'(X) = SCBIP
|
|
C AND ZETA = 0
|
|
* ----------------------------------------------------------------------
|
|
* FOR POSITIVE X
|
|
* ----------------------------------------------------------------------
|
|
* THE MODULI AND PHASES ARE DEFINED BY
|
|
* AI(X) = M(X) SINH[THETA(X)]
|
|
* BI(X) = M(X) COSH[THETA(X)]
|
|
* AI'(X) = N(X) SINH[PHI(X)]
|
|
* BI'(X) = N(X) COSH[PHI(X)]
|
|
* IN OTHER WORDS
|
|
* 2 2 2
|
|
* M(X) = SQRT[ BI(X) - AI(X) ]
|
|
* 2 2 2
|
|
* N(X) = SQRT[ BI'(X) - AI'(X) ]
|
|
* THETA(X) = ATANH [ AI(X) / BI(X) ]
|
|
* PHI(X) = ATANH [ AI'(X) / BI'(X) ]
|
|
* HERE THE THE EXPONENTIALLY SCALED AIRY FUNCTIONS
|
|
* AI(X), AI'(X), BI(X), BI'(X) ARE:
|
|
* AI(X) = AI(X) * EXP[ZETA]
|
|
* AI'(X) = AI'(X) * EXP[ZETA]
|
|
* BI(X) = BI(X) * EXP[-ZETA]
|
|
* BI'(X) = BI'(X) * EXP[-ZETA]
|
|
* TO DETERMINE THESE MODULI AND PHASES WE USE THE SUBROUTINE
|
|
* SCAIRY, WRITTEN BY D. MANOLOPOULOS (SEPT. 1986)
|
|
* THIS SUBROUTINE RETURNS THE FOLLOWING QUANTITIES:
|
|
* SCAI, SCBI, SCAIP, SCPIB, AND ZETA
|
|
* IN TERMS OF WHICH THE EXPONENTIALLY SCALED AIRY FUNCTIONS ARE DEFINED
|
|
* AI(X) = SCAI * EXP(-ZETA)
|
|
* BI(X) = SCBI * EXP(+ZETA)
|
|
* AI'(X) = SCAIP * EXP(-ZETA)
|
|
* BI'(X) = SCBIP * EXP(+ZETA)
|
|
* WHERE ZETA = (2/3) * X ** (3/2)
|
|
*
|
|
* ----------------------------------------------------------------------
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DOUBLE PRECISION X, FTHETA, FPHI, XMMOD, XNMOD, SCAI,
|
|
: SCBI, SCAIP, SCBIP, ZETA, RATIO
|
|
CALL SCAIRY (X, SCAI, SCBI, SCAIP, SCBIP, ZETA)
|
|
IF ( X .LE. 0.D0) THEN
|
|
XMMOD = SQRT( SCAI ** 2 + SCBI ** 2)
|
|
XNMOD = SQRT( SCAIP ** 2 + SCBIP ** 2)
|
|
FTHETA = ATAN2 (SCBI, SCAI)
|
|
FPHI = ATAN2 (SCBIP, SCAIP)
|
|
IF (X .LT. (-5.0D0) ) THEN
|
|
FTHETA = FTHETA - ZETA
|
|
FPHI = FPHI - ZETA
|
|
END IF
|
|
ELSE
|
|
XMMOD = SQRT( - SCAI ** 2 + SCBI ** 2)
|
|
XNMOD = SQRT( - SCAIP ** 2 + SCBIP ** 2)
|
|
RATIO = SCAI / SCBI
|
|
FTHETA = 0.5 * LOG ( (1.D0 + RATIO) / (1.D0 - RATIO) )
|
|
RATIO = SCAIP / SCBIP
|
|
FPHI = 0.5 * LOG ( (1.D0 + RATIO) / (1.D0 - RATIO) )
|
|
END IF
|
|
RETURN
|
|
END
|
|
SUBROUTINE ASROT(J,EVEC,H,EVAL,WKS,NH)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
LOGICAL TD,EVLIST
|
|
DIMENSION EVEC(NH,NH),H(NH,NH),EVAL(NH),WKS(NH)
|
|
DIMENSION WT(2),ELEVEL(1000),JLEVEL(4000),ISYM(10),ISYM2(10),
|
|
1 ROTI(2)
|
|
COMMON /CMBASE/ A(2),B(2),C(2),DJ,DJK,DK,DT,ROTI,
|
|
1 ELEVEL,EMAX,WT,SPNUC,NLEVEL,JLEVEL,JMIN,JMAX,JSTEP,ISYM,J2MIN,
|
|
1 J2MAX,J2STEP,ISYM2,JHALF,IDENT,MXJL,MXEL
|
|
DATA EVLIST/.FALSE./
|
|
C
|
|
C DO THE ACTUAL CALCULATION FOR A GIVEN J
|
|
C
|
|
ALPHA=0.5D0*(A(1)+B(1))
|
|
BETA=C(1)-ALPHA
|
|
GAMMA=0.25D0*(A(1)-B(1))
|
|
TD = A(1).EQ.B(1) .AND. B(1).EQ.C(1)
|
|
C
|
|
JJ=J*(J+1)
|
|
NK=J+J+1
|
|
DO 100 IR=1,NK
|
|
KR=IR-J-1
|
|
DO 100 IC=1,IR
|
|
KC=IC-J-1
|
|
TERM=0.D0
|
|
IF(KR.EQ.KC) THEN
|
|
TERM=ALPHA*DBLE(JJ)+BETA*DBLE(KC*KC)
|
|
1 -DJ*DBLE(JJ*JJ)-DJK*DBLE(JJ*KC*KC)-DK*KC**4
|
|
IF(TD) TERM=TERM+0.5D0*DT*DBLE(-3*JJ*(JJ-2)+30*(JJ-2)*KC*KC
|
|
1 -35*KC*KC*(KC*KC-1))
|
|
ELSEIF(KR-KC.EQ.2) THEN
|
|
KMID=(KR+KC)/2
|
|
TERM=GAMMA*SQRT(DBLE((JJ-KR*KMID)*(JJ-KC*KMID)))
|
|
ELSEIF(KR-KC.EQ.4 .AND. TD) THEN
|
|
TERM=1.25D0*DT*SQRT(DBLE((JJ-KC*(KC+1))*(JJ-(KC+1)*(KC+2)))
|
|
1 *DBLE((JJ-(KC+2)*(KC+3))*(JJ-(KC+3)*(KC+4))))
|
|
ENDIF
|
|
H(IR,IC)=TERM
|
|
100 CONTINUE
|
|
IFAIL=0
|
|
CALL F02ABF(H,NH,NK,EVAL,EVEC,NH,WKS,IFAIL)
|
|
C
|
|
WRITE(6,603) J,(EVAL(IC),IC=1,NK)
|
|
603 FORMAT('0 CALCULATED ROTATIONAL LEVELS FOR J =',I3,' ARE'/
|
|
1 (8X,9F12.5))
|
|
C
|
|
C IF THE RAW EIGENVECTORS ARE DEGENERATE, THEY MAY NOT HAVE
|
|
C PROPER SYMMETRY. SEEK DEGENERATE SETS AND FORCE SYMMETRY ON THEM.
|
|
C ALSO PRINT SPHERICAL TOP SYMMETRY LABELS IF ANY DEGENERATE SETS
|
|
C ARE PRESENT.
|
|
C
|
|
CALL DMSYM(J,NK,EVAL,EVEC,H,WKS)
|
|
C
|
|
IF(EVLIST) THEN
|
|
WRITE(6,604)
|
|
604 FORMAT('0 EIGENVECTOR COEFFICIENTS:')
|
|
DO 200 IR=1,NK
|
|
KR=IR-J-1
|
|
WRITE(6,605) J,KR,(EVEC(IR,IC),IC=1,NK)
|
|
605 FORMAT(2I4,9F12.8/(8X,9F12.8))
|
|
200 CONTINUE
|
|
ENDIF
|
|
RETURN
|
|
END
|
|
SUBROUTINE AXSCAT(N, NSQ, MXLAM, NPOTL,
|
|
1 SR, SI, U, VL, IV, EINT, CENT, WVEC, L, NB,
|
|
2 P, Y1, Y2, Y3, Y4, VECNOW, VECNEW, EIGOLD, EIGNOW, HP,
|
|
3 ICODE, IPRINT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C ---------------------------------------------------------------
|
|
C THIS IS TIM PHILLIP'S INTERFACE OF ALEXANDER HIBRIDON
|
|
C CODES TO MOLSCAT: SCATTERING CALC USING DAPROP AND THEN
|
|
C AIRPRP. ON EXIT SR AND SI CONTAIN THE S-MATRIX.
|
|
C SR IS USED INTERNALLY TO HOLD THE LOG DERIVATIVE MATRIX
|
|
C ICODE.EQ.2 FOR SUBSEQUENT ENERGIES.
|
|
C ---------------------------------------------------------------
|
|
C REORGANIZED BY SG (2/2/93): CORRECTS NSTEPS=0 PROBLEM, BUT
|
|
C ALSO CALCULATES SOMEWHAT DIFFERENT STEP SIZES FROM EARLIER CODE.
|
|
C ---------------------------------------------------------------
|
|
C
|
|
C DIMENSION STATEMENTS FOR ARGUMENT LIST
|
|
C
|
|
DIMENSION U(NSQ),Y1(N),Y2(N),Y3(N),Y4(N)
|
|
DIMENSION P(MXLAM),VL(2),IV(2),SR(NSQ),SI(NSQ),
|
|
& EINT(N),CENT(N),WVEC(N),L(N),NB(N)
|
|
DIMENSION VECNOW(NSQ),VECNEW(NSQ),EIGOLD(N),EIGNOW(N),HP(N)
|
|
C
|
|
LOGICAL IREAD,IWRITE, LLD,LAIRY
|
|
C
|
|
C COMMON BLOCKS TO COMMUNICATE WITH PROPAGATORS
|
|
C THE FOLLOWING VARIABLES FROM COMMON/DRIVE/ ARE USED WITH THIS
|
|
C PROPAGATOR: STEPS,RMIN,RMAX,ERED,RMLMDA,NOPEN,ISCRU,TOLHI,RMID,
|
|
C AND SOMETIMES DR
|
|
C
|
|
COMMON/DRIVE/STEST,STEPS,STABIL,CONV,RMIN,RMAX,XEPS,DR,
|
|
1 DRMAX,RMID,TOLHI,RTURN,VTOL,ESHIFT,ERED,RMLMDA,
|
|
2 NOPEN,JKEEP,ISCRU,MAXSTP
|
|
C
|
|
COMMON/HIBRIN/POWRX,DRAIRY,IABSDR
|
|
C
|
|
C SET UP TO USE UNIT (ISCRU)
|
|
IREAD = ICODE.EQ.2 .AND. ISCRU.GT.0
|
|
IWRITE = ICODE.EQ.1 .AND. ISCRU.GT.0
|
|
C ---------------------------------------------------------------
|
|
IF((.NOT.IREAD) .AND. IWRITE) THEN
|
|
ITWO = 0
|
|
ELSE IF(IREAD .AND. (.NOT.IWRITE)) THEN
|
|
ITWO = 1
|
|
ELSE IF((.NOT.IREAD) .AND. (.NOT.IWRITE)) THEN
|
|
ITWO = -1
|
|
ELSE
|
|
WRITE(6,*) ' ILLEGAL IREAD/IWRITE COMBINATION '
|
|
WRITE(6,*) ' BOTH SIMULTANEOUSLY TRUE '
|
|
STOP
|
|
END IF
|
|
C--------------------------------------------------------------------
|
|
C
|
|
C DECIDE WHICH CALCULATIONS TO DO.
|
|
C ON THE ASSUMPTION THAT RMIN.LT.RMAX THERE ARE THREE CASES
|
|
C 1) RMID.LE.RMIN.LT.RMAX
|
|
C 2) RMIN.LT.RMID.LT.RMAX
|
|
C 3) RMIN.LT.RMAX.LE.RMID
|
|
C CODE BELOW SETS FOLLOWING LLD LAIRY RSWTCH
|
|
C CASE 1 F T RMIN
|
|
C CASE 2 T T RMID
|
|
C CASE 3 T F RMAX
|
|
C INTEGRATION RANGES ARE THEN DAPROP: RMIN -> RSWTCH
|
|
C AIRY: RSWTCH -> RMAX
|
|
C--------------------------------------------------------------------
|
|
RBEGIN=RMIN
|
|
REND=RMAX
|
|
LLD=RBEGIN.LT.RMID
|
|
LAIRY=RMID.LT.REND
|
|
RSWTCH=MIN(REND,RMID)
|
|
RSWTCH=MAX(RSWTCH,RBEGIN)
|
|
C
|
|
C CALCULATE WAVEVECTORS AND STEP SIZE
|
|
WMAX=0.D0
|
|
NOPEN=0
|
|
DO 20 I=1,N
|
|
DIF=ERED-EINT(I)
|
|
WVEC(I)=SIGN(SQRT(ABS(DIF)),DIF)
|
|
WMAX=MAX(WMAX,WVEC(I))
|
|
NB(I)=I
|
|
IF (DIF.GT.0.D0) NOPEN=NOPEN+1
|
|
20 CONTINUE
|
|
IF (NOPEN.EQ.0) RETURN
|
|
C
|
|
IF (IREAD) GO TO 40
|
|
PI=ACOS(-1.D0)
|
|
DRLD=PI/(WMAX*STEPS)
|
|
IF (IABSDR .EQ. 1 .AND. DR .GT. 0.D0) DRLD=DR
|
|
NSTEPS=(RSWTCH-RBEGIN)/DRLD
|
|
IF (IWRITE) WRITE (ISCRU) RBEGIN,RSWTCH,REND,DRLD,NSTEPS
|
|
GO TO 60
|
|
40 READ (ISCRU) RBEGIN,RSWTCH,REND,DRLD,NSTEPS
|
|
60 CONTINUE
|
|
C
|
|
C SET REND FOR YTOK, AND RESET RSWTCH IN CASE WE DON'T CALL AIRPRP
|
|
RYON=REND
|
|
REND=RSWTCH
|
|
RSWTCH=RBEGIN
|
|
C
|
|
LLD=LLD .AND. NSTEPS.GT.0
|
|
IF (LLD) THEN
|
|
RSWTCH=REND
|
|
C PROPAGATE LOG DERIVATIVE THROUGH FIRST SEGMENT.
|
|
C ISTART=0 REQUESTS INITIALIZATION OF LOG-DERIVATIVE MATRIX
|
|
ISTART=0
|
|
CALL DAPROP(U, SR, N,
|
|
1 RBEGIN, REND, NSTEPS, IREAD, IWRITE, ISCRU,
|
|
2 Y1, Y2, Y3, Y4,
|
|
3 P, VL, IV, ERED, EINT, CENT, RMLMDA,
|
|
4 MXLAM, NPOTL, ISTART, NODES)
|
|
C -------------------------------------------------------------
|
|
IF (IPRINT.GE.3) WRITE (6,1000) RBEGIN,RSWTCH,NSTEPS
|
|
1000 FORMAT(' AXSCAT. LOG DERIVATIVE MATRIX INTEGRATED FROM ',
|
|
& F12.4,' TO ',F12.4,' IN ',I6,' STEPS.')
|
|
ELSE
|
|
C INITIALIZE LOG-DERIVATIVE MATRIX IF DAPROP NO CALLED
|
|
DO 42 I=1,NSQ
|
|
42 SR(I)=0.D0
|
|
DO 43 I=1,NSQ,N+1
|
|
43 SR(I)=1.D30
|
|
IF (IPRINT.GE.3) WRITE (6,1010)
|
|
1010 FORMAT(' AXSCAT. DAPROP NOT CALLED: LOG DERIVATIVE MATRIX ',
|
|
& 'INITIALIZED.')
|
|
ENDIF
|
|
C
|
|
C USE AIRY PROPAGATOR FOR THE REMAINDER OF THE SCATTERING REGION
|
|
C
|
|
IF (.NOT.LAIRY) GO TO 41
|
|
REND=RYON
|
|
DRA=DRLD
|
|
IF (DRAIRY .GT. 0.D0) DRA = DRAIRY
|
|
CALL AIRPRP(SR,U,SI,VECNOW,VECNEW,EIGOLD,EIGNOW,HP,
|
|
1 Y1,Y2,Y3,Y4,RSWTCH,
|
|
2 REND,DRA,ERED,TOLHI,POWRX,ESHIFT,N,
|
|
3 ITWO,IREAD,IWRITE,IPRINT,ISCRU,P,MXLAM,VL,IV,RMLMDA,
|
|
4 EINT,CENT,NPOTL)
|
|
C
|
|
C SORT CHANNELS BY ASYMPTOTIC ENERGY
|
|
C
|
|
41 CONTINUE
|
|
IF (N.EQ.1) GO TO 100
|
|
NM1=N-1
|
|
DO 80 I=1,NM1
|
|
IP1=I+1
|
|
DO 80 J=IP1,N
|
|
IF (EINT(NB(I)).LE.EINT(NB(J))) GO TO 80
|
|
IT=NB(I)
|
|
NB(I)=NB(J)
|
|
NB(J)=IT
|
|
80 CONTINUE
|
|
C
|
|
C CALCULATE K AND S MATRICES
|
|
C
|
|
100 CALL YTOK(NB,WVEC,L,N,NOPEN,Y1,Y2,Y3,Y4,SR,SI,U,REND)
|
|
CALL KTOS(U,SR,SI,NOPEN)
|
|
RETURN
|
|
END
|
|
SUBROUTINE BAS9IN(PRTP,IBOUND)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE
|
|
CHARACTER*8 PRTP(4),QNAME(10)
|
|
LOGICAL LEVIN,EIN,LCNT
|
|
DIMENSION ROTI(12),ELEVEL(1000),JLEVEL(4000),
|
|
1 ISYM(10),ISYM2(10),WT(2)
|
|
DIMENSION JLEV(1),VL(1),IV(1),CENT(1),J(1),L(1),LAM(1)
|
|
COMMON/CMBASE/ROTI,ELEVEL,EMAX,WT,SPNUC,NLEVEL,JLEVEL,
|
|
1 JMIN,JMAX,JSTEP,ISYM,J2MIN,J2MAX,J2STEP,ISYM2,JHALF,IDENT
|
|
2 ,MXJL,MXEL
|
|
C
|
|
C BAS9IN IS CALLED ONCE FOR EACH SCATTERING SYSTEM (USUALLY ONCE
|
|
C PER RUN) AND CAN READ IN ANY BASIS SET INFORMATION NOT CONTAINED
|
|
C IN NAMELIST BLOCK &BASIS. IT MUST ALSO HANDLE THE FOLLOWING
|
|
C VARIABLES AND ARRAYS:
|
|
C
|
|
C PRTP SHOULD BE RETURNED AS A CHARACTER STRING DESCRIBING THE
|
|
C COLLISION TYPE
|
|
C IDENT CAN BE SET>0 IF A COLLISION OF IDENTICAL PARTICLES IS
|
|
C BEING CONSIDERED AND SYMMETRISATION IS REQUIRED.
|
|
C HOWEVER, THIS WOULD REQUIRE EXTRA CODING IN IDPART.
|
|
C IBOUND CAN BE SET>0 IF THE CENTRIFUGAL POTENTIAL IS NOT OF THE
|
|
C FORM L(L+1)/R**2; IF IBOUND>0, THE CENT ARRAY MUST BE
|
|
C RETURNED FROM ENTRY CPL9
|
|
C
|
|
IBOUND=1
|
|
PRTP(1)=' BODY-F'
|
|
PRTP(2)='IXED ATO'
|
|
PRTP(3)='M-DIATOM'
|
|
PRTP(4)=' '
|
|
RETURN
|
|
C
|
|
ENTRY SET9(LEVIN,EIN,NLEV,JLEV,NQN,QNAME,MXPAR,NLABV)
|
|
C
|
|
C SET9 IS CALLED ONCE FOR EACH SCATTERING SYSTEM. IT SETS UP:
|
|
C MXPAR, THE NUMBER OF DIFFERENT SYMMETRY TYPES ("PARITY CASES")
|
|
C NLEVEL AND JLEVEL, UNLESS LEVIN IS .TRUE.;
|
|
C JLEV AND NLEV;
|
|
C ELEVEL, UNLESS EIN IS .TRUE.
|
|
C IF THE LOGICAL VARIABLES ARE .TRUE. ON ENTRY, THE CORRESPONDING
|
|
C QUANTITIES WERE INPUT EXPLICITLY IN NAMELIST BLOCK &BASIS.
|
|
C IF EIN IS .FALSE., THE MOLECULAR CONSTANTS MUST HAVE BEEN SUPPLIED
|
|
C IN THE &BASIS ARRAY ROTI: THE PROGRAMMER MAY USE THESE IN ANY WAY
|
|
C HE LIKES, BUT SHOULD OUTPUT THEM HERE FOR CHECKING.
|
|
C NOTE THAT JLEVEL CONTAINS JUST THE QUANTUM NUMBERS NECESSARY TO
|
|
C SPECIFY THE THRESHOLD ENERGY (AND ELEVEL CONTAINS THE CORRESPONDING
|
|
C ENERGIES WHEREAS JLEV CONTAINS ALL THE CHANNEL QUANTUM NUMBERS EXCEPT
|
|
C THE ORBITAL L, WHICH MAY BE A SUPERSET. THE LAST COLUMN OF THE JLEV
|
|
C ARRAY CONTAINS A POINTER TO THE ENERGY IN THE ELEVEL ARRAY.
|
|
C
|
|
MXPAR=2
|
|
NLABV=1
|
|
IF(LEVIN) GOTO 220
|
|
NLEVEL=0
|
|
NLEV=0
|
|
DO 210 I=JMIN,JMAX,JSTEP
|
|
NLEVEL=NLEVEL+1
|
|
JLEVEL(NLEVEL)=I
|
|
C NL IS NUMBER OF SETS OF INTERNAL QUANTUM NUMBERS FOR THIS LEVEL
|
|
NL=1+MIN(J2MAX,I)
|
|
NLEV=NLEV+NL
|
|
210 CONTINUE
|
|
GOTO 230
|
|
220 WRITE(6,602)
|
|
602 FORMAT('0 BASIS FUNCTIONS TAKEN FROM &BASIS (JLEVEL) INPUT')
|
|
C
|
|
C IF NLEV AND NLEVEL ARE DIFFERENT, IT MAY BE NECESSARY TO BUILD UP JLEV
|
|
C IN A DIFFERENT ORDER AND REARRANGE IT LATER - SEE SET3 CODING IN SETBAS
|
|
230 NQN=3
|
|
QNAME(1)=' J '
|
|
QNAME(2)=' |K| '
|
|
C LOOP OVER LEVELS AGAIN, THIS TIME SETTING UP JLEV
|
|
II=0
|
|
IJ=0
|
|
DO 250 I=JMIN,JMAX,JSTEP
|
|
II=II+1
|
|
DO 250 K=0,MIN(J2MAX,I)
|
|
IJ=IJ+1
|
|
JLEV(IJ)=I
|
|
JLEV(NLEV+IJ)=K
|
|
JLEV(NLEV*(NQN-1)+IJ)=II
|
|
250 CONTINUE
|
|
C
|
|
IF(EIN) GOTO 280
|
|
WRITE(6,604) ROTI(1)
|
|
604 FORMAT('0 ENERGY LEVELS CALCULATED FROM B =',F10.5)
|
|
C
|
|
DO 270 I=1,NLEVEL
|
|
JI=JLEVEL(I)
|
|
ELEVEL(I)=ROTI(1)*DBLE(JI*(JI+1))
|
|
270 CONTINUE
|
|
RETURN
|
|
C
|
|
280 WRITE(6,605)
|
|
605 FORMAT('0 ENERGY LEVELS TAKEN FROM &BASIS (ELEVEL) INPUT')
|
|
RETURN
|
|
C
|
|
ENTRY BASE9(LCNT,N,JTOT,ICODE,JLEV,NLEV,NQN,J,L)
|
|
C
|
|
C BASE9 IS CALLED EITHER TO COUNT THE ACTUAL NUMBER OF CHANNEL BASIS
|
|
C FUNCTIONS OR ACTUALLY TO SET THEM UP (IN THE J AND L ARRAYS).
|
|
C IT IS CALLED FOR EACH TOTAL J (JTOT) AND PARITY CASE (ICODE).
|
|
C IF LCNT IS .TRUE. ON ENTRY, JUST COUNT THE BASIS FUNCTIONS. OTHERWISE, SET
|
|
C UP J (POINTER TO JLEV) AND L (ORBITAL ANGULAR MOMENTUM) FOR EACH CHANNEL.
|
|
C THIS MUST TAKE INTO ACCOUNT JTOT AND ICODE.
|
|
C ONE IMPORTANT OVERALL EFFECT IS THAT THE THRESHOLD ENERGY IS IN
|
|
C ELEVEL(JLEV(NLEV*(NQN-1)+J(I)). CHECK THIS!
|
|
C
|
|
N=0
|
|
DO 320 I=1,NLEV
|
|
K=JLEV(NLEV+I)
|
|
IF(K.GT.JTOT) GOTO 320
|
|
IF(K.EQ.0 .AND. ICODE.EQ.1) GOTO 320
|
|
N=N+1
|
|
IF(LCNT) GOTO 310
|
|
J(N)=I
|
|
L(N)=JTOT
|
|
310 CONTINUE
|
|
320 CONTINUE
|
|
RETURN
|
|
C
|
|
ENTRY CPL9(N,ICODE,NPOTL,LAM,MXLAM,NLEV,JLEV,J,L,JTOT,
|
|
1 VL,IV,CENT,IBOUND,IEXCH,IPRINT)
|
|
C
|
|
C CPL9 IS CALLED AFTER BASE9 FOR EACH JTOT AND ICODE, TO SET UP THE
|
|
C POTENTIAL COUPLING COEFFICIENTS VL.
|
|
C IF IBOUND>0, IT ALSO SETS UP THE CENTRIFUGAL COEFFICIENTS CENT.
|
|
C INDICES SPECIFYING THE MXLAM DIFFERENT POTENTIAL SYMMETRIES ARE IN
|
|
C THE FIRST XX*MXLAM ELEMENTS OF LAM; THE STRUCTURE OF THE LAM ARRAY
|
|
C (AND THE VALUE OF XX) IS CHOSEN BY THE PROGRAMMER, AND MUST
|
|
C CORRESPOND WITH THAT USED IN SUBROUTINE POTENL.
|
|
C NPOTL IS THE NUMBER OF DIFFERENT POTENTIAL TERMS WHICH CONTRIBUTE TO
|
|
C EACH MATRIX ELEMENT (SEE SUBROUTINE WAVVEC). IT SOMETIMES SAVES
|
|
C A SIGNIFICANT AMOUNT OF SPACE IF IT CAN BE LESS THAN MXLAM.
|
|
C
|
|
ROOT2=SQRT(2.D0)
|
|
NPOTL=MXLAM
|
|
DO 550 LL=1,MXLAM
|
|
LM=LAM(LL)
|
|
NNZ=0
|
|
I=LL
|
|
DO 540 ICOL=1,N
|
|
JC=JLEV(J(ICOL))
|
|
KC=JLEV(J(ICOL)+NLEV)
|
|
DO 540 IROW=1,ICOL
|
|
JR=JLEV(J(IROW))
|
|
KR=JLEV(J(IROW)+NLEV)
|
|
VL(I)=0.D0
|
|
IV(I)=LL
|
|
IF(KR.NE.KC) GOTO 510
|
|
ISUM=LM+JR+JC
|
|
IF(ISUM-2*(ISUM/2).NE.0 .OR. LM.GT.JC+JR) GOTO 540
|
|
VL(I)=PARITY3(KC)*SQRT(DBLE(JC*(JC+1)*JR*(JR+1)))*THREEJ(JC,LM,JR)
|
|
1 *THRJ(DBLE(JC),DBLE(LM),DBLE(JR),DBLE(KC),0.D0,DBLE(-KC))
|
|
IF(VL(I).NE.0.D0) NNZ=NNZ+1
|
|
GOTO 540
|
|
510 IF(LM.GE.0 .OR. JR.NE.JC .OR. IABS(KR-KC).GT.1) GOTO 540
|
|
VL(I)=SQRT(DBLE((JC*(JC+1)-KR*KC)*(JTOT*(JTOT+1)-KR*KC)))
|
|
IF(JC.EQ.0 .NEQV. JR.EQ.0) VL(I)=ROOT2*VL(I)
|
|
IF(VL(I).NE.0.D0) NNZ=NNZ+1
|
|
540 I=I+NPOTL
|
|
IF(NNZ.EQ.0) WRITE(6,612) JTOT,LL
|
|
612 FORMAT(' * * * NOTE. FOR JTOT =',I4,', ALL COUPLING',
|
|
1 ' COEFFICIENTS ARE 0.0 FOR POTENTIAL SYMMETRY',I4)
|
|
550 CONTINUE
|
|
C
|
|
C NOW THE CENTRIFUGAL POTENTIAL
|
|
DO 570 I=1,N
|
|
JC=JLEV(J(I))
|
|
KC=JLEV(J(I)+NLEV)
|
|
CENT(I)=DBLE(JTOT*(JTOT+1)+JC*(JC+1)-2*KC*KC)
|
|
570 CONTINUE
|
|
RETURN
|
|
C
|
|
ENTRY DEGEN9(J1,J2,RESULT)
|
|
C
|
|
C DEGEN9 IS CALLED TO OBTAIN THE DEGENERACY FACTOR FOR THE DENOMINATOR
|
|
C OF A CROSS-SECTION CALCULATION; IT DOES NOT MATTER FOR BOUND STATES.
|
|
C
|
|
C JI=JLEVEL(J1)
|
|
C RESULT=DBLE(2*JI+1)
|
|
RETURN
|
|
END
|
|
SUBROUTINE BASE (JTOT, JLEV, N, J, L, CINT, EINT, CENT, VL, IV,
|
|
& MXLAM, NPOTL, LAM, WVEC, WGHT, IEXCH, THETA, PHI,
|
|
& ICODE, LCNT, ERED, NLEVV, PRINT)
|
|
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
|
C . CHANGED APR 1986 TO COMBINE BASIN & IOSBIN HANDLING.
|
|
C . CHANGED JAN 1988 TO ALLOW USER-DEFINED BASIS (ITYPE=9)
|
|
C . CHANGED MAR 1993 TO SET MPLMIN=TRUE FOR ITYPE=23,IDENT=1
|
|
C . CHANGED NOV 1993 TO USE IXNEXT DIRECTLY IN PLACE OF IC.
|
|
C . IC REMOVED FROM ARGUMENT LIST OF BASIN AND SET6.
|
|
C . CHANGED JAN 1994 TO USE IV() INDEXING FOR ITYP=10*N + 2
|
|
C . APR 1994 TO INCLUDE IEXCH IN PARAMETER LIST
|
|
C NEW ORDERING OF ITYPE=23 'PARITY CASES'
|
|
C . CHANGED JUL 1994 FOR VERSION 14
|
|
C . AUG 1994 TO INTEGRATE ITYPE = 4 CODE TO VERSION 14
|
|
C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE
|
|
C BELOW IS BEGINNING OF A LIMITED SAVE LIST
|
|
C SAVE ITP,ITYPE,IOFF,IBOUND,JZCSFL,EMAXK,WTM,IGO,IGODG,MJMX
|
|
C IDENT,WT,JMAX,JMIN -- IN CMBASE
|
|
C NLEV,NQN,MPLMIN -- IN PRBASE
|
|
C
|
|
C BASE HANDLES QUANTUM BASIS SETS FOR SCATTERING CALCULATION.
|
|
C
|
|
C ITYPE DESCRIBES TARGET-PROJECTILE TYPES.
|
|
C CURRENT IMPLEMENTATION FOR
|
|
C ITYPE=1 LINEAR RIGID ROTOR HIT BY AN ATOM
|
|
C ITYPE=2 DIATOMIC VIB-ROTOR HIT BY AN ATOM
|
|
C ITYPE=3 LINEAR RIGID ROTOR - LINEAR RIGID ROTOR
|
|
C ITYPE=4 RIGID ASYMMETRIC TOP HIT BY LINEAR RIGID ROTOR
|
|
C ITYPE=5 NEAR-SYMMETRIC TOP RIGID ROTOR HIT BY AN ATOM
|
|
C ITYPE=6 ASYMMETRIC TOP RIGID ROTOR HIT BY AN ATOM.
|
|
C ITYPE=7 DIATOMIC VIB-ROTOR HIT BY AN ATOM, WHERE A FULL
|
|
C SET OF EXPECTATION VALUES OF THE INTERMOLECULAR
|
|
C POTENTIAL BETWEEN (V,J) AND (V',J') DIATOM INTERNAL
|
|
C STATES IS SUPPLIED
|
|
C ITYPE=8 ATOM-SURFACE SCATTERING
|
|
C
|
|
C ITYPE=ITYPE+10 FOR EFFECTIVE POTENTIAL METHOD OF RABITZ.
|
|
C ITYPE=ITYPE+20 FOR COUPLED STATES OF MCGUIRE-KOURI.
|
|
C ITYPE=ITYPE+30 FOR DLD METHOD OF DEPRISTO AND ALEXANDER.
|
|
C
|
|
C
|
|
C ENTRY BASIN
|
|
C READS AND PROCESSES &BASIS DATA TO DESCRIBE ASYMPTOTIC LEVELS.
|
|
C QUANTUM NOS. AND INDEXING ARE IN JLEVEL(NLEVEL) AND
|
|
C JLEV(NLEV,NQN), IN DIFFERENT FORMATS.
|
|
C ASYMPTOTIC ENERGIES ARE IN ELEVEL(NLEVEL).
|
|
C
|
|
C MAIN ENTRY BASE
|
|
C SETS UP BASIS FOR EACH PARTIAL CALCULATION FROM ASYMPTOTIC
|
|
C LEVELS (STORED IN JLEV) COUPLED WITH COLLISION ORBITAL ANGULAR
|
|
C MOMENTUM.
|
|
C LCNT=.TRUE. MEANS ONLY COUNT NUMBER OF CHANNELS
|
|
C LCNT=.FALSE. MEANS SET UP BASIS FUNCTIONS IN ALLOCATED STORAGE.
|
|
C ICODE (=1...MXPAR) IS AN INDEX FOR THE CURRENT SYMMETRY BLOCK.
|
|
C IPAR AND IEXCH SUBDIVIDE ICODE=1,MXPAR INTO
|
|
C 1) PARITY, IPAR=0 (EVEN), 1 (ODD)
|
|
C 2) EXCHANGE SYM., IEXCH=0 (NO EXCHANGE), 1 (ODD), 2 (EVEN).
|
|
C IT IS NECESSARY TO SET FOLLOWING --
|
|
C ASYMPTOTIC LEVEL IN J, ORBITAL ANGULAR MOMENTUM IN L,
|
|
C ASYMPTOTIC ENERGY IN EINT, CENTRIFUGAL ENERGY IN CENT,
|
|
C AND COUPLING MATRIX ELEMENTS IN VL.
|
|
C
|
|
C EXTRA FEATURE ADDED AT UNIV. OF WATERLOO MAY 82. ARRAY IV
|
|
C IS AN INDEX ARRAY SUCH THAT VL(I) IS A COEFFICIENT FOR
|
|
C TERM NUMBER IV(I) IN THE POTENTIAL ARRAY RETURNED BY
|
|
C SUBROUTINE POTENL. THE INTRODUCTION OF THIS ARRAY ONLY
|
|
C MAKES ANY REAL DIFFERENCE FOR ITYPE=10*N+7, FOR WHICH IT
|
|
C ENABLES LARGE ECONOMIES IN STORAGE FOR THE VL ARRAY.
|
|
C ** 1/27/93 IV ARRAY USED IF AND ONLY IF IVLFL.GT.0 **
|
|
C NPOTL IS THE NUMBER OF "CHUNKS" OF SIZE N*(N+1)/2 WHICH
|
|
C COMPRISE VL AND IV. NPOTL=MXLAM EXCEPT FOR ITYPE=10*N+7 AND 8.
|
|
C FOR ITYPE=10*N+7, NPOTL IS EQUAL TO K+1, WHERE K IS THE
|
|
C INDEX OF THE HIGHEST ORDER LEGENDRE POLYNOMIAL ACTUALLY
|
|
C PRESENT IN THE POTENTIAL.
|
|
C FOR ITYPE=8, NPOTL=1.
|
|
C
|
|
C ADDITIONAL CHANGE MADE MAY 82. THE VL ARRAY IS NOW STORED
|
|
C SO THAT THE POTENTIAL SYMMETRY TERM IS MOST RAPIDLY VARYING,
|
|
C RATHER THAN THE CHANNEL INDICES AS BEFORE. THIS IS TO KEEP
|
|
C PAGING TO A MINIMUM IN SUBROUTINE WAVMAT.
|
|
C
|
|
C ENTRY DEGEN PROVIDES DEGENERACY INFORMATION FOR USE IN OUTPUT.
|
|
C
|
|
DIMENSION CENT(NLEVV),EINT(NLEVV),WVEC(NLEVV),VL(NLEVV),IV(NLEVV)
|
|
LOGICAL LCNT,EIN,LEVIN,MPLMIN,LSIG
|
|
INTEGER J(NLEVV),L(NLEVV),LAM(MXLAM),JLEV(NLEVV)
|
|
INTEGER PRINT,EUNITS
|
|
CHARACTER*4 EUNITC
|
|
CHARACTER*8 QNAME(10),QTYPE(10),PRTP(4,9),PTP(2)
|
|
DIMENSION WTM(2),IOSNGP(3)
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C COMMON BLOCK FOR BASIS DATA
|
|
C 2 AUG 94 V14 VERSION OF CMBASE; ISYM NO LONGER EQUIV J2MAX
|
|
C DIMENSIONS OF JLEVEL,ELEVEL SET HERE AND HELD IN /CMBASE/MXJL,MXEL
|
|
PARAMETER (MXJLVL=4000,MXELVL=1000)
|
|
DIMENSION ROTI(12),ALPHAE(2),BE(2),DE(2),A(2),B(2),C(2),WE(2),
|
|
1 WEXE(2),WT(2),ELEVEL(MXELVL),EEE(1016)
|
|
DIMENSION JLEVEL(MXJLVL),ISYM(10),ISYM2(10)
|
|
EQUIVALENCE (ROTI(1),BE(1),A(1)), (ROTI(3),ALPHAE(1),B(1)),
|
|
1 (ROTI(5),DE(1),C(1)),(JMIN,J1MIN),(JMAX,J1MAX),(JSTEP,J1STEP),
|
|
2 (ROTI(1),EEE(1)), (ROTI(7),WE(1),DJ ), (ROTI(8),DJK),
|
|
3 (ROTI(9),WEXE(1),DK), (J2MAX,KSET)
|
|
COMMON /CMBASE/ ROTI,ELEVEL,EMAX,WT,SPNUC, NLEVEL,JLEVEL,JMIN,
|
|
1 JMAX,JSTEP,ISYM,J2MIN,J2MAX,J2STEP,ISYM2,JHALF,IDENT,MXJL,MXEL
|
|
C
|
|
COMMON /PRBASE/ ITYPX,NQN,NLEV,MVALUE,IPTY,MPLMIN
|
|
C
|
|
COMMON/VLSAVE/IVLU
|
|
C
|
|
C ARRAYS FOR NAMELIST &BASIS
|
|
C CHARACTER*6 BNAMES(40)
|
|
C DIMENSION LOCN(40),INDX(40)
|
|
C
|
|
C V14: ISYM2, JHALF ADDED TO NAMELIST
|
|
NAMELIST /BASIS/ ROTI,JMIN,JMAX,JSTEP,ITYPE
|
|
1 ,NLEVEL,JLEVEL,ELEVEL,EMAX,EMAXK,BE,ALPHAE,DE,A,B,C,WE,WEXE
|
|
2 ,J1MAX,J1MIN,J2MAX,J2MIN,J1STEP,J2STEP
|
|
3 ,WT,IDENT,SPNUC,EUNITS,EUNITC,IASYMU,JZCSMX,IBOUND,JZCSFL
|
|
4 ,IOSNGP,IPHIFL,ISYM,ISYM2,KSET,IVLU,JHALF
|
|
C
|
|
DATA QTYPE/ ' J ', ' K ',
|
|
1 ' PRTY ', ' J1 ', ' J2 ', ' J12 ',
|
|
2 ' V ', ' TAU ',' ','SIG INDX'/
|
|
DATA PRTP/' LINEAR',' RIGID R','OTOR - ',' ATOM. ',
|
|
1 ' DIATOM','IC VIB-R','OTOR - ',' ATOM. ',
|
|
2 ' LINEAR',' ROTOR -',' LINEAR ','ROTOR. ',
|
|
3 ' ASYMME','TRIC TOP',' - LINEA','R ROTOR.',
|
|
4 'ATOM - N','EAR SYM.',' TOP RIG','ID ROTOR',
|
|
5 ' ASYMME','TRIC TOP',' - ATOM ',' ',
|
|
6 4*' ',
|
|
7 ' ATOM -',' CORRUGA','TED SURF','ACE ',
|
|
8 4*' '/
|
|
DATA PTP/', ODD ',', EVEN '/
|
|
C
|
|
C
|
|
C DATA BNAMES/'ROTI','JMIN','JMAX','JSTEP','ITYPE',
|
|
C 1 'NLEVEL','JLEVEL','ELEVEL','EMAX','EMAXK',
|
|
C 2 'BE','ALPHAE','DE','A','B','C','WE','WEXE',
|
|
C 2 'J1MAX','J1MIN','J2MAX','J2MIN','J1STEP','J2STEP',
|
|
C 3 'WT','IDENT','SPNUC','EUNITS','IASYMU','JZCSMX','IBOUND',
|
|
C 4 'JZCSFL','IOSNGP','IPHIFL','ISYM','KSET','IVLU','ISYM2',
|
|
C 5 'JHALF','EUNITC'/
|
|
C DATA INDX/40*0/
|
|
C
|
|
C SET UP BASIS FUNCTIONS
|
|
C
|
|
IEXCH=0
|
|
IPAR=0
|
|
C
|
|
IF (ITYPE.EQ.8) GO TO 5208
|
|
IF (ITP.EQ.9) GO TO 5209
|
|
IF (ITYPE.LE.10) GO TO 5201
|
|
IF (ITYPE.LE.20) GO TO 5202
|
|
IF (ITYPE.LE.30) GO TO 5203
|
|
C
|
|
C CODE FOR DECOUPLED L-DOMINANT APPROX OF ALEXANDER
|
|
C
|
|
5204 N=0
|
|
LAMBDA=ICODE-1
|
|
DO 4001 I=1,NLEV
|
|
JI=JLEV(I)
|
|
LI=JTOT+LAMBDA-JI
|
|
IF (LI.LT.IABS(JTOT-JI) .OR. LI.GT.(JTOT+JI) ) GO TO 4001
|
|
N=N+1
|
|
IF (LCNT) GO TO 4001
|
|
J(N)=I
|
|
L(N)=LI
|
|
4001 CONTINUE
|
|
IF (LCNT) GO TO 5000
|
|
GO TO 8000
|
|
C
|
|
C CODE BELOW FOR MCGUIRE-KOURI J-Z CONSERVING COUPLED STATES APPROX.
|
|
C
|
|
5203 N=0
|
|
C>SG CODE BELOW IS REVISED APR 94 -- NEW ORDERING OF PARITY CASES
|
|
IF (MPLMIN) THEN
|
|
IF (IDENT.EQ.0) THEN
|
|
MVALUE=ICODE-1
|
|
IF (ITYPE.EQ.25.AND.ISYM(1).NE.-1) THEN
|
|
IBLOCK=1+MVALUE/(MJMX+1)
|
|
MVALUE=MOD(MVALUE,MJMX+1)
|
|
KREQ=IBLOCK-1
|
|
ENDIF
|
|
ELSE
|
|
IEXCH=2-MOD(ICODE,2)
|
|
MVALUE=(ICODE+1)/2-1
|
|
IF (WT(IEXCH).EQ.0.D0) THEN
|
|
IF (PRINT.GE.3) WRITE(6,690) JTOT,ICODE,PTP(IEXCH)
|
|
GO TO 5000
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
C CODE BELOW IS FOR MPLMIN=.FALSE. (NOT USED, BUT COULD BE REVIVED)
|
|
IF (IDENT.EQ.0) THEN
|
|
WRITE(6,*) ' *** BASE (APR 94). MPLMIN=.FALSE. .AND. IDENT.'
|
|
1 ,'EQ.0 ARE NOT ALLOWED'
|
|
STOP
|
|
ELSE
|
|
ICD=(ICODE+1)/2
|
|
MVALUE=ICD/2
|
|
IF (ICD-2*(ICD/2).EQ.0) MVALUE=-MVALUE
|
|
ENDIF
|
|
ENDIF
|
|
C SET IPAR (=1 FOR MVALUE=0, =2 OTHERWISE)
|
|
IPAR=1
|
|
IF (MVALUE.NE.0) IPAR=2
|
|
C<SG END OF APR 94 REVISIONS
|
|
DO 5221 I=1,NLEV
|
|
C SKIP IF J.LT.MVALUE OR EXCLUDED BY EXCHANGE SYMMETRY.
|
|
IF (JLEV(IOFF+I).LT.IABS(MVALUE)) GO TO 5221
|
|
IF (IBOUND.NE.0 .AND. JTOT.LT.IABS(MVALUE)) GO TO 5221
|
|
IF (IDENT.NE.0 .AND. JLEV(I).EQ.JLEV(NLEV+I) .AND.
|
|
1 PARITY3(IEXCH+JLEV(2*NLEV+I)+JTOT+JZCSFL*JLEV(IOFF+I)).LE.0.D0)
|
|
2 GO TO 5221
|
|
IF (ITYPE.EQ.25 .AND. ISYM(1).NE.-1 .AND. JLEV(NLEV+I).NE.KREQ)
|
|
1 GO TO 5221
|
|
N=N+1
|
|
IF (LCNT) GO TO 5221
|
|
J(N)=I
|
|
L(N)=IABS(JTOT+JZCSFL*JLEV(IOFF+I))
|
|
5221 CONTINUE
|
|
IF (LCNT) GO TO 5000
|
|
CALL MCGCPL(N,MXLAM,NPOTL,LAM,NLEV,JLEV,J,L,MVALUE,ITYPE,IEXCH,
|
|
1 VL,IV,PRINT)
|
|
GO TO 8888
|
|
C
|
|
C
|
|
C CODE BELOW IS FOR RABITZ' EFFECTIVE POTENTIAL METHOD
|
|
C HERE EACH 'STATE' IS A BASIS FUNCTION AND JTOT=O
|
|
C
|
|
5202 N=0
|
|
IF (IDENT.EQ.0) GO TO 8001
|
|
IEXCH=ICODE
|
|
IF (WT(IEXCH).NE.0.D0) GO TO 8001
|
|
IF (PRINT.GE.3) WRITE(6,690) JTOT,ICODE,PTP(IEXCH)
|
|
690 FORMAT(' ***'/
|
|
1 ' *** NOTE. JTOT =',I4,'.',I2,A8,'EXCHANGE SKIPPED'
|
|
2 ,' BECAUSE WEIGHT = 0.0'/' ***')
|
|
GO TO 5000
|
|
8001 DO 5210 I=1,NLEV
|
|
IF (IDENT.NE.0 .AND. JLEV(I).EQ.JLEV(NLEV+I) .AND.
|
|
1 PARITY3(IEXCH+JTOT).LE.0.D0) GO TO 5210
|
|
N=N+1
|
|
IF (LCNT) GO TO 5210
|
|
J(N)=I
|
|
L(N)=JTOT
|
|
5210 CONTINUE
|
|
IF (LCNT) GO TO 5000
|
|
GO TO 8000
|
|
C
|
|
C
|
|
C CODE BELOW OF AUG 74 IS UNIFIED ITYPE (EXCEPT 8 & 9) CODE.
|
|
C N.B. BASIS FUNCTIONS ARE ORDERED ON L AS IN GORDON'S CODE.
|
|
C
|
|
5201 N=0
|
|
IPTY=ICODE-2*(ICODE/2)
|
|
IF (IDENT.EQ.0) GO TO 8002
|
|
IEXCH=(ICODE+1)/2
|
|
IF (WT(IEXCH).NE.0.D0) GO TO 8002
|
|
IF (PRINT.GE.3) WRITE(6,690) JTOT,ICODE,PTP(IEXCH)
|
|
GO TO 5000
|
|
8002 LMAX=JTOT+JMAX
|
|
LMIN=JTOT-JMAX
|
|
IF (LMIN.GE.0) GO TO 4101
|
|
LMIN=JMIN-JTOT
|
|
IF (LMIN.LT.0) LMIN=0
|
|
4101 DO 4201 LI=LMIN,LMAX
|
|
JK=IABS(JTOT-LI)
|
|
JTOP=JTOT+LI
|
|
DO 4201 I=1,NLEV
|
|
C
|
|
GO TO IGO, (9001, 9003, 9004, 9005, 9006)
|
|
9001 JI=JLEV(I)
|
|
LPJ=LI+JI+JTOT
|
|
GO TO 4005
|
|
9003 JI=JLEV(2*NLEV+I)
|
|
C FOR IDENTICAL PARTICLES SKIP IMMEDIATELY IF FUNCTION VANISHES.
|
|
IF (IDENT.NE.0 .AND. JLEV(I).EQ.JLEV(NLEV+I) .AND.
|
|
1 PARITY3(IEXCH+JI+LI).LE.0.D0) GO TO 4201
|
|
LPJ=JLEV(I)+JLEV(NLEV+I)+LI+JTOT
|
|
GO TO 4005
|
|
9004 JI = JLEV(I)
|
|
JAY1 = JLEV(2*NLEV + I)
|
|
JAY2 = JLEV(NLEV + I)
|
|
LPJ = JLEV(4*NLEV + I)
|
|
C LINE BELOW CORRECTED 1 NOV 94 BY SG
|
|
LPJ = LPJ + LPJ/2 + JAY1 + JAY2 + LI + JTOT
|
|
GO TO 4005
|
|
9005 JI=JLEV(I)
|
|
LPJ=JI+JLEV(I+NLEV)+JLEV(I+2*NLEV)+LI+JTOT
|
|
C FOR SYMMETRIC TOP WITH ISYM OPTION, SKIP IF THIS K NOT WANTED
|
|
IF (ISYM(1).NE.-1) THEN
|
|
KREQ=(ICODE-1)/2
|
|
IF (JLEV(NLEV+I).NE.KREQ) GO TO 4201
|
|
ENDIF
|
|
GO TO 4005
|
|
9006 JI=JLEV(I)
|
|
LPJ=JLEV(2*NLEV+I)
|
|
LPJ=LPJ+LPJ/2+JI+LI+JTOT
|
|
GO TO 4005
|
|
C
|
|
4005 IF ( (LPJ-2*(LPJ/2)) .NE. IPTY) GO TO 4201
|
|
IF (JI.LT.JK .OR. JI.GT.JTOP) GO TO 4201
|
|
N=N+1
|
|
IF (LCNT) GO TO 4201
|
|
J(N)=I
|
|
L(N)=LI
|
|
4201 CONTINUE
|
|
IF (LCNT) GO TO 5000
|
|
GO TO 8000
|
|
C
|
|
5209 CALL BASE9(LCNT,N,JTOT,ICODE,JLEV,NLEV,NQN,J,L)
|
|
IF (LCNT) GO TO 5000
|
|
CALL CPL9(N,ICODE,NPOTL,LAM,MXLAM,NLEV,JLEV,J,L,JTOT,
|
|
1 VL,IV,CENT,IBOUND,IEXCH,PRINT)
|
|
GO TO 8888
|
|
C
|
|
C * * BASIS FUNCTIONS ARE NOW SET-UP IN J(I), L(I), I=1,N.
|
|
C
|
|
C STORE MATRIX ELEMENTS OF THE COUPLING POTENTIAL IN VL.
|
|
8000 CALL COUPLE(N,ITYPE,MXLAM,NPOTL,LAM,NLEV,JLEV,J,L,JTOT,
|
|
1 VL,IV,IEXCH,PRINT)
|
|
GO TO 8888
|
|
C
|
|
C CODE FOR SURFACE SCATTERING
|
|
C
|
|
5208 CALL SURBAS(JLEV, N, J, L, EINT, CENT, VL, IV,
|
|
1 MXLAM, NPOTL, LAM, ERED, WVEC, LCNT, THETA, PHI, EMAXK)
|
|
IF (LCNT) GO TO 5000
|
|
C
|
|
8888 IF (ITYPE.EQ.8) GO TO 4000
|
|
C
|
|
C NOW CALCULATE THE DIAGONAL MATRIX ELEMENTS OF THE HAMILTONIAN
|
|
C
|
|
DO 30 I=1,N
|
|
C FIRST THE INTERNAL ROTATIONAL ENERGY FROM ENERGY('SIG-INDEX')
|
|
C APR 94, ALLOW FOR NEG SIG-INDEX
|
|
EINT(I)=CINT * ELEVEL(IABS(JLEV(NLEV*(NQN-1)+J(I))))
|
|
DIF=ERED-EINT(I)
|
|
WVEC(I)=SIGN(SQRT(ABS(DIF)),DIF)
|
|
C NOW THE CENTRIFUGAL POTENTIAL
|
|
IF (IBOUND.EQ.0) THEN
|
|
CENT(I)=DBLE(L(I)*(L(I)+1))
|
|
ELSE
|
|
IF (ITYPE.GE.21 .AND. ITYPE.LE.27) THEN
|
|
C SPECIAL CASE FOR HELICITY DECOUPLING FOR BOUND STATES
|
|
JK=JLEV(IOFF+J(I))
|
|
CENT(I)=DBLE(JTOT*(JTOT+1)+JK*(JK+1)-2*MVALUE*MVALUE)
|
|
L(I)=SQRT(CENT(I))
|
|
ELSEIF (ITP.NE.9) THEN
|
|
C ARRIVE HERE IF IBOUND=1 AND NOT BUILT-IN COUPLED STATES.
|
|
C FOR ITYPE=9, IBOUND=1 IS A FLAG TO LEAVE CENT ALONE.
|
|
C OTHERWISE, SET IT FROM L AS IF IBOUND=0
|
|
CENT(I)=DBLE(L(I)*(L(I)+1))
|
|
ENDIF
|
|
ENDIF
|
|
30 CONTINUE
|
|
C
|
|
C THIS COMPLETES THE SPECIFICATION OF THE BASIS BY GIVING VALUES
|
|
C TO ALL RELEVANT MATRIX ELEMENTS
|
|
C
|
|
4000 IF (PRINT.LT.5) GO TO 4020
|
|
WRITE(6,300)
|
|
300 FORMAT(/' CHANNEL NO. TARGET LEVEL ORBITAL L TARGET ENERGY',
|
|
1 '(1/CM)')
|
|
DO 4010 I=1,N
|
|
ECI=EINT(I)/CINT
|
|
4010 WRITE(6,301) I,J(I),L(I),ECI
|
|
301 FORMAT(1X,I9,2I12,F21.7)
|
|
IF (PRINT.GT.25) CALL CPLOUT(IV,VL,N,NPOTL)
|
|
4020 CONTINUE
|
|
C
|
|
C COMPUTE STATISTICAL WEIGHT FOR THIS SYMMETRY BLOCK
|
|
C AFTER MAY 76 IPAR USED IN PLACE OF IEXCH FOR CS WEIGHTING.
|
|
C
|
|
WGHT=1.D0
|
|
IF (IEXCH.GT.0) WGHT=WGHT*WT(MIN0(2,IEXCH))
|
|
IF (IPAR.GT.0) WGHT=WGHT*WTM(MIN0(2,IPAR))
|
|
5000 IF (N.LE.0) N=0
|
|
RETURN
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY BASIN(NLEVV,JLEV,URED,NQ,NLABV,MXPAR,ITYPP,IOSFLG)
|
|
C
|
|
C
|
|
WRITE(6,610)
|
|
610 FORMAT(//' /BASIS/ DATA ARE --')
|
|
C
|
|
C SET LIMITS IN /CMBASE/
|
|
MXEL=MXELVL
|
|
MXJL=MXJLVL
|
|
C SET DEFAULT VALUES BEFORE READ(5,BASIS).
|
|
IOFF=0
|
|
NLEVEL=0
|
|
JMIN=0
|
|
JMAX=0
|
|
JSTEP=1
|
|
J2MIN=0
|
|
J2MAX=0
|
|
J2STEP=1
|
|
EMAX=0.D0
|
|
EMAXK=0.D0
|
|
C BELOW ZEROS ELEVEL,ROTI,EMAX,WT,SPNUC
|
|
DO 1103 I=1,MXEL+16
|
|
1103 EEE(I)=0.D0
|
|
DO 1104 I=1,MXJL
|
|
1104 JLEVEL(I)=0
|
|
DO 1105 I=1,3
|
|
1105 IOSNGP(I)=0
|
|
IPHIFL=0
|
|
IDENT=0
|
|
WT(1)=0.D0
|
|
WT(2)=0.D0
|
|
WTM(1)=1.D0
|
|
WTM(2)=1.D0
|
|
MPLMIN=.TRUE.
|
|
EUNITS=0
|
|
EUNITC=' '
|
|
JZCSMX=-1
|
|
IBOUND=0
|
|
JZCSFL=0
|
|
IASYMU=0
|
|
IVLU=0
|
|
JHALF=1
|
|
DO 1106 I=1,10
|
|
ISYM(I)=-1
|
|
1106 ISYM2(I)=-1
|
|
C
|
|
C----------------------------------------------------------------
|
|
C LOCN ARRAY FOR NAMELIST SIMULATOR
|
|
C INDX(28)=4
|
|
C LOCN(1)=LOC(ROTI)
|
|
C LOCN(2)=LOC(JMIN)
|
|
C LOCN(3)=LOC(JMAX)
|
|
C LOCN(4)=LOC(JSTEP)
|
|
C LOCN(5)=LOC(ITYPE)
|
|
C LOCN(6)=LOC(NLEVEL)
|
|
C LOCN(7)=LOC(JLEVEL)
|
|
C LOCN(8)=LOC(ELEVEL)
|
|
C LOCN(9)=LOC(EMAX)
|
|
C LOCN(10)=LOC(EMAXK)
|
|
C LOCN(11)=LOC(BE)
|
|
C LOCN(12)=LOC(ALPHAE)
|
|
C LOCN(13)=LOC(DE)
|
|
C LOCN(14)=LOC(A)
|
|
C LOCN(15)=LOC(B)
|
|
C LOCN(16)=LOC(C)
|
|
C LOCN(17)=LOC(WE)
|
|
C LOCN(18)=LOC(WEXE)
|
|
C LOCN(19)=LOC(J1MAX)
|
|
C LOCN(20)=LOC(J1MIN)
|
|
C LOCN(21)=LOC(J2MAX)
|
|
C LOCN(22)=LOC(J2MIN)
|
|
C LOCN(23)=LOC(J1STEP)
|
|
C LOCN(24)=LOC(J2STEP)
|
|
C LOCN(25)=LOC(WT)
|
|
C LOCN(26)=LOC(IDENT)
|
|
C LOCN(27)=LOC(SPNUC)
|
|
C LOCN(28)=LOC(EUNITS)
|
|
C LOCN(29)=LOC(IASYMU)
|
|
C LOCN(30)=LOC(JZCSMX)
|
|
C LOCN(31)=LOC(IBOUND)
|
|
C LOCN(32)=LOC(JZCSFL)
|
|
C LOCN(33)=LOC(IOSNGP)
|
|
C LOCN(34)=LOC(IPHIFL)
|
|
C LOCN(35)=LOC(ISYM)
|
|
C LOCN(36)=LOC(KSET)
|
|
C LOCN(37)=LOC(IVLU)
|
|
C LOCN(38)=LOC(ISYM2)
|
|
C LOCN(39)=LOC(JHALF)
|
|
C LOCN(40)=LOC(EUNITC)
|
|
C CALL NAMLIS('&BASIS',BNAMES,LOCN,INDX,40,IEOF)
|
|
C----------------------------------------------------------------
|
|
READ(5,BASIS)
|
|
C
|
|
C *** CHECK FIRST OF ALL FOR IOS CASES, INDICATED BY ITYPE.GT.100
|
|
IF (ITYPE.LT.100) GO TO 1999
|
|
C
|
|
WRITE(6,601)
|
|
601 FORMAT(/' ',19('*')/3X,'****** I O S ******'/3X,19('*'))
|
|
C FORCE CORRECT IOSFLG. NLEVV HAS MXA FOR IOSBIN
|
|
IOSFLG=1
|
|
MXA=NLEVV
|
|
CALL IOSBIN(NLEVV,ITYPE,JLEV,MXA,IASYMU,IPHIFL,IOSNGP)
|
|
C RESTORE APPROPRIATE ARGUMENT VARIABLES
|
|
ITYPP=ITYPE
|
|
IXNEXT=IXNEXT+MXA
|
|
RETURN
|
|
C
|
|
C *** CONTINUE WITH COUPLED CHANNEL CASES
|
|
1999 NLEV=NLEVEL
|
|
IF (EMAXK.EQ.0.D0) EMAXK=EMAX
|
|
C
|
|
CALL ECNV(EUNITS,EUNITC,EFACT)
|
|
JZCSFL=MAX0(MIN0(JZCSFL,1),-1)
|
|
IF (ITYPE.EQ.8) GO TO 6902
|
|
C BELOW APPLIES EFACT TO ROTI,ELEVEL
|
|
DO 6901 I=1,MXEL+12
|
|
6901 EEE(I)=EEE(I)*EFACT
|
|
6902 EMAX=EMAX*EFACT
|
|
EMAXK=EMAXK*EFACT
|
|
C
|
|
C PROCESS ITYPE . . .
|
|
C
|
|
ITP=ITYPE-10*(ITYPE/10)
|
|
IF (ITP.NE.6 .AND. ITYP.NE.9) IVLU=0
|
|
IF (ITP.EQ.7) ITP=2
|
|
IF (ITP.NE.9) GO TO 6837
|
|
CALL BAS9IN(PRTP(1,9),IBOUND)
|
|
GO TO 3100
|
|
6837 IF (ITYPE.LE.10) GO TO 3100
|
|
IF (ITYPE.LE.20) GO TO 3200
|
|
IF (ITYPE.LE.30) GO TO 3300
|
|
WRITE(6,663)
|
|
663 FORMAT(/' DECOUPLED L-DOMINANT APPROX. OF DEPRISTO AND ',
|
|
1 'ALEXANDER WILL BE USED.')
|
|
GO TO 3100
|
|
3300 WRITE(6,662) ITYPE,JZCSFL
|
|
662 FORMAT(/' COUPLED STATES APPROXIMATION OF MCGUIRE AND KOURI ',
|
|
1 '(C.F. J. CHEM. PHYS. 60, 2488 (1974)) WILL BE USED.'//
|
|
2 11X,'ITYPE =',I3/11X,'L(I) = JTOT + (',I2,') * J(I)')
|
|
IF (IBOUND.NE.0) WRITE(6,664)
|
|
664 FORMAT(/' DIAGONAL CORIOLIS TERM INCLUDED IN CENTRIFUGAL ',
|
|
1 'POTENTIAL')
|
|
GO TO 3100
|
|
3200 WRITE(6,661) ITYPE
|
|
661 FORMAT(/' *EFFECTIVE POTENTIAL METHOD* WILL BE USED.',
|
|
1 ' SEE H. RABITZ, J. CHEM. PHYS. 57, 1718 (1972).'//
|
|
2 ' ITYPE =',I4)
|
|
3100 WRITE(6,600) (PRTP(JJ,ITP),JJ=1,4)
|
|
600 FORMAT(/' COLLISION TYPE IS ', 4A8)
|
|
IF (ITYPE-10*(ITYPE/10).EQ.7) WRITE(6,6840)
|
|
6840 FORMAT(/' ITYPE = 10*N+7 OPTION. ALL POTENTIAL MATRICES WILL BE',
|
|
1 ' CONSTRUCTED FROM POTENTIAL TERMS IN WHICH DIATOM STRETCHING'/
|
|
2 ' DEPENDENCE IS PROPERLY AVERAGED OVER RELEVANT (V,J) AND',
|
|
3 ' (V'',J'') DIATOM INTERNAL STATES.')
|
|
C
|
|
C PROCESS EXCHANGE SYMMETRY FOR IDENTICAL PARTICLES
|
|
CALL IDPART(ITYPE,IDENT,SPNUC,WT)
|
|
C
|
|
C DETERMINE EIN AND LEVIN WHICH DENOTE WHETHER ELEVEL AND JLEV ARE
|
|
C TAKEN FROM INPUT ELEVEL AND JLEVEL OR ARE CALCULATED.
|
|
C MODIFIED AUG 94 TO ALLOW NEGATIVE NLEVEL FOR ITYPE=6
|
|
C NOTE: ITYPE = 4 CODE DOES NOT USE LEVIN,EIN
|
|
IF (ITP.EQ.4) GO TO 7600
|
|
IF (NLEVEL.GT.0) GO TO 7000
|
|
LEVIN=.FALSE.
|
|
EIN=.FALSE.
|
|
IF (ITP.EQ.6.AND.NLEVEL.LT.0) GO TO 7001
|
|
GO TO 7100
|
|
7000 LEVIN=.TRUE.
|
|
7001 EIN=.TRUE.
|
|
DO 7200 I=1,ABS(NLEVEL)
|
|
IF (ELEVEL(I).NE.0.D0) GO TO 7100
|
|
7200 CONTINUE
|
|
C IF WE REACH THIS POINT ELEVEL(I) ARE ALL ZERO.
|
|
EIN=.FALSE.
|
|
7100 IF (EIN .OR. ITP.EQ.6) GO TO 7600
|
|
DO 7400 I=1,10
|
|
IF (ROTI(I).NE.0.D0) GO TO 7600
|
|
7400 CONTINUE
|
|
WRITE(6,630)
|
|
630 FORMAT(/' * * * ERROR. ENERGY LEVELS CAN BE OBTAINED NEITHER ',
|
|
1 'FROM ELEVEL NOR ROTI INPUT.')
|
|
WRITE(6,629)
|
|
629 FORMAT(/' * * * EXECUTION TERMINATING.')
|
|
STOP
|
|
C
|
|
C PROCESS ACCORDING TO ITYPE.
|
|
C
|
|
C IVLFL=0 EXCEPT FOR ITYPE'S = 2, 7, 8
|
|
7600 IVLFL=0
|
|
IF (ITYPE.EQ.1.OR.ITYPE.EQ.11.OR.ITYPE.EQ.21.OR.ITYPE.EQ.31)
|
|
1 GO TO 1001
|
|
IF (ITYPE.EQ.2.OR.ITYPE.EQ.12.OR.ITYPE.EQ.22.OR.ITYPE.EQ.32)
|
|
1 GO TO 1002
|
|
IF (ITYPE.EQ.3.OR.ITYPE.EQ.13.OR.ITYPE.EQ.23) GO TO 1003
|
|
IF (ITYPE.EQ.4.OR.ITYPE.EQ.24) GO TO 1004
|
|
IF (ITYPE.EQ.5.OR.ITYPE.EQ.15.OR.ITYPE.EQ.25) GO TO 1005
|
|
IF (ITYPE.EQ.6.OR.ITYPE.EQ.16.OR.ITYPE.EQ.26) GO TO 1006
|
|
IF (ITYPE.EQ.7.OR.ITYPE.EQ.17.OR.ITYPE.EQ.27.OR.ITYPE.EQ.37)
|
|
1 GO TO 1002
|
|
IF (ITYPE.EQ.8) GO TO 1008
|
|
IF (ITP.EQ.9) GO TO 1009
|
|
C
|
|
C NO IMPLEMENTATION FOR OTHER TYPES OF COLLISION PARTNERS.
|
|
WRITE(6,611) ITYPE
|
|
611 FORMAT(/' ILLEGAL ITYPE =',I8,', EXECUTION TERMINATING.')
|
|
STOP
|
|
C
|
|
C * * * * * ITYPE = 1 * * * * *
|
|
C
|
|
1001 ASSIGN 9001 TO IGO
|
|
ASSIGN 3901 TO IGODG
|
|
1111 NQN=2
|
|
QNAME(1)=QTYPE(1)
|
|
MXPAR=2
|
|
CALL SET1(LEVIN,EIN,NLEV,JLEV)
|
|
IF (ITYPE.LE.10) GO TO 2000
|
|
IF (ITYPE.LE.20) GO TO 1311
|
|
IF (ITYPE.LE.30) GO TO 1411
|
|
C PROCESSING FOR DLD
|
|
GO TO 1400
|
|
C MODIFICATIONS FOR COUPLED STATES . . .
|
|
1411 GO TO 1020
|
|
C MODIFICATIONS NECESSARY FOR EFFECTIVE POTENTIAL METHOD. . .
|
|
1311 ASSIGN 3911 TO IGODG
|
|
MXPAR=1
|
|
GO TO 2000
|
|
C
|
|
C * * * * * ITYPE = 2 OR ITYPE = 7 * * * * *
|
|
C DIATOM VIB-ROTOR PLUS ATOM - ADDED FEB 76
|
|
C
|
|
1002 ASSIGN 9001 TO IGO
|
|
ASSIGN 3902 TO IGODG
|
|
IVLFL=1
|
|
NQN=3
|
|
MXPAR=2
|
|
QNAME(1)=QTYPE(1)
|
|
QNAME(2)=QTYPE(7)
|
|
CALL SET2(LEVIN,EIN,NLEV,JLEV)
|
|
IF (ITYPE.LE.10) GO TO 2000
|
|
IF (ITYPE.LE.20) GO TO 1312
|
|
IF (ITYPE.LE.30) GO TO 1412
|
|
GO TO 1400
|
|
1412 GO TO 1020
|
|
1312 ASSIGN 3912 TO IGODG
|
|
MXPAR=1
|
|
GO TO 2000
|
|
C
|
|
C * * * * * ITYPE = 3 * * * * *
|
|
C LINEAR ROTOR - LINEAR ROTOR ADDED AUG. 1974.
|
|
C
|
|
1003 NQN=4
|
|
ASSIGN 9003 TO IGO
|
|
ASSIGN 3903 TO IGODG
|
|
QNAME(1)=QTYPE(4)
|
|
QNAME(2)=QTYPE(5)
|
|
QNAME(3)=QTYPE(6)
|
|
MXPAR=2
|
|
CALL SET3(LEVIN,EIN,NLEV,JLEV)
|
|
IF (ITYPE.LE.10) GO TO 7703
|
|
IF (ITYPE.LE.20) GO TO 1013
|
|
C CHANGES TO ACCOMMODATE COUPLED STATES APPROX.
|
|
IOFF=2*NLEV
|
|
C SG (MAR.19.93) USE MPLMIN=.TRUE. EVEN FOR ITYPE=23 W/ IDENT=1
|
|
C THIS INTRODUCES AT MOST PARITY3(J12+J12P+LM) INTO S-MATRIX
|
|
C WHICH DOES NOT AFFECT STATE-TO-STATE CROSS SECTIONS
|
|
C HOWEVER, OUTPUT A WARNING MESSAGE.
|
|
IF (IDENT.NE.0) WRITE(6,603)
|
|
603 FORMAT(/' *** WARNING. FOR ITYPE=23, MPLMIN=TRUE SHOULD GIVE',
|
|
1 ' CORRECT STATE-TO-STATE CROSS SECTIONS.'/
|
|
2 ' *** IT MAY GIVE INCORRECT PHASES FOR',
|
|
3 ' GENERALIZED CROSS SECTIONS.')
|
|
C MPLMIN=.FALSE. <-- ORIGINAL
|
|
C IF (IDENT.EQ.0) MPLMIN=.TRUE. <-- CODE
|
|
GO TO 1020
|
|
C PROCESS JLEVEL TO JLEV FOR 'EPM' CASE
|
|
1013 NQN=3
|
|
MXPAR=1
|
|
ASSIGN 3913 TO IGODG
|
|
C APR 94: STATEMENT BELOW WAS LOST IN VERSIONS 9-12
|
|
NLEV=NLEVEL
|
|
DO 7713 I=1,NLEV
|
|
JLEV(I)=JLEVEL(2*I-1)
|
|
JLEV(NLEV+I)=JLEVEL(2*I)
|
|
7713 JLEV(2*NLEV+I)=I
|
|
7703 IF (IDENT.NE.0) MXPAR=2*MXPAR
|
|
GO TO 2000
|
|
C
|
|
C * * * * * ITYPE = 4 * * * * *
|
|
C ASYMMETRIC TOP - LINEAR RIGID ROTOR, AUG 90 GISS (TRP)
|
|
C
|
|
1004 NQN = 8
|
|
ASSIGN 9004 TO IGO
|
|
ASSIGN 3904 TO IGODG
|
|
QNAME(1) = QTYPE(6)
|
|
QNAME(2) = QTYPE(5)
|
|
QNAME(3) = QTYPE(4)
|
|
QNAME(4) = QTYPE(8)
|
|
QNAME(5) = QTYPE(3)
|
|
QNAME(6) = QTYPE(9)
|
|
QNAME(7) = QTYPE(9)
|
|
MXPAR = 2
|
|
CALL SET4(NLEV,JLEV,JLEV,EFACT,IASYMU)
|
|
IF (ITYPE .LE. 10) GO TO 2000
|
|
GO TO 1020
|
|
C
|
|
C * * * * * ITYPE = 5 * * * * *
|
|
C
|
|
1005 NQN=4
|
|
ASSIGN 9005 TO IGO
|
|
ASSIGN 3905 TO IGODG
|
|
QNAME(1)=QTYPE(1)
|
|
QNAME(2)=QTYPE(2)
|
|
QNAME(3)=QTYPE(3)
|
|
MXPAR=2
|
|
IF (ISYM(1).NE.-1) MXPAR=ISYM(1)*MXPAR
|
|
CALL SET5(LEVIN,EIN,NLEV,JLEV)
|
|
IF (ITYPE.LE.10) GO TO 2000
|
|
IF (ITYPE.LE.20) GO TO 1015
|
|
C MODIFICATIONS FOR COUPLED STATES. . .
|
|
GO TO 1020
|
|
C MODIFICATIONS FOR EFFECTIVE POTENTIAL . . .
|
|
1015 ASSIGN 3915 TO IGODG
|
|
MXPAR=1
|
|
GO TO 2000
|
|
C
|
|
C * * * ITYPE = 6 * * *
|
|
C ASYMMETRIC TOP - ATOM ADDED JULY 76 AT MPI, MUNCHEN.
|
|
C
|
|
1006 ASSIGN 9006 TO IGO
|
|
ASSIGN 3906 TO IGODG
|
|
QNAME(1)=QTYPE(1)
|
|
QNAME(2)=QTYPE(8)
|
|
QNAME(3)=QTYPE(3)
|
|
QNAME(4)=QTYPE(9)
|
|
QNAME(5)=QTYPE(9)
|
|
NQN=6
|
|
MXPAR=2
|
|
CALL SET6(LEVIN,EIN,NLEV,JLEV,JLEV,EFACT,IASYMU)
|
|
IF (ITYPE.LE.10) GO TO 2000
|
|
IF (ITYPE.LE.20) GO TO 1316
|
|
IF (ITYPE.LE.30) GO TO 1416
|
|
C ADDITIONAL PROCESSING FOR COUPLED STATES.
|
|
1416 GO TO 1020
|
|
C ADDITIONAL PROCESSING FOR EFFECTIVE POTENTIAL.
|
|
1316 MXPAR=1
|
|
ASSIGN 3916 TO IGODG
|
|
GO TO 2000
|
|
C
|
|
1009 ASSIGN 3909 TO IGODG
|
|
C N.B. CODE HERE OR IN SET9 SHOULD ASSIGN APPROPRIATE IVLFL
|
|
CALL SET9(LEVIN,EIN,NLEV,JLEV,NQN,QNAME,MXPAR,NLABV)
|
|
GO TO 2000
|
|
C
|
|
C **** MCGUIRE COUPLED STATES APPROX. ****
|
|
C **** ALSO FOR DLD OF DEPRISTO AND ALEXANDER
|
|
1020 WTM(1)=1.D0
|
|
WTM(2)=1.D0
|
|
IF (.NOT.MPLMIN) GO TO 1400
|
|
WTM(2)=2.D0
|
|
WRITE(6,604)
|
|
604 FORMAT(/' *** NOTE. IN CS CALCULATION MINUS/PLUS M-VALUE ',
|
|
& 'ASSUMED TO BE IDENTICAL.')
|
|
1400 MJMX=0
|
|
DO 1121 I=1,NLEV
|
|
1121 MJMX=MAX0(MJMX,JLEV(IOFF+I))
|
|
IF (JZCSMX.LT.0) GO TO 1221
|
|
WRITE(6,6221) JZCSMX
|
|
6221 FORMAT(' *** NOTE. CS OR DLD APPROXIMATION SUBSPACE IS ',
|
|
& 'LIMITED BY JZCSMX =',I3/13X,'CROSS SECTIONS BETWEEN HIGHER J ',
|
|
& 'INACCURATE.')
|
|
MJMX=MIN0(MJMX,JZCSMX)
|
|
1221 MXPAR=MJMX+1
|
|
IF (.NOT.MPLMIN) MXPAR=MXPAR+MJMX
|
|
IF (ITYPE.EQ.31 .OR. ITYPE.EQ.32 .OR. ITYPE.EQ.37)
|
|
1 MXPAR=MXPAR+MJMX
|
|
IF (ITYPE.EQ.23.AND.IDENT.NE.0) MXPAR=2*MXPAR
|
|
IF (ITYPE.EQ.25.AND.ISYM(1).NE.-1) MXPAR=ISYM(1)*MXPAR
|
|
C ADJUST SIG INDEX TO BE NEGATIVE IF J-VALUE IS GREATER THAN JZCSMX
|
|
LSIG=.FALSE.
|
|
IXT=(NQN-1)*NLEV
|
|
C MODIFIED FOR ITYPE=24 29 JUL 94 (SG)
|
|
IF (ITYPE.EQ.23.OR.ITYPE.EQ.24) THEN
|
|
IF (ITYPE.EQ.23) IOX=0
|
|
IF (ITYPE.EQ.24) IOX=2*NLEV
|
|
DO 2001 I=1,NLEV
|
|
C TWO ROTORS; COMPARE J1+J2 W/ MJMX
|
|
IF (JLEV(IOX+I)+JLEV(NLEV+I).LE.MJMX) GO TO 2001
|
|
JLEV(IXT+I)=-JLEV(IXT+I)
|
|
LSIG=.TRUE.
|
|
2001 CONTINUE
|
|
ELSE
|
|
DO 2002 I=1,NLEV
|
|
C ALL OTHER CASES; N.B. IOFF=0 FOR THESE (J IS 1ST QUANT NO.)
|
|
IF (JLEV(IOFF+I).LE.MJMX) GO TO 2002
|
|
JLEV(IXT+I)=-JLEV(IXT+I)
|
|
LSIG=.TRUE.
|
|
2002 CONTINUE
|
|
ENDIF
|
|
IF (LSIG) WRITE(6,672)
|
|
672 FORMAT(' *** NOTE. CROSS SECTIONS INCOMPLETE BECAUSE OF JZCSMX',
|
|
1 ' WILL BE MARKED NEGATIVE'/
|
|
2 ' AND PRINTED ONLY IF ISIGPR.GE.2')
|
|
GO TO 2000
|
|
C
|
|
C * * * ITYPE = 8 * * *
|
|
C ATOM - SURFACE SCATTERING: ADDED AT WATERLOO, DEC 1982
|
|
C
|
|
1008 NQN=3
|
|
C IVLFL SET TO REFLECT USE OF IV() ARRAY IN EXTANT ITYPE=8 CODES.
|
|
IVLFL=1
|
|
ASSIGN 3918 TO IGODG
|
|
QNAME(1)=QTYPE(4)
|
|
QNAME(2)=QTYPE(5)
|
|
CALL SET8(LEVIN,EIN,NLEV,JLEV,URED)
|
|
GO TO 2000
|
|
C
|
|
C FINAL BOOKKEEPING.
|
|
C
|
|
2000 IXNEXT = IXNEXT + NLEV*NQN
|
|
NQ = NQN
|
|
QNAME(NQN)=QTYPE(10)
|
|
C
|
|
IF (NLEVEL.LE.MXEL) GO TO 1224
|
|
WRITE(6,619) NLEVEL
|
|
619 FORMAT(/' **** ERROR IN BASE. NOT ENOUGH STORAGE FOR',I4,
|
|
1 ' LEVELS - TERMINATING')
|
|
STOP
|
|
1224 NLEVV=NLEV
|
|
ITYPP=ITYPE
|
|
ITYPX=ITYPE
|
|
IF (ITYPE-10*(ITYPE/10).EQ.7) ITYPX=ITYPE-5
|
|
C
|
|
WRITE(6,620) (QNAME(I),I=1,NQN)
|
|
620 FORMAT(/' LEVEL ENERGY(1/CM) ',10A8)
|
|
JJ=NLEV*(NQN-1)
|
|
DO 2100 I=1,NLEV
|
|
JTOP=JJ+I
|
|
2100 WRITE(6,621) I,ELEVEL(IABS(JLEV(JJ+I))),(JLEV(JI),JI=I,JTOP,NLEV)
|
|
621 FORMAT(1X,I4,F18.7,I6,9(I8) )
|
|
C
|
|
C ALLOW FOR INITIALIZATION OF COUPLE/MCGCPL ROUTINES
|
|
CALL COUPLX
|
|
CALL MCGCPX
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY DEGENF(J2,J1,DEGEN)
|
|
C
|
|
C RETURNS DEGENERACY FACTOR FOR DENOMINATOR OF CROSS-SECTION CALC.
|
|
C IN OUTPUT. J1 IS INITIAL, J2 IS FINAL LEVEL.
|
|
C MODIFIED AUG. 74 SO THAT LEVELS REFER TO JLEVEL VALUES.
|
|
C
|
|
GO TO IGODG,(3901,3902,3903,3904,3905,3906,3909,3911,3912,3913,
|
|
1 3915,3916,3918)
|
|
3901 JI=JLEVEL(J1)
|
|
DEGEN=DBLE(2*JI+1)
|
|
RETURN
|
|
3902 JI=JLEVEL(2*J1-1)
|
|
DEGEN=DBLE(2*JI+1)
|
|
RETURN
|
|
3903 JI1=JLEVEL(2*J1-1)
|
|
JI2=JLEVEL(2*J1)
|
|
DEGEN=DBLE((2*JI1+1)*(2*JI2+1))
|
|
IF (IDENT.EQ.0) RETURN
|
|
IF (JI1.EQ.JI2) DEGEN=DEGEN/2.D0
|
|
IF (JLEVEL(2*J2-1).EQ.JLEVEL(2*J2)) DEGEN=DEGEN/2.D0
|
|
RETURN
|
|
3904 JI1=JLEVEL(3*J1-2)
|
|
JI2=JLEVEL(3*J1)
|
|
DEGEN=DBLE((2*JI1+1)*(2*JI2+1))
|
|
RETURN
|
|
3905 JI=JLEVEL(3*J1-2)
|
|
DEGEN=DBLE(2*JI+1)
|
|
RETURN
|
|
3906 JI=JLEVEL(2*J1-1)
|
|
DEGEN=DBLE(2*JI+1)
|
|
RETURN
|
|
3909 CALL DEGEN9(J1,J2,DEGEN)
|
|
RETURN
|
|
C
|
|
C FOLLOWING ARE DEGENERACY DENOMINATORS FOR EPM COUNTING CORRECTION.
|
|
3911 JI1=JLEVEL(J1)
|
|
JF1=JLEVEL(J2)
|
|
DEGEN=SQRT(DBLE(2*JI1+1)/DBLE(2*JF1+1))
|
|
RETURN
|
|
3912 JI1=JLEVEL(2*J1-1)
|
|
JF1=JLEVEL(2*J2-1)
|
|
DEGEN=SQRT(DBLE(2*JI1+1)/DBLE(2*JF1+1))
|
|
RETURN
|
|
3913 JI1=JLEVEL(2*J1-1)
|
|
JI2=JLEVEL(2*J1)
|
|
JF1=JLEVEL(2*J2-1)
|
|
JF2=JLEVEL(2*J2)
|
|
DEGEN=SQRT(DBLE((2*JI1+1)*(2*JI2+1)) /
|
|
1 DBLE((2*JF1+1)*(2*JF2+1)) )
|
|
IF (IDENT.EQ.0) RETURN
|
|
IF (JI1.EQ.JI2) DEGEN=DEGEN/2.D0
|
|
IF (JF1.EQ.JF2) DEGEN=DEGEN/2.D0
|
|
RETURN
|
|
3915 JI1=JLEVEL(3*J1-2)
|
|
JF1=JLEVEL(3*J2-2)
|
|
DEGEN=SQRT(DBLE(2*JI1+1)/DBLE(2*JF1+1))
|
|
RETURN
|
|
3916 JI1=JLEVEL(2*J1-1)
|
|
JF1=JLEVEL(2*J2-1)
|
|
DEGEN=SQRT(DBLE(2*JI1+1)/DBLE(2*JF1+1))
|
|
RETURN
|
|
3918 DEGEN=1.D0
|
|
RETURN
|
|
END
|
|
SUBROUTINE CHCK6I(N,JL,A)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION JL(4,N),A(1)
|
|
DATA EPS/7.D-6/
|
|
WRITE(6,600)
|
|
600 FORMAT('0 CHCK6I. INPUT FUNCTIONS WILL BE CHECKED FOR ',
|
|
& 'ORTHOGONALITY.')
|
|
NERR=0
|
|
DO 1000 I1=2,N
|
|
DO 1000 I2=1,I1-1
|
|
C SEE IF SAME J-VALUE
|
|
IF (JL(1,I2).NE.JL(1,I1)) GO TO 1000
|
|
C CHECK THAT NK AGREE
|
|
NK1=2*JL(1,I1)+1
|
|
NK2=2*JL(1,I2)+1
|
|
3000 IF (NK1.EQ.NK2) GO TO 1001
|
|
WRITE(6,699) I1,I2,NK1,NK2
|
|
699 FORMAT('0 ***** CHCK6I ERROR. FOR LEVELS',2I4,', NK NOT EQUAL.',
|
|
& 2I5)
|
|
NERR=NERR+1
|
|
GO TO 1000
|
|
1001 SUM=0.D0
|
|
DO 1100 II=1,NK1
|
|
1100 SUM=SUM+A(JL(4,I1)+II)*A(JL(4,I2)+II)
|
|
IF (ABS(SUM).LE.EPS) GO TO 1000
|
|
WRITE(6,698) I1,I2,SUM
|
|
698 FORMAT('0 ***** CHCK6I ERROR. LEVEL',2I4,' ARE NOT ORTHOGONAL.',
|
|
& ' OVERLAP =',D12.4)
|
|
NERR=NERR+1
|
|
1000 CONTINUE
|
|
IF (NERR.LE.0) RETURN
|
|
WRITE(6,697) NERR
|
|
697 FORMAT('0 *****'/' ***** CHCK6I. NUMBER OF ERRORS =',I4/
|
|
1 ' ***** EXECUTION TERMINATING UNLESS CHCK6I MODIFIED'/
|
|
2 ' *****')
|
|
STOP
|
|
END
|
|
SUBROUTINE CHECK6(N,JL,A)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION JL(N,6),A(1)
|
|
DATA EPS/7.D-6/
|
|
WRITE(6,600)
|
|
600 FORMAT('0 CHECK6. INPUT FUNCTIONS WILL BE CHECKED FOR ',
|
|
& 'ORTHOGONALITY.')
|
|
NERR=0
|
|
DO 1000 I1=2,N
|
|
DO 1000 I2=1,I1-1
|
|
C SEE IF SAME J-VALUE
|
|
IF (JL(I2,1).NE.JL(I1,1)) GO TO 1000
|
|
C CHECK THAT NK AGREE
|
|
NK1=JL(I1,5)
|
|
NK2=JL(I2,5)
|
|
3000 IF (NK1.EQ.NK2) GO TO 1001
|
|
WRITE(6,699) I1,I2,NK1,NK2
|
|
699 FORMAT('0 ***** CHECK6 ERROR. FOR LEVELS',2I4,', NK NOT EQUAL.',
|
|
& 2I5)
|
|
NERR=NERR+1
|
|
GO TO 1000
|
|
1001 SUM=0.D0
|
|
DO 1100 II=1,NK1
|
|
1100 SUM=SUM+A(JL(I1,4)+II)*A(JL(I2,4)+II)
|
|
IF (ABS(SUM).LE.EPS) GO TO 1000
|
|
WRITE(6,698) I1,I2,SUM
|
|
698 FORMAT('0 ***** CHECK6 ERROR. LEVEL',2I4,' ARE NOT ORTHOGONAL.',
|
|
& ' OVERLAP =',D12.4)
|
|
NERR=NERR+1
|
|
1000 CONTINUE
|
|
IF (NERR.LE.0) RETURN
|
|
WRITE(6,697) NERR
|
|
697 FORMAT('0 *****'/' ***** CHECK6. NUMBER OF ERRORS =',I4/
|
|
1 ' ***** EXECUTION TERMINATING UNLESS CHECK6 MODIFIED'/
|
|
2 ' *****')
|
|
STOP
|
|
END
|
|
SUBROUTINE CHKSTR(NUSED)
|
|
C NEW ROUTINE FOR DYNAMIC STORAGE HANDLING (SG:1/21/93)
|
|
C REVISED 2 FEB 94 TO REFLECT USAGE OF UPPER X() IN HIH2O
|
|
C
|
|
C NUSED.LT.0 ON ENTRY RESETS HIH2O (HIGH-WATER MARK)
|
|
C ALSO RESETS MX=MAXMAX
|
|
C HIH2O DOES NOT REFLECT USE OF THE TOP OF X()
|
|
C NOTE: IT IS *NOT* NECESSARY TO PASS NUSED DOWN TO ALL ROUTINES
|
|
C WHICH CALL CHKSTR. HOWEVER, A NON-NEGATIVE VALUE MUST
|
|
C BE SUPPLIED TO PREVENT RESETTING HIH2O, MX.
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
INTEGER HIH2O
|
|
SAVE HIH2O,MAXMAX
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
DATA MAXMAX/0/
|
|
C
|
|
C NEGATIVE INPUT NUSED IS SIGNAL TO RESET HIH2O, MX
|
|
IF (NUSED.LT.0) THEN
|
|
HIH2O=0
|
|
MX=MAX0(MX,MAXMAX)
|
|
ENDIF
|
|
C
|
|
C STORAGE REQUIREMENT FOR CURRENT CALL IS ITOP=IXNEXT-1
|
|
ITOP=IXNEXT-1
|
|
IF (ITOP.GT.MX) THEN
|
|
WRITE(6,600) ITOP,MX,MAXMAX
|
|
600 FORMAT(/' CHKSTR. CANNOT PROVIDE REQUESTED STORAGE.'/
|
|
1 10X,'CURRENT REQUEST =',I12/
|
|
2 10X,'CURRENT LIMIT =',I12/
|
|
3 10X,'ORIGINAL LIMIT =',I12)
|
|
STOP
|
|
ELSE
|
|
MAXMAX=MAX(MAXMAX,MX)
|
|
NEED=ITOP+(MAXMAX-MX)
|
|
HIH2O=MAX(HIH2O,NEED)
|
|
NUSED=HIH2O
|
|
ENDIF
|
|
RETURN
|
|
END
|
|
SUBROUTINE COLIM(A,NLA,NUA,TOL,N)
|
|
C COMPUTES LIMITS FOR BAND OF SIGNIFICANT ELEMENTS IN COLUMNS OF A
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION A(1),NLA(1),NUA(1)
|
|
C FIND THE TOLERANCE LIMITS FOR THE TOPS(BEGINNINGS) OF THE
|
|
C COLUMNS OF A
|
|
NP1 = N + 1
|
|
NM1 = N - 1
|
|
LIMLO = 1
|
|
C THIS LOOP IS OVER THE COLUMNS OF A
|
|
DO 40 K=1,N
|
|
LIMHI = LIMLO + NM1
|
|
C THIS LOOP STARTS AT THE TOP OF THE K-TH COLUMN
|
|
DO 10 J=LIMLO,LIMHI
|
|
IF(ABS(A(J)).LE.TOL) GO TO 10
|
|
NLA(K) = J-LIMLO+1
|
|
GO TO 20
|
|
10 CONTINUE
|
|
C THIS IS REACHED ONLY IF ALL ELEMENTS IN THE K-TH COLUMN ARE TINY
|
|
NLA(K) = N
|
|
NUA(K) = 1
|
|
GO TO 40
|
|
20 CONTINUE
|
|
C FIND LIMITS FOR BOTTOMS OF COLUMNS
|
|
C THIS LOOP STARTS AT THE BOTTOM END OF THE K-TH COLUMN
|
|
DO 30 J=1,N
|
|
IF(ABS(A(LIMHI)).LE.TOL) GO TO 30
|
|
NUA(K) = NP1 - J
|
|
GO TO 40
|
|
30 LIMHI = LIMHI - 1
|
|
40 LIMLO = LIMLO + N
|
|
RETURN
|
|
END
|
|
SUBROUTINE CONVRG(J,SR,SI,SROLD,SIOLD)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE
|
|
C
|
|
C SUBROUTINE TO ASSIST IN THE ESTIMATION OF CONVERGENCE ERRORS
|
|
C
|
|
DIMENSION SR(1),SI(1),SROLD(1),SIOLD(1)
|
|
COMMON/DRIVE/STEST,STEPS,STABIL,XCONV,RMIN,RMAX,XEPS,
|
|
1 DRNOW,DRMAX,RMID,TOLHI,RTURN,VTOL,ESHIFT,ERED,RMLMDA,
|
|
2 NOPEN,JKEEP,ISCRU,MAXSTP
|
|
C
|
|
C CHARACTER*6 CNAMES
|
|
C DIMENSION CNAMES(3),LOCN(3),INDX(3)
|
|
C DATA CNAMES/'ICONVU','IVAR','DR'/
|
|
C DATA INDX/3*0/
|
|
NAMELIST/CONV/ICONVU,IVAR,DR
|
|
C
|
|
NOPSQ=NOPEN*NOPEN
|
|
IF(J.GT.1) GOTO 200
|
|
ISCRU=0
|
|
IVAR=0
|
|
DR=0.1D0
|
|
C------------------------------------------------------------------
|
|
C LOCN(1)=LOC(ICONVU)
|
|
C LOCN(2)=LOC(IVAR)
|
|
C LOCN(3)=LOC(DR)
|
|
C CALL NAMLIS('&CONV ',CNAMES,LOCN,INDX,3,IEOF)
|
|
C------------------------------------------------------------------
|
|
READ(5,CONV)
|
|
IF(ICONVU.LT.0) GOTO 200
|
|
NSQOLD=NOPSQ
|
|
DO 100 I=1,NOPSQ
|
|
SROLD(I)=SR(I)
|
|
100 SIOLD(I)=SI(I)
|
|
IF(ICONVU.EQ.0) GOTO 300
|
|
REWIND ICONVU
|
|
WRITE(ICONVU) NOPSQ
|
|
WRITE(ICONVU) (SROLD(I),I=1,NOPSQ)
|
|
WRITE(ICONVU) (SIOLD(I),I=1,NOPSQ)
|
|
GOTO 300
|
|
200 ICONVU=IABS(ICONVU)
|
|
IF(ICONVU.EQ.0) GOTO 300
|
|
REWIND(ICONVU)
|
|
READ(ICONVU) NSQOLD
|
|
READ(ICONVU) (SROLD(I),I=1,NSQOLD)
|
|
READ(ICONVU) (SIOLD(I),I=1,NSQOLD)
|
|
WRITE(6,601) ICONVU
|
|
601 FORMAT('0 CONVERGENCE TESTS: REFERENCE S-MATRIX READ IN FROM ',
|
|
1 'CHANNEL',I3)
|
|
300 IF(NOPSQ.NE.NSQOLD) GOTO 600
|
|
ERRSM=0.D0
|
|
ERRTP=0.D0
|
|
DO 400 I=1,NOPSQ
|
|
DIF = (SR(I)-SROLD(I))**2 + (SI(I)-SIOLD(I))**2
|
|
ERRSM=ERRSM+DIF
|
|
DIF = (SR(I)**2 - SROLD(I)**2 + SI(I)**2 - SIOLD(I)**2)**2
|
|
ERRTP=ERRTP+DIF
|
|
400 CONTINUE
|
|
C
|
|
ERRSM=SQRT(ERRSM/DBLE(NOPSQ))
|
|
ERRTP=SQRT(ERRTP/DBLE(NOPSQ))
|
|
XSM=LOG10(MAX(ERRSM,1.D-30))
|
|
XTP=LOG10(MAX(ERRTP,1.D-30))
|
|
WRITE(6,602) RMIN,RMAX,RMID,STEPS,DRNOW,ERRSM,XSM,ERRTP,XTP
|
|
602 FORMAT('0 FOR RMIN =',F7.2,' RMAX =',F7.2,' RMID =',F7.2,
|
|
1 ' STEPS =',F8.1,' DR =',F7.4/
|
|
2 ' RMS CHANGE IN S-MATRIX ELEMENTS IS ',7X,
|
|
3 E12.5,5X,'LOG IS',F8.3/
|
|
4 ' RMS CHANGE IN TRANSITION PROBABILITIES IS ',
|
|
5 E12.5,5X,'LOG IS',F8.3)
|
|
C
|
|
IF(IVAR.EQ.0) DRNOW=DRNOW+DRNOW
|
|
IF(IVAR.EQ.0) STEPS=STEPS/2.D0
|
|
IF(IVAR.EQ.1) RMIN=RMIN+DR
|
|
IF(IVAR.EQ.2) RMID=RMID-DR
|
|
IF(IVAR.EQ.3) RMAX=RMAX-DR
|
|
RETURN
|
|
C
|
|
600 WRITE(6,605) NOPSQ,NSQOLD
|
|
605 FORMAT('0*** ERROR IN CONVRG - NUMBER OF OPEN CHANNELS HAS ',
|
|
1 ' CHANGED'/5X,'NOPSQ =',I5,6X,'NSQOLD =',I5)
|
|
RETURN
|
|
END
|
|
* ----------------------------------------------------------------------
|
|
SUBROUTINE CORR (EIGNOW, EIGOLD, HP, DRNOW, DRMID, XLARGE,
|
|
: CDIAG, COFF, NCH)
|
|
* SUBROUTINE TO DETERMINE APPROXIMATE VALUES FOR DIAGONAL AND OFF-DIAGO
|
|
* CORRECTION TERMS IN AIRY PROPAGATOR
|
|
* ALSO COPIES NEW EIGENVALUES FROM ARRAY EIGNOW INTO ARRAY EIGOLD
|
|
* AUTHOR: MILLARD ALEXANDER
|
|
* CURRENT REVISION DATE: 27-SEPT-87
|
|
*
|
|
* ---------------------------------------------------------------------
|
|
* VARIABLES IN CALL LIST:
|
|
* EIGNOW: ON ENTRY: VECTOR CONTAINING EIGENVALUES OF WAVEVECTOR MA
|
|
* IN CURRENT INTERVAL
|
|
* EIGOLD: ON ENTRY: VECTOR CONTAINING EIGENVALUES OF WAVEVECTOR MA
|
|
* IN PREVIOUS INTERVAL
|
|
* ON RETURN: VECTOR CONTAINING EIGENVALUES OF WAVEVECTOR M
|
|
* IN CURRENT INTERVAL
|
|
* HP: VECTOR CONTAINING DIAGONAL ELEMENTS OF DERIVATIVE OF
|
|
* TRANSFORMED HAMILTONIAN MATRIX IN CURRENT INTERVAL
|
|
* THIS IS THE SAME AS THE NEGATIVE OF THE DIAGONAL ELEMENT
|
|
* THE WN-TILDE-PRIME MATRIX
|
|
* DRNOW: WIDTH OF CURRENT INTERVAL
|
|
* DRMID: DISTANCE BETWEEN MID-POINT OF CURRENT INTERVAL AND MID_P
|
|
* PREVIOUS INTERVAL
|
|
* XLARGE: LARGEST OFF-DIAGONAL ELEMTENT IN TRANSFORMED WAVEVECTOR
|
|
* IN CURRENT INTERVAL
|
|
* CDIAG: ON RETURN: CONTAINS ESTIMATE OF ERROR DUE TO NEGLECTED
|
|
* DIAGONAL ELEMENTS OF WN-TILDE-DOUBLE PRIME MATRIX
|
|
* SEE EQ.(29) OF M.H. ALEXANDER, "HYBRID QUANTUM SCATTERIN
|
|
* ALGORITHMS"
|
|
* COFF: ON RETURN: CONTAINS ESTIMATE OF ERROR DUE TO NEGLECTED
|
|
* OFF-DIAGONAL ELEMENTS OF WN-TILDE-PRIME MATRIX
|
|
* SEE EQ.(26) OF M.H. ALEXANDER, "HYBRID QUANTUM SCATTERIN
|
|
* ALGORITHMS"
|
|
* NCH: NUMBER OF CHANNELS
|
|
* ---------------------------------------------------------------------
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
* REAL CAY, CDIAG, COFF, DRMID, DRNOW, FACTOR, W2P, XLARGE
|
|
* REAL EIGNOW, EIGOLD, HP
|
|
* REAL SQRT
|
|
INTEGER I, NCH
|
|
* ARRAYS, MUST BE DIMENSIONED AT LEAST NCH
|
|
DIMENSION EIGNOW(1), EIGOLD(1), HP(1)
|
|
FACTOR = 2. / (DRMID**2)
|
|
CAY = 0.
|
|
CDIAG = 0.
|
|
DO 30 I = 1 , NCH
|
|
* ---------------------------------------------------------------------
|
|
* ESTIMATE SECOND DERIVATIVE OF WAVEVECTOR BY POWER SERIES EXPANSION
|
|
* 2 2 2
|
|
* W(R ) = W(R ) + (R - R ) (DW/DR) + 0.5 (R - R ) (D W/DR )
|
|
* 2 1 2 1 R 2 1 R
|
|
* 1 1
|
|
* WHICH CAN BE REARRANGED TO GIVE [SINCE DRMID = R - R AND HP = - (DW/
|
|
* 1 2
|
|
* 2 2 2
|
|
* (D W/DR ) = - 2 [ W(R ) - W(R ) + DRMID * HP(R ) ] / DRMID
|
|
* R 1 2
|
|
* 1
|
|
* ---------------------------------------------------------------------
|
|
W2P = - FACTOR * (EIGNOW(I) - EIGOLD(I) + DRMID * HP(I))
|
|
CDIAG = CDIAG + ABS(W2P)
|
|
CAY = CAY + SQRT (ABS(EIGNOW(I)))
|
|
30 CONTINUE
|
|
CAY = CAY / DBLE(NCH)
|
|
CDIAG = CDIAG / DBLE(NCH)
|
|
* CAY NOW CONTAINS AVERAGE WAVEVECTOR MAGNITUDE
|
|
* CDIAG NOW CONTAINS AVERAGE MAGNITUDE OF THE SECOND DERIVATIVE OF THE
|
|
* WAVEVECTOR ARRAY
|
|
* NOW CALCULATE ESTIMATE OF ERROR
|
|
CDIAG = (DRNOW**3) * CDIAG / 12.
|
|
COFF = CAY * XLARGE * (DRNOW**3) / 12.
|
|
* NOW COPY NEW EIGENVALUE ARRAY INTO EIGOLD
|
|
CALL DCOPY (NCH, EIGNOW, 1, EIGOLD, 1)
|
|
RETURN
|
|
END
|
|
SUBROUTINE COUPLE(N,ITYPE,MXLAM,NPOTL,LAM,NLEV,JLEV,J,L,JTOT,
|
|
1 VL,IV,IEX,PRINT)
|
|
C MODIFIED FOR ITYPE=4 BY SG 29 JUN 94
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE LFIRST
|
|
INTEGER PRINT
|
|
DIMENSION LAM(1),JLEV(NLEV,3),J(N),L(N)
|
|
DIMENSION VL(1),IV(1)
|
|
LOGICAL LFIRST,ODD
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
DATA EPS/1.D-10/
|
|
C CONST IS FACTOR (4.*PI)**(-3/2)
|
|
DATA CONST/2.24483902656458321D-2/
|
|
C
|
|
C STATEMENT FUNCTIONS
|
|
Z(I)=DBLE(I+I+1)
|
|
ODD(I)=I-2*(I/2).NE.0
|
|
C
|
|
SQRTHF=SQRT(.5D0)
|
|
C
|
|
IF (ITYPE.EQ.1 .OR. ITYPE.EQ.31) GO TO 8001
|
|
IF (ITYPE.EQ.2 .OR. ITYPE.EQ.32) GO TO 8002
|
|
IF (ITYPE.EQ.7 .OR. ITYPE.EQ.37) GO TO 8007
|
|
IF (ITYPE.EQ.3) GO TO 8003
|
|
IF (ITYPE.EQ.4) GO TO 8004
|
|
IF (ITYPE.EQ.5) GO TO 8005
|
|
IF (ITYPE.EQ.6) GO TO 8006
|
|
IF (ITYPE.EQ.11) GO TO 6001
|
|
IF (ITYPE.EQ.12) GO TO 6002
|
|
IF (ITYPE.EQ.13) GO TO 6003
|
|
IF (ITYPE.EQ.15) GO TO 6005
|
|
IF (ITYPE.EQ.16) GO TO 6006
|
|
IF (ITYPE.EQ.17) GO TO 6007
|
|
WRITE(6,698) ITYPE
|
|
698 FORMAT('0 * * * ERROR. COUPLING MATRIX ELEMENTS NOT IMPLEMENTED',
|
|
1 ' FOR ITYPE =',I12)
|
|
STOP
|
|
C
|
|
C COUPLING FOR ATOM + RIGID LINEAR ROTOR
|
|
C THIS VERSION BY JMH, JUNE 93, TO REDUCE NON-VECTORIZABLE CODE
|
|
C
|
|
8001 IF (IVLFL.NE.0) GO TO 9999
|
|
DO 1511 LL=1,MXLAM
|
|
NNZ=0
|
|
I=LL
|
|
JSAV=-1
|
|
LSAV=-1
|
|
ITJ=IXNEXT
|
|
ITL=ITJ+2*LAM(LL)+1
|
|
IT6=ITL+2*LAM(LL)+1
|
|
IXNEXT=IT6+2*LAM(LL)+1
|
|
J6JMAX=2*LAM(LL)+1
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
DO 1501 ICOL=1,N
|
|
JCOL=JLEV(J(ICOL),1)
|
|
C
|
|
C GET ALL ZERO-PROJECTION 3J SYMBOLS FOR THIS JCOL, LAMBDA
|
|
C
|
|
IF (JCOL.NE.JSAV) THEN
|
|
CALL J3J000(DBLE(JCOL),DBLE(LAM(LL)),IVALJ,X(ITJ),XJMIN)
|
|
JMIN=IABS(JCOL-LAM(LL))
|
|
JMAX=JCOL+LAM(LL)
|
|
JSAV=JCOL
|
|
ENDIF
|
|
C
|
|
C GET ALL ZERO-PROJECTION 3J SYMBOLS FOR THIS LCOL, LAMBDA
|
|
C
|
|
IF (L(ICOL).NE.LSAV) THEN
|
|
CALL J3J000(DBLE(L(ICOL)),DBLE(LAM(LL)),IVALL,X(ITL),XLMIN)
|
|
LMIN=IABS(L(ICOL)-LAM(LL))
|
|
LMAX=L(ICOL)+LAM(LL)
|
|
LSAV=L(ICOL)
|
|
ENDIF
|
|
LSAV6=-1
|
|
C
|
|
DO 1501 IROW=1,ICOL
|
|
JROW=JLEV(J(IROW),1)
|
|
IF (JROW.LT.JMIN .OR. JROW.GT.JMAX
|
|
1 .OR. L(IROW).LT.LMIN .OR. L(IROW).GT.LMAX
|
|
2 .OR. ODD(JROW+JMAX) .OR. ODD(L(IROW)+LMAX)) THEN
|
|
VL(I)=0.D0
|
|
ELSE
|
|
C
|
|
C GET ALL 6J SYMBOLS FOR THIS JCOL, LCOL, JROW, LAMBDA, JTOT,
|
|
C CHECKING WHETHER LROW HAS CHANGED SINCE THE LAST CALL TO J6J
|
|
C
|
|
IF (L(IROW).NE.LSAV6) THEN
|
|
IVAL6=J6JMAX
|
|
CALL J6J(DBLE(L(IROW)),DBLE(JTOT),DBLE(L(ICOL)),DBLE(JCOL),
|
|
1 DBLE(LAM(LL)),IVAL6,XJMIN6,X(IT6))
|
|
JMIN6=INT(XJMIN6)
|
|
LSAV6=L(IROW)
|
|
ENDIF
|
|
IF (JROW.LT.JMIN6 .OR. JROW.GE.JMIN6+IVAL6) THEN
|
|
VL(I)=0.D0
|
|
ELSE
|
|
C
|
|
C CALCULATE THE PERCIVAL-SEATON COEFFICIENT USING THE STORED
|
|
C 3-J AND 6-J SYMBOLS.
|
|
C
|
|
C ARRIVE HERE ONLY IF THE TRIANGLE RELATIONSHIPS ARE SATISFIED,
|
|
C AND IF JCOL+LAMBDA+JROW AND LCOL+LAMBDA+LROW ARE EVEN.
|
|
C NOTE THAT ONLY 3-J SYMBOLS FOR WHICH THIS IS TRUE ARE STORED.
|
|
C
|
|
INDJ=ITJ+(JROW-JMIN)/2
|
|
INDL=ITL+(L(IROW)-LMIN)/2
|
|
IND6=IT6+JROW-JMIN6
|
|
VL(I)=SQRT(Z(JCOL)*Z(JROW)*Z(L(ICOL))*Z(L(IROW)))
|
|
2 *X(INDJ)*X(INDL)*X(IND6)
|
|
IF (ODD(JCOL+JROW+JTOT)) VL(I)=-VL(I)
|
|
IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
ENDIF
|
|
ENDIF
|
|
1501 I=I+NPOTL
|
|
IF (NNZ.LE.0) WRITE(6,612) JTOT,LL
|
|
612 FORMAT(' * * * NOTE. FOR JTOT =',I4,', ALL COUPLING ',
|
|
1 'COEFFICIENTS ARE 0.0 FOR SYMMETRY',I4)
|
|
IXNEXT=ITJ
|
|
1511 CONTINUE
|
|
RETURN
|
|
C
|
|
C COUPLING FOR VIBROTOR - ATOM MAKING USE OF IV() (SG, JAN 94)
|
|
C
|
|
8002 IF (IVLFL.LE.0) GO TO 9999
|
|
II=NPOTL*N*(N+1)/2
|
|
DO 1542 I=1,II
|
|
VL(I)=0.D0
|
|
1542 IV(I)=0.D0
|
|
C
|
|
NZERO=0
|
|
DO 1522 LL=1,MXLAM
|
|
LLL=LAM(3*LL-2)
|
|
NV=LAM(3*LL-1)
|
|
NV1=LAM(3*LL)
|
|
NNZ=0
|
|
JSAV=-1
|
|
LSAV=-1
|
|
ITJ=IXNEXT
|
|
ITL=ITJ+2*LLL+1
|
|
IT6=ITL+2*LLL+1
|
|
IXNEXT=IT6+2*LLL+1
|
|
J6JMAX=2*LLL+1
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
II=0
|
|
DO 1512 ICOL=1,N
|
|
JVCOL=JLEV(J(ICOL),2)
|
|
IF(JVCOL.NE.NV .AND. JVCOL.NE.NV1) THEN
|
|
II=II+ICOL
|
|
GOTO 1512
|
|
ENDIF
|
|
JCOL=JLEV(J(ICOL),1)
|
|
C
|
|
C GET ALL ZERO-PROJECTION 3J SYMBOLS FOR THIS JCOL, LAMBDA
|
|
C
|
|
IF (JCOL.NE.JSAV) THEN
|
|
CALL J3J000(DBLE(JCOL),DBLE(LLL),IVALJ,X(ITJ),XJMIN)
|
|
JMIN=IABS(JCOL-LLL)
|
|
JMAX=JCOL+LLL
|
|
JSAV=JCOL
|
|
ENDIF
|
|
C
|
|
C GET ALL ZERO-PROJECTION 3J SYMBOLS FOR THIS LCOL, LAMBDA
|
|
C
|
|
IF (L(ICOL).NE.LSAV) THEN
|
|
CALL J3J000(DBLE(L(ICOL)),DBLE(LLL),IVALL,X(ITL),XLMIN)
|
|
LMIN=IABS(L(ICOL)-LLL)
|
|
LMAX=L(ICOL)+LLL
|
|
LSAV=L(ICOL)
|
|
ENDIF
|
|
LSAV6=-1
|
|
C
|
|
DO 1502 IROW=1,ICOL
|
|
JVROW=JLEV(J(IROW),2)
|
|
JROW=JLEV(J(IROW),1)
|
|
II=II+1
|
|
I=(II-1)*NPOTL+LLL+1
|
|
IF (.NOT.(JROW.LT.JMIN .OR. JROW.GT.JMAX
|
|
1 .OR. L(IROW).LT.LMIN .OR. L(IROW).GT.LMAX
|
|
2 .OR. ODD(JROW+JMAX) .OR. ODD(L(IROW)+LMAX))
|
|
3 .AND. (
|
|
4 (JVCOL.EQ.NV .AND. JVROW.EQ.NV1 )
|
|
5 .OR.
|
|
6 (JVCOL.EQ.NV1 .AND. JVROW.EQ.NV )
|
|
7 )) THEN
|
|
C
|
|
C GET ALL 6J SYMBOLS FOR THIS JCOL, LCOL, JROW, LAMBDA, JTOT,
|
|
C CHECKING WHETHER LROW HAS CHANGED SINCE THE LAST CALL TO J6J
|
|
C
|
|
IF (L(IROW).NE.LSAV6) THEN
|
|
IVAL6=J6JMAX
|
|
CALL J6J(DBLE(L(IROW)),DBLE(JTOT),DBLE(L(ICOL)),DBLE(JCOL),
|
|
1 DBLE(LLL),IVAL6,XJMIN6,X(IT6))
|
|
JMIN6=INT(XJMIN6)
|
|
LSAV6=L(IROW)
|
|
ENDIF
|
|
C
|
|
C CALCULATE THE PERCIVAL-SEATON COEFFICIENT USING THE STORED
|
|
C 3-J AND 6-J SYMBOLS.
|
|
C
|
|
C ARRIVE HERE ONLY IF THE TRIANGLE RELATIONSHIPS ARE SATISFIED,
|
|
C AND IF JCOL+LAMBDA+JROW AND LCOL+LAMBDA+LROW ARE EVEN.
|
|
C NOTE THAT ONLY 3-J SYMBOLS FOR WHICH THIS IS TRUE ARE STORED.
|
|
C
|
|
IF (JROW.GE.JMIN6 .AND. JROW.LT.JMIN6+IVAL6) THEN
|
|
INDJ=ITJ+(JROW-JMIN)/2
|
|
INDL=ITL+(L(IROW)-LMIN)/2
|
|
IND6=IT6+JROW-JMIN6
|
|
VL(I)=SQRT(Z(JCOL)*Z(JROW)*Z(L(ICOL))*Z(L(IROW)))
|
|
2 *X(INDJ)*X(INDL)*X(IND6)
|
|
IF (ODD(JCOL+JROW+JTOT)) VL(I)=-VL(I)
|
|
IF (VL(I).NE.0.D0) THEN
|
|
IV(I)=LL
|
|
NNZ=NNZ+1
|
|
ELSE
|
|
IV(I)=0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
1502 CONTINUE
|
|
1512 CONTINUE
|
|
IF (NNZ.LE.0) THEN
|
|
NZERO=NZERO+1
|
|
IF(PRINT.GE.14) WRITE(6,612) JTOT,LL
|
|
ENDIF
|
|
IXNEXT=ITJ
|
|
1522 CONTINUE
|
|
IF(NZERO.GT.0 .AND. PRINT.GT.0.AND.PRINT.LT.14)
|
|
1 WRITE(6,620) JTOT,NZERO
|
|
RETURN
|
|
C
|
|
C COUPLING MATRIX ELEMENTS FOR LINEAR ROTOR - LINEAR ROTOR.
|
|
C THESE ARE EVALUATED BY CPL3 USING STORED JTOT-INDEPENDENT
|
|
C PARTS. LFIRST INDICATES WHETHER THESE ARE ALREADY STORED.
|
|
C TO ALLOW STACKING &INPUT DECKS W/LASTIN=0, LFIRST MUST BE
|
|
C RESET BY CALL TO ENTRY COUPLX FOR EACH SET OF INPUT.
|
|
C
|
|
8003 IF (IVLFL.NE.0) GO TO 9999
|
|
CALL CPL3(N,MXLAM,LAM,NLEV,JLEV,J,L,JTOT,VL,IEX,PRINT,LFIRST)
|
|
RETURN
|
|
C
|
|
C ITYPE4 OBTAINED VIA CALL TO CPL4
|
|
8004 CALL CPL4(N,J,L,JTOT,MXLAM,LAM,VL,JLEV,JLEV,NLEV,PRINT,LFIRST)
|
|
RETURN
|
|
C
|
|
C *** ITYPE = 5 - NEAR SYMMETRIC TOP CODE
|
|
C N.B. JLEV(I,) HAS J, ABS(K), PARITY.
|
|
C *** MODIFIED SEPT. 75 FOR ODD MU VALUES . . .
|
|
C
|
|
8005 IF (IVLFL.NE.0) GO TO 9999
|
|
DO 1555 LL=1,MXLAM
|
|
NNZ=0
|
|
I=LL
|
|
LM=LAM(2*LL-1)
|
|
MU=LAM(2*LL)
|
|
DO 1565 ICOL=1,N
|
|
J1=JLEV(J(ICOL),1)
|
|
K1=JLEV(J(ICOL),2)
|
|
IS1=JLEV(J(ICOL),3)
|
|
DO 1565 IROW=1,ICOL
|
|
J2=JLEV(J(IROW),1)
|
|
K2=JLEV(J(IROW),2)
|
|
IS2=JLEV(J(IROW),3)
|
|
VL(I)=0.D0
|
|
C IV(I)=LL
|
|
PARFCT=(1.D0+PARITY3(J1+J2+IS1+IS2+LM+MU))*.5D0
|
|
IF (PARFCT.LT.EPS) GO TO 1565
|
|
C SPECIAL NORMALIZATION FOR K1 AND/OR K2 =0.
|
|
IF (K1.EQ.0) PARFCT=PARFCT*SQRTHF
|
|
IF (K2.EQ.0) PARFCT=PARFCT*SQRTHF
|
|
KDIF=K2-K1
|
|
IF (IABS(KDIF).NE.MU) GO TO 1505
|
|
WPAR=1.D0
|
|
IF (KDIF.LT.0) WPAR=PARITY3(MU)
|
|
C CONTRIBUTION FROM (J1,K1,L1/Y(LM,MU)/J2,K2,L2).
|
|
VL(I) = VL(I) +
|
|
& WPAR*PARFCT*FSYMTP(J1,K1,L(ICOL),J2,K2,L(IROW),JTOT,LM,KDIF)
|
|
1505 KSUM=K2+K1
|
|
IF (IABS(KSUM).NE.MU) GO TO 1515
|
|
C CONTRIBUTION FROM (J1,-K1,L1/ Y(LM,MU) / J2,K2,L2)
|
|
C N.B. FOR K1=0 AND/OR K2=0, WE RECOMPUTE SAME FSYMTP.
|
|
VL(I) = VL(I) +
|
|
1 PARFCT * PARITY3(IS1) *
|
|
2 FSYMTP(J1,-K1,L(ICOL),J2,K2,L(IROW),JTOT,LM,KSUM)
|
|
1515 IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
1565 I=I+NPOTL
|
|
IF (NNZ.EQ.0) WRITE(6,612) JTOT,LL
|
|
1555 CONTINUE
|
|
RETURN
|
|
C
|
|
C *** ITYPE=6 OBTAINED VIA CALL TO SET6/CPL6
|
|
C
|
|
8006 CALL CPL6(N,J,L,JTOT,MXLAM,LAM,VL,JLEV,JLEV,NLEV,PRINT,LFIRST)
|
|
RETURN
|
|
C
|
|
C *** ITYPE=7 MAKES NON-TRIVIAL USE OF THE IV ARRAY
|
|
C
|
|
8007 IF (IVLFL.LE.0) GO TO 9999
|
|
II=NPOTL*N*(N+1)/2
|
|
DO 1547 I=1,II
|
|
VL(I)=0.D0
|
|
IV(I)=0.D0
|
|
1547 CONTINUE
|
|
C
|
|
NZERO=0
|
|
DO 1527 LL=1,MXLAM
|
|
LLL=LAM(5*LL-4)
|
|
NV=LAM(5*LL-3)
|
|
NJ=LAM(5*LL-2)
|
|
NV1=LAM(5*LL-1)
|
|
NJ1=LAM(5*LL)
|
|
NNZ=0
|
|
JSAV=-1
|
|
LSAV=-1
|
|
ITJ=IXNEXT
|
|
ITL=ITJ+2*LLL+1
|
|
IT6=ITL+2*LLL+1
|
|
IXNEXT=IT6+2*LLL+1
|
|
J6JMAX=2*LLL+1
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
II=0
|
|
DO 1517 ICOL=1,N
|
|
JVCOL=JLEV(J(ICOL),2)
|
|
IF(JVCOL.NE.NV .AND. JVCOL.NE.NV1) THEN
|
|
II=II+ICOL
|
|
GOTO 1517
|
|
ENDIF
|
|
JCOL=JLEV(J(ICOL),1)
|
|
C
|
|
C GET ALL ZERO-PROJECTION 3J SYMBOLS FOR THIS JCOL, LAMBDA
|
|
C
|
|
IF (JCOL.NE.JSAV) THEN
|
|
CALL J3J000(DBLE(JCOL),DBLE(LLL),IVALJ,X(ITJ),XJMIN)
|
|
JMIN=IABS(JCOL-LLL)
|
|
JMAX=JCOL+LLL
|
|
JSAV=JCOL
|
|
ENDIF
|
|
C
|
|
C GET ALL ZERO-PROJECTION 3J SYMBOLS FOR THIS LCOL, LAMBDA
|
|
C
|
|
IF (L(ICOL).NE.LSAV) THEN
|
|
CALL J3J000(DBLE(L(ICOL)),DBLE(LLL),IVALL,X(ITL),XLMIN)
|
|
LMIN=IABS(L(ICOL)-LLL)
|
|
LMAX=L(ICOL)+LLL
|
|
LSAV=L(ICOL)
|
|
ENDIF
|
|
LSAV6=-1
|
|
C
|
|
DO 1507 IROW=1,ICOL
|
|
JVROW=JLEV(J(IROW),2)
|
|
JROW=JLEV(J(IROW),1)
|
|
II=II+1
|
|
I=(II-1)*NPOTL+LLL+1
|
|
IF (.NOT.(JROW.LT.JMIN .OR. JROW.GT.JMAX
|
|
1 .OR. L(IROW).LT.LMIN .OR. L(IROW).GT.LMAX
|
|
2 .OR. ODD(JROW+JMAX) .OR. ODD(L(IROW)+LMAX))
|
|
3 .AND. (
|
|
4 (JVCOL.EQ.NV.AND.JCOL.EQ.NJ .AND. JVROW.EQ.NV1.AND.JROW.EQ.NJ1)
|
|
5 .OR.
|
|
6 (JVCOL.EQ.NV1.AND.JCOL.EQ.NJ1 .AND. JVROW.EQ.NV.AND.JROW.EQ.NJ)
|
|
7 )) THEN
|
|
C
|
|
C GET ALL 6J SYMBOLS FOR THIS JCOL, LCOL, JROW, LAMBDA, JTOT,
|
|
C CHECKING WHETHER LROW HAS CHANGED SINCE THE LAST CALL TO J6J
|
|
C
|
|
IF (L(IROW).NE.LSAV6) THEN
|
|
IVAL6=J6JMAX
|
|
CALL J6J(DBLE(L(IROW)),DBLE(JTOT),DBLE(L(ICOL)),DBLE(JCOL),
|
|
1 DBLE(LLL),IVAL6,XJMIN6,X(IT6))
|
|
JMIN6=INT(XJMIN6)
|
|
LSAV6=L(IROW)
|
|
ENDIF
|
|
C
|
|
C CALCULATE THE PERCIVAL-SEATON COEFFICIENT USING THE STORED
|
|
C 3-J AND 6-J SYMBOLS.
|
|
C
|
|
C ARRIVE HERE ONLY IF THE TRIANGLE RELATIONSHIPS ARE SATISFIED,
|
|
C AND IF JCOL+LAMBDA+JROW AND LCOL+LAMBDA+LROW ARE EVEN.
|
|
C NOTE THAT ONLY 3-J SYMBOLS FOR WHICH THIS IS TRUE ARE STORED.
|
|
C
|
|
IF (JROW.GE.JMIN6 .AND. JROW.LT.JMIN6+IVAL6) THEN
|
|
INDJ=ITJ+(JROW-JMIN)/2
|
|
INDL=ITL+(L(IROW)-LMIN)/2
|
|
IND6=IT6+JROW-JMIN6
|
|
VL(I)=SQRT(Z(JCOL)*Z(JROW)*Z(L(ICOL))*Z(L(IROW)))
|
|
2 *X(INDJ)*X(INDL)*X(IND6)
|
|
IF (ODD(JCOL+JROW+JTOT)) VL(I)=-VL(I)
|
|
IF (VL(I).NE.0.D0) THEN
|
|
IV(I)=LL
|
|
NNZ=NNZ+1
|
|
ELSE
|
|
IV(I)=0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
1507 CONTINUE
|
|
1517 CONTINUE
|
|
IF (NNZ.LE.0) THEN
|
|
NZERO=NZERO+1
|
|
IF(PRINT.GE.14) WRITE(6,612) JTOT,LL
|
|
ENDIF
|
|
IXNEXT=ITJ
|
|
1527 CONTINUE
|
|
IF(NZERO.GT.0 .AND. PRINT.GT.0.AND.PRINT.LT.14)
|
|
1 WRITE(6,620) JTOT,NZERO
|
|
620 FORMAT(' * * * NOTE. FOR JTOT =',I4,', ALL COUPLING ',
|
|
1 'COEFFICIENTS ARE 0.0 FOR',I5,' POTENTIAL SYMMETRY TYPES')
|
|
RETURN
|
|
C
|
|
C CODING BELOW IS FOR EFFECTIVE POTENTIAL METHOD OF H. RABITZ.
|
|
C N.B. MATRIX ELEMENTS ARE INDEPENDENT OF JTOT (PARTIAL WAVE)
|
|
C AND COULD BE COMPUTED ONCE AND SAVED.
|
|
C
|
|
6001 IF (IVLFL.NE.0) GO TO 9999
|
|
DO 6100 LL=1,MXLAM
|
|
NNZ=0
|
|
I=LL
|
|
DO 6200 ICOL=1,N
|
|
J1P=JLEV(J(ICOL),1)
|
|
DO 6200 IROW=1,ICOL
|
|
J1=JLEV(J(IROW),1)
|
|
C IV(I)=LL
|
|
VL(I)=PARITY3((IABS(J1P-J1)+J1P+J1)/2) *
|
|
1 SQRT(SQRT(Z(J1P)*Z(J1))/Z(LAM(LL))) * THREEJ(J1P,LAM(LL),J1)
|
|
IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
6200 I=I+NPOTL
|
|
IF (NNZ.EQ.0) WRITE(6,612) JTOT,LL
|
|
6100 CONTINUE
|
|
RETURN
|
|
6002 IF (IVLFL.LE.0) GO TO 9999
|
|
NZERO=NPOTL*N*(N+1)/2
|
|
DO 6042 I=1,NZERO
|
|
VL(I)=0.D0
|
|
6042 IV(I)=0
|
|
NZERO=0
|
|
DO 6102 LL=1,MXLAM
|
|
LLL=LAM(3*LL-2)
|
|
NV=LAM(3*LL-1)
|
|
NV1=LAM(3*LL)
|
|
NNZ=0
|
|
II=0
|
|
DO 6202 ICOL=1,N
|
|
NVC=JLEV(J(ICOL),2)
|
|
NJC=JLEV(J(ICOL),1)
|
|
DO 6202 IROW=1,ICOL
|
|
NVR=JLEV(J(IROW),2)
|
|
NJR=JLEV(J(IROW),1)
|
|
II=II+1
|
|
IF((NV.EQ.NVC.AND.NV1.EQ.NVR) .OR. (NV.EQ.NVR.AND.NV1.EQ.NVC))
|
|
1 THEN
|
|
I=(II-1)*NPOTL+LLL+1
|
|
VL(I)=PARITY3((IABS(NJC-NJR)+NJC+NJR)/2) *
|
|
1 SQRT(SQRT(Z(NJC)*Z(NJR))/Z(LLL))*THREEJ(NJC,LLL,NJR)
|
|
IV(I)=LL
|
|
IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
ENDIF
|
|
6202 CONTINUE
|
|
IF (NNZ.GT.0) GO TO 6102
|
|
IF (PRINT.GE.14) WRITE(6,612) JTOT,LL
|
|
NZERO=NZERO+1
|
|
6102 CONTINUE
|
|
IF(NZERO.GT.0 .AND. PRINT.GT.0.AND.PRINT.LT.14)
|
|
1 WRITE(6,620) JTOT,NZERO
|
|
RETURN
|
|
6003 IF (IVLFL.NE.0) GO TO 9999
|
|
DO 6300 LL=1,MXLAM
|
|
NNZ=0
|
|
I=LL
|
|
LM1=LAM(3*LL-2)
|
|
LM2=LAM(3*LL-1)
|
|
LM=LAM(3*LL)
|
|
DO 6400 ICOL=1,N
|
|
J1P=JLEV(J(ICOL),1)
|
|
J2P=JLEV(J(ICOL),2)
|
|
DO 6400 IROW=1,ICOL
|
|
C IV(I)=LL
|
|
J1=JLEV(J(IROW),1)
|
|
J2=JLEV(J(IROW),2)
|
|
PARFCT=PARITY3((IABS(J1+J2-J1P-J2P)+J1+J2+J1P+J2P)/2)
|
|
1 *CONST*SQRT(Z(LM)*SQRT(Z(J1)*Z(J2)*Z(J1P)*Z(J2P)))
|
|
VL(I) = PARFCT*THREEJ(J1,LM1,J1P)*THREEJ(J2,LM2,J2P)
|
|
IF (IEX.EQ.0) GO TO 6093
|
|
C
|
|
C *** N.B. THE FORMULATION BELOW ASSUMES THAT POTENTIAL IS SYMMETRIC TO
|
|
C *** INTERCHANGE OF L1, L2. I.E. A(L1,L2,L) = A(L2,L1,L) MUST BOTH
|
|
C *** BE PRESENT IN INTERACTION POTENTIAL.
|
|
VL(I)=VL(I)+PARITY3(IEX+JTOT)*PARFCT
|
|
1 *THREEJ(J1,LM1,J2P)*THREEJ(J2,LM2,J1P)
|
|
IF (J1.EQ.J2) VL(I)=VL(I)*SQRTHF
|
|
IF (J1P.EQ.J2P) VL(I)=VL(I)*SQRTHF
|
|
6093 IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
6400 I=I+NPOTL
|
|
6300 CONTINUE
|
|
RETURN
|
|
6005 IF (IVLFL.NE.0) GO TO 9999
|
|
DO 6555 LL=1,MXLAM
|
|
NNZ=0
|
|
I=LL
|
|
LM=LAM(2*LL-1)
|
|
MU=LAM(2*LL)
|
|
DO 6565 ICOL=1,N
|
|
J1=JLEV(J(ICOL),1)
|
|
K1=JLEV(J(ICOL),2)
|
|
IS1=JLEV(J(ICOL),3)
|
|
DO 6565 IROW=1,ICOL
|
|
J2=JLEV(J(IROW),1)
|
|
K2=JLEV(J(IROW),2)
|
|
IS2=JLEV(J(IROW),3)
|
|
C IV(I)=LL
|
|
VL(I)=0.D0
|
|
PARFCT=(1.D0+PARITY3(J1+J2+IS1+IS2+LM+MU))*.5D0
|
|
IF (PARFCT.LT.EPS) GO TO 6565
|
|
IF (K1.EQ.0) PARFCT=PARFCT*SQRTHF
|
|
IF (K2.EQ.0) PARFCT=PARFCT*SQRTHF
|
|
KDIF=K2-K1
|
|
IF (IABS(KDIF).NE.MU) GO TO 6505
|
|
WPAR=1.D0
|
|
IF (KDIF.LT.0) WPAR=PARITY3(MU)
|
|
VL(I)=VL(I)+WPAR*PARFCT*ESYMTP(J1,K1,J2,K2,LM,KDIF)
|
|
6505 KSUM=K2+K1
|
|
IF (IABS(KSUM).NE.MU) GO TO 6515
|
|
C (J1, -K1 / Y(LM,MU) / J2, K2) - - - - -
|
|
VL(I)=VL(I)+PARFCT*PARITY3(IS1)*ESYMTP(J1,-K1,J2,K2,LM,KSUM)
|
|
6515 IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
6565 I=I+NPOTL
|
|
IF (NNZ.EQ.0) WRITE(6,612) JTOT,LL
|
|
6555 CONTINUE
|
|
RETURN
|
|
C
|
|
6006 CALL ASYME(N,J,L,MXLAM,LAM,VL,IV,JLEV,JLEV,NLEV)
|
|
RETURN
|
|
C
|
|
6007 IF (IVLFL.LE.0) GO TO 9999
|
|
NZERO=NPOTL*N*(N+1)/2
|
|
DO 6047 I=1,NZERO
|
|
VL(I)=0.D0
|
|
6047 IV(I)=0
|
|
NZERO=0
|
|
DO 6017 LL=1,MXLAM
|
|
LLL=LAM(5*LL-4)
|
|
NV=LAM(5*LL-3)
|
|
NJ=LAM(5*LL-2)
|
|
NV1=LAM(5*LL-1)
|
|
NJ1=LAM(5*LL)
|
|
NNZ=0
|
|
II=0
|
|
DO 6057 ICOL=1,N
|
|
NVC=JLEV(J(ICOL),2)
|
|
NJC=JLEV(J(ICOL),1)
|
|
DO 6057 IROW=1,ICOL
|
|
NVR=JLEV(J(IROW),2)
|
|
NJR=JLEV(J(IROW),1)
|
|
II=II+1
|
|
IF (.NOT.(
|
|
1 (NV.EQ.NVC.AND.NJ.EQ.NJC .AND. NV1.EQ.NVR.AND.NJ1.EQ.NJR) .OR.
|
|
2 (NV.EQ.NVR.AND.NJ.EQ.NJR .AND. NV1.EQ.NVC.AND.NJ1.EQ.NJC)))
|
|
3 GO TO 6057
|
|
I=(II-1)*NPOTL+LLL+1
|
|
VL(I)=PARITY3((IABS(NJC-NJR)+NJC+NJR)/2) *
|
|
1 SQRT(SQRT(Z(NJC)*Z(NJR))/Z(LLL))*THREEJ(NJC,LLL,NJR)
|
|
IV(I)=LL
|
|
NNZ=NNZ+1
|
|
6057 CONTINUE
|
|
IF (NNZ.GT.0) GO TO 6017
|
|
IF (PRINT.GE.14) WRITE(6,612) JTOT,LL
|
|
NZERO=NZERO+1
|
|
6017 CONTINUE
|
|
IF(NZERO.GT.0 .AND. PRINT.GT.0.AND.PRINT.LT.14)
|
|
1 WRITE(6,620) JTOT,NZERO
|
|
RETURN
|
|
C
|
|
9999 WRITE(6,699) IVLFL,ITYPE
|
|
699 FORMAT(/' COUPLE (JAN 93). IVLFL =',I6,
|
|
1 ' INCONSISTENT WITH ITYPE =',I6)
|
|
STOP
|
|
C
|
|
ENTRY COUPLX
|
|
LFIRST=.TRUE.
|
|
RETURN
|
|
END
|
|
SUBROUTINE CPL21(N,MXLAM,LAM,NLEV,JLEV,J,MVALUE,VL,PRINT,LFIRST)
|
|
C
|
|
C 30 DEC 93. INCORPORATES JMH (V12) USE OF J3J000
|
|
C ALL MV = 0,MAX(MVALUE) ARE CALCULATED EVEN IF LOWER ONES ARE
|
|
C NOT NEEDED, E.G., BECAUSE OF MSET,MHI.
|
|
C CS COUPLING MATRIX FOR LINEAR ROTOR-ATOM (ITYPE=21)
|
|
C SAVES COUPLING COEFFICIENTS USING NEW DYNAMIC STORAGE
|
|
C N.B. IV() IS NO LONGER USED; CONTROLLED BY IVLFL IN /MEMORY/
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE NOMEM,NL12,IXMX,ISTART,IFIRST
|
|
C SPECIFICATIONS FOR ARGUMENTS
|
|
DIMENSION LAM(MXLAM),JLEV(NLEV),J(N),VL(1)
|
|
INTEGER PRINT
|
|
LOGICAL LFIRST
|
|
C
|
|
LOGICAL ODD,NOMEM
|
|
DATA Z0/0.D0/
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C STATEMENT FUNCTION DEFINITIONS
|
|
Z(I)=DBLE(I+I+1)
|
|
ODD(I)=I-2*(I/2).NE.0
|
|
C
|
|
C IF LFIRST IS TRUE (FIRST CALL), DO SOME INITIALIZATION
|
|
IF (LFIRST) THEN
|
|
IFIRST=-1
|
|
LFIRST=.FALSE.
|
|
NOMEM=.FALSE.
|
|
ENDIF
|
|
C
|
|
XM=MVALUE
|
|
PM=1.D0
|
|
IF (ODD(MVALUE)) PM=-1.D0
|
|
C
|
|
IF (IFIRST.GT.-1) GO TO 3500
|
|
C FIRST TIME THROUGH SET UP SOME STORAGE POINTERS
|
|
NL12=NLEV*(NLEV+1)/2
|
|
IXMX=NL12*MXLAM
|
|
ISTART=MX+1
|
|
C
|
|
3500 MVABS=IABS(MVALUE)
|
|
C SEE IF VALUES ARE STORED FOR THIS HIGH AN MVALUE
|
|
C IF NOT, TRY TO STORE THEM IN XCPL().
|
|
IF (MVABS.LE.IFIRST.OR.NOMEM) GO TO 3900
|
|
MV=IFIRST+1
|
|
C FIRST CHECK THAT WE STILL HAVE A CONTINUOUS BLOCK OF HI MEMORY.
|
|
3600 IF (MX.EQ.ISTART-(IFIRST+1)*IXMX-1) GO TO 3610
|
|
IF (PRINT.GE.1) WRITE(6,602) MV,ISTART-1,MX,IXMX*(IFIRST+1)
|
|
602 FORMAT(/' CPL21 (FEB 93). HIGH MEMORY FRAGMENTED. CANNOT',
|
|
1 ' STORE COUPLING COEFFS FOR MVAL=',I3/ 19X,
|
|
2 'ORIGINAL MINUS CURRENT MEMORY LIMITS .NE. NO. USED =',3I12)
|
|
NOMEM=.TRUE.
|
|
GO TO 3900
|
|
C TEST FOR AVAILABLE STORAGE; NEED IXMX FOR THIS MVAL
|
|
3610 NAVAIL=MX-IXNEXT+1
|
|
IF (IXMX.LE.NAVAIL) GO TO 3601
|
|
IF (PRINT.GE.3) WRITE(6,692) MV,IXMX,NAVAIL
|
|
692 FORMAT(/' CPL21 (FEB 93). UNABLE TO STORE 3-J VALUES FOR MVAL='
|
|
1 ,I3/' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C SET NOMEM TO REFLECT INABILITY TO ADD MORE M-VALUES
|
|
NOMEM=.TRUE.
|
|
GO TO 3900
|
|
C
|
|
C REDUCE 'TOP OF MEMORY' AND STORE COUPLING VALUES FOR THIS MVAL
|
|
C START INDEX AFTER M-BLOCKS ALREADY STORED (STARTING W/ MV=0)
|
|
3601 MX=MX-IXMX
|
|
IX=MV*IXMX
|
|
C
|
|
PMV=1.D0
|
|
IF (ODD(MV)) PMV=-1.D0
|
|
DO 3200 IL=1,MXLAM
|
|
LM=LAM(IL)
|
|
JSAV=-1
|
|
ITJ=IXNEXT
|
|
IXNEXT=ITJ+LM+LM+1
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
DO 3201 I1=1,NLEV
|
|
J1=JLEV(I1)
|
|
IF (J1.NE.JSAV) THEN
|
|
CALL J3J000(DBLE(J1),DBLE(LM),IVALJ,X(ITJ),XJMIN)
|
|
JMIN=IABS(J1-LM)
|
|
JMAX=J1+LM
|
|
JSAV=J1
|
|
ENDIF
|
|
DO 3201 I2=1,I1
|
|
J2=JLEV(I2)
|
|
IX=IX+1
|
|
IF (J2.LT.JMIN .OR. J2.GT.JMAX
|
|
1 .OR. J1.LT.MV .OR. J2.LT.MV
|
|
1 .OR. ODD(J2+JMAX)) THEN
|
|
X(ISTART-IX)=0.D0
|
|
ELSE
|
|
INDJ=ITJ+(J2-JMIN)/2
|
|
IF (MV.EQ.0) THEN
|
|
X(ISTART-IX)=PMV*SQRT(Z(J1)*Z(J2))*X(INDJ)**2
|
|
ELSE
|
|
X(ISTART-IX)=PMV*SQRT(Z(J1)*Z(J2))*X(INDJ)*
|
|
1 THRJ(DBLE(J1),DBLE(LM),DBLE(J2),-DBLE(MV),0.D0,DBLE(MV))
|
|
ENDIF
|
|
ENDIF
|
|
3201 CONTINUE
|
|
3200 IXNEXT=ITJ
|
|
C
|
|
IF (PRINT.GT.3) WRITE(6,693) MV,IXMX,NAVAIL
|
|
693 FORMAT(/' CPL21 (FEB 93). 3-J VALUES STORED FOR MVAL =',I3
|
|
1 /' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C
|
|
C RESET IFIRST TO REFLECT HIGHEST M-VALUE STORED.
|
|
IFIRST=MV
|
|
C
|
|
C SEE IF CURRENT MVALUE REQUIRES MORE STORED M-VALUES.
|
|
MV=MV+1
|
|
IF (MV.LE.MVABS) GO TO 3600
|
|
C
|
|
3900 IF (MVABS.GT.IFIRST) GO TO 3800
|
|
C MVABS.LE.IFIRST. COEFFS STORED. FILL VL() FROM XCPL
|
|
IXM=MVABS*IXMX
|
|
DO 3513 LL=1,MXLAM
|
|
NNZ=0
|
|
I=LL
|
|
LM=LAM(LL)
|
|
DO 3503 ICOL=1,N
|
|
I1=J(ICOL)
|
|
J1=JLEV(I1)
|
|
DO 3503 IROW=1,ICOL
|
|
I2=J(IROW)
|
|
J2=JLEV(I2)
|
|
IF (I1.GT.I2) THEN
|
|
IX12=I1*(I1-1)/2+I2
|
|
ELSE
|
|
IX12=I2*(I2-1)/2+I1
|
|
ENDIF
|
|
IX=IXM+(LL-1)*NL12+IX12
|
|
VL(I)=X(ISTART-IX)
|
|
C WE HAVE STORED COUPLING FOR POSITIVE MVALUES; CORRECT IF NECESSARY
|
|
IF (MVALUE.LT.0.AND.ODD(J1+J2+LM)) VL(I)=-VL(I)
|
|
3593 IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
3503 I=I+MXLAM
|
|
IF (NNZ.LE.0 .AND. PRINT.GE.3) WRITE(6,612) MVALUE,LL
|
|
612 FORMAT(' * * * NOTE. FOR MVALUE, SYM =',2I4,', ALL COUPLING ',
|
|
& 'COEFFICIENTS ARE 0.')
|
|
3513 CONTINUE
|
|
RETURN
|
|
C
|
|
C MV.GT.IFIRST ==> VALUES NOT STORED. CALCULATE THEM
|
|
3800 DO 1511 LL=1,MXLAM
|
|
LM=LAM(LL)
|
|
XLM=LM
|
|
NNZ=0
|
|
I=LL
|
|
DO 1501 ICOL=1,N
|
|
JCOL=JLEV(J(ICOL) )
|
|
XJCOL=JCOL
|
|
DO 1501 IROW=1,ICOL
|
|
JROW=JLEV(J(IROW) )
|
|
XJROW=JROW
|
|
VL(I)=PM*SQRT(Z(JROW)*Z(JCOL))*
|
|
& THREEJ(JROW,LM,JCOL)*
|
|
& THRJ(XJROW,XLM,XJCOL,-XM,Z0,XM)
|
|
IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
1501 I=I+MXLAM
|
|
IF (NNZ.LE.0 .AND. PRINT.GE.3) WRITE(6,612) MVALUE,LL
|
|
1511 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE CPL22(N,MXLAM,NPOTL,LAM,NLEV,JLEV,J,MVALUE,
|
|
1 IV,VL,PRINT,LFIRST)
|
|
C
|
|
C CS COUPLING MATRIX FOR VIBRATING ROTOR-ATOM (ITYPE=22)
|
|
C SG (MAR 94) USES IV(), I.E., IVLFL=1
|
|
C SAVES COUPLING MATRIX FOR MV=0,MX IN UPPER X() ARRAY
|
|
C USES J3J000 ROUTINE AS PER JMH CPL21 CODE
|
|
C STORES ON J OR NLEV, DEPENDING ON WHICH IS SMALLER
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE NOMEM,NL12,IXMX,ISTART,IFIRST,LOGIX,JTOP
|
|
C SPECIFICATIONS FOR ARGUMENTS
|
|
DIMENSION LAM(3,MXLAM),JLEV(NLEV),J(N),VL(1),IV(1)
|
|
INTEGER PRINT
|
|
LOGICAL LFIRST
|
|
C
|
|
LOGICAL ODD,NOMEM,LOGIX
|
|
DATA Z0/0.D0/
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C STATEMENT FUNCTION DEFINITIONS
|
|
Z(I)=DBLE(I+I+1)
|
|
ODD(I)=I-2*(I/2).NE.0
|
|
C
|
|
C IF LFIRST IS TRUE (FIRST CALL), DO SOME INITIALIZATION
|
|
IF (LFIRST) THEN
|
|
IFIRST=-1
|
|
LFIRST=.FALSE.
|
|
NOMEM=.FALSE.
|
|
ENDIF
|
|
C
|
|
XM=MVALUE
|
|
PM=1.D0
|
|
IF (ODD(MVALUE)) PM=-1.D0
|
|
C
|
|
IF (IFIRST.GT.-1) GO TO 3500
|
|
C FIRST TIME THROUGH SET UP SOME STORAGE POINTERS.
|
|
C LOGIX=.TRUE. IF JTOP IS SMALLER THAN NLEV (SO STORE ON J)
|
|
JTOP=0
|
|
DO 3400 I=1,NLEV
|
|
3400 JTOP=MAX(JTOP,JLEV(I))
|
|
LOGIX=JTOP.LT.NLEV
|
|
IF (LOGIX) THEN
|
|
NL12=(JTOP+1)*(JTOP+2)/2
|
|
ELSE
|
|
NL12=NLEV*(NLEV+1)/2
|
|
ENDIF
|
|
IXMX=NL12*NPOTL
|
|
ISTART=MX+1
|
|
C
|
|
3500 MVABS=IABS(MVALUE)
|
|
C SEE IF VALUES ARE STORED FOR THIS HIGH AN MVALUE
|
|
C IF NOT, TRY TO STORE THEM IN XCPL().
|
|
IF (MVABS.LE.IFIRST.OR.NOMEM) GO TO 3900
|
|
MV=IFIRST+1
|
|
C FIRST CHECK THAT WE STILL HAVE A CONTINUOUS BLOCK OF HI MEMORY.
|
|
3600 IF (MX.EQ.ISTART-(IFIRST+1)*IXMX-1) GO TO 3610
|
|
IF (PRINT.GE.1) WRITE(6,602) MV,ISTART-1,MX,IXMX*(IFIRST+1)
|
|
602 FORMAT(/' CPL22 (FEB 93). HIGH MEMORY FRAGMENTED. CANNOT',
|
|
1 ' STORE COUPLING COEFFS FOR MVAL=',I3/ 19X,
|
|
2 'ORIGINAL MINUS CURRENT MEMORY LIMITS .NE. NO. USED =',3I12)
|
|
NOMEM=.TRUE.
|
|
GO TO 3900
|
|
C TEST FOR AVAILABLE STORAGE; NEED IXMX FOR THIS MVAL
|
|
3610 NAVAIL=MX-IXNEXT+1
|
|
IF (IXMX.LE.NAVAIL) GO TO 3601
|
|
IF (PRINT.GE.3) WRITE(6,692) MV,IXMX,NAVAIL
|
|
692 FORMAT(/' CPL22 (FEB 93). UNABLE TO STORE 3-J VALUES FOR MVAL='
|
|
1 ,I3/' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C SET NOMEM TO REFLECT INABILITY TO ADD MORE M-VALUES
|
|
NOMEM=.TRUE.
|
|
GO TO 3900
|
|
C
|
|
C REDUCE 'TOP OF MEMORY' AND STORE COUPLING VALUES FOR THIS MVAL
|
|
C START INDEX AFTER M-BLOCKS ALREADY STORED (STARTING W/ MV=0)
|
|
3601 MX=MX-IXMX
|
|
IX=MV*IXMX
|
|
C
|
|
PMV=1.D0
|
|
IF (ODD(MV)) PMV=-1.D0
|
|
C CODE BELOW FROM V12 (DEC 94) CPL21 CODE
|
|
C EXCEPT LIMIT ON IL LOOP AND VALUE OF LM
|
|
IF (LOGIX) THEN
|
|
ITOP=JTOP+1
|
|
ELSE
|
|
ITOP=NLEV
|
|
ENDIF
|
|
DO 3200 IL=1,NPOTL
|
|
LM=IL-1
|
|
JSAV=-1
|
|
ITJ=IXNEXT
|
|
IXNEXT=ITJ+LM+LM+1
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
DO 3201 I1=1,ITOP
|
|
IF (LOGIX) THEN
|
|
J1=I1-1
|
|
ELSE
|
|
J1=JLEV(I1)
|
|
ENDIF
|
|
IF (J1.NE.JSAV) THEN
|
|
CALL J3J000(DBLE(J1),DBLE(LM),IVALJ,X(ITJ),XJMIN)
|
|
JMIN=IABS(J1-LM)
|
|
JMAX=J1+LM
|
|
JSAV=J1
|
|
ENDIF
|
|
DO 3201 I2=1,I1
|
|
IF (LOGIX) THEN
|
|
J2=I2-1
|
|
ELSE
|
|
J2=JLEV(I2)
|
|
ENDIF
|
|
IX=IX+1
|
|
IF (J2.LT.JMIN .OR. J2.GT.JMAX
|
|
1 .OR. J1.LT.MV .OR. J2.LT.MV
|
|
1 .OR. ODD(J2+JMAX)) THEN
|
|
X(ISTART-IX)=0.D0
|
|
ELSE
|
|
INDJ=ITJ+(J2-JMIN)/2
|
|
IF (MV.EQ.0) THEN
|
|
X(ISTART-IX)=PMV*SQRT(Z(J1)*Z(J2))*X(INDJ)**2
|
|
ELSE
|
|
X(ISTART-IX)=PMV*SQRT(Z(J1)*Z(J2))*X(INDJ)*
|
|
1 THRJ(DBLE(J1),DBLE(LM),DBLE(J2),-DBLE(MV),0.D0,DBLE(MV))
|
|
ENDIF
|
|
ENDIF
|
|
3201 CONTINUE
|
|
3200 IXNEXT=ITJ
|
|
C
|
|
IF (PRINT.GT.3) WRITE(6,693) MV,IXMX,NAVAIL
|
|
693 FORMAT(/' CPL22 (FEB 93). 3-J VALUES STORED FOR MVAL =',I3
|
|
1 /' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C
|
|
C RESET IFIRST TO REFLECT HIGHEST M-VALUE STORED.
|
|
IFIRST=MV
|
|
C
|
|
C SEE IF CURRENT MVALUE REQUIRES MORE STORED M-VALUES.
|
|
MV=MV+1
|
|
IF (MV.LE.MVABS) GO TO 3600
|
|
C
|
|
C START BY ZEROING VL, IV ARRAYS
|
|
3900 NTOP=NPOTL*N*(N+1)/2
|
|
DO 3999 I=1,NTOP
|
|
VL(I)=0.D0
|
|
3999 IV(I)=0
|
|
IF (MVABS.GT.IFIRST) GO TO 3800
|
|
C MVABS.LE.IFIRST. COEFFS STORED. FILL VL() FROM XCPL
|
|
IXM=MVABS*IXMX
|
|
DO 3513 LL=1,MXLAM
|
|
NNZ=0
|
|
LM=LAM(1,LL)
|
|
NV=LAM(2,LL)
|
|
NV1=LAM(3,LL)
|
|
C ICR COUNTS ICOL,IROW LOOP; NEEDED FOR IXVL (VL INDEX)
|
|
ICR=0
|
|
DO 3503 ICOL=1,N
|
|
I1=J(ICOL)
|
|
J1=JLEV(I1)
|
|
NVC=JLEV(NLEV+I1)
|
|
DO 3503 IROW=1,ICOL
|
|
I2=J(IROW)
|
|
J2=JLEV(I2)
|
|
NVR=JLEV(NLEV+I2)
|
|
ICR=ICR+1
|
|
IF((NV.EQ.NVC.AND.NV1.EQ.NVR) .OR. (NV.EQ.NVR.AND.NV1.EQ.NVC))
|
|
1 THEN
|
|
C FIRST GET INDEX IN VL, IV
|
|
IXVL=(ICR-1)*NPOTL+LM+1
|
|
C THEN GET INDEX OF STORED COUPLING COEFFICIENT, DEPENDING ON LOGIX
|
|
IF (LOGIX) THEN
|
|
IF (J1.GT.J2) THEN
|
|
IX12=(J1+1)*J1/2+J2+1
|
|
ELSE
|
|
IX12=(J2+1)*J2/2+J1+1
|
|
ENDIF
|
|
ELSE
|
|
IF (I1.GT.I2) THEN
|
|
IX12=I1*(I1-1)/2+I2
|
|
ELSE
|
|
IX12=I2*(I2-1)/2+I1
|
|
ENDIF
|
|
ENDIF
|
|
IX=IXM+LM*NL12+IX12
|
|
IV(IXVL)=LL
|
|
VL(IXVL)=X(ISTART-IX)
|
|
IF (VL(IXVL).NE.0.D0) NNZ=NNZ+1
|
|
C WE HAVE STORED COUPLING FOR POSITIVE MVALUES; CORRECT IF NEC
|
|
IF (MVALUE.LT.0.AND.ODD(J1+J2+LM)) VL(IXVL)=-VL(IXVL)
|
|
ENDIF
|
|
3503 CONTINUE
|
|
IF (NNZ.LE.0 .AND. PRINT.GT.3) WRITE(6,612) MVALUE,LL
|
|
612 FORMAT(' * * * NOTE. FOR MVALUE, SYM =',2I4,', ALL COUPLING ',
|
|
& 'COEFFICIENTS ARE 0.')
|
|
3513 CONTINUE
|
|
RETURN
|
|
C
|
|
C MV.GT.IFIRST ==> VALUES NOT STORED. CALCULATE THEM
|
|
3800 DO 1511 LL=1,MXLAM
|
|
LM=LAM(1,LL)
|
|
NV=LAM(2,LL)
|
|
NV1=LAM(3,LL)
|
|
XLM=LM
|
|
NNZ=0
|
|
C ICR COUNTS ICOL,IROW LOOP; NEEDED FOR IXVL (VL INDEX)
|
|
ICR=0
|
|
DO 1501 ICOL=1,N
|
|
JCOL=JLEV(J(ICOL) )
|
|
XJCOL=JCOL
|
|
NVC=JLEV(NLEV+J(ICOL))
|
|
DO 1501 IROW=1,ICOL
|
|
JROW=JLEV(J(IROW) )
|
|
XJROW=JROW
|
|
NVR=JLEV(NLEV+J(IROW))
|
|
ICR=ICR+1
|
|
IF((NV.EQ.NVC.AND.NV1.EQ.NVR) .OR. (NV.EQ.NVR.AND.NV1.EQ.NVC))
|
|
1 THEN
|
|
IXVL=(ICR-1)*NPOTL+LM+1
|
|
IV(IXVL)=LL
|
|
VL(IXVL)=PM*SQRT(Z(JROW)*Z(JCOL))*
|
|
& THREEJ(JROW,LM,JCOL)*
|
|
& THRJ(XJROW,XLM,XJCOL,-XM,Z0,XM)
|
|
IF (VL(IXVL).NE.0.D0) NNZ=NNZ+1
|
|
ENDIF
|
|
1501 CONTINUE
|
|
IF (NNZ.LE.0 .AND. PRINT.GT.3) WRITE(6,612) MVALUE,LL
|
|
1511 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE CPL23(N,MXLAM,LAM,NLEV,JLEV,J,L,MVALUE,IEX,VL,PRINT,
|
|
1 LFIRST)
|
|
C CS COUPLING MATRIX FOR LINEAR ROTOR-LINEAR ROTOR (ITYPE=23)
|
|
C SAVES M-INDEPENDENT PARTS USING NEW DYNAMIC STORAGE
|
|
C AND IVLFL IN VERSION '12X' OF MOLSCAT.
|
|
C VERSION 5. LINEAR XCPL NOW STORED BACKWARDS IN HI LOCS OF X().
|
|
C JAN 93 IVLFL CHECKED BEFORE CALL CPL23 AND IV NO LONGER USED
|
|
C M-INDEPENDENT PARTS (9-J) STORED IROW.GE.ICOL.
|
|
C M-DEPENDENT (3J) PARTS STORED IF MEMORY ALLOWS.
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE NOMEM,NL12,J12MX,NJ12,NXPM,NLM,IHL,IXEX,IXTJ,IXMX,ISTART
|
|
1 ,IFIRST
|
|
C
|
|
INTEGER PRINT
|
|
INTEGER LAM(2),JLEV(NLEV,3),J(2),L(2)
|
|
LOGICAL ODD,NOMEM,LFIRST
|
|
DIMENSION VL(2)
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
DATA SQRTHF/.70710678118654753D0/, Z0/0.D0/
|
|
DATA PIFCT/2.24483902656458321D-2/
|
|
Z(I)=DBLE(I+I+1)
|
|
ODD(I)=I-2*(I/2).NE.0
|
|
C
|
|
C INITIALIZE IFIRST IF LFIRST IS SET TO TRUE
|
|
IF (LFIRST) THEN
|
|
IFIRST=-2
|
|
LFIRST=.FALSE.
|
|
NOMEM=.FALSE.
|
|
ENDIF
|
|
XM=MVALUE
|
|
C
|
|
PM=PARITY3(MVALUE)
|
|
IF (IFIRST.GT.-2) GO TO 3500
|
|
C FIRST TIME THROUGH EVALUATE MVALUE-INDEPENDENT PARTS OF VL()
|
|
C SET-UP AND CHECK STORAGE ...
|
|
NL12=NLEV*(NLEV+1)/2
|
|
IXMX=NL12*MXLAM
|
|
IXEX=IXMX
|
|
IF (IEX.GT.0) IXMX=2*IXMX
|
|
NAVAIL=MX-IXNEXT+1
|
|
IF (IXMX.LE.NAVAIL) GO TO 3010
|
|
WRITE(6,601) NLEV,MXLAM,IEX,IXMX,NAVAIL
|
|
601 FORMAT(/' ***** MCGCPL (JAN 93) NLEV,MXLAM,IEX =',3I4
|
|
1 /' REQUIRED STORAGE MORE THAN AVAILABLE',2I9)
|
|
STOP
|
|
C
|
|
C SET ISTART SO THAT X(ISTART-IX) IS XCPL(IX), REDUCE MX,
|
|
C AND SET-UP THE NINEJ PARTS IN X().
|
|
3010 ISTART=MX+1
|
|
MX=MX-IXMX
|
|
DO 3100 LL=1,MXLAM
|
|
LM1=LAM(3*LL-2)
|
|
LM2=LAM(3*LL-1)
|
|
LM=LAM(3*LL)
|
|
IL12=0
|
|
DO 3100 I1=1,NLEV
|
|
J1=JLEV(I1,1)
|
|
J2=JLEV(I1,2)
|
|
J12=JLEV(I1,3)
|
|
DO 3100 I2=1,I1
|
|
IL12=IL12+1
|
|
J1P=JLEV(I2,1)
|
|
J2P=JLEV(I2,2)
|
|
J12P=JLEV(I2,3)
|
|
FACTOR=PIFCT*Z(LM)*SQRT(Z(J12)*Z(J12P)*Z(J1)*Z(J1P)*Z(J2)*Z(J2P)
|
|
1 *Z(LM1)*Z(LM2))*PARITY3(J1+J2+J12)
|
|
C XCPL(IL12,LL,1)
|
|
IX=(LL-1)*NL12+IL12
|
|
X(ISTART-IX)=THREEJ(J1,LM1,J1P)*THREEJ(J2,LM2,J2P)*
|
|
1 XNINEJ(J12P,J2P,J1P,J12,J2,J1,LM,LM2,LM1)*FACTOR
|
|
IF (IEX.EQ.0) GO TO 3100
|
|
IF (J1.EQ.J2) THEN
|
|
X(ISTART-IXEX-IX)=X(ISTART-IX)
|
|
ELSE
|
|
X(ISTART-IXEX-IX)=THREEJ(J2,LM1,J1P)*THREEJ(J1,LM2,J2P)*
|
|
1 XNINEJ(J12P,J2P,J1P,J12,J1,J2,LM,LM2,LM1)*FACTOR
|
|
ENDIF
|
|
3100 CONTINUE
|
|
IF (PRINT.GT.3) WRITE(6,691) IXMX,NAVAIL
|
|
691 FORMAT(/' CPL23 (JAN 93). 9-J PARTS STORED. USED, AVAILABLE='
|
|
1 ,2I9)
|
|
C RESET IFIRST TO INDICATE THAT NINE-J PARTS ARE STORED
|
|
IFIRST=-1
|
|
C NOW CALCULATE PARMS NEEDED TO STORE M-DEPENDENT (THRJ) PARTS.
|
|
IXTJ=IXMX
|
|
J12MX=0
|
|
DO 3002 I=1,NLEV
|
|
3002 J12MX=MAX(J12MX,JLEV(I,3))
|
|
NJ12=(J12MX+1)*(J12MX+2)/2
|
|
LMAX=0
|
|
IHL=2
|
|
DO 3003 I=1,MXLAM
|
|
IF (ODD(LAM(3*I))) IHL=1
|
|
3003 LMAX=MAX(LMAX,LAM(3*I))
|
|
NLM=LMAX/IHL+1
|
|
NXPM=NJ12*NLM
|
|
C
|
|
C SEE IF REQUIRED M-DEPENDENT VALUES (THRJ) ARE STORED.
|
|
C IF NOT, TRY TO STORE THEM IN XCPL().
|
|
3500 MVABS=IABS(MVALUE)
|
|
IF (MVABS.LE.IFIRST.OR.NOMEM) GO TO 3900
|
|
MV=IFIRST+1
|
|
C FIRST CHECK THAT WE STILL HAVE A CONTINUOUS BLOCK OF HI MEMORY.
|
|
3600 IF (MX.EQ.ISTART-IXMX-1) GO TO 3610
|
|
IF (PRINT.GE.1) WRITE(6,602) MV,ISTART-1,MX,IXMX
|
|
602 FORMAT(/' CPL23 (JAN 93). HIGH MEMORY FRAGMENTED. CANNOT',
|
|
1 ' STORE 3-J VALUES FOR MVAL=',I3/ 19X,
|
|
2 'ORIGINAL MINUS CURRENT MEMORY LIMITS .NE. NO. USED =',3I12)
|
|
NOMEM=.TRUE.
|
|
GO TO 3900
|
|
C TEST FOR AVAILABLE STORAGE; NEED NXPM FOR THIS MVAL
|
|
3610 NAVAIL=MX-IXNEXT+1
|
|
IF (NXPM.LE.NAVAIL) GO TO 3601
|
|
IF (PRINT.GE.3) WRITE(6,692) MVABS,NXPM,NAVAIL
|
|
692 FORMAT(/' CPL23 (JAN 93). UNABLE TO STORE 3-J VALUES FOR MVAL='
|
|
1 ,I3/' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C SET NOMEM TO REFLECT INABILITY TO ADD MORE M-VALUES
|
|
NOMEM=.TRUE.
|
|
GO TO 3900
|
|
C UPDATE MEMORY POINTERS AND STORE 3-J VALUES FOR THIS MVAL
|
|
3601 IXMX=IXMX+NXPM
|
|
MX=MX-NXPM
|
|
XMV=MV
|
|
LL=0
|
|
DO 3200 IL=1,NLM
|
|
XLM=LL
|
|
IXJ12=0
|
|
DO 3201 J12=0,J12MX
|
|
XJ12=J12
|
|
DO 3201 J12P=0,J12
|
|
XJ12P=J12P
|
|
C IXJ12=J12*(J12+1)/2+J12P+1
|
|
IXJ12=IXJ12+1
|
|
C IX=IXTJ+MV*NXPM+(IL-1)*NJ12+IXJ12 <==> (IXJ12,IL,MV+1)
|
|
IX=MV*NXPM+(IL-1)*NJ12+IXJ12
|
|
3201 X(ISTART-IXTJ-IX)=THRJ(XJ12,XLM,XJ12P,XMV,Z0,-XMV)
|
|
3200 LL=LL+IHL
|
|
IF (PRINT.GT.3) WRITE(6,693) MV,NXPM,NAVAIL
|
|
693 FORMAT(/' CPL23 (JAN 93). 3-J VALUES STORED FOR MVAL =',I3
|
|
1 /' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C RESET IFIRST TO REFLECT HIGHEST M-VALUE STORED.
|
|
IFIRST=MV
|
|
C SEE IF CURRENT MVALUE REQUIRES MORE STORED M-VALUES.
|
|
MV=MV+1
|
|
IF (MV.LE.MVABS) GO TO 3600
|
|
C
|
|
C FILL VL() FROM XCPL
|
|
3900 DO 3513 LL=1,MXLAM
|
|
NNZ=0
|
|
I=LL
|
|
LM=LAM(3*LL)
|
|
XLM=LM
|
|
IL=LM/IHL+1
|
|
DO 3503 ICOL=1,N
|
|
I1=J(ICOL)
|
|
J1=JLEV(I1, 1)
|
|
J2=JLEV(I1, 2)
|
|
J12=JLEV(I1 ,3)
|
|
XJ12=J12
|
|
DO 3503 IROW=1,ICOL
|
|
I2=J(IROW)
|
|
J1P=JLEV(I2,1)
|
|
J2P=JLEV(I2,2)
|
|
J12P=JLEV(I2 ,3)
|
|
XJ12P=J12P
|
|
C FIRST GET THRJ(J12,LM,J12P,M,0,-M) -- EITHER CALC OR FROM STORAG
|
|
IF (MVABS.GT.IFIRST) THEN
|
|
TJM=THRJ(XJ12,XLM,XJ12P,XM,Z0,-XM)*PM
|
|
ELSE
|
|
C NB WE HAVE STORED ON J.GE.J'; (J,L,J'/M,0,-M)=(J',L,J/M,0,-M)
|
|
C ALSO, (J,L,J'/-M,0,M)=PARITY3(J+L+J')*(J,L,J'/M,0,-M)
|
|
IF (J12.GE.J12P) THEN
|
|
IXJ12=J12*(J12+1)/2+J12P+1
|
|
ELSE
|
|
IXJ12=J12P*(J12P+1)/2+J12+1
|
|
ENDIF
|
|
IXM=MVABS*NXPM+(IL-1)*NJ12+IXJ12
|
|
TJM=X(ISTART-IXTJ-IXM)*PM
|
|
IF (MVALUE.LT.0.AND.ODD(J12+J12P+LM)) TJM=-TJM
|
|
ENDIF
|
|
C THEN GET NINEJ() PARTS
|
|
IF (I1.GE.I2) THEN
|
|
IL12=I1*(I1-1)/2+I2
|
|
ELSE
|
|
IL12=I2*(I2-1)/2+I1
|
|
ENDIF
|
|
IX=(LL-1)*NL12+IL12
|
|
VL(I)=X(ISTART-IX)*TJM
|
|
IF (IEX.EQ.0) GO TO 3593
|
|
C *** CODE BELOW ASSUMES THAT SYMMETRICALLY RELATED TERMS ARE BOTH
|
|
C *** PRESENT IN POTENTIAL.
|
|
C ((((((((((((((( EXCHANGE SHOULD BE CHECKED )))))))))))))))))))
|
|
IF (J1.NE.J2) GO TO 3594
|
|
T=VL(I)
|
|
GO TO 3595
|
|
3594 T=X(ISTART-IXEX-IX)*TJM
|
|
3595 VL(I)=VL(I)+PARITY3(IEX+J1+J2-J12+L(ICOL))*T
|
|
IF (J1.EQ.J2) VL(I)=VL(I)*SQRTHF
|
|
IF (J1P.EQ.J2P)VL(I)=VL(I)*SQRTHF
|
|
3593 IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
3503 I=I+MXLAM
|
|
IF (NNZ.LE.0 .AND. PRINT.GE.3) WRITE(6,612) MVALUE,LL
|
|
612 FORMAT(' * * * NOTE. FOR MVALUE, LAM =',2I4,', ALL COUPLING ',
|
|
& 'COEFFICIENTS ARE 0.')
|
|
3513 CONTINUE
|
|
RETURN
|
|
C
|
|
END
|
|
SUBROUTINE CPL25(N,MXLAM,LAM,NLEV,JLEV,J,MVALUE,VL,PRINT,LFIRST)
|
|
C
|
|
C CS COUPLING MATRIX FOR SYMMETRIC TOP ROTOR-ATOM (ITYPE=25)
|
|
C SAVES COUPLING COEFFICIENTS USING NEW DYNAMIC STORAGE
|
|
C N.B. IV() IS NO LONGER USED; CONTROLLED BY IVLFL IN /MEMORY/
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE NOMEM,NL12,IXMX,ISTART,IFIRST
|
|
C
|
|
C SPECIFICATIONS FOR ARGUMENTS
|
|
DIMENSION LAM(MXLAM),JLEV(NLEV,3),J(N),VL(1)
|
|
INTEGER PRINT
|
|
LOGICAL LFIRST
|
|
C
|
|
LOGICAL ODD,NOMEM
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
DATA Z0/0.D0/, HALF/0.5D0/, ONE/1.D0/
|
|
C
|
|
C STATEMENT FUNCTION DEFINITIONS
|
|
ODD(I)=I-2*(I/2).NE.0
|
|
C
|
|
C IF LFIRST IS TRUE (FIRST CALL), DO SOME INITIALIZATION
|
|
IF (LFIRST) THEN
|
|
IFIRST=-1
|
|
LFIRST=.FALSE.
|
|
NOMEM=.FALSE.
|
|
ENDIF
|
|
C
|
|
SQRTHF=SQRT(HALF)
|
|
XM=MVALUE
|
|
C
|
|
IF (IFIRST.GT.-1) GO TO 3500
|
|
C FIRST TIME THROUGH SET UP SOME STORAGE POINTERS
|
|
NL12=NLEV*(NLEV+1)/2
|
|
IXMX=NL12*MXLAM
|
|
ISTART=MX+1
|
|
C
|
|
3500 MVABS=IABS(MVALUE)
|
|
C SEE IF VALUES ARE STORED FOR THIS HIGH AN MVALUE
|
|
C IF NOT, TRY TO STORE THEM IN XCPL().
|
|
IF (MVABS.LE.IFIRST.OR.NOMEM) GO TO 3900
|
|
MV=IFIRST+1
|
|
C FIRST CHECK THAT WE STILL HAVE A CONTINUOUS BLOCK OF HI MEMORY.
|
|
3600 IF (MX.EQ.ISTART-(IFIRST+1)*IXMX-1) GO TO 3610
|
|
IF (PRINT.GE.1) WRITE(6,602) MV,ISTART-1,MX,IXMX*(IFIRST+1)
|
|
602 FORMAT(/' CPL25 (FEB 93). HIGH MEMORY FRAGMENTED. CANNOT',
|
|
1 ' STORE COUPLING COEFFS FOR MVAL=',I3/19X,
|
|
2 'ORIGINAL MINUS CURRENT MEMORY LIMITS .NE. NO. USED =',3I12)
|
|
NOMEM=.TRUE.
|
|
GO TO 3900
|
|
C TEST FOR AVAILABLE STORAGE; NEED IXMX FOR THIS MVAL
|
|
3610 NAVAIL=MX-IXNEXT+1
|
|
IF (IXMX.LE.NAVAIL) GO TO 3601
|
|
IF (PRINT.GE.3) WRITE(6,692) MV,IXMX,NAVAIL
|
|
692 FORMAT(/' CPL25 (FEB 93). UNABLE TO STORE 3-J VALUES FOR MVAL='
|
|
1 ,I3/' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C SET NOMEM TO REFLECT INABILITY TO ADD MORE M-VALUES
|
|
NOMEM=.TRUE.
|
|
GO TO 3900
|
|
C
|
|
C REDUCE 'TOP OF MEMORY' AND STORE COUPLING VALUES FOR THIS MVAL
|
|
3601 MX=MX-IXMX
|
|
C START INDEX AFTER M-BLOCKS ALREADY STORED (STARTING WITH MV=0)
|
|
IX=MV*IXMX
|
|
DO 3200 IL=1,MXLAM
|
|
LM=LAM(2*IL-1)
|
|
MU=LAM(2*IL)
|
|
DO 3201 I1=1,NLEV
|
|
J1=JLEV(I1,1)
|
|
K1=JLEV(I1,2)
|
|
IS1=JLEV(I1,3)
|
|
DO 3201 I2=1,I1
|
|
J2=JLEV(I2,1)
|
|
K2=JLEV(I2,2)
|
|
IS2=JLEV(I2,3)
|
|
IX=IX+1
|
|
XCPL=Z0
|
|
IF (J1.LT.MV.OR.J2.LT.MV) GO TO 3201
|
|
PARFCT=(ONE+PARITY3(J1+J2+IS1+IS2+LM+MU))*HALF
|
|
IF (PARFCT.LE.1.D-5) GO TO 3201
|
|
IF (K1.EQ.0) PARFCT=PARFCT*SQRTHF
|
|
IF (K2.EQ.0) PARFCT=PARFCT*SQRTHF
|
|
KDIF=K2-K1
|
|
IF (IABS(KDIF).NE.MU) GO TO 3205
|
|
WPAR=ONE
|
|
IF (KDIF.LT.0.AND.ODD(MU)) WPAR=-WPAR
|
|
C CONTRIBUTION FROM (J1, K1, MVALUE / Y(LM,MU) / J2, K2, MVALUE)
|
|
XCPL=PARFCT*WPAR*GSYMTP(J1,K1,J2,K2,MVALUE,LM,KDIF)
|
|
3205 KSUM=K2+K1
|
|
IF (IABS(KSUM).NE.MU) GO TO 3201
|
|
C CONTRIBUTION FROM (J1,-K1,MVALUE / Y(LM,MU) / J2,K2,MVALUE)
|
|
XCPL=XCPL+PARFCT*PARITY3(IS1)*
|
|
& GSYMTP(J1,-K1,J2,K2,MVALUE,LM,KSUM)
|
|
3201 X(ISTART-IX)=XCPL
|
|
3200 CONTINUE
|
|
IF (PRINT.GT.3) WRITE(6,693) MV,IXMX,NAVAIL
|
|
693 FORMAT(/' CPL25 (FEB 93). 3-J VALUES STORED FOR MVAL =',I3
|
|
1 /' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C RESET IFIRST TO REFLECT HIGHEST M-VALUE STORED.
|
|
IFIRST=MV
|
|
C SEE IF CURRENT MVALUE REQUIRES MORE STORED M-VALUES.
|
|
MV=MV+1
|
|
IF (MV.LE.MVABS) GO TO 3600
|
|
C
|
|
3900 IF (MVABS.GT.IFIRST) GO TO 3800
|
|
C MVABS.LE.IFIRST. COEFFS STORED. FILL VL() FROM XCPL
|
|
IXM=MVABS*IXMX
|
|
DO 3513 LL=1,MXLAM
|
|
NNZ=0
|
|
I=LL
|
|
LM=LAM(LL)
|
|
DO 3503 ICOL=1,N
|
|
I1=J(ICOL)
|
|
J1=JLEV(I1,1)
|
|
DO 3503 IROW=1,ICOL
|
|
I2=J(IROW)
|
|
J2=JLEV(I2,1)
|
|
IF (I1.GT.I2) THEN
|
|
IX12=I1*(I1-1)/2+I2
|
|
ELSE
|
|
IX12=I2*(I2-1)/2+I1
|
|
ENDIF
|
|
IX=IXM+(LL-1)*NL12+IX12
|
|
VL(I)=X(ISTART-IX)
|
|
C WE HAVE STORED COUPLING FOR POSITIVE MVALUES; CORRECT IF NECESSARY
|
|
C FOR PARITY OF THRJ(J1,LM,J2,-MVAL,0,MVAL)
|
|
IF (MVALUE.LT.0.AND.ODD(J1+J2+LM)) VL(I)=-VL(I)
|
|
3593 IF (VL(I).NE.Z0) NNZ=NNZ+1
|
|
3503 I=I+MXLAM
|
|
IF (NNZ.LE.0 .AND. PRINT.GE.3) WRITE(6,612) MVALUE,LL
|
|
612 FORMAT(' * * * NOTE. FOR MVALUE, SYM =',2I4,', ALL COUPLING ',
|
|
& 'COEFFICIENTS ARE 0.')
|
|
3513 CONTINUE
|
|
RETURN
|
|
C
|
|
C MV.GT.IFIRST ==> VALUES NOT STORED. CALCULATE THEM
|
|
3800 DO 5555 LL=1,MXLAM
|
|
NNZ=0
|
|
I=LL
|
|
LM=LAM(2*LL-1)
|
|
MU=LAM(2*LL)
|
|
DO 5565 ICOL=1,N
|
|
J1=JLEV(J(ICOL),1)
|
|
K1=JLEV(J(ICOL),2)
|
|
IS1=JLEV(J(ICOL),3)
|
|
DO 5565 IROW=1,ICOL
|
|
J2=JLEV(J(IROW),1)
|
|
K2=JLEV(J(IROW),2)
|
|
IS2=JLEV(J(IROW),3)
|
|
VL(I)=Z0
|
|
PARFCT=(ONE+PARITY3(J1+J2+IS1+IS2+LM+MU))*HALF
|
|
IF (PARFCT.LE.1.D-5) GO TO 5565
|
|
IF (K1.EQ.0) PARFCT=PARFCT*SQRTHF
|
|
IF (K2.EQ.0) PARFCT=PARFCT*SQRTHF
|
|
KDIF=K2-K1
|
|
IF (IABS(KDIF).NE.MU) GO TO 5575
|
|
WPAR=ONE
|
|
IF (KDIF.LT.0.AND.ODD(MU)) WPAR=-WPAR
|
|
C CONTRIBUTION FROM (J1, K1, MVALUE / Y(LM,MU) / J2, K2, MVALUE)
|
|
VL(I)=VL(I) + PARFCT*WPAR*GSYMTP(J1,K1,J2,K2,MVALUE,LM,KDIF)
|
|
5575 KSUM=K2+K1
|
|
IF (IABS(KSUM).NE.MU) GO TO 5585
|
|
C CONTRIBUTION FROM (J1,-K1,MVALUE / Y(LM,MU) / J2,K2,MVALUE)
|
|
VL(I)=VL(I)+PARFCT*PARITY3(IS1)*
|
|
& GSYMTP(J1,-K1,J2,K2,MVALUE,LM,KSUM)
|
|
5585 IF (ABS(VL(I)).GE.1.D-5) NNZ=NNZ+1
|
|
5565 I=I+MXLAM
|
|
IF (NNZ.EQ.0) WRITE(6,612) MVALUE,LL
|
|
5555 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE CPL3(N,MXLAM,LAM,NLEV,JLEV,J,L,JTOT,VL,IEX,PRINT,
|
|
1 LFIRST)
|
|
C COUPLING MATRIX ELEMENTS FOR LINEAR ROTOR-LINEAR ROTOR (ITYPE=3)
|
|
C JAN 93 CODE TO SAVE JTOT-INDEPENDENT PARTS IN DEDICATED STORAGE
|
|
C WORKS W/ NEW DYNAMIC STORAGE CAPABILITIES. IVLFL CHECKED
|
|
C BEFORE CALL CPL3 AND IV NO LONGER USED.
|
|
C
|
|
C LOWER DIAGONAL OF XCPL IS STORED FOR MAIN COUPLING ELEMENTS
|
|
C BUT EXCHANGE PART REQUIRES FULL MATRIX (NLEV,NLEV) STORAGE.
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE IXEX,ISTART,IFIRST
|
|
LOGICAL ODD,LFIRST
|
|
INTEGER PRINT
|
|
DIMENSION LAM(1),JLEV(NLEV,3),J(1),L(1)
|
|
DIMENSION VL(1)
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C CONST IS FACTOR (4.*PI)**(-3/2)
|
|
DATA CONST/2.24483902656458321D-2/, SQRTHF/.70710678118654753D0/
|
|
C STATEMENT FUNCTIONS
|
|
ODD(I)=I-2*(I/2).NE.0
|
|
Z(I)=DBLE(I+I+1)
|
|
C
|
|
C INITIALIZE IFIRST IF LFIRST IS SET TRUE
|
|
IF (LFIRST) THEN
|
|
IFIRST=0
|
|
LFIRST=.FALSE.
|
|
ENDIF
|
|
C
|
|
NLSQ=NLEV*NLEV
|
|
NL12=NLEV*(NLEV+1)/2
|
|
IF (IFIRST.GT.0) GO TO 8030
|
|
C
|
|
C FIRST TIME THROUGH EVALUATE JTOT-INDEPENDENT PARTS OF VL()
|
|
IXMX=NL12*MXLAM
|
|
IXEX=IXMX
|
|
IF (IEX.GT.0) IXMX=IXEX+NLSQ*MXLAM
|
|
NAVAIL=MX-IXNEXT+1
|
|
IF (IXMX.LE.NAVAIL) GO TO 3010
|
|
WRITE(6,699) NLEV,MXLAM,IEX,IXMX,NAVAIL
|
|
699 FORMAT(/' ***** CPL3 (JAN 93) NLEV,MXLAM,IEX =',3I4
|
|
1 /' REQUIRED STORAGE MORE THAN AVAILABLE',2I9)
|
|
STOP
|
|
C UPDATE STORAGE POINTERS. NB WE STORE XPCL BACKWARDS AT TOP OF X()
|
|
3010 ISTART=MX+1
|
|
MX=MX-IXMX
|
|
DO 3100 LL=1,MXLAM
|
|
LM1=LAM(3*LL-2)
|
|
LM2=LAM(3*LL-1)
|
|
LM=LAM(3*LL)
|
|
IL12=0
|
|
DO 3100 I1=1,NLEV
|
|
J1=JLEV(I1,1)
|
|
J2=JLEV(I1,2)
|
|
J12=JLEV(I1,3)
|
|
DO 3100 I2=1,I1
|
|
IL12=IL12+1
|
|
J1P=JLEV(I2,1)
|
|
J2P=JLEV(I2,2)
|
|
J12P=JLEV(I2,3)
|
|
C INDEX FOR XCPL(IL12,LL,1), I.E., SYMMETRIZED
|
|
IX=(LL-1)*NL12+IL12
|
|
FACTOR=CONST*Z(LM)*SQRT((Z(LM1)*Z(LM2))*(Z(J1)*Z(J2)*Z(J12))*
|
|
1 (Z(J1P)*Z(J2P)*Z(J12P)))
|
|
JSUM=J1+J2+J12P
|
|
IF (ODD(JSUM)) FACTOR=-FACTOR
|
|
X(ISTART-IX)=THREEJ(LM1,J1P,J1)*THREEJ(LM2,J2P,J2)*
|
|
1 XNINEJ(J12P,J2P,J1P,J12,J2,J1,LM,LM2,LM1)*FACTOR
|
|
IF (IEX.EQ.0) GO TO 3100
|
|
C INDEX FOR XCPL(I2,I1,LL,2), I.E., UNSYMMETRIZED
|
|
IE=(LL-1)*NLSQ+(I1-1)*NLEV+I2
|
|
IF (J1.EQ.J2) THEN
|
|
X(ISTART-IXEX-IE)=X(ISTART-IX)
|
|
ELSE
|
|
X(ISTART-IXEX-IE)=THREEJ(LM1,J1P,J2)*THREEJ(LM2,J2P,J1)*
|
|
1 XNINEJ(J12P,J2P,J1P,J12,J1,J2,LM,LM2,LM1)*FACTOR
|
|
ENDIF
|
|
IF (I1.EQ.I2) GO TO 3100
|
|
C ELSE WE NEED TO STORE I1<->I2 VALUES
|
|
IE=(LL-1)*NLSQ+(I2-1)*NLEV+I1
|
|
IF (J1P.EQ.J2P) THEN
|
|
X(ISTART-IXEX-IE)=X(ISTART-IX)
|
|
ELSE
|
|
X(ISTART-IXEX-IE)=THREEJ(LM1,J2P,J1)*THREEJ(LM2,J1P,J2)*
|
|
1 XNINEJ(J12P,J1P,J2P,J12,J2,J1,LM,LM2,LM1)*FACTOR
|
|
ENDIF
|
|
3100 CONTINUE
|
|
IF (PRINT.GT.3) WRITE(6,697) NLEV,MXLAM,IEX,IXMX,NAVAIL
|
|
697 FORMAT(/' CPL3 (JAN 93). ',
|
|
1 ' JTOT-INDEPENDENT PARTS OF COUPLING MATRIX STORED',
|
|
2 '. NLEV, MXLAM, IEX =',3I4/
|
|
3 19X,'REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C RESET IFIRST
|
|
IFIRST=1
|
|
C
|
|
C EVALUATE VL() USING STORED JTOT-INDEPENDENT PARTS
|
|
8030 DO 1513 LL=1,MXLAM
|
|
NNZ=0
|
|
I=LL
|
|
LM=LAM(3*LL)
|
|
DO 1503 ICOL=1,N
|
|
LV=L(ICOL)
|
|
I1=J(ICOL)
|
|
J1=JLEV(I1,1)
|
|
J2=JLEV(I1,2)
|
|
J12=JLEV(I1,3)
|
|
DO 1503 IROW=1,ICOL
|
|
LVP=L(IROW)
|
|
I2=J(IROW)
|
|
J1P=JLEV(I2,1)
|
|
J2P=JLEV(I2,2)
|
|
J12P=JLEV(I2,3)
|
|
C GET JTOT-DEPENDENT PARTS
|
|
XFACT=SQRT(Z(LV)*Z(LVP))*THREEJ(LM,LVP,LV)
|
|
1 *SIXJ(LVP,LV,J12P,J12,LM,JTOT)
|
|
IF (ODD(JTOT)) XFACT=-XFACT
|
|
C GET JTOT-INDEPENDENT PARTS FROM XCPL.
|
|
C BELOW IS FOR SYMMETRIZED MAIN PART
|
|
IF (I1.GE.I2) THEN
|
|
IL12=I1*(I1-1)/2+I2
|
|
ELSE
|
|
IL12=I2*(I2-1)/2+I1
|
|
ENDIF
|
|
IX=(LL-1)*NL12+IL12
|
|
VL(I)=XFACT*X(ISTART-IX)
|
|
IF (IEX.EQ.0) GO TO 1593
|
|
C ***
|
|
C *** N.B. CODE BELOW ASSUMES THAT SYMMETRICALLY RELATED POTENTIAL TERMS
|
|
C *** I.E. A(LM1,LM2,LM) AND A(LM2,LM1,LM) ARE BOTH PRESENT IN POTL.
|
|
C ***
|
|
C BELOW IS FOR XCPL(I2,I1,LL,IEX) STORAGE ORDER
|
|
IE=(LL-1)*NLSQ+(I1-1)*NLEV+I2
|
|
IF (J1.NE.J2) GO TO 1594
|
|
T=VL(I)
|
|
GO TO 1595
|
|
1594 T=XFACT*X(ISTART-IXEX-IE)
|
|
1595 JSUM=IEX+J1+J2-J12+LV
|
|
IF (ODD(JSUM)) T=-T
|
|
VL(I)=VL(I)+T
|
|
IF (J1.EQ.J2) VL(I)=VL(I)*SQRTHF
|
|
IF (J1P.EQ.J2P) VL(I)=VL(I)*SQRTHF
|
|
1593 IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
1503 I=I+MXLAM
|
|
IF (NNZ.LE.0.AND.PRINT.GE.4) WRITE(6,612) JTOT, LL
|
|
612 FORMAT(' * * * NOTE. FOR JTOT =',I4,', ALL COUPLING ',
|
|
1 'COEFFICIENTS ARE 0.0 FOR SYMMETRY',I4)
|
|
1513 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE CPL4(N,J,L,JTOT,MXLAM,LAM,VL,JLEV,ATAU,NLEV,
|
|
1 PRINT,LFIRST)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE IFIRST,NOMEM,NL12,IXMX,ISTART
|
|
C COUPLING MATRIX ELEMENTS FOR ITYPE=4 (CPL4) & ITYPE=24 (CPL24)
|
|
C SPECIFICATIONS FOR PARAMETER LIST
|
|
INTEGER J(N),L(N),LAM(2),JLEV(2)
|
|
INTEGER PRINT
|
|
DIMENSION ATAU(2),VL(2)
|
|
LOGICAL LFIRST
|
|
C
|
|
INTEGER P1,Q1,P2,P
|
|
LOGICAL ODD,NOMEM
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
COMMON /VLSAVE/ IVLU
|
|
C
|
|
DATA PI/3.141592653589793D0/
|
|
DATA EPS/1.D-8/, Z0/0.D0/
|
|
C
|
|
C STATEMENT FUNCTIONS ...
|
|
F(NN) = DBLE(NN+NN+1)
|
|
ODD(I) = I-2*(I/2).NE.0
|
|
C
|
|
IF (LFIRST) THEN
|
|
IFIRST=-1
|
|
LFIRST=.FALSE.
|
|
NOMEM=.FALSE.
|
|
ENDIF
|
|
IF (IFIRST.GT.-1) GO TO 5500
|
|
IF (NOMEM) GO TO 5900
|
|
NL12=NLEV*(NLEV+1)/2
|
|
IXMX=NL12*MXLAM
|
|
ISTART=MX+1
|
|
NAVAIL=ISTART-IXNEXT
|
|
IF (IXMX.LE.NAVAIL) GO TO 5100
|
|
IF (PRINT.GE.3) WRITE(6,694) IXMX,NAVAIL
|
|
694 FORMAT(/' CPL4 (JUL 93). UNABLE TO STORE JTOT-INDEPENDENT PART'
|
|
1 /' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
NOMEM=.TRUE.
|
|
GO TO 5900
|
|
5100 IX=0
|
|
DO 5200 LL=1,MXLAM
|
|
P1 = LAM(4*LL-3)
|
|
Q1 = LAM(4*LL-2)
|
|
P2 = LAM(4*LL-1)
|
|
P = LAM(4*LL)
|
|
XP1 = P1
|
|
XQ1 = Q1
|
|
DO 5201 IC=1,NLEV
|
|
JC=JLEV(IC)
|
|
J1C = JLEV(IC + 2*NLEV)
|
|
J2C = JLEV(IC + NLEV)
|
|
XJC = JC
|
|
XJ1C = J1C
|
|
XJ2C = J2C
|
|
ISTC = JLEV(IC + 5*NLEV)
|
|
NKC = JLEV(IC + 6*NLEV)
|
|
DO 5201 IR=1,IC
|
|
IX=IX+1
|
|
JR=JLEV(IR)
|
|
J1R = JLEV(IR + 2*NLEV)
|
|
J2R = JLEV(IR + NLEV)
|
|
XJR=JR
|
|
XJ1R = J1R
|
|
XJ2R = J2R
|
|
ISTR=JLEV(IR+5*NLEV)
|
|
NKR=JLEV(IR+6*NLEV)
|
|
XCPL=Z0
|
|
KKC=-J1C
|
|
DO 5300 KC=1,NKC
|
|
C SKIP IMMEDIATELY IF COEFFICIENT IS SMALL.
|
|
IF (ABS(ATAU(ISTC+KC)).LE.EPS) GO TO 5300
|
|
XKC=KKC
|
|
KKR=-J1R
|
|
DO 5400 KR=1,NKR
|
|
C SKIP IMMEDIATELY IF COEFFICIENT IS SMALL.
|
|
IF (ABS(ATAU(ISTR+KR)).LE.EPS) GO TO 5400
|
|
XKR=KKR
|
|
C AF=ATAU(ISTR+KR)*ATAU(ISTC+KC)*PARITY3(KKR)
|
|
AF=ATAU(ISTR+KR)*ATAU(ISTC+KC)
|
|
IF (ODD(KKR)) AF=-AF
|
|
IF (KKR-KKC.NE.Q1) GO TO 5401
|
|
XCPL=XCPL+AF*THRJ(XJ1R,XP1,XJ1C,-XKR,XQ1,XKC)
|
|
IF (Q1.EQ.0) GO TO 5400
|
|
5401 IF (KKC-KKR.NE.Q1) GO TO 5400
|
|
C ADJUST FOR (-1)**MU IN POTENTIAL. . .
|
|
AF=AF*PARITY3(P1+Q1+P2+P)
|
|
XCPL=XCPL+AF*THRJ(XJ1R,XP1,XJ1C,-XKR,-XQ1,XKC)
|
|
5400 KKR=KKR+1
|
|
5300 KKC=KKC+1
|
|
C NOW GET 'CONSTANT FACTORS'
|
|
XFCT=PARITY3(JR-J1C+J2C)
|
|
1 *SQRT(F(J2R)*F(J2C)*F(P)*F(P2)*F(JR)*F(JC)*F(J1C)*F(J1R))
|
|
2 *THREEJ(J2R,P2,J2C)*XNINEJ(JC,JR,P,J1C,J1R,P1,J2C,J2R,P2)
|
|
3 /4.D0/PI
|
|
5201 X(ISTART-IX)=XCPL*XFCT
|
|
5200 CONTINUE
|
|
IF (PRINT.GT.3) WRITE(6,695) IXMX
|
|
695 FORMAT(/' CPL4 (JUL 93). JTOT-INDEPENDENT PARTS OF COUPLING',
|
|
1 ' MATRIX STORED.'/
|
|
2 ' REQUIRED STORAGE =',I8)
|
|
C RESET MX, IFIRST TO REFLECT STORED VALUES
|
|
MX=MX-IXMX
|
|
IFIRST=0
|
|
C
|
|
C NOW GET COUPLING MATRIX ELEMENTS FROM STORED PARTS
|
|
5500 PJT=PARITY3(JTOT)
|
|
IF (IVLU.GT.0) REWIND IVLU
|
|
DO 5600 LL=1,MXLAM
|
|
P1 = LAM(4*LL-3)
|
|
Q1 = LAM(4*LL-2)
|
|
P2 = LAM(4*LL-1)
|
|
P = LAM(4*LL)
|
|
C
|
|
PPP = PARITY3(P)
|
|
IX1=(LL-1)*NL12
|
|
NNZ=0
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=LL
|
|
ELSE
|
|
IX=1
|
|
ENDIF
|
|
C
|
|
DO 5700 IC=1,N
|
|
INJ12P = J(IC)
|
|
JC=JLEV(INJ12P)
|
|
LC=L(IC)
|
|
C
|
|
DO 5700 IR=1,IC
|
|
INJ12=J(IR)
|
|
JR=JLEV(INJ12)
|
|
LR=L(IR)
|
|
C
|
|
XFACT = PJT*PPP*THREEJ(LR,P,LC)*SIXJ(LR,JR,LC,JC,JTOT,P)
|
|
1 *SQRT(F(LR)*F(LC))
|
|
IF (INJ12.GE.INJ12P) THEN
|
|
IX2=INJ12*(INJ12-1)/2+INJ12P
|
|
ELSE
|
|
IX2=INJ12P*(INJ12P-1)/2+INJ12
|
|
ENDIF
|
|
INDX=IX1+IX2
|
|
C
|
|
IF (X(ISTART-INDX).EQ.0.D0) THEN
|
|
VL(IX) = 0.D0
|
|
ELSE
|
|
VL(IX)=XFACT*X(ISTART-INDX)
|
|
ENDIF
|
|
IF (VL(IX).NE.0.D0) NNZ=NNZ+1
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=IX+MXLAM
|
|
ELSE
|
|
IX=IX+1
|
|
ENDIF
|
|
5700 CONTINUE
|
|
IF (NNZ.EQ.0.AND.PRINT.GT.3) WRITE(6,697) P1,Q1,P2,P
|
|
IF (IVLU.GT.0) WRITE(IVLU) (VL(I),I=1,N*(N+1)/2)
|
|
5600 CONTINUE
|
|
RETURN
|
|
C
|
|
C IF WE CANNOT STORE PARTIAL COUPLING MATRIX, RECALCULATE.
|
|
5900 ASSIGN 3001 TO IGO1
|
|
ASSIGN 3011 TO IGO2
|
|
GO TO 3000
|
|
C
|
|
ENTRY CPL24(N,MXLAM,LAM,NLEV,JLEV,ATAU,J,MVAL,VL,PRINT,LFIRST)
|
|
C
|
|
C IF LFIRST IS TRUE (FIRST CALL), DO SOME INITIALIZATION
|
|
IF (LFIRST) THEN
|
|
IFIRST=-1
|
|
LFIRST=.FALSE.
|
|
NOMEM=.FALSE.
|
|
ENDIF
|
|
C
|
|
IF (IFIRST.GT.-1) GO TO 4500
|
|
C FIRST TIME THROUGH SET UP SOME STORAGE POINTERS
|
|
NL12=NLEV*(NLEV+1)/2
|
|
IXMX=NL12*MXLAM
|
|
ISTART=MX+1
|
|
C
|
|
4500 MVABS=IABS(MVAL)
|
|
C SEE IF VALUES ARE STORED FOR THIS HIGH AN MVALUE
|
|
C IF NOT, TRY TO STORE THEM IN XCPL().
|
|
IF (MVABS.LE.IFIRST.OR.NOMEM) GO TO 4900
|
|
MV=IFIRST+1
|
|
C FIRST CHECK THAT WE STILL HAVE A CONTINUOUS BLOCK OF HI MEMORY.
|
|
4600 IF (MX.EQ.ISTART-(IFIRST+1)*IXMX-1) GO TO 4610
|
|
IF (PRINT.GE.1) WRITE(6,642) MV,ISTART-1,MX,IXMX*(IFIRST+1)
|
|
642 FORMAT(/' CPL24 (JUL 93). HIGH MEMORY FRAGMENTED. CANNOT',
|
|
1 ' STORE COUPLING COEFFS FOR MVAL=',I3/ 19X,
|
|
2 'ORIGINAL MINUS CURRENT MEMORY LIMITS .NE. NO. USED =',3I12)
|
|
NOMEM=.TRUE.
|
|
GO TO 4900
|
|
C TEST FOR AVAILABLE STORAGE; NEED IXMX FOR THIS MVAL
|
|
4610 NAVAIL=MX-IXNEXT+1
|
|
IF (IXMX.LE.NAVAIL) GO TO 4601
|
|
IF (PRINT.GE.3) WRITE(6,692) MV,IXMX,NAVAIL
|
|
692 FORMAT(/' CPL24 (JUL 93). UNABLE TO STORE 3-J VALUES FOR MVAL='
|
|
1 ,I3/' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C SET NOMEM TO REFLECT INABILITY TO ADD MORE M-VALUES
|
|
NOMEM=.TRUE.
|
|
GO TO 4900
|
|
C
|
|
C REDUCE 'TOP OF MEMORY' AND STORE COUPLING VALUES FOR THIS MVAL
|
|
4601 MX=MX-IXMX
|
|
C START INDEX AFTER M-BLOCKS ALREADY STORED (STARTING WITH MV=0)
|
|
IX=MV*IXMX
|
|
DO 4200 LL=1,MXLAM
|
|
P1 = LAM(4*LL-3)
|
|
Q1 = LAM(4*LL-2)
|
|
P2 = LAM(4*LL-1)
|
|
P = LAM(4*LL)
|
|
DO 4201 IC=1,NLEV
|
|
JC=JLEV(IC)
|
|
J1C = JLEV(IC+2*NLEV)
|
|
J2C = JLEV(IC+ NLEV)
|
|
ISTC=JLEV(IC+5*NLEV)
|
|
NKC=JLEV(IC+6*NLEV)
|
|
DO 4201 IR=1,IC
|
|
JR=JLEV(IR)
|
|
J1R = JLEV(IR+2*NLEV)
|
|
J2R = JLEV(IR+ NLEV)
|
|
ISTR=JLEV(IR+5*NLEV)
|
|
NKR=JLEV(IR+6*NLEV)
|
|
IX=IX+1
|
|
XCPL=Z0
|
|
KKC=-J1C
|
|
DO 4300 KC=1,NKC
|
|
C SKIP IMMEDIATELY IF COEFFICIENT IS SMALL.
|
|
IF (ABS(ATAU(ISTC+KC)).LE.EPS) GO TO 4300
|
|
KKR=-J1R
|
|
DO 4400 KR=1,NKR
|
|
C SKIP IMMEDIATELY IF COEFFICIENT IS SMALL.
|
|
IF (ABS(ATAU(ISTR+KR)).LE.EPS) GO TO 4400
|
|
AF=ATAU(ISTR+KR)*ATAU(ISTC+KC)
|
|
IF (KKR-KKC.NE.Q1) GO TO 4401
|
|
XCPL=XCPL+AF*RSYMTP(J1R,KKR,J2R,J1C,KKC,J2C,
|
|
1 JR,JC,MVAL,P1,Q1,P2,P)
|
|
IF (Q1.EQ.0) GO TO 4400
|
|
4401 IF (KKC-KKR.NE.Q1) GO TO 4400
|
|
C ADJUST FOR (-1)**MU IN POTENTIAL. . .
|
|
C AF=AF*PARITY3(MU)
|
|
IF (ODD(P1+Q1+P2+P)) AF = -AF
|
|
XCPL=XCPL+AF*RSYMTP(J1R,KKR,J2R,J1C,KKC,J2C,
|
|
1 JR,JC,MVAL,P1,-Q1,P2,P)
|
|
4400 KKR=KKR+1
|
|
4300 KKC=KKC+1
|
|
4201 X(ISTART-IX)=XCPL
|
|
4200 CONTINUE
|
|
IF(PRINT.GT.3) WRITE(6,693) MV,IXMX,NAVAIL
|
|
693 FORMAT(/' CPL24 (JUL 93). 3J VALUES STORED FOR MVALUE =',I3,
|
|
1 /,' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
IFIRST = MV
|
|
C SEE IF CURRENT MVALUE REQUIRES MORE STORED M-VALUES.
|
|
MV=MV+1
|
|
IF (MV.LE.MVABS) GO TO 4600
|
|
C
|
|
4900 IF (MVABS.GT.IFIRST) GO TO 4800
|
|
C MVABS.LE.IFIRST. COEFFS STORED. FILL VL() FROM XCPL
|
|
IXM=MVABS*IXMX
|
|
IF (IVLU.GT.0) REWIND IVLU
|
|
DO 4513 LL=1,MXLAM
|
|
P1 = LAM(4*LL-3)
|
|
Q1 = LAM(4*LL-2)
|
|
P2 = LAM(4*LL-1)
|
|
P = LAM(4*LL)
|
|
NNZ=0
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=LL
|
|
ELSE
|
|
IX=1
|
|
ENDIF
|
|
DO 4503 ICOL=1,N
|
|
I1=J(ICOL)
|
|
JC=JLEV(I1)
|
|
DO 4503 IROW=1,ICOL
|
|
I2=J(IROW)
|
|
JR=JLEV(I2)
|
|
IF (I1.GT.I2) THEN
|
|
IX12=I1*(I1-1)/2+I2
|
|
ELSE
|
|
IX12=I2*(I2-1)/2+I1
|
|
ENDIF
|
|
IXX=IXM+(LL-1)*NL12+IX12
|
|
VL(IX)=X(ISTART-IXX)
|
|
C WE HAVE STORED COUPLING FOR POSITIVE MVALUES; CORRECT IF NECESSARY
|
|
C FOR PARITY OF THRJ(JR,P ,JC, MVAL,0,-MVAL)
|
|
IF (MVAL.LT.0.AND.ODD(JC+JR+P )) VL(IX)=-VL(IX)
|
|
IF (VL(IX).NE.Z0) NNZ=NNZ+1
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=IX+MXLAM
|
|
ELSE
|
|
IX=IX+1
|
|
ENDIF
|
|
4503 CONTINUE
|
|
IF (NNZ.LE.0 .AND. PRINT.GT.3) WRITE(6,612) MVAL,LL
|
|
612 FORMAT(' * * * NOTE. FOR MVALUE, SYM =',2I4,', ALL COUPLING ',
|
|
& 'COEFFICIENTS ARE 0.')
|
|
IF (IVLU.GT.0) WRITE(IVLU) (VL(I),I=1,N*(N+1)/2)
|
|
4513 CONTINUE
|
|
RETURN
|
|
C
|
|
C MV.GT.IFIRST ==> VALUES NOT STORED. CALCULATE THEM VIA OLD CODE
|
|
4800 ASSIGN 3002 TO IGO1
|
|
ASSIGN 3022 TO IGO2
|
|
GO TO 3000
|
|
C
|
|
C -------------------- OLD CODE REJOINS HERE ---------------------
|
|
C
|
|
3000 IF (IVLU.GT.0) REWIND IVLU
|
|
C
|
|
C ----- LOOP OVER RADIAL SURFACES -----
|
|
C
|
|
DO 3100 LL=1,MXLAM
|
|
P1 = LAM(4*LL-3)
|
|
Q1 = LAM(4*LL-2)
|
|
P2 = LAM(4*LL-1)
|
|
P = LAM(4*LL)
|
|
NNZ=0
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=LL
|
|
ELSE
|
|
IX=1
|
|
ENDIF
|
|
C
|
|
DO 3200 IC=1,N
|
|
JC = JLEV(J(IC) )
|
|
J1C = JLEV(J(IC) + 2*NLEV)
|
|
J2C = JLEV(J(IC) + NLEV)
|
|
ISTC = JLEV(J(IC) + 5*NLEV)
|
|
NKC = JLEV(J(IC) + 6*NLEV)
|
|
C
|
|
DO 3200 IR=1,IC
|
|
JR = JLEV(J(IR) )
|
|
J1R = JLEV(J(IR) + 2*NLEV)
|
|
J2R = JLEV(J(IR) + NLEV)
|
|
ISTR = JLEV(J(IR) + 5*NLEV)
|
|
NKR = JLEV(J(IR) + 6*NLEV)
|
|
C
|
|
VL(IX)=0.D0
|
|
KKC=-J1C
|
|
C
|
|
C ----- LOOP OVER EXPANSION COEFFICIENTS. -----
|
|
C ----- SKIP IMMEDIATELY IF COEFFICIENT IS SMALL. -----
|
|
C
|
|
DO 3300 KC=1,NKC
|
|
IF (ABS(ATAU(ISTC+KC)).LE.EPS) GO TO 3300
|
|
KKR=-J1R
|
|
C
|
|
DO 3400 KR=1,NKR
|
|
IF (ABS(ATAU(ISTR+KR)).LE.EPS) GO TO 3400
|
|
AF=ATAU(ISTR+KR)*ATAU(ISTC+KC)
|
|
IF (KKR-KKC.NE.Q1) GO TO 3500
|
|
GO TO IGO1,(3001,3002)
|
|
3001 VL(IX)=VL(IX)+AF
|
|
1 *QSYMTP(J1R,KKR,J1C,KKC,J2R,J2C,L(IR),L(IC),
|
|
2 JR,JC,JTOT,P1,Q1,P2,P)
|
|
GO TO 3009
|
|
3002 VL(IX)=VL(IX)+AF*RSYMTP(J1R,KKR,J2R,J1C,KKC,J2C,
|
|
1 JR,JC,MVAL,P1,Q1,P2,P)
|
|
3009 IF (Q1.EQ.0) GO TO 3400
|
|
3500 IF(KKC-KKR.NE.Q1) GO TO 3400
|
|
AF = AF*PARITY3(P1+P2+P+Q1)
|
|
GO TO IGO2(3011,3022)
|
|
3011 VL(IX)=VL(IX)+AF
|
|
1 *QSYMTP(J1R,KKR,J1C,KKC,J2R,J2C,L(IR),L(IC),
|
|
2 JR,JC,JTOT,P1,-Q1,P2,P)
|
|
GO TO 3400
|
|
3022 VL(IX)=VL(IX)+AF*RSYMTP(J1R,KKR,J2R,J1C,KKC,J2C,
|
|
1 JR,JC,MVAL,P1,-Q1,P2,P)
|
|
3400 KKR=KKR+1
|
|
C
|
|
3300 KKC=KKC+1
|
|
C
|
|
IF (VL(IX).NE.0.D0) NNZ=NNZ+1
|
|
IF(IVLU .EQ. 0) THEN
|
|
IX = IX + MXLAM
|
|
ELSE
|
|
IX = IX + 1
|
|
ENDIF
|
|
3200 CONTINUE
|
|
IF (NNZ.EQ.0.AND.PRINT.GT.3) WRITE(6,697) P1,Q1,P2,P
|
|
697 FORMAT(' * * * NOTE. ALL COUPLING COEFFICIENTS ARE ZERO FOR P1,
|
|
& Q1, P2, P = ', 4I4)
|
|
3100 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE CPLOUT(IV,V,N,NPOTL)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION IV(1), V(1)
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C THIS ROUTINE PRINTS OUT THE COUPLING MATRIX ELEMENTS.
|
|
WRITE(6,602) NPOTL
|
|
602 FORMAT('0 COUPLING MATRIX ELEMENTS BETWEEN CHANNELS FOR',I4,
|
|
1 ' SYMMETRIES.')
|
|
IF (IVLFL.GT.0) THEN
|
|
IMAX=0
|
|
DO 1000 I=1,N
|
|
DO 1000 J=1,I
|
|
IMIN=IMAX+1
|
|
IMAX=IMAX+NPOTL
|
|
WRITE(6,600) I,J
|
|
600 FORMAT('0 FOR CHANNEL ',I3,' TO CHANNEL',I4)
|
|
WRITE(6,601) (IV(IJ),V(IJ),IJ=IMIN,IMAX)
|
|
601 FORMAT(' ',7(I3,1X,F12.5))
|
|
1000 CONTINUE
|
|
ELSE
|
|
IMIN=0
|
|
DO 2000 I=1,N
|
|
DO 2000 J=1,I
|
|
WRITE(6,600) I,J
|
|
WRITE(6,601) (LL,V(IMIN+LL),LL=1,NPOTL)
|
|
2000 IMIN=IMIN+NPOTL
|
|
ENDIF
|
|
RETURN
|
|
END
|
|
SUBROUTINE DAPROP(U, Y, N,
|
|
& RBEGIN, REND, NSTEPS, IREAD, IWRITE, ISCRU,
|
|
& Y14, Y23, ESHIFT, DIAG,
|
|
& P, VL, IV, ERED, EINT, CENT, RMLMDA,
|
|
& MXLAM, NPOTL, ISTART, NODES)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C ROUTINE TO SOLVE THE CLOSE COUPLED EQUATIONS USING AN
|
|
C IMPROVED LOG DERIVATIVE ALGORITHM. THE DIAGONAL OF THE
|
|
C COUPLING MATRIX EVALUATED AT THE MIDPOINT OF EACH SECTOR
|
|
C IS USED AS A REFERENCE POTENTIAL FOR THE SECTOR.
|
|
C
|
|
LOGICAL IREAD,IWRITE
|
|
DIMENSION U(N,N),Y(N,N),Y14(N),Y23(N),ESHIFT(N),DIAG(N)
|
|
DIMENSION P(MXLAM),VL(2),IV(2),EINT(N),CENT(N)
|
|
C
|
|
NODES=0
|
|
ESAVE=ERED
|
|
DO 20 I=1,N
|
|
ESHIFT(I)=EINT(I)-ERED
|
|
EINT(I)=0.D0
|
|
20 CONTINUE
|
|
ERED=0.D0
|
|
C
|
|
C THIS VERSION USES A CONSTANT STEP SIZE THROUGHOUT THE
|
|
C INTEGRATION RANGE, WITH NSTEPS STEPS BETWEEN RBEGIN AND REND.
|
|
C
|
|
H=(REND-RBEGIN)/DBLE(2*NSTEPS)
|
|
D1=H*H/3.D0
|
|
D2=2.D0*D1
|
|
D4=-D1/16.D0
|
|
HALF=0.5D0*H
|
|
C
|
|
IF (IREAD) GO TO 60
|
|
NSAVE=0
|
|
R=RBEGIN
|
|
CALL WAVMAT(U,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
DO 40 J=1,N
|
|
DO 40 I=J,N
|
|
U(I,J)=D1*U(I,J)
|
|
40 CONTINUE
|
|
IF (IWRITE) WRITE (ISCRU) DIAG,U
|
|
GO TO 80
|
|
60 READ (ISCRU) DIAG,U
|
|
80 CONTINUE
|
|
C
|
|
C ISTART=0/1 MEANS THAT INITIAL LOG DERIVATIVE MATRIX ISN'T/IS
|
|
C ALREADY IN Y. DEFAULT IS 0.
|
|
C
|
|
IF(ISTART.EQ.1) GO TO 140
|
|
SGN=1.D0
|
|
IF(REND.LT.RBEGIN) SGN=-1.D0
|
|
DO 120 J=1,N
|
|
DO 100 I=J,N
|
|
100 Y(I,J)=0.D0
|
|
WREF=DIAG(J)+ESHIFT(J)
|
|
Y(J,J)=SGN*1.D30
|
|
IF(WREF.GT.0.D0) Y(J,J)=SGN*SQRT(WREF)
|
|
120 CONTINUE
|
|
140 CONTINUE
|
|
C
|
|
DO 160 J=1,N
|
|
DO 160 I=J,N
|
|
Y(I,J)=H*Y(I,J)+U(I,J)
|
|
160 CONTINUE
|
|
C
|
|
DO 500 KSTEP=1,NSTEPS
|
|
IF (IREAD) GO TO 260
|
|
R=R+H
|
|
CALL WAVMAT(U,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
DO 200 J=1,N
|
|
DO 200 I=J,N
|
|
U(I,J)=D4*U(I,J)
|
|
200 CONTINUE
|
|
DO 220 I=1,N
|
|
U(I,I)=0.125D0
|
|
220 CONTINUE
|
|
CALL SYMINV(U,N,N,KOUNT)
|
|
IF (KOUNT.GT.N) GO TO 900
|
|
NSAVE=NSAVE+KOUNT
|
|
DO 240 I=1,N
|
|
U(I,I)=U(I,I)-8.D0
|
|
240 CONTINUE
|
|
IF (IWRITE) WRITE (ISCRU) DIAG,U
|
|
GO TO 280
|
|
260 READ (ISCRU) DIAG,U
|
|
280 CONTINUE
|
|
C
|
|
DO 300 I=1,N
|
|
WREF=DIAG(I)+ESHIFT(I)
|
|
ARG=HALF*SQRT(ABS(WREF))
|
|
IF (WREF.LT.0.D0) THEN
|
|
TN=TAN(ARG)
|
|
Y14(I)=ARG/TN-ARG*TN
|
|
Y23(I)=ARG/TN+ARG*TN
|
|
ELSE
|
|
C IF (WREF.GT.0.D0) THEN
|
|
TH=TANH(ARG)
|
|
Y14(I)=ARG/TH+ARG*TH
|
|
Y23(I)=ARG/TH-ARG*TH
|
|
ENDIF
|
|
U(I,I)=U(I,I)+2.D0*Y14(I)
|
|
Y14(I)=Y14(I)-D1*DIAG(I)
|
|
Y14(I)=MAX(Y14(I),0.D0)
|
|
Y(I,I)=Y(I,I)+Y14(I)
|
|
300 CONTINUE
|
|
C
|
|
CALL SYMINV(Y,N,N,KOUNT)
|
|
IF (KOUNT.GT.N) GO TO 900
|
|
NODES=NODES+KOUNT
|
|
DO 320 J=1,N
|
|
DO 320 I=J,N
|
|
Y(I,J)=U(I,J)-Y23(I)*Y(I,J)*Y23(J)
|
|
320 CONTINUE
|
|
CALL SYMINV(Y,N,N,KOUNT)
|
|
IF (KOUNT.GT.N) GO TO 900
|
|
NODES=NODES+KOUNT
|
|
C
|
|
IF (IREAD) GO TO 360
|
|
R=R+H
|
|
CALL WAVMAT(U,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
IF (KSTEP.EQ.NSTEPS) D2=D1
|
|
DO 340 J=1,N
|
|
DO 340 I=J,N
|
|
U(I,J)=D2*U(I,J)
|
|
340 CONTINUE
|
|
IF (IWRITE) WRITE (ISCRU) U
|
|
GO TO 380
|
|
360 READ (ISCRU) U
|
|
380 CONTINUE
|
|
C
|
|
DO 400 J=1,N
|
|
DO 400 I=J,N
|
|
Y(I,J)=U(I,J)-Y23(I)*Y(I,J)*Y23(J)
|
|
400 CONTINUE
|
|
DO 420 I=1,N
|
|
Y(I,I)=Y(I,I)+Y14(I)
|
|
420 CONTINUE
|
|
500 CONTINUE
|
|
C
|
|
HI=1.D0/H
|
|
DO 520 J=1,N
|
|
DO 520 I=J,N
|
|
Y(I,J)=HI*Y(I,J)
|
|
Y(J,I)=Y(I,J)
|
|
520 CONTINUE
|
|
C
|
|
DO 540 I=1,N
|
|
EINT(I)=ESHIFT(I)+ESAVE
|
|
540 CONTINUE
|
|
ERED=ESAVE
|
|
IF(IWRITE) WRITE(ISCRU) NSAVE
|
|
IF(IREAD) READ (ISCRU) NSAVE
|
|
NODES=NODES-NSAVE
|
|
RETURN
|
|
C
|
|
900 WRITE (6,1000) KSTEP
|
|
1000 FORMAT('0***** MATRIX INVERSION ERROR IN DAPROP AT ',
|
|
& 'STEP K = ',I6,' RUN HALTED.')
|
|
STOP
|
|
END
|
|
SUBROUTINE DASCAT(N, NSQ, MXLAM, NPOTL,
|
|
1 SR, SI, U, VL, IV, EINT, CENT, WVEC, L, NB,
|
|
2 P, Y1, Y2, Y3, Y4,
|
|
3 ICODE, IPRINT, IC)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C *** ---------------------------------------------------------------
|
|
C *** ROUTINE TO PERFORM A SCATTERING CALCULATION USING DAPROP.
|
|
C *** ON EXIT SR AND SI CONTAIN THE S MATRIX.
|
|
C *** SR IS USED INTERNALLY TO HOLD THE LOG DERIVATIVE MATRIX
|
|
C *** IN ORDER TO ECONOMISE ON WORKSPACE.
|
|
C *** ---------------------------------------------------------------
|
|
C *** ICODE.EQ.2 FOR SUBSEQUENT ENERGIES.
|
|
C ***
|
|
C DIMENSION STATEMENTS FOR ARGUMENT LIST
|
|
DIMENSION U(NSQ),Y1(N),Y2(N),Y3(N),Y4(N)
|
|
DIMENSION P(MXLAM),VL(2),IV(2),SR(NSQ),SI(NSQ),
|
|
& EINT(N),CENT(N),WVEC(N),L(N),NB(N)
|
|
C
|
|
COMMON/DRIVE/STEST,STEPS,STABIL,CONV,RMIN,RMAX,XEPS,DR,
|
|
1 DRMAX,RMID,TOLHI,RTURN,VTOL,ESHIFT,ERED,RMLMDA,
|
|
2 NOPEN,JKEEP,ISCRU,MAXSTP
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C THE FOLLOWING VARIABLES FROM COMMON/DRIVE/ ARE USED WITH THIS
|
|
C PROPAGATOR: STEPS,RMIN,RMAX,ERED,RMLMDA,NOPEN,ISCRU
|
|
C
|
|
LOGICAL IREAD,IWRITE
|
|
C ----------------------------------------------------------------
|
|
C SET UP TO USE UNIT (ISCRU)
|
|
IREAD = ICODE.EQ.2 .AND. ISCRU.GT.0
|
|
IWRITE = ICODE.EQ.1 .AND. ISCRU.GT.0
|
|
C ---------------------------------------------------------------
|
|
C
|
|
C CALCULATE WAVEVECTORS AND STEP SIZE
|
|
C
|
|
WMAX=0.D0
|
|
NOPEN=0
|
|
DO 20 I=1,N
|
|
DIF=ERED-EINT(I)
|
|
WVEC(I)=SIGN(SQRT(ABS(DIF)),DIF)
|
|
WMAX=MAX(WMAX,WVEC(I))
|
|
NB(I)=I
|
|
IF (DIF.GT.0.D0) NOPEN=NOPEN+1
|
|
20 CONTINUE
|
|
IF (NOPEN.EQ.0) RETURN
|
|
C
|
|
IF (IREAD) GO TO 40
|
|
PI=ACOS(-1.D0)
|
|
NSTEPS=WMAX*STEPS*(RMAX-RMIN)/PI
|
|
RBEGIN=RMIN
|
|
REND=RMAX
|
|
IF (IWRITE) WRITE (ISCRU) RBEGIN,REND,NSTEPS
|
|
GO TO 60
|
|
40 READ (ISCRU) RBEGIN,REND,NSTEPS
|
|
60 CONTINUE
|
|
ISTART=0
|
|
C
|
|
C PROPAGATE LOG DERIVATIVE MATRIX THROUGH THE SCATTERING REGION
|
|
C ---------------------------------------------------------------
|
|
IF(N.EQ.1) GOTO 90
|
|
CALL DAPROP(U, SR, N,
|
|
& RBEGIN, REND, NSTEPS, IREAD, IWRITE, ISCRU,
|
|
& Y1, Y2, Y3, Y4,
|
|
& P, VL, IV, ERED, EINT, CENT, RMLMDA,
|
|
& MXLAM, NPOTL, ISTART, NODES)
|
|
C ---------------------------------------------------------------
|
|
IF (IPRINT.GE.3) WRITE (6,1000) RBEGIN,REND,NSTEPS
|
|
1000 FORMAT('0 DAPROP. LOG DERIVATIVE MATRIX INTEGRATED FROM ',
|
|
& F12.4,' TO ',F12.4,' IN ',I6,' STEPS.')
|
|
C
|
|
C SORT CHANNELS BY ASYMPTOTIC ENERGY
|
|
C
|
|
NM1=N-1
|
|
DO 80 I=1,NM1
|
|
IP1=I+1
|
|
DO 80 J=IP1,N
|
|
IF (EINT(NB(I)).LE.EINT(NB(J))) GO TO 80
|
|
IT=NB(I)
|
|
NB(I)=NB(J)
|
|
NB(J)=IT
|
|
80 CONTINUE
|
|
GOTO 100
|
|
C
|
|
C SPECIAL CASE FOR EFFICIENT SINGLE CHANNEL CALCULATIONS
|
|
C 1/21/93 CHANGES TO DYNAMIC STORAGE: N.B IT5 FROM STORAG IS
|
|
C PASSED AS ARGUMENT IC TO FOLLOW CODING IN EARLIER VERSIONS.
|
|
C
|
|
90 NPT=NSTEPS+1
|
|
ISVMEM=IXNEXT
|
|
IT1=IC
|
|
IT2=IT1+NPT
|
|
IT3=IT2+NPT
|
|
IT4=IT3+NPT
|
|
IT5=IT4+NPT
|
|
IC1=IT5+NPT
|
|
ITP=IT3
|
|
IC2=ITP+NPT*MXLAM
|
|
IXNEXT=MAX0(IC1,IC2)
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
CALL ODPROP(SR, X(IT1), X(IT2), X(IT3), X(IT4), X(IT5),
|
|
& RBEGIN, REND, NPT, IREAD, IWRITE, ISCRU,
|
|
& X(ITP), VL, IV, ERED, EINT, CENT, RMLMDA,
|
|
& MXLAM, NPOTL, ISTART, NODES)
|
|
C RESTORE STORAGE POINTER TO RECOVER TEMPORARY STORAGE.
|
|
IXNEXT=ISVMEM
|
|
C ---------------------------------------------------------------
|
|
IF (IPRINT.GE.3) WRITE (6,1010) RBEGIN,REND,NSTEPS
|
|
1010 FORMAT('0 ODPROP. LOG DERIVATIVE INTEGRATED FROM ',
|
|
& F12.4,' TO ',F12.4,' IN ',I6,' STEPS.')
|
|
C
|
|
C CALCULATE K AND S MATRICES
|
|
C
|
|
100 CALL YTOK(NB,WVEC,L,N,NOPEN,Y1,Y2,Y3,Y4,SR,SI,U,REND)
|
|
CALL KTOS(U,SR,SI,NOPEN)
|
|
RETURN
|
|
END
|
|
SUBROUTINE DASIZE(ILSU,MXREC)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE MXUSED,IX
|
|
PARAMETER (NREC=20000)
|
|
DIMENSION IX(6,NREC)
|
|
DIMENSION IR2(2),IS2(2)
|
|
EQUIVALENCE (R,IR1,IR2(1)),(S,IS1,IS2(1))
|
|
COMMON /ASSVAR/IDA
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
C NEEDED FOR NIPR; PREVIOUSLY PASSED IN COMMON /INTPAC/
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
DATA MAX/NREC/
|
|
C
|
|
MXREC=MAX
|
|
ILSU=999
|
|
WRITE(6,601) MAX
|
|
601 FORMAT( ' *** *** NUMBER OF SIMULATED RECORDS =',I7)
|
|
RETURN
|
|
C
|
|
ENTRY DAOPEN
|
|
MXUSED=0
|
|
WRITE(6,600)
|
|
600 FORMAT(/' *** *** IN-CORE DA SIMULATION ROUTINE HAS CONTROL.',
|
|
1 /' *** *** DA FILE WILL NOT BE USED.')
|
|
C
|
|
IF(NIPR.EQ.1 .OR. NIPR.EQ.2) GOTO 1000
|
|
WRITE(6,602) NIPR
|
|
602 FORMAT(' *** ERROR IN DASIZE/DAOPEN: NIPR =',I3,' INVALID')
|
|
STOP
|
|
1000 RETURN
|
|
C
|
|
ENTRY DARD1(I1,I2,I3,I4,I5,I6)
|
|
I1=IX(1,IDA)
|
|
I2=IX(2,IDA)
|
|
I3=IX(3,IDA)
|
|
I4=IX(4,IDA)
|
|
I5=IX(5,IDA)
|
|
I6=IX(6,IDA)
|
|
RETURN
|
|
C
|
|
ENTRY DAWR1(I1,I2,I3,I4,I5,I6)
|
|
MXUSED=MAX0(MXUSED,IDA)
|
|
IX(1,IDA)=I1
|
|
IX(2,IDA)=I2
|
|
IX(3,IDA)=I3
|
|
IX(4,IDA)=I4
|
|
IX(5,IDA)=I5
|
|
IX(6,IDA)=I6
|
|
RETURN
|
|
C
|
|
ENTRY DARD2(I1,I2,X1,X2)
|
|
I1=IX(1,IDA)
|
|
I2=IX(2,IDA)
|
|
IF(NIPR.EQ.1) THEN
|
|
IR1=IX(3,IDA)
|
|
IS1=IX(4,IDA)
|
|
ELSE
|
|
IR2(1)=IX(3,IDA)
|
|
IR2(2)=IX(4,IDA)
|
|
IS2(1)=IX(5,IDA)
|
|
IS2(2)=IX(6,IDA)
|
|
ENDIF
|
|
X1=R
|
|
X2=S
|
|
RETURN
|
|
C
|
|
ENTRY DAWR2(I1,I2,X1,X2)
|
|
MXUSED=MAX0(MXUSED,IDA)
|
|
IX(1,IDA)=I1
|
|
IX(2,IDA)=I2
|
|
R=X1
|
|
S=X2
|
|
IF(NIPR.EQ.1) THEN
|
|
IX(3,IDA)=IR1
|
|
IX(4,IDA)=IS1
|
|
ELSE
|
|
IX(3,IDA)=IR2(1)
|
|
IX(4,IDA)=IR2(2)
|
|
IX(5,IDA)=IS2(1)
|
|
IX(6,IDA)=IS2(2)
|
|
ENDIF
|
|
RETURN
|
|
C
|
|
ENTRY DACLOS
|
|
WRITE(6,610) MXUSED,MAX
|
|
610 FORMAT(/' *** IN-CORE DA SIMULATOR USED',I10,' OF THE',I10,
|
|
1 ' ALLOCATED RECORDS')
|
|
RETURN
|
|
END
|
|
SUBROUTINE DELRD(DR,CDIAG,COFF,TOL,DRMAX,E1,EN,RNOW,RMAX)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C-------------------------------------------------------------------
|
|
C THIS ROUTINE IS MODIFIED VERSION OF ROY GORDON'S QCPE PROGRAM.
|
|
C THIS VERSION FOR SCATTERING CALCULATION
|
|
C-------------------------------------------------------------------
|
|
C ADJUST THE STEP SIZE TO TRY TO KEEP MAX(CDIAG,COFF) = TOL
|
|
RTOL = 0.80D0*TOL
|
|
C-------------------------------------------------------------------
|
|
C FIND CORRECTION FACTOR FROM DIAGONAL PERTURBATIONS
|
|
C-------------------------------------------------------------------
|
|
IF (CDIAG .NE. 0.D0) GO TO 100
|
|
C-------------------------------------------------------------------
|
|
C CASE IN WHICH DIAGONAL PERTURBATIONS VANISH
|
|
C-------------------------------------------------------------------
|
|
DFACT = 2.5D0
|
|
GO TO 110
|
|
C-------------------------------------------------------------------
|
|
C DIAGONAL PERTURBATIONS VARY ROUGHLY AS THE FIFTH POWER OF STEP SIZE
|
|
C-------------------------------------------------------------------
|
|
100 DFACT = (RTOL/CDIAG)**0.333D0
|
|
C-------------------------------------------------------------------
|
|
C FIND CORRECTION FACTOR FROM OFF-DIAGONAL PERTURBATIONS
|
|
C-------------------------------------------------------------------
|
|
110 IF (COFF .NE. 0.D0) GO TO 120
|
|
C-------------------------------------------------------------------
|
|
C CASE IN WHICH OFF-DIAGONAL PERTURBATIONS VANISH
|
|
C-------------------------------------------------------------------
|
|
OFACT = 2.5D0
|
|
GO TO 130
|
|
C-------------------------------------------------------------------
|
|
C OFF-DIAGONAL PERTURBATIONS VARY ROUGHLY AS CUBE OF STEP SIZE
|
|
C-------------------------------------------------------------------
|
|
120 OFACT = (RTOL/COFF)**0.333D0
|
|
C-------------------------------------------------------------------
|
|
C FIND MINIMUM FACTOR
|
|
C-------------------------------------------------------------------
|
|
130 FACTOR = MIN(DFACT,OFACT)
|
|
IF (EN .GT. 0.D0) GO TO 150
|
|
IF (E1 .GT. 0.D0) GO TO 140
|
|
C-------------------------------------------------------------------
|
|
C THIS IS REACHED ONLY WHEN ALL CHANNELS ARE IN THEIR CLASSICALLY
|
|
C FORBIDDEN REGIONS. THEN ACCURACY IS QUITE SENSITIVE TO CHANGES
|
|
C IN STEP SIZE.
|
|
C HENCE IN THIS REGION MAKE ONLY CAUTIOUS CHANGES IN STEP SIZE
|
|
C-------------------------------------------------------------------
|
|
IF (FACTOR .GT. 1.15D0) FACTOR = 1.15D0
|
|
GO TO 170
|
|
C-------------------------------------------------------------------
|
|
C THIS IS REACHED WHEN SOME CHANNELS ARE CLASSICAL AND OTHERS NOT
|
|
C-------------------------------------------------------------------
|
|
140 IF (FACTOR .GT. 1.20D0) FACTOR = 1.20D0
|
|
GO TO 170
|
|
C-------------------------------------------------------------------
|
|
C THIS IS REACHED WHEN ALL CHANNELS ARE CLASSICAL.
|
|
C THEN THE STEP SIZE IS OFTEN INCREASING RAPIDLY, AND ALSO THE
|
|
C ACCURACY VARIES MORE SLOWLY WITH STEP SIZE.
|
|
C THUS WE MAKE BOLDER INCREASES IN THE STEP SIZE, TO KEEP THE
|
|
C CORRECTIONS OF THE SAME ORDER OF MAGNITUDE AS BEFORE
|
|
C TEST TO SEE HOW FAR WE HAVE INTEGRATED
|
|
C-------------------------------------------------------------------
|
|
150 IF (RNOW .GT. (0.10D0*RMAX)) GO TO 160
|
|
IF (FACTOR .GT. 1.6D0) FACTOR = 1.6D0
|
|
GO TO 170
|
|
C-------------------------------------------------------------------
|
|
C CHOOSE FACTOR IN FAR AYSMPTOTIC REGION
|
|
C-------------------------------------------------------------------
|
|
160 IF (FACTOR .GT. 2.5D0) FACTOR = 2.5D0
|
|
C-------------------------------------------------------------------
|
|
C SET NEW STEP SIZE
|
|
C-------------------------------------------------------------------
|
|
170 DR = DR*FACTOR
|
|
C-------------------------------------------------------------------
|
|
C CHECK AGAINST DRMAX AND EXCESSIVE GROWTH OF CLOSED CHANNELS
|
|
C-------------------------------------------------------------------
|
|
IF (EN .GE. 0.D0) GO TO 175
|
|
DREXP = 4.D0/SQRT(-EN)
|
|
IF (DR .GT. DREXP) DR = DREXP
|
|
175 IF (DR .GT. DRMAX) DR = DRMAX
|
|
IF (DR .LT. 1.0D-06*DRMAX) GO TO 180
|
|
RETURN
|
|
180 WRITE (6,1000) DR,CDIAG,COFF,TOL,DRMAX,E1,EN,RNOW,RMAX
|
|
STOP
|
|
C-------------------------------------------------------------------
|
|
C FORMATS
|
|
C-------------------------------------------------------------------
|
|
1000 FORMAT('0 * * * ERROR IN DELRD. STEP SIZE =',E20.6,
|
|
1 ' IS TOO SMALL'/'0',24X,'PARAMETERS PASSED ARE',
|
|
2 ' CDIAG, COFF, TOL, DRMAX, E1, EN, RNOW, RMAX'/
|
|
4 25X,9(E10.3,1X))
|
|
C----------------***END-DELRD***------------------------------------
|
|
END
|
|
SUBROUTINE DERMAT(IDER,W,N,R,P,VL,IV,CENT,RMLMDA,
|
|
1 MXLAM,NPOTL,NUMDER)
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE RSAVE
|
|
LOGICAL NUMDER
|
|
C
|
|
C EVALUATES THE IDER'TH DERIVATIVE OF THE POTENTIAL MATRIX AT RADIUS
|
|
C W = VCOUPL + VCENT
|
|
C ORDER OF THE REAL SYMMETRIC MATRIX W IS N
|
|
C THE FULL MATRIX IS COMPUTED
|
|
C VL IS THE PREVIOUSLY COMPUTED MATRIX OF THE COUPLING POTENTIAL
|
|
C IV IS AN INDEX ARRAY MAPPING P ONTO VL, SUCH THAT VL(I) IS
|
|
C A COEFFICIENT TO MULTIPLY P(IV(I))
|
|
C CENT(I) IS L*(L+1) FOR THE I-TH CHANNEL
|
|
C RMLMDA IS THE SQUARE OF THE RATIO OF RM TO THE DEBROGLIE
|
|
C WAVELENGTH AT RELATIVE ENERGY EPSILON
|
|
C RMLMDA = 2.*URED*RM**2*EPSIL/HBAR**2
|
|
C RMLMDA MULTIPLIES THE POTENTIAL IN UNITS OF EPSIL
|
|
C
|
|
DIMENSION W(N,N),VL(1),IV(1),CENT(N),P(MXLAM)
|
|
DATA DEL/1.D-3/, RSAVE/-999.D0/
|
|
C
|
|
IF(NUMDER) GOTO 5
|
|
C
|
|
C COMPUTE THE RADIAL PARTS OF THE POTENTIAL ANALYTICALLY
|
|
CALL POTENL(IDER,MXLAM,NPOTL,IDUM1,R,P,IDUM2)
|
|
|
|
C IDUM1 AND IDUM2 ARE DUMMY ARGUMENTS HERE.
|
|
GOTO 14
|
|
C
|
|
C NUMERICAL DERIVATIVE OPTION.
|
|
C NOTE THAT IF IDER = 2 THIS ASSUMES THAT
|
|
C THE POTENTIAL ITSELF IS ALREADY IS ALREADY IN THE FIRST
|
|
C MXLAM ELEMENTS OF P. THIS IS NOT TRUE IF DERMAT HAS BEEN
|
|
C CALLED MORE RECENTLY THAN WAVMAT, SO THE IDER = 2 CALL
|
|
C MUST PRECEDE THE IDER = 1 CALL.
|
|
C
|
|
C FIRST SEE WHETHER DERMAT HAS BEEN CALLED BEFORE FOR THIS
|
|
C VALUE OF R, AND IF SO SKIP POTENTIAL EVALUATIONS
|
|
C
|
|
5 IF(R.EQ.RSAVE) GOTO 8
|
|
RSAVE=R
|
|
RR=R-DEL
|
|
CALL POTENL(0,MXLAM,NPOTL,IDUM1,RR,P(MXLAM+1),IDUM2)
|
|
RR=R+DEL
|
|
CALL POTENL(0,MXLAM,NPOTL,IDUM1,RR,P(2*MXLAM+1),IDUM2)
|
|
C
|
|
8 DO 10 I=1,MXLAM
|
|
P1=P(MXLAM+I)
|
|
P2=P(2*MXLAM+I)
|
|
IF(IDER.EQ.1) P(I) = (P2-P1)/(2.D0*DEL)
|
|
10 IF(IDER.EQ.2) P(I) = (P2+P1-2.D0*P(I)/RMLMDA)/(DEL*DEL)
|
|
C
|
|
14 DO 15 I=1,MXLAM
|
|
15 P(I)=RMLMDA*P(I)
|
|
C
|
|
CALL WAVVEC(VL,P,IV,W,N,NPOTL)
|
|
C
|
|
C NOW COMPUTE THE DIAGONAL CONTRIBUTIONS W(I,I).
|
|
C
|
|
IF(IDER.EQ.1) RSQ=-2.D0/R**3
|
|
IF(IDER.EQ.2) RSQ= 6.D0/R**4
|
|
DO 20 I=1,N
|
|
W(I,I) = W(I,I) + RSQ*CENT(I)
|
|
20 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE DGEMUL(A,LDA,TRANSA,B,LDB,TRANSB,C,LDC,L,M,N)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
CHARACTER*1 TRANSA,TRANSB
|
|
CALL DGEMM(TRANSA,TRANSB,L,N,M,1.D0,A,LDA,B,LDB,0.D0,C,LDC)
|
|
RETURN
|
|
END
|
|
SUBROUTINE DMSYM(J,NK,EVAL,EVEC,EVEC2,WKS)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE SYMPRT
|
|
PARAMETER (IDMAX=3)
|
|
LOGICAL SYMPRT
|
|
CHARACTER*1 CSUB,REPNAM(3)
|
|
DIMENSION SMAT(IDMAX,IDMAX),SVEC(IDMAX,IDMAX),SIG(IDMAX)
|
|
DIMENSION EVAL(NK),EVEC(-J:J,NK),EVEC2(-J:J,NK),WKS(NK)
|
|
DATA SYMPRT/.FALSE./
|
|
DATA REPNAM/'A','E','F'/
|
|
DATA TOL/1.D-8/
|
|
C
|
|
C THE MATRIX DIAGONALISATION MAY RETURN EIGENVECTORS THAT ARE
|
|
C AWKWARD LINEAR COMBINATIONS OF DEGENERATE PAIRS/SETS.
|
|
C THIS ROUTINE FINDS SYMMETRISED COMBINATIONS
|
|
C THAT ARE EITHER EVEN OR ODD WITH RESPECT TO K -> -K
|
|
C BY CONSTRUCTING AND DIAGONALISING THE MATRIX REPRESENTATION
|
|
C OF SIGMA(XZ) FOR EACH DEGENERATE SET.
|
|
C
|
|
IMAX=0
|
|
DO 1000 IC=1,NK
|
|
IF(IC.LE.IMAX) GOTO 1000
|
|
C
|
|
C LOOK FOR DEGENERATE EIGENVECTORS
|
|
C
|
|
DO 200 JC=IC,NK
|
|
IF(ABS(EVAL(JC)-EVAL(IC)).GT.TOL) GOTO 200
|
|
IMAX=JC
|
|
200 CONTINUE
|
|
C
|
|
IDEG=1+IMAX-IC
|
|
IF(IDEG.GT.IDMAX) GOTO 1100
|
|
IF(IDEG.EQ.1) GOTO 920
|
|
IF(IDEG.GE.3) SYMPRT=.TRUE.
|
|
C
|
|
C NOW CONSTRUCT THE MATRIX REPRESENTATION
|
|
C
|
|
DO 400 L=1,IDEG
|
|
LC=IC+L-1
|
|
DO 400 M=1,IDEG
|
|
MC=IC+M-1
|
|
SMAT(M,L)=0.D0
|
|
DO 400 K=-J,J
|
|
SMAT(M,L)=SMAT(M,L)+EVEC(K,MC)*EVEC(-K,LC)
|
|
400 CONTINUE
|
|
C
|
|
IFAIL=0
|
|
CALL F02ABF(SMAT,IDMAX,IDEG,SIG,SVEC,IDMAX,WKS,IFAIL)
|
|
C
|
|
C COPY OLD EIGENVECTORS INTO SIG AND CONSTRUCT NEW ONES
|
|
C
|
|
DO 500 L=1,IDEG
|
|
LC=IC+L-1
|
|
DO 500 K=-J,J
|
|
EVEC2(K,L)=EVEC(K,LC)
|
|
500 CONTINUE
|
|
C
|
|
DO 600 L=1,IDEG
|
|
LC=IC+L-1
|
|
DO 600 K=-J,J
|
|
EVEC(K,LC)=0.D0
|
|
DO 600 M=1,IDEG
|
|
EVEC(K,LC)=EVEC(K,LC)+SVEC(M,L)*EVEC2(K,M)
|
|
600 CONTINUE
|
|
C
|
|
C THERE IS STILL A POSSIBILITY THAT EVEN AND ODD K ARE MIXED,
|
|
C BUT ONLY FOR TWO ADJACENT EIGENVECTORS. CHECK FOR THIS
|
|
C AND FIX IT IF IT IS FOUND
|
|
C
|
|
DO 900 L=1,IDEG-1
|
|
LC=IC+L-1
|
|
DO 700 K=-J,J-1
|
|
IF(ABS(EVEC(K,LC)*EVEC(K+1,LC)).LT.TOL) GOTO 700
|
|
THETA=ATAN2(EVEC(K,LC),EVEC(K,LC+1))
|
|
CO=COS(THETA)
|
|
SI=SIN(THETA)
|
|
GOTO 800
|
|
700 CONTINUE
|
|
GOTO 900
|
|
|
|
800 CONTINUE
|
|
C
|
|
C ARRIVE HERE IF THERE IS MIXING
|
|
C
|
|
DO 850 K=-J,J
|
|
TEMP =CO*EVEC(K,LC)-SI*EVEC(K,LC+1)
|
|
EVEC(K,LC)=SI*EVEC(K,LC)+CO*EVEC(K,LC+1)
|
|
EVEC(K,LC+1)=TEMP
|
|
850 CONTINUE
|
|
900 CONTINUE
|
|
C
|
|
C SPECIAL CODE TO WORK OUT SYMMETRY LABEL FOR SPHERICAL TOP
|
|
C
|
|
920 IF(.NOT.SYMPRT) GOTO 1000
|
|
CSUB=' '
|
|
IF(IDEG.EQ.2) GOTO 950
|
|
CSUB='1'
|
|
IF(J.LT.2) GOTO 950
|
|
DO 940 L=1,IDEG
|
|
LC=IC+L-1
|
|
IF(EVEC(2,LC)**2.GT.TOL) CSUB='2'
|
|
940 CONTINUE
|
|
C
|
|
950 WRITE(6,601) EVAL(LC),REPNAM(IDEG),CSUB
|
|
601 FORMAT(' ENERGY LEVEL AT',F12.5,' HAS SYMMETRY ',2A1)
|
|
C
|
|
1000 CONTINUE
|
|
RETURN
|
|
C
|
|
1100 WRITE(6,699) IDEG,IDMAX
|
|
STOP
|
|
699 FORMAT('0*** ERROR IN DMSYM: DEGENERACY',I3,' IS TOO LARGE ',
|
|
1 'FOR DIMENSION IDMAX =',I3)
|
|
END
|
|
SUBROUTINE DSYFIL(UPLO, N, A, LDA)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
CHARACTER*1 UPLO
|
|
DIMENSION A(LDA,N)
|
|
C
|
|
C SUBROUTINE TO FILL IN THE SECOND TRIANGLE OF A SYMMETRIC MATRIX.
|
|
C IF UPLO='L', THE LOWER TRIANGLE IS FILLED IN
|
|
C IF UPLO='U', THE UPPER TRIANGLE IS FILLED IN
|
|
C
|
|
IF(UPLO.EQ.'L') THEN
|
|
DO 10 J=1,N-1
|
|
10 CALL DCOPY(N-J,A(J,J+1),LDA,A(J+1,J),1)
|
|
ELSEIF(UPLO.EQ.'U') THEN
|
|
DO 20 J=1,N-1
|
|
20 CALL DCOPY(N-J,A(J+1,J),1,A(J,J+1),LDA)
|
|
ENDIF
|
|
C
|
|
RETURN
|
|
END
|
|
SUBROUTINE DVFREE(UJ,UJP,UN,UNP,WRONS,L,N,WV,R,NB)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C DOUBLE PRECISION ASYMPTOTIC FUNCTIONS FOR MATCHING TO S-MATRIX.
|
|
DIMENSION UJ(N),UJP(N),UN(N),UNP(N),WRONS(N),WV(N)
|
|
DIMENSION L(N),NB(N)
|
|
DO 3000 I=1,N
|
|
NX=NB(I)
|
|
DW=WV(NX)
|
|
DARG=DW*R
|
|
CALL RBES(L(NX),DARG,UJ(NX),UJP(NX),UN(NX),UNP(NX))
|
|
UJP(NX)=UJP(NX)*DW
|
|
UNP(NX)=UNP(NX)*DW
|
|
3000 WRONS(NX)=(UJ(NX)*UNP(NX)-UJP(NX)*UN(NX))/SQRT(DW)
|
|
RETURN
|
|
END
|
|
SUBROUTINE DVSCAT(N,NSQ,MXLAM,NPOTL,
|
|
1 SR,SI,A,VL,IV,EINT,CENT,WV,L,NB,
|
|
2 P,Y,YP,F,XM,YM,DIAG,ESHIFT,ICODE,PRINT)
|
|
C
|
|
C DEVOGELAERE INTEGRATION (DOUBLE PRECISION)
|
|
C INCLUDING START ROUTINE, SUPPRESSION OF CLOSED-CHANNEL GROWTH
|
|
C AND S-MATRIX DETERMINATION IN ASYMPTOTIC LIMIT.
|
|
C FOLLOWS OUTLINE OF PAUL MCGUIRE'S PROGRAM.
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
LOGICAL IREAD,IWRITE,END
|
|
INTEGER L(N),NB(N),IV(1)
|
|
INTEGER PRINT
|
|
DIMENSION Y(NSQ,4),YP(NSQ,2),F(NSQ,4),A(NSQ),XM(NSQ),YM(NSQ),
|
|
1 DIAG(N),P(MXLAM),SR(NSQ),SI(NSQ),VL(2),EINT(N),CENT(N),WV(N)
|
|
DIMENSION R(4)
|
|
C
|
|
C INDICES ON Y, YP, F ARE (ITH SOLN. COMP, NTH SOLN, KTH R-VALUE)
|
|
C
|
|
C COMMON FROM DRIVER
|
|
COMMON/DRIVE/STEST,STEPS,STAB,CONV,RMIN,RMAX,DUMMY(8),
|
|
1 ERED,RMLMDA,NOPEN,JKEEP,ISCRU,MAXSTP
|
|
C
|
|
C STEPS IS NO. OF STEPS PER (SHORTEST) WAVELENGTH.
|
|
C STAB IS NUMBER OF STEPS TAKEN BEFORE STABILIZATION.
|
|
C
|
|
C MAX. NUMBER OF TRIALS TO CONVERGE S-MATRIX IN ASYMPTOTIC REGION.
|
|
DATA MXSTRY/20/
|
|
C
|
|
IREAD = ICODE.EQ.2 .AND. ISCRU.GT.0
|
|
IWRITE = ICODE.EQ.1 .AND. ISCRU.GT.0
|
|
IF(IREAD .AND. PRINT.GE.5) WRITE(6,668)
|
|
668 FORMAT('0 DEVOGELAERE PROPAGATION WILL USE STORED INITIAL R,',
|
|
1 ' STEP SIZE AND POTENTIAL MATRICES')
|
|
C
|
|
C ZERO STORAGE . . .
|
|
C
|
|
NP1=N+1
|
|
DO 800 IJ=1,NSQ
|
|
SR(IJ)=0.D0
|
|
800 SI(IJ)=0.D0
|
|
DO 900 I=1,2
|
|
DO 900 IJ=1,NSQ
|
|
900 YP(IJ,I)=0.D0
|
|
DO 1000 I=1,4
|
|
DO 1000 IJ=1,NSQ
|
|
Y(IJ,I)=0.D0
|
|
1000 F(IJ,I)=0.D0
|
|
C
|
|
NSTRY=0
|
|
RMSAVE=RMAX
|
|
C
|
|
C ********** START INTEGRATION **********
|
|
CALL DVSTRT(RMIN,STEPS,ERED,RMLMDA,N,MXLAM,NPOTL,NOPEN,PRINT,
|
|
& A,DIAG,P,VL,IV,EINT,CENT,NB,WV,Y(1,2),YP(1,1),HH,
|
|
& ISCRU,IREAD,IWRITE)
|
|
IF (NOPEN.LE.0) GOTO 9000
|
|
NSTAB=STAB
|
|
NSTAB=MAX0(NSTAB,1)
|
|
H2=HH/2.D0
|
|
R(2)=RMIN
|
|
NSTEP=1
|
|
C GET F(,,2) FROM Y(,,2)
|
|
R4=R(2)
|
|
IF(.NOT.IREAD) GOTO 1200
|
|
READ(ISCRU) A
|
|
DO 1100 IJ=1,NSQ,NP1
|
|
1100 A(IJ)=A(IJ)-ESHIFT
|
|
GOTO 1300
|
|
1200 CALL WAVMAT(A,N,R4,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
IF(IWRITE) WRITE(ISCRU) A
|
|
1300 CALL DSYMM('L','L',N,N,1.D0,A,N,Y(1,2),N,0.D0,F(1,2),N)
|
|
CALL DAXPY(NSQ,1.D0,F(1,2),1,Y(1,2),1)
|
|
CALL DAXPY(NSQ,-H2,YP(1,1),1,Y(1,1),1)
|
|
CALL DAXPY(NSQ,0.5D0*H2*H2,F(1,2),1,Y(1,1),1)
|
|
C GET F(,,1) FROM THIS Y(,,1). NEEDS POTENTIAL AT R(1)
|
|
R(1)=R(2)-H2
|
|
R4=R(1)
|
|
IF(.NOT.IREAD) GOTO 1800
|
|
READ(ISCRU) A
|
|
DO 1700 IJ=1,NSQ,NP1
|
|
1700 A(IJ)=A(IJ)-ESHIFT
|
|
GOTO 1900
|
|
1800 CALL WAVMAT(A,N,R4,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
IF(IWRITE) WRITE(ISCRU) A
|
|
1900 CALL DSYMM('L','L',N,N,1.D0,A,N,Y(1,1),N,0.D0,F(1,1),N)
|
|
C
|
|
C ********** MAIN BODY OF ITERATION **********
|
|
C PROPAGATE FROM (-1/2) AND (0) TO (1/2) AND (1).
|
|
2000 CONTINUE
|
|
CALL DAXPY(NSQ,1.D0,Y(1,2),1,Y(1,3),1)
|
|
CALL DAXPY(NSQ,H2,YP(1,1),1,Y(1,3),1)
|
|
CALL DAXPY(NSQ,H2*H2*4.D0/6.D0,F(1,2),1,Y(1,3),1)
|
|
CALL DAXPY(NSQ,-H2*H2/6.D0,F(1,1),1,Y(1,3),1)
|
|
R(3)=R(2)+H2
|
|
R4=R(3)
|
|
IF(.NOT.IREAD) GOTO 2200
|
|
READ(ISCRU) A
|
|
DO 2100 IJ=1,NSQ,NP1
|
|
2100 A(IJ)=A(IJ)-ESHIFT
|
|
GOTO 2300
|
|
2200 CALL WAVMAT(A,N,R4,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
2300 IF(IWRITE) WRITE(ISCRU) A
|
|
CALL DSYMM('L','L',N,N,1.D0,A,N,Y(1,3),N,0.D0,F(1,3),N)
|
|
CALL DAXPY(NSQ,1.D0,Y(1,2),1,Y(1,4),1)
|
|
CALL DAXPY(NSQ,HH,YP(1,1),1,Y(1,4),1)
|
|
CALL DAXPY(NSQ,HH*HH/6.D0,F(1,2),1,Y(1,4),1)
|
|
CALL DAXPY(NSQ,HH*HH/3.D0,F(1,3),1,Y(1,4),1)
|
|
R(4)=R(3)+H2
|
|
R4=R(4)
|
|
IF(.NOT.IREAD) GOTO 2700
|
|
READ(ISCRU) A
|
|
DO 2600 IJ=1,NSQ,NP1
|
|
2600 A(IJ)=A(IJ)-ESHIFT
|
|
GOTO 2800
|
|
2700 CALL WAVMAT(A,N,R4,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
IF(IWRITE) WRITE(ISCRU) A
|
|
2800 CALL DSYMM('L','L',N,N,1.D0,A,N,Y(1,4),N,0.D0,F(1,4),N)
|
|
CALL DAXPY(NSQ,1.D0,YP(1,1),1,YP(1,2),1)
|
|
CALL DAXPY(NSQ,HH/6.D0,F(1,2),1,YP(1,2),1)
|
|
CALL DAXPY(NSQ,HH/6.D0,F(1,4),1,YP(1,2),1)
|
|
CALL DAXPY(NSQ,HH*4.D0/6.D0,F(1,3),1,YP(1,2),1)
|
|
NSTEP=NSTEP+1
|
|
C
|
|
C ********** THIS ENDS DEVOGELAERE CYCLE **********
|
|
C
|
|
NOPLOC=0
|
|
DO 2900 I=1,NSQ,NP1
|
|
2900 IF(A(I).LT.0.D0) NOPLOC=NOPLOC+1
|
|
C
|
|
END=R4.GT.RMAX .AND. NOPLOC.GE.NOPEN
|
|
IF(IREAD) READ(ISCRU) END
|
|
IF(END) GOTO 3000
|
|
C
|
|
C ********** STABILIZATION EVERY NSTAB STEPS **********
|
|
4000 IF(NSTEP-NSTAB*(NSTEP/NSTAB).NE.0) GOTO 5000
|
|
IF (PRINT.GT.12) WRITE(6,673) R(4)
|
|
673 FORMAT(' STABILIZATION DONE AT R =',E12.4)
|
|
C FIRST 2 COLS OF Y AND F AND ALSO A USED AS SCRATCH IN STABIL.
|
|
CALL STABIL(N,NB,Y(1,4),YP(1,2),F(1,3),F(1,4),
|
|
& A,Y(1,1),Y(1,2),F(1,1),F(1,2))
|
|
C
|
|
C ********** RE-INITIALIZE FOR NEXT CYCLE OF INTEGRATION *********
|
|
5000 R(1)=R(3)
|
|
R(2)=R(4)
|
|
IF(IWRITE) WRITE(ISCRU) IREAD
|
|
CALL DCOPY(NSQ,YP(1,2),1,YP(1,1),1)
|
|
CALL DCOPY(NSQ,Y(1,3),1,Y(1,1),1)
|
|
CALL DCOPY(NSQ,Y(1,4),1,Y(1,2),1)
|
|
CALL DCOPY(NSQ,F(1,3),1,F(1,1),1)
|
|
CALL DCOPY(NSQ,F(1,4),1,F(1,2),1)
|
|
DO 5200 IJ=1,NSQ
|
|
YP(IJ,2)=0.D0
|
|
Y(IJ,3)=0.D0
|
|
5200 Y(IJ,4)=0.D0
|
|
GOTO 2000
|
|
C
|
|
3000 CONTINUE
|
|
IF ((PRINT.GE.2.AND.NSTRY.LE.0) .OR. PRINT.GE.12)
|
|
& WRITE(6,601) NSTEP,R(4)
|
|
601 FORMAT(' INTEGRATION REACHED ASYMPTOTIC LIMIT IN',
|
|
& I5,' STEPS. R =',D12.4)
|
|
C
|
|
C ********** ASYMPTOTIC REGION - CALCULATE S-MATRIX **********
|
|
NOPSQ=NOPEN*NOPEN
|
|
C USE FIRST 2 COLS OF Y AND F FOR REGULAR AND IRREGULAR BESSEL FNS.
|
|
C AND DERIVATIVES - UJ, UJP, UN, AND UNP.
|
|
C USE FIRST COL. OF A FOR WRONSKIAN/SQRT(WV).
|
|
CALL DVFREE(Y(1,1),Y(1,2),F(1,1),F(1,2),A,L,NOPEN,WV,R(4),NB)
|
|
C FORM TRANSPOSE OF X- AND Y- MATRICES
|
|
DO 3200 J=1,NOPEN
|
|
IJ=J
|
|
DO 3100 I=1,NOPEN
|
|
NX=NB(I)
|
|
NY=NX+N*(J-1)
|
|
XM(IJ)=(F(NX,2)*Y(NY,4)-F(NX,1)*YP(NY,2)) / A(NX)
|
|
YM(IJ)=(Y(NX,2)*Y(NY,4)-Y(NX,1)*YP(NY,2)) / A(NX)
|
|
3100 IJ=IJ+NOPEN
|
|
3200 CONTINUE
|
|
C GET K-MATRIX FROM SOLN TO LINEAR EQNS,REPLACES RHS
|
|
DO 3300 I=1,NOPSQ
|
|
3300 A(I)=YM(I)
|
|
CALL DGESV(NOPEN,NOPEN,XM,NOPEN,Y,A,NOPEN,IER)
|
|
IF (IER.EQ.0) GOTO 3400
|
|
WRITE(6,688)
|
|
688 FORMAT('0 * * * WARNING. LOSS OF ACCURACY IN SOLVING FOR K.')
|
|
CALL OUTERR(11)
|
|
C
|
|
C FORCE SYMMETRY ON K-MATRIX AND CALCULATE S MATRIX
|
|
C
|
|
3400 CALL RSYM(NOPEN, A, STEST, PRINT)
|
|
CALL KTOS(A,XM,YM,NOPEN)
|
|
C
|
|
C TEST FOR CONVERGENCE OF SR, SI
|
|
C
|
|
TEST=0.D0
|
|
DO 3500 I=1,NOPSQ
|
|
TEST=MAX(TEST,ABS(SR(I)-XM(I)),ABS(SI(I)-YM(I)))
|
|
SR(I)=XM(I)
|
|
3500 SI(I)=YM(I)
|
|
C
|
|
IF(IREAD) GOTO 9000
|
|
IF(TEST.GT.STEST) GOTO 3600
|
|
IF(PRINT.GE.2) WRITE(6,686) NSTRY,R(4),TEST
|
|
686 FORMAT(' S-MATRIX CONVERGED AFTER',I3,' TRIES IN ',
|
|
& 'ASYMPTOTIC REGION. R =',D12.4,'. TEST =',E12.4)
|
|
GOTO 9000
|
|
3600 IF(NSTRY.GT.0 .AND. PRINT.GE.2) WRITE(6,687) NSTRY,R(4),TEST
|
|
687 FORMAT(' S-MATRIX NOT CONVERGED AFTER',I3,
|
|
& ' TRIES. R =',D12.4,'. LARGEST CHANGE =',D12.4)
|
|
IF (NSTRY.LT.MXSTRY) GOTO 3700
|
|
C SET 'CONV' FLAG FOR OUTPUT ROUTINE. . .
|
|
CONV=-1.D0
|
|
GOTO 9000
|
|
3700 NSTRY=NSTRY+1
|
|
RMAX=RMAX+STEPS*HH
|
|
GOTO 5000
|
|
C
|
|
C COMMON RETURN POINT
|
|
C RESTORE RMAX
|
|
9000 RMAX=RMSAVE
|
|
IF(IWRITE) WRITE(ISCRU) IWRITE
|
|
RETURN
|
|
END
|
|
SUBROUTINE DVSTRT(R,STEPS,ERED,RMLMDA,N,MXLAM,NPOTL,NOPEN,PRINT,
|
|
& W,DIAG,P,VL,IV,EINT,CENT,NB,WV,U,UP,HH,ISCRU,IREAD,IWRITE)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
INTEGER PRINT
|
|
LOGICAL SURF,IREAD,IWRITE
|
|
DIMENSION W(N,N),DIAG(N),P(2),VL(2),IV(1),EINT(N),CENT(N),NB(N),
|
|
& WV(N),U(N,N),UP(N,N)
|
|
C
|
|
C PROVIDE STARTING SOLUTION AND DERIVATIVE FOR DEVOGELAERE.
|
|
C ALSO PICK STEP SIZE, HH.
|
|
C STEPS IS NO. OF STEPS PER (SHORTEST) WAVELENGTH.
|
|
C THIS IS SIMPLEST VERSION, SIMILAR TO THAT OF MCGUIRE.
|
|
C
|
|
RSAVE=R
|
|
SURF=R.LT.0.D0
|
|
DRMIN=ABS(R/STEPS)
|
|
C
|
|
C * * * * * ORDER BASIS FUNCTIONS ON INCREASING INTERNAL ENERGY.
|
|
DO 3000 I=1,N
|
|
3000 NB(I)=I
|
|
IF (N.LE.1) GO TO 1000
|
|
NM1=N-1
|
|
DO 3100 I=1,NM1
|
|
IP1=I+1
|
|
DO 3100 J=IP1,N
|
|
IF (EINT(NB(I)).LE.EINT(NB(J))) GO TO 3100
|
|
IT=NB(I)
|
|
NB(I)=NB(J)
|
|
NB(J)=IT
|
|
3100 CONTINUE
|
|
C
|
|
C * * * * * SEE THAT ALL CHANNELS (IN FREE BASIS) ARE CLOSED.
|
|
IF(IREAD) GOTO 2000
|
|
1000 CALL WAVMAT(W,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
IF(PRINT.GT.12) WRITE(6,698) R,(P(I),I=1,MXLAM)
|
|
698 FORMAT('0 POTENTIAL ARRAY AT R =',F10.4/(10(1X,D12.5)))
|
|
DO 1100 I=1,N
|
|
IF (PRINT.GT.12) WRITE(6,699) I,W(I,I)
|
|
699 FORMAT(' FOR CHANNEL',I4, ' V(RMIN) - E =',D13.4)
|
|
IF (W(I,I).GT.0.D0) GO TO 1100
|
|
R=R-DRMIN
|
|
IF(SURF .OR. R.GT.0.D0) GO TO 1000
|
|
WRITE(6,600)
|
|
600 FORMAT('0 * * * ERROR. RMIN LESS THAN ZERO IN DVSTRT.',
|
|
1 ' POTENTIAL MAY BE UNPHYSICAL')
|
|
STOP
|
|
1100 CONTINUE
|
|
C
|
|
IF(R.NE.RSAVE) WRITE(6,602)RSAVE,R
|
|
602 FORMAT('0 * * * WARNING. DVSTRT HAS CHANGED RMIN FROM ',F6.2,
|
|
& ' TO ',F6.2,' TO ENSURE THAT ALL CHANNELS ARE LOCALLY CLOSED')
|
|
C
|
|
C * * * * * INITIALIZE U, UP.
|
|
2000 DO 4000 I=1,N
|
|
DO 4000 J=1,N
|
|
U(I,J)=0.D0
|
|
UP(I,J)=0.D0
|
|
IF (I.EQ.NB(J)) UP(I,J)=1.D-8
|
|
4000 CONTINUE
|
|
C * * * * * INITIALIZE NOPEN, WV. PICK STEP SIZE.
|
|
NOPEN=0
|
|
BIG=0.D0
|
|
DO 5000 I=1,N
|
|
DIF=ERED-EINT(I)
|
|
IF (DIF.LE.0.D0) GO TO 5100
|
|
NOPEN=NOPEN+1
|
|
5100 WV(I)=SIGN(SQRT(ABS(DIF)),DIF)
|
|
5000 BIG=MAX(BIG,WV(I))
|
|
IF (NOPEN.LE.0) RETURN
|
|
C CALCULATE STEP SIZE FROM LARGEST WVEC.
|
|
HH=3.1416D0/(BIG*STEPS)
|
|
IF(IWRITE) WRITE(ISCRU) R,HH
|
|
IF(IREAD) READ(ISCRU) R,HH
|
|
IF (PRINT.GE.2) WRITE(6,601) R,HH
|
|
601 FORMAT('0 INTEGRATION STARTED AT RMIN =',D12.4,
|
|
& '. STEP SIZE =',D12.4)
|
|
RETURN
|
|
END
|
|
SUBROUTINE EAVG(NT,T,NGP,E,NNRG,MXNRG)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION E(1),T(1)
|
|
DIMENSION A(20),W(20)
|
|
C THIS ROUTINE SETS UP ENERGIES FOR NGP-POINT GAUSS-LAGUERRE INTEG.
|
|
C AT SPECIFIED TEMPERATURES (DEG. KELVIN).
|
|
DATA XK/.6950305D0/
|
|
DATA A/.585786437627D0, 3.414213562373D0,
|
|
2 0.415774556783D0, 2.294280360279D0, 6.289945082937D0,
|
|
3 0.322547689619D0, 1.745761101158D0, 4.536620296921D0,
|
|
4 9.395070912301D0, 0.263560319718D0, 1.413403059107D0,
|
|
5 3.596425771041D0, 7.085810005859D0, 12.640800844276D0,
|
|
6 6*0.D0/
|
|
DATA W/ 0.853553390593D0, 0.146446609407D0, 0.711093009929D0,
|
|
8 0.278517733569D0, 0.103892565016D-1, 0.603154104342D0,
|
|
9 0.357418692438D0, 0.388879085150D-1, 0.539294705561D-3,
|
|
A 0.521755610583D0, 0.398666811083D0, 0.759424496817D-1,
|
|
B 0.361175867992D-2, 0.233699723858D-4, 6*0.D0/
|
|
NGP=MAX0(2,MIN0(6,IABS(NGP)))
|
|
IST=NGP*(NGP-1)/2-1
|
|
WRITE(6,600) NGP
|
|
600 FORMAT('0 ENERGY VALUES WILL BE GENERATED TO FACILITATE',I4,
|
|
1 '-POINT GAUSS-LAGUERRE INTEGRATION OVER BOLTZMANN DISTRIBUTION')
|
|
NN=0
|
|
DO 1000 I=1,NT
|
|
IF (NN+NGP.LE.MXNRG) GO TO 1010
|
|
WRITE(6,601) I,T(I)
|
|
601 FORMAT('0 * * * WARNING. NOT ENOUGH SPACE IN ENERGY() TO PROCESS
|
|
1TEMP(',I3,' ) =',F8.2)
|
|
GO TO 1000
|
|
1010 XT=XK*T(I)
|
|
WRITE(6,602) T(I),XT
|
|
602 FORMAT('0 FOR TEMP =',F8.2,' DEG. K =',F8.2,' (1/CM), THE
|
|
1AVERAGE IS APPROXIMATELY THE SUM OF')
|
|
DO 1100 J=1,NGP
|
|
EN=XT*A(IST+J)
|
|
WT=A(IST+J)*W(IST+J)
|
|
NN=NN+1
|
|
E(NN)=EN
|
|
1100 WRITE(6,603) WT,EN
|
|
603 FORMAT(15X,F13.8, ' * SIG( E =',F12.4,' ) ')
|
|
1000 CONTINUE
|
|
NNRG=MIN0(MXNRG,MAX0(NNRG,NN))
|
|
RETURN
|
|
END
|
|
SUBROUTINE ECNV(EUNITS,EUNITC,TOCM)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C THIS ROUTINE ACCEPTS AN INTEGER, EUNITS, OR A CHARACTER*4, EUNITC,
|
|
C AND DETERMINES "UNITS" AND ACCORDINGLY A CONVERSION FACTOR TO (1/CM).
|
|
C EUNITC TAKES PRECEDENCE; VERSION OF 21 MAR 95
|
|
C
|
|
C IMPLEMENTED UNITS ARE
|
|
C 1) 1/CM 2) DEG. K 3) MHZ 4) GHZ 5) EV 6) ERG 7) A.U.
|
|
C 8) KJ/MOL 9) KCAL/MOL
|
|
C INPUT MUST BE AN INTEGER (1-9) SPECIFYING THE CORRESPONDING UNIT
|
|
C OR A CHARACTER CODE (IN EUNITC) CORRESPONDING TO THE UNIT.
|
|
C
|
|
C ENERGY CONVERSION FACTORS TAKEN FROM E. R. COHEN AND B. N. TAYLOR,
|
|
C JOURNAL OF RESEARCH OF THE NBS 92, 85 (1987).
|
|
C
|
|
INTEGER EUNITS
|
|
CHARACTER*4 EUNITC,BLANKS
|
|
CHARACTER*8 LTYP(9)
|
|
DIMENSION ECONV(9)
|
|
DATA LTYP/' 1/CM',' K ',' MHZ',' GHZ',' EV ',' ERG', ' AU',
|
|
1 'KJ/MOL','KCAL/MOL'/
|
|
DATA BLANKS/' '/
|
|
DATA ECONV/1.D0,0.6950387D0, 3.335640952D-5,3.335640952D-2,
|
|
1 8065.5410D0,5.0341125D+15,219474.63067D0,
|
|
2 83.593461D0,349.9891D0/
|
|
DATA MXUNIT/9/
|
|
C
|
|
IF (EUNITC.EQ.BLANKS) THEN
|
|
IF (EUNITS.EQ.0) THEN
|
|
WRITE(6,600)
|
|
600 FORMAT(/' INPUT ENERGY VALUES ASSUMED TO BE IN UNITS OF ',
|
|
1 '1/CM BY DEFAULT.')
|
|
TOCM=1.D0
|
|
ELSEIF (EUNITS.GT.0.AND.EUNITS.LE.MXUNIT) THEN
|
|
IVAL=EUNITS
|
|
WRITE(6,601) LTYP(IVAL),IVAL
|
|
601 FORMAT(/' INPUT ENERGY VALUES CONVERTED FROM ',A8,/5X,'TO',
|
|
1 ' INTERNAL WORKING UNITS OF 1/CM DUE TO INTEGER INPUT =',I4)
|
|
TOCM=ECONV(IVAL)
|
|
ELSE
|
|
WRITE(6,699) EUNITS,(I,LTYP(I),I=1,MXUNIT)
|
|
699 FORMAT(/' *** ECNV. INPUT EUNITS = ',I6,' CANNOT BE ',
|
|
1 'PROCESSED. ALLOWED VALUES ARE'/(11X,I2,2X,A8/))
|
|
STOP
|
|
ENDIF
|
|
ELSE
|
|
CALL ECNVX(EUNITC,IVAL)
|
|
TOCM=ECONV(IVAL)
|
|
ENDIF
|
|
RETURN
|
|
END
|
|
SUBROUTINE ECNVX(EUNITS,IVAL)
|
|
C
|
|
C THIS ROUTINE CONVERTS A 4 CHARACTER INPUT -- EUNITS --
|
|
C INTO THE CORRESPONDING INTEGER VALUE -- IVAL.
|
|
C VERSION OF 21 MAR 95.
|
|
C IMPLEMENTED UNITS ARE
|
|
C 1) 1/CM 2) DEG. K 3) MHZ 4) GHZ 5) EV 6) ERG 7) A.U.
|
|
C 8) KJ/MOL 9) KCAL/MOL
|
|
C
|
|
LOGICAL STSRCH
|
|
CHARACTER*1 L4(4),C,M,K,H,Z,E,V,R,G,A,U,L,J,
|
|
1 LC,LM,LK,LH,LZ,LE,LV,LR,LG,LA,LU,LL,LJ
|
|
CHARACTER*4 EUNITS
|
|
CHARACTER*8 LTYP(9)
|
|
DATA LTYP/' 1/CM',' K ',' MHZ',' GHZ',' EV ',' ERG', ' AU',
|
|
1 'KJ/MOL','KCAL/MOL'/
|
|
DATA MX/9/
|
|
DATA C/'C'/,M/'M'/,K/'K'/,H/'H'/,Z/'Z'/,E/'E'/,V/'V'/,
|
|
2 R/'R'/, G/'G'/, A/'A'/, U/'U'/, L/'L'/, J/'J'/,
|
|
3 LC/'c'/,LM/'m'/,LK/'k'/,LH/'h'/,LZ/'z'/,LE/'e'/,LV/'v'/,
|
|
4 LR/'r'/,LG/'g'/,LA/'a'/,LU/'u'/,LL/'l'/,LJ/'j'/
|
|
C PUT CHARACTERS OF EUNITS INTO ARRAY L4
|
|
L4(1)=EUNITS(1:1)
|
|
L4(2)=EUNITS(2:2)
|
|
L4(3)=EUNITS(3:3)
|
|
L4(4)=EUNITS(4:4)
|
|
C
|
|
2000 DO 2001 II=1,4
|
|
C SEARCH FOR ONE OF ALLOWED 1ST LETTERS. . .
|
|
IF (L4(II).EQ.C.OR.L4(II).EQ.LC) GO TO 3001
|
|
IF (L4(II).EQ.K.OR.L4(II).EQ.LK) GO TO 3002
|
|
IF (L4(II).EQ.M.OR.L4(II).EQ.LM) GO TO 3003
|
|
IF (L4(II).EQ.G.OR.L4(II).EQ.LG) GO TO 3004
|
|
IF (L4(II).EQ.E.OR.L4(II).EQ.LE) GO TO 3005
|
|
2001 IF (L4(II).EQ.A.OR.L4(II).EQ.LA) GO TO 3006
|
|
GO TO 2991
|
|
C FOR EACH ALLOWED FIRST LETTER, SEARCH FOR NEXT IN KEYWORDS. . .
|
|
3001 IF(.NOT.STSRCH(M,LM,L4(II+1),4-II,IF)) GO TO 2991
|
|
IT=1
|
|
GO TO 5000
|
|
C
|
|
3002 IF (.NOT.STSRCH(C,LC,L4(II+1),4-II,IF)) GO TO 3012
|
|
IFN=II+IF
|
|
IF (.NOT.STSRCH(A,LA,L4(IFN+1),4-IFN,IF)) GO TO 2991
|
|
IFN=IFN+IF
|
|
IF (.NOT.STSRCH(L,LL,L4(IFN+1),4-IFN,IF)) GO TO 2991
|
|
IT=9
|
|
GO TO 5000
|
|
3012 IF (.NOT.STSRCH(J,LJ,L4(II+1),4-II,IF)) GO TO 3022
|
|
IT=8
|
|
GO TO 5000
|
|
3022 IT=2
|
|
GO TO 5000
|
|
3003 IF(.NOT.STSRCH(H,LH,L4(II+1),4-II,IF)) GO TO 2991
|
|
IF (.NOT.STSRCH(Z,LZ,L4(II+IF+1),4-II-IF,IF)) GO TO 2991
|
|
IT=3
|
|
GO TO 5000
|
|
3004 IF(.NOT.STSRCH(H,LH,L4(II+1),4-II,IF)) GO TO 2991
|
|
IF (.NOT.STSRCH(Z,LZ,L4(II+IF+1),4-II-IF,IF)) GO TO 2991
|
|
IT=4
|
|
GO TO 5000
|
|
3005 IF (.NOT.STSRCH(V,LV,L4(II+1),4-II,IF)) GO TO 3015
|
|
IT=5
|
|
GO TO 5000
|
|
3015 IF (.NOT.STSRCH(R,LR,L4(II+1),4-II,IF)) GO TO 2991
|
|
IF (.NOT.STSRCH(G,LG,L4(II+IF+1),4-II-IF,IF)) GO TO 2991
|
|
IT=6
|
|
GO TO 5000
|
|
3006 IF (.NOT.STSRCH(U,LU,L4(II+1),4-II,IF)) GO TO 2991
|
|
IT=7
|
|
GO TO 5000
|
|
2991 CONTINUE
|
|
C
|
|
WRITE(6,699) EUNITS,(LTYP(I),I=1,MX)
|
|
699 FORMAT(/' *** ECNVX. EUNITC INPUT = ',A4,' CANNOT BE PROCESSED.'
|
|
1 , ' ALLOWED TYPES ARE'/(10X,A8))
|
|
STOP
|
|
C
|
|
5000 IVAL=IT
|
|
WRITE(6,602) LTYP(IT),EUNITS
|
|
602 FORMAT(/' INPUT ENERGY VALUES CONVERTED FROM ',A8,/5X,'TO '
|
|
1 ,'INTERNAL WORKING UNITS OF 1/CM DUE TO ALPHAMERIC INPUT =',A4)
|
|
RETURN
|
|
END
|
|
FUNCTION EPSUM(R,N,E,EVEC,WKS)
|
|
C
|
|
C FUNCTION TO EVALUATE THE EIGENPHASE SUM FROM THE R-MATRIX.
|
|
C F02ABF DIAGONALISES THE N X N REAL SYMMETRIC R-MATRIX,
|
|
C RETURNING THE EIGENVALUES IN E.
|
|
C THE EIGENPHASE SUM IS THEN OBTAINED BY SUMMING ARCTANGENTS
|
|
C OF THE EIGENVALUES.
|
|
C THE RESULT IS RETURNED IN UNITS OF PI, AND IS SHIFTED TO BE
|
|
C AS CLOSE AS POSSIBLE TO THE PREVIOUS EIGENPHASE SUM CALCULATED
|
|
C (STORED IN SMLAST)
|
|
C SEE ASHTON, CHILD AND HUTSON, J. CHEM. PHYS. 78, 4025 (1983).
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE SMLAST
|
|
DIMENSION R(N,N), E(N), EVEC(N,N), WKS(N)
|
|
DATA PI/3.141592653589793238462643D0/
|
|
DATA SMLAST/10.D0/
|
|
C
|
|
IF(N.EQ.1) GOTO 200
|
|
IFAIL=0
|
|
CALL F02ABF(R,N,N,E,EVEC,N,WKS,IFAIL)
|
|
EPSUM=0.D0
|
|
DO 100 I=1,N
|
|
X=ATAN(E(I))
|
|
EPSUM=EPSUM+X
|
|
100 CONTINUE
|
|
GOTO 300
|
|
200 EPSUM=ATAN(R(1,1))
|
|
300 EPSUM=EPSUM/PI
|
|
DELTA=SMLAST-EPSUM+0.5D0
|
|
IF(DELTA.LE.0.D0) DELTA=DELTA-1.D0
|
|
IDEL=INT(DELTA)
|
|
EPSUM=EPSUM+DBLE(IDEL)
|
|
SMLAST=EPSUM
|
|
RETURN
|
|
END
|
|
FUNCTION ESYMTP(J1,K1,J2,K2,LM,MU)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DATA CON15/.282094791773878209D0/
|
|
Z(X)=2.D0*X+1.D0
|
|
ESYMTP=0.D0
|
|
XJ1=J1
|
|
XJ2=J2
|
|
XK1=K1
|
|
XK2=K2
|
|
XLM=LM
|
|
XMU=MU
|
|
E=THRJ(XJ1,XLM,XJ2,-XK1,-XMU,XK2)
|
|
IF (ABS(E).LE.1.D-8) RETURN
|
|
ESYMTP=E*PARITY3((IABS(J2-J1)+J2+J1)/2-MU-K1)*
|
|
& CON15*SQRT(SQRT(Z(XJ1)*Z(XJ2)))
|
|
RETURN
|
|
END
|
|
SUBROUTINE F02AAF(A, IA, N, R, E, IFAIL)
|
|
C
|
|
C SIMULATES NAG DIAGONALISER F02AAF WITH LAPACK CALLS
|
|
C JMH MAY 93
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
DIMENSION A(IA,N), R(N), E(N)
|
|
DIMENSION V(1)
|
|
DATA IV/1/
|
|
DATA ZERO/0.D0/
|
|
C
|
|
IT1=IXNEXT
|
|
IT2=IT1+(5*N+1)/NIPR
|
|
IT3=IT2+(N+1)/NIPR
|
|
LWREQ=8*N
|
|
LWORK=MX-IT3+1
|
|
IF(LWORK.LT.LWREQ) THEN
|
|
WRITE(6,100) LWORK,N
|
|
100 FORMAT(' *** ERROR: ONLY',I5,' WORDS OF WORKSPACE AVAILABLE',
|
|
1 ' IN F02AAF.'/' LAPACK ROUTINE DSYEVX NEEDS AT LEAST 8*N,',
|
|
2 ' AND N =',I5,' ON THIS CALL.')
|
|
STOP
|
|
ENDIF
|
|
C
|
|
IXNEXT=IT3+LWREQ
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
C SAVE DIAGONAL ELEMENTS IN E
|
|
C
|
|
CALL DCOPY(N,A,IA+1,E,1)
|
|
C
|
|
C CALL LAPACK DIAGONALISER: DESTROYS LOWER TRIANGLE OF A
|
|
C
|
|
CALL DSYEVX('N','A','L',N,A,IA,DUM,DUM,IDUM,IDUM,ZERO,M,R,V,IV,
|
|
1 X(IT3),LWORK,X(IT1),X(IT2),INFO)
|
|
C
|
|
IF (INFO .NE. 0) THEN
|
|
WRITE (6,120) INFO
|
|
120 FORMAT(' *** ERROR IN DSYEVX: INFO =',I3)
|
|
END IF
|
|
C
|
|
IFAIL=INFO
|
|
IXNEXT=IT1
|
|
C
|
|
C RESTORE LOWER TRIANGLE FROM UNCHANGED UPPER TRIANGLE
|
|
C AND DIAGONAL FROM E
|
|
C
|
|
CALL DSYFIL('L',N,A,IA)
|
|
CALL DCOPY(N,E,1,A,IA+1)
|
|
C
|
|
RETURN
|
|
END
|
|
SUBROUTINE F02ABF(A, IA, N, R, V, IV, E, IFAIL)
|
|
C
|
|
C SIMULATES NAG DIAGONALISER F02ABF WITH LAPACK CALLS
|
|
C JMH MAY 93
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
DIMENSION A(IA,N), V(IV,N), R(N), E(N)
|
|
DATA ZERO/0.D0/
|
|
C
|
|
IT1=IXNEXT
|
|
IT2=IT1+(5*N+1)/NIPR
|
|
IT3=IT2+(N+1)/NIPR
|
|
LWREQ=8*N
|
|
LWORK=MX-IT3+1
|
|
IF(LWORK.LT.LWREQ) THEN
|
|
WRITE(6,100) LWORK,N
|
|
100 FORMAT(' *** ERROR: ONLY',I5,' WORDS OF WORKSPACE AVAILABLE',
|
|
1 ' IN F02ABF.'/' LAPACK ROUTINE DSYEVX NEEDS AT LEAST 8*N,',
|
|
2 ' AND N =',I5,' ON THIS CALL.')
|
|
STOP
|
|
ENDIF
|
|
C
|
|
IXNEXT=IT3+LWREQ
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
C SAVE DIAGONAL ELEMENTS IN E
|
|
C
|
|
CALL DCOPY(N,A,IA+1,E,1)
|
|
C
|
|
C CALL LAPACK DIAGONALISER: DESTROYS LOWER TRIANGLE OF A
|
|
C
|
|
CALL DSYEVX('V','A','L',N,A,IA,DUM,DUM,IDUM,IDUM,ZERO,M,R,V,IV,
|
|
1 X(IT3),LWORK,X(IT1),X(IT2),INFO)
|
|
C
|
|
IF (INFO .NE. 0) THEN
|
|
WRITE (6,120) INFO
|
|
120 FORMAT(' *** ERROR IN DSYEVX: INFO =',I3)
|
|
END IF
|
|
C
|
|
IFAIL=INFO
|
|
IXNEXT=IT1
|
|
C
|
|
C RESTORE LOWER TRIANGLE FROM UNCHANGED UPPER TRIANGLE
|
|
C AND DIAGONAL FROM E
|
|
C
|
|
CALL DSYFIL('L',N,A,IA)
|
|
CALL DCOPY(N,E,1,A,IA+1)
|
|
C
|
|
RETURN
|
|
END
|
|
INTEGER FUNCTION FIND(I,J,IG,NG)
|
|
C
|
|
C FUNCTION TO FIND A PARTICULAR FOURIER COMPONENT IN A LIST
|
|
C OF COMPONENTS, AND RETURN THE POSITION OF THE REQUIRED
|
|
C COMPONENT.
|
|
C
|
|
DIMENSION IG(2,NG)
|
|
C
|
|
II=I
|
|
JJ=J
|
|
CALL ORDER(II,JJ)
|
|
FIND=0
|
|
DO 10 N=1,NG
|
|
IF(II.NE.IG(1,N) .OR. JJ.NE.IG(2,N)) GOTO 10
|
|
FIND=N
|
|
GOTO 20
|
|
10 CONTINUE
|
|
20 RETURN
|
|
END
|
|
SUBROUTINE FINDRM(W,N,RSTART,RTURN,IK,P,VL,IV,ERED,EINT,CENT,
|
|
1 RMLMDA,DIAG,DIAG2,XK,PHASE,MXLAM,NPOTL,IRMSET,ITYPE,IPRINT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION W(N,N),P(MXLAM),VL(1),IV(1),EINT(N),CENT(N),DIAG(N),
|
|
1 DIAG2(N),XK(N),PHASE(N)
|
|
C
|
|
C SUBROUTINE TO FIND A SUITABLE STARTING POINT FOR INTEGRATION
|
|
C
|
|
C FIND CLASSICAL TURNING POINT OF DIAGONAL POTENTIAL
|
|
C IN LOWEST-LYING CHANNEL.
|
|
C START FROM A GUESS BASED ON THE CENTRIFUGAL POTENTIAL
|
|
C MOD 28 MAR 95 (SG) TO START AT 0.8*RMIN RATHER THAN 0.0
|
|
C IN CASE OF FAILURE
|
|
C
|
|
RMIN=RSTART
|
|
RTURN=1.D30
|
|
NOPEN=0
|
|
DO 80 I=1,N
|
|
DIF=ERED-EINT(I)
|
|
IF (DIF.LT.0.D0) GOTO 80
|
|
NOPEN=NOPEN+1
|
|
RCENT=SQRT(CENT(I)/DIF)
|
|
RCENT=MAX(RCENT,RMIN)
|
|
RTURN=MIN(RTURN,RCENT)
|
|
80 CONTINUE
|
|
C
|
|
C FOR SURFACE SCATTERING, OVERRIDE THE CENTRIFUGAL GUESS
|
|
C
|
|
IF (ITYPE.EQ.8) RTURN=RMIN
|
|
C
|
|
IF (NOPEN.LE.0) THEN
|
|
IF (IPRINT.GE.3) WRITE(6,*) ' *** FINDRM. NO OPEN CHANNELS'
|
|
GOTO 300
|
|
ENDIF
|
|
C
|
|
ITRY=0
|
|
90 RSTART=RTURN
|
|
IF (ITRY.GT.25) GOTO 140
|
|
CALL WAVMAT(W,N,RSTART,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
C
|
|
C FIND LOWEST CHANNEL
|
|
C
|
|
IK=1
|
|
V1=DIAG(1)
|
|
DO 100 I=1,N
|
|
IF (DIAG(I).GE.V1) GO TO 100
|
|
IK=I
|
|
V1=DIAG(I)
|
|
100 CONTINUE
|
|
C
|
|
RTURN=0.999D0*RSTART
|
|
DO 120 II=1,100
|
|
CALL WAVMAT(W,N,RTURN,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG2,
|
|
1 MXLAM,NPOTL)
|
|
C
|
|
C CHECK THAT CHANNEL IK IS STILL LOWEST, AND CALCULATE ALL
|
|
C THE DERIVATIVES FOR USE LATER
|
|
C
|
|
V2=DIAG2(IK)
|
|
DO 110 I=1,N
|
|
XK(I)=(DIAG2(I)-DIAG(I))/(RTURN-RSTART)
|
|
DIAG(I)=DIAG2(I)
|
|
IF (DIAG(I).LT.V2) THEN
|
|
ITRY=ITRY+1
|
|
GOTO 90
|
|
ENDIF
|
|
110 CONTINUE
|
|
DV1=XK(IK)
|
|
C
|
|
IF (IPRINT.GE.8) WRITE(6,602) RTURN,V2
|
|
602 FORMAT(' FINDRM: AT R =',F8.4,' SMALLEST V-E IS',F11.2)
|
|
C
|
|
C THERE MIGHT BE A WELL BEHIND THE BARRIER MAXIMUM.
|
|
C PROVIDED IT IS ABOVE THE SCATTERING ENERGY, JUMP OVER IT
|
|
C AND TRY AGAIN. ONLY DO THIS ONCE, THOUGH.
|
|
C
|
|
IF (DV1.GE.0.D0) THEN
|
|
IF (V2.GT.0.D0) THEN
|
|
ITRY=ITRY+10
|
|
IF (ITRY.LT.20) THEN
|
|
RTURN=2.D0*RTURN
|
|
GOTO 90
|
|
ELSE
|
|
GOTO 140
|
|
ENDIF
|
|
ELSE
|
|
ITRY=ITRY+5
|
|
RTURN=0.9D0*RTURN
|
|
GOTO 90
|
|
ENDIF
|
|
ENDIF
|
|
RSTART=RTURN
|
|
V1=V2
|
|
DR=-V1/DV1
|
|
IF (DR.LT.-0.3D0*RTURN .AND. ITYPE.NE.8) DR=-0.3D0*RTURN
|
|
RTURN=RTURN+DR
|
|
IF (ITRY.GT.25 .OR. DR.GT.1.D3) GO TO 140
|
|
IF (RTURN.LE.0.D0 .AND. ITYPE.NE.8) GO TO 140
|
|
IF (ABS(DR/RTURN).LE.1.D-3) GO TO 160
|
|
120 CONTINUE
|
|
C
|
|
C ARRIVE HERE IF DR BECOMES HUGE, RTURN BECOMES NEGATIVE,
|
|
C OR THERE IS NO CONVERGENCE IN 100 NEWTON-RAPHSON ITERATIONS.
|
|
C IF THIS HAPPENS, JUST USE THE INPUT VALUE OF RMIN
|
|
C
|
|
140 IF (IPRINT.GE.3) WRITE(6,*) ' *** FINDRM. ',
|
|
1 'UNABLE TO FIND CLASSICAL TURNING POINT'
|
|
GOTO 300
|
|
C
|
|
C ARRIVE HERE IF WE HAVE CONVERGED ON A CLASSICAL TURNING POINT
|
|
C DIAG ARRAY CONTAINS DIAGONAL ELEMENTS
|
|
C
|
|
160 IF (IPRINT.GE.3) WRITE(6,603) RTURN
|
|
603 FORMAT(' INNER CLASSICAL TURNING POINT AT R =',F8.4)
|
|
C
|
|
C SPECIAL CASE: CALLED TO FIND RTURN ONLY
|
|
C
|
|
IF (IRMSET.LE.0) THEN
|
|
RSTART=RMIN
|
|
RETURN
|
|
ENDIF
|
|
C
|
|
C FIND NEW RSTART BY INTEGRATING PHASE INTEGRALS INWARDS.
|
|
C WE WANT RSTART SUCH THAT
|
|
C INT(RSTART,RTURN) SQRT(E-V) DR = 2.303 * IRMSET
|
|
C TRY TO DO IT IN NSTEP ROUGHLY EQUAL STEPS
|
|
C
|
|
NSTEP=3+IRMSET/3
|
|
C
|
|
TARGET=2.303D0*DBLE(IRMSET)
|
|
DR=1.5D0*TARGET/SQRT(ABS(XK(IK)))/DBLE(NSTEP)
|
|
C
|
|
DO 210 I=1,N
|
|
PHASE(I)=0.D0
|
|
XK(I)=SQRT(ABS(DIAG(I)))
|
|
210 CONTINUE
|
|
C
|
|
220 CONTINUE
|
|
C
|
|
DO 240 ISTEP=1,NSTEP
|
|
RNEXT=RSTART-DR
|
|
IF (RNEXT.LT.0.D0 .AND. ITYPE.NE.8) THEN
|
|
RSTART=0.8*RMIN
|
|
IF (IPRINT.GE.1) THEN
|
|
WRITE(6,*) ' *** FINDRM. REACHED ORIGIN ',
|
|
1 'WHILE ACCUMULATING PHASE INTEGRAL. CHECK POTENTIAL'
|
|
WRITE(6,*) ' PROPAGATION WILL START AT 0.8*RMIN'
|
|
ENDIF
|
|
RETURN
|
|
ENDIF
|
|
C
|
|
CALL WAVMAT(W,N,RNEXT,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
DRNEXT=0.D0
|
|
DO 230 I=1,N
|
|
IF (DIAG(I).LE.0.D0) THEN
|
|
IF (IPRINT.GE.3)
|
|
1 WRITE(6,*) ' *** FINDRM. INNER CLASSICALLY ALLOWED REGION ',
|
|
1 'ENCOUNTERED WHILE INTEGRATING INWARDS FROM TURNING POINT.'
|
|
GOTO 260
|
|
ENDIF
|
|
V1=SQRT(DIAG(I))
|
|
V2=0.5D0*(V1+XK(I))
|
|
PHASE(I)=PHASE(I)+DR*V2
|
|
DRNEXT=MAX(DRNEXT,(TARGET-PHASE(I))/V1)
|
|
XK(I)=V1
|
|
230 CONTINUE
|
|
C
|
|
RSTART=RNEXT
|
|
IF (ISTEP.LT.NSTEP) DR=DRNEXT/DBLE(NSTEP-ISTEP)
|
|
C
|
|
IF (IPRINT.GE.8) WRITE(6,604) ISTEP,RNEXT,DR,DIAG(IK)
|
|
604 FORMAT(' FINDRM: STEP',I3,' AT R =',2F8.4,F11.2)
|
|
C
|
|
IF (DRNEXT.LE.0.D0) GOTO 250
|
|
C
|
|
C IF THE STEP SIZE SEEMS EXCESSIVE, TRY ACCUMULATING THE
|
|
C PHASE INTEGRAL MORE CAUTIOUSLY
|
|
C
|
|
IF (ISTEP.LT.NSTEP .AND. ITYPE.NE.8
|
|
1 .AND. DR.GT.0.5D0*RSTART .AND. DR.GT.0.5D0*RMIN) THEN
|
|
DR=0.02D0*RSTART
|
|
GOTO 220
|
|
ENDIF
|
|
C
|
|
240 CONTINUE
|
|
C
|
|
250 IF (IPRINT.GE.3) WRITE(6,606) RSTART
|
|
606 FORMAT(' RADIAL INTEGRATION WILL START AT R =',F8.4)
|
|
RETURN
|
|
C
|
|
C ARRIVE HERE IF THE INWARDS SEARCH ENTERED A CLASSICALLY ALLOWED
|
|
C REGION. TRY TO FIND A BETTER STARTING POINT AND LOOK FOR THE
|
|
C INNER TURNING POINT
|
|
C
|
|
260 DR=0.1D0*RNEXT
|
|
RTURN=RNEXT-DR
|
|
DO 290 II=1,9
|
|
CALL WAVMAT(W,N,RTURN,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
DO 270 I=1,N
|
|
IF (DIAG(I).LE.0.D0) GOTO 280
|
|
270 CONTINUE
|
|
ITRY=ITRY+10
|
|
GOTO 90
|
|
280 RTURN=RTURN-DR
|
|
290 CONTINUE
|
|
IF (IPRINT.GE.1) THEN
|
|
WRITE(6,*) ' *** FINDRM. UNABLE TO FIND',
|
|
1 ' INNER CLASSICAL TURNING POINT. CHECK POTENTIAL'
|
|
WRITE(6,*) ' PROPAGATION WILL START AT 0.8*RMIN'
|
|
ENDIF
|
|
RSTART=0.8*RMIN
|
|
RETURN
|
|
C
|
|
300 RSTART=RMIN
|
|
RTURN=2.D0*RMIN
|
|
IF (IPRINT.GE.3) WRITE(6,608)
|
|
608 FORMAT(14X,'RSTART SET TO RMIN'/14X,'RTURN SET TO 2*RMIN')
|
|
RETURN
|
|
C
|
|
END
|
|
SUBROUTINE FINDRX(ENERGY,EINT,CENT,NNRG,N,CINT,RMAX,RSTOP,
|
|
1 NOPMAX,IRXSET,IPRINT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C SUBROUTINE TO SCAN INPUT ENERGIES AND THRESHOLDS TO DETERMINE
|
|
C A SAFE RMAX WHICH IS OUTSIDE THE CENTRIFUGAL BARRIER FOR
|
|
C ALL COMBINATIONS. ALSO FIND THE LARGEST VALUE OF NOPEN
|
|
C TO SAFEGUARD AGAINST SHRINKING THE BASIS SET TOO FAR.
|
|
C
|
|
DIMENSION ENERGY(NNRG),EINT(N),CENT(N)
|
|
C
|
|
NOPMAX=0
|
|
RSTOP=RMAX
|
|
DO 200 J=1,NNRG
|
|
NOPEN=0
|
|
ERED=ENERGY(J)*CINT
|
|
DO 100 I=1,N
|
|
DIF=ERED-EINT(I)
|
|
IF(DIF.LT.0.D0) GOTO 100
|
|
NOPEN=NOPEN+1
|
|
IF(IRXSET.LE.0) GOTO 100
|
|
RCENT=SQRT(CENT(I)/DIF)
|
|
RSTOP=MAX(RSTOP,RCENT)
|
|
100 CONTINUE
|
|
200 NOPMAX=MAX0(NOPMAX,NOPEN)
|
|
IF(RSTOP.GT.RMAX .AND. IPRINT.GE.3) WRITE(6,601) RSTOP
|
|
601 FORMAT('0 RMAX INCREASED TO',F7.2,' FOR THIS PARITY CASE',
|
|
1 ' TO ENSURE THAT OPEN CHANNEL MATCHING'/' OCCURS BEYOND',
|
|
2 ' THE CENTRIFUGAL BARRIER FOR ALL ENERGIES')
|
|
RETURN
|
|
END
|
|
FUNCTION FSYMTP(J1,K1,L1,J2,K2,L2,JT,LAM,MU)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C CALCULATES MATRIX ELEMENT FOR SYMMETRIC TOP FUNCTIONS
|
|
C (J1 K1 L1, JTOT / Y(LAM,MU) / J2 K2 L2, JTOT).
|
|
C USES SUBROUTINES -
|
|
C THRJ(XJ1,XJ2,XJ3,XM1,XM2,XM3)
|
|
C THREEJ(J1,J2,J3) WHICH IS FOR M1=M2=M3=0
|
|
C SIXJ(J1,L1,J2,L2,JTOT,LAM)
|
|
C
|
|
DATA PI/3.14159265358979289D0/
|
|
C STATEMENT FUNCTION DEFINITION . . .
|
|
Z(Y) = 2.D0 * Y + 1.D0
|
|
C
|
|
IF (K1-K2+MU .NE. 0) GO TO 9000
|
|
F=THREEJ(L1,L2,LAM)
|
|
IF (F.EQ.0.D0) GO TO 9000
|
|
XJ1=J1
|
|
XJ2=J2
|
|
XK1=K1
|
|
XK2= - K2
|
|
XL1=L1
|
|
XL2=L2
|
|
XLAM=LAM
|
|
XMU=MU
|
|
F=F * THRJ(XJ1,XJ2,XLAM,XK1,XK2,XMU)
|
|
IF (F.EQ.0.D0) GO TO 9000
|
|
F=F * SIXJ(J1,L1,J2,L2,JT,LAM)
|
|
IF (F.EQ.0.D0) GO TO 9000
|
|
PH=PARITY3(J1+J2+K2-JT)
|
|
F=F*PH*SQRT(Z(XJ1)*Z(XJ2)*Z(XL1)*Z(XL2)*Z(XLAM)/(4.D0*PI))
|
|
FSYMTP=F
|
|
RETURN
|
|
9000 FSYMTP=0.D0
|
|
RETURN
|
|
END
|
|
SUBROUTINE GASLEG(N,Z,A)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C *** ROUTINE TO GENERATE GAUSS-LEGENDRE POINTS/WEIGHTS
|
|
C *** TAKEN FROM AD VAN DER AVOIRD'S N2-N2 CODE (SG 11/7/91)
|
|
C *** NEEDS FUNCTION ZBES
|
|
DIMENSION P(301),PD(301),Z(1),A(1)
|
|
DATA PI/3.14159 26535 89793 D0/
|
|
IF (N.LE.300) GO TO 20
|
|
WRITE (6,10)
|
|
10 FORMAT (/10X,31H***** GASLEG N TOO LARGE *****/)
|
|
STOP
|
|
20 NN=N+1
|
|
IFIN=0
|
|
IODD=0
|
|
C=2.0D0/PI
|
|
C=1.0D0-(C*C)
|
|
IF (MOD(N,2).EQ.0) GO TO 30
|
|
NKNT=(N-1)/2
|
|
IODD=1
|
|
GO TO 40
|
|
30 NKNT=N/2
|
|
40 K=1
|
|
CHA=0.0D0
|
|
CHB=0.0D0
|
|
P(1)=1.0D0
|
|
DN=N+0.50D0
|
|
DN2=DN*DN
|
|
DEN=SQRT(DN2+(C/4.0D0))
|
|
50 BES=ZBES(K)
|
|
X=COS(BES/DEN)
|
|
PDX=1.0D0/(1.0D0-X*X)
|
|
60 CONTINUE
|
|
P(2)=X
|
|
DO 70 I=3,NN
|
|
IN=I-1
|
|
IM=I-2
|
|
P(I)=((2.0D0*IN-1.0D0)*X*P(IN)-IM*P(IM))/IN
|
|
PD(I)=IN*PDX*(P(IN)-X*P(I))
|
|
70 CONTINUE
|
|
IF (IFIN.EQ.1) GO TO 100
|
|
IF (ABS(P(NN)).LT.1.0D-12) GO TO 80
|
|
X=X-(P(NN)/PD(NN))
|
|
PDX=1.0D0/(1.0D0-X*X)
|
|
GO TO 60
|
|
80 Z(K)=X
|
|
TA=N*P(N)
|
|
TA=TA*TA
|
|
A(K)=(2.0D0*(1.0D0-X*X))/TA
|
|
CHA=CHA+2.0D0*A(K)
|
|
Z2=Z(K)*Z(K)
|
|
CHB=CHB+2.0D0*A(K)*Z2
|
|
IF (K.EQ.NKNT) GO TO 90
|
|
K=K+1
|
|
GO TO 50
|
|
90 CONTINUE
|
|
IF (IODD.EQ.0) GO TO 110
|
|
X=0.0D0
|
|
K=NKNT+1
|
|
Z(K)=X
|
|
IFIN=1
|
|
GO TO 60
|
|
100 TA=N*P(N)
|
|
TA=TA*TA
|
|
A(K)=2.0D0/TA
|
|
CHA=CHA+A(K)
|
|
110 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE GAUSHP(NN,X,A)
|
|
C CALCULATES THE ZEROS, X(I), AND WEIGHTS, A(I), I=1,NN, FOR
|
|
C GAUSS-HERMITE QUADRATURE.
|
|
C Approximates the integral from -infinity to infinity f(x)*exp(-x**2)
|
|
C by the sum(i=1,nn) w(i)*f(x(i)).
|
|
C ADAPTED BY S. GREEN FROM STROUD AND SECREST GAUSSIAN QUADRATURE FORMULAS.
|
|
C VERSION OF 18 APRIL 94; FIXED NN=1 BUG 10 MAR 95 (SG)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
PARAMETER (MXIT=15)
|
|
DIMENSION X(NN),A(NN)
|
|
DATA EPS/1.D-15/
|
|
C
|
|
GAM(Y)=(((((((.035868343D0*Y-.193527818D0)*Y+.482199394D0)*Y-
|
|
1 .756704078D0)*Y+.918206857D0)*Y-.897056937D0)*Y+
|
|
2 .988205891D0)*Y-.577191652D0)*Y+1.D0
|
|
C
|
|
IF (NN.LE.0) THEN
|
|
WRITE(6,*) ' *** GAUSHP CALLED FOR ILLEGAL NPT=',NN
|
|
STOP
|
|
ELSEIF (NN.EQ.1) THEN
|
|
WRITE(6,*) ' *** GAUSHP. WARNING, SINGLE POINT REQUESTED.'
|
|
X(1)=0.D0
|
|
A(1)=SQRT(ACOS(-1.D0))
|
|
RETURN
|
|
ELSE
|
|
FN=NN
|
|
N1=NN-1
|
|
N2=(NN+1)/2
|
|
C COMPUTE GAMMA FN BY HASTINGS APPROX; 0.LE.X.LE.70.
|
|
Z=FN
|
|
IF (Z.LE.0.D0 .OR. Z.GE.7.D1) THEN
|
|
WRITE(6,600) Z
|
|
600 FORMAT(' *** GAUSHP. CANNOT GET GAMMA FUNCTION FOR',F10.2)
|
|
STOP
|
|
ENDIF
|
|
IF (Z.EQ.1.D0) THEN
|
|
GAMMA=1.D0
|
|
GO TO 20
|
|
ELSEIF (Z.LT.1.D0) THEN
|
|
GAMMA=GAM(Z)/Z
|
|
GO TO 20
|
|
ELSE
|
|
ZA=1.D0
|
|
10 Z=Z-1.D0
|
|
IF (Z-1.D0) 13,11,12
|
|
11 GAMMA=ZA
|
|
GO TO 20
|
|
12 ZA=ZA*Z
|
|
GO TO 10
|
|
13 GAMMA=ZA*GAM(Z)
|
|
GO TO 20
|
|
ENDIF
|
|
20 CC=1.7724538509D0*GAMMA*(2.D0**(-N1))
|
|
S=(2.D0*FN+1.D0)**(1.D0/6.D0)
|
|
DO 100 I=1,N2
|
|
IF (I.EQ.1) THEN
|
|
C LARGEST ZERO
|
|
XT=S**3-1.85575D0/S
|
|
GO TO 50
|
|
ELSEIF (I.EQ.2) THEN
|
|
C SECOND ZERO
|
|
XT=XT-1.14D0*FN**.426D0/XT
|
|
GO TO 50
|
|
ELSEIF (I.EQ.3) THEN
|
|
C THIRD ZERO
|
|
XT=1.86D0*XT-0.86D0*X(1)
|
|
GO TO 50
|
|
ELSEIF (I.EQ.4) THEN
|
|
C FOURTH ZERO
|
|
XT=1.91D0*XT-0.91D0*X(2)
|
|
GO TO 50
|
|
ELSE
|
|
C ALL HIGHER ZERO'S
|
|
XT=2.D0*XT-X(I-2)
|
|
ENDIF
|
|
C
|
|
C IMPROVE THE APPROXIMATE ROOT XT AND OBTAIN
|
|
C DPN = DERIVATIVE OF H(N) AT XT; PN1 = VALUE OF H(N-1) AT XT
|
|
50 IT=0
|
|
60 IT=IT+1
|
|
IF (IT.GT.MXIT) THEN
|
|
WRITE(6,*) ' *** GAUSHP FAILED TO CONVERGE. ITERATIONS ='
|
|
1 ,MXIT
|
|
STOP
|
|
ENDIF
|
|
CALL HRECUR(P,DP,PN1,XT,NN)
|
|
D=P/DP
|
|
XT=XT-D
|
|
IF (ABS(D).GT.EPS) GO TO 60
|
|
DPN=DP
|
|
X(I)=XT
|
|
A(I)=CC/(DPN*PN1)
|
|
NI=NN-I+1
|
|
X(NI)=-XT
|
|
100 A(NI)=A(I)
|
|
ENDIF
|
|
RETURN
|
|
END
|
|
SUBROUTINE GAUSSP(A,B,NPT,XPT,WHT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION XPT(NPT),WHT(NPT)
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C THIS ROUTINE SETS UP ABSCISSAE AND WEIGHTS FOR NPT-POINT *
|
|
C GAUSS-LEGENDRE INTEGRATION IN THE INTERVAL (A,B). *
|
|
C *
|
|
C ON RETURN, THE FUNCTION TO BE INTEGRATED SHOULD BE EVALUATED *
|
|
C AT THE POINTS XPT(I). INTEGRAL = SUM(I=1,NPT) F(XPT(I))*WHT(I)*
|
|
C *
|
|
C THIS VERSION (SG 11/7/91) CALCULATES POINTS/WEIGHTS FROM *
|
|
C GASLEG/ZBES CODE OF AD VAN DER AVOIRD *
|
|
C DOES ANY NUMBER OF PTS FROM 1 TO MXPT, WHERE LIMIT IS FROM *
|
|
C DIMENSION STATEMENTS IN GASLEG (P,PD AT LEAST (MXPT+1) ) *
|
|
C AND HERE W,X DIMENSIONED AT LEAST ((MXPT+1)/2) *
|
|
C *
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
DIMENSION X(128),W(128)
|
|
DATA MXPT/256/
|
|
C
|
|
T1=(B-A)/2.D0
|
|
T2=(B+A)/2
|
|
IF (NPT-1) 9999,9998,9997
|
|
9997 IF (NPT.LE.MXPT) GO TO 3100
|
|
WRITE(6,601) NPT,MXPT
|
|
601 FORMAT('0 * * * WARNING. GAUSS-LEGENDRE NPT =',I6,' REDUCED TO',
|
|
1 I4)
|
|
NPT=MXPT
|
|
3100 CALL GASLEG(NPT,X,W)
|
|
N2=(NPT+1)/2
|
|
I1=1
|
|
I2=NPT
|
|
IC=1
|
|
DO 2000 I=1,N2
|
|
XPT(I1)=-X(IC)*T1+T2
|
|
XPT(I2)=X(IC)*T1+T2
|
|
WHT(I1)=W(IC)*T1
|
|
WHT(I2)=WHT(I1)
|
|
I1=I1+1
|
|
I2=I2-1
|
|
2000 IC=IC+1
|
|
C N.B FOR NPT ODD, THE LAST (I.E. MIDDLE) TERM IS EVALUATED TWICE.
|
|
RETURN
|
|
9999 WRITE(6,610) NPT
|
|
610 FORMAT('0 * * * WARNING. GAUSS-LEGENDRE REQUESTED WITH NPT =',I6)
|
|
C REPLACE WITH SINGLE-POINT AT (A+B)/2 * (B-A)
|
|
NPT=1
|
|
9998 XPT(1)=T2
|
|
WHT(1)=2.D0*T1
|
|
RETURN
|
|
END
|
|
SUBROUTINE GCLOCK(XTIME)
|
|
DOUBLE PRECISION XTIME
|
|
REAL TIME,TTIME
|
|
DIMENSION TTIME(2)
|
|
C
|
|
C THIS ROUTINE IS MACHINE-DEPENDENT.
|
|
C IT SHOULD RETURN THE ELAPSED CPU TIME IN UNITS OF SECONDS.
|
|
C ONLY DIFFERENCES ARE USED, SO IT NEED NOT BE AN ABSOLUTE VALUE.
|
|
C
|
|
C DUMMY RESULT FOR VANILLA DISTRIBUTION
|
|
XTIME=0.D0
|
|
C
|
|
C CODE BELOW CALLS THE BSD UNIX TIMING ROUTINE.
|
|
C A C VERSION OF etime FOR MOST OTHER UNIX SYSTEMS IS AVAILABLE FROM JMH.
|
|
C TIME=etime(TTIME)
|
|
C XTIME=DBLE(TIME)
|
|
C
|
|
C CODE BELOW IS THE GISS ROUTINE
|
|
C CALL CLOCKS(ITIME)
|
|
C XTIME=-ITIME
|
|
C XTIME=XTIME*1.D-2
|
|
RETURN
|
|
END
|
|
SUBROUTINE GDATE(CDATE)
|
|
C
|
|
C THESE ROUTINES ARE MACHINE-DEPENDENT, AND MUST BE SIMULATED.
|
|
C THEY SHOULD RETURN STRINGS CONTAINING THE CURRENT DATE & TIME.
|
|
C
|
|
CHARACTER CDATE*11, CTIME*9
|
|
CDATE='UNKNOWN '
|
|
RETURN
|
|
ENTRY GTIME(CTIME)
|
|
CTIME='UNKNOWN '
|
|
RETURN
|
|
END
|
|
SUBROUTINE GET102(MXLVL,NLEVEL,JLEVEL,ELEVEL)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION JLEVEL(2,MXLVL),ELEVEL(MXLVL)
|
|
WRITE(6,699)
|
|
699 FORMAT('0 GET102. DUMMY ROUTINE CALLED. TERMINAL ERROR.')
|
|
STOP
|
|
END
|
|
FUNCTION GSYMTP(J1,K1,J2,K2,MVAL,LM,MU)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DATA Z0/0.D0/, PIFCT/.282094791773878209D0/
|
|
C STATEMENT FUNCTION . . .
|
|
Z(X)=2.D0*X+1.D0
|
|
C
|
|
XJ1=J1
|
|
XK1=K1
|
|
XJ2=J2
|
|
XK2=K2
|
|
XM=MVAL
|
|
XLM=LM
|
|
XMU=MU
|
|
GSYMTP=0.D0
|
|
F=THRJ(XJ1,XLM,XJ2,XK1,XMU,-XK2)
|
|
IF (ABS(F) .LE. 1.D-8) RETURN
|
|
F=F*THRJ(XJ1,XLM,XJ2,-XM,Z0,XM)
|
|
IF (ABS(F) .LE. 1.D-8) RETURN
|
|
GSYMTP=F*PIFCT*SQRT(Z(XJ1)*Z(XJ2)*Z(XLM))*PARITY3(K1+MVAL)
|
|
RETURN
|
|
END
|
|
SUBROUTINE HEADER(W,WX,N,NSQ,P,VL,IV,EINT,CENT,DIAG,MXLAM,NPOTL,
|
|
1 ICODE,ISAV,EFIRST)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C ROUTINE TO WRITE/CHECK A HEADER LABEL ON UNIT ISCRU FOR USE
|
|
C WITH THE OPTION TO SAVE TRANSFORMATION MATRICES FOR A SUBSEQUENT
|
|
C RUN. THE LABEL CONSISTS OF ALL INTEGRATION TOLERANCES AND
|
|
C A SAMPLE POTENTIAL MATRIX.
|
|
C
|
|
C THE VARIOUS FLAGS ARE USED AS FOLLOWS:
|
|
C ICODE=1, ISAV=1: FIRST ENERGY, WRITE HEADER
|
|
C ICODE=1, ISAV=-1: FIRST ENERGY, CHECK HEADER
|
|
C ICODE=2: SUBSEQUENT ENERGY, SKIP HEADER
|
|
C
|
|
C
|
|
DIMENSION W(NSQ),WX(NSQ),P(MXLAM),VL(1),IV(1),EINT(N),CENT(N),
|
|
1 DIAG(N),PAR(13),PARX(13)
|
|
C COMMON BLOCK FROM DRIVER AND RMTPRP
|
|
COMMON/DRIVE/STEST,STEPS,STAB,CONV,RMIN,RMAX,XEPS,DR,
|
|
1 DRMAX,RMID,TOLHI,RTURN,
|
|
2 VTOL,ESHIFT,ERED,RMLMDA,NOPEN,JKEEP,ISCRU,MAXSTP
|
|
EQUIVALENCE(PAR(1),STEST)
|
|
C
|
|
IF(ISCRU.EQ.0) RETURN
|
|
REWIND ISCRU
|
|
IF(ISAV.EQ.0) RETURN
|
|
IF(ICODE.EQ.1) GO TO 40
|
|
C
|
|
C SUBSEQUENT ENERGY CALC. - SKIP OVER ANY HEADER
|
|
C
|
|
READ(ISCRU)
|
|
READ(ISCRU)
|
|
RETURN
|
|
C
|
|
40 IF(ISAV.EQ.-1) GO TO 60
|
|
C
|
|
C WRITE OUT A HEADER
|
|
C
|
|
RX=2.D0*RMIN
|
|
CALL WAVMAT(W,N,RX,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,
|
|
1 NPOTL)
|
|
WRITE(ISCRU) N,EFIRST,RX,PAR
|
|
WRITE(ISCRU) W
|
|
RETURN
|
|
C
|
|
C READ AND VERIFY HEADER. SET NOPEN=-1 AS A FLAG THAT NO ACTUAL
|
|
C SCATTERING CALCULATION IS TO BE DONE FOR THIS ENERGY.
|
|
C SET ICODE=2 SO THAT A "SUBSEQUENT ENERGY" CALCULATION IS DONE
|
|
C
|
|
60 READ(ISCRU) NX,EFIRST,RX,PARX
|
|
IF(N.NE.NX) GO TO 999
|
|
DO 62 I=1,13
|
|
IF(PAR(I).NE.PARX(I)) GO TO 999
|
|
62 CONTINUE
|
|
CALL WAVMAT(W,N,RX,P,VL,IV,EFIRST,EINT,CENT,RMLMDA,DIAG,MXLAM,
|
|
1 NPOTL)
|
|
READ(ISCRU) WX
|
|
DO 64 I=1,NSQ
|
|
IF(W(I).NE.WX(I)) GO TO 998
|
|
64 CONTINUE
|
|
ICODE=2
|
|
WRITE(6,603) ISCRU
|
|
603 FORMAT('0 HEADER LABEL ON UNIT',I3,' SUCCESSFULLY VERIFIED.')
|
|
RETURN
|
|
C
|
|
C HEADER IS WRONG - RUN TERMINATED
|
|
C
|
|
998 WRITE(6,600) ISCRU
|
|
600 FORMAT('0****** ERROR - HEADER ON UNIT',I3,' DOES NOT AGREE',
|
|
1 ' WITH DATA FOR CURRENT RUN'/)
|
|
WRITE(6,601) (W(I),WX(I),I=1,NSQ)
|
|
601 FORMAT(2D24.15,10X,2D24.15)
|
|
999 WRITE(6,600) ISCRU
|
|
WRITE(6,602) N,NX,(PAR(I),PARX(I),I=1,13)
|
|
602 FORMAT(2I8/(2D24.15))
|
|
STOP
|
|
END
|
|
SUBROUTINE HERM(H,N,X)
|
|
C
|
|
C SUBROUTINE TO GENERATE HERMITE POLYNOMIALS
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION H(N)
|
|
P0=1.0D0
|
|
H(1)=P0
|
|
IF(N.LE.1) RETURN
|
|
X2=X+X
|
|
P1=X2
|
|
H(2)=P1
|
|
IF(N.LE.2) RETURN
|
|
DO 100 K=3,N
|
|
TEMP=X2*P1 - DBLE(K+K-4)*P0
|
|
P0=P1
|
|
P1=TEMP
|
|
H(K)=P1
|
|
100 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE HRECUR(PN,DPN,PN1,X,NN)
|
|
C SG: ADAPTED FROM STROUD AND SECREST, GAUSSIAN QUADRATURE FORMULAS GREEN.
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
P1=1.D0
|
|
P=X
|
|
DP1=0.D0
|
|
DP=1.D0
|
|
DO 1 J=2,NN
|
|
FJ=J
|
|
FJ2=(FJ-1.D0)/2.D0
|
|
Q=X*P-FJ2*P1
|
|
DQ=X*DP+P-FJ2*DP1
|
|
P1=P
|
|
P=Q
|
|
DP1=DP
|
|
1 DP=DQ
|
|
PN=P
|
|
DPN=DP
|
|
PN1=P1
|
|
RETURN
|
|
END
|
|
SUBROUTINE IDPART(ITYPE,IDENT,SPNUC,WT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION WT(2)
|
|
C
|
|
C THIS ROUTINE PROCESSES INPUT FOR IDENTICAL TARGET-PROJECTILE.
|
|
C IDENT.NE.0 IMPLIES TARGET AND PROJECTILE ARE IDENTICAL.
|
|
C OTHERWISE (IDENT.EQ.0) IEXCH=0 IN ALL CASES AND NO PROCESSING
|
|
C WITH IEXCH OR WT WILL OCCUR.
|
|
C
|
|
CHARACTER*8 NAME(2)
|
|
DATA NAME/' BOSE ',' FERMI '/
|
|
C
|
|
IF (IDENT.EQ.0) RETURN
|
|
WRITE(6,600)
|
|
600 FORMAT('0 IDENT PARAMETER SPECIFIES THAT TARGET AND PROJECTILE ARE
|
|
1 IDENTICAL. PROPERLY SYMMETRIZED FUNCTIONS WILL BE CONSTRUCTED.')
|
|
IF (ITYPE.EQ.3.OR.ITYPE.EQ.13.OR.ITYPE.EQ.23) GO TO 1000
|
|
WRITE(6,601) ITYPE
|
|
601 FORMAT('0 * * * ERROR. FOR ITYPE =',I4,' IDENT PROCESSING NOT SUP
|
|
1PORTED. REQUEST CANCELLED.')
|
|
IDENT=0
|
|
RETURN
|
|
1000 SPNUC=ABS(SPNUC)
|
|
IF (WT(1).EQ.0.D0 .AND. WT(2).EQ.0.D0) GO TO 2000
|
|
WRITE(6,603) WT
|
|
603 FORMAT(' STATISTICAL WEIGHTS SPECIFIED AS WT IN &BASIS DATA. SPN
|
|
1UC IGNORED.'/10X,'ANTI-SYMMETRIC, WT(1) =',F7.4,', SYMMETRIC, WT(
|
|
22) =',F7.4)
|
|
RETURN
|
|
2000 IST=INT(2.D0*SPNUC+0.0001D0)
|
|
IST=IST-2*(IST/2)
|
|
C IST=0 FOR BOSE STATISTICS, IST=1 FOR FERMI STATISTICS.
|
|
DN=2.D0*SPNUC+1.D0
|
|
WT(2-IST)=(SPNUC+1.D0)/DN
|
|
WT(IST+1)=SPNUC/DN
|
|
WRITE(6,602) SPNUC,NAME(IST+1),WT
|
|
602 FORMAT(' FOR NUCLEAR SPIN =', F6.2,',',A8,' STATISTICAL WEIGHTS A
|
|
1RE'/10X,'ANTI-SYMMETRIC, WT(1) =',F7.4,', SYMMETRIC, WT(2) =',
|
|
2 F7.4)
|
|
RETURN
|
|
END
|
|
SUBROUTINE IOSBIN(NVC,ITYPX,ATAU,MX,IASYMU,IPHIFX,IOSNG)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE
|
|
C
|
|
C *** MODIFIED FEB 92 TO CHANGE ITYPE=2 TO USE IV() INDEXING
|
|
C *** MODIFIED MAY 92 TO HANDLE ITYPE=103 (SG) ***
|
|
C *** MODIFIED JAN/FEB 92 TO GENERALIZE ITYPE=2 HANDLING
|
|
C *** MODIFIED FEB 88 TO CORRECT 'IHOMO' HANDLING OF ITYPE=5,6 CASES
|
|
C WHERE POTENTIAL IS SYMMETRIC ABOUT THETA=PI/2
|
|
C *** AUG 86 ADD LM,LMAX ARGUMENTS TO IXQLF
|
|
C *** UPDATED APR 86 TO MERGE BASIN-IOSBIN PROCESSING
|
|
C
|
|
C THIS IS IOS 'BASIS' ROUTINE FOR COMBINED MOLSCAT/IOS APR 86
|
|
C MODIFICATIONS MAY 1978 FOR ITYPE=5.
|
|
C MODIFICATIONS SEPT 1985 FOR ITYPE=6,
|
|
C INCLUDING ADDITION OF MMAX TO &INPUT.
|
|
C
|
|
C-----ENTRY IOSBIN READS &BASIS AND SETS UP BASIS DATA.
|
|
C PARAMETERS ARE NVC (NO. VIB. CHANNELS), ITYPX RETURNS ROTOR TYPE
|
|
C AND ATAU(MX) WHICH WILL HOLD ROTOR COEFF. FOR ITYPE=6
|
|
C
|
|
DIMENSION ATAU(MX)
|
|
C
|
|
C-----ENTRY IOSBGP GETS LAM(MXLAM) INFORMATION FROM &POTL.
|
|
C CAN THEN CHOOSE NGPT, LMAX, MMAX, AND SET UP GAUSS PTS/WTS
|
|
C SPECIFICATIONS FOR ENTRY IOSBGP . . .
|
|
DIMENSION LAM(MXLAM)
|
|
LOGICAL ODD
|
|
C
|
|
C-----ENTRY IOSB1, CALLED AFTER STORAGE IS ALLOCATED, SETS UP PWGHT, VLI
|
|
C ALSO IXQL AND LM.
|
|
C SPECIFICATIONS . . .
|
|
DIMENSION PWGHT(NGPT,LMAX), VLI(NGPT,MXXXXL)
|
|
DIMENSION IXQL(NIXQL,NQL),LM(3,LMAX)
|
|
C BELOW (TEMPORARY) TO CONTROL FLOW OF ALTERNATE ITYPE=3 CODE
|
|
LOGICAL LNEW
|
|
C
|
|
C-----ENTRY IOSB2 IS CALLED JUST BEFORE INTEGRATOR. SETS UP VL, ETC.
|
|
C SPECIFICATIONS FOR ENTRY IOSB2 . . .
|
|
DIMENSION CENT(NVC),EINT(NVC),WVEC(NVC),VL(2),IVIX(2)
|
|
DIMENSION LORB(NVC),JJJ(NVC),NB(NVC)
|
|
C COMMON TO PASS ANGLES TO VRTP FOR "UNEXPANDED" (MXLAM=0) POTL CASE
|
|
C N.B. 3RD ANGLE FOR ITYPE=3. IH0,IC0 TO SET IHOMO,ICNSYM IN VRTP
|
|
C FACTOR IS 1./(VALUE OF LOWEST ANGULAR TERM) - DEPENDS ON ITYPE
|
|
COMMON/ANGLES/COSANG(7),FACTOR,IH0,IC0,IH1,IC1
|
|
LOGICAL LVRTP
|
|
C
|
|
C-----ENTRY IXQLF RETURNS INDEX IN IXQL OF AN INPUT L,M1,M2,ICDE SYM.
|
|
C
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
C TO CONTROL DEBUGGING OUTPUT OF COUPLING MATRIX
|
|
C LDEBUG=.TRUE. CAN GIVE QUITE A BIT OF OUTPUT !
|
|
LOGICAL LDEBUG
|
|
C
|
|
C SPECIFICATIONS FOR MOLSCAT(&BASIS) COMPATIBILITY. . .
|
|
DIMENSION ROTI(12),ALPHAE(2),BE(2),DE(2),A(2),B(2),C(2),WE(2),
|
|
1 WEXE(2),WT(2),ELEVEL(1000)
|
|
INTEGER JMIN,JMAX,NLEVEL,JLEVEL(4000),J1MIN,J1MAX,J2MIN,J2MAX,
|
|
1 IDENT,JSTEP,J1STEP,J2STEP,ISYM(10),ISYM2(10)
|
|
EQUIVALENCE (ROTI(1),BE(1),A(1)), (ROTI(3),ALPHAE(1),B(1)),
|
|
1 (ROTI(5),DE(1),C(1)),(JMIN,J1MIN),(JMAX,J1MAX),
|
|
2 (JSTEP,J1STEP), (ROTI(7),WE(1)),(ROTI(9),WEXE(1))
|
|
C
|
|
COMMON /CMBASE/ ROTI,ELEVEL,EMAX,WT,SPNUC,NLEVEL,JLEVEL,
|
|
1 JMIN,JMAX,JSTEP,ISYM,J2MIN,J2MAX,J2STEP,ISYM2,JHALF,IDENT,
|
|
2 MXJL,MXEL
|
|
C
|
|
C INTERNAL VERSION OF JLEVEL,ELEVEL IS ALSO USED; CF IOSOUT
|
|
DIMENSION LEVV(4000),EV(1000)
|
|
C
|
|
C COMMON BLOCK TO COMMUNICATE WITH IOSOUT . . .
|
|
COMMON /IOUTCM/ MAX,LEVV
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MXXX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C IOS GAUSS POINT CONTROL
|
|
DIMENSION IOSNGP(3),IOSNG(3)
|
|
C
|
|
C ******************************************************************
|
|
C ** PROGRAM LIMITATION **
|
|
C ** DIMENSIONS FOR GAUSS POINTS **
|
|
C ** ------- ---------- **
|
|
C ** COULD USE /MEMORY/ FOR DYNAMIC STORAGE, BUT BELOW SHOULD **
|
|
C ** SUFFICE FOR MOST FEASIBLE CALCULATIONS. **
|
|
C ******************************************************************
|
|
PARAMETER(MXGPT=400)
|
|
DIMENSION COSA(MXGPT),GWT(MXGPT)
|
|
C FOR ITYPE=3 TO HOLD PLM(LI,M,) AND COS(M*PHI) -- LNEW=.TRUE. CODE
|
|
DIMENSION PL1(MXGPT),PL2(MXGPT),COSM(MXGPT)
|
|
C
|
|
C AND EQUIVALENT INTERNAL ARRAYS
|
|
DATA NVCMX/1000/
|
|
DATA IZ/0/
|
|
DATA LNEW/.TRUE./,LDEBUG/.FALSE./
|
|
C
|
|
C STATEMENT FUNCTION USED IN DETERMINING ITYPE=5,6 IHOMO SYMMETRY
|
|
ODD(I,J)=(I-J)-2*((I-J)/2) .NE. 0
|
|
C
|
|
C
|
|
C SPECIFICATIONS FOR LEGENDRE STATEMENT FUNCTION . . .
|
|
XLEG(I,TH)=SQRT(2.D0/DBLE(2*I+1))*PLM(I,0,TH)
|
|
C N.B. PLM(L,M,COSTH) RETURNS A **NORMALIZED** ASSOC. LEG. POLY.
|
|
C
|
|
C NB. THE FOLLOWING VARIABLES ARE USED AS LIMITS (SOME ITYPE=5 ONLY)
|
|
C MAX=HIGHEST J IN BASIS / MXK=HIGHEST K (SYM. TOP) IN BASIS.
|
|
C LMBDMX=HIGHEST LAMBDA IN POTL / MUMX=HIGHEST MU IN POTL
|
|
C LMMAX=HIGHEST 'L' IN SLLR,SLLI,QLT / MUMAX=HIGHEST 'M'
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
PI=ACOS(-1.D0)
|
|
WRITE(6,666)
|
|
666 FORMAT('0 PROCESSED BY IOSBIN ROUTINE (FEB 94).')
|
|
C
|
|
C SET LOCAL (AND HENCE KEPT) VALUES FROM ARGUMENTS
|
|
DO 1107 I=1,3
|
|
1107 IOSNGP(I)=IOSNG(I)
|
|
IPHIFL=IPHIFX
|
|
C INITIALIZE SIZE OF ATAU TO ZERO.
|
|
MXA=MX
|
|
MX=0
|
|
C SET DEFAULT IH0,IC0, IH1, IC1 WHICH MAY BE CHANGED IN VRTP
|
|
IH0=0
|
|
IC0=0
|
|
IH1=0
|
|
IC1=0
|
|
C
|
|
WRITE(6,620) ITYPX
|
|
620 FORMAT('0 INPUT ITYPE =',I4)
|
|
C
|
|
ITYP=ITYPX-10*(ITYPX/10)
|
|
ITYPX=100+ITYP
|
|
C SET IVLFL TO ZERO FOR MOST CASES; EXCEPTION IS ITYPE=102 (FEB 94)
|
|
IVLFL=0
|
|
IF (ITYP.EQ.1) GO TO 1000
|
|
IF (ITYP.EQ.2) GO TO 2000
|
|
IF (ITYP.EQ.3) GO TO 3000
|
|
IF (ITYP.EQ.5) GO TO 5000
|
|
IF (ITYP.EQ.6) GO TO 6000
|
|
WRITE(6,699) ITYP
|
|
699 FORMAT('0 * * * ERROR. MOD(ITYPE,10) =',I3,' NOT SUPPORTED.')
|
|
STOP
|
|
C
|
|
1000 NVC=1
|
|
ASSIGN 6100 TO IGOTP
|
|
EV(1)=0.D0
|
|
LEVV(1)=0
|
|
ILOFF=1
|
|
IF (NLEVEL.GT.0) GO TO 1200
|
|
WRITE(6,601) JMIN,JMAX,JSTEP
|
|
601 FORMAT('0 JLEVEL, NLEVEL CREATED FROM JMIN, JMAX, JSTEP =',
|
|
& 3I5)
|
|
JMIN=MAX0(JMIN,0)
|
|
JMAX=MAX0(JMIN,JMAX)
|
|
JSTEP=MAX0(JSTEP,1)
|
|
MAX=0
|
|
NLEVEL=0
|
|
DO 1100 I=JMIN,JMAX,JSTEP
|
|
IF (NLEVEL.GE.MXJL) GO TO 1109
|
|
NLEVEL=NLEVEL+1
|
|
JLEVEL(NLEVEL)=I
|
|
1100 MAX=MAX0(MAX,I)
|
|
GO TO 9000
|
|
1109 WRITE(6,698)
|
|
698 FORMAT('0 * * * WARNING. OUT OF SPACE IN JLEVEL. ',
|
|
1 'BASIS TRUNCATED.')
|
|
NLEVEL=MXJL
|
|
GO TO 9000
|
|
1200 WRITE(6,602) NLEVEL,(JLEVEL(I),I=1,NLEVEL)
|
|
602 FORMAT('0 BASIS TAKEN FROM NLEVEL, JLEVEL INPUT. NO. OF LEVELS ',
|
|
& '(NLEVEL) =',I4/(' ',20I5) )
|
|
MAX=0
|
|
DO 1300 I=1,NLEVEL
|
|
IF (I.GT.MXJL) GO TO 1109
|
|
1300 MAX=MAX0(MAX,JLEVEL(I))
|
|
GO TO 9000
|
|
C
|
|
C>>SG --------- CODE REWORKED FEB 92 (ANTICIPATING H2-H CALCULATIONS)
|
|
2000 ILOFF=3
|
|
C MODS FEB 94 TO USE IV() INDEXING FOR ITYPE=2 REQUIRE IVLFL=1
|
|
IVLFL=1
|
|
ASSIGN 6200 TO IGOTP
|
|
C
|
|
IF (NLEVEL.GT.0) GO TO 2100
|
|
C -------- GET 'VIBRATIONAL LEVELS' FROM SPECIAL SUBROUTINE -------
|
|
WRITE(6,697)
|
|
697 FORMAT('0 IOSBIN (FEB 92). NLEVEL.LT.0. AN APPROPRIATE',
|
|
1 ' SUBROUTINE MUST BE PROVIDED:'/
|
|
2 35X,'GET102(MXJL,NLEVEL,JLEVEL,ELEVEL)'/)
|
|
CALL GET102(MXJL,NLEVEL,JLEVEL,ELEVEL)
|
|
NVC=NLEVEL
|
|
MAX=0
|
|
DO 2190 I=1,NVC
|
|
EV(I)=ELEVEL(I)
|
|
LEVV(I)=JLEVEL(2*I)
|
|
2190 MAX=MAX0(MAX,JLEVEL(2*I-1))
|
|
C SKIP '2009' PRINT OUT OF LEVEL INFO/ DO IT IN GET102 IF DESIRED
|
|
GO TO 9000
|
|
C
|
|
C ----- GET 'VIBRATIONAL LEVELS' FROM JLEVEL -----
|
|
C CURRENT CODE DOES NOT ALLOW DUPLICATE VIB LEVELS.
|
|
2100 NVC=1
|
|
ITOP=2*NLEVEL
|
|
WRITE(6,602) NLEVEL,(JLEVEL(I),I=1,ITOP)
|
|
LEVV(1)=JLEVEL(2)
|
|
MAX=JLEVEL(1)
|
|
I=2
|
|
2102 IF (I.GT.NLEVEL) GO TO 2110
|
|
DO 2103 II=1,NVC
|
|
IF (LEVV(II).NE.JLEVEL(2*I)) GO TO 2103
|
|
WRITE(6,693) I,JLEVEL(2*I-1),JLEVEL(2*I)
|
|
693 FORMAT(' IOSBIN (FEB 92). LEVEL',I4,' V,J =',2I4,' DUPLICATES'
|
|
1 ,' AN EARLIER VIB LEVEL.'/
|
|
2 20X,'VIBRATIONAL VALUE IGNORED, HIGHER J-VALUE KEPT.')
|
|
JXX=MAX0(JLEVEL(2*II-1),JLEVEL(2*I-1))
|
|
JLEVEL(2*II-1)=JXX
|
|
MAX=MAX0(MAX,JXX)
|
|
IF (I.LT.NLEVEL) GO TO 2120
|
|
C I.EQ.NLEVEL ==> REDUCE NLEVEL AND GET OUT
|
|
NLEVEL=NLEVEL-1
|
|
GO TO 2110
|
|
C PULL DOWN LIST/ DECREASE NLEVEL/ GO BACK FOR NEW I-TH LEVEL
|
|
2120 DO 2121 J=I+1,NLEVEL
|
|
ELEVEL(J-1)=ELEVEL(J)
|
|
JLEVEL(2*J-3)=JLEVEL(2*J-1)
|
|
2121 JLEVEL(2*J-2)=JLEVEL(2*J)
|
|
NLEVEL=NLEVEL-1
|
|
GO TO 2102
|
|
2103 CONTINUE
|
|
C DUPLICATE VIB LEVEL NOT FOUND/ ADD THIS VIBRATIONAL LEVEL
|
|
IF (NVC.LT.NVCMX) GO TO 2104
|
|
WRITE(6,694) NVCMX
|
|
694 FORMAT('0 ISOBIN -- ERROR. VIBRATIONAL LEVELS IN NLEVEL/JLEVEL'
|
|
1 ,' EXCEED NVCMX =',I4)
|
|
STOP
|
|
2104 NVC=NVC+1
|
|
LEVV(NVC)=JLEVEL(2*I)
|
|
MAX=MAX0(MAX,JLEVEL(2*I-1))
|
|
I=I+1
|
|
GO TO 2102
|
|
C
|
|
2110 WRITE(6,692) NVC
|
|
692 FORMAT('0 IOSBIN (FEB 92). NUMBER OF VIB. CHANNELS (NVC) =',I4)
|
|
C
|
|
C ----- GET ENERGY LEVELS -----
|
|
DO 2111 I=1,NVC
|
|
IF (ELEVEL(I).EQ.0.) GO TO 2111
|
|
C IF ELEVEL() VALUES ARE SET (NON-ZERO), USE THEM
|
|
GO TO 2290
|
|
2111 CONTINUE
|
|
C IF WE REACH HERE, ALL ELEVEL ARE ZERO.
|
|
C IF THERE IS ONLY ONE LEVEL, AND ENERGY()=0, WE ARE STILL OKEY
|
|
IF (NVC.GT.1) GO TO 2280
|
|
C SET EV() FROM ELEVEL() AND WE ARE DONE.
|
|
2290 WRITE(6,691)
|
|
691 FORMAT('0 IOSBIN (FEB 92). VIBRATIONAL ENERGIES ',
|
|
1 'TAKEN FROM ELEVEL INPUT.')
|
|
DO 2291 I=1,NVC
|
|
2291 EV(I)=ELEVEL(I)
|
|
GO TO 2009
|
|
C OTHERWISE, SEE IF WE CAN CALCULATE ENERGIES FROM WE, WEXE
|
|
2280 IF (WE(1).GT.0.D0) GO TO 2200
|
|
WRITE(6,696) NVC,WE(1)
|
|
696 FORMAT('0 IOSBIN (FEB 92) CANNOT GET ENERGIES FROM ELEVEL ',
|
|
& 'OR WE. NVC, WE =',I6,D14.4)
|
|
STOP
|
|
2200 WRITE(6,603) WE(1)
|
|
603 FORMAT('0 TARGET ENERGY LEVELS (TAKING V = 0 AS ZERO ENERGY)',
|
|
1 ' COMPUTED FROM WE =',F10.4)
|
|
IF (WEXE(1).NE.0.D0) WRITE(6,604) WEXE(1)
|
|
604 FORMAT(67X,'CORRECTED FOR WEXE =',F10.6)
|
|
DO 2201 I=1,NVC
|
|
FV=LEVV(I)
|
|
EV(I)=WE(1)*FV-WEXE(1)*FV*(FV+1.D0)
|
|
C STORE BACK IN JLEVEL,ELEVEL FOR ISAVEU OUTPUT PURPOSES.
|
|
C>>SG JLEVEL(I)=LEVV(I) -->> THIS WAS USED FOR ISAVEU CAPABILITY IN
|
|
C>>SG -->> IOSDRV AND WILL NO LONGER WORK THERE
|
|
C ELEVEL() IS NEEDED IN IOSB2 TO GET EINT, ETC.
|
|
2201 ELEVEL(I)=EV(I)
|
|
NLEVEL=NVC
|
|
C ------ OUTPUT LEVV, EV ------
|
|
2009 DO 2019 I=1,NVC
|
|
2019 WRITE(6,613) I,LEVV(I),EV(I)
|
|
613 FORMAT(' LEVEL',I4,' LEVV =',I4,' EV =',F12.4)
|
|
GO TO 9000
|
|
C<<SG ------------------------------<< END OF MODIFICATIONS (2/4/91)
|
|
C
|
|
C>>SG ----- ITYPE=3 CODE ADDED 5/6/92 (SG)
|
|
3000 ILOFF=3
|
|
ASSIGN 6300 TO IGOTP
|
|
NVC=1
|
|
LEVV(1)=0
|
|
EV(1)=0.
|
|
IF (NLEVEL.GT.0) GO TO 3901
|
|
WRITE(6,632) JMIN,JMAX,JSTEP,J2MIN,J2MAX,J2STEP
|
|
632 FORMAT('0 ROTATIONAL LEVELS FROM JMIN JMAX JSTEP'/
|
|
1 ' ROTOR 1 -- ',3I5/' ROTOR 2 -- ',3I5)
|
|
GO TO 3903
|
|
3901 ITOP=2*NLEVEL
|
|
WRITE(6,633) NLEVEL,(JLEVEL(I),I=1,ITOP)
|
|
633 FORMAT('0 ROTATIONAL LEVELS FROM NLEVEL =',I4,' -- JLEVEL ='/
|
|
1 (25I4))
|
|
DO 3902 I=1,NLEVEL
|
|
JMIN=MIN0(JMIN,JLEVEL(2*I-1))
|
|
JMAX=MAX0(JMAX,JLEVEL(2*I-1))
|
|
J2MIN=MIN0(J2MIN,JLEVEL(2*I))
|
|
3902 J2MAX=MAX0(J2MAX,JLEVEL(2*I))
|
|
3903 MAX=MAX0(JMAX,J2MAX)
|
|
IF (IDENT.GT.0) WRITE(6,634) IDENT
|
|
634 FORMAT('0 IDENTICAL PARTICLES SPECIFIED BY IDENT =',I3)
|
|
GO TO 9000
|
|
C<<SG ----- END OF ITYPE=3 CODE ADDED 5/6/92 (SG)
|
|
C
|
|
5000 ILOFF=2
|
|
ASSIGN 6500 TO IGOTP
|
|
NVC=1
|
|
EV(1)=0.D0
|
|
LEVV(1)=0
|
|
IF (NLEVEL.GT.0) GO TO 5001
|
|
WRITE(6,687) ITYPX
|
|
687 FORMAT('0 * * * WARNING. CURRENT ITYPE =',I3,' REQUIRES NLEVEL/'
|
|
1 ,'JLEVEL INPUT. CROSS SECTIONS NOT COMPUTED.')
|
|
GO TO 9000
|
|
5001 ITOP=3*NLEVEL
|
|
WRITE(6,652) NLEVEL,(JLEVEL(I),I=1,ITOP)
|
|
652 FORMAT('0 BASIS IS TAKEN FROM NLEVEL =',I4,' AND JLEVEL INPUT'/
|
|
1 '0 J K PRTY'/ (' ',I3,2I4))
|
|
MAX=0
|
|
MXK=0
|
|
C BELOW IS A LESS-THAN-PERFECT CHECK ON DIMENSIONS FOR JLEVEL
|
|
NLEVEL=MIN0(NLEVEL,MXJL)
|
|
DO 5002 I=1,NLEVEL
|
|
MAX=MAX0(MAX,JLEVEL(3*I-2))
|
|
5002 MXK=MAX0(MXK,IABS(JLEVEL(3*I-1)))
|
|
GO TO 9000
|
|
C
|
|
6000 ILOFF=2
|
|
ASSIGN 6500 TO IGOTP
|
|
NVC=1
|
|
EV(1)=0.D0
|
|
LEVV(1)=0
|
|
CALL SET6I(JLEVEL,MXJL,NLEVEL,ATAU,MXA,IASYMU)
|
|
MX=MXA
|
|
C ***
|
|
C *** N.B JLEVEL(,1) = J, JLEVEL(,2) = TAU, JLEVEL(,3) = PARITY
|
|
C *** JLEVEL(,4)+1 = STARTING ADDRESS IN ATAU OF COEFFS (NK=2*J+1)
|
|
C ***
|
|
MAX=0
|
|
IF (NLEVEL.LE.0) GO TO 9000
|
|
DO 6001 I=1,NLEVEL
|
|
6001 MAX=MAX0(MAX,JLEVEL(4*I-3))
|
|
MXK=MAX
|
|
GO TO 9000
|
|
C
|
|
C COMMON RETURN POINT
|
|
9000 RETURN
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY IOSBGP(MXLAM,LAM,MXXXXL,NGPT,LMAX,MMAX,NQL,NIXQL)
|
|
C
|
|
C FIND HIGHEST LAMBDA VALUE AND CHECK FOR HOMONUCLEAR SYMMETRY.
|
|
C IHOMO =1( ALL LEGENDRE SYMMETRIES) OR 2 ( ONLY EVEN LEGENDRE SYMS)
|
|
C N.B. THIS WILL HAVE TO BE RESET FOR ITYPE=5,6, BUT WE NEED TO
|
|
C DETERMINE MXXXXL FOR VRTP; N.B. MXLAM=1 HAS BEEN SET BY POTENL.
|
|
MXXXXL=0
|
|
C
|
|
C
|
|
C SEPARATE CODE FOR ITYPE=3
|
|
IF (ITYP.EQ.3) GO TO 3330
|
|
C
|
|
C BELOW IS UNIFIED ITYPE=1,2,5,6 -- THEN SPLITS OFF FOR 5,6
|
|
IHOMO=2
|
|
IL=1
|
|
DO 3001 I=1,MXLAM
|
|
L=LAM(IL)
|
|
IF (L.GE.0) GO TO 3002
|
|
WRITE(6,695) I,L
|
|
695 FORMAT('0 * * * WARNING. LAM(I) NEGATIVE',2I5)
|
|
L=IABS(L)
|
|
LAM(IL)=L
|
|
3002 MXXXXL=MAX0(L,MXXXXL)
|
|
IF (L-2*(L/2).EQ.1) IHOMO=1
|
|
3001 IL=IL+ILOFF
|
|
C CHECK FOR 'MXSYM=0' CASE, I.E. UNEXPANDED POTENTIAL.
|
|
C N.B. IHOMO=1,2 ONLY SHOULD BE ALLOWED, NOT CHECKED BELOW.
|
|
C>>SG IN CASE ONLY LAMBDA=0 TERMS APPEAR IN THE POTENTIAL (E.G., IN
|
|
C A BREATHING SPHERE TYPE VIBRATIONAL CALC) THE CODE BELOW WILL
|
|
C (ERRONEOUSLY) SET LVRTP=.TRUE. HOWEVER, SINCE THE POTENTIAL
|
|
C IS THEN SPHERICALLY SYMMETRIC, THIS OUGHT TO STILL WORK. ONE
|
|
C MIGHT, WORRY, HOWEVER, ABOUT IHOMO SETTING, AND DOUBLE CHECK
|
|
C BEFORE RUNNING SUCH A CASE
|
|
C<<SG
|
|
LVRTP=MXXXXL.LE.0
|
|
IF (.NOT.LVRTP) GO TO 3003
|
|
IHOMO=1
|
|
IF (IH0.EQ.0) GO TO 3003
|
|
IHOMO=IH0
|
|
WRITE(6,617) IHOMO
|
|
617 FORMAT('0 * * * NOTE. IHOMO TAKEN FROM VRTP ROUTINE =',I4)
|
|
C
|
|
3003 IF (ITYP.EQ.5 .OR. ITYP.EQ.6) GO TO 3500
|
|
C *** BELOW FOR ITYPE=1,2 // SET MXXXXL, DETERMINE NGPT AND LMAX=NQL
|
|
THLO=-1.D0
|
|
THHI=1.D0
|
|
SFACT=1.D0
|
|
IF (IHOMO.EQ.1) GO TO 3200
|
|
THLO=0.D0
|
|
SFACT=SFACT*2.D0
|
|
WRITE(6,608)
|
|
608 FORMAT('0 * * * NOTE.'/' * * * NOTE. USE WILL BE MADE OF FACT ',
|
|
& 'THAT POTENTIAL HAS ONLY EVEN LEGENDRE TERMS.')
|
|
C
|
|
3200 MXXXXL=MXXXXL/IHOMO+1
|
|
IF (IOSNGP(1).LE.0) GO TO 3101
|
|
NGL=IOSNGP(1)
|
|
WRITE(6,655) NGL,IOSNGP(1)
|
|
GO TO 3102
|
|
3101 I=MXXXXL*IHOMO
|
|
NGL=2*(MAX+I)
|
|
WRITE(6,656) NGL,MAX,I
|
|
3102 NGPT=NGL
|
|
IF (NGPT.LE.MXGPT) GO TO 3103
|
|
WRITE(6,607) NGPT,MXGPT
|
|
607 FORMAT('0 * * * WARNING. NGPT.GT.MXGPT -- REDUCED.')
|
|
NGPT=MXGPT
|
|
C SET UP FOR LINEAR MOLECULES / POINTS AND WEIGHTS.
|
|
3103 CALL GAUSSP(THLO,THHI,NGPT,COSA,GWT)
|
|
DO 3201 I=1,NGPT
|
|
3201 GWT(I)=GWT(I)*SFACT
|
|
WRITE(6,609) NGPT,(COSA(I),GWT(I),I=1,NGPT)
|
|
609 FORMAT('0 THETA INTEGRATION DONE BY ',I3,'-POINT GAUSSIAN ',
|
|
& 'QUADRATURE. POINTS/WEIGHTS ARE'/(4(10X,2F10.6)))
|
|
C CHOOSE LMAX.
|
|
IF (LMAX.LE.0) GO TO 3301
|
|
WRITE(6,610) LMAX
|
|
610 FORMAT('0 LMAX TAKEN FROM &INPUT LMAX =',I5)
|
|
IF (LMAX.GT.NGPT*IHOMO) WRITE(6,611)
|
|
611 FORMAT('0 * * * WARNING. LMAX TOO LARGE FOR NGPT. ERRORS IN ',
|
|
& 'HIGHER Q(L) WILL RESULT.')
|
|
GO TO 3300
|
|
3301 LMAX=NGPT*IHOMO
|
|
WRITE(6,612) LMAX
|
|
612 FORMAT('0 * * * WARNING. INPUT LMAX.LE.0 (DEFAULT), WILL USE ',
|
|
& 'HIGHEST VALUE CONSISTENT WITH NGPT. LMAX =',I4)
|
|
3300 NQL=LMAX
|
|
NIXQL=2
|
|
C>>SG CHECK THAT MXXXXL IS GE TO 1 FOR FUTURE INDEXING PURPOSES
|
|
IF (MXXXXL.GE.1) RETURN
|
|
WRITE(6,990) MXXXXL
|
|
990 FORMAT('0 IOSBIN (FEB 92 CODE). MXXXXL RESET FROM',I4/
|
|
1 ' ****** WARNING. THIS IS PROBABLY AN ERROR CONDITION.')
|
|
MXXXXL=1
|
|
RETURN
|
|
C
|
|
C *** BELOW FOR ITYPE=5 AND 6 // SET MXXXXL, NGPT, LMAX, NQL
|
|
C FEB 88 CODE BELOW TO SET IHOMO FOR ITYPE=5,6.
|
|
C N.B V(PI-THETA)=V(PI) REQUIRES YLM EXIST ONLY FOR L-M EVEN
|
|
C WHICH DIFFERES FORM THE L EVEN FOR ITYPE=1,2 USED PREVIOUSLY
|
|
C>>SG 5/11/92
|
|
C>>SG 5/11/92 N.B. THIS SHOULD BE REDONE TO TAKE ADVANTAGE OF NEW GAUSSP
|
|
C>>SG 5/11/92
|
|
3500 IF (.NOT.LVRTP) GO TO 3540
|
|
IHOMO=1
|
|
IF (IH0.EQ.0) GO TO 3543
|
|
IHOMO=IH0
|
|
GO TO 3543
|
|
C ABOVE ALLOWS SETTING IN VRTP ROUTINE/ BELOW CHECKS INPUT L,M SYMS.
|
|
3540 IHOMO=2
|
|
DO 3542 L=1,MXLAM
|
|
IF (ODD(LAM(2*L),LAM(2*L-1))) IHOMO=1
|
|
3542 CONTINUE
|
|
3543 THLO=-1.D0
|
|
THHI=1.D0
|
|
SFACT=1.D0
|
|
IF (IHOMO.EQ.1) GO TO 3541
|
|
WRITE(6,618)
|
|
618 FORMAT('0 * * * NOTE.'/' * * * NOTE. USE WILL BE MADE OF FACT ',
|
|
& 'THAT POTENTIAL IS SYMMETRIC ABOUT THETA=PI/2'/' * * * NOTE.')
|
|
THLO=0.D0
|
|
SFACT=2.D0
|
|
C NEXT GET ICNSYM (OLD CODE SHOULD ALWAYS STILL WORK OKEY)
|
|
3541 LMBDMX=MXXXXL
|
|
MUMX=0
|
|
DO 3501 L=1,MXLAM
|
|
3501 MUMX=MAX0(MUMX,IABS(LAM(2*L)))
|
|
C FIND ICNSYM WHICH IS PHI EQUIVALENT OF IHOMO
|
|
IF (MUMX.GT.1) GO TO 3502
|
|
C ALLOW SETTING OF ICNSYM FOR 'MXSYM=0' (UNEXPANDED POTL) CASE
|
|
ICNSYM=1
|
|
IF (.NOT.LVRTP .OR. IC0.EQ.0) GO TO 3503
|
|
ICNSYM=IC0
|
|
WRITE(6,654) ICNSYM
|
|
654 FORMAT('0 * * * NOTE. ICNSYM TAKEN FROM VRTP ROUTINE =',I4)
|
|
GO TO 3503
|
|
3502 ICNSYM=MUMX
|
|
3506 DO 3504 L=1,MXLAM
|
|
M=IABS(LAM(2*L))
|
|
IF (M-(M/ICNSYM)*ICNSYM .NE. 0) GO TO 3505
|
|
3504 CONTINUE
|
|
GO TO 3503
|
|
3505 ICNSYM=ICNSYM-1
|
|
IF (ICNSYM.GT.1) GO TO 3506
|
|
3503 PHILO=0.D0
|
|
PHIHI=PI/DBLE(ICNSYM)
|
|
SFACT=SFACT*DBLE(ICNSYM)*2.D0
|
|
C N.B. WE USE HERE FACT THAT POTENTIAL IS EVEN IN PHI SO INTEGRAL
|
|
C IS TWICE THAT FROM 0 TO PI. THIS IS REFLECTED IN HAVING ONLY
|
|
C COS (M*PHI) AND NOT SIN (M*PHI) IN PWGHT, ETC.
|
|
IF (ICNSYM.GT.1) WRITE(6,658) ICNSYM
|
|
658 FORMAT('0 * * * NOTE.'/' * * * NOTE. USE WILL BE MADE OF',I4
|
|
& ,'-FOLD SYMMETRY ABOUT Z-AXIS.'/' * * * NOTE.')
|
|
C DETERMINE NO. OF LAMBDA, MU SYMMETRIES (MXXXXL)
|
|
MXXXXL=0
|
|
DO 3507 L=IZ,LMBDMX
|
|
MTOP=MIN0(MUMX,L)
|
|
DO 3507 M=IZ,MTOP,ICNSYM
|
|
IF (IHOMO.EQ.2 .AND. ODD(L,M)) GO TO 3507
|
|
MXXXXL=MXXXXL+1
|
|
3507 CONTINUE
|
|
C DETERMINE NO. OF GAUSSPOINTS FOR THETH(NGL) AND PHI (NGM)
|
|
C ** N.B. SOME MANEUVERING IS NECESSARY SINCE GAUSSP MAY REDUCE NPT.
|
|
WRITE(6,645) IPHIFL
|
|
645 FORMAT('0 * * * NOTE. IPHIFL (PHI INTEGRATION FLAG) =',I4)
|
|
IPASS=0
|
|
IF (IOSNGP(1).GT.0) GO TO 3510
|
|
NGL=2*(MAX+LMBDMX)
|
|
WRITE(6,656) NGL,MAX,LMBDMX
|
|
656 FORMAT('0 * * * NOTE. INPUT IOSNGP(1) .LE. 0 (DEFAULT). ',
|
|
& 'NGL =',I4,' COMPUTED FROM MAX, LMBDMX =',2I4)
|
|
GO TO 3531
|
|
3510 NGL=IOSNGP(1)
|
|
WRITE(6,655) NGL,IOSNGP(1)
|
|
655 FORMAT('0 * * * NOTE. NGL =',I4,' TAKEN FROM',
|
|
& ' &BASIS IOSNGP(1) =',I4)
|
|
3531 IF (IOSNGP(2).GT.0) GO TO 3532
|
|
NGM=MAX0(1,2*(MUMX+MXK))
|
|
WRITE(6,647) NGM,MXK,MUMX
|
|
647 FORMAT('0 * * * NOTE. INPUT IOSNGP(2) .LE. 0 (DEFAULT). NGM =',
|
|
& I4, ' COMPUTED FROM MXK, MUMX =',2I4)
|
|
GO TO 3511
|
|
3532 WRITE(6,646) IOSNGP(2)
|
|
646 FORMAT('0 * * * NOTE. NGM SET FROM &BASIS IOSNGP(2) =',I4)
|
|
NGM=MAX0(1,IOSNGP(2))
|
|
3511 CALL GAUSSP(THLO,THHI,NGL,COSA,GWT)
|
|
IF (MUMX.GT.0 .OR. IPASS.GT.0 .OR.LVRTP) GO TO 3512
|
|
NGM=1
|
|
WRITE(6,650)
|
|
650 FORMAT('0 * * * NOTE.'/' * * * NOTE. POTENTIAL HAS NO PHI ',
|
|
& 'DEPENDENCE. INTEGRAL DONE ANALYTICALLY.')
|
|
3512 IF (IPHIFL.NE.0)
|
|
&CALL GAUSSP(PHILO,PHIHI,NGM,COSA,GWT)
|
|
NGPT=NGM+NGL
|
|
IF (NGPT.LE.MXGPT) GO TO 3513
|
|
WRITE(6,607) NGPT,MXGPT
|
|
NGL=(DBLE(MXGPT)/DBLE(NGPT))*NGL
|
|
NGM=(DBLE(MXGPT)/DBLE(NGPT))*NGM
|
|
NGM=MAX0(NGM,1)
|
|
IPASS=1
|
|
GO TO 3511
|
|
3513 CALL GAUSSP(THLO,THHI,NGL,COSA,GWT)
|
|
WRITE(6,609) NGL,(COSA(I),GWT(I),I=1,NGL)
|
|
IF (IPHIFL.EQ.0) GO TO 3515
|
|
CALL GAUSSP(PHILO,PHIHI,NGM,COSA(NGL+1),GWT(NGL+1))
|
|
WRITE(6,644) NGM,(COSA(NGL+I),GWT(NGL+I),I=1,NGM)
|
|
644 FORMAT('0 PHI INTEGRATION DONE BY ',I3,'-POINT GAUSSIAN ',
|
|
& 'QUADRATURE. POINTS/WEIGHTS ARE'/(4(10X,2F10.6)))
|
|
GO TO 3516
|
|
3515 IX=NGL
|
|
FACTL=(PHIHI-PHILO)/DBLE(NGM)
|
|
TH=-FACTL/2.D0
|
|
DO 3514 I=1,NGM
|
|
IX=IX+1
|
|
TH=TH+FACTL
|
|
GWT(IX)=FACTL
|
|
3514 COSA(IX)=TH
|
|
WRITE(6,651) NGM,(COSA(NGL+I),GWT(NGL+I),I=1,NGM)
|
|
651 FORMAT('0 PHI INTEGRATION DONE BY ',I3,'-POINT GAUSS-MEHLER ',
|
|
& 'CHEBYSCHEV) QUADRATURE. POINTS/WEIGHTS ARE'/(4(10X,2F10.6)))
|
|
3516 WRITE(6,653) SFACT
|
|
653 FORMAT('0 ABOVE WEIGHTS MULTIPLIED BY SYMMETRY FACTOR =',D16.8)
|
|
NGPT=NGL*NGM
|
|
C NEXT CHOOSE LMAX (LMMAX,MUMAX)
|
|
IF (LMAX.LE.0) GO TO 3520
|
|
WRITE(6,610) LMAX
|
|
LMMAX=LMAX
|
|
GO TO 3523
|
|
3520 LMMAX=MIN0(NGL*IHOMO,2*MAX)
|
|
WRITE(6,612) LMMAX
|
|
C INPUT CAPABILITY ON MMAX ADDED IN VERSION 6.
|
|
3523 IF (MMAX.LE.0) GO TO 3525
|
|
MUMAX=MMAX
|
|
WRITE(6,630) MMAX
|
|
630 FORMAT('0 MMAX TAKEN FROM &INPUT MMAX =',I5)
|
|
GO TO 3524
|
|
3525 MUMAX=MIN0(NGM*ICNSYM,2*MXK,LMMAX)
|
|
WRITE(6,631) MUMAX
|
|
631 FORMAT('0 * * * WARNING. MMAX=0 (DEFAULT). WILL USE HIGHEST',
|
|
& ' VALUE CONSISTENT WITH IOSNGP(2), MMAX =',I4)
|
|
C RESET LMAX TO REFLECT *NUMBER* OF LAMBDA,MU VALUES.
|
|
C AND COUNT NQL (NUMBER OF QLT VALUES)
|
|
3524 LMAX=0
|
|
NQL=0
|
|
DO 3521 L=IZ,LMMAX
|
|
MTOP=MIN0(MUMAX,L)
|
|
DO 3521 M=IZ,MTOP,ICNSYM
|
|
IF (IHOMO.EQ.2 .AND. ODD(L,M)) GO TO 3521
|
|
LMAX=LMAX+1
|
|
DO 3522 I=IZ,M,ICNSYM
|
|
IF (IHOMO.EQ.2 .AND. ODD(L,I)) GO TO 3522
|
|
IX=2
|
|
IF (I.EQ.M) IX=1
|
|
NQL=NQL+IX
|
|
3522 CONTINUE
|
|
3521 CONTINUE
|
|
NIXQL=3
|
|
RETURN
|
|
C
|
|
C ITYPE=3 CODE ADDED 5/6/92 (SG)
|
|
C GET POTENL SYMS. (ITYPE=3 USES IHOMO,ICNSYM FOR IHOMO1,IHOMO2)
|
|
3330 L1MAX=0
|
|
L2MAX=0
|
|
LLMAX=0
|
|
IL=0
|
|
DO 3331 I=1,MXLAM
|
|
L1MAX=MAX0(L1MAX,LAM(IL+1))
|
|
L2MAX=MAX0(L2MAX,LAM(IL+2))
|
|
LLMAX=MAX0(LLMAX,LAM(IL+3))
|
|
3331 IL=IL+ILOFF
|
|
MXXXXL=MAX0(MXXXXL,L1MAX,L2MAX,LLMAX)
|
|
LVRTP=MXXXXL.LE.0
|
|
IF (.NOT.LVRTP) GO TO 3332
|
|
C ?? MXXXXL=1 THIS WILL BE TAKEN CARE OF IN 3336 LOOP
|
|
IHOMO=1
|
|
ICNSYM=1
|
|
IF (IH0.EQ.0) GO TO 3333
|
|
IHOMO=IH0
|
|
WRITE(6,637) IHOMO
|
|
637 FORMAT('0 * * * NOTE. IHOMO (MOL 1) TAKEN FROM VRTP ROUTINE =',I4)
|
|
3333 IF (IC0.EQ.0) GO TO 3334
|
|
ICNSYM=IC0
|
|
WRITE(6,638) ICNSYM
|
|
638 FORMAT('0 * * * NOTE. IHOMO (MOL 2) TAKEN FROM VRTP ROUTINE =',I4)
|
|
GO TO 3334
|
|
C FOR EXPANDED POTENTIAL (.NOT.LVRTP) GET IHOMO1,IHOMO2 FROM LAM
|
|
3332 IHOMO=2
|
|
ICNSYM=2
|
|
DO 3335 I=1,MXLAM
|
|
IF (ODD(LAM(3*I-2),0)) IHOMO=1
|
|
3335 IF (ODD(LAM(3*I-1),0)) ICNSYM=1
|
|
3334 IM=1
|
|
IF (IHOMO.EQ.2) WRITE(6,639) IM
|
|
639 FORMAT('0 * * * NOTE.'/' * * * NOTE. USE WILL BE MADE OF FACT ',
|
|
& 'THAT POTENTIAL IS SYMMETRIC ABOUT PI/2 FOR MOLECULE',I3)
|
|
IM=2
|
|
IF (ICNSYM.EQ.2) WRITE(6,639) IM
|
|
C>>SG (5/18/92) STORE IHOMO,ICNSYM BACK IN IH0,IC0 FOR USE IN IOSOUT
|
|
IH0=IHOMO
|
|
IC0=ICNSYM
|
|
C COUNT L1,L2,LL SYMMETRIES (MXXXXL)
|
|
C FOR IDENT PARTICLES, L1,L2<->L2,L1 MUST BOTH BE IN POTL SYMS
|
|
MXXXXL=0
|
|
DO 3336 L1=IZ,L1MAX,IHOMO
|
|
L2TOP=L2MAX
|
|
IF (IDENT.GT.0) L2TOP=L1MAX
|
|
DO 3336 L2=IZ,L2TOP,ICNSYM
|
|
LLO=ABS(L1-L2)
|
|
LHI=L1+L2
|
|
DO 3336 LL=LLO,LHI
|
|
IF (ODD(L1+L2,LL)) GO TO 3336
|
|
MXXXXL=MXXXXL+1
|
|
3336 CONTINUE
|
|
C SET INTEGRATION LIMITS AND GET GAUSS POINTS
|
|
C CURRENT GAUSSP (5/6/92) DOES *ARBITRARY* NO PTS;
|
|
C IF REQUEST EXCEEDS DIMENSIONS (MXGPT) TERMINATE.
|
|
SFACT=1.D0
|
|
IF (IOSNGP(1)*IOSNGP(2)*IOSNGP(3).GT.0 .AND.
|
|
1 IOSNGP(1)+IOSNGP(2)+IOSNGP(3).LE.MXGPT) GO TO 3337
|
|
WRITE(6,636) IOSNGP,MXGPT
|
|
636 FORMAT('0 IOSBGP. ERROR. IOSNGP INPUT, ',3I5,' ILLEGAL OR ',
|
|
1 'EXCEEDS STORAGE (MXGPT) =',I5)
|
|
STOP
|
|
3337 NGP1=IOSNGP(1)
|
|
THLO=-1.D0
|
|
THHI=1.D0
|
|
IF (IHOMO.EQ.2) THEN
|
|
THLO=0.D0
|
|
SFACT=SFACT*2.D0
|
|
ENDIF
|
|
CALL GAUSSP(THLO,THHI,NGP1,COSA(1),GWT(1))
|
|
WRITE(6,609) NGP1,(COSA(I),GWT(I),I=1,NGP1)
|
|
NGP2=IOSNGP(2)
|
|
IST2=NGP1
|
|
THLO=-1.D0
|
|
IF (ICNSYM.EQ.2) THEN
|
|
THLO=0.D0
|
|
SFACT=SFACT*2.D0
|
|
ENDIF
|
|
CALL GAUSSP(THLO,THHI,NGP2,COSA(IST2+1),GWT(IST2+1))
|
|
WRITE(6,609) NGP2,(COSA(IST2+I),GWT(IST2+I),I=1,NGP2)
|
|
WRITE(6,645) IPHIFL
|
|
PHILO=0.D0
|
|
C CAN ALWAYS USE SYMMETRY V(-PHI)=V(PHI) TO REDUCE INTEGRAL
|
|
C FROM (0,2*PI) TO (0,PI) -- CORRECT SFACT ACCORDINGLY
|
|
PHIHI=PI
|
|
SFACT=SFACT*2.D0
|
|
IST3=IST2+NGP2
|
|
NGM=IOSNGP(3)
|
|
IF (IPHIFL.EQ.0) GO TO 3338
|
|
CALL GAUSSP(PHILO,PHIHI,NGM,COSA(IST3+1),GWT(IST3+1))
|
|
WRITE(6,644) NGM,(COSA(IST3+I),GWT(IST3+I),I=1,NGM)
|
|
GO TO 3339
|
|
3338 IX=IST3
|
|
FACTL=(PHIHI-PHILO)/DBLE(NGM)
|
|
TH=-FACTL/2.D0
|
|
DO 3342 I=1,NGM
|
|
IX=IX+1
|
|
TH=TH+FACTL
|
|
GWT(IX)=FACTL
|
|
3342 COSA(IX)=TH
|
|
WRITE(6,651) NGM,(COSA(IST3+I),GWT(IST3+I),I=1,NGM)
|
|
C SET NGPT AS PRODUCT OF THETA-1, THETA-2, PHI GRIDS
|
|
3339 NGPT=NGP1*NGP2*NGM
|
|
WRITE(6,653) SFACT
|
|
C RESET LMAX AND NQL=LMAX TO REFLECT NUMBER OF L1,L2,LL VALUES
|
|
C USE ITYP=5,6 VARIABLES: LMMAX FOR L1, MUMAX FOR L2
|
|
IF (LMAX.GT.0) GO TO 3340
|
|
LMMAX=(NGP1-1)*IHOMO
|
|
WRITE(6,640) LMAX,LMMAX,NGP1,IHOMO
|
|
640 FORMAT('0 &INPUT LMAX =',I4,' -- L1MAX =',I4,' CALCULATED FROM ',
|
|
1 ' NGP1 AND (SYMMETRY) IHOMO =',2I4)
|
|
GO TO 3344
|
|
3340 LMMAX=LMAX
|
|
WRITE(6,641) LMAX
|
|
641 FORMAT(' L1MAX TAKEN FROM &INPUT LMAX =',I4)
|
|
3344 IF (MMAX.GT.0) GO TO 3343
|
|
MUMAX=(NGP2-1)*ICNSYM
|
|
WRITE(6,642) MMAX,MUMAX,NGP2,ICNSYM
|
|
642 FORMAT('0 &INPUT MMAX =',I4,' -- L2MAX =',I4,' CALCULATED FROM ',
|
|
1 ' NGP2 AND (SYMMETRY) ICNSYM=',2I4)
|
|
GO TO 3345
|
|
3343 MUMAX=MMAX
|
|
WRITE(6,643) MMAX
|
|
643 FORMAT(' L2MAX TAKEN FROM &INPUT MMAX =',I4)
|
|
3345 LMAX=0
|
|
DO 3341 L1=IZ,LMMAX,IHOMO
|
|
L2TOP=MUMAX
|
|
C IDENTICAL PARTICLES KEEP ONLY L1.GE.L2 IN LM(,)
|
|
IF (IDENT.GT.0) L2TOP=L1
|
|
DO 3341 L2=IZ,L2TOP,ICNSYM
|
|
LLO=ABS(L1-L2)
|
|
LHI=L1+L2
|
|
DO 3341 LL=LLO,LHI
|
|
IF (ODD(L1+L2,LL)) GO TO 3341
|
|
LMAX=LMAX+1
|
|
3341 CONTINUE
|
|
NQL=LMAX
|
|
NIXQL=2
|
|
RETURN
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY IOSB1(PWGHT,VLI,IXQL,LM,NGPT,LMAX,MXXXXL,NIXQL,NQL)
|
|
C
|
|
IF (ITYP.EQ.3) GO TO 4300
|
|
IF (ITYP.EQ.5 .OR. ITYP.EQ.6) GO TO 4500
|
|
C
|
|
C N.B. FOR ITYPE=1,2 LMAX=NQL
|
|
C PWGHT MULTIPLY SL(COS(THETA)) TO GET LEGENDRE COEFFICIENTS
|
|
FACTL=-.5D0
|
|
DO 4100 L=1,LMAX
|
|
IXQL(1,L)=L
|
|
IXQL(2,L)=0
|
|
LM1=L-1
|
|
LM(1,L)=LM1
|
|
FACTL=FACTL+1.D0
|
|
DO 4101 NX=1,NGPT
|
|
C N.B. WE KEEP EVEN AND ODD L FOR HOMONUCLEARS, BUT SET TO 0. IF NEC
|
|
PWGHT(NX,L)=0.D0
|
|
IF (IHOMO.EQ.2 .AND. L-2*(L/2).EQ.0) GO TO 4101
|
|
PWGHT(NX,L)=FACTL*GWT(NX)*XLEG(L-1,COSA(NX))
|
|
4101 CONTINUE
|
|
4100 CONTINUE
|
|
C NEXT COMPUTE VLI
|
|
DO 4200 NX=1,NGPT
|
|
L=0
|
|
DO 4201 IL=1,MXXXXL
|
|
VLI(NX,IL)=XLEG(L,COSA(NX))
|
|
4201 L=L+IHOMO
|
|
4200 CONTINUE
|
|
RETURN
|
|
C
|
|
C ITYPE=3 -- SETUP VLI
|
|
4300 I=0
|
|
IF (LNEW) GO TO 4993
|
|
C>>SG 5/21/92 BELOW IS OLD CODE - BYPASSED FOR LNEW=.TRUE.
|
|
DO 4301 IX1=1,NGP1
|
|
DO 4301 IX2=1,NGP2
|
|
DO 4301 IX3=1,NGM
|
|
C I COUNTS GAUSS POINTS TO NGPT.
|
|
I=I+1
|
|
IL=0
|
|
DO 4301 L1=IZ,L1MAX,IHOMO
|
|
L2TOP=L2MAX
|
|
IF (IDENT.GT.0) L2TOP=L1MAX
|
|
DO 4301 L2=IZ,L2TOP,ICNSYM
|
|
LLO=ABS(L1-L2)
|
|
LHI=L1+L2
|
|
DO 4301 LL=LLO,LHI
|
|
IF (ODD(L1+L2,LL)) GO TO 4301
|
|
C IL COUNTS SYMMETRIES IN POTENTIAL TO L1MAX,L2MAX
|
|
IL=IL+1
|
|
VLI(I,IL)=YRR(L1,L2,LL,COSA(IX1),COSA(IST2+IX2),COSA(IST3+IX3))
|
|
4301 CONTINUE
|
|
PIFACT=2.D0*PI*SFACT
|
|
IL=0
|
|
DO 4302 L1=IZ,LMMAX,IHOMO
|
|
L2TOP=MUMAX
|
|
IF (IDENT.GT.0) L2TOP=L1
|
|
DO 4302 L2=IZ,L2TOP,ICNSYM
|
|
LLO=ABS(L1-L2)
|
|
LHI=L1+L2
|
|
DO 4302 LL=LLO,LHI
|
|
IF (ODD(L1+L2,LL)) GO TO 4302
|
|
XLFACT=1.D0/(2.D0*LL+1.D0)
|
|
IL=IL+1
|
|
IXQL(1,IL)=IL
|
|
IXQL(2,IL)=0
|
|
LM(1,IL)=L1
|
|
LM(2,IL)=L2
|
|
LM(3,IL)=LL
|
|
I=0
|
|
DO 4303 IX1=1,NGP1
|
|
DO 4303 IX2=1,NGP2
|
|
DO 4303 IX3=1,NGM
|
|
I=I+1
|
|
4303 PWGHT(I,IL)=GWT(IX1)*GWT(IST2+IX2)*GWT(IST3+IX3)*
|
|
1 YRR(L1,L2,LL,COSA(IX1),COSA(IST2+IX2),COSA(IST3+IX3))
|
|
2 *PIFACT*XLFACT
|
|
4302 CONTINUE
|
|
GO TO 4998
|
|
C>>SG 5/21/92 ------- END OF OLD CODE
|
|
C
|
|
C NEW CODE 5/21/92 MUCH MORE EFFICIENT. YRR() ASSEMBLED AS NEEDED
|
|
C AVOIDING RECALCULATION OF THRJ, PLM, ETC.
|
|
4993 DEN=SQRT(4.D0*PI)*2.D0*PI
|
|
DO 4310 IL=1,MXXXXL
|
|
DO 4310 IX=1,NGPT
|
|
4310 VLI(IX,IL)=0.D0
|
|
MTOP=MIN0(L1MAX,L2MAX)
|
|
DO 4311 M=IZ,MTOP
|
|
PTM=PARITY3(M)
|
|
XM=M
|
|
DO 4312 IX=1,NGM
|
|
COSM(IX)=COS(XM*COSA(IST3+IX))/DEN
|
|
IF (M.EQ.0) GO TO 4312
|
|
COSM(IX)=COSM(IX)*(2.D0*PTM)
|
|
4312 CONTINUE
|
|
IL=0
|
|
DO 4313 L1=IZ,L1MAX,IHOMO
|
|
IF (L1.LT.M) GO TO 4317
|
|
XL1=L1
|
|
PTL1=PARITY3(L1)
|
|
DO 4314 IX=1,NGP1
|
|
4314 PL1(IX)=PLM(L1,M,COSA(IX))*PTL1
|
|
4317 L2TOP=L2MAX
|
|
IF (IDENT.NE.0) L2TOP=L1MAX
|
|
DO 4313 L2=IZ,L2TOP,ICNSYM
|
|
IF (L2.LT.M) GO TO 4318
|
|
XL2=L2
|
|
PTL2=PARITY3(L2)
|
|
DO 4315 IX=1,NGP2
|
|
4315 PL2(IX)=PLM(L2,M,COSA(IST2+IX))*PTL2
|
|
4318 LLO=ABS(L1-L2)
|
|
LHI=L1+L2
|
|
DO 4313 LL=LLO,LHI
|
|
IF (ODD(L1+L2,LL)) GO TO 4313
|
|
IL=IL+1
|
|
IF (L1.LT.M .OR. L2.LT.M) GO TO 4313
|
|
XL=LL
|
|
TJ=THRJ(XL1,XL2,XL,XM,-XM,0.D0)*(2.D0*XL+1.D0)
|
|
I=0
|
|
DO 4316 IX1=1,NGP1
|
|
DO 4316 IX2=1,NGP2
|
|
DO 4316 IX3=1,NGM
|
|
I=I+1
|
|
4316 VLI(I,IL)=VLI(I,IL)+PL1(IX1)*PL2(IX2)*COSM(IX3)*TJ
|
|
4313 CONTINUE
|
|
4311 CONTINUE
|
|
C
|
|
C NOW SET UP IXQL, LM, AND PWGHT
|
|
C N.B. PIFACT IS CONSISTENT WITH AGG & CLARY, EQS. (19)-(20)
|
|
C AND W/ GOLDFLAM & KOURI, EQS. (68), (69), (89), (121).
|
|
C I.E. T(ANGLES)=(4*PI)*SUM(L1,L2,L) T(L1,L2,L)*YRR(L1,L2,L/ANGLES)
|
|
C NEW CODE 5/21/92 MUCH MORE EFFICIENT; CALC YRR() LOCALLY
|
|
PIFACT=2.D0*PI*SFACT
|
|
DO 4320 IL=1,LMAX
|
|
DO 4320 IX=1,NGPT
|
|
4320 PWGHT(IX,IL)=0.D0
|
|
MTOP=MIN0(LMMAX,MUMAX)
|
|
IF (IDENT.GT.0) MTOP=LMMAX
|
|
DO 4321 M=0,MTOP
|
|
PTM=PARITY3(M)
|
|
XM=M
|
|
DO 4322 IX=1,NGM
|
|
COSM(IX)=COS(XM*COSA(IST3+IX))/DEN
|
|
IF (M.EQ.0) GO TO 4322
|
|
COSM(IX)=COSM(IX)*(2.D0*PTM)
|
|
4322 CONTINUE
|
|
IL=0
|
|
DO 4323 L1=IZ,LMMAX,IHOMO
|
|
IF (L1.LT.M) GO TO 4324
|
|
XL1=L1
|
|
PTL1=PARITY3(L1)
|
|
DO 4325 IX=1,NGP1
|
|
4325 PL1(IX)=PLM(L1,M,COSA(IX))*PTL1
|
|
4324 L2TOP=MUMAX
|
|
IF (IDENT.GT.0) L2TOP=L1
|
|
DO 4323 L2=IZ,L2TOP,ICNSYM
|
|
IF (L2.LT.M) GO TO 4326
|
|
XL2=L2
|
|
PTL2=PARITY3(L2)
|
|
DO 4327 IX=1,NGP2
|
|
4327 PL2(IX)=PLM(L2,M,COSA(IST2+IX))*PTL2
|
|
4326 LLO=ABS(L1-L2)
|
|
LHI=L1+L2
|
|
DO 4323 LL=LLO,LHI
|
|
IF (ODD(L1+L2,LL)) GO TO 4323
|
|
IL=IL+1
|
|
C STORE IXQL, LM ONLY FOR M=0 PASS ONLY.
|
|
IF (M.GT.0) GO TO 4328
|
|
IXQL(1,IL)=IL
|
|
IXQL(2,IL)=0
|
|
LM(1,IL)=L1
|
|
LM(2,IL)=L2
|
|
LM(3,IL)=LL
|
|
4328 IF (L1.LT.M .OR. L2.LT.M) GO TO 4323
|
|
XL=LL
|
|
C TJ=THRJ(XL1,XL2,XL,XM,-XM,0.D0)*PIFACT/(2.D0*XL+1.D0)
|
|
C 2*L+1 FACTOR CANCELS THAT IN DEF OF YRR ???
|
|
TJ=THRJ(XL1,XL2,XL,XM,-XM,0.D0)*PIFACT
|
|
I=0
|
|
DO 4329 IX1=1,NGP1
|
|
DO 4329 IX2=1,NGP2
|
|
DO 4329 IX3=1,NGM
|
|
I=I+1
|
|
4329 PWGHT(I,IL)=PWGHT(I,IL)+PL1(IX1)*PL2(IX2)*COSM(IX3)*TJ
|
|
4323 CONTINUE
|
|
4321 CONTINUE
|
|
C END OF M-LOOP - PWGHT NOW CONTAINS YRR; NEED TO MULT BY GAUSS WTS
|
|
I=0
|
|
DO 4330 IX1=1,NGP1
|
|
DO 4330 IX2=1,NGP2
|
|
DO 4330 IX3=1,NGM
|
|
I=I+1
|
|
WTFACT=GWT(IX1)*GWT(IST2+IX2)*GWT(IST3+IX3)
|
|
DO 4330 IL=1,LMAX
|
|
4330 PWGHT(I,IL)=PWGHT(I,IL)*WTFACT
|
|
C
|
|
4998 WRITE(6,659) (I,LM(1,I),LM(2,I),LM(3,I),I=1,LMAX)
|
|
659 FORMAT('0 BI-SPHERICAL HARMONICS FOR EXPANDING S-MATRIX ARE ',
|
|
1'AS FOLLOWS'/'0 INDX L1 L2 LL'/(' ',4I4))
|
|
RETURN
|
|
C
|
|
C ITYPE=5,6 -- COMPUTE VLI
|
|
4500 I=0
|
|
DO 4501 NX=1,NGL
|
|
DO 4501 IX=1,NGM
|
|
I=I+1
|
|
IL=0
|
|
DO 4501 L=IZ,LMBDMX
|
|
MTOP=MIN0(MUMX,L)
|
|
DO 4501 M=IZ,MTOP,ICNSYM
|
|
IF (IHOMO.EQ.2 .AND. ODD(L,M)) GO TO 4501
|
|
IL=IL+1
|
|
VLI(I,IL)=PLM(L,M,COSA(NX))/SQRT(2.D0*PI)
|
|
IF (M.NE.0) VLI(I,IL)=VLI(I,IL)*2.D0*COS(DBLE(M)*COSA(NGL+IX))
|
|
4501 CONTINUE
|
|
C SETUP PWGHT
|
|
FACTL=1.D0/SQRT(2.D0*PI)
|
|
IL=0
|
|
DO 4502 L=IZ,LMMAX
|
|
MTOP=MIN0(L,MUMAX)
|
|
DO 4502 M=IZ,MTOP,ICNSYM
|
|
IF (IHOMO.EQ.2 .AND.ODD(L,M)) GO TO 4502
|
|
IL=IL+1
|
|
IV=0
|
|
DO 4503 IX=1,NGL
|
|
DO 4503 NX=1,NGM
|
|
IV=IV+1
|
|
4503 PWGHT(IV,IL)=GWT(IX)*GWT(NGL+NX)*PLM(L,M,COSA(IX))*
|
|
& COS(DBLE(M)*COSA(NGL+NX))*
|
|
2 (SFACT*FACTL)
|
|
4502 CONTINUE
|
|
I=0
|
|
IX=0
|
|
DO 4505 L=IZ,LMMAX
|
|
MTOP=MIN0(MUMAX,L)
|
|
DO 4505 M=IZ,MTOP,ICNSYM
|
|
IF (IHOMO.EQ.2 .AND. ODD(L,M)) GO TO 4505
|
|
I=I+1
|
|
LM(1,I)=L
|
|
LM(2,I)=M
|
|
DO 4504 IL=1,I
|
|
IF (LM(1,IL).NE.L) GO TO 4504
|
|
IX=IX+1
|
|
IXQL(1,IX)=I
|
|
IXQL(2,IX)=IL
|
|
IF (I.NE.IL) GO TO 4506
|
|
IXQL(3,IX)=0
|
|
GO TO 4504
|
|
4506 IXQL(3,IX)=1
|
|
IX=IX+1
|
|
IXQL(1,IX)=I
|
|
IXQL(2,IX)=IL
|
|
IXQL(3,IX)=2
|
|
4504 CONTINUE
|
|
4505 CONTINUE
|
|
WRITE(6,657) (I,LM(1,I),LM(2,I),I=1,LMAX)
|
|
657 FORMAT('0 SPHERICAL HARMONIC SYMMETRIES FOR EXPANDING S-MATRIX ',
|
|
1 'ARE AS FOLLOWS'/'0 INDX L M'/(' ',2I4,I3))
|
|
WRITE(6,649)
|
|
649 FORMAT('0 BELOW ARE INDICES TO SYMMETRIES IN QLT'/
|
|
&'0 IN QLT LM1 L M LM2 L M CODE')
|
|
DO 4507 I=1,NQL
|
|
IL=IXQL(1,I)
|
|
IX=IXQL(2,I)
|
|
4507 WRITE(6,648) I,IL,LM(1,IL),LM(2,IL),IX,LM(1,IX),LM(2,IX),IXQL(3,I)
|
|
648 FORMAT(' ',I7,I6,2I3,I6,2I3,I6)
|
|
RETURN
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY IOSB2(JTOT,LORB,JJJ,NB,CENT,EINT,CINT,WVEC,VL,IVIX,IP,
|
|
& NVC,ERED,NPOTL,MXLAM,LAM,VLI,NGPT,MXXXXL)
|
|
C
|
|
XJ=JTOT
|
|
XJ=XJ*(XJ+1.D0)
|
|
DO 6666 I=1,NVC
|
|
LORB(I)=JTOT
|
|
JJJ(I)=I
|
|
NB(I)=I
|
|
CENT(I)=XJ
|
|
EINT(I)=CINT*EV(I)
|
|
DIF=ERED-EINT(I)
|
|
WVEC(I)=SQRT(ABS(DIF))
|
|
IF (DIF.GE.0.D0) GO TO 6666
|
|
WVEC(I)=-WVEC(I)
|
|
6666 CONTINUE
|
|
C
|
|
GO TO IGOTP,(6100,6200,6300,6500)
|
|
C
|
|
C CHECK FOR CONSISTENT IVLFL
|
|
6100 IF (IVLFL.NE.0) GO TO 9999
|
|
DO 6101 I=1,MXLAM
|
|
IL=LAM(I)/IHOMO + 1
|
|
C IVIX(I)=I
|
|
6101 VL(I)=VLI(IP,IL)
|
|
C SET COSANG, FACTOR FOR MXLAM.LE.0 CASE
|
|
COSANG(1)=COSA(IP)
|
|
FACTOR=1.D0
|
|
GO TO 6900
|
|
C
|
|
C>>SG -------------- NEW CODE --------------------->>
|
|
C>>SG CHECK FOR NPOTL=1 (LVRTP) OR NPOTL=MXLAM (EXPANDED)
|
|
C>>SG LATTER CASE UNCHANGED FROM VERSION 10 CODE
|
|
C>>SG JAN 94: *ALL* ITYPE=2 NOW HAVE IVLFL=1; NPOTL.LE.MXLAM
|
|
6200 IF (IVLFL.LE.0) GO TO 9999
|
|
C ZERO IVIX,VL STORAGE
|
|
ITOP=NVC*(NVC+1)*NPOTL/2
|
|
DO 6202 IX=1,ITOP
|
|
IVIX(IX)=0
|
|
6202 VL(IX)=0.D0
|
|
IF (.NOT.LVRTP ) GO TO 6250
|
|
C
|
|
C UNEXPANDED 'LVRTP' POTENTIAL (BELOW HAS A LOT OF 'DEBUGGING' TEST)
|
|
IF (NPOTL.NE.1) THEN
|
|
WRITE(6,670) NPOTL,MXLAM
|
|
670 FORMAT('0 IOSB2 (FEB 92) -- ERROR. LVRTP INCONSISTENT WITH',
|
|
1 ' NPOTL, MXLAM',2I6)
|
|
STOP
|
|
ENDIF
|
|
DO 6203 L=1,MXLAM
|
|
LLL=LAM(3*L-2)
|
|
IL=LLL/IHOMO+1
|
|
C N.B. WE SHOULD HAVE LLL=0 AND IL=1 *** DEBUGGING ONLY ***
|
|
IF (LLL.NE.0 .OR. IL.NE.1) WRITE(6,672) LLL,IL
|
|
672 FORMAT('0 IOSB2 (FEB 92) -- ERROR. LLL.NE.0 .OR IL.NE.1',2I6)
|
|
IV=LAM(3*L-1)
|
|
IVP=LAM(3*L)
|
|
IVVP=0
|
|
DO 6204 IROW=1,NVC
|
|
NV=LEVV(IROW)
|
|
DO 6204 ICOL=1,IROW
|
|
NVP=LEVV(ICOL)
|
|
IVVP=IVVP+1
|
|
IF (.NOT.((NV.EQ.IV.AND.NVP.EQ.IVP).OR.(NV.EQ.IVP.AND.NVP.EQ.IV)))
|
|
1 GO TO 6204
|
|
C IF WE REACH BELOW, THIS ROW/COL CORRESPONDS TO CURRENT 'SYMMETRY'
|
|
IX=(IVVP-1)*NPOTL+LLL+1
|
|
C SINCE NPOTL=1 AND LLL=0, SHOULD HAVE IX=IVVP *** DEBUGGING ***
|
|
IF (IX.NE.IVVP) WRITE(6,673) IX,IVVP
|
|
673 FORMAT('0 IOSB2 (FEB 92) -- ERROR. IX.NE.IVVP FOR VL,IVIX',2I6)
|
|
IVIX(IX)=L
|
|
VL(IX)=VLI(IP,IL)
|
|
6204 CONTINUE
|
|
6203 CONTINUE
|
|
C SET COSANG, FACTOR FOR VRTP CASE, AND RETURN
|
|
COSANG(1)=COSA(IP)
|
|
FACTOR=1.D0
|
|
GO TO 6900
|
|
C
|
|
C CODE BELOW FOR POTENTIAL EXPANDED IN LEGENDRE POLY'S
|
|
C MODIFIED TO USE IV() INDEXING
|
|
C
|
|
6250 IF (MXXXXL.GT.NPOTL) THEN
|
|
WRITE(6,*) ' IOSB2. MXXXXL.GT.NPOTL NOT ALLOWED',MXXXXL,NPOTL
|
|
STOP
|
|
ENDIF
|
|
DO 6251 L=1,MXLAM
|
|
IL=LAM(3*L-2)/IHOMO + 1
|
|
C DEBUGGING ...
|
|
IF (IL.GT.MXXXXL) THEN
|
|
WRITE(6,*) ' IOSB2. IL.GT.MXXXXL SHOULD NOT OCCUR',IL,MXXXXL
|
|
ENDIF
|
|
LV1=LAM(3*L-1)
|
|
LV2=LAM(3*L)
|
|
IVVP=0
|
|
DO 6252 IV=1,NVC
|
|
DO 6252 IVP=1,IV
|
|
IVVP=IVVP+1
|
|
IF (LEVV(IV).EQ.LV1 .AND. LEVV(IVP).EQ.LV2) GO TO 6253
|
|
IF (LEVV(IV).EQ.LV2 .AND. LEVV(IVP).EQ.LV1) GO TO 6253
|
|
GO TO 6252
|
|
6253 IX=(IVVP-1)*NPOTL+IL
|
|
IVIX(IX)=L
|
|
VL(IX)=VLI(IP,IL)
|
|
6252 CONTINUE
|
|
6251 CONTINUE
|
|
GO TO 6900
|
|
C
|
|
C CHECK FOR CONSISTENT IVLFL
|
|
6300 IF (IVLFL.NE.0) GO TO 9999
|
|
IL=0
|
|
DO 6301 L1=IZ,L1MAX,IHOMO
|
|
L2TOP=L2MAX
|
|
IF (IDENT.GT.0) L2TOP=L1MAX
|
|
DO 6301 L2=IZ,L2TOP,ICNSYM
|
|
LLO=ABS(L1-L2)
|
|
LHI=L1+L2
|
|
DO 6301 LL=LLO,LHI
|
|
IF (ODD(L1+L2,LL)) GO TO 6301
|
|
IL=IL+1
|
|
DO 6302 I=1,MXLAM
|
|
IF (L1.NE.LAM(3*I-2)) GO TO 6302
|
|
IF (L2.NE.LAM(3*I-1)) GO TO 6302
|
|
IF (LL.NE.LAM(3*I )) GO TO 6302
|
|
C IVIX(I)=I
|
|
VL(I)=VLI(IP,IL)
|
|
IF (LDEBUG) WRITE(6,635) I,L1,L2,LL,IL
|
|
635 FORMAT(' IOSB2. DEBUG. I,L1,L2,LL,IL',5I5)
|
|
6302 CONTINUE
|
|
6301 CONTINUE
|
|
C FOR 'VRTP' CASE NEED TO SET COSANG(), FACTOR =(4*PI)**(3/2)
|
|
FACTOR=(4.D0*PI)*SQRT(4.D0*PI)
|
|
C CALCULATE IX1,IX2,IX3 FROM IP (# OF GAUSS POINT)
|
|
IX3=IP
|
|
IX1=(IX3-1)/(NGP2*NGM)+1
|
|
IX3=IX3-(IX1-1)*(NGP2*NGM)
|
|
IX2=(IX3-1)/NGM+1
|
|
IX3=IX3-(IX2-1)*NGM
|
|
COSANG(1)=COSA(IX1)
|
|
COSANG(2)=COSA(IST2+IX2)
|
|
COSANG(3)=COSA(IST3+IX3)
|
|
GO TO 6900
|
|
C<<SG --------------------------------------- END OF MODIFICATIONS
|
|
C
|
|
C CHECK FOR CONSISTENT IVLFL
|
|
6500 IF (IVLFL.NE.0) GO TO 9999
|
|
IL=0
|
|
DO 6501 L=IZ,LMBDMX
|
|
MTOP=MIN0(MUMX,L)
|
|
DO 6501 M=IZ,MTOP,ICNSYM
|
|
IF (IHOMO.EQ.2 .AND. ODD(L,M)) GO TO 6501
|
|
IL=IL+1
|
|
DO 6502 I=1,MXLAM
|
|
IF (L.NE.LAM(2*I-1) .OR. M.NE.LAM(2*I) ) GO TO 6502
|
|
C IVIX(I)=I
|
|
VL(I)=VLI(IP,IL)
|
|
6502 CONTINUE
|
|
6501 CONTINUE
|
|
C FOR MXLAM.LE.0 CASE, SET COSANG, FACTOR (SQRT(4*PI) FOR ITYPE=5,6)
|
|
IL=(IP-1)/NGM
|
|
IJ=IP-NGM*IL
|
|
IL=IL+1
|
|
COSANG(1)=COSA(IL)
|
|
COSANG(2)=COSA(NGL+IJ)
|
|
FACTOR=SQRT(4.D0*PI)
|
|
C FACTOR=3.544907703D0
|
|
GO TO 6900
|
|
C
|
|
C COMMON RETURN PT -- ALLOW FOR (DEBUGGING) OUTPUT OF COUPLING MATRIX
|
|
6900 IF (LDEBUG) CALL CPLOUT(IVIX,VL,NVC,NPOTL)
|
|
RETURN
|
|
C
|
|
9999 WRITE(6,690) IVLFL,ITYP
|
|
690 FORMAT(/' IOSBIN (JAN 93). IVLFL=',I5,
|
|
1 ' INCONSISTENT WITH ITYP=',I5)
|
|
STOP
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY IXQLF(LM,LMAX,LX,M1,M2,ICDE,INDX,IXQL,NIXQL,NQL)
|
|
C
|
|
C N.B. M1.GE.M2 AND M1,M2.GE.0 ARE **ASSUMED** HERE
|
|
C IT IS POSSIBLE TO IMPLEMENT A MORE GENERAL CODE
|
|
C N.B. THIS SHOULD ONLY BE CALLED FOR ITYPE=5,6 / NOT CHECKED HERE
|
|
C RETURN INDX=-1 IF L, M1, OR M2 ARE SYMMETRY FORBIDDEN.
|
|
IF (M1-ICNSYM*(M1/ICNSYM).NE.0) GO TO 7002
|
|
IF (M2-ICNSYM*(M2/ICNSYM).NE.0) GO TO 7002
|
|
C IF (LX-IHOMO*(LX/IHOMO).NE.0) GO TO 7002 <KILLED FEB 88>
|
|
IF (IHOMO.EQ.2 .AND. ODD(LX,M1)) GO TO 7002
|
|
IF (IHOMO.EQ.2 .AND. ODD(LX,M2)) GO TO 7002
|
|
ICODE=ICDE
|
|
IF (M1.EQ.M2) ICODE=0
|
|
INDX=0
|
|
DO 7001 I=1,NQL
|
|
IF (LX.NE.LM(1,IXQL(1,I))) GO TO 7001
|
|
IF (M1.NE.LM(2,IXQL(1,I))) GO TO 7001
|
|
IF (M2.NE.LM(2,IXQL(2,I))) GO TO 7001
|
|
IF (ICODE.NE.IXQL(3,I)) GO TO 7001
|
|
INDX=I
|
|
RETURN
|
|
7001 CONTINUE
|
|
RETURN
|
|
7002 INDX=-1
|
|
RETURN
|
|
C
|
|
END
|
|
SUBROUTINE IOSCLC(NNRG,ENERGY,JTOTL,JTOTU,JSTEP,INTFLG,PRINT,ISU,
|
|
1 ITYPX,RMIN,RMAX,DEEP,IRMSET,IRXSET,RVFAC,NUMDER,
|
|
2 NCAC,TEST,RM,EPSIL,NVC,LMAX,NGPT,NQL,NIXQL,
|
|
3 MXXXXL,LAMBDA,MXLAM,NPOTL,VLI,
|
|
4 PWGHT,SLR,SLI,QLT,QLS,
|
|
5 SLLR,SLLI,IXQL,SIGTH,SIGAV,IEC,LM,
|
|
6 IXSR,IXSI,IXKMAT,IXVL,IXIV,IXEINT,IXCENT,
|
|
7 IXWV,IXJJJ,IXLORB,IXNB,WVEC,NB,
|
|
8 IFLS,MXLN,LINE,LTYPE)
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C>>SG MODIFIED MAY 92 - ITYPE=3 / ADD JSTEP TO IOSOUT PARMS / ISAVEU
|
|
C>>SG MODIFIED FEB 92 FOR SOME CLOSED-CHANNEL HANDLING
|
|
C *** 14 JULY 86 FIX ISCRU BUG
|
|
INTEGER PRINT
|
|
LOGICAL NUMDER
|
|
DIMENSION ENERGY(NNRG),TEST(2),LAMBDA(MXLAM)
|
|
DIMENSION WVEC(NVC),NB(NVC)
|
|
DIMENSION PWGHT(NGPT,LMAX),SLR(NVC,NVC,NGPT),SLI(NVC,NVC,NGPT),
|
|
& QLS(NVC,NVC),QLT(NVC,NVC,NQL),SIGTH(NVC,NVC,NGPT),
|
|
& SIGAV(NVC,NVC),SLLR(NVC,NVC,LMAX),SLLI(NVC,NVC,LMAX),
|
|
& VLI(NGPT,MXXXXL)
|
|
DIMENSION IEC(NQL),IXQL(NIXQL,NQL),LM(3,LMAX)
|
|
DIMENSION LINE(2,MXLN),LTYPE(MXLN)
|
|
C
|
|
C N.B. SREAL,SIMAG ARE DIM (NVC,NVC), BUT SCATTERING ROUTINE
|
|
C REDUCES THIS TO (NOPEN,NOPEN). HANDLED HERE AS 1-D VECTOR.
|
|
C MOST OF 'SCATTERING' VARIABLES ARE PASSED HERE AS ADDR. IN X().
|
|
C BUT WVEC AND NB ARE ALSO PASSED AS VECTORS FOR CONVENIENCE.
|
|
C N.B. V IS CORRECTION FOR 'VOLUME' IN ANGULAR INTEGRAL
|
|
C FOR ITYPE=1,2 V=1.
|
|
C FOR ITYPE=3,5,6 V=1/(4*PI)
|
|
C CALCULATION OF QLS(0) AND SIGAV DEPENDS ON FACT THAT 1ST SYMMETRY
|
|
C IN PWGHT IS SPHERICAL, CORRECTED BY V.
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C COMMON BLOCK FOR COMMUNICATING WITH COUPLED EQUATION SOLVERS
|
|
C *** IT APPEARS THAT ONLY 'NOPEN' IS NEEDED IN FOLLOWING BLOCK
|
|
COMMON/DRIVE/STEST,STEPS,STABIL,CONV,RSTART,RSTOP,XEPS,
|
|
1 DR,DRMAX,RMID,TOLHI,RTURN,VTOL,ESHIFT,ERED,RMLMDA,
|
|
2 NOPEN,JKEEP,ISCRU,MAXSTP
|
|
C
|
|
CHARACTER*4 LEFT
|
|
DATA LEFT/'SIG('/
|
|
C
|
|
C INITIALIZE VARIOUS PARAMETERS
|
|
PI=ACOS(-1.D0)
|
|
NUSED=0
|
|
ITYPE=ITYPX-10*(ITYPX/10)
|
|
C NOPEN MUST BE SET INITIALLY TO HANDLE 'NVC' COUNTING
|
|
NOPEN=1
|
|
C SET ICX TO NEXT LOCATION (HAD BEEN ARGUMENT IC IN V11)
|
|
ICX=IXNEXT
|
|
C V IS A (NORMALIZATION) FACTOR FOR CALCULATING QLT() FROM S*S
|
|
C AVGFCT FOR SPHERICAL AVG IN TERMS OF LOWEST SYMMETRY PWGHT
|
|
C>>SG N.B. ITYPE=3 VALUES DIFFER FROM GOLDFLAM-KOURI AND AGG-CLARY
|
|
C ITYPE V AVGFCT
|
|
C 1,2 1. 1.
|
|
C 3 1/4*PI 1./SQRT(4*PI)
|
|
C 5,6 1/4*PI 1./SQRT(4*PI)
|
|
V=1.D0
|
|
IF (ITYPE.EQ.5.OR.ITYPE.EQ.6.OR.ITYPE.EQ.3) V=1.D0/(4.D0*PI)
|
|
AVGFCT=SQRT(V)
|
|
CINT=RMLMDA/EPSIL
|
|
C INITIALIZE RSTART, IN CASE IRMSET.LE.0 AND FINDRM NOT CALLED
|
|
RMINSV=RMIN
|
|
RSTART=RMIN
|
|
CALL GCLOCK (TITIME)
|
|
C
|
|
C PRINT LEVEL FOR SCATTERING CAN BE LESS THAN FOR IOS1
|
|
C
|
|
IOSPR=MAX0(0,PRINT-10)
|
|
C
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
C LOOP OVER ENERGIES.
|
|
C
|
|
DO 2000 IE=1,NNRG
|
|
ICODE=1
|
|
IF(IE.GT.1 .AND. ISCRU.GT.0) ICODE=2
|
|
IF(ISCRU.GT.0) REWIND ISCRU
|
|
WRITE(6,622) IE,ENERGY(IE)
|
|
622 FORMAT('1 IOSCLC (MAY 92). ENERGY(',I3,') =',F12.4,' (1/CM).')
|
|
ERED=ENERGY(IE)*CINT
|
|
IF (IE.EQ.1) EFIRST=ERED
|
|
ESHIFT=ERED-EFIRST
|
|
C A MORE SOPHISTICATED WAY OF SAVING RTURN IS PROBABLY WANTED,
|
|
C BUT BELOW SHOULD WORK AS A TEMPORARY MEASURE
|
|
RTURN=RMINSV
|
|
C ZERO STORAGE
|
|
DO 2100 I=1,NQL
|
|
2100 IEC(I)=0
|
|
DO 2109 IV=1,NVC
|
|
DO 2109 IVP=1,NVC
|
|
QLS(IV,IVP)=0.D0
|
|
SIGAV(IV,IVP)=0.D0
|
|
DO 2101 I=1,NQL
|
|
2101 QLT(IV,IVP,I)=0.D0
|
|
DO 2102 I=1,NGPT
|
|
2102 SIGTH(IV,IVP,I)=0.D0
|
|
2109 CONTINUE
|
|
C
|
|
C LOOP OVER PARTIAL WAVES
|
|
C
|
|
DO 3000 JTOT=JTOTL,JTOTU,JSTEP
|
|
IF (PRINT.GT.1) WRITE(6,626) JTOT,IE,ENERGY(IE)
|
|
626 FORMAT('0 ***** PARTIAL WAVE =',I5,' FOR ENERGY(',I3,') = ',
|
|
& F12.4,' *****')
|
|
C
|
|
IF (JTOTU.LT.999999) GO TO 3001
|
|
C CHECK FOR CONVERGENCE
|
|
C ONLY CHECK FOR QLT WHERE IXQL(NIXQL,IL).EQ.0
|
|
DO 3002 IL=1,LMAX
|
|
IF (IXQL(NIXQL,IL).NE.0) GO TO 3002
|
|
IF (IEC(IL).LT.NCAC) GO TO 3001
|
|
3002 CONTINUE
|
|
CALL GCLOCK(TJTIME)
|
|
TIME=TJTIME-TITIME
|
|
TITIME=TJTIME
|
|
JTO=JTOT-JSTEP
|
|
WRITE(6,620) IE,ENERGY(IE),LMAX,NCAC,TEST,JTOTL,JSTEP,JTO
|
|
620 FORMAT('1 ***** ***** ***** CALCULATION AT ENERGY(',I3,') =',
|
|
1 F10.2,' (1/CM) ',
|
|
& ' TERMINATED DUE TO CONVERGENCE FOR',I4,' Q(L).'/
|
|
& 22X,'NCAC, TEST =',I4,2E12.4/
|
|
2 22X,'PARTIAL WAVES',I4,' (',I4,' ) ',I5)
|
|
WRITE(6,641) TIME
|
|
641 FORMAT('0 ***** ***** ***** TIME WAS',F9.2,' SEC.'/' ')
|
|
GO TO 3009
|
|
3001 FACTL=(2*JTOT+1)*PI
|
|
C
|
|
C GET ANGLE-DEPENDENT SCATTERING / LOOP OVER GAUSS POINTS.
|
|
DO 3100 IP=1,NGPT
|
|
C
|
|
C INITIALIZE SCAT VARIABLES VL, LORB, EINT, ETC.
|
|
CALL IOSB2(JTOT,X(IXLORB),X(IXJJJ),NB,X(IXCENT),X(IXEINT),CINT,
|
|
1 WVEC,X(IXVL),X(IXIV),IP,NVC,ERED,NPOTL,MXLAM,LAMBDA,VLI,
|
|
2 NGPT,MXXXXL)
|
|
C
|
|
CONV=0.D0
|
|
RTURN=RSTART
|
|
IF(ICODE.NE.1) GOTO 3005
|
|
CALL FINDRX(ENERGY(IE),X(IXEINT),X(IXCENT),1,NVC,CINT,RMAX,RSTOP,
|
|
1 NOPMAX,IRXSET,IOSPR)
|
|
C
|
|
IF(IRMSET.LE.0) GOTO 3005
|
|
C GET TEMPORARY STORAGE FOR FINDRM; MODIFED 23 AUG FOR NEW FINDRM (SG)
|
|
IT1=ICX
|
|
IT2=IT1+MXLAM
|
|
IT3=IT2+NVC
|
|
IT4=IT3+NVC
|
|
IXNEXT=IT4+NVC
|
|
CALL CHKSTR(NUSED)
|
|
CALL FINDRM(X(IXSR),NVC,RSTART,RTURN,IK,X(IT1),X(IXVL),X(IXIV),
|
|
1 ERED,X(IXEINT),X(IXCENT),RMLMDA,X(IXSI),X(IT2),X(IT3),X(IT4),
|
|
2 MXLAM,NPOTL,IRMSET,ITYPE,IOSPR)
|
|
C RELEASE TEMPORARY STORAGE
|
|
IXNEXT=IT1
|
|
IF(RVFAC.EQ.0.D0) GOTO 3005
|
|
RMID=RVFAC*RTURN
|
|
IF(IOSPR.GE.3) WRITE(6,3003) RMID,RVFAC
|
|
3003 FORMAT('0 RMID =',F7.2,' OBTAINED FROM RVFAC =',F6.3)
|
|
C
|
|
C NOW READY TO SOLVE 'COUPLED' EQUATIONS; DONE AS CALL TO STORAG.
|
|
C
|
|
3005 NV=NPOTL*NVC*(NVC+1)/2
|
|
CALL STORAG( INTFLG,NVC,MXLAM,NV,NPOTL,
|
|
1 IXJJJ,IXSR,IXSI,IXKMAT,IXVL,IXIV,IXEINT,IXCENT,
|
|
2 IXWV,IXLORB,IXNB,
|
|
3 ESHIFT,NOPMAX,DEEP,IK,ICODE,IOSPR, NUMDER)
|
|
C
|
|
C INITIALIZE TO UNIT S-MATRIX TO CLEAR 'NON-CLASSICAL' CHANNELS.
|
|
C
|
|
4000 DO 4005 IV=1,NVC
|
|
DO 4005 IVC=1,NVC
|
|
DELVVP=0.D0
|
|
IF (IV.EQ.IVC) DELVVP=1.D0
|
|
SLR(IV,IVC,IP)=DELVVP
|
|
4005 SLI(IV,IVC,IP)=0.D0
|
|
IF (NOPEN.GT.0) GO TO 4009
|
|
WRITE(6,699) IP,NOPEN
|
|
699 FORMAT(' * * * NOTE. FOR ORIENTATION',I6,' NOPEN =',I3)
|
|
GO TO 3100
|
|
4009 IF (NOPEN.LE.NVC) GO TO 4008
|
|
WRITE(6,698) IP,NOPEN,NVC
|
|
698 FORMAT(' * * * ERROR. FOR ORIENTATION',I6,' NOPEN.GT.NVC',2I6)
|
|
GO TO 3100
|
|
4008 IF (CONV.GE.0.D0) GO TO 4007
|
|
WRITE(6,696) JTOT,IP
|
|
696 FORMAT('0 * * * WARNING. SLR,SLI,SIGTH NOT SET DUE TO LACK OF CON
|
|
&VERGENCE FOR PART. WAVE',I4,' ORIENTATION',I5)
|
|
GO TO 3100
|
|
C
|
|
4007 IF (PRINT.GE.15) WRITE(6,601)
|
|
601 FORMAT(' ')
|
|
NNP=0
|
|
DO 4200 N=1,NOPEN
|
|
IV=NB(N)
|
|
WV=RM/WVEC(IV)
|
|
C SET WVEC(IV) TO WAVENUMBER IN 1/ANGSTROMS FOR ISAVEU OUTPUT
|
|
WVEC(IV)=1.D0/WV
|
|
WV=WV*WV*FACTL
|
|
DO 4200 NP=1,NOPEN
|
|
IVP=NB(NP)
|
|
NNP=NNP+1
|
|
DELVVP=0.D0
|
|
IF (IV.EQ.IVP) DELVVP=1.D0
|
|
C BELOW CHANGED APR 86 SINCE ONLY INDICES FOR SREAL,SIMAG ARE HERE
|
|
SLR(IV,IVP,IP)=X(IXSR-1+NNP)
|
|
SLI(IV,IVP,IP)=X(IXSI-1+NNP)
|
|
C ACCUMULATE ANGLE-DEPENDENT TOTAL CROSS SECTION.
|
|
ADD=DELVVP-SLR(IV,IVP,IP)
|
|
ADD=(ADD*ADD+SLI(IV,IVP,IP)*SLI(IV,IVP,IP) )*WV
|
|
SIGTH(IV,IVP,IP)=SIGTH(IV,IVP,IP)+ADD
|
|
IF (PRINT.LT.15) GO TO 4200
|
|
WRITE(6,627) IP,IV,IVP,SLR(IV,IVP,IP),SLI(IV,IVP,IP),
|
|
& ADD,SIGTH(IV,IVP,IP)
|
|
627 FORMAT(' FOR ORIENTATION',I6,' VIB LEVEL =',I2,' TO',I2,
|
|
& ', SREAL, SIMAG =',2D14.6,' SIGTH ADD',D12.4,' = ',D12.4)
|
|
4200 CONTINUE
|
|
3100 CONTINUE
|
|
C END OF LOOP OVER ORIENTATIONS
|
|
C
|
|
C INTEGRATE OVER ORIENTATIONS TO GET SLLR/SLLI
|
|
C ** N.B. THESE ARE T-MATRIX COMPONENTS **
|
|
IF (PRINT.GE.20) WRITE(6,601)
|
|
DO 3218 IV=1,NVC
|
|
DO 3218 IVP=1,NVC
|
|
DELVVP=0.D0
|
|
IF (IV.EQ.IVP) DELVVP=1.D0
|
|
DO 3218 L=1,LMAX
|
|
SLLI(IV,IVP,L)=0.D0
|
|
SLLR(IV,IVP,L)=0.D0
|
|
DO 3208 NX=1,NGPT
|
|
SLLR(IV,IVP,L)=SLLR(IV,IVP,L)+(DELVVP-SLR(IV,IVP,NX))*PWGHT(NX,L)
|
|
3208 SLLI(IV,IVP,L)=SLLI(IV,IVP,L)-SLI(IV,IVP,NX)*PWGHT(NX,L)
|
|
IF (PRINT.GE.20)
|
|
& WRITE(6,648) IV,IVP,L,SLLR(IV,IVP,L),SLLI(IV,IVP,L)
|
|
648 FORMAT(5X,3I5, 2D16.8)
|
|
3218 CONTINUE
|
|
C
|
|
C ***
|
|
C>>SG MAY 92. CODE BELOW REPLACED BY CALL ISUTP AT STATEMENT NO. 3000
|
|
C SAVE SLLR/SLLI HRE / N.B. SLR/SLI MIGHT BE USEFUL LATER.
|
|
C IF (ISU.LE.0) GO TO 3230
|
|
C WRITE(ISU,3231) JTOT,IE,ENERGY(IE)
|
|
C3231 FORMAT(2I4,E16.8)
|
|
C WRITE(ISU,3232) NOPEN,(NB(I),JTOT,WVEC(NB(I)),I=1,NOPEN)
|
|
C3232 FORMAT(I4/(2I4,E16.8))
|
|
C WRITE(ISU,3233) (((SLLR(NB(IV),NB(IVP),L),IV=1,NOPEN),IVP=1,NOPEN)
|
|
C & ,L=1,LMAX)
|
|
C WRITE(ISU,3233) (((SLLI(NB(IV),NB(IVP),L),IV=1,NOPEN),IVP=1,NOPEN)
|
|
C & ,L=1,LMAX)
|
|
C3233 FORMAT(5E16.8)
|
|
C ***
|
|
C
|
|
C COMPUTE QLS (QLOLD PREVIOUSLY) FOR 1ST (TOTALLY SYMMETRIC) CASE
|
|
3230 IF (PRINT.GE.10) WRITE(6,601)
|
|
DO 3220 IV=1,NVC
|
|
C SET WVEC(IV) TO (2*L+1)*PI/K**2 FOR USE IN GETTING QL'S
|
|
C>>SG TRAP CLOSED CHANNELS (NEGATIVE WVEC) TO PREVENT ROUND-OFF PROBLEMS
|
|
IF (WVEC(IV).LE.0.) GO TO 3220
|
|
WVEC(IV)=FACTL/(WVEC(IV)*WVEC(IV))
|
|
DO 3219 IVP=1,NVC
|
|
DELVVP=0.D0
|
|
IF (IV.EQ.IVP) DELVVP=1.D0
|
|
SUMR=0.D0
|
|
SUMI=0.D0
|
|
DO 3209 NX=1,NGPT
|
|
SUMR=SUMR+PWGHT(NX,1)*SLR(IV,IVP,NX)
|
|
SUMI=SUMI+PWGHT(NX,1)*SLI(IV,IVP,NX)
|
|
3209 CONTINUE
|
|
C>>SG BELOW SUFFERS FROM ROUND-OFF ERROR FOR IV=IVP CLOSED
|
|
C>>SG TEST CASES GIVE V*(SUMR**2+SUMI**2)-DELVVP ABOUT 2.D-13
|
|
C>>SG BEST WAY TO FIX THIS IS PROBABLY TO TRAP *CLOSED* CHANNELS
|
|
SUM2=(V*(SUMR*SUMR+SUMI*SUMI)-DELVVP)*WVEC(IV)
|
|
QLS (IV,IVP)=QLS (IV,IVP)+SUM2
|
|
IF (PRINT.GE.10) WRITE(6,638) IV,IVP,SUM2, QLS(IV,IVP)
|
|
638 FORMAT(' FOR QLS( 0) VIB LEV =',I3,' TO',I3,15X,
|
|
& 'ADD',D12.4,' =',D12.4)
|
|
3219 CONTINUE
|
|
3220 CONTINUE
|
|
C
|
|
C *** IN ACCUMULATING QL DIVERGENT CODE FOR ITYPE=1,2 AND ITYPE=5,6
|
|
C
|
|
IF (ITYPE.EQ.1 .OR. ITYPE.EQ.2) GO TO 8881
|
|
IF (ITYPE.EQ.3) GO TO 8883
|
|
IF (ITYPE.EQ.5 .OR. ITYPE.EQ.6) GO TO 8885
|
|
STOP
|
|
C
|
|
C ACCUMULATE QL'S / TEST FOR CONVERGENCE
|
|
8881 BIGL=-1.D0
|
|
DO 3200 L=1,NQL
|
|
LMP=L-1
|
|
BIGL=BIGL+2.D0
|
|
ITEST=0
|
|
IF (PRINT.GE.10 .AND. NVC.GT.1) WRITE(6,601)
|
|
DO 3210 IV=1,NVC
|
|
DO 3210 IVP=1,NVC
|
|
TLLR=SLLR(IV,IVP,L)
|
|
TLLI=SLLI(IV,IVP,L)
|
|
TLLSQ=(TLLR*TLLR+TLLI*TLLI)*V*WVEC(IV)/BIGL
|
|
QLT(IV,IVP,L)=QLT(IV,IVP,L)+TLLSQ
|
|
XTEST=TEST(1)
|
|
IF (L.GT.1 .OR. IV.NE.IVP) XTEST=TEST(2)
|
|
IF (TLLSQ.GT.XTEST) ITEST=1
|
|
IF (PRINT.LT.10) GO TO 3210
|
|
WRITE(6,628) LMP,IV,IVP,TLLSQ,QLT(IV,IVP,L)
|
|
628 FORMAT(' FOR QLT(',I3,') VIB LEV =',I3,' TO',I3,
|
|
& ' IOS T-MATRIX ADD',D12.4,' =',D12.4)
|
|
3210 CONTINUE
|
|
C>>SG 5/12/92 STATEMENT BELOW SHOULD BE UNNECESSARY
|
|
IF (JTOTU.LT.999999) GO TO 3200
|
|
C SUPPRESS CONVERGENCE CHECK FOR LOW PARTIAL WAVES.
|
|
IF (JTOT.LE.3*JSTEP*NCAC) GO TO 3200
|
|
IF (IXQL(NIXQL,L).NE.0) GO TO 3200
|
|
IEC(L)=IEC(L)+1
|
|
IF (ITEST.GT.0) IEC(L)=0
|
|
3200 CONTINUE
|
|
GO TO 3000
|
|
C
|
|
8883 DO 8873 IL=1,NQL
|
|
BIGL=(2*LM(3,IL)+1)
|
|
C N.B. NVC=1 FOR ITYPE=3
|
|
TLLR=SLLR(1,1,IL)
|
|
TLLI=SLLI(1,1,IL)
|
|
TLLSQ=(TLLR*TLLR+TLLI*TLLI)*V*WVEC(1) * BIGL
|
|
QLT(1,1,IL)=QLT(1,1,IL)+TLLSQ
|
|
IF (PRINT.GE.10) WRITE(6,652) IL,LM(1,IL),LM(2,IL),LM(3,IL),
|
|
2 TLLSQ,QLT(1,1,IL)
|
|
652 FORMAT(' FOR QLT(',I3,'), L1,L2,L =',3I3,' ADD',
|
|
1 D12.4,' =',D12.4)
|
|
XTEST=TEST(MIN0(2,IL))
|
|
IF (JTOT.LE.3*JSTEP*NCAC) GO TO 8873
|
|
C IF (IXQL(NIXQL,IL).NE.0) GO TO 8875 --- SHOULD ALL = 0
|
|
IEC(IL)=IEC(IL)+1
|
|
IF (TLLSQ.GT.XTEST) IEC(IL)=0
|
|
8873 CONTINUE
|
|
GO TO 3000
|
|
C
|
|
8885 DO 8875 IL=1,NQL
|
|
C N.B. NVC=1 FOR ITYPE=5,6
|
|
TLLR=SLLR(1,1,IXQL(1,IL))
|
|
TLLI=SLLI(1,1,IXQL(1,IL))
|
|
TLLR1=SLLR(1,1,IXQL(2,IL))
|
|
TLLI1=SLLI(1,1,IXQL(2,IL))
|
|
IF (IXQL(3,IL).EQ.2) GO TO 8865
|
|
C BELOW FOR REAL PART / ALSO FOR DIAGONAL CASES
|
|
TLLSQ=(TLLR*TLLR1+TLLI*TLLI1)*V*WVEC(1)
|
|
GO TO 8855
|
|
C BELOW FOR IMAGINARY PART
|
|
8865 TLLSQ=(TLLI*TLLR1-TLLR*TLLI1)*V*WVEC(1)
|
|
8855 QLT(1,1,IL)=QLT(1,1,IL)+TLLSQ
|
|
IF (PRINT.GE.10) WRITE(6,651) IL,LM(1,IXQL(1,IL)),LM(2,IXQL(1,IL))
|
|
1 ,LM(2,IXQL(2,IL)),IXQL(3,IL),
|
|
2 TLLSQ,QLT(1,1,IL)
|
|
651 FORMAT(' FOR QLT(',I3,'), L,M,M1 =',3I4,', CODE =',I2,' ADD',
|
|
1 D12.4,' =',D12.4)
|
|
XTEST=TEST(MIN0(2,IL))
|
|
IF (JTOT.LE.3*JSTEP*NCAC) GO TO 8875
|
|
IF (IXQL(3,IL).NE.0) GO TO 8875
|
|
IEC(IL)=IEC(IL)+1
|
|
IF (TLLSQ.GT.XTEST) IEC(IL)=0
|
|
8875 CONTINUE
|
|
GO TO 3000
|
|
C
|
|
3000 CALL ISUTP(ISU,ENERGY(IE),JTOTL,JSTEP,JTOT,NVC,NQL,QLS,QLT)
|
|
C END OF LOOP OVER PARTIAL WAVES
|
|
C
|
|
CALL GCLOCK(TJTIME)
|
|
TIME=TJTIME-TITIME
|
|
TITIME=TJTIME
|
|
WRITE(6,631) ENERGY(IE),JTOTL,JSTEP,JTOTU
|
|
631 FORMAT('1 ***** ***** ***** END OF CALCULATION FOR ENERGY =',
|
|
1 F12.4,' (1/CM) ***** ***** *****'/
|
|
& 22X,'PARTIAL WAVES',I4,' (',I4,' ) ',I5)
|
|
WRITE(6,641) TIME
|
|
C
|
|
C END OF CALCULATION FOR THIS ENERGY / OUTPUT CROSS SECTIONS
|
|
C MAKE SURE WE HAVE NUSED BY CALLING CHKSTR
|
|
3009 CALL CHKSTR(NUSED)
|
|
WRITE(6,684) NUSED,MX
|
|
684 FORMAT('0',2(' *****'),' STORAGE SO FAR USED',I10,' OF THE',
|
|
1 I10,' AVAILABLE WORDS.')
|
|
C>>SG
|
|
C>>SG N.B. NVC SHOULD BE LOWERED TO NOUT=NOPEN (AS IN IOSOUT)
|
|
C>>SG
|
|
DO 3305 NX=1,NGPT
|
|
IV=1
|
|
WRITE(6,632) NX,(LEFT,IV,IVP,SIGTH(IV,IVP,NX),IVP=1,NVC)
|
|
632 FORMAT('0 FOR ORIENTATION',I6,3(5X,A4 ,I2,',',I2,') =',1PE12.4)
|
|
& /(23X,3(5X,A4,I2,',',I2,') =',1PE12.4)))
|
|
IF (NVC.LE.1) GO TO 3008
|
|
DO 3007 IV=2,NVC
|
|
3007 WRITE(6,642) (LEFT,IV,IVP,SIGTH(IV,IVP,NX),IVP=1,NVC)
|
|
C>>SG FORMAT CHANGED 2/6/92 TO ELIMINATE APPARENT COMPILER BUG
|
|
642 FORMAT(23X,3(5X, A4, I2,',',I2,') =',1PE12.4)/
|
|
1 (23X,3(5X, A4, I2,',',I2,') =',1PE12.4)))
|
|
3008 DO 3305 IV=1,NVC
|
|
DO 3305 IVP=1,NVC
|
|
3305 SIGAV(IV,IVP)=SIGAV(IV,IVP)+PWGHT(NX,1)*SIGTH(IV,IVP,NX)*AVGFCT
|
|
WRITE(6,643)
|
|
643 FORMAT('0 AVERAGE OVER ORIENTATIONS')
|
|
DO 3004 IV=1,NVC
|
|
3004 WRITE(6,642) (LEFT,IV,IVP,SIGAV(IV,IVP),IVP=1,NVC)
|
|
C
|
|
C CALL IOSOUT/IOSPB TO GET STATE TO STATE AND PR. BR. CROSS SECTIONS
|
|
C N.B. ATAU, NEEDED ONLY FOR SIG6, IS STORED IN X(1), I.E., JLEV.
|
|
C THIS IS PRETTY BAD CODING; BETTER PASSING OF ATAU TO SIG6 NEEDED
|
|
C
|
|
IATAU=1
|
|
CALL IOSOUT(ENERGY(IE),QLT,QLS,NVC,ITYPE,X(IATAU),LM,IXQL,
|
|
1 LMAX,NIXQL,NQL,JSTEP)
|
|
IF(IFLS.GT.0)
|
|
1CALL IOSPB(ENERGY(IE),QLT,QLS,IFLS,LINE,LTYPE,ITYPE,NVC,LM,IXQL,
|
|
1 LMAX,NIXQL,NQL)
|
|
C
|
|
2000 CONTINUE
|
|
C
|
|
C END OF LOOP OVER ENERGIES.
|
|
C
|
|
RETURN
|
|
END
|
|
SUBROUTINE IOSDRV(NNRG,NPR,ENERGY,JTOTL,JTOTU,JSTEP,TEST,NCAC,
|
|
1 IFLS,LINE,LTYPE,MXLN,INTFLG,ITYPE,LMAX,MMAX,
|
|
2 IPROGM,URED,LABEL,NUMDER,
|
|
3 LAMBDA,MXLAM,NPOTL,CINT,IRMSET,IRXSET,RVFAC,
|
|
4 DEEP,PRINT,NVC, ISAVEU,TITIME,RM,EPSIL,RMIN,RMAX)
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C INTEGRATED MOLSCAT/IOS IMPLEMENTED APR 86 CAMBRIDGE, ENGLAND.
|
|
C -- A GUTTED VERSION OF IOS1, INTERFACED TO CCP6 MOLSCAT.
|
|
C THIS IS A DRIVER FOR THE IOS CODE; MOLSCAT/DRIVER CALLS
|
|
C BASIN TO READ &BASIS, WHICH THEN CALLS IOSBIN.
|
|
C DRIVER THEN CALLS POTENL TO GET &POTL DATA,
|
|
C AND FINALLY CALLS IOSDRV TO SET UP AND PERFORM IOS CALCULATION.
|
|
C
|
|
INTEGER PRINT
|
|
DIMENSION ENERGY(NNRG),TEST(2),LINE(2,MXLN),LTYPE(MXLN),
|
|
1 LAMBDA(MXLAM)
|
|
LOGICAL NUMDER
|
|
CHARACTER*80 LABEL
|
|
C
|
|
C LAST CHANGED 1/19/93. NEW DYNAMIC MEMORY HANDLING
|
|
C ** VERSION 6 / OCT 85/ ADDS ITYPE=6 CAPABILITY
|
|
C / ALSO ALLOWS "UNEXPANDED" POTL, V(R,ANGLES)
|
|
C ** VERSION 5 / MAR 81/ ADDS INTFLG=4 (MOLSCAT V.8)
|
|
C / JUNE 82/ REPLACES PLM WITH R. T PACK VERSION.
|
|
C ** VERSION 4 / MAY. 78/ ADDS ITYPE=5 CODE.
|
|
C / SEP. 78/ **TEMPORARY** ISAVEU CPABILITY
|
|
C / APR. 79/ CHANGED FOR ISCRU (MOLSCAT V.7) COMPATABIL
|
|
C ** VERSION 3 / DEC. 77/ IS TOTALLY NEW ORGANIZATION TO ACCOMMODATE
|
|
C ITYPE=2 (VIBROTOR - ATOM)
|
|
C ** VERSION 2 / OCT. 77/ ADDS WKB (R.T PACK) CAPABILITY **
|
|
C ** VERSION 1 / SEP. 77/ INTERFACE HOUSTON PROGRAM W/MOLSCAT.
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C MX,IXNEXT ARE MAX AND NEXT AVAILABLE LOCATION IN X() ARRAY
|
|
C IVLFL FLAGS WHETHER IV() ARRAY IS USED AS POINTED W/ VL ARRAY.
|
|
C NIPR IS NUMBER OF INTEGERS PER REAL; SHOULD BE 1 OR 2.
|
|
C
|
|
C CMBASE MODIFIED TO MATCH CURRENT SPECS IN MOLSCAT/BASIS
|
|
C THIS IS USED ONLY TO GET LV,EV VALUES IN IOSBIN SO THEY CAN BE
|
|
C WRITTEN TO ISAVEU HERE.
|
|
DIMENSION EV(1000),LV(4000)
|
|
COMMON /CMBASE/ DUM(1016),IDUM(4031)
|
|
EQUIVALENCE (EV(1),DUM(13)),(LV(1),IDUM(2))
|
|
C
|
|
C MUST INITIALIZE NUSED NON-NEGATIVE BEFORE CALL CHKSTR
|
|
NUSED=0
|
|
WRITE(6,68)
|
|
68 FORMAT('0 IOSDRV ENTERED. SET-UP FOR INFINITE ORDER SUDDEN',
|
|
1 ' CALCULATION.')
|
|
C
|
|
C CONTINUE WITH SET-UP FOR IOS. PROCESS &POTL LAM(MXLAM) DATA
|
|
C SET NGPT, LMAX AND GAUSS PTS/WTS.
|
|
C N.B. LMAX/MMAX INITIALLY CONTAIN HIGHEST L,M VALUES
|
|
C DESIRED FOR QLM. LMAX IS RESET TO EQUAL THE *NUMBER* OF L,M
|
|
C VALUES IN LM,SLLR,SLLI,ETC.
|
|
CALL IOSBGP(MXLAM,LAMBDA,MXXXXL,NGPT,LMAX,MMAX,NQL,NIXQL)
|
|
C
|
|
C RESERVE STORAGE FOR VARIABLES. IC HAS NEXT AVAIL LOC IN X()
|
|
C STORAGE FOR SCATTERING VARIABLES . . .
|
|
C SREAL(NVC,NVC),SIMAG(NVC,NVC),WVEC(NVC),EINT(NVC),CENT(NVC),
|
|
C VL(NVC*(NVC+1)/2,MXLAM),JJJ(NVC),LORB(NVC),NB(NVC)
|
|
C --ADDED APR 86-- KMAT(NVC,NVC),IV(NVC*(NVC+1)/2,MXLAM)
|
|
C
|
|
C V11 CODE EXPECTED IC TO BE STORAGE USED SO FAR
|
|
ISVMEM=IXNEXT
|
|
IC=IXNEXT-1
|
|
IXSR=IC+1
|
|
IXSR=IXNEXT
|
|
IXSI=IXSR+NVC*NVC
|
|
IXKMAT=IXSI+NVC*NVC
|
|
IXWV=IXKMAT+NVC*NVC
|
|
IXEINT=IXWV+NVC
|
|
IXCENT=IXEINT+NVC
|
|
IXVL=IXCENT+NVC
|
|
NV=NVC*(NVC+1)*NPOTL/2
|
|
IXJJJ=IXVL+NV
|
|
IXLORB=IXJJJ+NVC
|
|
IXNB=IXLORB+NVC
|
|
IXIV=IXNB+NVC
|
|
IC=IXIV
|
|
IF (IVLFL.GT.0) IC=IXIV+(NV+NIPR-1)/NIPR
|
|
C
|
|
C IOS VARIABLES
|
|
C VLI(NGPT,MXXXXL),PWGHT(NGPT,LMAX),SLR(NVC,NVC,NGPT),
|
|
C SLI(NVC,NVC,NGPT),SIGTH(NVC,NVC,NGPT),SIGAV(NVC,NVC),
|
|
C QLS(NVC,NVC),QLT(NVC,NVC,NQL),IEC(NQL ),IXQL(NIXQL,NQL)
|
|
C SLLR(NVC,NVC,LMAX),SLLI(NVC,NVC,LMAX),LM(3,LMAX)
|
|
C
|
|
IXVLI=IC
|
|
IXPW=IXVLI+MXXXXL*NGPT
|
|
IXSLR=IXPW+NGPT*LMAX
|
|
IXSLI=IXSLR+NVC*NVC*NGPT
|
|
IXSGTH=IXSLI+NVC*NVC*NGPT
|
|
IXSGAV=IXSGTH+NVC*NVC*NGPT
|
|
IXQLS=IXSGAV+NVC*NVC
|
|
IXQLT=IXQLS+NVC*NVC
|
|
IXSLLR=IXQLT+NVC*NVC*NQL
|
|
IXSLLI=IXSLLR+NVC*NVC*LMAX
|
|
IXIEC=IXSLLI+NVC*NVC*LMAX
|
|
IXQL=IXIEC+(NQL+NIPR-1)/NIPR
|
|
IXLM=IXQL+(NIXQL*NQL+NIPR-1)/NIPR
|
|
IC=IXLM+(3*LMAX+1)/NIPR
|
|
WRITE(6,681) NVC,NGPT,LMAX,MXXXXL,NQL,NIXQL,IC
|
|
681 FORMAT('0 STORAGE ALLOCATED FOR NVC (NO. VIB. CHANNELS) =',T60,
|
|
1 I4/25X,'NGPT (NO. GAUSS PTS.) =',T58,I6/
|
|
2 25X,'LMAX (NO. LEGENDRE COEFFS.) =',T60,I4/
|
|
3 25X,'MXXXXL (NO. SYMMETRIES IN POTL) =',T60,I4/
|
|
4 25X,'NQL (NO. QLT) =',T60,I4/
|
|
5 25X,'NIXQL (NO. INDICES IN IXQL) =',T60,I4/
|
|
6 25X,'NEXT LOCATION =',T54,I10)
|
|
C IC IS NOW 'NEXT STORAGE LOCATION'
|
|
IXNEXT=IC
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
C SET UP PWGHT, VLI TABLES - ALSO IXQL TABLE
|
|
C
|
|
CALL IOSB1(X(IXPW),X(IXVLI),X(IXQL),X(IXLM),NGPT,LMAX,MXXXXL,
|
|
1 NIXQL,NQL)
|
|
C
|
|
IF (ISAVEU.LE.0) GO TO 3000
|
|
C
|
|
C *** ISAVEU OUTPUT -- MAY 92 VERSION
|
|
C
|
|
WRITE(6,3600) ISAVEU
|
|
3600 FORMAT('0'/'0 QLS/QLT SAVED (MAY 92 FORMAT) ON UNIT ISAVEU =',I3)
|
|
IPOUT=100+IPROGM
|
|
ITOUT=100+ITYPE-100*(ITYPE/100)
|
|
WRITE(ISAVEU,3601) LABEL,ITOUT,NVC,NQL,URED,IPOUT
|
|
3601 FORMAT(A80/3I4,F8.4,I4)
|
|
C WRITE(ISAVEU,3602) (LV(I),I=1,NVC)
|
|
3602 FORMAT(20I4)
|
|
C WRITE(ISAVEU,3603) NVC,(EV(I),I=1,NVC)
|
|
3603 FORMAT(I4/(5E16.8))
|
|
C WRITE(ISAVEU,3603) NNRG,(ENERGY(I),I=1,NNRG)
|
|
C
|
|
3000 CALL GCLOCK(TJTIME)
|
|
TIME=TJTIME-TITIME
|
|
WRITE(6,640) TIME
|
|
640 FORMAT('0 TIME TO SET UP CALCULATION WAS',F8.2,
|
|
1 ' SECONDS. EXIT IOSDRV')
|
|
WRITE(6,69)
|
|
69 FORMAT('0',30('===='))
|
|
C
|
|
C PASS CONTROL TO IOSCLC TO DO CALCULATION.
|
|
C
|
|
CALL IOSCLC(NNRG,ENERGY,JTOTL,JTOTU,JSTEP,INTFLG,PRINT,ISAVEU,
|
|
1 ITYPE,RMIN,RMAX,DEEP,IRMSET,IRXSET,RVFAC,NUMDER,
|
|
2 NCAC,TEST,RM,EPSIL,NVC,LMAX,NGPT,NQL,NIXQL,
|
|
3 MXXXXL,LAMBDA,MXLAM,NPOTL,X(IXVLI),
|
|
4 X(IXPW),X(IXSLR),X(IXSLI),X(IXQLT),X(IXQLS),
|
|
5 X(IXSLLR),X(IXSLLI),X(IXQL),
|
|
6 X(IXSGTH),X(IXSGAV),X(IXIEC),X(IXLM),
|
|
7 IXSR,IXSI,IXKMAT,IXVL,IXIV,IXEINT,IXCENT,IXWV,
|
|
8 IXJJJ,IXLORB,IXNB,X(IXWV),X(IXNB),
|
|
9 IFLS,MXLN,LINE,LTYPE)
|
|
C
|
|
C RELEAST STORAGE USED BY IOSDRV/IOSCLC/STORAG
|
|
IXNEXT=ISVMEM
|
|
RETURN
|
|
END
|
|
SUBROUTINE IOSOUT(ENERGY,QL,QLOLD,NVC,ITYPE,ATAU,LM,IXQL,
|
|
1 LMAX,NIXQL,NQL,JSTEP)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C>>SG MODIFIED MAY 92 - ITYPE=3 / ADD JSTEP TO PARAMETER LIST.
|
|
C>>SG MODIFIED FEB 92
|
|
C>>SG TO CORRECT APPARENT COMPILER BUG, IN FORMATS 615,616
|
|
C>>SG TO ALLOW FOR OUTPUT OF NOUT.LT.NVC VIB LEVELS IF SOME CLOSED
|
|
C
|
|
C AUG 86 IXQLF ADD LM,LMAX ARGUMENTS
|
|
C *** TO CONTROL OPTIONAL 'DEBUGGING' OUTPUT ***
|
|
LOGICAL PRNT
|
|
C ALLOW FOR MXSIG OUTPUT LEVELS
|
|
PARAMETER (MXSIG=200)
|
|
CHARACTER*1 S(MXSIG),BLANK,STAR
|
|
CHARACTER*4 LCODE(3),LQLT,LQLS
|
|
DIMENSION QL(NVC,NVC,NQL),QLOLD(NVC,NVC)
|
|
DIMENSION LM(3,LMAX),IXQL(NIXQL,NQL)
|
|
DIMENSION ATAU(2)
|
|
C STORAGE RESERVED FOR MAXIMUM OF MXSIG LEVELS
|
|
DIMENSION SIG(MXSIG),SIG3(MXSIG)
|
|
C
|
|
C COMMON BLOCKS TO COMMUNICATE WITH IOSBIN(BASIS SET) ROUTINES
|
|
COMMON /CMBASE/DUM(1016),IDUM(4031)
|
|
DIMENSION JLEV(4000)
|
|
EQUIVALENCE (NLEV,IDUM(1)), (JLEV(1),IDUM(2)), (IDENT,IDUM(4029))
|
|
COMMON /IOUTCM/ JMAX,LEVV(4000)
|
|
C COMMON TO GET SYMMETRY INFORMATION (IHOMO1,IHOMO2) FOR ITYPE=3
|
|
COMMON/ANGLES/COSANG(7),FACTOR,IH1,IH2,IH3,IH4
|
|
C
|
|
DATA IZERO/0/, ZTOL/1.D-8/
|
|
DATA BLANK/' '/, STAR/'*'/
|
|
DATA LCODE/' ','REAL','IMAG'/, LQLT/' QLT'/, LQLS/' QLS'/
|
|
DATA PRNT/.FALSE./
|
|
C
|
|
C STATEMENT FUNCTION FOR NORMALIZATION XNORM . . .
|
|
XNORM(EPSI)=1.D0/(1.D0+ABS(EPSI))
|
|
FUNC(I)=2.D0*DBLE(I)+1.D0
|
|
C
|
|
WRITE(6,601) ENERGY
|
|
601 FORMAT('1 STATE-TO-STATE CROSS SECTIONS (IN ANG**2) FOR KINETIC ',
|
|
& 'ENERGY =',F12.4,' (1/CM).'/'0 PROCESSED BY IOSOUT (FEB 92).')
|
|
C
|
|
XJSTEP=JSTEP
|
|
IF(JSTEP.GT.1) WRITE(6,690) JSTEP
|
|
690 FORMAT('0 CROSS SECTIONS (BUT NOT QL) MULTIPLIED BY JSTEP ='
|
|
1 ,I3)
|
|
IF (ITYPE.EQ.5 .OR.ITYPE.EQ.6) GO TO 5000
|
|
IF (ITYPE.EQ.3) GO TO 3000
|
|
C
|
|
C CODE BELOW IS ITYPE=1,2 FROM VERSION 3. IT SHOULD STILL WORK
|
|
C SINCE ALL QL (NOW QLT) ARE IN ORDER.
|
|
WRITE(6,610) NVC,(LEVV(I),I=1,NVC)
|
|
610 FORMAT('0 NO. OF VIBRATIONAL LEVELS =',I4,'. LEVELS ARE'/
|
|
& (' ',13I10) )
|
|
IF (JMAX.LT.MXSIG) GO TO 2200
|
|
WRITE(6,692) JMAX,MXSIG
|
|
692 FORMAT('0 JMAX =',I6,' REDUCED BECAUSE OF MXSIG =',I5)
|
|
JMAX=MXSIG-1
|
|
2200 WRITE(6,602) JMAX
|
|
602 FORMAT('0 MAXIMUM J-VALUE REQUESTED IS',I4)
|
|
C>>SG ------------------------- >> CODE BELOW ADDED FEB 92
|
|
C>> DETERMINE IF ALL CHANNELS ARE OPEN. SINCE WE DON'T HAVE ACCESS
|
|
C TO NOPEN HERE, SIMPLY FIND THE HIGHEST 'CHANNEL' FOR WHICH WE
|
|
C HAVE NONZERO QL() OR QLOLD()
|
|
NOUT=0
|
|
DO 2300 IV=1,NVC
|
|
C FIRST CHECK QLOLD
|
|
DO 2301 IVP=1,NVC
|
|
IF (QLOLD(IV,IVP).NE.0.) GO TO 2390
|
|
2301 CONTINUE
|
|
C THEN CHECK QL()
|
|
DO 2302 IVP=1,NVC
|
|
DO 2302 IL=1,NQL
|
|
IF (QL(IV,IVP,IL).NE.0.) GO TO 2390
|
|
2302 CONTINUE
|
|
GO TO 2300
|
|
2390 NOUT=IV
|
|
2300 CONTINUE
|
|
IF (NOUT.NE.NVC) WRITE(6,620) NOUT
|
|
620 FORMAT('0 IOSOUT (FEB 92). ALL QL,QLOLD ZERO FOR SOME CHANNELS'
|
|
1 ,', PRESUMABLY CLOSED ENERGETICALLY.'/
|
|
2 '0 OUTPUT LIMITED TO NOUT =',I3)
|
|
C
|
|
C<<SG -<< END OF ADDITIONAL CODE FEB 92. NB NVC CHANGED TO NOUT BELOW
|
|
IV=1
|
|
WRITE(6,606)(IV,IVP,QLOLD(IV,IVP),IVP=1,NOUT)
|
|
606 FORMAT('0 QLOLD(0) ',4(2X,I3,' TO',I3,' =',1PE12.4) /
|
|
& (12X,4(2X,I3,' TO',I3,' =',1PE12.4)))
|
|
IF (NOUT.LE.1) GO TO 2001
|
|
DO 2101 IV=2,NOUT
|
|
2101 WRITE(6,616) (IV,IVP,QLOLD(IV,IVP),IVP=1,NOUT)
|
|
616 FORMAT(12X,4(2X,I3,' TO',I3,' =',1PE12.4)/
|
|
1 (12X,4(2X,I3,' TO',I3,' =',1PE12.4)))
|
|
2001 DO 1300 L=1,NQL
|
|
LM1=L-1
|
|
C IF (LM1.NE.LM(1,IXQL(1,L))) WRITE(6,698) L,LM1,LM(1,IXQL(1,L))
|
|
698 FORMAT('0 * * * ERROR. L-1.NE.LM(1,L) ',3I6)
|
|
IV=1
|
|
WRITE(6,605) LM1,(IV,IVP,QL(IV,IVP,L),IVP=1,NOUT)
|
|
605 FORMAT('0 Q(',I3,' ) ',4(2X,I3,' TO',I3,' =',1PE12.4) /
|
|
& (12X,4(2X,I3,' TO',I3,' =',1PE12.4)))
|
|
IF (NOUT.LE.1) GO TO 1300
|
|
DO 1301 IV=2,NOUT
|
|
1301 WRITE(6,615) (IV,IVP,QL(IV,IVP,L),IVP=1,NOUT)
|
|
615 FORMAT(12X,4(2X,I3,' TO',I3,' =',1PE12.4)/
|
|
1 (12X,4(2X,I3,' TO',I3,' =',1PE12.4)))
|
|
1300 CONTINUE
|
|
C
|
|
DO 4000 IV=1,NOUT
|
|
DO 4000 IVP=1,NOUT
|
|
WRITE(6,640) IV,IVP
|
|
640 FORMAT('0 ***** ***** ***** BELOW FOR VIB LEVEL',I3,' TO',I3)
|
|
IMSG=0
|
|
DO 1000 JI=IZERO,JMAX
|
|
WRITE(6,603) JI
|
|
603 FORMAT('0 FOR INITIAL LEVEL J =',I4,' CROSS SECTIONS (ANG**2) ',
|
|
& 'TO FINAL LEVELS ARE')
|
|
DO 1100 JF=IZERO,JMAX
|
|
IF=JF+1
|
|
S(IF)=BLANK
|
|
LLOW=IABS(JF-JI)
|
|
LTOP=JF+JI
|
|
IF (LTOP.LE.LMAX-1) GO TO 1101
|
|
S(IF)=STAR
|
|
IMSG=1
|
|
LTOP=LMAX-1
|
|
1101 SIG(IF)=0.D0
|
|
IF (LLOW.GT.LTOP) GO TO 1100
|
|
DO 1200 L=LLOW,LTOP
|
|
TJ=THREEJ(JI,L,JF)
|
|
1200 SIG(IF)=SIG(IF)+TJ*TJ*QL(IV,IVP,L+1)
|
|
1100 SIG(IF)=FUNC(JF)*SIG(IF) * XJSTEP
|
|
1000 WRITE(6,604) (JF,SIG(JF+1),S(JF+1),JF=IZERO,JMAX)
|
|
604 FORMAT(6(4X,I3,1PE12.4,A1))
|
|
IF (IMSG.GT.0) WRITE(6,699)
|
|
699 FORMAT( '0 ***** NOTE. FOR CROSS SECTIONS MARKED WITH A ',
|
|
1 'STAR, SOME CONTRIBUTING Q(L) ARE NOT AVAILABLE.')
|
|
4000 CONTINUE
|
|
RETURN
|
|
C
|
|
C>>SG ITYPE=3 CODE ADDED MAY 92. ASSUMES NVC=1 (ONE VIB CHANNEL)
|
|
3000 WRITE(6,630)
|
|
630 FORMAT('0'/'0 ACCUMULATED Q(L1,L2,L) ARE AS FOLLOWS')
|
|
WRITE(6,651) LCODE(1),LQLS,LM(1,1),LM(2,1),LM(3,1),QLOLD(1,1)
|
|
DO 3001 L=1,NQL
|
|
3001 WRITE(6,651) LCODE(1),LQLT,LM(1,L),LM(2,L),LM(3,L),QL(1,1,L)
|
|
IF (LM(1,1).EQ.0.AND.LM(2,1).EQ.0.AND.LM(3,1).EQ.0) GO TO 3002
|
|
WRITE(6,639)
|
|
639 FORMAT(' IOSOUT *** ERROR. L1=L2=L=0 IS NOT FIRST SYMMETRY IN LM')
|
|
3002 L1MAX=0
|
|
L2MAX=0
|
|
DO 3003 IL=1,LMAX
|
|
L1MAX=MAX0(L1MAX,LM(1,IL))
|
|
3003 L2MAX=MAX0(L2MAX,LM(2,IL))
|
|
NL2=L2MAX/IH2+1
|
|
IX=0
|
|
DO 3100 L1=0,L1MAX,IH1
|
|
LTOP=L2MAX
|
|
IF (IDENT.GT.0) LTOP=L1
|
|
DO 3100 L2=0,LTOP,IH2
|
|
IX=IX+1
|
|
NSIG=IX
|
|
IF (NSIG.LE.MXSIG) GO TO 3109
|
|
WRITE(6,638) MXSIG
|
|
638 FORMAT(' *** ERROR. MXSIG (DIMENSION OF SIG3) EXCEEDED',I5)
|
|
STOP
|
|
3109 SIG3(IX)=0.
|
|
LLO=ABS(L1-L2)
|
|
LHI=L1+L2
|
|
DO 3102 LL=LLO,LHI,2
|
|
C SEARCH LM(,IL) FOR L1,L2,LL
|
|
DO 3101 IL=1,LMAX
|
|
IF (L1.NE.LM(1,IL).OR.L2.NE.LM(2,IL).OR.LL.NE.LM(3,IL)) GO TO 3101
|
|
SIG3(IX)=SIG3(IX)+QL(1,1,IL) * XJSTEP
|
|
GO TO 3102
|
|
3101 CONTINUE
|
|
WRITE(6,631) L1,L2,LL
|
|
631 FORMAT(' IOSOUT *** ERROR. REQUIRED QL(',3I3,') NOT FOUND.')
|
|
3102 CONTINUE
|
|
3100 WRITE(6,632) L1,L2,SIG3(IX)
|
|
632 FORMAT(' SIG( 0 0 ->',2I3,') =',F10.3,' ANG**2')
|
|
C
|
|
IF (NLEV.LE.0) RETURN
|
|
WRITE(6,633) (I,JLEV(2*I-1),JLEV(2*I),I=1,NLEV)
|
|
633 FORMAT('0'/'0 CROSS SECTIONS WILL BE COMPUTED AMONG FOLLOWING ',
|
|
& 'LEVELS'/'0 LEVEL J1 J2 '/(' ',3I4))
|
|
IF (NLEV.GT.MXSIG) THEN
|
|
WRITE(6,693) NLEV,MXSIG
|
|
NLEV=MXSIG
|
|
ENDIF
|
|
IMSG=0
|
|
DO 3200 I=1,NLEV
|
|
JI1=JLEV(2*I-1)
|
|
JI2=JLEV(2*I)
|
|
WRITE(6,634) I,JI1,JI2
|
|
634 FORMAT('0 INITIAL LEVEL =',I4,' J1, J2 =',3I4)
|
|
DO 3201 IF=1,NLEV
|
|
JF1=JLEV(2*IF-1)
|
|
JF2=JLEV(2*IF)
|
|
SIG(IF)=0.
|
|
S(IF)=BLANK
|
|
C IF (IF.EQ.I) GO TO 3200
|
|
L1LO=ABS(JI1-JF1)
|
|
L1HI=JI1+JF1
|
|
L2LO=ABS(JI2-JF2)
|
|
L2HI=JI2+JF2
|
|
DO 3202 L1=L1LO,L1HI,IH1
|
|
IX1=L1/IH1+1
|
|
DO 3202 L2=L2LO,L2HI,IH2
|
|
IX2=L2/IH2+1
|
|
IF (IDENT.NE.0) GO TO 3203
|
|
C INDEX FOR DISTINGUISHABLE PARTICLES
|
|
IX=(IX1-1)*NL2+IX2
|
|
GO TO 3204
|
|
C BELOW FOR INDISTINGUISHABLE PARTICLES/ ASSUME IH2=IH1.
|
|
3203 IX1=MAX0(L1,L2)/IH1+1
|
|
IX2=MIN0(L1,L2)/IH1+1
|
|
IX=(IX1-1)*IX1/2+IX2
|
|
C SEE IF WE HAVE THIS (I.E., IX.LE.NSIG)
|
|
3204 IF (IX.LE.NSIG) GO TO 3205
|
|
S(IF)=STAR
|
|
IMSG=1
|
|
GO TO 3202
|
|
3205 TJ1=THREEJ(JI1,L1,JF1)
|
|
TJ2=THREEJ(JI2,L2,JF2)
|
|
SIG(IF)=SIG(IF)+TJ1*TJ1*TJ2*TJ2*SIG3(IX)
|
|
3202 CONTINUE
|
|
3201 SIG(IF)=SIG(IF)*(2*JF1+1)*(2*JF2+1)
|
|
3200 WRITE(6,604) (IF,SIG(IF),S(IF),IF=1,NLEV)
|
|
IF (IMSG.GT.0) WRITE(6,699)
|
|
RETURN
|
|
C
|
|
C BELOW FOR ITYPE=5, INITIAL PROCESSING FOR ITYPE=6 ALSO
|
|
C>>SG (FEB 92) N.B. CODE *ASSUMES* NVC=1 (ONE VIB CHANNEL).
|
|
5000 WRITE(6,650)
|
|
650 FORMAT('0'/'0 ACCUMULATED Q(L,M1,M2) ARE AS FOLLOWS')
|
|
WRITE(6,651) LCODE(1),LQLS,IZERO,IZERO,IZERO,QLOLD(1,1)
|
|
651 FORMAT(' ',A4,2X,A4,'(',3I3,') =',1PE13.5)
|
|
DO 5001 L=1,NQL
|
|
5001 WRITE(6,651) LCODE(IXQL(NIXQL,L)+1),LQLT,LM(1,IXQL(1,L)),
|
|
& LM(2,IXQL(1,L)),LM(2,IXQL(2,L)),QL(1,1,L)
|
|
IMSG=0
|
|
IF (NLEV.LE.MXSIG) GO TO 5109
|
|
WRITE(6,693) NLEV,MXSIG
|
|
693 FORMAT('0 NLEV =',I6,' REDUCED BECAUSE OF MXSIG =',I5)
|
|
NLEV=MXSIG
|
|
5109 IF (ITYPE.EQ.6) GO TO 6000
|
|
WRITE(6,652)
|
|
652 FORMAT('0'/'0 CROSS SECTIONS WILL BE COMPUTED AMONG FOLLOWING ',
|
|
& 'LEVELS'/'0 LEVEL J K PRTY')
|
|
DO 5002 I=1,NLEV
|
|
5002 WRITE(6,653) I,JLEV(3*I-2),JLEV(3*I-1),JLEV(3*I)
|
|
653 FORMAT(' ',4I4)
|
|
DO 5100 I=1,NLEV
|
|
JI=JLEV(3*I-2)
|
|
XJI=JI
|
|
KI=JLEV(3*I-1)
|
|
XKI=KI
|
|
EPSI=PARITY3(JLEV(3*I))
|
|
IF (KI.EQ.0) EPSI=0.D0
|
|
XNI=XNORM(EPSI)
|
|
WRITE(6,654) I,JI,KI,JLEV(3*I)
|
|
654 FORMAT('0 INITIAL LEVEL =',I4,' J, K, PRTY =',3I4)
|
|
DO 5101 IF=1,NLEV
|
|
JF=JLEV(3*IF-2)
|
|
XJF=JF
|
|
KF=JLEV(3*IF-1)
|
|
XKF=KF
|
|
EPSF=PARITY3(JLEV(3*IF))
|
|
IF (KF.EQ.0) EPSF=0.D0
|
|
XNF=XNORM(EPSF)
|
|
LLO=IABS(JI-JF)
|
|
LHI=JI+JF
|
|
PJK=PARITY3(JI+JF+KI+KF)
|
|
MPLS=KI+KF
|
|
MMIN=IABS(KI-KF)
|
|
P2=1.D0
|
|
IF (KI-KF.LT.0) P2=PARITY3(MMIN)
|
|
SIG(IF)=0.D0
|
|
S(IF)=BLANK
|
|
TMAX=0.D0
|
|
DO 5102 L=LLO,LHI
|
|
XL=L
|
|
PL=PJK*PARITY3(L)
|
|
C -----------------------TERM 1 -------------------
|
|
PP=1.D0+EPSI*EPSF*PL
|
|
PP=PP*PP
|
|
IF (PP.LE.ZTOL) GO TO 5200
|
|
TJ=THRJ(XJF,XL,XJI,XKF,XKI-XKF,-XKI)
|
|
TJ=TJ*TJ
|
|
IF (TJ.LE.ZTOL) GO TO 5200
|
|
CALL IXQLF(LM,LMAX,L,MMIN,MMIN,0,INDEX,IXQL,NIXQL,NQL)
|
|
IF (INDEX.GT.0) GO TO 5110
|
|
IF (INDEX.EQ.-1) GO TO 5200
|
|
IMSG=1
|
|
S(IF)=STAR
|
|
C IF ('PRINT'.GT.25) WRITE(6, ) MSG
|
|
GO TO 5200
|
|
5110 TT=PP*TJ*QL(1,1,INDEX)
|
|
TMAX=MAX(ABS(TT),TMAX)
|
|
SIG(IF)=SIG(IF)+TT * XJSTEP
|
|
C -----------------------TERM 2 -------------------
|
|
5200 PP=(1.D0+EPSI*EPSF*PL)*(EPSF+EPSI*PL)
|
|
IF (ABS(PP).LE.ZTOL) GO TO 5300
|
|
TJ=THRJ(XJF,XL,XJI,XKF,XKI-XKF,-XKI)*
|
|
& THRJ(XJF,XL,XJI,-XKF,XKF+XKI,-XKI)
|
|
IF (ABS(TJ).LE.ZTOL) GO TO 5300
|
|
CALL IXQLF(LM,LMAX,L,MPLS,MMIN,1,INDEX,IXQL,NIXQL,NQL)
|
|
IF (INDEX.GT.0) GO TO 5210
|
|
IF (INDEX.EQ.-1) GO TO 5300
|
|
IMSG=1
|
|
S(IF)=STAR
|
|
C ON HIGH PRNTLV WRITE MSG
|
|
GO TO 5300
|
|
5210 TT=2.D0*P2*PP*TJ*QL(1,1,INDEX)
|
|
TMAX=MAX(TMAX,ABS(TT))
|
|
SIG(IF)=SIG(IF)+TT * XJSTEP
|
|
C -----------------------TERM 3 -------------------
|
|
5300 PP=EPSF+EPSI*PL
|
|
PP=PP*PP
|
|
IF (PP.LE.ZTOL) GO TO 5102
|
|
TJ=THRJ(XJF,XL,XJI,-XKF,XKF+XKI,-XKI)
|
|
TJ=TJ*TJ
|
|
IF (TJ.LE.ZTOL) GO TO 5102
|
|
CALL IXQLF(LM,LMAX,L,MPLS,MPLS,0,INDEX,IXQL,NIXQL,NQL)
|
|
IF (INDEX.GT.0) GO TO 5310
|
|
IF (INDEX.EQ.-1) GO TO 5102
|
|
S(IF)=STAR
|
|
IMSG=1
|
|
C ON 'PRNTLV' WRITEN MSG
|
|
GO TO 5102
|
|
5310 TT=PP*TJ*QL(1,1,INDEX)
|
|
TMAX=MAX(ABS(TT),TMAX)
|
|
SIG(IF)=SIG(IF)+TT * XJSTEP
|
|
5102 CONTINUE
|
|
IF (ABS(SIG(IF)).GE.ZTOL*TMAX) GO TO 5101
|
|
IF (SIG(IF).EQ.0.D0) GO TO 5101
|
|
IF (PRNT) WRITE(6,697) IF,SIG(IF),TMAX
|
|
697 FORMAT(' * * * NOTE. ROUND-OFF ERROR FOR LEV(F) =',I3,
|
|
& ', SIG(IF),TMAX =',2D12.4)
|
|
SIG(IF)=0.D0
|
|
5101 SIG(IF)=SIG(IF)*XNI*XNF*FUNC(JF)
|
|
5100 WRITE(6,604) (IF,SIG(IF),S(IF),IF=1,NLEV)
|
|
IF (IMSG.GT.0) WRITE(6,699)
|
|
RETURN
|
|
C
|
|
C BELOW FOR ITYPE=6
|
|
6000 DO 6100 I=1,NLEV
|
|
WRITE(6,664) I,JLEV(4*I-3),JLEV(4*I-2),JLEV(4*I-1)
|
|
664 FORMAT('0 INITIAL LEVEL =',I4,' J, TAU, PARITY =',3I4)
|
|
DO 6101 IF=1,NLEV
|
|
SIG(IF)=0.D0
|
|
S(IF)=BLANK
|
|
6101 CALL SIG6(NLEV,JLEV,ATAU,I,IF,SIG(IF),S(IF),IMSG,QL,IXQL,NIXQL,
|
|
1 NQL,LM,LMAX)
|
|
6100 WRITE(6,604) (IF,SIG(IF)*XJSTEP,S(IF),IF=1,NLEV)
|
|
IF (IMSG.GT.0) WRITE(6,699)
|
|
RETURN
|
|
C
|
|
END
|
|
SUBROUTINE IOSPB(ENERGY,QL,QLOLD,NL,LINE,LTYPE,ITYPE,
|
|
1 NVC,LM,IXQL,LMAX,NIXQL,NQL)
|
|
C ***
|
|
C *** MODIFIED DEC 86 FOR COMPATBILITY WITH OFF-DIAGONAL PRBR CODE
|
|
C ***
|
|
C ** N.B. DIMENSIONS ON QL,QLOLD SHOULD HAVE NVC REMOVED.
|
|
C ALSO, LM APPEARS NOT TO BE USED IN THIS ROUTINE
|
|
C AUG 86 IXQLF ADD LM,LMAX ARGUMENTS
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
LOGICAL EXISTS
|
|
C TO CONTROL PRINTING OF 'OPTIONAL' OUTPUT
|
|
LOGICAL LPRT
|
|
C FOR UPWARD COMPATIBILITY WITH OLD (DIAG ONLY) INPUT
|
|
LOGICAL LDIAG
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C DEC 86 LINE() CHANGED TO 1-DIMENSIONAL ARRAY CONTROLED BY NPL
|
|
DIMENSION QL(NVC,NVC,NQL),QLOLD(NVC,NVC),LINE(2),LTYPE(NL)
|
|
DIMENSION LM(3,LMAX),IXQL(NIXQL,NQL)
|
|
C QLOLD IS QL(0) IN THE NOTATION OF IOS PAPER 1.
|
|
C
|
|
C COMMON TO COMMUNICATE WITH IOSBIN ROUTINE
|
|
DIMENSION JLEV(4000)
|
|
COMMON /CMBASE/DUM(1016),IDUM(4031)
|
|
EQUIVALENCE (JLEV(1),IDUM(2)), (NLEV,IDUM(1))
|
|
C
|
|
DATA IZERO/0/, IONE/1/, TOL/1.D-5/
|
|
DATA LPRT/.FALSE./
|
|
DATA LDIAG/.FALSE./
|
|
C
|
|
C STATEMENT FUNCTION DEFINITIONS. . .
|
|
XNORM(EPSA)=1.D0/(1.D0+ABS(EPSA))
|
|
FUNC(JA)=DBLE(2*JA+1)
|
|
EXISTS(I)= I.GT.0 .AND. I.LE.NLEV
|
|
C
|
|
IF (NL.LE.0) RETURN
|
|
C NPL IS NO. OF INDICES IN LINE PER CROSS SECTION
|
|
NPL=4
|
|
IF (LDIAG) NPL=2
|
|
WRITE(6,600) NL,ENERGY
|
|
600 FORMAT('0'/'0 PRESSURE BROADENING CROSS SECTIONS REQUESTED FOR',
|
|
& I4,' SPECTRAL LINES.'/'0 ENERGY =',F12.4,' (1/CM).')
|
|
IF (ITYPE.EQ.1 .AND. NVC.EQ.1) GO TO 1111
|
|
IF (ITYPE.EQ.5 .AND. NVC.EQ.1) GO TO 5000
|
|
WRITE(6,695) ITYPE,NVC
|
|
695 FORMAT('0 * * * NOTE. IOSPB NOT SUPPORTED FOR ITYPE, NVC =',2I6)
|
|
NL=0
|
|
RETURN
|
|
1111 QTOT=0D0
|
|
IF (LMAX.LT.2) GO TO 1001
|
|
DO 1000 IL=2,LMAX
|
|
1000 QTOT=QTOT+QL(1,1,IL)
|
|
1001 LM1=LMAX-1
|
|
WRITE(6,651) LM1,QTOT,QLOLD(1,1)
|
|
651 FORMAT('0 SUM OVER Q(L), L = 1,',I3,' =',F12.4,' QLOLD(0) =',
|
|
& F12.4)
|
|
C ***
|
|
C *** SAVE QL(1,1,1) AND REPLACE WITH QLOLD(1,1)
|
|
Q0SAVE=QL(1,1,1)
|
|
QL(1,1,1)=QLOLD(1,1)
|
|
C *** LOOP OVER LINES
|
|
DO 2000 LN=1,NL
|
|
LVA=LINE((LN-1)*NPL+1)
|
|
LVB=LINE((LN-1)*NPL+2)
|
|
IF (.NOT.LDIAG) GO TO 1091
|
|
LVA1=LVA
|
|
LVB1=LVB
|
|
GO TO 1092
|
|
1091 LVA1=LINE((LN-1)*NPL+3)
|
|
LVB1=LINE((LN-1)*NPL+4)
|
|
1092 IF (EXISTS(LVA).AND.EXISTS(LVB).AND.EXISTS(LVA1).AND.EXISTS(LVB1))
|
|
1 GO TO 2001
|
|
WRITE(6,691) LN,LVA,LVB,LVA1,LVB1
|
|
691 FORMAT('0 * * * ERROR. FOR LINE',I3,' LEVEL A OR B .GT. NLEV -
|
|
& CANNOT PROCESS',4I6)
|
|
GO TO 2000
|
|
2001 JA=JLEV(LVA)
|
|
JB=JLEV(LVB)
|
|
JA1=JLEV(LVA1)
|
|
JB1=JLEV(LVB1)
|
|
K=LTYPE(LN)
|
|
IF (K.LE.0) K=IABS(JA-JB)
|
|
WRITE(6,601) LN,JA,JB,JA1,JB1,K
|
|
601 FORMAT('0 LINE',I3,' FOR JA, JB; JA1, JB1 = ',2I4,4X,2I4,
|
|
& ' PROCESSED FOR',I4,'-POLE RADIATION.')
|
|
LTOP=MIN0(JA+JA1,JB+JB1)
|
|
IF (LTOP.LE.LM1) GO TO 2002
|
|
WRITE(6,692) LTOP,LM1
|
|
692 FORMAT('0 * * * WARNING. POSSIBLE ERROR LTOP.GT.LMAX',2I6)
|
|
LTOP=LM1
|
|
2002 LMIN=MAX0(IABS(JA-JA1),IABS(JB-JB1))
|
|
QTOT2=0.
|
|
DO 2100 L=LMIN,LTOP
|
|
C FC=FCOEF(JA,JB,JA,JB,K,L)
|
|
FC=PARITY3(K)*FUNC(JA1)*DSQRT(FUNC(JB1)*FUNC(JB))*
|
|
1 THREEJ(JA,JA1,L)*THREEJ(JB,JB1,L)*SIXJ(JA,JB,JA1,JB1,K,L)
|
|
TERM=FC*QL(1,1,L+1)
|
|
2100 QTOT2=QTOT2-TERM
|
|
WRITE(6,602) QTOT2
|
|
602 FORMAT(11X,'***** PRESSURE BROADENING CROSS SECTION =',F12.4,
|
|
& ' ANG**2 *****')
|
|
2000 CONTINUE
|
|
C RESTORE QL(1,1,1)
|
|
QL(1,1,1)=Q0SAVE
|
|
RETURN
|
|
C ***** ITYPE = 5 *****
|
|
C Q(L,MA,MB) ACCESSED VIA IXQLF WHICH RETURNS INDEX IN QL.
|
|
C -1 RETURNED IF MISSING BY SYMMETRY RESTRICTION / 0 IF NOT FOUND
|
|
C FOLLOWING ASSUMED ABOUT TABLE.
|
|
C MA.GE.MB IN TABLE / TO REVERSE ORDER TAKE COMPLEX CONJUGATE
|
|
C IMAGINARY PART FOR L,MA,MB ASSUMED TO FOLLOW REAL PART IN TABLE.
|
|
C IF KA (KB) .NE. 0 THEN TERMS 2 (3) AND 4 WILL NOT BE PROCESSED.
|
|
C
|
|
5000 IF (LDIAG) GO TO 5901
|
|
WRITE(6,699)
|
|
699 FORMAT('0 *** NEW IOSPB NOT SUPPORTED FOR ITYPE=5 AND .NOT.LDIAG'
|
|
1 ,' --- REQUEST CANCELED.')
|
|
RETURN
|
|
5901 DO 5001 LN=1,NL
|
|
LVA=LINE((LN-1)*NPL+1)
|
|
LVB=LINE((LN-1)*NPL+2)
|
|
IF (EXISTS(LVA).AND.EXISTS(LVB)) GO TO 5002
|
|
WRITE(6,691) LN,LVA,LVB
|
|
GO TO 5001
|
|
5002 JA=JLEV(3*LVA-2)
|
|
KA=JLEV(3*LVA-1)
|
|
EPSA=PARITY3(JLEV(3*LVA))
|
|
IF (KA.EQ.0) EPSA=0.D0
|
|
XJA=JA
|
|
XKA=KA
|
|
KA2=2*KA
|
|
JB=JLEV(3*LVB-2)
|
|
KB=JLEV(3*LVB-1)
|
|
EPSB=PARITY3(JLEV(3*LVB))
|
|
IF (KB.EQ.0) EPSB=0.D0
|
|
XJB=JB
|
|
XKB=KB
|
|
KB2=2*KB
|
|
K=LTYPE(LN)
|
|
IF (K.LE.0) K=IABS(JA-JB)
|
|
WRITE(6,652) LN,LVA,LVB,JA,KA,EPSA,JB,KB,EPSB,K
|
|
652 FORMAT('0 LINE',I3,' BETWEEN LEVEL',2I4,5X,'(J, K, EPS =',2I4,F5.1
|
|
& ,' TO',2I4,F5.1,') PROCESSED FOR',
|
|
2 I4,'-POLE RADIATION.')
|
|
LTOP=2*MIN0(JA,JB)
|
|
QTOT2=0.D0
|
|
QTOTI=0.D0
|
|
FACT=-XNORM(EPSA)*XNORM(EPSB)*PARITY3(K+KA+KB)*FUNC(JA)*FUNC(JB)
|
|
DO 5100 L=IZERO,LTOP,2
|
|
SFACT=SIXJ(JA,JB,JA,JB,K,L)
|
|
IF (ABS(SFACT).LT.TOL) GO TO 5100
|
|
XL=L
|
|
C TERM 1 . . .
|
|
PF=(1.D0+EPSA*EPSA)*(1.D0+EPSB*EPSB)
|
|
TF=THRJ(XJA,XL,XJA,XKA,0D0,-XKA)*THRJ(XJB,XL,XJB,XKB,0D0,-XKB)
|
|
C HANDLE Q(0,0,0) -- I.E. QLOLD -- SEPARATELY.
|
|
IF (L.EQ.0) GO TO 5101
|
|
CALL IXQLF(LM,LMAX,L,IZERO,IZERO,IZERO,IX,IXQL,NIXQL,NQL)
|
|
IF (IX.EQ.0) WRITE(6,659) L,IZERO,IZERO,IZERO
|
|
659 FORMAT(' REQUESTED MISSING Q. L, MA, MB, CODE =',4I4)
|
|
IF (IX.LE.0) GO TO 5200
|
|
XXX=FACT*SFACT*PF*TF
|
|
ADDR=XXX*QL(1,1,IX)
|
|
QTOT2=QTOT2+ADDR
|
|
ADDI=0.D0
|
|
IF(LPRT)WRITE(6,657)L,IZERO,IZERO,XXX,ADDR,ADDI,QTOT2,QTOTI
|
|
657 FORMAT(' L, MA, MB =',3I3,' *', F12.5 ,' ADD(R/I) =',2F12.5,
|
|
& ' = ',2F12.5)
|
|
GO TO 5200
|
|
5101 ADDI=0.D0
|
|
XXX=FACT*SFACT*PF*TF
|
|
ADDR=XXX*QLOLD(1,1)
|
|
QTOT2=QTOT2+ADDR
|
|
IF(LPRT)WRITE(6,657)L,IZERO,IZERO,XXX,ADDR,ADDI,QTOT2,QTOTI
|
|
C TERM 2 . . .
|
|
5200 IF (EPSA.EQ.0.D0 .OR. KA2.GT.L) GO TO 5300
|
|
PF=2.D0*EPSA*(1.D0+EPSB*EPSB)
|
|
TF=THRJ(XJA,XL,XJA,-XKA,2.D0*XKA,-XKA)*
|
|
& THRJ(XJB,XL,XJB,XKB,0D0,-XKB)
|
|
CALL IXQLF(LM,LMAX,L,KA2,IZERO,IONE,IX,IXQL,NIXQL,NQL)
|
|
IF (IX.EQ.0) WRITE(6,659) L,KA2,IZERO,IONE
|
|
IF (IX.LE.0) GO TO 5300
|
|
XXX=FACT*SFACT*PF*TF
|
|
ADDR=XXX*QL(1,1,IX)
|
|
ADDI=XXX*QL(1,1,IX+1)
|
|
QTOT2=QTOT2+ADDR
|
|
QTOTI=QTOTI+ADDI
|
|
IF (LPRT)WRITE(6,657)L,KA2,IZERO,XXX,ADDR,ADDI,QTOT2,QTOTI
|
|
C TERM 3 . . .
|
|
5300 IF (EPSB.EQ.0.D0 .OR. KB2.GT.L) GO TO 5400
|
|
PF=2.D0*EPSB*(1.D0+EPSA*EPSA)
|
|
TF=THRJ(XJA,XL,XJA,XKA,0D0,-XKA)*
|
|
& THRJ(XJB,XL,XJB,-XKB,2.D0*XKB,-XKB)
|
|
CALL IXQLF(LM,LMAX,L,KB2,IZERO,IONE,IX,IXQL,NIXQL,NQL)
|
|
IF (IX.EQ.0) WRITE(6,659) L,IZERO,KB2,IONE
|
|
IF (IX.LE.0) GO TO 5400
|
|
XXX=FACT*SFACT*PF*TF
|
|
ADDR=XXX*QL(1,1,IX)
|
|
ADDI=-XXX*QL(1,1,IX+1)
|
|
QTOT2=QTOT2+ADDR
|
|
QTOTI=QTOTI+ADDI
|
|
IF(LPRT) WRITE(6,657) L,IZERO,KB2,XXX,ADDR,ADDI,QTOT2,QTOTI
|
|
C TERM 4 . . .
|
|
5400 IF (EPSA*EPSB.EQ.0.D0 .OR. KA2.GT.L .OR. KB2.GT.L) GO TO 5100
|
|
PF=4.D0*EPSA*EPSB
|
|
TF=THRJ(XJA,XL,XJA,-XKA,2.D0*XKA,-XKA)*
|
|
& THRJ(XJB,XL,XJB,-XKB,2.D0*XKB,-XKB)
|
|
IF (KA2-KB2) 5401,5402,5403
|
|
5401 CALL IXQLF(LM,LMAX,L,KA2,KB2,IONE,IX,IXQL,NIXQL,NQL)
|
|
IF (IX.EQ.0) WRITE(6,659) L,KA2,KB2,IONE
|
|
IF (IX.LE.0) GO TO 5100
|
|
XXX=FACT*SFACT*PF*TF
|
|
ADDR=XXX*QL(1,1,IX)
|
|
ADDI=XXX*QL(1,1,IX+1)
|
|
QTOT2=QTOT2+ADDR
|
|
QTOTI=QTOTI+ADDI
|
|
IF (LPRT) WRITE(6,657)L,KA2,KB2,XXX,ADDR,ADDI,QTOT2,QTOTI
|
|
GO TO 5100
|
|
5402 CALL IXQLF(LM,LMAX,L,KA2,KB2,IZERO,IX,IXQL,NIXQL,NQL)
|
|
IF (IX.EQ.0) WRITE(6,659) L,KA2,KB2,IZERO
|
|
IF (IX.LE.0) GO TO 5100
|
|
XXX=FACT*SFACT*PF*TF
|
|
ADDR=XXX*QL(1,1,IX)
|
|
QTOT2=QTOT2+ADDR
|
|
ADDI=0.D0
|
|
IF (LPRT) WRITE(6,657)L,KA2,KB2,XXX,ADDR,ADDI,QTOT2,QTOTI
|
|
GO TO 5100
|
|
5403 CALL IXQLF(LM,LMAX,L,KB2,KA2,IONE,IX,IXQL,NIXQL,NQL)
|
|
IF (IX.EQ.0) WRITE(6,659) L,KB2,KA2,IONE
|
|
IF (IX.LE.0) GO TO 5100
|
|
XXX=FACT*SFACT*PF*TF
|
|
ADDR=XXX*QL(1,1,IX)
|
|
ADDI=-XXX*QL(1,1,IX+1)
|
|
QTOT2=QTOT2+ADDR
|
|
QTOTI=QTOTI+ADDI
|
|
IF (LPRT) WRITE(6,657)L,KA2,KB2,XXX,ADDR,ADDI,QTOT2,QTOTI
|
|
5100 CONTINUE
|
|
WRITE(6,658) QTOT2,QTOTI
|
|
658 FORMAT(11X,'***** CROSS SECTION (A**2), REAL PART =',F12.4,5X,
|
|
& 'IMAG. PART =',F12.4)
|
|
5001 CONTINUE
|
|
C
|
|
RETURN
|
|
END
|
|
FUNCTION IPASYM(JI,NK,A)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C ROUTINE TO SET PARITY CODE FOR ASYMMETRIC TOP FUNCTIONS.
|
|
C
|
|
C IPASYM K-PAR +/- PAR
|
|
C 0 EVEN +
|
|
C 1 EVEN -
|
|
C 2 ODD +
|
|
C 3 ODD -
|
|
C
|
|
DIMENSION A(NK)
|
|
DATA EPS/1.D-4/
|
|
C
|
|
IPAR=-1
|
|
KPAR=-1
|
|
IF (NK.EQ.2*JI+1) GO TO 1000
|
|
1999 WRITE(6,699) JI,NK,(A(I),I=1,NK)
|
|
699 FORMAT('0 * * * ERROR. FOLLOWING SET OF ASYMMETRIC TOP COEFFICIEN
|
|
&TS ARE INVALID (PARITY).',2I6/(10X,6F12.8))
|
|
IPASYM=-1
|
|
RETURN
|
|
C NORMALIZE IF NECESSARY . . .
|
|
1000 XN=0.D0
|
|
DO 1100 I=1,NK
|
|
1100 XN=XN+A(I)*A(I)
|
|
IF (ABS(XN).GE.EPS) GO TO 1200
|
|
WRITE(6,602)
|
|
602 FORMAT('0 * * * ERROR. COEFFICIENTS CANNOT BE NORMALIZED.')
|
|
GO TO 1999
|
|
1200 XN=1.D0/SQRT(XN)
|
|
IF (ABS(XN-1.D0).LE.EPS) GO TO 2000
|
|
WRITE(6,601) XN
|
|
601 FORMAT(10X,'COEFFICIENTS NORMALIZED WITH FACTOR',D14.6)
|
|
2000 DO 2100 I=1,NK
|
|
2100 A(I)=A(I)*XN
|
|
C
|
|
NMID=JI+1
|
|
C DETERMINE EVEN/ODD K
|
|
LP=0
|
|
IF (ABS(A(NMID)).LE.EPS) GO TO 3100
|
|
KPAR=0
|
|
3100 IF (JI.LE.0) GO TO 4000
|
|
DO 3200 I=1,JI
|
|
LP=IABS(LP-1)
|
|
IF (ABS(A(NMID+I)).LE.EPS .AND. ABS(A(NMID-I)).LE.EPS)
|
|
& GO TO 3200
|
|
IF (KPAR.GE.0) GO TO 3300
|
|
KPAR=LP
|
|
GO TO 3200
|
|
3300 IF (KPAR.EQ.LP) GO TO 3200
|
|
KPAR=-1
|
|
GO TO 1999
|
|
3200 CONTINUE
|
|
C
|
|
C NOW DO +/- KPARITY . . .
|
|
4000 IF (ABS(A(NMID)).LE.EPS) GO TO 4100
|
|
IPAR=0
|
|
4100 IF (JI.LE.0) GO TO 5000
|
|
DO 4200 I=1,JI
|
|
IF (ABS(A(NMID-I)).GT.EPS) GO TO 4300
|
|
IF (ABS(A(NMID+I)).LE.EPS) GO TO 4200
|
|
IPAR=-1
|
|
GO TO 1999
|
|
4300 RATIO=A(NMID+I)/A(NMID-I)
|
|
IF (ABS(RATIO-1.D0).LE.EPS) GO TO 4400
|
|
IF (ABS(RATIO+1.D0).LE.EPS) GO TO 4500
|
|
IPAR=-1
|
|
GO TO 1999
|
|
4500 IF (IPAR) 4501,4502,4200
|
|
4501 IPAR=1
|
|
GO TO 4200
|
|
4502 IPAR=-1
|
|
GO TO 1999
|
|
4400 IF (IPAR) 4401,4200,4402
|
|
4401 IPAR=0
|
|
GO TO 4200
|
|
4402 IPAR=-1
|
|
GO TO 1999
|
|
4200 CONTINUE
|
|
C
|
|
5000 IF (KPAR.LT.0 .OR. IPAR.LT.0) GO TO 1999
|
|
IPASYM=2*KPAR+IPAR
|
|
RETURN
|
|
END
|
|
SUBROUTINE ISUTP(ISU,EN,JTL,JST,JT,NVC,NQL,QLS,QLT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION QLS(NVC,NVC),QLT(NVC,NVC,NQL)
|
|
IF (ISU.LE.0) RETURN
|
|
WRITE(ISU,3232) EN,JTL,JST,JT
|
|
3232 FORMAT(' ENERGY',F10.3,' JTOT',3I6)
|
|
WRITE(ISU,3233) ((QLS(IV,IVP),IV=1,NVC),IVP=1,NVC)
|
|
3233 FORMAT(1P,5D16.8)
|
|
WRITE(ISU,3233) (((QLT(IV,IVP,L),IV=1,NVC),IVP=1,NVC),L=1,NQL)
|
|
RETURN
|
|
END
|
|
SUBROUTINE IVCHK(IVLFL,IPRINT,ITYPE,NLABV,MXLAM,NPOTL,LAM)
|
|
DIMENSION LAM(1),NLABV(9)
|
|
C
|
|
C THIS ROUTINE CHECKS LAMBDA (MOLSCAT POTENTIAL SYMMETRY INDICES)
|
|
C TO ASCERTAIN WHETHER IV() INDEXING SCHEME ('NON-TRIVIAL' CASES)
|
|
C WILL WORK. IMPLEMENTATION BEGINNING V9 WILL **NOT** WORK
|
|
C PROPERLY IF TWO OF THE 'SYMMETRIES' ARE IDENTICAL.
|
|
C
|
|
C SINCE WE HAVE ACCESS TO ITYPE/NPOTL, WE COULD ALSO CHECK WHETHER
|
|
C NPOTL IS BIG ENOUGH; NOT DONE IN CURRENT CODE.
|
|
C
|
|
LOGICAL OKEY,LTEST
|
|
C
|
|
C CALLED FROM DRIVER AFTER BASIN(IOSBIN)/POTENL(INITIZATION)
|
|
C
|
|
IF (IVLFL.LE.0) THEN
|
|
IF (IPRINT.GE.3)
|
|
1 WRITE(6,*) ' IVCHK. IV() INDEXING IS NOT REQUESTED.'
|
|
RETURN
|
|
ENDIF
|
|
IF (MXLAM.LE.1) THEN
|
|
IF (IPRINT.GE.3) WRITE(6,*) ' IVCHK. NOT NEEDED, MXLAM.LE.1 '
|
|
RETURN
|
|
ENDIF
|
|
C
|
|
ITP=ITYPE-10*(ITYPE/10)
|
|
IF (ITP.EQ.0) THEN
|
|
WRITE(6,*) ' *** IVCHK. ILLEGAL ITYPE',ITYPE
|
|
STOP
|
|
ENDIF
|
|
NQ=NLABV(ITP)
|
|
OKEY=.TRUE.
|
|
DO 1000 I1=2,MXLAM
|
|
ITOP=I1-1
|
|
DO 1000 I2=1,ITOP
|
|
C LTEST IS TRUE IF LAM(,I1) IDENTICAL TO LAM(,I2)
|
|
C FALSE IF ANY INDICES DIFFER
|
|
LTEST=.TRUE.
|
|
DO 1100 N=1,NQ
|
|
1100 LTEST=LTEST.AND.LAM((I2-1)*NQ+N).EQ.LAM((I1-1)*NQ+N)
|
|
IF (.NOT.LTEST) GO TO 1000
|
|
C IF WE REACH CODE BELOW,TWO SETS OF INDICES ARE IDENTICAL
|
|
IF (OKEY) WRITE(6,600)
|
|
OKEY=.FALSE.
|
|
WRITE(6,601) I1,(LAM((I1-1)*NQ+N),N=1,NQ)
|
|
WRITE(6,601) I2,(LAM((I2-1)*NQ+N),N=1,NQ)
|
|
600 FORMAT('0 *** IVCHK. IV() INDEXING WILL NOT WORK. TERMINATING'/
|
|
1 ' *** IDENTICAL INDICES FOR TWO SYMMETRIES IN LAMBDA()'/
|
|
2 ' *** SYMMETRY/ INDICES')
|
|
601 FORMAT(9X,I5,10I6)
|
|
1000 CONTINUE
|
|
IF (OKEY) THEN
|
|
IF (IPRINT.GE.3) WRITE(6,*) ' IVCHK. COMPLETED SUCCESSFULLY.'
|
|
RETURN
|
|
ENDIF
|
|
STOP
|
|
END
|
|
SUBROUTINE J3J000(J2,J3,IVAL,W3J,J1MIN)
|
|
IMPLICIT DOUBLE PRECISION (A-H,J-M,O-Z)
|
|
DIMENSION W3J(1)
|
|
C
|
|
A(J1)=SQRT((J1*J1-DJ23S)*(J23P1S-J1*J1))
|
|
C
|
|
DATA ZERO/0.0D0/,ONE/1.0D0/,TWO/2.0D0/,HALF/0.5D0/,ONPO/1.1D0/,
|
|
$ MZERO/1.0D-34/,TENTH/0.1D0/
|
|
C
|
|
C THIS SUBROUTINE CALCULATES A SEQUENCE OF 3-J SYMBOLS FOR FIXED J2,
|
|
C J3, M2=M3=0 FOR J1MIN.LE.J1.LE.J1MAX USING THE RECURSIVE METHOD OF
|
|
C K. SCHULTEN AND R. G. GORDON, J. MATH. PHYS., VOL. 10, P. 1971,
|
|
C (1975). PROGRAMMED BY D. E. FITZ, 9/16/79.
|
|
C
|
|
C NOT TESTED FOR HALF-INTEGER QUANTUM NUMBERS.
|
|
C
|
|
JJ2P1=J2*(J2+ONE)
|
|
JJ3P1=J3*(J3+ONE)
|
|
DJ23S=(J2-J3)**2
|
|
J23P1S=(J2+J3+ONE)**2
|
|
J1MIN=ABS(J2-J3)
|
|
J1MAX=J2+J3
|
|
SGNV=J2-J3
|
|
SGN=ONE
|
|
IF(SGNV.LT.ZERO) SGN=-ONE
|
|
ISGN=INT(SGNV+SGN*TENTH)
|
|
SGN=ONE
|
|
IF(MOD(ISGN,2).NE.0) SGN=-ONE
|
|
IVAL=INT(J1MAX-J1MIN+TENTH)/2+1
|
|
C
|
|
C RIGHT RECURSION.
|
|
C
|
|
20 NMID=IVAL/2+1
|
|
W3J(1)=HALF
|
|
IF(IVAL.EQ.1) GO TO 40
|
|
J1=J1MIN
|
|
DO 21 IM2=2,NMID
|
|
J1=J1+TWO
|
|
21 W3J(IM2)=-A(J1-ONE)*W3J(IM2-1)/A(J1)
|
|
IF(IVAL.EQ.2) GO TO 40
|
|
SCALE=W3J(NMID)
|
|
C
|
|
C LEFT RECURSION.
|
|
C
|
|
30 W3J(IVAL)=HALF
|
|
J1=J1MAX
|
|
IEND=IVAL-NMID
|
|
DO 32 IM2=1,IEND
|
|
W3J(IVAL-IM2)=-A(J1)*W3J(IVAL-IM2+1)/A(J1-ONE)
|
|
32 J1=J1-TWO
|
|
C
|
|
C MATCH LEFT AND RIGHT RECURSIVE RESULTS BY SCALING.
|
|
C
|
|
31 SCALE=SCALE/W3J(NMID)
|
|
DO 33 IM2=NMID,IVAL
|
|
33 W3J(IM2)=SCALE*W3J(IM2)
|
|
C
|
|
C NORMALIZE RESULTS AND SET PHASE.
|
|
C
|
|
40 SUM=ZERO
|
|
DO 41 IM2=1,IVAL
|
|
J1=J1MIN+TWO*DBLE(IM2-1)
|
|
41 SUM=SUM+(TWO*J1+ONE)*W3J(IM2)**2
|
|
RNORM=ONE/SQRT(SUM)
|
|
IF((SGN*W3J(IVAL)).LT.ZERO) RNORM=-RNORM
|
|
DO 42 IM2=1,IVAL
|
|
42 W3J(IM2)=W3J(IM2)*RNORM
|
|
RETURN
|
|
END
|
|
SUBROUTINE J6J(J2,J3,L1,L2,L3,IVAL,J1MIN,D6J)
|
|
IMPLICIT DOUBLE PRECISION (A-H,J-Z)
|
|
DIMENSION D6J(2)
|
|
DATA ZERO/0.D0/,TENTH/0.1D0/,HALF/0.5D0/,ONE/1.D0/,TWO/2.D0/,
|
|
$ CONST/1.0D-12/
|
|
E(J1S)=SQRT((J1S-MJ23S)*(J23P1S-J1S)*(J1S-ML23S)*(L23P1S-J1S))
|
|
F(J1,JJP1)=(TWO*J1+ONE)*(JJP1*(FACT-JJP1-TWO*LLP1)+FACT2)
|
|
C
|
|
C THIS ROUTINE CALCULATES THE 6-J COEFFICIENTS FOR ALL PERMISSIBLE
|
|
C VALUES OF J1 FOR FIXED VALUES OF J2, J3, L1, L2, AND L3 USING THE
|
|
C RECURSIVE ALGORITHM OF K. SCHULTEN AND R. G. GORDON, J. MATH. PHYS.
|
|
C VOL. 16, P. 1961, (1975).
|
|
C PROGRAMMED BY D. E. FITZ, 10/22/79
|
|
C MODIFIED BY S. GREEN 20 AUG 93 TO TEST DIMENSION ON D6J
|
|
C
|
|
MXDIM=IVAL
|
|
JJP2=J2*(J2+ONE)
|
|
JJP3=J3*(J3+ONE)
|
|
LLP1=L1*(L1+ONE)
|
|
LLP2=L2*(L2+ONE)
|
|
LLP3=L3*(L3+ONE)
|
|
MJ23S=(J2-J3)**2
|
|
ML23S=(L2-L3)**2
|
|
J23P1S=(J2+J3+ONE)**2
|
|
L23P1S=(L2+L3+ONE)**2
|
|
FACT2=(LLP2-LLP3)*(JJP2-JJP3)
|
|
FACT=JJP2+JJP3+LLP2+LLP3
|
|
J1MIN=MAX(ABS(J2-J3),ABS(L2-L3))
|
|
J1MAX=MIN(J2+J3,L2+L3)
|
|
IVAL=INT(J1MAX-J1MIN+ONE+TENTH)
|
|
IF (IVAL.GT.MXDIM) THEN
|
|
WRITE(6,*) 'J6J: ARRAY D6J TOO SMALL. NEEDS ',IVAL,' BUT ONLY ',
|
|
1 MXDIM,' SUPPLIED'
|
|
STOP
|
|
ENDIF
|
|
C
|
|
C TEST FOR OTHER TRIANGULAR INEQUALITES.
|
|
C
|
|
IL1=INT(TWO*L1+TENTH)
|
|
IL2=INT(TWO*L2+TENTH)
|
|
IL3=INT(TWO*L3+TENTH)
|
|
IJ2=INT(TWO*J2+TENTH)
|
|
IJ3=INT(TWO*J3+TENTH)
|
|
IF((IJ2.LE.IL1+IL3.AND.IJ2.GE.IABS(IL1-IL3)).AND.
|
|
$ (IJ3.LE.IL1+IL2.AND.IJ3.GE.IABS(IL1-IL2))) GO TO 11
|
|
DO 12 I=1,IVAL
|
|
12 D6J(I)=ZERO
|
|
RETURN
|
|
C
|
|
11 INMID=(IVAL+3)/2
|
|
SGNV=J2+J3+L2+L3
|
|
SGN=ONE
|
|
ISIGN=INT(SGNV+TENTH)
|
|
IF(MOD(ISIGN,2).NE.0) SGN=-ONE
|
|
D6J(1)=HALF
|
|
C
|
|
C UPWARD RECURSION.
|
|
C
|
|
IF(IVAL.EQ.1) GO TO 40
|
|
JJP1=J1MIN*(J1MIN+ONE)
|
|
F1=F(J1MIN,JJP1)
|
|
J1=J1MIN+ONE
|
|
J1S=J1*J1
|
|
E2=E(J1S)
|
|
IF(J1MIN.LT.TENTH) GO TO 15
|
|
D6J(2)=-F1*D6J(1)/(E2*J1MIN)
|
|
GO TO 16
|
|
15 D6J(2)=-HALF*(LLP2+JJP2-LLP1)*D6J(1)/SQRT(JJP2*LLP2)
|
|
16 SCALE=D6J(2)
|
|
IF(IVAL.EQ.2) GO TO 40
|
|
DO 21 IJ2=3,INMID
|
|
JJP1=J1*(J1+ONE)
|
|
F1=F(J1,JJP1)
|
|
J1=J1+ONE
|
|
E1=E2
|
|
J1S=J1*J1
|
|
E2=E(J1S)
|
|
21 D6J(IJ2)=-(F1*D6J(IJ2-1)+J1*E1*D6J(IJ2-2))/(E2*(J1-ONE))
|
|
SCALE=D6J(INMID)
|
|
IEXC=5
|
|
IF(ABS(SCALE).GT.CONST) GO TO 18
|
|
INMID=INMID-1
|
|
SCALE=D6J(INMID)
|
|
IEXC=3
|
|
GO TO 30
|
|
18 IF(IVAL.EQ.3) GO TO 40
|
|
C
|
|
C DOWNWARD RECURSION.
|
|
C
|
|
30 D6J(IVAL)=HALF
|
|
J1=J1MAX
|
|
J1S=J1*J1
|
|
JJP1=J1*(J1+ONE)
|
|
F1=F(J1,JJP1)
|
|
E1=E(J1S)
|
|
D6J(IVAL-1)=-F1*D6J(IVAL)/(E1*(J1+ONE))
|
|
IEND=IVAL-INMID
|
|
IF(IVAL.LE.IEXC) GO TO 31
|
|
DO 32 IJ2=2,IEND
|
|
J1=J1-ONE
|
|
E2=E1
|
|
J1S=J1*J1
|
|
JJP1=J1*(J1+ONE)
|
|
E1=E(J1S)
|
|
F1=F(J1,JJP1)
|
|
32 D6J(IVAL-IJ2)=-(J1*E2*D6J(IVAL-IJ2+2)+F1*D6J(IVAL-IJ2+1))/
|
|
$ (E1*(J1+ONE))
|
|
C
|
|
C MATCH UPWARD AND DOWNWARD RECURSIVE RESULTS BY SCALING.
|
|
C
|
|
31 SCALE=SCALE/D6J(INMID)
|
|
DO 33 IJ2=INMID,IVAL
|
|
33 D6J(IJ2)=SCALE*D6J(IJ2)
|
|
C
|
|
C NORMALIZE RESULTS AND SET PHASE.
|
|
C
|
|
40 SUM=ZERO
|
|
DO 41 IJ2=1,IVAL
|
|
J1=J1MIN+DBLE(IJ2-1)
|
|
41 SUM=SUM+(TWO*J1+ONE)*D6J(IJ2)**2
|
|
RNORM=ONE/SQRT(SUM*(TWO*L1+ONE))
|
|
IF((SGN*D6J(IVAL)).LT.ZERO) RNORM=-RNORM
|
|
DO 42 IJ2=1,IVAL
|
|
42 D6J(IJ2)=D6J(IJ2)*RNORM
|
|
RETURN
|
|
END
|
|
SUBROUTINE J6TO4(NLEV,JLEV,ATAU,JLNW,NAVAIL,ELEVNW,JLEVNW)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION JLEV(1),ATAU(1),JLNW(NAVAIL),ELEVNW(MXEL),JLEVNW(MXJL)
|
|
|
|
C CMBASE FOR VERSION 14 (AUG 94)
|
|
DIMENSION BE(2),ALPHAE(2),DE(2)
|
|
EQUIVALENCE (BE(1),AAE(1)), (ALPHAE(1),BBE(1)), (DE(1),CCE(1))
|
|
COMMON /CMBASE/ AAE(2),BBE(2),CCE(2),ROTI(6),ELEVEL(1000),EMAX,
|
|
1 WT(2),SPNUC,NLEVEL,JLEVEL(4000),JMIN,JMAX,JSTEP,ISYM(10),
|
|
2 J2MIN,J2MAX,J2STEP,ISYM2(10),JHALF,IDENT,MXJL,MXEL
|
|
C
|
|
C WE MUST BE ABLE TO GET J2 FROM J2MIN,J2MAX,J2STEP
|
|
C AND CALCULATE LINEAR ROTOR ENERGY FROM BE(2)
|
|
WRITE(6,641) J2MIN,J2MAX,J2STEP
|
|
641 FORMAT(/' *** J6TO4. COMBINING ASYMMETRIC ROTOR AND LINEAR ROTOR'
|
|
1 /' LINEAR ROTOR LEVELS FROM J2MIN =',I3,
|
|
2 ', J2MAX =',I3,', J2STEP =',I2)
|
|
J2MIN=MAX0(J2MIN,0)
|
|
J2MAX=MAX0(J2MAX,J2MIN)
|
|
J2STEP=MAX0(J2STEP,1)
|
|
IF (BE(2).LE.0.D0) THEN
|
|
IF (J2MAX.EQ.0) THEN
|
|
C SET ARBITRARY BE(2) SINCE ENERGY WILL ALWAYS BE ZERO
|
|
BE(2)=1.D0
|
|
ELSE
|
|
WRITE(6,*) ' *** SET4/J6TO4. CANNOT OBTAIN LINEAR ROTOR',
|
|
1 ' ENERGY FROM BE(2)'
|
|
STOP
|
|
ENDIF
|
|
ENDIF
|
|
WRITE(6,644) BE(2)
|
|
644 FORMAT(/' LINEAR ROTOR ENERGY LEVELS COMPUTED FROM B(E) =',F12.6)
|
|
IF (ALPHAE(2).NE.0.D0) WRITE(6,645) ALPHAE(2)
|
|
645 FORMAT(27X,'CORRECTED FOR ALPHA(E) = ',F12.8)
|
|
IF (DE(2).NE.0.D0) WRITE(6,646) DE(2)
|
|
646 FORMAT(27X,'CORRECTED FOR D(E) = ',F12.8)
|
|
IF (EMAX.GT.0.D0) WRITE(6,648) EMAX
|
|
648 FORMAT(/' ENERGY CAP ON BASIS FUNCTIONS IS EMAX =',F14.4)
|
|
C
|
|
C NLNW COUNTS NEW 'NLEVEL'; INEW COUNTS NEW 'NLEV'
|
|
MINA=9999999
|
|
MAXA=0
|
|
INEW=0
|
|
NLNW=0
|
|
ITOP=0
|
|
NKVAL=0
|
|
MXNEW=NAVAIL/8
|
|
C LOOP OVER ITYPE=6 FORMAT IN JLEV(NLEV,6)
|
|
JMIN=9999999
|
|
JMAX=0
|
|
DO 1000 IOLD=1,NLEV
|
|
J1=JLEV(IOLD)
|
|
ITAU=JLEV(NLEV+IOLD)
|
|
IPAR=JLEV(2*NLEV+IOLD)
|
|
ISTA=JLEV(3*NLEV+IOLD)
|
|
NK=JLEV(4*NLEV+IOLD)
|
|
MINA=MIN(MINA,ISTA+1)
|
|
MAXA=MAX(MAXA,ISTA+NK)
|
|
NKVAL=NKVAL+NK
|
|
INDX=JLEV(5*NLEV+IOLD)
|
|
IF (INDX.NE.IOLD) WRITE(6,690) INDX,IOLD
|
|
690 FORMAT(' *** J6TO4. PROBABLY ERROR. INDX.NE.I',2I6)
|
|
C EXPAND ON J2
|
|
DO 2000 J2=J2MIN,J2MAX,J2STEP
|
|
FJ=DBLE(J2)
|
|
FJ=FJ*(FJ+1.D0)
|
|
E2=(BE(2)-ALPHAE(2)*0.5D0)*FJ - DE(2)*FJ*FJ
|
|
EN=ELEVEL(INDX) + E2
|
|
IF (EMAX.GT.0.D0 .AND. EN.GT.EMAX) GO TO 2000
|
|
NLNW=NLNW+1
|
|
IF (NLNW.GT.MXEL) THEN
|
|
WRITE(6,*) ' *** J6TO4. NUMBER LEVELS EXCEEDS MXEL',MXEL
|
|
STOP
|
|
ENDIF
|
|
ELEVNW(NLNW)=EN
|
|
JLEVNW(3*NLNW-2)=J1
|
|
JLEVNW(3*NLNW-1)=ITAU
|
|
JLEVNW(3*NLNW)=J2
|
|
IF (JLEVEL(2*INDX-1).NE.J1 .OR. JLEVEL(2*INDX).NE.ITAU) THEN
|
|
WRITE(6,*) ' *** J6TO4. INCOMPATIBLE JLEVEL(), JLEV() FOR'
|
|
WRITE(6,*) ' LEVEL',INDX
|
|
ENDIF
|
|
C EXPAND J1+J2 TO J12; NEED TO SET JMIN,JMAX TO MIN/MAX OF J12
|
|
C FOR USE IN PICKING ORBITAL MOMENTA FOR A GIVEN JTOT
|
|
DO 3000 J12=ABS(J1-J2),J1+J2
|
|
INEW=INEW+1
|
|
IF (INEW.GT.MXNEW) THEN
|
|
WRITE(6,*) ' *** J6TO4. SCRATCH SPACE EXCEEDED FOR BASIS NO.'
|
|
1 ,INEW
|
|
STOP
|
|
ENDIF
|
|
JLNW(ITOP+1)=J12
|
|
JLNW(ITOP+2)=J2
|
|
JLNW(ITOP+3)=J1
|
|
JLNW(ITOP+4)=ITAU
|
|
JLNW(ITOP+5)=IPAR
|
|
JLNW(ITOP+6)=ISTA
|
|
JLNW(ITOP+7)=NK
|
|
JLNW(ITOP+8)=NLNW
|
|
JMIN=MIN(JMIN,J12)
|
|
JMAX=MAX(JMAX,J12)
|
|
3000 ITOP=ITOP+8
|
|
2000 CONTINUE
|
|
1000 CONTINUE
|
|
C
|
|
C COPY JLEVNW,ELEVNW BACK TO JLEVEL,ELEVEL
|
|
DO 4000 I=1,NLNW
|
|
ELEVEL(I)=ELEVNW(I)
|
|
JLEVEL(3*I-2)=JLEVNW(3*I-2)
|
|
JLEVEL(3*I-1)=JLEVNW(3*I-1)
|
|
4000 JLEVEL(3*I)=JLEVNW(3*I)
|
|
C SHIFT ATAU UP TO REFLECT START AT 6*NLEV+1 TO 8*INEW+1
|
|
IF (NKVAL.NE.MAXA-MINA+1)
|
|
1 WRITE(6,*) ' POSSIBLE ERROR. MINA,MAXA,NKVAL',MINA,MAXA,NKVAL
|
|
MOVE=8*INEW-6*NLEV
|
|
DO 4500 I=1,NKVAL
|
|
4500 ATAU(8*INEW+NKVAL+1-I)=ATAU(6*NLEV+NKVAL+1-I)
|
|
C SHIFT ISTA (JLNW(6,I)) TO REFLECT MOVED ATAU
|
|
IX=6
|
|
DO 4600 I=1,INEW
|
|
JLNW(IX)=JLNW(IX)+MOVE
|
|
4600 IX=IX+8
|
|
C RESET NLEV; COPY JLNW TO JLEV, CORRECTING ORDER
|
|
NLEV=INEW
|
|
ITOP=0
|
|
DO 5000 I=1,NLEV
|
|
IX=I
|
|
DO 5100 II=1,8
|
|
ITOP=ITOP+1
|
|
JLEV(IX)=JLNW(ITOP)
|
|
5100 IX=IX+NLEV
|
|
5000 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE J9J(J1,J2,J4,J5,J6,J7,J8,J9,IVAL,J3MIN,D9J)
|
|
IMPLICIT DOUBLE PRECISION (A-H,J-Z)
|
|
DIMENSION D9J(1),D6J3(200),D6J5(200),D6J7(200)
|
|
DATA MXDIM6/200/
|
|
DATA ZERO/0.D0/,TENTH/0.1D0/,HALF/0.5D0/,ONE/1.D0/,TWO/2.D0/
|
|
C
|
|
C THIS ROUTINE CALCULATES THE 9-J SYMBOLS BY SUMMATION OVER 6-J
|
|
C SYMBOLS WHICH IN TURN ARE CALCULATED BY THE RECURSIVE METHOD
|
|
C OF SCHULTEN AND GORDON.
|
|
C PROGRAMMED BY D. E. FITZ, 22 OCT 79.
|
|
C
|
|
C MODIFIED BY M. L. DUBERNET, 15 SEP 93 AND J. M. HUTSON, 3 OCT 93
|
|
C TO ALLOW HALF-INTEGER ANGULAR MOMENTA
|
|
C MODIFIED BY J. M. HUTSON, 3 OCT 93 TO CHECK D9J DIMENSION
|
|
C
|
|
MXDIM9=IVAL
|
|
J3MIN=MAX(ABS(J1-J2),ABS(J6-J9))
|
|
J3MAX=MIN(J1+J2,J6+J9)
|
|
IJ3N=INT(TWO*J3MIN+TENTH)
|
|
IJ3X=INT(TWO*J3MAX+TENTH)
|
|
IVAL=1+(IJ3X-IJ3N)/2
|
|
IF(IVAL.GT.MXDIM9) THEN
|
|
WRITE(6,*) 'J9J: ARRAY D9J TOO SMALL. NEEDS ',IVAL,' BUT ONLY ',
|
|
1 MXDIM9,' SUPPLIED'
|
|
STOP
|
|
ENDIF
|
|
C
|
|
C TEST FOR TRIANGULAR INEQUALITIES.
|
|
C
|
|
D9J(1)=ZERO
|
|
IF (IVAL.LE.0) RETURN
|
|
IJ1=INT(TWO*J1+TENTH)
|
|
IJ2=INT(TWO*J2+TENTH)
|
|
IJ4=INT(TWO*J4+TENTH)
|
|
IJ5=INT(TWO*J5+TENTH)
|
|
IJ6=INT(TWO*J6+TENTH)
|
|
IJ7=INT(TWO*J7+TENTH)
|
|
IJ8=INT(TWO*J8+TENTH)
|
|
IJ9=INT(TWO*J9+TENTH)
|
|
DO 15 IJL=1,IVAL
|
|
15 D9J(IJL)=ZERO
|
|
IF((IJ4-IABS(IJ7-IJ1))*(IJ7+IJ1-IJ4).LT.0) RETURN
|
|
IF((IJ5-IABS(IJ8-IJ2))*(IJ8+IJ2-IJ5).LT.0) RETURN
|
|
IF((IJ5-IABS(IJ6-IJ4))*(IJ6+IJ4-IJ5).LT.0) RETURN
|
|
IF((IJ8-IABS(IJ9-IJ7))*(IJ9+IJ7-IJ8).LT.0) RETURN
|
|
C
|
|
IVAL7=MXDIM6
|
|
CALL J6J(J1,J9,J7,J8,J4,IVAL7,JMIN7,D6J7)
|
|
C
|
|
IVAL5=MXDIM6
|
|
CALL J6J(J6,J2,J5,J8,J4,IVAL5,JMIN5,D6J5)
|
|
C
|
|
JMIN=MAX(JMIN5,JMIN7)
|
|
JMAX=MIN(J1+J9,J2+J6,J4+J8)
|
|
IEND=INT(JMAX-JMIN+TENTH+ONE)
|
|
I5=INT(JMIN-JMIN5+TENTH)
|
|
I7=INT(JMIN-JMIN7+TENTH)
|
|
C
|
|
C LOOP RUNS OVER TWICE J3 TO ALLOW HALF-INTEGER VALUES
|
|
C
|
|
ITAB=0
|
|
DO 20 IJ3=IJ3N,IJ3X,2
|
|
ITAB=ITAB+1
|
|
J3=HALF*DBLE(IJ3)
|
|
C
|
|
IVAL3=MXDIM6
|
|
CALL J6J(J1,J9,J3,J6,J2,IVAL3,JMIN3,D6J3)
|
|
I3=INT(JMIN-JMIN3+TENTH)
|
|
SUM=ZERO
|
|
C
|
|
DO 10 I=1,IEND
|
|
J=DBLE(I-1)+JMIN
|
|
SGN=ONE
|
|
ISIGN=INT(TWO*J+TENTH)
|
|
IF(MOD(ISIGN,2).NE.0) SGN=-ONE
|
|
SUM=SUM+(TWO*J+ONE)*SGN*D6J3(I+I3)*D6J5(I+I5)*D6J7(I+I7)
|
|
10 CONTINUE
|
|
D9J(ITAB)=SUM
|
|
20 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE KSYM(AK,N)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION AK(N,N)
|
|
DO 10 I=1,N
|
|
DO 10 J=1,I
|
|
TMP=0.5D0*(AK(I,J)+AK(J,I))
|
|
AK(I,J)=TMP
|
|
AK(J,I)=TMP
|
|
10 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE KTOS(R,SR,SI,NOP)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION R(1),SR(1),SI(1)
|
|
C
|
|
C ROUTINE TO OBTAIN THE S MATRIX FROM THE REACTANCE (K) MATRIX
|
|
C ALTHOUGH THIS ROUTINE USES SYMMETRIC MATRIX MULTIPLICATION,
|
|
C THE WHOLE OF R MUST BE SUPPLIED AND THE WHOLE OF SR AND
|
|
C SI ARE RETURNED.
|
|
C
|
|
C I + R*R IS POSITIVE DEFINITE, SO SYMINV CANNOT FAIL
|
|
C
|
|
NOPP1=NOP+1
|
|
NOPSQ=NOP*NOP
|
|
CALL DSYMM('L','L',NOP,NOP,0.5D0,R,NOP,R,NOP,0.D0,SR,NOP)
|
|
DO 10 II=1,NOPSQ,NOPP1
|
|
10 SR(II)=SR(II)+0.5D0
|
|
CALL SYMINV(SR,NOP,NOP,IFAIL)
|
|
CALL DSYFIL('U',NOP,SR,NOP)
|
|
CALL DSYMM('L','L',NOP,NOP,1.D0,SR,NOP,R,NOP,0.D0,SI,NOP)
|
|
DO 30 II=1,NOPSQ,NOPP1
|
|
30 SR(II)=SR(II)-1.D0
|
|
RETURN
|
|
END
|
|
SUBROUTINE LDPROP(U,Z,N,RBEGIN,REND,NSTEP,
|
|
X ESHIFT,IREAD,IWRITE,ISCRU,
|
|
X P,VL,IV,ERED,EINT,CENT,RMLMDA,DG,MXLAM,NPOTL,ISTART,NODES)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
LOGICAL IREAD,IWRITE
|
|
DIMENSION U(N,N),Z(N,N),P(MXLAM),VL(2),IV(2),EINT(N),CENT(N),DG(N)
|
|
C
|
|
H = (REND-RBEGIN)/DBLE(2*NSTEP)
|
|
D1 = H*H/3.D0
|
|
D2 = 2.D0*D1
|
|
D4 = -D1/16.D0
|
|
R = RBEGIN
|
|
NODES=0
|
|
IF( .NOT. IREAD) GO TO 100
|
|
READ(ISCRU) U
|
|
DO 90 I = 1,N
|
|
90 U(I,I)=U(I,I)-ESHIFT
|
|
GO TO 110
|
|
100 CALL WAVMAT(U,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DG,MXLAM,NPOTL)
|
|
IF(IWRITE) WRITE(ISCRU) U
|
|
C
|
|
110 IF(ISTART.EQ.1) GO TO 135
|
|
SGN=1.D0
|
|
IF(REND.LT.RBEGIN) SGN=-1.D0
|
|
DO 130 J = 1,N
|
|
DO 120 I = J,N
|
|
120 Z(I,J) = 0.D0
|
|
Z(J,J) = SGN*1.D30
|
|
130 IF(U(J,J).GT.0.D0) Z(J,J) = SGN*SQRT(U(J,J))
|
|
135 CONTINUE
|
|
C
|
|
DO 150 J = 1,N
|
|
DO 140 I = J,N
|
|
140 Z(I,J) = H*Z(I,J)+D1*U(I,J)
|
|
150 Z(J,J) = 1.D0+Z(J,J)
|
|
C
|
|
DO 260 ISTEP = 1,NSTEP
|
|
R = R+H
|
|
IF( .NOT. IREAD) GO TO 160
|
|
READ(ISCRU) U
|
|
ESH=-D4*ESHIFT
|
|
DO 155 I=1,N
|
|
155 U(I,I)=U(I,I)+ESH
|
|
GO TO 190
|
|
160 CALL WAVMAT(U,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DG,MXLAM,NPOTL)
|
|
DO 180 J = 1,N
|
|
DO 170 I = J,N
|
|
170 U(I,J) = D4*U(I,J)
|
|
180 U(J,J) = 0.125D0+U(J,J)
|
|
IF(IWRITE) WRITE(ISCRU) U
|
|
190 CALL SYMINV(U,N,N,NCU)
|
|
IF(NCU.GT.N) GO TO 900
|
|
CALL SYMINV(Z,N,N,NCZ)
|
|
IF(NCZ.GT.N) GO TO 900
|
|
NODES=NODES+NCZ
|
|
DO 210 J = 1,N
|
|
DO 200 I = J,N
|
|
200 Z(I,J) = U(I,J)-Z(I,J)
|
|
210 Z(J,J) = Z(J,J)-6.D0
|
|
CALL SYMINV(Z,N,N,NCZ)
|
|
IF(NCZ.GT.N) GO TO 900
|
|
NODES=NODES+NCZ-NCU
|
|
R = R+H
|
|
IF(ISTEP.EQ.NSTEP) D2=D1
|
|
IF( .NOT. IREAD) GO TO 220
|
|
READ(ISCRU) U
|
|
ESH=-D2*ESHIFT
|
|
DO 215 I=1,N
|
|
215 U(I,I)=U(I,I)+ESH
|
|
GO TO 245
|
|
220 CALL WAVMAT(U,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DG,MXLAM,NPOTL)
|
|
DO 240 I=1,N
|
|
DO 230 J=1,I
|
|
230 U(I,J)=D2*U(I,J)
|
|
240 U(I,I)=U(I,I)+2.D0
|
|
IF(IWRITE) WRITE(ISCRU) U
|
|
245 DO 250 J = 1,N
|
|
DO 250 I = J,N
|
|
250 Z(I,J) = U(I,J)-Z(I,J)
|
|
260 CONTINUE
|
|
C
|
|
HI = 1.D0/H
|
|
DO 280 J = 1,N
|
|
DO 270 I = J,N
|
|
Z(I,J) = HI*Z(I,J)
|
|
270 Z(J,I) = Z(I,J)
|
|
280 Z(J,J) = Z(J,J)-HI
|
|
RETURN
|
|
C
|
|
900 WRITE(6,901)
|
|
901 FORMAT('0 *** ERROR IN SYMINV CALLED FROM LDPROP - TERMINATING')
|
|
STOP
|
|
END
|
|
SUBROUTINE LDVIVS(N,NSQ,MXLAM,NPOTL,
|
|
1 SR,SI,W,VL,IVL,EINT,CENT,WV,L,NB,
|
|
2 P,A1,A1P,B1,B1P,
|
|
3 WKS,G1,G1P,G2,G2P,COSX,SINX,SINE,DIAG,XK,XSQ,
|
|
4 TSTORE,W0,W1,W2,EYE11,EYE12,EYE22,VEC,
|
|
5 ICODE,IPRINT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C ***
|
|
C *** INTERFACE TO VIVAS/LDPROP
|
|
C *** -------------------------------------------------------------
|
|
C *** ADAPTED FROM PROGRAMS OF G.A. PARKER, J.V. LILL, & J.C. LIGHT
|
|
C *** REF.: N.R.C.C. SOFTWARE CATALOG, VOL. 1, PROG. NO. KQ04, 1980.
|
|
C *** -------------------------------------------------------------
|
|
C *** ICODE.EQ.2 FOR SUBSEQUENT ENERGY.
|
|
C ***
|
|
DIMENSION SR(NSQ),SI(NSQ),W(NSQ),VL(2),IVL(2),
|
|
1 EINT(N),CENT(N),WV(N),L(N),NB(N),
|
|
2 P(MXLAM),A1(N),A1P(N),B1(N),B1P(N),
|
|
3 WKS(N),G1(N),G1P(N),G2(N),G2P(N),
|
|
4 COSX(N),SINX(N),SINE(N),DIAG(N),XK(N),XSQ(N),
|
|
5 TSTORE(NSQ),W0(NSQ),W1(NSQ),W2(NSQ),
|
|
6 EYE11(NSQ),EYE12(NSQ),EYE22(NSQ),VEC(NSQ)
|
|
C
|
|
COMMON/DRIVE/STEST,STEPS,STABIL,CONV,RMIN,RMAX,XEPS,DR,
|
|
1 DRMAX,RVIVAS,TOLHI,RTURN,VTOL,ESHIFT,ERED,RMLMDA,
|
|
2 NOPEN,JKEEP,ISCRU,MAXSTP
|
|
C
|
|
LOGICAL IALFP,IV,IVP,IVPP,ISHIFT,IDIAG,IPERT,ISYM,IREAD,IWRITE
|
|
COMMON /LDVVCM/ XSQMAX,ALPHA1,ALPHA2,IALPHA,IALFP,IV,IVP,
|
|
1 NUMDER,IVPP,ISHIFT,IDIAG,IPERT,ISYM,IREAD,IWRITE
|
|
C
|
|
C LOGICAL VARIABLES
|
|
LOGICAL LLD,LVIVS
|
|
C
|
|
C-----------------------------------------------------------------
|
|
C SET UP TO USE UNIT (ISCRU)
|
|
IREAD = ICODE.EQ.2 .AND. ISCRU.GT.0
|
|
IWRITE = ICODE.EQ.1 .AND. ISCRU.GT.0
|
|
C-------------------------------------------------------------------
|
|
IF(IWRITE) WRITE(ISCRU) RMIN,RVIVAS,RMAX
|
|
IF(IREAD) READ (ISCRU) RMIN,RVIVAS,RMAX
|
|
C
|
|
C DECIDE WHICH CALCULATIONS (LDPROP/VIVAS) ARE DESIRED
|
|
C
|
|
LLD= RMIN.LT.RVIVAS
|
|
LVIVS= RMAX.GT.RVIVAS
|
|
IF (LLD.OR.LVIVS) GO TO 130
|
|
WRITE(6,699) RMIN,RVIVAS,RMAX
|
|
699 FORMAT('0 * * * ERROR. NULL CALCULATION REQUESTED.'/
|
|
& ' RMIN, RVIVAS, RMAX =',3E14.4)
|
|
STOP
|
|
C
|
|
130 RMID=MIN(RMAX,RVIVAS)
|
|
RMID=MAX(RMIN,RMID)
|
|
C
|
|
C CALCULATE WAVEVECTORS, AND STEP SIZE FOR LDPROP
|
|
C
|
|
BIG=0.D0
|
|
NOPEN=0
|
|
DO 190 I=1,N
|
|
DIF=ERED-EINT(I)
|
|
WV(I)=SIGN(SQRT(ABS(DIF)),DIF)
|
|
BIG=MAX(BIG,WV(I))
|
|
NB(I)=I
|
|
190 IF(DIF.GT.0.D0) NOPEN=NOPEN+1
|
|
IF(NOPEN.LE.0) RETURN
|
|
IF(IREAD) THEN
|
|
READ(ISCRU) NSTEP
|
|
ELSE
|
|
NSTEP=BIG*STEPS*(RMID-RMIN)/ACOS(-1.D0)
|
|
IF(IWRITE) WRITE(ISCRU) NSTEP
|
|
ENDIF
|
|
LLD = LLD .AND. NSTEP.GT.0
|
|
C-------------------------------------------------------------------
|
|
C PROPAGATE THE LOG-DERIVATIVE MATRIX THROUGH THE SCATTERING REGION
|
|
IF (.NOT.LLD) GO TO 200
|
|
CALL LDPROP(W,SR,N,RMIN,RMID,NSTEP,
|
|
& ESHIFT,IREAD,IWRITE,ISCRU,
|
|
& P,VL,IVL,ERED,EINT,CENT,RMLMDA,A1,MXLAM,NPOTL,0,NODES)
|
|
IF(IPRINT.GE.3) WRITE(6,195) RMIN,RMID,NSTEP
|
|
195 FORMAT('0 LDPROP. LOG DERIVATIVE MATRIX INTEGRATED FROM ',
|
|
& F12.4,' TO ',F12.4,' IN ',I6,' STEPS.')
|
|
200 IF (.NOT.LVIVS) GO TO 210
|
|
C GET R-MATRIX BY INVERTING LOGD OR BY DIRECT INITIALIZATION
|
|
IF (LLD) THEN
|
|
CALL SYMINV(SR,N,N,IFAIL)
|
|
CALL DSYFIL('U',N,SR,N)
|
|
ELSE
|
|
N1=N+1
|
|
DO 170 I=1,NSQ
|
|
170 SR(I)=0.D0
|
|
DO 180 I=1,NSQ,N1
|
|
180 SR(I)=1.D30
|
|
ENDIF
|
|
DRNOW=DR
|
|
C SET TLDIAG/TOFF FROM TOLHI. C.F. NRCC DEFAULTS OF .064
|
|
TLDIAG=.064D0*SQRT(TOLHI/.001D0)
|
|
TOFF=TLDIAG
|
|
CALL VIVAS(N,NSQ,DRNOW,RMID,RMAX,DRMAX,TLDIAG,TOFF,ESHIFT,
|
|
& SR,EYE11,EYE12,EYE22,W,W0,W1,W2,TSTORE,VEC,SI,
|
|
& G1,G1P,G2,G2P,A1,A1P,B1,B1P,XSQ,XK,COSX,
|
|
& SINX,SINE,DIAG,NOPEN,IPRINT,ISCRU,
|
|
& P,VL,IVL,ERED,EINT,CENT,RMLMDA,MXLAM,WKS,NPOTL)
|
|
C AND CONVERT R-MATRIX BACK TO LOGD MATRIX
|
|
CALL SYMINV(SR,N,N,IFAIL)
|
|
C------------------------------------------------------------------
|
|
C SORT CHANNELS BY ASYMPTOTIC ENERGY
|
|
C
|
|
210 IF(N.LE.1) GOTO 230
|
|
NM1=N-1
|
|
DO 220 I=1,NM1
|
|
IP1=I+1
|
|
DO 220 J=IP1,N
|
|
IF(EINT(NB(I)).LE.EINT(NB(J))) GOTO 220
|
|
IT=NB(I)
|
|
NB(I)=NB(J)
|
|
NB(J)=IT
|
|
220 CONTINUE
|
|
C-------------------------------------------------------------
|
|
C CALCULATE K AND S MATRICES
|
|
230 CALL YTOK(NB,WV,L,N,NOPEN,A1,A1P,B1,B1P,SR,SI,W,RMAX)
|
|
CALL KTOS(W,SR,SI,NOPEN)
|
|
RETURN
|
|
END
|
|
SUBROUTINE MASK
|
|
RETURN
|
|
END
|
|
* ----------------------------------------------------------------------
|
|
SUBROUTINE MAXMGV (A, NA, C, NC, N)
|
|
* SUBROUTINE TO SCAN A VECTOR FOR ITS MAXIMUM MAGNITUDE (ABSOLUTE VAL
|
|
* ELEMENT
|
|
* CURRENT REVISION DATE: 24-SEPT-87
|
|
* -------------------------------------------------------------------
|
|
* VARIABLES IN CALL LIST:
|
|
* A: FLOATING POINT INPUT VECTOR
|
|
* NA: INTEGER ELEMENT STEP FOR A
|
|
* C: FLOATING POINT OUTPUT SCALAR: ON RETURN CONTAINS VALUE OF
|
|
* MAXIMUM MAGNITUDE (ABSOLUTE VALUE) ELEMENT
|
|
* NC: INTEGER INDEX OF MAXIMUM MAGNITUDE ELEMENT
|
|
* N: INTEGER ELEMENT COUNT
|
|
* SUBROUTINES CALLED:
|
|
* IDAMAX: BLAS ROUTINE TO FIND INDEX OF MAXIMUM MAGNITUDE (ABSOLUTE V
|
|
* ELEMENT
|
|
* -------------------------------------------------------------------
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
INTEGER IDAMAX, N, NA, NC
|
|
DIMENSION A(1)
|
|
NC = ( IDAMAX (N, A, NA) - 1) * NA + 1
|
|
C = ABS( A(NC) )
|
|
RETURN
|
|
END
|
|
SUBROUTINE MCGCPL(N,MXLAM,NPOTL,LAM,NLEV,JLEV,J,L,MVALUE,ITYPE,
|
|
1 IEX,VL,IV,PRINT)
|
|
C MODIFIED FOR ITYPE=4 BY SG 29 JUN 94
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE LFIRST
|
|
INTEGER PRINT
|
|
INTEGER LAM(2),JLEV(NLEV,3),J(2),L(2),IV(1)
|
|
DIMENSION VL(2)
|
|
LOGICAL LFIRST
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
DATA SQRTHF/.70710678118654753D0/, Z0/0.D0/
|
|
C STATEMENT FUNCTION DEFINITION . . .
|
|
Z(I)=DBLE(I+I+1)
|
|
C
|
|
IF (ITYPE.EQ.21) GO TO 1000
|
|
IF (ITYPE.EQ.22) GO TO 2000
|
|
IF (ITYPE.EQ.23) GO TO 3000
|
|
IF (ITYPE.EQ.24) GO TO 4000
|
|
IF (ITYPE.EQ.25) GO TO 5000
|
|
IF (ITYPE.EQ.26) GO TO 6000
|
|
IF (ITYPE.EQ.27) GO TO 7000
|
|
STOP
|
|
C
|
|
1000 IF (IVLFL.NE.0) GO TO 9999
|
|
CALL CPL21(N,MXLAM,LAM,NLEV,JLEV,J,MVALUE,VL,PRINT,LFIRST)
|
|
RETURN
|
|
C
|
|
2000 IF (IVLFL.LE.0) GO TO 9999
|
|
CALL CPL22(N,MXLAM,NPOTL,LAM,NLEV,JLEV,J,MVALUE,
|
|
1 IV,VL,PRINT,LFIRST)
|
|
RETURN
|
|
C
|
|
3000 IF (IVLFL.NE.0) GO TO 9999
|
|
CALL CPL23(N,MXLAM,LAM,NLEV,JLEV,J,L,MVALUE,IEX,VL,PRINT,LFIRST)
|
|
RETURN
|
|
C
|
|
CTRP>> JUN94 (SG)
|
|
4000 CALL CPL24(N,MXLAM,LAM,NLEV,JLEV,JLEV,J,MVALUE,VL,PRINT,LFIRST)
|
|
RETURN
|
|
C<<TRP
|
|
5000 IF (IVLFL.NE.0) GO TO 9999
|
|
CALL CPL25(N,MXLAM,LAM,NLEV,JLEV,J,MVALUE,VL,PRINT,LFIRST)
|
|
RETURN
|
|
C
|
|
6000 CALL CPL26(N,MXLAM,LAM,NLEV,JLEV,JLEV,J,MVALUE,VL,PRINT,LFIRST)
|
|
RETURN
|
|
C
|
|
C ITYPE=7
|
|
7000 IF (IVLFL.LE.0) GO TO 9999
|
|
XM=DBLE(MVALUE)
|
|
NZERO=NPOTL*N*(N+1)/2
|
|
DO 1547 I=1,NZERO
|
|
IV(I)=0
|
|
1547 VL(I)=0.D0
|
|
NZERO=0
|
|
DO 1517 LL=1,MXLAM
|
|
LLL=LAM(5*LL-4)
|
|
NV=LAM(5*LL-3)
|
|
NJ=LAM(5*LL-2)
|
|
NV1=LAM(5*LL-1)
|
|
NJ1=LAM(5*LL)
|
|
NNZ=0
|
|
II=0
|
|
DO 1507 ICOL=1,N
|
|
NVC=JLEV(J(ICOL),2)
|
|
NJC=JLEV(J(ICOL),1)
|
|
DO 1507 IROW=1,ICOL
|
|
NVR=JLEV(J(IROW),2)
|
|
NJR=JLEV(J(IROW),1)
|
|
II=II+1
|
|
IF(.NOT.(
|
|
1 (NV.EQ.NVC.AND.NJ.EQ.NJC .AND. NV1.EQ.NVR.AND.NJ1.EQ.NJR) .OR.
|
|
2 (NV.EQ.NVR.AND.NJ.EQ.NJR .AND. NV1.EQ.NVC.AND.NJ1.EQ.NJC)))
|
|
3 GO TO 1507
|
|
I=(II-1)*NPOTL+LLL+1
|
|
VL(I)=PARITY3(MVALUE)*SQRT(Z(NJR)*Z(NJC))*
|
|
1 THREEJ(NJR,LLL,NJC)*
|
|
2 THRJ(DBLE(NJR),DBLE(LLL),DBLE(NJC),-XM,Z0,XM)
|
|
IV(I)=LL
|
|
IF (VL(I).NE.0.D0) NNZ=NNZ+1
|
|
1507 CONTINUE
|
|
IF(NNZ.GT.0) GO TO 1517
|
|
IF(PRINT.GE.14) WRITE(6,612) MVALUE,LL
|
|
NZERO=NZERO+1
|
|
1517 CONTINUE
|
|
IF(NZERO.GT.0 .AND. PRINT.GT.0.AND.PRINT.LT.14)
|
|
1 WRITE(6,620) MVALUE,NZERO
|
|
RETURN
|
|
C
|
|
9999 WRITE(6,699) IVLFL,ITYPE
|
|
699 FORMAT(/' MCGCPL (JAN 93). IVLFL =',I6,
|
|
1 ' INCONSISTENT WITH ITYPE =',I6)
|
|
STOP
|
|
C
|
|
612 FORMAT('0 * * * NOTE. FOR MVALUE, LAM =',2I4,' ALL COUPLING ',
|
|
1 'COEFFICIENTS ARE ZERO.')
|
|
620 FORMAT('0 * * * NOTE. FOR MVALUE =',I4,' ALL COUPLING ',
|
|
1 'COEFFICIENTS ARE ZERO FOR',I5,' POTENTIAL SYMMETRY TYPES.')
|
|
C
|
|
ENTRY MCGCPX
|
|
LFIRST=.TRUE.
|
|
RETURN
|
|
END
|
|
SUBROUTINE MHAACK(IUNIT)
|
|
* TO ACKNOWLEDGE AUTHORS OF AIRY INTEGRATOR
|
|
* CURRENT REVISION DATE: 9-OCT-1991
|
|
C
|
|
WRITE (IUNIT, 10)
|
|
10 FORMAT
|
|
1 (/' +- - - - - - - - - - - - - - - - - - - - - - - - - -',
|
|
2 ' - - - - - - - - - - - - +',
|
|
A /,' + HIBRIDON: MODIFIED LOG DERIVATIVE - AIRY INTEGRATOR',
|
|
B T79,'+',
|
|
3 /,' + ALL PUBLICATIONS RESULTING FROM USE OF THIS INTEGRATOR',
|
|
4 ' MUST INCLUDE', T79,'+',/,
|
|
5 ' + THE FOLLOWING REFERENCE: ',T79,'+',
|
|
6 /,' + M.H. ALEXANDER AND D.E. MANOLOPOULOS, J. CHEM. PHYS.'
|
|
7 ,' 86, 2044-2050 (1987) +'
|
|
8 /,' +- - - - - - - - - - - - - - - - - - - - - - - - - -',
|
|
9 ' - - - - - - - - - - - - +' )
|
|
RETURN
|
|
END
|
|
SUBROUTINE NEXTE(E,EP,ENEXT,DNRG,KSAVE)
|
|
C
|
|
C GIVEN THE S-MATRIX EIGENPHASE SUMS EP(5) AT FIVE EQUALLY SPACED
|
|
C ENERGIES E(5), ESTIMATE THE POSITION ENEXT OF THE NEAREST
|
|
C RESONANCE. THE ROUTINE ASSUMES A LINEAR BACKGROUND FOR THE EP'S.
|
|
C DIFFERENCES ARE USED TO ESTIMATE THREE SUCCESSIVE VALUES OF THE
|
|
C SECOND DERIVATIVE OF EIGSUM W.R.T. ENERGY, AND THESE SECOND
|
|
C DERIVATIVES ARE THUS ASSUMED TO ARISE ENTIRELY FROM THE DISTANT
|
|
C RESONANCE. THE RESONANCE POSITION IS THEN ESTIMATED BY AN
|
|
C EXTRAPOLATION, BASED ON AN APPROXIMATION TO THE BREIT-WIGNER
|
|
C FORMULA VALID AT ENERGIES MUCH FURTHER FROM THE RESONANCE THAN
|
|
C ITS WIDTH. IF ANY OF THE SECOND DERIVATIVES DIFFER IN SIGN,
|
|
C OR DECREASE WITH INCREASING ENERGY, THEN EITHER THE ENERGIES
|
|
C INVOLVED ARE NEAR-RESONANT OR NUMERICAL NOISE IS DOMINATING
|
|
C THE SECOND DERIVATIVES. UNDER THESE CIRCUMSTANCES, THE DNRG
|
|
C PARAMETER IS INCREASED BY A FACTOR OF 10 TO REDUCE NUMERICAL
|
|
C NOISE.
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE IAMB
|
|
DIMENSION E(5),EP(5)
|
|
DATA IAMB/0/
|
|
CUBERT(X)=SIGN(ABS(X)**(1.D0/3.D0),X)
|
|
WRITE(6,600) (I,E(I),EP(I),I=1,5)
|
|
600 FORMAT('0****** ESTIMATE PARAMETERS OF DISTANT RESONANCE ',
|
|
1 'USING 5 ENERGIES'//(' ENERGY(',I1,') =',F18.10,
|
|
2 ' EPSUM/PI =',F19.15))
|
|
DNRG=E(2)-E(1)
|
|
CURV1=(EP(1)-2.D0*EP(2)+EP(3))/(DNRG*DNRG)
|
|
CC1=CUBERT(CURV1)
|
|
CURV2=(EP(2)-2.D0*EP(3)+EP(4))/(DNRG*DNRG)
|
|
CC2=CUBERT(CURV2)
|
|
CURV3=(EP(3)-2.D0*EP(4)+EP(5))/(DNRG*DNRG)
|
|
CC3=CUBERT(CURV3)
|
|
WRITE(6,666)CURV1,CURV2,CURV3
|
|
666 FORMAT('0 ESTIMATED EIGENPHASE CURVATURES ARE',3G13.6)
|
|
CURVSM=CURV1+CURV2+CURV3
|
|
IF(CURV1*CURV2.LT.0.D0) GOTO 100
|
|
IF(CURV2.LT.CURV1) GOTO 100
|
|
IF(CURV2*CURV3.LT.0.D0) GOTO 100
|
|
IF(CURV3.LT.CURV2) GOTO 100
|
|
IAMB=0
|
|
ENEXT1=(CC1*E(2) - CC2*E(3))/(CC1-CC2)
|
|
ENEXT2=(CC2*E(3) - CC3*E(4))/(CC2-CC3)
|
|
ENEXT3=(CC1*E(2) - CC3*E(4))/(CC1-CC3)
|
|
WRITE(6,602)ENEXT1,ENEXT2,ENEXT3
|
|
602 FORMAT(' ESTIMATES OF ENERGY ARE',3G22.14)
|
|
GAM1=ABS(CURV1*(E(2)-ENEXT1)**3)
|
|
GAM2=ABS(CURV2*(E(3)-ENEXT2)**3)
|
|
GAM3=ABS(CURV1*(E(2)-ENEXT3)**3)
|
|
WRITE(6,603)GAM1,GAM2,GAM3
|
|
603 FORMAT(' ESTIMATES OF WIDTH ARE',3(7X,G11.4,4X))
|
|
ENEXT=(ENEXT1+ENEXT2+ENEXT3)/3.D0
|
|
GAM=(GAM1+GAM2+GAM3)/3.D0
|
|
ESTEP=ABS(ENEXT-E(3))
|
|
WRITE(6,601)ENEXT,GAM
|
|
601 FORMAT('0 ESTIMATE RESONANCE ENERGY =',F18.10,' WIDTH =',
|
|
1 D11.4)
|
|
IF(KSAVE.GT.0) WRITE(KSAVE,610) CURV1,CURV2,CURV3,ENEXT,GAM
|
|
610 FORMAT(' *** CURVATURES',3G22.14,/' *** GIVE ERES =',F18.10,
|
|
1 ' GAM =',D11.4)
|
|
DNMIN=0.25D0*DNRG
|
|
DNMAX=4.D0*DNRG
|
|
DNRG=MAX(0.02D0*ESTEP, 0.3D0*GAM)
|
|
DNRG=MAX(DNRG,DNMIN)
|
|
DNRG=MIN(DNRG,DNMAX)
|
|
ENEXT=ENEXT-2.D0*DNRG
|
|
RETURN
|
|
C
|
|
100 IAMB=IAMB+1
|
|
DNRG=DNRG*10.D0
|
|
WRITE(6,699)DNRG
|
|
699 FORMAT('0****** CURVATURES MAY BE DOMINATED BY NUMERICAL NOISE:',
|
|
1 ' UNSAFE TO ESTIMATE'/8X,'RESONANCE ENERGY.',
|
|
2 ' DNRG INCREASED TO',G12.5)
|
|
IF(KSAVE.GT.0) WRITE(KSAVE,698) CURV1,CURV2,CURV3
|
|
698 FORMAT(' *** CURVATURES',3G18.10,' AMBIGUOUS')
|
|
IF(IAMB.GE.3) GOTO 200
|
|
IF(CURVSM.LT.0.D0) ENEXT=E(1)-DNRG*5.D0
|
|
IF(CURVSM.GE.0.D0) ENEXT=E(5)+DNRG
|
|
RETURN
|
|
C
|
|
200 ENEXT=-1.D0
|
|
RETURN
|
|
END
|
|
SUBROUTINE ODPROP(Y, U, W, Q, Y1, Y2,
|
|
& RBEGIN, REND, NPT, IREAD, IWRITE, ISCRU,
|
|
& P, VL, IV, ERED, EINT, CENT, RMLMDA,
|
|
& MXLAM, NPOTL, ISTART, NODES)
|
|
C____ VERSION (1/27/93) USES /MEMORY/ ..,IVLFL, ONLY TO CHECK USE OF
|
|
C____ IV ARRAY. BETTER CODE IN LOOPS 130, 230 POSSIBLE
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C ROUTINE TO SOLVE THE SINGLE CHANNEL PROBLEM USING A
|
|
C MODIFIED LOG DERIVATIVE ALGORITHM. THE POTENTIAL
|
|
C EVALUATED AT THE MIDPOINT OF EACH SECTOR IS USED AS A
|
|
C REFERENCE POTENTIAL FOR THE SECTOR.
|
|
C
|
|
C THIS VERSION IS WRITTEN TO VECTORISE AS MUCH AS POSSIBLE
|
|
C
|
|
LOGICAL IREAD,IWRITE
|
|
DIMENSION U(NPT),W(NPT),Q(NPT),Y1(NPT),Y2(NPT),
|
|
1 P(MXLAM,NPT),VL(NPOTL),IV(NPOTL),EINT(1),CENT(1)
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
NODES=0
|
|
C
|
|
C THIS VERSION USES A CONSTANT STEP SIZE, DR, THROUGHOUT THE
|
|
C INTEGRATION RANGE, BUT IS WRITTEN SO THAT THIS MAY BE EASILY
|
|
C CHANGED (THOUGH VECTORISATION WOULD REQUIRE EXPLICIT R ARRAYS).
|
|
NSTEPS=NPT-1
|
|
DR=(REND-RBEGIN)/DBLE(NSTEPS)
|
|
DR6=DR/6.D0
|
|
H=DR/2.D0
|
|
C
|
|
IF(IREAD) GOTO 400
|
|
C
|
|
C FIRST GET POTENTIAL U AT EVEN-NUMBERED POINTS
|
|
C
|
|
R=RBEGIN
|
|
DO 100 I=1,NPT
|
|
CALL POTENL(0,MXLAM,NPOTL,IDUM1,R,P(1,I),IDUM2)
|
|
100 R=R+DR
|
|
EINTCM=EINT(1)/RMLMDA
|
|
DO 110 I=1,NPT
|
|
110 U(I)=EINTCM
|
|
DO 130 J=1,NPOTL
|
|
V=VL(J)
|
|
IF(V.EQ.0.D0) GOTO 130
|
|
IF (IVLFL.NE.0) THEN
|
|
IVJ=IV(J)
|
|
ELSE
|
|
IVJ=J
|
|
ENDIF
|
|
DO 120 I=1,NPT
|
|
120 U(I)=U(I)+V*P(IVJ,I)
|
|
130 CONTINUE
|
|
R=RBEGIN
|
|
DO 140 I=1,NPT
|
|
U(I)=U(I)*RMLMDA+CENT(1)/(R*R)
|
|
140 R=R+DR
|
|
C
|
|
C NOW GET POTENTIAL W AT ODD-NUMBERED POINTS
|
|
C
|
|
R=RBEGIN+H
|
|
DO 200 I=1,NSTEPS
|
|
CALL POTENL(0,MXLAM,NPOTL,IDUM1,R,P(1,I),IDUM2)
|
|
200 R=R+DR
|
|
DO 210 I=1,NSTEPS
|
|
210 W(I)=EINTCM
|
|
DO 230 J=1,NPOTL
|
|
V=VL(J)
|
|
IF(V.EQ.0.D0) GOTO 230
|
|
IF (IVLFL.NE.0) THEN
|
|
IVJ=IV(J)
|
|
ELSE
|
|
IVJ=J
|
|
ENDIF
|
|
DO 220 I=1,NPT
|
|
220 W(I)=W(I)+V*P(IVJ,I)
|
|
230 CONTINUE
|
|
R=RBEGIN+H
|
|
DO 240 I=1,NSTEPS
|
|
W(I)=W(I)*RMLMDA+CENT(1)/(R*R)
|
|
240 R=R+DR
|
|
C
|
|
C FORM VECTOR OF CORRECTIONS U
|
|
C
|
|
Q(1)=0.D0
|
|
DO 310 I=2,NPT
|
|
310 Q(I)=U(I)-W(I-1)
|
|
QLAST=Q(NPT)*DR6
|
|
DO 320 I=1,NSTEPS
|
|
320 U(I)=(U(I)-W(I)+Q(I))*DR6
|
|
IF(IWRITE) WRITE(ISCRU) CENT(1),QLAST,W,U
|
|
GOTO 500
|
|
C
|
|
400 READ(ISCRU) CSAV,QLAST,W,U
|
|
C
|
|
C CORRECT THE CENTRIFUGAL TERM IF DIFFERENT FROM THAT SAVED
|
|
C
|
|
DC=CENT(1)-CSAV
|
|
IF(ABS(DC).LT.1.D-8) GOTO 500
|
|
R=RBEGIN+H
|
|
DO 410 I=1,NSTEPS
|
|
Q(I)=DC/(R*R)
|
|
W(I)=W(I)+Q(I)
|
|
410 R=R+DR
|
|
R=RBEGIN
|
|
U(1)=U(1)+DC/(R*R)-Q(1)
|
|
R=R+DR
|
|
DO 420 I=2,NSTEPS
|
|
U(I)=U(I)+((DC+DC)/(R*R)-Q(I)-Q(I-1))*DR6
|
|
420 R=R+DR
|
|
QLAST=QLAST+(DC/(R*R)-Q(NSTEPS))*DR6
|
|
C
|
|
C NOW GET PROPAGATORS.
|
|
C THIS LOOP REQUIRES SPECIAL TREATMENT TO VECTORISE ON CRAY
|
|
C
|
|
500 DO 510 I=1,NSTEPS
|
|
WREF=W(I)-ERED
|
|
FLAM=0.5D0*SQRT(ABS(WREF))
|
|
IF(WREF.LT.0.D0) THEN
|
|
TN=TAN(FLAM*DR)
|
|
Y1(I)=FLAM/TN-FLAM*TN
|
|
Y2(I)=FLAM/TN+FLAM*TN
|
|
ELSE
|
|
TN=TANH(FLAM*DR)
|
|
Y1(I)=FLAM/TN+FLAM*TN
|
|
Y2(I)=FLAM/TN-FLAM*TN
|
|
ENDIF
|
|
Y2(I)=Y2(I)*Y2(I)
|
|
510 Q(I)=Y1(I)+U(I)
|
|
C
|
|
C INITIALIZE Y IF NECESSARY
|
|
C
|
|
IF(ISTART.EQ.1) GOTO 600
|
|
WREF=U(1)-ERED
|
|
Y=1.D30
|
|
IF(WREF.GT.0.D0) Y=SQRT(WREF)
|
|
Y=SIGN(Y,DR)
|
|
C
|
|
C FINALLY DO THE PROPAGATION. THIS LOOP IS NOT VECTORISABLE,
|
|
C SO THE WORK IN IT IS KEPT TO AN ABSOLUTE MINIMUM.
|
|
C
|
|
600 DO 700 I=1,NSTEPS
|
|
700 Y=Y1(I)-Y2(I)/(Y+Q(I))
|
|
C
|
|
Y=Y+QLAST
|
|
RETURN
|
|
END
|
|
C
|
|
C
|
|
C
|
|
SUBROUTINE ORDER(I,J)
|
|
C
|
|
C SUBROUTINE TO REARRANGE TWO FOURIER COMPONENTS INTO
|
|
C A UNIQUELY DEFINED EQUIVALENT PAIR.
|
|
C
|
|
C EQUIV = .TRUE. IF THE TWO LATTICE VECTORS ARE EQUIVALENT
|
|
C ORTHOG = .TRUE. IF THE LATTICE VECTORS ARE ORTHOGONAL
|
|
C HEX = .TRUE. IF LATTICE HAS HEXAGONAL SYMMETRY
|
|
C CURRENTLY SET UP FOR HEXAGONAL LATTICE, AS IN H-XE-C
|
|
C
|
|
LOGICAL HEX, ORTHOG, EQUIV
|
|
COMMON/LATSYM/HEX,ORTHOG,EQUIV
|
|
C
|
|
5 IF(.NOT.EQUIV .OR. IABS(I).GE.IABS(J)) GOTO 10
|
|
K=I
|
|
I=J
|
|
J=K
|
|
10 IF(I.GE.0) GOTO 20
|
|
I=-I
|
|
J=-J
|
|
20 CONTINUE
|
|
IF(ORTHOG) J=IABS(J)
|
|
IF(.NOT.HEX .OR. J.LE.0) RETURN
|
|
K=I
|
|
I=J
|
|
J=J-K
|
|
GOTO 5
|
|
END
|
|
* ----------------------------------------------------------------------
|
|
SUBROUTINE OUTMAT (TMAT, EIGOLD, HP, ESHIFT, DRNOW, RNOW,
|
|
: N, NMAX, ITWO, ISCRU)
|
|
* SUBROUTINE TO EITHER WRITE OR READ TRANSFORMATION MATRIX AND
|
|
* RELEVANT INFORMATION FROM FILE ISCRU
|
|
* CALLED FROM SPROPN
|
|
* AUTHOR: MILLARD ALEXANDER
|
|
* CURRENT REVISION DATE: 14-FEB-91
|
|
* ---------------------------------------------------------------------
|
|
* VARIABLES IN CALL LIST:
|
|
* TMAT: N X N MATRIX TO CONTAIN TRANSFORMATION MATRIX
|
|
* EIGOLD: ARRAY OF DIMENSION N WHICH CONTAINS LOCAL WAVEVECTORS
|
|
* HP: ARRAY OF DIMENSION N WHICH CONTAINS DERIVATIVES OF HAMILT
|
|
* MATRIX. THIS IS JUST THE NEGATIVE OF THE DERIVATIVES OF
|
|
* WAVEVECTOR MATRIX
|
|
* ESHIFT: AMOUNT LOCAL WAVEVECTORS WILL BE SHIFTED IN SECOND ENERGY
|
|
* CALCULATION: 2 2
|
|
* K (NEW) = K (OLD) + ESHIFT
|
|
* DRNOW: WIDTH OF CURRENT INTERVAL
|
|
* RNOW: MIDPOINT OF CURRENT INTERVAL
|
|
* N: NUMBER OF CHANNELS
|
|
* NMAX: MAXIMUM ROW DIMENSION OF MATRIX TMAT
|
|
* ITWO: IF = 0, THEN SUBROUTINE CALLED AT FIRST ENERGY OF MULTIPL
|
|
* ENERGY CALCULATION, SO TRANSFORMATION MATRIX AND RELEVANT
|
|
* INFORMATION WILL BE WRITTEN
|
|
* IF > 0, THEN SUBROUTINE CALLED AT SUBSEQUENT ENERGY OF MU
|
|
* ENERGY CALCULATION, SO TRANSFORMATION MATRIX AND RELEVANT
|
|
* INFORMATION WILL BE READ
|
|
* ---------------------------------------------------------------------
|
|
C
|
|
C ----- ADAPTED TO MOLSCAT BY TRP AT NASAGISS, MAY 1991 -----
|
|
C ----- ISCRU IS UNIT NUMBER -----
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
INTEGER I, ITWO, NMAX
|
|
LOGICAL ISECND
|
|
DIMENSION EIGOLD(1), HP(1), TMAT(1)
|
|
ISECND = .FALSE.
|
|
IF (ITWO .GT. 0) ISECND = .TRUE.
|
|
* IF FIRST ENERGY CALCULATION, ISECND = .FALSE.
|
|
* IN WHICH CASE LOGICAL UNIT ISCRU WILL BE WRITTEN
|
|
* IF SUBSEQUENT ENERGY CALCULATION, ISECND = .TRUE.
|
|
* IN WHICH CASE LOGICAL UNIT ISCRU WILL BE WRITTEN
|
|
* READ/WRITE RNOW, DRNOW, DIAGONAL ELEMENTS OF TRANSFORMED DW/DR MATRIX
|
|
* AND DIAGONAL ELEMENTS OF TRANSFORMED W MATRIX
|
|
NSQ = NMAX * NMAX
|
|
IF (ISECND) THEN
|
|
READ (ISCRU) RNOW, DRNOW, (HP(I) , I = 1, N),
|
|
: (EIGOLD(I) , I = 1, N), (TMAT(I), I=1, NSQ)
|
|
ELSE
|
|
WRITE (ISCRU) RNOW, DRNOW, (HP(I) , I = 1, N),
|
|
: (EIGOLD(I) , I = 1, N), (TMAT(I), I=1, NSQ)
|
|
ENDIF
|
|
* NOW SHIFT ENERGIES (IF SUBSEQUENT ENERGY)
|
|
IF (ISECND) THEN
|
|
DO 30 I = 1, N
|
|
EIGOLD(I) = EIGOLD(I) + ESHIFT
|
|
30 CONTINUE
|
|
END IF
|
|
RETURN
|
|
END
|
|
SUBROUTINE OUTPUT( JTOT, NBASIS, J, L, WVEC, SREAL, SIMAG,
|
|
1 AKMAT, CONV, NOPEN, M, MXPAR, WT, IEXCH, INRG, RM, PRNT, TTIME,
|
|
2 ENERGY, SIG, JLEV, ISST, IECONV, MINJT, MAXJT,
|
|
3 NLEV,NQN,OTOL,DTOL,KSAVE,ISIGU,IPARTU,ISAVEU,ISIGPR,IRSTRT,N)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE INVERR,NSTOR,ITYPE,NLEVEL,LOUT,JSTEP
|
|
C
|
|
C FOR MOLSCAT VERSION 14, JUL 1994
|
|
C WITH RESTART (IRSTRT) CAPABILITIES
|
|
C
|
|
C ENTRY OUTPUT - PROCESSES S MATRICES TO X-SECTIONS OUTPUTS THEM.
|
|
C ENTRY OUTSIG - (10/92) SEPARATE ENTRY TO UPDATE UNIT(ISIGU)
|
|
C TO FIX BUG W/ NO BASIS FNS FOR PARITY M=MXPAR
|
|
C ENTRY OUTINT - INITIALIZATION ENTRY FROM DRIVER.
|
|
C ENTRY OUTPCH - PUNCHES FINAL CROSS SECTIONS.
|
|
C ENTRY OUTERR - SETS ERROR FLAG, CALLED ONLY FROM DVSCAT.
|
|
C
|
|
C MODIFICATIONS AUG. 74 - - -
|
|
C NLEVEL IS DIFFERENT FROM NLEV. FORMER FOR ELEVEL,JLEVEL,
|
|
C AND LATTER FOR JLEV(NLEV,NQN).
|
|
C TSIG IS NOW FIRST NLEVEL*NLEVEL=NSTOR ELEMENTS OF SIG.
|
|
C DEGENERACY IS IN 2ND NSTOR ELEMENTS OF SIG.
|
|
C MODIFIED NOV 91 - - - MULTIPLIES CROSS SECTIONS BY JSTEP
|
|
C MODIFIED JUN 92 TO GIVE UNFORMATTED ISAVEU OUTPUT W/ ONLY
|
|
C NONREDUNDANT S(I,J). OLDER (FORMATTED) CODE IS SAVED AS
|
|
C COMMENTS TO PROVIDE COMPATIBILITY W/ VERSION 10 AND EARLIER.
|
|
C N.B FORMATS 800,801,802 ALSO USED FOR IPARTU OUTPUT.
|
|
C SREAL,SIMAG ARE WRITTEN USING A SUBROUTINE SWRITE.
|
|
C 21 JAN 93 -- NEW DYNAMIC MEMORY HANDLING
|
|
C APR 94 -- MODIFED CALLING SEQUENCES, OUTPUT FORMATS
|
|
C ACCOMMODATE NEGATIVE SIG-INDEX, JLEV((NQN-1)*NLEV+I)
|
|
C AUG 95 ADDED N TO PARAMETER LIST AND WRITE(6,642)
|
|
C
|
|
DIMENSION NBASIS(1),J(1),L(1),WVEC(1),SREAL(1),SIMAG(1)
|
|
DIMENSION AKMAT(NOPEN,NOPEN)
|
|
INTEGER ISST(2),MAXJT(2),MINJT(2),IECONV(2)
|
|
INTEGER PRINT,PRNT
|
|
INTEGER NLEV,JLEV(1)
|
|
DIMENSION SIG(1),ENERGY(1)
|
|
LOGICAL OKEY,LOUT,ACCUM,OPENED,LWARN
|
|
C INTEGER CTIME(2),CDATE(4)
|
|
CHARACTER CTIME*9,CDATE*11
|
|
CHARACTER*4 LABEL(20)
|
|
CHARACTER*1 STAR,BLANK
|
|
C
|
|
COMMON /CMBASE/ ROTI(12),ELEVEL(1004),IDUM(4031)
|
|
EQUIVALENCE (JHALF,IDUM(4028))
|
|
C
|
|
C COMMON BLOCK TO DRIVER FOR RESONANCE SEARCHES
|
|
C
|
|
COMMON/EIGSUM/EPSM(5)
|
|
C
|
|
EQUIVALENCE (NLVL,IDUM(1))
|
|
C
|
|
DATA STAR/'*'/, BLANK/' '/
|
|
DATA EPS/1.D-12/
|
|
DATA IPUNCH/7/
|
|
C
|
|
PI=ACOS(-1.D0)
|
|
PI2=2.D0*PI
|
|
C
|
|
PRINT=PRNT
|
|
C>>SG IEXCH=1
|
|
IRET=0
|
|
C
|
|
C SET LOGICAL VARIABLES
|
|
OKEY=CONV.GE.0.D0 .AND. IECONV(INRG).GE.0
|
|
ACCUM=OKEY .AND. INVERR.LE.0 .AND. ITYPE.NE.8
|
|
C
|
|
C BOOKEEPING FOR MINJT AND MAXJT
|
|
IF (MINJT(INRG).LT.0) MINJT(INRG)=JTOT
|
|
IF (OKEY .AND. JTOT.GT.MAXJT(INRG) .AND. MAXJT(INRG).GE.0)
|
|
& MAXJT(INRG)=JTOT
|
|
C
|
|
C PRINT OUT OPEN-CHANNEL BASIS FUNCTIONS AND WAVEVECTORS IN 1/A.
|
|
IF (PRINT.GE.11) WRITE(6,601)
|
|
601 FORMAT('0 CHANNEL NO. TARGET LEVEL ORBITAL L WVEC(1/ANG.)')
|
|
C CONVERT WVEC TO INVERSE ANGSTROMS
|
|
DO 1000 I=1,NOPEN
|
|
NB=NBASIS(I)
|
|
WVEC(NB)=WVEC(NB)/RM
|
|
IF (PRINT.GE.11) WRITE(6,602) I,J(NB),L(NB),WVEC(NB)
|
|
602 FORMAT(3I12,E18.8)
|
|
1000 CONTINUE
|
|
C
|
|
C
|
|
C PROCESS S-MATRIX. ACCUMULATE X-SECTIONS IN TSIG. PRINT.
|
|
C J(NBASIS(I)) IS LEVEL NUMBER OF ITH BASIS FN. IN ASYMPTOTIC AREA.
|
|
C CLEAR TSIG.
|
|
DO 1400 I=1,NSTOR
|
|
1400 SIG(I)=0.D0
|
|
IF (PRINT.GT.10) WRITE(6,606)
|
|
606 FORMAT('0 ROW COL',10X,'S**2',15X,'PHASE/2PI',12X,'RE (S)',14X,
|
|
1 'IM (S)' )
|
|
C
|
|
IJ=0
|
|
NTOP=(NQN-1)*NLEV
|
|
C CALCULATE GLOBAL MULTIPLICATIVE FACTOR FOR X-SECTIONS.
|
|
XJ=DBLE((2/JHALF)*JTOT+1)*PI
|
|
C>>SG CALCULATE (OR GET FROM PARM LIST) IEXCH -- FOR USE W/ISAVEU
|
|
C IF (IEXCH.NE.0) XJ=XJ*WT
|
|
IF (WT.GT.0.D0) XJ=XJ*WT
|
|
DO 2000 ICOL=1,NOPEN
|
|
LEVC=J(NBASIS(ICOL))
|
|
LCOL=JLEV(NTOP+LEVC)
|
|
IF (LCOL.GT.0) THEN
|
|
CS1=1.D0
|
|
ELSE
|
|
CS1=-1.D0
|
|
LCOL=-LCOL
|
|
ENDIF
|
|
DO 2000 IROW=1,NOPEN
|
|
DD=WVEC(NBASIS(IROW))
|
|
DD=DD*DD
|
|
LEVR=J(NBASIS(IROW))
|
|
C IJ IS INDEX OF SREAL,SIMAG(IROW,ICOL)
|
|
IJ=IJ+1
|
|
SMAG=( SREAL(IJ)*SREAL(IJ)+SIMAG(IJ)*SIMAG(IJ) )
|
|
IF (PRINT.LE.10 .OR. SMAG.LE.EPS) GO TO 2300
|
|
PHASE=ATAN2(SIMAG(IJ),SREAL(IJ)) / PI2
|
|
IF(ITYPE.NE.8) GO TO 2100
|
|
C SPECIAL CASE FOR SURFACE SCATTERING: WRITE OUT ONE COLUMN ONLY,
|
|
C LABELLED BY G VECTORS RATHER THAN CHANNEL NUMBERS
|
|
XJ=1.D0
|
|
IF(JLEV(LEVC).NE.0 .OR. JLEV(NLEV+LEVC).NE.0) GOTO 2400
|
|
WRITE(6,607) JLEV(LEVR),JLEV(NLEV+LEVR),
|
|
1 SMAG,PHASE,SREAL(IJ),SIMAG(IJ)
|
|
GOTO 2400
|
|
C ALL OTHER CASES
|
|
2100 WRITE(6,607) IROW,ICOL,SMAG,PHASE,SREAL(IJ),SIMAG(IJ)
|
|
607 FORMAT(2I5,4E20.6)
|
|
2300 IF (IROW.NE.ICOL) GO TO 2400
|
|
C FOR IROW = ICOL, CALCULATE T = 1 - S.
|
|
SMAG=1.D0-SREAL(IJ)
|
|
SMAG=SMAG*SMAG + SIMAG(IJ)*SIMAG(IJ)
|
|
2400 CONTINUE
|
|
C N.B. LCOL (LROW) < 0 IMPLIES JI (JF) .GT. JZCSMX
|
|
C IF BOTH NEGATIVE, INDICATE BY NEGATIVE SIGMA
|
|
LROW=JLEV(NTOP+LEVR)
|
|
CSF=1.D0
|
|
IF (LROW.LT.0) THEN
|
|
LROW=-LROW
|
|
IF (CS1.LT.0.D0) CSF=-1.D0
|
|
ENDIF
|
|
IF (LROW.GT.NLEVEL .OR. LCOL.GT.NLEVEL) GO TO 2000
|
|
C II IS INDEX OF SIG(ICOL,IROW). N.B. JLEV(LEV,NQN) HAS POINTER
|
|
C TO 'SERIAL' NUMBER OF 'LEVEL'.
|
|
II=(LROW-1)*NLEVEL+LCOL
|
|
C ACCOUNT FOR K(J,J), DEGEN. LATTER IN SIG(NSTOR+II).
|
|
SIG(II) = SIG(II) + CSF * SMAG*XJ/(SIG(NSTOR+II)*DD)
|
|
2000 CONTINUE
|
|
C
|
|
C ACCUMULATE X-SECTIONS. SET IJ TO START OF INRG-TH ENERGY IN SIG
|
|
4100 IJ=(INRG+1)*NSTOR
|
|
II=0
|
|
XII=0.D0
|
|
XIJ=0.D0
|
|
DO 3000 JI=1,NLEVEL
|
|
DO 3000 I=1,NLEVEL
|
|
II=II+1
|
|
IJ=IJ+1
|
|
IF ( ACCUM ) SIG(IJ)=SIG(IJ)+SIG(II)
|
|
IF (JI.EQ.I) GO TO 3100
|
|
XIJ=MAX(XIJ,ABS( SIG(II)))
|
|
GO TO 3000
|
|
3100 XII=MAX(XII,ABS( SIG(II)))
|
|
3000 CONTINUE
|
|
C
|
|
IF (ACCUM) GO TO 5101
|
|
C CODE BELOW IS REACHED IF SIGMA NOT ACCUMULATED. . .
|
|
IF (ITYPE.EQ.8) GO TO 6500
|
|
IF (OKEY) GO TO 9100
|
|
WRITE(6,9600)
|
|
9600 FORMAT(' ****** SIGMA NOT ACCUMULATED DUE TO LACK OF CONVERGENCE',
|
|
1 ' IN THIS OR PREVIOUS CALCULATION.')
|
|
IF(ISAVEU.GT.0) WRITE(6,9632)
|
|
9632 FORMAT(' ****** SCATTERING MATRIX NOT SAVED')
|
|
MAXJT(INRG)=-IABS(MAXJT(INRG))
|
|
IECONV(INRG)=MIN0(IECONV(INRG)-1,-1)
|
|
GO TO 6500
|
|
C
|
|
9100 WRITE(6,9611) INVERR
|
|
9611 FORMAT(' ****** SIGMA NOT ACCUMULATED BECAUSE OF MATRIX ',
|
|
1 'INVERSION ERROR',I4)
|
|
IF(ISAVEU.GT.0) WRITE(6,9632)
|
|
GO TO 6500
|
|
C
|
|
C BELOW REACHED IF SIGMA ACCUMULATED. OUTPUT, SAVE ON TAPE, DISK.
|
|
C
|
|
5101 IF(PRINT.EQ.1) THEN
|
|
WRITE(6,642) JTOT,M,INRG,ENERGY(INRG),XII,XIJ,N,NOPEN
|
|
ELSEIF(PRINT.GT.1) THEN
|
|
WRITE(6,642) JTOT,M,INRG,ENERGY(INRG),XII,XIJ,N,NOPEN,TTIME
|
|
642 FORMAT(' JTOT=',I4,'.',I2,' E(',I3,
|
|
1 ')=',F10.3,', MAX D/O-D=',1P,2D9.1,' N/NOP=',2I5,
|
|
2 2X,'TIME=',0P,F8.2)
|
|
ENDIF
|
|
C
|
|
IF(ISIGPR.LE.0) GO TO 5100
|
|
IF (PRINT.LE.4) GO TO 5100
|
|
WRITE(6,9601)
|
|
9601 FORMAT('0',8(' * '),'PARTIAL CROSS SECTIONS',8(' * '))
|
|
DO 5200 I=1,NLEVEL
|
|
C5200 WRITE(6,631) (ABS(SIG((II-1)*NLEVEL+I)),I,II, II=1,NLEVEL)
|
|
C BELOW INCORPORATES JMH V12 UPDATE AND SG V13X UPDATE
|
|
IF (ENERGY(INRG).GT.ELEVEL(I))
|
|
1WRITE(6,631) (ABS(SIG((II-1)*NLEVEL+I)),I,II, II=1,NLEVEL)
|
|
5200 CONTINUE
|
|
631 FORMAT('0',4(1P,D10.2,' FOR SIG(',2I3,')' )/
|
|
1 ( ' ',4(1P,D10.2,' FOR SIG(',2I3,')' )))
|
|
IF (PRINT.LE.10) GO TO 5100
|
|
WRITE(6,9602) MINJT(INRG),JTOT
|
|
9602 FORMAT('0',6(' * '),'CROSS SECTIONS ACCUMULATED FROM JTOT=',
|
|
1 I4,' TO',I4,6(' * '))
|
|
ISTART=(INRG+1)*NSTOR
|
|
XJS=DBLE(JSTEP)/DBLE(JHALF)
|
|
IF (JSTEP.NE.1) WRITE(6,9630) XJS
|
|
9630 FORMAT(31X,'MULTIPLIED BY',F5.1,' TO ACCOUNT FOR JSTEP.')
|
|
DO 5299 I=1,NLEVEL
|
|
5299 WRITE(6,631)
|
|
1 (ABS(SIG((II-1)*NLEVEL+I+ISTART))*XJS,I,II,II=1,NLEVEL)
|
|
5100 IF (XII.LE.DTOL .AND. XIJ.LE.OTOL) GO TO 5102
|
|
IECONV(INRG)=MIN0(IECONV(INRG),0)
|
|
GO TO 5103
|
|
5102 IECONV(INRG)=IECONV(INRG)+1
|
|
5103 IF(KSAVE.GT.0) GO TO 6320
|
|
C
|
|
C SAVE S MATRICES ON TAPE (ISAVEU) . . .
|
|
IF (IRSTRT.GT.0) GO TO 6500
|
|
IF (ISAVEU.LE.0) GO TO 6500
|
|
C BEGINNING IN VERSION 14 NOPEN IS WITH THE 'HEADER' RECORD
|
|
WRITE(ISAVEU) JTOT,INRG,ENERGY(INRG),IEXCH,WT,M,NOPEN
|
|
C WRITE(ISAVEU,803) JTOT,INRG,ENERGY(INRG),IEXCH,WT,M
|
|
C 803 FORMAT(2I4,E16.8,I4,E16.8,I4)
|
|
WRITE(ISAVEU)
|
|
1 (J(NBASIS(I)),L(NBASIS(I)),WVEC(NBASIS(I)),I=1,NOPEN)
|
|
C WRITE(ISAVEU,804) NOPEN,
|
|
C 1 (J(NBASIS(I)),L(NBASIS(I)),WVEC(NBASIS(I)),I=1,NOPEN)
|
|
C 804 FORMAT(I4/(2I4,E16.8))
|
|
CALL SWRITE(ISAVEU,NOPEN,SREAL)
|
|
CALL SWRITE(ISAVEU,NOPEN,SIMAG)
|
|
C NSQ=NOPEN*NOPEN
|
|
C WRITE(ISAVEU,805) (SREAL(I),I=1,NSQ)
|
|
C WRITE(ISAVEU,805) (SIMAG(I),I=1,NSQ)
|
|
C 805 FORMAT(5E16.8)
|
|
GO TO 6500
|
|
C
|
|
6320 IF(ISAVEU.LE.0) GO TO 6322
|
|
C 'KSAVE' OUTPUT FORMAT *NOT* CHANGED
|
|
WRITE(ISAVEU) JTOT,INRG,ENERGY(INRG),IEXCH,WT,M
|
|
6324 FORMAT(2I4,D22.15,I4,D22.15,I4)
|
|
WRITE(ISAVEU) NOPEN,
|
|
1 (J(NBASIS(I)),L(NBASIS(I)),WVEC(NBASIS(I)),I=1,NOPEN)
|
|
6326 FORMAT(I4/(2I4,D22.15))
|
|
NPL1=NOPEN+1
|
|
NSQ=NOPEN*NOPEN
|
|
WRITE(ISAVEU) (SREAL(I),SIMAG(I),I=1,NSQ,NPL1)
|
|
WRITE(ISAVEU) ((AKMAT(I,JJ),I=1,JJ),JJ=1,NOPEN)
|
|
6328 FORMAT(4(D20.13))
|
|
6322 ESUM=EPSUM(AKMAT,NOPEN,SREAL,SIMAG,SREAL(NOPEN+1))
|
|
IF(ISAVEU.GT.0) WRITE(ISAVEU) ESUM
|
|
WRITE(6,6342) ESUM
|
|
6342 FORMAT('0 S-MATRIX EIGENPHASE SUM, EPSUM/PI =',F9.5)
|
|
IS=INRG-5*((INRG-1)/5)
|
|
EPSM(IS)=ESUM
|
|
C
|
|
WRITE(KSAVE,6330) JTOT,M,NOPEN,INRG,ENERGY(INRG),ESUM
|
|
6330 FORMAT(1X,I3,2I4,I5,F18.10,F21.15)
|
|
C
|
|
C ENTRY TO ALLOW UPDATING OF SIG() ON UNIT ISIGU
|
|
C IN CASE THERE ARE NO BASIS FNS FOR SYMMETRY BLOCK M=MXPAR.
|
|
GO TO 6500
|
|
ENTRY OUTSIG(ISIGU,M,MXPAR,INRG,ENERGY,MINJT,MAXJT,SIG)
|
|
IRET=1
|
|
C
|
|
C UPDATE DISK (ISIGU) RECORD IF THIS IS THE LAST PARITY CASE
|
|
6500 IF (.NOT.LOUT .OR. M.NE.MXPAR) GO TO 7200
|
|
XJS=JSTEP
|
|
IJ=(INRG+1)*NSTOR
|
|
I10=ISST(INRG)
|
|
DO 7100 I=1,NLEVEL
|
|
DO 7100 II=1,NLEVEL
|
|
IJ=IJ+1
|
|
C I10 IS INCREMENTED BY ASSOCIATED VARIABLE HERE.
|
|
IF (SIG(IJ).GE.0.D0) THEN
|
|
WRITE(ISIGU,101,REC=I10) STAR,ENERGY(INRG),
|
|
1 MINJT(INRG),JSTEP,MAXJT(INRG),II,I,SIG(IJ)*XJS,BLANK
|
|
ELSE
|
|
WRITE(ISIGU,101,REC=I10) STAR,ENERGY(INRG),
|
|
1 MINJT(INRG),JSTEP,MAXJT(INRG),II,I,ABS(SIG(IJ))*XJS,STAR
|
|
ENDIF
|
|
I10=I10+1
|
|
101 FORMAT(A1,F19.6,I5,2I7,5X,2I5,1P,D20.6,1X,A1)
|
|
7100 CONTINUE
|
|
IF (PRINT.GT.1) WRITE(6,690) ISIGU,INRG,ENERGY(INRG),JTOT,M
|
|
690 FORMAT(' OUTSIG: DA FILE (',I2,') UPDATED WITH SIGMA FOR ENERGY('
|
|
1 ,I3,') =',F10.2,' JTOT =',I4,'.',I2)
|
|
C
|
|
C>>SG(10/92)
|
|
C7200 CONTINUE
|
|
7200 IF (IRET.EQ.1) RETURN
|
|
C<<SG
|
|
C
|
|
IF(IPARTU.LE.0) GOTO 7250
|
|
WRITE(IPARTU,7205) JTOT,M,INRG,ENERGY(INRG)
|
|
7205 FORMAT(3I5,F20.5)
|
|
DO 7210 I=1,NLEVEL
|
|
7210 WRITE(IPARTU,7211) (SIG((II-1)*NLEVEL+I),II=1,NLEVEL)
|
|
7211 FORMAT(5F14.6)
|
|
7250 CONTINUE
|
|
C
|
|
INVERR=0
|
|
C RESTORE WVEC TO UNITS OF 1./RM
|
|
DO 7259 I=1,NOPEN
|
|
7259 WVEC(NBASIS(I))=WVEC(NBASIS(I))*RM
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
C INITIALIZATION ENTRY.
|
|
C
|
|
ENTRY OUTINT(LABEL,ENERGY,NNRG,NLEV,NQN,JLEV,SIG,IC, IECONV,
|
|
1 URED,ITYP,KSAVE,ISST,MINJT,MAXJT,ISIGU,IPARTU,ISAVEU,IPROGM,
|
|
2 MXSIG,ISIGPR,JST,IRSTRT)
|
|
C
|
|
JSTEP=JST
|
|
ITYPE=ITYP
|
|
INVERR=0
|
|
C FIND NLEVEL AS MAX. INDEX FROM JLEV(I,NQN); ALLOW FOR NEG SIG IND
|
|
IJ=(NQN-1)*NLEV
|
|
NLEVEL=0
|
|
DO 6196 II=1,NLEV
|
|
IJ=IJ+1
|
|
6196 NLEVEL=MAX0(NLEVEL,IABS(JLEV(IJ)))
|
|
IF (NLEVEL.GT.0) GO TO 6195
|
|
WRITE(6,603)
|
|
603 FORMAT('0 * * * ERROR. NO LEVELS IN SIG. MATRICES.')
|
|
STOP
|
|
6195 IF (MXSIG.GT.0) THEN
|
|
NLEVEL=MIN0(MXSIG,NLEVEL)
|
|
WRITE(6,604) MXSIG
|
|
604 FORMAT('0 NOTE. MAXIMUM LEVEL FOR WHICH CROSS SECTIONS ARE'
|
|
1 ,' ACCUMULATED MAY BE LIMITED BY MXSIG =',I4)
|
|
ENDIF
|
|
NSTOR=NLEVEL*NLEVEL
|
|
C
|
|
C CALCULATE REQUIRED STORAGE AND INITIALIZE IT. NSTOR LOCATIONS
|
|
C FOR TSIG; NSTOR FOR DEGEN; NNRG*NSTOR FOR SIG.
|
|
IJ=NSTOR*(NNRG+2)
|
|
IC=IC+IJ
|
|
C IC INCREMENTED TO REFLECT ADDITIONAL STORAGE TAKEN UP BY SIG.
|
|
C THIS CODE RELIES ON THE FACT THAT IXNEXT IS PASSED IN ARG. IC
|
|
C AND THAT IT IS REFERENCED BY LOCATION SO THAT THE VALUE
|
|
C IN COMMON IS UPDATED BY THE ASSIGNMENT IC= ...
|
|
C SO THAT THE VALUE IN /MEMORY/ ..,IXNEXT,.. IS SET FOR CHKSTR
|
|
C
|
|
C N.B NUSED MUST BE INITIALIZED NON-NEGATIVE BEFORE CHKSTR
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
C INITIALIZE SIG TO ZERO
|
|
II=2*NSTOR+1
|
|
DO 6200 I=II,IJ
|
|
6200 SIG(I)=0.D0
|
|
C DEGENERACY INFORMATION IN SIG(NSTOR+(LROW-1)*NLEVEL+LCOL)
|
|
II=NSTOR
|
|
DO 6194 LROW=1,NLEVEL
|
|
DO 6194 LCOL=1,NLEVEL
|
|
II=II+1
|
|
6194 CALL DEGENF(LCOL,LROW,SIG(II))
|
|
C
|
|
C PREPARE FOR STORAGE OF SIG ON DA (ISIGU).
|
|
MXREC=NSTOR*NNRG+2
|
|
LOUT=.TRUE.
|
|
IF (ISIGU.LE.0) GO TO 6197
|
|
OPEN(ISIGU,STATUS='UNKNOWN',ACCESS='DIRECT',
|
|
1 FORM='FORMATTED',RECL=80,ERR=6197)
|
|
GO TO 6199
|
|
6197 LOUT=.FALSE.
|
|
WRITE(6,651)
|
|
651 FORMAT('0 STATE-TO-STATE INTEGRAL CROSS-SECTIONS WILL BE ',
|
|
1 'COMPUTED BUT NOT STORED ON DISK')
|
|
GO TO 6198
|
|
6199 WRITE(6,652) ISIGU
|
|
652 FORMAT('0 STATE-TO-STATE INTEGRAL CROSS SECTIONS ',
|
|
1 'WILL BE STORED IN A D.A. FILE ON UNIT',I3)
|
|
6198 CONTINUE
|
|
IF (.NOT. LOUT) GO TO 6208
|
|
C INITIALIZE DATA SET ON ISIGU. . .
|
|
I10=1
|
|
WRITE(ISIGU,100,REC=I10) LABEL
|
|
100 FORMAT(20A4)
|
|
I10=I10+1
|
|
DO 6201 II=1,NNRG
|
|
ISST(II)=I10
|
|
DO 6201 I=1,NSTOR
|
|
WRITE(ISIGU,199,REC=I10)
|
|
199 FORMAT('.',79X)
|
|
6201 I10=I10+1
|
|
WRITE(ISIGU,102,REC=I10)
|
|
102 FORMAT('$',79X)
|
|
I10=I10+1
|
|
C
|
|
C PROCESS IRSTRT POSSIBILITIES NEXT.
|
|
6208 IF (IRSTRT.NE.0) THEN
|
|
WRITE(6,*) ' *** '
|
|
IF (IRSTRT.GT.3) THEN
|
|
WRITE(6,*) ' *** IRSTRT REDUCED TO MAX ALLOWED VALUE = 3'
|
|
IRSTRT=3
|
|
ENDIF
|
|
WRITE(6,655) ISAVEU,IRSTRT
|
|
655 FORMAT(' *** OUTINT. RESTART FROM UNIT(',I3,'). IRSTRT =',I4)
|
|
WRITE(6,*) ' *** '
|
|
IF (KSAVE.NE.0) THEN
|
|
WRITE(6,*) ' *** INCOMPATIBLE WITH KSAVE.NE.0',KSAVE
|
|
WRITE(6,*) ' *** CHANGE INPUT DECK AND RESUBMIT ***'
|
|
STOP
|
|
ENDIF
|
|
IF (ISAVEU.LE.0) THEN
|
|
WRITE(6,*) ' *** INCOMPATIBLE WITH ISAVEU.LE.0',ISAVEU
|
|
WRITE(6,*) ' *** CHANGE INPUT DECK AND RESUBMIT ***'
|
|
STOP
|
|
ELSE
|
|
C***** GISS VERSION FOLLOWS
|
|
OPEN(ISAVEU,STATUS='OLD',FORM='UNFORMATTED')
|
|
ENDIF
|
|
C IF WE ARE DOING A RESTART, SKIP 'NORMAL' KSAVE, ISAVEU PROCESSING.
|
|
GO TO 6209
|
|
ENDIF
|
|
C
|
|
IF(KSAVE.GT.0) GO TO 6300
|
|
C
|
|
C PREPARE TO SAVE S MATRICES ON (ISAVEU).
|
|
C
|
|
IF (ISAVEU.LE.0) GO TO 6209
|
|
WRITE(6,660) ISAVEU,IPROGM
|
|
660 FORMAT(/' COMPUTED S-MATRICES WILL BE SAVED ON UNIT',I3/
|
|
1 ' N.B. THESE ARE *** UNFORMATTED *** IN MOLSCAT VERSION',I3)
|
|
INQUIRE(ISAVEU,OPENED=OPENED)
|
|
IF(.NOT.OPENED) OPEN(ISAVEU,STATUS='UNKNOWN',FORM='UNFORMATTED')
|
|
WRITE(ISAVEU) LABEL,ITYPE,NLEV,NQN,URED,IPROGM
|
|
C WRITE(ISAVEU,800) LABEL,ITYPE,NLEV,NQN,URED,IPROGM
|
|
800 FORMAT(20A4/3I4,F8.4,I4)
|
|
NSQ=NQN*NLEV
|
|
WRITE(ISAVEU) (JLEV(I),I=1,NSQ)
|
|
C WRITE(ISAVEU,801) (JLEV(I),I=1,NSQ)
|
|
801 FORMAT(20I4)
|
|
WRITE(ISAVEU) NLVL,(ELEVEL(I),I=1,NLVL)
|
|
C IF (IPROGM.GE.3) WRITE(ISAVEU,802) NLVL,(ELEVEL(I),I=1,NLVL)
|
|
WRITE(ISAVEU) NNRG,(ENERGY(I),I=1,NNRG)
|
|
C WRITE(ISAVEU,802) NNRG,(ENERGY(I),I=1,NNRG)
|
|
802 FORMAT(I4/(5E16.8))
|
|
GO TO 6209
|
|
C
|
|
6300 NSQ=NQN*NLEV
|
|
IF(ISAVEU.LE.0) GO TO 6301
|
|
WRITE(6,6306) ISAVEU
|
|
6306 FORMAT('0 COMPUTED K-MATRICES WILL BE SAVED ON UNIT',I3)
|
|
INQUIRE(ISAVEU,OPENED=OPENED)
|
|
IF(.NOT.OPENED) OPEN(ISAVEU,STATUS='UNKNOWN',FORM='UNFORMATTED')
|
|
REWIND ISAVEU
|
|
WRITE(ISAVEU) LABEL,ITYPE,NLEV,NQN,URED,IPROGM
|
|
WRITE(ISAVEU) (JLEV(I),I=1,NSQ)
|
|
WRITE(ISAVEU) NLVL,(ELEVEL(I),I=1,NLVL)
|
|
WRITE(ISAVEU) NNRG,(ENERGY(I),I=1,NNRG)
|
|
6304 FORMAT(I4/4(D20.13))
|
|
6301 WRITE(6,6307) KSAVE
|
|
6307 FORMAT('0 EIGENPHASE SUMMARY WILL BE WRITTEN TO UNIT',I3)
|
|
CALL GDATE(CDATE)
|
|
CALL GTIME(CTIME)
|
|
INQUIRE(KSAVE,OPENED=OPENED)
|
|
IF(.NOT.OPENED) OPEN(KSAVE,STATUS='UNKNOWN',FORM='FORMATTED')
|
|
WRITE(KSAVE,6308) (LABEL(I),I=1,19),
|
|
1 CDATE,CTIME,NLEV,NQN,NNRG,(JLEV(I),I=1,NSQ)
|
|
6308 FORMAT(1X,19A4/1X,A11,A9,4X,8X,'NLEV =',
|
|
1 I3,' NQN =',I3,' NNRG =',I4/(1X,'JLEV ',15I4))
|
|
WRITE(KSAVE,6309)
|
|
6309 FORMAT(1X/' JTOT M NOP I',6X,'ENERGY(I)',7X,'EPSUM/PI')
|
|
C
|
|
6209 IF(IPARTU.LE.0) GOTO 6321
|
|
WRITE(6,6311) IPARTU
|
|
6311 FORMAT('0 PARTIAL CROSS SECTIONS WILL BE WRITTEN TO UNIT',I3)
|
|
REWIND IPARTU
|
|
WRITE(IPARTU,800) LABEL,ITYPE,NLEV,NQN,URED,IPROGM
|
|
NSQ=NQN*NLEV
|
|
WRITE(IPARTU,801) (JLEV(I),I=1,NSQ)
|
|
WRITE(IPARTU,802) NLVL,(ELEVEL(I),I=1,NLVL)
|
|
WRITE(IPARTU,802) NNRG,(ENERGY(I),I=1,NNRG)
|
|
C
|
|
C SET UP 'BOOKKEEPING' VARIABLES.
|
|
6321 DO 6100 I=1,NNRG
|
|
MINJT(I)=-1
|
|
IECONV(I)=0
|
|
6100 MAXJT(I)=0
|
|
C
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
C
|
|
ENTRY OUTPCH(SIG,ENERGY,NNRG,MINJT,MAXJT,ISIGPR,LABEL,ISIGU,LWARN)
|
|
C ARGUMENT 'JSTEP' ADDED AUG 86; MOVED TO 'OUTPUT' APR 94 - SG
|
|
C ARGUMENT 'ISIGU' ADDED JUL 92 - JMH
|
|
C PRINT 'INCOMPLETE COUPLED STATES VALUES' ONLY IF ISIGPR.GE.2
|
|
C NEVER PUNCH THESE VALUES (INDICATED BY NEGATIVE SIGMA) HOWEVER.
|
|
IF(ISIGPR.GT.0) GO TO 9000
|
|
WRITE(6,9603) IPUNCH
|
|
9603 FORMAT('0 SIGMA NOT PRINTED BECAUSE ISIGPR = 0'/
|
|
1 ' SIGMA WILL BE WRITTEN TO UNIT IPUNCH =',I4)
|
|
GO TO 9001
|
|
9000 WRITE(6,9678) LABEL
|
|
9678 FORMAT('1',20A4/)
|
|
IF (LWARN) THEN
|
|
WRITE(6,*)
|
|
WRITE(6,*) ' **************************************************'
|
|
WRITE(6,*) ' **************************************************'
|
|
WRITE(6,*) ' ** WARNING. SOME SIGMA MAY BE INCOMPLETE **'
|
|
WRITE(6,*) ' ** OWING TO IFEGEN .GT. 1 **'
|
|
WRITE(6,*) ' **************************************************'
|
|
WRITE(6,*) ' **************************************************'
|
|
ENDIF
|
|
C ***
|
|
C *** AUG 86. FORCE PUNCH FROM INTERNAL SIG MATRIX. BY SETTING LOUT
|
|
LOUT=.FALSE.
|
|
C ***
|
|
WRITE(6,9679)
|
|
9679 FORMAT(/12X,'ENERGY JTOTL JSTEP JTOTU',9X,
|
|
1 'F I',10X,'SIG(F,I)'/)
|
|
IF (LOUT) GO TO 9500
|
|
C OUTPUT FROM STORAGE IN SIG.
|
|
9001 IJ=2*NSTOR
|
|
XJSTEP=DBLE(JSTEP)/DBLE(JHALF)
|
|
IF(JSTEP.NE.1) WRITE(6,9604) XJSTEP
|
|
9604 FORMAT(' *** N.B. CROSS SECTIONS HAVE BEEN MULTIPLIED BY',F5.1,
|
|
1 ' TO ACCOUNT FOR JSTEP')
|
|
DO 9900 K=1,NNRG
|
|
MN=MINJT(K)
|
|
MXJ=MAXJT(K)
|
|
EK=ENERGY(K)
|
|
DO 9900 I=1,NLEVEL
|
|
DO 9900 II=1,NLEVEL
|
|
IJ=IJ+1
|
|
SIJ=SIG(IJ)*XJSTEP
|
|
IF (ISIGPR.LE.0) GO TO 9909
|
|
IF (SIJ.GE.EPS) THEN
|
|
WRITE(6,101) BLANK,EK,MN,JSTEP,MXJ,II,I,SIJ,BLANK
|
|
ELSEIF (ABS(SIJ).GE.EPS.AND.ISIGPR.GE.2) THEN
|
|
WRITE(6,101) BLANK,EK,MN,JSTEP,MXJ,II,I,ABS(SIJ),STAR
|
|
ENDIF
|
|
C DO NOT PUNCH DIAGONALS, VERY SMALL, OR 'INCOMPLETE CS VALUES'
|
|
9909 IF (II.EQ.I .OR. SIJ.LE.EPS) GO TO 9900
|
|
WRITE(IPUNCH,101) STAR,EK,MN,JSTEP,MXJ,II,I,SIJ
|
|
9900 CONTINUE
|
|
RETURN
|
|
C BELOW PUNCHES FROM DISK(ISIGU ) STORAGE.
|
|
9500 CALL RDPCH(ISIGU)
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
C
|
|
ENTRY OUTERR(INVER)
|
|
INVERR=INVER
|
|
RETURN
|
|
END
|
|
FUNCTION PARITY3(I)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
PARITY3=1.D0
|
|
IF((I/2)*2-I.NE.0) PARITY3=-1.D0
|
|
RETURN
|
|
END
|
|
SUBROUTINE PERT1(N,CX,SX,XSQ,X,H,V0,V1,V2,
|
|
X EYE11,EYE12,EYE22,A1,A2,A1P,A2P)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C-------------------------------------------------------------------
|
|
C THIS ROUTINE CALCULATES AND STORES THE PERTURBATION
|
|
C INTEGRALS IN EYE11, EYE12 AND EYE22 FOR THE INTERVAL.
|
|
C ALSO ON RETURN V0, V1 AND V2 CONTAIN THE PERTURBATION
|
|
C INTEGRALS FOR THE CURRENT STEP WHICH ARE USED FOR
|
|
C THE STEP SIZE DETERMINATION ONLY.
|
|
C-------------------------------------------------------------------
|
|
LOGICAL IFIRST
|
|
DIMENSION CX(1),SX(1),XSQ(1),X(1)
|
|
DIMENSION V0(N,N),V1(N,N),V2(N,N)
|
|
DIMENSION EYE11(N,N),EYE22(N,N)
|
|
DIMENSION EYE12(N,N),A1(N),A1P(N),A2(N),A2P(N)
|
|
DATA TOL/1.D-3/
|
|
DATA IFIRST/.FALSE./
|
|
C-------------------------------------------------------------------
|
|
C STORE CONSTANTS ON THE FIRST CALL.
|
|
C-------------------------------------------------------------------
|
|
IF (IFIRST) GO TO 100
|
|
CON1 = 1.D0/24.D0
|
|
CON2 = 1.D0/3.D0
|
|
CON3 = 1.D0/120.D0
|
|
CON4 = 1.D0/12.D0
|
|
CON5 = 0.2D0
|
|
CON6 = 1.D0/5040.D0
|
|
CON7 = 1.D0/30240.D0
|
|
CON8 = 1.D0/15.D0
|
|
CON9 = 1.D0/840.D0
|
|
CON11 = 1.D0/180.D0
|
|
CON12 = 1.D0/6.D0
|
|
CON13 = 1.D0/560.D0
|
|
CON10 = 1.D0/20160.D0
|
|
CON14 = 1.D0/42.D0
|
|
CON15 = 1.D0/8.D0
|
|
CON16 = 1.D0/48.D0
|
|
CON17 = 1.D0/168.D0
|
|
CON18 = 1.D0/112.D0
|
|
CON19 = 1.D0/40.D0
|
|
CON20 = 1.D0/36.D0
|
|
CON21 = 1.D0/216.D0
|
|
IFIRST = .TRUE.
|
|
100 HSQ = H*H
|
|
HINV = 1.D0/H
|
|
HSQINV = 1.D0/HSQ
|
|
HF = H**3
|
|
C-------------------------------------------------------------------
|
|
C THIS IS REACHED ONLY WHEN CORRECTIONS TO THE SECOND
|
|
C DERIVATIVE OF THE POTENTIAL ARE NOT DESIRED.
|
|
C-------------------------------------------------------------------
|
|
DO 200 I = 1,N
|
|
XI = X(I)
|
|
SXI = SX(I)
|
|
CXI = CX(I)
|
|
XSXI = XI*SXI
|
|
XSQI = XSQ(I)
|
|
G1 = XSXI/XSQI
|
|
G2 = 8.D0*XSQI
|
|
G3 = XSQI*XSQI
|
|
G4 = 4.D0*XSQI
|
|
G5 = 2.D0*XSQI
|
|
G6 = 0.5D0*G1
|
|
G7 = G3*XSQI
|
|
DO 200 J = I,N
|
|
XSQJ = XSQ(J)
|
|
IF (I .EQ. J) GO TO 160
|
|
XJ = X(J)
|
|
SXJ = SX(J)
|
|
CXJ = CX(J)
|
|
XSXJ = XJ*SXJ
|
|
F5 = XSQI*XSQJ
|
|
F6 = XSXI*XSXJ
|
|
F7 = CXI*CXJ
|
|
SD = XSQI-XSQJ
|
|
SUM = XSQI+XSQJ
|
|
COEF = HF/(2.D0*F6)
|
|
HC = H*COEF*V1(I,J)
|
|
COEF = COEF*V0(I,J)
|
|
D = XI-XJ
|
|
IF (ABS(D) .GT. TOL) GO TO 130
|
|
IF (ABS(SUM) .LT. TOL) GO TO 150
|
|
S = XI+XJ
|
|
SSQ = S*S
|
|
DSQ = D*D
|
|
SHALF = S*0.5D0
|
|
IF (XSQI .LT. 0.D0 .AND. XSQJ .LT. 0.D0) GO TO 110
|
|
IF (F5 .LT. 0.D0) GO TO 130
|
|
C2 = COS(SHALF)
|
|
S2 = SIN(SHALF)
|
|
GO TO 120
|
|
110 C2 = COSH(SHALF)
|
|
S2 = -SINH(SHALF)
|
|
SSQ = -SSQ
|
|
DSQ = -DSQ
|
|
120 SS2 = S*S2
|
|
GO TO 140
|
|
C-------------------------------------------------------------------
|
|
C GENERAL FORMULAS
|
|
C-------------------------------------------------------------------
|
|
130 F25 = 1.D0/SD
|
|
F8 = XSXJ*CXI
|
|
F9 = XSXI*CXJ
|
|
F12 = 2.D0*COEF*F25
|
|
F13 = HC*F25
|
|
F18 = 2.D0*SUM
|
|
R1V0 = F12*(F9-F8)
|
|
R2V0 = F12*(XSXI-XSXJ)
|
|
R1V1 = F13*((F18*(F7-1.D0)+4.D0*F6)*F25+F9-F8)
|
|
R2V1 = F13*(F18*(CXI-CXJ)*F25+XSXI+XSXJ)
|
|
GO TO 170
|
|
C-------------------------------------------------------------------
|
|
C THE FOLLOWING FORMULAS ARE VALID WHEN THE DIFFERENCE BETWEEN
|
|
C THE WAVEVECTORS TIMES THE STEP SIZE IS SMALL.
|
|
C-------------------------------------------------------------------
|
|
140 F14 = SS2/SSQ
|
|
F16 = DSQ*CON1
|
|
F17 = DSQ/80.D0
|
|
F15 = SS2*C2
|
|
F36 = DSQ*CON17
|
|
F37 = DSQ*CON18
|
|
F38 = DSQ*CON19
|
|
F39 = 1.D0-DSQ*CON15*(1.D0-DSQ*CON16*(1.D0-DSQ*CON3))
|
|
F40 = 1.D0/SSQ
|
|
R1V0 = COEF*(1.D0-DSQ*CON12*(1.D0-DSQ/20.D0*(1.D0-DSQ*CON14))+
|
|
X2.D0*F15*F40)
|
|
R2V0 = COEF*(F14*(F39)+0.5D0*C2*(1.D0-F16*(1.D0-F17*(1.D0-F36)))
|
|
X)*2.D0
|
|
R1V1 = HC*((-2.D0*SS2*F14+F15)*F40-F16*(1.D0-DSQ*CON8*(1.D0-3.D0*
|
|
XF37)))
|
|
R2V1 = HC*(-S2*CON4*(1.D0-F38*(1.D0-F37))+(0.5D0*C2-F14)/S*(1.D0-
|
|
XF16*(1.D0-F17)))*D
|
|
GO TO 170
|
|
C-------------------------------------------------------------------
|
|
C THE FOLLOWING FORMULAS ARE VALID WHEN BOTH OF THE WAVEVECTORS
|
|
C TIMES THE STEP SIZE ARE SMALL.
|
|
C-------------------------------------------------------------------
|
|
150 F20 = SUM*SUM
|
|
F22 = G4*XSQJ
|
|
F23 = XSQJ*XSQJ
|
|
F29 = SUM*CON12
|
|
F28 = 14.D0*F5
|
|
F30 = COEF*2.D0
|
|
R1V0 = F30*(1.D0-F29+(F20+F22)*CON3-(SUM*(G3+F28+F23))*CON6)
|
|
R2V0 = F30*(1.D0-F29+(XSQI*SUM+F23)*CON3-(G3+F23)*SUM*CON6)
|
|
R1V1 = -HC*CON4*(SUM-(F20+F22)*CON8+(SUM*(G3+F28+F23))*CON13)
|
|
R2V1 = HC*(CON4+SUM*CON11-(3.D0*F20-G5*XSQJ)*CON10)*SD
|
|
GO TO 170
|
|
C-------------------------------------------------------------------
|
|
C FORMULAS VALID FOR DIAGONAL ELEMENTS ONLY.
|
|
C THESE DIAGONAL ELEMENTS ALSO CONTAINS CONTRIBUTIONS TO THE
|
|
C SECOND DERIVATIVE OF THE POTENTIAL.
|
|
C-------------------------------------------------------------------
|
|
160 F6 = XSXI*XSXI
|
|
CXJ = CXI
|
|
XSXJ = XSXI
|
|
F7 = CXI*CXI
|
|
COEF = HF/(2.D0*F6)
|
|
HHC = HSQ*COEF*V2(I,J)
|
|
HC = H*COEF*V1(I,J)
|
|
COEF = COEF*V0(I,J)
|
|
R1V0 = COEF*(1.D0+CXI*G1)
|
|
R2V0 = COEF*(G1+CXI)
|
|
R1V1 = HC*(CXI-G1)*G6
|
|
R2V1 = 0.D0
|
|
R1V2 = HHC*(CXI*(CXI+(XSQI-2.D0)*G6)/XSQI*0.25D0+CON1)
|
|
R2V2 = HHC*((6.D0+XSQI)*CXI*CON2+(XSQI-2.D0)*G1)/G2
|
|
TERM1 = -CXJ*(R1V0+R1V1+R1V2)
|
|
CCIJ = F6*(R1V0+R1V1+R1V2)*HSQINV
|
|
CSIJ = XSXI*(R2V0+R2V1+R2V2+TERM1)*HINV
|
|
SSIJ = (R1V0-R1V1+R1V2-CXJ*(R2V0-R2V1+R2V2)-CXI*(R2V0+R2V1+R2V2)+
|
|
XF7*(R1V0+R1V1+R1V2))
|
|
CCJI = CCIJ
|
|
CSJI = XSXJ*(R2V0-R2V1+R2V2-CXI*(R1V0+R1V1+R1V2))*HINV
|
|
SSJI = SSIJ
|
|
GO TO 180
|
|
C-------------------------------------------------------------------
|
|
C CC- COSINE-COSINE INTEGRALS
|
|
C CS- COSINE-SINE INTEGRALS
|
|
C SS- SINE-SINE INTEGRALS
|
|
C-------------------------------------------------------------------
|
|
170 TERM1 = -CXJ*(R1V0+R1V1)
|
|
CCIJ = F6*(R1V0+R1V1)*HSQINV
|
|
CSIJ = XSXI*(R2V0+R2V1+TERM1)*HINV
|
|
SSIJ = R1V0-R1V1-CXJ*(R2V0-R2V1)-CXI*(R2V0+R2V1)+F7*(R1V0+R1V1)
|
|
CCJI = CCIJ
|
|
CSJI = XSXJ*(R2V0-R2V1-CXI*(R1V0+R1V1))*HINV
|
|
SSJI = SSIJ
|
|
180 V0(I,J) = CCIJ
|
|
V0(J,I) = CCJI
|
|
V1(I,J) = CSIJ
|
|
V1(J,I) = CSJI
|
|
V2(I,J) = SSIJ
|
|
V2(J,I) = SSJI
|
|
TERM1 = A1P(J)*SSIJ+A1(J)*CSJI
|
|
TERM2 = A1P(J)*CSIJ+A1(J)*CCIJ
|
|
TERM3 = A2P(J)*SSIJ+A2(J)*CSJI
|
|
TERM4 = A2P(J)*CSIJ+A2(J)*CCIJ
|
|
EYE11(I,J) = A1P(I)*TERM1+A1(I)*TERM2+EYE11(I,J)
|
|
EYE11(J,I) = EYE11(I,J)
|
|
EYE22(I,J) = A2P(I)*TERM3+A2(I)*TERM4+EYE22(I,J)
|
|
EYE22(J,I) = EYE22(I,J)
|
|
EYE12(I,J) = A1P(I)*TERM3+A1(I)*TERM4+EYE12(I,J)
|
|
IF (I .EQ. J) GO TO 200
|
|
EYE12(J,I) = A2P(I)*TERM1+A2(I)*TERM2+EYE12(J,I)
|
|
200 CONTINUE
|
|
RETURN
|
|
C----------------***END-PERT1***-------------------------------------
|
|
END
|
|
SUBROUTINE PERT2(N,CX,SX,XSQ,X,H,V0,V1,V2,
|
|
X EYE11,EYE12,EYE22,A1,A2,A1P,A2P)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C-------------------------------------------------------------------
|
|
C THIS ROUTINE CALCULATES AND STORES THE PERTURBATION
|
|
C INTEGRALS IN EYE11, EYE12 AND EYE22 FOR THE INTERVAL.
|
|
C ALSO ON RETURN V0, V1 AND V2 CONTAIN THE PERTURBATION
|
|
C INTEGRALS FOR THE CURRENT STEP WHICH ARE USED FOR
|
|
C THE STEP SIZE DETERMINATION ONLY.
|
|
C-------------------------------------------------------------------
|
|
LOGICAL IFIRST
|
|
DIMENSION CX(1),SX(1),XSQ(1),X(1)
|
|
DIMENSION V0(N,N),V1(N,N),V2(N,N)
|
|
DIMENSION EYE11(N,N),EYE22(N,N)
|
|
DIMENSION EYE12(N,N),A1(N),A1P(N),A2(N),A2P(N)
|
|
DATA TOL/1.D-3/
|
|
DATA IFIRST/.FALSE./
|
|
C-------------------------------------------------------------------
|
|
C STORE CONSTANTS ON THE FIRST CALL.
|
|
C-------------------------------------------------------------------
|
|
IF (IFIRST) GO TO 100
|
|
CON1 = 1.D0/24.D0
|
|
CON2 = 1.D0/3.D0
|
|
CON3 = 1.D0/120.D0
|
|
CON4 = 1.D0/12.D0
|
|
CON5 = 0.2D0
|
|
CON6 = 1.D0/5040.D0
|
|
CON7 = 1.D0/30240.D0
|
|
CON8 = 1.D0/15.D0
|
|
CON9 = 1.D0/840.D0
|
|
CON11 = 1.D0/180.D0
|
|
CON12 = 1.D0/6.D0
|
|
CON13 = 1.D0/560.D0
|
|
CON10 = 1.D0/20160.D0
|
|
CON14 = 1.D0/42.D0
|
|
CON15 = 1.D0/8.D0
|
|
CON16 = 1.D0/48.D0
|
|
CON17 = 1.D0/168.D0
|
|
CON18 = 1.D0/112.D0
|
|
CON19 = 1.D0/40.D0
|
|
CON20 = 1.D0/36.D0
|
|
CON21 = 1.D0/216.D0
|
|
IFIRST = .TRUE.
|
|
100 HSQ = H*H
|
|
HINV = 1.D0/H
|
|
HSQINV = 1.D0/HSQ
|
|
HF = H**3
|
|
C-------------------------------------------------------------------
|
|
C THE FOLLOWING IS USED WHEN CORRECTIONS TO THE SECOND
|
|
C DERIVATIVE OF THE POTENTIAL ARE DESIRED.
|
|
C-------------------------------------------------------------------
|
|
DO 190 I = 1,N
|
|
XI = X(I)
|
|
SXI = SX(I)
|
|
CXI = CX(I)
|
|
XSXI = XI*SXI
|
|
XSQI = XSQ(I)
|
|
G1 = XSXI/XSQI
|
|
G2 = 8.D0*XSQI
|
|
G3 = XSQI*XSQI
|
|
G4 = 4.D0*XSQI
|
|
G5 = 2.D0*XSQI
|
|
G6 = 0.5D0*G1
|
|
G7 = G3*XSQI
|
|
DO 190 J = I,N
|
|
XSQJ = XSQ(J)
|
|
IF (I .EQ. J) GO TO 160
|
|
XJ = X(J)
|
|
SXJ = SX(J)
|
|
CXJ = CX(J)
|
|
XSXJ = XJ*SXJ
|
|
F5 = XSQI*XSQJ
|
|
F6 = XSXI*XSXJ
|
|
F7 = CXI*CXJ
|
|
SD = XSQI-XSQJ
|
|
SUM = XSQI+XSQJ
|
|
COEF = HF/(2.D0*F6)
|
|
HHC = HSQ*COEF*V2(I,J)
|
|
HC = H*COEF*V1(I,J)
|
|
COEF = COEF*V0(I,J)
|
|
D = XI-XJ
|
|
IF (ABS(D) .GT. TOL) GO TO 130
|
|
IF (ABS(SUM) .LT. TOL) GO TO 150
|
|
S = XI+XJ
|
|
SSQ = S*S
|
|
DSQ = D*D
|
|
SHALF = S*0.5D0
|
|
IF (XSQI .LT. 0.D0 .AND. XSQJ .LT. 0.D0) GO TO 110
|
|
IF (F5 .LT. 0.D0) GO TO 130
|
|
C2 = COS(SHALF)
|
|
S2 = SIN(SHALF)
|
|
GO TO 120
|
|
110 C2 = COSH(SHALF)
|
|
S2 = -SINH(SHALF)
|
|
SSQ = -SSQ
|
|
DSQ = -DSQ
|
|
120 SS2 = S*S2
|
|
GO TO 140
|
|
C-------------------------------------------------------------------
|
|
C GENERAL FORMULAS
|
|
C-------------------------------------------------------------------
|
|
130 F25 = 1.D0/SD
|
|
F8 = XSXJ*CXI
|
|
F9 = XSXI*CXJ
|
|
F10 = SD*SD
|
|
F11 = 2.D0*XSQJ
|
|
F12 = 2.D0*COEF*F25
|
|
F13 = HC*F25
|
|
F18 = 2.D0*SUM
|
|
F19 = 0.25D0*F25
|
|
F24 = -8.D0*(SUM+F11)
|
|
F26 = -8.D0*(SUM+G5)
|
|
F27 = 1.D0/F10
|
|
F31 = HHC*F27
|
|
R1V0 = F12*(F9-F8)
|
|
R2V0 = F12*(XSXI-XSXJ)
|
|
R1V1 = F13*((F18*(F7-1.D0)+4.D0*F6)*F25+F9-F8)
|
|
R2V1 = F13*(F18*(CXI-CXJ)*F25+XSXI+XSXJ)
|
|
R1V2 = F31*((((F10+F24)*F9-(F10+F26)*F8)*F19+SUM*(F7+1.D0)+2.D0*
|
|
XF6))
|
|
R2V2 = F31*(((F10+F24)*XSXI-(F10+F26)*XSXJ)*F19+SUM*(CXI+CXJ))
|
|
GO TO 170
|
|
C-------------------------------------------------------------------
|
|
C THE FOLLOWING FORMULAS ARE VALID WHEN THE DIFFERENCE BETWEEN
|
|
C THE WAVEVECTORS TIMES THE STEP SIZE IS SMALL.
|
|
C-------------------------------------------------------------------
|
|
140 F14 = SS2/SSQ
|
|
F16 = DSQ*CON1
|
|
F17 = DSQ/80.D0
|
|
F15 = SS2*C2
|
|
F36 = DSQ*CON17
|
|
F37 = DSQ*CON18
|
|
F38 = DSQ*CON19
|
|
F39 = 1.D0-DSQ*CON15*(1.D0-DSQ*CON16*(1.D0-DSQ*CON3))
|
|
F40 = 1.D0/SSQ
|
|
F41 = (SSQ-8.D0)*0.5D0*F14
|
|
R1V0 = COEF*(1.D0-DSQ*CON12*(1.D0-DSQ/20.D0*(1.D0-DSQ*CON14))+
|
|
X2.D0*F15*F40)
|
|
R2V0 = COEF*(F14*(F39)+0.5D0*C2*(1.D0-F16*(1.D0-F17*(1.D0-F36)))
|
|
X)*2.D0
|
|
R1V1 = HC*((-2.D0*SS2*F14+F15)*F40-F16*(1.D0-DSQ*CON8*(1.D0-3.D0*
|
|
XF37)))
|
|
R2V1 = HC*(-S2*CON4*(1.D0-F38*(1.D0-F37))+(0.5D0*C2-F14)/S*(1.D0-
|
|
XF16*(1.D0-F17)))*D
|
|
R1V2 = HHC*(C2*(2.D0*C2+F41)*F40+(1.D0-DSQ*CON5*(1.D0-11.D0*F36*
|
|
X(1.D0-DSQ*CON20)))*CON4)*0.5D0
|
|
R2V2 = HHC*((F39)*(C2+F41*0.5D0)*F40+(1.D0-F38*(3.D0-F37*(5.D0-
|
|
X7.D0*DSQ*CON21)))*C2*CON1)
|
|
GO TO 170
|
|
C-------------------------------------------------------------------
|
|
C THE FOLLOWING FORMULAS ARE VALID WHEN BOTH OF THE WAVEVECTORS
|
|
C TIMES THE STEP SIZE ARE SMALL.
|
|
C-------------------------------------------------------------------
|
|
150 F20 = SUM*SUM
|
|
F21 = SUM*CON5
|
|
F22 = G4*XSQJ
|
|
F23 = XSQJ*XSQJ
|
|
F29 = SUM*CON12
|
|
F28 = 14.D0*F5
|
|
F30 = COEF*2.D0
|
|
R1V0 = F30*(1.D0-F29+(F20+F22)*CON3-(SUM*(G3+F28+F23))*CON6)
|
|
R2V0 = F30*(1.D0-F29+(XSQI*SUM+F23)*CON3-(G3+F23)*SUM*CON6)
|
|
R1V1 = -HC*CON4*(SUM-(F20+F22)*CON8+(SUM*(G3+F28+F23))*CON13)
|
|
R2V1 = HC*(CON4+SUM*CON11-(3.D0*F20-G5*XSQJ)*CON10)*SD
|
|
R1V2 = HHC*(1.D0-F21+11.D0*(F20+F22)*CON9-11.D0*(SUM*(G3+F28+F23))
|
|
X*CON7)*CON4
|
|
R2V2 = HHC*(1.D0-F21+(11.D0*F20-19.D0*F5)*CON9-(11.D0*(G7+F23*
|
|
XXSQJ)+3.D0*F5*SUM)*CON7)*CON4
|
|
GO TO 170
|
|
C-------------------------------------------------------------------
|
|
C FORMULAS VALID FOR DIAGONAL ELEMENTS ONLY.
|
|
C-------------------------------------------------------------------
|
|
160 F6 = XSXI*XSXI
|
|
CXJ = CXI
|
|
XSXJ = XSXI
|
|
F7 = CXI*CXI
|
|
COEF = HF/(2.D0*F6)
|
|
HHC = HSQ*COEF*V2(I,J)
|
|
HC = H*COEF*V1(I,J)
|
|
COEF = COEF*V0(I,J)
|
|
R1V0 = COEF*(1.D0+CXI*G1)
|
|
R2V0 = COEF*(G1+CXI)
|
|
R1V1 = HC*(CXI-G1)*G6
|
|
R2V1 = 0.D0
|
|
R1V2 = HHC*(CXI*(CXI+(XSQI-2.D0)*G6)/XSQI*0.25D0+CON1)
|
|
R2V2 = HHC*((6.D0+XSQI)*CXI*CON2+(XSQI-2.D0)*G1)/G2
|
|
C-------------------------------------------------------------------
|
|
C CC- COSINE-COSINE INTEGRALS
|
|
C CS- COSINE-SINE INTEGRALS
|
|
C SS- SINE-SINE INTEGRALS
|
|
C-------------------------------------------------------------------
|
|
170 TERM1 = -CXJ*(R1V0+R1V1+R1V2)
|
|
CCIJ = F6*(R1V0+R1V1+R1V2)*HSQINV
|
|
CSIJ = XSXI*(R2V0+R2V1+R2V2+TERM1)*HINV
|
|
SSIJ = (R1V0-R1V1+R1V2-CXJ*(R2V0-R2V1+R2V2)-CXI*(R2V0+R2V1+R2V2)+
|
|
XF7*(R1V0+R1V1+R1V2))
|
|
CCJI = CCIJ
|
|
CSJI = XSXJ*(R2V0-R2V1+R2V2-CXI*(R1V0+R1V1+R1V2))*HINV
|
|
SSJI = SSIJ
|
|
V0(I,J) = CCIJ
|
|
V0(J,I) = CCJI
|
|
V1(I,J) = CSIJ
|
|
V1(J,I) = CSJI
|
|
V2(I,J) = SSIJ
|
|
V2(J,I) = SSJI
|
|
TERM1 = A1P(J)*SSIJ+A1(J)*CSJI
|
|
TERM2 = A1P(J)*CSIJ+A1(J)*CCIJ
|
|
TERM3 = A2P(J)*SSIJ+A2(J)*CSJI
|
|
TERM4 = A2P(J)*CSIJ+A2(J)*CCIJ
|
|
EYE11(I,J) = A1P(I)*TERM1+A1(I)*TERM2+EYE11(I,J)
|
|
EYE11(J,I) = EYE11(I,J)
|
|
EYE22(I,J) = A2P(I)*TERM3+A2(I)*TERM4+EYE22(I,J)
|
|
EYE22(J,I) = EYE22(I,J)
|
|
EYE12(I,J) = A1P(I)*TERM3+A1(I)*TERM4+EYE12(I,J)
|
|
IF (I .EQ. J) GO TO 190
|
|
EYE12(J,I) = A2P(I)*TERM1+A2(I)*TERM2+EYE12(J,I)
|
|
190 CONTINUE
|
|
RETURN
|
|
C----------------***END-PERT2***-------------------------------------
|
|
END
|
|
FUNCTION PLM(LIN,MIN,COSTH)
|
|
C
|
|
C COMPUTES NORMALIZED ASSOC. LEGENDRE POLYNOMIALS BY RECURSION.
|
|
C THE VALUES RETURNED ARE NORMALIZED FOR INTEGRATION OVER X
|
|
C (I.E. INTEGRATION OVER COS THETA BUT NOT PHI).
|
|
C NOTE THAT THE NORMALIZATION GIVES
|
|
C PLM(L,0,1)=SQRT(L+0.5)
|
|
C PLM(L,0,X)=SQRT(L+0.5) P(L,X)
|
|
C FOR M.NE.0, THE VALUE RETURNED DIFFERS FROM THE USUAL
|
|
C DEFINITION OF THE ASSOCIATED LEGENDRE POLYNOMIAL
|
|
C (E.G. EDMONDS PAGES 23-24)
|
|
C BY A FACTOR OF (-1)**M*SQRT(L+0.5)*SQRT((L-M)!/(L+M)!)
|
|
C THUS THE SPHERICAL HARMONICS ARE
|
|
C CLM = PLM * EXP(I*M*PHI) / SQRT(L+0.5)
|
|
C YLM = PLM * EXP(I*M*PHI) / SQRT(2*PI)
|
|
C THIS ROUTINE ALWAYS RETURNS THE VALUE FOR ABS(MIN); NOTE THAT
|
|
C FOR MIN.LT.0 THIS VALUE SHOULD BE MULTIPLIED BY PARITY3(MIN)
|
|
C
|
|
C FUNCTION PM1(LIN,MIN,COSTH)
|
|
C This routine appears to be much more stable for large l, m than
|
|
C the routine from Nerf/ modified according to R.T Pack
|
|
C It was obtained:
|
|
C From: Marie-Lise Dubernet <mld@ipp-garching.mpg.de>
|
|
C Date: Mon, 19 Jun 1995 12:48:11 +0200 (MET DST)
|
|
C Some mods 27-28 June 95 by SG for speed and to accord w/ MOLSCAT
|
|
C Bugs fixed 21 Sept 95 (SG)
|
|
C
|
|
IMPLICIT DOUBLE PRECISION(A-H,O-Z)
|
|
C
|
|
C CHECK FOR ABS(COSTH).LE.1.D0 ...
|
|
IF (ABS(COSTH).GT.1.D0) THEN
|
|
WRITE(6,*) ' *** ILLEGAL ARGUMENT TO PLM. X =',COSTH
|
|
STOP
|
|
ENDIF
|
|
C SAVE ARGUMENTS IN LOCAL VARIABLES
|
|
L=LIN
|
|
M=ABS(MIN)
|
|
X=COSTH
|
|
C
|
|
C IF M>L PLM=0 !
|
|
IF(M.GT.L) THEN
|
|
PLM=0.D0
|
|
RETURN
|
|
ENDIF
|
|
LMAX=L
|
|
C
|
|
IF (M.GT.0) GO TO 5
|
|
C HERE FOR REGULAR LEGENDRE POLYNOMIALS
|
|
PLM=1.D0
|
|
PM2=0.D0
|
|
XL=0.D0
|
|
DO 2 L=1,LMAX
|
|
XL=XL+1.D0
|
|
PP=((2.D0*XL-1.D0)*X*PLM-(XL-1.D0)*PM2)/XL
|
|
PM2=PLM
|
|
2 PLM=PP
|
|
GO TO 9000
|
|
C
|
|
C HERE FOR ALEXANDER-LEGENDRE POLYNOMIALS
|
|
C
|
|
5 IMAX=2*M
|
|
RAT=1.D0
|
|
AI=0.D0
|
|
DO 6 I=2,IMAX,2
|
|
AI=AI+2.D0
|
|
6 RAT=RAT*((AI-1.D0)/AI)
|
|
C Y=SIN(THETA)
|
|
Y=SQRT(1.D0-X*X)
|
|
PLM=SQRT(RAT)*(Y**M)
|
|
PM2=0.D0
|
|
LOW=M+1
|
|
XL=LOW-1
|
|
DO 10 L=LOW,LMAX
|
|
XL=XL+1.D0
|
|
AL=DBLE((L+M)*(L-M))
|
|
AL=1.D0/AL
|
|
AL2=(DBLE((L+M-1)*(L-M-1)))*AL
|
|
AL=SQRT(AL)
|
|
AL2=SQRT(AL2)
|
|
PP=(2.D0*XL-1.D0)*X*PLM*AL-PM2*AL2
|
|
PM2=PLM
|
|
10 PLM=PP
|
|
PLM=PLM*PARITY3(MIN)
|
|
C
|
|
C CONVERT TO MOLSCAT'S IDIOSYNCRATIC NORMALIZATION
|
|
9000 PLM=PLM*SQRT(XL+0.5D0)
|
|
RETURN
|
|
END
|
|
|
|
SUBROUTINE POTENT (W, VECNOW, SCMAT, EIGNOW, HP, SCR,
|
|
1 RNOW, DRNOW, EN, XLARGE, NCH,
|
|
2 P, MXLAM, VL, IV, RMLMDA, ERED, EINT, CENT, NPOTL)
|
|
* ----------------------------------------------------------------------
|
|
* THIS SUBROUTINE FIRST SETS UP THE WAVE-VECTOR MATRICES:
|
|
* W = W[RNOW + 0.5 DRNOW/SQRT(3)] AND W = W[RNOW - 0.5 DRNOW/SQRT(3)]
|
|
* B A
|
|
* THEN DIAGONALIZES THE AVERAGE; I.E. 0.5 (W + W )
|
|
* B A
|
|
* THE RADIAL DERIVATIVE OF THE WAVEVECTOR MATRIX IS CALCULATED BY FINIT
|
|
* DIFFERENCE, USING THE NODES OF A TWO-POINT GAUSS-LEGENDRE QUADRATURE
|
|
* 1/2
|
|
* D(W)/DR = 3 (W - W ) / DRNOW
|
|
* B A
|
|
* THIS IS THEN TRANSFORMED INTO THE LOCAL BASIS
|
|
* AUTHOR: MILLARD ALEXANDER
|
|
* CURRENT REVISION DATE: 25-SEPT-87
|
|
* ---------------------------------------------------------------------
|
|
* VARIABLES IN CALL LIST:
|
|
* W: ON RETURN: CONTAINS TRANSFORM OF DH/DR
|
|
* THIS IS THE SAME AS THE NEGATIVE OF THE
|
|
* WN-TILDE-PRIME MATRIX
|
|
* VECNOW: ON RETURN: CONTAINS MATRIX OF EIGENVECTORS
|
|
* SCMAT: SCRATCH MATRIX
|
|
* EIGNOW: ON RETURN: CONTAINS EIGENVALUES OF WAVEVECTOR MATRIX
|
|
* HP: ON RETURN: CONTAINS DIAGONAL ELEMENTS OF TRANSFORMED DH/D
|
|
* THIS IS THE SAME AS THE NEGATIVE OF THE DIAGON
|
|
* ELEMENTS OF THE WN-TILDE-PRIME MATRIX
|
|
* SCR: SCRATCH VECTOR
|
|
* RNOW: MIDPOINT OF THE CURRENT INTERVAL
|
|
* DRNOW: WIDTH OF THE CURRENT INTERVAL
|
|
* EN: TOTAL ENERGY IN ATOMIC UNITS
|
|
* XLARGE: ON RETURN CONTAINS LARGEST OFF-DIAGONAL ELEMENT IN
|
|
* WN-TILDE-PRIME MATRIX
|
|
* NCH: NUMBER OF CHANNELS. SAME AS
|
|
* MAXIMUM ROW DIMENSION OF MATRICES AND MAXIMUM DIMENSION O
|
|
* VECTORS
|
|
* ----------------------------------------------------------------------
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
* REAL EIGNOW, HP, SCMAT, SCR, VECNOW, W
|
|
* REAL DRNOW, EN, FACT, HALF, ONE, RA, RB, RNOW, SQ3, XLARGE, XMIN1
|
|
INTEGER ICOL, IERR, IONE, IPT, NCH, NCHM1, NCHP1, NROW
|
|
* SQUARE MATRICES (OF ROW DIMENSION NCH)
|
|
DIMENSION W(1), VECNOW(1), SCMAT(1)
|
|
* VECTORS DIMENSIONED AT LEAST NCH
|
|
DIMENSION EIGNOW(1), HP(1), SCR(1)
|
|
C
|
|
DIMENSION P(1),VL(1),IV(1),EINT(1),CENT(1)
|
|
C
|
|
DATA IONE / 1 /
|
|
DATA ONE, XMIN1, HALF, SQ3 /1.D0, -1.D0, 0.5D0, 1.732050807D0/
|
|
NCHP1 = NCH + 1
|
|
NCHM1 = NCH - 1
|
|
RA = RNOW - 0.5 * DRNOW / SQ3
|
|
RB = RNOW + 0.5 * DRNOW / SQ3
|
|
* SCMAT IS USED TO STORE THE WAVEVECTOR MATRIX AT RB
|
|
CALL WAVMAT (W, NCH, RA, P, VL, IV, ERED, EINT, CENT,
|
|
1 RMLMDA, SCR, MXLAM, NPOTL)
|
|
CALL WAVMAT (SCMAT, NCH, RB, P, VL, IV, ERED, EINT, CENT,
|
|
1 RMLMDA, SCR, MXLAM, NPOTL)
|
|
* SINCE WAVMAT RETURNS NEGATIVE OF LOWER TRIANGLE OF W(R) MATRIX (EQ.(3
|
|
* M.H. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGORITHMS ..."),
|
|
* NEXT STATEMENTS CHANGE ITS SIGN
|
|
CALL DSCAL(NCH*NCH, XMIN1, W, 1)
|
|
CALL DSCAL(NCH*NCH, XMIN1, SCMAT, 1)
|
|
* NEXT LOOP STORES AVERAGE WAVEVECTOR MATRIX IN SCMAT AND DERIVATIVE OF
|
|
* HAMILTONIAN MATRIX, IN FREE BASIS, IN W
|
|
FACT = - SQ3 / DRNOW
|
|
* THE ADDITIONAL MINUS SIGN IN THE PRECEDING EXPRESSION IS INTRODUCED B
|
|
* DH/DR =-DW/DR; SEE EQ.(9) OF
|
|
* M.H. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGORITHMS ..."
|
|
IPT = 1
|
|
DO 105 ICOL = 1, NCH
|
|
* NROW IS THE NUMBER OF (DIAGONAL PLUS SUBDIAGONAL) ELEMENTS IN COLUMN
|
|
* IPT POINTS TO THE DIAGONAL ELEMENT IN COLUMN ICOL FOR A MATRIX STORED
|
|
* PACKED COLUMN FORM
|
|
* HP AND SCR ARE USED AS SCRATCH VECTORS HERE
|
|
NROW = NCH - ICOL + 1
|
|
CALL DCOPY (NROW, SCMAT(IPT), 1, SCR, 1)
|
|
CALL DAXPY (NROW, ONE, W(IPT), 1, SCMAT(IPT), 1)
|
|
CALL DAXPY (NROW, XMIN1, W(IPT), 1, SCR, 1)
|
|
CALL DSCAL (NROW, HALF, SCMAT(IPT), 1)
|
|
CALL DSCAL (NROW, FACT, SCR, 1)
|
|
CALL DCOPY (NROW, SCR, 1, W(IPT), 1)
|
|
IPT = IPT + NCHP1
|
|
105 CONTINUE
|
|
* NEXT LOOP FILLS IN UPPER TRIANGLES OF W AND SCMAT
|
|
IF (NCH .GT. 1) THEN
|
|
IPT = 2
|
|
DO 110 ICOL = 1, NCH -1
|
|
* IPT POINTS TO THE FIRST SUBDIAGONAL ELEMENT IN COLUMN ICOL
|
|
* NROW IS THE NUMBER OF SUBDIAGONAL ELEMENTS IN COLUMN ICOL
|
|
NROW = NCH - ICOL
|
|
CALL DCOPY (NROW, W(IPT), 1, W(IPT + NCHM1), NCH)
|
|
CALL DCOPY (NROW, SCMAT(IPT), 1, SCMAT(IPT + NCHM1), NCH)
|
|
IPT = IPT + NCHP1
|
|
110 CONTINUE
|
|
END IF
|
|
* ----------------------------------------------------------------------
|
|
* DIAGONALIZE SCMAT AT RNOW AND TRANSPOSE MATRIX OF EIGENVECTORS
|
|
* AFTER TRANSPOSITION, THE VECNOW MATRIX IS IDENTICAL TO THE TN MATRIX
|
|
* OF EQ.(6) OF M.H. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGORITHMS ..
|
|
CALL F02ABF(SCMAT,NCH,NCH,EIGNOW,VECNOW,NCH,SCR,IERR)
|
|
IF (IERR .NE. 0) THEN
|
|
WRITE (6, 115) IERR
|
|
115 FORMAT (' *** IERR =',I3,' IN AIRPRP/POTENT/RS; ABORT ***')
|
|
WRITE (6, 120) (EIGNOW (I), I=1, NCH)
|
|
120 FORMAT (' EIGENVALUES ARE:',/,8(1PE16.8) )
|
|
STOP
|
|
END IF
|
|
* TRANSFORM THE DERIVATIVE INTO THE LOCAL BASIS
|
|
* SUBROUTINE DTRANS RETURNS THE NEGATIVE OF THE WN-TILDE-PRIME MATRIX;
|
|
* EQ.(9) OF M.H. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGORITHMS ..."
|
|
CALL TRNSFM(VECNOW, W, SCMAT, NCH, .FALSE., .TRUE.)
|
|
CALL TRNSP(VECNOW, NCH)
|
|
CALL DCOPY(NCH, W, NCH+1, HP, 1)
|
|
C
|
|
C FIND LARGEST OFF-DIAGONAL ELEMENT IN TRANSFORMED W
|
|
C
|
|
XLARGE=0.D0
|
|
IPT=2
|
|
DO 130 ICOL=1,NCH-1
|
|
NCOL=NCH-ICOL
|
|
CALL MAXMGV (W(IPT), 1, ZABS, IC, NCOL)
|
|
IF(ZABS .GT. XLARGE) XLARGE=ZABS
|
|
IPT=IPT+NCH+1
|
|
130 CONTINUE
|
|
C
|
|
RETURN
|
|
END
|
|
SUBROUTINE POTIN9(ITYPE,LAM,MXLAM,NPTS,NDIM,XPT,XWT,MXPT,X,MX,
|
|
1 IXFAC)
|
|
DIMENSION XPT(MXPT,NDIM),XWT(MXPT,NDIM),NPTS(NDIM),
|
|
1 LAM(MXLAM),X(MX)
|
|
WRITE(6,*) ' *** POTIN9 CALLED WITHOUT A SUITABLE USER-SUPPLIED',
|
|
1 ' ROUTINE'
|
|
STOP
|
|
END
|
|
SUBROUTINE PRBR(JTOT,M,N,INRG,RM,
|
|
1 NBASIS,LEV,L,WVEC,SREAL,SIMAG,IC,IL,IC1,IL1,
|
|
2 JLEV,MXPAR,WGHT,PRINT,ILSU)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE
|
|
C
|
|
C *** AUG 76 NEW COUPLED STATES TREATMENT (KOURI ET AL.)
|
|
C *** JUL 86 (CCP6 VERSION 9) MOD 26 AUG 86 TO GET MXREC PROPERLY.
|
|
C *** AND MOD 21 OCT 86 : EDIFMX
|
|
C *** OCT 86 VERSION FOR 'OFF-DIAGONAL' CROSS SECTIONS
|
|
C *** JAN 87 CHANGES TO GET MPLMIN HANDLING CORRECT FOR ITYPE=25,26
|
|
C *** AND ADD JSTEP TO ENTRY PRBOUT (REQUIRES CHANGE IN DRIVER)
|
|
C *** MAR 87 CORRECTIONS FOR ITYPE=26
|
|
C *** DEC 88 INCLUDE ITYPE=7 AND Q=0
|
|
C *** MAR 89 HAS 'IN-CORE' D.A. SIMULATION
|
|
C *** (NEED SUBROUTINE DASIZE/ENTRIES DARD1,DARD2,DAWR1,DAWR2)
|
|
C *** JUL 92 REMOVES ALL REFERENCES TO LCSOLD (OLD, INCORRECT,
|
|
C *** FORMULATION FOR COUPLED STATES: SEE, E.G.,
|
|
C *** GREEN, ET AL. JCP, 66, 1409 (1977))
|
|
C *** CALLS TO ENTRIES (IN PRBR3) ALSO HAVE BEEN TRAPPED THERE.
|
|
C *** JUN 93 FIXES BUG IN PRBR3 AND USES /MEMORY/ TO ELIMINATE LIMITS.
|
|
C *** AUG 94 V14: ENTRY PRBCNT ADDED AND COMMON CMBASE CHANGED
|
|
C
|
|
C CALCULATES SIGMA(JA1,JB1;JA,JB;K)
|
|
C WHERE A/B INDICATE INITIAL/FINAL SPECTRAL LINES,
|
|
C A1/B1 ARE AFTER COLLISION, AND K IS TENSOR ORDER
|
|
C SEE, E.G., SHAFER AND GORDON, JCP 58, 5422 (1973).
|
|
C
|
|
C SUPPOSED TO BE UPWARD COMPATIBLE IF LDIAG=.TRUE.:
|
|
C LDIAG=.TRUE. TAKES *OLD* INPUT LINE=LEVA,LEVB, LEVA,LEVB, ... ,
|
|
C AND SETS LEVA1=LEVA, LEVB1=LEVB FOR ALL LINES.
|
|
C LDIAG=.FALSE. INPUT IS LINE=LEVA,LEVB,LEVA1,LEVB1,
|
|
C LEVA,LEVB,LEVA1,LEVB1, ...
|
|
C N.B. LDIAG FORCED TO TRUE FOR ITYPE=3 CALCULATIONS.
|
|
C
|
|
C ENTRY PRBRIN ACCEPTS &INPUT DATA AND SETS UP PRES. BROAD. CALC.
|
|
C ENTRY PRBOUT PRINTS OUT ACCUMULATED SIGR, SIGI.
|
|
C ENTRY PRBCNT FINDS WHETHER AN S-MATRIX WILL BE USED FOR PB CALC
|
|
C
|
|
C PRBR SPECIFICATIONS --------------------------------------
|
|
C
|
|
DIMENSION NBASIS(1),LEV(1),L(1),IC(1),IL(1),IC1(1),IL1(1),
|
|
1 JLEV(NLEV,NQN)
|
|
DIMENSION WVEC(1),SREAL(1),SIMAG(1)
|
|
C
|
|
C JTOT IS TOTAL ANGULAR MOMENTUM
|
|
C M = 0 FOR LAST PARITY STEP AT THIS JTOT.
|
|
C N IS NUMBER OF OPEN CHANNELS, DETERMINES DIMENSION OF VECTORS.
|
|
C INRG IS INDEX FOR ENERGY VALUES
|
|
C RM IS SCALING FACTOR FOR RADIAL WAVEFUNCTION.
|
|
C NBASIS (I) POINTS TO LEV,L VALUES FOR ITH OPEN CHANNEL.
|
|
C LEV IS VECTOR OF BASIS SET LEVELS
|
|
C L IS VECTOR OF BASIS ORBITAL ANGULAR MOMENTA.
|
|
C WVEC IS VECTOR OF WAVEVECTORS
|
|
C SREAL(N,N) IS REAL PART OF S MATRIX.
|
|
C SIMAG(N,N) IS IMAGINARY PART OF S MATRIX.
|
|
C
|
|
LOGICAL ITYPE3,EPM,LCSNEW,MPLMIN,LCSSYM
|
|
INTEGER JT(2)
|
|
C
|
|
C PRBRIN SPECIFICATIONS ------------------------------------
|
|
C
|
|
INTEGER NLPRBR,MXLN,LINE(MXLN),ILSU,NNRG,PRINT,MXNRG,IFEGEN
|
|
INTEGER T(MXLN)
|
|
DIMENSION ENERGY(NNRG)
|
|
C
|
|
C NLPRBR =0 FOR NO LINE SHAPE CALC.
|
|
C =N (GT.0) GIVES NO. OF LINES FOR WHICH TO COMPUTE L.S.
|
|
C LINE(4*I-3),... ,I=1,NLPRBR IS LEVEL DATA FOR LINES.
|
|
C ILSU (NOW REDUNDANT) WAS DIRECT ACCESS FILE FOR WORKING STORAGE
|
|
C ENERGY(NNRG) ARE ENERGIES AT WHICH S MATRIX IS CALCULATED.
|
|
C MXNRG IS MAXIMUM DIMENSION OF ENERGY ARRAY
|
|
C IFEGEN .GT. 0 REQUESTS GENERATION OF ADDITIONAL ENERGY VALUES.
|
|
C PRINT IS INTEGER PRINT CONTROL.
|
|
C
|
|
LOGICAL NOCALC,PF,NDEBUG
|
|
LOGICAL LDIAG,EXISTS,LDIAGX
|
|
CHARACTER*8 PTP(3)
|
|
C STORAGE DIMENSIONED FOR NO. OF LINES = MAXLN.
|
|
DIMENSION LN(400,9)
|
|
DIMENSION EREL(400),SIGR(400),SIGI(400)
|
|
DIMENSION P(2),PRTY(4)
|
|
C
|
|
C INFORMATION ORIGINALLY PASSED AS ENTRY PRBRBS, NOW IN COMMON
|
|
C
|
|
COMMON /CMBASE/ ROTI(12),ELEVEL(1000),EMAX,WT(2),SPNUC,
|
|
1 NLEVEL,JLEVEL(4000),MISC(26),JHALF,IDENT,MXJL,MXEL
|
|
COMMON /PRBASE/ ITYPE,NQN,NLEV,MVALUE,IEXCH,MPLMIN
|
|
COMMON /ASSVAR/ IDA
|
|
C
|
|
C NLEV AND NLEVEL ARE NO. OF LEVELS IN BASIS SET.
|
|
C JLEV AND JLEVEL ARE QUANTUM NUMBERS FOR THESE LEVELS.
|
|
C ELEVEL ARE ENERGIES OF THESE LEVELS.
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C --- DATA INITIALIZATIONS ---
|
|
C
|
|
DATA PTP/' Q = 0 ',' DIPOLE ',' RAMAN '/
|
|
DATA P/1.D0,-1.D0/, PRTY/1.D0,-1.D0,-1.D0,1.D0/
|
|
C *** BELOW REPLACES JMH'S CRITERION OF 1.D-10 FOR ENERGY DIFFERENCE
|
|
C *** SMALLER VALUE MAY BE NEEDED FOR RESONANCE CALCULATIONS.
|
|
DATA EDIFMX/5.D-6/
|
|
C FOR COMPATBILITY WITH OLD INPUT, SET LDIAG=.TRUE.
|
|
DATA LDIAGX/.FALSE./
|
|
C IF NDEBUG .EQ. .FALSE. CHECK FOR 'IMPOSSIBLE' NUMBERS OF MATCHES.
|
|
DATA NDEBUG/.FALSE./
|
|
C DIMENSION LIMITATION ...
|
|
DATA MAXLN/400/
|
|
C FOR CHECKING OVER-WRITE OF "DA FILE"
|
|
DATA JCHKSV/-1/
|
|
C
|
|
C STATEMENT FUNCTION (LOGICAL)
|
|
EXISTS(I) = I.GT.0 .AND. I.LE.NLEVEL
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
IF (NOCALC) RETURN
|
|
IF (JCHKSV.EQ.-1) JCHKSV=JTOT
|
|
DO 3000 IA=1,2
|
|
C IA=1 CHECKS FOR USE OF THIS JTOT,INRG WITH J(ALPHA).
|
|
C IA=2 FOR J(BETA).
|
|
IB=3-IA
|
|
C FIND LINES, I, WHICH USE THIS INRG, JTOT S MATRIX.
|
|
IKEEP=0
|
|
DO 3100 I=1,NLINE
|
|
IF (LN(I,IA+3).NE.INRG) GO TO 3100
|
|
K=LN(I,3)
|
|
JDIFMX=K
|
|
IF (LCSNEW) JDIFMX=0
|
|
JDM=MAX(JDM,JDIFMX)
|
|
IF (ITYPE3) GO TO 3211
|
|
C FOR ITYPE=1,2,5 GET J-VALUE FROM 1ST COL OF JLEV.
|
|
JA=JLEV(LN(I,1),1)
|
|
JB=JLEV(LN(I,2),1)
|
|
JA1=JLEV(LN(I,8),1)
|
|
JB1=JLEV(LN(I,9),1)
|
|
C PARITY FACTOR FOR CS WITH MPLMIN; THIS IS NORMALLY +1.
|
|
F3PJ=PARITY3(JA+JA1+JB+JB1)
|
|
C FIND BASIS FNS. CORRESPONDING TO JA/JA1 (JB/JB1) AND GET L VALUES.
|
|
C ROWS=>JA1,IC1,IL1 COLS=>JA,IC,IL
|
|
C FOR DIAG CASE (JA=JA1), IC/IC1 AND IL/IL1 HAVE SAME VALUES.
|
|
NLVAL=0
|
|
NLVAL1=0
|
|
DO 3200 II=1,N
|
|
JJ=NBASIS(II)
|
|
IF (LEV(JJ).NE.LN(I,IA)) GO TO 3201
|
|
NLVAL=NLVAL+1
|
|
IC(NLVAL)=II
|
|
IL(NLVAL)=L(JJ)
|
|
3201 IF (LEV(JJ).NE.LN(I,IA+7)) GO TO 3200
|
|
NLVAL1=NLVAL1+1
|
|
IC1(NLVAL1)=II
|
|
IL1(NLVAL1)=L(JJ)
|
|
3200 CONTINUE
|
|
GO TO 3212
|
|
C
|
|
C FOR ITYPE=3 GET J-VALUE FROM JLEVEL. RECALL J1,J2 PACKED IN ORDER
|
|
C
|
|
3211 JA=JLEVEL(2*LN(I,1)-1)
|
|
JB=JLEVEL(2*LN(I,2)-1)
|
|
C BELOW MAY BE NEEDED FOR COMPATIBILITY IN OFF-DIAG CODE
|
|
JA1=JA
|
|
JB1=JB
|
|
C ALLOCATE TEMPORARY STORAGE FOR SR,SI,TR,JBAR,ISTB,NBLK,LVAL
|
|
NSQ=N*N
|
|
NINT=(N+NIPR-1)/NIPR
|
|
IT1=IXNEXT
|
|
IT2=IT1+NSQ
|
|
IT3=IT2+NSQ
|
|
IT4=IT3+NSQ
|
|
IT5=IT4+NINT
|
|
IT6=IT5+NINT
|
|
IT7=IT6+NINT
|
|
IXNEXT=IT7+NINT
|
|
C WRITE(6,*) ' IT1-IT7,IXNEXT',IT1,IT2,IT3,IT4,IT5,IT6,IT7,IXNEXT
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
CALL PRBR3(N,SREAL,SIMAG,JTOT,NLEV,NQN,JLEV,NBASIS,LEV,L,NPACK,
|
|
1 LN(I,IA),NLVAL,IC,IL,
|
|
2 X(IT1),X(IT2),X(IT3),X(IT4),X(IT5),X(IT6),X(IT7))
|
|
C N.B. ONLY SR,SI NEED TO BE KEPT, IXNEXT COULD BE REDUCED HERE ...
|
|
C IXNEXT=IT3
|
|
C>>SG 1 JUN 93: NLVAL1,IL1,IC1 MUST BE ALSO BE SET (CF. DIAGONAL CASE).
|
|
NLVAL1=NLVAL
|
|
DO 3311 II=1,NLVAL
|
|
IL1(II)=IL(II)
|
|
3311 IC1(II)=IC(II)
|
|
C<<SG 1 JUN 93
|
|
C
|
|
3212 IF (NLVAL.LE.0 .OR. NLVAL1.LE.0) GO TO 3100
|
|
C GET WAVE NUMBER POINTED TO BY IPWVEC (SHOULD BE SAME FOR ALL IC'S)
|
|
IPWVEC=NBASIS(IC(1))
|
|
FK=WVEC(IPWVEC)
|
|
FK=FK/RM
|
|
FK=PI/(FK*FK)
|
|
C
|
|
C CHECK FOR AVAILABILITY OF J(BETA) MATRICES WITH WHICH TO CALC.
|
|
IPTR=LN(I,IB+5)
|
|
3400 IF (IPTR.LE.0) GO TO 5000
|
|
C
|
|
C PROCESS CURRENT S MATRIX WITH PREVIOUSLY STORED MATRICES.
|
|
4000 IDA=IPTR
|
|
C READ(ILSU,REC=IDA) IPTIND,IIN,IAIN,JTIN,IPTBK,NNTRY
|
|
CALL DARD1(IPTIND,IIN,IAIN,JTIN,IPTBK,NNTRY)
|
|
IDA=IDA+1
|
|
JT(IA)=JTIN
|
|
JT(IB)=JTOT
|
|
IF (LCSNEW) GO TO 4981
|
|
MVALIN=1
|
|
IF (IPTIND.EQ.-1) GO TO 4001
|
|
WRITE(6,402) IPTR,IPTIND
|
|
402 FORMAT(/' * * * ERROR. FOR IPTR =',I6,', ILLEGAL IPTIND =',I6)
|
|
4003 IPTR=IPTBK
|
|
GO TO 3400
|
|
C 'LCSNEW' CODE CAN USE JLEV(I,1) AS J-VALUE FOR ITYPE=1,2,5,6
|
|
4981 MVALIN = IPTIND+1000
|
|
IF (IABS(MVALIN).LE.JLEV(LN(I,IB),1)) GO TO 4001
|
|
WRITE(6,405) IPTIND,JA,JB,IA
|
|
405 FORMAT(' * * * ERROR. MVALUE LARGER THAN J-VALUE IN CS(NEW)',
|
|
1 4I12)
|
|
GO TO 4003
|
|
4001 IF (IIN.EQ.I .AND. IAIN.EQ.IB) GO TO 4002
|
|
WRITE(6,403) IIN,I,IAIN,IA
|
|
403 FORMAT(/' * * * ERROR. IIN, I, IAIN, IA =',4I12)
|
|
GO TO 4003
|
|
4002 JDIF=JTOT-JTIN
|
|
IF (JDIF.GE.0) GO TO 4004
|
|
WRITE(6,404) JTOT,JTIN
|
|
404 FORMAT(/' * * * ERROR. JTOT.LT.JTIN =',2I6)
|
|
GO TO 4003
|
|
4004 IF (JDIF.GT.JDIFMX) GO TO 5000
|
|
C
|
|
4005 ONE=1.D0
|
|
C N.B. FOR ITYPE=1,2,5,6, JLEV(LEV,NQN)=LEV
|
|
IF (.NOT.LCSNEW) GO TO 4006
|
|
C SET UP FOR NEW COUPLED STATES CODE
|
|
XJA=DBLE(JLEV(LN(I,IA),1))
|
|
XJB=DBLE(JLEV(LN(I,IB),1))
|
|
XJA1=DBLE(JLEV(LN(I,IA+7),1))
|
|
XJB1=DBLE(JLEV(LN(I,IB+7),1))
|
|
XN=DBLE(LN(I,3))
|
|
XMA=DBLE(MVALUE)
|
|
XMB=DBLE(MVALIN)
|
|
C FACTORS BELOW FOR ITYPE=25,26 MPLMIN=.TRUE.
|
|
TJ2P=1.D0
|
|
F3P=F3PJ
|
|
IF (.NOT.LCSSYM) GO TO 4006
|
|
IXA=LN(I,IA)
|
|
IXA1=LN(I,IA+7)
|
|
IXB=LN(I,IB)
|
|
IXB1=LN(I,IB+7)
|
|
IF (ITYPE.EQ.26) GO TO 4016
|
|
TJ2P=PARITY3(JLEV(IXB,2)+JLEV(IXB,3)+JLEV(IXB1,2)+JLEV(IXB1,3))
|
|
F3P=F3P*TJ2P*
|
|
1 PARITY3(JLEV(IXA,2)+JLEV(IXA,3)+JLEV(IXA1,2)+JLEV(IXA1,3))
|
|
GO TO 4006
|
|
4016 TJ2P=PRTY(JLEV(IXB,3)+1)*PRTY(JLEV(IXB1,3)+1)
|
|
F3P=F3P*TJ2P*PRTY(JLEV(IXA,3)+1)*PRTY(JLEV(IXA1,3)+1)
|
|
C FOR OLD CS CODE, ADD 1 TO SREAL ONLY FOR M=MP=0.
|
|
4006 DO 3600 ID=1,NNTRY
|
|
C READ(ILSU,REC=IDA) L1,L2,SR,SI
|
|
CALL DARD2(L1,L2,SR,SI)
|
|
IDA=IDA+1
|
|
NMATCH=0
|
|
C
|
|
C II LOOPS FOR L1 => INITIAL (UNPRIMED) I.E. JA:IL,IC (COLS)
|
|
C JJ LOOPS FOR L2 => FINAL (PRIMED) I.E. JA1:IL1,IC1 (ROWS)
|
|
DO 3700 II=1,NLVAL
|
|
IF (L1.NE.IL(II)) GO TO 3700
|
|
DO 3800 JJ=1,NLVAL1
|
|
IF (L2.NE.IL1(JJ)) GO TO 3800
|
|
NMATCH=NMATCH+1
|
|
IX=(IC(II)-1)*N+IC1(JJ)
|
|
C *** N.B. ABOVE HAS REVERSED ROWS/COLS FROM OLD CODE,
|
|
C *** BUT NOTE SYMMETRY OF S-MATRIX
|
|
SRNOW=SREAL(IX)
|
|
SINOW=SIMAG(IX)
|
|
C THERE SHOULD ONLY BE 1 MATCH. IF NDEBUG.EQ..FALSE. CHECK THIS.
|
|
IF (NDEBUG) GO TO 4099
|
|
3800 CONTINUE
|
|
3700 CONTINUE
|
|
C
|
|
3999 IF (NMATCH-1) 3600,4099,4098
|
|
C
|
|
4098 WRITE(6,409) NMATCH,IPTIND,IIN,IAIN,JTIN,IPTBK,NNTRY,L1,L2
|
|
409 FORMAT(/' * * * WARNING. NMATCH.GT.1 =',I3,' FOR IPTIND,IIN,',
|
|
1 'IAIN,JTIN,IPTBK,NNTRY,L1,L2 =',8I6)
|
|
GO TO 3600
|
|
C
|
|
4099 CONTINUE
|
|
IF (EPM) GO TO 3630
|
|
IF (LCSNEW) GO TO 3640
|
|
C BELOW IS CLOSE COUPLING CODE . . .
|
|
DJA1=JA1+JA1+1
|
|
DJA=JA+JA+1
|
|
F1=DBLE((2*JTOT+1)*(2*JTIN+1)) * SQRT(DJA1/DJA)
|
|
C FOR ITYPE=3 2 INDICES PACKED INTO L1,L2 - REMOVE 2ND.
|
|
L1N=L1-NPACK*(L1/NPACK)
|
|
L2N=L2-NPACK*(L2/NPACK)
|
|
C *** JA,JA1 ADDED TO PARITY FACTOR OCT 86 FOR OFF-DIAGONAL CASE.
|
|
C *** C.F. GREEN, C.P.L. 47, 119 (1977); COREY, MCCOURT, AND LIU,
|
|
C *** J. PHYS. CHEM. 88, 2031 (1984).
|
|
PARIT=PARITY3(JA-JA1+L1N-L2N)
|
|
F2=SIXJ(JA,K,L1N,JT(1),JB,JT(2))
|
|
C N.B. DELTA FUNCTION CONTAINS ALL QUANTUM NUMBERS.
|
|
C FOR SOME CASES CODE BELOW RECALCULATES SIXJ
|
|
IF (L1.EQ.L2 .AND.
|
|
1 LN(I,1).EQ.LN(I,8) .AND. LN(I,2).EQ.LN(I,9)) GO TO 3610
|
|
F3=SIXJ(JA1,K,L2N,JT(1),JB1,JT(2))
|
|
FR=0.D0
|
|
GO TO 3620
|
|
C
|
|
3610 F3=F2
|
|
FR=ONE
|
|
GO TO 3620
|
|
C
|
|
C BELOW FOR EFFECTIVE POTENTIAL METHOD
|
|
3630 F1=2*JTOT+1
|
|
F2=1.D0
|
|
F3=1.D0
|
|
FR=1.D0
|
|
PARIT=1.D0
|
|
GO TO 3620
|
|
C
|
|
C BELOW FOR COUPLED STATES (LCSNEW) CASE
|
|
3640 DJA1=JA1+JA1+1
|
|
DJA=JA+JA+1
|
|
F1=DBLE(2*JTOT+1) * SQRT(DJA1/DJA)
|
|
FR=1.D0
|
|
IF (LN(I,1).NE.LN(I,8) .OR. LN(I,2).NE.LN(I,9)) FR=0.D0
|
|
PARIT=PARITY3(JB+JB1)
|
|
C *** ACCOUNT FOR PLUS/MINUS MVALUE COUNTING. . .
|
|
C *** AFTER OCT 76, THIS IS CONTROLLED BY MPLMIN PASSED FROM BASE.
|
|
TJ1=THRJ(XJA,XJB,XN,XMA,-XMB,XMB-XMA)
|
|
1 *THRJ(XJA1,XJB1,XN,XMA,-XMB,XMB-XMA)
|
|
F2=TJ1
|
|
F3=1.D0
|
|
IF (.NOT.MPLMIN) GO TO 3620
|
|
TJ2=THRJ(XJA,XJB,XN,XMA,XMB,-XMB-XMA)
|
|
1 *THRJ(XJA1,XJB1,XN,XMA,XMB,-XMB-XMA)
|
|
F2=F2 + TJ2 * TJ2P
|
|
F3=1.D0 + F3P
|
|
IF (MVALUE.EQ.0) F3=F3/2.D0
|
|
IF (MVALIN.EQ.0) F3=F3/2.D0
|
|
GO TO 3620
|
|
C
|
|
3620 FCT=F1*F2*F3*FK*PARIT
|
|
FR=(FR-(SR*SRNOW+SI*SINOW))*FCT
|
|
FI=P(IA)*(SI*SRNOW-SR*SINOW)*FCT
|
|
SIGR(I)=SIGR(I)+FR
|
|
SIGI(I)=SIGI(I)+FI
|
|
IF (I.NE.IKEEP .AND. PRINT.GE.4) WRITE(6,602)
|
|
602 FORMAT(1X)
|
|
IKEEP=I
|
|
IF (PRINT.GE.4) WRITE(6,408) I,JT(IA),JT(IB),FR,SIGR(I),FI,SIGI(I)
|
|
408 FORMAT(' LINE',I3,' BETWEEN JTOT =',I3,' AND',I3,E14.6,
|
|
1 ' ADDED TO SIGR =',E14.6,8X,E14.6,' ADDED TO SIGI =',E14.6)
|
|
3600 CONTINUE
|
|
C THIS COMPLETES CALC. FOR ALL SAVED S MATRIX ELEMENTS IN THIS SET.
|
|
C FOLLOW POINTERS BACKWARDS TO FIND OTHER S MATRICES.
|
|
IPTR=IPTBK
|
|
GO TO 3400
|
|
C
|
|
C NO MORE STORED S MATRICES TO PROCESS.
|
|
C STORE CURRENT MATRIX VALUES FOR FUTURE USE.
|
|
C
|
|
5000 NNTRY=NLVAL*NLVAL1
|
|
IF (NEXTDA+NNTRY.LT.MXREC) GO TO 4200
|
|
WRITE(6,401) MXREC
|
|
401 FORMAT(/' *** PRBR. WARNING: TEMPORARY STORAGE OF',I8,
|
|
1 ' WORDS EXCEEDED.'/
|
|
2 ' *** WRAP-AROUND FEATURE WILL BE USED')
|
|
IF (JTOT-JCHKSV.LE.JDM+1) THEN
|
|
WRITE(6,491)
|
|
491 FORMAT(' *** PRBR. POSSIBLE ERROR')
|
|
WRITE(6,492) JCHKSV,JTOT,JDM
|
|
492 FORMAT(11X,'INITIAL, FINAL JTOT WERE',2I5,'.',
|
|
1 ' NEED DELTA-JTOT =',I3)
|
|
C ONE MIGHT WANT TO TERMINATE CALCULATION HERE.
|
|
ELSE
|
|
WRITE(6,493)
|
|
493 FORMAT(' *** PRBR. PROBABLY OK.')
|
|
WRITE(6,492) JCHKSV,JTOT,JDM
|
|
ENDIF
|
|
JCHKSV=JTOT
|
|
NEXTDA=1
|
|
C
|
|
4200 IPTIND=-1
|
|
IF (LCSNEW) IPTIND=MVALUE-1000
|
|
IPTBK=LN(I,IA+5)
|
|
C
|
|
C IDA IS ASSOCIATED VARIABLE, SET TO NEXT AVAILABLE RECORD AFTER
|
|
C READ/WRITE.
|
|
IDA=NEXTDA
|
|
C WRITE(ILSU,REC=IDA) IPTIND,I,IA,JTOT,IPTBK,NNTRY
|
|
CALL DAWR1(IPTIND,I,IA,JTOT,IPTBK,NNTRY)
|
|
IDA=IDA+1
|
|
DO 4100 II=1,NLVAL
|
|
DO 4100 JJ=1,NLVAL1
|
|
C IX IS INDEX TO SREAL, SIMAG. CHANGED FOR OFF-DIAG CODE TO
|
|
C CORRESPOND WITH CHOICE IN DO 3700 LOOP ABOVE
|
|
IX=(IC(II)-1)*N+IC1(JJ)
|
|
L1=IL(II)
|
|
L2=IL1(JJ)
|
|
C WRITE(ILSU,REC=IDA) L1,L2,SREAL(IX),SIMAG(IX)
|
|
CALL DAWR2(L1,L2,SREAL(IX),SIMAG(IX))
|
|
4100 IDA=IDA+1
|
|
C
|
|
LN(I,IA+5)=NEXTDA
|
|
NEXTDA=IDA
|
|
C THIS FINISHES PROCESSING LINE=I FOR IA.
|
|
C FOR ITYPE3 RESTORE SREAL,SIMAG AND RELEASE TEMP STORAGE
|
|
IF (ITYPE3) THEN
|
|
C WRITE(6,*) ' IT1,IT2,IXNEXT',IT1,IT2,IXNEXT
|
|
CALL PRBR3R(N,SREAL,SIMAG,X(IT1),X(IT2))
|
|
C RELEASE TEMPORARY STORAGE
|
|
IXNEXT=IT1
|
|
ENDIF
|
|
C
|
|
3100 CONTINUE
|
|
C THIS ENDS LOOP OVER I = 1,NLINE
|
|
3000 CONTINUE
|
|
C THIS ENDS LOOP OVER IA = ALPHA, BETA.
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
C
|
|
ENTRY PRBRIN(NLPRBR,LINE,T,MXLN,ILSU,NNRG,ENERGY,MXNRG,IFEGEN,
|
|
1 JLEV,PRINT)
|
|
C
|
|
LDIAG=LDIAGX
|
|
NEXTDA=1
|
|
JDM=0
|
|
C NPACK IS USED TO PACK TWO INDICES (J1,J2) INTO ONE INTEGER VAR.
|
|
NPACK=2**16
|
|
PI=ACOS(-1.D0)
|
|
IF (NLPRBR.GT.0) GO TO 1000
|
|
NOCALC=.TRUE.
|
|
RETURN
|
|
1000 WRITE(6,111)
|
|
111 FORMAT(//' REVIEW OF REQUESTED PRESSURE BROADENING CALCULATION.')
|
|
WRITE(6,610)
|
|
610 FORMAT(/' ****** THIS IS OFF-DIAGONAL VERSION (DEC 88) ******')
|
|
IF (LDIAG) WRITE(6,609)
|
|
609 FORMAT(9X,'LDIAG = TRUE OPTION TO HANDLE OLD INPUT')
|
|
C COUPLED STATES (ITYPE=25,26 ADDED OCT 76) / 'OLD' CS CODE REMOVED
|
|
LCSNEW=ITYPE.EQ.21 .OR. ITYPE.EQ.22
|
|
LCSSYM=ITYPE.EQ.25 .OR. ITYPE.EQ.26
|
|
LCSNEW=LCSNEW .OR. LCSSYM
|
|
EPM=ITYPE.EQ.11 .OR. ITYPE.EQ.12 .OR. ITYPE.EQ.15 .OR. ITYPE.EQ.16
|
|
ITYPE3=ITYPE.EQ.3
|
|
C TRAP TYPES INCONSISTENT W/LDIAG=.FALSE.
|
|
IF (LDIAG. OR. .NOT.(ITYPE3.OR.EPM)) GO TO 1992
|
|
IF (ITYPE3) THEN
|
|
LDIAG=.TRUE.
|
|
WRITE(6,*) ' *** FOR ITYPE=3 LDIAG HAS BEEN FORCED TO TRUE.'
|
|
WRITE(6,*) ' *** CHECK THAT &INPUT LINE DATA IS COMPATIBLE.'
|
|
ELSE
|
|
WRITE(6,197) ITYPE
|
|
197 FORMAT(/' *** LDIAG=.TRUE. INCOMPATIBLE WITH ITYPE =',I4,';',
|
|
1 ' REQUEST CANCELED.')
|
|
NOCALC=.TRUE.
|
|
RETURN
|
|
ENDIF
|
|
1992 IF (ITYPE.EQ.1 .OR. ITYPE.EQ.2 .OR. ITYPE.EQ.5) GO TO 1990
|
|
IF (ITYPE.EQ.6) GO TO 1990
|
|
IF (ITYPE.EQ.7) GO TO 1990
|
|
IF (ITYPE.EQ.31) GO TO 1990
|
|
IF (ITYPE3 .AND. IDENT.EQ.0) GO TO 1991
|
|
IF (LCSNEW) GO TO 1990
|
|
IF (EPM) GO TO 1990
|
|
WRITE(6,199) ITYPE
|
|
199 FORMAT(/' * * * WARNING. REQUESTED PRESSURE BROADENING ',
|
|
1 'CALCULATION NOT SUPPORTED FOR ITYPE =',I4,'.'/
|
|
2 18X,'REQUEST CANCELLED.')
|
|
NOCALC=.TRUE.
|
|
RETURN
|
|
1991 WRITE(6,198)
|
|
198 FORMAT(/' * * * WARNING. LIMITED IMPLEMENTATION FOR PRESSURE ',
|
|
1 'BROADENING WITH ITYPE = 3 .AND. IDENT = 0')
|
|
1990 NOCALC=.FALSE.
|
|
C NPL IS NUMBER OF INDICES PER LINE
|
|
NPL=4
|
|
IF (LDIAG) NPL=2
|
|
WRITE(6,100) NLPRBR
|
|
100 FORMAT(/' PRESSURE-BROADENING LINE-SHAPE CALCULATION REQUESTED'
|
|
1 ,' FOR',I4,' LINES.')
|
|
C N.B. DIMENSION ON LINE PASSED FROM DRIVER IS 2*MXLN
|
|
IF ((NPL*NLPRBR)/2.LE.MXLN) GO TO 1100
|
|
I=(2*MXLN)/NPL
|
|
WRITE(6,101) NLPRBR,I
|
|
101 FORMAT(/' * * * WARNING. ',I5,' LINES REQUESTED, REDUCED TO MAX',
|
|
1 ' OF',I3)
|
|
NLPRBR=I
|
|
1100 WRITE(6,110)
|
|
110 FORMAT(/5X,' LINE LEV(A) LEV(B) LEV(A1) LEV(B1)')
|
|
DO 1103 I=1,NLPRBR
|
|
IST=NPL*(I-1)
|
|
1103 WRITE(6,112) I,(LINE(IST+II),II=1,NPL)
|
|
112 FORMAT(5X,I4,I8,I6,I9,I7)
|
|
NLINE=0
|
|
NEWE=NNRG
|
|
DO 1200 I=1,NLPRBR
|
|
PF=.FALSE.
|
|
L1=LINE((NPL*(I-1))+1)
|
|
L2=LINE((NPL*(I-1))+2)
|
|
IF (LDIAG) GO TO 1104
|
|
L3=LINE((NPL*(I-1))+3)
|
|
L4=LINE((NPL*(I-1))+4)
|
|
GO TO 1105
|
|
1104 L3=L1
|
|
L4=L2
|
|
1105 IF (EXISTS(L1).AND.EXISTS(L2).AND.EXISTS(L3).AND.EXISTS(L4))
|
|
1 GO TO 1150
|
|
WRITE(6,108) L1,L2,L3,L4
|
|
108 FORMAT(/' * * * WARNING. REQUESTED LINE FOR LEVELS',4I4,
|
|
1 ' CANNOT BE PROCESSED - OUTSIDE NLEV RANGE.')
|
|
GO TO 1200
|
|
1150 IF (ITYPE3) GO TO 1151
|
|
C FOR ITYPE=1,2,5 TAKE J-VALUE FROM JLEV(LEV,1)
|
|
JA=JLEV(L1,1)
|
|
JB=JLEV(L2,1)
|
|
JA1=JLEV(L3,1)
|
|
JB1=JLEV(L4,1)
|
|
GO TO 1152
|
|
C FOR ITYPE=3 TAKE J-VALUES FROM JLEVEL. RECALL J1,J2 PACKED.
|
|
1151 JA=JLEVEL(2*L1-1)
|
|
JB=JLEVEL(2*L2-1)
|
|
JA1=JA
|
|
JB1=JB
|
|
1152 K=T(I)
|
|
K1=K
|
|
IF (K.GE.0) GO TO 1106
|
|
C IF 'LTYPE' NOT INPUT, CALCULATE FROM J-VALUES
|
|
K=IABS(JA-JB)
|
|
K1=IABS(JA1-JB1)
|
|
C OTHER THAN DIPOLE AND RAMAN (Q=0,2) TRANSITIONS NOT IMPLEMENTED.
|
|
C ALSO, MUST HAVE SAME 'K' FOR JA/JB AND JA1/JB1
|
|
1106 IF ((K.EQ.0.OR.K.EQ.1.OR.K.EQ.2).AND.(K.EQ.K1)) GO TO 1300
|
|
WRITE(6,102) JA,JB,JA1,JB1,I
|
|
102 FORMAT(/' * * * * ONLY DIPOLE AND RAMAN TRANSITIONS IMPLEMENTED'
|
|
1 ,'. CANNOT PROCESS JA,JB,JA1,JB1=',4I4/
|
|
2 10X,'SPECIFY LTYPE(',I3,' ) = 0, 1 OR 2 IN &INPUT.')
|
|
GO TO 1200
|
|
1300 NEPL=0
|
|
IF (IFEGEN.LE.0) GO TO 1301
|
|
C GENERATE ENERGY VALUES IF NECESSARY TO LINE AT REQUESTED E'S.
|
|
DO 1401 II=1,NNRG
|
|
EA=ENERGY(II)+ELEVEL(L1)
|
|
DO 1501 JJ=1,NEWE
|
|
ED=(ENERGY(JJ)-EA)/ENERGY(JJ)
|
|
IF (ABS(ED).GT.EDIFMX) GO TO 1501
|
|
JL=JJ
|
|
GO TO 1502
|
|
1501 CONTINUE
|
|
NEWE=NEWE+1
|
|
IF (NEWE.LT.MXNRG) GO TO 1201
|
|
1202 WRITE(6,611) I,II
|
|
611 FORMAT(/' * * * WARNING. CANNOT ADD ENERGY VALUE FOR LINE',I4,
|
|
1 ' RELATIVE ENRGY NO.',I4)
|
|
NEWE=NEWE-1
|
|
GO TO 1401
|
|
1201 ENERGY(NEWE)=EA
|
|
JL=NEWE
|
|
1502 EB=ENERGY(II)+ELEVEL(L2)
|
|
DO 1101 JJ=1,NEWE
|
|
ED=(ENERGY(JJ)-EB)/ENERGY(JJ)
|
|
IF (ABS(ED).GT.EDIFMX) GO TO 1101
|
|
JK=JJ
|
|
GO TO 1102
|
|
1101 CONTINUE
|
|
NEWE=NEWE+1
|
|
IF (NEWE.GE.MXNRG) GO TO 1202
|
|
ENERGY(NEWE)=EB
|
|
JK=NEWE
|
|
1102 NEPL=NEPL+1
|
|
IF (NLINE.LT.MAXLN) GO TO 1108
|
|
WRITE(6,109) L1,L2,L3,L4,JL,JK
|
|
GO TO 1200
|
|
1108 NLINE=NLINE+1
|
|
LN(NLINE,1)=L1
|
|
LN(NLINE,2)=L2
|
|
LN(NLINE,3)=K
|
|
LN(NLINE,4)=JL
|
|
LN(NLINE,5)=JK
|
|
LN(NLINE,6)=0
|
|
LN(NLINE,7)=0
|
|
LN(NLINE,8)=L3
|
|
LN(NLINE,9)=L4
|
|
SIGR(NLINE)=0.D0
|
|
SIGI(NLINE)=0.D0
|
|
EREL(NLINE)=ENERGY(II)
|
|
IF (PF) GO TO 1601
|
|
WRITE(6,103) L1,JA,L2,JB,L3,JA1,L4,JB1,PTP(K+1)
|
|
PF=.TRUE.
|
|
1601 WRITE(6,104) EREL(NLINE),JL,JK
|
|
1401 CONTINUE
|
|
GO TO 1403
|
|
C
|
|
C CHECK FOR AVAILABLE PAIRS OF ENERGIES WITH SAME INITIAL REL KE
|
|
C
|
|
1301 DO 1400 II=1,NNRG
|
|
EA=ENERGY(II)-ELEVEL(L1)
|
|
C *** 2 SEPT. 86 TO PREVENT CHOOSING NEGATIVE ENERGIES
|
|
IF (EA.LE.0.D0) GO TO 1400
|
|
DO 1500 JJ=1,NNRG
|
|
EB=ENERGY(JJ)-ELEVEL(L2)
|
|
ED=(EA-EB)/MAX(EA,EB,1.D0)
|
|
IF (ABS(ED).GT.EDIFMX) GO TO 1500
|
|
NEPL=NEPL+1
|
|
IF (NLINE.LT.MAXLN) GO TO 1109
|
|
WRITE(6,109) L1,L2,L3,L4,II,JJ
|
|
109 FORMAT(/' * * * WARNING. NO MORE TABLE SPACE FOR LEVELS =',4I3,
|
|
1 ', AND ENERGIES=',2I4,'; WILL BE SKIPPED.')
|
|
GO TO 1200
|
|
1109 NLINE=NLINE+1
|
|
LN(NLINE,1)=L1
|
|
LN(NLINE,2)=L2
|
|
LN(NLINE,3)=K
|
|
LN(NLINE,4)=II
|
|
LN(NLINE,5)=JJ
|
|
LN(NLINE,6)=0
|
|
LN(NLINE,7)=0
|
|
LN(NLINE,8)=L3
|
|
LN(NLINE,9)=L4
|
|
SIGR(NLINE)=0.D0
|
|
SIGI(NLINE)=0.D0
|
|
EREL(NLINE)=(EA+EB)/2.D0
|
|
IF (PF) GO TO 1600
|
|
WRITE(6,103) L1,JA,L2,JB,L3,JA1,L4,JB1,PTP(K+1)
|
|
103 FORMAT(/' LEVELS',I3,' (JA =',I3,' ), ',I3,' (JB =',I3,' )',
|
|
1 ' **TO** LEVELS',I3,' (JA1 =',I3,' ),',I3,' (JB1 =',I3,' )',
|
|
2 ' WILL BE PROCESSED FOR',A8,'RADIATION.')
|
|
PF=.TRUE.
|
|
1600 WRITE(6,104) EREL(NLINE),LN(NLINE,4),LN(NLINE,5)
|
|
104 FORMAT(12X,'AT RELATIVE K.E. =',F18.9,' (1/CM) WITH',I4,
|
|
1 '-TH AND',I4,'-TH ENERGY VALUES RESPECTIVELY.')
|
|
1500 CONTINUE
|
|
1400 CONTINUE
|
|
1403 IF (NEPL.GT.0) GO TO 1200
|
|
WRITE(6,105) L1,L2
|
|
105 FORMAT(/' * * * WARNING. NO RELEVANT PAIRS OF ENERGY VALUES ',
|
|
1 'FOR REQUESTED LEVELS =',2I4)
|
|
1200 CONTINUE
|
|
C
|
|
IF (IFEGEN.LE.0) GO TO 1701
|
|
C
|
|
C REMOVE ENERGIES THAT ARE NOT NEEDED FOR PRESSURE-BROADENING
|
|
NNRG=NEWE
|
|
II=1
|
|
1609 IF (II.GT.NNRG) GO TO 1615
|
|
DO 1610 I=1,NLINE
|
|
IF (LN(I,4).EQ.II .OR. LN(I,5).EQ.II) THEN
|
|
C WE ARE USING THIS ENERGY. CHECK THE NEXT
|
|
II=II+1
|
|
GO TO 1609
|
|
ENDIF
|
|
1610 CONTINUE
|
|
C REACH HERE IF IT IS NOT USED. COMPRESS LIST & REVISE INDEXES
|
|
NNRG=NNRG-1
|
|
DO 1611 JJ=II,NNRG
|
|
ENERGY(JJ)=ENERGY(JJ+1)
|
|
1611 CONTINUE
|
|
DO 1612 I=1,NLINE
|
|
IF (LN(I,4).GT.II) LN(I,4)=LN(I,4)-1
|
|
1612 IF (LN(I,5).GT.II) LN(I,5)=LN(I,5)-1
|
|
GO TO 1609
|
|
C
|
|
C SORT ENERGIES INTO DESCENDING ORDER, RENUMBER LN(,4) AND LN(,5)
|
|
C
|
|
1615 DO 1809 JJ=1,NNRG
|
|
II=0
|
|
ETOP=0.D0
|
|
DO 1805 I=JJ,NNRG
|
|
IF (ETOP.GE.ENERGY(I)) GO TO 1805
|
|
ETOP=ENERGY(I)
|
|
II=I
|
|
1805 CONTINUE
|
|
ENERGY(II)=ENERGY(JJ)
|
|
ENERGY(JJ)=ETOP
|
|
DO 1808 I=1,NLINE
|
|
KK=LN(I,4)
|
|
IF (KK.EQ.JJ) LN(I,4)=II
|
|
IF (KK.EQ.II) LN(I,4)=JJ
|
|
KK=LN(I,5)
|
|
IF (KK.EQ.JJ) LN(I,5)=II
|
|
1808 IF (KK.EQ.II) LN(I,5)=JJ
|
|
1809 CONTINUE
|
|
WRITE(6,612) NNRG,(I,ENERGY(I),I=1,NNRG)
|
|
612 FORMAT(//' MODIFIED ENERGY LIST NOW CONTAINS',I4,' VALUES,'
|
|
1 /(15X,'ENERGY(',I3,') =',F18.9))
|
|
WRITE(6,921)
|
|
921 FORMAT(/' LINE-SHAPE TABLES HAVE BEEN MODIFIED ACCORDINGLY.')
|
|
1701 IF (NLINE.GT.0) GO TO 1700
|
|
WRITE(6,106)
|
|
106 FORMAT(/' * * * WARNING. NONE OF REQUESTED LINES CAN BE ',
|
|
1 'PROCESSED. REQUEST CANCELLED.')
|
|
NOCALC=.TRUE.
|
|
RETURN
|
|
C CODE FOR IN-CORE ROUTINES REPLACES OLDER CODE BELOW
|
|
1700 CALL DAOPEN
|
|
CALL DASIZE(ILSU,MXREC)
|
|
RETURN
|
|
C1700 IF (ILSU.LE.0) GO TO 1900
|
|
C
|
|
C OLD CODE FOR OPENING PRESSURE BROADENING SCRATCH FILE.
|
|
C THIS IS NOW REPLACED BY IN-CORE STORAGE (JUN 92).
|
|
C THE APPROPRIATE RECORD LENGTH IS MACHINE-DEPENDENT, AND
|
|
C MUST BE SUFFICIENT TO STORE 6 INTEGERS. FOR EXAMPLE:
|
|
C
|
|
C IBM: LREC = 24 (BYTES)
|
|
C VAX: LREC = 6 (LONGWORDS)
|
|
C CRAY: LREC = 48 (BYTES)
|
|
C
|
|
C LREC=24
|
|
C OPEN(ILSU,STATUS='SCRATCH',ACCESS='DIRECT',FORM='UNFORMATTED',
|
|
C 1 RECL=LREC,ERR=1900)
|
|
C
|
|
C1900 WRITE(6,107) ILSU
|
|
C 107 FORMAT(/' * * * WARNING. UNABLE TO OPEN DIRECT ACCESS FILE ON ',
|
|
C 1 'CHANNEL',I3,'. REQUESTED LINE-SHAPE CALCULATION CANCELLED.')
|
|
C NOCALC=.TRUE.
|
|
C RETURN
|
|
C IF (ILSU.LE.100) WRITE(6,200) ILSU
|
|
C 200 FORMAT(/' LINE SHAPE CALCULATION USES DIRECT ACCESS FILE ON ',
|
|
C 1 'CHANNEL',I4,' FOR TEMPORARY STORAGE')
|
|
C RETURN
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY PRBCNT(INRG,LEV,N,IUSE)
|
|
C
|
|
C SEE WHETHER THIS S-MATRIX WILL CONTRIBUTE TO ANY OF THE LINES
|
|
C REQUESTED: IUSE=1 MEANS THAT IT WILL.
|
|
C
|
|
C THIS CODE MAY NOT WORK FOR DIATOM-DIATOM: BE CAUTIOUS FOR NOW
|
|
IF (ITYPE3) GO TO 5920
|
|
C
|
|
DO 5910 I=1,NLINE
|
|
DO 5910 IA=1,2
|
|
IF (LN(I,IA+3).NE.INRG) GO TO 5910
|
|
DO 5908 II=1,N
|
|
L1=LEV(II)
|
|
IF (L1.EQ.LN(I,IA) .OR. L1.EQ.LN(I,IA+7)) GO TO 5920
|
|
5908 CONTINUE
|
|
5910 CONTINUE
|
|
IUSE=0
|
|
RETURN
|
|
C
|
|
5920 IUSE=1
|
|
RETURN
|
|
C
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY PRBOUT(JSTEP)
|
|
IF (NOCALC) RETURN
|
|
WRITE(6,671)
|
|
671 FORMAT(/' ACCUMULATED PRESSURE-BROADENING CROSS SECTIONS',
|
|
1 ' (IN ANG**2)')
|
|
FACTJ=1.D0
|
|
IF (JSTEP.GT.1) THEN
|
|
FACTJ=DBLE(JSTEP)/DBLE(JHALF)
|
|
WRITE(6,672) FACTJ
|
|
672 FORMAT(/' *** NOTE *** CROSS SECTIONS MULTIPLIED BY',F5.1,
|
|
1 ' TO ACCOUNT FOR JSTEP')
|
|
ENDIF
|
|
WRITE(6,673)
|
|
673 FORMAT(/' LINE LEV(A) LEV(B) LEV(A1) LEV(B1) TYPE',8X,
|
|
1 'EREL(1/CM)',11X,'RE(S)',12X,'IM(S)')
|
|
C
|
|
DO 6996 I=1,NLINE
|
|
SIGRJS=SIGR(I)*FACTJ
|
|
SIGIJS=SIGI(I)*FACTJ
|
|
6996 WRITE(6,601) I,LN(I,1),LN(I,2),
|
|
1 LN(I,8),LN(I,9),PTP(LN(I,3)+1),EREL(I),SIGRJS,SIGIJS
|
|
601 FORMAT(2I5,2I7,I8,3X,A8,F18.9,2D17.6)
|
|
RETURN
|
|
END
|
|
SUBROUTINE PRBR3(N,SREAL,SIMAG,JTOT,NLEV,NQN,JLEV,NBASIS,LEV,L,
|
|
& NPACK,LINE,NLVAL,IC,IL,SR,SI,TR,JBAR,ISTB,NBLK,LVAL)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION SREAL(N,N),SIMAG(N,N)
|
|
DIMENSION SR(N,N),SI(N,N),TR(N,N),JBAR(N),ISTB(N),NBLK(N),LVAL(N)
|
|
INTEGER JLEV(NLEV,NQN),NBASIS(N),LEV(N),L(N),IC(N),IL(N)
|
|
C
|
|
C PRBR3 IS AN INTERFACE ROUTINE WHICH TRANSFORMS ITYPE=3 S-MATRICES
|
|
C INTO FORMAT NECESSARY FOR PRESSURE BROADENING CALC..
|
|
C THIS NECESSITATES TRANSFORM FROM J1,J2(J12)L,JTOT TO
|
|
C J1(J2,L)JBAR,JTOT REPRESENTATION. IC, IL MADE COMPATIBLE.
|
|
C
|
|
C SREAL, SIMAG ARE STORED TEMPORARILY IN SR, SI WHICH MUST BE
|
|
C RESTORED (VIA ENTRY PRBR3R) BEFORE RETURNING CONTROL FROM PRBR.
|
|
C 4 JUN 93: REMOVE LIMITS ON INTERNALLY DEFINED WORKING STORAGE
|
|
C
|
|
C ENTRIES PRBRCS, PBCSSM, AND PBCSDA, WHICH HAD BEEN USED IN
|
|
C 'OLD' CS TRANSORMATION (SHOWN TO BE INCORRECT) ARE NOW
|
|
C TRAPPED WITH ERROR MSG (7/92). THEY SHOULD NOT BE CALLED.
|
|
C
|
|
DATA ZERO/0.D0/
|
|
C
|
|
C STATEMENT FUNCTION DEFINITION.
|
|
Z(I)=I+I+1
|
|
C
|
|
C SAVE SREAL, SIMAG IN SR, SI AND CLEAR SREAL, SIMAG.
|
|
1000 DO 1100 I1=1,N
|
|
DO 1100 I2=1,N
|
|
SR(I1,I2)=SREAL(I1,I2)
|
|
SREAL(I1,I2)=0.D0
|
|
SI(I1,I2)=SIMAG(I1,I2)
|
|
1100 SIMAG(I1,I2)=0.D0
|
|
C
|
|
C PICK OUT ROWS OF S WHICH CORRESPOND TO 'LINE' AND GROUP INTO
|
|
C BLOCKS WITH SAME L-VALUE.
|
|
C NB IS NO. OF BLOCKS, IC IS TABLE OF ALL
|
|
C (NLVAL) ROWS, IL HAS J12 VALUES, ISTB HAS (START-1) IN IC OF
|
|
C EACH BLOCK, NBLK HAS NO. IN EACH BLOCK.
|
|
NB=0
|
|
NLVAL=0
|
|
DO 2000 II=1,N
|
|
JJ=NBASIS(II)
|
|
IF (JLEV(LEV(JJ),NQN).NE.LINE) GO TO 2000
|
|
C CHECK TO SEE THAT THIS ISN'T ALREADY IN IC. . .
|
|
IM=NLVAL
|
|
2100 IF (IM.LE.0) GO TO 2200
|
|
IF (II.EQ.IC(IM)) GO TO 2000
|
|
IM=IM-1
|
|
GO TO 2100
|
|
C IF NOT, START A NEW BLOCK. . .
|
|
2200 NB=NB+1
|
|
ISTB(NB)=NLVAL
|
|
NBLK(NB)=1
|
|
LVAL(NB)=L(JJ)
|
|
NLVAL=NLVAL+1
|
|
IC(NLVAL)=II
|
|
IL(NLVAL)=JLEV(LEV(JJ),3)
|
|
C PROCESS REMAINING TO FIND OTHER WITH SAME L-VALUE. . .
|
|
II1=II+1
|
|
IF (II1.GT.N) GO TO 2000
|
|
DO 2500 II2=II1,N
|
|
JJ=NBASIS(II2)
|
|
IF (JLEV(LEV(JJ),NQN).NE.LINE) GO TO 2500
|
|
IF (L(JJ).NE.LVAL(NB)) GO TO 2500
|
|
NBLK(NB)=NBLK(NB)+1
|
|
NLVAL=NLVAL+1
|
|
IC(NLVAL)=II2
|
|
IL(NLVAL)=JLEV(LEV(JJ),3)
|
|
2500 CONTINUE
|
|
2000 CONTINUE
|
|
IF (NLVAL.LE.0) RETURN
|
|
C
|
|
C DO BOOKEEPING FOR TRANSFORMATION AND GET JBAR VALUES.
|
|
C GET JA, J2 FROM 1ST MEMBER - SHOULD BE SAME FOR ALL.
|
|
JJ=LEV(NBASIS(IC(1)))
|
|
JA=JLEV(JJ,1)
|
|
J2=JLEV(JJ,2)
|
|
JLOW=IABS(JTOT-JA)
|
|
JTOP=JTOT+JA
|
|
DO 3000 II=1,NB
|
|
LLL=LVAL(II)
|
|
NJB=0
|
|
JMIN=IABS(J2-LLL)
|
|
JMAX=J2+LLL
|
|
DO 3100 II2=JLOW,JTOP
|
|
IF (II2.LT.JMIN) GO TO 3100
|
|
IF (II2.GT.JMAX) GO TO 3100
|
|
C ALL TRIANGLE INEQUALITIES SATISFIED. INCLUDE JBAR
|
|
NJB=NJB+1
|
|
JBAR(ISTB(II)+NJB)=II2
|
|
3100 CONTINUE
|
|
C NO.(JBAR) SHOULD EQUAL NO.(J12) FOR EVERY BLOCK.
|
|
IF (NJB.EQ.NBLK(II) ) GO TO 3000
|
|
WRITE(6,601) NJB,NBLK(II),II
|
|
601 FORMAT('0 * * * ERROR. NO.(JBAR) .NE. NO.(J12)',2I6,
|
|
1 ' FOR BLOCK =',I4)
|
|
STOP
|
|
3000 CONTINUE
|
|
C
|
|
C SET UP TRANFORM MATRIX TR(JBAR,J12)
|
|
DO 3500 II1=1,NLVAL
|
|
DO 3500 II2=1,NLVAL
|
|
3500 TR(II1,II2)=0.D0
|
|
DO 3600 II=1,NB
|
|
LLL=LVAL(II)
|
|
NTOP=NBLK(II)
|
|
DO 3600 II1=1,NTOP
|
|
JB=JBAR(ISTB(II)+II1)
|
|
DO 3600 II2=1,NTOP
|
|
J12=IL(ISTB(II)+II2)
|
|
3600 TR(ISTB(II)+II1,ISTB(II)+II2)=SQRT(Z(JB)*Z(J12))
|
|
1 * SIXJ(JA,J2,JTOT,LLL,J12,JB)
|
|
C
|
|
C TRANSFORM SR,SI TO SREAL, SIMAG
|
|
C LOOP OVER L
|
|
DO 3700 II1=1,NB
|
|
NTOP1=NBLK(II1)
|
|
IST1=ISTB(II1)
|
|
C LOOP OVER L-PRIME
|
|
DO 3700 II2=1,NB
|
|
NTOP2=NBLK(II2)
|
|
IST2=ISTB(II2)
|
|
C LOOP OVER JBAR
|
|
DO 3700 JB=1,NTOP1
|
|
IRNEW=IC(IST1+JB)
|
|
C LOOP OVER JBAR-PRIME
|
|
DO 3700 JBP=1,NTOP2
|
|
ICNEW=IC(IST2+JBP)
|
|
C LOOP OVER J12
|
|
DO 3700 J12=1,NTOP1
|
|
IROLD=IC(IST1+J12)
|
|
C LOOP OVER J12-PRIME
|
|
DO 3700 J12P=1,NTOP2
|
|
ICOLD=IC(IST2+J12P)
|
|
FACTOR = TR(IST1+JB,IST1+J12) * TR(IST2+JBP,IST2+J12P)
|
|
SREAL(IRNEW,ICNEW)=SREAL(IRNEW,ICNEW)+FACTOR*SR(IROLD,ICOLD)
|
|
SIMAG(IRNEW,ICNEW)=SIMAG(IRNEW,ICNEW)+FACTOR*SI(IROLD,ICOLD)
|
|
3700 CONTINUE
|
|
C
|
|
C PACK L,JBAR INDICES INTO IL()
|
|
II2=0
|
|
DO 4000 II=1,NB
|
|
NTOP=NBLK(II)
|
|
LLL=LVAL(II)
|
|
DO 4000 II1=1,NTOP
|
|
II2=II2+1
|
|
4000 IL(II2)=LLL*NPACK+JBAR(II2)
|
|
C SREAL, SIMAG, IC, AND IL ARE NOW IN FORMAT EXPECTED BY PRBR
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
C
|
|
ENTRY PRBR3R(N,SREAL,SIMAG,SR,SI)
|
|
C RESTORE SIMAG,SREAL IN CASE THEY ARE NEEDED FOR FURTHER PROCESSING
|
|
DO 5000 II1=1,N
|
|
DO 5000 II2=1,N
|
|
SREAL(II1,II2)=SR(II1,II2)
|
|
5000 SIMAG(II1,II2)=SI(II1,II2)
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
C ENTRIES BELOW PROVIDED INTERFACE TO OLD (INCORRECT) CS CODE
|
|
C ----- DUMMIED 7/92 -----
|
|
C ENTRY PRBRCS TRANSFORMS BODY-FIXED TO SPACE-FIXED S-MATRICES.
|
|
C ENTRY PBCSSM RETURNS MATRIX ELEMENTS STORED INTERNALLY HERE.
|
|
C ENTRY PBCSDA OUTPUTS STORED S-MATRICES ON DISK.
|
|
C
|
|
ENTRY PRBRCS
|
|
C ENTRY PRBRCS(N,SREAL,SIMAG,JTOT,MVALUE,IEXCH,WGHT,IPWVEC,
|
|
C & NLEV,NQN,JLEV,NBASIS,LEV,L,LINE,NLVAL,ITYPE)
|
|
ENTRY PBCSSM
|
|
C ENTRY PBCSSM(L1,L2,NDEBUG,NMATCH,SROUT,SIOUT)
|
|
ENTRY PBCSDA
|
|
C ENTRY PBCSDA(ILSU)
|
|
WRITE(6,7300)
|
|
7300 FORMAT(' *** ERROR. PBBRCS, PBCSSM, OR PBCSDA CALLED.'/
|
|
1 ' *** THIS (INCORRECT) CS TRANSFORM NO LONGER',
|
|
2 ' SUPPORTED.')
|
|
STOP
|
|
END
|
|
SUBROUTINE QAPROP(Q, T, U, W, Y, NSQ,
|
|
& RBEGIN, REND, NSTEPS, IREAD, IWRITE, ISCRU,
|
|
& EIVAL, Y1, Y2, Y3, Y4, N,
|
|
& P, VL, IV, ERED, EINT, CENT, RMLMDA, DIAG,
|
|
& MXLAM, NPOTL, ISTART, NODES)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C ROUTINE TO SOLVE THE CLOSE COUPLED EQUATIONS USING A
|
|
C MODIFIED LOG DERIVATIVE ALGORITHM. THE COUPLING MATRIX
|
|
C EVALUATED AT THE MID POINT OF EACH SECTOR IS USED AS A
|
|
C REFERENCE POTENTIAL FOR THE SECTOR.
|
|
C
|
|
LOGICAL IREAD,IWRITE
|
|
DIMENSION Q(NSQ),T(NSQ),U(NSQ),W(NSQ),Y(NSQ),
|
|
& EIVAL(N),Y1(N),Y2(N),Y3(N),Y4(N)
|
|
DIMENSION P(MXLAM),VL(2),IV(2),EINT(N),CENT(N),DIAG(N)
|
|
C
|
|
NODES=0
|
|
ESHIFT=ERED
|
|
ERED=0.D0
|
|
C
|
|
C THIS VERSION USES A CONSTANT STEP SIZE, DR, THROUGHOUT THE
|
|
C INTEGRATION RANGE, BUT IS WRITTEN SO THAT THIS MAY BE EASILY
|
|
C CHANGED.
|
|
C
|
|
IF (ISTART.EQ.0) THEN
|
|
IF (IREAD) GO TO 40
|
|
DR=(REND-RBEGIN)/DBLE(NSTEPS)
|
|
R=RBEGIN
|
|
CALL WAVMAT(U,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
IFAIL=0
|
|
CALL F02ABF(U,N,N,EIVAL,T,N,DIAG,IFAIL)
|
|
C
|
|
C Q MATRIX IS USED TO HOLD CORRECTION TO Y4 FROM PREVIOUS
|
|
C SECTOR. INITIALISE IT FOR THE FIRST SECTOR.
|
|
C
|
|
DO 20 IJ=1,NSQ
|
|
Q(IJ)=0.D0
|
|
20 CONTINUE
|
|
IF (IWRITE) WRITE (ISCRU) DR,EIVAL
|
|
GO TO 60
|
|
40 READ (ISCRU) DR,EIVAL
|
|
60 CONTINUE
|
|
C
|
|
C INITIALISE Y MATRIX
|
|
C
|
|
DO 80 IJ=1,NSQ
|
|
Y(IJ)=0.D0
|
|
80 CONTINUE
|
|
II=-N
|
|
SGN=SIGN(1.D0,DR)
|
|
DO 100 I=1,N
|
|
II=II+N+1
|
|
WREF=EIVAL(I)-ESHIFT
|
|
Y(II)=SGN*1.D30
|
|
IF(WREF.GT.0.D0) Y(II)=SGN*SQRT(WREF)
|
|
100 CONTINUE
|
|
ELSE
|
|
C
|
|
C ISTART=1: Y ALREADY CONTAINS LOG DERIVATIVE MATRIX
|
|
C IN THE ASYMPTOTIC BASIS. MUST STILL
|
|
C INITIALISE Q (AS ABOVE) AND T (UNITY) IF FIRST ENERGY:
|
|
C
|
|
IF (IREAD) GO TO 119
|
|
R=RBEGIN
|
|
CALL WAVMAT(U,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
DO 110 IJ=1,NSQ
|
|
Q(IJ)=0.D0
|
|
T(IJ)=0.D0
|
|
110 CONTINUE
|
|
II=-N
|
|
DO 111 I=1,N
|
|
II=II+N+1
|
|
T(II)=1.D0
|
|
111 CONTINUE
|
|
119 CONTINUE
|
|
ENDIF
|
|
C
|
|
C
|
|
C PROPAGATION LOOP BEGINS HERE
|
|
C
|
|
C
|
|
DO 500 KSTEP=1,NSTEPS
|
|
IF (IREAD) GO TO 180
|
|
R=R+0.5D0*DR
|
|
CALL WAVMAT(W,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
C
|
|
C CALCULATE CORRECTION TO Y1(K)
|
|
C
|
|
DO 120 IJ=1,NSQ
|
|
U(IJ)=U(IJ)-W(IJ)
|
|
120 CONTINUE
|
|
CR=DR/6.D0
|
|
DO 140 IJ=1,NSQ
|
|
U(IJ)=CR*U(IJ)
|
|
140 CONTINUE
|
|
C
|
|
C PLUS CORRECTION TO Y4(K-1)
|
|
C
|
|
DO 160 IJ=1,NSQ
|
|
U(IJ)=U(IJ)+Q(IJ)
|
|
160 CONTINUE
|
|
C
|
|
C TRANSFORM CORRECTION TO OLD BASIS
|
|
C
|
|
CALL TRNSFM(T,U,Q,N,.FALSE.,.TRUE.)
|
|
IF (IWRITE) WRITE (ISCRU) U
|
|
GO TO 200
|
|
180 READ (ISCRU) U
|
|
200 CONTINUE
|
|
C
|
|
C APPLY CORRECTION TO Y MATRIX IN OLD BASIS
|
|
C
|
|
DO 220 IJ=1,NSQ
|
|
Y(IJ)=Y(IJ)+U(IJ)
|
|
220 CONTINUE
|
|
C
|
|
C DIAGONALISE COUPLING MATRIX AND CALCULATE SECTOR TO SECTOR
|
|
C TRANSFORMATION MATRIX, Q.
|
|
C
|
|
IF (IREAD) GO TO 260
|
|
IFAIL=0
|
|
CALL F02ABF(W,N,N,EIVAL,U,N,DIAG,IFAIL)
|
|
CALL DGEMUL(T,N,'T',U,N,'N',Q,N,N,N,N)
|
|
DO 240 IJ=1,NSQ
|
|
T(IJ)=U(IJ)
|
|
240 CONTINUE
|
|
IF (IWRITE) WRITE (ISCRU) DR,EIVAL,Q
|
|
GO TO 280
|
|
260 READ (ISCRU) DR,EIVAL,Q
|
|
280 CONTINUE
|
|
C
|
|
C TRANSFORM Y MATRIX TO NEW BASIS
|
|
C
|
|
CALL TRNSFM(Q,Y,U,N,.FALSE.,.TRUE.)
|
|
C
|
|
C CONSTRUCT FIRST ORDER MAGNUS SECTOR PROPAGATORS
|
|
C HALF ANGLE FORMULAE ARE USED FOR MAXIMUM OPACITY.
|
|
C
|
|
NCHECK=0
|
|
WMAX=24.D0/(DR*DR)
|
|
DO 300 I=1,N
|
|
WREF=EIVAL(I)-ESHIFT
|
|
FLAM=0.5D0*SQRT(ABS(WREF))
|
|
IF (WREF.LT.0.D0) THEN
|
|
TN=TAN(FLAM*DR)
|
|
Y1(I)=FLAM/TN-FLAM*TN
|
|
Y2(I)=FLAM/TN+FLAM*TN
|
|
ELSE
|
|
IF (WREF.GT.WMAX) NCHECK=NCHECK+1
|
|
C IF (WREF.GT.0.D0) THEN
|
|
TH=TANH(FLAM*DR)
|
|
Y1(I)=FLAM/TH+FLAM*TH
|
|
Y2(I)=FLAM/TH-FLAM*TH
|
|
ENDIF
|
|
Y3(I)=Y2(I)
|
|
Y4(I)=Y1(I)
|
|
300 CONTINUE
|
|
C
|
|
C PROPAGATE Y MATRIX ACROSS THE SECTOR
|
|
C
|
|
II=-N
|
|
DO 320 I=1,N
|
|
II=II+N+1
|
|
Y(II)=Y(II)+Y1(I)
|
|
320 CONTINUE
|
|
C
|
|
CALL SYMINV(Y,N,N,NCOUNT)
|
|
IF (NCOUNT.GT.N) GO TO 900
|
|
IF (RBEGIN.GT.REND) NCOUNT=N-NCOUNT
|
|
IF (NCHECK.EQ.0) NODES=NODES+NCOUNT
|
|
C
|
|
IJ=0
|
|
DO 340 J=1,N
|
|
DO 340 I=1,N
|
|
IJ=IJ+1
|
|
Y(IJ)=-Y3(I)*Y(IJ)*Y2(J)
|
|
340 CONTINUE
|
|
II=-N
|
|
DO 360 I=1,N
|
|
II=II+N+1
|
|
Y(II)=Y(II)+Y4(I)
|
|
360 CONTINUE
|
|
C
|
|
IF (IREAD) GO TO 500
|
|
R=R+0.5D0*DR
|
|
CALL WAVMAT(U,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
C
|
|
C CALCULATE CORRECTION TO Y4(K)
|
|
C
|
|
DO 380 IJ=1,NSQ
|
|
Q(IJ)=U(IJ)-W(IJ)
|
|
380 CONTINUE
|
|
CR=DR/6.D0
|
|
DO 400 IJ=1,NSQ
|
|
Q(IJ)=CR*Q(IJ)
|
|
400 CONTINUE
|
|
C
|
|
C *** COULD CHANGE DR HERE ***
|
|
C
|
|
500 CONTINUE
|
|
C
|
|
C
|
|
C PROPAGATION LOOP ENDS HERE
|
|
C
|
|
C
|
|
IF (IWRITE) WRITE (ISCRU) T,Q
|
|
IF (IREAD ) READ (ISCRU) T,Q
|
|
C
|
|
C TRANSFORM Y MATRIX TO ASYMPTOTIC BASIS
|
|
C
|
|
CALL TRNSP(T,N)
|
|
CALL TRNSFM(T,Y,W,N,.FALSE.,.TRUE.)
|
|
C
|
|
C APPLY FINAL CORRECTION IN ASYMPTOTIC BASIS
|
|
C
|
|
DO 520 IJ=1,NSQ
|
|
Y(IJ)=Y(IJ)+Q(IJ)
|
|
520 CONTINUE
|
|
ERED=ESHIFT
|
|
RETURN
|
|
C
|
|
900 WRITE (6,1000) KSTEP
|
|
1000 FORMAT('0***** MATRIX INVERSION ERROR IN QAPROP AT ',
|
|
& 'STEP K = ',I6,' RUN HALTED.')
|
|
STOP
|
|
END
|
|
SUBROUTINE QASCAT(N, NSQ, MXLAM, NPOTL,
|
|
1 SR, SI, U, VL, IV, EINT, CENT, WVEC, L, NB,
|
|
2 P, Y, W, EIVAL, Y1, Y2, Y3, Y4, DIAG,
|
|
3 ICODE, IPRINT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C ***
|
|
C *** ---------------------------------------------------------------
|
|
C *** ROUTINE TO PERFORM A SCATTERING CALCULATION USING QAPROP.
|
|
C *** SR AND SI CONTAIN THE S MATRIX ON EXIT.
|
|
C *** BOTH ARE USED INTERNALLY TO ECONOMISE ON WORKSPACE.
|
|
C *** ---------------------------------------------------------------
|
|
C *** ICODE.EQ.2 FOR SUBSEQUENT ENERGIES.
|
|
C ***
|
|
C DIMENSION STATEMENTS FOR ARGUMENT LIST
|
|
DIMENSION U(NSQ),W(NSQ),Y(NSQ),
|
|
& EIVAL(N),Y1(N),Y2(N),Y3(N),Y4(N),DIAG(N)
|
|
DIMENSION P(MXLAM),VL(2),IV(2),SR(NSQ),SI(NSQ),
|
|
& EINT(N),CENT(N),WVEC(N)
|
|
INTEGER L(N),NB(N)
|
|
C
|
|
COMMON/DRIVE/STEST,STEPS,STABIL,CONV,RMIN,RMAX,XEPS,DR,
|
|
1 DRMAX,RMID,TOLHI,RTURN,VTOL,ESHIFT,ERED,RMLMDA,
|
|
2 NOPEN,JKEEP,ISCRU,MAXSTP
|
|
C
|
|
C THE FOLLOWING VARIABLES FROM COMMON/DRIVE/ ARE USED WITH THIS
|
|
C PROPAGATOR: STEPS,RMIN,RMAX,ERED,RMLMDA,NOPEN,ISCRU
|
|
C
|
|
LOGICAL IREAD,IWRITE
|
|
C ----------------------------------------------------------------
|
|
C SET UP TO USE UNIT (ISCRU)
|
|
IREAD = ICODE.EQ.2 .AND. ISCRU.GT.0
|
|
IWRITE = ICODE.EQ.1 .AND. ISCRU.GT.0
|
|
C ---------------------------------------------------------------
|
|
C
|
|
C CALCULATE WAVEVECTORS AND STEP SIZE
|
|
C
|
|
WMAX=0.D0
|
|
NOPEN=0
|
|
DO 20 I=1,N
|
|
DIF=ERED-EINT(I)
|
|
WVEC(I)=SIGN(SQRT(ABS(DIF)),DIF)
|
|
WMAX=MAX(WMAX,WVEC(I))
|
|
NB(I)=I
|
|
IF (DIF.GT.0.D0) NOPEN=NOPEN+1
|
|
20 CONTINUE
|
|
IF (NOPEN.EQ.0) RETURN
|
|
C
|
|
IF (IREAD) GO TO 40
|
|
PI=ACOS(-1.D0)
|
|
NSTEPS=WMAX*STEPS*(RMAX-RMIN)/PI
|
|
RBEGIN=RMIN
|
|
REND=RMAX
|
|
IF (IWRITE) WRITE (ISCRU) RBEGIN,REND,NSTEPS
|
|
GO TO 60
|
|
40 READ (ISCRU) RBEGIN,REND,NSTEPS
|
|
60 CONTINUE
|
|
C
|
|
C PROPAGATE LOG DERIVATIVE MATRIX THROUGH THE SCATTERING REGION
|
|
C ---------------------------------------------------------------
|
|
ISTART=0
|
|
CALL QAPROP(SR, SI, U, W, Y, NSQ,
|
|
& RBEGIN, REND, NSTEPS, IREAD, IWRITE, ISCRU,
|
|
& EIVAL, Y1, Y2, Y3, Y4, N,
|
|
& P, VL, IV, ERED, EINT, CENT, RMLMDA, DIAG,
|
|
& MXLAM, NPOTL, ISTART, NODES)
|
|
C ---------------------------------------------------------------
|
|
IF (IPRINT.GE.3) WRITE (6,1000) RBEGIN,REND,NSTEPS
|
|
1000 FORMAT('0 QAPROP. LOG DERIVATIVE MATRIX INTEGRATED FROM ',
|
|
& F12.4,' TO ',F12.4,' IN ',I6,' STEPS.')
|
|
C
|
|
C SORT CHANNELS BY ASYMPTOTIC ENERGY
|
|
C
|
|
IF (N.EQ.1) GO TO 100
|
|
NM1=N-1
|
|
DO 80 I=1,NM1
|
|
IP1=I+1
|
|
DO 80 J=IP1,N
|
|
IF (EINT(NB(I)).LE.EINT(NB(J))) GO TO 80
|
|
IT=NB(I)
|
|
NB(I)=NB(J)
|
|
NB(J)=IT
|
|
80 CONTINUE
|
|
C
|
|
C CALCULATE K AND S MATRICES
|
|
C
|
|
100 CALL YTOK(NB,WVEC,L,N,NOPEN,Y1,Y2,Y3,Y4,Y,W,U,REND)
|
|
CALL KTOS(U,SR,SI,NOPEN)
|
|
RETURN
|
|
END
|
|
FUNCTION QSYMTP(J1,K1,J1P,K1P,J2,J2P,LL,LLP,JJ,JJP,JT,P1,Q1,P2,PP)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
INTEGER P1,Q1,P2,PP
|
|
C
|
|
C CALCULATES MATRIX ELEMENT FOR LINEAR ROTOR/ASSYMETRIC TOP
|
|
C USES SUBROUTINES -
|
|
C THRJ( )
|
|
C THREEJ( ) WHICH IS FOR M1=M2=M3=0
|
|
C SIXJ(LL,LLP,JJ,JJP,PP,JT)
|
|
C NOTE THAT ORDER OF ARGUMENTS IS (J1,J2,J5,J4,J3,J6)
|
|
C XNINEJ( )
|
|
C
|
|
DATA PI/3.14159265358979289D0/
|
|
C STATEMENT FUNCTION DEFINITION . . .
|
|
Z(Y) = 2.D0 * Y + 1.D0
|
|
C
|
|
IF (K1P-K1+Q1 .NE. 0) GO TO 9000
|
|
F=THREEJ(LL,LLP,PP)
|
|
1 IF (F.EQ.0.D0) GO TO 9000
|
|
XJ1 = J1
|
|
XJ1P = J1P
|
|
XK1 = -K1
|
|
XK1P = K1P
|
|
XQ1 = Q1
|
|
XP1 = P1
|
|
F=F * THRJ(XJ1,XP1,XJ1P,XK1,XQ1,XK1P)
|
|
F = F*THREEJ(J2,P2,J2P)
|
|
2 IF (F.EQ.0.D0) GO TO 9000
|
|
F=F * SIXJ(LL,LLP,JJ,JJP,PP,JT)
|
|
3 IF (F. EQ. 0.0D0) GO TO 9000
|
|
F = F*XNINEJ(JJP,JJ,PP,J1P,J1,P1,J2P,J2,P2)
|
|
4 IF (F.EQ.0.D0) GO TO 9000
|
|
XLLP = LLP
|
|
XLL = LL
|
|
XJ2 = J2
|
|
XJ2P = J2P
|
|
XJJ = JJ
|
|
XJJP = JJP
|
|
XPP = PP
|
|
XP2 = P2
|
|
PH=PARITY3(-J1P+J2P-PP+K1-JJ-JT)
|
|
F=F*PH*SQRT(Z(XLLP)*Z(XLL)*Z(XJ2)*Z(XJ2P)*Z(XJJ)*Z(XJJP)
|
|
1 *Z(XPP)*Z(XP2)*Z(XJ1)*Z(XJ1P))/4.0/PI
|
|
5 QSYMTP=F
|
|
RETURN
|
|
9000 QSYMTP=0.D0
|
|
RETURN
|
|
END
|
|
SUBROUTINE RBES(N,Z,ZJN,ZJNP,ZYN,ZYNP)
|
|
C CALCULATES RICCATI-BESSEL FUNCTIONS OF NON-NEGATIVE INTEGER ORDER N,
|
|
C AND POSITIVE ARGUMENT Z, AND THEIR DERIVATIVES WITH RESPECT TO Z.
|
|
C THE DEFINITIONS AND NORMALIZATIONS ARE AS IN THE NBS HANDBOOK, P. 445
|
|
C THE METHODS USED ARE
|
|
C 1. IF Z.LE.N ( CLASSICALLY FORBIDDEN REGION), USE
|
|
C ASCENDING POWER SERIES FOR THE REGULAR SOLUTION ZJN AND
|
|
C ITS DERIVATIVE ZJNP. FOREWARD RECURRENCE IS USED FOR
|
|
C THE IRREGULAR SOLUTION ZYN AND ITS DERIVATIVE ZYNP.
|
|
C 2. IF Z.GT.N ( CLASSICALLY ALLOWED REGION), FOREWARD
|
|
C RECURRENCE IS USED FOR BOTH FUNCTIONS.
|
|
C LIBRARY FUNCTIONS REQUIRED SIN(Z) AND COS(Z)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DATA ONE /1.D0/
|
|
DATA HALF /0.5D0/
|
|
DATA TWO /2.D0/
|
|
DATA ZERO /0.D0/
|
|
DATA THREE/3.D0/
|
|
C
|
|
C EVALUATE TRIGONOMETRIC FUNCTIONS NEEDED
|
|
SINZ=SIN(Z)
|
|
COSZ=COS(Z)
|
|
ZINV=ONE/Z
|
|
AJ=SINZ
|
|
BJ=SINZ*ZINV-COSZ
|
|
AY=-COSZ
|
|
BY=-SINZ-COSZ*ZINV
|
|
IF(N-1)1,2,3
|
|
C FUNCTIONS OF ORDER ZERO
|
|
1 ZJN=AJ
|
|
ZJNP=COSZ
|
|
ZYN=AY
|
|
ZYNP=SINZ
|
|
RETURN
|
|
C FUNCTIONS OF ORDER ONE
|
|
2 ZJN=BJ
|
|
ZJNP=AJ-ZINV*BJ
|
|
ZYN=BY
|
|
ZYNP=AY-ZINV*BY
|
|
RETURN
|
|
C
|
|
C CASES FOR ORDER GREATER THAN 1
|
|
3 XN=N
|
|
DELF=ZINV+ZINV
|
|
FACTOR=DELF+ZINV
|
|
C TEST TO SEE IF RECURRENCE CAN BE USED FOR ALL FUNCTIONS
|
|
IF(Z.GT.XN) GO TO 100
|
|
C
|
|
C THIS CASE FOR NON-CLASSICAL REGION.
|
|
C USE POWER SERIES FOR REGULAR SOLUTION AND RECURSION FOR IRREGULAR
|
|
C COMPUTE COEFFIENT (C) IN FRONT OF POWER SERIES, AT SAME TIME AS
|
|
C FOREWARD RECURRENCE.
|
|
ZSQ=Z**2
|
|
TOP=XN+XN
|
|
XJ=THREE
|
|
C=ZSQ/THREE
|
|
25 ZYN=BY*FACTOR-AY
|
|
AY=BY
|
|
BY=ZYN
|
|
FACTOR=FACTOR+DELF
|
|
XJ=XJ+TWO
|
|
C=C*(Z/XJ)
|
|
IF(XJ.LT.TOP) GO TO 25
|
|
C FORM DERIVATIVE OF IRREGULAR SOLUTION
|
|
ZYNP=AY-ZINV*BY*XN
|
|
C USE POWER SERIES FOR REGULAR SOLUTION
|
|
C INITIALIZE
|
|
FACTOR=-HALF*ZSQ
|
|
U=ONE
|
|
TERM=ONE
|
|
DU=ONE
|
|
DTERM=ONE
|
|
D2NP3=TOP+THREE
|
|
DEN=D2NP3
|
|
DFACT=ZERO
|
|
C INCREMENT FACTORIAL FACTOR
|
|
35 DFACT=DFACT+ONE
|
|
TERM=TERM*(FACTOR/(DFACT*DEN))
|
|
C SUM SERIES
|
|
U=U+TERM
|
|
C INCREMENT DENOMINATOR
|
|
DEN=DEN+TWO
|
|
DTERM=DTERM*(FACTOR/(DFACT*DEN))
|
|
C SUM DERIVATIVE SERIES
|
|
DU=DU+DTERM
|
|
C TEST FOR CONVERGENCE TO SINGLE PRECISION ACCURACY
|
|
IF(ABS(TERM).GT.1.0D-09) GO TO 35
|
|
C CONVERGENCE. COMPUTE REGULAR FUNCTION.
|
|
ZJN=U*C
|
|
C COMPUTE DERIVATIVE
|
|
ZJNP=(XN+ONE)*ZJN*ZINV-(Z*DU/D2NP3)*C
|
|
RETURN
|
|
C
|
|
C CLASSICAL CASE. USE FOREWARD RECURSION.
|
|
100 CONST=ZINV*XN
|
|
TOP=CONST+CONST
|
|
200 AJ=FACTOR*BJ-AJ
|
|
AY=FACTOR*BY-AY
|
|
C INCREMENT FACTOR
|
|
FACTOR=FACTOR+DELF
|
|
C TEST FOR COMPLETION
|
|
IF(FACTOR.GT.TOP) GO TO 250
|
|
BJ=FACTOR*AJ-BJ
|
|
BY=FACTOR*AY-BY
|
|
FACTOR=FACTOR+DELF
|
|
C TEST FOR COMPLETION
|
|
IF(FACTOR.LT.TOP) GO TO 200
|
|
ZJN=BJ
|
|
ZYN=BY
|
|
C FORM DERIVATIVES
|
|
ZJNP=AJ-CONST*BJ
|
|
ZYNP=AY-CONST*BY
|
|
RETURN
|
|
250 ZJN=AJ
|
|
ZYN=AY
|
|
C FORM DERIVATIVES
|
|
ZJNP=BJ-CONST*AJ
|
|
ZYNP=BY-CONST*AY
|
|
RETURN
|
|
END
|
|
SUBROUTINE RDPCH(ISIGU)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C THIS ROUTINE LISTS/PUNCHES THE 'SAVED' CROSS SECTIONS FROM (ISIGU)
|
|
C FORMAT MADE COMPATBLE W/CURRENT VERSION APR 94 (SG)
|
|
C NOTE: BY-PASSED IN CURRENT VERSION OF MOLSCAT
|
|
C THE SEEMINGLY COMPLICATED METHOD USED IS TO ASSURE ABILITY TO
|
|
C RETRIEVE CROSS SECTIONS INDEPENDENTLY OF A SUCCESSFULLY TERMINATED
|
|
C SCATTERING RUN BY SAVING ON (ISIGU) AS WELL AS IN MATRIX SIG().
|
|
C
|
|
CHARACTER*1 A1(80),S,B,ST,EOF,CS
|
|
DATA B/' '/, ST/'*'/, EOF/'$'/
|
|
C
|
|
WRITE(6,601)
|
|
601 FORMAT('1')
|
|
I10=0
|
|
C
|
|
1000 I10=I10+1
|
|
READ(ISIGU,100,ERR=900,REC=I10) A1
|
|
100 FORMAT(80A1)
|
|
IF (A1(1).EQ.EOF) RETURN
|
|
IF (A1(1).NE.ST) GO TO 1000
|
|
READ(ISIGU,101,REC=I10) S,E,I1,I2,I3,I4,I5,SIG,CS
|
|
101 FORMAT(A1,F19.6,I5,2I7,5X,2I5,D20.6,1X,A1)
|
|
WRITE(6,600) B,E,I1,I2,I3,I4,I5,SIG,CS
|
|
600 FORMAT(A1,F19.6,I5,2I7,5X,2I5,1P,D20.6,1X,A1)
|
|
C PUNCH CHANNEL COMMENTED OUT IN THIS VERSION
|
|
C IF (SIG.GT.0. .AND. I4.NE.I5)
|
|
C 1 WRITE(7,600) S,E,I1,I2,I3,I4,I5,SIG,CS
|
|
GO TO 1000
|
|
900 WRITE(6,*) ' *** RDPCH. ERROR READING FILE',ISIGU
|
|
RETURN
|
|
END
|
|
SUBROUTINE RESTRT(IRSTRT,ISAVEU, JTOTL,JSTEP,MXPAR,MSET,MHI,
|
|
1 LABELX,ITYPEX,NLEVX,NQNX,UREDX,IPX,
|
|
2 JLEVX,NNRGX,ENERGX,MXNRG,
|
|
3 SIG,ISST,IECONV,MINJT,MAXJT,ISIGU,IPARTU,KSAVE,
|
|
4 OTOL,DTOL, IXX,RXX, MRSTRT,IERST,MXP,PRNTLV)
|
|
C
|
|
C MODIFICATIONS FOR VERSION 14, JUL 94
|
|
C RESTART MOLSCAT CALCULATION FROM SAVED TAPE ON UNIT(ISAVEU):
|
|
C IRSTRT= 1 RESTART AFTER A COMPLETED JTOT SET
|
|
C =-1 SAME AS 1, BUT BEGINNING AT &INPUT JTOTL
|
|
C = 2 RESTART AFTER A COMPLETED SYMMETRY BLOCK
|
|
C = 3 RESTART AFTER LAST GOOD JTOT,M,INRG SET
|
|
C
|
|
C A RESTART RUN SHOULD HAVE SAME INPUT DECK AS ORIGINAL RUN
|
|
C EXCEPT THAT IRSTRT PARAMETER MUST BE SET.
|
|
C FOR IRSTRT=-1, JTOTL MUST BE RESET TO DESIRED RESTART VALUE
|
|
C SOME OTHER PARMS (E.G., INTEGRATION PARMS *MAY* BE CHANGED)
|
|
C
|
|
C RECREATES ACCUM CROSS SECTIONS (OUTPUT/PRBR) FROM SAVED S-MATRICES
|
|
C
|
|
C JTSV(IRSTRT),MSV(IRSTRT),INSV(IRSTRT)
|
|
C CONTAIN VALUES FOR LAST *COMPLETED* SET FOR EACH IRSTRT OPTION.
|
|
C RETURNS JTOTL,MRSTRT,IERST -- VALUES AT WHICH TO RECOMMENCE
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION JLEVX(1)
|
|
DIMENSION ENERGX(MXNRG)
|
|
DIMENSION MINJT(MXNRG),MAXJT(MXNRG),ISST(MXNRG),IECONV(MXNRG)
|
|
DIMENSION SIG(1), IXX(1),RXX(1)
|
|
DIMENSION JTSV(3),MSV(3),INSV(3)
|
|
INTEGER PRNTLV
|
|
CHARACTER*80 LABEL,LABELX
|
|
LOGICAL CONSIS,MPLMIN,LCS,LCS3
|
|
C BIG VALUE TO INITIALIZE JSTOP
|
|
DATA IBIG/1000000/
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
C USAGE IN RESTRT DOES *NOT* CONFORM W/ USUAL MOLSCAT PHILOSOPHY:
|
|
C X() IS ACCESSED DIRECTLY, VIA IXX() AND RXX()
|
|
C LIMIT CHECKED DIRECTLY AGAINST MX, I.E., CHKSTR IS NOT USED.
|
|
C ON ENTRY IXX(1), RXX(1) ARE EQUIVALENCED TO X(IXNEXT)
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C 'BASIS' COMMON BLOCK -- NEED NLEVEL,ELEVEL,JLEVEL (V14, JUL 94)
|
|
DIMENSION ELEVEL(1000),ELVL(1000),JLEVEL(4000)
|
|
COMMON /CMBASE/ DUM(1016),IDUM(4031)
|
|
EQUIVALENCE (NLVL,IDUM(1)),(ELVL(1),DUM(13)),(JLEVEL(1),IDUM(2))
|
|
1 ,(IDENT,IDUM(4029))
|
|
C
|
|
C COMMON TO COMMUNICATION WITH PRBR; EXCEPT FOR MVALUE THESE HAVE
|
|
C BEEN SET IN PRIOR CALL TO BASIN.
|
|
COMMON /PRBASE/ ITYPE,NQN,NLEV,MVALUE,IEXX,MPLMIN
|
|
C
|
|
C --------------------------------------------------------
|
|
IF (IRSTRT.EQ.0.OR.IRSTRT.LT.-1) RETURN
|
|
CALL GCLOCK(TSTART)
|
|
C
|
|
C FIRST MXPAR LOCATIONS IN IXX USED TO STORE HIGHEST ENERGY/M
|
|
C (PERHAPS WE SHOULD KEEP HIGHEST ENERGY IN *LAST* JTOT CYCLE)
|
|
IXI=MXPAR
|
|
IXR=(MXPAR+NIPR-1)/NIPR
|
|
IF (IXNEXT+IXR-1.GT.MX) THEN
|
|
WRITE(6,*) ' *** TERMINAL ERROR. SCRATCH STORAGE EXCEEDED.'
|
|
STOP
|
|
ELSE
|
|
DO 1000 I=1,MXPAR
|
|
1000 IXX(I)=-1
|
|
ENDIF
|
|
C
|
|
JSTOP=IBIG
|
|
IF (IRSTRT.EQ.-1) THEN
|
|
WRITE(6,*) ' *** RESTRT. REQUEST TO RESTART AT JTOT =',JTOTL
|
|
JSTOP=JTOTL-JSTEP
|
|
IRSTRT=1
|
|
ENDIF
|
|
IT=ISAVEU
|
|
C CHECK HEADER INFO ON TAPE FOR AGREEMENT WITH CURRENT RUN PARAMS.
|
|
READ(IT,END=9001) LABEL,ITYPE,NLEV,NQN,URED,IP
|
|
WRITE(6,600) IT,LABEL,LABELX
|
|
600 FORMAT(' ***'/' *** RESTRT. DATA FROM UNIT ISAVEU =',I4/
|
|
2 ' *** LABEL ON ISAVEU =',A80/
|
|
3 ' *** CURRENT RUN LABEL =',A80/' ***')
|
|
IF (ITYPE.EQ.ITYPEX .AND. NLEVX.EQ.NLEV .AND. NQNX.EQ.NQN
|
|
1 .AND. URED.EQ.UREDX) THEN
|
|
WRITE(6,601) ITYPE,NLEV,NQN,URED,IP
|
|
601 FORMAT(/' *** CURRENT PARAMETERS AGREE WITH SAVED VALUES'/
|
|
1 6X,'ITYPE =',I3/6X,'NLEV, NQN =',2I4/6X,'URED =',F8.4/
|
|
2 6X,'IPROGM =',I3)
|
|
ELSE
|
|
WRITE(6,602) ITYPEX,ITYPE,NLEVX,NLEV,NQNX,NQN,UREDX,URED
|
|
602 FORMAT(' *** ERROR. CURRENT/SAVED PARAMTERS DO NOT MATCH'/
|
|
1 14X,'ITYPE',2I6/14X,'NLEV',2I6/14X,'NQN ',2I6/
|
|
2 14X,'URED',2F12.4/' *** TERMINATING.')
|
|
STOP
|
|
ENDIF
|
|
IF (IPX.NE.IP) WRITE(6,603) IPX
|
|
603 FORMAT(' *** RESTRT. WARNING: CURRENT RUN IS VERSION',I3,
|
|
1 '; DIFFERS FROM SAVE TAPE VERSION')
|
|
IF (IP.LE.13) THEN
|
|
WRITE(6,*) ' *** RESTRT. CURRENT VERSION CANNOT PROCESS',
|
|
1 ' SAVE TAPES IN IPROGM.LE.13 FORMAT'
|
|
STOP
|
|
ENDIF
|
|
C
|
|
NSQ=NLEV*NQN
|
|
NUSED=(IXI+NSQ+NIPR-1)/NIPR
|
|
IF (IXNEXT+NUSED-1.GT.MX) THEN
|
|
WRITE(6,*) ' *** TERMINAL ERROR. NOT ENOUGH STORAGE FOR JLEV'
|
|
STOP
|
|
ELSE
|
|
READ(IT,END=9001) (IXX(IXI+I),I=1,NSQ)
|
|
DO 1001 I=1,NSQ
|
|
IF (IXX(IXI+I).EQ.(JLEVX(I))) GO TO 1001
|
|
WRITE(6,604) (JLEVX(II),IXX(IXI+II),II=1,NSQ)
|
|
604 FORMAT(' *** TERMINAL ERROR. CURRENT/SAVED JLEV MISMATCH'/
|
|
1 (8(2X,2I4)))
|
|
STOP
|
|
1001 CONTINUE
|
|
WRITE(6,*) ' *** CURRENT/SAVED JLEV MATCH'
|
|
ENDIF
|
|
C
|
|
READ(IT,END=9001) NLEVEL,(ELEVEL(I),I=1,NLEVEL)
|
|
IF (NLVL.NE.NLEVEL) THEN
|
|
WRITE(6,605) NLVL,NLEVEL
|
|
605 FORMAT(' *** TERMINAL ERROR. CURRENT/SAVED NLEVEL',2I6)
|
|
STOP
|
|
ENDIF
|
|
DO 1002 I=1,NLEVEL
|
|
IF (ELVL(I).EQ.ELEVEL(I)) GO TO 1002
|
|
WRITE(6,606) I,ELVL(I),ELEVEL(I)
|
|
606 FORMAT(' *** TERMINAL ERROR. CURRENT/SAVED ELEVEL(',I3,')=',
|
|
1 2D12.4)
|
|
STOP
|
|
1002 CONTINUE
|
|
WRITE(6,*) ' *** CURRENT/SAVED NLEVEL,ELEVEL MATCH.'
|
|
C
|
|
IF (IXNEXT+IXR+MXNRG-1.GT.MX) THEN
|
|
WRITE(6,*) ' *** TERMINAL ERROR. NOT ENOUGH STORAGE FOR MXNRG'
|
|
STOP
|
|
ELSE
|
|
READ(IT,END=9001) NNRG,(RXX(IXR+I),I=1,NNRG)
|
|
ENDIF
|
|
IF (NNRG.NE.NNRGX) THEN
|
|
WRITE(6,607) NNRG,NNRGX
|
|
607 FORMAT(' *** TERMINAL ERROR. CURRENT/SAVED NNRG',2I6)
|
|
STOP
|
|
ENDIF
|
|
DO 1003 I=1,NNRG
|
|
IF (RXX(IXR+I).EQ.ENERGX(I)) GO TO 1003
|
|
WRITE(6,608) I,RXX(IXR+I),ENERGX(I)
|
|
608 FORMAT(' *** TERMINAL ERROR. CURRENT/SAVED ENERGY(',I3,')=',
|
|
1 2D12.4)
|
|
STOP
|
|
1003 CONTINUE
|
|
WRITE(6,*) ' *** CURRENT/SAVED NNRG,ENERGY MATCH.'
|
|
C
|
|
C CHECKING SPECIFIC TO SOME ITYPES ...
|
|
LCS=ITYPE.EQ.21.OR.ITYPE.EQ.22.OR.ITYPE.EQ.25.OR.ITYPE.EQ.26
|
|
1 .OR.ITYPE.EQ.27
|
|
LCS3=ITYPE.EQ.23
|
|
C MPLMIN IS AVAILABLE FROM CURRENT RUN IN /PRBASE/, BUT SAVE TAPE
|
|
C CANNOT BE CHECKED FOR ORIGINAL VALUE. ASSUME IT IS SAME.
|
|
C THIS SHOULD ONLY MATTER FOR PRESSURE BROADENING W/ COUPLED STATES
|
|
IF (LCS.OR.LCS3) THEN
|
|
IF (MPLMIN) THEN
|
|
WRITE(6,*) ' *** CURRENT COUPLED STATES APPROXIMATION ',
|
|
1 'HAS IDENTICAL +/- PROJECTIONS'
|
|
ELSE
|
|
WRITE(6,*) ' *** CURRENT COUPLED STATES APPROX HAS ',
|
|
1 'BOTH +/- PROJECTIONS'
|
|
ENDIF
|
|
WRITE(6,*) ' WILL ATTEMPT TO VERIFY CONSISTENCY WITH '
|
|
1 ,'SAVE TAPE'
|
|
ENDIF
|
|
C FOR ITYPE='3' CHECK JLEVEL/JLEV ARE CONSISTENT
|
|
IF (ITYPE-10*(ITYPE/10).EQ.3) THEN
|
|
CONSIS=.TRUE.
|
|
NLV=0
|
|
IXT=(NQNX-1)*NLEVX
|
|
DO 4002 I=1,NLEVX
|
|
IL=JLEVX(IXT+I)
|
|
NLV=MAX(NLV,IL)
|
|
CONSIS=CONSIS.AND.JLEVEL(2*IL-1).EQ.JLEVX(I)
|
|
4002 CONSIS=CONSIS.AND.JLEVEL(2*IL).EQ.JLEVX(NLEVX+I)
|
|
IF (NLV.EQ.NLVL.AND.CONSIS) THEN
|
|
WRITE(6,*) ' *** ITYPE=3+10*N: JLEVEL/JLEV ARE CONSISTENT'
|
|
ELSE
|
|
WRITE(6,*) ' *** ERROR. ITYPE=3+10*N: INCONSISTENT JLEVEL/',
|
|
1 'JLEV. SHOULD AFFECT ONLY PRBR CALCULATION'
|
|
ENDIF
|
|
ENDIF
|
|
C
|
|
C READ THROUGH JTOT/S-MATRICES FIRST TIME, TO SEE WHAT'S THERE
|
|
NOPMX=0
|
|
MAXMIN=0
|
|
JTOLD=-1
|
|
MSOLD=-1
|
|
C
|
|
2000 READ(IT,END=9002) JTOT,INRG,ECHK,IEXCH,WT,M,NOPEN
|
|
IF (JTOT.GT.JSTOP) GO TO 9004
|
|
C
|
|
C SEE IF M-VALUE IS CONSISTENT W/ MHI,MSET AND MXPAR
|
|
IF (M.GT.MXPAR.OR.M.LE.0) THEN
|
|
WRITE(6,*) ' *** TERMINAL ERROR. ILLEGAL M-VALUE',M
|
|
WRITE(6,*) ' *** TERMINAL ERROR. NOTE. MXPAR =',MXPAR
|
|
STOP
|
|
ELSE
|
|
IXX(M)=MAX(IXX(M),INRG)
|
|
ENDIF
|
|
IF (MSET.GT.0.AND.(M.LT.MSET.OR.M.GT.MHI)) THEN
|
|
WRITE(6,612) M,MSET,MHI
|
|
612 FORMAT(' *** RESTRT. WARNING. M =',I4,
|
|
1 ' INCONSISTENT WITH CURRENT MSET,MHI =',2I4)
|
|
ENDIF
|
|
C CHECK CONSISTENCY OF INRG,ECHK
|
|
IF (ABS(ECHK-ENERGX(INRG)).GT.1.D-8)
|
|
1WRITE(6,611) JTOT,M,INRG,ECHK
|
|
611 FORMAT('0 *** WARNING. FOR JTOT,M=',I4,'.',I2,' ENERGY('
|
|
1 ,I4,'), BAD ECHK =',D16.8)
|
|
C
|
|
IF (JTOT.EQ.JTOLD .OR. JTOLD.EQ.-1) GO TO 2011
|
|
C NEW JTOT. SAVE IRSTRT=1 VALUES; CHECK JSTEP CONSISTENCY
|
|
JTSV(1)=JTSV(3)
|
|
MSV(1)=MSV(3)
|
|
INSV(1)=INSV(3)
|
|
JSTEPX=JTOT-JTOLD
|
|
IF (JSTEP.EQ.JSTEPX) GO TO 2011
|
|
WRITE(6,609) JSTEP,JSTEPX
|
|
609 FORMAT(' *** RSTRT. TERMINAL ERROR. CURRENT/SAVED JSTEP =',2I6)
|
|
STOP
|
|
2011 JTOLD=JTOT
|
|
C
|
|
IF (M.EQ.MSOLD.OR.MSOLD.EQ.-1) GO TO 2021
|
|
C NEW PARITY (SYMMETRY) BLOCK; SAVE IRSTRT=2 VALUES, AND
|
|
C REVISE IXX(LAST-M) TO REFLECT HIGHEST INRG IN LAST SET
|
|
IXX(MSV(3))=INSV(3)
|
|
JTSV(2)=JTSV(3)
|
|
MSV(2)=MSV(3)
|
|
INSV(2)=INSV(3)
|
|
2021 MSOLD=M
|
|
C
|
|
2002 READ(IT,END=9003) (JX,LX,WVX,I=1,NOPEN)
|
|
C
|
|
IF (IXNEXT+IXR+NOPEN*NOPEN-1.LE.MX) THEN
|
|
CALL SREAD(IT,NOPEN,RXX(IXR+1),IEND)
|
|
IF (IEND.GT.0) GO TO 9003
|
|
CALL SREAD(IT,NOPEN,RXX(IXR+1),IEND)
|
|
IF (IEND.GT.0) GO TO 9003
|
|
ELSE
|
|
WRITE(6,*) ' *** RESTRT. TERMINAL ERROR. INADEQUATE SCRATCH '
|
|
1 ,'STORAGE FOR SREAL/SIMAG. NOPEN =',NOPEN
|
|
STOP
|
|
ENDIF
|
|
C COMPLETE JTOT,M,INRG SET. UPDATE NOPMX; SAVE IRSTRT=3 VALUES
|
|
NOPMX=MAX(NOPMX,NOPEN)
|
|
MAXMIN=MAX(MAXMIN,M)
|
|
JTSV(3)=JTOT
|
|
MSV(3)=M
|
|
INSV(3)=INRG
|
|
C
|
|
C GO BACK FOR MORE JTOT, INRG SETS . . .
|
|
GO TO 2000
|
|
C
|
|
C END OF FILE CONDITIONS
|
|
C
|
|
9001 WRITE(6,*) ' *** TERMINAL ERROR. PREMATURE EOF READING ISAVEU.'
|
|
STOP
|
|
C
|
|
C NORMAL END OF FILE AFTER A COMPLETED SET.
|
|
C DETERMINE IF LAST INPUT COMPLETED 1) M-SET, 2) JTOT
|
|
C AND MODIFY JTSV,MSV,INSV ACCORDINGLY
|
|
9002 WRITE(6,699) ISAVEU
|
|
699 FORMAT('0 *** NOTE. NORMAL EOF REACHED ON UNIT (',I3,')')
|
|
IF (INSV(3).EQ.IXX(MSV(3))) THEN
|
|
WRITE(6,*)' LAST INPUT APPEARS TO COMPLETE AN M-SET'
|
|
JTSV(2)=JTSV(3)
|
|
MSV(2)=MSV(3)
|
|
INSV(2)=INSV(3)
|
|
IF (MSV(3).EQ.MAXMIN) THEN
|
|
WRITE(6,*) ' IT ALSO APPEARS TO COMPLETE A JTOT'
|
|
JTSV(1)=JTSV(3)
|
|
MSV(1)=MSV(3)
|
|
INSV(1)=INSV(3)
|
|
ENDIF
|
|
ENDIF
|
|
C IRSTRT=-1 CASES: TRY TO ASCERTAIN COMPLETENESS THROUGH JSTOP.
|
|
IF (JSTOP.GE.IBIG) GO TO 3000
|
|
IF (JTOT.NE.JSTOP) THEN
|
|
WRITE(6,*) ' *** LAST COMPLETE JTOT,M,INRG=',
|
|
1 JTSV(3),MSV(3),INSV(3)
|
|
WRITE(6,*) ' *** ERROR. LAST JTOT.NE.JSTOP',JTOT,JSTOP
|
|
STOP
|
|
ENDIF
|
|
IF (JTSV(1).NE.JTOT) THEN
|
|
WRITE(6,*) ' *** POSSIBLE ERROR.'
|
|
WRITE(6,*) ' IT IS NOT CLEAR THAT FINAL JTOT SET IS',
|
|
1 ' COMPLETE. ASSUME IT IS.'
|
|
WRITE(6,*) ' *** LAST COMPLETE JTOT,M,INRG=',
|
|
1 JTSV(3),MSV(3),INSV(3)
|
|
JTSV(1)=JTSV(3)
|
|
MSV(1)=MSV(3)
|
|
INSV(1)=INSV(3)
|
|
ENDIF
|
|
GO TO 3000
|
|
C
|
|
C EOF WHILE READING S-MATRICES; ALL JTSV,MSV,INSV SHOULD BE CORRECT.
|
|
9003 WRITE(6,698) ISAVEU
|
|
698 FORMAT('0 *** NOTE. ABNORMAL EOF REACHED ON UNIT (',I3,')'/
|
|
1 ' INCOMPLETE (JTOT,INRG,M)-SET')
|
|
IF (JSTOP.LT.IBIG) THEN
|
|
WRITE(6,*) ' *** ERROR. ISAVEU DOES NOT HAVE ALL S-MATRICES',
|
|
1 ' PRIOR TO REQUESTED RESTART AT JTOTL =',JTOTL
|
|
WRITE(6,*) ' *** LAST COMPLETE JTOT,M,INRG=',
|
|
1 JTSV(3),MSV(3),INSV(3)
|
|
STOP
|
|
ENDIF
|
|
GO TO 3000
|
|
C BELOW REACHED IF JSTOP EXCEEDED BEFORE EOF
|
|
C FORCE JTSV(IRSTRT=1) VALUES TO LAST COMPLETED SET
|
|
9004 WRITE(6,*) ' *** ISAVEU INPUT TERMINATED BY IRSTRT=-1, JSTOP ='
|
|
1 ,JSTOP
|
|
JTSV(1)=JTSV(3)
|
|
MSV(1)=MSV(3)
|
|
INSV(1)=INSV(3)
|
|
C
|
|
3000 WRITE(6,630) JTSV(3),MSV(3),INSV(3)
|
|
630 FORMAT(/' ***',6X,' LAST COMPLETED (JTOT,M,INRG)-SET ---',3I5)
|
|
IF (IRSTRT.NE.3)
|
|
1 WRITE(6,631) IRSTRT,JTSV(IRSTRT),MSV(IRSTRT),INSV(IRSTRT)
|
|
631 FORMAT(' *** FOR REQUESTED IRSTRT =',I2/
|
|
1 ' ***',6X,' LAST COMPLETED (JTOT,M,INRG)-SET ---',3I5)
|
|
WRITE(6,632)
|
|
632 FORMAT(' ***',6X,' THESE S-MATRICES WILL BE REREAD/REPROCESSED')
|
|
C
|
|
C ----------------------------------------------------------------
|
|
C READ THROUGH TAPE AGAIN, ONLY THROUGH APPROPRIATE LAST SET
|
|
C AND PROCESS S-MATRICES THROUGH OUTPUT/PRBR
|
|
C
|
|
C ALLOCATE STORAGE FOR NB,J,L,WV,SR,SI; AND PRBR TEMPORARIES
|
|
C PLACE THE REAL VARIABLES FIRST
|
|
IXWV=1
|
|
IXSR=IXWV+NOPMX
|
|
IXSI=IXSR+NOPMX*NOPMX
|
|
NREAL=IXSI+NOPMX*NOPMX
|
|
C SPACE THE INTEGER VARIABLES BY NIPR
|
|
IXNB=NREAL*NIPR+1
|
|
IXJ=IXNB+NOPMX
|
|
IXL=IXJ+NOPMX
|
|
IT1=IXL+NOPMX
|
|
IT2=IT1+NOPMX
|
|
IT3=IT2+NOPMX
|
|
IT4=IT3+NOPMX
|
|
C NINT IS THE NUMBER OF REAL SPACES TAKEN BY THE INTEGERS
|
|
NINT=(7*NOPMX+NIPR-1)/NIPR
|
|
NUSED=NREAL+NINT
|
|
NAVAIL=MX-IXNEXT+1
|
|
IF (NUSED.GT.NAVAIL) THEN
|
|
WRITE(6,*) ' *** RESTRT. INADEQUATE SCRATCH STORAGE',
|
|
1 ' TO PROCESS SAVED S-MATRICES.'
|
|
STOP
|
|
ENDIF
|
|
C
|
|
C SET VALUES REQUIRED FOR OUTPUT/PRBR
|
|
DO 4001 I=1,NOPMX
|
|
4001 IXX(IXNB-1+I)=I
|
|
RM=1.D0
|
|
TTIME=0.D0
|
|
ISIGPR=0
|
|
CONV=0.D0
|
|
ILSU=0
|
|
C REQUEST MINIMAL OUTPUT FROM OUTPUT/PRBR ...
|
|
IPRINT=MIN(1,PRNTLV)
|
|
C
|
|
REWIND ISAVEU
|
|
READ(IT,END=9999) LABEL,ITYPE,NLEV,NQN,URED,IP
|
|
NSQ=NLEV*NQN
|
|
READ(IT,END=9999) (JLEVX(I),I=1,NSQ)
|
|
READ(IT,END=9999) NLEVEL,(ELEVEL(I),I=1,NLEVEL)
|
|
READ(IT,END=9999) NNRGX,(ENERGX(I),I=1,NNRGX)
|
|
C READ THROUGH JTOT/S-MATRICES FIRST TIME, TO SEE WHAT'S THERE
|
|
4000 READ(IT,END=9999) JTOT,INRG,ECHK,IEXCH,WT,M,NOPEN
|
|
MXP=MAX(MXP,M)
|
|
READ(IT,END=9999) (IXX(IXJ-1+I),IXX(IXL-1+I),RXX(IXWV-1+I),
|
|
1 I=1,NOPEN)
|
|
CALL SREAD(IT,NOPEN,RXX(IXSR),IEND)
|
|
IF (IEND.GT.0) GO TO 9999
|
|
CALL SREAD(IT,NOPEN,RXX(IXSI),IEND)
|
|
IF (IEND.GT.0) GO TO 9999
|
|
C
|
|
C SET NCHN TO -1 FOR REVISED (AUG 95) OUTPUT
|
|
NCHN=-1
|
|
CALL OUTPUT(JTOT,IXX(IXNB),IXX(IXJ),IXX(IXL),
|
|
1 RXX(IXWV),RXX(IXSR),RXX(IXSI),AKDUM,
|
|
2 CONV,NOPEN,M,MXPAR,WT,IEXCH,INRG,RM,IPRINT,TTIME,
|
|
3 ENERGX,SIG, JLEVX, ISST,IECONV,MINJT,MAXJT,
|
|
4 NLEV,NQN,OTOL,DTOL,KSAVE,ISIGU,IPARTU,ISAVEU,ISIGPR,IRSTRT,
|
|
5 NCHN)
|
|
C
|
|
C BELOW DUPLICATES DRIVER (SG: I DON'T THINK IT IS USED ANYMORE.)
|
|
MOLD=-M
|
|
IF (M.EQ.MXPAR) MOLD=0
|
|
C
|
|
C COUPLED STATES PRBR NEEDS MVALUE; CALC FROM M (NB IEXX NOT USED)
|
|
C BELOW TRIES TO BE CONSISTENT WITH MOLSCAT; SHOULD BE MOOT AS IT
|
|
C ONLY AFFECTS PRBR AND ITYPE=23/IDENT.NE.0 IS NOT SUPPORTED.
|
|
C N.B. ORDER OF ITYPE=23 WAS CHANGED IN VERSION 13
|
|
IF (LCS.OR.(LCS3.AND.IP.LE.12)) THEN
|
|
IF (LCS3.AND.IDENT.NE.0) THEN
|
|
IF (M.LE.MXPAR/2) THEN
|
|
IEXX=1
|
|
MVALUE=M-1
|
|
ELSE
|
|
IEXX=2
|
|
MVALUE=M-(MXPAR/2)-1
|
|
ENDIF
|
|
ELSE
|
|
MVALUE=M-1
|
|
ENDIF
|
|
C CHECK CONSISTENCY OF MPLMIN/MVALUE,WT
|
|
IF ((MPLMIN.AND.(.NOT.((MVALUE.EQ.0.AND.WT.EQ.1.D0).OR.
|
|
1 (MVALUE.GT.0.AND.WT.EQ.2.D0))) .OR.
|
|
2 .NOT.MPLMIN.AND.MVALUE.NE.1.D0) .AND. IDENT.EQ.0)
|
|
3 WRITE(6,*) ' *** INCONSISTENT MVALUE/WT'
|
|
ELSE IF (LCS3.AND.IP.GE.13) THEN
|
|
C CODE FOR ORDER STARTING WITH VERSION 13X ...
|
|
IEXX=IEXCH
|
|
IF (IDENT.EQ.0) THEN
|
|
MVALUE=M-1
|
|
ELSE
|
|
IEXX=2-MOD(M,2)
|
|
IF (IEXX.NE.IEXCH) WRITE(6,*)
|
|
1 ' *** INCONSISTENT: IEXCH FROM M .NE. IEXCH ON TAPE'
|
|
MVALUE=(M+1)/2-1
|
|
ENDIF
|
|
ENDIF
|
|
CALL PRBR(JTOT,MOLD,NOPEN,INRG,RM,
|
|
1 IXX(IXNB),IXX(IXJ),IXX(IXL),RXX(IXWV),
|
|
2 RXX(IXSR),RXX(IXSI),IXX(IT1),IXX(IT2),IXX(IT3),IXX(IT4),
|
|
3 JLEVX,MXPAR,WT,IPRINT,ILSU)
|
|
C
|
|
C UNTIL WE HIT 'FINAL' SET, GO BACK FOR MORE JTOT,M,INRG ...
|
|
IF (JTOT.NE.JTSV(IRSTRT).OR.M.NE.MSV(IRSTRT).OR.
|
|
1 INRG.NE.INSV(IRSTRT)) GO TO 4000
|
|
C
|
|
C WE HAVE NOW FINISHED REPROCESSING THE 'SAVED' S-MATRICES
|
|
C
|
|
CALL GCLOCK(TEND)
|
|
TUSED=TEND-TSTART
|
|
WRITE(6,634) NUSED,NAVAIL,TUSED
|
|
634 FORMAT(' *** RESTRT. REPROCESSING COMPLETED. IT REQUIRED'/
|
|
1 5X,I9,' OF THE',I12,
|
|
2 ' CURRENTLY AVAILABLE WORDS OF STORAGE'/
|
|
3 9X,'AND',F8.2,' CPU SECONDS.')
|
|
C
|
|
C CHOOSE 'NEXT' JTOTL,MRSTRT,IERST AND PUT IN CALLING ARGUMENTS
|
|
IF (IRSTRT.EQ.3) THEN
|
|
JTOTL=JTSV(3)
|
|
MRSTRT=MSV(3)
|
|
IERST=INSV(3)+1
|
|
IF (IERST.GT.NNRG.OR.IERST.GT.IXX(MRSTRT)) THEN
|
|
IERST=1
|
|
MRSTRT=MRSTRT+1
|
|
IF (MRSTRT.GT.MXPAR.OR.MRSTRT.GT.MAXMIN) THEN
|
|
MRSTRT=1
|
|
JTOTL=JTOTL+JSTEP
|
|
ENDIF
|
|
ENDIF
|
|
ELSEIF (IRSTRT.EQ.2) THEN
|
|
JTOTL=JTSV(2)
|
|
MRSTRT=MSV(2)+1
|
|
IERST=1
|
|
IF (MRSTRT.GT.MXPAR.OR.MRSTRT.GT.MAXMIN) THEN
|
|
MRSTRT=1
|
|
JTOTL=JTOTL+JSTEP
|
|
ENDIF
|
|
ELSEIF (IRSTRT.EQ.1) THEN
|
|
MRSTRT=1
|
|
IERST=1
|
|
JTOTL=JTSV(1)+JSTEP
|
|
ENDIF
|
|
WRITE(6,635) JTOTL,MRSTRT,IERST
|
|
635 FORMAT(' *** RESTRT. CALCULATION WILL BE RESTARTED AT'/
|
|
1 15X,'JTOT =',I4,', M =',I3,', ENERGY(',I4,')')
|
|
C
|
|
RETURN
|
|
C
|
|
9999 WRITE(6,*) ' *** RESTRT. ERROR: UNEXPECTED EOF REREADING ISAVEU'
|
|
STOP
|
|
END
|
|
SUBROUTINE RMSBF(N,Z,RATIO)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C RETURNS RATIO OF DERIVATIVE TO FUNCTION VALUE FOR
|
|
C MODIFIED SPHERICAL BESSEL FUNCTIONS OF THE THIRD KIND,
|
|
C USING RECURSION BASED ON ABRAMOWITZ AND STEGUN 10.2.18.
|
|
C THE FUNCTION INVOLVED IS (-)**(N+1)*(2*Z/PI)*F(Z)*EXP(Z)
|
|
C IN THE NOTATION OF A&S.
|
|
C
|
|
F1=1.D0
|
|
IF(N.EQ.0) GO TO 20
|
|
DO 10 I=1,N
|
|
F3 = F1+DBLE(I+I-1)/Z
|
|
F1 = 1.D0/F3
|
|
10 CONTINUE
|
|
20 F3 = F1+DBLE(N+N+1)/Z
|
|
RATIO=1.D0/Z-(DBLE(N)*F1+DBLE(N+1)*F3)/DBLE(N+N+1)
|
|
RETURN
|
|
END
|
|
SUBROUTINE RMTPRP(NBAS,NSQBAS,MXLAM,NPOTL,
|
|
1 SR,SI,Q,VL,IV,EINT,CENT,WVEC,JJ,L,NB,
|
|
2 P,W,R,EIGOLD,EIGNOW,DIAG,R1,R2,R3,R4,CLOSE,
|
|
3 NOPMAX,DEEP,IK,ICODE,PRINT,NV,ISTART)
|
|
C-- BELOW IS FROM JMH JAN 93 W/ NEW MATRIX ROUTINES (--.V11X.LKED)
|
|
C-- MODIFIED BY SG (1/27/93) TO USE /MEMORY/ ..,IVLFL,
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
LOGICAL IREAD,IWRITE,CNTRCT,GOTTP
|
|
INTEGER PRINT
|
|
DIMENSION SR(NSQBAS),SI(NSQBAS),Q(NSQBAS),VL(NV),IV(NV),
|
|
1 EINT(NBAS),CENT(NBAS),WVEC(NBAS),JJ(NBAS),L(NBAS),NB(NBAS),
|
|
2 P(MXLAM),W(NSQBAS),R(NSQBAS),EIGOLD(NBAS),EIGNOW(NBAS),
|
|
3 DIAG(NBAS),R1(NBAS),R2(NBAS),R3(NBAS),R4(NBAS),CLOSE(NBAS)
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C COMMON BLOCK FROM DRIVER
|
|
COMMON/DRIVE/DUMMY(4),RMIN,RMAX,XEPS,DR,DRMAX,RMID,FACT,
|
|
1 RTURN,VTOL,ESHIFT,ERED,RMLMDA,NOPEN,JKEEP,ISCRU,MAXSTP
|
|
C
|
|
C 14 JULY 86 VERSION FROM JMH
|
|
C THIS ROUTINE SOLVES THE COUPLED EQUATIONS USING THE R-MATRIX
|
|
C PROPAGATOR METHOD. (SEE LIGHT ET AL. J. CHEM. PHYS. 69 3518 1978)
|
|
C THIS VERSION USES A CONSTANT STEP SIZE DR FOR R < RMID, AND
|
|
C DR*R/RMID FOR R > RMID. THE CONSTANT-STEP METHOD IS RECOMMENDED BY
|
|
C ANDERSON, J.CHEM.PHYS. 77,4431(1982).
|
|
C VTOL IS A TOLERANCE PARAMETER FOR THE LARGEST OFF-DIAGONAL
|
|
C ELEMENT OF THE TRANSFORMATION MATRIX, USED TO DECIDE WHEN TO
|
|
C STOP INTEGRATING.
|
|
C FACT AND DRMAX ARE NOT USED IN THIS VERSION.
|
|
C
|
|
C ISTART IS 0 IF THE R-MATRIX IS TO BE INITIALISED
|
|
C 1 IF THE R-MATRIX (FROM L2 CALC) IS ALREADY IN R
|
|
C
|
|
C ----------------------------------------------------------------
|
|
C SET UP TO USE UNIT (ISCRU)
|
|
IREAD = ICODE.EQ.2 .AND. ISCRU.GT.0
|
|
IWRITE = ICODE.EQ.1 .AND. ISCRU.GT.0
|
|
C ---------------------------------------------------------------
|
|
C
|
|
N=NBAS
|
|
NSQ=NSQBAS
|
|
GOTTP=.FALSE.
|
|
IF(XEPS.LE.0.D0 .OR. ISCRU.LE.0) GOTO 100
|
|
IF (IVLFL.NE.0) THEN
|
|
IF(IWRITE) WRITE(ISCRU) JJ,L,EINT,CENT,VL,IV
|
|
IF(IREAD) READ (ISCRU) JJ,L,EINT,CENT,VL,IV
|
|
ELSE
|
|
IF(IWRITE) WRITE(ISCRU) JJ,L,EINT,CENT,VL
|
|
IF(IREAD) READ (ISCRU) JJ,L,EINT,CENT,VL
|
|
ENDIF
|
|
C
|
|
C COUNT NUMBER OF OPEN CHANNELS AND SET UP WVEC ARRAY.
|
|
C
|
|
100 NOPEN=0
|
|
DO 110 I=1,N
|
|
DIF=ERED-EINT(I)
|
|
WVEC(I)=SIGN(SQRT(ABS(DIF)),DIF)
|
|
IF(DIF.LE.0.D0) GOTO 110
|
|
NOPEN=NOPEN+1
|
|
110 CONTINUE
|
|
C
|
|
C IF THERE ARE NO OPEN CHANNELS RETURN
|
|
C
|
|
IF(NOPEN.EQ.0) RETURN
|
|
NOPSQ=NOPEN*NOPEN
|
|
C
|
|
C SORT CHANNELS BY ASYMPTOTIC ENERGY
|
|
C
|
|
DO 120 I=1,N
|
|
CLOSE(I)=0.D0
|
|
120 NB(I)=I
|
|
IF(N.LE.1) GOTO 140
|
|
NM1=N-1
|
|
DO 130 I=1,NM1
|
|
IP1=I+1
|
|
DO 130 J=IP1,N
|
|
IF(EINT(NB(I)).LE.EINT(NB(J))) GOTO 130
|
|
IT=NB(I)
|
|
NB(I)=NB(J)
|
|
NB(J)=IT
|
|
130 CONTINUE
|
|
140 CONTINUE
|
|
C
|
|
C ICODE=1/2 MEANS PROPAGATION ISN'T/IS TO BE DONE WITH STORED DATA
|
|
C
|
|
IF(ICODE.EQ.1 .AND. PRINT.GE.2) WRITE(6,150) RMIN
|
|
150 FORMAT('0 START R-MATRIX PROPAGATOR AT RMIN =',F8.5)
|
|
IF(PRINT.GE.15 .AND. ICODE.EQ.1) WRITE(6,160)
|
|
160 FORMAT('0 KSTEP RNOW EIGVAL(1) EIGVAL(N)'/)
|
|
C
|
|
C CALCULATE R-MATRIX AT FIRST STEP.
|
|
C
|
|
IF(IREAD) GOTO 170
|
|
RNOW=RMIN
|
|
IF(ISTART.EQ.0) RNOW=RNOW+0.5D0*DR
|
|
DRNOW=DR
|
|
DRNEW=DRNOW
|
|
KSTP=1
|
|
CALL WAVMAT(W,NBAS,RNOW,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
IFAIL=0
|
|
CALL F02ABF(W,NBAS,NBAS,EIGOLD,SI,NBAS,R1,IFAIL)
|
|
IF(ISCRU.LE.0) GOTO 190
|
|
WRITE(ISCRU) RNOW,DRNOW
|
|
WRITE(ISCRU) KSTP,EIGOLD
|
|
WRITE(ISCRU) DRNEW
|
|
GOTO 190
|
|
C
|
|
170 READ(ISCRU) RNOW,DRNOW
|
|
READ(ISCRU) KSTP,EIGOLD
|
|
READ(ISCRU) DRNEW
|
|
DO 180 I=1,N
|
|
EIGOLD(I)=EIGOLD(I)-ESHIFT
|
|
180 CONTINUE
|
|
C
|
|
190 IF(ISTART.NE.0) GOTO 220
|
|
C
|
|
C NO INITIAL R-MATRIX SUPPLIED. INITIALISE IT.
|
|
C
|
|
DO 200 I=1,NSQ
|
|
200 R(I)=0.D0
|
|
IND=-N
|
|
DO 210 I=1,N
|
|
IND=IND+N+1
|
|
R(IND)=1.D0/SQRT(ABS(EIGOLD(I)))
|
|
210 CONTINUE
|
|
GOTO 230
|
|
C
|
|
C TRANSFORM SUPPLIED R-MATRIX TO LOCAL BASIS
|
|
C
|
|
220 CALL TRNSFM(SI,R,Q,N,.FALSE.,.TRUE.)
|
|
C
|
|
230 ITRY=-1
|
|
DLAST=1.D36
|
|
C
|
|
C PROPAGATE R-MATRIX
|
|
C
|
|
DO 430 KSTEP=2,MAXSTP
|
|
NOLD=N
|
|
ROLD=RNOW
|
|
RNOW=RNOW+0.5D0*(DRNOW+DRNEW)
|
|
DRNOW=DRNEW
|
|
IF(.NOT.IREAD) GOTO 250
|
|
C
|
|
C IF ICODE = 2 READ EIGNOW AND Q MATRIX FROM DISK
|
|
C
|
|
READ(ISCRU) KSTP,EIGNOW,Q
|
|
DO 240 I=1,N
|
|
EIGNOW(I)=EIGNOW(I)-ESHIFT
|
|
240 CONTINUE
|
|
GOTO 290
|
|
C
|
|
C IF ICODE = 1 CALCULATE EIGNOW AND Q MATRIX
|
|
C
|
|
250 CALL WAVMAT(W,N,RNOW,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
IF(XEPS.LE.0.D0 .OR. GOTTP) GOTO 270
|
|
C
|
|
C LOOK FOR TURNING POINT OR POTENTIAL MINIMUM IN LOWEST-LYING
|
|
C CHANNEL (WHICHEVER OCCURS AT SMALLEST R).
|
|
C SAVE INFORMATION FOR USE IN NEXT CALL TO RMSET.
|
|
C
|
|
IF(DIAG(IK).GT.0.D0.AND.DIAG(IK).LT.DLAST) GOTO 260
|
|
GOTTP=.TRUE.
|
|
RTURN=RNOW
|
|
260 DLAST=DIAG(IK)
|
|
C
|
|
270 IFAIL=0
|
|
CALL F02ABF(W,N,N,EIGNOW,SR,N,R1,IFAIL)
|
|
CALL SGNCHK(SI,SR,N)
|
|
CALL DGEMUL(SI,N,'T',SR,N,'N',Q,N,N,N,N)
|
|
IF(ISCRU.GT.0) WRITE(ISCRU) KSTEP,EIGNOW,Q
|
|
DO 280 I=1,NSQ
|
|
280 SI(I)=SR(I)
|
|
290 CONTINUE
|
|
C
|
|
C IF(KSTEP.GT.2) GOTO 213
|
|
C
|
|
C CALCULATE PROPAGATOR FOR R-MATRIX.
|
|
C
|
|
NOPLOC=0
|
|
DO 320 I=1,N
|
|
EIG=EIGNOW(I)
|
|
FLAM=SQRT(ABS(EIG))
|
|
IF(EIG.GE.0.D0) GOTO 300
|
|
R1(I) = -1.D0/(FLAM*TAN(DRNEW*FLAM))
|
|
R2(I) = -1.D0/(FLAM*SIN(DRNEW*FLAM))
|
|
NOPLOC=NOPLOC+1
|
|
GOTO 310
|
|
300 R1(I) = 1.D0/(FLAM*TANH(DRNEW*FLAM))
|
|
R2(I) = 1.D0/(FLAM*SINH(DRNEW*FLAM))
|
|
IF(RNOW.GT.1.5D0*RTURN) CLOSE(I)=CLOSE(I)+DRNEW*FLAM
|
|
310 R3(I) = R2(I)
|
|
R4(I) = R1(I)
|
|
320 CONTINUE
|
|
C
|
|
CALL TRNSFM(Q,R,SR,N,.FALSE.,.TRUE.)
|
|
C
|
|
IND=-N
|
|
DO 330 I=1,N
|
|
IND=IND+N+1
|
|
R(IND)=R(IND)+R1(I)
|
|
330 CONTINUE
|
|
CALL SYMINV(R,N,N,IFAIL)
|
|
IF(IFAIL.GT.N) GOTO 480
|
|
CALL DSYFIL('U',N,R,N)
|
|
IND=0
|
|
DO 340 IC=1,N
|
|
DO 340 IR=1,N
|
|
IND=IND+1
|
|
R(IND)=-R3(IR)*R(IND)*R2(IC)
|
|
340 CONTINUE
|
|
IND=-N
|
|
DO 350 I=1,N
|
|
IND=IND+N+1
|
|
R(IND)=R(IND)+R4(I)
|
|
350 CONTINUE
|
|
IF(IREAD) GOTO 400
|
|
C
|
|
C IF ICODE=1 COMPUTE NEW STEP SIZE AND TEST FOR END OF PROPAGATION.
|
|
C
|
|
DRNEW=DR*RNOW/RMID
|
|
IF(DRNEW.LT.DR) DRNEW=DR
|
|
C
|
|
DO 360 I=1,N
|
|
EIGOLD(I)=EIGNOW(I)
|
|
360 CONTINUE
|
|
C
|
|
C SEE IF OFF-DIAG ELEMENTS OF SI ARE SMALL ENOUGH.
|
|
C
|
|
CALL COLIM(SI,R1,R2,VTOL,N)
|
|
CALL STRY(R1,R2,N,ITRY,EIGOLD)
|
|
IF(ITRY.NE.1) GOTO 380
|
|
RUP=RNOW+DRNOW/2.D0
|
|
IF(RUP.GE.RMAX .AND. NOPLOC.GE.NOPEN) GOTO 370
|
|
ITRY=0
|
|
GOTO 380
|
|
370 IF(ISCRU.LE.0) GOTO 450
|
|
DRNEW=-9999.D0
|
|
WRITE(ISCRU) DRNEW
|
|
WRITE(ISCRU) SI
|
|
GOTO 450
|
|
380 IF(ISCRU.GT.0) WRITE(ISCRU) DRNEW
|
|
EIG1=(ERED+EIGOLD(1))/RMLMDA
|
|
EIGN=(ERED+EIGOLD(N))/RMLMDA
|
|
IF(PRINT.GE.15) WRITE(6,390) KSTEP,RNOW,EIG1,EIGN
|
|
390 FORMAT(1X,I7,F11.5,2(1PD16.6))
|
|
GOTO 410
|
|
C
|
|
C IF ICODE=2 READ NEW STEP SIZE FROM DISK
|
|
C
|
|
400 READ(ISCRU) DRNEW
|
|
IF(DRNEW.NE.-9999.D0) GOTO 410
|
|
READ(ISCRU) SI
|
|
GOTO 450
|
|
C
|
|
410 CNTRCT=XEPS.GT.0.D0 .AND. N.GT.NOPMAX .AND. CLOSE(N).GT.DEEP
|
|
IF(IWRITE) WRITE(ISCRU) CLOSE,CNTRCT
|
|
IF(IREAD) READ (ISCRU) CLOSE,CNTRCT
|
|
IF (CNTRCT)
|
|
1 CALL SHRINK(ICODE,RNOW,W,N,VL,IV,NB,JJ,L,EINT,CENT,WVEC,
|
|
2 CLOSE,SI,EIGOLD,R,SR,DEEP,NSQ,NPOTL,ISCRU,NOPMAX,PRINT)
|
|
430 CONTINUE
|
|
C
|
|
C END OF R-MATRIX PROPAGATION LOOP
|
|
C
|
|
WRITE(6,440)
|
|
440 FORMAT('0***** ERROR IN RMTPRP - LIMIT OF',I7,'STEPS REACHED.',
|
|
1 ' RUN HALTED.')
|
|
STOP
|
|
C
|
|
C REACH HERE WHEN ASYMPTOTIC REGION IS REACHED
|
|
C
|
|
450 CALL TRNSP(SI,N)
|
|
CALL TRNSFM(SI,R,SR,N,.FALSE.,.TRUE.)
|
|
C
|
|
RUP=RNOW+DRNOW/2.D0
|
|
IF(ICODE.EQ.1 .AND. PRINT.GE.2)
|
|
1 WRITE(6,460) RUP,KSTEP
|
|
460 FORMAT(' FINISHED AT RUP =',F10.5,' AFTER',I7,' STEPS')
|
|
IF(ICODE.NE.1 .AND. PRINT.GE.5) WRITE(6,470)
|
|
470 FORMAT('0 R-MATRIX PROPAGATION COMPLETED USING STORED DATA')
|
|
C
|
|
CALL SYMINV(R,N,N,IFAIL)
|
|
IF(IFAIL.GT.N) GOTO 480
|
|
CALL YTOK(NB,WVEC,L,N,NOPEN,R1,R2,R3,R4,R,SR,Q,RUP)
|
|
CALL KTOS(Q,SR,SI,NOPEN)
|
|
RETURN
|
|
C
|
|
480 WRITE(6,490)
|
|
490 FORMAT('0***** ERROR IN SYMINV CALLED FROM RMTPRP.',
|
|
1 ' RUN HALTED.')
|
|
STOP
|
|
END
|
|
SUBROUTINE RSYM(NN,R,STEST,PRINT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
INTEGER PRINT
|
|
DIMENSION R(NN,NN)
|
|
IF (NN.LE.1) RETURN
|
|
NERR=0
|
|
XX=0.D0
|
|
TEST=MAX(STEST,5.D-7)
|
|
DO 1200 I=2,NN
|
|
IM1=I-1
|
|
DO 1200 J=1,IM1
|
|
SUM=R(I,J)+R(J,I)
|
|
ASUM=ABS(SUM)
|
|
ADIF=ABS(R(I,J)-R(J,I))
|
|
IF (ASUM.LE.TEST) GO TO 1100
|
|
RAT=ADIF
|
|
IF (ASUM.GE.2.D0) RAT=RAT/ASUM
|
|
IF (RAT.LE.TEST) GO TO 1100
|
|
XX=MAX(XX,RAT)
|
|
NERR=NERR+1
|
|
1100 SUM=.5D0*SUM
|
|
R(I,J)=SUM
|
|
1200 R(J,I)=SUM
|
|
IF (NERR.LE.0) RETURN
|
|
NO=NN*(NN-1)/2
|
|
IF(PRINT.GE.4) WRITE(6,601) NERR,NO,TEST,XX
|
|
601 FORMAT(I6,' OF',I4,' OFF-DIAGONAL ELEMENTS OF ',
|
|
& 'K-MATRIX NOT SYMMETRIC WITH RESPECT TO TEST =',2D12.4)
|
|
RETURN
|
|
END
|
|
FUNCTION RSYMTP(J1,K1,J2,J1P,K1P,J2P,JJ,JJP,MU,P1,Q1,P2,PP)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
INTEGER P1,Q1,P2,PP
|
|
DATA Z0/0.D0/, PI/3.14159265358979289D0/
|
|
C STATEMENT FUNCTION . . .
|
|
Z(X)=2.D0*X+1.D0
|
|
C
|
|
XJ1 = J1
|
|
XK1 = K1
|
|
XJ2 = J2
|
|
XJ1P = J1P
|
|
XK1P = K1P
|
|
XJ2P = J2P
|
|
XJJ = JJ
|
|
XJJP = JJP
|
|
XMU = MU
|
|
XQ1 = Q1
|
|
XP1 = P1
|
|
XP2 = P2
|
|
XPP = PP
|
|
RSYMTP=0.D0
|
|
F=THRJ(XJ1,XP1,XJ1P,-XK1,XQ1,XK1P)
|
|
IF (ABS(F) .LE. 1.D-8) RETURN
|
|
F=F*THRJ(XJJ,XPP,XJJP,XMU,Z0,-XMU)
|
|
IF (ABS(F) .LE. 1.D-8) RETURN
|
|
F = F*THREEJ(J2,P2,J2P)
|
|
IF(ABS(F) .LE. 1.D-8) RETURN
|
|
F = F*XNINEJ(JJ,PP,JJP,J1,P1,J1P,J2,P2,J2P)
|
|
IF(ABS(F) .LE. 1.D-8) RETURN
|
|
RSYMTP=F*SQRT(Z(XJ1)*Z(XJ1P)*Z(XJ2)*Z(XJ2P)*Z(XPP)*Z(XP2)
|
|
1 *Z(XJJ)*Z(XJJP))*PARITY3(J1P+J2P+JJ+MU-K1)/(4.0D0*PI)
|
|
RETURN
|
|
END
|
|
* ----------------------------------------------------------------------
|
|
SUBROUTINE SCAIRY (Z, SCAI, SCBI, SCAIP, SCBIP, ZETA)
|
|
* SCALED AIRY FUNCTIONS AND DERIVATIVES
|
|
* THIS PROGRAM WRITTEN BY D.E. MANOLOPOULOS (SEPT. 1986)
|
|
* CURRENT REVISION DATE: SEPT-1986
|
|
* ----------------------------------------------------------------
|
|
* FOR Z .LT. (-5.0D0)
|
|
* AI(Z) = SCAI*COS(ZETA) + SCBI*SIN(ZETA)
|
|
* BI(Z) = SCBI*COS(ZETA) - SCAI*SIN(ZETA)
|
|
* AI'(Z) = SCAIP*COS(ZETA) + SCBIP*SIN(ZETA)
|
|
* BI'(Z) = SCBIP*COS(ZETA) - SCAIP*SIN(ZETA)
|
|
* WHERE ZETA = (2/3)*(-Z)**(3/2) + PI/4
|
|
* FOR (-5.0D0) .LE. Z .LE. (+0.0D0)
|
|
* AI(Z) = SCAI
|
|
* BI(Z) = SCBI
|
|
* AI'(Z) = SCAIP
|
|
* BI'(Z) = SCBIP
|
|
* AND ZETA = 0
|
|
* FOR (+0.0D0) .LT. Z
|
|
* AI(Z) = SCAI*EXP(-ZETA)
|
|
* BI(Z) = SCBI*EXP(+ZETA)
|
|
* AI'(Z) = SCAIP*EXP(-ZETA)
|
|
* BI'(Z) = SCBIP*EXP(+ZETA)
|
|
* WHERE ZETA = (2/3)*(+Z)**(3/2)
|
|
* ----------------------------------------------------------------
|
|
* EVALUATION OF THE FUNCTIONS IS BASED ON A NUMBER OF
|
|
* CHEBYSHEV EXPANSIONS
|
|
*
|
|
* THIS VERSION IS SUITABLE FOR MACHINES WITH FULL WORD PRECISION
|
|
* ----------------------------------------------------------------
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DOUBLE PRECISION A, B, C, C1, C2, DF, DG, EX, EXP1Z, EXP2Z, F,
|
|
: G, PIB4, ROOT4Z, ROOTZ, RT3, SCAI, SCAIP, SCBI,
|
|
: SCBIP, T, T2, XEPS, Y, Z, ZCUBE, ZETA, ZSQ
|
|
DATA C1 / 3.55028053887817239D-01 /
|
|
DATA C2 / 2.58819403792806798D-01 /
|
|
DATA RT3 / 1.73205080756887729D+00 /
|
|
DATA PIB4 / 7.85398163397448310D-01 /
|
|
ZETA = 0.0D0
|
|
XEPS = 0.0D0
|
|
* ----------------------------------------------------------------------
|
|
* HERE IF NEAR ENOUGH ORIGIN TO USE 3 TERM POWER SERIES
|
|
IF ( ABS(Z) .LE. 0.025D0) THEN
|
|
ZSQ = Z * Z
|
|
ZCUBE = ZSQ * Z
|
|
* EVALUATE POWER SERIES ( THREE TERMS IS SUFFICIENT FOR ABS(X) < 0.025)
|
|
DF = 1.D0 + ZCUBE / 6.D0 + ZCUBE * ZCUBE / 180.D0
|
|
DG = Z * (1.D0 + ZCUBE / 12.D0 + ZCUBE * ZCUBE / 504.D0)
|
|
SCAI = C1 * DF - C2 * DG
|
|
SCBI = RT3 * (C1 * DF + C2 * DG)
|
|
* NOW FOR DERIVATIVES
|
|
DF = ZSQ / 2.D0 + ZSQ * ZCUBE / 30.D0
|
|
DG = 1.D0 + ZCUBE / 3.D0 + ZCUBE * ZCUBE / 72.D0
|
|
SCAIP = C1 * DF - C2 * DG
|
|
SCBIP = RT3 * (C1 * DF + C2 * DG)
|
|
* SCALE THE FUNCTIONS BY EXP(ZETA) IF Z .GT. 0
|
|
IF (Z .GT. 0.D0) THEN
|
|
ROOTZ = SQRT(Z)
|
|
ZETA = 2.0D0 * Z * ROOTZ / 3.0D0
|
|
EX = EXP(ZETA)
|
|
SCAI = SCAI * EX
|
|
SCAIP = SCAIP * EX
|
|
SCBI = SCBI / EX
|
|
SCBIP = SCBIP / EX
|
|
END IF
|
|
RETURN
|
|
END IF
|
|
IF (Z.LT.(+9.0D0)) GO TO 10
|
|
ROOTZ = SQRT(Z)
|
|
ROOT4Z = SQRT(ROOTZ)
|
|
ZETA = 2.0D0*Z*ROOTZ/3.0D0
|
|
T = 36.0D0/ZETA - 1.0D0
|
|
Y = ((((((((( +1.16537795324979200D-15*T
|
|
* -1.16414171455572480D-14)*T +1.25420655508401920D-13)*T
|
|
* -1.55860414100340659D-12)*T +2.21045776110011276D-11)*T
|
|
* -3.67472827517194031D-10)*T +7.44830865396606612D-09)*T
|
|
* -1.95743559326380581D-07)*T +7.44672431969805149D-06)*T
|
|
* -5.28651881409929932D-04)*T +2.81558489585006298D-01
|
|
SCAI = Y/ROOT4Z
|
|
Y = ((((((((((( +4.50165999254528000D-15*T
|
|
* +1.56232018374502400D-14)*T +5.26240712559918080D-14)*T
|
|
* +2.97814898856618752D-13)*T +1.97577620975625677D-12)*T
|
|
* +1.53678944110742706D-11)*T +1.45409933537455235D-10)*T
|
|
* +1.71547326972380087D-09)*T +2.61898617129147064D-08)*T
|
|
* +5.49497993491833009D-07)*T +1.76719804365109334D-05)*T
|
|
* +1.12212109935874117D-03)*T +5.65294557558522063D-01
|
|
SCBI = Y/ROOT4Z
|
|
Y = ((((((((( +1.20954638924697600D-15*T
|
|
* -1.21281218539020800D-14)*T +1.31303723724964224D-13)*T
|
|
* -1.64152781754533677D-12)*T +2.34672185025709461D-11)*T
|
|
* -3.94507329122119338D-10)*T +8.13125005420910243D-09)*T
|
|
* -2.19736365932356533D-07)*T +8.83993515227257822D-06)*T
|
|
* -7.43456339972080231D-04)*T -2.82847316336379200D-01
|
|
SCAIP = Y*ROOT4Z
|
|
Y = ((((((((((( -4.59170437029478400D-15*T
|
|
* -1.59840960512122880D-14)*T -5.41258863340784640D-14)*T
|
|
* -3.07414589507261184D-13)*T -2.04866616770522650D-12)*T
|
|
* -1.60321415915690897D-11)*T -1.52922073861488292D-10)*T
|
|
* -1.82445639488695332D-09)*T -2.83250890588806503D-08)*T
|
|
* -6.11130377639012647D-07)*T -2.07842147963678572D-05)*T
|
|
* -1.56350017663858255D-03)*T +5.62646283094843014D-01
|
|
SCBIP = Y*ROOT4Z
|
|
RETURN
|
|
10 IF (Z.LT.(+4.5D0)) GO TO 20
|
|
ROOTZ = SQRT(Z)
|
|
ZETA = 2.0D0*Z*ROOTZ/3.0D0
|
|
EXP1Z = EXP(ZETA-2.5D0*Z)
|
|
EXP2Z = EXP(ZETA-2.625D0*Z)
|
|
T = 4.0D0*Z/9.0D0 - 3.0D0
|
|
Y = ((((((((((((((((((((( +9.69081960415394529D-11*T
|
|
* +3.24436136050920784D-10)*T -3.57419513430644674D-09)*T
|
|
* -3.84461320827974687D-09)*T +8.88116699085949212D-08)*T
|
|
* -6.26105174374717557D-08)*T -1.69051051004298110D-06)*T
|
|
* +3.80731416363041759D-06)*T +2.43840529113057777D-05)*T
|
|
* -9.74379632673654766D-05)*T -2.45324254437931970D-04)*T
|
|
* +1.69517926953312785D-03)*T +1.19638433540225211D-03)*T
|
|
* -2.15255594590357451D-02)*T +9.33777073522844198D-03)*T
|
|
* +1.98716159257796883D-01)*T -2.54001858882057718D-01)*T
|
|
* -1.27148775197878180D+00)*T +2.52046376168394778D+00)*T
|
|
* +5.04987271423387057D+00)*T -1.33120978544419281D+01)*T
|
|
* -9.34903846550381088D+00)*T +3.10330812950257837D+01
|
|
SCAI = Y*EXP1Z
|
|
Y = (((((((((((((((((((((((( +3.79210935744593920D-14*T
|
|
* -4.16346635040194560D-14)*T -3.63110681886588928D-13)*T
|
|
* +1.38932592029414195D-12)*T -4.00489068810888806D-12)*T
|
|
* +1.39019501834951721D-11)*T -4.50877182237241508D-11)*T
|
|
* +1.38942309844733264D-10)*T -3.92503498108710093D-10)*T
|
|
* +1.20125005161756928D-09)*T -3.14234550677825531D-09)*T
|
|
* +1.03100587323694771D-08)*T -2.35240060783126760D-08)*T
|
|
* +8.98525670958611253D-08)*T -1.57273011181242048D-07)*T
|
|
* +7.77696763289738864D-07)*T -8.40211181188135235D-07)*T
|
|
* +6.34887361301864569D-06)*T -2.73464023289055762D-06)*T
|
|
* +4.54606729925166230D-05)*T +2.20459155042947089D-06)*T
|
|
* +2.58823388957588056D-04)*T +7.31023768389466446D-05)*T
|
|
* +1.01013806904596356D-03)*T +2.64794416332118755D-04)*T
|
|
* +1.97499785553709145D-03
|
|
SCBI = Y/EXP1Z
|
|
Y = ((((((((((((((((((((( -4.40679918437492851D-10*T
|
|
* +1.30954945449348301D-10)*T +1.30052079376596751D-08)*T
|
|
* -2.21315827945437064D-08)*T -2.56850909380644963D-07)*T
|
|
* +8.66960855365698346D-07)*T +3.75622307499741911D-06)*T
|
|
* -2.15396233361107222D-05)*T -3.55804094667597110D-05)*T
|
|
* +3.95317852914037711D-04)*T +5.03369361986934094D-05)*T
|
|
* -5.54634417403436820D-03)*T +5.29658186908372832D-03)*T
|
|
* +5.91311623537658225D-02)*T -1.09446664596286554D-01)*T
|
|
* -4.63589435529194219D-01)*T +1.25323269822030972D+00)*T
|
|
* +2.50138108959469254D+00)*T -9.12668774193995449D+00)*T
|
|
* -8.14385732036876466D+00)*T +4.00134082550833019D+01)*T
|
|
* +1.15396202931444799D+01)*T -8.17378314444550419D+01
|
|
SCAIP = Y*EXP1Z
|
|
Y = (((((((((((((((((((((((( -1.12976379481423872D-13*T
|
|
* +2.84163275199873024D-13)*T +9.21367859618119680D-14)*T
|
|
* -6.47465116933029888D-13)*T +5.66210442158931968D-13)*T
|
|
* -3.03158042458901709D-12)*T +1.32640217809876419D-11)*T
|
|
* -3.03558223041639219D-11)*T +5.32290407073565901D-11)*T
|
|
* +1.67561690905544950D-11)*T -3.35234276365918044D-10)*T
|
|
* +2.92807773020050397D-09)*T -8.76900994127464369D-09)*T
|
|
* +4.69138029321003869D-08)*T -1.00929917942876779D-07)*T
|
|
* +5.40401934648687824D-07)*T -8.19977129258456927D-07)*T
|
|
* +5.13367651438974580D-06)*T -4.77800617725922708D-06)*T
|
|
* +4.02415391117897098D-05)*T -1.74571192912274417D-05)*T
|
|
* +2.45332091645215217D-04)*T -2.22916383050374016D-05)*T
|
|
* +1.02535993549737948D-03)*T +5.94033287658300975D-05)*T
|
|
* +2.17420627539345627D-03
|
|
SCBIP = Y/EXP2Z
|
|
RETURN
|
|
20 IF (Z.LE.(+0.0D0)) GO TO 40
|
|
ROOTZ = SQRT(Z)
|
|
ZETA = 2.0D0*Z*ROOTZ/3.0D0
|
|
EXP1Z = EXP(ZETA-1.5D0*Z)
|
|
EXP2Z = EXP(ZETA-1.375D0*Z)
|
|
T = 4.0D0*Z/9.0D0 - 1.0D0
|
|
IF (Z.LT.(+XEPS)) GO TO 30
|
|
Y = ((((((((((((((((((((((( +4.97635854909020570D-12*T
|
|
* -3.25024150273916928D-11)*T -5.15773946723072737D-11)*T
|
|
* +8.66802872160017711D-10)*T -9.51292671519803048D-10)*T
|
|
* -1.33268133924677102D-08)*T +4.37061406144179625D-08)*T
|
|
* +1.18943714086308365D-07)*T -8.66980482244589319D-07)*T
|
|
* -2.46768077494905499D-08)*T +1.10610939830483627D-05)*T
|
|
* -1.80475663535516462D-05)*T -9.22213518989192294D-05)*T
|
|
* +3.15767712665407001D-04)*T +4.08626419412850994D-04)*T
|
|
* -3.12704269924340764D-03)*T +6.27899244118607949D-04)*T
|
|
* +1.99062142478229001D-02)*T -2.27427058211322122D-02)*T
|
|
* -7.94869698136278246D-02)*T +1.54261999158247445D-01)*T
|
|
* +1.75618463128730757D-01)*T -5.05223670654169859D-01)*T
|
|
* -1.49695902416050331D-01)*T +6.91290454439828966D-01
|
|
SCAI = Y*EXP1Z
|
|
Y = (((((((((((((((((((((((((((-8.01144609907912212D-11*T
|
|
* +2.67566208080291037D-10)*T +1.74416971406971503D-10)*T
|
|
* -3.12642164666800066D-09)*T +1.22114569059570056D-08)*T
|
|
* -2.93647730218878800D-08)*T +1.76951994785830839D-08)*T
|
|
* +2.13143266932123830D-07)*T -1.15569603602267288D-06)*T
|
|
* +3.34394065752949896D-06)*T -5.20143492253259528D-06)*T
|
|
* -3.21937890029830155D-06)*T +5.00360593064643409D-05)*T
|
|
* -1.77449408434194908D-04)*T +3.86357389967150628D-04)*T
|
|
* -4.53337922165622921D-04)*T -2.60866378774883161D-04)*T
|
|
* +3.01355585350049504D-03)*T -8.39047077309199055D-03)*T
|
|
* +1.63240267627966090D-02)*T -1.90830727084112485D-02)*T
|
|
* +1.65592661387959142D-02)*T +1.76101803014184860D-02)*T
|
|
* -3.36652019472526494D-02)*T +1.23831258886916327D-01)*T
|
|
* -6.48342330363017516D-02)*T +2.20310550882807725D-01)*T
|
|
* -1.03883014957365224D-02)*T +2.06857611342460346D-01
|
|
SCBI = Y/EXP2Z
|
|
30 Y = ((((((((((((((((((((((( -2.31635825886515692D-11*T
|
|
* +8.43840142802870600D-11)*T +3.68028065271203758D-10)*T
|
|
* -2.61043232825754937D-09)*T -4.65110871930215858D-10)*T
|
|
* +4.46164842334855713D-08)*T -9.24599436690579710D-08)*T
|
|
* -4.55809882095931368D-07)*T +2.21024501804834447D-06)*T
|
|
* +1.50251398952558802D-06)*T -2.91830008657289876D-05)*T
|
|
* +3.51391100964982453D-05)*T +2.37966767002002741D-04)*T
|
|
* -7.00969870295148024D-04)*T -9.84923358717942729D-04)*T
|
|
* +6.68935321740601810D-03)*T -1.66398286740112083D-03)*T
|
|
* -3.83618654865390504D-02)*T +4.80463615092658847D-02)*T
|
|
* +1.28359791076466449D-01)*T -2.80267155846714091D-01)*T
|
|
* -2.06049815358004057D-01)*T +7.63522843530878467D-01)*T
|
|
* +6.47699892977822355D-02)*T -8.32940737409625965D-01
|
|
SCAIP = Y*EXP2Z
|
|
Y = (((((((((((((((((((((((((((+2.69330665471830131D-10*T
|
|
* -1.25313111217921013D-09)*T +1.45057587508619405D-09)*T
|
|
* +5.82827351134571594D-09)*T -3.96093412314305685D-08)*T
|
|
* +1.37346521367521144D-07)*T -2.78927594518121271D-07)*T
|
|
* +2.96531845420687661D-08)*T +2.27734981888044076D-06)*T
|
|
* -1.02295902888535994D-05)*T +2.65515218319523965D-05)*T
|
|
* -3.86457370206378782D-05)*T -1.52212232476268640D-05)*T
|
|
* +2.84765225803690646D-04)*T -9.65798046252914453D-04)*T
|
|
* +2.04618065580453522D-03)*T -2.68702422147972510D-03)*T
|
|
* +8.36839039610090712D-04)*T +6.87131161447866570D-03)*T
|
|
* -2.10563741100004648D-02)*T +4.13290131622517073D-02)*T
|
|
* -5.03310394511775398D-02)*T +5.95467795825179773D-02)*T
|
|
* -1.64213101223235839D-02)*T +5.02536006477020710D-02)*T
|
|
* +5.75601787687195966D-02)*T +1.33220031651076020D-01)*T
|
|
* +7.76356357899154668D-02)*T +2.11213324176049168D-01
|
|
SCBIP = Y/EXP1Z
|
|
RETURN
|
|
40 IF (Z.LT.(-5.0D0)) GO TO 60
|
|
T = Z/5.0D0
|
|
T = -T*T*T
|
|
T = 2.0D0*T - 1.0D0
|
|
T2 = 2.0D0*T
|
|
IF (Z.GT.(-XEPS)) GO TO 50
|
|
A = +1.63586492025000000D-18
|
|
B = T2*A -1.14937368283025000D-16
|
|
C = T2*B-A +7.06090635856696000D-15
|
|
A = T2*C-B -3.75504581033290114D-13
|
|
B = T2*A-C +1.70874975807662448D-11
|
|
C = T2*B-A -6.56273599013291800D-10
|
|
A = T2*C-B +2.09250023300659871D-08
|
|
B = T2*A-C -5.42780372893997236D-07
|
|
C = T2*B-A +1.11655763472468469D-05
|
|
A = T2*C-B -1.76193215080912647D-04
|
|
B = T2*A-C +2.03792657403144947D-03
|
|
C = T2*B-A -1.61616260941907957D-02
|
|
A = T2*C-B +7.87369695059018748D-02
|
|
B = T2*A-C -1.88090320218915726D-01
|
|
C = T2*B-A +8.83593328666433903D-02
|
|
A = T2*C-B +9.46330439565858235D-02
|
|
F = T*A-C +7.60869994141726643D-02
|
|
A = +1.23340698467000000D-19
|
|
B = T2*A -9.05440546731800000D-18
|
|
C = T2*B-A +5.83052348377146000D-16
|
|
A = T2*C-B -3.26253073273305810D-14
|
|
B = T2*A-C +1.56911825099665634D-12
|
|
C = T2*B-A -6.40386375393414830D-11
|
|
A = T2*C-B +2.18414557202733054D-09
|
|
B = T2*A-C -6.11127835033401880D-08
|
|
C = T2*B-A +1.37095478225289560D-06
|
|
A = T2*C-B -2.39464595313812449D-05
|
|
B = T2*A-C +3.13306256975299299D-04
|
|
C = T2*B-A -2.90953380590207648D-03
|
|
A = T2*C-B +1.76972907074092250D-02
|
|
B = T2*A-C -6.17055677164122241D-02
|
|
C = T2*B-A +9.52472833367213949D-02
|
|
A = T2*C-B -4.32381694223484894D-02
|
|
G = T*A-C +3.76828717701544063D-02
|
|
SCAI = F - G*Z
|
|
SCBI = RT3*(F + G*Z)
|
|
50 A = -2.51308436743000000D-18
|
|
B = T2*A +1.65543326242034000D-16
|
|
C = T2*B-A -9.49237123028142500D-15
|
|
A = T2*C-B +4.68795260455788096D-13
|
|
B = T2*A-C -1.96942895842729954D-11
|
|
C = T2*B-A +6.93493715818491929D-10
|
|
A = T2*C-B -2.01076965264476206D-08
|
|
B = T2*A-C +4.69655735896232104D-07
|
|
C = T2*B-A -8.59527033121202608D-06
|
|
A = T2*C-B +1.18871496270269531D-04
|
|
B = T2*A-C -1.18244097697332692D-03
|
|
C = T2*B-A +7.87645202148185146D-03
|
|
A = T2*C-B -3.14174372672396468D-02
|
|
B = T2*A-C +6.20464642445295805D-02
|
|
C = T2*B-A -4.83824291776351778D-02
|
|
F = T*C-B +2.64808460123486707D-02
|
|
A = +5.89382778069400000D-18
|
|
B = T2*A -4.04811810887971000D-16
|
|
C = T2*B-A +2.42680453287673090D-14
|
|
A = T2*C-B -1.25683910148099294D-12
|
|
B = T2*A-C +5.55607745069567295D-11
|
|
C = T2*B-A -2.06683376304577072D-09
|
|
A = T2*C-B +6.35924425685425485D-08
|
|
B = T2*A-C -1.58422527393619013D-06
|
|
C = T2*B-A +3.11007119112993551D-05
|
|
A = T2*C-B -4.64189437787271433D-04
|
|
B = T2*A-C +5.00970025411579034D-03
|
|
C = T2*B-A -3.62166342717373453D-02
|
|
A = T2*C-B +1.53114671641953510D-01
|
|
B = T2*A-C -2.69270807740667256D-01
|
|
C = T2*B-A -9.61843661149152853D-02
|
|
A = T2*C-B +2.07099372879297732D-01
|
|
G = T*A-C +9.79943887874547828D-02
|
|
SCAIP = Z*Z*F - G
|
|
SCBIP = RT3*(Z*Z*F + G)
|
|
RETURN
|
|
60 ROOTZ = SQRT(-Z)
|
|
ROOT4Z = -SQRT(ROOTZ)
|
|
ZETA = 2.0D0*(-Z)*ROOTZ/3.0D0
|
|
T = -250.0D0/(Z*Z*Z) - 1.0D0
|
|
A = ((((((((((((( -4.50071772808806400D-15*T
|
|
* +1.11777933477806080D-14)*T -1.39959545848483840D-14)*T
|
|
* +4.93110187870320640D-14)*T -2.02193307034590720D-13)*T
|
|
* +7.53585452663569920D-13)*T -3.14632365928501299D-12)*T
|
|
* +1.52351450024952975D-11)*T -8.75801572233507014D-11)*T
|
|
* +6.27349413509555121D-10)*T -6.02183526555303242D-09)*T
|
|
* +8.70043536788235270D-08)*T -2.32935044050984079D-06)*T
|
|
* +1.83605337367638430D-04)*T -5.64003555099413391D-01
|
|
SCBI = A/ROOT4Z
|
|
B = (((((((((((((((( -4.12972759036723200D-15*T
|
|
* +8.36512465551360000D-15)*T -2.05945081774080000D-16)*T
|
|
* +6.23733840790323200D-15)*T -5.81333983959859200D-14)*T
|
|
* +1.52893566095288320D-13)*T -4.11064788026333184D-13)*T
|
|
* +1.33820884559538637D-12)*T -4.74293914921785574D-12)*T
|
|
* +1.84868021228605050D-11)*T -8.15686769476673166D-11)*T
|
|
* +4.19373390376196942D-10)*T -2.61584084406303574D-09)*T
|
|
* +2.10021454539364698D-08)*T -2.37847770210509358D-07)*T
|
|
* +4.43114636962516363D-06)*T -1.83241371436579068D-04)*T
|
|
* +3.89918976811026487D-02
|
|
SCAI = (B/ZETA)/ROOT4Z
|
|
A = ((((((((((((( -4.58484390222233600D-15*T
|
|
* +1.13969221615738880D-14)*T -1.43160328250060800D-14)*T
|
|
* +5.04734978526300160D-14)*T -2.07055957015081472D-13)*T
|
|
* +7.73043520694004480D-13)*T -3.23454581960357018D-12)*T
|
|
* +1.57043540332660220D-11)*T -9.06023827679991573D-11)*T
|
|
* +6.52303613917050367D-10)*T -6.30993998756281944D-09)*T
|
|
* +9.23711460831703303D-08)*T -2.54030284953639173D-06)*T
|
|
* +2.17448385781448409D-04)*T +5.64409671680379110D-01
|
|
SCAIP = A*ROOT4Z
|
|
B = (((((((((((((((( +4.19612197958451200D-15*T
|
|
* -8.50454708509081600D-15)*T +2.31421341122560000D-16)*T
|
|
* -6.39683104557465600D-15)*T +5.92509321833062400D-14)*T
|
|
* -1.56008660983891968D-13)*T +4.20106807813331968D-13)*T
|
|
* -1.36926896339755520D-12)*T +4.86000800286762854D-12)*T
|
|
* -1.89780061819570625D-11)*T +8.39314701970122041D-11)*T
|
|
* -4.32843814802265754D-10)*T +2.71124934991469715D-09)*T
|
|
* -2.19026888712002973D-08)*T +2.50504395196083566D-07)*T
|
|
* -4.75245434337472120D-06)*T +2.05252791097940732D-04)*T
|
|
* -5.46414841607309762D-02
|
|
SCBIP = (B/ZETA)*ROOT4Z
|
|
ZETA = ZETA + PIB4
|
|
RETURN
|
|
END
|
|
SUBROUTINE SET4(NLEV,JLEV,ATAU,EFACT,IUNIT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C THIS ROUTINE SETS UP BASIS FOR ITYPE=4.
|
|
C LINEAR RIGID ROTOR + ASYMMETRIC RIGID ROTOR SCATTERING.
|
|
C INITIAL ROUTINE WRITTEN BY T.R. PHILLIPS, GISS, AUGUST 1990
|
|
C DERIVED FROM ROUTINES SET6 AND SET3.
|
|
C EXTENSIVELY REVISED FOR MOLSCAT VERSION 12 BY TRP (JUL 93)
|
|
C CURRENT CODE ENTIRELY REWRITTEN (VERSION 14) BY S GREEN (5 AUG 94)
|
|
C
|
|
C IMPLEMENTS THREE METHODS TO INPUT BASIS:
|
|
C 1) A,B,C .GT. 0 SPECIFIED; GENERATE ASYM TOP FNS VIA SET6C ROUTINE
|
|
C 2) NLEVEL.GT.0 SPECIFIED; READ ASYM TOP FNS FROM IUNIT=IASYMU
|
|
C -- FOR BOTH 1 & 2, EXPAND WITH J2=J2MIN,J2MAX,J2STEP; LINEAR
|
|
C ROTOR ENERGIES MUST BE CALCULABLE FROM BE(2); SCREEN ON EMAX
|
|
C 3) NLEVEL.LT.0 SPECIFIED; READ ASYM TOP FNS FROM IUNIT=IASYMU
|
|
C FILTERING ON JLEVEL(3*I-1),JLEVEL(3*I)=J1,ITAU; J2=JLEVEL(3*I);
|
|
C LEVEL ENERGIES MAY BE SPECIFIED IN ELEVEL, OTHERWISE CALC'D
|
|
C
|
|
DIMENSION JLEV(2),ATAU(2)
|
|
C N.B. JLEV AND ATAU OCCUPY SAME STORAGE PASSED FROM DRIVER/BASIN
|
|
C ON ENTRY X(IXNEXT) SHOULD BE SAME AS ATAU(1)==JLEV(1)
|
|
C NOTE: NIPR NOT USED FOR JLEV STORAGE; THIS IS CONSERVATIVE
|
|
C IXNEXT MUST BE INCREMENTED TO REFLECT *ATAU* STORAGE USED.
|
|
C
|
|
LOGICAL EIN
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
C CMBASE MADE COMPATIBLE WITH VERSION 14 (SG 2 AUG 94)
|
|
DIMENSION BE(2),ALPHAE(2),DE(2)
|
|
EQUIVALENCE (BE(1),AAE(1)), (ALPHAE(1),BBE(1)), (DE(1),CCE(1))
|
|
COMMON /CMBASE/ AAE(2),BBE(2),CCE(2),ROTI(6),ELEVEL(1000),EMAX,
|
|
1 WT(2),SPNUC,NLEVEL,JLEVEL(4000),JMIN,JMAX,JSTEP,ISYM(10),
|
|
2 J2MIN,J2MAX,J2STEP,ISYM2(10),JHALF,IDENT,MXJL,MXEL
|
|
C
|
|
C DEFAULT UNIT IS STANDARD INPUT
|
|
DATA IDU/5/
|
|
C
|
|
C CHECK FOR CORRECT IV() FLAG IN INITIALIZATION ENTRY
|
|
IF (IVLFL.NE.0) THEN
|
|
WRITE(6,690) IVLFL
|
|
690 FORMAT(/' SET4 (JUL 93). ILLEGAL IVLFL =',I6)
|
|
STOP
|
|
ENDIF
|
|
C
|
|
IF (AAE(1).GT.0.D0.AND.BBE(1).GT.0.D0.AND.CCE(1).GT.0.D0)
|
|
1 GO TO 3000
|
|
C
|
|
C ASYMMETRIC TOP FUNCTIONS WILL BE INPUT FROM IUNIT; CHECK IT
|
|
WRITE(6,602) IUNIT
|
|
602 FORMAT(/' ASYMMETRIC TOP BASIS WILL BE INPUT FROM UNIT IASYMU =',
|
|
1 I4)
|
|
IF (NLEVEL.GT.0) THEN
|
|
NREAD=NLEVEL
|
|
WRITE(6,603) NLEVEL
|
|
603 FORMAT(' NUMBER OF INPUT LEVELS SPECIFIED BY NLEVEL IS',I6)
|
|
ELSE
|
|
IF (IUNIT.EQ.IDU) THEN
|
|
WRITE(6,*) ' *** SET4. CANNOT READ FROM STD INPUT FOR',
|
|
1 ' NLEVEL.LE.0'
|
|
STOP
|
|
ENDIF
|
|
NREAD=1000000
|
|
WRITE(6,*) ' WILL INPUT LEVELS UNTIL END-OF-FILE'
|
|
ENDIF
|
|
C
|
|
IF (NLEVEL.LT.0) GO TO 7000
|
|
C
|
|
C BELOW IS 'CASE 2' -- RESULT SHOULD BE SAME AS FOR 'CASE 1'
|
|
C
|
|
C --- READ IN ASYMMETRIC RIGID ROTOR WAVEFUNCTIONS AND ENERGIES ---
|
|
C CODE BELOW FOLLOWS SET6 CODE
|
|
NLEV=0
|
|
IOFF=0
|
|
NKVAL=0
|
|
DO 2000 III=1,NREAD
|
|
READ(IUNIT,500,END=9000) JI,ITAU,EINP
|
|
500 FORMAT(2I5,F15.10)
|
|
NLEV=NLEV+1
|
|
JI=IABS(JI)
|
|
NK=2*JI+1
|
|
ELEVEL(NLEV)=EINP*EFACT
|
|
C SEE IF WE SHOULD SKIP ON JMIN,JMAX,JSTEP OR EMAX
|
|
IF (JMAX.LE.0) GO TO 2080
|
|
JDIF=JI-JMIN
|
|
JDIF=JDIF-JSTEP*(JDIF/JSTEP)
|
|
IF (JDIF.EQ.0 .AND. JI.GE.JMIN .AND. JI.LE.JMAX) GO TO 2080
|
|
WRITE(6,611) JI,ITAU,ELEVEL(NLEV),JMIN,JSTEP,JMAX
|
|
611 FORMAT(/' INPUT LEVEL J, TAU, E =',2I5,F13.3,' SKIPPED. ',
|
|
1 'J NOT IN RANGE',I4,' (',I4,')',I4)
|
|
GO TO 2070
|
|
2080 IF (EMAX.LE.0.D0) GO TO 2090
|
|
IF (ELEVEL(NLEV).LE.EMAX) GO TO 2090
|
|
WRITE(6,612) JI,ITAU,ELEVEL(NLEV),EMAX
|
|
612 FORMAT(/' INPUT LEVEL J, TAU, E =',2I5,F13.3,' SKIPPED ',
|
|
1 'DUE TO EMAX =',F11.3)
|
|
C REACH BELOW IF WE ARE SKIPPING THIS SET
|
|
2070 NLEV=NLEV-1
|
|
READ(IUNIT,501,END=9100) (ATAUX,I=1,NK)
|
|
GO TO 2000
|
|
C REACH BELOW IF WE ARE INCLUDING THIS SET
|
|
2090 CONTINUE
|
|
C SHIFT ATAU BY 6 WORDS TO MAKE ROOM FOR NEW JLEV; NB. NIPR NOT USED
|
|
IOFF=IOFF+6
|
|
DO 2020 I=1,NKVAL
|
|
2020 ATAU(IOFF+NKVAL+1-I)=ATAU(IOFF+NKVAL-5-I)
|
|
INST=IOFF+NKVAL
|
|
READ(IUNIT,501,END=9100) (ATAU(INST+I),I=1,NK)
|
|
501 FORMAT(6F12.8)
|
|
C OUTPUT INFORMATION READ.
|
|
WRITE(6,614) NLEV,JI,ITAU,EINP,ELEVEL(NLEV)
|
|
614 FORMAT(/' INPUT LEVEL',I4,' J, TAU =',2I4,' ENERGY =',F15.5,
|
|
& ' = ',F15.5,' (1/CM)')
|
|
MJI=-JI
|
|
WRITE(6,615) (ATAU(INST+1+JI+I),I, I=MJI,JI)
|
|
615 FORMAT(10X,'INPUT COEFFICIENTS ARE'/(10X,6(F12.6,'(',I3,')')))
|
|
C GET PARITY CODE FROM ATAU SYMMETRIES. . .
|
|
IPAR=IPASYM(JI,NK,ATAU(INST+1))
|
|
C IPAR=-1 IS ERROR RETURN FROM IPASYM.
|
|
IF (IPAR.NE.-1) GO TO 2001
|
|
WRITE(6,*) ' *** SET4. TERMINAL ERROR.'
|
|
STOP
|
|
C REORDER JLEV TO RECEIVE NEW ROW.
|
|
2001 NRM1=NLEV-1
|
|
IF (NRM1.LE.0) GO TO 2100
|
|
IOLD=6*NRM1
|
|
IX=6*NLEV
|
|
DO 2110 II=1,6
|
|
IX=IX-1
|
|
DO 2120 I=1,NRM1
|
|
JLEV(IX)=JLEV(IOLD)
|
|
IX=IX-1
|
|
2120 IOLD=IOLD-1
|
|
2110 CONTINUE
|
|
2100 JLEV(NLEV)=JI
|
|
JLEV(2*NLEV)=ITAU
|
|
JLEV(3*NLEV)=IPAR
|
|
JLEV(4*NLEV)=NKVAL
|
|
JLEV(5*NLEV)=NK
|
|
JLEV(6*NLEV)=NLEV
|
|
NKVAL=NKVAL+NK
|
|
GO TO 2000
|
|
C
|
|
C * * * END OF FILE CONDITIONS * * *
|
|
9000 IF (NLEVEL.GT.0) GO TO 2200
|
|
WRITE(6,606) IUNIT,NLEV
|
|
606 FORMAT('0 END OF FILE ENCOUNTERED ON UNIT',I4,' AFTER',I5,
|
|
& ' FUNCTIONS.')
|
|
GO TO 2400
|
|
2200 WRITE(6,607) IUNIT,NLEV
|
|
607 FORMAT('0 PREMATURE E.O.F. ON UNIT',I4,'. NLEVEL REDUCED TO',I6)
|
|
GO TO 2400
|
|
9100 WRITE(6,608) IUNIT,NLEV
|
|
608 FORMAT('0 * * * ERROR. E.O.F. ON UNIT',I4,' BEFORE ATAU CARDS F
|
|
&OR NLEV =',I5)
|
|
WRITE(6,699)
|
|
699 FORMAT('0 * * * TERMINAL ERROR.')
|
|
STOP
|
|
2000 CONTINUE
|
|
C THIS COMPLETES READ(IASYMU) LOOP
|
|
C
|
|
C SET JLEVEL() (ITYPE=6 FORMAT); N.B. ELEVEL() ALREADY SET
|
|
2400 DO 2401 I=1,NLEV
|
|
JLEVEL(2*I-1)=JLEV(I)
|
|
2401 JLEVEL(2*I)=JLEV(I+NLEV)
|
|
C CORRECT JLEV(LEV,4) FOR SPACE TAKEN BY JLEV. . .
|
|
IF (IOFF.NE.6*NLEV) THEN
|
|
WRITE(6,698) IOFF, NLEV
|
|
698 FORMAT(' *** SET4. INDEXING ERROR. IOFF,NLEV =',2I6)
|
|
STOP
|
|
ENDIF
|
|
IX=3*NLEV+1
|
|
IXTOP=4*NLEV
|
|
DO 2410 I=IX,IXTOP
|
|
2410 JLEV(I)=JLEV(I)+IOFF
|
|
C INCREMENT IXNEXT FOR STORAGE TAKEN BY ATAU
|
|
IXNEXT=IXNEXT+NKVAL
|
|
C CHECK THAT FUNCTIONS ARE ORTHOGONAL
|
|
CALL CHECK6(NLEV,JLEV,ATAU)
|
|
GO TO 4000
|
|
C
|
|
C BELOW IS 'CASE 1', I.E. GENERATE BASIS VIA SET6C
|
|
3000 CALL SET6C(JLEV,ATAU,NLEV,.FALSE.)
|
|
C N.B. SET6C INCREMENTS IXNEXT FOR ATAU STORAGE
|
|
C IF VALID IASYMU IS GIVEN, OUTPUT ROTOR WFNS
|
|
IF (IUNIT.LE.0.OR.IUNIT.GE.100.OR.IUNIT.EQ.IDU) GO TO 4000
|
|
WRITE(6,*) ' *** SET4 WILL OUTPUT ROTOR WAVEFUNCTIONS TO UNIT',
|
|
1 IUNIT
|
|
WRITE(6,*) ' IN FORMAT FOR FUTURE INPUT'
|
|
DO 1011 I=1,NLEV
|
|
JI=JLEV(I)
|
|
ITAU=JLEV(NLEV+I)
|
|
ISTA=JLEV(3*NLEV+I)
|
|
NK=JLEV(4*NLEV+I)
|
|
INDX=JLEV(5*NLEV+I)
|
|
WRITE(IUNIT,500,ERR=1099) JI,ITAU,ELEVEL(INDX)
|
|
1011 WRITE(IUNIT,501,ERR=1099) (ATAU(ISTA+II),II=1,NK)
|
|
RETURN
|
|
1099 WRITE(6,*) ' *** SET4. ERROR WRITING TO IASYMU; WFNS NOT SAVED'
|
|
RETURN
|
|
C
|
|
C CALL J6TO4 TO EXPAND 'ITYPE=6' TO 'ITYPE=4' FORMAT
|
|
C SET UP WORKING STORAGE. IXNEXT ALREADY REFLECTS ATAU STORAGE
|
|
C N.B. JLEV STORAGE DOES *NOT* REFLECT NIPR; SHOULD BE CONSERVATIVE
|
|
4000 IOFF=6*NLEV
|
|
IXEL=IXNEXT+IOFF
|
|
IXJL=IXEL+MXEL
|
|
IXJNW=IXJL+MXJL
|
|
NAVAIL=MX-IXJNW
|
|
IF (NAVAIL.LT.8*NLEV) THEN
|
|
WRITE(6,*) ' *** SET4. INSUFFICIENT WORKING SPACE FOR J6TO4'
|
|
WRITE(6,*) ' IXNEXT,MX,NAVAIL =',IXNEXT,MX,NAVAIL
|
|
STOP
|
|
ENDIF
|
|
C J6TO4 EXPANDS ITYPE=6 DATA FORMAT WITH POSSIBLE J2 VALUES
|
|
C TO PRODUCE ITYPE=4 DATA FORMAT
|
|
CALL J6TO4(NLEV,JLEV,ATAU,X(IXJNW),NAVAIL,X(IXEL),X(IXJL))
|
|
RETURN
|
|
C
|
|
C CODE BELOW IS 'CASE 3' NLEVEL.LT.0; FILTER IASYMU INPUT ON JLEVEL
|
|
7000 NLEVEL=ABS(NLEVEL)
|
|
IF (NLEVEL.GT.MXEL) THEN
|
|
WRITE(6,*) ' *** SET4. REQUESTED NLEVEL.GT.MXEL'
|
|
STOP
|
|
ENDIF
|
|
WRITE(6,*) ' BASIS FUNCTIONS DETERMINED BY &BASIS JLEVEL()'
|
|
WRITE(6,*) ' NUMBER OF LEVELS (NLEVEL) =',NLEVEL
|
|
EIN=.FALSE.
|
|
DO 7001 I=1,NLEVEL
|
|
7001 EIN=EIN.AND.ELEVEL(I).GT.0.D0
|
|
IF (EIN) THEN
|
|
WRITE(6,*)
|
|
1 ' ENERGIES FOR BASIS FNS TAKEN FROM &BASIN ELEVEL VALUES'
|
|
ELSE
|
|
IF (BE(2).LE.0.D0) THEN
|
|
WRITE(6,*) ' *** SET4. CANNOT OBTAIN LINEAR ROTOR',
|
|
1 ' ENERGY FROM BE(2)'
|
|
STOP
|
|
ENDIF
|
|
WRITE(6,*) ' ASYMMETRIC TOP ENERGIES TAKEN FROM IASYMU'
|
|
WRITE(6,644) BE(2)
|
|
644 FORMAT(/' LINEAR ROTOR ENERGY LEVELS COMPUTED FROM B(E) =',
|
|
1 F12.8)
|
|
IF (ALPHAE(2).NE.0.D0) WRITE(6,645) ALPHAE(2)
|
|
645 FORMAT(27X,'CORRECTED FOR ALPHA(E) = ',F12.8)
|
|
IF (DE(2).NE.0.D0) WRITE(6,646) DE(2)
|
|
646 FORMAT(27X,'CORRECTED FOR D(E) = ',F12.8)
|
|
ENDIF
|
|
C BEGIN READ(IASYMU) LOOP
|
|
NLEV=0
|
|
IOFF=0
|
|
NKVAL=0
|
|
DO 7100 III=1,NREAD
|
|
READ(IUNIT,500,END=9200) JI,ITAU,EINP
|
|
NK=2*JI+1
|
|
EINX=EINP*EFACT
|
|
NMATCH=0
|
|
DO 7200 IND=1,NLEVEL
|
|
IF (JLEVEL(3*IND-2).NE.JI.OR.JLEVEL(3*IND-1).NE.ITAU) GO TO 7200
|
|
C WE'VE FOUND A MATCH ON JI, ITAU,
|
|
NMATCH=NMATCH+1
|
|
J2=JLEVEL(3*IND)
|
|
FJ=DBLE(J2)
|
|
FJ=FJ*(FJ+1.D0)
|
|
E2=(BE(2)-ALPHAE(2)*0.5D0)*FJ - DE(2)*FJ*FJ
|
|
IF (.NOT.EIN) ELEVEL(IND)=EINX+E2
|
|
C EXPAND JI WITH J2 TO J12 IN GENERATING NLEV,JLEV FROM THIS SET
|
|
J12MIN=ABS(JI-J2)
|
|
J12MAX=JI+J2
|
|
DO 7400 J12=J12MIN,J12MAX
|
|
NLEV=NLEV+1
|
|
C SHIFT ATAU BY 8 WORDS TO MAKE ROOM FOR INCOMING JLEV
|
|
IOFF=IOFF+8
|
|
DO 7220 I=1,NKVAL
|
|
7220 ATAU(IOFF+NKVAL+1-I)=ATAU(IOFF+NKVAL-7-I)
|
|
C READ ATAU, BUT ONLY THE FIRST TIME WE USE THIS WAVEFUNCTION
|
|
IF (NMATCH.EQ.1) THEN
|
|
INST=IOFF+NKVAL
|
|
READ(IUNIT,501,END=9300) (ATAU(INST+I),I=1,NK)
|
|
C OUTPUT INFORMATION READ.
|
|
WRITE(6,651) JI,ITAU,EINP,EINX
|
|
651 FORMAT(/' INPUT LEVEL, J, TAU =',2I4,' ENERGY =',F12.4,
|
|
1 ' = ',F12.4,' (1/CM)')
|
|
MJI=-JI
|
|
WRITE(6,652) (ATAU(INST+1+JI+I),I,I=MJI,JI)
|
|
652 FORMAT(10X,'INPUT COEFFICIENTS ARE'/(10X,6(F12.6,'(',I3,')')))
|
|
C GET PARITY CODE FROM ATAU SYMMETRIES. . .
|
|
IPAR=IPASYM(JI,NK,ATAU(INST+1))
|
|
C IPAR=-1 IS ERROR RETURN FROM IPASYM.
|
|
IF (IPAR.EQ.-1) THEN
|
|
WRITE(6,*) ' *** SET4. ILEGAL SYMMETRY FOR INPUT WFN.'
|
|
STOP
|
|
ENDIF
|
|
ISTA=NKVAL
|
|
NKVAL=NKVAL+NK
|
|
ENDIF
|
|
C REORDER JLEV TO RECEIVE NEW ROW; ADAPTED FROM SET6 CODE.
|
|
NRM1=NLEV-1
|
|
IF (NRM1.LE.0) GO TO 7300
|
|
IOLD=8*NRM1
|
|
IX=8*NLEV
|
|
DO 7310 II=1,8
|
|
IX=IX-1
|
|
DO 7320 I=1,NRM1
|
|
JLEV(IX)=JLEV(IOLD)
|
|
IX=IX-1
|
|
7320 IOLD=IOLD-1
|
|
7310 CONTINUE
|
|
7300 JLEV(NLEV)=J12
|
|
JLEV(2*NLEV)=J2
|
|
JLEV(3*NLEV)=JI
|
|
JLEV(4*NLEV)=ITAU
|
|
JLEV(5*NLEV)=IPAR
|
|
JLEV(6*NLEV)=ISTA
|
|
JLEV(7*NLEV)=NK
|
|
JLEV(8*NLEV)=IND
|
|
7400 CONTINUE
|
|
C THIS ENDS J12 LOOP
|
|
7200 CONTINUE
|
|
C THIS ENDS LOOP OVER NLEVEL, JLEVEL() SETS.
|
|
C IF WE DID NOT USE THIS FUNCTION (NMATCH.EQ.0) SKIP ATAU CARDS
|
|
IF (NMATCH.LE.0) READ(IUNIT,501,END=9300) (ATAUX,I=1,NK)
|
|
GO TO 7100
|
|
C
|
|
C END OF FILE CONDITIONS
|
|
9300 WRITE(6,*) ' *** SET4. EOF ON IASYMU WHILE READING ATAU DATA'
|
|
STOP
|
|
9200 WRITE(6,*) ' *** SET4. NORMAL EOF ENCOUNTERED ON IASYMU'
|
|
GO TO 7500
|
|
C
|
|
7100 CONTINUE
|
|
C THIS ENDS LOOP OVER READ IASYMU
|
|
C
|
|
C CORRECT ISTA=JLEV(LEV,6) FOR SPACE TAKEN BY JLEV. . .
|
|
7500 IF (IOFF.NE.8*NLEV) THEN
|
|
WRITE(6,698) IOFF, NLEV
|
|
STOP
|
|
ENDIF
|
|
IX=5*NLEV+1
|
|
IXTOP=6*NLEV
|
|
DO 7505 I=IX,IXTOP
|
|
7505 JLEV(I)=JLEV(I)+IOFF
|
|
C
|
|
C NEED TO SET JMIN,JMAX FOR USE IN SELECTING ORBITAL L IN BASE
|
|
JMIN=JLEV(1)
|
|
JMAX=JMIN
|
|
DO 7510 I=1,NLEV
|
|
JMIN=MIN(JMIN,JLEV(I))
|
|
7510 JMAX=MAX(JMAX,JLEV(I))
|
|
C
|
|
C MAKE SURE THAT WE HAVE FOUND AN ASYMMETRIC ROTOR WFN FOR
|
|
C ALL NLEVEL JLEVEL() SETS. UNLIKE ITYPE=6, WE DO NOT REORDER
|
|
DO 7600 I=1,NLEVEL
|
|
DO 7601 IX=1,NLEV
|
|
IF (JLEV(7*NLEV+IX).EQ.IX) GO TO 7600
|
|
7601 CONTINUE
|
|
WRITE(6,660) I,JLEVEL(3*I-2),JLEVEL(3*I-1)
|
|
660 FORMAT(/' *** SET4. DID NOT FIND BASIS FUNCTIONS FOR LEVEL',I4/
|
|
1 ' JI,ITAU =',2I6)
|
|
STOP
|
|
7600 CONTINUE
|
|
C INCREMENT IXNEXT TO REFLECT ATAU STORAGE
|
|
IXNEXT=IXNEXT+NKVAL
|
|
RETURN
|
|
C
|
|
END
|
|
SUBROUTINE SET6(LEVIN,EIN,NLEV,JLEV,ATAU,EFACT,IUNIT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C REVISED FOR VERSION 14:
|
|
C THREE POSSIBLE METHODS OF SPECIFYING ASYMMETRIC TOP LEVELS
|
|
C 1. A,B,C .GT.0 IMPLIES GENERATE VIA SET6C
|
|
C 2. NLEVEL.GE.0 IMPLIES READ FROM IASYMU (FILTER ON JMIN,JMAX,
|
|
C JSTEP,EMAX); IF (NLEVEL.EQ.0) READ TO END-OF-FILE
|
|
C 3. NLEVEL.LT.0 IMPLIES READ FROM IASYMU BUT ACCEPT ONLY THOSE
|
|
C J,ITAU CORRESPONDING TO JLEVEL(2*I-1),JLEVEL(2*I),
|
|
C I=1,ABS(NLEVEL)
|
|
C
|
|
C BELOW REPLACES GENERIC SAVE IN V11, WHICH APPEARED UNNECESSARY.
|
|
SAVE IFIRST,NOMEM,NL12,IXMX,ISTART
|
|
C
|
|
C THIS ROUTINE HANDLES INPUT, ALSO MATRIX ELEMENTS FOR ITYPE=6.
|
|
C LATTER ARE OBTAINED VIA ENTRIES ASYME, CPL6, CPL26.
|
|
C FIRST VERSION WRITTEN AT MPI, MUNCHEN, JULY 1976.
|
|
C CURRENT VERSION 11 MAR 93 SAVES COUPLING ELEMENTS IN X ARRAY
|
|
C ASYME (EFF. POTL) COULD BE CHANGED, BUT PROBABLY NO LONGER USED
|
|
C
|
|
C N.B. NKVAL HERE COULD BE OBTAINED AS NEEDED - NK=2*J+1.
|
|
C THIS CODE IS MORE FLEXIBLE AS NOT ALL NEED BE STORED BUT
|
|
C K-VALUE COULD BE OBTAINED VIA ADDITIONAL VECTOR KVAL(IST+1).
|
|
C
|
|
LOGICAL LEVIN,EIN
|
|
LOGICAL LIN
|
|
LOGICAL NOMEM,ODD
|
|
INTEGER JLEV(2)
|
|
DIMENSION ATAU(2)
|
|
C N.B. JLEV AND ATAU OCCUPY SAME STORAGE PASSED FROM DRIVER/BASIS.
|
|
C IXNEXT MUST BE INCREMENTED TO REFLECT *ATAU* STORAGE USED
|
|
C (BUT NOT JLEV, BECAUSE BASIN INCREMENTS IXNEXT BY NQN*NLEV)
|
|
C
|
|
C SPECIFICATIONS FOR ASYME, CPL6, CPL26 ENTRIES.
|
|
INTEGER J(N),L(N),LAM(2)
|
|
DIMENSION VL(2)
|
|
INTEGER PRINT
|
|
LOGICAL LFIRST
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
COMMON /VLSAVE/ IVLU
|
|
C
|
|
COMMON /CMBASE/ AE(2),BE(2),CE(2),ROTI(6),ELEVEL(1000),EMAX,
|
|
& WT(2),SPNUC,NLEVEL,JLEVEL(4000),JMIN,JMAX,JSTEP,ISYM(10),
|
|
& J2MIN,J2MAX,J2STEP,ISYM2(10),JHALF,IDENT,MXJL,MXEL
|
|
C
|
|
C DEFAULT INPUT UNIT IS STANDARD INPUT ...
|
|
DATA IDU/5/
|
|
DATA PI/3.14159 26535 89793 D0/
|
|
DATA EPS/1.D-9/, Z0/0.D0/
|
|
C
|
|
C STATEMENT FUNCTIONS
|
|
F(NN)=DBLE(NN+NN+1)
|
|
ODD(I)=I-2*(I/2).NE.0
|
|
C
|
|
C CHECK FOR CORRECT IV() FLAG IN INITIALIZATION ENTRY
|
|
IF (IVLFL.NE.0) THEN
|
|
WRITE(6,690) IVLFL
|
|
690 FORMAT(/' SET6 (JAN 93). ILLEGAL IVLFL =',I6)
|
|
STOP
|
|
ENDIF
|
|
C
|
|
C IF ROTATION CONSTANTS ARE INPUT, GENERATE BASIS VIA SET6C
|
|
IF (AE(1).GT.0.D0 .AND. BE(1).GT.0.D0 .AND. CE(1).GT.0.D0) THEN
|
|
CALL SET6C(JLEV,ATAU,NLEV,EIN)
|
|
C OPTION ADDED (AUG 94) TO OUTPUT ROTOR WFNS TO IASYMU
|
|
IF (IUNIT.LE.0.OR.IUNIT.GE.100.OR.IUNIT.EQ.IDU) RETURN
|
|
WRITE(6,*) ' *** SET6 WILL OUTPUT ROTOR WAVEFUNCTIONS TO UNIT',
|
|
1 IUNIT
|
|
WRITE(6,*) ' IN FORMAT FOR FUTURE INPUT'
|
|
DO 1011 I=1,NLEV
|
|
JI=JLEV(I)
|
|
ITAU=JLEV(NLEV+I)
|
|
ISTA=JLEV(3*NLEV+I)
|
|
NK=JLEV(4*NLEV+I)
|
|
INDX=JLEV(5*NLEV+I)
|
|
WRITE(IUNIT,500,ERR=1099) JI,ITAU,ELEVEL(INDX)
|
|
1011 WRITE(IUNIT,501,ERR=1099) (ATAU(ISTA+II),II=1,NK)
|
|
RETURN
|
|
1099 WRITE(6,*) ' *** SET6. ERROR WRITING TO IASYMU; WFNS NOT SAVED'
|
|
RETURN
|
|
ENDIF
|
|
C
|
|
C OTHERWISE, INPUT FROM UNIT IASYMU
|
|
IF (IUNIT.GT.0 .AND. IUNIT.LT.100) GO TO 1000
|
|
WRITE(6,601) IUNIT,IDU
|
|
601 FORMAT(/' ILLEGAL UNIT =',I12,' SPECIFIED FOR IASYMU, ',
|
|
1 'DEFAULTED TO ',I4)
|
|
IUNIT=IDU
|
|
C
|
|
1000 WRITE(6,602) IUNIT
|
|
602 FORMAT(/' ASYMMETRIC TOP BASIS WILL BE INPUT FROM UNIT IASYMU =',
|
|
1 I4)
|
|
LIN=.FALSE.
|
|
IF (LEVIN) THEN
|
|
NREAD=NLEVEL
|
|
WRITE(6,603) NLEVEL
|
|
603 FORMAT(' ',10X,I6,' INPUT LEVELS SPECIFIED BY NLEVEL.')
|
|
ELSE
|
|
IF (IUNIT.EQ.IDU) THEN
|
|
WRITE(6,*) ' *** SET6. CANNOT READ FROM STD INPUT FOR',
|
|
1 ' NLEVEL.LE.0'
|
|
STOP
|
|
ENDIF
|
|
NREAD=1000000
|
|
IF (NLEVEL.LT.0) THEN
|
|
LIN=.TRUE.
|
|
WRITE(6,613) NLEVEL
|
|
613 FORMAT(5X,'NEGATIVE NLEVEL =',I5,
|
|
1 ' WILL SCREEN INPUT ON &BASIS JLEVEL()')
|
|
NLEVEL=-NLEVEL
|
|
IF (EIN) THEN
|
|
WRITE(6,*) ' ENERGIES TAKEN FROM &BASIS ELEVEL'
|
|
ELSE
|
|
WRITE(6,*) ' ENERGIES TAKEN FROM IASYMU'
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
C
|
|
NLEV=0
|
|
IOFF=0
|
|
NKVAL=0
|
|
DO 2000 III=1,NREAD
|
|
READ(IUNIT,500,END=9000) JI,ITAU,EINP
|
|
500 FORMAT(2I5,F15.10)
|
|
NLEV=NLEV+1
|
|
IF (NLEV.GT.MXEL) THEN
|
|
WRITE(6,*) ' *** SET6. DIMENSION OF ELEVEL EXCEEDED',NLEV
|
|
STOP
|
|
ENDIF
|
|
JI=IABS(JI)
|
|
NK=2*JI+1
|
|
IF (LIN) THEN
|
|
C CODE BELOW FILTERS IASYMU INPUT ON JLEVEL
|
|
DO 2099 IND=1,NLEVEL
|
|
IF (JLEVEL(2*IND-1).NE.JI.OR.JLEVEL(2*IND).NE.ITAU) GO TO 2099
|
|
INDX=IND
|
|
IF (.NOT.EIN) ELEVEL(INDX)=EINP*EFACT
|
|
GO TO 2090
|
|
2099 CONTINUE
|
|
WRITE(6,683) JI,ITAU,EINP
|
|
683 FORMAT('0 INPUT LEVEL J, TAU, E =',2I5,F13.3,' SKIPPED.',
|
|
1 ' NOT IN JLEVEL LIST')
|
|
GO TO 2070
|
|
ELSE
|
|
ELEVEL(NLEV)=EINP*EFACT
|
|
C SEE IF WE SHOULD SKIP ON JMIN,JMAX,JSTEP OR EMAX
|
|
IF (JMAX.LE.0) GO TO 2080
|
|
JDIF=JI-JMIN
|
|
JDIF=JDIF-JSTEP*(JDIF/JSTEP)
|
|
IF (JDIF.EQ.0 .AND. JI.GE.JMIN .AND. JI.LE.JMAX) GO TO 2080
|
|
WRITE(6,681) JI,ITAU,ELEVEL(NLEV),JMIN,JSTEP,JMAX
|
|
681 FORMAT('0 INPUT LEVEL J, TAU, E =',2I5,F13.3,' SKIPPED. ',
|
|
1 'J NOT IN RANGE',I4,' (',I4,')',I4)
|
|
GO TO 2070
|
|
2080 IF (EMAX.LE.0.D0) GO TO 2090
|
|
IF (ELEVEL(NLEV).LE.EMAX) GO TO 2090
|
|
WRITE(6,680) JI,ITAU,ELEVEL(NLEV),EMAX
|
|
680 FORMAT('0 INPUT LEVEL J, TAU, E =',2I5,F13.3,' SKIPPED ',
|
|
1 'DUE TO EMAX =',F11.3)
|
|
ENDIF
|
|
C
|
|
C REACH BELOW IF WE ARE SKIPPING THIS SET
|
|
2070 NLEV=NLEV-1
|
|
READ( IUNIT,501,END=9100) (ATAUX,I=1,NK)
|
|
GO TO 2000
|
|
C
|
|
C READ BELOW IF WE ARE INCLUDING THIS SET
|
|
2090 CONTINUE
|
|
C SHIFT ATAU BY 6 WORDS TO MAKE ROOM FOR INCOMING JLEV.
|
|
IOFF=IOFF+6
|
|
DO 2020 I=1,NKVAL
|
|
2020 ATAU(IOFF+NKVAL+1-I)=ATAU(IOFF+NKVAL-5-I)
|
|
INST=IOFF+NKVAL
|
|
READ(IUNIT,501,END=9100) (ATAU(INST+I),I=1,NK)
|
|
501 FORMAT(6F12.8)
|
|
C OUTPUT INFORMATION READ.
|
|
WRITE(6,604) NLEV,JI,ITAU,EINP,ELEVEL(NLEV)
|
|
604 FORMAT('0 INPUT LEVEL',I4,' J, TAU =',2I4,' ENERGY =',F15.5,
|
|
& ' = ',F15.5,' (1/CM)')
|
|
MJI=-JI
|
|
WRITE(6,605) (ATAU(INST+1+JI+I),I, I=MJI,JI)
|
|
605 FORMAT(10X,'INPUT COEFFICIENTS ARE'/(10X,6(F12.6,'(',I3,')')))
|
|
C
|
|
C GET PARITY CODE FROM ATAU SYMMETRIES. . .
|
|
IPAR=IPASYM(JI,NK,ATAU(INST+1))
|
|
C IPAR=-1 IS ERROR RETURN FROM IPASYM.
|
|
IF (IPAR.NE.-1) GO TO 2001
|
|
WRITE(6,699)
|
|
STOP
|
|
C REORDER JLEV TO RECEIVE NEW ROW.
|
|
2001 NRM1=NLEV-1
|
|
IF (NRM1.LE.0) GO TO 2100
|
|
IOLD=6*NRM1
|
|
IX=6*NLEV
|
|
DO 2110 II=1,6
|
|
IX=IX-1
|
|
DO 2120 I=1,NRM1
|
|
JLEV(IX)=JLEV(IOLD)
|
|
IX=IX-1
|
|
2120 IOLD=IOLD-1
|
|
2110 CONTINUE
|
|
C
|
|
2100 JLEV(NLEV)=JI
|
|
JLEV(2*NLEV)=ITAU
|
|
JLEV(3*NLEV)=IPAR
|
|
JLEV(4*NLEV)=NKVAL
|
|
JLEV(5*NLEV)=NK
|
|
IF (LIN) THEN
|
|
JLEV(6*NLEV)=INDX
|
|
ELSE
|
|
JLEV(6*NLEV)=NLEV
|
|
ENDIF
|
|
NKVAL=NKVAL+NK
|
|
GO TO 2000
|
|
C
|
|
C * * * END OF FILE CONDITIONS * * *
|
|
9000 IF (LEVIN) GO TO 2200
|
|
WRITE(6,606) IUNIT,NLEV
|
|
606 FORMAT('0 END OF FILE ENCOUNTERED ON UNIT',I4,' AFTER',I5,
|
|
& ' FUNCTIONS.')
|
|
GO TO 2400
|
|
2200 WRITE(6,607) IUNIT,NLEV
|
|
607 FORMAT('0 PREMATURE E.O.F. ON UNIT',I4,'. NLEVEL REDUCED TO',I6)
|
|
GO TO 2400
|
|
9100 WRITE(6,608) IUNIT,NLEV
|
|
608 FORMAT('0 * * * ERROR. E.O.F. ON UNIT',I4,' BEFORE ATAU CARDS F
|
|
&OR NLEV =',I5)
|
|
WRITE(6,699)
|
|
699 FORMAT('0 * * * TERMINAL ERROR.')
|
|
STOP
|
|
2000 CONTINUE
|
|
C THIS COMPLETES READ(IASYMU) LOOP
|
|
C
|
|
2400 IF (LIN) THEN
|
|
C WE FILTERED ON JLEVEL(), MAKE SURE WE HAVE THEM ALL
|
|
IF (NLEV.NE.NLEVEL) THEN
|
|
WRITE(6,*) ' ALL LEVELS SPECIFIED BY JLEVEL() WERE NOT FOUND'
|
|
WRITE(6,*) ' *** TERMINAL ERROR.'
|
|
STOP
|
|
ENDIF
|
|
C MAKE SURE EACH VALUE IS THERE AND REORDER IF NECESSARY
|
|
C SO THAT JLEV(I,6)=I (EXPECTED BY PRBR, EG)
|
|
DO 2409 I=1,NLEVEL
|
|
DO 2408 IX=1,NLEV
|
|
IF (I.NE.JLEV(5*NLEV+IX)) GO TO 2408
|
|
IF (I.EQ.IX) GO TO 2409
|
|
DO 2407 IC=1,6
|
|
ITMP=JLEV((IC-1)*NLEV+I)
|
|
JLEV((IC-1)*NLEV+I)=JLEV((IC-1)*NLEV+IX)
|
|
2407 JLEV((IC-1)*NLEV+IX)=ITMP
|
|
GO TO 2409
|
|
2408 CONTINUE
|
|
WRITE(6,684) I,JLEVEL(2*I-1),JLEVEL(2*I)
|
|
684 FORMAT(' INPUT SET',I4,' J, TAU =',2I5,' NOT FOUND ON IASYMU'
|
|
1 /' *** TERMINAL ERROR')
|
|
STOP
|
|
2409 CONTINUE
|
|
ELSE
|
|
C SET J,TAU INTO JLEVEL; GET JMIN,JMAX (ARE THOSE NEEDED?)
|
|
NLEVEL=NLEV
|
|
C SET JLEVEL(), JMIN, AND JMAX.
|
|
JMIN=JLEV(1)
|
|
JMAX=JMIN
|
|
DO 2401 I=1,NLEV
|
|
JI=JLEV(I)
|
|
JLEVEL(2*I-1)=JI
|
|
JLEVEL(2*I)=JLEV(I+NLEV)
|
|
JMIN=MIN0(JMIN,JI)
|
|
2401 JMAX=MAX0(JMAX,JI)
|
|
ENDIF
|
|
C CORRECT JLEV(LEV,4) FOR SPACE TAKEN BY JLEV. . .
|
|
IF (IOFF.NE.6*NLEV) THEN
|
|
WRITE(6,698) IOFF, NLEV
|
|
698 FORMAT(' SET6. INDEXING ERROR. IOFF,NLEV =',2I6)
|
|
STOP
|
|
ENDIF
|
|
IX=3*NLEV+1
|
|
IXTOP=4*NLEV
|
|
DO 2410 I=IX,IXTOP
|
|
2410 JLEV(I)=JLEV(I)+IOFF
|
|
C CHECK THAT FUNCTIONS ARE ORTHOGONAL
|
|
CALL CHECK6(NLEV,JLEV,ATAU)
|
|
C CHECK THAT ENERGIES ARE NOT ALL IDENTICALLY ZERO.
|
|
DO 2500 I=1,NLEV
|
|
IF (ELEVEL(I).NE.0.D0) GO TO 2510
|
|
2500 CONTINUE
|
|
IF (NLEVEL.GT.1) THEN
|
|
WRITE(6,609)
|
|
609 FORMAT(' *** WARNING. SET6. ENERGIES ARE ALL ZERO')
|
|
ENDIF
|
|
2510 IXNEXT=IXNEXT+NKVAL
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
C THESE ENTRY POINTS COMPUTE COUPLING MATRIX ELEMENTS . . .
|
|
C
|
|
ENTRY ASYME(N,J,L,MXLAM,LAM,VL,IV,JLEV,ATAU,NLEV)
|
|
ASSIGN 3003 TO IGO1
|
|
ASSIGN 3033 TO IGO2
|
|
GO TO 3000
|
|
C
|
|
ENTRY CPL6(N,J,L,JTOT,MXLAM,LAM,VL,JLEV,ATAU,NLEV,PRINT,LFIRST)
|
|
IF (LFIRST) THEN
|
|
IFIRST=-1
|
|
LFIRST=.FALSE.
|
|
NOMEM=.FALSE.
|
|
ENDIF
|
|
IF (IFIRST.GT.-1) GO TO 5500
|
|
IF (NOMEM) GO TO 5900
|
|
NL12=NLEV*(NLEV+1)/2
|
|
IXMX=NL12*MXLAM
|
|
ISTART=MX+1
|
|
NAVAIL=ISTART-IXNEXT
|
|
IF (IXMX.LE.NAVAIL) GO TO 5100
|
|
IF (PRINT.GE.3) WRITE(6,694) IXMX,NAVAIL
|
|
694 FORMAT(/' CPL6 (MAR 93). UNABLE TO STORE JTOT-INDEPENDENT PART'
|
|
1 /' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
NOMEM=.TRUE.
|
|
GO TO 5900
|
|
5100 IX=0
|
|
DO 5200 LL=1,MXLAM
|
|
LM=LAM(2*LL-1)
|
|
XLM=LM
|
|
MU=LAM(2*LL)
|
|
XMU=MU
|
|
DO 5201 IC=1,NLEV
|
|
JC=JLEV(IC)
|
|
XJC=JC
|
|
ISTC=JLEV(IC+3*NLEV)
|
|
NKC=JLEV(IC+4*NLEV)
|
|
DO 5201 IR=1,IC
|
|
IX=IX+1
|
|
JR=JLEV(IR)
|
|
XJR=JR
|
|
ISTR=JLEV(IR+3*NLEV)
|
|
NKR=JLEV(IR+4*NLEV)
|
|
XCPL=Z0
|
|
KKC=-JC
|
|
DO 5300 KC=1,NKC
|
|
C SKIP IMMEDIATELY IF COEFFICIENT IS SMALL.
|
|
IF (ABS(ATAU(ISTC+KC)).LE.EPS) GO TO 5300
|
|
XKC=KKC
|
|
KKR=-JR
|
|
DO 5400 KR=1,NKR
|
|
C SKIP IMMEDIATELY IF COEFFICIENT IS SMALL.
|
|
IF (ABS(ATAU(ISTR+KR)).LE.EPS) GO TO 5400
|
|
XKR=KKR
|
|
C AF=ATAU(ISTR+KR)*ATAU(ISTC+KC)*PARITY3(KKR)
|
|
AF=ATAU(ISTR+KR)*ATAU(ISTC+KC)
|
|
IF (ODD(KKR)) AF=-AF
|
|
IF (KKR-KKC.NE.MU) GO TO 5401
|
|
XCPL=XCPL+AF*THRJ(XJC,XJR,XLM,XKC,-XKR,XMU)
|
|
IF (MU.EQ.0) GO TO 5400
|
|
5401 IF (KKC-KKR.NE.MU) GO TO 5400
|
|
C ADJUST FOR (-1)**MU IN POTENTIAL. . .
|
|
C AF=AF*PARITY3(MU)
|
|
IF (ODD(MU)) AF=-AF
|
|
XCPL=XCPL+AF*THRJ(XJC,XJR,XLM,XKC,-XKR,-XMU)
|
|
5400 KKR=KKR+1
|
|
5300 KKC=KKC+1
|
|
C NOW GET 'CONSTANT FACTORS'
|
|
XFCT=PARITY3(JC+JR)*SQRT((F(JC)*F(JR)*F(LM))/(4.D0*PI))
|
|
5201 X(ISTART-IX)=XCPL*XFCT
|
|
5200 CONTINUE
|
|
IF (PRINT.GT.3) WRITE(6,695) IXMX
|
|
695 FORMAT(/' CPL6 (MAR 93). JTOT-INDEPENDENT PARTS OF COUPLING',
|
|
1 ' MATRIX STORED.'/
|
|
2 ' REQUIRED STORAGE =',I8)
|
|
C RESET MX, IFIRST TO REFLECT STORED VALUES
|
|
MX=MX-IXMX
|
|
IFIRST=0
|
|
C
|
|
C NOW GET COUPLING MATRIX ELEMENTS FROM STORED PARTS
|
|
5500 PJT=PARITY3(JTOT)
|
|
IF (IVLU.GT.0) REWIND IVLU
|
|
DO 5600 LL=1,MXLAM
|
|
LM=LAM(2*LL-1)
|
|
MU=LAM(2*LL)
|
|
C
|
|
C STORAGE FOR 3J AND 6J SYMBOLS
|
|
C
|
|
ITL=IXNEXT
|
|
IT6=ITL+2*LM+1
|
|
IXNEXT=IT6+2*LM+1
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
IX1=(LL-1)*NL12
|
|
NNZ=0
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=LL
|
|
ELSE
|
|
IX=1
|
|
ENDIF
|
|
C
|
|
LSAV=-1
|
|
DO 5700 IC=1,N
|
|
LEVC=J(IC)
|
|
JC=JLEV(LEVC)
|
|
LC=L(IC)
|
|
IF (LC.NE.LSAV) THEN
|
|
CALL J3J000(DBLE(LC),DBLE(LM),IVALL,X(ITL),XLMIN)
|
|
LMIN=IABS(LC-LM)
|
|
LMAX=LC+LM
|
|
LSAV=LC
|
|
ENDIF
|
|
C
|
|
LSAV6=-1
|
|
DO 5700 IR=1,IC
|
|
LEVR=J(IR)
|
|
JR=JLEV(LEVR)
|
|
LR=L(IR)
|
|
C
|
|
IF (LEVR.GE.LEVC) THEN
|
|
IX2=LEVR*(LEVR-1)/2+LEVC
|
|
ELSE
|
|
IX2=LEVC*(LEVC-1)/2+LEVR
|
|
ENDIF
|
|
INDX=IX1+IX2
|
|
C
|
|
IF (X(ISTART-INDX).EQ.0.D0
|
|
1 .OR. LR.LT.LMIN .OR. LR.GT.LMAX
|
|
2 .OR. ODD(LR+LMAX)) THEN
|
|
VL(IX)=0.D0
|
|
ELSE
|
|
IF (LR.NE.LSAV6) THEN
|
|
IVAL6=MX-IT6+1
|
|
CALL J6J(DBLE(LR),DBLE(JTOT),DBLE(LC),DBLE(JC),DBLE(LM),
|
|
1 IVAL6,XJMIN6,X(IT6))
|
|
JMIN6=INT(XJMIN6)
|
|
LSAV6=LR
|
|
ENDIF
|
|
IF (JR.LT.JMIN6 .OR. JR.GE.JMIN6+IVAL6) THEN
|
|
VL(IX)=0.D0
|
|
ELSE
|
|
INDL=ITL+(LR-LMIN)/2
|
|
IND6=IT6+JR-JMIN6
|
|
VL(IX)=PJT*SQRT(F(LC)*F(LR))*X(ISTART-INDX)*X(INDL)*X(IND6)
|
|
ENDIF
|
|
ENDIF
|
|
IF (VL(IX).NE.0.D0) NNZ=NNZ+1
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=IX+MXLAM
|
|
ELSE
|
|
IX=IX+1
|
|
ENDIF
|
|
5700 CONTINUE
|
|
IF (NNZ.EQ.0) WRITE(6,697) LM,MU
|
|
IF (IVLU.GT.0) WRITE(IVLU) (VL(I),I=1,N*(N+1)/2)
|
|
IXNEXT=ITL
|
|
5600 CONTINUE
|
|
RETURN
|
|
C
|
|
C IF WE CANNOT STORE PARTIAL COUPLING MATRIX, RECALCULATE.
|
|
5900 ASSIGN 3001 TO IGO1
|
|
ASSIGN 3011 TO IGO2
|
|
GO TO 3000
|
|
C
|
|
ENTRY CPL26(N,MXLAM,LAM,NLEV,JLEV,ATAU,J,MVAL,VL,PRINT,LFIRST)
|
|
C
|
|
C IF LFIRST IS TRUE (FIRST CALL), DO SOME INITIALIZATION
|
|
IF (LFIRST) THEN
|
|
IFIRST=-1
|
|
LFIRST=.FALSE.
|
|
NOMEM=.FALSE.
|
|
ENDIF
|
|
C
|
|
IF (IFIRST.GT.-1) GO TO 4500
|
|
C FIRST TIME THROUGH SET UP SOME STORAGE POINTERS
|
|
NL12=NLEV*(NLEV+1)/2
|
|
IXMX=NL12*MXLAM
|
|
ISTART=MX+1
|
|
C
|
|
4500 MVABS=IABS(MVAL)
|
|
C SEE IF VALUES ARE STORED FOR THIS HIGH AN MVALUE
|
|
C IF NOT, TRY TO STORE THEM IN XCPL().
|
|
IF (MVABS.LE.IFIRST.OR.NOMEM) GO TO 4900
|
|
MV=IFIRST+1
|
|
C FIRST CHECK THAT WE STILL HAVE A CONTINUOUS BLOCK OF HI MEMORY.
|
|
4600 IF (MX.EQ.ISTART-(IFIRST+1)*IXMX-1) GO TO 4610
|
|
IF (PRINT.GE.1) WRITE(6,642) MV,ISTART-1,MX,IXMX*(IFIRST+1)
|
|
642 FORMAT(/' CPL26 (FEB 93). HIGH MEMORY FRAGMENTED. CANNOT',
|
|
1 ' STORE COUPLING COEFFS FOR MVAL=',I3/ 19X,
|
|
2 'ORIGINAL MINUS CURRENT MEMORY LIMITS .NE. NO. USED =',3I12)
|
|
NOMEM=.TRUE.
|
|
GO TO 4900
|
|
C TEST FOR AVAILABLE STORAGE; NEED IXMX FOR THIS MVAL
|
|
4610 NAVAIL=MX-IXNEXT+1
|
|
IF (IXMX.LE.NAVAIL) GO TO 4601
|
|
IF (PRINT.GE.3) WRITE(6,692) MV,IXMX,NAVAIL
|
|
692 FORMAT(/' CPL26 (FEB 93). UNABLE TO STORE 3-J VALUES FOR MVAL='
|
|
1 ,I3/' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C SET NOMEM TO REFLECT INABILITY TO ADD MORE M-VALUES
|
|
NOMEM=.TRUE.
|
|
GO TO 4900
|
|
C
|
|
C REDUCE 'TOP OF MEMORY' AND STORE COUPLING VALUES FOR THIS MVAL
|
|
4601 MX=MX-IXMX
|
|
C START INDEX AFTER M-BLOCKS ALREADY STORED (STARTING WITH MV=0)
|
|
IX=MV*IXMX
|
|
DO 4200 LL=1,MXLAM
|
|
LM=LAM(2*LL-1)
|
|
MU=LAM(2*LL)
|
|
DO 4201 IC=1,NLEV
|
|
JC=JLEV(IC)
|
|
ISTC=JLEV(IC+3*NLEV)
|
|
NKC=JLEV(IC+4*NLEV)
|
|
DO 4201 IR=1,IC
|
|
JR=JLEV(IR)
|
|
ISTR=JLEV(IR+3*NLEV)
|
|
NKR=JLEV(IR+4*NLEV)
|
|
IX=IX+1
|
|
XCPL=Z0
|
|
KKC=-JC
|
|
DO 4300 KC=1,NKC
|
|
C SKIP IMMEDIATELY IF COEFFICIENT IS SMALL.
|
|
IF (ABS(ATAU(ISTC+KC)).LE.EPS) GO TO 4300
|
|
KKR=-JR
|
|
DO 4400 KR=1,NKR
|
|
C SKIP IMMEDIATELY IF COEFFICIENT IS SMALL.
|
|
IF (ABS(ATAU(ISTR+KR)).LE.EPS) GO TO 4400
|
|
AF=ATAU(ISTR+KR)*ATAU(ISTC+KC)
|
|
IF (KKR-KKC.NE.MU) GO TO 4401
|
|
XCPL=XCPL+AF*GSYMTP(JC,KKC,JR,KKR,MV ,LM,MU)
|
|
IF (MU.EQ.0) GO TO 4400
|
|
4401 IF (KKC-KKR.NE.MU) GO TO 4400
|
|
C ADJUST FOR (-1)**MU IN POTENTIAL. . .
|
|
C AF=AF*PARITY3(MU)
|
|
IF (ODD(MU)) AF=-AF
|
|
XCPL=XCPL+AF*GSYMTP(JC,KKC,JR,KKR,MV,LM,-MU)
|
|
4400 KKR=KKR+1
|
|
4300 KKC=KKC+1
|
|
4201 X(ISTART-IX)=XCPL
|
|
4200 CONTINUE
|
|
IF (PRINT.GT.3) WRITE(6,693) MV,IXMX,NAVAIL
|
|
693 FORMAT(/' CPL26 (FEB 93). 3-J VALUES STORED FOR MVAL =',I3
|
|
1 /' REQUIRED AND AVAILABLE STORAGE =',2I9)
|
|
C RESET IFIRST TO REFLECT HIGHEST M-VALUE STORED.
|
|
IFIRST=MV
|
|
C SEE IF CURRENT MVALUE REQUIRES MORE STORED M-VALUES.
|
|
MV=MV+1
|
|
IF (MV.LE.MVABS) GO TO 4600
|
|
C
|
|
4900 IF (MVABS.GT.IFIRST) GO TO 4800
|
|
C MVABS.LE.IFIRST. COEFFS STORED. FILL VL() FROM XCPL
|
|
IXM=MVABS*IXMX
|
|
IF (IVLU.GT.0) REWIND IVLU
|
|
DO 4513 LL=1,MXLAM
|
|
LM=LAM(2*LL-1)
|
|
NNZ=0
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=LL
|
|
ELSE
|
|
IX=1
|
|
ENDIF
|
|
DO 4503 ICOL=1,N
|
|
I1=J(ICOL)
|
|
J1=JLEV(I1)
|
|
DO 4503 IROW=1,ICOL
|
|
I2=J(IROW)
|
|
J2=JLEV(I2)
|
|
IF (I1.GT.I2) THEN
|
|
IX12=I1*(I1-1)/2+I2
|
|
ELSE
|
|
IX12=I2*(I2-1)/2+I1
|
|
ENDIF
|
|
IXX=IXM+(LL-1)*NL12+IX12
|
|
VL(IX)=X(ISTART-IXX)
|
|
C WE HAVE STORED COUPLING FOR POSITIVE MVALUES; CORRECT IF NECESSARY
|
|
C FOR PARITY OF THRJ(J1,LM,J2,-MVAL,0,MVAL)
|
|
IF (MVAL.LT.0.AND.ODD(J1+J2+LM)) VL(IX)=-VL(IX)
|
|
IF (VL(IX).NE.Z0) NNZ=NNZ+1
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=IX+MXLAM
|
|
ELSE
|
|
IX=IX+1
|
|
ENDIF
|
|
4503 CONTINUE
|
|
IF (NNZ.LE.0 .AND. PRINT.GE.3) WRITE(6,612) MVAL,LL
|
|
612 FORMAT(' * * * NOTE. FOR MVALUE, SYM =',2I4,', ALL COUPLING ',
|
|
& 'COEFFICIENTS ARE 0.')
|
|
IF (IVLU.GT.0) WRITE(IVLU) (VL(I),I=1,N*(N+1)/2)
|
|
4513 CONTINUE
|
|
RETURN
|
|
C
|
|
C MV.GT.IFIRST ==> VALUES NOT STORED. CALCULATE THEM VIA OLD CODE
|
|
4800 ASSIGN 3002 TO IGO1
|
|
ASSIGN 3022 TO IGO2
|
|
GO TO 3000
|
|
C
|
|
C -------------------- OLD CODE REJOINS HERE ---------------------
|
|
C
|
|
3000 IF (IVLU.GT.0) REWIND IVLU
|
|
DO 3100 LL=1,MXLAM
|
|
LM=LAM(2*LL-1)
|
|
MU=LAM(2*LL)
|
|
NNZ=0
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=LL
|
|
ELSE
|
|
IX=1
|
|
ENDIF
|
|
C
|
|
DO 3200 IC=1,N
|
|
JC=JLEV(J(IC))
|
|
ISTC=JLEV(J(IC)+3*NLEV)
|
|
NKC=JLEV(J(IC)+4*NLEV)
|
|
DO 3200 IR=1,IC
|
|
JR=JLEV(J(IR))
|
|
ISTR=JLEV(J(IR)+3*NLEV)
|
|
NKR=JLEV(J(IR)+4*NLEV)
|
|
C
|
|
VL(IX)=0.D0
|
|
KKC=-JC
|
|
DO 3300 KC=1,NKC
|
|
C SKIP IMMEDIATELY IF COEFFICIENT IS SMALL.
|
|
IF (ABS(ATAU(ISTC+KC)).LE.EPS) GO TO 3300
|
|
KKR=-JR
|
|
DO 3400 KR=1,NKR
|
|
C SKIP IMMEDIATELY IF COEFFICIENT IS SMALL.
|
|
IF (ABS(ATAU(ISTR+KR)).LE.EPS) GO TO 3400
|
|
AF=ATAU(ISTR+KR)*ATAU(ISTC+KC)
|
|
IF (KKR-KKC.NE.MU) GO TO 3500
|
|
GO TO IGO1,(3001,3002,3003)
|
|
3001 VL(IX)=VL(IX)+AF*FSYMTP(JC,KKC,L(IC),JR,KKR,L(IR),JTOT,LM,MU)
|
|
GO TO 3009
|
|
3002 VL(IX)=VL(IX)+AF*GSYMTP(JC,KKC,JR,KKR,MVAL,LM,MU)
|
|
GO TO 3009
|
|
3003 VL(IX)=VL(IX)+AF*ESYMTP(JC,KKC,JR,KKR,LM,MU)
|
|
C
|
|
3009 IF (MU.EQ.0) GO TO 3400
|
|
3500 IF (KKC-KKR.NE.MU) GO TO 3400
|
|
C ADJUST FOR (-1)**MU IN POTENTIAL. . .
|
|
AF=AF*PARITY3(MU)
|
|
GO TO IGO2,(3011,3022,3033)
|
|
3011 VL(IX)=VL(IX)+AF*FSYMTP(JC,KKC,L(IC),JR,KKR,L(IR),JTOT,LM,-MU)
|
|
GO TO 3400
|
|
3022 VL(IX)=VL(IX)+AF*GSYMTP(JC,KKC,JR,KKR,MVAL,LM,-MU)
|
|
GO TO 3400
|
|
3033 VL(IX)=VL(IX)+AF*ESYMTP(JC,KKC,JR,KKR,LM,-MU)
|
|
C
|
|
3400 KKR=KKR+1
|
|
3300 KKC=KKC+1
|
|
IF (VL(IX).NE.0.D0) NNZ=NNZ+1
|
|
IF (IVLU.EQ.0) THEN
|
|
IX=IX+MXLAM
|
|
ELSE
|
|
IX=IX+1
|
|
ENDIF
|
|
3200 CONTINUE
|
|
IF (NNZ.EQ.0) WRITE(6,697) LM,MU
|
|
697 FORMAT(' * * * NOTE. ALL COUPLING COEFFICIENTS ARE ZERO FOR ',
|
|
& 'LAMBDA, MU =', 2I4)
|
|
IF (IVLU.GT.0) WRITE(IVLU) (VL(I),I=1,N*(N+1)/2)
|
|
3100 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE SET6C(JLEV,ATAU,NLEV,EIN)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C save statement should be unnec; only called once (sg aug 94)
|
|
SAVE
|
|
LOGICAL EIN
|
|
DIMENSION JLEV(1),ATAU(1)
|
|
DIMENSION ROTI(12),WT(2),ELEVEL(1000),JLEVEL(4000)
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C MODS 11 JUL 94 FOR V14 CMBASE
|
|
C n.b IPAR was equivalenced to J2MAX, now to ISYM(1)
|
|
EQUIVALENCE (IPAR,ISYM(1))
|
|
COMMON /CMBASE/ ROTI,ELEVEL,EMAX,WT,SPNUC,
|
|
1 NLEVEL,JLEVEL,JMIN,JMAX,JSTEP,ISYM(10),J2MIN,J2MAX,
|
|
2 J2STEP,ISYM2(10),JHALF,IDENT,MXJL,MXEL
|
|
DATA TOL/1.D-8/
|
|
C
|
|
C CALCULATE ASYMMETRIC ROTOR ENERGY LEVELS AND WAVEFUNCTIONS
|
|
C FROM ROTATIONAL CONSTANTS. WRITTEN BY JMH, MARCH 1989.
|
|
C MODIFIED TO HANDLE SPHERICAL TOP SYMMETRY, APRIL 1991.
|
|
C MODIFIED TO USE WORKSPACE PROPERLY FOR VERSION 12, NOV 1993.
|
|
C
|
|
IF(EIN) WRITE(6,601)
|
|
601 FORMAT('0 TARGET ENERGY LEVELS TAKEN FROM &BASIS (ELEVEL)'/
|
|
1 ' WILL OVERRIDE THOSE CALCULATED FROM ROTATIONAL CONSTANTS')
|
|
IF(ROTI(1).EQ.ROTI(3) .AND. ROTI(3).EQ.ROTI(5)) THEN
|
|
WRITE(6,602) ROTI(1),ROTI(7),ROTI(10)
|
|
602 FORMAT('0 SPHERICAL ROTOR LEVELS CALCULATED FROM'/
|
|
1 ' A = B = C =',F11.5/' DJ',8X,'=',E11.3/' DT',8X,'=',E11.3)
|
|
IF(ABS(ROTI(10)).LT.1.D-8) WRITE(6,603)
|
|
603 FORMAT(' *** WARNING: IF ABS(DT) IS LESS THAN ABOUT 1.D-8,',
|
|
1 ' THE PROGRAM MAY FAIL TO DISTINGUISH LEVELS OF DIFFERENT',
|
|
2 ' SYMMETRY')
|
|
ELSE
|
|
WRITE(6,604) ROTI(1),ROTI(3),ROTI(5),
|
|
1 ROTI(7),ROTI(8),ROTI(9)
|
|
604 FORMAT('0 ASYMMETRIC ROTOR LEVELS CALCULATED FROM'/
|
|
1 ' A =',F10.5,8X,'B =',F10.5,8X,'C =',F10.5/
|
|
2 ' DJ =',E10.3,8X,'DJK =',E10.3,8X,'DK =',E10.3/
|
|
3 '0 A, B AND C MUST CORRESPOND TO THE X, Y AND Z',
|
|
4 ' COORDINATES USED TO DEFINE THE INTERACTION POTENTIAL')
|
|
ENDIF
|
|
WRITE(6,605) IPAR
|
|
605 FORMAT('0 INPUT ENERGY LEVELS WILL BE INCLUDED ONLY IF THEY',
|
|
1 ' MEET SELECTION CRITERIA SPECIFIED BITWISE BY ISYM =',I4)
|
|
C
|
|
C NTAU IS SAFELY ABOVE ANYTHING WE MAY NEED FOR JLEV
|
|
C
|
|
NLVL=0
|
|
ESAVE=-999.D0
|
|
NLEV=0
|
|
NTAU=6*(JMAX+1)**2
|
|
NORIG=NTAU
|
|
IXSAVE=IXNEXT
|
|
DO 450 J=JMIN,JMAX,JSTEP
|
|
NVEC=NTAU
|
|
NK=J+J+1
|
|
C
|
|
C ASROT NEEDS SOMEWHERE TO PUT THE EIGENVALUES AND EIGENVECTORS
|
|
C AND SOME WORKSPACE. USE THE TOP OF THE ATAU ARRAY.
|
|
C
|
|
IC2=NVEC+1+NK*NK
|
|
IC3=IC2+NK*NK
|
|
IC4=IC3+NK
|
|
IXNEXT=IC4+NK
|
|
NUSED=1
|
|
CALL CHKSTR(NUSED)
|
|
CALL ASROT(J,ATAU(NVEC+1),ATAU(IC2),ATAU(IC3),ATAU(IC4),NK)
|
|
DO 440 IK=1,NK
|
|
C
|
|
C CHECK LEVEL ENERGY AND PARITY TO SEE WHETHER WE REALLY WANT IT
|
|
C
|
|
ELEV=ATAU(IC3+IK-1)
|
|
IF(EMAX.GT.0.D0 .AND. ELEV.GT.EMAX) GOTO 430
|
|
IPLEV=IPASYM(J,NK,ATAU(NVEC+1))
|
|
C
|
|
C IPAR IS INTERPRETED BITWISE: THE BITS ARE FLAGS AS FOLLOWS
|
|
C 1 - ODD K EXCLUDED
|
|
C 2 - EVEN K EXCLUDED
|
|
C 3 - ODD +/-K * (-1)**J EXCLUDED
|
|
C 4 - EVEN +/-K * (-1)**J EXCLUDED
|
|
C 5 - DEGENERACY = 1 EXCLUDED
|
|
C 6 - DEGENERACY = 2 EXCLUDED
|
|
C 7 - DEGENERACY = 3 EXCLUDED
|
|
C 8 - DEGENERACY > 3 EXCLUDED
|
|
C
|
|
C NOTE THAT THIS LOGIC WAS CHANGED IN AUGUST 1992,
|
|
C IN A WAY THAT ALTERS THE INPUT VALUE OF ISYM REQUIRED,
|
|
C FOLLOWING BETA TESTING OF VERSION 11
|
|
C
|
|
IF(IPAR.LE.0) GOTO 410
|
|
C
|
|
C FIND DEGENERACY
|
|
C
|
|
IDEG=0
|
|
DO 400 KK=1,NK
|
|
IF(ABS(ATAU(IC3+KK-1)-ELEV).LT.TOL) IDEG=IDEG+1
|
|
400 CONTINUE
|
|
C
|
|
JPAR=IPAR
|
|
C
|
|
IP=MOD(JPAR,2)
|
|
JPAR=JPAR/2
|
|
IF(IP.EQ.1 .AND. IPLEV.GE.2) GOTO 430
|
|
C
|
|
IP=MOD(JPAR,2)
|
|
JPAR=JPAR/2
|
|
IF(IP.EQ.1 .AND. IPLEV.LE.1) GOTO 430
|
|
C
|
|
IP=MOD(JPAR,2)
|
|
JPAR=JPAR/2
|
|
IF(IP.EQ.1 .AND. MOD(IPLEV+J,2).EQ.1) GOTO 430
|
|
C
|
|
IP=MOD(JPAR,2)
|
|
JPAR=JPAR/2
|
|
IF(IP.EQ.1 .AND. MOD(IPLEV+J,2).EQ.0) GOTO 430
|
|
C
|
|
IP=MOD(JPAR,2)
|
|
JPAR=JPAR/2
|
|
IF(IP.EQ.1 .AND. IDEG.EQ.1) GOTO 430
|
|
C
|
|
IP=MOD(JPAR,2)
|
|
JPAR=JPAR/2
|
|
IF(IP.EQ.1 .AND. IDEG.EQ.2) GOTO 430
|
|
C
|
|
IP=MOD(JPAR,2)
|
|
JPAR=JPAR/2
|
|
IF(IP.EQ.1 .AND. IDEG.EQ.3) GOTO 430
|
|
C
|
|
IP=MOD(JPAR,2)
|
|
JPAR=JPAR/2
|
|
IF(IP.EQ.1 .AND. IDEG.GT.3) GOTO 430
|
|
C
|
|
410 NLEV=NLEV+1
|
|
IF(NLEVEL.GT.0 .AND. NLEV.GT.NLEVEL) GOTO 430
|
|
C
|
|
C ARRIVE HERE IF WE DO: STORE JLEV AND TAU IN TEMPORARY LOCATIONS
|
|
C
|
|
PREV=ESAVE
|
|
ESAVE=ELEV
|
|
IF(ABS(ESAVE-PREV).GT.TOL) THEN
|
|
NLVL=NLVL+1
|
|
JLEVEL(2*NLVL-1)=J
|
|
JLEVEL(2*NLVL)=IK
|
|
IF(.NOT.EIN) ELEVEL(NLVL)=ELEV
|
|
ENDIF
|
|
C
|
|
JLEV(6*NLEV-5)=J
|
|
JLEV(6*NLEV-4)=IK
|
|
JLEV(6*NLEV-3)=IPLEV
|
|
JLEV(6*NLEV-2)=NTAU
|
|
JLEV(6*NLEV-1)=NK
|
|
JLEV(6*NLEV )=NLVL
|
|
C
|
|
C NTAU KEEPS TRACK OF WHERE WE ARE PUTTING THE COEFFICIENTS,
|
|
C AND NVEC KEEPS TRACK OF WHERE THEY ARE COMING FROM.
|
|
C NTAU IS NEVER LESS THAN NVEC.
|
|
C
|
|
DO 420 I=1,NK
|
|
ATAU(NTAU+I)=ATAU(NVEC+I)
|
|
420 CONTINUE
|
|
NTAU=NTAU+NK
|
|
430 NVEC=NVEC+NK
|
|
440 CONTINUE
|
|
450 CONTINUE
|
|
C
|
|
C COPY ATAU INTO THE RIGHT PLACE
|
|
C
|
|
IF(NLEVEL.GT.0) NLEV=MIN(NLEV,NLEVEL)
|
|
IF(NLEVEL.EQ.0) NLEVEL=NLVL
|
|
NBASE=6*NLEV
|
|
NSHIFT=NORIG-NBASE
|
|
DO 460 I=NORIG+1,NTAU
|
|
460 ATAU(I-NSHIFT)=ATAU(I)
|
|
NTAU=NTAU-NSHIFT
|
|
C
|
|
C COPY JLEV INTO WORKSPACE ABOVE ATAU AND REARRANGE IT,
|
|
C REMEMBERING TO MODIFY THE POINTER TO ATAU.
|
|
C
|
|
NBASE=2*NTAU
|
|
I=0
|
|
DO 470 NL=1,NLEV
|
|
DO 470 IQ=1,6
|
|
I=I+1
|
|
IF(IQ.EQ.4) JLEV(I)=JLEV(I)-NSHIFT
|
|
JLEV(NBASE+NL+NLEV*(IQ-1))=JLEV(I)
|
|
470 CONTINUE
|
|
C
|
|
C THEN COPY IT BACK TO WHERE IT BELONGS
|
|
C
|
|
DO 480 I=1,6*NLEV
|
|
480 JLEV(I)=JLEV(NBASE+I)
|
|
IXNEXT=IXSAVE+NTAU
|
|
RETURN
|
|
END
|
|
SUBROUTINE SET6I(JLEV,MXLV,NLEV,A,MXA,IUNIT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION JLEV(MXLV)
|
|
DIMENSION A(MXA)
|
|
DATA IDU/5/
|
|
C
|
|
NTOP=MXLV/4
|
|
ISTA=0
|
|
C ALLOW FOR EMPTY SET OF BASIS FUNCTIONS, I.E., NLEV.LE.0
|
|
IF (NLEV.LE.0) GO TO 3000
|
|
IF (NLEV.LE.NTOP) GO TO 1000
|
|
WRITE(6,603) NLEV,NTOP
|
|
603 FORMAT('0 INPUT NLEVEL =',I7,
|
|
1 ' REPLACED BY MAX ALLOWED BY DIMENSIONS =',I5)
|
|
NLEV=NTOP
|
|
C
|
|
1000 IF (IUNIT.GT.0) GO TO 1001
|
|
WRITE(6,601) IUNIT,IDU
|
|
601 FORMAT('0 ILLEGAL UNIT =',I12,' SPECIFIED FOR IASYMU, CHANGED TO'
|
|
& ,I4)
|
|
IUNIT=IDU
|
|
1001 WRITE(6,602) IUNIT,NLEV
|
|
602 FORMAT('0 ASYMMETRIC TOP BASIS WILL BE INPUT FROM UNIT IASYMU =',
|
|
& I4/'0 NUMBER OF REQUESTED LEVELS, NLEVEL =',I4 )
|
|
C
|
|
NL=0
|
|
DO 2000 III=1,NLEV
|
|
READ(IUNIT,500,END=9000) JI,ITAU,EIN
|
|
500 FORMAT(2I5,F15.10)
|
|
C N.B. ENERGY (EIN) NOT USED FOR IOS, KEPT FOR MOLSCAT COMPATIBILITY
|
|
NL=NL+1
|
|
JI=IABS(JI)
|
|
NK=2*JI+1
|
|
IF (ISTA+NK.GT.MXA) GO TO 9001
|
|
READ(IUNIT,501,END=9100) (A(ISTA+I),I=1,NK)
|
|
501 FORMAT(6F12.8)
|
|
WRITE(6,604) NL,JI,ITAU
|
|
604 FORMAT('0 INPUT LEVEL',I4,' J, TAU =',2I4)
|
|
MJI=-JI
|
|
WRITE(6,605) (A(ISTA+1+JI+I),I,I=MJI,JI)
|
|
605 FORMAT(10X,'INPUT COEFFICIENTS ARE'/(10X,6(F12.6,'(',I3,')')))
|
|
IPAR=IPASYM(JI,NK,A(ISTA+1))
|
|
IF (IPAR.NE.-1) GO TO 2001
|
|
WRITE(6,619)
|
|
619 FORMAT('0 *** ILLEGAL PARITY. BASIS FUNCTION REMOVED.')
|
|
NL=NL-1
|
|
GO TO 2000
|
|
C ADD INDICES TO JLEV. . .
|
|
2001 JLEV(4*NL-3)=JI
|
|
JLEV(4*NL-2)=ITAU
|
|
JLEV(4*NL-1)=IPAR
|
|
JLEV(4*NL )=ISTA
|
|
ISTA=ISTA+NK
|
|
GO TO 2000
|
|
C END OF FILE AND OTHER ERROR CONDITIONS
|
|
9000 WRITE(6,606) IUNIT,NL
|
|
606 FORMAT('0 END OF FILE ON UNIT',I4,' AFTER',I4,' FUNCTIONS.')
|
|
GO TO 2400
|
|
9001 WRITE(6,607) MXA,NL
|
|
607 FORMAT('0 OUT OF ROOM IN ATAU MATRIX. MXA, NLEV =',2I6)
|
|
NL=NL-1
|
|
GO TO 2400
|
|
9100 WRITE(6,608) NL
|
|
608 FORMAT('0 * * * ERROR. END OF FILE BEFORE ATAU CARDS FOR LEVEL',
|
|
& I4,'. * * * TERMINATING.')
|
|
STOP
|
|
2000 CONTINUE
|
|
C
|
|
2400 NLEV=NL
|
|
3000 MXA=ISTA
|
|
CALL CHCK6I(NLEV,JLEV,A)
|
|
RETURN
|
|
END
|
|
SUBROUTINE SETBAS
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE
|
|
C
|
|
LOGICAL LEVIN,EIN
|
|
INTEGER NLEV,JLEV(1)
|
|
C
|
|
C VERSION 14 CMBASE
|
|
C COMMON BLOCK FOR BASIS DATA
|
|
DIMENSION ROTI(12),ALPHAE(2),BE(2),DE(2),WE(2),WEXE(2),A(2),B(2),
|
|
1 C(2),WT(2),ELEVEL(1000)
|
|
DIMENSION JLEVEL(4000),ISYM(10),ISYM2(10)
|
|
EQUIVALENCE (ROTI(1),BE(1),A(1)), (ROTI(3),ALPHAE(1),B(1)),
|
|
1 (ROTI(5),DE(1),C(1)),(JMIN,J1MIN),(JMAX,J1MAX),(JSTEP,J1STEP),
|
|
2 (ROTI(7),WE(1)), (ROTI(9),WEXE(1)),(KMAX,J2MAX)
|
|
COMMON /CMBASE/ ROTI,ELEVEL,EMAX,WT,SPNUC,NLEVEL,JLEVEL,
|
|
1 JMIN,JMAX,JSTEP,ISYM,J2MIN,J2MAX,J2STEP,ISYM2,JHALF,IDENT
|
|
C
|
|
C
|
|
ENTRY SET1(LEVIN,EIN,NLEV,JLEV)
|
|
IF (LEVIN) GO TO 1902
|
|
WRITE(6,601) JMIN,JMAX,JSTEP
|
|
601 FORMAT(/' TARGET ROTATIONAL LEVELS COMPUTED FROM JMIN =',I3,
|
|
1 ', JMAX =',I3,', AND JSTEP =',I2)
|
|
JMIN=MAX0(0,JMIN)
|
|
JMAX=MAX0(JMIN,JMAX)
|
|
NLEVEL=0
|
|
DO 1012 I=JMIN,JMAX,JSTEP
|
|
NLEVEL=NLEVEL+1
|
|
1012 JLEVEL(NLEVEL)=I
|
|
GO TO 1802
|
|
1902 WRITE(6,632) NLEVEL
|
|
632 FORMAT(/' TARGET ROTATIONAL LEVELS TAKEN FROM &BASIS (JLEVEL) ',
|
|
1 'INPUT. NLEVEL =',I3)
|
|
1802 JMIN=JLEVEL(1)
|
|
JMAX=JMIN
|
|
NLEV=NLEVEL
|
|
DO 1912 I=1,NLEVEL
|
|
JI=JLEVEL(I)
|
|
IF (JI.LT.JMIN) JMIN=JI
|
|
IF (JI.GT.JMAX) JMAX=JI
|
|
JLEV(NLEV+I)=I
|
|
1912 JLEV(I)=JI
|
|
IF (EIN) GO TO 7002
|
|
WRITE(6,633) BE(1)
|
|
633 FORMAT(/' ENERGY LEVELS COMPUTED FROM B(E) =',F12.6)
|
|
IF (ALPHAE(1).NE.0.D0) WRITE(6,634) ALPHAE(1)
|
|
634 FORMAT(' WITH B(V) COMPUTED FROM B(E) AND ALPHA(E) =',F10.6)
|
|
IF (DE(1).NE.0.D0) WRITE(6,635) DE(1)
|
|
635 FORMAT(' ROTATIONAL ENERGIES CORRECTED FOR D(E) =',F12.8)
|
|
DO 1702 I=1,NLEV
|
|
JI=JLEV(I)
|
|
FJ=JI*(JI+1)
|
|
1702 ELEVEL(I)=(BE(1)-ALPHAE(1)/2.D0)*FJ - DE(1)*FJ*FJ
|
|
RETURN
|
|
7002 WRITE(6,631)
|
|
631 FORMAT(/' TARGET ENERGY LEVELS TAKEN FROM &BASIS (ELEVEL) INPUT')
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY SET2(LEVIN,EIN,NLEV,JLEV)
|
|
IF (LEVIN) GO TO 2902
|
|
WRITE(6,201)
|
|
201 FORMAT(/' * * * ERROR. FOR ITYPE=2 &BASIS MUST SPECIFY NLEVEL ',
|
|
1 'AND J, V PAIRS')
|
|
STOP
|
|
2902 WRITE(6,632) NLEVEL
|
|
JMIN=JLEVEL(1)
|
|
JMAX=JMIN
|
|
NLEV=NLEVEL
|
|
DO 2912 I=1,NLEVEL
|
|
JI=JLEVEL(2*I-1)
|
|
JVI=JLEVEL(2*I)
|
|
JMIN=MIN0(JMIN,JI)
|
|
JMAX=MAX0(JMAX,JI)
|
|
JLEV(2*NLEV+I)=I
|
|
JLEV(NLEV+I)=JVI
|
|
2912 JLEV(I)=JI
|
|
IF(EIN) GO TO 2002
|
|
WRITE(6,202) WE(1),BE(1)
|
|
202 FORMAT(/' ENERGY LEVELS COMPUTED FROM W(E) =',F10.4,
|
|
1 ', B(E) =',F10.4/9X,'WITH ZERO ENERGY AT V=0, J=0')
|
|
IF (WEXE(1).NE.0.D0) WRITE(6,636) WEXE(1)
|
|
636 FORMAT(' CORRECTED FOR W(E)X(E) =',F10.4)
|
|
IF (ALPHAE(1).NE.0.D0) WRITE(6,634) ALPHAE(1)
|
|
IF (DE(1).NE.0.D0) WRITE(6,635) DE(1)
|
|
DO 2702 I=1,NLEV
|
|
JI=JLEV(I)
|
|
JVI=JLEV(NLEV+I)
|
|
FJ=JI*(JI+1)
|
|
FV=JVI
|
|
2702 ELEVEL(I)=WE(1)*FV-WEXE(1)*FV*(FV+1.D0)+(BE(1)-ALPHAE(1)
|
|
1 *(FV+0.5D0))*FJ - DE(1)*FJ*FJ
|
|
RETURN
|
|
2002 WRITE(6,631)
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY SET3(LEVIN,EIN,NLEV,JLEV)
|
|
IF (IDENT.EQ.0) GO TO 1993
|
|
J2MIN=J1MIN
|
|
J2MAX=J1MAX
|
|
J2STEP=J1STEP
|
|
IF (BE(2).EQ.0.D0) BE(2)=BE(1)
|
|
IF (ALPHAE(2).EQ.0.D0) ALPHAE(2)=ALPHAE(1)
|
|
IF (DE(2).EQ.0.D0) DE(2)=DE(1)
|
|
1993 IF (LEVIN) GO TO 5303
|
|
WRITE(6,310) J1MIN,J1MAX,J1STEP,J2MIN,J2MAX,J2STEP
|
|
310 FORMAT(/' TARGET ROTOR LEVELS COMPUTED FROM J1MIN =',I3,
|
|
1 ', J1MAX =',I3,', J1STEP =',I2//
|
|
2 ' PROJECTILE ROTOR LEVELS COMPUTED FROM J2MIN =',I3,
|
|
3 ', J2MAX =',I3,', J2STEP =',I2)
|
|
J1MIN=MAX0(J1MIN,0)
|
|
J1MAX=MAX0(J1MIN,J1MAX)
|
|
J1STEP=MAX0(J1STEP,1)
|
|
J2MIN=MAX0(J2MIN,0)
|
|
J2MAX=MAX0(J2MAX,J2MIN)
|
|
J2STEP=MAX0(J2STEP,1)
|
|
NLEVEL=0
|
|
I=1
|
|
DO 1013 JJ1=J1MIN,J1MAX,J1STEP
|
|
DO 1013 JJ2=J2MIN,J2MAX,J2STEP
|
|
IF (IDENT.NE.0 .AND. JJ1.GT.JJ2) GO TO 1013
|
|
JLEVEL(I)=JJ1
|
|
JLEVEL(I+1)=JJ2
|
|
I=I+2
|
|
NLEVEL=NLEVEL+1
|
|
1013 CONTINUE
|
|
GO TO 1023
|
|
5303 WRITE(6,333) NLEVEL
|
|
333 FORMAT(/' TARGET/PROJECTILE ENERGY LEVELS TAKEN FROM &BASIS ',
|
|
1 '(JLEVEL) INPUT. NLEVEL =',I3)
|
|
C PROCESS JLEVEL TO JLEV FORMAT. JMIN(JMAX) ARE LOW(HIGH) OF J12.
|
|
1023 JMIN=IABS(JLEVEL(1)-JLEVEL(2))
|
|
JMAX=JMIN
|
|
C EXPAND J1, J2 TO J1, J2, J12
|
|
NLEV=0
|
|
DO 1033 I=1,NLEVEL
|
|
JJ1=JLEVEL(2*I-1)
|
|
JJ2=JLEVEL(2*I)
|
|
JK=IABS(JJ1-JJ2)
|
|
JTOP=JJ1+JJ2
|
|
DO 1033 J12=JK,JTOP
|
|
JLEV(4*NLEV+1)=JJ1
|
|
JLEV(4*NLEV+2)=JJ2
|
|
JLEV(4*NLEV+3)=J12
|
|
JLEV(4*NLEV+4)=I
|
|
NLEV=NLEV+1
|
|
JMIN=MIN0(JMIN,J12)
|
|
JMAX=MAX0(JMAX,J12)
|
|
1033 CONTINUE
|
|
C REARRANGE TO PROPER ORDER IN HIGHER JLEV STORAGE
|
|
JK=4*NLEV
|
|
DO 1043 I=1,NLEV
|
|
JLEV(JK+I)=JLEV(4*I-3)
|
|
JLEV(JK+NLEV+I)=JLEV(4*I-2)
|
|
JLEV(JK+2*NLEV+I)=JLEV(4*I-1)
|
|
1043 JLEV(JK+3*NLEV+I)=JLEV(4*I)
|
|
C COPY BACK . . .
|
|
DO 1053 I=1,JK
|
|
1053 JLEV(I)=JLEV(JK+I)
|
|
C SET ELEVEL VALUES
|
|
IF (EIN) GO TO 1073
|
|
WRITE(6,633) BE(1)
|
|
IF (ALPHAE(1).NE.0.D0) WRITE(6,634) ALPHAE(1)
|
|
IF (DE(1).NE.0.D0) WRITE(6,635) DE(1)
|
|
WRITE(6,313) BE(2)
|
|
313 FORMAT(/' PROJECTILE ENERGY LEVELS COMPUTED FROM B(E) =',F12.6)
|
|
IF (ALPHAE(2).NE.0.D0) WRITE(6,634) ALPHAE(2)
|
|
IF (DE(2).NE.0.D0) WRITE(6,635) DE(2)
|
|
DO 1063 I=1,NLEVEL
|
|
FJ=DBLE(JLEVEL(2*I-1))
|
|
GJ=DBLE(JLEVEL(2*I))
|
|
FJ=FJ*(FJ+1.D0)
|
|
GJ=GJ*(GJ+1.D0)
|
|
1063 ELEVEL(I)=(BE(1)-ALPHAE(1)*0.5D0)*FJ - DE(1)*FJ*FJ
|
|
1 + (BE(2)-ALPHAE(2)*0.5D0)*GJ - DE(2)*GJ*GJ
|
|
RETURN
|
|
1073 WRITE(6,312)
|
|
312 FORMAT(/' TARGET/PROJECTILE ENERGY LEVELS TAKEN FROM &BASIS ',
|
|
1 '(ELEVEL) INPUT')
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
C
|
|
ENTRY SET5(LEVIN,EIN,NLEV,JLEV)
|
|
C
|
|
C N.B. WE USE D(L,K,M) WITH EDMONDS CONVENTIONS OF PHASE FOR THE
|
|
C BASIS FUNCTIONS. THIS IS SAME AS THADDEUS IN H2CO PAPER.
|
|
C
|
|
IF (LEVIN) GO TO 5305
|
|
NLEVEL=0
|
|
I=0
|
|
WRITE(6,601) JMIN,JMAX,JSTEP
|
|
IF(KMAX.LT.0) WRITE(6,602) -KMAX
|
|
602 FORMAT(10X,' ABS(K) FOR ALL LEVELS SET TO',I4)
|
|
IF(KMAX.GE.0 .AND. KMAX.LT.JMAX) WRITE(6,603) KMAX
|
|
603 FORMAT(10X,' ONLY LEVELS WITH K <=',I3,' INCLUDED IN BASIS')
|
|
JMIN=MAX0(JMIN,0)
|
|
JMAX=MAX0(JMIN,JMAX)
|
|
DO 5315 JJ=JMIN,JMAX
|
|
DO 5315 KK=0,JJ
|
|
IF (KMAX.LT.0 .AND. KK+KMAX.NE.0) GO TO 5315
|
|
IF (KMAX.GE.0 .AND. KK.GT.KMAX) GO TO 5315
|
|
IF (MOD(JJ+KK,JSTEP).NE.JMIN) GO TO 5314
|
|
JLEVEL(I+1)=JJ
|
|
JLEVEL(I+2)=KK
|
|
JLEVEL(I+3)=2
|
|
I=I+3
|
|
NLEVEL=NLEVEL+1
|
|
5314 IF(KK.EQ.0) GOTO 5315
|
|
IF (MOD(JJ+KK+1,JSTEP).NE.JMIN) GO TO 5315
|
|
JLEVEL(I+1)=JJ
|
|
JLEVEL(I+2)=KK
|
|
JLEVEL(I+3)=1
|
|
I=I+3
|
|
NLEVEL=NLEVEL+1
|
|
5315 CONTINUE
|
|
GO TO 5355
|
|
5305 WRITE(6,632) NLEVEL
|
|
5355 JMIN=JLEVEL(1)
|
|
JMAX=JMIN
|
|
NLEV=NLEVEL
|
|
DO 5325 I=1,NLEVEL
|
|
JLEV(I)=JLEVEL(3*I-2)
|
|
JLEV(NLEV+I)=JLEVEL(3*I-1)
|
|
JLEV(2*NLEV+I)=JLEVEL(3*I)
|
|
JLEV(3*NLEV+I)=I
|
|
JJ=JLEV(I)
|
|
IF (JJ.LT.JMIN) JMIN=JJ
|
|
IF (JJ.GT.JMAX) JMAX=JJ
|
|
5325 CONTINUE
|
|
IF (EIN) GO TO 5335
|
|
WRITE(6,604) A(1),B(1),C(1)
|
|
604 FORMAT(/' ENERGY LEVELS COMPUTED FROM ZEROTH ORDER ',
|
|
1 'NEAR-SYMMETRIC TOP FORMULA'/
|
|
2 10X,'ROTATIONAL CONSTANTS ARE A, B, C (1/CM) =',3F12.4/
|
|
3 10X,'N.B. THESE MOMENTS MUST CORRESPOND RESPECTIVELY TO ',
|
|
4 'X, Y, Z COORDINATES USED TO DEFINE INTERACTION POTENTIAL')
|
|
DO 5345 I=1,NLEV
|
|
JJ=JLEV(I)
|
|
KK=IABS(JLEV(I+NLEV))
|
|
SS=(-1.D0)**JLEV(I+2*NLEV)
|
|
HKK=(A(1)+B(1))*DBLE(JJ*(JJ+1)-KK*KK)/2.D0+ C(1)*DBLE(KK*KK)
|
|
C OFF-DIAGONAL CONTRIBUTION ONLY FROM K=1/K=-1 CASE. . .
|
|
IF (KK.EQ.1) HKK=HKK+ SS * (A(1)-B(1)) *
|
|
1 SQRT(DBLE((JJ*(JJ+1)-KK*(KK-1))*(JJ*(JJ+1)-(KK-1)*(KK-2))))/4.D0
|
|
5345 ELEVEL(I)=HKK
|
|
RETURN
|
|
5335 WRITE(6,631)
|
|
RETURN
|
|
C * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
END
|
|
SUBROUTINE SGNCHK(A,B,N)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION A(1),B(1)
|
|
IND=-N
|
|
DO 1 I=1,N
|
|
IND=IND+N
|
|
VMAX=0.D0
|
|
JMAX=0
|
|
DO 2 J=1,N
|
|
IF(ABS(B(IND+J)).LT.VMAX) GO TO 2
|
|
JMAX=J
|
|
VMAX=B(IND+JMAX)
|
|
2 CONTINUE
|
|
IF(JMAX.EQ.0) GO TO 999
|
|
TEST=SIGN(B(IND+JMAX),A(IND+JMAX))
|
|
IF(TEST.EQ.B(IND+JMAX)) GO TO 1
|
|
DO 3 J=1,N
|
|
B(IND+J)=-B(IND+J)
|
|
3 CONTINUE
|
|
1 CONTINUE
|
|
RETURN
|
|
999 WRITE(6,100)
|
|
100 FORMAT(/10X,'JMAX EQ. 0 IN SGNCHK')
|
|
RETURN
|
|
END
|
|
SUBROUTINE SHRINK(ICODE,RNOW,W,N,VL,IV,NB,J,L,EINT,CENT,WVEC,
|
|
1 CLOSE,VECOLD,EIGOLD,R,T,DEEP,NSQ,NPOTL,ISCRU,NOPMAX,PRINT)
|
|
C
|
|
C SUBROUTINE TO PERFORM A CHANNELECTOMY.
|
|
C SHRINK REMOVES THE HIGHEST-ENERGY CHANNEL(S) FROM THE PRIMITIVE
|
|
C BASIS SET, AND MODIFIES NUMEROUS ARRAYS TO REFLECT THIS.
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
INTEGER PRINT
|
|
DIMENSION W(1),VL(1),IV(1),NB(N),J(N),L(N),EINT(N),CENT(N),
|
|
1 WVEC(N),CLOSE(N),VECOLD(NSQ),EIGOLD(N),R(1),T(1)
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
IF(ISCRU.LE.0) GOTO 100
|
|
IF(ICODE.EQ.1) WRITE(ISCRU) VECOLD
|
|
IF(ICODE.EQ.2) READ(ISCRU) VECOLD
|
|
100 CALL TRNSP(VECOLD,N)
|
|
CALL TRNSFM(VECOLD,R,T,N,.FALSE.,.TRUE.)
|
|
C
|
|
DEEP2=DEEP
|
|
DO 1000 NNEW=N,1,-1
|
|
IF(NNEW.LE.NOPMAX .OR. CLOSE(NNEW).LT.DEEP2) GOTO 1100
|
|
ISKIP=NB(NNEW)
|
|
C
|
|
I=0
|
|
INEW=0
|
|
DO 200 II=1,NNEW
|
|
DO 200 JJ=1,NNEW
|
|
I=I+1
|
|
IF(II.EQ.ISKIP .OR. JJ.EQ.ISKIP) GOTO 200
|
|
INEW=INEW+1
|
|
W(INEW)=W(I)
|
|
R(INEW)=R(I)
|
|
200 CONTINUE
|
|
C
|
|
INEW=0
|
|
DO 300 I=1,NNEW
|
|
IF(I.EQ.ISKIP) GOTO 300
|
|
INEW=INEW+1
|
|
J(INEW)=J(I)
|
|
L(INEW)=L(I)
|
|
EINT(INEW)=EINT(I)
|
|
CENT(INEW)=CENT(I)
|
|
WVEC(INEW)=WVEC(I)
|
|
300 CONTINUE
|
|
C
|
|
I=0
|
|
INEW=0
|
|
DO 400 II=1,NNEW
|
|
DO 400 JJ=1,II
|
|
DO 400 K=1,NPOTL
|
|
I=I+1
|
|
IF(II.EQ.ISKIP .OR. JJ.EQ.ISKIP) GOTO 400
|
|
INEW=INEW+1
|
|
VL(INEW)=VL(I)
|
|
IF (IVLFL.NE.0) IV(INEW)=IV(I)
|
|
400 CONTINUE
|
|
C
|
|
DO 500 I=1,NNEW
|
|
500 IF(NB(I).GE.ISKIP) NB(I)=NB(I)-1
|
|
C
|
|
1000 CONTINUE
|
|
C
|
|
1100 N=NNEW
|
|
IF (ICODE.EQ.2) GOTO 1300
|
|
IF(PRINT.GE.8) WRITE(6,601) N,RNOW
|
|
601 FORMAT(' BASIS SET CONTRACTED TO N =',I3,' AT R =',F6.2,' A')
|
|
IFAIL=0
|
|
CALL F02ABF(W,N,N,EIGOLD,VECOLD,N,T,IFAIL)
|
|
IF(ISCRU.GT.0) WRITE(ISCRU) VECOLD
|
|
GOTO 1400
|
|
C
|
|
1300 IF(ISCRU.GT.0) READ(ISCRU) VECOLD
|
|
1400 CALL TRNSFM(VECOLD,R,T,N,.FALSE.,.TRUE.)
|
|
NSQ=N*N
|
|
C
|
|
RETURN
|
|
END
|
|
SUBROUTINE SIG6(NLEV,JLEV,A,LI,LF,SIG,S,IMSG,QL,IXQL,NIXQL,NQL,
|
|
1 LM,LMAX)
|
|
C ROUTINE TO EVALUATE SIG(J,TAU->J',TAU') FROM IOS Q(L,M1,M2)
|
|
C VALUE FOR LEVEL LI TO LF RETURNED IN SIG
|
|
C SG(2/1/93) VERSION TAKES STORAGE FOR REAL/IMAGINARY COEFFS
|
|
C FROM /MEMORY/ ..,X
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION JLEV(4,NLEV),A(2),IXQL(NIXQL,NQL),LM(3,LMAX)
|
|
DIMENSION QL(2)
|
|
CHARACTER*1 S,STAR
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
DATA STAR/'*'/
|
|
DATA EPS/1.D-8/
|
|
C
|
|
C STATEMENT FUNCTION FOR INDEX M1.GE.M2, M STARTING AT ZERO.
|
|
IX(M1,M2)=M1*(M1+1)/2+M2+1
|
|
C
|
|
SIG=0.D0
|
|
JI=JLEV(1,LI)
|
|
XJI=JI
|
|
NKI=2*JI+1
|
|
ISTAI=JLEV(4,LI)
|
|
JF=JLEV(1,LF)
|
|
XJF=JF
|
|
NKF=2*JF+1
|
|
ISTAF=JLEV(4,LF)
|
|
LMN=IABS(JI-JF)
|
|
LMX=JI+JF
|
|
DO 1100 L=LMN,LMX
|
|
XL=L
|
|
C DETERMINE AMOUNT OF AVAILABLE SCRATCH STORAGE IN X().
|
|
MAXC=MX-IXNEXT+1
|
|
C M-VALUES CAN RANGE UP TO L. CHECK ABILITY TO STORE IN CR,CI
|
|
MMAX=L
|
|
1101 IXMX=IX(MMAX,MMAX)
|
|
IF (2*IXMX.LE.MAXC) GO TO 1102
|
|
WRITE(6,699) L,IXMX,MAXC
|
|
699 FORMAT(' *** CANNOT STORE ALL CR,CI FOR L=',I3,
|
|
1 '. REQUIRED, AVAILABLE =',2I7)
|
|
MMAX=MMAX-1
|
|
S=STAR
|
|
IMSG=1
|
|
IF (MMAX.LT.0) THEN
|
|
WRITE(6,698) LI,LF
|
|
698 FORMAT(/' SIG6 (2/1/93). FOR INITIAL FINAL LEVELS',2I3,
|
|
1 ' AVAILABLE STORAGE IS INADEQUATE')
|
|
STOP
|
|
ENDIF
|
|
GO TO 1101
|
|
C SET STORAGE POINTERS AND ZERO TEMP STORAGE.
|
|
1102 IXSAVE=IXNEXT
|
|
IXR=IXNEXT-1
|
|
IXI=IXR+IXMX
|
|
IXNEXT=IXI+IXMX
|
|
DO 1109 II=1,IXMX
|
|
X(IXR+II)=0.D0
|
|
1109 X(IXI+II)=0.D0
|
|
C -------------LOOP OVER IPI,IPF IQI,IQF -----------
|
|
IPI=-JI-1
|
|
DO 1201 IIPI=1,NKI
|
|
IPI=IPI+1
|
|
API=A(ISTAI+IIPI)
|
|
IF (ABS(API).LE.EPS) GO TO 1201
|
|
PI=IPI
|
|
IPF=-JF-1
|
|
DO 1200 IIPF=1,NKF
|
|
IPF=IPF+1
|
|
APF=A(ISTAF+IIPF)
|
|
IF (ABS(APF).LE.EPS) GO TO 1200
|
|
PF=IPF
|
|
IF (IABS(IPI-IPF).GT.MMAX) GO TO 1200
|
|
IQI=-JI-1
|
|
DO 1301 IIQI=1,NKI
|
|
IQI=IQI+1
|
|
AQI=A(ISTAI+IIQI)
|
|
IF (ABS(AQI).LE.EPS) GO TO 1301
|
|
QI=IQI
|
|
IQF=-JF-1
|
|
DO 1300 IIQF=1,NKF
|
|
IQF=IQF+1
|
|
AQF=A(ISTAF+IIQF)
|
|
IF (ABS(AQF).LE.EPS) GO TO 1300
|
|
QF=IQF
|
|
IF (IABS(IQI-IQF).GT.MMAX) GO TO 1300
|
|
C CALCULATE FACTOR
|
|
TJ1 = THRJ(XJI,XL,XJF,-PI,PI-PF,PF)
|
|
IF (ABS(TJ1).LE.EPS) GO TO 1300
|
|
TJ2 = THRJ(XJI,XL,XJF,-QI,QI-QF,QF)
|
|
IF (ABS(TJ2).LE.EPS) GO TO 1300
|
|
FACT=API*AQI*APF*AQF *TJ1*TJ2
|
|
C RECALCULATE MP,MQ AS THEY MIGHT HAVE BEEN SWAPPED IN LAST LOOP.
|
|
MP=IPI-IPF
|
|
MQ=IQI-IQF
|
|
SIGNR=1.D0
|
|
SIGNI=1.D0
|
|
IF (MP.GE.0) GO TO 1401
|
|
P=PARITY3(MP)
|
|
SIGNR=P*SIGNR
|
|
SIGNI=P*SIGNI
|
|
MP=IABS(MP)
|
|
1401 IF (MQ.GE.0) GO TO 1402
|
|
P=PARITY3(MQ)
|
|
SIGNR=P*SIGNR
|
|
SIGNI=P*SIGNI
|
|
MQ=IABS(MQ)
|
|
1402 IF (MP.GE.MQ) GO TO 1403
|
|
SIGNI=-SIGNI
|
|
MT=MP
|
|
MP=MQ
|
|
MQ=MT
|
|
1403 INDX=IX(MP,MQ)
|
|
IF (MP.EQ.MQ) SIGNI=0.D0
|
|
X(IXR+INDX)=X(IXR+INDX)+SIGNR*FACT
|
|
X(IXI+INDX)=X(IXI+INDX)+SIGNI*FACT
|
|
C**** WRITE(6,686) INDX,X(IXR+INDX),X(IXI+INDX) **** DEBUGGING ****
|
|
686 FORMAT(' INDX, REAL/IMAG =',I5,2F10.5)
|
|
1300 CONTINUE
|
|
1301 CONTINUE
|
|
C ---------- THIS ENDS LOOP OVER IQI,IQF
|
|
1200 CONTINUE
|
|
1201 CONTINUE
|
|
C ---------- THIS ENDS LOOP OVER IPI,IPF
|
|
C MATCH CONTRIBUTING (I.E., NON-ZERO) CR WITH QL VALUES
|
|
IZERO=0
|
|
INDX=0
|
|
DO 1500 MP=IZERO,MMAX
|
|
DO 1500 MQ=IZERO,MP
|
|
INDX=INDX+1
|
|
C N.B. IMAGINARY PART SHOULD VANISH; ERROR MESSAGE IF ANY SURVIVE.
|
|
IF (ABS(X(IXI+INDX)).LE.EPS) GO TO 1501
|
|
WRITE(6,694) L,MP,MQ,X(IXI+INDX),LI,LF
|
|
694 FORMAT('0 *** ERROR. NON-ZERO IMAGINARY COEFF QL(',
|
|
& 3I4,' ) =',F12.6,' FOR LI,LF =',2I4)
|
|
1501 IF (ABS(X(IXR+INDX)).LE.EPS) GO TO 1500
|
|
C CALL IXQLF TO GET INDEX OF L,MP,MQ IN QL
|
|
C AND ACCUMULATE IN CROSS SECTION
|
|
CALL IXQLF(LM,LMAX,L,MP,MQ,1,INDEX,IXQL,NIXQL,NQL)
|
|
C N.B. 6TH ARG (1) ASKS FOR REAL PART; SHOULD WORK OK FOR MP.EQ.MQ
|
|
IF (INDEX.GT.0) GO TO 1502
|
|
IF (INDEX.EQ.-1) GO TO 1500
|
|
S=STAR
|
|
IMSG=1
|
|
GO TO 1500
|
|
1502 SIG=SIG + X(IXR+INDX)*QL(INDEX)
|
|
C WRITE(6,602) LI,LF,L,MP,MQ,X(IXR+INDX),QL(INDEX) *** DEBUGGING**
|
|
602 FORMAT(2X,'I/F=',2I3,' QL(',3I3,' ) COEFF/QL =',2F10.5)
|
|
1500 CONTINUE
|
|
C RECOVER TEMPORARY STORAGE ...
|
|
1100 IXNEXT=IXSAVE
|
|
C ---------- THIS ENDS LOOP OVER L - VALUES
|
|
C MULTIPLY FINALLY BY 2*JF+1
|
|
SIG = SIG * (2*JF+1)
|
|
RETURN
|
|
END
|
|
FUNCTION SIXJ(J1,J2,J5,J4,J3,J6)
|
|
C
|
|
C CALCULATES 6-J SYMBOL: _(J1 J2 J3 )_
|
|
C (J4 J5 J6 )
|
|
C INTERFACE TO J6J ROUTINE.
|
|
C MODIFIED BY S. GREEN 20 AUG 93; PASS DIMENSION OF XJ6J FOR CHECKING
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
PARAMETER(MXDIM=200)
|
|
DIMENSION XJ6J(MXDIM)
|
|
IVAL=MXDIM
|
|
CALL J6J( DBLE(J2),DBLE(J3),
|
|
1 DBLE(J4),DBLE(J5),DBLE(J6),
|
|
3 IVAL,XJ1MIN,XJ6J)
|
|
IND=1+J1-INT(XJ1MIN+0.1D0)
|
|
SIXJ=0.D0
|
|
IF(IND.GE.1 .AND. IND.LE.IVAL) SIXJ=XJ6J(IND)
|
|
RETURN
|
|
END
|
|
* ----------------------------------------------------------------------
|
|
SUBROUTINE SPROPN (WIDTH, EIGNOW, HP, Y1, Y4, Y2, NCH)
|
|
* CURRENT REVISION DATE: 23-9-87
|
|
*-----------------------------------------------------------------------
|
|
* THIS SUBROUTINE CALCULATES THE DIAGONAL MATRICES TO PROPAGATE THE
|
|
* LOG-DERIVATIVE MATRIX THROUGH THE CURRENT INTERVAL
|
|
* THE KEY EQUATIONS, REPRODUCED BELOW, ARE TAKEN FROM
|
|
* M. ALEXANDER AND D. MANOLOPOULOS, "A STABLE LINEAR REFERENCE POTENTIA
|
|
* ALGORITHM FOR SOLUTION ..."
|
|
* EACH UNCOUPLED EQUATION CAN BE WRITTEN AS:
|
|
* 2 2
|
|
* [ D / DR + EIGNOW - HP * R ] F(R) = 0
|
|
* WHERE R IS THE DISTANCE FROM THE MIDPOINT OF THE CURRENT INTERVAL
|
|
* THE LINEARLY INDEPEDENT SOLUTIONS ARE THE AIRY FUNCTIONS AI(X) AND BI
|
|
* WHERE X = ALPHA (R + BETA)
|
|
* 1/3
|
|
* WITH ALPHA = HP , AND BETA = (-EIGNOW) / HP
|
|
* THE THREE DIAGONAL ELEMENTS OF THE CAUCHY PROPAGATOR NECESSARY TO PRO
|
|
* THE LOG-DERIVATIVE MATRIX ARE:
|
|
* B = PI [ AI(X ) BI(X ) - AI(X )BI(X ) ] / ALPHA
|
|
* 1 2 2 1
|
|
* A = PI [ - AI'(X ) BI(X ) + AI(X ) BI'(X ) ]
|
|
* 1 2 2 1
|
|
* D = PI [ AI(X ) BI'(X ) - AI'(X ) BI(X ) ]
|
|
* 1 2 2 1
|
|
* WHERE X = ALPHA ( BETA + WIDTH / 2) AND
|
|
* 2
|
|
* X = ALPHA ( BETA - WIDTH / 2)
|
|
* 1
|
|
* HERE "WIDTH" DENOTES THE WIDTH OF THE INTERVAL
|
|
* THE DIAGONAL ELEMENTS OF THE "IMBEDDING TYPE" PROPAGATOR ARE GIVEN IN
|
|
* OF THE DIAGONAL ELEMENTS OF THE CAUCHY PROPAGATOR BY:
|
|
* Y = A/B Y = Y = 1/B AND Y = D/B
|
|
* 1 2 3 4
|
|
*-----------------------------------------------------------------------
|
|
* VARIABLES IN CALL LIST:
|
|
* WIDTH: WIDTH OF THE CURRENT INTERVAL
|
|
* EIGNOW: ARRAY CONTAINING THE WAVEVECTORS
|
|
* THESE ARE DEFINED BY EQ. (6) OF M.ALEXANDER,
|
|
* J. CHEM. PHYS. 81,4510 (1984)
|
|
* HP: ARRAY CONTAINING THE NEGATIVE OF DIAGONAL ELEMENTS OF T
|
|
* DERIVATIVE OF THE WAVEVECTOR MATRIX AT THE CENTER OF TH
|
|
* CURRENT INTERVAL [SEE EQ. (9) OF M.ALEXANDER,
|
|
* J. CHEM. PHYS. 81,4510 (1984)
|
|
* THIS ARRAY THUS CONTAINS THE DERIVATIVE OF THE DIAGONAL
|
|
* ELEMENTS OF THE TRANSFORMED HAMILTONIAN MATRIX
|
|
* Y1, Y2, Y4: ON RETURN, CONTAIN THE DESIRED DIAGONAL ELEMENTS OF THE
|
|
* IMBEDDING PROPAGATOR
|
|
* NCH: THE NUMBER OF CHANNELS, THIS EQUALS THE DIMENSIONS OF T
|
|
* EIGNOW, HP, Y1, Y4, AND B ARRAYS
|
|
*-----------------------------------------------------------------------
|
|
* THE AIRY FUNCTIONS ARE DEFINED IN TERMS OF THEIR MODULI AND PHASES
|
|
* FOR NEGATIVE X THESE DEFINITIONS ARE:
|
|
* AI(-X) = M(X) COS[THETA(X)]
|
|
* BI(-X) = M(X) SIN[THETA(X)]
|
|
* AI'(-X) = N(X) COS[PHI(X)]
|
|
* BI'(-X) = N(X) SIN[PHI(X)]
|
|
* IN OTHER WORDS
|
|
* 2 2 2
|
|
* M(X) = SQRT[ AI(X) + BI(X) ]
|
|
* 2 2 2
|
|
* N(X) = SQRT[ AI'(X) + BI'(X) ]
|
|
* THETA(X) = ATAN [ BI(X) / AI(X) ]
|
|
* PHI(X) = ATAN [ BI'(X) / AI'(X) ]
|
|
* FOR POSITIVE X THE MODULI AND PHASES ARE DEFINED BY:
|
|
* AI(X) = M(X) SINH[THETA(X)]
|
|
* BI(X) = M(X) COSH[THETA(X)]
|
|
* AI'(X) = N(X) SINH[PHI(X)]
|
|
* BI'(X) = N(X) COSH[PHI(X)]
|
|
* IN OTHER WORDS
|
|
* 2 2 2
|
|
* M(X) = SQRT[ BI(X) - AI(X) ]
|
|
* 2 2 2
|
|
* N(X) = SQRT[ BI'(X) - AI'(X) ]
|
|
* THETA(X) = ATANH [ AI(X) / BI(X) ]
|
|
* PHI(X) = ATANH [ AI'(X) / BI'(X) ]
|
|
* HERE THE THE EXPONENTIALLY SCALED AIRY FUNCTIONS
|
|
* AI(X), AI'(X), BI(X), BI'(X) ARE:
|
|
* AI(X) = AI(X) * EXP[ZETA]
|
|
* AI'(X) = AI'(X) * EXP[ZETA]
|
|
* BI(X) = BI(X) * EXP[-ZETA]
|
|
* BI'(X) = BI'(X) * EXP[-ZETA]
|
|
* 3/2
|
|
* WHERE ZETA = (2/3) X
|
|
* NOTE THAT FOR POSITIVE X THE PHASES ARE LABELED CHI AND ETA IN
|
|
* M. ALEXANDER AND D. MANOLOPOULOS, "A STABLE LINEAR REFERENCE POTENTIA
|
|
* ALGORITHM FOR SOLUTION ..."
|
|
*-----------------------------------------------------------------------
|
|
* FOR BOTH X AND X NEGATIVE
|
|
* 1 2
|
|
* (THIS CORRESPONDS TO A CHANNEL WHICH IS CLASSICALLY OPEN AT BOTH ENDS
|
|
* INTERVAL)
|
|
* WE FIND:
|
|
* Y = 1 / { M M SIN[THETA -THETA ] }
|
|
* 2 1 2 2 1
|
|
* N SIN[PHI -THETA ]
|
|
* 1 1 2
|
|
* Y = ----------------------
|
|
* 1 M SIN[THETA - THETA ]
|
|
* 1 2 1
|
|
* N SIN[PHI -THETA ]
|
|
* 2 2 1
|
|
* Y = ----------------------
|
|
* 4 M SIN[THETA - THETA ]
|
|
* 2 2 1
|
|
* HERE THE SUBSCRIPTS 1 AND 2 IMPLY THE MODULI AND PHASES EVALUATED AT
|
|
*
|
|
* AND X = X , RESPECTIVELY
|
|
* 2
|
|
*-----------------------------------------------------------------------
|
|
* FOR BOTH X AND X POSITIVE
|
|
* 1 2
|
|
* (THIS CORRESPONDS TO A CHANNEL WHICH IS CLASSICALLY CLOSED AT BOTH EN
|
|
* THE INTERVAL)
|
|
* WE FIND:
|
|
* 1 / Y = M M COSH[Z -Z ] { SINH[THETA -THETA ]
|
|
* 2 1 2 2 1 1 2
|
|
* + TANH[Z -Z ] SINH[THETA +THETA ] }
|
|
* 2 1 1 2
|
|
* 3/2
|
|
* WHERE Z = (2/3) X AND SIMILARLY FOR Z
|
|
* 1 1 2
|
|
* N { SINH [THETA -PHI ] - TANH[Z -Z ] SINH[THETA +PHI ] }
|
|
* 1 2 1 2 1 2 1
|
|
* Y = --------------------------------------------------------
|
|
* 1 M { SINH [THETA -THETA ] + TANH[Z -Z ] SINH[THETA +THETA ] }
|
|
* 1 2 1 2 1 2 1
|
|
* N { SINH [THETA -PHI ] - TANH[Z -Z ] SINH[THETA +PHI ] }
|
|
* 2 1 2 2 1 1 2
|
|
* Y = --------------------------------------------------------
|
|
* 4 M { SINH [THETA -THETA ] + TANH[Z -Z ] SINH[THETA +THETA ] }
|
|
* 2 2 1 2 1 2 1
|
|
*-----------------------------------------------------------------------
|
|
* FOR X POSITIVE AND X NEGATIVE WE FIND:
|
|
* 1 2
|
|
* 1 / Y = M M COSH[Z ] COSH[THETA ] { - COS[THETA ] (1 + TANH[Z ])
|
|
* 2 1 2 1 1 2 1
|
|
* + TANH[THETA ] SIN[THETA ] (1 - TANH
|
|
* 1 2
|
|
* N { COS[THETA ](1 + TANH[Z ]) - TANH[PHI ] SIN[THETA ] (1 - TANH[
|
|
* 1 2 1 1 2
|
|
* Y = ------------------------------------------------------------------
|
|
* 1 M {-COS[THETA ](1 + TANH[Z ]) + TANH[THETA ] SIN[THETA ] (1 - TAN
|
|
* 1 2 1 1 2
|
|
* N {-COS[PHI ](1 + TANH[Z ]) + TANH[THETA ] SIN[PHI ] (1 - TANH[Z
|
|
* 2 2 1 1 2 1
|
|
* Y = -----------------------------------------------------------------
|
|
* 4 M {-COS[THETA ](1 + TANH[Z ]) + TANH[THETA ] SIN[THETA ] (1 - TAN
|
|
* 2 2 1 1 2
|
|
*-----------------------------------------------------------------------
|
|
* FOR X NEGATIVE AND X POSITIVE WE FIND:
|
|
* 1 2
|
|
* 1 / Y = M M COSH[Z ] COSH[THETA ] { COS[THETA ] (1 + TANH[Z ])
|
|
* 2 1 2 2 2 1 2
|
|
* - TANH[THETA ] SIN[THETA ] (1 - TANH[
|
|
* 2 1
|
|
* N {-COS[PHI ](1 + TANH[Z ]) + TANH[THETA ] SIN[PHI ] (1 - TANH[Z
|
|
* 1 1 2 2 1 2
|
|
* Y = -----------------------------------------------------------------
|
|
* 1 M {COS[THETA ](1 + TANH[Z ]) - TANH[THETA ] SIN[THETA ] (1 - TANH
|
|
* 1 1 2 2 1
|
|
* N { COS[THETA ](1 + TANH[Z ]) - TANH[PHI ] SIN[THETA ] (1 - TANH[
|
|
* 2 1 2 2 1
|
|
* Y = -----------------------------------------------------------------
|
|
* 4 M {COS[THETA ](1 + TANH[Z ]) - TANH[THETA ] SIN[THETA ] (1 - TANH
|
|
* 2 1 2 2 1
|
|
*-----------------------------------------------------------------------
|
|
* FOR THE SPECIAL CASE OF A CONSTANT REFERENCE POTENTIAL (HP=0)
|
|
* THEN THE PROPAGATORS ARE:
|
|
* FOR EIGNOW .GT. 0 (THE CLASSICALLY ALLOWED REGION)
|
|
* Y1 = Y4 = K COT (K WIDTH)
|
|
* Y2 = K / SIN (K WIDTH)
|
|
* WHERE K = SQRT (EIGNOW)
|
|
* FOR EIGNOW .LT. 0 (THE CLASSICALLY FORBIDDEN REGION)
|
|
* Y1 = Y4 = KAP COTH (KAP WIDTH)
|
|
* Y2 = KAP / SINH (KAP WIDTH)
|
|
*
|
|
* WHERE KAP = SQRT (-EIGNOW)
|
|
*-----------------------------------------------------------------------
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DOUBLE PRECISION DALPHA, DBETA, DHALF, DONETH, DROOT, DSLOPE,
|
|
: DTWOTH, DLZETA, DMMOD1, DMMOD2, DNMOD1, DNMOD2,
|
|
: DPI, DX1, DX2, DZETA1, DZETA2, DPHI1, DPHI2,
|
|
: DTHET1, DTHET2, DTNHFM, DTNHFP, DARG, DCAY, DKAP,
|
|
: OFLOW,X1,X2
|
|
* REAL B, BFACT, TNHFAC, WIDTH
|
|
* REAL EIGNOW(1), HP(1), Y1(1), Y2(1), Y4(1)
|
|
DIMENSION EIGNOW(1), HP(1), Y1(1), Y2(1), Y4(1)
|
|
INTEGER I, NCH
|
|
DATA DONETH, DTWOTH, DHALF
|
|
: / 0.333333333333333D0, 0.666666666666667D0, 0.5D0 /
|
|
DATA DPI / 3.1415926535897932D0 /
|
|
* THE PARAMETER OFLOW IS THE LARGEST VALUE OF X FOR WHICH EXP(X)
|
|
* DOES NOT CAUSE A SINGLE PRECISION OVERFLOW
|
|
* N
|
|
* A REASONABLE VALUE IS X = [ LN(2) 2 ] - 5, WHERE N IS THE NUMBER OF B
|
|
* THE CHARACTERISTIC OF A FLOATING POINT NUMBER
|
|
DATA OFLOW / 83.D0 /
|
|
* NOW DETERMINE B_MIN1, Y1, AND Y4 PARAMETERS FOR ALL NCH CHANNELS
|
|
DO 10 I = 1, NCH
|
|
DSLOPE = HP(I)
|
|
DARG = 1.E+10
|
|
IF (DSLOPE .NE. 0.D0)
|
|
: DARG = LOG (ABS(EIGNOW(I))) - LOG (ABS(DSLOPE))
|
|
IF (DARG .GT. 20.D0 ) THEN
|
|
* HERE IF THE RELATIVE SLOPE IN THE WAVEVECTOR MATRIX IS LESS THAN 1.**
|
|
* IN MAGNITUDE, IN WHICH CASE THE POTENTIAL IS ASSUMED TO BE CONSTANT
|
|
IF (EIGNOW(I) .GT. 0) THEN
|
|
* HERE FOR CLASSICALLY ALLOWED REGION (SINES AND COSINES AS REFERENCE
|
|
* SOLUTIONS)
|
|
DCAY = SQRT (EIGNOW(I))
|
|
DARG = DCAY * WIDTH
|
|
Y1(I) = DCAY / TAN (DARG)
|
|
Y4(I) = Y1(I)
|
|
Y2(I) = DCAY / SIN (DARG)
|
|
ELSE
|
|
* HERE FOR CLASSICALLY FORBIDDEN REGION (HYPERBOLIC SINES AND COSINES A
|
|
* REFERENCE SOLUTIONS)
|
|
DKAP = SQRT ( - EIGNOW(I))
|
|
DARG = DKAP * WIDTH
|
|
Y1(I) = DKAP / TANH (DARG)
|
|
Y4(I) = Y1(I)
|
|
Y2(I) = DKAP / SINH (DARG)
|
|
END IF
|
|
ELSE
|
|
* HERE IF THE RELATIVE SLOPE IN THE WAVEVECTOR MATRIX IS GREATER THAN
|
|
* 1.**(-20) IN MAGNITUDE, IN WHICH CASE A LINEAR REFERENCE POTENTIAL IS
|
|
* WITH AIRY FUNCTIONS AS REFERENCE SOLUTIONS
|
|
DROOT = ( ABS (DSLOPE) ) ** DONETH
|
|
DALPHA = SIGN (DROOT, DSLOPE)
|
|
DBETA = - EIGNOW(I) / DSLOPE
|
|
DX1 = DALPHA * ( DBETA - WIDTH * DHALF)
|
|
DX2 = DALPHA * ( DBETA + WIDTH * DHALF)
|
|
IF (DX1 .GT. 0.) DZETA1 = DTWOTH * DX1 * SQRT(DX1)
|
|
IF (DX2 .GT. 0.) DZETA2 = DTWOTH * DX2 * SQRT(DX2)
|
|
CALL AIRYMP (DX1, DTHET1, DPHI1, DMMOD1, DNMOD1)
|
|
CALL AIRYMP (DX2, DTHET2, DPHI2, DMMOD2, DNMOD2)
|
|
X1 = DX1
|
|
X2 = DX2
|
|
*-----------------------------------------------------------------------
|
|
IF (X1 .GT. 0. .AND. X2 .GT. 0.) THEN
|
|
* HERE FOR BOTH X AND X POSITIVE
|
|
* 1 2
|
|
TNHFAC = TANH(DZETA2 - DZETA1)
|
|
BFACT = SINH(DTHET1 - DTHET2) +
|
|
: TNHFAC * SINH(DTHET1 + DTHET2)
|
|
DLZETA = ABS(DZETA2 - DZETA1)
|
|
Y2(I) = 0.
|
|
IF (DLZETA .LE. OFLOW) THEN
|
|
B = DMMOD1 * DMMOD2 * COSH(DZETA2 - DZETA1) * BFACT
|
|
Y2(I) = 1. / B
|
|
END IF
|
|
Y1(I) = DNMOD1 * (SINH(DTHET2 - DPHI1)
|
|
: - TNHFAC * SINH(DTHET2 + DPHI1) ) / (DMMOD1 * BFACT)
|
|
Y4(I) = DNMOD2 * (SINH(DTHET1 - DPHI2)
|
|
: + TNHFAC * SINH(DTHET1 + DPHI2) ) / (DMMOD2 * BFACT)
|
|
*-----------------------------------------------------------------------
|
|
ELSE IF (X1 .LE. 0. .AND. X2 .LE. 0.) THEN
|
|
* HERE FOR BOTH X AND X NEGATIVE
|
|
* 1 2
|
|
B = DMMOD1 * DMMOD2 * SIN(DTHET2 - DTHET1)
|
|
Y2(I) = 1. / B
|
|
Y1(I) = DNMOD1 * SIN(DPHI1 - DTHET2)
|
|
: / (DMMOD1 * SIN(DTHET2 - DTHET1) )
|
|
Y4(I) = DNMOD2 * SIN(DPHI2 - DTHET1)
|
|
: / (DMMOD2 * SIN(DTHET2 - DTHET1) )
|
|
*-----------------------------------------------------------------------
|
|
ELSE IF (X1 .GT. 0. .AND. X2 .LE. 0.) THEN
|
|
* HERE FOR X POSITIVE AND X NEGATIVE
|
|
* 1 2
|
|
DTNHFP = 1 + TANH(DZETA1)
|
|
DTNHFM = 1 - TANH(DZETA1)
|
|
BFACT = COSH(DTHET1) * ( - COS(DTHET2) * DTNHFP
|
|
: + TANH(DTHET1) * SIN(DTHET2) * DTNHFM)
|
|
Y2(I) = 0.
|
|
IF (ABS(DZETA1) .LE. OFLOW) THEN
|
|
Y2(I) = COSH(DZETA1) * (DMMOD1 * DMMOD2 * BFACT)
|
|
Y2(I) = 1. / Y2(I)
|
|
END IF
|
|
Y1(I) = (DNMOD1 * COSH(DPHI1) * ( COS(DTHET2) * DTNHFP
|
|
: - TANH(DPHI1) * SIN(DTHET2) * DTNHFM) )
|
|
: / (DMMOD1 * BFACT)
|
|
Y4(I) = (DNMOD2 * COSH(DTHET1) * ( - COS(DPHI2) * DTNHFP
|
|
: + TANH(DTHET1) * SIN(DPHI2) * DTNHFM) )
|
|
: / (DMMOD2 * BFACT)
|
|
*-----------------------------------------------------------------------
|
|
ELSE IF (X2 .GT. 0. .AND. X1 .LE. 0.) THEN
|
|
* HERE FOR X POSITIVE AND X NEGATIVE
|
|
* 2 1
|
|
DTNHFP = 1 + TANH(DZETA2)
|
|
DTNHFM = 1 - TANH(DZETA2)
|
|
BFACT = COSH(DTHET2) * ( COS(DTHET1) * DTNHFP
|
|
: - TANH(DTHET2) * SIN(DTHET1) * DTNHFM)
|
|
Y2(I) = 0.
|
|
IF (ABS(DZETA2) .LE. OFLOW) THEN
|
|
Y2(I) = COSH(DZETA2) * (DMMOD1 * DMMOD2 * BFACT)
|
|
Y2(I) = 1. / Y2(I)
|
|
END IF
|
|
Y4(I) = (DNMOD2 * COSH(DPHI2) * ( COS(DTHET1) * DTNHFP
|
|
: - TANH(DPHI2) * SIN(DTHET1) * DTNHFM) )
|
|
: / (DMMOD2 * BFACT)
|
|
Y1(I) = (DNMOD1 * COSH(DTHET2) * ( - COS(DPHI1) * DTNHFP
|
|
: + TANH(DTHET2) * SIN(DPHI1) * DTNHFM) )
|
|
: / (DMMOD1 * BFACT)
|
|
*-----------------------------------------------------------------------
|
|
END IF
|
|
Y1(I) = DALPHA * Y1(I)
|
|
Y4(I) = DALPHA * Y4(I)
|
|
Y2(I) = DALPHA * Y2(I) / DPI
|
|
* AT THIS POINT THE Y1, Y2, AND Y4 PROPAGATORS CORRESPOND IDENTICALLY T
|
|
* EQS. (38)-(44) OF M. ALEXANDER AND D. MANOLOPOULOS, "A STABLE LINEAR
|
|
* REFERENCE POTENTIAL ALGORITHM FOR SOLUTION ..."
|
|
END IF
|
|
10 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE STABIL(N,NB,Y,YP,F1,F2,SCR,YN,YPN,F1N,F2N)
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C FIND SCR SUCH THAT Y*SCR IS (PERMUTED) UNIT MATRIX,
|
|
C THEN TRANSFORM Y, YP, F1, AND F2 BY RIGHT MULTIPLICATION WITH SCR.
|
|
C
|
|
DIMENSION NB(N),Y(1),YP(1),F1(1),F2(1),
|
|
& YN(1),YPN(1),F1N(1),F2N(1),SCR(1)
|
|
C
|
|
C SAVE OLD INPUT MATRICES AND INITIALIZE SCR
|
|
C
|
|
NSQ=N*N
|
|
CALL DCOPY(NSQ,Y,1,YN,1)
|
|
CALL DCOPY(NSQ,YP,1,YPN,1)
|
|
CALL DCOPY(NSQ,F1,1,F1N,1)
|
|
CALL DCOPY(NSQ,F2,1,F2N,1)
|
|
DO 1100 IJ=1,NSQ
|
|
Y(IJ)=0.D0
|
|
1100 SCR(IJ)=0.D0
|
|
DO 1200 I=1,N
|
|
IJ=N*(I-1)+NB(I)
|
|
Y(IJ)=1.D0
|
|
1200 SCR(IJ)=1.D0
|
|
C
|
|
CALL DGESV(N,N,YN,N,YP,SCR,N,IER)
|
|
IF (IER.EQ.0) GO TO 2000
|
|
WRITE(6,600)
|
|
600 FORMAT(' * * * WARNING - STABILIZATION WITH BAD MATRIX.')
|
|
C
|
|
2000 CALL DGEMUL(YPN,N,'N',SCR,N,'N',YP,N,N,N,N)
|
|
CALL DGEMUL(F1N,N,'N',SCR,N,'N',F1,N,N,N,N)
|
|
CALL DGEMUL(F2N,N,'N',SCR,N,'N',F2,N,N,N,N)
|
|
C
|
|
RETURN
|
|
END
|
|
FUNCTION STEFF(X1,X2,IFLAG)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE D
|
|
C
|
|
C STEFFENSON ITERATION
|
|
C CONVERGENCE ACCELERATION FOR LINEAR CONVERGENCE
|
|
C
|
|
STEFF=X2
|
|
IF(IFLAG.EQ.1) D=0.D0
|
|
DEL=X2-X1
|
|
IF(DEL.EQ.0.D0) RETURN
|
|
RINV=D/DEL
|
|
D=DEL
|
|
IF(ABS(RINV).LE.0.4D0) RETURN
|
|
STEFF=STEFF+DEL/(RINV-1.D0)
|
|
D=0.D0
|
|
RETURN
|
|
END
|
|
SUBROUTINE STORAG(INTFLG,N,MXLAM,NV,NPOTL,
|
|
1 ISJ,IS0,IS1,IS2,IS3,IS4,IS5,IS6,IS7,IS8,IS9,
|
|
2 ESHIFT,NOPMAX,DEEP,IK,ICODE,PRINT, NUMDER)
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
INTEGER PRINT
|
|
LOGICAL NUMDER
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C N.B. NIPR WAS NOT USED IN V11 STORAGE ROUTINE! SHOULD IT BE?
|
|
C
|
|
NSQ=N*N
|
|
C
|
|
C IC2 IS NEXT AVAILABLE LOCATION ...
|
|
IC2=IXNEXT
|
|
NUSED=0
|
|
C
|
|
C SOLVE COUPLED EQUATIONS BY METHOD OF DEVOGELAERE
|
|
C
|
|
IF(INTFLG.EQ.2) THEN
|
|
IT1=IC2
|
|
IT2=IT1+MXLAM
|
|
IT3=IT2+4*NSQ
|
|
IT4=IT3+2*NSQ
|
|
IT5=IT4+4*NSQ
|
|
IT6=IT5+NSQ
|
|
IT7=IT6+NSQ
|
|
IXNEXT=IT7+N
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
CALL DVSCAT(N,NSQ,MXLAM,NPOTL,
|
|
1 X(IS0),X(IS1),X(IS2),X(IS3),X(IS4),X(IS5),X(IS6),X(IS7),
|
|
2 X(IS8),X(IS9),
|
|
3 X(IT1),X(IT2),X(IT3),X(IT4),X(IT5),X(IT6),X(IT7),
|
|
4 ESHIFT,ICODE,PRINT)
|
|
C
|
|
C SOLVE COUPLED EQUATIONS BY WALKER-LIGHT R-MATRIX PROPAGATOR METHOD
|
|
C
|
|
ELSE IF(INTFLG.EQ.3) THEN
|
|
IT1=IC2
|
|
IT2=IT1+MXLAM
|
|
IT3=IT2+NSQ
|
|
IT4=IT3+NSQ
|
|
IT5=IT4+N
|
|
IT6=IT5+N
|
|
IT7=IT6+N
|
|
IT8=IT7+N
|
|
IT9=IT8+N
|
|
IT10=IT9+N
|
|
IT11=IT10+N
|
|
IXNEXT=IT11+N
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
CALL RMTPRP(N,NSQ,MXLAM,NPOTL,
|
|
1 X(IS0),X(IS1),X(IS2),X(IS3),X(IS4),X(IS5),X(IS6),X(IS7),
|
|
2 X(ISJ),X(IS8),X(IS9),
|
|
3 X(IT1),X(IT2),X(IT3),X(IT4),X(IT5),X(IT6),X(IT7),X(IT8),
|
|
4 X(IT9),X(IT10),X(IT11),
|
|
5 NOPMAX,DEEP,IK,ICODE,PRINT,NV,0)
|
|
C
|
|
C SOLVE COUPLED EQUATIONS BY LOG DERIVATIVE/VIVAS
|
|
C
|
|
ELSE IF(INTFLG.EQ.4 .OR. INTFLG.EQ.5) THEN
|
|
IT1=IC2
|
|
IT2=IT1+MXLAM
|
|
IF(NUMDER) IT2=IT2+2*MXLAM
|
|
IT3=IT2+N
|
|
IT4=IT3+N
|
|
IT5=IT4+N
|
|
IT6=IT5+N
|
|
IVIV=1
|
|
IF(INTFLG.EQ.5) IVIV=0
|
|
IT7=IT6+N*IVIV
|
|
IT8=IT7+N*IVIV
|
|
IT9=IT8+N*IVIV
|
|
IT10=IT9+N*IVIV
|
|
IT11=IT10+N*IVIV
|
|
IT12=IT11+N*IVIV
|
|
IT13=IT12+N*IVIV
|
|
IT14=IT13+N*IVIV
|
|
IT15=IT14+N*IVIV
|
|
IT16=IT15+N*IVIV
|
|
IT17=IT16+N*IVIV
|
|
IT18=IT17+NSQ*IVIV
|
|
IT19=IT18+NSQ*IVIV
|
|
IT20=IT19+NSQ*IVIV
|
|
IT21=IT20+NSQ*IVIV
|
|
IT22=IT21+NSQ*IVIV
|
|
IT23=IT22+NSQ*IVIV
|
|
IT24=IT23+NSQ*IVIV
|
|
IXNEXT=IT24+NSQ*IVIV
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
CALL LDVIVS(N,NSQ,MXLAM,NPOTL,
|
|
1 X(IS0),X(IS1),X(IS2),X(IS3),X(IS4),X(IS5),X(IS6),X(IS7),
|
|
2 X(IS8),X(IS9),
|
|
3 X(IT1),X(IT2),X(IT3),X(IT4),X(IT5),X(IT6),X(IT7),X(IT8),
|
|
4 X(IT9),X(IT10),X(IT11),X(IT12),X(IT13),X(IT14),
|
|
5 X(IT15),X(IT16),X(IT17),X(IT18),X(IT19),X(IT20),X(IT21),
|
|
6 X(IT22),X(IT23),X(IT24),
|
|
7 ICODE,PRINT)
|
|
C
|
|
C DIABATIC MODIFIED LOG DERIVATIVE ALGORITHM.
|
|
C
|
|
ELSE IF(INTFLG.EQ.6) THEN
|
|
IT1=IC2
|
|
IT2=IT1+MXLAM
|
|
IT3=IT2+N
|
|
IT4=IT3+N
|
|
IT5=IT4+N
|
|
IXNEXT=IT5+N
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
C N.B. IT5 IS PASSED SO SPECIAL N=1 CODE CAN OVERLAY STORAGE
|
|
CALL DASCAT(N,NSQ,MXLAM,NPOTL,
|
|
1 X(IS0),X(IS1),X(IS2),X(IS3),X(IS4),X(IS5),X(IS6),X(IS7),
|
|
2 X(IS8),X(IS9),
|
|
3 X(IT1),X(IT2),X(IT3),X(IT4),X(IT5),
|
|
4 ICODE,PRINT, IT5 )
|
|
C
|
|
C QUASIADIABATIC MODIFIED LOG DERIVATIVE ALGORITHM.
|
|
C
|
|
ELSE IF(INTFLG.EQ.7) THEN
|
|
IT1=IC2
|
|
IT2=IT1+MXLAM
|
|
IT3=IT2+NSQ
|
|
IT4=IT3+NSQ
|
|
IT5=IT4+N
|
|
IT6=IT5+N
|
|
IT7=IT6+N
|
|
IT8=IT7+N
|
|
IT9=IT8+N
|
|
IXNEXT=IT9+N
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
CALL QASCAT(N,NSQ,MXLAM,NPOTL,
|
|
1 X(IS0),X(IS1),X(IS2),X(IS3),X(IS4),X(IS5),X(IS6),X(IS7),
|
|
2 X(IS8),X(IS9),
|
|
3 X(IT1),X(IT2),X(IT3),X(IT4),X(IT5),X(IT6),X(IT7),X(IT8),
|
|
4 X(IT9),
|
|
5 ICODE,PRINT)
|
|
C
|
|
C HYBRID DMLD/AIRY ALGORITHM OF ALEXANDER AND MANOLOPOULOS
|
|
C
|
|
ELSE IF(INTFLG.EQ.8) THEN
|
|
IT1=IC2
|
|
IT2=IT1+MXLAM
|
|
IT3=IT2+N
|
|
IT4=IT3+N
|
|
IT5=IT4+N
|
|
IT6=IT5+N
|
|
IT7=IT6+NSQ
|
|
IT8=IT7+NSQ
|
|
IT9=IT8+N
|
|
IU1=IT9+N
|
|
IXNEXT=IU1+N
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
CALL AXSCAT(N,NSQ,MXLAM,NPOTL,
|
|
1 X(IS0),X(IS1),X(IS2),X(IS3),X(IS4),X(IS5),X(IS6),X(IS7),
|
|
2 X(IS8),X(IS9),
|
|
3 X(IT1),X(IT2),X(IT3),X(IT4),X(IT5),
|
|
$ X(IT6),X(IT7),X(IT8),X(IT9),X(IU1),
|
|
4 ICODE,PRINT)
|
|
C
|
|
ELSE IF (INTFLG.EQ.-1) THEN
|
|
C
|
|
C SOLVE EQUATIONS BY WKB USING GAUSS-MEHLER INTEGRATION.
|
|
C ONLY GOOD FOR ONE-CHANNEL CASES
|
|
C
|
|
IF (N.EQ.1) GO TO 810
|
|
WRITE(6,601) N
|
|
601 FORMAT('0 ***** ERROR. WKB (INTFLG=-1) ONLY IMPLEMENTED FOR',
|
|
1 ' ONE-CHANNEL CASE. TERMINATED WITH N =',I4)
|
|
STOP
|
|
810 IT1=IC2
|
|
IT2=IT1+1
|
|
IT3=IT2+1
|
|
IXNEXT=IT3+MXLAM
|
|
IF (NUMDER) IXNEXT=IXNEXT+2*MXLAM
|
|
CALL CHKSTR(NUSED)
|
|
CALL WKB(N,MXLAM,NPOTL,X(IT1),X(IS0),X(IS1),X(IT3),X(IS8),
|
|
1 X(IS5),X(IS6),X(IT2),X(IS9),X(IS7),X(IS3),X(IS4),
|
|
2 NUMDER,PRINT)
|
|
C
|
|
ELSE
|
|
WRITE(6,699) INTFLG
|
|
699 FORMAT('0 STORAG CALLED WITH AN ILLEGAL INTFLG=',I4)
|
|
STOP
|
|
ENDIF
|
|
C
|
|
C WE ARE FINISHED WITH THIS TEMPORARY STORAGE; RESTORE IXNEXT.
|
|
C THIS IS CONSISTENT W/ V11 WHICH DID NOT MODIFY STORAG IC2 ARGUMENT
|
|
C HOWEVER, THIS MEANS THAT ONE CANNOT EXPECT ALLOCATED STORAGE
|
|
C TO BE RETAINED BEYOND A SCATTERING CALL
|
|
IXNEXT=IC2
|
|
RETURN
|
|
END
|
|
SUBROUTINE STRY(NLB,NUB,N,ITRY,EIGNEW)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE ITOLD
|
|
C
|
|
C THIS TESTS TO SEE IF ALL THE OFF-DIAGONAL ELEMENTS OF THE
|
|
C EIGENVECTORS HAVE BECOME NEGLIGIBLE COMPARED TO VTOL
|
|
C
|
|
DIMENSION NLB(1),NUB(1)
|
|
DIMENSION EIGNEW(1)
|
|
C TOLERANCE TO DETERMINE DEGENERACY.
|
|
DATA EPSIL / 1.D-2/
|
|
C STORE OLD VALUE OF ITRY
|
|
ITOLD = ITRY
|
|
IF(N.LE.1) GO TO 15
|
|
DO 10 I=1,N
|
|
C TEST FOR DEGENERACY
|
|
IF(I.EQ.1) GO TO 8
|
|
DIFF = ABS(EIGNEW(I)-EIGNEW(I-1))
|
|
C IF NEARLY DEGENERATE, DON'T BOTHER TO CHECK OFF-DIAGONAL
|
|
C EIGENVECTOR COMPONENTS
|
|
IF(DIFF.LT.EPSIL ) GO TO 10
|
|
IF(I.EQ.N) GO TO 9
|
|
8 DIFF = ABS(EIGNEW(I)-EIGNEW(I+1))
|
|
IF(DIFF.LT.EPSIL ) GO TO 10
|
|
9 IF(NLB(I).NE.NUB(I)) GO TO 20
|
|
10 CONTINUE
|
|
C IF THE FOLLOWING STATEMENT IS REACHED, ALL COMPONENTS ARE
|
|
C INDEED NEGLIGIBLE OR DEGENERATE
|
|
15 ITRY = 0
|
|
GO TO 30
|
|
C THIS IS REACHED WHEN AN ELEMENT IS TOO LARGE.
|
|
20 ITRY = -1
|
|
RETURN
|
|
30 IF(ITOLD.EQ.0 .AND. ITRY.EQ.0) ITRY = 1
|
|
C THIS MAKES SURE THAT THE ELEMENTS WERE ALSO NEGLIGIBLE AT THE
|
|
C LAST STEP.
|
|
C ITRY = 1 ON RETURN MEANS READY TO TRY FOR S-MATRIX CONVERGENCE
|
|
RETURN
|
|
END
|
|
LOGICAL FUNCTION STSRCH(LOG,LLOG,LSTR,N,I4)
|
|
C VERSION OF 21 MAR 95
|
|
CHARACTER*1 LOG,LLOG,LSTR(N)
|
|
IF (N.LE.0) GO TO 9000
|
|
DO 1000 I=1,N
|
|
IF (LSTR(I).NE.LOG.AND.LSTR(I).NE.LLOG) GO TO 1000
|
|
I4=I
|
|
STSRCH=.TRUE.
|
|
RETURN
|
|
1000 CONTINUE
|
|
9000 STSRCH=.FALSE.
|
|
I4=0
|
|
RETURN
|
|
END
|
|
SUBROUTINE SURBAS(JLEV, N, J, L, EINT, CENT, VL, IV,
|
|
1 MXLAM, NPOTL, LAM, ERED, WVEC, LCNT, THETA, PHI, EMAXK)
|
|
C
|
|
C SUBROUTINE TO SET UP ATOM-SURFACE SCATTERING.
|
|
C THIS VERSION USES 2 ELEMENTS OF THE VL ARRAY FOR EACH PAIR OF
|
|
C BASIS FUNCTIONS, SO REQUIRES NPOTL=2 RETURNED FROM POTENL.
|
|
C COMMON BLOCK NPOT COMMUNICATES THIS TO POTENL
|
|
C VERSION 14 CMBASE
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
SAVE
|
|
INTEGER FIND
|
|
LOGICAL LCNT,LEVIN,EIN,HEX,ORTHOG,EQUIV
|
|
DIMENSION JLEV(1), J(1), L(1), EINT(1), CENT(1),
|
|
1 WVEC(1), VL(1), IV(1), LAM(1)
|
|
COMMON/NPOT/NPTL
|
|
COMMON/CMBASE/ROTI(12),ELEVEL(1000),EMAX,WT(2),SPNUC,NLEVEL,
|
|
1 JLEVEL(4000),J1MIN,
|
|
2 J1MAX,J1STEP,IS1(10),J2MIN,J2MAX,J2STEP,IS2(10),JHALF,IDENT
|
|
3 ,MXJL,MXEL
|
|
COMMON/LATSYM/HEX,ORTHOG,EQUIV
|
|
DATA BFCT/16.857630D0/
|
|
C
|
|
SQUARE(A,B) = A*A + B*B + 2.D0*A*B*COSLAT
|
|
C
|
|
C ISYM IS A LABEL FOR THE TYPE OF SYMMETRIZATION:
|
|
C < 0 NO SYMMETRIZATION
|
|
C = 0 0 DEGREE SYMMETRIZATION FOR RECTANGULAR OR HEX LATTICE
|
|
C = 1 30 DEGREE SYMMETRIZATION FOR HEX LATTICE
|
|
C = 2 45 DEGREE SYMMETRIZATION FOR SQUARE LATTICE
|
|
C
|
|
ISYM = -1
|
|
IF((HEX.OR.ORTHOG) .AND. ABS(PHI).LT.1.D-10) ISYM = 0
|
|
IF(HEX .AND. ABS(MOD(PHI,60.D0)-30.D0).LT.1.D-10) ISYM = 1
|
|
IF(ORTHOG .AND. EQUIV .AND. ABS(MOD(PHI,90.D0)-45.D0).LT.1.D-10)
|
|
1 ISYM = 2
|
|
C
|
|
PARA=SQRT(ERED)*SIN(THETA*PI/180.D0)
|
|
SINPHI=SIN(PHI*PI/180.D0)
|
|
COSPHI=COS(PHI*PI/180.D0)
|
|
XK2=PARA*SINPHI/SINLAT
|
|
XK1=PARA*COSPHI-XK2*COSLAT
|
|
IF(LCNT) GOTO 50
|
|
WRITE(6,598)N,THETA,PHI,XK1,XK2
|
|
598 FORMAT(/I4,' CHANNEL BASIS FOR THETA =',F8.3,' PHI =',F8.3,
|
|
1 ' DEGREES'/' CORRESPONDING TO K = (',2F10.6,' ) A-1')
|
|
IF(ISYM.GE.0) WRITE(6,599)
|
|
599 FORMAT(' SYMMETRIZED BASIS USED FOR THESE ANGLES'/
|
|
1 ' NOTE THAT CALCULATED INTENSITIES FOR OUT-OF-PLANE BEAMS',
|
|
2 ' ARE IMPLICITLY SUMMED OVER EQUIVALENT PAIRS')
|
|
IF(EMAXK.NE.EMAX) WRITE(6,600) EMAXK
|
|
600 FORMAT(' BASIS FUNCTIONS LIMITED BY EMAXK =',F10.3)
|
|
C
|
|
50 I=0
|
|
N=0
|
|
DO 200 N1=1,NLEVEL
|
|
J1=JLEV(N1+NLEVEL)
|
|
IF(ISYM.GE.0 .AND. 2*J1.LT.ISYM*JLEV(N1)) GOTO 200
|
|
A=XK1+XH*DBLE(JLEV(N1))
|
|
B=XK2+XK*DBLE(J1)
|
|
ECHAN=SQUARE(A,B)
|
|
IF(ECHAN*ESCALE.GT.EMAXK) GOTO 200
|
|
N=N+1
|
|
IF(LCNT) GOTO 200
|
|
EINT(N)=ECHAN
|
|
DIF=ERED-ECHAN
|
|
WVEC(N)=SIGN(SQRT(ABS(DIF)),DIF)
|
|
J(N)=JLEV(N1+NLEV2)
|
|
L(N)=0
|
|
CENT(N)=0.D0
|
|
DO 100 M=1,N
|
|
N2=J(M)
|
|
J2=JLEV(N2+NLEVEL)
|
|
IF(ISYM.GE.0 .AND. 2*J2.LT.ISYM*JLEV(N2)) GOTO 100
|
|
I=I+1
|
|
I1=JLEV(N2)-JLEV(N1)
|
|
I2=J2-J1
|
|
IV(I)=FIND(I1,I2,LAM,MXLAM)
|
|
VL(I)=1.D0
|
|
IF(IV(I).EQ.0) VL(I)=0.D0
|
|
I=I+1
|
|
IV(I)=0
|
|
VL(I)=0.D0
|
|
IF(ISYM.LT.0) GOTO 100
|
|
IF(2*J1.EQ.ISYM*JLEV(N1) .NEQV. 2*J2.EQ.ISYM*JLEV(N2))
|
|
1 VL(I-1)=VL(I-1)*ROOT2
|
|
IF(2*J1.EQ.ISYM*JLEV(N1) .OR. 2*J2.EQ.ISYM*JLEV(N2)) GOTO 100
|
|
C
|
|
C IDENTIFY FOURIER COMPONENT CONNECTING SIGMA(N1) TO N2
|
|
C
|
|
GOTO(70,80),ISYM
|
|
I1=JLEV(N1)
|
|
IF(HEX) I1=I1-J1
|
|
I2=-J1
|
|
GOTO 90
|
|
70 I1=JLEV(N1)
|
|
I2=I1-J1
|
|
GOTO 90
|
|
80 I1=J1
|
|
I2=JLEV(N1)
|
|
90 I1=JLEV(N2)-I1
|
|
I2=J2-I2
|
|
IV(I)=FIND(I1,I2,LAM,MXLAM)
|
|
VL(I)=1.D0
|
|
IF(IV(I).EQ.0) VL(I)=0.D0
|
|
100 CONTINUE
|
|
200 CONTINUE
|
|
RETURN
|
|
C
|
|
C
|
|
ENTRY SET8(LEVIN,EIN,NLEV,JLEV,URED)
|
|
C
|
|
NPTL=2
|
|
ROOT2=SQRT(2.D0)
|
|
ESCALE=BFCT/URED
|
|
C
|
|
EMIN=0.D0
|
|
PI=ACOS(-1.D0)
|
|
COSLAT=COS(ROTI(3)*PI/180.D0)
|
|
SINLAT=SIN(ROTI(3)*PI/180.D0)
|
|
ORTHOG = ABS(COSLAT).LT.1.D-8
|
|
EQUIV = ABS(ROTI(1)-ROTI(2)).LT.1.D-8
|
|
HEX = EQUIV .AND. ABS(COSLAT+0.5D0).LT.1.D-8
|
|
XH=2.D0*PI/SINLAT/ROTI(1)
|
|
XK=2.D0*PI/SINLAT/ROTI(2)
|
|
WRITE(6,601)(ROTI(I),I=1,3),COSLAT
|
|
601 FORMAT(' LATTICE LENGTHS ARE',F10.6,' AND',F10.6,' A'/
|
|
1 ' RECIPROCAL LATTICE ANGLE IS ',F10.3,' DEGREES,',
|
|
2 ' COSINE =',F10.6/)
|
|
C
|
|
IF(LEVIN) GOTO 500
|
|
WRITE(6,602)EMIN,EMAX,J1MAX,J2MAX
|
|
602 FORMAT(' BASIS FUNCTIONS GENERATED WITH'/5X,'EMIN =',F10.3/
|
|
1 5X,'EMAX =',F10.3/5X,'G1MAX =',I10/5X,'G2MAX =',I10/)
|
|
N1MAX=SQRT(EMAX)/(SINLAT*XH)
|
|
N1MAX=MIN0(N1MAX,J1MAX)
|
|
NLEVEL=0
|
|
DO 300 N1=-N1MAX,N1MAX
|
|
A=DBLE(N1)*XH
|
|
B=A*COSLAT
|
|
N2MAX=(ABS(B)+SQRT(EMAX+B*B-A*A))/XK
|
|
N2MAX=MIN0(N2MAX,J2MAX)
|
|
DO 300 N2=-N2MAX,N2MAX
|
|
B=DBLE(N2)*XK
|
|
E=SQUARE(A,B)*ESCALE
|
|
IF(E.LT.EMIN .OR. E.GT.EMAX) GOTO 300
|
|
NLEVEL=NLEVEL+1
|
|
JLEVEL(2*NLEVEL-1)=N1
|
|
JLEVEL(2*NLEVEL) =N2
|
|
ELEVEL(NLEVEL)=E
|
|
300 CONTINUE
|
|
C
|
|
C SORT CHANNELS ON ENERGY FOR K=0
|
|
C
|
|
DO 400 N1=1,NLEVEL
|
|
DO 400 N2=N1+1,NLEVEL
|
|
IF(ELEVEL(N2).GE.ELEVEL(N1)) GOTO 400
|
|
E=ELEVEL(N1)
|
|
ELEVEL(N1)=ELEVEL(N2)
|
|
ELEVEL(N2)=E
|
|
I1=2*N1
|
|
I2=2*N2
|
|
I=JLEVEL(I1-1)
|
|
JLEVEL(I1-1)=JLEVEL(I2-1)
|
|
JLEVEL(I2-1)=I
|
|
I=JLEVEL(I1)
|
|
JLEVEL(I1)=JLEVEL(I2)
|
|
JLEVEL(I2)=I
|
|
400 CONTINUE
|
|
GOTO 700
|
|
C
|
|
500 DO 520 N1=1,NLEVEL
|
|
DO 520 N2=N1+1,NLEVEL
|
|
520 IF (JLEVEL(2*N1-1).EQ.JLEVEL(2*N2-1)
|
|
1 .AND. JLEVEL(2*N1) .EQ.JLEVEL(2*N2)) GOTO 530
|
|
GOTO 540
|
|
530 WRITE(6,603)N1,N2
|
|
603 FORMAT(' **** BASIS FUNCTIONS',I3,' AND',I3,' ARE THE SAME.',
|
|
1 ' TERMINATING.')
|
|
STOP
|
|
540 WRITE(6,604)NLEVEL
|
|
604 FORMAT(' BASIS FUNCTIONS TAKEN FROM JLEVEL INPUT WITH NLEVEL =',
|
|
1 I3)
|
|
700 NLEV=NLEVEL
|
|
NLEV2=NLEV+NLEV
|
|
DO 800 I=1,NLEV
|
|
N1=JLEVEL(2*I-1)
|
|
N2=JLEVEL(2*I)
|
|
JLEV(I)=N1
|
|
JLEV(I+NLEV)=N2
|
|
JLEV(I+NLEV2)=I
|
|
IF(.NOT.LEVIN) GOTO 800
|
|
A=DBLE(N1)*XH
|
|
B=DBLE(N2)*XK
|
|
ELEVEL(I)=SQUARE(A,B)*BFCT/URED
|
|
800 CONTINUE
|
|
C
|
|
IF(EIN) WRITE(6,605)
|
|
605 FORMAT(' *** NOTE. INPUT CHANNEL ENERGIES OVERWRITTEN BY VALUES',
|
|
1 ' CALCULATED FROM LATTICE PARAMETERS'/)
|
|
RETURN
|
|
END
|
|
SUBROUTINE SWRITE(IU,N,S)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION S(N,N)
|
|
C
|
|
WRITE(IU) ((S(I,J),J=1,I),I=1,N)
|
|
RETURN
|
|
C
|
|
ENTRY SREAD(IU,N,S,IEND)
|
|
IEND=0
|
|
READ(IU,END=9999) ((S(I,J),J=1,I),I=1,N)
|
|
DO 1000 I=1,N
|
|
DO 1000 J=1,I-1
|
|
1000 S(J,I)=S(I,J)
|
|
RETURN
|
|
9999 IEND=1
|
|
RETURN
|
|
END
|
|
SUBROUTINE SYMINV(A, IA, N, INERT)
|
|
C
|
|
C SIMULATES SYMINV SYMMETRIC MATRIX INVERTER WITH LAPACK CALLS
|
|
C THIS VERSION USES ONLY THE UPPER TRIANGLE OF A:
|
|
C NOT COMPATIBLE WITH MOLSCAT VERSION 11.
|
|
C JMH MAY 93
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
DIMENSION A(IA,N)
|
|
C
|
|
IT1=IXNEXT
|
|
IT2=IT1+(N+1)/NIPR
|
|
LWORK=MX-IT2+1
|
|
C
|
|
NB=ILAENV(1,'DSYTRF','L',N,-1,-1,-1)
|
|
LWREQ=N*NB
|
|
IF(LWORK.LT.LWREQ) THEN
|
|
WRITE(6,100) LWORK,N,NB
|
|
100 FORMAT(' *** ERROR: ONLY',I5,' WORDS OF WORKSPACE AVAILABLE',
|
|
1 ' IN SYMINV.'/' LAPACK ROUTINE DSYTRF NEEDS AT LEAST N*NB:',
|
|
2 ' N =',I5,' AND NB =',I5,' ON THIS CALL.')
|
|
STOP
|
|
ENDIF
|
|
C
|
|
IXNEXT=IT2+LWREQ
|
|
NUSED=0
|
|
CALL CHKSTR(NUSED)
|
|
C
|
|
CALL DSYTRF('L',N,A,IA,X(IT1),X(IT2),LWORK,INFO)
|
|
C
|
|
IF (INFO .NE. 0) THEN
|
|
WRITE (6,120) INFO
|
|
120 FORMAT(' *** ERROR IN DSYTRF: INFO =',I3)
|
|
STOP
|
|
END IF
|
|
C
|
|
INERT=0
|
|
C CALL DSYNEG(A,X(IT1),N,INERT)
|
|
C
|
|
CALL DSYTRI('L',N,A,IA,X(IT1),X(IT2),INFO)
|
|
C
|
|
IF (INFO .NE. 0) THEN
|
|
WRITE (6,130) INFO
|
|
130 FORMAT(' *** ERROR IN DSYTRI: INFO =',I3)
|
|
STOP
|
|
END IF
|
|
C
|
|
IXNEXT=IT1
|
|
C
|
|
RETURN
|
|
END
|
|
FUNCTION THREEJ (J1,J2,J3)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C COMPUTATION OF SPECIAL WIGNER 3J COEFFICIENT WITH
|
|
C VANISHING PROJECTIONS. SEE EDMONDS, P. 50.
|
|
C
|
|
C THIS VERSION EVALUATES BINOM AND PARITY IN-LINE
|
|
C SHOULD IMPROVE EFFICIENCY, ESPECIALLY ON CRAY;
|
|
C ALSO GIVES IMPROVEMENT ON AMDAHL (SG: 20 DEC 92)
|
|
C
|
|
C STATEMENT FUNCTION FOR DELTA ASSOCIATED W/ RACAH AND SIXJ SYMBOLS
|
|
C DELTA(I,J,K)= SQRT(1.D0/ ( BINOM(I+J+K+1,I+J-K) *
|
|
C 1 BINOM(K+K+1,I-J+K) * DBLE(K+J-I+1) ) )
|
|
C
|
|
I1=J1+J2+J3
|
|
IF (I1-2*(I1/2).NE.0) GO TO 8
|
|
1 I2=J1-J2+J3
|
|
IF (I2) 8,2,2
|
|
2 I3=J1+J2-J3
|
|
IF (I3) 8,3,3
|
|
3 I4=-J1+J2+J3
|
|
IF (I4) 8,4,4
|
|
4 I5=I1/2
|
|
I6=I2/2
|
|
SIGN=1.D0
|
|
IF (I5-2*(I5/2).NE.0) SIGN=-SIGN
|
|
C 7 THREEJ=SIGN*DELTA(J1,J2,J3)*BINOM(I5,J1)*BINOM(J1,I6)
|
|
C B1,B2 ARE BINOM ASSOCIATED W/ DELTA
|
|
N=J1+J2+J3+1
|
|
M=J1+J2-J3
|
|
NM = N-M
|
|
MNM = MIN(NM,M)
|
|
IF(MNM.LE.0) THEN
|
|
B1=1.D0
|
|
ELSE
|
|
FN = N+1
|
|
F = 0.D0
|
|
B = 1.D0
|
|
DO 101 I = 1,MNM
|
|
F = F+1.D0
|
|
C = (FN-F)*B
|
|
101 B = C/F
|
|
B1 = B
|
|
ENDIF
|
|
N=J3+J3+1
|
|
M=J1-J2+J3
|
|
NM = N-M
|
|
MNM = MIN(NM,M)
|
|
IF(MNM.LE.0) THEN
|
|
B2=1.D0
|
|
ELSE
|
|
FN = N+1
|
|
F = 0.D0
|
|
B = 1.D0
|
|
DO 102 I = 1,MNM
|
|
F = F+1.D0
|
|
C = (FN-F)*B
|
|
102 B = C/F
|
|
B2 = B
|
|
ENDIF
|
|
DELTA=SQRT(1.D0/(B1*B2*(J3+J2-J1+1)))
|
|
C B3=BINOM(I5,J1), B4=BINOM(J1,I6)
|
|
N=I5
|
|
M=J1
|
|
NM = N-M
|
|
MNM = MIN(NM,M)
|
|
IF(MNM.LE.0) THEN
|
|
B3=1.D0
|
|
ELSE
|
|
FN = N+1
|
|
F = 0.D0
|
|
B = 1.D0
|
|
DO 103 I = 1,MNM
|
|
F = F+1.D0
|
|
C = (FN-F)*B
|
|
103 B = C/F
|
|
B3 = B
|
|
ENDIF
|
|
N=J1
|
|
M=I6
|
|
NM = N-M
|
|
MNM = MIN(NM,M)
|
|
IF(MNM.LE.0) THEN
|
|
B4=1.D0
|
|
ELSE
|
|
FN = N+1
|
|
F = 0.D0
|
|
B = 1.D0
|
|
DO 104 I = 1,MNM
|
|
F = F+1.D0
|
|
C = (FN-F)*B
|
|
104 B = C/F
|
|
B4 = B
|
|
ENDIF
|
|
THREEJ=SIGN*DELTA*B3*B4
|
|
RETURN
|
|
8 THREEJ=0.D0
|
|
RETURN
|
|
END
|
|
FUNCTION THRJ(F1,F2,F3,G1,G2,G3)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C SMALL CHANGES 31 JUL 95 (SG)
|
|
SAVE MUNG,X,Y
|
|
PARAMETER (MXIX=302)
|
|
DIMENSION X(MXIX),Y(MXIX)
|
|
DATA MUNG/0/
|
|
IF (MUNG.EQ.21) GO TO 69
|
|
MUNG = 21
|
|
X(1) = 0.D0
|
|
DO 100 I = 1, MXIX-1
|
|
A = I
|
|
X(I+1) = LOG(A) +X(I)
|
|
Y(I+1) = LOG(A)
|
|
100 CONTINUE
|
|
69 IF(F1-ABS(G1)) 1,13,13
|
|
13 IF(F2-ABS(G2))1,14,14
|
|
14 IF(F3-ABS(G3))1,15,15
|
|
15 SUM=F1+F2+F3
|
|
NSUM=SUM+.001D0
|
|
IF(SUM-NSUM)2,2,1
|
|
1 THRJ=0.D0
|
|
RETURN
|
|
2 IF(ABS(G1+G2+G3)-1.D-08)3,3,1
|
|
3 IF(F1+F2-F3)1,4,4
|
|
4 IF(F1+F3-F2)1,5,5
|
|
5 IF(F2+F3-F1)1,6,6
|
|
6 J1=2.D0*F3+2.001D0
|
|
J2=F1+F2-F3+1.001D0
|
|
J3=F1-F2+F3+1.001D0
|
|
J4=-F1+F2+F3+1.001D0
|
|
J5=F1+F2+F3+2.001D0
|
|
J6=F1+G1+1.001D0
|
|
J7=F1-G1+1.001D0
|
|
J8=F2+G2+1.001D0
|
|
J9=F2-G2+1.001D0
|
|
J10=F3+G3+1.001D0
|
|
J11=F3-G3+1.001D0
|
|
IF(J5.GT.MXIX) THEN
|
|
WRITE(6,601) J5,MXIX
|
|
601 FORMAT(' *** DIMENSION ERROR IN THRJ - INDEX.GT.MXIX',2I5)
|
|
STOP
|
|
ENDIF
|
|
R=0.5D0*(Y(J1)+X(J2)+X(J3)+X(J4)-X(J5)
|
|
1+X(J6)+X(J7)+X(J8)+X(J9)+X(J10)+X(J11))
|
|
SUM=0.D0
|
|
F=-1
|
|
KZ=-1
|
|
7 KZ=KZ+1
|
|
F=-F
|
|
J1=KZ+1
|
|
J2=F1+F2-F3-KZ+1.001D0
|
|
IF(J2)20,20,8
|
|
8 J3=F1-G1-KZ+1.001D0
|
|
IF(J3)20,20,9
|
|
9 J4=F2+G2-KZ+1.001D0
|
|
IF(J4)20,20,10
|
|
10 J5=F3-F2+G1+KZ+1.001D0
|
|
IF(J5)7,7,11
|
|
11 J6=F3-F1-G2+KZ+1.001D0
|
|
IF(J6)7,7,12
|
|
12 JMAX=MAX(J1,J2,J3,J4,J5,J6)
|
|
IF(JMAX.GT.MXIX) THEN
|
|
WRITE(6,601) JMAX,MXIX
|
|
STOP
|
|
ENDIF
|
|
S=-(X(J1)+X(J2)+X(J3)+X(J4)+X(J5)+X(J6))
|
|
SUM=SUM+F*EXP(R+S)
|
|
GO TO 7
|
|
20 INT=ABS(F1-F2-G3)+0.0001D0
|
|
VAL=((-1.D0)**INT)*SUM/SQRT(2.D0*F3+1.D0)
|
|
IF(ABS(VAL).LE.1.D-6) VAL=0.D0
|
|
THRJ=VAL
|
|
RETURN
|
|
END
|
|
SUBROUTINE TRNSFM(T,W,A,N,ISTOP,ISYM)
|
|
C-------------------------------------------------------------------
|
|
C WRITTEN BY G. A. PARKER.
|
|
C MODIFIED TO USE BLAS BY J. M. HUTSON
|
|
C THIS ROUTINE TRANSFORMS THE MATRIX W INTO A NEW BASIS SET
|
|
C ISTOP=.TRUE. ==> RETURN AFTER A = TRANSPOSE(W) * T
|
|
C ISTOP=.FALSE. ==> CONTINUE TO FORM W = TRANSPOSE(T) * W * T
|
|
C ISYM =.TRUE. ==> FORCE THE RESULTING MATRIX TO BE SYMMETRIC.
|
|
C N IS THE DIMENSION OF THE MATRICES.
|
|
C-------------------------------------------------------------------
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
LOGICAL ISTOP,ISYM
|
|
DIMENSION T(1),W(1),A(1)
|
|
DATA ZERO/0.D0/,HALF/0.5D0/,ONE/1.D0/
|
|
C-------------------------------------------------------------------
|
|
C MULTIPLY THE TRANSPOSE OF THE MATRIX W TIMES T AND
|
|
C STORE THE RESULT INTO MATRIX A.
|
|
C-------------------------------------------------------------------
|
|
IF (N.EQ.1) GOTO 300
|
|
IF (ISYM) GOTO 140
|
|
CALL DGEMUL(W,N,'T',T,N,'N',A,N,N,N,N)
|
|
IF (ISTOP) RETURN
|
|
C-------------------------------------------------------------------
|
|
C MULTIPLY THE TRANSPOSE OF MATRIX A TIMES MATRIX
|
|
C T AND STORE THE RESULT INTO MATRIX W
|
|
C-------------------------------------------------------------------
|
|
CALL DGEMUL(A,N,'T',T,N,'N',W,N,N,N,N)
|
|
RETURN
|
|
C-------------------------------------------------------------------
|
|
C THIS IS REACHED ONLY WHEN W AND THE RESULT MATRIX ARE SYMMETRIC,
|
|
C SO THAT ONLY HALF THE MATRIX NEED BE COMPUTED
|
|
C AND THE OTHER HALF STORED BY SYMMETRY.
|
|
C-------------------------------------------------------------------
|
|
140 CALL DSYMM('L','L',N,N,ONE,W,N,T,N,ZERO,A,N)
|
|
IF (ISTOP) RETURN
|
|
CALL DSYR2K('L','T',N,N,HALF,A,N,T,N,ZERO,W,N)
|
|
CALL DSYFIL('U',N,W,N)
|
|
RETURN
|
|
C
|
|
300 A(1)=W(1)*T(1)
|
|
IF (ISTOP) RETURN
|
|
W(1)=A(1)*T(1)
|
|
RETURN
|
|
END
|
|
SUBROUTINE TRNSP(A,N)
|
|
C
|
|
C SUBROUTINE FOR IN-PLACE TRANSPOSITION OF N X N MATRIX A
|
|
C BASED ON MILLARD ALEXANDER'S TRANSP
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION A(1)
|
|
ICOLPT = 2
|
|
IROWPT = N + 1
|
|
DO 100 ICOL = 1, N - 1
|
|
C ICOLPT POINTS TO FIRST SUB-DIAGONAL ELEMENT IN COLUMN ICOL
|
|
C IROWPT POINTS TO FIRST SUPER-DIAGONAL ELEMENT IN ROW ICOL
|
|
C NROW IS NUMBER OF SUBDIAGONAL ELEMENTS IN THIS COLUMN
|
|
NROW = N - ICOL
|
|
CALL DSWAP (NROW, A(ICOLPT), 1, A(IROWPT), N)
|
|
ICOLPT = ICOLPT + N + 1
|
|
IROWPT = IROWPT + N + 1
|
|
100 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE VINIT(I,RM,EPSIL)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
RM=.529177D0
|
|
EPSIL=219474.63D0
|
|
c ENTRY VSTAR (I,RR,SUM)
|
|
c ENTRY VSTAR1(I,RR,SUM)
|
|
c ENTRY VSTAR2(I,RR,SUM)
|
|
c WRITE(6,601) I
|
|
c 601 FORMAT('0 *** ERROR. DUMMY VERSION OF VINIT CALLED WITH I =',
|
|
c 1 I4/14X,'VINIT MUST BE PROVIDED IF NTERM(I) IS ZERO.')
|
|
c STOP
|
|
END
|
|
SUBROUTINE VIVAS(N,NSQ,DRNOW,RMIN,RMAX,DRMAX,TLDIAG,TOFF,
|
|
X ESHIFT,RMAT,EYE11,EYE12,EYE22,W,W0,W1,W2,TSTORE,
|
|
X VECOLD,VECNEW,G1,G1P,G2,G2P,A1,A1P,B1,B1P,
|
|
X XSQ,XK,COSX,SINX,SINE,DIAG,NOPEN,PRNTLV,ISC,
|
|
X P,VL,IVL,ERED,EINT,CENT,RMLMDA,MXLAM,WKS,NPOTL)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C------------------------------------------------------------------
|
|
C MODIFIED FROM NRCC CODE FOR COMPATIBILITY WITH MOLSCAT
|
|
C BY S. GREEN (FEB. 1981) AND J.M. HUTSON (OCT. 1984)
|
|
C APR 87 MODIFY WARNING OUTPUT ASSOC. W/ 1800 FORMAT
|
|
C------------------------------------------------------------------
|
|
C ROUTINES USED
|
|
C WAVMAT -CALCULATES THE POTENTIAL ENERGY INTERACTION MATRIX
|
|
C DERMAT -CALCULATES THE FIRST AND SECOND DERIVATIVES OF THE POTENTIAL
|
|
C TRNSFM -TRANSFORMS MATRICES INTO THE NEW BASIS VIA A
|
|
C SIMILARITY TRANSFORMATION
|
|
C PERT1 -CALCULATES THE PERTURBATION CORRECTIONS TO THE
|
|
C PERT2 WAVEFUNCTONS.
|
|
C DGESV -SOLVES A LINEAR SYSTEMS OF EQUATIONS.
|
|
C DELRD -PREDICTS THE NEW STEP SIZE.
|
|
C F02ABF -DIAGONALIZES A REAL SYMMETRIC MATRIX AND RETURN THE
|
|
C EIGENVALUES AND EIGENVECTORS.
|
|
C------------------------------------------------------------------
|
|
C ON ENTERING
|
|
C N - NUMBER OF CHANNELS
|
|
C NSQ - N*N
|
|
C DRNOW - INITIAL STEP SIZE
|
|
C RMIN - MINIMUM RADIAL DISTANCE
|
|
C RMAX - MAXIMUM RADIAL DISTANCE
|
|
C DRMAX - MAXIMUM ALLOWED STEP SIZE
|
|
C TLDIAG- STEP TOLERANCE PARAMETER
|
|
C TOFF - INTERVAL TOLERANCE PARAMETER
|
|
C ISC - SCRATCH UNIT USED IF IREAD/IWRITE IS TRUE
|
|
C--------------------------------------------------------------------
|
|
C PRINT LEVEL FOR MOLSCAT
|
|
INTEGER PRNTLV
|
|
C------------------------------------------------------------------
|
|
C CHARACTER VARIABLES
|
|
C------------------------------------------------------------------
|
|
CHARACTER*4 LRMAT,LUDP,LUD,LDG2P,LDG2,LDG1P,LDG1,LG2P,
|
|
1 LG2,LG1P,LG1,LW0,LW2,LVECNW,LDIAG,LW1,LEYE11,LEYE12,LEYE22
|
|
C-------------------------------------------------------------------
|
|
C LOGICAL VARIABLES
|
|
C-------------------------------------------------------------------
|
|
LOGICAL IVD,IVPD,IVPPD,IALFP,NUMDER
|
|
LOGICAL IVECT,IPOTL,IEYE,IGZRO,IGPERT,IWAVE,IRMAT,ITHS
|
|
LOGICAL ITRUE,IFALSE,NEWINT
|
|
LOGICAL IV,IVP,IVPP,ISHIFT,IREAD,IDIAG,IWRITE,ICRMAT
|
|
LOGICAL IPERT,LAST,ISYM
|
|
C-------------------------------------------------------------------
|
|
C LABELLED COMMONS
|
|
C CONTROL VARIABLES PASSED FROM DRIVER
|
|
C-------------------------------------------------------------------
|
|
COMMON/LDVVCM/ XSQMAX,ALPHA1,ALPHA2,IALPHA,IALFP,IV,IVP,IVPP,
|
|
1 NUMDER,ISHIFT,IDIAG,IPERT,ISYM,IREAD,IWRITE
|
|
C-------------------------------------------------------------------
|
|
C IF THE LOGICAL VARIABLE IS TRUE THEN
|
|
C IV - CALCULATES PERTURBATION CORRECTIONS FROM THE CONSTANT
|
|
C TERMS IN THE INTERACTION POTENTIAL.
|
|
C IVP - CALCULATES PERTURBATION CORRECTIONS FROM THE FIRST
|
|
C DERIVATIVE OF THE INTERACTION POTENTIAL.
|
|
C IVPP - CALCULATES PERTURBATION CORRECTIONS FROM THE SECOND
|
|
C DERIVATIVE OF THE INTERACTION POTENTIAL.
|
|
C ISHIFT- SHIFTS THE REFERENCE POTENTIAL TO BEST FIT THE TRUE
|
|
C POTENTIAL.
|
|
C NUMDER- CALCULATES POTENTIAL DERIVATIVES NUMERICALLY
|
|
C IDIAG - INCLUDES ALL OF THE DIAGONAL PERTUBATION CORRECTIONS.
|
|
C ISYM - SYMMETRIZES THE R-MATRIX AT EACH INTERVAL.
|
|
C IPERT - USES THE PERTURBATIONS CORRECTIONS.
|
|
C IALFP - THE GEOMETRIC PROGRESSION PARAMETER ALPHA IS PREDICTED.
|
|
C ALPHA1- MINIMUM GEOMETRIC PROGRESSION PARAMETER.
|
|
C ALPHA2- MAXIMUM GEOMETRIC PROGRESSION PARAMETER.
|
|
C IALPHA- IF IALPHA.GT.0 THEN THE STEP SIZE IS DETERMINED USING
|
|
C A GEOMETRIC PROGRESSION AND THE INTERVAL IS DIVIDED
|
|
C INTO IALPHA STEPS.
|
|
C------------------------------------------------------------------
|
|
COMMON/POPT/IVECT,IPOTL,IEYE,IGZRO,IGPERT,IWAVE,IRMAT,IOC
|
|
LOGICAL LPOPT(7)
|
|
EQUIVALENCE (LPOPT(1),IVECT)
|
|
C LPOPT CONTAINS PRINTING OPTIONS FROM NRCC VERSION.
|
|
C THESE ARE ALL SET FALSE HERE. CHANGE TO DEBUG.
|
|
C WHEN THE LOGICAL VARIABLE IS TRUE,
|
|
C IVECT - EIGENVALUES AND EIGENVECTORS.
|
|
C IPOTL - POTENTIAL ENERGY MATRICES AND ITS DERIVATIVES.
|
|
C IEYE - ACCUMULATED PERTURBATION INTEGRALS.
|
|
C IGZRO - ZERO-TH ORDER WAVEFUNCTIONS.
|
|
C IGPERT- PERTURBED WAVEFUNCTIONS.
|
|
C IWAVE - PERTURBED WAVEFUNCTIONS.
|
|
C IRMAT - R-MATRIX
|
|
C IOC - INFORMATION PRINTED EVERY IOC-TH STEP
|
|
C--------------------------------------------------------------------
|
|
C ARRAYS DIMENSIONED AS VECTORS
|
|
C-------------------------------------------------------------------
|
|
DIMENSION G1(N),G1P(N),G2(N),G2P(N)
|
|
DIMENSION A1(N),A1P(N),B1(N),B1P(N)
|
|
DIMENSION XSQ(N),XK(N),COSX(N),SINX(N),SINE(N),DIAG(N)
|
|
C-------------------------------------------------------------------
|
|
C ARRAYS DIMENSIONED AS MATRICES
|
|
C-------------------------------------------------------------------
|
|
DIMENSION EYE11(NSQ),EYE12(NSQ),EYE22(NSQ)
|
|
DIMENSION W0(NSQ),W1(NSQ),W2(NSQ),W(NSQ)
|
|
DIMENSION RMAT(NSQ)
|
|
DIMENSION TSTORE(NSQ),VECOLD(NSQ),VECNEW(NSQ)
|
|
DIMENSION P(MXLAM),VL(2),IVL(2),EINT(N),CENT(N),WKS(N)
|
|
C-------------------------------------------------------------------
|
|
C DATA STATEMENTS FOR PRINTING
|
|
C-------------------------------------------------------------------
|
|
DATA LRMAT/'RMAT'/,LUDP/' UP'/,LUD/' U'/,LDG2P/'DG2P'/
|
|
DATA LDG2/' DG2'/,LDG1P/'DG1P'/,LDG1/' DG1'/,LG2P/' G2P'/
|
|
DATA LG2/' G2'/,LG1P/' G1P'/,LG1/' G1'/,LW0/' W0'/
|
|
DATA LW2/' W2'/,LVECNW/'VCNW'/,LDIAG/'DIAG'/
|
|
DATA LW1/' W1'/,LEYE11/' I11'/,LEYE12/' I12'/,LEYE22/' I22'/
|
|
C-------------------------------------------------------------------
|
|
C LOGICAL DATA STATEMENTS
|
|
C-------------------------------------------------------------------
|
|
DATA IFALSE/.FALSE./,ITRUE/.TRUE./
|
|
C-------------------------------------------------------------------
|
|
C
|
|
C SET DEFAULT VALUES FOR PRINTING
|
|
NSGERR=0
|
|
IOC=5
|
|
DO 100 I=1,7
|
|
100 LPOPT(I)=.FALSE.
|
|
IF(.NOT.(IREAD.AND.IWRITE)) GO TO 101
|
|
WRITE(6,699)
|
|
699 FORMAT('0 * * * ERROR. IREAD AND IWRITE CANNOT BOTH BE TRUE.')
|
|
IREAD=.FALSE.
|
|
IWRITE=.FALSE.
|
|
101 CONTINUE
|
|
IVD = IV .OR. IDIAG
|
|
IVPD = IVP .OR. IDIAG
|
|
IVPPD = IVPP .OR. IDIAG
|
|
C-------------------------------------------------------------------
|
|
C PRINT CONTROL DATA
|
|
IF(PRNTLV.LE.15) GO TO 110
|
|
WRITE(6,1200)
|
|
WRITE(6,1300) IVECT,IPOTL,IEYE,IGZRO,IGPERT,IWAVE,IRMAT,
|
|
X IWRITE,IREAD,IOC
|
|
WRITE(6,1400)
|
|
WRITE(6,1500) IV,IVP,IVPP,ISHIFT,IDIAG,ISYM,IPERT,IALFP
|
|
WRITE(6,1600) ALPHA1,ALPHA2,IALPHA
|
|
WRITE(6,2500)
|
|
WRITE(6,2600) RMIN,RMAX,DRNOW,DRMAX,TOFF,TLDIAG
|
|
110 COFFL = 0.D0
|
|
IF(N .EQ. 0) RETURN
|
|
NEWINT = .FALSE.
|
|
NP1 = N+1
|
|
ICRMAT = .TRUE.
|
|
TOL = 1.D-11
|
|
LAST = .FALSE.
|
|
ITRANS = 0
|
|
IK = 0
|
|
DO 130 I = 1,N
|
|
G1(I) = 0.D0
|
|
G1P(I) = 1.D0
|
|
G2(I) = 1.D0
|
|
G2P(I) = 0.D0
|
|
DO 130 K = 1,N
|
|
IK = IK+1
|
|
VECNEW(IK) = 0.D0
|
|
IF(I .EQ. K) VECNEW(IK) = 1.D0
|
|
EYE11(IK) = 0.D0
|
|
EYE12(IK) = 0.D0
|
|
130 EYE22(IK) = 0.D0
|
|
IF(PRNTLV.GE.15) WRITE(6,3100)
|
|
ISTEP = 1
|
|
NTRVL = 0
|
|
DINT = DRNOW
|
|
DIAGI = RMIN+0.5D0*DINT
|
|
RMID = RMIN
|
|
RLAST = RMIN
|
|
XBAR = 0.D0
|
|
XSBAR = 0.D0
|
|
EBAR = 0.D0
|
|
EXBAR = 0.D0
|
|
IF(IALPHA .LE. 0) GO TO 150
|
|
BALPHA = (ALPHA2-ALPHA1)/(RMAX-RMIN)
|
|
ALPHA = ALPHA1+BALPHA*(DIAGI-RMIN)
|
|
IF(IALFP) ALPHA = ALPHA1
|
|
IF(ALPHA .NE. 1.D0) GO TO 140
|
|
DRNOW = DINT/IALPHA
|
|
GO TO 150
|
|
140 DRNOW = DINT*(ALPHA-1.D0)/(ALPHA**IALPHA-1.D0)
|
|
150 RNOW = RMIN+DRNOW
|
|
IF(IWRITE) WRITE(ISC) RMIN,RMAX,DINT,DIAGI,RMID,IALPHA,BALPHA,
|
|
X ALPHA1,ALPHA2,IALPHA
|
|
IF(.NOT. IREAD) GO TO 160
|
|
READ(ISC) RMIN,RMAX,DINT,DIAGI,RMID,IALPHA,BALPHA,
|
|
X ALPHA1,ALPHA2,IALPHA
|
|
C-------------------------------------------------------------------
|
|
C START OF THE PROPAGATION LOOP
|
|
C-------------------------------------------------------------------
|
|
155 READ(ISC) ISTEP,RNOW,DRNOW,LAST,N,DIAG,TSTORE,
|
|
X W0,W1,W2,VECNEW,NTRVL,RMIDI,RLAST,RCENT,ITRANS
|
|
READ(ISC) NEWINT
|
|
DO 158 I=1,N
|
|
158 DIAG(I)=DIAG(I)+ESHIFT
|
|
160 RCENT = RNOW-0.5D0*DRNOW
|
|
ITHS = .FALSE.
|
|
IF(((NTRVL+1)/IOC)*IOC .EQ. NTRVL+1) ITHS = .TRUE.
|
|
IF(IREAD) GO TO 300
|
|
C-------------------------------------------------------------------
|
|
C EVALUATE THE POTENTIAL AND ITS DERIVATIVES.
|
|
C-------------------------------------------------------------------
|
|
CALL WAVMAT(W,N,RCENT,
|
|
1 P,VL,IVL,ERED,EINT,CENT,RMLMDA,WKS,MXLAM,NPOTL)
|
|
DO 165 I = 1, NSQ
|
|
165 W0(I) = W(I)
|
|
IF(IVPD .AND. IVPPD) GO TO 200
|
|
DO 170 I = 1, NSQ
|
|
W1(I) = 0.D0
|
|
170 W2(I) = 0.D0
|
|
200 IF(IVPPD .OR. ISHIFT) CALL DERMAT(2,W2,N,RCENT,
|
|
1 P,VL,IVL,CENT,RMLMDA,MXLAM,NPOTL,NUMDER)
|
|
IF (IVPD) CALL DERMAT(1,W1,N,RCENT,
|
|
1 P,VL,IVL,CENT,RMLMDA,MXLAM,NPOTL,NUMDER)
|
|
FACTOR = DRNOW*DRNOW/24.D0
|
|
IF( .NOT. ISHIFT) FACTOR = 0.D0
|
|
IF( .NOT. ICRMAT) GO TO 270
|
|
RMIDI = DIAGI
|
|
C-------------------------------------------------------------------
|
|
C EVALUATE THE POTENTIAL AT THE RMIDI WHERE THE INTERACTION IS TO
|
|
C BE DIAGONALIZED AND SAVE THE OLD EIGENVECTORS.
|
|
C-------------------------------------------------------------------
|
|
IF(RMIDI .NE. RCENT) CALL WAVMAT(W,N,RMIDI,
|
|
1 P,VL,IVL,ERED,EINT,CENT,RMLMDA,WKS,MXLAM,NPOTL)
|
|
DO 240 I = 1,NSQ
|
|
240 VECOLD(I) = VECNEW(I)
|
|
ITRANS = ITRANS+1
|
|
C-------------------------------------------------------------------
|
|
C DIAGONALIZE THE INTERACTION POTENTIAL.
|
|
C-------------------------------------------------------------------
|
|
IFAIL=0
|
|
CALL F02ABF(W,N,N,DIAG,VECNEW,N,WKS,IFAIL)
|
|
IF( .NOT. ITHS) GO TO 270
|
|
IF( .NOT. IVECT) GO TO 270
|
|
WRITE(6,2900) LDIAG
|
|
WRITE(6,2800) (DIAG(I),I = 1,N)
|
|
WRITE(6,2900) LVECNW
|
|
WRITE(6,2800) (VECNEW(I),I = 1,NSQ)
|
|
C--------------------------------------------------------------------
|
|
C TRANSFORM THE POTENTIAL AND ITS DERIVATIVES INTO THE LOCAL BASIS.
|
|
C--------------------------------------------------------------------
|
|
270 CALL TRNSFM(VECNEW,W0,TSTORE,N,IFALSE,ITRUE)
|
|
IF(IVPD) CALL TRNSFM(VECNEW,W1,TSTORE,N,IFALSE,ITRUE)
|
|
IF(IVPPD .OR. ISHIFT) CALL TRNSFM(VECNEW,W2,TSTORE,N,IFALSE,
|
|
X ITRUE)
|
|
C-------------------------------------------------------------------
|
|
C DETERMINE THE NEW TRANSFORMATION MATRIX
|
|
C-------------------------------------------------------------------
|
|
IF(ICRMAT) CALL DGEMUL(VECOLD,N,'T',VECNEW,N,'N',TSTORE,N,N,N,N)
|
|
C-------------------------------------------------------------------
|
|
C TRANSFORM THE R-MATRIX INTO THE NEW BASIS.
|
|
C-------------------------------------------------------------------
|
|
300 IF(ICRMAT) CALL TRNSFM(TSTORE,RMAT,W,N,IFALSE,ISYM)
|
|
ICRMAT = .FALSE.
|
|
IF(IREAD) GO TO 350
|
|
C-------------------------------------------------------------------
|
|
C SHIFT THE EIGENVALUES AND INITIALIZE FOR CONTRIBUTIONS NOT DESIRED.
|
|
C-------------------------------------------------------------------
|
|
INDEX = -N
|
|
DO 330 J = 1,N
|
|
INDEX = INDEX+NP1
|
|
DIAG(J) = -W0(INDEX)-FACTOR*W2(INDEX)
|
|
330 W0(INDEX) = -FACTOR*W2(INDEX)
|
|
IF(IVD .AND. IVPD .AND. IVPPD) GO TO 350
|
|
CTERM0 = 1.D0
|
|
CTERM1 = 1.D0
|
|
CTERM2 = 1.D0
|
|
IF( .NOT. IVD) CTERM0 = 0.D0
|
|
IF( .NOT. IVPD) CTERM1 = 0.D0
|
|
IF( .NOT. IVPPD) CTERM2 = 0.D0
|
|
DO 340 I = 1,NSQ
|
|
W0(I) = W0(I)*CTERM0
|
|
W1(I) = W1(I)*CTERM1
|
|
340 W2(I) = W2(I)*CTERM2
|
|
C-------------------------------------------------------------------
|
|
C WRITE ON UNIT ISC THE INFORMATION NECESSARY FOR SUBSEQUENT ENERGY
|
|
C CALCULATIONS.
|
|
C-------------------------------------------------------------------
|
|
350 IF(IWRITE) WRITE(ISC) ISTEP,RNOW,DRNOW,LAST,N,DIAG,TSTORE,
|
|
X W0,W1,W2,VECNEW,NTRVL,RMIDI,RLAST,RCENT,ITRANS
|
|
IF( .NOT. ITHS) GO TO 360
|
|
IF( .NOT. IPOTL) GO TO 360
|
|
WRITE(6,2900) LDIAG
|
|
WRITE(6,2800) (DIAG(I),I = 1,N)
|
|
WRITE(6,2900) LW0
|
|
WRITE(6,2800) (W0(I),I = 1,NSQ)
|
|
WRITE(6,2900) LW1
|
|
WRITE(6,2800) (W1(I),I = 1,NSQ)
|
|
WRITE(6,2900) LW2
|
|
WRITE(6,2800) (W2(I),I = 1,NSQ)
|
|
WRITE(6,2900) IALPHA
|
|
C-------------------------------------------------------------------
|
|
C CALCULATE THE ZERO-TH ORDER WAVEFUNCTIONS AND DERIVATIVES.
|
|
C-------------------------------------------------------------------
|
|
360 NOPLOC = 0
|
|
DO 390 I = 1,N
|
|
DIF = DIAG(I)
|
|
XSQ(I) = DIF*DRNOW*DRNOW
|
|
XLMBDA = SQRT(ABS(DIF))
|
|
X = XLMBDA*DRNOW
|
|
IF(DIF .LT. 0.D0) GO TO 370
|
|
NOPLOC = NOPLOC+1
|
|
SX = SIN(X)/XLMBDA
|
|
CX = COS(X)
|
|
GO TO 380
|
|
370 IF(X.GT.173.D0) WRITE(6,1700) I,DIF,DRNOW,X
|
|
SX = SINH(X)/XLMBDA
|
|
CX = COSH(X)
|
|
380 A = G1P(I)
|
|
SINX(I) = SX
|
|
SINE(I) = SX*XLMBDA
|
|
IF(DIF .LT. 0.D0) SINE(I) = -SINE(I)
|
|
COSX(I) = CX
|
|
XK(I) = X
|
|
B = G1(I)
|
|
G1(I) = A*SX+B*CX
|
|
G1P(I) = A*CX-DIF*B*SX
|
|
C = G2P(I)
|
|
D = G2(I)
|
|
A1(I) = B
|
|
A1P(I) = A
|
|
B1(I) = D
|
|
B1P(I) = C
|
|
G2(I) = C*SX+D*CX
|
|
390 G2P(I) = C*CX-DIF*D*SX
|
|
C-------------------------------------------------------------------
|
|
C ESTIMATE G2P(N) AT END OF NEXT STEP. IF IT IS TOO LARGE,
|
|
C A NEW INTERVAL WILL BE STARTED.
|
|
C-------------------------------------------------------------------
|
|
IF(ABS(G2P(N)).LE.1.D04) GO TO 1801
|
|
IF (PRNTLV.GT.3) WRITE(6,1800) RNOW,DRNOW,G2P(N)
|
|
NSGERR=NSGERR+1
|
|
1801 G2PMAX=G2P(N)*CX
|
|
IF(IREAD .AND. .NOT. IPERT) GO TO 410
|
|
C-------------------------------------------------------------------
|
|
C CALCULATE THE INTEGRALS NECESSARY FOR THE PERTURBATION CORRECTIONS.
|
|
C THE STEP INTEGRALS ARE STORED IN W0, W1 AND W2, AND THE ACCUMULATED
|
|
C INTEGRALS OVER THE INTERVAL ARE SAVED IN EYE11, EYE12 AND EYE22.
|
|
C-------------------------------------------------------------------
|
|
IF(IVPP) CALL PERT2(N,COSX,SINE,XSQ,XK,DRNOW,W0,W1,W2,EYE11,
|
|
X EYE12,EYE22,A1,B1,A1P,B1P)
|
|
IF(IVPP) GO TO 400
|
|
IF(IVP) CALL PERT1(N,COSX,SINE,XSQ,XK,DRNOW,W0,W1,W2,EYE11,
|
|
X EYE12,EYE22,A1,B1,A1P,B1P)
|
|
IF(IVP) GO TO 400
|
|
IF(IV) CALL PERT2(N,COSX,SINE,XSQ,XK,DRNOW,W0,W1,W2,EYE11,
|
|
X EYE12,EYE22,A1,B1,A1P,B1P)
|
|
400 CONTINUE
|
|
410 IF(IREAD .AND. .NOT. NEWINT) GO TO 590
|
|
SOFF = 0.D0
|
|
COFF = 0.D0
|
|
CDIAG = 0.D0
|
|
SDIAG = 0.D0
|
|
C-------------------------------------------------------------------
|
|
C THE FOLLOWING IS USED TO DETERMINE THE MAXIMUM PERTURBATION
|
|
C CORRECTIONS TO THE UNPERTURBED WAVEFUNCTIONS. SINCE THE STEP
|
|
C SIZE FOR SUBSEQUENT ENERGIES HAS ALREADY BEEN STORED ON DISK
|
|
C THIS INFORMATION IS NOT NECESSARY FOR SUBSEQUENT ENERGIES.
|
|
C-------------------------------------------------------------------
|
|
IF( .NOT. IPERT .AND. IREAD) GO TO 460
|
|
IF(IREAD) GO TO 430
|
|
DO 420 I = 1,N
|
|
A1(I) = 1.D0/SQRT(A1P(I)*A1P(I)/ABS(DIAG(I))+A1(I)*A1(I))
|
|
B1(I) = 1.D0/SQRT(B1P(I)*B1P(I)/ABS(DIAG(I))+B1(I)*B1(I))
|
|
A1P(I) = DRNOW*A1(I)/XK(I)
|
|
B1P(I) = DRNOW*B1(I)/XK(I)
|
|
SINE(I) = 1.D0
|
|
IF(DIAG(I) .GT. 0.D0) GO TO 420
|
|
EXPX = EXP(-XK(I)*DINT/DRNOW)
|
|
IF(DIAG(I).LT.-XSQMAX)EXPX=0.D0
|
|
SINE(I) = EXPX
|
|
A1(I) = A1(I)*EXPX
|
|
B1(I) = B1(I)*EXPX
|
|
A1P(I) = A1P(I)*EXPX
|
|
B1P(I) = B1P(I)*EXPX
|
|
420 CONTINUE
|
|
430 IJ = 0
|
|
C-------------------------------------------------------------------
|
|
C CALCULATE THE PERTURBATION CORRECTIONS TO THE WAVEFUNCTION AND
|
|
C ITS DERIVATIVE.
|
|
C-------------------------------------------------------------------
|
|
DO 450 J = 1,N
|
|
A1J = A1(J)
|
|
A1PJ = A1P(J)
|
|
DO 450 I = 1,N
|
|
JI = J+(I-1)*N
|
|
IJ = IJ+1
|
|
PRT1 = G1(J)*EYE12(IJ)-G2(J)*EYE11(IJ)
|
|
PRT2 = G1(I)*EYE22(IJ)-G2(I)*EYE12(IJ)
|
|
PRT1P = G1P(J)*EYE12(IJ)-G2P(J)*EYE11(IJ)
|
|
PRT2P = G1P(I)*EYE22(IJ)-G2P(I)*EYE12(IJ)
|
|
C-------------------------------------------------------------------
|
|
C DON'T DETERMINE THE MAXIMUM PERTURBATION CORRECTION FOR
|
|
C SUBSEQUENT ENERGIES.
|
|
C-------------------------------------------------------------------
|
|
IF(IREAD) GO TO 440
|
|
B1I = B1(I)
|
|
B1PI = B1P(I)
|
|
E1 = ABS(PRT1)*A1J
|
|
E2 = ABS(PRT2)*B1I
|
|
E3 = ABS(PRT1P)*A1PJ
|
|
E4 = ABS(PRT2P)*B1PI
|
|
IF(I .NE. J) COFF = MAX(COFF,E1,E2,E3,E4)
|
|
IF(I .EQ. J) CDIAG = MAX(CDIAG,E1,E2,E3,E4)
|
|
IF(J .GT. I) GO TO 440
|
|
CCIJ = W0(IJ)
|
|
CCJI = W0(JI)
|
|
CSIJ = W1(IJ)
|
|
CSJI = W1(JI)
|
|
SSIJ = W2(IJ)
|
|
SSJI = W2(JI)
|
|
E1 = ABS(SINX(J)*CSJI-COSX(J)*SSIJ)*SINE(J)*XK(J)/DRNOW
|
|
E2 = ABS(SINX(I)*CCIJ-COSX(I)*CSJI)*SINE(I)
|
|
E3 = ABS(COSX(J)*CSJI+DIAG(J)*SINX(J)*SSIJ)*SINE(J)
|
|
E4 = ABS(COSX(I)*CCIJ+DIAG(I)*SINX(I)*CSJI)*SINE(I)*DRNOW/XK(I)
|
|
E5 = ABS(SINX(I)*CSIJ-COSX(I)*SSJI)*SINE(I)*XK(I)/DRNOW
|
|
E6 = ABS(SINX(J)*CCJI-COSX(J)*CSIJ)*SINE(J)
|
|
E7 = ABS(COSX(I)*CSIJ+DIAG(I)*SINX(I)*SSJI)*SINE(I)
|
|
E8 = ABS(COSX(J)*CCJI+DIAG(J)*SINX(J)*CSIJ)*SINE(J)*DRNOW/XK(J)
|
|
IF(I .NE. J) SOFF = MAX(SOFF,E1,E2,E3,E4,E5,E6,E7,E8)
|
|
IF(I .EQ. J) SDIAG = MAX(SDIAG,E1,E2,E3,E4,E5,E6,E7,E8)
|
|
440 W2(IJ) = PRT1
|
|
W(JI) = PRT2
|
|
W0(IJ) = PRT1P
|
|
450 W1(JI) = PRT2P
|
|
IF(SOFF.EQ.0.D0) SOFF=1.D-30
|
|
IF(IPERT) GO TO 480
|
|
460 DO 470 I = 1,NSQ
|
|
W2(I) = 0.D0
|
|
W0(I) = 0.D0
|
|
W(I) = 0.D0
|
|
470 W1(I) = 0.D0
|
|
480 IF(LAST) GO TO 500
|
|
IF(IALPHA.LE.0) GO TO 485
|
|
IF((ISTEP/IALPHA)*IALPHA.EQ.ISTEP) GO TO 500
|
|
GO TO 590
|
|
C-------------------------------------------------------------------
|
|
C ARRIVE HERE ONLY FOR IALPHA.EQ.0 OPTION.
|
|
C START NEW INTERVAL IF PREDICTED G2P FOR NEXT STEP IS TOO LARGE
|
|
C-------------------------------------------------------------------
|
|
485 IF(.NOT.IREAD .AND. ABS(G2PMAX).GT.1.D04) GO TO 500
|
|
IF(COFFL .EQ. 0.D0) GO TO 490
|
|
FACC = COFF/COFFL
|
|
FACS = SOFF/SOFF1
|
|
IF(FACC .GT. 2.D0) FACC = 2.D0
|
|
IF(FACS .GT. 2.D0) FACS = 2.D0
|
|
IF(FACC*COFF .GT. 0.8D0*TOFF) GO TO 500
|
|
IF(FACS*SOFF .GT. 0.8D0*TLDIAG) GO TO 500
|
|
490 COFFL = COFF
|
|
SOFF1 = SOFF
|
|
SDIAG1 = SDIAG
|
|
COFFL = COFF
|
|
IF(IREAD .AND. NEWINT) GO TO 500
|
|
C-------------------------------------------------------------------
|
|
C CHECK TO SEE IF THE PERTURBATION CORRECTIONS ARE LARGE ENOUGH
|
|
C TO WARRANT A NEW INTERVAL AND BASIS SET TRANSFORMATION.
|
|
C-------------------------------------------------------------------
|
|
IF(COFF .LT. 0.8D0*TOFF .AND. CDIAG .LT. 0.8D0*TOFF) GO TO 590
|
|
500 COFFL = 0.D0
|
|
SOFF1 = SOFF
|
|
SDIAG1 = SDIAG
|
|
ICRMAT = .TRUE.
|
|
IF( .NOT. ITHS) GO TO 510
|
|
IF( .NOT. IEYE) GO TO 510
|
|
WRITE(6,2900) LEYE11
|
|
WRITE(6,2800) (EYE11(I),I = 1,NSQ)
|
|
WRITE(6,2900) LEYE12
|
|
WRITE(6,2800) (EYE12(I),I = 1,NSQ)
|
|
WRITE(6,2900) LEYE22
|
|
WRITE(6,2800) (EYE22(I),I = 1,NSQ)
|
|
C-------------------------------------------------------------------
|
|
C MULTIPLY THE OLD R-MATRIX TIMES IRREGULAR WAVEFUNCTION AND ITS
|
|
C PERTURBATION CORRECTION.
|
|
C-------------------------------------------------------------------
|
|
510 NP1 = N+1
|
|
II = 1
|
|
DO 520 I = 1,N
|
|
W0(II) = W0(II)+G1P(I)
|
|
W1(II) = W1(II)+G2P(I)
|
|
W2(II) = W2(II)+G1(I)
|
|
W(II) = W(II)+G2(I)
|
|
520 II = II+NP1
|
|
CALL DCOPY(NSQ,W0,1,TSTORE,1)
|
|
CALL DSYMM('L','L',N,N,1.D0,RMAT,N,W1,N,1.D0,TSTORE,N)
|
|
CALL DCOPY(NSQ,W2,1,VECOLD,1)
|
|
CALL DSYMM('L','L',N,N,1.D0,RMAT,N,W ,N,1.D0,VECOLD,N)
|
|
IF( .NOT. ITHS) GO TO 550
|
|
IF( .NOT. IGZRO) GO TO 540
|
|
WRITE(6,2900) LG1
|
|
WRITE(6,2800) (G1(I),I = 1,N)
|
|
WRITE(6,2900) LG1P
|
|
WRITE(6,2800) (G1P(I),I = 1,N)
|
|
WRITE(6,2900) LG2
|
|
WRITE(6,2800) (G2(I),I = 1,N)
|
|
WRITE(6,2900) LG2P
|
|
WRITE(6,2800) (G2P(I),I = 1,N)
|
|
540 IF( .NOT. IGPERT) GO TO 550
|
|
WRITE(6,2900) LDG1
|
|
WRITE(6,2800) (W2(I),I = 1,NSQ)
|
|
WRITE(6,2900) LDG1P
|
|
WRITE(6,2800) (W0(I),I = 1,NSQ)
|
|
WRITE(6,2900) LDG2
|
|
WRITE(6,2800) (W(I),I = 1,NSQ)
|
|
WRITE(6,2900) LDG2P
|
|
WRITE(6,2800) (W1(I),I = 1,NSQ)
|
|
550 IF( .NOT. ITHS) GO TO 560
|
|
IF( .NOT. IWAVE) GO TO 560
|
|
WRITE(6,2900) LUD
|
|
WRITE(6,2800) (EYE12(I),I = 1,NSQ)
|
|
WRITE(6,2900) LUDP
|
|
WRITE(6,2800) (EYE11(I),I = 1,NSQ)
|
|
560 IER = 0
|
|
C-------------------------------------------------------------------
|
|
C SOLVE A LINEAR SYSTEM OF EQUATIONS TO DETERMINE THE NEW R-MATRIX
|
|
C-------------------------------------------------------------------
|
|
CALL DGESV(N,N,TSTORE,N,WKS,VECOLD,N,IER)
|
|
C-------------------------------------------------------------------
|
|
C REINITIALIZE FOR THE NEXT INTERVAL. STORE THE NEW R-MATRIX IN RMAT.
|
|
C-------------------------------------------------------------------
|
|
DO 570 I = 1,N
|
|
G1(I) = 0.D0
|
|
G2(I) = 1.D0
|
|
G1P(I) = 1.D0
|
|
G2P(I) = 0.D0
|
|
DO 570 J = 1,N
|
|
IJ = I+(J-1)*N
|
|
JI = J+(I-1)*N
|
|
RMAT(JI) = VECOLD(IJ)
|
|
IF(ISYM) RMAT(JI) = 0.5D0*(VECOLD(IJ)+VECOLD(JI))
|
|
EYE11(IJ) = 0.D0
|
|
EYE12(IJ) = 0.D0
|
|
570 EYE22(IJ) = 0.D0
|
|
NTRVL = NTRVL+1
|
|
IF( .NOT. ITHS) GO TO 580
|
|
IF( .NOT. IRMAT) GO TO 580
|
|
WRITE(6,2900) LRMAT
|
|
WRITE(6,2800) (RMAT(I),I = 1,NSQ)
|
|
GO TO 590
|
|
580 CONTINUE
|
|
590 CONTINUE
|
|
IF( .NOT. IWRITE) GO TO 600
|
|
NEWINT=ICRMAT
|
|
WRITE(ISC) NEWINT
|
|
C-------------------------------------------------------------------
|
|
C WRITE THE MINIMAL STEP INFORMATION AND DETERMINE THE NEW STEP SIZE
|
|
C AND PREDICT THE NEW INTERVAL SIZE.
|
|
C-------------------------------------------------------------------
|
|
600 IF(PRNTLV.GE.15) WRITE(6,2700) ITRANS,RMIDI,DRNOW,RLAST,RNOW,
|
|
X DIAG(1),DIAG(N),CDIAG,COFF,SDIAG,SOFF,ALPHA,NOPLOC,ISTEP
|
|
IF( .NOT. LAST) ISTEP = ISTEP+1
|
|
IF(LAST) GO TO 670
|
|
IF(IREAD) GO TO 155
|
|
XBAR = XBAR+RNOW
|
|
XSBAR = XSBAR+RNOW*RNOW
|
|
EBAR = EBAR+SDIAG
|
|
EXBAR = EXBAR+RNOW*SDIAG
|
|
TMXX = 0.5D0*TOFF
|
|
IF(TLDIAG .GT. TMXX) TMXX = TLDIAG
|
|
IF(DINT.NE.DRNOW) SOFF = 0.8D0*TLDIAG*(SOFF/(0.8D0*TMXX))**1.5D0
|
|
IF(IALPHA .GT. 0) DRNOW = DRNOW*ALPHA
|
|
IF(IALPHA. LE. 0) CALL DELRD(DRNOW,SDIAG,SOFF,TLDIAG,DRMAX,
|
|
1 DIAG(1),DIAG(N),RNOW,RMAX)
|
|
IF( .NOT. ICRMAT) GO TO 650
|
|
DINT = RNOW-RMID
|
|
DINT1 = DINT
|
|
IF(IALPHA.LE.0) GO TO 630
|
|
XBAR = XBAR/IALPHA
|
|
XSBAR = XSBAR/IALPHA
|
|
EBAR = EBAR/IALPHA
|
|
EXBAR = EXBAR/IALPHA
|
|
IF(IALPHA.EQ.1) SLOPE=0.D0
|
|
IF(IALPHA.NE.1) SLOPE = (EXBAR-XBAR*EBAR)/(XSBAR-XBAR*XBAR)
|
|
BINT = EBAR-XBAR*SLOPE
|
|
EMAX = BINT+SLOPE*RNOW
|
|
EMIN = BINT+SLOPE*(RNOW-DINT)
|
|
ALFNEW = ALPHA
|
|
IF(IALPHA .LE. 1) GO TO 630
|
|
IF(EMAX.EQ.0.D0) EMAX=1.D-30
|
|
FAC = EMIN/EMAX
|
|
IF(FAC .LE. 0.D0) GO TO 620
|
|
FAC = (FAC)**(1.D0/DBLE(3*IALPHA-3))
|
|
IF(FAC .GT. 1.1D0) FAC = 1.1D0
|
|
IF(FAC .LT. 0.9D0) FAC = 0.9D0
|
|
ALFNEW = ALPHA*FAC
|
|
GO TO 630
|
|
620 FAC = 1.1D0
|
|
IF(EMIN .LE. 0.D0) FAC = 0.9D0
|
|
ALFNEW = ALPHA*FAC
|
|
630 XBAR = 0.D0
|
|
XSBAR = 0.D0
|
|
EBAR = 0.D0
|
|
EXBAR = 0.D0
|
|
TMXX = TOFF
|
|
IF(TLDIAG .GT. TOFF) TMXX = TLDIAG
|
|
IF(DINT.NE.DRNOW) COFF = 0.8D0*TMXX*(COFF/(0.8D0*TMXX))**1.5D0
|
|
CALL DELRD(DINT,CDIAG,COFF,TMXX,DRMAX,DIAG(1),DIAG(N),RNOW,RMAX)
|
|
IF(DINT1.NE.DRNOW) SOFF1 = TLDIAG*(2.D0*SOFF1/TLDIAG)**1.5D0
|
|
CALL DELRD(DINT1,SDIAG1,SOFF1,TLDIAG,DRMAX,DIAG(1),DIAG(N),RNOW,
|
|
1 RMAX)
|
|
IF(ABS(DINT1) .LT. ABS(DINT)) DINT = DINT1
|
|
IF(DINT .LT. DRNOW) DINT = DRNOW
|
|
IF(ABS(RMAX-RNOW-DINT) .LT. ABS(0.01D0*DINT)) DINT = RMAX-RNOW
|
|
IF((RMAX-RNOW-DINT)*DINT .LT. 0.D0) DINT = RMAX-RNOW
|
|
RMID = RNOW
|
|
DIAGI = RNOW+0.5D0*DINT
|
|
IF(IALPHA .LE. 0) GO TO 650
|
|
ALPHA = ALPHA1+BALPHA*(DIAGI-RMIN)
|
|
IF(IALFP) ALPHA = ALFNEW
|
|
IF(ALPHA .NE. 1.D0) GO TO 640
|
|
DRNOW = DINT/IALPHA
|
|
GO TO 650
|
|
640 DRNOW = DINT*(ALPHA-1.D0)/(ALPHA**IALPHA-1.D0)
|
|
650 IF(ABS(RMAX-RNOW-DRNOW) .LT. ABS(0.01D0*DRNOW))
|
|
1 DRNOW = RMAX-RNOW
|
|
IF((RMAX-RNOW-DRNOW)*DRNOW .LT. 0.D0) DRNOW = RMAX-RNOW
|
|
RLAST = RNOW
|
|
RNOW = RNOW+DRNOW
|
|
DEL = (RNOW-RMAX)/DRNOW
|
|
IF(ABS(DEL) .LT. 0.005D0) LAST = .TRUE.
|
|
GO TO 160
|
|
C-------------------------------------------------------------------
|
|
C THE INTEGRATION IS NOW COMPLETE. TRANSFORM THE R-MATRIX INTO THE
|
|
C ORIGINAL BASIS.
|
|
C-------------------------------------------------------------------
|
|
670 NCOL = 1
|
|
NLAST = N
|
|
DO 690 IR = 1,N
|
|
NORIG = IR
|
|
DO 680 NTRANS = NCOL,NLAST
|
|
VECOLD(NTRANS) = VECNEW(NORIG)
|
|
680 NORIG = NORIG+N
|
|
NLAST = NLAST+N
|
|
690 NCOL = NCOL+N
|
|
CALL TRNSFM(VECOLD,RMAT,TSTORE,N,IFALSE,ISYM)
|
|
IF(PRNTLV.GE.3) WRITE(6,3000) RMIN,RMAX,ISTEP
|
|
IF (PRNTLV.LE.3 .AND. NSGERR.GT.0) WRITE(6,1802) NSGERR
|
|
RETURN
|
|
C-------------------------------------------------------------------
|
|
C FORMAT STATEMENTS
|
|
C-------------------------------------------------------------------
|
|
1200 FORMAT(1H0, 98H IVECT IPOTL IEYE IGZRO IGPERT IWAVE IRMAT IWRITE
|
|
XIREAD IOC )
|
|
1300 FORMAT(1H , 9L6,I4)
|
|
1400 FORMAT(1H0, 43H IV IVP IVPP ISHIFT IDIAG ISYM IPERT IALFP )
|
|
1500 FORMAT(1H ,L3,L4,L5,L7,L6,L5,4L6)
|
|
1600 FORMAT(1H0,21H ALPHA1 ALPHA2 IALPHA/1X,2F7.2,I7)
|
|
1700 FORMAT('0 *** ERROR IN VIVAS. FOR CHANNEL',I3,', REDUCED V-E =',
|
|
1 E13.5/6X,'FOR STEP SIZE',E13.5,', COSH ARGUMENT OF',E13.5,
|
|
2 ' WILL CAUSE OVERFLOW.'/6X,'USE A SMALLER STEP SIZE TO AVOID',
|
|
3 ' THIS ERROR.')
|
|
1800 FORMAT('0 *** WARNING IN VIVAS. INTERVAL SIZE TOO LARGE, SO',
|
|
1 ' CLOSED CHANNEL GROWTH MAY CAUSE NUMERICAL INSTABILITY.'/
|
|
2 24X,'RNOW =',F8.3,', DRNOW =',F8.3,', G2P(N) =',E13.5)
|
|
1802 FORMAT('0 *** WARNING IN VIVAS. INTERVAL SIZE POSSIBLY TOO',
|
|
1 ' LARGE FOR',I5,' STEPS. INCREASE PRNTLV FOR DETAILS')
|
|
2500 FORMAT(79H0 RMIN RMAX DRNOW DRMAX TOFF TLD
|
|
XIAG )
|
|
2600 FORMAT(F9.5,10F10.5,I10)
|
|
2700 FORMAT(1H ,I5,10E11.4,F6.3,2I5)
|
|
2800 FORMAT(1H ,9D14.7)
|
|
2900 FORMAT(1H0,A10)
|
|
3000 FORMAT('0 VIVAS. R-MATRIX INTEGRATED FROM',F12.4,' TO',
|
|
& F12.4,' IN',I6,' STEPS.')
|
|
3100 FORMAT(132H0NTRVL RCENT DRNOW RLAST RNOW DI
|
|
XAG(1) DIAG(N) CDIAG COFF SDIAG SOFF ALF
|
|
XP NOPN ISTP )
|
|
C----------------***END-VIVAS***-------------------------------------
|
|
END
|
|
|
|
SUBROUTINE WAVEIG (W, EIGNOW, SCR1, SCR2, RNOW, NCH,
|
|
1 P,MXLAM,VL,IV,RMLMDA,ERED,EINT,CENT,NPOTL)
|
|
* THIS SUBROUTINE FIRST SETS UP THE WAVEVECTOR MATRIX AT RNOW
|
|
* THEN OBTAINS ITS EIGENVALUES
|
|
* WRITTEN BY: MILLARD ALEXANDER
|
|
* CURRENT REVISION DATE: 25-SEPT-87
|
|
* ----------------------------------------------------------------
|
|
* VARIABLES IN CALL LIST:
|
|
* W: MATRIX OF MAXIMUM ROW DIMENSION NCH USED TO STORE
|
|
* WAVEVECTOR MATRIX
|
|
* EIGNOW: ON RETURN: ARRAY CONTAINING EIGENVALUES OF WAVEVECTOR M
|
|
* SCR1, SCR2: SCRATCH VECTORS OF DIMENSION AT LEAST NCH
|
|
* RNOW: VALUE OF INTERPARTICLE SEPARATION AT WHICH WAVEVECTOR MA
|
|
* IS TO BE EVALUATED
|
|
* NCH: NUMBER OF CHANNELS
|
|
* SUBROUTINES CALLED:
|
|
* WAVMAT: DETERMINES WAVEVECTOR MATRIX
|
|
* F02AAF: NAG ROUTINE TO OBTAIN EIGENVALUES OF REAL,
|
|
* SYMMETRIC MATRIX
|
|
* DSCAL, DCOPY: LINPACK BLAS ROUTINES
|
|
* ----------------------------------------------------------------
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
INTEGER IERR, NCH, NCHM1, NCHP1
|
|
EXTERNAL DSCAL, DCOPY, WAVMAT, F02AAF
|
|
* SQUARE MATRIX (OF ROW DIMENSION NCH)
|
|
DIMENSION W(1)
|
|
* VECTORS DIMENSIONED AT LEAST NCH
|
|
DIMENSION EIGNOW(1), SCR1(1), SCR2(1),P(1),VL(1),IV(1),EINT(1)
|
|
DIMENSION CENT(1)
|
|
* ------------------------------------------------------------------
|
|
DATA XMIN1 / -1.D0/
|
|
NCHP1 = NCH + 1
|
|
NCHM1 = NCH - 1
|
|
CALL WAVMAT (W, NCH, RNOW, P, VL, IV, ERED, EINT, CENT, RMLMDA,
|
|
1 SCR1, MXLAM, NPOTL)
|
|
C
|
|
* SINCE WAVMAT RETURNS NEGATIVE OF LOWER TRIANGLE OF W(R) MATRIX (EQ.(3
|
|
* M.H. ALEXANDER, "HYBRID QUANTUM SCATTERING ALGORITHMS ..."),
|
|
* NEXT LINE CHANGES ITS SIGN
|
|
CALL DSCAL(NCH*NCH, XMIN1, W, 1)
|
|
C
|
|
IERR=0
|
|
CALL F02AAF(W, NCH, NCH, EIGNOW, SCR1, IERR)
|
|
IF (IERR .NE. 0) THEN
|
|
WRITE (6, 120) IERR
|
|
120 FORMAT(' *** F02AAF IERR =', I3, ' .NE. 0 IN WAVEIG; ABORT ***')
|
|
STOP
|
|
ENDIF
|
|
C
|
|
RETURN
|
|
END
|
|
SUBROUTINE WAVMAT(W,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,
|
|
1 MXLAM,NPOTL)
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C EVALUATES THE MATRIX W OF WAVE-VECTORS AT RADIUS R
|
|
C W = VCOUPL + EINT + VCENT - ETOT
|
|
C ORDER OF THE REAL SYMMETRIC MATRIX W IS N
|
|
C THE FULL MATRIX IS COMPUTED
|
|
C VL IS THE PREVIOUSLY COMPUTED MATRIX OF THE COUPLING POTENTIAL
|
|
C IV IS AN INDEX ARRAY MAPPING P ONTO VL, SUCH THAT VL(I) IS
|
|
C A COEFFICIENT TO MULTIPLY P(IV(I))
|
|
C ERED IS THE TOTAL ENERGY ETOT IN REDUCED UNITS
|
|
C (ETOT/EPSILON)*(2.*URED*EPSIL*RM**2/HBAR**2)
|
|
C EINT(I) IS THE REDUCED INTERNAL ENERGY OF THE I-TH CHANNEL
|
|
C CENT(I) IS L*(L+1) FOR THE I-TH CHANNEL
|
|
C RMLMDA IS THE SQUARE OF THE RATIO OF RM TO THE DEBROGLIE
|
|
C WAVELENGTH AT RELATIVE ENERGY EPSILON
|
|
C RMLMDA = 2.*URED*RM**2*EPSIL/HBAR**2
|
|
C RMLMDA MULTIPLIES THE POTENTIAL IN UNITS OF EPSIL
|
|
C
|
|
DIMENSION W(N,N),VL(1),IV(1),EINT(N),CENT(N),P(MXLAM),DIAG(N)
|
|
COMMON/MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
RSQ=1.D0/(R*R)
|
|
IF(IVLFL.LT.0) THEN
|
|
NPOT=NPOTL-2
|
|
P(NPOT+1)=RSQ
|
|
P(NPOT+2)=1.D0
|
|
ELSE
|
|
NPOT=NPOTL
|
|
ENDIF
|
|
C
|
|
C COMPUTE THE RADIAL PARTS OF THE POTENTIAL
|
|
C IDUM1 AND IDUM2 ARE DUMMY ARGUMENTS HERE.
|
|
CALL POTENL(0,MXLAM,NPOT,IDUM1,R,P,IDUM2)
|
|
|
|
C CALL PERTRB(R,P,MXLAM,0)
|
|
C
|
|
DO 15 I=1,MXLAM
|
|
15 P(I)=RMLMDA*P(I)
|
|
C
|
|
CALL WAVVEC(VL,P,IV,W,N,NPOTL)
|
|
C
|
|
C NOW COMPUTE THE DIAGONAL CONTRIBUTIONS W(I,I).
|
|
C
|
|
DO 18 I=1,N
|
|
W(I,I) = W(I,I) - ERED
|
|
DIAG(I) = W(I,I)
|
|
18 CONTINUE
|
|
C
|
|
IF(IVLFL.LT.0) RETURN
|
|
C
|
|
DO 20 I=1,N
|
|
W(I,I) = W(I,I) + EINT(I) + RSQ*CENT(I)
|
|
DIAG(I) = W(I,I)
|
|
20 CONTINUE
|
|
RETURN
|
|
END
|
|
SUBROUTINE WAVVEC(VL,P,IV,W,N,NPOTL)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION VL(1),P(1),IV(1),W(N,N)
|
|
C
|
|
C DYNAMIC STORAGE COMMON BLOCK ...
|
|
COMMON /MEMORY/ MX,IXNEXT,NIPR,IVLFL,X(1)
|
|
C
|
|
COMMON/VLSAVE/IVLU
|
|
C
|
|
IF(IVLFL.GT.0) GOTO 10
|
|
C
|
|
C REACH HERE ONLY FOR IVLFL=0: NO IV ARRAY FOR INDEXING
|
|
C
|
|
IF(IVLU.EQ.0) THEN
|
|
I=1
|
|
DO 1 J=1,N
|
|
CALL DGEMV('T',NPOTL,J,1.D0,VL(I),NPOTL,P,1,0.D0,W(1,J),1)
|
|
1 I=I+J*NPOTL
|
|
ELSE
|
|
REWIND IVLU
|
|
ISV=IXNEXT
|
|
IXNEXT=ISV+N*(N+1)/2
|
|
NUSED=1
|
|
CALL CHKSTR(NUSED)
|
|
DO 2 J=1,N
|
|
DO 2 K=1,J
|
|
2 W(K,J)=0.D0
|
|
DO 5 LL=1,NPOTL
|
|
READ(IVLU) (X(ISV+I),I=0,N*(N+1)/2-1)
|
|
I=1
|
|
DO 4 J=1,N
|
|
CALL DAXPY(J,P(LL),X(ISV+I-1),1,W(1,J),1)
|
|
4 I=I+J
|
|
5 CONTINUE
|
|
IXNEXT=ISV
|
|
ENDIF
|
|
C
|
|
C FILL IN LOWER TRIANGLE
|
|
C
|
|
CALL DSYFIL('L',N,W,N)
|
|
RETURN
|
|
C
|
|
C ARRIVE HERE FOR NON-TRIVIAL USE OF THE IV ARRAY
|
|
C
|
|
10 IF(IVLU.NE.0) THEN
|
|
WRITE(6,601)
|
|
601 FORMAT(' *** ERROR IN WAVVEC. IVLU =',I2,' AND IVLFL =',I2/
|
|
1 ' USE OF THE IV ARRAY IS NOT SUPPORTED FOR IVLU > 0.')
|
|
STOP
|
|
ENDIF
|
|
C
|
|
I2=0
|
|
DO 12 J=1,N
|
|
DO 12 K=1,J
|
|
I1=I2+1
|
|
I2=I2+NPOTL
|
|
WW=0.D0
|
|
DO 11 I=I1,I2
|
|
IF(VL(I).NE.0.D0) WW=WW+VL(I)*P(IV(I))
|
|
11 CONTINUE
|
|
W(J,K)=WW
|
|
W(K,J)=WW
|
|
12 CONTINUE
|
|
C
|
|
RETURN
|
|
END
|
|
SUBROUTINE WKB(N,MXLAM,NPOTL,W,SREAL,SIMAG,P,L,EINT,CENT,
|
|
1 DIAG,NBASIS,WVEC,VL,IV,NUMDER,IPRINT)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C THIS ROUTINE GETS PHASE SHIFT (S-MATRIX) FOR 1-DIMENSIONAL
|
|
C SCATTERING EQUATION VIA THE WKB APPROXIMATION USING GAUSS-MEHLER
|
|
C NUMERICAL INTEGRATION AS SUGGESTED BY R.T PACK, J. CHEM. PHYS.
|
|
C 60, 633 (1974).
|
|
C
|
|
C THIS ROUTINE IS COMPATIBLE WITH MOLSCAT/IOS CODE
|
|
C WRITTEN OCT 1977 BY S. GREEN (GISS), MODIFIED APR 1986 FOR CCP6.
|
|
C MODIFIED JUL 86 WITH MORE SOPHISTICATED START (FIND TURNING PT.)
|
|
C>>SG MODIFIED SOME OUTPUT FORMATS 5/13/92
|
|
C
|
|
C VARIABLES FOR MOLSCAT COMPATIBILITY . . .
|
|
LOGICAL NUMDER
|
|
DIMENSION W(2),SIMAG(2),SREAL(2),P(2),L(2),EINT(2),CENT(2),
|
|
1 DIAG(2),NBASIS(2),WVEC(2),VL(2),IV(2)
|
|
C
|
|
C
|
|
C THE NUMBER OF GAUSS POINTS IS INCREASED CHECKING FOR CONVERGENCE
|
|
C PARAMETERS TO CONTROL GAUSS-MEHLER CONVERGENCE ITERATION. . .
|
|
COMMON /WKBCOM/ NGMP(3)
|
|
C
|
|
C COMMON BLOCK FOR COMMUNICATING WITH COUPLED EQUATION SOLVERS
|
|
C
|
|
COMMON/DRIVE/DTOL,STEPS,STABIL,CONV,RMIN,RSTOP,XEPS,
|
|
1 DR,DRMAX,RMID,TOLHI,RTURN,VTOL,ESHIFT,ERED,RMLMDA,
|
|
2 NOPEN,JKEEP,ISCRU,MAXSTP
|
|
C
|
|
C TOLERANCES FOR NEWTON-RAPHSON SEARCH FOR R0 . . .
|
|
DATA EPS/5.D-5/ , ITMX/24/
|
|
DATA IDER/1/
|
|
C
|
|
C MODIFY CENTRIFUGAL POTENTIAL (CENT) VIA 'LANGER' CORRECTION
|
|
PI=ACOS(-1.D0)
|
|
DCENT=DBLE(L(1))+.5D0
|
|
DCENT=DCENT*DCENT
|
|
CSAVE=CENT(1)
|
|
CENT(1)=DCENT
|
|
C INITIALIZE OTHER VARIABLES
|
|
PI2=2.D0*PI
|
|
C
|
|
C FIND TURNING POINT VIA NEWTON-RAPHSON METHOD. START WITH RMIN
|
|
C
|
|
IT=0
|
|
ECNV=EPS*ERED
|
|
RCNV=EPS*RMIN
|
|
R=RMIN
|
|
C IF POTENTIAL IS NOT DECREASING, TRY BACKING UP . . .
|
|
1198 CALL DERMAT(IDER,W,N,R,P,VL,IV,CENT,RMLMDA,MXLAM,NPOTL,NUMDER)
|
|
IF (W(1).LE.0.D0) GO TO 1000
|
|
IF (IPRINT.GT.3) WRITE(6,699) IT,R,W(1)
|
|
699 FORMAT('0* * * WKB BAD START. TRY 7/86 FIX. ITER, R, DV/DR =',
|
|
1 I4,2F15.5)
|
|
R=0.9D0*R
|
|
IT=IT+1
|
|
IF (IT.LE.ITMX) GO TO 1198
|
|
WRITE(6,697) ITMX
|
|
697 FORMAT('0 * * * ERROR (7/86). WKB CANNOT START. ITMX =',I4)
|
|
STOP
|
|
1000 CALL WAVMAT(W,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
V=W(1)
|
|
CALL DERMAT(IDER,W,N,R,P,VL,IV,CENT,RMLMDA,MXLAM,NPOTL,NUMDER)
|
|
DVDR=W(1)
|
|
DR=-V/DVDR
|
|
C TO PREVENT OCCASIONAL ERRATIC BEHAVIOR ALLOW ONLY 25% CHANGE IN R
|
|
DRMAX=2.5D-1*ABS(R)
|
|
IF (ABS(DR).LE.DRMAX) GO TO 1199
|
|
IF (DR.LT.0.D0) DRMAX=-DRMAX
|
|
IF (IPRINT.GT.3) WRITE(6,698) IT,R,DR,DRMAX
|
|
698 FORMAT(' * * WKB. 7/86 FIX. ITER, R, DR, DRMAX =',I4,3F15.5)
|
|
DR=DRMAX
|
|
1199 IF (ABS(DR).LE.RCNV.OR.ABS(V).LE.ECNV) GO TO 1009
|
|
IT=IT+1
|
|
R=R+DR
|
|
IF (IT.LE.ITMX) GO TO 1000
|
|
IF (IPRINT.GT.3) WRITE(6,694) IT,R,DR,V,DVDR
|
|
694 FORMAT(' WKB: NEWTON-RAPHSON START FAILED TO CONVERGE. IT =',I4
|
|
& /16X,'R,DR,V,DVDR=',4D12.4)
|
|
C
|
|
C TRY A REGULA-FALSI METHOD. 1ST, UNDO LAST R CHANGE, RESET IT.
|
|
R=R-DR
|
|
IT=0
|
|
XL=R
|
|
YL=V
|
|
C STEP IN DIRECTION OF OPPOSITE SIGN FOR POTENTIAL.
|
|
IF (V*DVDR*DR.LT.0) GO TO 1201
|
|
DR=-DR
|
|
1201 RSV=R
|
|
DO 1202 ITX=1,5
|
|
R=R+DR
|
|
CALL WAVMAT(W,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
V=W(1)
|
|
IF (V*YL.LT.0.D0) GO TO 1205
|
|
1202 CONTINUE
|
|
DR=-DR
|
|
R=RSV
|
|
DO 1203 ITX=1,5
|
|
R=R+DR
|
|
CALL WAVMAT(W,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
V=W(1)
|
|
IF (V*YL.LT.0.D0) GO TO 1205
|
|
1203 CONTINUE
|
|
WRITE(6,620)
|
|
620 FORMAT('0 WKB. * * * CRASH IN REGULA-FALSI. GIVING UP.')
|
|
STOP
|
|
1205 XR=R
|
|
YR=V
|
|
1210 SLOPE=(YR-YL)/(XR-XL)
|
|
XINT=YL-SLOPE*XL
|
|
XNEW=-XINT/SLOPE
|
|
CALL WAVMAT(W,N,XNEW,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,
|
|
1 NPOTL)
|
|
YNEW=W(1)
|
|
IT=IT+1
|
|
IF (ABS(YNEW).GT.ECNV) GO TO 1211
|
|
1215 DR=XR-XL
|
|
IF (IPRINT.GT.3) WRITE(6,621) IT,XNEW,DR,YNEW
|
|
621 FORMAT(' WKB: REGULA-FALSI CONVERGED. IT,R,DR,V =',I4,3F10.4)
|
|
R=XNEW
|
|
GO TO 1009
|
|
1211 IF (YNEW*YR.GT.0.D0) GO TO 1212
|
|
IF (YNEW*YL.GT.0.D0) GO TO 1213
|
|
WRITE(6,622) XL,XNEW,XR,YL,YNEW,YR
|
|
622 FORMAT('0 WKB. IMPOSSIBLE X(L,NEW,R) AND Y(L,NEW,R)=',6D12.4)
|
|
STOP
|
|
1212 YR=YNEW
|
|
XR=XNEW
|
|
GO TO 1220
|
|
1213 YL=YNEW
|
|
XL=XNEW
|
|
1220 IF (ABS(XR-XL).LE.RCNV) GO TO 1215
|
|
C ALLOW FOR TWICE AS MANY ITERATIONS AS NEWTON-RAPHSON.
|
|
IF (IT.LT.2*ITMX) GO TO 1210
|
|
WRITE(6,623) IT,XL,XNEW,XR,YL,YNEW,YR
|
|
623 FORMAT(' WKB: REGULA-FALSI START FAILED TO CONVERGE. IT=',I4/
|
|
1 16X, 'X(L,NEW,R) AND Y(L,NEW,R)=',6D12.4)
|
|
C STOP
|
|
C
|
|
C GET WKB PHASE SHIFT BY PACK'S GAUSS-MEHLER QUADRATURE
|
|
C
|
|
C FORCE NGMP TO REASONABLE VALUES IF NECESSARY.
|
|
1009 NSTART=MAX0(NGMP(1),3)
|
|
NADD=MAX0(NGMP(2),1)
|
|
NHI=MAX0(NGMP(3),NSTART+3*NADD)
|
|
RMIN=R
|
|
DR0=R
|
|
DWVEC=WVEC(1)
|
|
XKR=DWVEC*DR0
|
|
DO 2000 NPOINT=NSTART,NHI,NADD
|
|
NPSV=NPOINT
|
|
X2NP1=DBLE(2*NPOINT+1)
|
|
SUM=0.D0
|
|
XJ=0.D0
|
|
DO 2100 J=1,NPOINT
|
|
XJ=XJ+1.D0
|
|
X=COS(XJ*PI/X2NP1)
|
|
X2=X*X
|
|
WT=(1.D0-X2)*PI/X2NP1
|
|
XCOMP=SQRT(1.D0-X2)
|
|
R=DR0/X
|
|
CALL WAVMAT(W,N,R,P,VL,IV,ERED,EINT,CENT,RMLMDA,DIAG,MXLAM,NPOTL)
|
|
C WAVMAT GIVES NEGATIVE OF WHAT WE WANT
|
|
W(1)=-W(1)
|
|
C GUARD AGAINST SQAURE ROOTS OF NEGATIVE DW
|
|
IF (W(1).GE.0.D0) GO TO 2109
|
|
C JUDGE AS ROUND-OFF ERROR IF ABS(W) LE. 0.001*ERED
|
|
IF (ABS(W(1)).LE.1.D-3*ERED) GO TO 2108
|
|
WRITE(6,696) R,W(1)
|
|
696 FORMAT(' * * * ERROR. WKB IN CLASSICALLY FORBIDDEN REGION. R, W
|
|
& =',2E16.6)
|
|
2108 W(1)=0.D0
|
|
2109 DW=W(1)
|
|
F=(SQRT(DW)/(DWVEC*XCOMP)-1.D0)/X2
|
|
2100 SUM=SUM+WT*F
|
|
ETA=XKR*SUM+(SQRT(DCENT)-XKR)*PI*.5D0
|
|
IF (NPOINT.GT.NSTART) GO TO 2200
|
|
C ON FIRST ITERATION, GET SET FOR CONVERGENCE TEST.
|
|
C SUBTRACT OUT AN INTEGRAL NUMBER OF 2*PI TO NORMALIZE
|
|
NPI=ETA/PI2
|
|
IF (ETA.LT.0.D0) NPI=NPI-1
|
|
PIMIN=DBLE(NPI)*PI2
|
|
ETA=ETA-PIMIN
|
|
ETAOLD=ETA
|
|
GO TO 2000
|
|
C TEST FOR CONVERGENCE
|
|
2200 ETA=ETA-PIMIN
|
|
X2=ABS(ETA-ETAOLD)
|
|
IF (X2.LE.DTOL) GO TO 2900
|
|
X=ETAOLD
|
|
ETAOLD=ETA
|
|
2000 CONTINUE
|
|
C NOT CONVERGED IF THIS POINT IS REACHED. . .
|
|
NPOINT=NPSV
|
|
NM1=NPOINT-NADD
|
|
WRITE(6,695) NPI,DTOL, NM1,X, NPOINT,ETA
|
|
695 FORMAT('0 * * * WARNING. NO CONVERGENCE OF GAUSS-MEHLER INTEGRATI
|
|
&ON. NPI =',I4,' STEST =',D12.4/
|
|
A (15X,'FOR',I4,' GAUSS POINTS, ETA-NPI*(2*PI) =',F12.7) )
|
|
C SET CONVERGENCE FLAG, IF CONVERGENCE IS REALLY POOR
|
|
IF (X2.GT.5.D0*DTOL) CONV=-1.D0
|
|
2900 IF (IPRINT.GE.3) WRITE(6,612) NPSV,X2,DR0,NPI,ETA
|
|
612 FORMAT('0 * * * NOTE. WKB PHASE SHIFT BY',I4,'-POINT QUAD, TOL ='
|
|
& ,D12.4,', R0 =',F8.4,', ETA IS',I5,'*(2*PI) +',F9.5)
|
|
C
|
|
C CONVERT PHASE SHIFT TO SREAL, SIMAAG / RESTORE FOR RETURN
|
|
SREAL(1)=COS(2.D0*ETA)
|
|
SIMAG(1)=SIN(2.D0*ETA)
|
|
CENT(1)=CSAVE
|
|
RETURN
|
|
C
|
|
END
|
|
FUNCTION XNINEJ(IX1,IY1,IZ1,IX2,IY2,IZ2,IX3,IY3,IZ3)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
DIMENSION XJ9J(200)
|
|
DATA MXDIM/200/
|
|
C
|
|
IVAL=MXDIM
|
|
CALL J9J(DBLE(IX1),DBLE(IY1),
|
|
1 DBLE(IX2),DBLE(IY2),DBLE(IZ2),
|
|
2 DBLE(IX3),DBLE(IY3),DBLE(IZ3),
|
|
3 IVAL,Z1MIN,XJ9J)
|
|
IND=1+IZ1-INT(Z1MIN+0.1D0)
|
|
XNINEJ=0.D0
|
|
IF(IND.GE.1 .AND. IND.LE.IVAL) XNINEJ=XJ9J(IND)
|
|
RETURN
|
|
END
|
|
FUNCTION YRR(L1,L2,L,CT1,CT2,DP)
|
|
C
|
|
C BISPHERICAL HARMONIC ANGULAR FUNCTIONS FOR TWO DIATOMS
|
|
C CT1, CT2 ARE COS(THETA-1) AND COS(THETA-2), AND
|
|
C DP IS DELTA(PHI), I.E., PHI2-PHI1, IN RADIANS
|
|
C CF. GREEN, JCP 62, 2271 (1975) APPENDIX.
|
|
C N.B. P(L,M;X) THERE IS (2*PI)**-1/2 NORMALIZED P(L,M;X)
|
|
C MOLSCAT PLM(L,M,CT) ROUTINE IS NORMALIZED ON CT, AND
|
|
C PLM(L,0,1.D0)=SQRT((2L+1)/2) .
|
|
C THUS, MUST MULT EACH PLM BY (2*PI)**-1/2
|
|
C
|
|
C ODD L1+L2+L *NOT* ALLOWED; TRAPPED W/MESSAGE AND STOP
|
|
C
|
|
C NEEDS ROUTINES THRJ(XJ1,XJ2,XJ3,XM1,XM2,XM3)
|
|
C PLM(L,M,COSTH)
|
|
C PARITY3(J)
|
|
C
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
LOGICAL ODD
|
|
DATA PI/3.14159 26535 89793 D0/
|
|
ODD(I)=2*(I/2)-I.NE.0
|
|
C
|
|
IF (ODD(L1+L2+L)) GO TO 9999
|
|
C
|
|
XL1=L1
|
|
XL2=L2
|
|
XL=L
|
|
C SQRT(4*PI) FROM Y(L,M,THETA=0), 2*PI FOR TWO PLM'S
|
|
DEN=SQRT(4.D0*PI)*2.D0*PI
|
|
FACT=((2.D0*XL+1.D0)/DEN)*PARITY3(L1+L2)
|
|
MTOP=MIN(L1,L2)
|
|
M=0
|
|
XM=0.D0
|
|
SUM=THRJ(XL1,XL2,XL,0.D0,0.D0,0.D0)*PLM(L1,0,CT1)*PLM(L2,0,CT2)
|
|
2000 M=M+1
|
|
IF (M.GT.MTOP) GO TO 3000
|
|
XM=XM+1.D0
|
|
SUM=SUM+2.D0*PARITY3(M)*THRJ(XL1,XL2,XL,XM,-XM,0.D0)*
|
|
1 PLM(L1,M,CT1)*PLM(L2,M,CT2)*COS(XM*DP)
|
|
GO TO 2000
|
|
3000 YRR=FACT*SUM
|
|
RETURN
|
|
9999 WRITE(6,699) L1,L2,L
|
|
699 FORMAT('0 YRR *** ERROR. ODD ARGUMENTS NOT ALLOWED',3I5)
|
|
STOP
|
|
END
|
|
SUBROUTINE YTOK(NB,WVEC,L,N,NOPEN,SJ,SJP,SN,SNP,Y,T,Q,RUP)
|
|
IMPLICIT DOUBLE PRECISION (A-H,O-Z)
|
|
C
|
|
C ROUTINE TO OBTAIN THE K MATRIX FROM THE LOG DERIVATIVE MATRIX
|
|
C ON ENTRY, Y HOLDS THE LOG DERIVATIVE MATRIX
|
|
C ON EXIT, Q HOLDS THE K MATRIX
|
|
C SEE: B.R.JOHNSON, JOURNAL OF COMPUTATIONAL PHYSICS 13, 445 (1973)
|
|
C
|
|
DIMENSION NB(N), WVEC(N), L(N), SJ(N), SJP(N), SN(N), SNP(N),
|
|
1 Y(1), T(1), Q(1)
|
|
C
|
|
IF(NOPEN.EQ.0) RETURN
|
|
DO 10 I = 1,NOPEN
|
|
NX = NB(I)
|
|
DW = WVEC(NX)
|
|
DARG = DW*RUP
|
|
CALL RBES(L(NX), DARG, UJ, UJP, UN, UNP)
|
|
ROOTDW = SQRT(DW)
|
|
SJ(NX) = UJ/ROOTDW
|
|
SJP(NX) = UJP*ROOTDW
|
|
SN(NX) = UN/ROOTDW
|
|
SNP(NX) = UNP*ROOTDW
|
|
10 CONTINUE
|
|
IF (NOPEN.EQ.N) GO TO 30
|
|
NCLOSE = N - NOPEN
|
|
DO 20 I = 1,NCLOSE
|
|
J = NOPEN + I
|
|
NX = NB(J)
|
|
DW = ABS(WVEC(NX))
|
|
DARG = DW*RUP
|
|
CALL RMSBF(L(NX), DARG, RATIO)
|
|
SN(NX) = 1.D0
|
|
SNP(NX) = RATIO*DW
|
|
20 CONTINUE
|
|
30 CONTINUE
|
|
C
|
|
CALL DSYFIL('U',N,Y,N)
|
|
C
|
|
IND = 0
|
|
DO 40 J = 1,NOPEN
|
|
NXJ = NB(J)
|
|
NXJJ = (NXJ - 1)*N
|
|
DO 40 I = 1,N
|
|
IND = IND + 1
|
|
INDY = NXJJ + NB(I)
|
|
T(IND) = Y(INDY)*SJ(NXJ)
|
|
40 CONTINUE
|
|
C
|
|
IND = - N
|
|
DO 50 I = 1,NOPEN
|
|
IND = IND + N + 1
|
|
T(IND) = T(IND) - SJP(NB(I))
|
|
50 CONTINUE
|
|
C
|
|
IND = 0
|
|
DO 60 J = 1,N
|
|
NXJ = NB(J)
|
|
NXJJ = (NXJ - 1)*N
|
|
DO 60 I = 1,N
|
|
IND = IND + 1
|
|
INDY = NXJJ + NB(I)
|
|
Q(IND) = Y(INDY)*SN(NXJ)
|
|
60 CONTINUE
|
|
C
|
|
IND = - N
|
|
DO 70 I = 1,N
|
|
IND = IND + N + 1
|
|
Q(IND) = Q(IND) - SNP(NB(I))
|
|
70 CONTINUE
|
|
C
|
|
CALL DGESV(N,NOPEN,Q,N,SJ,T,N,IER)
|
|
IF (IER.NE.0) GO TO 900
|
|
C
|
|
IND = 0
|
|
DO 80 J = 1,NOPEN
|
|
INDA = (J - 1)*N
|
|
DO 80 I = 1,NOPEN
|
|
IND = IND + 1
|
|
INDA = INDA + 1
|
|
Q(IND) = T(INDA)
|
|
80 CONTINUE
|
|
C
|
|
C Q NOW HOLDS THE K MATRIX. FORCE SYMMETRY ON IT.
|
|
C
|
|
CALL KSYM(Q, NOPEN)
|
|
RETURN
|
|
C
|
|
900 WRITE (6,901) IER
|
|
901 FORMAT('0***** ERROR IN LINEAR EQUATION SOLVER IN YTOK.',
|
|
1 ' IER =',I4,'. RUN HALTED.')
|
|
STOP
|
|
END
|
|
FUNCTION ZBES(K)
|
|
C *** ROUTINE REQUIRED BY GASLEG (GAUSS LEGENDRE PT/WT GENERATOR)
|
|
C *** TAKEN FROM AD VAN DER AVOIRD'S N2-N2 CODE (SG 11/7/91)
|
|
DOUBLE PRECISION PI,ZBES,B,BB,B3,B5,B7
|
|
DATA PI/3.14159 26535 89793 D0/
|
|
B=(DBLE(K)-0.25D0)*PI
|
|
BB=1.0D0/(8.0D0*B)
|
|
B3=BB*BB*BB
|
|
B5=B3*BB*BB
|
|
B7=B5*BB*BB
|
|
ZBES=B+BB-(124.0D0/3.0D0)*B3+(120928.0D0/15.0D0)*B5-(401743168.0D0
|
|
1/105.0D0)*B7
|
|
RETURN
|
|
END
|