inclus
C INCLUS SOURCE PV 20/03/30 21:20:00 10567 C C CE SOUS PROGRAMME EXTRAIT DU PREMIER OBJET L'ENSEMBLE DES ELEMENTS C STRICTEMENT INCLUS DANS LE DEUXIEME OBJET C SUBROUTINE INCLUS IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC CCREEL *- -INC SMELEME -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC CCGEOME CHARACTER*4 LEMOT(5) DATA LEMOT/'BARY','STRI','LARG','VOLU','NOID'/ SEGMENT /FER/(NFI(ITT),MAI(IPP),ITOUR) SEGMENT ICPR(nbpts) IF (IERR.NE.0) RETURN * On fixe les options * Par défaut : non barycentrique, appartenance large, et erreur si * maillage vide IBARY=0 IFRON=0 IVERI=0 DO I=1,3 IF (IRET.EQ.1) IBARY=1 IF (IRET.EQ.2) IFRON=1 IF (IRET.EQ.3) IFRON=0 IF (IRET.EQ.4) THEN * Cas de maillage volumique RETURN ENDIF IF (IRET.EQ.5) IVERI=1 IF (IRET.EQ.0) GOTO 20 ENDDO 20 CONTINUE C CRITERE D'INCLUSION PAS UTILISE EN 2D... XCRITT=0.D0 * Cas d'une surface plane. SEGACT IPT2 C Appel éventuel à CONTOUR IF ((KSURF(IPT2.ITYPEL).EQ.0).AND.(IPT2.LISOUS(/1).EQ.0)) GOTO 25 CALL PRCONT IF (IERR.NE.0) RETURN SEGACT IPT2 25 CONTINUE * Transformation éventuelle en SEG2 (SEG3 ou maillage complexe) IF(IPT2.ITYPEL.EQ.3.OR.IPT2.LISOUS(/1).NE.0) * Remplissage segment FER ICLE=0 IF (IERR.NE.0) RETURN * Détermination du plan par son centre de gravité et son vecteur * normal unitaire (pour changement de variable) SEGACT MCOORD SEGINI ICPR DO 1 I=1,ICPR(/1) ICPR(I)=0 1 CONTINUE XGRAV=0. YGRAV=0. ZGRAV=0. DO 30 I=MAI(1)+1,MAI(ITOUR+1) IREF=NFI(I)*(IDIM+1)-IDIM XGRAV=XGRAV+XCOOR(IREF) YGRAV=YGRAV+XCOOR(IREF+1) ZGRAV=ZGRAV+XCOOR(IREF+2) 30 CONTINUE XGRAV=XGRAV/FLOAT(MAI(ITOUR+1)-MAI(1)) YGRAV=YGRAV/FLOAT(MAI(ITOUR+1)-MAI(1)) ZGRAV=ZGRAV/FLOAT(MAI(ITOUR+1)-MAI(1)) IF (IDIM.EQ.2) ZGRAV=0. XNORM=0.D0 YNORM=0.D0 ZNORM=0.D0 DO 42 IT=1,ITOUR IREF=NFI(MAI(IT+1))*(IDIM+1)-IDIM XV1=XCOOR(IREF)-XGRAV YV1=XCOOR(IREF+1)-YGRAV ZV1=XCOOR(IREF+2)-ZGRAV IF (IDIM.EQ.2) ZV1=0. DO 421 I=MAI(IT-1+1)+1,MAI(IT+1) IREF=(NFI(I))*(IDIM+1)-IDIM XV2=XCOOR(IREF)-XGRAV YV2=XCOOR(IREF+1)-YGRAV ZV2=0. IF (IDIM.GE.3) ZV2=XCOOR(IREF+2)-ZGRAV XNORM=XNORM+YV1*ZV2-ZV1*YV2 YNORM=YNORM+ZV1*XV2-XV1*ZV2 ZNORM=ZNORM+XV1*YV2-YV1*XV2 XV1=XV2 YV1=YV2 ZV1=ZV2 421 CONTINUE 42 CONTINUE DNORM=SQRT(XNORM**2+YNORM**2+ZNORM**2) XNORM=XNORM/DNORM YNORM=YNORM/DNORM ZNORM=ZNORM/DNORM MELEME=IPT1 SEGACT MELEME NBS =LISOUS(/1) NBSOUS=NBS IPT8=0 IF (NBSOUS.NE.0) THEN NBREF=0 NBNN=0 NBELEM=0 SEGINI IPT8 IOB1=0 ENDIF IF(IBARY.EQ.0) THEN * Eligibilité d'après chaque point de l'élément DO 7001 IOB=1,MAX(1,NBS) IF (NBS.NE.0) THEN IPT1=LISOUS(IOB) SEGACT IPT1 ENDIF NBELEM=IPT1.NUM(/2) NBNN=IPT1.NUM(/1) NBREF=0 NBSOUS=0 SEGINI IPT4 IPT4.ITYPEL=IPT1.ITYPEL DO 2 I=1,NBNN DO 2222 J=1,NBELEM IPT4.NUM(I,J)=0 2222 CONTINUE 2 CONTINUE ICO=0 DO 10 J=1,NBELEM DO 11 I=1,NBNN IP=IPT1.NUM(I,J) IF (ICPR(IP).EQ.-1) GOTO 10 IF (ICPR(IP).EQ.1) GOTO 11 IREF=IP*(IDIM+1)-IDIM XP=XCOOR(IREF) YP=XCOOR(IREF+1) ZP=XCOOR(IREF+2) IF (IDIM.EQ.2) ZP=0. ANG=0.D0 DO 12 IT=1,ITOUR IF (IP.EQ.NFI(MAI(IT+1)))THEN IF(IFRON.EQ.0) GO TO 13 GO TO 18 ENDIF IREF=NFI(MAI(IT+1))*(IDIM+1)-IDIM XV1=XCOOR(IREF)-XP YV1=XCOOR(IREF+1)-YP ZV1=XCOOR(IREF+2)-ZP IF (IDIM.EQ.2) ZV1=0. DO 120 M=MAI(IT-1+1)+1,MAI(IT+1) IF (IP.EQ.NFI(M))THEN IF(IFRON.EQ.0) GO TO 13 GO TO 18 ENDIF IREF=NFI(M)*(IDIM+1)-IDIM XV2=XCOOR(IREF)-XP YV2=XCOOR(IREF+1)-YP ZV2=XCOOR(IREF+2)-ZP IF (IDIM.EQ.2) ZV2=0. V1=XNORM*(YV1*ZV2-ZV1*YV2)+YNORM*(ZV1*XV2-XV1 $ *ZV2)+ZNORM*(XV1*YV2-YV1*XV2) V2=XV1*XV2+YV1*YV2+ZV1*ZV2 IF( IFRON.EQ.1) THEN V6 = ( XV1 -XV2)*( XV1 -XV2) + ( YV1 -YV2)* ( $ YV1 -YV2)+ ( ZV1-ZV2)* ( ZV1-ZV2) IF( V2.LE.0. . OR. ( V2 . LT . V6* 1.D-4)) $ THEN V4 =SQRT (XV1* XV1 + YV1 * YV1 + ZV1 * ZV1 $ ) V5 =SQRT (XV2* XV2 + YV2 * YV2 + ZV2 $ * ZV2 ) V3 = ((YV1*ZV2-ZV1*YV2)*(YV1*ZV2-ZV1*YV2) $ +(ZV1*XV2-XV1*ZV2)*(ZV1*XV2-XV1*ZV2) $ +(XV1*YV2-YV1*XV2) *(XV1*YV2-YV1*XV2) $ ) **0.5D0 IF( V4* 1.D4. LT. V5 . OR . V5*1.D4 .LT.V4 $ ) GO TO 18 IF( V3*1.D4 . LT . ( ABS ( V2) ) ) # go to 18 ENDIF ENDIF IF (V1.EQ.0.D0.AND.V2.EQ.0.D0) GOTO 121 ANG=ANG+ATAN2(V1,V2) 121 CONTINUE XV1=XV2 YV1=YV2 ZV1=ZV2 120 CONTINUE 12 CONTINUE IF (ABS(ANG).GT.XPI) GOTO 13 18 ICPR(IP)=-1 GOTO 10 13 ICPR(IP)=1 11 CONTINUE * Cet élément est ok, on le met de côté. DO 14 L=1,NBNN IPT4.NUM(L,J)=IPT1.NUM(L,J) 14 CONTINUE IPT4.ICOLOR(J)=IPT1.ICOLOR(J) ICO=ICO+1 10 CONTINUE NBELEM=ICO IF (NBELEM.EQ.0) GOTO 7001 * sauvegarde partition ok SEGINI IPT3 IPT3.ITYPEL=IPT1.ITYPEL JJ=0 DO 21 J=1,IPT4.NUM(/2) IF (IPT4.NUM(1,J).EQ.0) GOTO 21 JJ=JJ+1 IPT3.ICOLOR(JJ)=IPT4.ICOLOR(J) DO 22 I=1,NBNN IPT3.NUM(I,JJ)=IPT4.NUM(I,J) 22 CONTINUE 21 CONTINUE SEGSUP IPT4 IF (NBS.NE.0) THEN IOB1=IOB1+1 IPT8.LISOUS(IOB1)=IPT3 ENDIF 7001 CONTINUE ELSE * Eligibilité d'après la position du barycentre DO 7051 IOB=1,MAX(1,NBS) IF (NBS.NE.0) THEN IPT1=LISOUS(IOB) SEGACT IPT1 ENDIF NBELEM=IPT1.NUM(/2) NBNN=IPT1.NUM(/1) NBREF=0 NBSOUS=0 SEGINI IPT4 IPT4.ITYPEL=IPT1.ITYPEL DO 52 I=1,NBNN DO 521 J=1,NBELEM IPT4.NUM(I,J)=0 521 CONTINUE 52 CONTINUE ICO=0 DO 60 J=1,NBELEM XP=0.D0 YP=0.D0 ZP=0.D0 DO 61 I=1,NBNN IP=IPT1.NUM(I,J) IREF=IP*(IDIM+1)-IDIM XP=XCOOR(IREF) +XP YP=XCOOR(IREF+1)+YP ZP=XCOOR(IREF+2) +ZP 61 CONTINUE IF (IDIM.EQ.2) ZP=0.D0 XP = XP / FLOAT(NBNN) YP = YP / FLOAT(NBNN) ZP = ZP / FLOAT(NBNN) ANG=0.D0 DO 62 IT=1,ITOUR IREF=NFI(MAI(IT+1))*(IDIM+1)-IDIM XV1=XCOOR(IREF)-XP YV1=XCOOR(IREF+1)-YP ZV1=XCOOR(IREF+2)-ZP IF (IDIM.EQ.2) ZV1=0. DO 621 M=MAI(IT-1+1)+1,MAI(IT+1) IREF=NFI(M)*(IDIM+1)-IDIM XV2=XCOOR(IREF)-XP YV2=XCOOR(IREF+1)-YP ZV2=XCOOR(IREF+2)-ZP IF (IDIM.EQ.2) ZV2=0. V1=XNORM*(YV1*ZV2-ZV1*YV2)+YNORM*(ZV1*XV2-XV1*ZV2) $ +ZNORM*(XV1*YV2-YV1*XV2) V2=XV1*XV2+YV1*YV2+ZV1*ZV2 IF (V1.EQ.0.D0.AND.V2.EQ.0.D0) GOTO 171 ANG=ANG+ATAN2(V1,V2) 171 CONTINUE XV1=XV2 YV1=YV2 ZV1=ZV2 621 CONTINUE 62 CONTINUE IF (ABS(ANG).GT.XPI) GOTO 63 GOTO 60 63 CONTINUE * Cet élément est ok, on le met de côté. DO 64 L=1,NBNN IPT4.NUM(L,J)=IPT1.NUM(L,J) 64 CONTINUE IPT4.ICOLOR(J)=IPT1.ICOLOR(J) ICO=ICO+1 60 CONTINUE NBELEM=ICO IF (NBELEM.EQ.0) GOTO 7051 * sauvegarde partition ok SEGINI IPT3 IPT3.ITYPEL=IPT1.ITYPEL JJ=0 DO 71 J=1,IPT4.NUM(/2) IF (IPT4.NUM(1,J).EQ.0) GOTO 71 JJ=JJ+1 IPT3.ICOLOR(JJ)=IPT4.ICOLOR(J) DO 72 I=1,NBNN IPT3.NUM(I,JJ)=IPT4.NUM(I,J) 72 CONTINUE 71 CONTINUE SEGSUP IPT4 IF (NBS.NE.0) THEN IOB1=IOB1+1 IPT8.LISOUS(IOB1)=IPT3 ENDIF 7051 CONTINUE ENDIF * Ecriture du maillage résultat et sortie * --------------------------------------- IF (((NBS.EQ.0).AND.(NBELEM.EQ.0)).OR. & ((NBS.NE.0).AND.(IOB1.EQ.0))) THEN * on n'a rien trouvé IF (IVERI.EQ.0) THEN * Tache impossible. Probablement données erronées RETURN ELSE * on renvoie un maillage vide GOTO 7006 ENDIF ENDIF IF (NBS.EQ.0) THEN * Si maillage simple en entrée * On écrit directement IPT3 GOTO 7002 ELSE * Si maillage complexe en entrée * IOB1 : nombre de partitions retenues IF (IOB1.EQ.NBS) THEN GOTO 7003 ELSEIF (IOB1.EQ.1) THEN GOTO 7005 ELSE GOTO 7004 ENDIF ENDIF * Maillage complexe, avec moins de partitions que l'objet entré 7004 CONTINUE NBSOUS=IOB1 NBREF=0 NBNN=0 NBELEM=0 SEGINI IPT3 DO IOB=1,NBSOUS IPT3.LISOUS(IOB)=IPT8.LISOUS(IOB) ENDDO SEGSUP IPT8 GOTO 7002 * Maillage simple, avec moins de partitions que l'objet entré 7005 CONTINUE IPT3=IPT8.LISOUS(1) SEGSUP IPT8 GOTO 7002 * Maillage avec autant de partitions que l'objet entré * (inutile de recréer un nouveau maillage) 7003 CONTINUE IPT3=IPT8 GOTO 7002 * Maillage vide 7006 CONTINUE NBSOUS=0 NBREF=0 NBNN=0 NBELEM=0 SEGINI IPT3 IF (NBS.NE.0) SEGSUP IPT8 7002 CONTINUE SEGSUP ICPR,FER END
© Cast3M 2003 - Tous droits réservés.
Mentions légales