|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 92928 (0x16b00)
Types: TextFile
Names: »taldiscr«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦this⟧ »taldiscr«
(mode list.yes
discrlist=set 400
discrete=set 200
scope day discrete discrlist
head cpu
if listing.yes
o discrlist
discrete=fortran cardmode.yes cond.yes names.yes,
index.no trunc.yes
o c
head cpu
mode list.no
finisb)
c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
program discrete
c version 1980-11-13
c common adjusted for logical variables
c double presicion removed
c character handling changed
c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C-----------------------------------------------------------------------
C DISCRETE - VERSION 1A (MARCH 1976). FOR THE AUTOMATIC ANALYSIS OF
C MULTICOMPONENT EXPONENTIAL DECAY DATA FOR UP TO 5 COMPONENTS.
C MUST BE RUN ON A COMPUTER WITH AT LEAST 7 SIGNIFICANT FIGURES IN
C ITS SINGLE PRECISION FORTRAN ARITHMETIC. OTHERWISE THE DOUBLE
C PRECISION VERSION 1B SHOULD BE USED.
C REFERENCES - S. W. PROVENCHER (1976) WRITE UP OF DISCRETE,
C (1976) IN PREPARATION,
C (1976) J. CHEM. PHYS., VOL. 64, 2772,
C (1976) BIOPHYS. J., VOL. 16, 27-41.
C-----------------------------------------------------------------------
C CALLS SUBPROGRAMS - BLOCKDATA, DATAIO, WEIGHT, FANLYZ, YANLYZ
C WHICH IN TURN CALL - LSTSQR, EVAR, VARF, ETHEOR, PIVOT, PIVOT1,
C ANLERR, FISHER, RESIDU, PLPRES
C-----------------------------------------------------------------------
c----------------------------------------------------------------------
c change of input to read beam foil data in free format
c----------------------------------------------------------------------
external in,out; zone in,out
external freadb,freadr,ifreadi,freadra; logical freadb
LOGICAL LAST, REGINT, LBLOKA
COMMON /BLOK/ RBLOKA(3535), IBLOKA(169), NMAX, NINTMX, IBLOKB(9),
a ibloka 149->169
1 REGINT, LBLOKA(38)
A ADJUSTED FROM 29 TO 38
C
C***********************************************************************
C***********************************************************************
C
C THE FOLLOWING INSTRUCTIONS DESCRIBE ALL POSSIBLE NECESSARY CHANGES
C THAT YOU MAY HAVE TO MAKE IN THE MAIN PROGRAM. (SEE ALSO THE
C BLOCKDATA SUBPROGRAM.)
C
C***********************************************************************
C IF YOU CHANGE NMAX IN THE BLOCKDATA SUBPROGRAM, YOU MUST READJUST
C THE DIMENSIONS IN THE FOLLOWING STATEMENT TO NMAX -
C
DIMENSION T(333), Y(333), SQRTW(333), YLYFIT(333)
C
C***********************************************************************
C ORDINARILY E SHOULD BE DIMENSIONED E(NMAX,6) IN THE FOLLOWING
C STATEMENT. HOWEVER, IF YOU WILL ALWAYS INPUT REGINT=.TRUE., AND
C IF NMAX IS GREATER THAN 333, YOU CAN SAVE STORAGE BY DIMENSIONING
C IT AS E(1,6) -
C
DIMENSION E(333,6)
C
C***********************************************************************
C ORDINARILY GSE SHOULD BE DIMENSIONED GSE(500,4). HOWEVER, IF YOU
C WILL ALWAYS INPUT REGINT=.FALSE., AND IF NMAX IS LESS THAN 333,
C YOU CAN SAVE A LITTLE STORAGE BY DIMENSIONING IT AS GSE(1,4) IN
C THE FOLLOWING STATEMENT -
C
DIMENSION GSE(500,4)
C
C***********************************************************************
C IF YOU CHANGE NINTMX IN THE BLOCKDATA SUBPROGRAM, YOU MUST
C READJUST THE DIMENSIONS IN THE FOLLOWING STATEMENT TO NINTMX -
C
DIMENSION TSTART(10), NT(10), DELTAT(10)
C
C THIS IS THE END OF ALL POSSIBLE CHANGES YOU MAY HAVE TO MAKE IN
C THE MAIN PROGRAM.
C
C***********************************************************************
C***********************************************************************
C
EQUIVALENCE (E(1,1),GSE(1,1))
C-----------------------------------------------------------------------
C DATAIO IS FOR INPUT AND OUTPUT OF INPUT DATA
100 CALL DATAIO (T,Y,SQRTW,NMAX,TSTART,DELTAT,NT,NINTMX,LAST)
IF (REGINT) GO TO 110
NDIME=NMAX
NDIMG=1
GO TO 200
110 NDIME=1
NDIMG=500
C-----------------------------------------------------------------------
C WEIGHT GENERATES CRUDE STARTING VALUES FOR CONSTRAINED LEAST SQUARES
C FITS TO RAW DATA TO GENERATE WEIGHTS AND DOES INITIAL
C COMPUTATIONS OF QUANTITIES FOR LATER USE.
200 CALL WEIGHT (.FALSE.,Y,T,SQRTW,YLYFIT,E,NMAX,NDIME,
1 TSTART,DELTAT,NT,NINTMX,GSE,NDIMG)
C-----------------------------------------------------------------------
C FANLYZ IS FOR THE CONSTRAINED STEPWISE LEAST SQUARES ANALYSIS OF
C THE RAW DATA AND THE TRANSFORMS TO GET STARTING ESTIMATES
C FOR THE FINAL LEAST SQUARES ANALYSES OF THE RAW DATA.
CALL FANLYZ (T,Y,SQRTW,YLYFIT,E,NMAX,NDIME,
1 TSTART,DELTAT,NT,NINTMX,GSE,NDIMG)
C-----------------------------------------------------------------------
C WEIGHT USES STARTING VALUES FROM FANLYZ FOR CONSTRAINED LEAST
C SQUARES FITS TO RAW DATA TO GENERATE WEIGHTS FOR THE FINAL
C LEAST SQUARES FITS TO THE RAW DATA.
CALL WEIGHT (.TRUE.,Y,T,SQRTW,YLYFIT,E,NMAX,NDIME,
1 TSTART,DELTAT,NT,NINTMX,GSE,NDIMG)
C-----------------------------------------------------------------------
C YANLYZ IS FOR THE CONSTRAINED STEPWISE LEAST SQUARES ANALYSIS OF
C THE RAW DATA (USING THE STARTING VALUES OBTAINED FROM FANLYZ
C AND THE WEIGHTS FROM WEIGHT).
CALL YANLYZ (T,Y,SQRTW,YLYFIT,E,NMAX,NDIME,
1 TSTART,DELTAT,NT,NINTMX,GSE,NDIMG)
C-----------------------------------------------------------------------
IF (.NOT.LAST) GO TO 100
STOP
END
SUBROUTINE BLOCKDATA
LOGICAL REGINT, FAILED, PRPREL, NOBASE, WTED, REPEAT, PLOTRS,
1 NONNEG, FFAIL, PIVALP, PRFINL
REAL LAMST, LAMF, LAMNMX
LONG LABEL
COMMON /BLOK/ TRBASE(11), GF(11,126), DGFL(11,126), DGRIDF,
1 GFSTL, FHAT(11), DELTA, VARMIN, FHATMX, SUMWTY,
2 SUMWT, ZERO(6), CONVRG, LAMST(5), LAMF(5,5,2), DGRIDE, GESTL,
3 VAR, LAMNMX(2,2), PALPHA(6), PLAM(6), PRECIS, SIGYY, ENPHI,
4 SE(6,6), SIGMAP(11), PCERR(11), VGRID2(252), PLMTRY(6),
5 DELTAP(10), DFCAPL(6,5), SFDE(5), ADUB(11,11), DDSE(5,5)
COMMON /BLOK/ DTOLER(11), F(11,6), DF(11,6), JGEADD, NBINOM(20,5),
1 NVGRID(5), NPERG2(5), MDIMA, IBASE, IWTSGN, MINTER, MLAMMX,
2 NGRID2(5), NLAMMX, IWT, LABEL(20), NINT, NF, N, IWRITE, IREAD,
3 LINEPG, NMAX, NINTMX, MTRY, ITER, JLAMP1, NFTRY(5), NSIGFG,
4 REGINT, FAILED, PRPREL, NOBASE, WTED, REPEAT, PLOTRS, NONNEG,
5 FFAIL(5,2), PIVALP(11), PRFINL
C
C***********************************************************************
C***********************************************************************
C
C THE FOLLOWING INSTRUCTIONS DESCRIBE ALL POSSIBLE NECESSARY CHANGES
C THAT YOU MAY HAVE TO MAKE IN THE BLOCKDATA SUBPROGRAM. (SEE THE
C MAIN PROGRAM ALSO.)
C
C***********************************************************************
C ALL STATEMENTS FOR READING CARDS AND FOR PRINTING OUTPUT ARE OF
C THE FORM READ (IREAD,... AND WRITE(IWRITE,.... THUS, IREAD AND
C IWRITE MAY HAVE TO BE CHANGED TO THE VALUES APPROPRIATE FOR YOUR
C COMPUTER CENTER IN THE FOLLOWING STATEMENT -
C
DATA IREAD/5/,IWRITE/6/
C
C***********************************************************************
C IN THE FOLLOWING STATEMENT, NSIGFG MUST BE SET TO THE NUMBER OF
C SIGNIFICANT FIGURES CARRIED IN THE SINGLE PRECISION FLOATING POINT
C ARITHMETIC OF YOUR COMPUTER (E.G., 7 FOR IBM 360, 8 FOR
C UNIVAC 1108, ETC.) -
C
DATA NSIGFG/11/
C
C***********************************************************************
C IN THE FOLLOWING STATEMENT, LINEPG MUST BE SET TO THE NUMBER OF
C LINES PER PAGE AVAILABLE FOR PRINTED OUTPUT ON YOUR PRINTER -
C
DATA LINEPG/66/
C
C***********************************************************************
C NMAX MUST BE GREATER THAN OR EQUAL TO THE MAXIMUM NUMBER OF DATA
C POINTS YOU WILL EVER USE. CORE STORAGE CAN BE SAVED BY KEEPING
C NMAX AS LITTLE ABOVE THIS MAXIMUM AS POSSIBLE. IF YOU CHANGE NMAX
C IN THE FOLLOWING STATEMENT, YOU MUST ALSO RESET THE DIMENSIONS AS
C DIRECTED IN THE MAIN PROGRAM -
C
DATA NMAX/333/
C
C***********************************************************************
C NINTMX MUST BE GREATER THAN OR EQUAL TO THE MAXIMUM VALUE OF NINT
C YOU WILL EVER USE WITH REGINT=.TRUE.. IF YOU CHANGE
C NINTMX IN THE FOLLOWING STATEMENT, YOU MUST ALSO RESET THE
C DIMENSIONS AS DIRECTED IN THE MAIN PROGRAM -
C
DATA NINTMX /10/
C
C THIS IS THE END OF ALL POSSIBLE NECESSARY CHANGES YOU MAY HAVE TO
C MAKE IN THE BLOCK DATA SUBPROGRAM
C
C***********************************************************************
C***********************************************************************
C
DATA NGRID2/0, 20, 12, 10, 10/,MINTER/7/,
1 CONVRG/5.E-5/,MLAMMX/5/, SIGMAP/11*0./
END
C-----------------------------------------------------------------------
C SUBROUTINE DATAIO. FOR INPUT AND OUTPUT OF INITIAL INPUT DATA
C-----------------------------------------------------------------------
C CALLS NO EXTERNAL SUBPROGRAMS.
C-----------------------------------------------------------------------
SUBROUTINE DATAIO (T,Y,SQRTW,NMAX,TSTART,DELTAT,NT,NINTMX,LAST)
external in,out; zone in,out
external freadb,freadr,ifreadi,freadra; logical freadb
LOGICAL REGINT, LAST, NONNEG, NOBASE, PRY, PRPREL, PLOTRS, REPEAT,
1 LBLOKA, LBLOKB, LBLOKC, ABORT, PRFINL
LONG LA(9), LATF(2),LABEL
COMMON /BLOK/ RBLOKA(3535), IBLOKA(113), IWTSGN, IBLOKB, MLAMMX,
1 IBLOKC(5), NLAMMX, IWT, LABEL(20), NINT, IBLOKD, N, IWRITE,
2 IREAD, IBLOKE(3), MTRY, IBLOKF(8), REGINT, LBLOKA, PRPREL,
3 NOBASE, LBLOKB, REPEAT, PLOTRS, NONNEG, LBLOKC(21), PRFINL
DIMENSION T(NMAX), Y(NMAX), SQRTW(NMAX), TSTART(NINTMX),
1 NT(NINTMX), DELTAT(NINTMX)
LATF(1)='T '
LATF(2)='F '
5010 FORMAT (12A6)
READ (IREAD,5010) LABEL
5020 FORMAT (35H1DISCRETE - VERSION 1A (MARCH 1976))
WRITE (IWRITE,5020)
5222 FORMAT(12A6)
WRITE(IWRITE,5222) LABEL
ABORT=.FALSE.
c +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c5100 FORMAT (9A1,3I3)
c READ (IREAD,5100) LA,NLAMMX,IWT,MTRY
read(iread,5100) la
5100 format(9a1)
nlammx=ifreadi(in)
iwt =ifreadi(in)
mtry =ifreadi(in)
c +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
DO 101 J=1,9
IF (LA(J).EQ.LATF(1) .OR. LA(J).EQ.LATF(2)) GO TO 101
5101 FORMAT (/43H THE FOLLOWING CARD HAS NO T OR F IN COLUMN,I2)
WRITE (IWRITE,5101) J
ABORT=.TRUE.
101 CONTINUE
IF (NLAMMX.GE.1 .AND. NLAMMX.LE.MLAMMX) GO TO 102
5102 FORMAT (/9H NLAMMX =,I4,21H IS NOT BETWEEN 1 AND,I2)
WRITE (IWRITE,5102) NLAMMX, MLAMMX
ABORT=.TRUE.
102 IF (IWT.EQ.1 .OR. IABS(IWT).EQ.2 .OR. IABS(IWT).EQ.3
1 .OR. IWT.EQ.4) GO TO 103
5103 FORMAT (/1X,I4,29H IS AN IMPROPER VALUE FOR IWT)
WRITE (IWRITE,5103) IWT
ABORT=.TRUE.
103 IF (MTRY.GE.1 .AND. MTRY.LE.45) GO TO 104
5104 FORMAT (/7H MTRY =,I4,24H IS NOT BETWEEN 1 AND 45)
WRITE (IWRITE,5104) MTRY
ABORT=.TRUE.
104 IF (.NOT.ABORT) GO TO 105
5105 FORMAT (/21H ERRONEOUS CARD IMAGE,10X,9A1,3I3)
WRITE (IWRITE,5105) LA,NLAMMX,IWT,MTRY
STOP
105 LAST=LA(1) .EQ. LATF(1)
REGINT=LA(2) .EQ. LATF(1)
NOBASE=LA(3) .EQ. LATF(1)
NONNEG=LA(4) .EQ. LATF(1)
PRY=LA(5) .EQ. LATF(1)
PRPREL=LA(6) .EQ. LATF(1)
PRFINL=LA(7) .EQ. LATF(1)
PLOTRS=LA(8) .EQ. LATF(1)
REPEAT=LA(9) .EQ. LATF(1)
5106 FORMAT (/7H LAST =,L2,1X,8HREGINT =,L2,2X,8HNOBASE =,L2,2X,
1 8HNONNEG =,L2,2X,5HPRY =,L2/9H PRPREL =,L2,2X,8HPRFINL =,L2,2X,
2 8HPLOTRS =,L2,2X,8HREPEAT =,L2/9H NLAMMX =,I2,1X,8HIWT =,
3 I2,2X,8HMTRY =,I3)
WRITE (IWRITE,5106) LAST,REGINT,NOBASE,NONNEG,PRY,PRPREL,PRFINL,
1 PLOTRS,REPEAT,NLAMMX,IWT,MTRY
IWTSGN=IWT
IWT=IABS(IWT)
IF (REGINT) GO TO 150
C-----------------------------------------------------------------------
C READS IN T VALUES (REGINT=.FALSE.).
C-----------------------------------------------------------------------
c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
c READ (IREAD,5110) N
5110 FORMAT (I5)
c READ (IREAD,5120) (T(J),J=1,N)
5120 FORMAT (5E15.6)
n=ifreadi(in);
call freadra(in,t,n)
c +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
NINT=1
TSTART(1)=0.
DELTAT(1)=0.
NT(1)=N
GO TO 200
C-----------------------------------------------------------------------
C CALCULATES T VALUES FROM TSTART, TEND, AND NT (REGINT=.TRUE.).
C-----------------------------------------------------------------------
c 150 READ (IREAD,5110) NINT
150 nint=ifreadi(in)
IF (NINT.LE.NINTMX .AND. NINT.GE.1) GO TO 160
5160 FORMAT (///7H NINT =,I5,30H IS NOT BETWEEN 1 AND NINTMX =,I2)
WRITE (IWRITE,5160) NINT,NINTMX
STOP
5165 FORMAT (///9X,6HTSTART,11X,4HTEND,3X,2HNT)
160 WRITE (IWRITE,5165)
N=0
DO 170 J=1,NINT
c READ (IREAD,5170) TSTART(J),TEND,NT(J)
tstart(j)=freadr(in); tend=freadr(in); nt(j)=ifreadi(in)
5170 FORMAT (2E15.6,I5)
WRITE (IWRITE,5170) TSTART(J),TEND,NT(J)
IF (NT(J) .GE. 2) GO TO 175
5175 FORMAT (/24H ABOVE NT IS LESS THAN 2)
WRITE (IWRITE,5175)
STOP
175 DUM=(TEND-TSTART(J))/FLOAT(NT(J)-1)
N=N+1
T(N)=TSTART(J)
L=NT(J)
DELTAT(J)=DUM
DO 180 K=2,L
N=N+1
180 T(N)=T(N-1)+DUM
170 CONTINUE
C-----------------------------------------------------------------------
C READS IN Y VALUES.
C-----------------------------------------------------------------------
200 IF (N.GT.2*NLAMMX+1 .AND. N.LE.NMAX) GO TO 205
5205 FORMAT (///4H N =,I5,37H IS NOT BETWEEN 2*NLAMMX+1 AND NMAX =,I5)
WRITE (IWRITE,5205) N,NMAX
STOP
205 IF (PRY) WRITE (IWRITE,5004)
5004 FORMAT (///1X)
c READ (IREAD,5120) (Y(J),J=1,N)
call freadra(in,y,n)
210 IF (IWT .EQ. 4) GO TO 220
IF (.NOT.PRY) GO TO 500
5210 FORMAT (2(16X,1HT,12X,1HY)/)
WRITE (IWRITE,5210)
5220 FORMAT (2(1PE17.5,E13.5))
WRITE (IWRITE,5220) (T(J),Y(J),J=1,N)
GO TO 500
C-----------------------------------------------------------------------
C READS IN SPECIAL WEIGHTS (IWT=4).
C-----------------------------------------------------------------------
c 220 READ (IREAD,5120) (SQRTW(J),J=1,N)
220 call freadra(in,sqrtw,n)
DO 227 J=1,N
227 SQRTW(J)=SQRT(SQRTW(J))
IF (.NOT.PRY) GO TO 500
5230 FORMAT (2(17X,1HT,12X,1HY,5X,8HSQRT(WT))/)
WRITE (IWRITE,5230)
5240 FORMAT (2(1PE18.5,2E13.5))
WRITE (IWRITE,5240) (T(J),Y(J),SQRTW(J),J=1,N)
500 RETURN
END
C-----------------------------------------------------------------------
C SUBROUTINE WEIGHT. DOES INITIAL LEAST SQUARES FITS TO RAW DATA TO
C GENERATE WEIGHTS, EVALUATES DATA TRANSFORMS, TRANSFORM AND
C EXPONENTIAL SUMS AT GRID POINTS FOR INTERPOLATION, AND OTHER
C QUANTITIES FOR LATER USE.
C IF FINAL=.TRUE. USES LAMF (VALUES FROM FANLYZ).
C IF FINAL=.FALSE., GENERATES ITS OWN CRUDE STARTING LAMBDAS.
C-----------------------------------------------------------------------
C CALLS SUBPROGRAMS - LSTSQR, ETHEOR
C WHICH IN TURN CALL - EVAR, PIVOT, PIVOT1, ANLERR
C-----------------------------------------------------------------------
SUBROUTINE WEIGHT (FINAL,Y,T,SQRTW,TIMU,E,NMAX,NDIME,
1 TSTART,DELTAT,NT,NINTMX,GSE,NDIMG)
EXTERNAL EVAR
LOGICAL FINAL, REGINT, NOBASE, WTED, FAILED, LDUM, LBLOKA, PRPREL,
1 LBLOKB, FFAIL
REAL LAMNMX, LAMST, LAMF, MU
LONG ALPH(3,2), LABEL
COMMON /BLOK/ TRBASE(11), GF(11,126), DGFL(11,126), DGRIDF,
1 GFSTL, FHAT(11), DELTA, VARMIN, FHATMX, SUMWTY,
2 SUMWT, ZERO(6), CONVRG, LAMST(5), LAMF(5,5,2), DGRIDE, GESTL,
3 VAR, LAMNMX(2,2), PALPHA(6), PLAM(6), PRECIS, RBLOKA(652)
COMMON /BLOK/ JGEADD, NBINOM(20,5), NVGRID(5),
1 NPERG2(5), MDIMA, IBASE, IWTSGN, MINTER, MLAMMX, NGRID2(5),
2 NLAMMX, IWT, LABEL(20), NINT, NF, N, IWRITE, IBLOKA(12), NSIGFG,
3 REGINT, FAILED, PRPREL, NOBASE, WTED, LBLOKA(6), FFAIL(5,2),
4 LBLOKB(14)
a lbloka 3->6, lblokb 12->14
DIMENSION E(NDIME,6), WTALP(6), WTLAM(6), MU(11)
DIMENSION Y(NMAX), T(NMAX), SQRTW(NMAX), TIMU(NMAX),
1 TSTART(NINTMX), DELTAT(NINTMX), NT(NINTMX), GSE(NDIMG,4),
2 TNLAMN(2), GAMMA(21)
C++++++++++
ALPH(1,1)='TRAN'; ALPH(2,1)='SFOR'; ALPH(3,2)='MS'
ALPH(1,2)='RAW' ; ALPH(2,2)='DATA'; ALPH(3,2)=' '
TNLAMN(1)=.2 ; TNLAMN(2)=.02
T1LAMX=2.08
NGRID1=240
NG2MAX=20
C++++++++++
IF (FINAL) GO TO 120
FHATMX=0.
PRECIS=EXP(-2.303*(FLOAT(NSIGFG)-2.))
PRECIS=AMAX1(1.E-7,PRECIS)
MDIMA=2*MLAMMX+1
K=MLAMMX+1
DO 105 J=1,K
105 ZERO(J)=0.
TN=-1.E+20
DDUM=-1.E+20
DO 106 K=1,5
DUM=1.E+20
DO 107 J=1,N
IF (K .EQ. 1) TN=AMAX1(TN,T(J))
107 IF (T(J).GT.DDUM .AND. T(J).LT.DUM) DUM=T(J)
DDUM=DUM+1.E-5*ABS(DUM)
IF (K .EQ. 1) T1=DUM
IF (K .EQ. 2) T2=DUM
106 CONTINUE
T5=DUM
TNL1=-1.E+20
DUM=TN-1.E-5*ABS(TN)
DO 108 J=1,N
108 IF (T(J) .LT. DUM) TNL1=AMAX1(TNL1,T(J))
DUM=.25*(T5-T1)
DELTA=DUM-T1
C-----------------------------------------------------------------------
C LAMNMX(J,K) = MIN. (J=1) AND MAX. (J=2) ALLOWED VALUES OF LAMBDA
C FOR LEAST SQUARES PARAMETERS (K=1) AND FOR STARTING VALUES (K=2).
C-----------------------------------------------------------------------
LAMNMX(2,1)=T1LAMX/(T1+DELTA)
LAMNMX(2,2)=AMIN1(LAMNMX(2,1),.693/(T1+DELTA))
LAMNMX(1,2)=TNLAMN(1)/(TN+DELTA)
IF (NOBASE) GO TO 110
NPARMX=2*NLAMMX+1
IBASE=1
LAMNMX(1,1)=LAMNMX(1,2)
GO TO 115
110 IBASE=0
NPARMX=2*NLAMMX
FHAT(NPARMX+1)=0.
LAMNMX(1,1)=TNLAMN(2)/(TN+DELTA)
C-----------------------------------------------------------------------
C IF NECESSARY, INCREASE DELTA SO THAT DISTANCE BETWEEN FIRST TWO
C POINTS ON X=ALOG(T+DELTA) AXIS IS LESS THAN A HALF-PERIOD OF
C THE HIGHEST FREQUENCY USED IN THE TRANSFORMS
C-----------------------------------------------------------------------
115 XRANGE=ALOG((TN+DELTA)**2/((T1+DELTA)*(TNL1+DELTA)))
IF (ALOG((T2+DELTA)/(T1+DELTA))*FLOAT(2*NLAMMX) .LT. XRANGE)
1 GO TO 150
DELTA=DELTA+DUM
GO TO 115
120 IWT=IABS(IWTSGN)
IF (IWT.EQ.1 .OR. IWT.EQ.4) RETURN
DO 130 J=1,N
130 Y(J)=Y(J)/SQRTW(J)
150 IF (IWT .EQ. 4) GO TO 400
SUMWT=FLOAT(N)
SUMWTY=0.
VARMIN=0.
DO 160 J=1,N
SUMWTY=SUMWTY+Y(J)
VARMIN=VARMIN+Y(J)*Y(J)
160 SQRTW(J)=1.
VARMIN=VARMIN*CONVRG**2
IF (IWT.EQ.1) GO TO 400
WTED=.FALSE.
VARBES=1.E+20
RATIOL=LAMNMX(2,2)/LAMNMX(1,2)
C-----------------------------------------------------------------------
C START OF MAIN LOOP FOR STEPWISE ANALYSIS
C-----------------------------------------------------------------------
DO 200 JLAM=1,NLAMMX
NF=2*JLAM+IBASE
5200 FORMAT (1H1,12A6//5X,
1 41HPRELIMINARY ANALYSIS TO DETERMINE WEIGHTS/5X,
2 17HANALYSIS ASSUMING,I2,11H COMPONENTS)
IF (PRPREL) WRITE (IWRITE,5200) LABEL,JLAM
IF (FINAL) GO TO 220
FFAIL(JLAM,1)=.TRUE.
DUM=RATIOL**(1./FLOAT(JLAM+1))
LAMST(1)=LAMNMX(1,2)*DUM
IF (JLAM .EQ. 1) GO TO 240
DO 210 J=2,JLAM
210 LAMST(J)=LAMST(J-1)*DUM
GO TO 240
220 DO 230 J=1,JLAM
230 LAMST(J)=LAMF(J,JLAM,1)
240 CALL LSTSQR (LAMST,JLAM,.TRUE.,N,Y,T,JLAM+IBASE,EVAR,GSE,NDIMG,
1 SQRTW,TIMU,E,NMAX,TSTART,DELTAT,NT,NINT,1,FFAIL(JLAM,1),NDIME,
2 .FALSE.,PRPREL)
IF (FAILED .OR. VAR.GE.VARBES) GO TO 300
VARBES=VAR
NLINWT=JLAM+IBASE
DO 260 J=1,NLINWT
WTALP(J)=PALPHA(J)
260 WTLAM(J)=PLAM(J)
IF (IWTSGN .LT. 0) NLINWT=JLAM
200 CONTINUE
300 IF (VARBES .LT. 1.E+20) GO TO 310
5300 FORMAT (////34H 1-COMPONENT ANALYSIS TO DETERMINE,
1 54H WEIGHTS SOMEHOW FAILED - UNIT WEIGHTS WILL BE USED. ,
2 11(2H**))
WRITE (IWRITE,5300)
IWT=1
GO TO 400
C-----------------------------------------------------------------------
C CALCULATE WEIGHTS INCLUDING ERRFIT (STANDARD ERROR IN REGION OF
C THE THEORETICAL CURVE WHERE IT IS CLOSEST TO Y=0., WHERE A
C WEIGHT COULD OTHERWISE BE DISASTROUSLY LARGE IF ERRFIT WERE
C NOT ACCOUNTED FOR).
C-----------------------------------------------------------------------
310 DUM=1.E+20
DO 320 K=1,N
S=0.
DDUM=T(K)
DO 330 J=1,NLINWT
330 S=S+WTALP(J)*EXP(-DDUM*WTLAM(J))
TIMU(K)=S
IF (ABS(S) .GE. DUM) GO TO 320
DUM=ABS(S)
L=K
320 CONTINUE
K=MIN0(N,L+5)
I=MAX0(1,K-9)
DUM=0.
DDUM=0.
IF (IWTSGN.LT.0 .AND. .NOT.NOBASE) DDUM=WTALP(NLINWT+1)
DO 340 J=I,K
340 DUM=DUM+(Y(J)-TIMU(J)-DDUM)**2
ERRFIT=SQRT(DUM/FLOAT(K-I+1))
DO 350 K=1,N
SQRTW(K)=1./(ABS(TIMU(K))+ERRFIT)
IF (IWT .EQ. 2) SQRTW(K)=SQRT(SQRTW(K))
350 CONTINUE
L=1
IF (FINAL) L=2
5350 FORMAT (/////41H PARAMETERS USED TO GENERATE WEIGHTS FOR ,
1 3A4//5X,6HLAMBDA,9X,5HALPHA,
2 /49HERRFIT (UNCERTAINTY TERM ADDED TO ABSOLUTE VALUES,
3 24H OF THEORETICAL CURVE) =,1PE9.2/(1X,1PE10.3,E14.3))
WRITE (IWRITE,5350) (ALPH(J,L),J=1,3),ERRFIT,(WTLAM(K),WTALP(K),
1 K=1,NLINWT)
400 WTED=IWT.NE.1
IF (FINAL) GO TO 600
C-----------------------------------------------------------------------
C INITIAL COMPUTATION OF QUANTITIES TO BE USED LATER
C-----------------------------------------------------------------------
DGRIDE=ALOG(LAMNMX(2,2)/LAMNMX(1,2))/FLOAT(NGRID1-1)
RGRIDE=EXP(DGRIDE)
JGEADD=MINTER/2
IF (NOBASE) JGEADD=JGEADD+(ALOG(LAMNMX(1,2)/LAMNMX(1,1))/
1 DGRIDE+.5)
GEST=LAMNMX(1,2)/RGRIDE**(JGEADD+1)
GESTL=ALOG(GEST)
NGE1=NGRID1+JGEADD+(ALOG(2.*LAMNMX(2,1)/LAMNMX(2,2))/DGRIDE+
1 .5)+MINTER/2
IF (NGE1 .LE. 500) GO TO 401
5401 FORMAT (////20H FIX LAMNMX. NGE1 =,I9,1X,51(2H**))
WRITE (IWRITE,5401) NGE1
STOP
401 JGEADD=JGEADD+1
IF (NLAMMX .EQ. 1) GO TO 403
DO 402 J=2,NLAMMX
402 NPERG2(J)=NGRID1/NGRID2(J)
403 GAMMA(1)=1.
DO 404 J=1,NG2MAX
404 GAMMA(J+1)=GAMMA(J)*FLOAT(J)
DO 405 J=1,NLAMMX
DO 406 K=J,NG2MAX
L=K-J+1
406 NBINOM(K,J)=(GAMMA(K)/(GAMMA(L)*GAMMA(J))+.5)
IF (J .EQ. 1) GO TO 405
L=NGRID2(J)+1
K=L-J
NVGRID(J)=(GAMMA(L)/(GAMMA(J+1)*GAMMA(K))+.5)
405 CONTINUE
NGF=NGRID1/2+2*(MINTER/2)
DGRIDF=ALOG(LAMNMX(2,1)/LAMNMX(1,1))/FLOAT(NGRID1/2-1)
RGRIDF=EXP(DGRIDF)
GFST=LAMNMX(1,1)/RGRIDF**(MINTER/2+1)
GFSTL=ALOG(GFST)
C-----------------------------------------------------------------------
C COMPUTE FHAT (TRANSFORMS OF DATA) AND GF AND DGFL (INTERPOLATION
C GRID POINTS FOR TRANSFORMS AND THEIR DERIVATIVES W.R.T.
C ALOG(LAMBDA))
C-----------------------------------------------------------------------
IF (.NOT.REGINT) GO TO 420
DO 410 J=1,NINT
410 TSTART(J)=TSTART(J)+DELTA
420 DO 430 J=1,N
430 T(J)=T(J)+DELTA
MU(1)=6.283185/XRANGE
DO 440 K=1,NPARMX
IF (K .GT. 1) GO TO 450
DO 445 J=1,N
FHATMX=FHATMX+SQRTW(J)*ABS(Y(J))
445 TIMU(J)=SQRTW(J)
GO TO 470
450 L=K/2
IF (L+L .LT. K) GO TO 460
DUM=MU(1)
IF (L .GT. 1) DUM=MU(L-1)+DUM
MU(L)=DUM
DO 455 J=1,N
455 TIMU(J)=COS(ALOG(T(J))*DUM)*SQRTW(J)
GO TO 470
460 DUM=MU(L)
DO 465 J=1,N
465 TIMU(J)=SIN(ALOG(T(J))*DUM)*SQRTW(J)
470 DUM=0.
DDUM=0.
DO 475 J=1,N
DUM=DUM+Y(J)*TIMU(J)
475 DDUM=DDUM+TIMU(J)
FHAT(K)=DUM
TRBASE(K)=DDUM
DUM=GFST
DO 480 L=1,NGF
DUM=DUM*RGRIDF
S=0.
SS=0.
IF (REGINT) GO TO 500
DO 490 J=1,N
DDUM=EXP(-DUM*T(J))*TIMU(J)
S=S+DDUM
490 SS=SS-DDUM*T(J)
GO TO 550
C-----------------------------------------------------------------------
C USE RECURSION RELATIONS IF REGINT=.TRUE.
C-----------------------------------------------------------------------
500 J=0
DO 510 JJ=1,NINT
DDUM=EXP(-DUM*DELTAT(JJ))
DDDUM=EXP(-DUM*TSTART(JJ))
II=NT(JJ)
DO 520 I=1,II
J=J+1
SSS=DDDUM*TIMU(J)
S=S+SSS
SS=SS-T(J)*SSS
DDDUM=DDDUM*DDUM
520 CONTINUE
510 CONTINUE
550 GF(K,L)=S
DGFL(K,L)=SS*DUM
480 CONTINUE
440 CONTINUE
IF (PRPREL) WRITE (IWRITE,5560) DELTA,FHAT(1),(MU(K),FHAT(2*K),
1 FHAT(2*K+1),K=1,NLAMMX)
5560 FORMAT (////6X,2HMU,13X,
1 38HREAL AND IMAGINARY PARTS OF TRANSFORMS,15X,7HDELTA =,1PE9.2
2 /4X,4H.000,1PE17.3/(1X,0PF7.3,1PE17.3,E14.3))
DO 560 J=1,N
560 T(J)=T(J)-DELTA
IF (.NOT.REGINT) GO TO 600
DO 570 J=1,NINT
570 TSTART(J)=TSTART(J)-DELTA
600 IF (.NOT.WTED) GO TO 620
VARMIN=0.
SUMWT=0.
SUMWTY=0.
DO 610 J=1,N
Y(J)=Y(J)*SQRTW(J)
VARMIN=VARMIN+Y(J)*Y(J)
IF (NOBASE) GO TO 610
SUMWT=SUMWT+SQRTW(J)*SQRTW(J)
SUMWTY=SUMWTY+SQRTW(J)*Y(J)
610 CONTINUE
VARMIN=VARMIN*CONVRG**2
620 IF (FINAL .OR. .NOT.REGINT) GO TO 900
C-----------------------------------------------------------------------
C COMPUTE GSE (INTERPOLATION GRID POINTS FOR EXPONENTIAL SUMS)
C-----------------------------------------------------------------------
DUM=GEST
L=NGE1-(.69315/DGRIDE)
DO 630 K=1,NGE1
DUM=DUM*RGRIDE
LDUM=K .LE. L
CALL ETHEOR (DUM,.TRUE.,WTED,T,SQRTW,Y,NMAX,TSTART,DELTAT,NT,
1 NINT,S,SS,SSS,DDDUM,.TRUE.,LDUM)
GSE(K,1)=S
GSE(K,2)=SS
GSE(K,3)=SSS
GSE(K,4)=DDDUM
630 CONTINUE
900 RETURN
END
C-----------------------------------------------------------------------
C SUBROUTINE FANLYZ. DOES CONSTRAINED STEPWISE LEAST SQUARES ANALYSIS
C OF RAW DATA (USING GRID SEARCH IF NECESSARY) TO GET STARTING
C VALUES FOR ANALYSIS OF TRANSFORMS, WHICH YEILD LAMF (STARTING
C VALUES FOR FINAL ANALYSIS OF RAW DATA IN YANLYZ).
C-----------------------------------------------------------------------
C CALLS SUBPROGRAMS - LSTSQR, EVAR
C WHICH IN TURN CALL - PIVOT, PIVOT1, ETHEOR, VARF
C-----------------------------------------------------------------------
SUBROUTINE FANLYZ (T,Y,SQRTW,YLYFIT,E,NMAX,NDIME,
1 TSTART,DELTAT,NT,NINTMX,GSE,NDIMG)
EXTERNAL VARF, EVAR
LOGICAL PRPREL, WTED, FAILED, SEARCH, LDUM, FFAIL, LBLOKA,
1 LBLOKB, LBLOKC, LBLOKD, SAVEPK
REAL LAMNMX, LAMST, LAMF
LONG LABEL
COMMON /BLOK/ RBLOKA(2808), LAMST(5), LAMF(5,5,2), DGRIDE, GESTL,
1 VAR, LAMNMX(2,2), PALPHA(6), PLAM(6), RBLOKB(61), VGRID2(252),
2 RBLOKC(340), JGEADD, IBLOKA(100), NVGRID(5), NPERG2(5), IBLOKB,
3 IBASE, IBLOKC(2), MLAMMX, NGRID2(5), NLAMMX, IWT,
4 LABEL(20), NINT, NF, N, IWRITE, IBLOKD(4), MTRY, IBLOKE(2),
5 NFTRY(5), IBLOKF, LBLOKA, FAILED, PRPREL, LBLOKB, WTED
COMMON /BLOK/ LBLOKC(6), FFAIL(5,2), LBLOKD(14)
a lblokc 3->6, lblokd 12->14
DIMENSION E(NDIME,6), LENDEQ(5), LEQ(5), JCENTR(20), LSTART(5,45)
DIMENSION T(NMAX), Y(NMAX), SQRTW(NMAX), GSE(NDIMG,4),
1 YLYFIT(NMAX), TSTART(NINTMX), DELTAT(NINTMX), NT(NINTMX)
EQUIVALENCE (LENDEQ(1),LEND1), (LENDEQ(2),LEND2), (LENDEQ(3),
1 LEND3), (LENDEQ(4),LEND4), (LENDEQ(5),LEND5),
2 (LEQ(1),L1), (LEQ(2),L2), (LEQ(3),L3), (LEQ(4),L4), (LEQ(5),L5)
C++++++++
LLPEAK=1
C++++++++
WTED=IWT .NE. 1
LAMST(1)=SQRT(LAMNMX(2,2)*LAMNMX(1,2))
C-----------------------------------------------------------------------
C START OF MAIN LOOP FOR STEPWISE ANALYSIS
C-----------------------------------------------------------------------
DO 200 JLAM=1,NLAMMX
C-----------------------------------------------------------------------
C INITIALIZE FOR FITS ASSUMING JLAM COMPONENTS
C-----------------------------------------------------------------------
5150 FORMAT (1H1,5X,12A6/)
IF (PRPREL) WRITE (IWRITE,5150) LABEL
VARE=1.E+20
VARTRY=1.E+20
NF=2*JLAM+IBASE
IF (JLAM .EQ. 1) GO TO 220
LVGRID=NVGRID(JLAM)
DO 210 J=1,LVGRID
210 VGRID2(J)=0.
220 JLAML1=JLAM-1
JLAMP1=JLAM+1
IF (PRPREL) WRITE (IWRITE,5210) JLAM
5210 FORMAT (5X,45HINITIAL ANALYSIS OF THE RAW DATA AND THEN THE,
2 22H TRANSFORMS - ASSUMING,I2,11H COMPONENTS)
C-----------------------------------------------------------------------
C START OF LOOP FOR UP TO MTRY JLAM-COMPONENT FITS
C-----------------------------------------------------------------------
DO 300 JTRY=1,MTRY
5310 FORMAT (////5X,22HFIT USING STARTING SET,I3)
IF (PRPREL) WRITE (IWRITE,5310) JTRY
IF (JLAM.EQ.1) GO TO 600
IF (JTRY-2) 315,350,500
C-----------------------------------------------------------------------
C SELECT FIRST SET OF STARTING VALUES
C-----------------------------------------------------------------------
315 DO 320 J=1,JLAML1
320 LAMST(J)=LAMF(J,JLAML1,2)
IF (LPEAK.EQ.1 .OR. LPEAK.EQ.JLAM) GO TO 345
LAMST(JLAM)=SQRT(LAMF(LPEAK-1,JLAML1,2)*LAMF(LPEAK,JLAML1,2))
GO TO 600
345 IF (LPEAK .EQ. 1) LAMST(JLAM)=SQRT(LAMNMX(1,2)*LAMF(1,JLAML1,2))
IF (LPEAK .EQ. JLAM) LAMST(JLAM)=SQRT(LAMF(JLAML1,JLAML1,2)*
1 LAMNMX(2,2))
GO TO 600
C-----------------------------------------------------------------------
C DO COARSE GRID SEARCH
C-----------------------------------------------------------------------
350 L=NGRID2(JLAM)-JLAM
DO 360 J=1,JLAM
L=L+1
360 LENDEQ(J)=L
IF (JLAM .EQ. MLAMMX) GO TO 368
DO 365 J=JLAMP1,MLAMMX
365 LENDEQ(J)=LENDEQ(JLAM)
368 JCENTR(1)=JGEADD-1+(NPERG2(JLAM)+1)/2
L=NGRID2(JLAM)
DO 370 J=2,L
370 JCENTR(J)=JCENTR(J-1)+NPERG2(JLAM)
SEARCH=.TRUE.
C-----------------------------------------------------------------------
C ENTRY POINT TO FIND STARTING LAMBDA VALUES FROM GRID
C-----------------------------------------------------------------------
400 LOC=0
DO 410 L1=1,LEND1
LST2=L1+1
DO 420 L2=LST2,LEND2
LST3=L2+1
IF (JLAM .LT. 3) LST3=LEND3
DO 430 L3=LST3,LEND3
LST4=L3+1
IF (JLAM .LT. 4) LST4=LEND4
DO 440 L4=LST4,LEND4
LST5=L4+1
IF (JLAM .LT. 5) LST5=LEND5
DO 450 L5=LST5,LEND5
LOC=LOC+1
IF (SEARCH) GO TO 498
IF (VGRID2(LOC) .GT. VGMAX) GO TO 496
MINDIF=1000
IF (JTRY .LE. 2) GO TO 493
L=JTRY-1
DO 491 J=2,L
I=0
DO 492 K=1,JLAM
492 I=I+IABS(LEQ(K)-LSTART(K,J))
MINDIF=MIN0(MINDIF,I)
491 CONTINUE
IF (MINDIF-MAXDIF) 496,493,494
493 IF (VGRID2(LOC) .GE. VGBEST) GO TO 496
494 VGBEST=VGRID2(LOC)
MAXDIF=MINDIF
DO 495 J=1,JLAM
495 LSTART(J,JTRY)=LEQ(J)
496 IF (LOC .LT. LVGRID) GO TO 450
DO 497 J=1,JLAM
L=LSTART(J,JTRY)
497 LAMST(J)=EXP(GESTL+FLOAT(JCENTR(L))*DGRIDE)
GO TO 600
498 DO 499 J=1,JLAM
L=LEQ(J)
499 PLAM(J)=EXP(GESTL+FLOAT(JCENTR(L))*DGRIDE)
CALL EVAR (0.,JLAM,DUM,T,SQRTW,NMAX,TSTART,DELTAT,NT,
1 NINT,.FALSE.,LDUM,E,Y,YLYFIT,JLAM+IBASE,1.E+20,0,NDIME,.TRUE.,
2 GSE,NDIMG,J)
450 CONTINUE
440 CONTINUE
430 CONTINUE
420 CONTINUE
410 CONTINUE
C-----------------------------------------------------------------------
C FIND LOWEST VARIANCE ON COARSE GRID
C-----------------------------------------------------------------------
500 VGMAX=1.E+20
DO 510 J=1,LVGRID
510 VGMAX=AMIN1(VGMAX,VGRID2(J))
IF (JTRY .GT. 2) VGMAX=10.*VGMAX
MAXDIF=-1
SEARCH=.FALSE.
VGBEST=1.E+20
GO TO 400
C-----------------------------------------------------------------------
C DO LEAST SQUARES FITS
C-----------------------------------------------------------------------
600 LDUM=JTRY.EQ.1
CALL LSTSQR (LAMST,JLAM,.TRUE.,N,Y,T,JLAM+IBASE,
1 EVAR,GSE,NDIMG,SQRTW,YLYFIT,E,NMAX,TSTART,DELTAT,NT,NINT,
2 2, LDUM ,NDIME,.TRUE.,PRPREL)
FAILED=FAILED .OR. VAR.GT.VARE
IF (VAR .GT. VARE) GO TO 300
VARE=VAR
DO 605 J=1,JLAM
605 LAMF(J,JLAM,1)=PLAM(J)
SAVEPK=VARTRY .GE. 1.E+20
IF (FAILED) GO TO 610
5600 FORMAT (/51H END OF FIT TO RAW DATA, START OF FIT TO TRANSFORMS)
IF (PRPREL) WRITE (IWRITE,5600)
CALL LSTSQR (PLAM,JLAM,.FALSE.,NF,Y,T,JLAM+IBASE,
1 VARF,GSE,NDIMG,SQRTW,YLYFIT,E,NMAX,TSTART,DELTAT,NT,NINT,
2 3,.FALSE.,NDIME,.TRUE.,PRPREL)
IF (FAILED .AND. VAR.GE.VARTRY) GO TO 300
SAVEPK=.TRUE.
VARTRY=VAR
DO 608 J=1,JLAM
608 LAMF(J,JLAM,2)=PLAM(J)
610 IF (.NOT.SAVEPK .AND. JLAM.NE.1) GO TO 300
IF (JLAM .EQ. NLAMMX) GO TO 670
C-----------------------------------------------------------------------
C FINDS MAX SUM OF ABSOLUTE ADJACENT AMPLITUDES FOR LATER DETERMINATION
C OF STARTING VALUE FOR LAMST(JLAMP1)
C-----------------------------------------------------------------------
DUM=ABS(PALPHA(1))+ABS(PALPHA(JLAMP1))
LLPEAK=1
IF (DUM .GT. ABS(PALPHA(JLAM))) GO TO 620
LLPEAK=JLAMP1
DUM=ABS(PALPHA(JLAM))
620 IF (JLAM .EQ. 1) GO TO 690
DO 630 J=2,JLAM
DDUM=ABS(PALPHA(J-1))+ABS(PALPHA(J))
IF (DDUM .LE. DUM) GO TO 630
DUM=DDUM
LLPEAK=J
630 CONTINUE
670 IF (.NOT.FAILED .OR. JLAM.EQ.1) GO TO 690
300 CONTINUE
JTRY=MTRY
690 LPEAK=LLPEAK
NFTRY(JLAM)=JTRY
FFAIL(JLAM,2)=FAILED
FFAIL(JLAM,1)=VARTRY .GE. 1.E+20
IF (.NOT.FFAIL(JLAM,1)) GO TO 200
DO 695 J=1,JLAM
695 LAMF(J,JLAM,2)=LAMF(J,JLAM,1)
200 CONTINUE
RETURN
END
C-----------------------------------------------------------------------
C SUBROUTINE YANLYZ. FOR CONSTRAINED STEPWISE LEAST SQUARES ANALYSIS
C OF RAW DATA USING LAMF (STARTING VALUES OBTAINED FROM FANLYZ).
C-----------------------------------------------------------------------
C CALLS SUBPROGRAMS - LSTSQR, FISHER, RESIDU
C WHICH IN TURN CALL - EVAR, ETHEOR, PIVOT, PIVOT1, PLPRES
C-----------------------------------------------------------------------
SUBROUTINE YANLYZ (T,Y,SQRTW,YLYFIT,E,NMAX,NDIME,
1 TSTART,DELTAT,NT,NINTMX,GSE,NDIMG)
EXTERNAL EVAR
LOGICAL NOBASE, PRFINL, PLOTRS, REPEAT, WTED, FAILED, YFAIL, DONE,
1 REGINT, FFAIL, LBLOKA, LBLOKB, LBLOKC
REAL LAMNMX, LAMST, LAMF
LONG NEXBES(2,5), AFFAIL(9,2), LABEL
COMMON /BLOK/ RBLOKA(2808), LAMST(5), LAMF(5,5,2), RBLOKB(2),
1 VAR, LAMNMX(2,2), PALPHA(6), PLAM(6), RBLOKC, SIGYY, ENPHI,
2 RBLOKD(36), SIGMAP(11), PCERR(11), RBLOKE(592), IBLOKA(112),
3 IBASE, IBLOKB(8), NLAMMX, IWT, LABEL(20), NINT, NF, N,
4 IWRITE, IBLOKC, LINEPG, IBLOKD(3), ITER, JLAMP1, NFTRY(5),
5 IBLOKE, REGINT, FAILED, LBLOKA, NOBASE, WTED, REPEAT, PLOTRS
COMMON /BLOK/ LBLOKB, FFAIL(5,2), LBLOKC(11), PRFINL
DIMENSION E(NDIME,6), YFAIL(5), ASAVE(6,5,6),
1 PROBSV(5), VARSV(5), SIGYSV(5), ITERSV(5),
2 ENPHSV(5), PROBLN(5), DONE(5)
DIMENSION T(NMAX), Y(NMAX), SQRTW(NMAX), GSE(NDIMG,4),
1 YLYFIT(NMAX), TSTART(NINTMX), DELTAT(NINTMX),
2 NT(NINTMX), PUNCOR(6)
C++++++++
NEXBES(1,1)=' ' ; NEXBES(2,1)=' '
NEXBES(1,2)='SECO'; NEXBES(2,2)='ND'
NEXBES(1,3)=' THI'; NEXBES(2,3)='RD'
NEXBES(1,4)='FOUR'; NEXBES(2,4)='TH'
NEXBES(1,5)=' FIF'; NEXBES(2,5)='TH'
AFFAIL(1,1)=' '; AFFAIL(2,1)=' '; AFFAIL(3,1)=' '
AFFAIL(4,1)=' '; AFFAIL(5,1)=' '; AFFAIL(6,1)=' '
AFFAIL(7,1)=' '; AFFAIL(8,1)=' '; AFFAIL(9,1)=' '
AFFAIL(1,2)='(NO'; AFFAIL(2,2)='EXAC'; AFFAIL(3,2)='T FI'
AFFAIL(4,2)='T TO'; AFFAIL(5,2)=' TRA'; AFFAIL(6,2)='NSFO'
AFFAIL(7,2)='RMS'; AFFAIL(8,2)='FOUN' ; AFFAIL(9,2)='D'
C++++++++
WTED=IWT .NE. 1
JLAMBS=1
VARBES=1.E+20
VARMIN=1.E+20
ABSYMX=0.
DO 180 J=1,N
180 ABSYMX=AMAX1(ABSYMX,ABS(Y(J)))
C-----------------------------------------------------------------------
C START OF MAIN LOOP FOR STEPWISE ANALYSIS
C-----------------------------------------------------------------------
DO 200 JLAM=1,NLAMMX
JLAMP1=JLAM+1
NF=2*JLAM+IBASE
IF (.NOT.PRFINL) GO TO 210
5200 FORMAT (1H1,5X,12A6/)
WRITE (IWRITE,5200) LABEL
5240 FORMAT (5X,23HFINAL ANALYSIS ASSUMING,I2,11H COMPONENTS)
WRITE (IWRITE,5240) JLAM
210 DO 220 J=1,JLAM
220 LAMST(J)=LAMF(J,JLAM,2)
CALL LSTSQR (LAMST,JLAM,.TRUE.,N,Y,T,JLAM+IBASE,EVAR,
1 GSE,NDIMG,SQRTW,YLYFIT,E,NMAX,TSTART,DELTAT,NT,NINT,
2 4,FFAIL(JLAM,2),NDIME,.FALSE.,PRFINL)
YFAIL(JLAM)=FAILED
IF (.NOT.FAILED) GO TO 225
IF (FFAIL(JLAM,1)) GO TO 250
5222 FORMAT (////43H SECOND ATTEMPT USING STARTING LAMBDAS FROM,
1 29H INITIAL ANALYSIS OF RAW DATA)
IF (PRFINL) WRITE (IWRITE,5222)
DO 222 J=1,JLAM
222 LAMST(J)=LAMF(J,JLAM,1)
CALL LSTSQR (LAMST,JLAM,.TRUE.,N,Y,T,JLAM+IBASE,EVAR,
1 GSE,NDIMG,SQRTW,YLYFIT,E,NMAX,TSTART,DELTAT,NT,NINT,
2 4,.FALSE.,NDIME,.FALSE.,PRFINL)
YFAIL(JLAM)=FAILED
IF (FAILED) GO TO 250
C-----------------------------------------------------------------------
C SAVE VALUES FOR LATER USE AND FOR FINAL OUTPUT
C-----------------------------------------------------------------------
225 SIGYSV(JLAM)=SIGYY
VARSV(JLAM)=VAR
ITERSV(JLAM)=ITER
ENPHSV(JLAM)=ENPHI
I=JLAM
DO 230 K=1,JLAM
ASAVE(K,JLAM,1)=PALPHA(K)
ASAVE(K,JLAM,2)=PLAM(K)
ASAVE(K,JLAM,3)=SIGMAP(K)
I=I+1
ASAVE(K,JLAM,4)=SIGMAP(I)
ASAVE(K,JLAM,5)=PCERR(K)
ASAVE(K,JLAM,6)=PCERR(I)
230 CONTINUE
IF (NOBASE) GO TO 240
ASAVE(JLAMP1,JLAM,2)=0.
ASAVE(JLAMP1,JLAM,3)=0.
ASAVE(JLAMP1,JLAM,5)=0.
ASAVE(JLAMP1,JLAM,1)=PALPHA(JLAMP1)
ASAVE(JLAMP1,JLAM,4)=SIGMAP(NF)
ASAVE(JLAMP1,JLAM,6)=PCERR(NF)
C-----------------------------------------------------------------------
C TEST IF THIS SOLUTION IS THE BEST SO FAR
C-----------------------------------------------------------------------
240 IF (VARBES .GE. 1.E+20) GO TO 248
IF (VAR .GE. VARMIN) GO TO 200
K=N-NF
DUM=VARBES/VAR-1.
L=2*(JLAM-JLAMBS)
IF (FISHER(FLOAT(K)*DUM/(FLOAT(L)*(1.+ENPHI*FLOAT((NF+2)*N)/
1 FLOAT(NF*K))),L,K) .LE. .5) GO TO 250
248 JLAMBS=JLAM
VARBES=VAR
250 VARMIN=AMIN1(VARMIN,VAR)
200 CONTINUE
C-----------------------------------------------------------------------
C END OF MAIN LOOP FOR STEPWISE ANALYSIS
C-----------------------------------------------------------------------
IF (VARBES .LT. 1.E+20) GO TO 300
5300 FORMAT (///50H ALL ANALYSES OF THE RAW DATA FAILED - CHECK INPUT,
1 22H DATA FOR GROSS ERRORS )
WRITE (IWRITE,5300)
RETURN
C-----------------------------------------------------------------------
C CALCULATE PROBSV AND PROBLN (PROBABILITY AND UNCORRECTED PROBABILITY
C (I.E., USING ENPHI=0.) THAT THE BEST SOLUTION IS ACTUALLY
C BETTER THAN THE OTHERS)
C-----------------------------------------------------------------------
300 PNXBES=1.E+20
JLAMNX=JLAMBS
DO 310 J=1,NLAMMX
PROBSV(J)=2.
IF (J.EQ.JLAMBS .OR. YFAIL(J)) GO TO 310
I=2*MAX0(JLAMBS,J)+IBASE
K=N-I
L=2*(JLAMBS-J)
DUM=VARSV(J)/VARBES
IF (L .LT. 0) GO TO 315
DDUM=FLOAT(K)*(DUM-1.)/FLOAT(L)
DDDUM=1.+ENPHSV(JLAMBS)*FLOAT((I+2)*N)/FLOAT(I*K)
PROBSV(J)=FISHER(DDUM/DDDUM,L,K)
PROBLN(J)=FISHER(DDUM,L,K)
GO TO 325
315 IF (DUM .LT. 1.) GO TO 320
PROBSV(J)=1.
PROBLN(J)=1.
GO TO 325
320 DDUM=FLOAT(K)*(1.-1./DUM)/FLOAT(L)
DDDUM=1.+ENPHSV(J)*FLOAT((I+2)*N)/FLOAT(I*K)
PROBLN(J)=1.-FISHER(DDUM,-L,K)
PROBSV(J)=1.-FISHER(DDUM/DDDUM,-L,K)
325 IF (PROBSV(J) .GE. PNXBES) GO TO 310
PNXBES=PROBSV(J)
PNXLIN=PROBLN(J)
JLAMNX=J
310 CONTINUE
PROBSV(JLAMBS)=0.
IF (PNXBES .LT. 1.E+20) GO TO 330
PNXBES=1.
PNXLIN=1.
C-----------------------------------------------------------------------
C FINAL SUMMARY OF RESULTS - SUMMARIZES UP TO BEST 5 SOLUTIONS.
C-----------------------------------------------------------------------
330 CALL RESIDU (JLAMBS,PLOTRS,T,Y,SQRTW,YLYFIT,NMAX,PUNCOR,ASAVE)
5330 FORMAT(35H1DISCRETE - VERSION 1A (MARCH 1976),/12A6/)
340 WRITE (IWRITE,5330) LABEL
DO 350 J=1,NLAMMX
350 DONE(J)=YFAIL(J)
L=17+JLAMBS+IBASE
5350 FORMAT (5X,A4,A3,13HBEST SOLUTION,I13,11H COMPONENTS)
WRITE (IWRITE,5350) (NEXBES(J,1),J=1,2),JLAMBS
IF (PNXBES .GT. .95) GO TO 360
5360 FORMAT (48H ++++++ NOTE - THE APPROX. PROBABILITY THAT THIS,
1 34H SOLUTION IS ACTUALLY BEST IS ONLY,F6.3,1H.,
2 /35HLOOK AT SECOND BEST SOLUTION ALSO. ,6(1H+))
WRITE (IWRITE,5360) PNXBES
L=L-1
360 DO 370 J=1,NLAMMX
IF (J .GT. 1) GO TO 375
DONE(JLAMBS)=.TRUE.
I=JLAMBS
GO TO 400
375 DUM=1.E+20
DO 380 K=1,NLAMMX
IF (PROBSV(K).GT.DUM .OR. DONE(K)) GO TO 380
DUM=PROBSV(K)
I=K
380 CONTINUE
IF (DUM.GE.1.E+20 .OR. J.GT.5) GO TO 500
DONE(I)=.TRUE.
CALL RESIDU (I,.FALSE.,T,Y,SQRTW,YLYFIT,NMAX,PUNCOR,ASAVE)
L=L+15+I+IBASE
IF (L-2 .LE. LINEPG) GO TO 385
L=14+I+IBASE
WRITE (IWRITE,5999)
5999 FORMAT (1H1)
GO TO 390
385 WRITE (IWRITE,5001)
WRITE (IWRITE,5001)
5001 FORMAT (1X)
390 IF (DUM .GT. .95) WRITE (IWRITE,5350) (NEXBES(K,J),K=1,2),I
IF (DUM .LE. .95) WRITE (IWRITE,5385) (NEXBES(K,J),K=1,2),I
5385 FORMAT (5X,A4,A3,13HBEST SOLUTION,I13,11H COMPONENTS,3X,
1 30H- A SIGNIFICANT POSSIBILITY ,25(1H+))
400 WRITE (IWRITE,5001)
WRITE (IWRITE,5400)
5400 FORMAT (1X,54(1H*))
WRITE (IWRITE,5402) NFTRY(I)
5402 FORMAT (2H *,4X,22HALPHA+-STD ERR PERCENT,3X,
1 27HLAMBDA+-STD ERR PERCENT* ,
2 38HSTART LAMBDA (FROM FIT TO TRANSFORMS -,
3 I4,7H TRIES))
5404 FORMAT (2H *,1PE9.3,2H+-,E7.1,0PF8.3,1PE9.3,2H+-,
1 E7.1,0PF8.3,1H*,1PE10.3,1X, 9A4)
JJ=1
IF (FFAIL(I,2)) JJ=2
WRITE (IWRITE,5404) (ASAVE(K,I,1),ASAVE(K,I,4),ASAVE(K,I,6),
1 ASAVE(K,I,2),ASAVE(K,I,3),ASAVE(K,I,5),LAMF(K,I,2),
2 (AFFAIL(KK,JJ),KK=1,9),K=1,I)
IF (NOBASE) GO TO 410
K=I+1
WRITE (IWRITE,5404) ASAVE(K,I,1),ASAVE(K,I,4),ASAVE(K,I,6),
1 ASAVE(K,I,2),ASAVE(K,I,3),ASAVE(K,I,5)
410 WRITE (IWRITE,5400)
IF (J.EQ.1 .AND. PNXBES.GT..95) WRITE (IWRITE,5410) JLAMNX,
1 JLAMBS, PNXBES
5410 FORMAT (43X,20(1H*)/34H APPROXIMATE PROBABILITY THAT THIS,
1 56H SOLUTION IS REALLY BETTER THAN THE SECOND BEST SOLUTION,
2 /9H = * PNG(,I1,1H/,I1,3H) =,F6.3,2H */43X,20(1H*))
5412 FORMAT (/5H PNG(,I1,1H/,I1,1H),12X,1H=,F21.3,13X,4HNPHI,13X,
1 1H=,1PE11.2,13X,25H(UNCORRECTED PNG WOULD BE,0PF8.3,1H))
IF (J .GT. 1) WRITE (IWRITE,5412) I,JLAMBS,PROBSV(I),ENPHSV(I),
1 PROBLN(I)
5414 FORMAT (22H ITERATIONS IN FIT =,I21,3X,
1 18HSTD. DEV. OF FIT =,1PE11.4,
2 /27HSIGNAL/NOISE RATIO OF FIT =,0PF7.0)
DDUM=ABSYMX/SIGYSV(I)
IF (WTED) WRITE (IWRITE,5414) ITERSV(I),SIGYSV(I)
IF (.NOT.WTED) WRITE (IWRITE,5414) ITERSV(I),SIGYSV(I),DDUM
5416 FORMAT (21H LAMBDA HELD BETEWEEN,1PE9.2,4H AND,E9.2,3X,
1 4HNPHI,3X,1H=,E11.2)
IF (J .EQ. 1) WRITE (IWRITE,5416) LAMNMX(1,1),LAMNMX(2,1),
1 ENPHSV(JLAMBS)
5418 FORMAT (/4H LAG,15X,5(2X,3HK =,I2),3X,16(1H*)/
1 20H PROB. RESIDU UNCORR,5F9.3,4X,
2 22HWEIGHTED AV = * PUNC =,F6.3,2H *)
WRITE (IWRITE,5418) (K,K=1,5),PUNCOR
5422 FORMAT (1X,71(1H=))
IF (L-1 .LE. LINEPG) WRITE (IWRITE,5422)
IF (L .LE. LINEPG) WRITE (IWRITE,5422)
370 CONTINUE
500 IF (.NOT.REPEAT) RETURN
REPEAT=.FALSE.
CALL RESIDU (JLAMBS,.FALSE.,T,Y,SQRTW,YLYFIT,NMAX,PUNCOR,ASAVE)
GO TO 340
END
C-----------------------------------------------------------------------
C SUBROUTINE LSTSQR. CONSTRAINED LEAST SQUARES FIT USING STEPWISE
C REGRESSION APPROACH.
C N = NO. OF DATA POINTS TO BE FIT, I.E., =N (RAWDAT=.TRUE.) OR
C =2*JLAM+IBASE (RAWDAT=.FALSE.).
C Y,T = RAW DATA, REGARDLESS OF RAWDAT.
C ITYPE=1,2,3,4 FOR PRELIMINARY DETERMINATION OF WEIGHTS, FIT TO RAW
C DATA WITH INTERPOLATION, FIT TO TRANSFORMS, AND FINAL FIT TO
C RAW DATA, RESPECTIVELY.
C-----------------------------------------------------------------------
C CALLS SUBPROGRAMS - VARDUM (A DUMMY NAME), PIVOT, ANLERR
C WHICH IN TURN CALL - PIVOT1, ETHEOR
C-----------------------------------------------------------------------
SUBROUTINE LSTSQR (LAMST,JLAM,RAWDAT,N,Y,T,NLIN,VARDUM,
1 GSE,NDIMG,SQRTW,YLYFIT,E,NMAX,TSTART,DELTAT,NT,NINT,
2 ITYPE,SPLIT,NDIME,INTER,PRLSQ)
EXTERNAL VARDUM
REAL LAMNMX, LAMST
LONG HOLRTH(2), LABEL
LOGICAL RAWDAT, NOBASE, PRLSQ, FAILED, ALLPIV(2), PIVLAM,
1 LDUM, INTER, PIVALP, LBLOKA, LBLOKB, LBLOKC, LBLOKD, SPLIT
COMMON /BLOK/ RBLOKA(2796), DELTA, VARMIN, FHATMX, RBLOKB(8),
1 CONVRG, RBLOKC(57), VAR, LAMNMX(2,2), PALPHA(6), PLAM(6),
2 PRECIS, RBLOKD(38), SIGMAP(11), PCERR(11), RBLOKE(252),
3 PLMTRY(6), DELTAP(10), DFCAPL(6,5), SFDE(5), ADUB(11,11),
4 DDSE(5,5), DTOLER(11), F(11,6), DF(11,6), IBLOKA(111), MDIMA,
5 IBLOKB(52), NF, IBLOKC, IWRITE, IBLOKD(5), ITER, JLAMP1
a iblokb 32->52
COMMON /BLOK/ IBLOKE(6), LBLOKA, FAILED, LBLOKB, NOBASE,
1 LBLOKC(18), PIVALP(11), LBLOKD
a lblokc 14->18
DIMENSION PIVLAM(5), R(6), DALPL(6,5)
DIMENSION LAMST(JLAM), Y(NMAX), T(NMAX),
1 SQRTW(NMAX), YLYFIT(NMAX),
2 E(NDIME,NLIN), TSTART(NINT), QT(3), VT(3), GSE(NDIMG,4),
3 DELTAT(NINT), NT(NINT), MXITER(4), RLAMMN(2)
C++++++++
qmin=.001
holrth(1)=' '; holrth(2)='*'
mconv=3; nabort=4
mxiter(1)=30; mxiter(2)=30; mxiter(3)=40; mxiter(4)=40
rlammn(1)=1.1; rlammn(2)=2
dflat=-1.e-2
c++++++++
ISPLIT=1
IF (SPLIT) ISPLIT=2
JLAMP1=JLAM+1
NCONV=0
NVARUP=0
NFLAT=0
ALLPIV(2)=.TRUE.
IF (NOBASE) PALPHA(JLAMP1)=0.
PLAM(JLAMP1)=0.
PLMTRY(JLAMP1)=0.
PIVALP(JLAMP1)=.TRUE.
C-----------------------------------------------------------------------
C PUT PLAM IN ASCENDING ORDER AND SEPARATE THEM IF NECESSARY
C-----------------------------------------------------------------------
DO 150 J=1,JLAM
PIVLAM(J)=.FALSE.
150 DELTAP(J)=0.
DO 160 J=1,JLAM
DUM=1.E+20
DO 165 K=1,JLAM
IF (PIVLAM(K) .OR. LAMST(K).GT.DUM) GO TO 165
L=K
DUM=LAMST(K)
165 CONTINUE
PIVLAM(L)=.TRUE.
IF (J .EQ. 1) PLAM(J)=AMAX1(DUM,LAMNMX(1,ISPLIT))
IF (J .GT. 1) PLAM(J)=AMIN1(AMAX1(DUM,RLAMMN(ISPLIT)*PLAM(J-1)),
1 LAMNMX(2,1))
160 CONTINUE
VAROLD=1.E+20
VARG=1.E+20
ITER=-1
Q=0.
IF (PRLSQ) WRITE (IWRITE,5205)
5205 FORMAT (/4H ITR,1X,8HVARIANCE,2X,6HDAMP Q,1X,8HBASELINE,
1 5(4X,5HALPHA,2X,6HLAMBDA))
C-----------------------------------------------------------------------
C START OF MAIN LOOP FOR THE LEAST SQUARES FIT
C-----------------------------------------------------------------------
210 NTRY=1
215 ITER=ITER+1
220 CALL VARDUM (Q,JLAM,VAR,T,SQRTW,NMAX,TSTART,DELTAT,NT,
1 NINT,.TRUE.,LDUM,E,Y,YLYFIT,NLIN,VARG,NTRY,NDIME,INTER,
2 GSE,NDIMG,IERROR)
IF (IERROR .EQ. 5) GO TO 800
ALLPIV(1)=LDUM
IF (VAR.LE.VARG .OR. NTRY.EQ.2) GO TO 240
NTRY=2
Q=QG
GO TO 220
240 DO 242 J=1,JLAM
R(J)=PALPHA(J)
IF (.NOT.RAWDAT) R(J)=PALPHA(J)*EXP(-PLMTRY(J)*DELTA)
242 PLAM(J)=PLMTRY(J)
DUM=VAR-VAROLD
IF (.NOT.PRLSQ) GO TO 250
DDUM=HOLRTH(1)
IF (DUM .GT. 0.) DDUM=HOLRTH(2)
DO 244 J=1,JLAM
PCERR(J)=HOLRTH(1)
IF (.NOT.PIVLAM(J)) PCERR(J)=HOLRTH(2)
244 CONTINUE
5240 FORMAT (1X,I2,1PE9.4,A1,E8.2,A1,E8.2,5(1P2E8.2,A1))
WRITE (IWRITE,5240) ITER,VAR,DDUM,Q,HOLRTH(NTRY),PALPHA(JLAMP1),
1 (R(J),PLAM(J),PCERR(J),J=1,JLAM)
C-----------------------------------------------------------------------
C TESTS FOR CONVERGENCE AND DIVERGENCE
C-----------------------------------------------------------------------
250 IF ((ABS(DUM).GT.AMAX1(VARMIN,VAROLD*CONVRG) .AND. RAWDAT) .OR.
1 (VAR.GT.FLOAT(NF)*(CONVRG*FHATMX)**2 .AND. .NOT.RAWDAT))
2 GO TO 270
NCONV=NCONV+1
IF (NCONV.GE.MCONV .OR. .NOT.RAWDAT) GO TO 800
NVARUP=0
GO TO 300
270 NCONV=0
IF (DUM .LE. 0.) GO TO 275
NVARUP=NVARUP+1
IF (NVARUP.LT.NABORT .OR. ITER.LT.JLAM) GO TO 280
IERROR=1
GO TO 800
275 NVARUP=0
280 IF (ITER.LT.MXITER(ITYPE)) GO TO 290
IERROR=2
GO TO 800
290 IF (DUM/VAROLD.LT.DFLAT .OR. RAWDAT) GO TO 295
NFLAT=NFLAT+1
IF (NFLAT .LT. NABORT) GO TO 300
IERROR=3
GO TO 800
295 NFLAT=0
C-----------------------------------------------------------------------
C FINISH COMPUTATION OF DFCAPL (PARTIAL OF FCAP W.R.T. LAMBDA)
C-----------------------------------------------------------------------
300 DO 310 K=1,JLAM
DO 320 J=1,NLIN
DFCAPL(J,K)=DFCAPL(J,K)*PALPHA(K)
320 CONTINUE
DFCAPL(K,K)=DFCAPL(K,K)+SFDE(K)
310 CONTINUE
C-----------------------------------------------------------------------
C CALCULATE DALPL (PARTIAL OF PALPHA W.R.T. LAMBDA) FROM MATRIX
C PRODUCT ADUB*DFCAPL
C-----------------------------------------------------------------------
DO 400 J=1,NLIN
DO 400 K=1,JLAM
400 DALPL(J,K)=0.
DO 410 K=1,JLAM
IF (.NOT.PIVALP(K)) GO TO 410
DO 420 J=1,NLIN
IF (.NOT.PIVALP(J)) GO TO 420
DUB=0.
DO 430 I=1,NLIN
IF (PIVALP(I)) DUB=DUB+ADUB(J,I)*DFCAPL(I,K)
430 CONTINUE
DALPL(J,K)=DUB
420 CONTINUE
410 CONTINUE
C-----------------------------------------------------------------------
C CALCULATE ADUB (NORMAL EQUATION MATRIX FOR NONLINEAR LEAST SQUARES)
C AND INVERT IT
C-----------------------------------------------------------------------
IF (.NOT.RAWDAT) GO TO 550
DO 510 K=1,JLAM
DO 520 J=1,K
DUM=0.
DO 530 L=1,NLIN
530 DUM=DUM-DALPL(L,J)*DFCAPL(L,K)
IF (ABS(PALPHA(K)) .GT. ABS(PALPHA(J))) GO TO 540
DUM=DUM+DALPL(J,K)*SFDE(J)
DUM=DUM+DALPL(K,J)*SFDE(K)
GO TO 545
540 DUM=DUM+DALPL(K,J)*SFDE(K)
DUM=DUM+DALPL(J,K)*SFDE(J)
545 DDUM=PALPHA(K)*PALPHA(J)*DDSE(J,K)
ADUB(J,K)=DUM+DDUM
520 CONTINUE
DTOLER(K)=DDUM
ADUB(K,JLAMP1)=PALPHA(K)*SFDE(K)
510 CONTINUE
GO TO 590
550 DO 560 J=1,JLAM
DTOLER(J)=0.
R(J)=0.
DO 565 K=J,JLAMP1
565 ADUB(J,K)=0.
560 CONTINUE
DO 570 NU=1,N
DO 575 K=1,JLAM
IF (.NOT.PIVALP(K)) GO TO 575
DUM=0.
DO 578 J=1,NLIN
578 DUM=DUM+F(NU,J)*DALPL(J,K)
DDUM=DF(NU,K)*PALPHA(K)
DTOLER(K)=DTOLER(K)+DDUM*DDUM
R(K)=DUM+DDUM
575 CONTINUE
DDUM=YLYFIT(NU)
DO 580 K=1,JLAM
IF (.NOT.PIVALP(K)) GO TO 580
DUM=R(K)
DO 585 J=1,K
585 ADUB(J,K)=ADUB(J,K)+R(J)*DUM
ADUB(K,JLAMP1)=ADUB(K,JLAMP1)+R(K)*DDUM
580 CONTINUE
570 CONTINUE
590 DO 595 J=1,JLAM
DTOLER(J)=PRECIS*AMAX1(DTOLER(J),ADUB(J,J))
595 R(J)=ADUB(J,JLAMP1)
ADUB(JLAMP1,JLAMP1)=0.
CALL PIVOT (ADUB,MDIMA,JLAM,.FALSE.,.FALSE.,.TRUE.,LAMNMX(1,1),
1 LAMNMX(2,1),PLAM,DTOLER,DELTAP,LDUM,QG,PIVLAM,JLAM,QMAX,IERROR)
IF (IERROR .EQ. 5) GO TO 800
ALLPIV(2)=LDUM
C-----------------------------------------------------------------------
C USE MODIFICATION-A OF G. E. P. BOX TO ESTIMATE BEST Q (FRACTIONAL
C STEP SIZE)
C-----------------------------------------------------------------------
VAROLD=VAR
DDUM=0.
DO 600 J=1,JLAM
600 DDUM=DDUM+DELTAP(J)*R(J)
IF (DDUM .GT. 0.) GO TO 610
5610 FORMAT (42H GAUSS VECTOR POINTING IN WRONG DIRECTION.,2X,
1 14(2H**))
IF (PRLSQ) WRITE (IWRITE,5610)
NTRY=2
Q=AMIN1(QMIN,QMAX)
GO TO 215
610 CALL VARDUM (QG,JLAM,VARG,T,SQRTW,NMAX,TSTART,DELTAT,NT,
1 NINT,.FALSE.,LDUM,E,Y,YLYFIT,NLIN,VAR,NTRY,NDIME,INTER,
2 GSE,NDIMG,IERROR)
IF (IERROR .EQ. 5) GO TO 800
ALLPIV(1)=LDUM
DUM=VARG-VAROLD+2.*DDUM*QG
IF (DUM .LE. 0.) DUM=.25*DDUM*QG*QG
Q=AMIN1(DDUM*QG*QG/DUM,4.,QMAX)
IF (VARG.LE.VAROLD .OR. (Q.GE..125*QG .AND. RAWDAT)) GO TO 210
C-----------------------------------------------------------------------
C PUT QUADRATIC PARABOLA THRU ACTUAL VARIANCE SURFACE WHEN A
C STRONG NONLINEARITY IS INDICATED BY A SMALL Q
C-----------------------------------------------------------------------
QT(1)=AMIN1(.125*QG,AMAX1(Q,.02))
IF (Q .GT. .125*QG) QT(1)=Q
CALL VARDUM (QT(1),JLAM,DUM,T,SQRTW,NMAX,TSTART,DELTAT,NT,
1 NINT,.FALSE.,LDUM,E,Y,YLYFIT,NLIN,VAR,NTRY,NDIME,INTER,
2 GSE,NDIMG,IERROR)
IF (IERROR .EQ. 5) GO TO 800
VT(1)=DUM
IF (VT(1) .GE. VAROLD) GO TO 615
QT(2)=4.*QT(1)
IF (QT(1) .LE. .125*QG) GO TO 617
QT(2)=0.
VT(2)=VAROLD
QT(3)=QG
VT(3)=VARG
GO TO 630
615 QT(2)=.5*QT(1)
QT(2)=AMIN1(QT(2),.05)
617 CALL VARDUM (QT(2),JLAM,DUM,T,SQRTW,NMAX,TSTART,DELTAT,NT,
1 NINT,.FALSE.,LDUM,E,Y,YLYFIT,NLIN,VAR,NTRY,NDIME,INTER,
2 GSE,NDIMG,IERROR)
IF (IERROR .EQ. 5) GO TO 800
VT(2)=DUM
IF (VT(1).GE.VAROLD .OR. VT(2).GE.VT(1)) GO TO 620
QT(3)=QG
VT(3)=VARG
GO TO 630
620 QT(3)=0.
VT(3)=VAROLD
630 VARG=AMIN1(VT(1),VT(2),VARG)
IF (VT(1) .LE. VARG) QG=QT(1)
IF (VT(2) .LE. VARG) QG=QT(2)
DUM=(VT(1)-VT(3))/(QT(1)-QT(3))
DDUM=(DUM-(VT(2)-VT(3))/(QT(2)-QT(3)))/(QT(1)-QT(2))
IF (DDUM .GT. 0.) GO TO 650
640 Q=AMIN1(Q,.125*QT(2),.01)
GO TO 210
650 DUM=.5*((QT(1)+QT(3))-DUM/DDUM)
IF (DUM .LE. 0.) GO TO 640
Q=AMIN1(DUM,8.,QMAX)
GO TO 210
C-----------------------------------------------------------------------
C CHECK FOR ABNORMAL EXIT AND CALL ANLERR
C-----------------------------------------------------------------------
800 FAILED=IERROR.NE.0 .OR. .NOT.ALLPIV(1)
IF (.NOT.RAWDAT) GO TO 890
FAILED=FAILED .OR. .NOT.ALLPIV(2)
IF (.NOT.FAILED .OR. ITYPE.EQ.4) CALL ANLERR (JLAM,T,SQRTW,NMAX,E,
1 NLIN,NDIME,TSTART,DELTAT,NT,NINT,N,ITYPE,INTER,PRLSQ)
890 IF (.NOT.(PRLSQ .AND. FAILED)) GO TO 950
5889 FORMAT (/47H VARIANCE DID NOT SIGNIFICANTLY DECREASE IN THE,
1 5H LAST,I2,7H TIMES.,5X,6(11H***TOO SLOW))
IF (IERROR .EQ. 3) WRITE (IWRITE,5889) NABORT
5890 FORMAT (/41H MAXIMUM ITERATIONS WITHOUT CONVERGENCE. ,
1 7(13H***ITERATIONS))
IF (IERROR .EQ. 2) WRITE (IWRITE,5890)
5892 FORMAT (/28H VARIANCE INCREASED THE LAST,I2,8H TIMES. ,
1 3X,7(13H***DIVERGENCE))
IF (IERROR .EQ. 1) WRITE (IWRITE,5892) NVARUP
5894 FORMAT (/42H NEARLY SINGULAR NORMAL EQUATIONS MATRIX. ,
1 6(15H****SINGULARITY))
IF (IERROR .EQ. 5) WRITE (IWRITE,5894)
C-----------------------------------------------------------------------
C PUT PLAM IN ASCENDING ORDER
C-----------------------------------------------------------------------
950 DO 960 J=1,JLAM
DUM=1.E+20
DO 985 K=J,JLAM
IF (PLAM(K) .GT. DUM) GO TO 985
L=K
DUM=PLAM(K)
985 CONTINUE
PLAM(L)=PLAM(J)
PLAM(J)=DUM
DUM=PALPHA(L)
PALPHA(L)=PALPHA(J)
PALPHA(J)=DUM
IF (.NOT.RAWDAT) GO TO 960
DUM=SIGMAP(L)
SIGMAP(L)=SIGMAP(J)
SIGMAP(J)=DUM
K=L+JLAM
JK=J+JLAM
DUM=SIGMAP(K)
SIGMAP(K)=SIGMAP(JK)
SIGMAP(JK)=DUM
PCERR(J)=100.*SIGMAP(J)/PLAM(J)
IF (ABS(PALPHA(J)) .GT. 0.) PCERR(JK)=100.*SIGMAP(JK)/ABS(PALPHA
1 (J))
960 CONTINUE
RETURN
END
C-----------------------------------------------------------------------
C SUBROUTINE EVAR. FOR FRACTIONAL STEP SIZE Q, EVALUATES PALPHA
C (LINEAR LEAST SQUARES PARAMETERS), VAR (WEIGHTED VARIANCE) AND
C ACCUMULATES IT IN VGRID2 (COARSE GRID SUM), AND, IF
C INVERT=.TRUE., EVALUATES ARRAYS SFDE, DFCAPL, AND FULL UPPER
C TRIANGLES OF DDSE AND SE FOR LATER USE IN NONLINEAR LEAST
C SQUARES.
C-----------------------------------------------------------------------
C CALLS SUBPROGRAMS - ETHEOR, PIVOT
C WHICH IN TURN CALL - PIVOT1
C-----------------------------------------------------------------------
SUBROUTINE EVAR (Q,JLAM,VAR,T,SQRTW,NMAX,TSTART,DELTAT,NT,NINT,
1 INVERT,ALLPIV,E,Y,YLYDUM,NLIN,VARG,NTRY,NDIME,INTER,GSE,NDIMG,
2 IERROR)
LOGICAL INVERT, ALLPIV, LDDUM, INTER, LBLOKA, LBLOKB, LBLOKC,
1 LBLOKD, NOTINV, NOBASE, WTED, REGINT, NONNEG, PIVALP
REAL LAMNMX
LONG LABEL
COMMON /BLOK/ RBLOKA(2799), SUMWTY, SUMWT, ZERO(6),
1 RBLOKB(56), DGRIDE, GESTL, RBLOKC, LAMNMX(2,2), PALPHA(6),
2 PLAM(6), PRECIS, RBLOKD(2), SE(6,6), RBLOKE(22), VGRID2(252),
3 PLMTRY(6), DELTAP(10), DFCAPL(6,5), SFDE(5), ADUB(11,11),
4 DDSE(5,5), DTOLER(11), RBLOKF(132), JGEADD, NBINOM(20,5),
5 IBLOKA(5), NPERG2(5), MDIMA, IBLOKB(4), NGRID2(5),IBLOKC(44), N
a iblokc 24->44
COMMON /BLOK/ IBLOKD(14), REGINT, LBLOKA(4), NOBASE, WTED,
1 LBLOKB(4), NONNEG, LBLOKC(10), PIVALP(11), LBLOKD
a lbloka 2->4, lblokb 2->4
DIMENSION ADUM(6), FACTOR(5), XEXP(5), JG2(5)
DIMENSION T(NMAX), SQRTW(NMAX), TSTART(NINT), DELTAT(NINT),
1 NT(NINT), E(NDIME,NLIN), Y(NMAX), YLYDUM(1), GSE(NDIMG,4)
DO 110 J=1,JLAM
110 PLMTRY(J)=PLAM(J)+Q*DELTAP(J)
NLINP=NLIN+1
DO 160 K=1,NLINP
160 ADUB(K,NLINP)=0.
IF (NOBASE) GO TO 170
PLMTRY(NLIN)=0.
ADUB(NLIN,NLIN)=SUMWT
ADUB(NLIN,NLINP)=SUMWTY
170 NOTINV=.NOT.INVERT
IF (REGINT) GO TO 300
C-----------------------------------------------------------------------
C ORDINARY COMPUTATION OF E (EXPONENTIALS), ADUB (NORMAL EQUATIONS
C MATRIX FOR LINEAR LEAST SQUARES) AND, IF INVERT=.TRUE., PART
C OF DFCAPL (PARTIAL OF FCAP W.R.T. LAMBDA) WHEN REGINT=.FALSE.
C-----------------------------------------------------------------------
DO 190 K=1,NLIN
DO 195 J=1,K
IF (J .GT. JLAM) GO TO 190
ADUB(J,K)=0.
DFCAPL(K,J)=0.
195 IF (K .LE. JLAM) DDSE(J,K)=0.
190 CONTINUE
DO 200 J=1,N
DUM=-T(J)
DO 210 K=1,JLAM
ADUM(K)=SQRTW(J)*EXP(PLMTRY(K)*DUM)
210 E(J,K)=ADUM(K)
IF (NOBASE) GO TO 215
ADUM(NLIN)=SQRTW(J)
E(J,NLIN)=ADUM(NLIN)
215 DO 220 K=1,NLIN
DDUM=ADUM(K)
LDDUM=K .LE. JLAM
DO 230 L=1,K
IF (L .GT. JLAM) GO TO 220
DDDUM=ADUM(L)*DDUM
ADUB(L,K)=ADUB(L,K)+DDDUM
IF (NOTINV) GO TO 230
DDDUM=DDDUM*DUM
DFCAPL(K,L)=DFCAPL(K,L)-DDDUM
IF (LDDUM) DDSE(L,K)=DDSE(L,K)+DDDUM*DUM
230 CONTINUE
ADUB(K,NLINP)=ADUB(K,NLINP)+DDUM*Y(J)
220 CONTINUE
200 CONTINUE
GO TO 500
C-----------------------------------------------------------------------
C EVALUATE ADUB AND, IF INVERT=.TRUE., PART OF DFCAPL AND DDSE
C (SECOND DERIVATIVES OF EXPONENTIAL SUMS W.R.T. LAMBDA)
C BY HERMITE AND LAGRANGE INTERPOLATION, IF REGINT=INTER=.TRUE.
C-----------------------------------------------------------------------
300 IF (.NOT.INTER) GO TO 400
DO 310 K=1,NLIN
LDDUM=K .LE. JLAM
DO 320 J=1,K
IF (J .GT. JLAM) GO TO 310
XLAM=PLMTRY(K)+PLMTRY(J)
DUM=(ALOG(XLAM)-GESTL)/DGRIDE
JZ=(DUM+.5)
HZ=DUM-FLOAT(JZ)
IF (ABS(HZ) .GT. 1.E-5) GO TO 330
ADUB(J,K)=GSE(JZ,1)
IF (NOTINV) GO TO 320
DFCAPL(K,J)=-GSE(JZ,2)/XLAM
IF (LDDUM) DDSE(J,K)=(GSE(JZ,3)-GSE(JZ,2))/(XLAM*XLAM)
GO TO 320
330 JM=(DUM)
JP=JM+1
H=DUM-FLOAT(JM)
HH=1.-H
DDUM=1.+3.*H
DDDUM=1.+3.*HH
DX=H*DGRIDE
DDX=-HH*DGRIDE
ADUB(J,K)=HH*HH*HH*((DDUM+6.*H*H)*GSE(JM,1)+DX*(DDUM*GSE(JM,2)+
1 .5*DX*GSE(JM,3)))+H*H*H*((DDDUM+6.*HH*HH)*GSE(JP,1)+
2 DDX*(DDDUM*GSE(JP,2)+.5*DDX*GSE(JP,3)))
IF (NOTINV) GO TO 320
HH=HZ*HZ
DX=(HH-1.)*HZ*.5
DUM=1./(HZ+1.)
DDUM=1./HZ
DDDUM=1./(HZ-1.)
H=DX*DX*(((3.*HZ+4.)*GSE(JZ-1,2)*DUM+DGRIDE*GSE(JZ-1,3))*DUM+
1 4.*DDUM*(DDUM*GSE(JZ,2)+DGRIDE*GSE(JZ,3))+DDDUM*((4.-3.*HZ)*
2 GSE(JZ+1,2)*DDDUM+DGRIDE*GSE(JZ+1,3)))
DFCAPL(K,J)=-H/XLAM
IF (.NOT.LDDUM) GO TO 320
DUM=DX*(HH-4.)*(HH-9.)*(GSE(JZ+3,3)/(HZ-3.)+GSE(JZ-3,3)/(HZ+3.)-
1 6.*(GSE(JZ+2,3)/(HZ-2.)+GSE(JZ-2,3)/(HZ+2.))+15.*
2 (GSE(JZ+1,3)*DDDUM+GSE(JZ-1,3)*DUM)-20.*GSE(JZ,3)*DDUM)/360.
DDSE(J,K)=(DUM-H)/(XLAM*XLAM)
320 CONTINUE
DUM=(ALOG(PLMTRY(K))-GESTL)/DGRIDE
JZ=(DUM+.5)
HZ=DUM-FLOAT(JZ)
IF (ABS(HZ) .GT. 1.E-5) GO TO 340
ADUB(K,NLINP)=GSE(JZ,4)
GO TO 310
340 HH=HZ*HZ
ADUB(K,NLINP)=HZ*(HH-1.)*(HH-4.)*(HH-9.)*(GSE(JZ+3,4)/(HZ-3.)+
1 GSE(JZ-3,4)/(HZ+3.)-6.*(GSE(JZ+2,4)/(HZ-2.)+GSE(JZ-2,4)/
2 (HZ+2.))+15.*(GSE(JZ+1,4)/(HZ-1.)+GSE(JZ-1,4)/(HZ+1.))
3 -20.*GSE(JZ,4)/HZ)/720.
310 CONTINUE
GO TO 500
C-----------------------------------------------------------------------
C EVALUATE ADUB, PART OF DFCAPL, AND DDSE BY CALLING ETHEOR
C IF REGINT=.TRUE. AND INTER=.FALSE.
C-----------------------------------------------------------------------
400 DO 410 K=1,NLIN
LDDUM=K .LE. JLAM
DO 420 J=1,K
IF (J .GT. JLAM) GO TO 410
XLAM=PLMTRY(K)+PLMTRY(J)
CALL ETHEOR (XLAM,INVERT,WTED,T,SQRTW,Y,NMAX,TSTART,DELTAT,
1 NT,NINT,DUM,DDUM,DDDUM,S,.TRUE.,.FALSE.)
ADUB(J,K)=DUM
IF (NOTINV) GO TO 420
DFCAPL(K,J)=-DDUM/XLAM
IF (LDDUM) DDSE(J,K)=(DDDUM-DDUM)/(XLAM*XLAM)
420 CONTINUE
CALL ETHEOR (PLMTRY(K),.FALSE.,WTED,T,SQRTW,Y,NMAX,TSTART,DELTAT,
1 NT,NINT,DUM,DDUM,DDDUM,S,.FALSE.,.TRUE.)
ADUB(K,NLINP)=S
410 CONTINUE
500 DO 510 K=1,NLIN
DTOLER(K)=10.*PRECIS*ADUB(K,K)
DO 515 J=1,K
515 SE(J,K)=ADUB(J,K)
510 CONTINUE
C-----------------------------------------------------------------------
C SOLVE NORMAL EQUATIONS FOR PALPHA USING STEPWISE REGRESSION
C-----------------------------------------------------------------------
CALL PIVOT (ADUB,MDIMA,NLIN,.FALSE.,INVERT,NONNEG,0.,
1 1.E+20,ZERO,DTOLER,PALPHA,ALLPIV,DUM,PIVALP,JLAM,S,IERROR)
IF (IERROR .NE. 5) GO TO 518
VAR=1.E+20
RETURN
C-----------------------------------------------------------------------
C CALCULATE VAR AND, IF INVERT=.TRUE., SFDE (SUMS OF RESIDUALS
C TIMES DERIVATIVES OF NONLINEAR TERMS)
C-----------------------------------------------------------------------
518 VAR=0.
IF (NOTINV) GO TO 528
DO 520 K=1,JLAM
SFDE(K)=0.
DO 525 J=1,K
525 DFCAPL(J,K)=DFCAPL(K,J)
520 CONTINUE
528 IF (.NOT.REGINT) GO TO 600
K=0
DO 530 J=1,NINT
DO 540 L=1,JLAM
FACTOR(L)=EXP(-PLMTRY(L)*DELTAT(J))
540 XEXP(L)=EXP(-PLMTRY(L)*TSTART(J))
KK=NT(J)
DO 550 LL=1,KK
K=K+1
DUM=SQRTW(K)
YLYFIT=Y(K)
IF (.NOT.NOBASE) YLYFIT=YLYFIT-PALPHA(NLIN)*DUM
DO 560 L=1,JLAM
ADUM(L)=XEXP(L)*DUM
YLYFIT=YLYFIT-ADUM(L)*PALPHA(L)
XEXP(L)=XEXP(L)*FACTOR(L)
560 CONTINUE
VAR=VAR+YLYFIT*YLYFIT
IF (NOTINV) GO TO 550
DDUM=T(K)
DO 570 L=1,JLAM
570 SFDE(L)=SFDE(L)-DDUM*YLYFIT*ADUM(L)
550 CONTINUE
530 CONTINUE
GO TO 700
600 DO 610 J=1,N
YLYFIT=Y(J)
DO 620 K=1,NLIN
620 YLYFIT=YLYFIT-PALPHA(K)*E(J,K)
VAR=VAR+YLYFIT*YLYFIT
IF (NOTINV) GO TO 610
DUM=T(J)
DO 630 K=1,JLAM
630 SFDE(K)=SFDE(K)-DUM*YLYFIT*E(J,K)
610 CONTINUE
700 IF (JLAM.EQ.1 .OR. .NOT.INTER) GO TO 800
C-----------------------------------------------------------------------
C ADD VAR INTO VGRID2 (COARSE GRID SUM)
C-----------------------------------------------------------------------
J2MAX=0
DO 710 L=1,JLAM
IF (PLMTRY(L).LT.LAMNMX(1,2) .OR. PLMTRY(L).GT.LAMNMX(2,2))
1 GO TO 800
JG2(L)=(((ALOG(PLMTRY(L))-GESTL)/DGRIDE+.5)-JGEADD)/
1 NPERG2(JLAM)+1
IF (JG2(L) .LT. J2MAX) GO TO 710
J2MAX=JG2(L)
LMAX=L
710 CONTINUE
JG2(LMAX)=0
LOC=1
DO 720 J=1,JLAM
J2NEXT=0
DO 730 L=1,JLAM
IF (JG2(L) .LT. J2NEXT) GO TO 730
J2NEXT=JG2(L)
LNEXT=L
730 CONTINUE
L=J2NEXT+1
IF (J2MAX-L) 800,750,740
740 LL=J2MAX-1
DO 745 K=L,LL
KK=NGRID2(JLAM)-K+1
745 LOC=LOC+NBINOM(KK,J)
750 J2MAX=J2NEXT
JG2(LNEXT)=0
720 CONTINUE
DUM=VAR
LOC=MIN0(LOC,252)
IF (.NOT.INVERT .OR. (VAR.GT.VARG .AND. NTRY.EQ.1)) DUM=DUM*1.E-6
VGRID2(LOC)=VGRID2(LOC)+DUM
800 RETURN
END
C-----------------------------------------------------------------------
C SUBROUTINE VARF. SAME AS EVAR, EXCEPT FOR TRANSFORMS INSTEAD OF
C EXPONENTIALS AND DOES NO ACCUMULATION IN A COARSE GRID.
C-----------------------------------------------------------------------
C CALLS SUBPROGRAMS - PIVOT
C WHICH IN TURN CALL - PIVOT1
C-----------------------------------------------------------------------
SUBROUTINE VARF (Q,JLAM,VAR,T,SQRTW,NMAX,TSTART,DELTAT,NT,NINT,
1 INVERT,ALLPIV,E,Y,YLYFIT,NLIN,VARG,NTRY,NDIME,INTDUM,GSE,NDIMG,
2 IERROR)
LOGICAL INVERT, ALLPIV, INTDUM, LBLOKA, LBLOKB, LBLOKC,
1 LBLOKD, NOBASE, NONNEG, PIVALP, NOTINV
LONG LABEL
COMMON /BLOK/ TRBASE(11), GF(11,126), DGFL(11,126), DGRIDF,
1 GFSTL, FHAT(11), RBLOKA(5), ZERO(6), RBLOKB(63),
2 PALPHA(6), PLAM(6), PRECIS, RBLOKC(312), PLMTRY(6),
3 DELTAP(10), DFCAPL(6,5), RBLOKD(5), ADUB(11,11), RBLOKE(25),
4 DTOLER(11), F(11,6), DF(11,6), IBLOKA(111), MDIMA, IBLOKB(52),
5 NF, IBLOKC(15), LBLOKA(6), NOBASE, LBLOKB(6), NONNEG, LBLOKC(10)
a iblokb 32->52
COMMON /BLOK/ PIVALP(11), LBLOKD
a lbloka 3->6, lblokb 3->6
DIMENSION T(1), SQRTW(1), TSTART(1), DELTAT(1), NT(1), E(1,1),
1 Y(1), YLYFIT(NMAX), ADUM(9), GSE(1,1)
NLINP=NLIN+1
NOTINV=.NOT.INVERT
IF (NOBASE) GO TO 190
PLMTRY(NLIN)=0.
DO 130 J=1,NF
130 F(J,NLIN)=TRBASE(J)
C-----------------------------------------------------------------------
C COMPUTE F (NONLINEAR TERMS) AND, IF INVERT=.TRUE., DF (THEIR
C DERIVATIVES W.R.T. LAMBDA) BY HERMITE AND LAGRANGE
C INTERPOLATION.
C-----------------------------------------------------------------------
190 DO 200 J=1,JLAM
PLMTRY(J)=PLAM(J)+Q*DELTAP(J)
RLAM=1./PLMTRY(J)
DUM=(ALOG(PLMTRY(J))-GFSTL)/DGRIDF
JZ=(DUM+.5)
HZ=DUM-FLOAT(JZ)
IF (ABS(HZ) .GT. 1.E-5) GO TO 220
DO 210 K=1,NF
F(K,J)=GF(K,JZ)
210 IF (INVERT) DF(K,J)=DGFL(K,JZ)*RLAM
GO TO 200
220 ADUM(7)=1./HZ
ADUM(1)=4.*ADUM(7)*ADUM(7)
ADUM(2)=4.*DGRIDF*ADUM(7)
ADUM(8)=1./(HZ+1.)
ADUM(3)=(3.*HZ+4.)*ADUM(8)*ADUM(8)
ADUM(4)=DGRIDF*ADUM(8)
ADUM(9)=1./(HZ-1.)
ADUM(5)=(4.-3.*HZ)*ADUM(9)*ADUM(9)
ADUM(6)=DGRIDF*ADUM(9)
HH=HZ*HZ
DDUM=(HH-1.)*HZ*.5
DDDUM=DDUM*DDUM
DO 230 K=1,NF
230 F(K,J)=DDDUM*(ADUM(1)*GF(K,JZ)+ADUM(2)*DGFL(K,JZ)+ADUM(3)*
1 GF(K,JZ-1)+ADUM(4)*DGFL(K,JZ-1)+ADUM(5)*GF(K,JZ+1)+ADUM(6)*
2 DGFL(K,JZ+1))
IF (NOTINV) GO TO 200
ADUM(1)=-20.*ADUM(7)
ADUM(2)=15.*ADUM(8)
ADUM(3)=15.*ADUM(9)
ADUM(4)=-6./(HZ+2.)
ADUM(5)=-6./(HZ-2.)
ADUM(6)=1./(HZ+3.)
ADUM(7)=1./(HZ-3.)
DDDUM=DDUM*(HH-4.)*(HH-9.)*RLAM/360.
DO 240 K=1,NF
240 DF(K,J)=DDDUM*(ADUM(1)*DGFL(K,JZ)+ADUM(2)*DGFL(K,JZ-1)+ADUM(3)*
1 DGFL(K,JZ+1)+ADUM(4)*DGFL(K,JZ-2)+ADUM(5)*DGFL(K,JZ+2)+
2 ADUM(6)*DGFL(K,JZ-3)+ADUM(7)*DGFL(K,JZ+3))
200 CONTINUE
C-----------------------------------------------------------------------
C COMPUTE AND INVERT ADUB (NORMAL EQUATIONS MATRIX FOR LINEAR
C LEAST SQUARES
C-----------------------------------------------------------------------
ADUB(NLINP,NLINP)=0.
DO 300 K=1,NLIN
DO 310 J=1,K
DUM=0.
DO 320 L=1,NF
320 DUM=DUM+F(L,J)*F(L,K)
ADUB(J,K)=DUM
310 CONTINUE
DTOLER(K)=10.*PRECIS*ADUB(K,K)
DUM=0.
DO 330 L=1,NF
330 DUM=DUM+F(L,K)*FHAT(L)
ADUB(K,NLINP)=DUM
300 CONTINUE
CALL PIVOT (ADUB,MDIMA,NLIN,.FALSE.,INVERT,NONNEG,0.,
1 1.E+20,ZERO,DTOLER,PALPHA,ALLPIV,DUM,PIVALP,JLAM,DDUM,IERROR)
IF (IERROR .EQ. 5) RETURN
C-----------------------------------------------------------------------
C CALCULATE VAR (WEIGHTED VARIANCE OF FIT) AND YLYFIT (WEIGHTED
C RESIDUALS), AND,IF INVERT=.TRUE., PART OF DFCAPL FOR
C LATER USE IN NONLINEAR LEAST SQUARES
C-----------------------------------------------------------------------
VAR=0.
DO 410 L=1,NF
DUM=FHAT(L)
DO 420 J=1,NLIN
420 DUM=DUM-PALPHA(J)*F(L,J)
YLYFIT(L)=DUM
VAR=VAR+DUM*DUM
410 CONTINUE
IF (NOTINV .OR. (VAR.GT.VARG .AND. NTRY.EQ.1)) RETURN
DO 450 K=1,JLAM
DO 470 J=1,NLIN
DUM=0.
DO 480 L=1,NF
480 DUM=DUM-F(L,J)*DF(L,K)
DFCAPL(J,K)=DUM
470 CONTINUE
450 CONTINUE
RETURN
END
C-----------------------------------------------------------------------
C++++++++++++
FUNCTION EXPSMA(S)
EXPSMA=S*(720-S*(360-S*(120-S*(30-S*(6-S)))))/720
RETURN
END
C+++++++++++
C SUBROUTINE ETHEOR. IF DOE=.TRUE., PUTS EXPONENTIAL SUM AND, IF
C INVERT=.TRUE., ITS FIRST AND SECOND DERIVATIVES W.R.T.
C ALOG(LAMBDA) IN SE, DSE, DDSE. IF DOYE=.TRUE., PUTS SUM OF Y
C TIMES EXPONENTIALS IN SYE. DONE IN SINGLE PRECISION.
C CAN ONLY BE USED WHEN REGINT=.TRUE..
C IF WTED=.TRUE., USES RECURSION RELATIONS, AND IF WTED=.FALSE. USES
C GEOMETRIC SUM FORMULAS FOR SE, DSE, AND DDSE.
C NO COMMON BLOCKS NEEDED.
C-----------------------------------------------------------------------
C CALLS NO SUBPROGRAMS.
C-----------------------------------------------------------------------
SUBROUTINE ETHEOR (PLAMBD,INVERT,WTED,T,SQRTW,Y,NMAX,TSTART,
1 DELTAT,NT,NINT,SE,DSE,DDSE,SYE,DOE,DOYE)
REAL AN, B, C, DDDUM, DDSEI, DDUM,
1 DEDNL, DL, DNL, DSEI, DUM, EDL, ELTS, ENTS, RDEDL, SEI, S,
2 SS, SYEI, DDT, DTS, DPLAM
LOGICAL INVERT, NOTINV, WTED, DOE, DOYE, LDDUM
DIMENSION SQRTW(NMAX), TSTART(NINT), DELTAT(NINT), NT(NINT),
1 T(NMAX), Y(NMAX)
A EXPSMA(S)=S*(720.D0-S*(360.D0-S*(120.D0-S*(30.D0-S*(6.D0-S)))))/
A 1 720.D0
DPLAM=(PLAMBD)
IF (DOE) SEI=0.D0
IF (INVERT) DSEI=0.D0
IF (INVERT) DDSEI=0.D0
NOTINV=.NOT.INVERT
IF (.NOT.(DOYE .OR. WTED)) GO TO 200
IF (DOYE) SYEI=0.D0
LDDUM=.NOT.(DOE .AND. WTED)
J=0
DO 110 L=1,NINT
DDUM=EXP(-DPLAM*(DELTAT(L)))
DDDUM=EXP(-DPLAM*(TSTART(L)))
KK=NT(L)
DO 120 K=1,KK
J=J+1
DUM=DDDUM*SQRTW(J)
DDDUM=DDDUM*DDUM
IF (DOYE) SYEI=SYEI+DUM*Y(J)
IF (LDDUM) GO TO 120
DUM=DUM*SQRTW(J)
SEI=SEI+DUM
IF (NOTINV) GO TO 120
DUM=DUM*T(J)
DSEI=DSEI-DUM
DDSEI=DDSEI+DUM*T(J)
120 CONTINUE
110 CONTINUE
IF (DOYE) SYE=(SYEI)
IF (.NOT.DOE) RETURN
IF (WTED) GO TO 300
C-----------------------------------------------------------------------
C USE GEOMETRIC SUM FORMULAS WHEN WTED=.FALSE.
C-----------------------------------------------------------------------
200 DO 210 L=1,NINT
DDT=(DELTAT(L))
DTS=(TSTART(L))
DL=DPLAM*DDT
AN=(FLOAT(NT(L)))
DNL=AN*DL
IF (ABS(DL) .LE. 1.D-3) GO TO 214
RDEDL=1.D0/(1.D0-EXP(-DL))
DEDNL=1.D0-EXP(-DNL)
GO TO 218
214 RDEDL=1.D0/EXPSMA(DL)
IF (ABS(DNL) .LE. 1.D-3) DEDNL=EXPSMA(DNL)
IF (ABS(DNL) .GT. 1.D-3) DEDNL=1.D0-EXP(-DNL)
218 ELTS=EXP(-DPLAM*DTS)
S=ELTS*DEDNL*RDEDL
SEI=SEI+S
IF (NOTINV) GO TO 210
B=DDT*RDEDL
EDL=EXP(-DL)
ENTS=ELTS*EXP(-DNL)
C=AN*ENTS-S*EDL
SS=B*C-DTS*S
DSEI=DSEI+SS
DDSEI=DDSEI-DTS*SS-B*(EDL*(B*C+SS-S*DDT)+AN*(AN*DDT+DTS)*ENTS)
210 CONTINUE
300 SE=(SEI)
IF (NOTINV) RETURN
DUM=DPLAM*DSEI
DSE=(DUM)
DDSE=(DUM+DDSEI*DPLAM*DPLAM)
RETURN
END
C-----------------------------------------------------------------------
C SUBROUTINE PIVOT. DOES GAUSS-JORDAN PIVOTS ON ALL NP DIAGONAL
C ELEMENTS OF AUGMENTED MATRIX ADUB EXCEPT THOSE THAT HAVE A
C TOLERANCE LESS THAN DTOLER OR THAT CAUSE A VIOLATION OF THE
C CONSTRAINT PMIN .LE. P .LE. PMAX.
C ONLY NEEDS FULL UPPER TRIANGLE OF MATRIX ON INPUT, AND OVERWRITES IT
C WITH INVERSE AND SOLUTION.
C NEEDS NO COMMON BLOCKS.
C-----------------------------------------------------------------------
C CALLS SUBPROGRAMS - PIVOT1
C-----------------------------------------------------------------------
SUBROUTINE PIVOT (ADUB,MDIMA,NP,ONLYIN,INVERT,CONSTR,PMIN,
1 PMAX,P,DTOLER,DELTAP,ALLPIV,QG,PIV,JLAM,QMAX,IERROR)
LOGICAL ONLYIN, ALLPIV, CONSTR, INVERT, PIV(NP)
DIMENSION DELTAP(NP), P(NP), ADUB(MDIMA,MDIMA), DTOLER(NP)
IERROR=0
QG=1.
QMAX=999.
NPP=NP+1
IF (ONLYIN) NPP=NP
DO 110 J=1,NP
110 PIV(J)=.FALSE.
IF (NPP .EQ. 1) GO TO 190
DO 120 J=2,NPP
L=J-1
DO 120 K=1,L
ADUB(J,K)=ADUB(K,J)
120 CONTINUE
C-----------------------------------------------------------------------
C MAIN LOOP FOR COMPLETE PIVOTING
C-----------------------------------------------------------------------
190 DO 200 NPIV=1,NP
C-----------------------------------------------------------------------
C FIND NEXT PIVOT ELEMENT
C-----------------------------------------------------------------------
DUM=0.
DO 210 J=1,NP
IF (PIV(J) .OR. ADUB(J,J).LE.DTOLER(J)) GO TO 210
DDUM=ADUB(J,NPP)*ADUB(J,NPP)/ADUB(J,J)
IF (DDUM .LE. DUM) GO TO 210
DUM=DDUM
L=J
210 CONTINUE
IF (DUM .LE. 0.) GO TO 300
PIV(L)=.TRUE.
CALL PIVOT1 (ADUB,MDIMA,NPP,L)
200 CONTINUE
NPIV=NP+1
300 NPIV=NPIV-1
IF (ONLYIN .OR. .NOT.CONSTR) GO TO 400
C-----------------------------------------------------------------------
C ENFORCE CONSTRAINTS BY MAKING QG.LT.1. OR BY UNPIVOTING
C-----------------------------------------------------------------------
DO 330 J=1,JLAM
DUM=1.E+20
DO 340 K=1,JLAM
IF (.NOT.PIV(K)) GO TO 340
RDELTA=1./ADUB(K,NPP)
DDUM=AMAX1((PMIN-P(K))*RDELTA,(PMAX-P(K))*RDELTA)
IF (DDUM .GE. DUM) GO TO 340
DUM=DDUM
L=K
340 CONTINUE
IF (DUM .GT. 1.E-5) GO TO 350
NPIV=NPIV-1
PIV(L)=.FALSE.
CALL PIVOT1 (ADUB,MDIMA,NPP,L)
330 CONTINUE
C-----------------------------------------------------------------------
C IF ALL ELEMENTS ARE SOMEHOW UNPIVOTED, TAKE ERROR EXIT
C-----------------------------------------------------------------------
350 IF (NPIV .GT. 0) GO TO 390
IERROR=5
RETURN
390 QG=AMIN1(DUM,1.)
QMAX=DUM
400 ALLPIV=NPIV .EQ. NP
IF (ONLYIN) RETURN
DO 430 J=1,NP
DELTAP(J)=0.
430 IF (PIV(J)) DELTAP(J)=ADUB(J,NPP)
RETURN
END
C-----------------------------------------------------------------------
C SUBROUTINE PIVOT1. DOES A GAUSS-JORDAN PIVOT ON DIAGONAL ELEMENT LPIV
C NEEDS NO COMMON BLOCKS.
C-----------------------------------------------------------------------
C CALLS NO SUBPROGRAMS
C-----------------------------------------------------------------------
SUBROUTINE PIVOT1 (ADUB,MDIMA,NPP,LPIV)
DIMENSION ADUB(MDIMA,MDIMA)
DUB=1./ADUB(LPIV,LPIV)
DO 110 J=1,NPP
IF (J .EQ. LPIV) GO TO 110
DDUB=ADUB(J,LPIV)*DUB
DO 120 K=1,NPP
120 IF (K .NE. LPIV) ADUB(J,K)=ADUB(J,K)-ADUB(LPIV,K)*DDUB
110 CONTINUE
DO 130 J=1,NPP
ADUB(J,LPIV)=-ADUB(J,LPIV)*DUB
130 ADUB(LPIV,J)=ADUB(LPIV,J)*DUB
ADUB(LPIV,LPIV)=DUB
RETURN
END
C-----------------------------------------------------------------------
C SUBROUTINE ANLERR. DOES FINAL ERROR ANALYSIS OF FIT AND CALCULATES
C NONLINEARITY TERM ENPHI OF BEALE FOR LATER USE.
C-----------------------------------------------------------------------
C CALLS SUBPROGRAMS - PIVOT
C WHICH IN TURN CALL - PIVOT1
C-----------------------------------------------------------------------
SUBROUTINE ANLERR (JLAM,T,SQRTW,NMAX,E,NLIN,NDIME,TSTART,DELTAT,
1 NT,NINT,N,ITYPE,INTER,PRLSQ)
LOGICAL LDUM, NOBASE, PIVALP, FAILED, PRLSQ, REGINT,
1 LBLOKA, LBLOKB, LBLOKC, INTER
LONG HOLRTH, ALPLAM(5,2), LABEL
COMMON /BLOK/ RBLOKA(2800), SUMWT, RBLOKB(64), VAR, RBLOKC(4),
1 PALPHA(6), PLAM(6), PRECIS, SIGYY, ENPHI, SE(6,6), SIGMAP(11),
2 PCERR(11), RBLOKD(268), DFCAPL(6,5), RBLOKE(5), ADUB(11,11),
3 DDSE(5,5), DTOLER(11), RBLOKF(132), IBLOKA(111), MDIMA, IBLOKB,
4 IWTSGN, IBLOKC(50), NF, IBLOKD, IWRITE, IBLOKE(6), JLAMP1,
5 IBLOKF(6), REGINT, FAILED, LBLOKA, NOBASE, LBLOKB(18), PIVALP(11)
a iblokc 30->50
a lblokb 14->18
COMMON /BLOK/ LBLOKC
DIMENSION CUI(11), CSTAR(11), DELT(10,10),
1 CCSUM(11,10), ADUM(6)
DIMENSION SUM(4), T(NMAX), E(NDIME,NLIN), SQRTW(NMAX),
1 TSTART(NINT), DELTAT(NINT), NT(NINT)
c+++++++++
holrth='base'
alplam(1,1)='lam1'; alplam(2,1)='lam2'; alplam(3,1)='lam3'
alplam(4,1)='lam4'; alplam(5,1)='lam5'
alplam(1,2)='alp1'; alplam(2,2)='alp2'; alplam(3,2)='alp3'
alplam(4,2)='alp4'; alplam(5,2)='alp5'
c++++++++
C-----------------------------------------------------------------------
C COMPUTE CORRELATION COEFFICIENTS AND STANDARD ERROR ESTIMATES
C USING FULL NORMAL EQUATIONS MATRIX (ADUB) WITH ALL PARAMETERS
C ASSUMED INDEPENDENT
C-----------------------------------------------------------------------
DO 110 K=1,JLAM
KK=K+JLAM
DO 120 J=1,K
JJ=J+JLAM
ADUB(J,K)=PALPHA(J)*PALPHA(K)*DDSE(J,K)
ADUB(J,KK)=-DFCAPL(K,J)*PALPHA(J)
ADUB(K,JJ)=-DFCAPL(J,K)*PALPHA(K)
ADUB(JJ,KK)=SE(J,K)
120 CONTINUE
DTOLER(K)=ADUB(K,K)*PRECIS
DTOLER(KK)=ADUB(KK,KK)*PRECIS
IF (NOBASE) GO TO 110
ADUB(K,NF)=-DFCAPL(NLIN,K)*PALPHA(K)
ADUB(KK,NF)=SE(K,NLIN)
110 CONTINUE
IF (NOBASE) GO TO 150
ADUB(NF,NF)=SUMWT
DTOLER(NF)=SUMWT*PRECIS
150 CALL PIVOT (ADUB,MDIMA,NF,.TRUE.,.TRUE.,.FALSE.,0.,
1 0.,CUI,DTOLER,CSTAR,LDUM,DUM,PIVALP,JLAM,DDUM,J)
SIGYY=SQRT(VAR/FLOAT(N-NF))
IF (.NOT.LDUM .OR. J.EQ.5) GO TO 172
DO 170 J=1,NF
IF (ADUB(J,J) .LE. 0.) GO TO 172
CSTAR(J)=1./SQRT(ADUB(J,J))
SIGMAP(J)=SIGYY/CSTAR(J)
170 CONTINUE
GO TO 174
172 FAILED=.TRUE.
5172 FORMAT (//51H0SINGULARITY IN INVERTING FULL LEAST SQUARES MATRIX,
1 30H - NO CORRELATIONS CALCULATED.,3X,24(2H**))
IF (PRLSQ) WRITE (IWRITE,5172)
RETURN
174 IF (INTER) RETURN
K=JLAM
DO 176 J=1,JLAM
PCERR(J)=100.*SIGMAP(J)/PLAM(J)
CUI(J)=ALPLAM(J,1)
K=K+1
PCERR(K)=100.*SIGMAP(K)/ABS(PALPHA(J))
CUI(K)=ALPLAM(J,2)
176 CONTINUE
IF (NOBASE) GO TO 178
CUI(NF)=HOLRTH
PCERR(NF)=100.*SIGMAP(NF)/ABS(PALPHA(JLAMP1))
5176 FORMAT (//5X,24HCORRELATION COEFFICIENTS/7X,10(3X,A4))
178 IF (.NOT.PRLSQ) GO TO 190
K=NF-1
WRITE (IWRITE,5176) (CUI(J),J=1,K)
DO 179 J=2,NF
DUM=CSTAR(J)
JK=J-1
DO 180 K=1,JK
180 DTOLER(K)=ADUB(J,K)*DUM*CSTAR(K)
5180 FORMAT (1X,A4,2X,10F7.3)
WRITE (IWRITE,5180) CUI(J),(DTOLER(K),K=1,JK)
179 CONTINUE
C-----------------------------------------------------------------------
C TO PREVENT A VERY SMALL COMPONENT (EFFECTIVELY A SECOND BASELINE)
C THAT IS HIGHLY CORRELATED WITH THE BASELINE FROM INTERFERING
C WITH THE CALCULATION OF THE WEIGHTS
C-----------------------------------------------------------------------
190 IF (IWTSGN.GT.0 .OR. ITYPE.NE.1) GO TO 200
DUM=1.E+20
DO 195 J=1,JLAM
IF (PLAM(J) .GT. DUM) GO TO 195
DUM=PLAM(J)
L=J
195 CONTINUE
IF (PCERR(L) .LT. 1000.) GO TO 200
FAILED=.TRUE.
5195 FORMAT (//47H SMALLEST LAMBDA HAS TOO HIGH A STANDARD ERROR.,
1 60H THIS COULD LEAD TO INACCURATE WEIGHTS - SOLUTION REJECTED.,
2 3X,11(2H**))
IF (PRLSQ) WRITE (IWRITE,5195)
200 IF (FAILED .OR. ITYPE.NE.4) GO TO 282
C-----------------------------------------------------------------------
C CALCULATION OF ENPHI (EQ. 3.25 OF E. M. L. BEALE FOR F RATIO
C CORRECTION FACTOR DUE TO NONLINEARITY)
C-----------------------------------------------------------------------
NUJ=JLAM
DO 210 J=1,JLAM
DUM=ADUB(J,J)
NUJ=NUJ+1
NUK=JLAM
DO 220 K=1,JLAM
NUK=NUK+1
DELT(J,K)=DUM*ADUB(K,K)+2.*ADUB(J,K)*ADUB(J,K)
DELT(J,NUK)=DUM*ADUB(K,NUK)+2.*ADUB(J,K)*ADUB(J,NUK)
DELT(NUJ,K)=ADUB(J,NUJ)*ADUB(K,K)+2.*ADUB(J,K)*ADUB(NUJ,K)
DELT(NUJ,NUK)=ADUB(J,NUJ)*ADUB(K,NUK)+ADUB(J,K)*ADUB(NUJ,NUK)
1 +ADUB(J,NUK)*ADUB(NUJ,K)
DO 230 L=1,4
230 SUM(L)=0.
NU=0
DO 240 L=1,NINT
CUI(1)=EXP(-PLAM(J)*DELTAT(L))
CUI(2)=EXP(-PLAM(K)*DELTAT(L))
CUI(3)=EXP(-PLAM(J)*TSTART(L))
CUI(4)=EXP(-PLAM(K)*TSTART(L))
II=NT(L)
DO 242 I=1,II
NU=NU+1
TNU=T(NU)
IF (REGINT) GO TO 244
SS=E(NU,J)
DDDUM=TNU*E(NU,K)
GO TO 246
244 SS=SQRTW(NU)*CUI(3)
DDDUM=TNU*SQRTW(NU)*CUI(4)
CUI(3)=CUI(3)*CUI(1)
CUI(4)=CUI(4)*CUI(2)
246 S=PALPHA(J)*TNU*SS
DDUM=PALPHA(K)*TNU*DDDUM
SUM(1)=SUM(1)-S*DDUM
SUM(2)=SUM(2)+S*DDDUM
SUM(3)=SUM(3)+SS*DDUM
SUM(4)=SUM(4)-SS*DDDUM
242 CONTINUE
240 CONTINUE
CCSUM(J,K)=SUM(1)
CCSUM(J,NUK)=SUM(2)
CCSUM(NUJ,K)=SUM(3)
CCSUM(NUJ,NUK)=SUM(4)
220 CONTINUE
IF (NOBASE) GO TO 210
S=0.
SS=0.
NU=0
DO 250 L=1,NINT
DUM=EXP(-PLAM(J)*DELTAT(L))
DDUM=EXP(-PLAM(J)*TSTART(L))
II=NT(L)
DO 252 I=1,II
NU=NU+1
IF (REGINT) GO TO 254
SSS=E(NU,J)
GO TO 256
254 SSS=DDUM*SQRTW(NU)
DDUM=DDUM*DUM
256 DDDUM=T(NU)*SSS*SQRTW(NU)
SS=SS-DDDUM
S=S+PALPHA(J)*T(NU)*DDDUM
252 CONTINUE
250 CONTINUE
CCSUM(NF,J)=S
CCSUM(NF,NUJ)=SS
210 CONTINUE
LDUM=.NOT.NOBASE
ENPHI=0.
DO 260 NU=1,N
TNU=T(NU)
DO 261 J=1,NLIN
261 ADUM(J)=SQRTW(NU)*EXP(-PLAM(J)*TNU)
NUJ=JLAM
DO 262 J=1,JLAM
NUJ=NUJ+1
SUM(1)=0.
SUM(2)=0.
NUK=JLAM
DO 264 K=1,JLAM
S=0.
IF (LDUM) S=SQRTW(NU)*ADUB(K,NF)
NUI=JLAM
DO 266 I=1,JLAM
NUI=NUI+1
CUI(NUI)=ADUM(I)
CUI(I)=-PALPHA(I)*TNU*CUI(NUI)
S=S+ADUB(K,I)*CUI(I)+ADUB(K,NUI)*CUI(NUI)
266 CONTINUE
SUM(1)=SUM(1)+CCSUM(K,J)*S
SUM(2)=SUM(2)+CCSUM(K,NUJ)*S
NUK=NUK+1
S=0.
IF (LDUM) S=SQRTW(NU)*ADUB(NUK,NF)
NUI=JLAM
DO 268 I=1,JLAM
NUI=NUI+1
S=S+ADUB(NUK,I)*CUI(I)+ADUB(NUK,NUI)*CUI(NUI)
268 CONTINUE
SUM(1)=SUM(1)+CCSUM(NUK,J)*S
SUM(2)=SUM(2)+CCSUM(NUK,NUJ)*S
264 CONTINUE
IF (NOBASE) GO TO 272
S=0.
IF (LDUM) S=SQRTW(NU)*ADUB(NF,NF)
NUI=JLAM
DO 270 I=1,JLAM
NUI=NUI+1
S=S+ADUB(NF,I)*CUI(I)+ADUB(NF,NUI)*CUI(NUI)
270 CONTINUE
SUM(1)=SUM(1)+CCSUM(NF,J)*S
SUM(2)=SUM(2)+CCSUM(NF,NUJ)*S
272 DUM=TNU*ADUM(J)
CSTAR(J)=PALPHA(J)*TNU*DUM-SUM(1)
CSTAR(NUJ)=-2.*(DUM+SUM(2))
262 CONTINUE
SUM(1)=0.
NUJ=JLAM
DO 280 J=1,JLAM
NUJ=NUJ+1
S=0.
SS=0.
NUK=JLAM
DO 281 K=1,JLAM
NUK=NUK+1
S=S+CSTAR(K)*DELT(J,K)+CSTAR(NUK)*DELT(J,NUK)
SS=SS+CSTAR(K)*DELT(NUJ,K)+CSTAR(NUK)*DELT(NUJ,NUK)
281 CONTINUE
SUM(1)=SUM(1)+CSTAR(J)*S+CSTAR(NUJ)*SS
280 CONTINUE
ENPHI=ENPHI+SUM(1)
260 CONTINUE
ENPHI=ENPHI*SIGYY**2/FLOAT(NF+2)
5282 FORMAT (36H STANDARD DEVIATION OF FIT = SIGYY =,1PE12.5//
1 6X,27HLAMBDA+-STD. ERROR PERCENT,7X,
2 26HALPHA+-STD. ERROR PERCENT)
5002 FORMAT (/1X)
282 IF (.NOT.PRLSQ) RETURN
WRITE (IWRITE,5002)
IF (.NOT. (FAILED .OR. ITYPE.NE.4)) WRITE (IWRITE,5283) ENPHI
5283 FORMAT ( 7H NPHI =,1PE10.3)
WRITE (IWRITE,5282) SIGYY
K=JLAM
DO 284 J=1,JLAM
K=K+1
5284 FORMAT (2(1PE14.4,2H+-,E10.3,0PF9.3))
WRITE (IWRITE,5284) PLAM(J),SIGMAP(J),PCERR(J),PALPHA(J),
1 SIGMAP(K),PCERR(K)
284 CONTINUE
5286 FORMAT (4X,8HBASELINE,19X,1PE14.4,2H+-,E10.3,0PF9.3)
IF (.NOT.NOBASE) WRITE(IWRITE,5286) PALPHA(JLAMP1),SIGMAP(NF),
1 PCERR(NF)
RETURN
END
C-------------------------- VERSION 1A OR 1B ---------------------------
C FUNCTION FISHER. CALCULATES PROBABILITY THAT FS(NU1,NU2) IS LESS
C THAN F FOR FISHER F-TEST.
C NU2 MUST BE .GE. 3
C SUMS UNTIL A TERM IS FOUND LESS THAN TOL*(CURRENT VALUE OF SUM).
C EQUATION NUMBERS REFER TO ABRAMOWITZ AND STEGUN, P. 946.
C NO COMMON BLOCKS NEEDED.
C-----------------------------------------------------------------------
C CALLS NO SUBPROGRAMS.
C-----------------------------------------------------------------------
FUNCTION FISHER (FS,NU1,NU2)
TOL=1.E-9
RNU1=FLOAT(NU1)
RNU2=FLOAT(NU2)
X=RNU2/(RNU2+RNU1*FS)
IF (X.LT.1. .OR. FS.LT.0.) GO TO 105
FISHER=0.
RETURN
105 IF (MOD(NU1,2) .NE. 0) GO TO 200
C-----------------------------------------------------------------------
C EVALUATES EQ. 26.6.4
C-----------------------------------------------------------------------
Q=1.
IF (NU1 .EQ. 2) GO TO 150
TERM=1.
TX=1.-X
TN=RNU2-2.
K=NU1-2
DO 110 J=2,K,2
TN=TN+2.
TERM=TERM*TN*TX/FLOAT(J)
Q=Q+TERM
IF (TERM .LE. TOL*Q) GO TO 150
110 CONTINUE
150 FISHER=1.-X**(.5*RNU2)*Q
RETURN
200 IF (MOD(NU2,2) .EQ. 0) GO TO 300
C-----------------------------------------------------------------------
C EVALUATES EQ. 26.6.8
C-----------------------------------------------------------------------
TH=ATAN(SQRT(RNU1*FS/RNU2))
CTH=COS(TH)
CC=CTH*CTH
STH=SIN(TH)
SS=STH*STH
TERM=1.
Q=1.
K=NU2-2
PR=1.
TN=0.
IF (K .LT. 3) GO TO 220
DO 210 J=3,K,2
TN=TN+2.
DUM=TN/FLOAT(J)
PR=PR*DUM
TERM=TERM*CC*DUM
Q=Q+TERM
IF (TERM .LE. TOL*Q) GO TO 220
210 CONTINUE
J=K
220 FISHER=TH+STH*CTH*Q
Q=0.
IF (NU1 .EQ. 1) GO TO 290
TN=TN+2.
PR=PR*TN
IF (J .EQ. K) GO TO 240
L=J+2
DO 230 J=L,K,2
TN=TN+2.
230 PR=PR*TN/FLOAT(J)
240 TN=RNU2-1.
Q=1.
TERM=1.
K=NU1-2
IF (K .LT. 3) GO TO 260
DO 250 J=3,K,2
TN=TN+2.
TERM=TERM*TN*SS/FLOAT(J)
Q=Q+TERM
IF (TERM .LE. TOL*Q) GO TO 260
250 CONTINUE
260 FISHER=FISHER-Q*PR*STH*CTH**NU2
290 FISHER=FISHER*.6366198
RETURN
C-----------------------------------------------------------------------
C EVALUATES EQ. 26.6.5
C-----------------------------------------------------------------------
300 TERM=1.
Q=1.
K=NU2-2
TN=RNU1-2.
DO 310 J=2,K,2
TN=TN+2.
TERM=TERM*TN*X/FLOAT(J)
Q=Q+TERM
IF (TERM .LE. TOL*Q) GO TO 320
310 CONTINUE
320 FISHER=SQRT(1.-X)*Q
RETURN
END
C-----------------------------------------------------------------------
C SUBROUTINE RESIDU. CALCULATES WEIGHTED RESIDUALS FROM ASAVE(J,JLAM,1)
C AND ASAVE(J,JLAM,2), WHICH CORRESPOND TO ALPHA AND LAMBDA,
C RETURNS PUNCOR (APPROX. PROBABILITY THAT THE RESIDUALS ARE
C UNCORRELATED FOR LAGS 1 THRU 5) AND WEIGHTED AVERAGE IN
C PUNCOR(6), AND, IF PLOT=.TRUE., CALLS PLPRES TO PLOT WEIGHTED
C RESIDUALS ON PRINTER.
C-----------------------------------------------------------------------
C CALLS SUBPROGRAMS - FISHER, PLPRES
C-----------------------------------------------------------------------
SUBROUTINE RESIDU (JLAM,PLOT,T,Y,SQRTW,YLYFIT,NMAX,PUNCOR,ASAVE)
LOGICAL PLOT, NOBASE, WTED, LDUM, LBLOKA, LBLOKB
COMMON /BLOK/ RBLOKA(3535), IBLOKA(165), N, IWRITE, IBLOKB,
1 LINEPG, IBLOKC(11), LBLOKA(6), NOBASE, WTED, LBLOKB(30)
a ibloka 145->165
a lbloka 3->6, lblokb 25->30
DIMENSION ASAVE(6,5,6)
DIMENSION T(NMAX), Y(NMAX), SQRTW(NMAX), YLYFIT(NMAX), PUNCOR(6)
JLAMP1=JLAM+1
LDUM=.NOT.NOBASE
IF (LDUM) DUM=ASAVE(JLAMP1,JLAM,1)
DO 110 K=1,N
YLYFIT(K)=Y(K)
110 IF (LDUM) YLYFIT(K)=YLYFIT(K)-DUM*SQRTW(K)
DO 120 J=1,JLAM
DUM=ASAVE(J,JLAM,1)
DDUM=ASAVE(J,JLAM,2)
DO 125 K=1,N
125 YLYFIT(K)=YLYFIT(K)-DUM*EXP(-DDUM*T(K))*SQRTW(K)
120 CONTINUE
RSUMST=0.
IF (LDUM) GO TO 140
DO 130 K=1,N
130 RSUMST=RSUMST+YLYFIT(K)
140 RSUMEN=RSUMST
C-----------------------------------------------------------------------
C CALCULATE AUTOCOVARIANCES AND PROBABILITIES THAT RESIDUALS ARE
C UNCORRELATED (HAMILTON, P. 183)
C-----------------------------------------------------------------------
PUNCOR(6)=0.
DO 150 L=1,5
NEND=N-L
RSUMST=RSUMST-YLYFIT(NEND+1)
RSUMEN=RSUMEN-YLYFIT(L)
STBAR=RSUMST/FLOAT(NEND)
ENBAR=RSUMEN/FLOAT(NEND)
SS=0.
SE=0.
EE=0.
J=L
DO 152 K=1,NEND
S=YLYFIT(K)-STBAR
J=J+1
E=YLYFIT(J)-ENBAR
SS=SS+S*S
SE=SE+S*E
EE=EE+E*E
152 CONTINUE
RSQ=SE*SE/(SS*EE)
PUNCOR(L)=1.-FISHER(FLOAT(NEND-2)*RSQ/(1.-RSQ),1,NEND-2)
PUNCOR(6)=PUNCOR(6)+PUNCOR(L)/FLOAT(L)
150 CONTINUE
PUNCOR(6)=PUNCOR(6)/2.283333
IF (PLOT) CALL PLPRES (YLYFIT,NMAX,N,WTED,IWRITE,LINEPG)
RETURN
END
C-----------------------------------------------------------------------
C SUBROUTINE PLPRES. PLOTS RESIDUALS ON PRINTER WITH X-AXIS HORIZONTAL.
C NEEDS NO COMMON BLOCKS
C-----------------------------------------------------------------------
C CALLS NO EXTERNAL SUBPROGRAMS.
C-----------------------------------------------------------------------
SUBROUTINE PLPRES (YLYFIT,NMAX,N,WTED,IWRITE,LINEPG)
LOGICAL WTED
DIMENSION YLYFIT(NMAX), JCHAR(8), LINE(131), LABEL(6), BOUND(21),
1 LCHARJ(20), LINE1(20)
c++++++++
jchar(1)=42; jchar(2)=45;
jchar(3)=111 .shift. 8 + 117
jchar(4)= 32 .shift. 8 + 108
jchar(5)= 32 .shift. 8 + 32
jchar(6)= 32 .shift. 8 + 48
jchar(7)= 61 ; jchar(8)= 43
c++++++++
IF (LINEPG .GE. 17) GO TO 100
5100 FORMAT (/////47H NO PLOT OF RESIDUALS POSSIBLE BECAUSE LINEPG =,
1 I2,2X,40(2H**)//)
WRITE (IWRITE,5100) LINEPG
RETURN
100 MPLOT=(LINEPG-1)/16
MLINE=MIN0(20,(LINEPG-1)/MPLOT-3)
RMIN=1.E+20
RMAX=-1.E+20
DO 110 J=1,N
RMIN=AMIN1(RMIN,YLYFIT(J))
110 RMAX=AMAX1(RMAX,YLYFIT(J))
5200 FORMAT(55H1PLOT OF RESIDUALS MULTIPLIED BY SQUARE-ROOT OF WEIGHTS
1 ,21H - FOR BEST SOLUTION.,4X,15HMAX RESIDUAL=U=,1PE8.1,4X,
2 15HMIN RESIDUAL=L=,1PE8.1)
IF (WTED) WRITE (IWRITE,5200) RMAX,RMIN
5202 FORMAT (18H1PLOT OF RESIDUALS
1 ,21H - FOR BEST SOLUTION.,4X,15HMAX RESIDUAL=U=,1PE8.1,4X,
2 15HMIN RESIDUAL=L=,1PE8.1)
IF (.NOT.WTED) WRITE (IWRITE,5202) RMAX,RMIN
DELTA=(RMAX-RMIN)/FLOAT(MLINE-1)
BOUND(1)=RMAX+.5*DELTA
K=MLINE+1
DO 120 J=2,K
BOUND(J)=BOUND(J-1)-DELTA
120 IF (BOUND(J)*BOUND(J-1) .LT. 0.) JAXIS=J-1
LABEL(1)=-110
DO 130 J=2,6
130 LABEL(J)=LABEL(J-1)+20
K=MLINE-1
DO 140 J=2,K
LINE1(J)=JCHAR(5)
140 LCHARJ(J)=5
LINE1(1)=JCHAR(3)
LINE1(JAXIS)=JCHAR(6)
LINE1(MLINE)=JCHAR(4)
LCHARJ(1)=7
LCHARJ(JAXIS)=2
LCHARJ(MLINE)=7
NPOINT=0
DO 200 NPAGE=1,30
IF (NPAGE .GT. 1) WRITE(IWRITE,5999)
5999 FORMAT (1H1)
DO 210 NPLOT=1,MPLOT
NST=NPOINT+1
NEND=NPOINT+130
NPOINT=NEND
NLIM=MIN0(NEND,N)
DO 220 NLINE=1,MLINE
LCHAR=LCHARJ(NLINE)
LINE(1)=LINE1(NLINE)
BMAX=BOUND(NLINE)
BMIN=BOUND(NLINE+1)
K=1
DO 230 J=NST,NLIM
K=K+1
LINE(K)=JCHAR(LCHAR)
IF (YLYFIT(J).LT.BMAX .AND. YLYFIT(J).GE.BMIN) LINE(K)=JCHAR(1)
230 CONTINUE
K=NLIM-NST+2
IF (NLINE .NE. MLINE) GO TO 235
DO 232 J=21,K,20
232 IF (LINE(J) .NE. JCHAR(1)) LINE(J)=JCHAR(8)
5230 FORMAT (A2,130A1)
235 WRITE (IWRITE,5230) (LINE(J),J=1,K)
220 CONTINUE
DO 240 J=1,6
240 LABEL(J)=LABEL(J)+130
5240 FORMAT (3X,6(16X,I4)/)
WRITE (IWRITE,5240) LABEL
IF (NLIM .EQ. N) RETURN
210 CONTINUE
200 CONTINUE
5250 FORMAT (49H NO MORE THAN 30 PAGES OF RESIDUAL PLOTS ALLOWED.,
1 2X,38(2H**))
WRITE (IWRITE,5250)
RETURN
END
▶EOF◀