1
C @(#)tdcspl.for 19.1 (ESO-DMD) 02/25/03 14:11:16
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===========================================================================
30
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
31
C.COPYRIGHT: Copyright (c) 1987 European Southern Observatory,
34
C.VERSION: 1.0 ESO-FORTRAN Conversion, AA 14:27 - 19 NOV 1987
36
C.LANGUAGE: F77+ESOext
46
C TABLE TO IMAGE CONVERSION
48
C CONV/TAB image = table colx [z] refima SPLINE deg
52
C table, image, conversion
57
C spline interpolation
59
C Ref.: P.Diercxx, 1982, Computer Graphics and Image Processing
63
C M Peron 071190 , in order to avoid a shift in the output frame
68
C-----------------------------------------------------------
75
INTEGER ICOL(3),NPTOT(100),NPIX(2)
78
INTEGER STATUS, N1, IDEGR, NPAR, ISTAT, NN, NAXIS, NO, NB
79
INTEGER NBY, TID, IS, NCOL, NROW, NSC, NAC, NAR, I, IREF
80
INTEGER I1, I2, NDIM, KUN, KNUL
82
INTEGER*8 IP1, IP2, IP3, PNTR
84
REAL S,SS,DELTA,YMAX,YMIN
85
REAL STEP(2),START(2),RMIN,RMAX
86
REAL CUTS(4),WSTART(100)
89
DOUBLE PRECISION DSTART(2), DSTEP(2)
92
CHARACTER*80 TABLE,IMAGE,REFIMA
94
CHARACTER*17 COLREF(2)
99
INCLUDE 'MID_INCLUDE:TABLES.INC'
100
COMMON /VMR/MADRID(1)
101
INCLUDE 'MID_INCLUDE:TABLED.INC'
104
DATA MSG/'ERR:TCONVTBLxxxx'/
109
C ... get input parameters + default
111
CALL TDPGET(PNVALS,NPAR,ISTAT)
112
IF (ISTAT.NE.0) GO TO 30
115
COLREF(1) = TPARBF(4)
116
COLREF(2) = TPARBF(5)
118
CALL STKRDR('INPUTR',1,1,NN,SS,KUN,KNUL,ISTAT)
119
CALL STKRDR('INPUTR',2,1,NN,S,KUN,KNUL,ISTAT)
121
C .................................... change parameters
124
CALL STFOPN(REFIMA,D_R4_FORMAT,0,F_IMA_TYPE,IREF,ISTAT)
125
CALL STDRDI(IREF,'NAXIS',1,1,NN,NAXIS,KUN,KNUL,ISTAT)
126
CALL STDRDI(IREF,'NPIX',1,NAXIS,NN,NPIX,KUN,KNUL,ISTAT)
127
CALL STDRDD(IREF,'START',1,NAXIS,NN,DSTART,KUN,KNUL,ISTAT)
130
CALL STDRDD(IREF,'STEP',1,NAXIS,NN,DSTEP,KUN,KNUL,ISTAT)
133
IF (NAXIS.GT.1 .AND. NPIX(2).GT.1) THEN
135
CALL STDFND(IREF,'WSTART',TYPE,NO,NB,ISTAT)
136
IF (TYPE(1:1).EQ.' ') THEN
137
CALL STTPUT(' Wrong reference image ',ISTAT)
141
. (IREF,'WSTART',1,NPIX(2),NN,WSTART,KUN,KNUL,ISTAT)
143
. (IREF,'NPTOT',1,NPIX(2),NN,NPTOT,KUN,KNUL,ISTAT)
145
. (IREF,'NORDER',1,NPIX(2),NN,NORDER,KUN,KNUL,ISTAT)
153
C ... init input table
156
CALL TBTOPN(TABLE,F_I_MODE,TID,STATUS)
157
IF (ISTAT.NE.0) GO TO 30
158
CALL TBIGET(TID,NCOL,NROW,NSC,NAC,NAR,ISTAT)
159
IF (ISTAT.NE.0) GO TO 30
161
C ... find input column
164
CALL TBCSER(TID,COLREF(I),ICOL(I),ISTAT)
165
IF (ICOL(I).EQ.-1) THEN
169
CALL TBUGET(TID,ICOL(I),WORK,ISTAT)
172
CUNIT(I1:I2) = WORK(1:16)
175
C ... copy selected values of the table into work space
178
CALL TDMGET(NBY,IP1,IS)
179
CALL TDMGET(NBY,IP2,IS)
180
CALL TDMGET(NBY,IP3,IS)
181
CALL ACOPY(TID,ICOL(1),ICOL(2),NROW,
182
+ MADRID(IP1),MADRID(IP2),MADRID(IP3),YMIN,YMAX,N1)
183
IF (N1.LT.IDEGR+1) THEN
184
CALL STTPUT(' Not enough points in table ',ISTAT)
192
I2 = INDEX(TABLE,' ')
193
IF (I2.lt.1) I2 = LEN(TABLE)
194
IDENT = 'TABLE: '//TABLE(1:I2)//'COLS. :'//COLREF(1)//COLREF(2)
195
CALL STIPUT(IMAGE,10,1,1,NDIM,NPIX,DSTART,DSTEP,IDENT,CUNIT,
198
C ... interpolate from table values
201
SS = DELTA* (DELTA*0.5+YMIN)*SS*0.01
202
CALL AINTER(N1,MADRID(IP1),MADRID(IP2),NPIX(1),NPIX(2),
203
+ MADRID(PNTR),START,STEP,WSTART,NPTOT,RMIN,RMAX,
204
+ MADRID(IP3),IDEGR,SS,T,C,NRDATA)
212
CALL STDWRR(IMNO,'LHCUTS',CUTS,1,4,KUN,ISTAT)
213
IF (NPIX(2).GT.1) THEN
214
CALL STDWRR(IMNO,'WSTART',WSTART,1,NPIX(2),KUN,ISTAT)
215
CALL STDWRI(IMNO,'NPTOT',NPTOT,1,NPIX(2),KUN,ISTAT)
216
CALL STDWRI(IMNO,'NORDER',NORDER,1,NPIX(2),KUN,ISTAT)
221
20 CALL TDMFRE(NBY,IP1,IS)
222
CALL TDMFRE(NBY,IP2,IS)
223
CALL TDMFRE(NBY,IP3,IS)
227
CALL DSCUPT(IMNO,IMNO,' ',ISTAT)
228
CALL TBTCLO(TID,ISTAT)
229
30 IF (ISTAT.NE.0) THEN
230
WRITE (MSG(13:16),9000) ISTAT
231
CALL TDERRR(ISTAT,MSG,STATUS)
237
SUBROUTINE ACOPY(TID,ICOL1,ICOL2,NROW,X1,Y1,W,YMIN,YMAX,N1)
239
C copy relevant part of the table
243
INTEGER TID, ICOL1, ICOL2
248
REAL X1(NROW),Y1(NROW), X, Y
251
LOGICAL ISEL, INULL1, INULL2
256
CALL TBSGET(TID,I,ISEL,STATUS)
257
CALL TBERDR(TID,I,ICOL1,X,INULL1,STATUS)
258
CALL TBERDR(TID,I,ICOL2,Y,INULL2,STATUS)
259
IF (ISEL.AND. .NOT.INULL1 .AND. .NOT.INULL2) THEN
268
IF (Y.GT.YMAX) YMAX = Y
269
IF (Y.LT.YMIN) YMIN = Y
276
SUBROUTINE AINTER(NROW,X,Y,NPIX1,NPIX2,F,START,STEP,WSTART,NPTOT,
277
+ RMIN,RMAX,W,IDEGR,S,T,C,NRDATA)
279
C call for each order to the interpolation routine
284
INTEGER NROW,NPIX1, NPIX2,IDEGR
286
INTEGER ISTAT, NRDATA(1),NBYTES
287
INTEGER IORD, NP, I, NK1, LD, NK, NPLUS,IERR
291
REAL X(NROW),WSTART(NPIX2),F(NPIX1,NPIX2)
292
REAL Y(NROW),START(2),STEP(2),RMIN,RMAX,S
294
REAL DERIV, STARTX, STEPX, ENDX, VAL, XP, FP, FP0
295
REAL FPOLD, AMIN1, AMAX1
297
INCLUDE 'MID_INCLUDE:TABLES.INC'
298
COMMON /VMR/MADRID(1)
299
INCLUDE 'MID_INCLUDE:TABLED.INC'
307
C NBYTES = NROW*6 M.Peron 23/07/93
308
CALL TDMGET(NBYTES,IPQ,ISTAT)
312
DO 50, IORD = 1,NPIX2
314
C STARTX = WSTART(IORD)
318
C ... loop for each point W(1), IDEGR, S, T(1), C(1), NRDATA(1)
320
C ENDX = STARTX + (NP-1)*STEPX
323
CALL SMOOT(X,Y,W,MADRID(IPQ),NROW,STARTX,ENDX,IDEGR,S,NK,T,
324
+ C,FP,0,IERR,NRDATA,FP0,FPOLD,NPLUS)
326
. CALL STTPUT('Polynomial approximation',ISTAT)
328
. CALL STTPUT('Local storage exceeded (S too small)',ISTAT)
330
. CALL STTPUT('Tolerance parameter too small',ISTAT)
332
. CALL STTPUT('Maximum number of iter. exceeded',ISTAT)
334
. CALL STTPUT('Invalid input arguments',ISTAT)
335
IF (IERR.GT.0) RETURN
338
IF (NPIX2.EQ.1) STARTX = START(1)
340
XP = STARTX + (I-1)*STEPX
341
10 IF ((XP.LT.T(LD+1)) .OR. (LD.EQ.NK1)) GO TO 20
344
20 VAL = DERIV(T,NK,C,NK1,0,XP,LD)
345
RMIN = AMIN1(RMIN,VAL)
346
RMAX = AMAX1(RMAX,VAL)
349
DO 40, I = NP + 1,NPIX1
353
CALL TDMFRE(NBYTES,IPQ,ISTAT)