oooadj
C OOOADJ SOURCE PV090527 26/04/24 08:22:59 12524 SUBROUTINE OOOADJ (LRET,PSEG,IDI1,JDES,NTAB) C-------------------------------------------------------------------- C C REALISER LA FONCTION : SEGADJ , PSEG C C PSEG POINTEUR SUR LE SEGMENT A AJUSTER (VOIR : ISEG=PSEG) C IDI1 TEL QUE : ISEG((IDI1-4)+1) = VALEUR DE LA PREMIERE C DIMENSION DU PREMIER TABLEAU DE PSEG . C JDES POUR LE I IEME TABLEAU DU SEGMENT , (I=1,NTAB) : C C TYPE=JDES(I) : TYPE DES ELEMENTS DU TABLEAU C SOUS LA FORME : TYLN*10000+NBBE C NBBE : NOMBRE DE BITS PAR ELEMENT DU TABLEAU C TYLN : (KTYP-1)*3+KLNI C C NBBM=JDES(NT+1) : NOMBRE DE BITS PAR MOT C C LDIM=JDES(NT+1+I) : INDICE DE LA DESCRIPTION C NDIM=JDES(NT+2+I)-LDIM-1 : NOMBRE DE DIMENSIONS C JDIM=2*NT+2+LDIM C NEWD=JDES(JDIM+K) : K IEME DIMENSION AJUSTEE C C POUR TOUT LES TABLEAUX SAUF LE PREMIER , JDES(JDIM) C PEUT ETRE UTILISE COMME MEMOIRE DE TRAVAIL PAR OOOADJ C C POUR LE PREMIER TABLEAU AAA , JDES(JDIM) CONTIENT C LE DEPLACEMENT IDO1 DE AAA PAR RAPPORT AU DEBUT DE C PSEG . TEL QUE SI XXX DU MEME TYPE QUE AAA MIS EN C EQUIVALENCE AVEC LE DEBUT DE PSEG : C XXX(IDO1+1) <=> AAA(1) C C KLNI C 1 2 3 C ---------------------------------------------- C I LOGICAL I LOGICAL*2 I LOGICAL*1 I 1 C ---------------------------------------------- C I INTEGER I INTEGER*2 I INTEGER*1 I 2 C ---------------------------------------------- C I REAL I REAL *8 I REAL *16 I 3 KTYP C ---------------------------------------------- C I COMPLEX I COMPLEX*16 I COMPLEX*32 I 4 C ---------------------------------------------- C I CHARACTER I I I 5 C ---------------------------------------------- C C C----------------------------------------------------------------------- C C LA METHODE UTILISEE C C ON EFFECTUE DEUX PASSAGES SUR TOUT LES TABLEAUX DU SEGMENT C C PREMIER PASSAGE : EXAMEN DES TABLEAUX DANS L'ORDRE GAUCHE C DROITE A LA RECHERCHE DES REDUCTIONS DE C DIMENSION QU'ON EFFECTUE A MESURE . C REDUCTION EVENTUELLE DU SEGMENT (OOOXTR) C C DEUXIEME PASSAGE : EXTENSION EVENTUELLE DU SEGMENT (OOOXTN) C EXAMEN DES TABLEAUX DANS L'ORDRE DROITE C GAUCHE A LA RECHERCHE DES EXTENSIONS DE C DIMENSION QU'ON EFFECTUE A MESURE . C C MODIFICATION POUR UN TABLEAU C C SOIT TN UN TABLEAU FORTRAN A K INDICES DE DIMENSIONS C RESPECTIVES N1 , N2 , ... , NK POUR MODIFIER (REDUIRE C OU AUGMENTER) LA DIMENSION DU I IEME INDICE ET REALISER C L'IMPLANTATION MEMOIRE CORRESPONDANT A CETTE MODIFICATION C ON CONSIDERE LE TABLEAU FORTRAN EQUIVALENT A DEUX INDICES C TM(M1,M2) AVEC : M1 = N1*...*NI , M2 = (N1*...*NK)/M1 C DANS LEQUEL ON MODIFIE LE PREMIER INDICE . C C SOIT MM LE NOUVEAU PREMIER INDICE : C C SI MM < M1 C C DO J = 2 , M2 C DO I = 1 , MM C TM(I+(J-1)*MM) = TM(I+(J-1)*M1) C C SI MM > M1 C C DO J = M2 , 2 , -1 C DO I = M1 , 1 , -1 C TM(I+(J-1)*MM) = TM(I+(J-1)*M1) C C PROGRAMMEUR : MOUGIN C MODIF : 11/02/87 => ERREURS DANS DES CAS DE DIMENSIONS NULLES C MODIF : 27/01/89 INTRODUIRE DANS LA FAMILLE OOOW.. C C----------------------------------------------------------------------- %INC IOOWCOM %INC IOOUNIT %INC IOOSGM %INC IOOADR %INC IOODES C----------------------------------------------------------------------- C C EN PREALABLE AUX REDUCTIONS DE TABLEAUX C C ->NBBM NOMBRE DE BITS PAR MOT C ->JDES(JDIM) LES DEPLACEMENTS DES TABLEAUX APRES REDUCTION C ->KTAB L'INDICE DU PREMIER TABLEAU AYANT UNE REDUCTION C ->NMOT NOMBRE DE MOTS DU NOUVEAU SEGMENT C C NDIM NOMBRE DE DIMENSIONS DU TABLEAU C IDIM INDICE DANS ISEG DES DEPLACEMENT ET DIMENSIONS C JDIM INDICE DANS JDES DE LA DESCRIPTION DU TABLEAU C NBBE NOMBRE DE BITS PAR ELEMENT DU TABLEAU C NEL0 DEPLACEMENT INITIAL DU TABLEAU C NEL1 DEPLACEMENT DU TABLEAU C NELB NOMBRE D'ELEMENTS DU TABLEAU C NBIT NOMBRE DE BITS DU SEGMENT C C----------------------------------------------------------------------- %IF UNIX32,WIN32 C Pour eviter l'overflow sur nbit REAL*8 NBIT,NBBE %ENDIF INTEGER TYLN , JDES(NTAB) LOGICAL LMODJ SEGMENT , ISEG(0)*I POINTEUR PSEG.ISEG C LWAIT=.TRUE. duree dans ooowait seulement C LGLL =.TRUE. duree dans ooogll seulement INTEGER ITTIME(4) LOGICAL LGLL,LWAIT CHARACTER*(6) HDUREE C Logique pour chronométrer l'attente LGLL =MZATTE .LT. 0 .AND. thread LWAIT =MZATTE .GT. 0 LRET=2 igll=1 NBBM=JDES(NTAB+1) ISEG=PSEG KTAB=NTAB+1 DO JTAB=1,NTAB LDIM=JDES(NTAB+1+JTAB) NDIM=JDES(NTAB+2+JTAB)-LDIM-1 JDIM=LDIM+2*NTAB+2 IDIM=LDIM+IDI1-5 NBBE=MOD(JDES(JTAB),10000) IF (JTAB.EQ.1) THEN NEL1=JDES(JDIM) ELSE NEL0=ISEG(IDIM) NEL1=(NBIT+NBBE-1)/NBBE JDES(JDIM)=NEL1 IF (NEL1.GT.NEL0) GO TO 901 ENDIF NELB=1 DO KDIM=1,NDIM IIII=ISEG(IDIM+KDIM) IF (IIII.LT. 0) GO TO 902 JJJJ=JDES(JDIM+KDIM) IF (JJJJ.LT. 0) GO TO 903 IF (JJJJ.LT.IIII) KTAB=MIN(KTAB,JTAB) NELB=NELB*MIN(JJJJ,IIII) ENDDO NBIT=(NEL1+NELB)*NBBE ENDDO NMOT=(NBIT+NBBM-1)/NBBM C----------------------------------------------------------------------- C C POUR CHACUN DES TABLEAUX , DE GAUCHE A DROITE C ON EFFECTUE TOUTES LES REDUCTIONS C IF (KTAB.LE.NTAB) THEN DO JTAB=KTAB,NTAB C ->IDOA DEPLACEMENT DU TABLEAU AVANT DECALAGE GLOBAL LDIM=JDES(NTAB+1+JTAB) NDIM=JDES(NTAB+2+JTAB)-LDIM-1 IDIM=LDIM+IDI1-5 JDIM=LDIM+2*NTAB+2 IF (JTAB.EQ.1) THEN IDOA=JDES(JDIM) ELSE IDOA=ISEG(IDIM) ENDIF C ->LMODJ VRAI SI AU MOINS UNE DES DIMENSIONS EST REDUITE C ->NELA LE NOMBRE D'ELEMENT DU TABLEAU DE DEPART C ->NELB LE NOMBRE D'ELEMENT DU TABLEAU REDUIT LMODJ=.FALSE. NELA = 1 NELB = 1 DO KDIM=1,NDIM LMODJ= LMODJ .OR. (ISEG(IDIM+KDIM) .GT. JDES(JDIM+KDIM)) NELA = NELA * ISEG(IDIM+KDIM) NELB = NELB * MIN(ISEG(IDIM+KDIM) , JDES(JDIM+KDIM)) ENDDO C DECALAGE GLOBAL A GAUCHE DU TABLEAU C MISE A JOUR DU DEPLACEMENT DANS LE SEGMENT C C TYLN TYPE DES ELEMENTS DU TABLEAU C NBBE NOMBRE DE BITS PAR ELEMENT DU TABLEAU C IDOZ CORRECTION AUX DEPLACEMENTS POUR TENIR COMPTE DES C DIMENSIONS DES SEGMENT D'ACCES (VOIR : OOOADG) C IDOB DEPLACEMENT DU TABLEAU APRES DECALAGE GLOBAL TYLN= JDES(JTAB)/10000 NBBE=MOD(JDES(JTAB),10000) IDOZ=MAX(1,INT(NBBM/NBBE)) IDOB=JDES(JDIM) IDOO=IDOB-IDOZ IF (IDOB.LT.IDOA) THEN IF (NELB.GT.0) then if (thread .and. igll .eq. 1) call ooogll(0) igll=0 endif CALL OOOADG (ISEG,TYLN,NELA,IDOO,IDOA-IDOZ) ISEG(IDIM)=IDOB ENDIF C POUR CHACUNE DES DIMENSIONS DU TABLEAU IF (LMODJ) THEN MM =1 DO KDIM=1,NDIM C ->M1 LA PREMIERE DIMENSION DU TABLEAU TM C ->MM LA PREMIERE DIMENSION DU TABLEAU TM AJUSTEE IIII= ISEG(IDIM+KDIM) JJJJ=MIN(JDES(JDIM+KDIM),IIII) M1 =MM*IIII MM =MM*JJJJ IF (JJJJ.LT.IIII) THEN C MISE A JOUR DE LA DIMENSION DANS LE SEGMENT ISEG(IDIM+KDIM)=JJJJ IF (NELB.GT.0) THEN C ->M2 LA DEUXIEME DIMENSION DU TABLEAU TM C ->NELA DIMENSION TOTALE DU TABLEAU TM AJUSTEE M2 =NELA/M1 NELA=MM*M2 C DECALAGE A GAUCHE DU TABLEAU IF (M2.GT.1.and.mm.gt.0) THEN if (thread .and. igll .eq. 1) call ooogll(0) igll=0 DO J=2,M2 CALL OOOADG (ISEG,TYLN,MM,IDOO+(J-1)*MM,IDOO+(J-1)*M1) ENDDO ENDIF ENDIF ENDIF ENDDO ENDIF ENDDO C EFFECTUER LA REDUCTION DE TAILLE DU SEGMENT C Mesure du TEMPS if (LGLL) CALL oootps(ITTIME,nth) if (thread .and. igll .eq. 0) then call ooogll(1) igll=1 endif if (LGLL) then C Mesure de l'attente ITPS0=ITTIME(1)+ITTIME(2) CALL oootps(ITTIME,nth) IELAPS=ITTIME(1)+ITTIME(2)-ITPS0 IF(IELAPS .ge. ABS(MZATTE))THEN WRITE(HDUREE,'(i6)') IELAPS CALL OOOMES(PSEG,'GEMAT ATTEND'//HDUREE) ENDIF endif NMOTR=((NMOT+(MSLSM-1))/MSLSM)*MSLSM CALL OOOXTR (ISEG,NMOTR) ENDIF C----------------------------------------------------------------------- C C EN PREALABLE AUX EXTENTIONS DE TABLEAUX C C ->JDES(JDIM) LES DEPLACEMENTS DES TABLEAUX APRES EXTENSION C ->KTAB L'INDICE DU PREMIER TABLEAU AYANT UNE EXTENSION C ->NMOT NOMBRE DE MOTS DU NOUVEAU SEGMENT KTAB=NTAB+1 DO JTAB=1,NTAB LDIM=JDES(NTAB+1+JTAB) NDIM=JDES(NTAB+2+JTAB)-LDIM-1 JDIM=LDIM+2*NTAB+2 IDIM=LDIM+IDI1-5 NBBE=MOD(JDES(JTAB),10000) IF (JTAB.EQ.1) THEN NEL1=JDES(JDIM) ELSE NEL1=(NBIT+NBBE-1)/NBBE JDES(JDIM)=NEL1 ENDIF NELB=1 DO KDIM=1,NDIM IIII=ISEG(IDIM+KDIM) JJJJ=JDES(JDIM+KDIM) IF (JJJJ.GT.IIII) KTAB=MIN(KTAB,JTAB) NELB=NELB*JJJJ ENDDO NBIT=(NEL1+NELB)*NBBE ENDDO NMOT=(NBIT+NBBM-1)/NBBM C----------------------------------------------------------------------- C C POUR CHACUN DES TABLEAUX , DE DROITE A GAUCHE C ON EFFECTUE TOUTES LES EXTENSIONS C IF (KTAB.LE.NTAB) THEN C EFFECTUER L'EXTENSION DE TAILLE DU SEGMENT LSG1 = MSLS1(MDISG(ISEG)) LSG2 = (((NMOT+MSLCZ)+(MSLSM-1))/MSLSM)*MSLSM IF (LSG2.GT.LSG1) THEN C Mesure du TEMPS if (LGLL) CALL oootps(ITTIME,nth) if (thread .and. igll .eq. 0) then call ooogll(1) igll=1 endif if (LGLL) then C Mesure de l'attente ITPS0=ITTIME(1)+ITTIME(2) CALL oootps(ITTIME,nth) IELAPS=ITTIME(1)+ITTIME(2)-ITPS0 IF(IELAPS .ge. ABS(MZATTE))THEN WRITE(HDUREE,'(i6)') IELAPS CALL OOOMES(PSEG,'GEMAT ATTEND'//HDUREE) ENDIF endif NMOT1=NMOT+NMOT/10+MSLSM NMOTR=((NMOT1+(MSLSM-1))/MSLSM)*MSLSM CALL OOOEXT (LRET,ISEG,NMOTR) if (thread .and. igll .eq. 1) call ooogll(0) igll=0 IF (LRET.EQ.1) RETURN ENDIF if (thread .and. igll .eq. 1) call ooogll(0) igll=0 DO JTAB=NTAB,KTAB,-1 C ->IDOA DEPLACEMENT DU TABLEAU AVANT DECALAGE GLOBAL LDIM=JDES(NTAB+1+JTAB) NDIM=JDES(NTAB+2+JTAB)-LDIM-1 IDIM=LDIM+IDI1-5 JDIM=LDIM+2*NTAB+2 IF (JTAB.EQ.1) THEN IDOA=JDES(JDIM) ELSE IDOA=ISEG(IDIM) ENDIF C ->LMODJ VRAI SI AU MOINS UNE DES DIMENSIONS EST AUGMENTEE C ->NELA LE NOMBRE D'ELEMENT DU TABLEAU DE DEPART C ->NELB LE NOMBRE D'ELEMENT DU TABLEAU ETENDU LMODJ = .FALSE. NELA = 1 NELB = 1 DO KDIM=1,NDIM LMODJ = LMODJ .OR. (ISEG(IDIM+KDIM) .LT. JDES(JDIM+KDIM)) NELA = NELA * ISEG(IDIM+KDIM) NELB = NELB * JDES(JDIM+KDIM) ENDDO C DECALAGE GLOBAL A DROITE DU TABLEAU C MISE A JOUR DU DEPLACEMENT DANS LE SEGMENT C C TYLN TYPE DES ELEMENTS DU TABLEAU C NBBE NOMBRE DE BITS PAR ELEMENT DU TABLEAU C IDOZ CORRECTION AUX DEPLACEMENTS POUR TENIR COMPTE DES C DIMENSIONS DES SEGMENT D'ACCES (VOIR : OOOADD) C IDOB DEPLACEMENT DU TABLEAU APRES DECALAGE GLOBAL C C IDOO IDOB-IDOZ TYLN= JDES(JTAB)/10000 NBBE=MOD(JDES(JTAB),10000) IDOZ=MAX(1,INT(NBBM/NBBE)) IDOB=JDES(JDIM) IDOO=IDOB-IDOZ IF (IDOB.GT.IDOA) THEN IF (NELA.GT.0) CALL OOOADD (ISEG,TYLN,NELA,IDOO,IDOA-IDOZ) ISEG(IDIM)=IDOB ENDIF C POUR CHACUNE DES DIMENSIONS DU TABLEAU IF (NELB.GT.NELA) THEN CALL OOOADZ (ISEG,TYLN,NELB-NELA,IDOO+NELA) ENDIF IF (LMODJ) THEN MM =1 DO KDIM=1,NDIM C ->M1 LA PREMIERE DIMENSION DU TABLEAU TM C ->MM LA PREMIERE DIMENSION DU TABLEAU TM AJUSTEE IIII=ISEG(IDIM+KDIM) JJJJ=JDES(JDIM+KDIM) M1 =MM*IIII MM =MM*JJJJ IF (JJJJ.GT.IIII) THEN C MISE A JOUR DE LA DIMENSION DANS LE SEGMENT ISEG(IDIM+KDIM)=JJJJ C ->M2 LA DEUXIEME DIMENSION DU TABLEAU TM C ->NELA DIMENSION TOTALE DU TABLEAU TM AJUSTEE IF (NELA.GT.0) THEN M2 =NELA/M1 NELA=MM*M2 C DECALAGE A DROITE DU TABLEAU IF (M2.GT.1) THEN DO J=M2,2,-1 CALL OOOADD (ISEG,TYLN,M1,IDOO+(J-1)*MM,IDOO+(J-1)*M1) CALL OOOADZ (ISEG,TYLN,MM-M1,IDOO+(J-1)*MM+M1) ENDDO ENDIF CALL OOOADZ (ISEG,TYLN,MM-M1,IDOO +M1) ENDIF ENDIF ENDDO ENDIF ENDDO ELSE if (thread .and. igll .eq. 1) call ooogll(0) igll=0 ENDIF RETURN C----------------------------------------------------------------------- C C MESSAGES D'ERREUR C 901 CALL OOOERR (NEL0,1,'DEPLACEMENT DETRUIT DANS LE SEGMENT') GO TO 950 902 CALL OOOERR (IIII,1,'DIMENSION NEGATIVE DANS LE SEGMENT') GO TO 950 903 CALL OOOERR (JJJJ,1,'DIMENSION NEGATIVE DEMANDEE') GO TO 950 950 STOP 16 END
© Cast3M 2003 - Tous droits réservés.
Mentions légales