C INTLIN SOURCE BP208322 20/06/16 21:15:05 10627 SUBROUTINE INTLIN(TEMPS,KTE,KFT,LON,L1,L2,FT0,IRET) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) *--------------------------------------------------------------------* * * * INTERPOLATION LINEAIRE D'UNE VALEUR * * * * Parametres: * * * * e TEMPS Abscisse a interpoler * * e KTE LISTREEL des abscisses triees par ordre croissant * * e KFT LISTREEL des ordonnees * * e LON Longueur de la LISTREEL des abscisses * * e/s L1 indice de debut de recherche dans les abscisses * * e/s L2 = L1+1 (a priori toujours vrai) * * s FT0 Valeur interpolee * * s IRET IRET = 1, succes * * s IRET IRET = 0, echec * * * *--------------------------------------------------------------------* -INC SMLREEL FT0 = 0.D0 MLREE1 = KTE MLREE2 = KFT T1 = MLREE1.PROG(L1) TL = MLREE1.PROG(LON) c * verif temporaire c if(L1.GE.LON) then c write(*,*) 'impossible d interpoler entre ',L1,' et ',LON c IRET = 0 c return c endif * temps en dehors de la liste ? IF (TEMPS.LE.T1 .OR. TEMPS.GE.TL) THEN * tentative de rattrapage (bp,2020) * bp: d'apres mesure sur 1 cas (a faire evoluer si besoin), * la tolerance de 1D-5 devrait assurer le test sur * l'erreur cumulee jusqu'a environ 1E7 pas de temps * (on suppose que le pas de temps ne varie pas trop) TOL=1.D-5*(TL-T1)/DBLE(LON - L1) IF (ABS(TEMPS-T1).LT.TOL) THEN FT0=MLREE2.PROG(L1) IRET = 1 c write(*,*) 't=',TEMPS,'~',T1,'on prend PROG(',L1,')=',FT0 ELSEIF (ABS(TEMPS-TL).LT.TOL) THEN FT0=MLREE2.PROG(LON) IRET = 1 c write(*,*) 't=',TEMPS,'~',TL,'on prend PROG(',LON,')=',FT0 ELSE * temps en dehors de la liste c write(*,*) 't=',TEMPS,'out of [',T1,' - ',TL,'] !!!' IRET = 0 ENDIF RETURN ENDIF * recherche dans la liste DO 10 L = L2,LON T2 = MLREE1.PROG(L) L2 = L IF (TEMPS.LT.T2) GOTO 20 T1 = T2 L1 = L2 10 CONTINUE * interpolation lineaire 20 CONTINUE FT1 = MLREE2.PROG(L1) FT2 = MLREE2.PROG(L2) DT = (TEMPS - T1) / (T2 - T1) FT0 = (FT2 - FT1) * DT + FT1 IRET = 1 * END