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)