Télécharger comred.eso

Retour à la liste

Numérotation des lignes :

comred
  1. C COMRED SOURCE PV090527 24/04/04 21:15:07 11875
  2.  
  3. SUBROUTINE COMRED(ich1)
  4.  
  5. C---------------------------------------------------------------
  6. C reduit la taille d'un melval s'il est constant
  7. C
  8. C ich1 segment de type MELVAL (ACTIF en E/S)
  9. C nouveau segment si necessaire
  10. C---------------------------------------------------------------
  11.  
  12. IMPLICIT INTEGER(I-N)
  13. IMPLICIT REAL*8(A-H,O-Z)
  14.  
  15. -INC SMCHAML
  16. -INC CCREEL
  17.  
  18. melval = ich1
  19.  
  20. C Valeurs reelles :
  21. C -----------------
  22. n1ptel = velche(/1)
  23. n1el = velche(/2)
  24. if (n1el.gt.1 .or. n1ptel.gt.1) then
  25. n1pteo=n1ptel
  26. n1elo =n1el
  27.  
  28. C ymaxe* : min et max generaux
  29. ymaxe1 = xgrand
  30. ymaxe2 = -xgrand
  31.  
  32. C Cas general :
  33. if (n1ptel .gt. 1) then
  34. C Est-on constant par element ?
  35. do ipel = 1, n1el
  36. C ymaxd* : min et max sur l'element
  37. ymaxd1 = xgrand
  38. ymaxd2 = -xgrand
  39. do igel = 1, n1ptel
  40. valu1 = velche(igel,ipel)
  41. ymaxd1 = min(valu1,ymaxd1)
  42. ymaxd2 = max(valu1,ymaxd2)
  43. enddo
  44. C Est-on constant sur l'element ipel ?
  45. C Utilisation de la MACRO A_EGALE_B pour uniformiser le test d'egalite de flottants (CCREEL)
  46. if (.NOT. A_EGALE_B(ymaxd2,ymaxd1)) return
  47. ymaxe1=min(ymaxe1,ymaxd1)
  48. ymaxe2=max(ymaxe2,ymaxd2)
  49. enddo
  50. C Ici, on est a minima constant par element :
  51. n1ptel = 1
  52. C Est-on uniforme ?
  53. C Utilisation de la MACRO A_EGALE_B pour uniformiser le test d'egalite de flottants (CCREEL)
  54. if (A_EGALE_B(ymaxe2,ymaxe1)) n1el = 1
  55. C Cas particulier : le champ est deja constant par element (n1ptel=1)
  56.  
  57. else
  58. do ipel = 1, n1el
  59. valu1 = velche(1,ipel)
  60. ymaxe1=min(ymaxe1,valu1)
  61. ymaxe2=max(ymaxe2,valu1)
  62. enddo
  63.  
  64. C Est-on uniforme ?
  65. ymaxr=max(max(abs(ymaxe1),abs(ymaxe2))*xzprec,xpetit)
  66. if (.NOT. A_EGALE_B(ymaxe2,ymaxe1)) return
  67. n1el = 1
  68. endif
  69.  
  70. n2ptel = 0
  71. n2el = 0
  72. if (n1ptel.ne.n1pteo.or.n1el.ne.n1elo) then
  73. if(n1ptel.eq.0) then
  74. write(6,*) 'comred n1elo,n1pteo',n1elo,n1pteo
  75. call erreur(5)
  76. endif
  77. segadj,melval
  78. endif
  79. endif
  80.  
  81.  
  82. C Valeurs de type pointeur :
  83. C --------------------------
  84. n2ptel = ielche(/1)
  85. n2el = ielche(/2)
  86. if (n2el.gt.1 .or. n2ptel.gt.1) then
  87. n2pteo=n2ptel
  88. n2elo=n2el
  89. jalu1 = ielche(1,1)
  90. maxd1 = 0
  91. C Cas general :
  92. if (n2ptel.gt.1) then
  93. do ipel = 1, n2el
  94. jalu2 = ielche(1,ipel)
  95. C Est-on constant sur l'element ipel ?
  96. maxd2 = 0
  97. do igel = 2, n2ptel
  98. jiff = abs(ielche(igel,ipel) - jalu2)
  99. maxd2 = max(jiff,maxd2)
  100. enddo
  101. if (maxd2.ne.0) return
  102. jiff = abs(jalu2 - jalu1)
  103. maxd1 = max(jiff,maxd1)
  104. enddo
  105. C Ici, on est a minima constant par element :
  106. n2ptel = 1
  107. C Est-on uniforme ?
  108. if (maxd1.eq.0) n2el = 1
  109. C Cas particulier : le champ est deja constant par element (n2ptel=1)
  110. else
  111. do ipel = 2, n2el
  112. jalu2 = ielche(1,ipel)
  113. jiff = abs(jalu2 - jalu1)
  114. maxd1 = max(jiff,maxd1)
  115. enddo
  116. C Est-on uniforme ?
  117. if (maxd1.gt.0) return
  118. n2el = 1
  119. endif
  120. n1ptel = 0
  121. n1el = 0
  122. if (n2ptel.ne.n2pteo.or.n2el.ne.n2elo) then
  123. segadj,melval
  124. segact melval
  125. endif
  126. endif
  127.  
  128. END
  129.  
  130.  
  131.  
  132.  
  133.  

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