impos6
C IMPOS6 SOURCE CHAT 05/01/13 00:34:02 5004 SUBROUTINE IMPOS6(IMCTC1,IMCTC2,ICODE) c c pour cavi c assemble deux mctc de cavi1 c le resultat est mis dans imctc2 c IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC SMCOORD -INC PPARAM -INC CCOPTIO SEGMENT MCTC INTEGER IPOT1(NNO1) INTEGER IPOT2(NNO2) ENDSEGMENT POINTEUR MCTC1.MCTC,MCTC2.MCTC,MCTC3.MCTC LOGICAL FLAG c c executable c MCTC1 = IMCTC1 MCTC2 = IMCTC2 IF ( ICODE .EQ. -1 ) THEN c les segments sont inversés entre les deux lignes de points on renverse mctc2 NNO2 = MCTC2.IPOT1(/1) NNO1 = MCTC2.IPOT2(/1) SEGINI MCTC DO 100 I=1,NNO1 IPOT1(I)=MCTC2.IPOT2(I) 100 CONTINUE DO 200 I=1,NNO2 IPOT2(I)=MCTC2.IPOT1(I) 200 CONTINUE SEGSUP MCTC2 MCTC2 = MCTC ENDIF c c nombre de points dans la premiere ligne du nouveau mctc c NNO1 = MCTC1.IPOT1(/1) + MCTC2.IPOT1(/1) DO 300 I=1,MCTC2.IPOT1(/1) DO 250 J=1,MCTC1.IPOT1(/1) IF ( MCTC2.IPOT1(I) .EQ. MCTC1.IPOT1(J)) THEN MCTC2.IPOT1(I) = -J NNO1 = NNO1 - 1 GOTO 300 ENDIF 250 CONTINUE 300 CONTINUE c c nombre de points de la deuxieme ligne du nouveau mctc c NNO2 = MCTC1.IPOT2(/1) + MCTC2.IPOT2(/1) DO 400 I=1,MCTC2.IPOT2(/1) DO 350 J=1,MCTC1.IPOT2(/1) IF ( MCTC2.IPOT2(I) .EQ. MCTC1.IPOT2(J)) THEN MCTC2.IPOT2(I) = -J NNO2 = NNO2 - 1 GOTO 400 ENDIF 350 CONTINUE 400 CONTINUE c initialisation du nouveau mctc3 avec nno1 et nno2 SEGINI MCTC3 c c introduction des points de mctc1 dans mctc3 c DO 500 I=1,MCTC1.IPOT1(/1) MCTC3.IPOT1(I)=MCTC1.IPOT1(I) 500 CONTINUE DO 600 I=1,MCTC1.IPOT2(/1) MCTC3.IPOT2(I)=MCTC1.IPOT2(I) 600 CONTINUE c c introduction des points de mctc2 dans mctc3 c on doit trier pour les mettre a la bonne place c c 1ere couche c INDI1 = MCTC1.IPOT1(/1) c indi1 est le niveau de remplissage de mctc3.ipot1 c indi2 indique le point le plus en avant que l'on ait place DO 700 I=1,MCTC2.IPOT1(/1) IF (MCTC2.IPOT1(I) .GT. 0) THEN IM = MCTC2.IPOT1(I) c boucle sur les points deja mis dans mctc3 c on cherche a placer le nouveau point au bon endroit IA = MCTC3.IPOT1(J) IB = MCTC3.IPOT1(J+1) XAB = XCOOR((IB-1)*(IDIM+1)+1)-XCOOR((IA-1)*(IDIM+1)+1) YAB = XCOOR((IB-1)*(IDIM+1)+2)-XCOOR((IA-1)*(IDIM+1)+2) XAM = XCOOR((IM-1)*(IDIM+1)+1)-XCOOR((IA-1)*(IDIM+1)+1) YAM = XCOOR((IM-1)*(IDIM+1)+2)-XCOOR((IA-1)*(IDIM+1)+2) PL1 = XAB*XAB + YAB*YAB PL2 = XAB*XAM + YAB*YAM PL3 = XAM*XAM + YAM*YAM * print *,'im=',im,'ia=',ia,'ib=',ib,pl1,pl2,pl3 IF ((PL2 .LE. 0.D0) .AND. ((PL3/PL1).LT. 4.)) THEN c le point ce trouve a gauche de A a une distance raisonnable DO 640 K=INDI1,J,-1 MCTC3.IPOT1(K+1)=MCTC3.IPOT1(K) 640 CONTINUE INDI1 = INDI1 + 1 * print *,'a gauche' * print *,'im=',im,'ia=',ia,'ib=',ib,pl1,pl2,pl3 MCTC3.IPOT1(J)=IM INDI2 = J GOTO 700 ENDIF IF ((PL2 .GT.0.) .AND. ((PL3/PL1).LT. 1.)) THEN c le point ce trouve a gauche de B DO 645 K=INDI1,J+1,-1 MCTC3.IPOT1(K+1)=MCTC3.IPOT1(K) 645 CONTINUE MCTC3.IPOT1(J+1)=IM * print *,'a droite' * print *,'im=',im,'ia=',ia,'ib=',ib,pl1,pl2,pl3 INDI1 = INDI1 + 1 GOTO 700 ENDIF 650 CONTINUE c IF (INDI1 .EQ. 1) THEN c la ligne ne contient q'un seul point c on se base sur la deuxieme ligne IA = MCTC3.IPOT2(1) IB = MCTC3.IPOT2(2) IC = MCTC3.IPOT1(1) XAB = XCOOR((IB-1)*(IDIM+1)+1)-XCOOR((IA-1)*(IDIM+1)+1) YAB = XCOOR((IB-1)*(IDIM+1)+2)-XCOOR((IA-1)*(IDIM+1)+2) XCM = XCOOR((IM-1)*(IDIM+1)+1)-XCOOR((IC-1)*(IDIM+1)+1) YCM = XCOOR((IM-1)*(IDIM+1)+2)-XCOOR((IC-1)*(IDIM+1)+2) PL1 = XAB*XCM+YAB*YCM IF ( PL1 .GT. 0) THEN MCTC3.IPOT1(1)=IM * print *,'unique' * print *,'im=',im,'ia=',ia,'ib=',ib,pl1,pl2,pl3 MCTC3.IPOT1(2)=IC INDI1 = 2 GOTO 700 ENDIF ENDIF c le point se trouve a droite de tout INDI1 = INDI1 + 1 MCTC3.IPOT1(INDI1)=IM * print *,'extreme' * print *,'im=',im INDI2 = INDI1 ELSE ENDIF 700 CONTINUE c c 2ieme couche c INDI1 = MCTC1.IPOT2(/1) c indi1 est le niveau de remplissage de mctc3.ipot2 DO 800 I=1,MCTC2.IPOT2(/1) IF (MCTC2.IPOT2(I) .GT. 0) THEN IM = MCTC2.IPOT2(I) c boucle sur les points deja mis dans mctc3 IA = MCTC3.IPOT2(J) IB = MCTC3.IPOT2(J+1) XAB = XCOOR((IB-1)*(IDIM+1)+1) - XCOOR((IA-1)*(IDIM+1)+1) YAB = XCOOR((IB-1)*(IDIM+1)+2) - XCOOR((IA-1)*(IDIM+1)+2) XAM = XCOOR((IM-1)*(IDIM+1)+1) - XCOOR((IA-1)*(IDIM+1)+1) YAM = XCOOR((IM-1)*(IDIM+1)+2) - XCOOR((IA-1)*(IDIM+1)+2) PL1 = XAB*XAB + YAB*YAB PL2 = XAB*XAM + YAB*YAM PL3 = XAM*XAM + YAM*YAM * print *,'im=',im,'ia=',ia,'ib=',ib,pl1,pl2,pl3 IF ((PL2 .LT. 0.D0) .AND. ((PL3/PL1) .LT. 4.)) THEN c le point ce trouve a gauche de A DO 740 K=INDI1,J,-1 MCTC3.IPOT2(K+1)=MCTC3.IPOT2(K) 740 CONTINUE INDI1 = INDI1 + 1 INDI2 = J MCTC3.IPOT2(J)=IM * print *,'a gauche' * print *,'im=',im,'ia=',ia,'ib=',ib,pl1,pl2,pl3 GOTO 800 ENDIF IF ((PL2 .GE. 0.D0) .AND. ((PL3/PL1).LT. 1.)) THEN c le point ce trouve a gauche de B DO 745 K=INDI1,J+1,-1 MCTC3.IPOT2(K+1)=MCTC3.IPOT2(K) 745 CONTINUE MCTC3.IPOT2(J+1)=IM * print *,'a droite' * print *,'im=',im,'ia=',ia,'ib=',ib,pl1,pl2,pl3 INDI1 = INDI1 + 1 GOTO 800 ENDIF 750 CONTINUE IF (INDI1 .EQ. 1) THEN IA = MCTC3.IPOT1(1) IB = MCTC3.IPOT1(2) IC = MCTC3.IPOT2(1) XAB = XCOOR((IB-1)*(IDIM+1)+1)-XCOOR((IA-1)*(IDIM+1)+1) YAB = XCOOR((IB-1)*(IDIM+1)+2)-XCOOR((IA-1)*(IDIM+1)+2) XCM = XCOOR((IM-1)*(IDIM+1)+1)-XCOOR((IC-1)*(IDIM+1)+1) YCM = XCOOR((IM-1)*(IDIM+1)+2)-XCOOR((IC-1)*(IDIM+1)+2) PL1 = XAB*XCM+YAB*YCM IF ( PL1 .GT. 0) THEN MCTC3.IPOT2(1)=IM MCTC3.IPOT2(2)=IC * print *,'unique' * print *,'im=',im,'ia=',ia,'ib=',ib,pl1,pl2,pl3 INDI1 = 2 GOTO 800 ENDIF ENDIF c le point se trouve a droite de tout INDI1 = INDI1 + 1 MCTC3.IPOT2(INDI1)=IM INDI2 = INDI1 * print *,'extreme' * print *,'im=',im ELSE ENDIF 800 CONTINUE c c c SEGSUP MCTC2 IMCTC2 = MCTC3 RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales