1
C @(#)prd.for 19.1 (ES0-DMD) 02/25/03 14:29:02
2
C===========================================================================
3
C Copyright (C) 1995 European Southern Observatory (ESO)
5
C This program is free software; you can redistribute it and/or
6
C modify it under the terms of the GNU General Public License as
7
C published by the Free Software Foundation; either version 2 of
8
C the License, or (at your option) any later version.
10
C This program is distributed in the hope that it will be useful,
11
C but WITHOUT ANY WARRANTY; without even the implied warranty of
12
C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
C GNU General Public License for more details.
15
C You should have received a copy of the GNU General Public
16
C License along with this program; if not, write to the Free
17
C Software Foundation, Inc., 675 Massachusetss Ave, Cambridge,
20
C Corresponding concerning ESO-MIDAS should be addressed as follows:
21
C Internet e-mail: midas@eso.org
22
C Postal address: European Southern Observatory
23
C Data Management Division
24
C Karl-Schwarzschild-Strasse 2
25
C D 85748 Garching bei Muenchen
27
C===========================================================================
30
CC *RANGS* : SORTS A VECTOR OF LENGTH 'NCAS'.
32
SUBROUTINE RANGS(AM,LAME)
34
C INCLUDE 'MID_REL_INCL:implicit.inc'
35
C DIMENSION JLV(30),JRV(30),AM(LAME)
37
INTEGER J,JNC,JNDL,JR,JSS,JTWE,LAME
40
INTEGER JLV(30),JRV(30)
53
30 IF(AM(JNC).GE.XX)GOTO 40
56
40 IF(XX.GE.AM(J))GOTO 50
59
50 IF(JNC.GT.J)GOTO 60
65
60 IF (JNC.LE.J) GOTO 30
66
IF ((J-JNDL).LT.(JR-JNC)) GOTO 80
67
IF (JNDL.GE.J) GOTO 70
73
80 IF (JNC.GE.JR) GOTO 90
78
100 IF (JNDL.LT.JR) GOTO 20
83
CC *RDUAL* : CALCULATES THE RESIDUALS OF ALL CASES
85
SUBROUTINE RDUAL(AA,JKEUS,JDA,NCAS,NVAR,JCST,JPRT,NVAD,LUB,PREC,
86
1 JREG,X,Y,RESDU,WEIGHTS,XMED,XMAD,NZWE,AVW,JPLT,AW,NMVAL,
87
1 NDXX,NDXY,JHEAD,LAB)
89
C INCLUDE 'MID_REL_INCL:implicit.inc'
91
C DIMENSION AA(JDA),X(NDXX,NDXY),Y(NDXY),RESDU(NDXY),WEIGHTS(NDXY)
92
C DIMENSION XMED(NDXX),XMAD(NDXX),AW(NDXY),NMVAL(NDXY)
93
INTEGER J,JCST,JDA,JKEUS,JNC,JPL2,JPLT,JPRT,JREG
94
INTEGER NCAS,NDXX,NDXY,NVAD,NVAR,NZWE,LUB
95
REAL AL,AVW,BBB,PREC,YJ
97
REAL AA(JDA),X(NDXX,NDXY),Y(NDXY),RESDU(NDXY),WEIGHTS(NDXY)
98
REAL XMED(NDXX),XMAD(NDXX),AW(NDXY)
102
CHARACTER*10 LAB(NDXX)
106
IF(JPRT.EQ.0) GOTO 10
107
IF (NVAR.EQ.1.AND.JCST.EQ.1) THEN
108
IF (JKEUS.NE.2) WRITE(LUB,8000) LAB(NVAD)
109
IF (JKEUS.EQ.2) WRITE(LUB,8010) LAB(NVAD)
111
IF (JKEUS.NE.2) WRITE(LUB,8020) LAB(NVAD),LAB(NVAD)
112
IF (JKEUS.EQ.2) WRITE(LUB,8030) LAB(NVAD),LAB(NVAD)
115
IF (.NOT.(NVAR.EQ.1.AND.JCST.EQ.1)) GOTO 40
120
30 AW(JNC)=AW(JNC)+AA(J)*(X(J,JNC)*XMAD(J)+XMED(J))
121
YJ=Y(JNC)*XMAD(NVAD)+XMED(NVAD)
123
60 IF (AA(NVAD).GT.PREC) GOTO 70
124
IF (ABS(BBB).LT.PREC) BBB=0.0
127
70 RESDU(JNC)=BBB/AA(NVAD)
128
50 IF (JPRT.EQ.0) GOTO 20
129
IF (NVAR.EQ.1.AND.JCST.EQ.1) GOTO 80
130
IF (AA(NVAD).GT.PREC.AND.JKEUS.NE.2)
131
1 WRITE(LUB,8040) YJ,AW(JNC),BBB,NMVAL(JNC),RESDU(JNC)
132
IF (AA(NVAD).LE.PREC)
133
1 WRITE(LUB,8050) YJ,AW(JNC),BBB,NMVAL(JNC)
134
IF (AA(NVAD).GT.PREC.AND.JKEUS.EQ.2)
135
1 WRITE(LUB,8040) YJ,AW(JNC),BBB,NMVAL(JNC),RESDU(JNC),
138
80 IF (JKEUS.NE.2) WRITE(LUB,8060) Y(JNC),BBB,JNC,RESDU(JNC)
139
IF (JKEUS.EQ.2) WRITE(LUB,8060) Y(JNC),BBB,JNC,RESDU(JNC),
142
IF(JPLT.LT.1) GOTO 90
143
IF (AA(NVAD).LE.PREC) JPL2=0
144
CALL GRAF(AW,RESDU,NCAS,0,JPL2,JPLT,NMVAL,NDXY,LUB,JREG,
145
1 JHEAD,NDXX,NVAD,LAB)
146
IF (JPLT.LT.3) GOTO 90
148
CALL GRAF(AW,RESDU,NCAS,0,JPL2,JPLT,NMVAL,NDXY,LUB,JREG,
149
1 JHEAD,NDXX,NVAD,LAB)
152
8000 FORMAT(//11X,'OBSERVED',12X,'RESIDUAL',
153
1 ' NO',' RES/SC'/9X,A10/)
154
8010 FORMAT(//11X,'OBSERVED',12X,'RESIDUAL',
155
1 ' NO',' RES/SC',' WEIGHT'/9X,A10/)
156
8020 FORMAT(//11X,'OBSERVED',11X,'ESTIMATED',12X,'RESIDUAL',
157
1 3X,'NO',' RES/SC'/9X,A10,10X,A10/)
158
8030 FORMAT(//11X,'OBSERVED',11X,'ESTIMATED',12X,'RESIDUAL',
159
1 3X,'NO',' RES/SC',' WEIGHT'/9X,A10,10X,A10/)
160
8040 FORMAT(1X,F18.5,2(1X,F19.5),I5,1X,F7.2,F6.1)
161
8050 FORMAT(1X,F18.5,2(1X,F19.5),I5,' *****')
162
8060 FORMAT(1X,F18.5,1X,F19.5,I5,1X,F7.2,F6.1)
166
CC *SHHLF* : CALCULATES THE LMS IN THE ONE-DIMENSIONAL CASE.
168
SUBROUTINE SHHLF(W,NCAS,JQU,SLUTN,BSTD,PREC)
170
C INCLUDE 'MID_REL_INCL:implicit.inc'
172
INTEGER JNC,JPK,JQU,JTEL,K,LNK,NCAS
173
REAL ABSW,BSTD,PREC,SLUTN,TEL,VERSC
179
SLUTN=(W(1)+W(K+1))/2.0
180
BSTD=((W(K+1)-W(1))/2.0)
181
IF (NCAS.EQ.2) RETURN
187
IF ( ABS(ABSW-VERSC).GT.PREC) GOTO 20
189
SLUTN=SLUTN+(W(JNC)+W(JPK))/2.0
191
20 IF (ABSW.LT.VERSC) THEN
194
BSTD=((W(JPK)-W(JNC))/2.0)
195
SLUTN=(W(JNC)+W(JPK))/2.0
203
CC *TRC* : RETRANSFORMATION OF THE VARIANCE-COVARIANCE MATRIX
205
SUBROUTINE TRC(H,DA,NMXV,NDXX,NDXY,NVAR,JCST,NVSB,NVAD,
208
C INCLUDE 'MID_REL_INCL:implicit.inc'
209
C DIMENSION H(NMXV,NDXX),DA(NMXV)
210
C DOUBLE PRECISION H,XMP2,HNN
211
C DIMENSION XMED(NDXX),XMAD(NDXX)
212
INTEGER J,JCST,JU,K,K2,NDXX,NDXY,NMXV,NVAD,NVAR,NVSB
215
DOUBLE PRECISION H(NMXV,NDXX),XMP2,HNN
216
REAL XMED(NDXX),XMAD(NDXX)
218
XMP2=DBLE(XMAD(NVAD))*DBLE(XMAD(NVAD))
222
H(J,K)=H(J,K)*(XMP2/(DBLE(XMAD(J))*DBLE(XMAD(K))))
232
H(J,K)=H(J,K)*XMP2/(DBLE(XMAD(J))*DBLE(XMAD(K)))
237
H(NVAR,K)=H(K,NVAR)*XMP2/DBLE(XMAD(K))
240
H(NVAR,K)=H(NVAR,K)-DBLE(XMED(K))*XMP2/
241
1 (DBLE(XMAD(K2))*DBLE(XMAD(K)))*H(K2,NVAD)
245
H(NVAR,K)=H(NVAR,K)-(DBLE(XMED(K2))*XMP2)/
246
1 (DBLE(XMAD(K2))*DBLE(XMAD(K)))*H(K,K2)
248
H(NVAR,K)=H(NVAR,K)-DBLE(XMED(K2))*XMP2/
249
1 (DBLE(XMAD(K2))*DBLE(XMAD(K)))*H(K2,K)
253
H(NVAR,NVAR)=H(NVAR,NVAD)*XMP2
255
H(NVAR,NVAR)=H(NVAR,NVAR)+
256
1 (DBLE(XMED(K))*DBLE(XMED(K)))*XMP2/
257
1 (DBLE(XMAD(K))*DBLE(XMAD(K)))*H(K,NVAD)
261
H(NVAR,NVAR)=H(NVAR,NVAR)-2.0D0*XMP2*DBLE(XMED(K))/
262
1 (DBLE(XMAD(K)))*H(K,NVAR)
264
H(NVAR,NVAR)=H(NVAR,NVAR)-2.0D0*XMP2*DBLE(XMED(K))/
265
1 (DBLE(XMAD(K)))*H(NVAR,NVAD)
271
HNN=2.0D0*DBLE(XMED(J))*DBLE(XMED(K))*XMP2
272
H(NVAR,NVAR)=H(NVAR,NVAR)+HNN/
273
1 (DBLE(XMAD(J))*DBLE(XMAD(K)))*H(J,K)
275
DA(NVAR)=DSQRT(H(NVAR,NVAR))
280
CC *SCHCV* : PRINTS THE VARIANCE-COVARIANCE MATRIX OF THE
281
CC REGRESSION COEFFICIENTS.
283
SUBROUTINE SCHCV(NVAR,NDXX,NMXV,H,LUB)
285
C INCLUDE 'MID_REL_INCL:implicit.inc'
286
INTEGER J,K,NDXX,NMXV,NVAR,LUB
288
DOUBLE PRECISION H(NMXV,NDXX)
291
WRITE(LUB,9010) (H(J,K),K=1,J)
293
9000 FORMAT(//' VARIANCE - COVARIANCE MATRIX = '/)
294
9010 FORMAT(5(5X,D10.4))
298
CC *RTRAN* : RETRANSFORMATION OF THE REGRESSION COEFFICIENTS.
300
SUBROUTINE RTRAN(NVAR,JCST,NVSB,NVAD,NDXX,XMED,XMAD,AA,JAL,FCKW)
302
C INCLUDE 'MID_REL_INCL:implicit.inc'
303
C DIMENSION AA(JAL),XMED(NDXX),XMAD(NDXX)
305
INTEGER J,JAL,JCST,NDXX,NVAD,NVAR,NVSB
308
REAL AA(JAL),XMED(NDXX),XMAD(NDXX)
311
AA(1)=AA(1)*XMAD(NVAD)/XMAD(1)
315
10 AA(J)=AA(J)*XMAD(NVAD)/XMAD(J)
317
AA(NVAR)=AA(NVAR)*XMAD(NVAD)/XMAD(NVAR)
319
AA(NVAR)=AA(NVAR)*XMAD(NVAD)
321
20 AA(NVAR)=AA(NVAR)-AA(J)*XMED(J)
322
AA(NVAR)=AA(NVAR)+XMED(NVAD)
324
30 FCKW=FCKW*(XMAD(NVAD)*XMAD(NVAD))
328
CC *RANPN* : RANDOM NUMBER GENERATOR .
330
SUBROUTINE RANPN(NCAS,NVAR,JNDVC,NDXX,JEY,JLP,MAXRP)
331
C INCLUDE 'MID_REL_INCL:implicit.inc'
332
C DIMENSION JNDVC(NDXX)
333
INTEGER J,JEY,JEYQT,JLP,JNC,JNCM,JRAN,MAXRP,NCAS,NDXX,NVAR
338
CC WE PROGRAMMED THIS RANDOM NUMBER GENERATOR OURSELVES BECAUSE
339
CC WE WANTED IT TO BE MACHINE INDEPENDENT. IT SHOULD RUN ON MOST
340
CC COMPUTERS BECAUSE THE LARGEST INTEGER USED IS LESS THAN 2**30.
341
CC THE PERIOD IS 2**16=65536, WHICH IS SUFFICIENT FOR THIS
345
IF (JLP.LE.MAXRP) GOTO 10
354
IF (JNC.EQ.1) GOTO 50
357
IF (JNDVC(J).EQ.JRAN) GOTO 30
364
CC *GENPN* : GENERATES ALL COMBINATIONS OF 'NVAR' INTEGERS
365
CC BETWEEN 1 AND 'NCAS', WHERE NVAR IS AT MOST FIVE.
367
SUBROUTINE GENPN(NCAS,NVAR,JNDVC,NDXX,JJJ)
369
C INCLUDE 'MID_REL_INCL:implicit.inc'
370
C DIMENSION JNDVC(NDXX)
371
INTEGER J,JJJ,NDXX,NCAS,NVAR
379
IF (JNDVC(NVAR).EQ.NCAS) GOTO 10
380
JNDVC(NVAR)=JNDVC(NVAR)+1
382
10 IF (JNDVC(NVAR-1).EQ.NCAS-1) GOTO 20
383
JNDVC(NVAR-1)=JNDVC(NVAR-1)+1
384
JNDVC(NVAR)=JNDVC(NVAR-1)+1
386
20 IF(JNDVC(NVAR-2).EQ.NCAS-2) GOTO 30
387
JNDVC(NVAR-2)=JNDVC(NVAR-2)+1
388
JNDVC(NVAR-1)=JNDVC(NVAR-2)+1
389
JNDVC(NVAR)=JNDVC(NVAR-1)+1
391
30 IF(JNDVC(NVAR-3).EQ.NCAS-3) GOTO 40
392
JNDVC(NVAR-3)=JNDVC(NVAR-3)+1
393
JNDVC(NVAR-2)=JNDVC(NVAR-3)+1
394
JNDVC(NVAR-1)=JNDVC(NVAR-2)+1
395
JNDVC(NVAR)=JNDVC(NVAR-1)+1
397
40 IF(JNDVC(NVAR-4).EQ.NCAS-4) GOTO 50
398
JNDVC(NVAR-4)=JNDVC(NVAR-4)+1
399
JNDVC(NVAR-3)=JNDVC(NVAR-4)+1
400
JNDVC(NVAR-2)=JNDVC(NVAR-3)+1
401
JNDVC(NVAR-1)=JNDVC(NVAR-2)+1
402
JNDVC(NVAR)=JNDVC(NVAR-1)+1
404
50 IF(JNDVC(NVAR-5).EQ.NCAS-5) RETURN
405
JNDVC(NVAR-5)=JNDVC(NVAR-5)+1
406
JNDVC(NVAR-4)=JNDVC(NVAR-5)+1
407
JNDVC(NVAR-3)=JNDVC(NVAR-4)+1
408
JNDVC(NVAR-2)=JNDVC(NVAR-3)+1
409
JNDVC(NVAR-1)=JNDVC(NVAR-2)+1
410
JNDVC(NVAR)=JNDVC(NVAR-1)+1
414
CC *EQUAT* : SOLVES A SYSTEM OF LINEAR EQUATIONS.
416
SUBROUTINE EQUAT(AM,NMXV,NDXX,HVEC,JDMB,NA,NB,NERR,DTEM)
418
C INCLUDE 'MID_REL_INCL:implicit.inc'
419
C DIMENSION HVEC(JDMB),AM(NMXV,NDXX)
420
C DOUBLE PRECISION HVEC,TURN,SWAP,DTEM,DETER
421
INTEGER J,JBEGC,JBEGX,JDEL,JENDC,JENDX,JDM,JDMB,JHFD
422
INTEGER JMAT,JNC,JNCB,JNCC,JNCD,JNCE,JNCF,JNK,JROW
423
INTEGER LCLPL,LDEL,N,NA,NB,NC,NDXX,NEQA,NERR,NMXV,NZNDE
426
DOUBLE PRECISION HVEC(JDMB),TURN,SWAP,DTEM,DETER
445
DO 40 JNCB=LCLPL,JDEL
446
IF(DABS(HVEC(JNCB))-DABS(TURN)) 40,40,30
451
50 IF(LDEL-LCLPL) 60,80,60
459
HVEC(JNCB)=HVEC(LDEL)
462
IF (JHFD.EQ.N) GOTO 120
466
90 HVEC(JNCC)=HVEC(JNCC)*TURN
473
DO 100 JNCC=JROW,JMAT
476
100 HVEC(JNCF)=HVEC(JNCF)-HVEC(JNCE)*HVEC(JNCD)
492
HVEC(JENDX)=HVEC(JENDX)/HVEC(JENDC+1)
495
DO 130 JNCC=JBEGC,JENDC
497
130 HVEC(JNCD)=HVEC(JNCD)-HVEC(JNCC)*SWAP
499
HVEC(JBEGX)=HVEC(JBEGX)/HVEC(1)
504
DO 160 JNCB=NEQA,JMAT
509
DO 160 JNCC=JBEGX,JENDX
511
160 HVEC(JNCD)=HVEC(JNCC)