Télécharger ooomin.eso

Retour à la liste

Numérotation des lignes :

ooomin
  1. C OOOMIN SOURCE PV090527 26/04/24 08:23:14 12524
  2. SUBROUTINE OOOMIN (LRET,KZ,IS,LSEG)
  3. C--------------------------------------------------------------------
  4. C
  5. C G E S T I O N M E M O I R E
  6. C
  7. C ATTRIBUER UN BLOC DANS UNE ZONE MEMOIRE
  8. C
  9. C
  10. C ->LRET 1 PLUS DE PLACE MEMOIRE
  11. C 2 OK
  12. C
  13. C KZ TYPE ZONE MEMOIRE (FIXE OU DYNAMIQUE)
  14. C ->IS INDICE DU BLOC ATTRIBUE
  15. C =>LSEG DONNEE : NOMBRE DE MOTS DU BLOC
  16. C RESULTAT : RENDU MULTIPLE DE MSLSM
  17. C
  18. C PROGRAMMEUR : MOUGIN
  19. C MODIF : 21/12/88 UN PEU DE NETTOYAGE ...
  20. C
  21. C-----------------------------------------------------------------------
  22. C
  23. %INC IOOADR
  24. %INC IOOADZ
  25. %INC IOOSGM
  26. %INC IOOTRO
  27. %INC IOOTF1
  28. %INC IOOTF2
  29. %INC IOOWCOM
  30. C
  31. C
  32. C****** DEBUT DE LA RECHERCHE
  33. C
  34. MZJMM(QBESOINPLACE) = MZJMM(QBESOINPLACE)+1
  35.  
  36. C ARRONDI DE LSEG AU MULTIPLE SUPERIEUR DE MSLSM
  37. C SI PLACE TOTALE LIBRE INSUFFISANTE RETOUR
  38.  
  39. C on sauve la longeur initiale
  40. LSEGI=LSEG
  41. LSEG = ((LSEG+(MSLSM-1))/MSLSM)*MSLSM
  42. IF (LSEG.GT.MZLTROU(IZA,KZ)) THEN
  43. LRET = 1
  44. RETURN
  45. ENDIF
  46.  
  47. C INITIALISER LA RECHERCHE AVEC LE TROU DE PROCHAINE ATTRIBUTION
  48.  
  49. 10 IT0 = MZITS0(IZA,KZ)
  50. IT = IT0
  51. C
  52. C****** TROU DE LG SUFFISANT : ALGORITHME FIRST FIT
  53. C
  54. itpa = IT0
  55. ichain=0
  56. 20 IF (LSEG+MTLT1(IT).GT.0) THEN
  57. CASE , KZ
  58.  
  59. WHEN , ZMEMFIX
  60.  
  61. IT = INDICE_TROU_PRECEDENT(IT)
  62. MZJMM(NTROUSBALAYES)=MZJMM(NTROUSBALAYES)+1
  63. IF (IT.NE.IT0) GO TO 20
  64.  
  65. WHEN , ZMEMDYN
  66. ichain=ichain+1
  67. C PV on met eventuellement a jour le pointeur de prochaine attribution
  68. if (-MTLT1(ITPA).LT.-MTLT1(it)) then
  69. itpa=it
  70. ** MZITS0 (IZA,KZ)=itpa
  71. endif
  72.  
  73.  
  74. ITS = INDICE_TROU_SUIVANT(IT)
  75. if (.false.) then
  76. if (its.lt.it.and.it.ne.it0.and.its.ne.it0) then
  77. * permuter it et its dans la chaine
  78. ITP = INDICE_TROU_PRECEDENT(IT)
  79. ITSS= INDICE_TROU_SUIVANT(ITS)
  80. INDICE_TROU_PRECEDENT(ITSS)=IT
  81. INDICE_TROU_SUIVANT(IT)=ITSS
  82. INDICE_TROU_PRECEDENT(IT)=ITS
  83. INDICE_TROU_SUIVANT(ITS)=IT
  84. INDICE_TROU_PRECEDENT(ITS)=ITP
  85. INDICE_TROU_SUIVANT(ITP)=ITS
  86. endif
  87. endif
  88.  
  89.  
  90. IT=ITS
  91. MZJMM(NTROUSBALAYES)=MZJMM(NTROUSBALAYES)+1
  92. IF (ichain.lt.200000.and.IT.NE.IT0) GOTO 20
  93. ** write(6,*) 'OOOMIN fin de la chaine des trous',ichain
  94. ** write(6,*) 'mzltrou mzlen lseg',
  95. ** > mzltrou(iza,kz),mzlen(iza),lseg
  96.  
  97.  
  98.  
  99. * IF (MZLTROU(IZA,KZ).GE.MZLEN(IZA)*0.05.AND.
  100. * > MZLTROU(IZA,KZ).GE.LSEG
  101. * > .and.ichain.ge.200000) THEN
  102. IF ((MZLTROU(IZA,KZ).GE.MZLEN(IZA)*0.05.or.
  103. > ichain.ge.200000).AND.MZLTROU(IZA,KZ).GE.LSEG) then
  104. IF (TESOOO) THEN
  105. CALL OOOWER (' OOOMIN => OOOMTA : TASSEMENT')
  106. ENDIF
  107. * write(6,*) 'appel OOOMTA dans ooomin'
  108. CALL OOOMTA (LRET,LSEG)
  109. IF (TESOOO) THEN
  110. CALL OOOWER (' OOOMIN <= OOOMTA')
  111. ENDIF
  112. IF (LRET.EQ.2) GO TO 10
  113. ENDIF
  114. ENDCASE
  115.  
  116. LRET = 1
  117. RETURN
  118. ENDIF
  119.  
  120. C****** SI LE TROU CORRESPOND JUSTE A LA DEMANDE,ON LE RETIRE DE LA
  121. C CHAINE DES TROUS
  122.  
  123. MZLTROU(IZA,KZ) = MZLTROU(IZA,KZ)-LSEG
  124. LENT = -MTLT1(IT)-LSEG
  125.  
  126. ITP = INDICE_TROU_PRECEDENT(IT)
  127. ITS = INDICE_TROU_SUIVANT (IT)
  128.  
  129. C****** RETIRE LE TROU IT DE LA CHAINE DES TROUS
  130.  
  131. if(itpa.eq.it) itpa=0
  132. IF (LENT.EQ.0) THEN
  133. if(itpa.ne.0) then
  134. MZITS0(IZA,KZ) = ITPA
  135. else
  136. MZITS0(IZA,KZ) = ITS
  137. endif
  138. INDICE_TROU_SUIVANT (ITP) = ITS
  139. INDICE_TROU_PRECEDENT(ITS) = ITP
  140. INDICE_TROU_PRECEDENT(IT) = 0
  141. INDICE_TROU_SUIVANT (IT) = 0
  142. IS = IT
  143.  
  144. C****** ATTRIBUTION A DROITE DANS LE TROU
  145.  
  146. ELSE
  147. IF (MZATGD(IZA,KZ).NE.0) THEN
  148. IS = IT+LENT
  149.  
  150. C****** ATTRIBUTION A GAUCHE DANS LE TROU
  151.  
  152. ELSE
  153. IS = IT
  154. INDICE_TROU_PRECEDENT(IT) = 0
  155. INDICE_TROU_SUIVANT (IT) = 0
  156. IT = IT+LSEG
  157. INDICE_TROU_PRECEDENT(IT ) = ITP
  158. INDICE_TROU_SUIVANT (IT ) = ITS
  159. INDICE_TROU_PRECEDENT(ITS) = IT
  160. INDICE_TROU_SUIVANT (ITP) = IT
  161. ENDIF
  162. MTLT1(IT) = -LENT
  163. MTLT2(IT) = -LENT
  164.  
  165. C****** LE TROU EST RETENU POUR PROCHAINE ATTRIBUTION
  166. C SAUF SI ON EST EN EXTENSION OU SI ON EST SUR LA
  167. C ZONE MEMOIRE DYNAMIQUE FIXE .
  168. C DANS CE CAS ON FAIT PASSER LE TROU RESULTANT DE LA ZONE
  169. C FIXE --> DYNAMIQUE
  170.  
  171. IF (IT.EQ.MZDLIM(IZA) .AND. KZ.EQ.ZMEMFIX) THEN
  172. IF (IT.EQ.MZITS0(IZA,ZMEMFIX)) THEN
  173. MZITS0(IZA,ZMEMFIX) = INDICE_TROU_SUIVANT(IT)
  174. ENDIF
  175. MTF1 , IZA(IT,LENT)
  176. MZLTROU(IZA,ZMEMFIX)=MZLTROU(IZA,ZMEMFIX)-LSEG
  177. MTF2 , IZA(ZMEMDYN,IT,LENT)
  178. MZLTROU(IZA,ZMEMDYN)=MZLTROU(IZA,ZMEMDYN)+LSEG
  179. MZDLIM (IZA)=IS
  180. ELSE
  181. if(itpa.ne.0) then
  182. MZITS0(IZA,KZ) = ITPA
  183. else
  184. MZITS0(IZA,KZ) = IT
  185. endif
  186. ENDIF
  187. ENDIF
  188.  
  189. C PV on pointe sur le plus grand trou dispo pour la prochaine
  190. C attribution
  191. it=MZITS0(IZA,KZ)
  192. if(itpa.ne.0) then
  193. if (-MTLT1(IT).LT.-MTLT1(itpa)) it=itpa
  194. endif
  195. if (-MTLT1(IT).LT.-MTLT1(itp)) it=itp
  196. if (-MTLT1(IT).LT.-MTLT1(its)) it=its
  197. MZITS0 (IZA,KZ)=it
  198.  
  199. MSLS1 (IS) = LSEG
  200. MSLS2 (IS) = LSEG
  201. C on met a -1 la zone comprise entre les longeurs initiales et corrigees
  202. C* DO 30 IP=LSEGI-MSLZ2+1,LSEG-MSLZ2
  203. C* JSG(IS+IP)=-1
  204. C*30 CONTINUE
  205. C
  206. LRET = 2
  207.  
  208. END
  209.  
  210.  

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