Télécharger rpelem.eso

Retour à la liste

Numérotation des lignes :

rpelem
  1. C RPELEM SOURCE CB215821 18/09/27 21:15:49 9936
  2. SUBROUTINE RPELEM(NUELG,RPMAIL,
  3. $ NOSOUS,NOELEM,
  4. $ IMPR,IRET)
  5. IMPLICIT INTEGER(I-N)
  6. IMPLICIT REAL*8 (A-H,O-Z)
  7. C***********************************************************************
  8. C NOM : RPELEM
  9. C DESCRIPTION : Numéro "global" d'un élément + liste d'entiers(inirpl)
  10. C => numéro de la partition + numéro "local" de
  11. C l'élément.
  12. C
  13. C On donne un numéro d'élément NUELG d'un maillage MAIL
  14. C repéré par RPMAIL (construit avec inirpl.eso).
  15. C On sort : - NOSOUS : le numéro du LISOUS (peut être nul)
  16. C où se trouve NUELG.
  17. C - NOELEM : le numéro de NUELG dans le LISOUS.
  18. C LANGAGE : ESOPE
  19. C AUTEUR : Stéphane GOUNAND (CEA/DRN/DMT/SEMT/TTMF)
  20. C mél : gounand@semt2.smts.cea.fr
  21. C***********************************************************************
  22. C APPELES (ESOPE) : OOOETA
  23. C APPELE PAR : PONBPO,
  24. C***********************************************************************
  25. C ENTREES : NUELG, RPMAIL
  26. C SORTIES : NOSOUS, NOELEM
  27. C CODE RETOUR (IRET) : = 0 si tout s'est bien passé
  28. C***********************************************************************
  29. C VERSION : v1, 12/05/99, version initiale
  30. C HISTORIQUE : v1, 12/05/99, création
  31. C HISTORIQUE : 05/01/00 : modif. algorithme de recherche du numéro de
  32. C partition : séquentiel (O(n)) -> Binary search (O(log n))
  33. C HISTORIQUE :
  34. C HISTORIQUE :
  35. C***********************************************************************
  36. C Prière de PRENDRE LE TEMPS de compléter les commentaires
  37. C en cas de modification de ce sous-programme afin de faciliter
  38. C la maintenance !
  39. C***********************************************************************
  40.  
  41. -INC PPARAM
  42. -INC CCOPTIO
  43. -INC SMLENTI
  44. POINTEUR RPMAIL.MLENTI
  45. *
  46. INTEGER RPETA
  47. INTEGER IMPR,IRET
  48.  
  49. *
  50. INTEGER NOELEM,NOSOUS
  51. INTEGER NUELG ,NBSOUS
  52. INTEGER NUMAX
  53. INTEGER IDX,IDXMIL,IDXINF,IDXSUP
  54. INTEGER VAL,VALMIL
  55. *
  56. * Executable statements
  57. *
  58. IF (IMPR.GT.3) THEN
  59. WRITE(IOIMP,*) 'Entrée dans rpelem.eso'
  60. ENDIF
  61. CALL OOOETA(RPMAIL,RPETA,IMOD)
  62. IF (RPETA.NE.1) SEGACT RPMAIL
  63. NBSOUS=RPMAIL.LECT(/1)-1
  64. NUMAX=RPMAIL.LECT(NBSOUS+1)
  65. IF ((NUELG.GE.NUMAX).OR.(NUELG.LE.0)) THEN
  66. WRITE(IOIMP,*) 'NUELG=',NUELG,' trop grand ou trop petit'
  67. GOTO 9999
  68. ENDIF
  69. IF (NBSOUS.EQ.1) THEN
  70. NOSOUS=0
  71. NOELEM=NUELG
  72. ELSE
  73. VAL=NUELG
  74. IDX=-1
  75. IDXINF=1
  76. IDXSUP=NBSOUS
  77. *
  78. * Algorithme de recherche modifié (binary search)
  79. * (cf. ifidic.eso)
  80. *
  81. 1 CONTINUE
  82. IF (IDXSUP.GE.IDXINF) THEN
  83. IDXMIL=(IDXINF+IDXSUP)/2
  84. VALMIL=RPMAIL.LECT(IDXMIL)
  85. IF (VAL.LT.VALMIL) THEN
  86. IDXSUP=IDXMIL-1
  87. GOTO 1
  88. ELSEIF (VAL.GT.VALMIL) THEN
  89. IDXINF=IDXMIL+1
  90. GOTO 1
  91. ELSE
  92. IDX=IDXMIL
  93. ENDIF
  94. ENDIF
  95. IF (IDX.NE.-1) THEN
  96. NOSOUS=IDX
  97. NOELEM=1
  98. ELSE
  99. NOSOUS=IDXSUP
  100. NOELEM=NUELG-RPMAIL.LECT(NOSOUS)+1
  101. ENDIF
  102. ENDIF
  103. IF (RPETA.NE.1) SEGDES RPMAIL
  104. IF (IMPR.GT.5) THEN
  105. WRITE(IOIMP,*) 'NOSOUS=',NOSOUS,' NOELEM=',NOELEM
  106. ENDIF
  107. *
  108. * Normal termination
  109. *
  110. IRET=0
  111. RETURN
  112. *
  113. * Format handling
  114. *
  115. *
  116. * Error handling
  117. *
  118. 9999 CONTINUE
  119. IRET=1
  120. WRITE(IOIMP,*) 'An error was detected in subroutine rpelem'
  121. RETURN
  122. *
  123. * End of subroutine RPELEM
  124. *
  125. END
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  

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