1
C @(#)subs1.for 19.1 (ES0-DMD) 02/25/03 13:28:48
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===========================================================================
29
C @(#)subs1.for 4.5 (ESO-IPG) 3/26/93 15:40:53
30
C ************* COMMON FUNCTIONS AND SUBROUTINES **********************
32
C Copyright (C) Andrew T. Young, 1990
33
C Copyright (C) European Southern Observatory, 1992
36
FUNCTION GETIME(STR,HRS,TMIN,SEC)
38
C RETURNS TIME IN RADIANS. AUG.1985
43
REAL GETIME, HRS, TMIN, SEC, DEGRAD, DEG10
45
CHARACTER STR*20, STR2*40
46
DATA DEGRAD/0.017453292519943/
49
GETIME=DEG10(STR)*15.*DEGRAD
51
IF(SEC.EQ.3.E33)SEC=0.
52
IF(TMIN.EQ.3.E33)TMIN=0.
53
IF(HRS.GT.24. .OR. TMIN.GT.60. .OR. SEC.GT.60.)THEN
54
CALLTV('Time not legal')
55
WRITE(STR2,5)HRS,TMIN,SEC
56
5 FORMAT(' HRS =',F5.1,' MIN =',F5.1,' SEC =',F5.1)
58
CALL STETER(900, 'BAD TIME')
60
GETIME=(HRS+(TMIN+SEC/60.)/60.)*15.*DEGRAD
64
FUNCTION DEG10(STRING)
66
C Copyright (C) Andrew T. Young, 1990
68
C CONVERTS CHARACTER STRING FROM DEG MIN SEC TO DECIMAL DEGREES.
69
C NOMINAL STRING FORMAT (3F3.0) 5 JAN.'87
74
REAL DEG10, DEG, DMIN, SEC
77
CHARACTER STRING*(*),LINE*20,LDUM*20
82
IF(LINE(L:L).NE.' ') GO TO 2
89
3 LCOL=INDEX(LDUM,':')
99
IF(LDOT.EQ.0 .OR. L.LT.LDOT)THEN
103
IF(LDOT.NE.0) LDOT=LDOT+5-L
104
C DEGREES ARE IN COL.1-4.
106
IF(LDOT.EQ.11 .OR. (LDOT.EQ.0 .AND. LINE(5:5).EQ.' '))THEN
108
READ(LINE,'(F4.0,F3.0,BZ,F6.3)',ERR=99) DEG,DMIN,SEC
109
ELSE IF(LDOT.EQ.8)THEN
110
C MINUTES AND TENTHS.
111
READ(LINE,'(F4.0,F5.1)',ERR=99) DEG,DMIN
119
READ(LDUM,'(F11.8)',ERR=99) DEG10
123
DEG10=ABS(DEG)+((SEC/60.+DMIN)/60.)
124
IF(SEC.GT.60. .OR. DMIN.GT.60.) GO TO 98
125
IF(INDEX(LDUM,'-').NE.0) DEG10=-DEG10
129
98 CALL TV('More than 60 min.or sec.')
130
99 CALL TV('BADLY FORMATTED DATA:')
137
C Copyright (C) Andrew T. Young, 1990
139
C CONVERT DECIMAL DEG TO DEG/MIN/SEC STRING. 4 JAN.87
145
INTEGER LDEG, MIN, LSEC, LT
147
CHARACTER*13 DEG2MS,B13
151
FMIN=ABS(DEG-(LDEG))*60.
153
C USE TRUNCATED MINUTE.
158
IF(LT.LT.10) GO TO 10
161
IF(LSEC.LT.60)GO TO 10
164
IF(MIN.LT.60)GO TO 10
166
LDEG=LDEG+SIGN(1.,DEG)
167
10 WRITE(B13,'(3I3.2,''.'',I1)')LDEG,MIN,LSEC,LT
168
C ASSUME NO NEGATIVE VALUES LARGER THAN 99.
169
IF(LDEG.EQ.0 .AND. DEG.LT.0.) B13(:1)='-'
175
C Copyright (C) Andrew T. Young, 1990
176
C Copyright (C) European Southern Observatory, 1992
178
C CONVERTS 1ST 3 LETTERS OF MONTH TO INTEGER.
179
C RETURNS 0 IF NAME NOT RECOGNISED.
186
CHARACTER*3 MON, MONTHS(12), LMON(12)
189
DATA MONTHS/'JAN','FEB','MAR','APR','MAY','JUN','JUL',
190
1 'AUG','SEP','OCT','NOV','DEC'/
191
DATA LMON/'Jan','Feb','Mar','Apr','May','Jun','Jul',
192
1 'Aug','Sep','Oct','Nov','Dec'/
195
IF(MON.EQ.MONTHS(M))GO TO 405
197
c Try lower-case if not found:
199
IF(MON.EQ.LMON(M))GO TO 405
201
c Complain if not found:
202
EMSG='Incorrect month:'//MON
210
C Copyright (C) Andrew T. Young, 1990
212
C CONVERT INTEGER TO MON(TH NAME).
219
CHARACTER*3 MONTHS(12), M2MON
221
DATA MONTHS/'JAN','FEB','MAR','APR','MAY','JUN','JUL',
222
1 'AUG','SEP','OCT','NOV','DEC'/
227
SUBROUTINE DECOLR(COLORS,CNAMES,BANDS,SYSTEM,CANNED)
229
C Copyright (C) Andrew T. Young, 1990
230
C Copyright (C) European Southern Observatory, 1992
232
C SETS UP COLOR MATRICES, ETC. 31 JAN. 1987
235
C Deduces relation between bands and indices from color names CNAMES
236
C and band names BANDS, and stores this matrix in COLORM. Copies this
237
C to COLORS (used as scratch space), and forms inverse in COLRIN.
242
REAL COLORS, COLORM, COLRIN, XINV, YINV, DUM, BIG, PMULT
243
INTEGER NBANDS, LENB, LENC, KX, KY, MAGS, K, J, N, MINUS, NB, L,
244
1 LWORD, I, IP1, NBGRW, NCOLB, NROW, NXS, KK
246
INCLUDE 'MID_REL_INCL:mbands.inc'
247
C PARAMETER (MBANDS=9)
248
COMMON /CMAGS1/ COLORM(MBANDS,MBANDS),COLRIN(MBANDS,MBANDS),
249
1 XINV,YINV,NBANDS,LENB,LENC,KX,KY
252
INCLUDE 'MID_REL_INCL:mstars.inc'
253
C PARAMETER (MSTARS=1650)
254
CHARACTER *8 BANDS(3*MBANDS), CNAMES(2,MBANDS), SYSTEM*6, A*1
255
CHARACTER *80 PAGE(MBANDS)
256
DIMENSION COLORS(MBANDS,MSTARS)
267
MINUS=INDEX(CNAMES(1,K),'-')
274
J=INDEX(CNAMES(1,K),BANDS(NB)(:L))
277
IF(J.LT.MINUS .AND. L.EQ.MINUS-J)THEN
280
ELSE IF(J.GT.MINUS .AND. BANDS(NB).EQ.CNAMES(1,K)(MINUS+1:))THEN
293
IF(CNAMES(1,K).EQ.BANDS(NB) .OR. CNAMES(1,K)(2:).EQ.BANDS(NB))
301
C SPECIALS for uvby, etc.
302
IF(SYSTEM(:4).EQ.'UVBY')THEN
306
C M1 IN ROW 3, C1 IN 4.
315
IF(SYSTEM.EQ.'UVBYHB')THEN
319
ELSE IF(SYSTEM.EQ.'H-BETA') THEN
323
C FIX GENEVA (VM = V).
324
ELSE IF(SYSTEM.EQ.'GENEVA') THEN
329
5 IF(.NOT.CANNED .OR. MAGS.GT.1)THEN
330
6 CALL TV('Please check this transformation matrix:')
331
WRITE(PAGE,7)(BANDS(I),I=1,NBANDS)
333
DO 10 I=1,(NBANDS+17)/9
337
WRITE(PAGE,15)I,CNAMES(1,I),(COLORM(J,I),J=N,MIN(NBANDS,N+8))
338
15 FORMAT(/I2,2X,A6,' = ',9F7.1/(12X,9F7.1))
339
DO 18 J=1,(NBANDS+17)/9
344
CALLQF('Which ROW (number) is wrong?',DUM)
346
25 CALL ASK('Enter correct values for entire row.',PAGE(1))
347
READ(PAGE(1),*,ERR=25) (COLORM(I,N),I=1,NBANDS)
352
C COPY & INVERT MATRIX.
355
160 COLORS(I,J)=COLORM(I,J)
356
C START SYSTEM REDUCTION.
358
C FIND COLUMN PIVOT, IN ROW NBGRW.
363
IF(ABS(BIG).GE.ABS(COLORS(I,J))) GO TO 161
368
CALL TV('MATRIX is SINGULAR')
372
C SWAP ROW I WITH ROW NBGRW UNLESS I=NBGRW.
376
COLORS(J,NBGRW)=COLORS(J,I)
380
COLRIN(J,NBGRW)=COLRIN(J,I)
383
C ELIMINATE UNKNOWNS FROM FIRST COLUMN.
385
PMULT=-COLORS(I,K)/BIG
387
164 COLORS(J,K)=PMULT*COLORS(J,I)+COLORS(J,K)
389
165 COLRIN(L,K)=PMULT*COLRIN(L,I)+COLRIN(L,K)
391
IF(COLORS(NBANDS,NBANDS).EQ.0.)THEN
392
CALL TV('MATRIX is SINGULAR')
397
DO 169 NCOLB=1,NBANDS
401
C NUMBER OF PREVIOUSLY COMPUTED UNKNOWNS = NXS
406
168 DUM=DUM+COLRIN(NCOLB,KK)*COLORS(KK,NROW)
408
DUM=COLRIN(NCOLB,NROW)-DUM
409
COLRIN(NCOLB,NROW)=DUM/COLORS(NROW,NROW)
412
IF(.NOT.CANNED .OR. MAGS.GT.1)THEN
413
CALL TV('Inverse matrix:')
414
WRITE(PAGE,7)(CNAMES(1,I),I=1,NBANDS)
415
DO 170 I=1,(NBANDS+17)/18
416
170 CALL TVN(PAGE(I))
418
180 WRITE(PAGE,15)I,BANDS(I),(COLRIN(J,I),J=1,NBANDS)
419
DO 200 I=1,(NBANDS+17)/9
420
200 CALL TVN(PAGE(I))
425
SUBROUTINE EXCEED(N,LABEL,M)
427
C Copyright (C) Andrew T. Young, 1990
428
C Copyright (C) European Southern Observatory, 1992
439
WRITE(LINE,2)N,LABEL,M
440
2 FORMAT(I5,' EXCEEDS PARAMETER (',A6,'=',I3,').'/
441
1 /' INCREASE PARAMETER AND RECOMPILE.'//' (FATAL ERROR)')
449
SUBROUTINE MDY(CARD,MONTH,DAY,YEAR)
451
C Copyright (C) Andrew T. Young, 1990
453
C EXTRACTS 3-CHAR.MONTH, FLOATING DAY & YEAR FROM STRING CARD. 3 JAN.87
459
INTEGER I, NEXT, LAST, I1, J
461
CHARACTER CARD*80, MONTH*3, FIELD*5, CHAR
464
C SET ILLEGAL VALUES TO FLAG ERROR RETURNS.
469
IF(CARD(I:I).NE.' ') GO TO 5
478
IF(CARD(I:I).GT.'9' .OR. CARD(I:I).LT.'0') GO TO 14
479
C FIRST FIELD NUMERIC, SO MONTH SECOND.
483
IF(CHAR.GT.'9' .OR. CHAR.LT.'0') GO TO 10
487
C FIRST FIELD ENDS AT (I-1), I NON-NUM.
488
10 WRITE(FIELD,1) CARD(I1:I-1)
493
C MONTH STARTS W.LETTER.
496
IF(CHAR.GE.'A' .AND. CHAR.LE.'Z') GO TO 14
503
C FIND LAST NUMERIC FIELD.
506
IF(CHAR.GE.'0' .AND. CHAR.LE.'9') GO TO LAST,(18,21)
511
IF(CARD(I+2:J).EQ.' ')J=I+1
512
WRITE(FIELD,1) CARD(I:J)
513
READ(FIELD,4,ERR=19)YEAR
517
20 READ(FIELD,4,ERR=24)YEAR
522
C DAY LAST. ENDS AT NON-NUM.I1.
525
IF(CHAR.GT.'9' .OR. CHAR.LT.'0') GO TO 23
529
23 WRITE(FIELD,1) CARD(I:I1-1)
530
READ(FIELD,4,ERR=24) DAY
531
c fudged to fool stupid MIDAS pre-processor:
532
IF(.TRUE.)GO TO NEXT,(24,25)
535
C SKIP 2ND PART OF DOUBLE DATE.
538
IF(CARD(I1:I1).NE.'/' .AND. CARD(I1:I1).NE.'-') GO TO 15
539
C DOUBLE DATE. SKIP TO SEPARATOR.
540
I=INDEX(CARD(I1:I1+3),',')
541
IF(I.EQ.0) I=INDEX(CARD(I1:I1+3),' ')
548
C Copyright (C) Andrew T. Young, 1990
550
C GETS DP JULIAN DAY FROM DATSTR, in common block /NAMES/.
551
C Note: DJ is double precision.
556
REAL RAHRS, RAMIN, RASEC, DEDEG, DEMIN, DESEC, EPOCH, SIGNAL,TINT,
557
1 CVARS, FMM, DD, YY, YEAR, DAY, UTHRS, UTMIN, UTSEC, CLKERR,
558
2 STHRS, STMIN, STSEC, ZTHRS, ZTMIN, ZTSEC, VSPARE, RAS, DECS,
559
3 EPOCHS, COLORS, DDAY, Y
560
INTEGER NAM1, NAM2, NGRPS, MURAT, MURAA, MUDEC
561
INTEGER M, MON2M, NSTAR, N, K
565
INCLUDE 'MID_REL_INCL:mbands.inc'
566
C PARAMETER (MBANDS=9)
568
C Declare integer parameters for stupid compilers:
570
INTEGER MGAINS,MG2,MA,MCAT,MN,MV,MGRPS,MAREST,MNREST
571
PARAMETER (MGAINS=4, MG2=2*MGAINS)
572
PARAMETER (MA=21+MG2+5)
573
PARAMETER (MCAT=12+2*MBANDS,MN=MCAT+30, MV=MA+MN, MGRPS=8)
574
PARAMETER (MAREST=MA-21-MG2, MNREST=MN-MCAT-15)
576
CHARACTER NAMES(MV)*6,TITLE*80
578
CHARACTER*20 RASTR,DESTR,BAYER,CONSTL,FLAMST,BSHR,HD,DM,
579
1 SPECT,DESGN,DATSTR,MONTH,REM1,REM2,STSTR,ZTSTR,UTSTR,
580
2 FILTCD,STARCD,STRSKY,ASPARE(MAREST),GANCDN(MGAINS),DIMCDN(MGAINS)
582
C COMMON /NAMES/NAMES,TITLE, AVAR
583
COMMON /NAMES/NAMES,TITLE, RASTR,DESTR,STAR,BAYER,CONSTL,FLAMST,
584
1 BSHR,HD,DM,SPECT,DESGN,DATSTR,MONTH,REM1,REM2,STSTR,ZTSTR,UTSTR,
585
2 FILTCD,STARCD,STRSKY,ASPARE,GANCDN,DIMCDN
587
COMMON /VALUES/ NAM1(MGRPS),NAM2(MGRPS),NGRPS,RAHRS,RAMIN,RASEC,
588
1 DEDEG,DEMIN,DESEC,EPOCH,MURAT,MURAA,MUDEC,SIGNAL,TINT,
589
2 CVARS(2,MBANDS),FMM,DD,YY,YEAR,DAY,
590
3 UTHRS,UTMIN,UTSEC,CLKERR,STHRS,STMIN,STSEC,
591
4 ZTHRS,ZTMIN,ZTSEC,VSPARE(MNREST)
595
INCLUDE 'MID_REL_INCL:mstars.inc'
596
C PARAMETER (MSTARS=1650)
597
C commons for star catalog:
599
COMMON /SCATA/ STARS(MSTARS)
600
COMMON /SCAT/ RAS(MSTARS), DECS(MSTARS), EPOCHS(MSTARS), COLORS
601
DIMENSION COLORS(MBANDS,MSTARS)
602
C MONTH, DAY, YEAR, MM, DD, YY ARE EXTERNAL NAMES.
604
C MONTH IS NAME OF MONTH, MON IS 1ST 3 LETTERS, MM & M ARE NUMBER.
605
C YEAR IS FULL YEAR, YY IS LAST 2 DIGITS, Y IS INTERNAL.
607
IF(DATSTR.NE.' ' .OR. MONTH.NE.' ')THEN
608
IF(DATSTR.NE.' ')THEN
609
CALL MDY(DATSTR,MON,DDAY,Y)
615
C CONVERT MON TO INTEGER:
617
IF(M.EQ.0) CALL STETER(901, 'BAD MONTH IN DATA')
618
ELSE IF(FMM.NE.3.E33 .AND. DD.NE.3.E33 .AND. YY.NE.3.E33)THEN
623
CALL TV('NO DATE. FATAL ERROR.')
624
CALL STETER(902, 'NO DATE')
627
IF(Y.LT.100.)Y=Y+1900.
628
C J.D.: SEE SKY & TEL.61,312 (1981).
632
416 DJ=AINT(365.25*Y) + AINT(30.6001*(M+1)) + DDAY + 1720981.5D0
639
C GETS STAR NAME FROM HEADED FILE VIA /NAMES/. 10 MAR.'85
644
ELSE IF (HD.NE.' ') THEN
645
CALL CATHED(HD,'HD ')
648
ELSE IF (DM.NE.' ') THEN
651
ELSE IF (BSHR.NE.' ') THEN
652
CALL CATHED(BSHR,'HR ')
655
ELSE IF (BAYER.NE.' ') THEN
657
STARS(NSTAR)=BAYER(:N)//CONSTL
659
IF(FLAMST.NE.' ')THEN
661
FLAMST(N+1:)=STARS(NSTAR)
666
IF(FLAMST.NE.' ') THEN
668
STARS(NSTAR)=FLAMST(:N)//CONSTL
672
WRITE(STARS(NSTAR)(6:),'(I4)')NSTAR
675
C ADD SECOND NAME IF SPACE.
676
N=INDEX(STARS(NSTAR),' ')
680
STARS(NSTAR)(N+2:)=BAYER(:MIN(K,16-N))//CONSTL
681
ELSE IF(FLAMST.NE.' ')THEN
683
STARS(NSTAR)(N+2:)=FLAMST(:MIN(K,16-N))//CONSTL
684
ELSE IF(HD.NE.' ' .AND. BSHR.NE.' ')THEN
685
CALL CATHED(BSHR,'HR ')
686
STARS(NSTAR)(N+2:)=BSHR
687
ELSE IF(HD.NE.' ' .AND. DM.NE.' ')THEN
688
STARS(NSTAR)(N+2:)=DM
695
SUBROUTINE JD2DAT(DJ,DATSTR)
697
C Copyright (C) Andrew T. Young, 1990
699
C CONVERTS JD (IN DJ) TO DATE-STRING IN STD.FORMAT. 15 FEB.'85
700
C Note: argument DJ is real, *NOT* double-precision!
705
REAL DJ, Z, A, B, C, FK, E, D, Y
708
CHARACTER DATSTR*(*),M2MON*3,A11*11
712
C SEE SKY & TEL.61, 312 (1981).
714
C ASSUME 0 H U.T.; ROUND TO INTEGER DAY.
716
A=AINT((Z-1867216.25D0)/36524.25D0)
717
B=Z+A-AINT(A/4.)+1525.
718
C=AINT((B-122.1)/365.25)
721
E=AINT((B-FK)/30.6001)
722
D=B-FK-AINT(30.6001*E)
734
WRITE(A11,7)M2MON(M),INT(D),INT(Y)
739
SUBROUTINE EPHEM(I1,DJMOD,COLORS,RA,DEC)
741
C Copyright (C) Andrew T. Young, 1990
743
C INTERPOLATES EPHEMERIS OBJECTS TO DJMOD. 15 AUG.'85
748
REAL DJMOD, COLORS, RA, DEC, RECT, DIF, DEN, F
749
INTEGER I1, I2, I, MID, J
751
C RECT.COORDS.IN COLORS(MBM1...MBM3,I).
753
INCLUDE 'MID_REL_INCL:mbands.inc'
754
C PARAMETER (MBANDS=9)
755
INTEGER MBM1,MBM2,MBM3,MBM4
756
PARAMETER(MBM1=MBANDS-1,MBM2=MBANDS-2,MBM3=MBANDS-3,MBM4=MBANDS-4)
757
INCLUDE 'MID_REL_INCL:mstars.inc'
758
C PARAMETER (MSTARS=1650)
759
DIMENSION COLORS(MBANDS,MSTARS), RECT(3)
760
CHARACTER A, DATSTR*11, EMSG*38
766
IF(ABS(COLORS(MBANDS,I)-DJMOD).LT.DIF)THEN
767
DIF=ABS(COLORS(MBANDS,I)-DJMOD)
773
IF(DJMOD.GT.COLORS(MBANDS,I2))CALL TV('Extrapolation required.')
774
C ASSUME TIMES INCREASE.
775
20 IF(MID.GE.I2) MID=I2-1
776
DEN=COLORS(MBANDS,MID+1)-COLORS(MBANDS,MID)
778
CALL TV('Duplicated dates in table. Interpolation impossible.')
779
CALL ASK('Do you want to continue?',A)
780
IF(A.EQ.'N')CALL STETER(903, 'BAD TABLE')
781
RECT(1)=COLORS(MBM1,MID)
782
RECT(2)=COLORS(MBM2,MID)
783
RECT(3)=COLORS(MBM3,MID)
786
C START AT I1+1 FOR 3-POINT FORM.
787
IF(I2.GT.I1+1 .AND. MID.EQ.I1)MID=I1+1
790
F=(DJMOD-COLORS(MBANDS,MID))/DEN
791
IF(F.LT.-2.) GO TO 99
793
CALLTV('*** FATAL ERROR')
794
CALL JD2DAT(DJMOD+2400001.,DATSTR)
795
EMSG='Please extend tables to '//DATSTR
804
C LINEAR INTERPOLATION.
805
IF(MID.EQ.I1 .AND. F.LT.0.) CALL TV('Extrapolate backward.')
807
25 RECT(J)=(1.-F)*COLORS(MBANDS-J,MID) + F*COLORS(MBANDS-J,MID+1)
811
C QUADRATIC (3-POINT).
813
IF(MID.EQ.I1+1 .AND. F.LT.-1.)CALL TV('Extrapolate backward.')
815
30 RECT(J)=((F-1.)*COLORS(MBANDS-J,MID-1) + (F+1.)*COLORS(MBANDS-J,
816
1 MID+1))*F/2. -(F+1.)*(F-1.)*COLORS(MBANDS-J,MID)
819
90 RA=ATAN2(RECT(2),RECT(1))
820
DEC=ATAN2(RECT(3),SQRT(RECT(1)*RECT(1)+RECT(2)*RECT(2)))
823
99 CALL JD2DAT(DJMOD+2399999.,DATSTR)
824
EMSG='Please begin tables at '//DATSTR
826
CALLTV('*** FIRST DATE PRECEDES EPHEMERIS -- FATAL ERROR')
827
999 CALL STETER(905, 'INADEQUATE EPHEMERIS')