1
C @(#)necrebi.for 19.1 (ESO-IPG) 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===========================================================================
32
C.COPYRIGHT: Copyright (c) 1987 European Southern Observatory,
35
C.VERSION: 1.0 ESO-FORTRAN Conversion, AA 10:37 - 11 JAN 1988
37
C.LANGUAGE: F77+ESOext
48
C 910128 P.Ballester Define and set variables
52
C ECHELLE, CASPEC, REBIN
56
C OBTAIN A 1D FRM CALIBRATED IN WAVELENGTHS FROM A 2D FRM
57
C OF TYPE ECHELLE WITH THE DISPERSION COEFFS DEFINED AS DESCRIPTORS
61
C EACH LINE IN THE INPUT FRM IS REBINNED IN LINEAR STEP IN WAVELENGTH
62
C ACCORDING TO THE DISPERSION COEFFS.
66
C REBIN/ECHELLE INPUT OUTPUT STEP [METHOD] [TABLE]
68
C REBIN/ECHELLE INPUT OUTPUT REFER_IMAGE [METHOD] [TABLE]
70
C METHOD CAN BE EITHER "NONLINEAR" - NON LINEAR REBINNING USING
71
C THE COEFFS IN THE TABLE
72
C "LINEAR" - LINEAR REBINNING
75
C [2.2] DEFINE THE SAMPLING DOMAIN VIA A REFER IMAGE
83
INTEGER MADRID, ID, IR
87
INTEGER ISTAT,NAXISA,NAXISB
88
INTEGER PIXBN, KUN,KNUL, NNNN
89
INTEGER NPIXA(3),NPIXB(3),IORD(2),IORD2(2),TID
90
INTEGER IORDER(100),NCOE(2),IA1(100),NPTOT(100)
91
DOUBLE PRECISION WSTART(100),STEPA(3),STARTA(3)
92
DOUBLE PRECISION STEPB(3),STARTB(3)
93
DOUBLE PRECISION WSTEP, A1(7,100)
95
CHARACTER*60 OUTFRM,INFRM,REFER,TABLE
96
CHARACTER METHOD*1, LINE*80, DSCNAM*8
97
CHARACTER IDENTA*72,CUNITA*64,CUNITB*64
99
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
100
COMMON /VMR/MADRID(1)
101
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
102
DATA CUNITB/'Flux Relative wavel.'/
103
DATA NPIXA /3*1/, STARTA /3*0.0/, STEPA /3*1.0/
104
DATA NPIXB /3*1/, STARTB /3*0.0/, STEPB /3*1.0/
106
C ... INITIALIZE SYSTEM
108
CALL STSPRO('ECHREB')
109
CALL STKRDC('IN_A',1,1,60,I,INFRM,KUN,KNUL,ISTAT)
110
CALL STKRDC('OUT_A',1,1,60,I,OUTFRM,KUN,KNUL,ISTAT)
111
CALL CLNFRA(INFRM,INFRM,0)
112
CALL CLNFRA(OUTFRM,OUTFRM,0)
113
CALL STKRDC('P3',1,1,60,I,REFER,KUN,KNUL,ISTAT)
114
CALL STKRDC('P4',1,1,1,I,METHOD,KUN,KNUL,ISTAT)
115
I1 = INDEX('.+1234567890',REFER(1:1))
117
CALL GENCNV(REFER,4,1,NNNN,XMIN,WSTEP,ISTAT)
118
IF (ISTAT.LT.1) CALL STETER(11,'Wrong sampling step')
120
WRITE(LINE,9010) WSTEP
121
CALL STTPUT(LINE,ISTAT)
125
CALL CLNFRA(REFER,REFER,0)
127
IF (METHOD.EQ.'N' .OR. METHOD.EQ.'n') THEN
128
CALL STKRDC('IN_B',1,1,60,I,TABLE,KUN,KNUL,ISTAT)
129
CALL CLNTAB(TABLE,TABLE,0)
130
CALL TBTOPN(TABLE,F_I_MODE,TID,ISTAT)
131
CALL STDRDI(TID,'ORDER',1,2,I,IORD,KUN,KNUL,ISTAT)
132
CALL STDRDI(TID,'COEFS',1,2,I,NCOE,KUN,KNUL,ISTAT)
133
CALL STDRDD(TID,'COEFD',1,7*NCOE(2),I,A1,
135
CALL STDRDI(TID,'COEFI',1,NCOE(2),I,IA1,
137
CALL TBTCLO(TID,ISTAT)
140
C ... MAP INPUT IMAGE
142
CALL STIGET(INFRM,D_R4_FORMAT,F_I_MODE,F_IMA_TYPE,
143
. 3,NAXISA,NPIXA,STARTA,STEPA,IDENTA,CUNITA,
146
IF (NAXISA.EQ.1 .OR. NPIXA(2).EQ.1) THEN
151
IF (NPIXA(2).GT.100) THEN
153
+ 'Module ECHRE31: Too many orders (limit 100). Buffer overflow')
156
IF (STEPA(2).NE.1.) THEN
157
CALL STETER(9,'Module ECHREBI: Wrong step(2) .ne. 1 ')
160
IORD2(1) = STARTA(2) ! Starting relative order number
161
IORD2(2) = STARTA(2) + NPIXA(2) - 1 ! Final relative order number
165
IF (METHOD.EQ.'N' .OR. METHOD.EQ.'n') THEN
168
CALL STFOPN(REFER,D_R4_FORMAT,0,F_IMA_TYPE,
170
CALL STDRDI(IR,'NPIX',1,2,I,NPIXB,KUN,KNUL,ISTAT)
171
CALL STDRDD(IR,'START',1,2,I,STARTB,KUN,KNUL,ISTAT)
172
CALL STDRDD(IR,'STEP',1,2,I,STEPB,KUN,KNUL,ISTAT)
174
CALL STDRDI(IR,'NORDER',1,NPIXB(2),I,IORDER,
176
CALL STDRDI(IR,'NPTOT',1,NPIXB(2),I,NPTOT,
178
CALL STDRDD(IR,'WSTART',1,NPIXB(2),I,WSTART,
181
WSTART(I) = WSTART(I)/1000.
184
CALL WRANGE(NCOE(2),A1,IA1,WSTEP,IORD,NPIXA(1),WSTART,
185
. NPIXB(1),NPTOT,IORDER,STARTA,STEPA,IORD2)
188
STARTB(2) = STARTA(2)
193
CALL STIPUT(OUTFRM,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
194
. NAXISB,NPIXB,STARTB,STEPB,
195
. IDENTA,CUNITB,IPNTRB,ID,ISTAT)
197
C ... NON LINEAR REBINNING
199
CALL ECHRE3(MADRID(IPNTRA),NPIXA(1),NPIXA(2),STARTA,STEPA,
200
. NCOE(2),A1,IA1,IORD,MADRID(IPNTRB),NPIXB(1),
201
. NPIXB(2),WSTART,WSTEP,IORD2)
203
C ... WRITE PROCESS DESCRIPTORS
205
NNNN = NPIXB(1)*NPIXB(2)
206
CALL MNMX(MADRID(IPNTRB),NNNN,XMIN,XMAX)
212
WSTART(I) = 1000.*WSTART(I)
214
CALL STDCOP(IMNO,ID,3,DSCNAM,ISTAT)
215
CALL STDWRD(ID,'WSTART',WSTART,1,NPIXB(2),KUN,ISTAT)
216
CALL STDWRI(ID,'NPTOT',NPTOT,1,NPIXB(2),KUN,ISTAT)
217
CALL STDWRI(ID,'NORDER',IORDER,1,NPIXB(2),KUN,ISTAT)
218
CALL STDWRR(ID,'LHCUTS',CUT,1,4,KUN,ISTAT)
220
C ... LINEAR REBINNING
221
IF (NPIXA(2).GT.1) THEN
222
CCCCCCCCCCCCC CALL STDFND(IMNO,'WSTART',I1,I2,I3,ISTAT)
223
C IF (TYPE(1:1).EQ.' ') THEN
224
C CALL STTPUT(' Wrong input image ... ',ISTAT)
227
CALL STDRDD(IMNO,'WSTART',1,NPIXA(2),I,WSTART,
229
CALL STDRDI(IMNO,'NPTOT',1,NPIXA(2),I,NPTOT,
232
CALL STDRDR(IMNO,'LHCUTS',1,4,I,CUT,KUN,KNUL,ISTAT)
233
PIXBN = STEPA(1)/WSTEP
235
NPIXB(1) = NPIXA(1)*PIXBN
237
STARTB(1) = STARTA(1)
238
STARTB(2) = STARTA(2)
241
IF (NPIXB(2).GT.1) THEN
243
NPTOT(I) = NPTOT(I)*PIXBN
246
WSTART(1) = STARTB(1)
249
CALL STIPUT(OUTFRM,D_R4_FORMAT,F_O_MODE,F_IMA_TYPE,
250
. NAXISB,NPIXB,STARTB,STEPB,IDENTA,
251
. CUNITB,IPNTRB,ID,ISTAT)
252
CALL ECHR01(MADRID(IPNTRA),NPIXA(1),NPIXA(2),STARTA,STEPA,
254
. MADRID(IPNTRB),NPIXB(1),NPIXB(2),WSTEP)
256
CALL STDCOP(IMNO,ID,3,DSCNAM,ISTAT)
257
IF (NPIXB(2).GT.1) THEN
258
CALL STDWRD(ID,'WSTART',WSTART,1,NPIXB(2),KUN,ISTAT)
259
CALL STDWRI(ID,'NPTOT',NPTOT,1,NPIXB(2),KUN,ISTAT)
261
CALL STDWRR(ID,'LHCUTS',CUT,1,4,KUN,ISTAT)
264
C10000 FORMAT(G<I1>.0)
266
9010 FORMAT(' Sampling step = ',F10.4)
269
SUBROUTINE ECHRE3(X,NPIXA1,NPIXA2,STARTA,STEPA,NO,A,IA,IORD,
270
+ Y,NPIXB1,NPIXB2,YSTR,YSTP,IORD2)
276
INTEGER NO, NPIXB1, NPIXB2
277
INTEGER NPIXA1,NPIXA2,IORD(2),IA(NO),IORD2(2)
278
REAL X(NPIXA1,NPIXA2)
279
REAL Y(NPIXB1,NPIXB2)
280
DOUBLE PRECISION YSTR(1), YSTP, STARTA(2), STEPA(2)
281
DOUBLE PRECISION A(7,NO),B1(3)
283
INTEGER KMIN, KMAX, I0, I2, I1, K1, II, MIN, MAX, I3
284
DOUBLE PRECISION WLSTP, WLST2
286
C ... GET LIMITS FOR THE FIRST ORDER (LOWER WAVELENGTHS)
288
KMIN = MIN(IORD(1),IORD(2))
289
KMAX = MAX(IORD(1),IORD(2))
290
IF (IORD(1).LT.IORD(2)) THEN
300
C ... ITERATION ON ORDERS
302
DO 20 K1 = IORD2(2), IORD2(1), -1
303
I3 = I1 + IORD2(1) - 1
304
IF (IA(I3).LT.0) THEN
310
IF (IA(I3).LT.0) THEN
311
CALL LREBIN(X(1,I1),NPIXA1,STARTA,STEPA,B1,3,Y(1,I1),
312
+ NPIXB1,WLST2,WLSTP)
319
CALL LREBI1(X(1,I1),NPIXA1,STARTA,STEPA,A(1,I3),IA(I3),
320
+ Y(1,I1),NPIXB1,WLST2,WLSTP)
328
DOUBLE PRECISION FUNCTION POLEV(IA,A,XX)
335
DOUBLE PRECISION A(IA),XX,YY
337
YY = A(1) + XX* (A(2)+XX* (A(3)+XX* (A(4)+XX* (A(5)+XX* (A(6)+
343
SUBROUTINE MNMX(X,N,XMIN,XMAX)
349
REAL X(N), XMIN, XMAX
356
XMIN = AMIN1(XMIN,X(I))
357
XMAX = AMAX1(XMAX,X(I))
362
SUBROUTINE WRANGE(NCOE,A,IA,WSTEP,IORD,NPIXA,WSTART,NPIXB,NPTOT,
363
+ IORDER,STARTA,STEPA,IORD2)
365
C GET STARTING POSITIONS FOR EACH ORDER AND NO. OF PIXELS PER ORDER
368
C ... GET LIMITS FOR THE FIRST ORDER (LOWER WAVELENGTHS)
372
INTEGER NCOE, NPIXA, NPIXB
373
DOUBLE PRECISION A(7,NCOE),POLEV,B(3), STARTA(1), STEPA(1)
374
DOUBLE PRECISION WSTART(1), WSTEP, WLST1, WLEN1
375
INTEGER IA(NCOE),IORD(2),NPTOT(1),IORDER(1), IORD2(2)
377
INTEGER KMIN, KMAX, I0, I1, I2, I, ISTEP, K, N1, I3
379
DOUBLE PRECISION WS1, WW1, IX_IR8
381
KMIN = MIN(IORD(1),IORD(2))
382
KMAX = MAX(IORD(1),IORD(2))
383
IF (IORD(1).LT.IORD(2)) THEN
394
C ... get order number
397
IF (IORD(1).GT.IORD(2)) ISTEP = -1 ! Default case in present versions
398
IORDER(1) = IORD(1) - IORD2(1) + 1
399
DO 10 I = 2, IORD2(2) - IORD2(1) + 1
400
IORDER(I) = IORDER(I-1) + ISTEP
403
C ... iteration on orders to get starting wavelength and no. of pixels
405
DO 20 K = IORD2(2), IORD2(1), -1
406
I3 = I1 + IORD2(1) - 1
407
IF (IA(I3).LT.0) THEN
411
CALL ECHORD(B,3,NPIXA,WLST1,WLEN1,STARTA,STEPA)
413
WW1 = POLEV(IA(I3),A(1,I3),IX_IR8(1,STARTA,STEPA))
415
WW1 = POLEV(IA(I3),A(1,I3),IX_IR8(NPIXA,STARTA,STEPA))
420
N1 = (WLEN1-WLST1)/WS1
421
IF (N1.GT.65534) THEN !added swolf@eso.org
422
N1 = 0 !if WLEN1 and WLST1 are NaN N1 gets wrong!
423
ENDIF !--> NPIXB gets wrong, too!
425
NPIXB = MAX(NPIXB,N1)
427
WSTART(I1) = WS1*NINT(WLST1/WS1) !before: WLST1 (swolf@eso.org)
429
WSTART(I1) = WSTART(I0) + WS1*NINT((WLST1-WSTART(I0))/WS1)
432
IF (I1.GT.NCOE) GO TO 30
438
SUBROUTINE ECHR01(A,NPIXA1,NPIXA2,STARTA,STEPA,NPTOT,WSTART,
439
+ B,NPIXB1,NPIXB2,WSTEP)
441
C REBIN ECHELLE ORDERS
445
INTEGER NPIXA1,NPIXA2,NPIXB1,NPIXB2
446
DOUBLE PRECISION STEPA(2),STARTA(2)
447
REAL A(NPIXA1,NPIXA2),B(NPIXB1,NPIXB2)
448
DOUBLE PRECISION WSTART(NPIXA2), WSTEP
449
INTEGER NPTOT(NPIXA2)
451
INTEGER NORD, IORD, I, NPREB
452
DOUBLE PRECISION XSTART, XP, ADEX, PIXBN
455
PIXBN = WSTEP/STEPA(1)
458
XSTART = WSTART(IORD)
461
XP = XSTART + (I-1)*WSTEP
462
ADEX = (XP-XSTART)/STEPA(1) + 1.
463
B(I,IORD) = VBIN(A(1,IORD),PIXBN,ADEX)
465
DO 20 I = NPREB + 1,NPIXB1
472
REAL FUNCTION VBIN(ARRAY,PIXPBN,ADEX)
474
C FUNCTION TO RETURN A VALUE FOR A REBINNED BIN
477
C ARRAY REAL*4 ARRAY WITH REAL ORIGINAL PIXELS
478
C PIXPBN REAL*4 PIXELS PER BIN, NUMBER OF ORIGINAL
479
C PIXELS IN THE NEW BIN, WITH FRACTIONS
480
C ADEX REAL*4 CENTER INDEX IN THE ARRAY FOR THE NEW BIN,
484
INTEGER IBOTDX,ITOPDX,IENLP,I,ISTLP
485
REAL HBIN,BOTDX,TOPDX,SUM,BOTFRA,TOPFRA
487
DOUBLE PRECISION PIXPBN, ADEX
489
HBIN = PIXPBN*0.5 ! BOTTOM POINTER, FRACTION
490
BOTDX = ADEX - HBIN ! TOP POINTER, FRACTION
491
TOPDX = ADEX + HBIN ! BOTTOM POINTER, WITHOUT FRACTION
492
IBOTDX = BOTDX ! TOP POINTER, WITHOUT FRACTION
495
IF (IBOTDX.EQ.ITOPDX) THEN
497
C BIN SMALLER THAN ORIGINAL PIXELS
498
C AND NEW BIN WITHIN AN ORIGINAL PIXEL
500
SUM = PIXPBN*ARRAY(IBOTDX+1)
503
C BIN LARGER THAN ORIGINAL PIXELS, OR
504
C SMALL BIN OVER TWO PIXELS
506
BOTFRA = 1. - (BOTDX-FLOAT(IBOTDX))
507
TOPFRA = TOPDX - FLOAT(ITOPDX) ! START LOOP INDEX
514
IF (IENLP.GE.ISTLP) THEN
515
DO 10 I = ISTLP,IENLP
518
END IF ! LOWER FRACTION
519
SUM = SUM + BOTFRA*ARRAY(IBOTDX) ! UPPER FRACTION
520
SUM = SUM + TOPFRA*ARRAY(ITOPDX)
529
SUBROUTINE ECHORD(AC,NC,NPIX,W1,W2,STARTA,STEPA)
532
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
533
C.COPYRIGHT: Copyright (c) 1987 European Southern Observatory,
534
C all rights reserved
536
C.VERSION: 1.0 ESO-FORTRAN Conversion, AA 22:34 - 3 DEC 1987
538
C.LANGUAGE: F77+ESOext
543
C SPECTROSCOPY, CASPEC, ORDER DEFINITION
546
C GET WAVELENGTH RANGE OF A GIVEN ORDER
553
C AC(NC) REAL*8 COEFFICIENTS OF THE TRANSFORMATION
554
C NC REAL*4 NO. OF COEFFICIENTS
555
C NPIX INTG*4 NO OF SAMPLES
559
C W1 REAL*4 LOWER LIMIT
560
C W2 REAL*4 UPPER LIMIT
562
C-------------------------------------------------------------
567
DOUBLE PRECISION AC(NC), STARTA(1), STEPA(1)
568
DOUBLE PRECISION W1, W2, IX_IR8
570
DOUBLE PRECISION A0,A1,A2,F1,FN
578
F1 = IX_IR8(1,STARTA(1),STEPA(1))
579
FN = IX_IR8(NPIX,STARTA(1),STEPA(1))
585
W1 = (-A1+DSQRT(A1*A1-4.D0*A2* (A0-F1)))/ (2.D0*A2)
586
W2 = (-A1+DSQRT(A1*A1-4.D0*A2* (A0-FN)))/ (2.D0*A2)
596
SUBROUTINE LREBI1(X,NX,XSTR,XSTP,AC,NC,Y,NY,YSTR,YSTP)
599
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
600
C.COPYRIGHT: Copyright (c) 1987 European Southern Observatory,
601
C all rights reserved
603
C.VERSION: 1.0 ESO-FORTRAN Conversion, AA 0:22 - 4 DEC 1987
605
C.LANGUAGE: F77+ESOext
610
C SUBROUTINE LREBIN1 VERSION 1 22 MAR 1983
614
C SPECTROSCOPY, CASPEC, REBINNING
618
C CONVERSION FROM SAMPLES INTO WAVELENGTHS
621
C LINEAR INTERPOLATION. THE TRANSFORMATION SAMPLE NUMBER INTO
622
C WAVELENGTH IS DEFINED BY
623
C W = A0 + A1*S + A2*S**2 + ...
628
C X(NX) REAL*4 INPUT ARRAY
629
C NX INTG*4 NO OF SAMPLES
630
C XSTR REAL*4 STARTING VALUE OF INPUT
631
C XSTP REAL*4 INPUT STEP
632
C AC(NC) REAL*8 COEFFICIENTS OF THE TRANSFORMATION
633
C NC REAL*4 NO. OF COEFFICIENTS
634
C NY INTG*4 NO. OF OUTPUT VALUES
635
C YSTR REAL*4 STARTING VALUE OF THE INPUT
636
C YSTP REAL*4 STEP OF THE OUTPUT
640
C Y(NY) REAL*4 OUTPUT ARRAY
642
C-------------------------------------------------------------
648
DOUBLE PRECISION YSTR, YSTP, XSTR, XSTP
650
DOUBLE PRECISION AC(NC),A0,A1,A2,A3,A4,A5,A6,FN,FL,WPOLY
651
DOUBLE PRECISION FACTOR,DPOLY,CNORM, IX_R8R8, XN, XNP1
652
DOUBLE PRECISION PN,PNP1,TM,TMP1,C,COV,VAL, COVX
653
DOUBLE PRECISION B2, B3, B4, B5, B6, DELT, STARTL
654
INTEGER M1, MST, N, K, MPT
656
WPOLY(FL) = A0 + FL* (A1+FL* (A2+FL* (A3+FL* (A4+FL* (A5+FL*
658
DPOLY(FL) = A1 + FL* (B2+FL* (B3+FL* (B4+FL* (B5+FL*B6))))
677
C ... CHECK FOR OUTPUT START
679
STARTL = YSTR - 0.5*YSTP
681
XN = IX_R8R8(FN,XSTR,XSTP)
695
C ... CHECK FOR INPUT START
699
XNP1 = IX_R8R8(FN,XSTR,XSTP)
700
PNP1 = 10.D0*WPOLY(XNP1)
702
IF (PNP1.GT.TM) GO TO 20
711
COV = (PNP1 - PN)/COVX
719
IF ( .NOT. (MPT.LE.NY)) GO TO 80
721
IF ((K.LT.M1) .OR. (N.GT.NX)) GO TO 60
723
40 IF (PNP1.EQ.PN) GO TO 90
724
VAL = VAL + C* (DMIN1(TMP1,PNP1)-DMAX1(TM,PN))/COV
725
IF (TMP1.LT.PNP1) GO TO 50
727
IF (N.GT.NX) GO TO 60
733
XNP1 = IX_R8R8(FN,XSTR,XSTP)
734
PNP1 = 10.D0*WPOLY(XNP1)
737
COV = (PNP1 - PN)/(XNP1-XN)
742
60 FACTOR = CNORM*DPOLY(IX_R8R8(FN,XSTR,XSTP))
743
C FACTOR = FACTOR*10.D0*DABS(DPOLY(IX_R8R8(FN,XSTR,XSTP)))/YSTP
750
DO 100 K = MPT + 1,NY
756
SUBROUTINE LREBIN(X,NX,XSTR,XSTP,AC,NC,Y,NY,YSTR,YSTP)
759
C++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
760
C.COPYRIGHT: Copyright (c) 1987 European Southern Observatory,
761
C all rights reserved
763
C.VERSION: 1.0 ESO-FORTRAN Conversion, AA 19:08 - 6 DEC 1987
765
C.LANGUAGE: F77+ESOext
770
C SPECTROSCOPY, CASPEC, REBINNING
774
C CONVERSION FROM SAMPLES INTO WAVELENGTHS
777
C LINEAR INTERPOLATION. THE TRANSFORMATION WAVELENGTH INTO
778
C SAMPLE NUMBER IS DEFINED BY
779
C S = A0+A1*T+A2*T**2
784
C X(NX) REAL*4 INPUT ARRAY
785
C NX INTG*4 NO OF SAMPLES
786
C XSTR REAL*4 STARTING VALUE OF INPUT
787
C XSTP REAL*4 INPUT STEP
788
C AC(NC) REAL*8 COEFFICIENTS OF THE TRANSFORMATION
789
C NC REAL*4 NO. OF COEFFICIENTS
790
C NY INTG*4 NO. OF OUTPUT VALUES
791
C YSTR REAL*4 STARTING VALUE OF THE INPUT
792
C YSTP REAL*4 STEP OF THE OUTPUT
796
C Y(NY) REAL*4 OUTPUT ARRAY
798
C-------------------------------------------------------------
802
INTEGER NX, NY, NC, N, M1
804
DOUBLE PRECISION AC(NC),A0,A1,A2,A3,A4,A5,FN
805
DOUBLE PRECISION FACTOR,CNORM, START, PN, DELT, STARTL
806
DOUBLE PRECISION TM, TMP1
807
DOUBLE PRECISION IX_R8R8
808
DOUBLE PRECISION XSTR, XSTP, YSTR, YSTP
811
DOUBLE PRECISION PNP1, C, VAL, COV, DSQRT, DMIN1, DMAX1
812
DOUBLE PRECISION XN, XNP1, COVX
814
C WPOLY(FL) = FL*(A1+FL*(A2+FL*(A3+FL*(A4+FL*A5))))
824
CNORM = 10.D0/ (A5*YSTP)
829
C ... CHECK FOR OUTPUT START
831
START = YSTR - 0.5*YSTP
836
XN = IX_R8R8(FN,XSTR,XSTP)
838
C PN = WPOLY(IX_R8R8(FN,XSTR,XSTP))
839
PN = 10.D0* (A1+DSQRT(A3-A4* (A0-XN)))/A5
843
TMP1 = STARTL + M1*YSTP
850
C ... CHECK FOR INPUT START
854
XNP1 = IX_R8R8(FN,XSTR,XSTP)
856
C PNP1 = WPOLY(IX_R8R8(FN,XSTR,XSTP))
857
PNP1 = 10.D0* (A1+DSQRT(A3-A4* (A0-XNP1)))/A5
858
IF (PNP1.GT.TM) GO TO 20
867
COV = (PNP1 - PN)/COVX
875
IF ( .NOT. (MPT.LE.NY)) GO TO 80
877
IF ((K.LT.M1) .OR. (N.GT.NX)) GO TO 60
878
40 VAL = VAL + C* (DMIN1(TMP1,PNP1)-DMAX1(TM,PN))/COV
879
IF (TMP1.LT.PNP1) GO TO 50
881
IF (N.GT.NX) GO TO 60
885
XNP1 = IX_R8R8(FN,XSTR,XSTP)
886
C PNP1 = WPOLY(IX_R8R8(FN,XSTR,XSTP))
887
PNP1 = 10.D0* (A1+DSQRT(A3-A4* (A0-XNP1)))/A5
892
COV = (PNP1 - PN)/COVX
897
60 FACTOR = CNORM*(DSQRT(A3-A4* (A0-XNP1))-
898
+ DSQRT(A3-A4* (A0-XNP1-1.D0)))