Télécharger decoup.eso

Retour à la liste

Numérotation des lignes :

decoup
  1. C DECOUP SOURCE GOUNAND 25/08/18 21:15:02 12341
  2. C CALCUL AUTOMATIQUE DES DECOUPAGES
  3. C
  4. SUBROUTINE DECOUP(INBR,DEN1,DEN2,APROG,NBELEM,DENI,DECA,DLONG)
  5. C***********************************************************************
  6. C Quelques commentaires (gounand, 2025/08)
  7. C ENTREES : INBR : nombre d'elements demandes
  8. C >0 : decoupage regulier de l'intervalle
  9. C 0 : decoupage en progression geometrique de
  10. C raison APROG
  11. C <0 : decoupage en progression geometrique de
  12. C meme raison APROG mais avec un nombre
  13. C d'elements fixe a -INBR
  14. C DEN1 : taille normalisee au 1er noeud
  15. C = taille / longueur de l'intervalle
  16. C DEN2 : taille normalisee au dernier noeud
  17. C DLONG : Longueur de l'intervalle a decouper
  18. C SORTIES : DEN1 : taille du 1er element de l'intervalle
  19. C APROG : raison de la progression geometrique
  20. C NBELEM: nombre d'elements de l'intervalle
  21. C DENI : taille au premier noeud
  22. C DECA : taille au dernier noeud - DENI
  23. C Note : les tailles au noeud et les tailles d'elements suivent une
  24. C progression geometrique de meme raison mais avec un decalage
  25. C (facteur multiplicatif) de sqrt(raison) (probleme des piquets
  26. C et des intervalles). Voir aussi : ligne.dgibi
  27. C Attention : DEN1, argument d'entree/sortie
  28. C***********************************************************************
  29. C
  30. IMPLICIT INTEGER(I-N)
  31. IMPLICIT REAL*8 (A-H,O-Z)
  32. LOGICAL LPROG
  33. -INC CCREEL
  34. ** DEN1=SIGN(MAX(XPETIT,ABS(DEN1)),DEN1)
  35. ** DEN2=SIGN(MAX(XPETIT,ABS(DEN2)),DEN2)
  36. DEN1=MAX(XPETIT,ABS(DEN1))
  37. DEN2=MAX(XPETIT,ABS(DEN2))
  38. C write(6,*) 'INBR,DEN1,DEN2=',INBR,DEN1,DEN2
  39. IF ((INBR.EQ.0).AND.(ABS(DEN1).LT.XPETIT.OR.ABS(DEN2).LT.XPETIT))
  40. > THEN
  41. CALL ERREUR(809)
  42. RETURN
  43. ENDIF
  44. IF (INBR.GT.0) THEN
  45. APROG =1.D0
  46. NBELEM=INBR
  47. DEN1 =1.D0/INBR
  48. DENI =DLONG/INBR
  49. DECA =0.D0
  50. ELSE
  51. IF (SIGN(1.D0,DEN1)*SIGN(1.D0,DEN2).LE.0.D0) THEN
  52. CALL ERREUR(809)
  53. RETURN
  54. ENDIF
  55. *
  56. XAUX=abs(((DEN1-DEN2)**2)/2)
  57. IF (DEN2.LT.DEN1) THEN
  58. APROG=1.D0+XAUX-SQRT(XAUX*(2+XAUX))
  59. ELSE
  60. APROG=1.D0+XAUX+SQRT(XAUX*(2+XAUX))
  61. ENDIF
  62. IF (ABS(APROG).LT.XPETIT) THEN
  63. CALL ERREUR(809)
  64. RETURN
  65. ENDIF
  66. LPROG=((ABS(APROG-1)) .GT. 1.D-5)
  67. C write(6,*) 'XAUX,APROG =',XAUX,APROG
  68. IF (INBR.LT.0) THEN
  69. NBELEM=-INBR
  70. ELSE
  71. IF (LPROG) THEN
  72. *sg 2019/07 eviter les pbs si DEN2/DEN1 est trop grand
  73. *sg XNBELE=(LOG(DEN2/DEN1)/LOG(APROG))
  74. XNBELE=(LOG(ABS(DEN2))-LOG(ABS(DEN1)))/(LOG(APROG))
  75. ELSE
  76. XNBELE=min(1.D0/DEN1,dble(igrand))
  77. XNBELE=max(xnbele,-2.d0**31)
  78. ENDIF
  79. if(.not.(xnbele.ge.xpetit)) xnbele=xpetit
  80. NBELEM=INT(XNBELE)
  81. NBELEM=MAX(1,NBELEM)
  82. IF (XNBELE/NBELEM.GT.(NBELEM+1)/XNBELE) NBELEM=NBELEM+1
  83. ENDIF
  84. IF (LPROG) THEN
  85. DEN1=(1.D0-APROG)/((1.D0-APROG**NBELEM)*APROG)
  86. ELSE
  87. DEN1=1.D0/REAL(NBELEM)
  88. ENDIF
  89. DENI=DEN1*DLONG*SQRT(APROG)
  90. DENF=DENI*(APROG**NBELEM)
  91. *dbg write(6,*) 'DENI,DENF=',DENI,DENF
  92. DECA=DENF-DENI
  93. ENDIF
  94. * write(6,*) ' decoup nbelem deni deca',nbelem,deni,deca
  95. * if (deni.LE.xzprec) write(6,*) ' deni < xzprec'
  96. if (nbelem.GT.igranD) nbelem=1
  97. RETURN
  98. END
  99.  
  100.  

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