ADAS Subroutine xxmnmx
SUBROUTINE XXMNMX( LOGFIT , MAXDEG , TOLVAL ,
& NIN , XIN , YIN ,
& NOUT , XOUT , YOUT ,
& NCOEF , COEF ,
& MINFO
& )
C-----------------------------------------------------------------------
C
C ****************** FORTRAN77 SUBROUTINE: XXMNMX *********************
C
C PURPOSE: TO EVALUATE THE TAYLOR COEFFICIENTS OF THE MINIMAX
C POLYNOMIAL.
C
C OUTPUTS 'NOUT' INTERPOLATED COORDINATES USING THE
C MINIMAX EVALUATION, WHICH ARE EVENLY SPACED ALONG
C THE X-AXIS COVERING THE X-VALUE RANGE INPUT. IF
C REQUIRED THE SPACING WILL BE EVENLY SPACED ALONG
C THE LOG10 TRANSFORMATION OF THE X-AXIS (IN THIS
C CASE THE Y-VALUES ARE SIMILARLY TRANSFORMED).
C
C * IMPORTANT: 'NOUT' >= 'NIN' (NO. OF INPUT VALUES)
C
C MINFO(CHARACTER*80) ON OUTPUT CONTAINS INFORMATION
C REGARDING THE SLOPE OF THE CURVE AT THE BOUNDARIES
C OF THE EXPERIMENTAL REGION, AND AN ESTIMATE OF THE
C MAXIMUM ERROR IN THE MINIMAX INTERPOLATION.
C
C CALLING PROGRAMS: GENERAL USE
C
C SUBROUTINE:
C
C INPUT : (L*4) LOGFIT = .TRUE. => PERFORM MINIMAX POLYNOMIAL EVAL-
C UATION ON LOG10 TRANSFORMATIONS
C OF THE INPUT X AND Y DATA.
C .FALSE => PERFORM MINIMAX POLYNOMIAL EVAL-
C UATION ON THE X AND Y VALUES AS
C INPUT.
C INPUT : (I*4) MAXDEG = MAXIMUM POSSIBLE DEGREE OF POLYNOMIAL
C ALLOWED IN THE MINIMAX FITTING (MUST BE< 26)
C (IF 'NOUT'<100 => MAX. DEGREES ALLOWED = 22)
C NOTE:
C 'COEF()' MUST HAVE .GE. 'MAXDEG+1' ELEMENTS
C INPUT : (R*8) TOLVAL = PARAMETER = FRACTIONAL TOLERANCE FOR ACCEPT-
C ANCE OF DATA FITTED BY MINIMAX
C POLYNOMIAL. (IF IT EQUALS ZERO
C THEN RUNS TO MAX. DEGREE).
C
C INPUT : (I*4) NIN = NUMBER OF INPUT KNOTS
C INPUT : (R*8) XIN() = INPUT X-VALUES OF KNOTS
C INPUT : (R*8) YIN() = INPUT Y-VALUES OF KNOTS
C
C INPUT : (I*4) NOUT = NUMBER OF OUTPUT VALUES REQUIRED TO BE
C INTERPOLATED USING MINIMAX POLYNOMIAL EVAL-
C UATION - SPACED EVENLY BETWEEN THE MINIMUM
C AND MAXIMUM VALUES OF THE (TRANSFORMED) X-
C VALUES INPUT.
C OUTPUT: (R*8) XOUT() = INITIALLY: ORDERED/(TRANSFORMED) 'XIN()'
C (ASCENDING ORDER).
C 'NIN' VALUES
C OUTPUT : X-VALUES FOR WHICH INTERPOLATION
C IS CARRIED OUT.
C 'NOUT' VALUES
C OUTPUT: (R*8) YOUT() = INITIALLY: ORDERED/(TRANSFORMED) 'YIN()'
C (ORDERED ACCORDING TO 'XOUT()').
C 'NIN' VALUES
C OUTPUT : INTERPOLATED Y-VALUES FOR THE
C X-VALUES ('XOUT()' - OUTPUT)
C 'NOUT' VALUES
C
C OUTPUT: (I*4) NCOEF = NUMBER OF MINIMAX FIT COEFFICIENTS
C OUTPUT: (R*8) COEF() = MINIMAX COEFFICIENTS - ARRAY SIZE: MAXDEG+1
C
C OUTPUT: (C*80) MINFO = DIAGNOSTIC INFORMATION STRING
C
C (I*4) MAXOUT = PARAMETER = MAXIMUM NUMBER OF OUTPUT X,Y CO-
C ORDINATES THAT CAN BE INTERPOLA-
C TED.
C (I*4) MAXTOL = PARAMETER = POWER OF 10 WHICH REPRESENTS THE
C MAXIMUM FRACTIONAL DIFFERENCE
C ALLOWED BETWEEN ACTUAL (YDATA)
C AND FITTED (YFIT) DATA.
C (I*4) MINTOL = PARAMETER = POWER OF 10 WHICH REPRESENTS THE
C MINIMUM FRACTIONAL DIFFERENCE
C ALLOWED BETWEEN ACTUAL (YDATA)
C AND FITTED (YFIT) DATA.
C
C (I*4) I4UNIT = FUNCTION (SEE ROUTINE SECTION BELOW)
C (I*4) ILIMIT = UPPER LIMIT OF THE NUMBER OF DEGREES
C ALLOWED FOR MINIMAX POLYNOMIAL EVALUATION.
C (I*4) IDEG = NUMBER OF DEGREES BEING USED FOR MINIMAX
C POLYNOMIAL EVALUATION.
C (I*4) NDEG = NUMBER OF DEGREES FOR ACCEPTED MINIMAX FIT.
C (I*4) I1 = GENERAL ARRAY INDEX
C (I*4) I2 = GENERAL ARRAY INDEX
C
C (R*8) XMIN = MINIMUM (TRANSFORMED) X-VALUE INPUT
C (R*8) XMAX = MAXIMUM (TRANSFORMED) X-VALUE INPUT
C (R*8) REF = OUTPUT FROM 'XXCHEB' = NEGATIVE IF MINIMAX
C FITTING PROCEDURE IS CYCLING.
C (R*8) SUM = USED TO SUM UP POLYNOMIAL TERMS WHEN CALCUL-
C ATING VALUE OF 'Y' AT GIVEN 'X'.
C (R*8) YFIT = FITTED Y-VALUE USING MINIMAX POLYNOMIAL
C (R*8) YDATA = INPUT Y-VALUE FOR COMPARISON TO FITTED VALUE
C (R*8) DIFF = FRACTIONAL DIFFERENCE BETWEEN ACTUAL (YDATA)
C AND FITTED (YFIT) Y-VALUE FROM MINIMAX
C POLYNOMIAL FITTED.
C (R*8) BIG = LARGEST FRACTIONAL ERROR BETWEEN ACTUAL AND
C FITTED Y-VALUES FOR POLYNOMIAL EVALUATION.
C (R*8) GRADL = GRADIENT OF FITTED MINIMAX POLYNOMIAL CURVE
C AT LOWER BOUNDARY OF INPUT DATA.
C (R*8) GRADU = GRADIENT OF FITTED MINIMAX POLYNOMIAL CURVE
C AT UPPER BOUNDARY OF INPUT DATA.
C (R*8) XSTEP = SEPERATION OF OUTPUT X-VALUES TO BE
C INTERPOLATED.
C (R*8) XVAL = X-VALUES AT WHICH INTERPOLATION IS TAKING
C PLACE.
C
C (C*6) CFTYPE = 'LOGFIT' IF 'LOGFIT=.TRUE.'
C 'LINFIT' IF 'LOGFIT=.FALSE.'
C
C (L*4) LMFIT = .TRUE. => MINIMAX POLYNIOMIAL FOUND WHICH
C IS WITHIN DESIRED TOLERANCE.
C (SEE 'TOLVAL')
C .FALSE. => NO MINIMAX POLYNIOMIAL FOUND WITH
C DESIRED TOLERANCE.
C (SEE 'TOLVAL')
C
C (I*4) INDX() = ASCENDING ORDER INDEX FOR INPUT X-VALUES
C
C (R*8) WRK() = WORKING SPACE FOR ORDERING DATA
C
C
C NOTES:
C THIS SUBROUTINE IS AN AMMENDED AND STRUCTURED VERSION OF THE
C SUBROUTINE 'MINIMAX' WRITTEN BY STEPHEN TURNER, JET 30TH
C JULY 1989. IT NO LONGER ORDERS THE INPUT COORDINATES DIRECTLY
C BUT COPIES THE TO A SECOND ARRAY AND ORDERS THEM. THEREFORE
C IF THE INPUT COORDINATES ARE REQUIRED TO BE ORDERED THIS MUST
C BE CARRIED OUT EXPLICITLY IN THE CALLING OPROGRAM/ROUTINE.
C THE SUBROUTINE NO LONGERS REQUIRES THE INPUT CO-ORDINATES IN
C LOG10 FORM, THIS TRANSFORMATION CAN BE CARRIED OUT EXPLICITLY
C BY THE SUBROUTINE. THE ROUTINE HAS BEEN WRITTEN TO BE OF
C GENERAL RATHER THAN SPECIFIC USE.
C
C IN THE ORIGINAL 'MINIMAX' SUBROUTINE THE MINIMUM NUMBER OF
C DEGREES ACCEPTED FOR A FIT WAS 2, IN 'XXMNMX' IT IS 1.
C
C ROUTINES:
C ROUTINE SOURCE BRIEF DESCRIPTION
C ------------------------------------------------------------
C I4UNIT ADAS FETCH UNIT NUMBER FOR OUTPUT OF MESSAGES
C XXINDX ADAS GIVES INDICES OF SORTED ARRAY (ASCENDNG)
C XXISRT ADAS RE-ORDERS ARRAY ACCORDING TO 'XXINDX'
C XXCHEB ADAS MINIMAX POLYNOMIAL COEFT. EVALUATION
C
C AUTHOR: PAUL E. BRIDEN (TESSELLA SUPPORT SERVICES PLC)
C K1/0/81
C JET EXT. 4569
C
C DATE: 12/10/90
C
C UPDATE: 23/04/93 - PE BRIDEN - ADAS91: ADDED I4UNIT FUNCTION TO WRITE
C STATEMENTS FOR SCREEN MESSAGES
C
C UPDATE: 24/05/93 - PE BRIDEN - ADAS91: CHANGED I4UNIT(0)-> I4UNIT(-1)
C
C UPDATE: 14/02/94 - PE BRIDEN - ADAS91: CORRECTED BUG WHEN CHECKING
C TOLERANCE FOR LOGFIT - CHANGED
C THE LINE:
C YDATA = YIN(I1)
C TO:
C YDATA = YIN(INDX(I1))
C (WOULD CAUSE PROBLEMS IF YIN
C NOT ORDERED ON INPUT.)
C
C UPDATE: 14/02/94 - PE BRIDEN - ADAS91: RECODED SECTION USE TO TEST
C TOLERANCE VALUE - NOW CHECKS
C FOR DIVISION BY 0 AND USES
C LOG10 TO STORES VALUES THUS
C AVOIDING OVERFLOWS.
C (BIG IS NOW STORED AS LOG10
C VALUES INITIALLY)
C INTRODUCED: MAXTOL & MINTOL
C - / -
C STOP EXECUTING XXCHEB IF
C CYCLING (CHECK REF VARIABLE)
C - / -
C INITIALISED NDEG AND BIG TO
C STOP ICA WARNING.
C
C UPDATE: 31/10/94 - PE BRIDEN - ADAS91: REPLACED CALL TO NAG ROUTINE
C E02ACF WITH A CALL TO THE NEW
C EQUIVALENT ADAS ROUTINE CALLED
C XXCHEB (IDENTICAL ARGUMENTS).
C UPDATE: 17/1/95 - L JALOTA - IDL-ADAS : MODIFIED ERROR CHECKING
C SECTION TO WRITE TO UNIT 0
C NOT STDOUT WHICH INTERFERES
C WITH PIPE COMMUNICATIONS.
C : 6/3/95 - L JALOTA - IDL-ADAS : REPLACED CALL TO I4UNIT.
C
C UNIX-IDL PORT:
C
C VERSION: 1.2 DATE: 10-11-95
C MODIFIED: TIM HAMMOND (TESSELLA SUPPORT SERVICES PLC)
C - INCREASED PARAMETER MAXOUT FROM 100 TO 120
C PRIMARILY TO PREVENT PROBLEMS WITH ADAS 506 WHERE
C 101 POINTS ARE REQUIRED.
C
C VERSION : 1.3
C DATE : 10-04-2007
C MODIFIED : Allan Whiteford
C - Modified documentation as part of automated
C subroutine documentation preparation.
C
C----------------------------------------------------------------------
C
C----------------------------------------------------------------------
CHARACTER*80 MINFO
INTEGER MAXDEG, NCOEF, NIN, NOUT
LOGICAL LOGFIT
REAL*8 COEF(MAXDEG+1), TOLVAL
REAL*8 XIN(NIN), XOUT(NOUT), YIN(NIN)
REAL*8 YOUT(NOUT)