Télécharger intaxe.eso

Retour à la liste

Numérotation des lignes :

intaxe
  1. C INTAXE SOURCE CB215821 25/04/08 21:15:23 12227
  2.  
  3. SUBROUTINE INTAXE(BMIN,BMAX,BINT,IN,ZLOG,ZARR)
  4.  
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8 (A-H,O-Y)
  7.  
  8. IMPLICIT LOGICAL (Z)
  9. *
  10. * BMIN (E) BORNE MINI
  11. * BMAX (E) BORNE MAXI
  12. * BINT (S) PAS DE GRADUATION
  13. * IN (S) NOMBRE DE SEGMENTS
  14. * ZLOG (E) INDIQUATION SI AXE EN LOGARITHMIQUE
  15. * ZARR (E) VRAI => AXE NON NORMALISE
  16. *
  17. * PAS DE GRADUATION POSSIBLE
  18. DIMENSION PAS(11)
  19. DATA PAS/0.01D0,0.02d0,0.05D0,0.1D0,0.2D0,0.5D0,1.D0,
  20. $ 2.D0,5.D0,10.D0,20.D0/
  21. *
  22. DIST =ABS(BMAX-BMIN)
  23. binima=bmax
  24. binimi=bmin
  25.  
  26. * ------
  27. * LOG : LES BORNES SONT DES ENTIERS
  28. * ------
  29. IF (ZLOG) THEN
  30. C Taille des intervalles
  31. IDIST=CEILING(DIST)
  32. IN =MIN(IDIST,12)
  33. BINT =REAL(MAX(NINT(DIST / REAL(IN)),1))
  34.  
  35. C Recallage pour tomber sur des entiers en puissance de 10
  36. IN =NINT(DIST/BINT)
  37. BMAX=BMIN + REAL(IN*BINT)
  38. ELSE
  39.  
  40. * ----------
  41. * DECIMAL :
  42. * ----------
  43. * INITIALISATION IP
  44. *
  45. IP = ICALP(BMIN,BMAX)
  46. P10IP = 10.D0**REAL(IP)
  47.  
  48. * DETERMINATION DU COEFF. CORRECTEUR POUR LES BORNES
  49.  
  50. IF (BMIN .LT. 0.D0) THEN
  51. CORR1=-1.D0
  52. ELSE
  53. CORR1=0.D0
  54. ENDIF
  55. IF (BMAX .LT. 0.D0) THEN
  56. CORR2=0.D0
  57. ELSE
  58. CORR2=1.D0
  59. ENDIF
  60. *
  61. * bminin = bmin
  62. * bmaxin = bmax
  63. *
  64. * Pour affichage et deverminage :
  65. * binima=bmax
  66. * binimi=bmin
  67. *
  68. * AXE NON NORMALISE
  69. *
  70. IF (ZARR) THEN
  71. * RAMENE LES BORNES A UNE FORME XX.XX EXX
  72. * ARRONDI EN 10-2 PUISQUE LES ECHELLES SONT GRADUEES EN 10-2
  73. BMIN=BMIN/P10IP
  74. BMAX=BMAX/P10IP
  75. IF(ABS(AINT(BMIN*100.D0)-(BMIN*100.d0)).GT.ABS(BMIN*0.001D0))
  76. * BMIN=AINT(BMIN*100.D0+CORR1)/100.D0
  77. IF(ABS(AINT(BMAX*100.D0)-(BMAX*100.D0)).GT.ABS(BMAX*0.001D0))
  78. * BMAX=AINT(BMAX*100.D0+CORR2)/100.D0
  79. DIST=ABS(BMAX-BMIN)
  80. * RECHERCHE UN PAS EN 10-2 PERMETTANT D'AVOIR DE 5 A 10 DIVISIONS
  81. I=11
  82. 1 I=I-1
  83. DIST2=DIST/I
  84. ZNE=ABS((DIST2*100.D0)-(AINT(DIST2*100.D0))).GT.
  85. $ (ABS(DIST2*0.001D0))
  86. cbp IF ((I.NE.4).AND.ZNE) GOTO 1
  87. cbp : incoherence avec la notice --> si NARR ou YBOR on impose YSUP et YINF
  88. cbp : on cherche de 10 a 1 divisions
  89. IF ((I.NE.1).AND.ZNE) GOTO 1
  90. * SORTIE QUAND LE PAS EST EN 10-2
  91. IF (.NOT.ZNE) THEN
  92. IN=I
  93. BINT=DIST2* P10IP
  94. BMIN=BMIN * P10IP
  95. BMAX=BMAX * P10IP
  96. ELSE
  97. c * RECALCUL DES BORNES DE FACON A AVOIR UN PAS EN 10-2
  98. c IN=10
  99. c DIST2=ABS(BMAX-BMIN)/10.D0
  100. c DIST2=AINT(DIST2*100.D0+1.D0)/100.D0
  101. c BINT=DIST2* P10IP
  102. c BMIN=BMIN * P10IP
  103. c BMAX=BMIN+10.D0*BINT
  104. cbp : incoherence avec la notice --> si NARR ou YBOR on impose YSUP et YINF
  105. IN=I
  106. BINT=DIST2* P10IP
  107. BMIN=BMIN * P10IP
  108. BMAX=BMAX * P10IP
  109. ENDIF
  110.  
  111.  
  112. ELSE
  113. *
  114. * AXE NORMALISE
  115. *
  116. D=DIST/P10IP
  117. *
  118. * SELECTION DU PREMIER PAS
  119. DO 2 I=1,11
  120. IF (((PAS(I)*10.D0)-D).GT.1.D-2) GOTO 3
  121. 2 CONTINUE
  122.  
  123. * RAMENE LES BORNES A UNE EXPRESSION EN XX.XX E XX
  124. 3 CONTINUE
  125. BI=BMIN/P10IP
  126. BS=BMAX/P10IP
  127. IF(AINT(BI*100.D0).NE.BI*100.D0)BI=AINT(BI*100.D0+CORR1)/100.D0
  128. IF(AINT(BS*100.D0).NE.BS*100.D0)BS=AINT(BS*100.D0+CORR2)/100.D0
  129.  
  130. * DEMANDE A AVOIR DES BORNES MULTIPLES DU PAS
  131. IM=mod(i-1,3)+1
  132. PASM=PAS(IM) * (10.D0**((i-im)/3.D0))
  133. BI=ARROND(BI,PASM,0)
  134. BS=ARROND(BS,PASM,1)
  135. D1=BS-BI
  136. R=D1/PASM
  137.  
  138. * COMPTE TENU DES CORRECTIONS DE ARROND , LE PAS PEUT NE PLUS ETRE
  139. * VALIDE => ON ESSAIE LE PAS SUIVANT
  140. IF (R.GT.10.D0) THEN
  141. I=I+1
  142. GOTO 3
  143. ENDIF
  144. * ON REDRESSE TOUT ET ON SORT
  145. *
  146. * TC je ne comprends pas comment ne pas faire d'erreur donc je m'assure
  147. * que le resultat a un sens
  148. *
  149. BMIN=BI * P10IP
  150. BMAX=BS * P10IP
  151. pasm10=pasm * P10IP
  152. 100 continue
  153. imodi=0
  154. * write(6,*) ' avant correction '
  155. * write(6,*) ' bmin binimi bmax binima'
  156. * write(6,*) bmin ,binimi ,bmax, binima
  157. if( bmin+pasm10.lt.binimi ) then
  158. bmin=bmin+pasm10
  159. imodi=imodi+8
  160. endif
  161. if( binimi.lt.bmin) then
  162. bmin=bmin-pasm10
  163. imodi = imodi+1
  164. endif
  165.  
  166. if( bmax.lt. binima) then
  167. bmax=bmax + pasm10
  168. imodi=imodi+2
  169. endif
  170. if( bmax - pasm10.gt.binima ) then
  171. bmax=bmax- pasm10
  172. imodi=imodi +4
  173. endif
  174. if( imodi.ne.0) then
  175. * write(6,*) ' imodi ' , imodi
  176. go to 100
  177. endif
  178.  
  179. * write(6,*) ' apres correction '
  180. * write(6,*) ' bmin binimi bmax binima'
  181. * write(6,*) bmin ,binimi ,bmax, binima
  182. in= int( (Bmax-bmin)/pasm10 + 0.5)
  183. BINT=PASM * P10IP
  184. ENDIF
  185.  
  186. ENDIF
  187.  
  188. END
  189.  
  190.  
  191.  

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