coutur
C COUTUR SOURCE GOUNAND 21/03/31 21:15:00 10931 C CE SOUS PROGRAMME EFFECTUE LA COUTURE ENTRE DEUX LIGNES C REPRIS DE COCO C C SG 2020/04/27 : On ajoute la fonctionnalité d'étoilement à C partir d'un point vers un maillage de ligne ou de surface C C SUBROUTINE COUTUR IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC CCGEOME -INC PPARAM -INC CCOPTIO -INC SMELEME -INC SMCOORD C ITEST(0:NBCOUL-1) DIMENSION ITPOIN(2),ITEST(0:30) DISTA(A,B,C,D,E,F)=SQRT((A-D)*(A-D)+(B-E)*(B-E)+(C-F)*(C-F)) IF(IERR .NE. 0)RETURN IF(IERR .NE. 0)RETURN IF(ILIG2 .EQ. 1)THEN IF(IERR .NE. 0)RETURN ELSE C On tente la lecture d'un POINT IF(IERR.NE.0)RETURN ENDIF IF (ILIG2.EQ.0.AND.IPT1.ITYPEL.NE.3) THEN * On effectue un étoilement à partir du point IPO2 avec la * subroutine etoilm : * Par rapport à l'ancienne sémantique de couture : * + IPT1 peut être un maillage complexe de POI1, SEG2, TRI3, QUA4 * + gere le cas si IPO2 appartient à IPT1 : on ne genere pas les * elements correspondants * - ne gere pas le cas SEG3 (celui-ci n'est d'ailleurs pas tres * bien gere car il recree les noeuds milieux) * - si element surfacique, on ne prend plus LISREF(1) qui est le * cote 1 * IF (IERR.NE.0) RETURN GOTO 999 ENDIF IF (IERR.NE.0) RETURN DO 10 I=0,NBCOUL-1 ITEST(I)=0 10 CONTINUE IF (KSURF(IPT1.ITYPEL).EQ.0) THEN DO 21 I=1,IPT1.NUM(/2) ITEST(IPT1.ICOLOR(I))=1 21 CONTINUE GOTO 1 ENDIF NBREF=IPT1.LISREF(/1) IF (IERR.NE.0) RETURN IPT3=IPT1.LISREF(1) DO 11 I=1,IPT3.NUM(/2) ITEST(IPT3.ICOLOR(I))=1 11 CONTINUE 1 CONTINUE IF (ILIG2.EQ.0) GOTO 3 IF (IERR.NE.0) RETURN IF (KSURF(IPT2.ITYPEL).EQ.0) THEN DO 22 I=1,IPT2.NUM(/2) ITEST(IPT2.ICOLOR(I))=1 22 CONTINUE GOTO 2 ENDIF NBREF=IPT2.LISREF(/1) IF (IERR.NE.0) RETURN IPT3=IPT2.LISREF(1) DO 12 I=1,IPT3.NUM(/2) ITEST(IPT3.ICOLOR(I))=1 12 CONTINUE IPT2=IPT3 2 CONTINUE C IPT1 ET IPT2 SONT LES DEUX LIGNES A COUDRE ELLES SONT DECRITES C DANS LE MEME SENS C ON VERIFIE D'ABORD LA COHERENCE DES TYPES D'ELEMENTS ITY1=IPT1.ITYPEL IF (IERR.NE.0) RETURN C ON CREE IPT3 QUI CONTIENT LE RESULTAT 3 CONTINUE ICHCOL=-1 DO 13 I=0,NBCOUL-1 IF (ITEST(I).EQ.1) THEN IF (ICHCOL.EQ.-1) THEN ICHCOL=I ELSE ICHCOL=ITABM(ICHCOL,I) ENDIF ENDIF 13 CONTINUE NBELE1=IPT1.NUM(/2) NBELE2=0 NBREF=3 IF (ILIG2.EQ.0) GOTO 4 NBREF=4 NBELE2=IPT2.NUM(/2) 4 CONTINUE NBELEM=NBELE1+NBELE2 NBNN =3 NBSOUS=0 SEGINI IPT3 IPT3.ITYPEL=4 IPT3.LISREF(1)=IPT1 IF (ILIG2.EQ.0) GOTO 5 IPT3.LISREF(3)=IPT4 C IL FAUR CREER LES BORDS LATERAUX 5 CONTINUE NBNN =2 NBELEM=1 NBSOUS=0 NBREF =0 SEGINI IPT4 IPT4.ITYPEL=2 IPT3.LISREF(2)=IPT4 IPT4.NUM(1,1)=IPT1.NUM(IPT1.NUM(/1),NBELE1) IF (ILIG2.NE.0) IPT4.NUM(2,1)=IPT2.NUM(IPT2.NUM(/1),NBELE2) IF (ILIG2.EQ.0) IPT4.NUM(2,1)=IPO2 NBNN =2 NBELEM=1 NBSOUS=0 NBREF =0 SEGINI IPT4 IPT4.ITYPEL=2 IPT4.NUM(2,1)=IPT1.NUM(1,1) IF (ILIG2.EQ.0) GOTO 6 IPT4.NUM(1,1)=IPT2.NUM(1,1) IPT3.LISREF(4)=IPT4 GOTO 7 6 IPT4.NUM(1,1)=IPO2 IPT3.LISREF(3)=IPT4 7 CONTINUE LNUMEL=1 NBNN=IPT1.NUM(/1) IF (ILIG2.EQ.0) GOTO 800 CC C COUTURE AVEC DES TRIANGLES A 3 NOEUDS C IMAX = NUMERO DU DERNIER ELEMENT DU COTE 1 C JMAX = NUMERO DU DERNIER ELEMENT DE LA COUTURE C SEGACT,MCOORD IMAX = NBELE1 JMAX = NBELE2 NUMELG=0 IEL1=1 IEL2=1 100 I1=IPT1.NUM(1,IEL1) J1=IPT2.NUM(1,IEL2) 101 CONTINUE IREF1=(I1-1)*(IDIM+1) IREF2=(I2-1)*(IDIM+1) JREF1=(J1-1)*(IDIM+1) JREF2=(J2-1)*(IDIM+1) XI1=XCOOR(IREF1+1) YI1=XCOOR(IREF1+2) ZI1=XCOOR(IREF1+3) XI2=XCOOR(IREF2+1) YI2=XCOOR(IREF2+2) ZI2=XCOOR(IREF2+3) XJ1=XCOOR(JREF1+1) YJ1=XCOOR(JREF1+2) ZJ1=XCOOR(JREF1+3) XJ2=XCOOR(JREF2+1) YJ2=XCOOR(JREF2+2) ZJ2=XCOOR(JREF2+3) IF (IDIM.EQ.3) GOTO 200 ZI1=0 ZI2=0 ZJ1=0. ZJ2=0. 200 CONTINUE A=DISTA(XI1,YI1,ZI1,XJ2,YJ2,ZJ2) B=DISTA(XJ1,YJ1,ZJ1,XI2,YI2,ZI2) IF(A.LE.B) GO TO 102 CC C DIST(J1,I2) < DIST(I1,J2) C ON CREE LE TRIANGLE I1,I2,J1 C NUMELG = NUMELG + 1 IPT3.NUM(1,NUMELG) = I1 IPT3.NUM(3,NUMELG) = J1 INTERR(1)=NUMELG IEL1=IEL1+1 GO TO 100 CC C PLUS DE POINT SUR LE COTE 1 = ON RELIE I2 AUX POINTS RESTANTS C DE LA COUTURE C 103 NUMELG = NUMELG + 1 IPT3.NUM(3,NUMELG) = J1 INTERR(1)=NUMELG IF(IEL2.EQ.JMAX) GO TO 150 IEL2=IEL2+1 J1=IPT2.NUM(1,IEL2) GO TO 103 CC C DIST(J1,I2) > DIST(I1,J2) C ON CREE LE TRIANGLE I1,J2,J1 C 102 NUMELG = NUMELG + 1 IPT3.NUM(1,NUMELG) = I1 IPT3.NUM(3,NUMELG) = J1 INTERR(1)=NUMELG IF(IEL2.EQ.JMAX) GO TO 105 IEL2=IEL2+1 GOTO 100 CC C PLUS DE POINT SUR LA COUTURE = ON RELIE J2 AUX POINTS RESTANTS C DU COTE 1 C 105 NUMELG = NUMELG + 1 IPT3.NUM(1,NUMELG) = I1 INTERR(1)=NUMELG IEL1=IEL1+1 I1=IPT1.NUM(1,IEL1) GO TO 105 800 CONTINUE C ON EST DANS LE CAS FACILE OU ON RELIE IPT1 AVEC UN SEUL POINT DO 801 I=1,NBELE1 IPT3.NUM(1,I)=IPT1.NUM(1,I) IPT3.NUM(2,I)=IPT1.NUM(NBNN,I) IPT3.NUM(3,I)=IPO2 801 CONTINUE 150 CONTINUE C OK C'EST FAIT EVENTUELLEMENT CONVERTIR LE TYPE D'ELEMENT IF (NBNN.EQ.2) ITY=4 IF (NBNN.EQ.3) ITY=6 IF (IERR.NE.0) RETURN SEGACT IPT3*MOD DO 14 I=1,IPT3.NUM(/2) IPT3.ICOLOR(I)=ICHCOL 14 CONTINUE 999 CONTINUE SEGDES,MCOORD RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales