ligmai
C LIGMAI SOURCE PV 20/03/30 21:20:41 10567 C_______________________________________________________________________ C ROUTINE LIGMAI C ENTREE : MELEME ----> OBJET MAILLAGE C ICAS 1 si on admet une boucle ferméé 0 sinon C SORTIE : TTRAV -----> UN SEGMENT CONTENANT C - LA LIGNE DES NOEUDS C C ______________________________________________________________________ IMPLICIT INTEGER(I-N) -INC PPARAM -INC CCOPTIO -INC SMELEME -INC SMCOORD SEGMENT ICPR(nbpts) SEGMENT IELE(MAXEL,NNOE) SEGMENT TTRAV INTEGER ILIS(NNOE) ENDSEGMENT * * on separe les noeuds concernes en noeuds coins et noeuds * milieux apres avoir verifie que les seuls elements presents * sont des seg2 ou des seg3. * SEGACT MELEME IPT1=MELEME DO 1 I=1,MAX(1,LISOUS(/1)) IF(LISOUS(/1).NE.0) THEN IPT1=LISOUS(I) SEGACT IPT1 ENDIF IF(IPT1.ITYPEL.NE.2.AND.IPT1.ITYPEL.NE.3) THEN * write( 6,FMT='('' pas bon itypel'')') GO TO 1000 ENDIF 1 CONTINUE SEGINI ICPR NNOE=0 MAXEL=0 IELMAX=0 DO 2 IO=1,MAX(1,LISOUS(/1)) IF(LISOUS(/1).NE.0) THEN IPT1=LISOUS(IO) ENDIF DO 3 I=1,IPT1.NUM(/2) DO 3 J=1,IPT1.NUM(/1) IA=IPT1.NUM(J,I) IF(ICPR(IA).EQ.0) THEN NNOE=NNOE+1 ENDIF ICPR(IA)=ICPR(IA)+1 MAXEL=MAX(MAXEL,ICPR(IA)) 3 CONTINUE IELMAX=MAX(IELMAX,IPT1.NUM(/2)) 2 CONTINUE IELMAX=IELMAX+1 * write(6,fmt='('' nnoe maxel '',2i6)')nnoe,maxel IF(NNOE.EQ.0) GO TO 1000 IF(MAXEL.GT.2) GO TO 1000 MAXEL=2 SEGINI IELE IB=0 DO 4 I=1,ICPR(/1) ICPR(I)=0 4 CONTINUE DO 5 IO=1,MAX(1,LISOUS(/1)) IF(LISOUS(/1).NE.0) THEN IPT1=LISOUS(IO) ENDIF DO 6 I=1,IPT1.NUM(/2) DO 6 J=1,IPT1.NUM(/1) IA=IPT1.NUM(J,I) IF(ICPR(IA).EQ.0) THEN IB=IB+1 ICPR(IA)=IB ENDIF IBA=ICPR(IA) IF(IELE(1,IBA).EQ.0) THEN IELE(1,IBA)=I+IO*IELMAX ELSE IELE(2,IBA)=I+IO*IELMAX ENDIF 6 CONTINUE 5 CONTINUE * * pour trouver une extremite il faut un point extremeite d'un * element qui n'appartient qu'a un seul element. * A tout hasard on regarde si le premier element contient * un point de depart. * IF(LISOUS(/1).NE.0) IPT1=LISOUS(1) IDEP=0 IA=IPT1.NUM(1,1) IB=ICPR(IA) IF(IELE(2,IB).EQ.0) THEN IDEP=IA ELSE IA=IPT1.NUM(IPT1.NUM(/1),1) IB=ICPR(IA) IF(IELE(2,IB).EQ.0) THEN IDEP=IA ENDIF ENDIF IF(IDEP.EQ.0) THEN * recherche d'un point de depart DO 10 IO=1,MAX(1,LISOUS(/1)) IF(LISOUS(/1) .NE.0) IPT1=LISOUS(IO) IDE=IPT1.NUM(/1) DO 11 I=1,IPT1.NUM(/2) IDEP=IPT1.NUM(1,I) IB=ICPR(IDEP) IF(IELE(2,IB).EQ.0) GO TO 12 IDEP=IPT1.NUM(IDE,I) IB=ICPR(IDEP) IF(IELE(2,IB).EQ.0) GO TO 12 11 CONTINUE 10 CONTINUE IF( ICAS.EQ.1) THEN * ON prend le premier point du premier element IF(LISOUS(/1) .NE.0) IPT1=LISOUS(1) IDEP=IPT1.NUM(1,1) NNOE=NNOE+1 * write(6,fmt='('' nb de point à enregistrer '')') nnoe ELSE * write(6,fmt='('' pas de point de depart!'')') * write(6,fmt='('' iele'',(3i6))') * $(ko,iele(1,ko),iele(2,ko),ko=1,nnoe) SEGSUP ICPR,IELE GO TO 1000 ENDIF ENDIF 12 CONTINUE * * on connait le poiunt de depart IDEP il suffit de remplir * le tableau ilis de ttrav * SEGINI TTRAV ILIS(1)=IDEP IA=ICPR(IDEP) INLI=1 IDEINI=IDEP * write(6,fmt='('' inli,idep'',3i6)') inli,idep IELPRE=IELE(1,IA) IF(LISOUS(/1).NE.0) THEN IO=IELPRE/IELMAX IPT1=LISOUS(IO) IEL=IELPRE-IO*IELMAX ELSE IEL=IELPRE-IELMAX ENDIF IF(IPT1.NUM(1,IEL).EQ.IDEP) THEN DO 17 IK=2,IPT1.NUM(/1) IDEP=IPT1.NUM(IK,IEL) INLI=INLI+1 ILIS(INLI)=IDEP * write(6,fmt='('' 17 inli,idep iel'',3i6)') inli,idep,iel 17 CONTINUE ELSE DO 18 IK=IPT1.NUM(/1)-1,1,-1 IDEP=IPT1.NUM(IK,IEL) INLI=INLI+1 ILIS(INLI)=IDEP * write(6,fmt='('' 18 inli,idep iel'',3i6)') inli,idep,iel 18 CONTINUE ENDIF 20 CONTINUE ILOC=ICPR(IDEP) IA=IELE(1,ILOC) * write(6,fmt='('' idep,iloc,ia,ielpre'',4i6)')idep,iloc * $,ia,ielpre IF(IA.EQ.IELPRE) THEN IA=IELE(2,ILOC) * write(6,fmt='('' idep,iloc,ia,ielpre'',4i6)')idep,iloc * $,ia,ielpre IF(IA.EQ.0) GO TO 30 ENDIF IELPRE=IA IF(LISOUS(/1).NE.0) THEN IO=IA/IELMAX IPT1=LISOUS(IO) IA=IA-IO*IELMAX ELSE IA=IA-IELMAX ENDIF IF(IPT1.NUM(1,IA).EQ.IDEP) THEN DO 21 IK=2,IPT1.NUM(/1) IDEP=IPT1.NUM(IK,IA) INLI=INLI+1 ILIS(INLI)=IDEP * write(6,fmt='('' 21 inli,idep iel'',3i6)') inli,idep,iel 21 CONTINUE ELSE DO 22 IK=IPT1.NUM(/1)-1,1,-1 IDEP=IPT1.NUM(IK,IA) INLI=INLI+1 ILIS(INLI)=IDEP * write(6,fmt='('' 22 inli,idep iel'',3i6)') inli,idep,iel 22 CONTINUE ENDIF IF(IDEP.NE.IDEINI)GO TO 20 30 CONTINUE SEGSUP ICPR,IELE IF(INLI.NE.NNOE) THEN * write(6,fmt='('' icas0 inli nnoe '',2i6)') inli,nnoe SEGSUP TTRAV GO TO 1000 ENDIF GO TO 1002 1002 CONTINUE END
© Cast3M 2003 - Tous droits réservés.
Mentions légales