1
C @(#)necripp1.for 19.1 (ESO-DMD) 02/25/03 14:20:25
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 Massachusetts Ave, Cambridge,
20
C Correspondence 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===========================================================================
31
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
35
C program ECHRIPP1 version 1.0 870820
37
C Author : J.D.Ponz ESO - Garching
41
C version 1.1 P. Ballester 901009 Option to freeze K and Alpha
45
C ECHELLE, CASPEC, BLAZE FUNCTION
49
C COMPUTE THE ECHELLE CONSTANTS ALPHA AND K FOR EACH ECHELLE ORDER
50
C (only if the flag is not set to FREEZE)
58
C RIPPLE/ECHELLE INPUT OUTPUT K0,A0
64
C-------------------------------------------------------------
68
INTEGER NPIXA(2),NPTOT(100),NORDER(100)
69
INTEGER I, ISTAT, KUN, KNUL, INIMA, OUTIMA
70
INTEGER MADRID(1), NAXISA
71
INTEGER*8 IPNTRA, IPNTRB
73
DOUBLE PRECISION WSTART(100),STEPA(2),STARTA(2)
74
DOUBLE PRECISION K0, ALPHA0,LAMBDA1,LAMBDA2
76
REAL CUT(4), PARS(4), XMIN, XMAX
78
CHARACTER*80 INFRM, OUTFRM, TABLE, FREEZE
79
CHARACTER IDENTA*72,CUNITA*64
81
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
83
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
85
C ... INITIALIZE SYSTEM
88
CALL STKRDC('P1',1,1,80,I,INFRM,KUN,KNUL,ISTAT)
89
CALL STKRDC('P2',1,1,80,I,OUTFRM,KUN,KNUL,ISTAT)
90
CALL CLNFRA(INFRM,INFRM,0)
91
CALL CLNFRA(OUTFRM,OUTFRM,0)
92
CALL STKRDR('INPUTR',1,4,I,PARS,KUN,KNUL,ISTAT)
94
C CALL STKRDC('P4',1,1,80,I,TABLE,KUN,KNUL,ISTAT)
95
CALL STKRDC ('P5',1,1,80,I,FREEZE,KUN,KNUL,ISTAT)
96
CALL STTPUT(' Ripple correction. Method FIT',ISTAT)
102
C ... MAP INPUT/OUTPUT FRMS
104
CALL STIGET(INFRM,D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,
105
. 2,NAXISA,NPIXA,STARTA,STEPA,IDENTA,
106
. CUNITA,IPNTRA,INIMA,ISTAT)
107
CALL STDRDR(INIMA,'LHCUTS',1,4,I,CUT,KUN,KNUL,ISTAT)
108
CALL STDRDD(INIMA,'WSTART',1,NPIXA(2),I,WSTART,KUN,KNUL,ISTAT)
109
CALL STDRDI(INIMA,'NPTOT',1,NPIXA(2),I,NPTOT,KUN,KNUL,ISTAT)
110
CALL STDRDI(INIMA,'NORDER',1,NPIXA(2),I,NORDER,KUN,KNUL,ISTAT)
111
CALL STIPUT(OUTFRM,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
112
. NAXISA,NPIXA,STARTA,STEPA,IDENTA,
113
. CUNITA,IPNTRB,OUTIMA,ISTAT)
115
C ... RIPPLE FUNCTION
117
CALL RIPPLE1(NPIXA(1),NPIXA(2),MADRID(IPNTRA),MADRID(IPNTRB),
118
. WSTART,STEPA(1),NPTOT,NORDER,K0,ALPHA0,XMIN,XMAX,TABLE,
119
. LAMBDA1,LAMBDA2,FREEZE)
123
C ... WRITE PROCESS DESCRIPTORS
129
CALL DSCUPT(INIMA,OUTIMA,' ',ISTAT)
130
CALL STDWRR(OUTIMA,'LHCUTS',CUT,1,4,KUN,ISTAT)
134
SUBROUTINE RIPPLE1(NX,NY,X,Y,WS,WSTEP,NP,NO,K0,A0,
135
. XMIN,XMAX,TABLE,LAMBDA1,LAMBDA2,FREEZE)
137
C CORRECT FOR BLAZE EFFECT USING THE OVERLAPPING REGION
140
C NX INTG MAXIMUM NUMBER OF SAMPLES PER ORDER
141
C NY INTG NUMBER OF ORDERS
142
C X REAL X(NX,NY) INPUT IMAGE
143
C WS REAL STARTING WAVELENGTH PER EACH ORDER
144
C WSTEP REAL WAVELENGTH STEP
145
C NP INTG NUMBER OF USEFUL SAMPLES PER ORDER
146
C NO INTG SPECTRAL ORDER NUMBER
147
C K0 REAL INITIAL GUESS FOR THE CONSTANT K
148
C A0 REAL INITIAL GUESS FOR ALPHA
149
C FREEZE CHARACTER Flag (NULL/FREEZE) to freeze values of K and Alpha
152
C Y REAL Y(NX,NY) CORRECTED IMAGE
153
C XMIN REAL MINIMUN AND
154
C XMAX REAL MAXIMUM VALUES
159
INTEGER NP(NY),NO(NY),IERR(2),ICOL(7), TID
160
INTEGER ISTAT, ISEQ, I, IORDER, I1, I2, ILR
162
REAL X(NX,NY), Y(NX,NY), XMIN, XMAX
165
DOUBLE PRECISION WS(NY), WSTEP, K0, A0,LAMBDA1,LAMBDA2
166
DOUBLE PRECISION K(2), KM, AM, A(2)
167
DOUBLE PRECISION DVAL1, DVAL2
171
CHARACTER*16 LABEL(7),UNIT(7),FORM
172
CHARACTER*80 LINE,FREEZE
175
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
176
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
178
DATA LABEL(1)/'ORDER'/,UNIT(1)/'UNITLESS'/
179
DATA LABEL(2)/'K'/,UNIT(2)/'UNITLESS'/
180
DATA LABEL(3)/'ALPHA'/,UNIT(3)/'UNITLESS'/
181
DATA LABEL(4)/'KFIT'/,UNIT(4)/'UNITLESS'/
182
DATA LABEL(5)/'AFIT'/,UNIT(5)/'UNITLESS'/
183
DATA LABEL(6)/'YMAX'/,UNIT(6)/'FLUX'/
184
DATA LABEL(7)/'STATUS'/,UNIT(7)/'UNITLESS'/
192
C ... CORRECT RIPPLE IF K0 IS NEGATIVE
194
CALL TBTOPN(TABLE,F_I_MODE,TID,ISTAT)
195
CALL TBLSER(TID,LABEL(2),ICOL(1),ISTAT)
196
CALL TBLSER(TID,LABEL(3),ICOL(2),ISTAT)
198
CALL TBRRDR(TID,IORDER,2,ICOL,VAL,NULL,ISTAT)
201
CALL RIPCOR(WS(IORDER),WSTEP,NP(IORDER),X(1,IORDER),
202
. Y(1,IORDER),NO(IORDER),DVAL1,DVAL2,NX)
206
C ... FIND BLAZE PARAMETERS
208
CALL TBTINI(TABLE,F_TRANS,F_O_MODE,8,NY,TID,ISTAT)
210
CALL TBCINI(TID,D_R4_FORMAT,1,FORM,UNIT(I),LABEL(I),
214
C ... ITERATION ON ALL CONSECUTIVE PAIRS OF ORDERS
216
CALL STTPUT(' ORDER NUMER FITTED K FITTED ALPHA',ISTAT)
217
CALL STTPUT(' ----------- ---------- ------------',ISTAT)
218
DO 40 IORDER = 2, NY-1
220
IF (FREEZE(1:1).EQ.'F'.OR.FREEZE(1:1).EQ.'f') THEN
229
C ... CONSIDER LEFT AND RIGHT OVERLAPPING REGIONS
234
CALL FITKA(WS(I1),WSTEP,NP(I1),X(1,I1),NO(I1),
235
. WS(I2),NP(I2),X(1,I2),NO(I2),
236
. K0,A0,K(ILR+1),A(ILR+1),IERR(ILR+1),
240
C ... COMPUTE MEAN VALUE
242
KM = 0.5*(K(1) + K(2))
243
AM = 0.5*(A(1) + A(2))
245
ENDIF ! End of test on FREEZE
247
C TYPE *,IORDER,KM,AM
249
C ... CORRECT FOR RIPPLE
251
CALL RIPCOR(WS(IORDER),WSTEP,NP(IORDER),X(1,IORDER),
252
. Y(1,IORDER),NO(IORDER),KM,AM,NX)
253
IF (IORDER.EQ.2) THEN
254
CALL RIPCOR(WS(1),WSTEP,NP(1),X(1,1),Y(1,1),
262
CALL TBRWRR(TID,ISEQ,6,ICOL,VAL,ISTAT)
270
CALL TBRWRR(TID,ISEQ,6,ICOL,VAL,ISTAT)
271
IF (IORDER.EQ.NY-1) THEN
272
CALL RIPCOR(WS(NY),WSTEP,NP(NY),X(1,NY),Y(1,NY),
280
CALL TBRWRR(TID,ISEQ,6,ICOL,VAL,ISTAT)
283
C ... WRITE OUT RESULTS
285
WRITE(LINE,100) NO(IORDER),KM,AM
286
CALL STTPUT(LINE,ISTAT)
288
CALL TBSINI(TID,ISTAT)
290
CALL TBTCLO(TID,ISTAT)
292
100 FORMAT(4X,I8,F12.2,F12.4)
295
SUBROUTINE RIPCOR(W1,WS,NP,X,Y,M,K,A,NX)
297
C CORRECT FOR RIPPLE FUNCTION
300
C W1 INITIAL WAVELENGTH
314
DOUBLE PRECISION W1,WS,K,A
315
DOUBLE PRECISION PI,DK,DA,DW,DM,R,DX,PA,DC
317
DATA PI/3.1415926535897932D0/
326
DX = (PA*DM*DC)*(DW-1.D0/DC)
327
IF (DABS(DX).LT.1.D-10) THEN
340
SUBROUTINE FITKA(WSTART1,WSTEP,N1,X1,NO1,
341
. WSTART2,N2,X2,NO2,K0,A0,K,A,IERR,
344
C COMPUTE CONTANT K AND ALPHA
347
C WSTEP WAVELENGTH STEP
348
C WSTART1 STARTING WAVELENGTH ORDER M+1
349
C N1 NUMBER OF POINTS IN ORDER M+1
350
C X1 FLUX IN ORDER M+1
352
C WSTART2 STARTING WAVELENGTH ORDER M
353
C N2 NUMBER OF POINTS IN ORDER M
362
C IERR CONVERGENCE FLAG 0 - GOOD VALUE
363
C OTHERWISE IT DOES NOT CONVERGE
369
DOUBLE PRECISION WSTART1, WSTART2, WSTEP
370
DOUBLE PRECISION DW1, DW2, W2, K0, K, A0, A,LAMBDA1,LAMBDA2
371
DOUBLE PRECISION ETA, XTOL, STEPMX, XPAR(2), FSUMSQ
372
DOUBLE PRECISION FVEC(300), FJAC(300,2),S(2), V(2,2), W(1500)
373
DOUBLE PRECISION XX1(300),XX2(300),XSTART,XSTEP
374
INTEGER ORD1, ORD2, IW(1), ISTAT, NPIX, I1, I2
375
INTEGER NO1, NO2, J, J1, IPRINT, NPAR, MAXCAL
376
INTEGER IERR, NF, NITER, IFAIL, LV, LW, LJ, LIW
380
DOUBLE PRECISION DSQRT, X02AAF
381
EXTERNAL LSQFUN, LSQMON
382
COMMON/E04PAR/XSTART,XSTEP,ORD1,ORD2,XX1,XX2
384
DW1 = (WSTART1 + (N1-1)*WSTEP) - WSTART2
385
IF (DW1.LE.0.D0) THEN
386
CALL STTPUT('Warning: There is no order overlap',ISTAT)
393
IF ((DW2+W2).GT.DW1) THEN
394
CALL STTPUT('Warning: Wrong wavelengths !',ISTAT)
397
C TYPE *,' *** ORDERS :',NO1,NO2,' ***',W2,DW2
400
I1 = (WSTART2+W2-WSTART1)/WSTEP
408
XSTART = WSTART2 + W2
416
C ... START MINIMIZATION
422
XTOL = 10.*DSQRT(X02AAF(XTOL))
431
CALL E04GDF(NPIX,NPAR,LSQFUN,LSQMON,IPRINT,MAXCAL,ETA,XTOL,
432
. STEPMX,XPAR,FSUMSQ,FVEC,FJAC,LJ,S,V,LV,NITER,NF,
437
C TYPE *,'IFAIL,SUMSQ',IFAIL,FSUMSQ
438
C TYPE *,'K,A',XPAR(1),XPAR(2)
444
SUBROUTINE LSQFUN(IFLAG,M,N,XC,FVECC,FJACC,LJC,IW,LIW,W,LW)
446
C SUBROUTINE TO COMPUTE THE RESIDUALS AND THEIR FIRST DERIVATIVE
450
INTEGER IFLAG, M, N, LJC, LIW, LW
452
DOUBLE PRECISION FJACC(LJC,N), FVECC(M), W(LW), XC(N)
454
DOUBLE PRECISION XX1(300),XX2(300),XSTART,XSTEP
455
INTEGER ORD1, ORD2, IW(LIW), I
457
DOUBLE PRECISION PA, PI, WL, PA2, P2
458
DOUBLE PRECISION X10, X1, X13, S1, C1, R1, DKR1, DAR1
459
DOUBLE PRECISION X20, X2, X23, S2, C2, R2, DKR2, DAR2
461
COMMON/E04PAR/XSTART,XSTEP,ORD1,ORD2,XX1,XX2
462
DATA PI/3.1415926535897932D0/
468
WL = XSTART + (I-1)*XSTEP
469
X10 = ORD1 - XC(1)/WL
475
X20 = ORD2 - XC(1)/WL
481
IF (IFLAG.EQ.2) FVECC(I) = R1*R1/XX1(I) - R2*R2/XX2(I)
482
DKR1 = (PA2/(WL*X13))*(S1*S1-X1*S1*C1)
483
DKR2 = (PA2/(WL*X23))*(S2*S2-X2*S2*C2)
484
DAR1 = (X1*S1*C1-S1*S1)*P2*X10/X13
485
DAR2 = (X2*S2*C2-S2*S2)*P2*X20/X23
486
FJACC(I,1) = DKR1/XX1(I) - DKR2/XX2(I)
487
FJACC(I,2) = DAR1/XX1(I) - DAR2/XX2(I)
492
SUBROUTINE LSQMON(M,N,XC,FVECC,FJACC,LJC,S,IGRADE,NITER,NF,
495
C MONITORING SUBROUTINE
498
INTEGER M, N, LJC, IGRADE, NITER, NF, LIW, LW
499
DOUBLE PRECISION FJACC(LJC,N), FVECC(M), W(LW), XC(N), S(N)
502
C DOUBLE PRECISION FSUMSQ, GTG, G(50), F01DEF
505
C FSUMSQ = F01DEF(FVECC,FVECC, M)
506
C CALL LSQGRD(M, N, FVECC, FJACC, LJC, G)
507
C GTG = F01DEF(G,G,N)
508
C WRITE(6, 99999) NITER, NF, FSUMSQ, GTG, IGRADE
511
C WRITE(6, 99997) XC(J), G(J), S(J)
514
C99999 FORMAT(///' ITNS',4X,'F EVALS',10X, ' SUMSQ',13X,'GTG',
515
C . 8X,'GRADE'/1X I4,6X,I5,6X,1PE13.5,6X,1PE9.1,6X,I3)
516
C99998 FORMAT(/8X,'X',20X,'G',11X,'SINGULAR VALUES')
517
C99997 FORMAT(1X,1PE13.5,10X,1PE9.1,10X,1PE9.1)
520
SUBROUTINE LSQGRD(M, N, FVECC, FJACC, LJC, G)
524
DOUBLE PRECISION FVECC(M), FJACC(LJC, N), G(N)
531
SUM = SUM + FJACC(I, J)*FVECC(I)