volumg
C VOLUMG SOURCE PV 20/03/24 21:23:15 10554 C FABRICATION DE CUBES ET PRISMES PAR TRANSLATION D'UNE SURFACE C SELON UNE GENERATRICE (NOVEMBRE 1985) SUBROUTINE VOLUMG IMPLICIT INTEGER(I-N) IMPLICIT real*8 (a-h,o-z) -INC SMELEME -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC CCGEOME logical ltelq SEGMENT ICPR(NBNNEL,NBELEC) IF (IERR.NE.0) RETURN IF(IERR.NE.0) RETURN C IPT9 EST LA GENERATRICE VERIFICATION DU TYPE SEGACT IPT9 IF (IPT9.ITYPEL.NE.KDEGRE(ILCOUR)) THEN SEGDES IPT9 RETURN ENDIF ISVOL1=0 SEGACT IPT1 C SI IPT1 VOLUME IL FAUT EN EXTRAIRE LA FACE 2 3100 IF (IPT1.LISOUS(/1).EQ.0) GOTO 1000 IF (IPT1.LISOUS(/1).NE.2) GOTO 3102 IDEUX=2 IPT3=IPT1.LISOUS(1) IPT4=IPT1.LISOUS(2) SEGACT IPT3,IPT4 IP=IPT3.ITYPEL*IPT4.ITYPEL IF (IP.NE.32.AND.IP.NE.60) GOTO 3101 IS=IPT3.ITYPEL+IPT4.ITYPEL IF (IS.NE.12.AND.IS.NE.16) GOTO 3101 INCR=1 IF (IS.EQ.16) INCR=2 NBNNEL=4*INCR C EN FAIT ON CREE UN SEGMENT QUI CONTIENT LES CUBES ET LES TRIANGLES C 0 DANS LA DERNIERE POSITION DU TRIANGLE NBSOUS=0 NBREF=0 NBNN=NBNNEL NBELE3=IPT3.NUM(/2) IF (IPT3.ITYPEL.LE.6) NBTRI=NBELE3 IF (IPT3.ITYPEL.GE.8) NBQUA=NBELE3 NBELE4=IPT4.NUM(/2) IF (IPT4.ITYPEL.LE.6) NBTRI=NBELE4 IF (IPT4.ITYPEL.GE.8) NBQUA=NBELE4 NBELEM=NBELE3+NBELE4 SEGINI MELEME DO 1100 I=1,NBNN DO 1100 J=1,NBELEM NUM(I,J)=0 1100 CONTINUE DO 1101 J=1,NBELE3 ICOLOR(J)=IPT3.ICOLOR(J) DO 1101 I=1,IPT3.NUM(/1) NUM(I,J)=IPT3.NUM(I,J) 1101 CONTINUE DO 1102 J=1,NBELE4 ICOLOR(J+NBELE3)=IPT4.ICOLOR(J) DO 1102 I=1,IPT4.NUM(/1) NUM(I,J+NBELE3)=IPT4.NUM(I,J) 1102 CONTINUE SEGDES IPT3,IPT4 GOTO 1001 C RECHERCHE DE LA PREMIERE FACE DE IPT1 3101 SEGDES IPT3,IPT4 IF (IERR.NE.0) RETURN ISVOL1=IPT1 IAUX=IPT1.LISREF(2) SEGDES IPT1 IPT1=IAUX SEGACT IPT1 GOTO 3100 1000 CONTINUE IDEUX=1 NBNNEL=IPT1.NUM(/1) NBELEM=IPT1.NUM(/2) IF (IPT1.ITYPEL.NE.8.AND.IPT1.ITYPEL.NE.10.AND.IPT1.ITYPEL.NE.4 #.AND.IPT1.ITYPEL.NE.6) GOTO 3102 INCR=1 IF (KDEGRE(IPT1.ITYPEL).EQ.3) INCR=2 MELEME=IPT1 1001 SEGACT MCOORD*mod IPT3=MELEME NCOUCH=IPT9.NUM(/2) NX=NCOUCH-1 IF (IIMPI.EQ.1) WRITE(IOIMP,9000) NCOUCH 9000 FORMAT(/,' COUCHES ',I6) C ON FAIT TOUJOURS COMME SI IL N'Y AVAIT QU'UN TYPE D'ELEMENT NBSOUS=0 C MODIF POUR CONSTRUIRE TOUJOURS LE POURTOUR NBREF=3 IF (IPT1.LISREF(/1).NE.0) NBREF=3 NBNN=2*NBNNEL+(INCR-1)*(NBNNEL/2) NBNNV=NBNN NBASE=NBELEM NBELEM=NBELEM*NCOUCH SEGINI IPT7 IF (NBNNV.EQ.6 ) IPT7.ITYPEL=16 IF (NBNNV.EQ.15) IPT7.ITYPEL=17 IF (NBNNV.EQ.8 ) IPT7.ITYPEL=14 IF (NBNNV.EQ.20) IPT7.ITYPEL=15 IPT7.LISREF(1)=IPT1 DO 1040 I=1,NBNN DO 1040 J=1,NBELEM IPT7.NUM(I,J)=0 1040 CONTINUE IOPTG=1 C CALCUL DU VECTEUR TRANSLATION TOTALE IREFB=(IPT9.NUM(1,1)-1)*4 IREFH=(IPT9.NUM(IPT9.NUM(/1),NCOUCH)-1)*4 NBPTS=nbpts+1 SEGADJ MCOORD XCOOR((NBPTS-1)*(IDIM+1)+1)=XCOOR(IREFH+1)-XCOOR(IREFB+1) XCOOR((NBPTS-1)*(IDIM+1)+2)=XCOOR(IREFH+2)-XCOOR(IREFB+2) XCOOR((NBPTS-1)*(IDIM+1)+3)=XCOOR(IREFH+3)-XCOOR(IREFB+3) XCOOR(NBPTS*(IDIM+1))=XCOOR(IREFH+4) IVEC=NBPTS IDEB=IVEC+1 IF (IERR.NE.0) RETURN C IPT3 ET IPT4 ONT ETE DESCENDU DANS L'OPERATION AINSI QUE MCOORD/REFPO 16 SEGACT IPT1,IPT2,MCOORD IPT4=IPT2 IF (IDEUX.EQ.1) GOTO 15 IPT5=IPT2.LISOUS(1) IPT6=IPT2.LISOUS(2) SEGACT IPT5,IPT6 C ON FAIT COMME POUR LE BAS NBSOUS=0 NBREF=0 NBNN=4*INCR NBNNR=NBNN NBELEM=NBELE3+NBELE4 SEGINI MELEME DO 1110 J=1,NBELEM DO 1110 I=1,NBNN NUM(I,J)=0 1110 CONTINUE DO 1111 J=1,NBELE3 ICOLOR(J)=IPT5.ICOLOR(J) DO 1111 I=1,IPT5.NUM(/1) NUM(I,J)=IPT5.NUM(I,J) 1111 CONTINUE DO 1112 J=1,NBELE4 ICOLOR(J+NBELE3)=IPT6.ICOLOR(J) DO 1112 I=1,IPT6.NUM(/1) NUM(I,J+NBELE3)=IPT6.NUM(I,J) 1112 CONTINUE SEGDES IPT5,IPT6,IPT2 IPT4=MELEME 15 IPT7.LISREF(2)=IPT2 C CONSTRUCTION DE LA TABLE DES POINTS EFFECTIFS NBELEC=IPT3.NUM(/2) SEGINI ICPR DO 12 I=1,NBNNEL DO 12 J=1,NBELEC 12 ICPR(I,J)=0 DO 13 J=1,NBELEC DO 13 I=1,NBNNEL IR=IPT3.NUM(I,J) IR2=IPT4.NUM(I,J) IF (IR.EQ.0) GOTO 1120 IF (IR2.EQ.0) GOTO 8833 I1=IR I1R2=IR2 IF (J.EQ.1) GOTO 13 JM1=J-1 DO 14 JJ=1,JM1 DO 14 II=1,NBNNEL IR=IPT3.NUM(II,JJ) IR2=IPT4.NUM(II,JJ) IF (IR.EQ.0) GOTO 14 IF (IR.NE.I1) GOTO 8834 IF (IR2.NE.I1R2) GOTO 8833 ICPR(I,J)=II+(JJ-1)*8 GOTO 13 8834 IF (IR2.EQ.I1R2) GOTO 8833 14 CONTINUE GOTO 13 1120 ICPR(I,J)=-1 IF (IR2.NE.0) GOTO 8833 13 CONTINUE GOTO 8835 8833 CONTINUE C LES TOPOLOGIES SONT DIFFERENTES SEGSUP ICPR RETURN 8835 CONTINUE C ON FABRIQUE POUR LE MOMENT DES CUBES A 8 OU 20 NOEUDS ET DES PRISMES C A 6 OU 15 NOEUDS C D'ABORD LES POINTS DU BAS DO 20 I=1,NBELEC IPT7.ICOLOR(I)=IPT3.ICOLOR(I) DO 20 J=1,NBNNEL IR=IPT3.NUM(J,I) IF (IR.EQ.0) GOTO 20 IPT7.NUM(J,I)=IR 20 CONTINUE IBASE=nbpts C ON FABRIQUE ENSUITE LES COUCHES C ON AFFECTE SEULEMENT LES NUMEROS DE NOEUDS IDIF=(INCR-1)*(NBNNEL/2) NX=NCOUCH-1 DO 21 ICOUCH=1,NCOUCH IF (ICOUCH.EQ.NCOUCH) GOTO 21 JBASE=(ICOUCH-1)*NBELEC IF (INCR.EQ.1) GOTO 2000 C ON FABRIQUE D'ABORD LA COUCHE INTERMEDIAIRE DO 2001 J=1,NBELEC IPT7.ICOLOR(J+JBASE)=IPT7.ICOLOR(J) DO 2001 IA=1,(NBNNEL/2) I=2*IA-1 IF (ICPR(I,J).EQ.-1) GOTO 2001 IF (ICPR(I,J).NE.0) GOTO 2002 IBASE=IBASE+1 IPT7.NUM(IA+NBNNEL,J+JBASE)=IBASE GOTO 2001 2002 IAUX=ICPR(I,J) JJ=(IAUX-1)/8+1 II=IAUX-8*JJ+8 IIA=(II+1)/2 IPT7.NUM(IA+NBNNEL,J+JBASE)=IPT7.NUM(IIA+NBNNEL,JJ+JBASE) 2001 CONTINUE 2000 CONTINUE DO 22 J=1,NBELEC IPT7.ICOLOR(J+JBASE)=IPT7.ICOLOR(J) DO 22 I=1,NBNNEL IF (ICPR(I,J).EQ.-1) GOTO 22 IF (ICPR(I,J).NE.0) GOTO 23 IBASE=IBASE+1 IPT7.NUM(I,J+JBASE+NBELEC)=IBASE IPT7.NUM(I+NBNNEL+IDIF,J+JBASE)=IBASE GOTO 22 23 IAUX=ICPR(I,J) JJ=(IAUX-1)/8+1 II=IAUX-8*JJ+8 IPT7.NUM(I,J+JBASE+NBELEC)=IPT7.NUM(II,JJ+JBASE+NBELEC) IPT7.NUM(I+NBNNEL+IDIF,J+JBASE)=IPT7.NUM(II+NBNNEL+IDIF,JJ+JBASE) 22 CONTINUE 21 CONTINUE 25 CONTINUE C ON FAIT LES POINTS DU HAUT ET EVENTUELLEMENT LA COUCHE INTERMEDIAIRE C PRECEDENTE JBASE=NBELEC*NX IF (INCR.EQ.1) GOTO 2003 DO 2004 J=1,NBELEC IPT7.ICOLOR(J+JBASE)=IPT7.ICOLOR(J) DO 2004 IA=1,(NBNNEL/2) I=2*IA-1 IF (ICPR(I,J).EQ.-1) GOTO 2004 IF (ICPR(I,J).NE.0) GOTO 2005 IBASE=IBASE+1 IPT7.NUM(IA+NBNNEL,J+JBASE)=IBASE GOTO 2004 2005 IAUX=ICPR(I,J) JJ=(IAUX-1)/8+1 II=IAUX-8*JJ+8 IIA=(II+1)/2 IPT7.NUM(IA+NBNNEL,J+JBASE)=IPT7.NUM(IIA+NBNNEL,JJ+JBASE) 2004 CONTINUE 2003 CONTINUE DO 30 J=1,NBELEC IPT7.ICOLOR(J+JBASE)=IPT7.ICOLOR(J) DO 30 I=1,NBNNEL IF (ICPR(I,J).EQ.-1) GOTO 30 IPT7.NUM(I+NBNNEL+IDIF,J+JBASE)=IPT4.NUM(I,J) 30 CONTINUE C CREATION DES POINTS IADR=nbpts NBPTS=IADR+NCOUCH*INCR*NBELEC*NBNNEL SEGADJ MCOORD DO 61 ICOUCH=1,NCOUCH DO 610 IC=1,INCR IREFC=(IPT9.NUM(IC+1,ICOUCH)-1)*4 XPLUS=XCOOR(IREFC+1)-XCOOR(IREFB+1) YPLUS=XCOOR(IREFC+2)-XCOOR(IREFB+2) ZPLUS=XCOOR(IREFC+3)-XCOOR(IREFB+3) TPLUS=XCOOR(IREFC+4) IC1=INCR+1-IC IF (ICOUCH.EQ.NCOUCH.AND.IC.EQ.INCR) GOTO 610 DO 620 J=1,NBELEC DO 62 I=1,NBNNEL,IC1 IF (ICPR(I,J).NE.0) GOTO 62 IREF=4*IPT3.NUM(I,J)-4 XCOOR(IADR*(IDIM+1)+1)=XCOOR(IREF+1)+XPLUS XCOOR(IADR*(IDIM+1)+2)=XCOOR(IREF+2)+YPLUS XCOOR(IADR*(IDIM+1)+3)=XCOOR(IREF+3)+ZPLUS XCOOR((IADR+1)*(IDIM+1))=TPLUS IADR=IADR+1 62 CONTINUE 620 CONTINUE 610 CONTINUE 61 CONTINUE NBPTS=IADR SEGADJ MCOORD C C'EST FINI C IL RESTE DANS LE CAS OU ON A DES CUBES ET DES PRISMES A LES SEPARER C ET A SUPPRIMER LES SEGMENTS SUPPLEMENTAIRES DE TRAVAIL C D'ABORD FAIRE LE POURTOUR A PARTIR DU CONTOUR IF (IPT7.LISREF(/1).EQ.2) GOTO 3000 CALL PRCONT IF (IERR.NE.0) GOTO 3000 C IPT5 LE CONTOUR IPT6 SERA LE POURTOUR SEGACT IPT5 NBASE=IPT5.NUM(/2) NBNN=INCR*4 NBELEM=NBASE*NCOUCH NBSOUS=0 NBREF=0 SEGINI IPT6 IPT6.ITYPEL=6+2*INCR SEGACT IPT3 DO 3001 IEL=1,NBASE DO 3001 IP=1,INCR+1 INP=IPT5.NUM(IP,IEL) DO 3003 IELS=1,NBELEC DO 3003 IPS=1,NBNNEL IPSP=IPT3.NUM(IPS,IELS) IF (IPSP.EQ.0) GOTO 3003 IF (IPSP.EQ.INP) GOTO 3002 3003 CONTINUE GOTO 3000 3002 CONTINUE DO 3004 IC=1,NCOUCH IBASE=(IC-1)*NBASE JBASE=(IC-1)*NBELEC C PTS DU BAS IPT6.NUM(IP,IEL+IBASE)=IPT7.NUM(IPS,IELS+JBASE) C PTS DU HAUT IPT6.NUM(NBNN+2-INCR-IP,IEL+IBASE)= # IPT7.NUM(IPS+NBNNEL+IDIF,IELS+JBASE) C EVENTUELLEMENT PTS MILIEUX IF (INCR.EQ.1.OR.IP.EQ.2) GOTO 3004 IPT6.NUM(10-2*IP,IEL+IBASE)=IPT7.NUM((IPS+1)/2+NBNNEL,IELS+JBASE) 3004 CONTINUE 3001 CONTINUE DO 3005 I=1,NCOUCH DO 3005 J=1,NBASE IPT6.ICOLOR(J+(I-1)*NBASE)=IPT5.ICOLOR(J) 3005 CONTINUE SEGDES IPT5,IPT6 IPT7.LISREF(3)=IPT6 3000 CONTINUE IF (IDEUX.EQ.1) GOTO 1500 SEGSUP IPT3,IPT4 MELEME=IPT7 NBSOUS=2 NBREF=LISREF(/1) NBNN=0 NBELEM=0 SEGINI IPT7 IPT7.LISREF(1)=LISREF(1) IPT7.LISREF(2)=LISREF(2) IF (NBREF.EQ.3) IPT7.LISREF(3)=LISREF(3) NBSOUS=0 NBREF=0 NBNN=6 IF (INCR.EQ.2) NBNN=15 NBELEM=NBTRI*NCOUCH SEGINI IPT3 IPT3.ITYPEL=16 IF (INCR.EQ.2) IPT3.ITYPEL=17 IPT7.LISOUS(1)=IPT3 NBNN=8 IF (INCR.EQ.2) NBNN=20 NBELEM=NBQUA*NCOUCH SEGINI IPT4 IPT4.ITYPEL=14 IF (INCR.EQ.2) IPT4.ITYPEL=15 IPT7.LISOUS(2)=IPT4 IT=0 IQ=0 DO 1501 J=1,NUM(/2) IF (NUM(NBNNV,J).EQ.0) GOTO 1502 C C'EST UN CUBE IQ=IQ+1 IPT4.ICOLOR(IQ)=ICOLOR(J) DO 1503 K=1,IPT4.NUM(/1) IPT4.NUM(K,IQ)=NUM(K,J) 1503 CONTINUE GOTO 1501 1502 IT=IT+1 IPT3.ICOLOR(IT)=ICOLOR(J) C C'EST UN PRISME IF (INCR.EQ.2) GOTO 2020 IPT3.NUM(1,IT)=NUM(1,J) IPT3.NUM(2,IT)=NUM(2,J) IPT3.NUM(3,IT)=NUM(3,J) IPT3.NUM(4,IT)=NUM(NBNNEL+1,J) IPT3.NUM(5,IT)=NUM(NBNNEL+2,J) IPT3.NUM(6,IT)=NUM(NBNNEL+3,J) GOTO 1501 2020 CONTINUE DO 2021 L=1,6 IPT3.NUM(L,IT)=NUM(L,J) 2021 CONTINUE IPT3.NUM(7,IT)=NUM(NBNNEL+1,J) IPT3.NUM(8,IT)=NUM(NBNNEL+2,J) IPT3.NUM(9,IT)=NUM(NBNNEL+3,J) DO 2022 L=1,6 IPT3.NUM(L+9,IT)=NUM(NBNNEL+IDIF+L,J) 2022 CONTINUE 1501 CONTINUE SEGDES IPT3,IPT4 SEGSUP MELEME 1500 SEGDES IPT1,IPT2 SEGSUP ICPR IF (ISVOL1.EQ.0) GOTO 3200 IPT8=ISVOL1 SEGACT IPT8 ltelq=.false. SEGDES IPT7,IPT8 IPT7=IRET 3200 CONTINUE SEGDES IPT7,IPT9 RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales