ooomsu
C OOOMSU SOURCE PV090527 26/04/24 08:23:16 12524 SUBROUTINE OOOMSU (IZ,IS,LS) C------------------------------------------------------------------- C C LIBERER UN BLOC DANS UNE ZONE MEMOIRE C C IZ INDICE DE LA ZONE MEMOIRE ( DONNEE ) C =>IS INDICE DU BLOC A LIBERER ( DONNEE ET RESULTAT ) C =>LS NOMBRE DE MOTS DU BLOC ( DONNEE ET RESULTAT ) C C AU RETOUR LS ET IS DESIGNENT LE TROU RESULTAT DE CETTE C LIBERATION , ILS PEUVENT DIFFERER DES DONNEES SI IL Y A EU C RECOLLAGE AVEC DES TROUS CONTIGUS C C PROGRAMMEUR : MOUGIN C MODIF : 10/12/89 SUPPRIMER L'ARGUMENT LRET QUI NE SERT A RIEN C MODIF : 31/01/89 INTRODUIRE LA MODIF DE PV C C------------------------------------------------------------------- C %INC IOOADR %INC IOOADZ %INC IOOTRO %INC IOOTF1 %INC IOOTF2 %INC IOOSGM C LS0=LS C SITUATION DU BLOC A LIBERER IF (IS.LT.MZDLIM(IZ)) THEN KZ=ZMEMDYN ELSE KZ=ZMEMFIX ENDIF C C****** RAZ DU BLOC ET MISE A JOUR DU COMPTEUR DE PLACE LIBRE C CALL OOOZMR (JSG(IS+1),LS) C****** RECOLLER AVEC UN TROU A GAUCHE EVENTUEL C IF (MTROUG(IS)) THEN LT = -MTLTP(IS) IT = IS-LT MTLTP(IS) = 0 C RECOLLER AVEC UN TROU A DROITE EVENTUEL C QU'ON RETIRE ALORS DE LA CHAINE DES TROUS IF (MTROU(IS+LS)) THEN ITD = IS+LS LTD = -MTLT1(ITD) ITDS = INDICE_TROU_SUIVANT(ITD) MTF1 , IZ(ITD,LTD) ELSE LTD = 0 ENDIF IS = IT LS = LT+LS+LTD C IF (IS.LT.MZDLIM(IZ) .AND. IS+LS.GT.MZDLIM(IZ)) THEN MZDLIM(IZ)=IS+LS MZLTROU(IZ,ZMEMFIX)=MZLTROU(IZ,ZMEMFIX)-LTD MZLTROU(IZ,ZMEMDYN)=MZLTROU(IZ,ZMEMDYN)+LS0+LTD IF (MZITS0(IZ,ZMEMFIX).EQ.ITD) THEN MZITS0(IZ,ZMEMFIX)=ITDS ENDIF KZ=ZMEMDYN ELSE MZLTROU(IZ,KZ)=MZLTROU(IZ,KZ)+LS0 ENDIF C C****** RECOLLER AVEC UN TROU A DROITE EVENTUEL C MISE A JOUR DES CHAINAGES DES TROUS ADJACENTS DE LA CHAINE C ET TRANSPORT DU CHAINAGE DANS LE NOUVEAU TROU ELSEIF (MTROU(IS+LS)) THEN IT = IS+LS LT = -MTLT1(IT) ITP = INDICE_TROU_PRECEDENT(IT) ITS = INDICE_TROU_SUIVANT (IT) INDICE_TROU_PRECEDENT(ITS) = IS INDICE_TROU_SUIVANT (ITP) = IS LS=LS+LT INDICE_TROU_PRECEDENT(IS) = ITP INDICE_TROU_SUIVANT (IS) = ITS MTZERO(IT) = 0 C IF (IS.EQ.MZDLIM(IZ)) THEN IF (MZITS0(IZ,ZMEMFIX).EQ.IT) THEN MZITS0(IZ,ZMEMFIX)=ITS ENDIF MTF1 , IZ(IS,LS) MZLTROU(IZ,ZMEMFIX)=MZLTROU(IZ,ZMEMFIX)-LT MTF2 , IZ(ZMEMDYN,IS,LS) MZLTROU(IZ,ZMEMDYN)=MZLTROU(IZ,ZMEMDYN)+LS MZDLIM(IZ)=IS+LS KZ=ZMEMDYN ELSE MZLTROU(IZ,KZ)=MZLTROU(IZ,KZ)+LS0 ENDIF C C****** PAS DE RECOLLAGE : ON INSERT UN NOUVEAU TROU C ELSE IF (IS.EQ.MZDLIM(IZ)) THEN MZLTROU(IZ,ZMEMDYN)=MZLTROU(IZ,ZMEMDYN)+LS MTF2 , IZ(ZMEMDYN,IS,LS) MZDLIM(IZ)=IS+LS ELSE MTF2 , IZ(KZ,IS,LS) MZLTROU(IZ,KZ)=MZLTROU(IZ,KZ)+LS ENDIF ENDIF C C****** LONGUEUR DU TROU ET COMPTEUR DE PROCHAINE ATTRIBUTION : C MTLT1(IS)=-LS MTLT2(IS)=-LS C PV POINTEUR SUR PROCHAINE ATTRIBUTION MIS A JOUR SI INTERESSANT IT=MZITS0(IZ,KZ) IF (-MTLT1(IT).LT.LS) MZITS0(IZ,KZ)=IS IF (MSLS1(MZPRTR).EQ.0.OR.MZPRTR.EQ.IS) MZPRTR=IS+LS RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales