C INTER4 SOURCE GOUNAND 07/09/07 21:15:10 5842 SUBROUTINE INTER4(TEMPS,KTE,KFT,LON,FT0,ISENS,IVERI,IRET) C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C INTERPOLATION LINEAIRE ; recherche par binary search C Source : Donald Knuth, The Art of Computer Programming C Volume 3, Sorting and searching, Third edition, 1997 C Addison-Wesley pp. 409-426 C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C TEMPS : valeur où interpoler la fonction C KTE : abscisses de la fonction à interpoler C KFT : ordonnées de la fonction à interpoler C LON : longueur de ces deux précédentes listes C FT0 : valeur interpolée de la fonction à l'abscisse TEMPS C ISENS : =0 KTE est croissante =1 KTE est décroissante C IVERI : =0 ne renvoie pas d'erreur si t est en-dehors des bornes C mais la valeur de la fonction pour t le plus proche C =1 renvoie une erreur si t est en-dehors des bornes C IRET : code retour =1 si succès, 0 sinon C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC SMLREEL -INC CCOPTIO -INC CCREEL * FT0=0.D0 MLREE1=KTE MLREE2=KFT * Cas de bord (bourrin) TINF=MLREE1.PROG(1) TSUP=MLREE1.PROG(LON) C WRITE(IOIMP,*) 'IVERI=',IVERI C WRITE(IOIMP,*) 'ISENS=',ISENS C WRITE(IOIMP,*) 'TINF=',TINF C WRITE(IOIMP,*) 'TSUP=',TSUP IF (ISENS.EQ.0) THEN IF (IVERI.EQ.1) THEN IF (TEMPS.LT.TINF) THEN GOTO 50 ELSEIF (TEMPS.GT.TSUP) THEN GOTO 50 ENDIF ENDIF IF (TEMPS.LE.TINF) THEN FT0=MLREE2.PROG(1) GOTO 70 ELSEIF (TEMPS.GE.TSUP) THEN FT0=MLREE2.PROG(LON) GOTO 70 ENDIF ELSE IF (IVERI.EQ.1) THEN IF (TEMPS.GT.TINF) THEN GOTO 50 ELSEIF (TEMPS.LT.TSUP) THEN GOTO 50 ENDIF ENDIF IF (TEMPS.GE.TINF) THEN FT0=MLREE2.PROG(1) GOTO 70 ELSEIF (TEMPS.LE.TSUP) THEN FT0=MLREE2.PROG(LON) GOTO 70 ENDIF ENDIF * Recherche de l'index IDXINF=1 IDXSUP=LON IF (ISENS.EQ.0) THEN 1 CONTINUE C WRITE(IOIMP,*) 'IDXINF=',IDXINF C WRITE(IOIMP,*) 'IDXSUP=',IDXSUP IF (IDXSUP.LT.IDXINF) GOTO 3 IDXMIL=(IDXINF+IDXSUP)/2 TEMMIL=MLREE1.PROG(IDXMIL) C WRITE(IOIMP,*) 'IDXMIL=',IDXMIL C WRITE(IOIMP,*) 'TEMMIL=',TEMMIL IF (TEMPS.LT.TEMMIL) THEN IDXSUP=IDXMIL-1 GOTO 1 ELSEIF (TEMPS.GT.TEMMIL) THEN IDXINF=IDXMIL+1 GOTO 1 ELSE FT0=MLREE2.PROG(IDXMIL) GOTO 70 ENDIF ELSE 2 CONTINUE C WRITE(IOIMP,*) 'IDXINF=',IDXINF C WRITE(IOIMP,*) 'IDXSUP=',IDXSUP IF (IDXSUP.LT.IDXINF) GOTO 3 IDXMIL=(IDXINF+IDXSUP)/2 TEMMIL=MLREE1.PROG(IDXMIL) C WRITE(IOIMP,*) 'IDXMIL=',IDXMIL C WRITE(IOIMP,*) 'TEMMIL=',TEMMIL IF (TEMPS.GT.TEMMIL) THEN IDXSUP=IDXMIL-1 GOTO 2 ELSEIF (TEMPS.LT.TEMMIL) THEN IDXINF=IDXMIL+1 GOTO 2 ELSE FT0=MLREE2.PROG(IDXMIL) GOTO 70 ENDIF ENDIF 3 CONTINUE T1=MLREE1.PROG(IDXSUP) T2=MLREE1.PROG(IDXINF) XP2=(TEMPS-T1)/(T2-T1) XP1=(T2-TEMPS)/(T2-T1) FT1=MLREE2.PROG(IDXSUP) FT2=MLREE2.PROG(IDXINF) FT0=(XP1*FT1)+(XP2*FT2) 70 CONTINUE IRET=1 RETURN * "Valeur en dehors de la table" 50 CONTINUE CALL ERREUR(210) IRET=0 RETURN END