Télécharger comred.eso

Retour à la liste

Numérotation des lignes :

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

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