C OUEXCL SOURCE MAUGIS 07/10/10 21:15:07 5889 SUBROUTINE OUEXCL(IPT1,IPT2,MELEME) *============================================================= * * CE SOUS PROGRAMME REALISE L'OPERATION "OU EXCLUSIF" SUR DEUX LIGNES * IL INTERVIENT DANS LA FUSION DES CONTOURS DE DEUX OBJETS SURFACIQUE * *============================================================= * * Création : ??? * Modifications : PM 05/10/2007 * gère les éléments dégénérés (à noeuds doubles) * *============================================================= * * REMARQUES: * *============================================================= IMPLICIT INTEGER(I-N) -INC CCOPTIO -INC SMELEME -INC SMCOORD SEGMENT INV(NBT) SEGMENT NINV(NBNO) SEGMENT NPOS(NBNO) SEGMENT ICPR(XCOOR(/1)/(IDIM+1)) SEGMENT IVU(NBVU) SEGACT IPT1,IPT2 * Type d'élément incorrect ? IF (IPT1.ITYPEL .NE.IPT2.ITYPEL ) CALL ERREUR(16) IF (IPT1.NUM(/1).NE.IPT2.NUM(/1)) CALL ERREUR(16) IF (IERR.NE.0) RETURN NBREF = 0 NBNN = IPT1.NUM(/1) NBELE1 = IPT1.NUM(/2) NBELE2 = IPT2.NUM(/2) * DETERMINATION DU NOMBRE DE NOEUDS SEGACT MCOORD SEGINI ICPR NBNO=0 DO I=1,NBELE1 DO 15 J=1,NBNN IPT=IPT1.NUM(J,I) IF (ICPR(IPT).NE.0) GOTO 15 NBNO=NBNO+1 ICPR(IPT)=NBNO 15 CONTINUE ENDDO * NB MAX ELEMENTS TOUCHANT UN NOEUD SEGINI NINV,NPOS DO I=1,NBELE1 DO J=1,NBNN NINV(ICPR(IPT1.NUM(J,I)))=NINV(ICPR(IPT1.NUM(J,I)))+1 ENDDO ENDDO NBC=0 NBT=0 DO I=1,NBNO NBC=MAX(NBC,NINV(I)) NPOS(I)=NBT NBT=NBT+NINV(I) NINV(I)=0 ENDDO SEGINI INV DO I=1,NBELE1 DO J=1,NBNN IPP=ICPR(IPT1.NUM(J,I)) NINV(IPP)=NINV(IPP)+1 INV(NPOS(IPP)+NINV(IPP))=I ENDDO ENDDO * Création table d'indicateur de noeud déjà trouvé NBVU=NBNN SEGINI, IVU * CREATION DE LA DIFFERENCE SYMETRIQUE NBSOUS=0 NBELEM=NBELE1+NBELE2 SEGINI MELEME DO I=1,NBELE1 ICOLOR(I)=IPT1.ICOLOR(I) DO J=1,NBNN NUM(J,I)=IPT1.NUM(J,I) ENDDO ENDDO DO I=1,NBELE2 ICOLOR(I+NBELE1)=IPT2.ICOLOR(I) DO J=1,NBNN NUM(J,I+NBELE1)=IPT2.NUM(J,I) ENDDO ENDDO DO 2 I=1,NBELE2 DO J=1,NBNN IPP=ICPR(NUM(J,I+NBELE1)) IF (IPP.EQ.0) GOTO 2 DO 23 K=1,NINV(IPP) IEL=INV(NPOS(IPP)+K) * Comparaison des numéros de noeud de l'élément * ICOIN=nb de noeuds qui conviennent ICOIN=0 DO M=1,NBNN IVU(M)=0 ENDDO DO 24 L=1,NBNN DO M=1,NBNN *PM On ne teste que les noeuds non encore identifiés. IF (NUM(M,IEL).EQ.NUM(L,I+NBELE1) .AND. & IVU(M).EQ.0) THEN ICOIN = ICOIN + 1 IVU(M) = 1 GOTO 24 ENDIF ENDDO 24 CONTINUE IF (ICOIN.NE.NBNN) GOTO 23 * Les deux élements coincident NUM(1,I+NBELE1)=-NUM(1,I+NBELE1) NUM(1,IEL)=-NUM(1,IEL) NBELEM=NBELEM-2 * WRITE (6,*) ' COINCIDE ',I,IEL,NBELEM,NBELE1,NBELE2,NBNN GOTO 2 23 CONTINUE ENDDO 2 CONTINUE * RETASSER LE MELEME RÉSULTAT IPT3=MELEME MELEME=0 IF(NBELEM.EQ.0) SEGSUP IPT3 IF(NBELEM.EQ.0) RETURN SEGINI MELEME ITYPEL=IPT1.ITYPEL SEGDES IPT1,IPT2 J=1 DO I=1,NBELEM 51 IF (IPT3.NUM(1,J).GT.0) GOTO 52 J=J+1 GOTO 51 52 DO K=1,NBNN NUM(K,I)=IPT3.NUM(K,J) ENDDO ICOLOR(I)=IPT3.ICOLOR(J) J=J+1 ENDDO SEGSUP IPT3,INV,NINV,NPOS,IVU RETURN END