vtop2d
C VTOP2D SOURCE PV 20/03/30 21:25:51 10567 IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C Appelée par VERMAI C C vérifie qu'il n'y a pas d'éléments de degré un accolé à un C élément de degré 2. C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C Modifications : C C P. Maugis (04/08/2005) : C on lieu de faire une erreur sur une sous-zone non pertinente, C on passe à la sous-zone suivante C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC SMELEME -INC SMCOORD C SEGMENT ICPR(nbpts) SEGMENT IDCP(ITE) SEGMENT INTER INTEGER INTE(NBSOUS) ENDSEGMENT SEGMENT KON(NBCON,NMAX,3) CHARACTER*6 CHAIN1 CHARACTER*6 CHAIN2 C *dbg write(ioimp,*) 'coucou vtop2d' SEGACT MELEME SEGINI ICPR c CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C Création d'un tableau de connexions : C comme la numérotation des noeuds est aléatoire, on C utilise un vecteur réduit (de dimension le nombre de noeuds ITE) C noté ICPR qui renumérote les noeuds. C 1 point final connecté C 2 point intermédiaire éventuel (si de deg3) et sens C C Si un point est connecté à la fois à un autre point par un C élément de degré 2 et un élément de degré 3, il apparait deux C fois dans la meme ligne du tableau. C C ICPR contient le numéro du noeud intéressant à traiter, C ou 0 s'il n'a aucune connection. ITE=0 IPT1=MELEME DO 3 I=1,MAX(1,LISOUS(/1)) IF (LISOUS(/1).NE.0) THEN IPT1=LISOUS(I) SEGACT IPT1 ENDIF K=IPT1.ITYPEL IF (K.EQ.KDEGRE(K)) THEN * On ne veut pas de POI1, SEG2 ni SEG3 * CALL ERREUR(16) * RETURN IF (LISOUS(/1).NE.0) SEGDES IPT1 GOTO 3 ENDIF IDEP=NSPOS(K) IF (NBSOM(K).GT.0) THEN IFEP=IDEP+NBSOM(K)-1 ELSE C Cas du polygone IFEP=IDEP+IPT1.NUM(/1)-1 ENDIF IF (IDEP.GT.IFEP) THEN write(IOIMP,*) 'Une face doit avoir au moins 3 points' RETURN ENDIF DO 4 JJ=IDEP,IFEP J=IBSOM(JJ) DO 7 K=1,IPT1.NUM(/2) IPOIT=IPT1.NUM(J,K) IF (ICPR(IPOIT).NE.0) GOTO 7 ITE=ITE+1 ICPR(IPOIT)=ITE 7 CONTINUE 4 CONTINUE IF (LISOUS(/1).NE.0) SEGDES IPT1 3 CONTINUE SEGDES MELEME C IF (ITE.EQ.0) THEN * Aucun element n a de point sommet SEGSUP ICPR * CALL ERREUR(16) RETURN ENDIF C C on initialise le tableau de connexions C on définit les paramètres C NBCON=7 NBCONR=NBCON-1 NMAX=(10*ITE)/NBCON SEGINI KON C C on remplit le tableau : C la 1ère coordonnée est le n° du noeud final C la 2ème est le n° du noeud intermédiare éventuel C (sinon 1) et le sens (signe) C la 3ème code la couleur C ICHAIN=ITE SEGACT MELEME IPT1=MELEME K1=0 K2=0 NBSOUS=LISOUS(/1)+1 SEGINI INTER IF (LISOUS(/1).NE.0) THEN DO 300 IO=1,LISOUS(/1) IPT2=LISOUS(IO) SEGACT IPT2 K=IPT2.ITYPEL SEGDES IPT2 IF (K.EQ.KDEGRE(K)) THEN * On ne veut pas de POI1, SEG2 ni SEG3 * CALL ERREUR(16) * RETURN GOTO 300 ENDIF C LE NOMBRE DE FACE EST 1 QUEL EST SON TYPE C C ON ORDONNE LES SOUS OBJETS : LES SOUS OBJ DE DEGRE 3 D'ABORD C LES AUTRES ENSUITES NBNN=KDEGRE(K) IF (NBNN.EQ.3) THEN K1=K1+1 INTE(K1)=LISOUS(IO) ELSE K2=K2+1 INTE(LISOUS(/1)-K2+1)=LISOUS(IO) ENDIF 300 CONTINUE ELSE INTE(1)=MELEME ENDIF DO 30 IO=1,MAX(1,LISOUS(/1)) IPT1=INTE(IO) SEGACT IPT1 K=IPT1.ITYPEL IF (K.EQ.KDEGRE(K)) THEN * On ne veut pas de POI1, SEG2 ni SEG3 * CALL ERREUR(16) * RETURN IF (LISOUS(/1).NE.0) SEGDES IPT1 GOTO 30 ENDIF NBFA=LTEL(1,K) IF (NBFA.EQ.0) THEN * données incompatibles * Ces elements n'ont pas de face. * CALL ERREUR(21) * RETURN GOTO 30 ENDIF KK=LTEL(2,K) NBNN=KDEGRE(K) IPAS=NBNN-1 DO 301 K1=1,NBFA ITYP=LDEL(1,KK+K1-1) IDEP=LDEL(2,KK+K1-1) IF (ITYP.NE.6) THEN IFEP=IDEP+KDFAC(1,ITYP)-1 * SG 20160711 pour les faces TRI7 et QUA9, on ignore le dernier * point (centre de la face) IF (ITYP.EQ.7.OR.ITYP.EQ.8) IFEP=IFEP-1 ELSE C Cas du polygone IFEP= IDEP+IPT1.NUM(/1)-1 ENDIF DO 22 I=1,IPT1.NUM(/2) DO 221 J=IDEP,IFEP,IPAS NMIL=1 N1=ICPR(IPT1.NUM(LFAC(J),I)) JSUIV=J+IPAS IF (JSUIV.GT.IFEP) JSUIV=IDEP N2=ICPR(IPT1.NUM(LFAC(JSUIV),I)) IF (IPAS.EQ.2) THEN NMIL=IPT1.NUM(LFAC(J+1),I) IF (ICPR(NMIL).NE.0) THEN NMIL=ICPR(NMIL) ELSE NMIL=0 ENDIF ENDIF NI=N1 NJ=N2 IF ((N1.EQ.0).OR.(N2.EQ.0)) THEN * Tache impossible. Probablement données erronées SEGSUP KON,ICPR SEGDES MELEME RETURN ENDIF KSCOL=IPT1.ICOLOR(I) IPO=0 23 CONTINUE KINT=1 251 CONTINUE 24 DO 25 K=KINT,NBCONR 25 CONTINUE KINT=1 GOTO 24 27 IF (ABS(NMIL).EQ.1) THEN KINT=K+1 GOTO 251 ENDIF ENDIF GOTO 29 GOTO 29 28 ICHAIN=ICHAIN+1 IF (ICHAIN.GE.NMAX) THEN NMAX = NMAX * 2 SEGADJ KON ENDIF K=1 NI=ICHAIN GOTO 26 29 IF (IPO.EQ.1) GOTO 221 NMIL=-NMIL NI=N2 NJ=N1 IPO=1 GOTO 23 221 CONTINUE 22 CONTINUE 301 CONTINUE SEGDES IPT1 30 CONTINUE SEGSUP INTER IF (IIMPI.EQ.2) THEN WRITE (IOIMP,1122) # (((KON(I,J,K),K=1,2),I=1,NBCON),J=1,NMAX) 1122 FORMAT(1X,14I5) ENDIF SEGDES MELEME C C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C C Création de idcp C Vecteur permettant de revenir à la numérotation initiale C SEGINI IDCP DO 40 I=1,ICPR(/1) IF (ICPR(I).EQ.0) GOTO 40 IDCP(ICPR(I))=I 40 CONTINUE SEGSUP ICPR C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C ECRITURE DE L'AVERTISSEMENT C C Deux cas de figures possibles : C un élément de degré 3 et un élément de degré 2 sont C connectés par leus extrémités (ITEST1) C deux éléments de degré 2 sont connectés aux trois C points d'un élément de degré 3 C C NNOEUD=0 C C Recherche du nombre de connexions d'un noeud et des numéros de lignes C où sont stockées les n° des noeuds connectés C C COMPTEUR compte le nombre de lignes utilisées pour enregistrer le C nombre de noeuds connectés au noeud n° NI C C NKON est le nombre de noeuds connectés dans la dernière ligne C icompt=1 90 CONTINUE iAD=KON(NBCON,NINT,1) IF (iAD.NE.0) THEN NINT=iAD INTEG=icompt icompt=INTEG+1 GOTO 90 ELSE J=0 91 CONTINUE J=J+1 IF (KON(J,NINT,1).NE.0) THEN GOTO 91 ENDIF NKON=J-1 ENDIF C C Recherche du dernier noeud qui constitue un élément de degré 3 C I=0 92 CONTINUE I=I+1 jcompt=-1 IF (I.LE.icompt) THEN J=0 93 CONTINUE J=J+1 IF (J.LE.NBCONR) THEN IF (KON(J,NINT,1).EQ.0) GOTO 50 IF (ABS(KON(J,NINT,2)).NE.1) GOTO 93 NCOMPT=NINT jcompt=J-1 ELSE NINT=KON(NBCON,NINT,1) GOTO 92 ENDIF ENDIF C C Lecture du tableau de connexions et comparaison C C CAS OU LES ELEMENTS ONT LA MEME TAILLE C iadi=NI IF (I.EQ.1) GOTO 100 DO 52 LI=1,I-1 DO 53 J=1,NBCONR ITEST1=KON(J,iadi,1) ITEST2=KON(J,iadi,2) IF (ITEST2.LT.0) GOTO 53 JJ=jcompt IF (I.EQ.icompt) GOTO 98 if (jcompt.lt.0) goto 53 94 CONTINUE JJ=JJ+1 IF (JJ.LE.NBCONR) THEN IF (KON(JJ,NCOMPT,2).LT.0) GOTO 94 IF (ITEST1.NE.KON(JJ,NCOMPT,1)) GOTO 94 ipoin2=IDCP(ITEST1) IDCP(ITEST1)=ipoin2 GOTO 53 ENDIF C C Cas où il ya plus de deux lignes de connections pour un noeud C NINT=NCOMPT IF (I.LE.icompt-1) THEN II=I 96 CONTINUE II=II+1 NINT=KON(NBCON,NINT,1) IF (II.LE.icompt-1) THEN JJ=0 97 CONTINUE JJ=JJ+1 IF (JJ.LE.NBCONR) THEN IF (KON(JJ,NINT,2).LT.0) GOTO 97 IF (ITEST1.NE.KON(JJ,NINT,1)) GOTO 97 ipoin2=IDCP(ITEST1) IDCP(ITEST1)=ipoin2 GOTO 53 ENDIF GOTO 96 ENDIF ENDIF C C On finit de lire la ligne C NINT=KON(NBCON,NINT,1) JJ=0 98 CONTINUE JJ=JJ+1 IF (JJ.LE.NKON) THEN IF (KON(JJ,NINT,2).LT.0) GOTO 98 IF (ITEST1.NE.KON(JJ,NINT,1)) GOTO 98 ipoin2=IDCP(ITEST1) IDCP(ITEST1)=ipoin2 GOTO 53 ENDIF 53 CONTINUE iadi=KON(NBCON,iadi,1) 52 CONTINUE C C 100 CONTINUE DO 54 J=1,jcompt ITEST1=KON(J,NCOMPT,1) ITEST2=KON(J,NCOMPT,2) IF (ITEST2.LT.0) GOTO 54 JJ=jcompt IF (I.EQ.icompt) GOTO 198 194 CONTINUE JJ=JJ+1 IF (JJ.LE.NBCONR) THEN IF (KON(JJ,NCOMPT,2).LT.0) GOTO 194 IF (ITEST1.NE.KON(JJ,NCOMPT,1)) GOTO 194 ipoin2=IDCP(ITEST1) IDCP(ITEST1)=ipoin2 GOTO 54 ENDIF C C Cas où il ya plus de deux lignes de connections pour un noeud C NINT=NCOMPT IF (I.LT.icompt-1) THEN II=I 196 CONTINUE II=II+1 NINT=KON(NBCON,NINT,1) IF (II.LE.icompt-1) THEN JJ=0 197 CONTINUE JJ=JJ+1 IF (JJ.LE.NBCONR) THEN IF (KON(JJ,NINT,2).LT.0) GOTO 197 IF (ITEST1.NE.KON(JJ,NINT,1)) GOTO 197 ipoin2=IDCP(ITEST1) IDCP(ITEST1)=ipoin2 GOTO 54 ENDIF GOTO 196 ENDIF ENDIF C C On finit de lire la ligne C NINT=KON(NBCON,NINT,1) JJ=0 198 CONTINUE JJ=JJ+1 IF (JJ.LE.NKON) THEN IF (KON(JJ,NINT,2).LT.0) GOTO 198 IF (ITEST1.NE.KON(JJ,NINT,1)) GOTO 198 ipoin2=IDCP(ITEST1) IDCP(ITEST1)=ipoin2 GOTO 54 ENDIF 54 CONTINUE C C CAS OU IL Y A DEUX SEG2 POUR UN SEG3 C iadi=NI IF (I.EQ.1) GOTO 200 DO 252 LI=1,I-1 DO 253 J=1,NBCONR ITEST1=KON(J,iadi,1) ITEST2=KON(J,iadi,2) IF (ITEST2.LE.0) GOTO 253 JJ=jcompt WRITE(IOIMP, *)I WRITE(IOIMP,*)icompt IF (I.EQ.icompt) GOTO 298 294 CONTINUE JJ=JJ+1 IF (JJ.LE.NBCONR) THEN IF (ITEST2.NE.KON(JJ,NCOMPT,1)) GOTO 294 ipoin2=IDCP(ITEST2) ipoin3=IDCP(ITEST1) IDCP(ITEST2)=ipoin2 IDCP(ITEST1)=ipoin3 GOTO 253 ENDIF C C Cas où il ya plus de deux lignes de connections pour un noeud C NINT=NCOMPT IF (I.LE.icompt-1) THEN II=I 296 CONTINUE II=II+1 NINT=KON(NBCON,NINT,1) IF (II.LE.icompt-1) THEN JJ=0 297 CONTINUE JJ=JJ+1 IF (JJ.LE.NBCONR) THEN IF (ABS(ITEST2).NE.KON(JJ,NINT,1)) GOTO 297 ipoin2=IDCP(ITEST2) ipoin3=IDCP(ITEST1) IDCP(ITEST2)=ipoin2 IDCP(ITEST1)=ipoin3 GOTO 253 ENDIF GOTO 296 ENDIF ENDIF C C On finit de lire la ligne C NINT=KON(NBCON,NINT,1) JJ=0 298 CONTINUE JJ=JJ+1 IF (JJ.LE.NKON) THEN IF (ABS(ITEST2).NE.KON(JJ,NINT,1)) GOTO 298 ipoin2=IDCP(ITEST2) ipoin3=IDCP(ITEST1) IDCP(ITEST2)=ipoin2 IDCP(ITEST1)=ipoin3 GOTO 253 ENDIF 253 CONTINUE iadi=KON(NBCON,iadi,1) 252 CONTINUE C C 200 CONTINUE DO 254 J=1,jcompt ITEST1=KON(J,NCOMPT,1) ITEST2=KON(J,NCOMPT,2) IF (ITEST2.LT.0) GOTO 254 JJ=jcompt IF (I.EQ.icompt) GOTO 398 394 CONTINUE JJ=JJ+1 IF (JJ.LE.NBCONR) THEN IF (ABS(ITEST2).NE.KON(JJ,NCOMPT,1)) GOTO 394 ipoin2=IDCP(ITEST2) ipoin3=IDCP(ITEST1) IDCP(ITEST2)=ipoin2 IDCP(ITEST1)=ipoin3 GOTO 254 ENDIF C C Cas où il y a plus de deux lignes de connections pour un noeud C NINT=NCOMPT IF (I.LT.icompt-1) THEN II=I 396 CONTINUE II=II+1 NINT=KON(NBCON,NINT,1) IF (II.LE.icompt-1) THEN JJ=0 397 CONTINUE JJ=JJ+1 IF (JJ.LE.NBCONR) THEN IF (ABS(ITEST2).NE.KON(JJ,NINT,1)) GOTO 397 ipoin2=IDCP(ITEST2) ipoin3=IDCP(ITEST1) IDCP(ITEST2)=ipoin2 IDCP(ITEST1)=ipoin3 GOTO 254 ENDIF GOTO 396 ENDIF ENDIF C C On finit de lire la ligne C NINT=KON(NBCON,NINT,1) JJ=0 398 CONTINUE JJ=JJ+1 IF (JJ.LE.NKON) THEN IF (ABS(ITEST2).NE.KON(JJ,NINT,1)) GOTO 398 ipoin2=IDCP(ITEST2) ipoin3=IDCP(ITEST1) IDCP(ITEST2)=ipoin2 IDCP(ITEST1)=ipoin3 GOTO 254 ENDIF 254 CONTINUE 50 CONTINUE SEGSUP KON,IDCP END
© Cast3M 2003 - Tous droits réservés.
Mentions légales