1
C @(#)fitcon.for 19.1 (ESO-DMD) 02/25/03 13:17:46
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===========================================================================
29
SUBROUTINE FITCON(ALGOR,BNDTYP,ISTAT)
30
C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
39
C makes the interface between the MIDAS data structures and the NAG
40
C routines for non linear LSQ problems with constraints
43
C Constrained Non-linear Least Square, Constrained Non-linear Fitting,
44
C Constrained Non-linear Regression, FIT/TABLE, FIT/IMAGE,
45
C Corrected Gauss-Newton Method, Quasi-Newton Method, Modified
49
C Recovers qualifiers and parameters from MIDAS keywords;
51
C Give virtual memory for calculations in NAG routines;
52
C Call the NAG routines for non-linear least squares problems;
53
C Display information messages;
54
C Compute errors on parameters.
56
C CHECK CALLING SEQUENCE OF E04KAF,E04KBF,E04KCF,E04KDF
57
C LAST TWO ARGUMENTS...
67
C CALL FITCON(ALGOR,BNDTYP,ISTAT)
70
C ALGOR (*) CHARACTER algorithm to be used.
72
C BNDTYP (*) CHARACTER Bounds types
74
C ISTAT INTEGER exit status
86
C NAG library (E04___)
87
C MINMSQ (message display)
90
C Ph. DEFERT, Feb 1986
96
C NAG Mark II Vol 3 (E04)
97
C Algorithms for the Solution of non-linear least squares problem
98
C SIAM J. on Num. An.,15,977-992,1978
102
C-----------------------------------------------------------------------
105
C .. Scalar Arguments ..
106
CHARACTER ALGOR* (*),BNDTYP* (*)
107
INTEGER ISTAT ,KUN,KNUL,TID,TID1
109
C .. Scalars in Common ..
113
C .. Arrays in Common ..
117
C .. Local Scalars ..
118
INTEGER I,IDAT,IFAIL1,IFAIL3,J,K,LIW,LW,NC,NROW,NRFEVA,
120
INTEGER IBOUND,LHSL,IMIN,IMAX,NRBND,ROUTIN
121
INTEGER NAC,NAR,STAT,NAC1,NAR1,NBYT
122
INTEGER*8 PTRW,PTRIW,PTRDLT,PTRHSL,PTRHSD,PTRSTA,PTRGRD
124
DOUBLE PRECISION FSUMSQ
125
DOUBLE PRECISION HMIN,HMAX
127
LOGICAL VALID,ISEL,NOMPAR,VCMATPR
128
CHARACTER WGTKEY*10,LINE*78,BNDTAB*60
136
C .. External Files ..
137
INCLUDE 'MID_INCLUDE:ST_DEF.INC'
138
INCLUDE 'MID_INCLUDE:FITNAGI.INC'
140
COMMON /LSQFUN/ICOL,NRCOL,ISTAR,WGTTYP
141
INCLUDE 'MID_INCLUDE:FITNAGC.INC'
142
EXTERNAL E04LBS,E04JBQ,FUNCT3,FUNCT4,MINMON
144
INCLUDE 'MID_INCLUDE:ST_DAT.INC'
145
DATA WGTKEY(1:10)/'FITCHAR '/
148
C Executable Statements
150
C Initialize parameters and compute number of fixed parameters
152
VCMATPR = METPAR(1) .LT. 0.
153
METPAR(1) = ABS(METPAR(1))
157
IF (METPAR(2).GE.0) PARAM(J) = PARINI(J)
158
IF (FIXPAR(J).GE.0) NRPFIX = NRPFIX + 1
160
METPAR(2) = ABS(METPAR(2))
162
C Get the type of weighting from FITCHAR 13:13
164
CALL STKRDC(WGTKEY,1,FZIWGT,1,K,WGTTYP,
166
CALL UPCAS(WGTTYP,WGTTYP)
167
IF (WGTTYP(1:1).NE.'C' .AND. WGTTYP(1:1).NE.'W' .AND.
168
+ WGTTYP(1:1).NE.'I' .AND. WGTTYP(1:1).NE.'S') CALL STETER(12,
169
+ 'FIT/TABLE: Weight type mismatch')
171
IF (FILTYP(1:1).EQ.'T') THEN
173
C Get the selected columns for indep and dep variables
175
IF (WGTCOL.EQ.0) THEN
189
ICOL(I+2) = INDCOL(I)
192
C Get number of selected rows in the table (nr of residuals)
195
CALL TBIGET(FZIDEN,NC,NROW,NS,NAC,NAR,STAT)
197
CALL TBSGET(FZIDEN,IDAT,ISEL,ISTAT)
198
IF ( .NOT. ISEL) GO TO 40
199
CALL TBRRDR(FZIDEN,IDAT,NRCOL,ICOL(ISTAR),
200
+ XVAL(ISTAR),NULL,ISTAT)
203
VALID = VALID .AND. ( .NOT. NULL(K))
205
IF (VALID) NRDATA = NRDATA + 1
210
C Get the number of residuals for FIT/IMAG
212
NRDATA = NRPIX(1)*NRPIX(2)*NRPIX(3)
216
C Get qualifiers of the FIT command : PRINT,MAX. NR. Of F. EVAL,
217
C PRECISION,ETA and STEP. NOMPAR detects if method parameters
218
C have been given or are all to be defaulted.
220
NOMPAR = METPAR(1) .LT. 0.1
221
IF (ABS(ABS(METPAR(3))-999999.).LT.1.E-6) THEN
228
IF (ABS(ABS(METPAR(2))-999999.).LT.1.E-6) THEN
229
IF (ALGOR(1:5).EQ.'CGNND') THEN
230
METPAR(2) = 40*NRPARAM* (NRPARAM+5)
232
ELSE IF (ALGOR(1:2).EQ.'QN') THEN
233
METPAR(2) = 100*NRPARAM
235
ELSE IF (ALGOR(1:3).EQ.'MGN') THEN
236
METPAR(2) = 50*NRPARAM
243
IF (ABS(ABS(METPAR(4))-999999.).LT.1.E-6) THEN
244
IF (NRPARAM.EQ.1) THEN
248
IF (ALGOR(1:5).EQ.'CGNND') THEN
251
ELSE IF (ALGOR(1:2).EQ.'QN') THEN
254
ELSE IF (ALGOR(1:3).EQ.'MGN') THEN
255
IF (NRPARAM.LT.10) THEN
258
ELSE IF (NRPARAM.LE.20) THEN
273
IF (ABS(ABS(METPAR(5))-999999.).LT.1.E-6) THEN
280
C Get the bounds and store them in PARLOW and PARUPP
282
IF (BNDTYP(1:1).EQ.'G') THEN
284
CALL STKRDC('BNDTAB',1,1,60,K,BNDTAB,KUN,KNUL,ISTAT)
285
IF (BNDTAB(1:1).EQ.'+') THEN
286
CALL STTPUT('Bounds table not defined',ISTAT)
289
CALL TBTOPN(BNDTAB,F_IO_MODE,TID,ISTAT)
290
CALL TBIGET(TID,NC,NRBND,NS,NAC1,NAR1,ISTAT)
292
CALL STETER(12,'FIT/... : Error in bounds table')
294
ELSE IF (NC.GT.2) THEN
295
CALL STTPUT('*** WARN-FIT : Bounds table more than'//
296
+ ' 2 columns, take first ones ***',ISTAT)
300
CALL STTPUT('*** WARN-FIT : Bounds table more than'//
301
+ ' 1 row, global bounds taken as first one ***'
305
CALL TBSGET(TID,1,ISEL,ISTAT)
308
CALL TBRRDR(TID,1,2,ICOL,
310
VALID = ISEL .AND. ((.NOT.NULL(1)) .OR. (.NOT.NULL(2)))
311
IF ( .NOT. VALID) CALL STETER(8,
312
+ ' FIT/TABLE : Global bounds not founds'
314
IF ( .NOT. NULL(1)) THEN
321
IF ( .NOT. NULL(2)) THEN
330
CALL STTPUT(' Lower Bound Upper Bound',ISTAT)
331
WRITE (LINE,9000) PARLOW(1),PARUPP(1)
332
CALL STTPUT(LINE,ISTAT)
333
CALL STTPUT(' ',ISTAT)
335
ELSE IF (BNDTYP(1:1).EQ.'I') THEN
337
CALL STKRDC('BNDTAB',1,1,60,K,BNDTAB,KUN,KNUL,ISTAT)
338
IF (BNDTAB(1:1).EQ.'+') THEN
339
CALL STTPUT('Bounds table not defined',ISTAT)
342
CALL TBTOPN(BNDTAB,F_IO_MODE,TID1,ISTAT)
343
CALL TBIGET(TID1,NC,NRBND,NS,NAC1,NAR1,ISTAT)
345
CALL STETER(12,'FIT/... : Error in bounds table')
347
ELSE IF (NC.GT.2) THEN
348
CALL STTPUT('*** WARN-FIT : Bounds table more than'//
349
+ ' 2 columns, take first ones ***',STATUS)
352
IF (NRBND.GT.NRPARAM) THEN
353
CALL STTPUT('*** WARN-FIT : Bounds table has more '//
354
+ 'rows than parameters, take first ones ***',
358
DO 50 IDAT = 1,MIN0(NRBND,NRPARAM)
359
CALL TBSGET(TID1,IDAT,ISEL,STATUS)
363
CALL TBRRDR(TID1,IDAT,2,ICOL,
365
IF ( .NOT. NULL(1)) THEN
366
PARLOW(IDAT) = XVAL(1)
369
PARLOW(IDAT) = -1.D+6
372
IF ( .NOT. NULL(2)) THEN
373
PARUPP(IDAT) = XVAL(2)
380
PARLOW(IDAT) = -1.D+6
385
IF (NRBND.LT.NRPARAM) THEN
386
DO 60 IDAT = NRBND + 1,NRPARAM
387
PARLOW(IDAT) = -1.D+6
393
+ ' Initial values Lower Bounds Upper Bounds'
396
WRITE (LINE,9010) PARAM(K),PARLOW(K),PARUPP(K)
397
CALL STTPUT(LINE,STATUS)
399
CALL STTPUT(' ',STATUS)
401
ELSE IF (BNDTYP(1:1).EQ.'P') THEN
402
CALL STTPUT(' Parameters must be positive',STATUS)
406
C Call to the NAG routines after having displayed the parameters and
407
C get the necessary V.M. space.
411
IF (ALGOR(1:5).EQ.'CGNND') THEN
412
CALL STTPUT(' ',STATUS)
414
+ ' Constrained Non-linear Least Squares Fitting : Corr. '
415
+ //'Gauss-Newton M. (no der)',STATUS)
417
+ ' _____________________________________________________'
418
+ //'________________________',STATUS)
419
CALL STTPUT(' ',STATUS)
420
CALL STTPUT(' ',STATUS)
422
+ ' Print Max. Fct. eval. Prec. on Param. Lin. Search Domain'
423
+ //' Weight',STATUS)
424
WRITE (LINE,9020) NINT(METPAR(1)),NINT(METPAR(2)),METPAR(3),
425
+ METPAR(4),METPAR(5),WGTTYP
426
CALL STTPUT(LINE,STATUS)
427
CALL STTPUT(' ',STATUS)
431
IF (NRPARAM.EQ.1) THEN
435
LW = 12*NRPARAM + NRPARAM* (NRPARAM-1)/2
442
CALL TDMGET(NBYT,PTRW,STATUS)
445
CALL E04JAF(NRPARAM,IBOUND,PARLOW,PARUPP,PARAM,FSUMSQ,
446
+ MADRID(PTRIW),LIW,MADRID(PTRW),LW,IFAIL1)
451
LHSL = MAX0(NRPARAM* (NRPARAM-1)/2,1)
454
NRVM = 2* (LW+LHSL+4*NRPARAM) + LIW
456
C CALL STIPUT('WORK ',10,9,1,1,NRVM,1.,XVAL,' ',' ',PTRW,
459
CALL TDMGET(NBYT,PTRW,STATUS)
461
PTRHSL = PTRDLT + 2*NRPARAM
462
PTRHSD = PTRHSL + 2*LHSL
463
PTRSTA = PTRHSD + 2*NRPARAM
464
PTRGRD = PTRSTA + NRPARAM
465
PTRIW = PTRGRD + 2*NRPARAM
468
CALL E04HBF(NRPARAM,FUNCT3,PARAM,NRFEVA,MADRID(PTRDLT),
469
+ MADRID(PTRHSL),LHSL,MADRID(PTRHSD),FSUMSQ,
470
+ MADRID(PTRGRD),MADRID(PTRIW),LIW,MADRID(PTRW),
474
CALL MNMX(MADRID(PTRHSD),NRPARAM,HMIN,HMAX,IMIN,IMAX)
475
IF (HMAX.LT.1.D+4*HMIN) THEN
476
WRITE (LINE,9030) HMIN,HMAX
480
CALL E04JBF(NRPARAM,FUNCT3,MINMON,NINT(METPAR(1)),.TRUE.,
481
+ 1,E04JBQ,NINT(METPAR(2)),DBLE(METPAR(4)),
482
+ DBLE(METPAR(3)),DBLE(METPAR(5)),0.D0,
483
+ MADRID(PTRDLT),IBOUND,PARLOW,PARUPP,PARAM,
484
+ MADRID(PTRHSL),LHSL,MADRID(PTRHSD),
485
+ MADRID(PTRSTA),FSUMSQ,MADRID(PTRGRD),
486
+ MADRID(PTRIW),LIW,MADRID(PTRW),LW,IFAIL1)
490
ELSE IF (ALGOR(1:2).EQ.'QN') THEN
491
CALL STTPUT(' ',STATUS)
493
+ ' Constrained Non-linear Least Squares Fitting : Quasi-Newton '
496
+ ' ____________________________________________________________'
498
CALL STTPUT(' ',STATUS)
499
CALL STTPUT(' ',STATUS)
501
+ ' Print Max. Fct. eval. Prec. on Param. Lin. Search Domain'
502
+ //' Weight',STATUS)
503
WRITE (LINE,9020) NINT(METPAR(1)),NINT(METPAR(2)),METPAR(3),
504
+ METPAR(4),METPAR(5),WGTTYP
505
CALL STTPUT(LINE,STATUS)
506
CALL STTPUT(' ',STATUS)
510
IF (NRPARAM.EQ.1) THEN
514
LW = 10*NRPARAM + NRPARAM* (NRPARAM-1)/2
518
NRVM = LW*2 + LIW+ 2*NRPARAM
519
C CALL STIPUT('WORK ',10,9,1,1,NRVM,1.,XVAL,' ',' ',PTRW,
522
CALL TDMGET(NBYT,PTRW,STATUS)
524
PTRGRD = PTRIW + 2*NRPARAM
525
CALL E04KAF(NRPARAM,IBOUND,PARLOW,PARUPP,PARAM,FSUMSQ,
526
+ MADRID(PTRGRD),MADRID(PTRIW),LIW,MADRID(PTRW),
533
LHSL = MAX(NRPARAM* (NRPARAM-1)/2,1)
535
NRVM = (LW+3*NRPARAM+LHSL+1)*2 + LIW + NRPARAM
537
CALL TDMGET(NBYT,PTRW,STATUS)
538
C CALL STIPUT('WORK ',10,9,1,1,NRVM,1.,XVAL,' ',' ',PTRW,
540
PTRHSL = PTRW + 3*NRPARAM
541
PTRHSD = PTRHSL + 2*LHSL
542
PTRSTA = PTRHSD + 2*NRPARAM
543
PTRGRD = PTRSTA + NRPARAM
544
PTRIW = PTRGRD + 2*NRPARAM
548
CALL E04HCF(NRPARAM,FUNCT4,PARINI,FSUMSQ,MADRID(PTRGRD),
549
+ MADRID(PTRIW),LIW,MADRID(PTRW),LW,IFAIL3)
551
IF (IFAIL3.EQ.2) THEN
552
CALL MINMSG(ALGOR(1:5),ROUTIN,10)
557
CALL SETZER(MADRID(PTRHSL),LHSL)
558
CALL SETONE(MADRID(PTRHSD),NRPARAM)
560
CALL E04KBF(NRPARAM,FUNCT4,MINMON,NINT(METPAR(1)),.TRUE.,
561
+ 1,E04LBS,NINT(METPAR(2)),DBLE(METPAR(4)),
562
+ DBLE(METPAR(3)),DBLE(METPAR(5)),0.D0,IBOUND,
563
+ PARLOW,PARUPP,PARAM,MADRID(PTRHSL),LHSL,
564
+ MADRID(PTRHSD),MADRID(PTRSTA),FSUMSQ,
565
+ MADRID(PTRGRD),MADRID(PTRIW),LIW,MADRID(PTRW),
570
ELSE IF (ALGOR(1:3).EQ.'MGN') THEN
571
CALL STTPUT(' ',STATUS)
573
+ ' Constrained Non-linear Least Squares Fitting : Modified '
574
+ //'Gauss-Newton Method',STATUS)
576
+ ' ________________________________________________________'
577
+ //'___________________',STATUS)
578
CALL STTPUT(' ',STATUS)
579
CALL STTPUT(' ',STATUS)
581
+ ' Print Max. Fct. eval. Prec. on Param. Lin. Search Domain'
582
+ //' Weight',STATUS)
583
WRITE (LINE,9020) NINT(METPAR(1)),NINT(METPAR(2)),METPAR(3),
584
+ METPAR(4),METPAR(5),WGTTYP
585
CALL STTPUT(LINE,STATUS)
586
CALL STTPUT(' ',STATUS)
590
IF (NRPARAM.EQ.1) THEN
594
LW = 10*NRPARAM + NRPARAM* (NRPARAM-1)/2
599
C CALL STIPUT('WORK ',10,9,1,1,NRVM,1.,XVAL,' ',' ',PTRW,
602
CALL TDMGET(NBYT,PTRW,STATUS)
604
PTRGRD = PTRIW + 2 + NRPARAM
605
CALL E04KCF(NRPARAM,IBOUND,PARLOW,PARUPP,PARAM,FSUMSQ,
606
+ MADRID(PTRGRD),MADRID(PTRIW),LIW,MADRID(PTRW),
611
IF (NRPARAM.EQ.1) THEN
615
LW = 7*NRPARAM + NRPARAM* (NRPARAM-1)/2
619
LHSL = MAX(NRPARAM* (NRPARAM-1)/2,1)
621
NRVM = (LW+3*NRPARAM+LHSL+1)*2 + LIW + NRPARAM
623
CALL TDMGET(NBYT,PTRW,STATUS)
624
C CALL STIPUT('WORK ',10,9,1,1,NRVM,1.,XVAL,' ',' ',PTRW,
627
PTRHSD = PTRHSL + 2*LHSL
628
PTRSTA = PTRHSD + 2*NRPARAM
629
PTRGRD = PTRSTA + NRPARAM
630
PTRIW = PTRGRD + 2*NRPARAM
634
CALL E04HCF(NRPARAM,FUNCT4,PARINI,FSUMSQ,MADRID(PTRGRD),
635
+ MADRID(PTRIW),LIW,MADRID(PTRW),LW,IFAIL3)
637
IF (IFAIL3.EQ.2) THEN
638
CALL MINMSG(ALGOR(1:5),ROUTIN,10)
643
CALL E04KDF(NRPARAM,FUNCT4,MINMON,NINT(METPAR(1)),
644
+ NINT(METPAR(2)),DBLE(METPAR(4)),
645
+ DBLE(METPAR(3)),0.D0,DBLE(METPAR(5)),IBOUND,
646
+ PARLOW,PARUPP,PARAM,MADRID(PTRHSL),LHSL,
647
+ MADRID(PTRHSD),MADRID(PTRSTA),FSUMSQ,
648
+ MADRID(PTRGRD),MADRID(PTRIW),LIW,MADRID(PTRW),
655
CALL MINMSG(ALGOR(1:5),ROUTIN,IFAIL1)
656
CALL STTPUT(' ',STATUS)
658
IF (IFAIL1.NE.1 .AND. IFAIL1.NE.4 .AND. IFAIL1.NE.9) THEN
660
IF (ALGOR(1:5).EQ.'CGNND') THEN
661
PTRHSD = PTRW + 8* (6*NRPARAM+2*NRDATA+NRDATA*NRPARAM+
662
+ MAX0(1, (NRPARAM* (NRPARAM-1)/2)))
663
PTRHSD = PTRHSD + 8*NRPARAM
666
PTRHSD = PTRW + 8* (7*NRPARAM+2*NRDATA+NRDATA*NRPARAM+
667
+ NRPARAM* (NRPARAM+1)/2+
668
+ MAX0(1, (NRPARAM* (NRPARAM-1)/2)))
669
PTRHSD = PTRHSD + 8*NRPARAM
678
+ ' *** Unable to evaluate the errors on the parameters ***'
684
C Pass the final reduced chi squares to the COMMON block
687
FINCHI = FSUMSQ/DBLE(NRDATA-NRPARAM+NRPFIX)
693
9000 FORMAT (5X,G12.5,10X,G12.5)
694
9010 FORMAT (5X,G12.5,10X,G12.5,10X,G12.5)
695
9020 FORMAT (I6,8X,I7,7X,1PE9.1,8X,0PF4.2,6X,0PF8.0,5X,A1)
696
9030 FORMAT ('FIT/TABLE : Bad Scaling of the problem ','HSD from ',
697
+ 1PD9.2,' to ',1PD9.2)
698
9040 FORMAT ('*** Detected only ',I3,' linear independant parameters ',
699
+ 'on the total of ',I3,' ***')