dedou
C DEDOU SOURCE PV 20/04/01 21:15:23 10569 SUBROUTINE DEDOU C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMELEME -INC SMCOORD C SEGMENT TTRAV INTEGER ILIS(NNOE) ENDSEGMENT SEGMENT XDET(NNOE) SEGMENT ICPR(nbpts) IF(IDIM.NE.2) THEN INTERR(1)=IDIM RETURN ENDIF C C *** LECTURE DU MAILLAGE C IF(IERR.NE.0) RETURN SEGINI,MELEME=IPT1 IF(LISOUS(/1).NE.0) THEN DO 1 I=1,LISOUS(/1) IPT3=LISOUS(I) SEGINI,IPT2=IPT3 LISOUS(I)=IPT2 SEGDES IPT2 1 CONTINUE ENDIF NBREF=0 NBNN=NUM(/1) NBELEM=NUM(/2) NBSOUS=LISOUS(/1) SEGADJ MELEME SEGDES MELEME C C *** LECTURE DE LA LIGNE A DEDOUBLER C *** TTRAV CONTIENT LA LIGNE REORDONNEE ET ORIENTEE PAR LIGMAI C IF(IERR.NE.0) RETURN IF(IERR.NE.0) THEN C Menage avant de quitter en erreur SEGACT MELEME*MOD IF(LISOUS(/1).NE.0) THEN DO 111 I=1,LISOUS(/1) IPT3=LISOUS(I) SEGSUP IPT3 111 CONTINUE ENDIF SEGSUP MELEME RETURN ENDIF SEGACT TTRAV C C *** CREATION DE LA DEUXIEME LEVRE C SEGINI,IPT5=IPT2 C C *** ON REGARDE SI LA FISSURE EST DEBOUCHANTE C CALL PRCONT IF(IERR.NE.0) THEN C Menage avant de quitter en erreur SEGACT MELEME*MOD IF(LISOUS(/1).NE.0) THEN DO 112 I=1,LISOUS(/1) IPT3=LISOUS(I) SEGSUP IPT3 112 CONTINUE ENDIF SEGSUP MELEME SEGSUP IPT5 RETURN ENDIF SEGACT MELEME IF(LISREF(/1).NE.0) THEN NBREF=0 NBNN=NUM(/1) NBELEM=NUM(/2) NBSOUS=LISOUS(/1) SEGADJ MELEME ENDIF SEGDES MELEME SEGACT IPT2 DO 4 IPASS=1,2 IF(IPASS.EQ.1) THEN I=1 ELSE I=ILIS(/1) ENDIF N1=ILIS(I) IPT3=IPT2 DO 2 ISOU=1,MAX(1,IPT2.LISOUS(/1)) IF(IPT2.LISOUS(/1).NE.0) THEN IPT3=LISOUS(ISOU) SEGACT IPT3 ENDIF DO 3 K=1,IPT3.NUM(/2) DO 3 J=1,IPT3.NUM(/1) IF(IPT3.NUM(J,K).EQ.N1) GO TO 21 3 CONTINUE 2 CONTINUE GOTO 4 21 CONTINUE C Le point N1 est une extremite qui appartient au contour C On rajoute a ILIS un autre point du contour DO 22 J=1,IPT3.NUM(/1) IF(IPT3.NUM(J,K).NE.N1) N2=IPT3.NUM(J,K) 22 CONTINUE NNOE=ILIS(/1)+1 SEGADJ TTRAV IF(I.EQ.1) THEN DO 23 K=NNOE,2,-1 ILIS(K)=ILIS(K-1) 23 CONTINUE ILIS(1)=N2 ELSE ILIS(NNOE)=N2 ENDIF 4 CONTINUE IF(IPT2.LISOUS(/1).NE.0) THEN DO 6 I=1,IPT2.LISOUS(/1) IPT3=LISOUS(I) SEGSUP IPT3 6 CONTINUE ENDIF SEGSUP IPT2 C C *** AJOUT DE NOUVEAUX POINTS A MCOORD ET CREATION C *** D'UN ICPR DES NOEUDS A DEDOUBLER C NNOE=ILIS(/1) NDED=NNOE-2 segact mcoord*mod NNOEU=nbpts SEGINI ICPR NBPTS=NNOEU+NDED SEGADJ MCOORD DO 5 I=2,NNOE-1 N1=ILIS(I) N2=I+NNOEU-1 XCOOR((N2-1)*3+1)=XCOOR((N1-1)*3+1) XCOOR((N2-1)*3+2)=XCOOR((N1-1)*3+2) ICPR(N1)=I 5 CONTINUE ICPR(ILIS(1))=1 ICPR(ILIS(NNOE))=NNOE C C *** CREATION DU TABLEAU XDET QUI CONTIENT LE C *** DETERMINANT DE DEUX VECTEURS CONSECUTIFS C SEGINI XDET N1=ILIS(1) N2=ILIS(2) VX1=XCOOR((N2-1)*3+1)-XCOOR((N1-1)*3+1) VY1=XCOOR((N2-1)*3+2)-XCOOR((N1-1)*3+2) DO 51 I=2,NNOE-1 N3=ILIS(I+1) VX2=XCOOR((N3-1)*3+1)-XCOOR((N2-1)*3+1) VY2=XCOOR((N3-1)*3+2)-XCOOR((N2-1)*3+2) XDET(I)=VX1*VY2-VX2*VY1 VX1=VX2 VY1=VY2 N1=N2 N2=N3 51 CONTINUE C C *** RENUMEROTATION DES ELEMENTS DU MAILLAGE RESULTAT C SEGACT MELEME*MOD IPT1=MELEME DO 7 I=1,MAX(1,LISOUS(/1)) IF(LISOUS(/1).NE.0) THEN IPT1=LISOUS(I) SEGACT IPT1*MOD ENDIF DO 8 J=1,IPT1.NUM(/2) DO 9 K=1,IPT1.NUM(/1) N1=IPT1.NUM(K,J) IN1=ICPR(N1) IF(IN1.GT.1.AND.IN1.LT.NNOE) GOTO 10 9 CONTINUE GOTO 8 C *** L'element contient un noeud N1 sur la ligne C *** N2 est le noeud suivant (sur la ligne), N3 le noeud precedent, C *** N4 un noeud de l'element qui n'appartient pas a la ligne. C *** Si l'element est "au-dessus" on va en 13 pour renumeroter. 10 N2=ILIS(IN1+1) N3=ILIS(IN1-1) DO 11 K=1,IPT1.NUM(/1) N4=IPT1.NUM(K,J) IF(ICPR(N4).EQ.0) GO TO 12 11 CONTINUE C *** Cas particulier ou tous les noeuds de l'element C *** appartiennent a la ligne N4=IPT1.NUM(1,J) N5=IPT1.NUM(2,J) N6=IPT1.NUM(3,J) IN1=MIN(ICPR(N4),ICPR(N5),ICPR(N6))+1 IF(XDET(IN1).GE.0) GOTO 13 GOTO 8 C *** Cas general 12 VX1=XCOOR((N2-1)*3+1)-XCOOR((N1-1)*3+1) VY1=XCOOR((N2-1)*3+2)-XCOOR((N1-1)*3+2) VX2=XCOOR((N1-1)*3+1)-XCOOR((N3-1)*3+1) VY2=XCOOR((N1-1)*3+2)-XCOOR((N3-1)*3+2) VX3=XCOOR((N4-1)*3+1)-XCOOR((N1-1)*3+1) VY3=XCOOR((N4-1)*3+2)-XCOOR((N1-1)*3+2) DET1=VX1*VY3-VY1*VX3 DET2=VX2*VY3-VY2*VX3 IF(XDET(IN1).GE.0) THEN IF(DET1.GE.0.AND.DET2.GE.0.) GOTO 13 ELSE IF(DET1.GT.0.OR.DET2.GT.0.) GOTO 13 ENDIF GOTO 8 13 DO 14 K=1,IPT1.NUM(/1) N5=IPT1.NUM(K,J) IN5=ICPR(N5) IF(IN5.GT.1.AND.IN5.LT.NNOE) & IPT1.NUM(K,J)=IN5+NNOEU-1 14 CONTINUE 8 CONTINUE 7 CONTINUE IF(LISOUS(/1).NE.0) THEN DO 15 I=1,LISOUS(/1) IPT1=LISOUS(I) SEGDES IPT1 15 CONTINUE ENDIF C C *** RENUMEROTATION DE LA DEUXIEME LEVRE C IPT1=IPT5 DO 16 I=1,MAX(1,IPT5.LISOUS(/1)) IF(IPT5.LISOUS(/1).NE.0) THEN IPT1=IPT5.LISOUS(I) SEGACT IPT1 ENDIF DO 17 J=1,IPT1.NUM(/2) DO 18 K=1,IPT1.NUM(/1) N1=IPT1.NUM(K,J) IN1=ICPR(N1) IF(IN1.GT.1.AND.IN1.LT.NNOE) IPT1.NUM(K,J)=IN1+NNOEU-1 18 CONTINUE 17 CONTINUE 16 CONTINUE IF(IPT5.LISOUS(/1).NE.0) THEN DO 19 I=1,IPT5.LISOUS(/1) IPT1=IPT5.LISOUS(I) SEGDES IPT1 19 CONTINUE ENDIF SEGDES IPT5,MELEME SEGSUP TTRAV,XDET,ICPR RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales