Télécharger inter5.eso

Retour à la liste

Numérotation des lignes :

inter5
  1. C INTER5 SOURCE PASCAL 21/02/24 21:15:10 10898
  2. SUBROUTINE INTER5(TEMPS,KTE,KFT,FT0,ISPLIN,
  3. $ MLDERS,IHORS,IRET)
  4. C
  5. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  6. C
  7. C INTERPOLATION LINEAIRE ; recherche par binary search
  8. C Source : Donald Knuth, The Art of Computer Programming
  9. C Volume 3, Sorting and searching, Third edition, 1997
  10. C Addison-Wesley pp. 409-426
  11. C
  12. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  13. C
  14. C TEMPS : valeur où interpoler la fonction
  15. C KTE : abscisses de la fonction à interpoler
  16. C KFT : ordonnées de la fonction à interpoler
  17. C LON : longueur de ces deux précédentes listes
  18. C FT0 : valeur interpolée de la fonction à l'abscisse TEMPS
  19. C ISENS : =0 KTE est croissante =1 KTE est décroissante
  20. C IHORS =0 renvoie une erreur si t est en-dehors des bornes
  21. C : =1 ne renvoie pas d'erreur si t est en-dehors des bornes
  22. C mais la valeur de la fonction pour t le plus proche
  23. C : =2 ne renvoie pas d'erreur si t est en-dehors des bornes
  24. C et on extrapole lineairement la valeur a partir des bords
  25. C IRET : code retour =1 si succès, 0 sinon
  26. C
  27. CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  28. IMPLICIT INTEGER(I-N)
  29. IMPLICIT REAL*8(A-H,O-Z)
  30. -INC SMLREEL
  31. POINTEUR MLDERS.MLREEL
  32.  
  33. -INC PPARAM
  34. -INC CCOPTIO
  35. -INC CCREEL
  36. *
  37. FT0=0.D0
  38. MLREE1=KTE
  39. MLREE2=KFT
  40. LON=MLREE1.PROG(/1)
  41. * Cas de bord (bourrin)
  42. TINF=MLREE1.PROG(1)
  43. TSUP=MLREE1.PROG(LON)
  44. C WRITE(IOIMP,*) 'IHORS=',IHORS
  45. C WRITE(IOIMP,*) 'ISENS=',ISENS
  46. C WRITE(IOIMP,*) 'TINF=',TINF
  47. C WRITE(IOIMP,*) 'TSUP=',TSUP
  48.  
  49. C---- TRAITEMENT CAS HORS INTERVALLE DE DEFINITION
  50. C
  51. C Indicateur IHORS :
  52. C IHORS = 0 : on doit etre dans l'intervalle de def., sinon erreur
  53. C IHORS = 1 : on renvoie la valeur aux bornes
  54. C IHORS = 2 : on extrapole lineairement en dehors des bornes
  55. C
  56. IF (TEMPS.LE.TINF) THEN
  57. IF (IHORS.EQ.0) THEN
  58. GOTO 50
  59. ELSE IF (IHORS.EQ.1) THEN
  60. FT0 = MLREE2.PROG(1)
  61. ELSEIF (IHORS.EQ.2) THEN
  62. T1 = TINF
  63. T2 = MLREE1.PROG(2)
  64. F1 = MLREE2.PROG(1)
  65. F2 = MLREE2.PROG(2)
  66. DT = T2-T1
  67. TM = MAX(ABS(T1),ABS(T2))
  68. IF (ABS(DT).LE.(XPETIT+XZPREC*TM)) THEN
  69. CALL ERREUR(1124)
  70. RETURN
  71. ENDIF
  72. FT0 = (F2-F1)/DT*(TEMPS-T1)+F1
  73. ELSE
  74. CALL ERREUR(5)
  75. RETURN
  76. ENDIF
  77. GOTO 70
  78. ELSEIF (TEMPS.GE.TSUP) THEN
  79. IF (IHORS.EQ.0) THEN
  80. GOTO 50
  81. ELSE IF (IHORS.EQ.1) THEN
  82. FT0 = MLREE2.PROG(LON)
  83. ELSE IF (IHORS.EQ.2) THEN
  84. T1 = MLREE1.PROG(LON-1)
  85. T2 = TSUP
  86. F1 = MLREE2.PROG(LON-1)
  87. F2 = MLREE2.PROG(LON)
  88. DT = T2-T1
  89. TM = MAX(ABS(T1),ABS(T2))
  90. IF (ABS(DT).LE.(XPETIT+XZPREC*TM)) THEN
  91. CALL ERREUR(1124)
  92. RETURN
  93. ENDIF
  94. FT0 = (F2-F1)/DT*(TEMPS-T1)+F1
  95. ELSE
  96. CALL ERREUR(5)
  97. RETURN
  98. ENDIF
  99. GOTO 70
  100. ENDIF
  101.  
  102. C---- TRAITEMENT CAS DANS INTERVALLE DE DEFINITION
  103. C
  104. * Recherche de l'index
  105. IDXINF=1
  106. IDXSUP=LON
  107. 1 CONTINUE
  108. C WRITE(IOIMP,*) 'IDXINF=',IDXINF
  109. C WRITE(IOIMP,*) 'IDXSUP=',IDXSUP
  110. IF (IDXSUP.LT.IDXINF) GOTO 3
  111. IDXMIL=(IDXINF+IDXSUP)/2
  112. TEMMIL=MLREE1.PROG(IDXMIL)
  113. C WRITE(IOIMP,*) 'IDXMIL=',IDXMIL
  114. C WRITE(IOIMP,*) 'TEMMIL=',TEMMIL
  115. IF (TEMPS.LT.TEMMIL) THEN
  116. IDXSUP=IDXMIL-1
  117. GOTO 1
  118. ELSEIF (TEMPS.GT.TEMMIL) THEN
  119. IDXINF=IDXMIL+1
  120. GOTO 1
  121. ELSE
  122. FT0=MLREE2.PROG(IDXMIL)
  123. GOTO 70
  124. ENDIF
  125.  
  126. * Interpolation de la valeur :
  127. 3 CONTINUE
  128. T1=MLREE1.PROG(IDXINF)
  129. T2=MLREE1.PROG(IDXSUP)
  130. DT=T2-T1
  131. XP2=(TEMPS-T1)/DT
  132. XP1=(T2-TEMPS)/DT
  133. FT1=MLREE2.PROG(IDXINF)
  134. FT2=MLREE2.PROG(IDXSUP)
  135. IF (ISPLIN.EQ.1) THEN
  136. DSFT1=MLDERS.PROG(IDXINF)
  137. DSFT2=MLDERS.PROG(IDXSUP)
  138. FT0=XP1*FT1+XP2*FT2+((XP1**3-XP1)*DSFT1+(XP2**3-XP2)*DSFT2)
  139. $ *(DT**2)/6.D0
  140. ELSE
  141. FT0=(XP1*FT1)+(XP2*FT2)
  142. ENDIF
  143.  
  144. * Sortie avec resultat
  145. 70 CONTINUE
  146. IRET=1
  147. RETURN
  148.  
  149. * Sortie avec erreur si IHORS=0 et hors intervalle def. donnees
  150. 50 CONTINUE
  151. CALL ERREUR(210)
  152. IRET=0
  153. RETURN
  154.  
  155. END
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  

© Cast3M 2003 - Tous droits réservés.
Mentions légales