envvol
C ENVVOL SOURCE GOUNAND 17/12/05 21:16:07 9645 SUBROUTINE ENVVOL IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMELEME -INC CCGEOME -INC SMCOORD SEGMENT IFAC3(4,NFAC3) SEGMENT IFAC4(5,NFAC4) SEGMENT IFAC6(7,NFAC6) SEGMENT IFAC8(9,NFAC8) SEGMENT IPPOL(NTPOL) SEGMENT NTFAC(NFAC) SEGMENT KFAK(NFAC) SEGMENT NAUX(max(2,NFAC)) SEGMENT XCENT(3,NBELEM) character*4 lnoid(1) c==== LECTURE D UN MOT CLE ORIE pour ORIENTER L ENVELOPPE ============= PARAMETER (LCLE = 1) CHARACTER*4 MCLE(LCLE) *dbg PARAMETER (LOPT=1) *dbg CHARACTER*4 MOPT(LOPT) *dbg DATA MOPT/'OLD '/ DATA MCLE/'ORIE'/ data lnoid/'NOID'/ *dbg IOPT=0 *dbg CALL LIRMOT(MOPT,LOPT,IOPT,0) ICLE=0 *dbg IF (IOPT.EQ.0.AND.ICLE.EQ.0) THEN IF (ICLE.EQ.0) THEN RETURN ENDIF c==== LECTURE ET OUVERTURE DU MELEME ================================== c et eventuelle boucle 10 sur les ojbets meleme elementaires IF (IERR.NE.0) RETURN SEGACT MELEME c on compte le nombre d elements dont les faces possedent 3,4,6 ou 8 c noeuds => NFAC3,4,6,8 NFAC3=0 NFAC4=0 NFAC6=0 NFAC8=0 NTPOL = 0 IPT1=MELEME SEGACT MELEME DO 10 IOB=1,MAX(1,LISOUS(/1)) IF (LISOUS(/1).NE.0) THEN IPT1=LISOUS(IOB) SEGACT IPT1 ENDIF NBELEM=IPT1.NUM(/2) c LTEL,LDEL LFAC de CCGEOME remplis par bdata ILTEL=LTEL(1,IPT1.ITYPEL) IF (ILTEL.EQ.0) GOTO 12 ILTAD=LTEL(2,IPT1.ITYPEL) c --- boucle sur les faces de chaque elements --- DO 13 IF=1,ILTEL 21 NFAC3=NFAC3+NBELEM GOTO 30 22 NFAC4=NFAC4+NBELEM GOTO 30 23 NFAC6=NFAC6+NBELEM GOTO 30 24 NFAC8=NFAC8+NBELEM GOTO 30 25 GOTO 30 26 NTPOL = NTPOL+1 GOTO 30 30 CONTINUE 13 CONTINUE c --- fin de boucle sur les faces de chaque elements --- 12 CONTINUE 10 CONTINUE c write(6,*) 'dimension de NFAC3,4,6,8=',NFAC3,NFAC4,NFAC6,NFAC8 c==== CREATION DES FACES ============================================== c IFAC3,4,6,8(i,j)=noeuds de la jieme face SEGINI IFAC3,IFAC4,IFAC6,IFAC8,IPPOL NFAC3=0 NFAC4=0 NFAC6=0 NFAC8=0 NTPOL=0 c eventuelle boucle 50 sur les ojbets meleme elementaires DO 50 IOB=1,MAX(1,LISOUS(/1)) IF (LISOUS(/1).NE.0) IPT1=LISOUS(IOB) segact ipt1 NBELEM=IPT1.NUM(/2) C calcul du centre des noeuds des elements if (ICLE.eq.1) then segini,XCENT NBNN=IPT1.NUM(/1) IDIM1 = IDIM+1 do iel=1,NBELEM XG = 0.D0 YG = 0.D0 ZG = 0.D0 do inode=1,NBNN IP1 = IPT1.NUM(inode,iel) - 1 XG = XG + XCOOR(IP1*IDIM1+1) YG = YG + XCOOR(IP1*IDIM1+2) ZG = ZG + XCOOR(IP1*IDIM1+3) enddo XCENT(1,iel)=XG/NBNN XCENT(2,iel)=YG/NBNN XCENT(3,iel)=ZG/NBNN enddo c write(6,*) 'XCENT=',(XCENT(1,iou),iou=1,min(4,NBELEM)) c write(6,*) ' ',(XCENT(2,iou),iou=1,min(4,NBELEM)) c write(6,*) ' ',(XCENT(3,iou),iou=1,min(4,NBELEM)) endif ILTEL=LTEL(1,IPT1.ITYPEL) IF (ILTEL.EQ.0) GOTO 52 ILTAD=LTEL(2,IPT1.ITYPEL) c --- boucle 60 sur faces d'1 type d'element ------------------ DO 60 IF=1,ILTEL ITYP=LDEL(1,ILTAD+IF-1) IAD=LDEL(2,ILTAD+IF-1) c --- boucle 66 sur elements --------------------------------- DO 66 IEL=1,NBELEM GOTO (61,62,63,64,65,65),ITYP 61 NFAC3=NFAC3+1 IFAC3(1,NFAC3)=IPT1.NUM(LFAC(IAD),IEL) IFAC3(2,NFAC3)=IPT1.NUM(LFAC(IAD+1),IEL) IFAC3(3,NFAC3)=IPT1.NUM(LFAC(IAD+2),IEL) IFAC3(4,NFAC3)=IPT1.ICOLOR(IEL) GOTO 65 62 NFAC4=NFAC4+1 IFAC4(1,NFAC4)=IPT1.NUM(LFAC(IAD),IEL) IFAC4(2,NFAC4)=IPT1.NUM(LFAC(IAD+1),IEL) IFAC4(3,NFAC4)=IPT1.NUM(LFAC(IAD+2),IEL) IFAC4(4,NFAC4)=IPT1.NUM(LFAC(IAD+3),IEL) IFAC4(5,NFAC4)=IPT1.ICOLOR(IEL) GOTO 65 63 NFAC6=NFAC6+1 IFAC6(1,NFAC6)=IPT1.NUM(LFAC(IAD) ,IEL) IFAC6(2,NFAC6)=IPT1.NUM(LFAC(IAD+1),IEL) IFAC6(3,NFAC6)=IPT1.NUM(LFAC(IAD+2),IEL) IFAC6(4,NFAC6)=IPT1.NUM(LFAC(IAD+3),IEL) IFAC6(5,NFAC6)=IPT1.NUM(LFAC(IAD+4),IEL) IFAC6(6,NFAC6)=IPT1.NUM(LFAC(IAD+5),IEL) IFAC6(7,NFAC6)=IPT1.ICOLOR(IEL) GOTO 65 64 CONTINUE NFAC8=NFAC8+1 IFAC8(1,NFAC8)=IPT1.NUM(LFAC(IAD) ,IEL) IFAC8(2,NFAC8)=IPT1.NUM(LFAC(IAD+1),IEL) IFAC8(3,NFAC8)=IPT1.NUM(LFAC(IAD+2),IEL) IFAC8(4,NFAC8)=IPT1.NUM(LFAC(IAD+3),IEL) IFAC8(5,NFAC8)=IPT1.NUM(LFAC(IAD+4),IEL) IFAC8(6,NFAC8)=IPT1.NUM(LFAC(IAD+5),IEL) IFAC8(7,NFAC8)=IPT1.NUM(LFAC(IAD+6),IEL) IFAC8(8,NFAC8)=IPT1.NUM(LFAC(IAD+7),IEL) IFAC8(9,NFAC8)=IPT1.ICOLOR(IEL) GOTO 65 65 CONTINUE 66 CONTINUE c --- fin de boucle 66 sur elements --------------------------------- 60 CONTINUE c --- fin de boucle 60 sur faces d'1 type d'element ------------------ 52 CONTINUE IF (ITYP.EQ.6) THEN C Polygone NTPOL = NTPOL+1 IPPOL(NTPOL)= IPT1 ELSE IF (LISOUS(/1).NE.0) SEGDES IPT1 ENDIF 50 CONTINUE SEGDES MELEME if (ICLE.eq.1) segsup,XCENT C ====================================================================== C IL FAUT MAINTENANT RETASSER ET CLASSER LES TABLEAUX DES FACES C PROBLEME ELLES NE SONT PAS FORCEMENT DECRITES DE LA MEME FACON NFAC=NFAC3+NFAC4+NFAC6+NFAC8 SEGINI NTFAC,KFAK IF (NFAC3.EQ.0) GOTO 101 DO 102 I=1,NFAC3 NTFAC(I)=IFAC3(1,I)+IFAC3(2,I)+IFAC3(3,I) KFAK(I)=I 102 CONTINUE 101 CONTINUE IF (NFAC4.EQ.0) GOTO 103 DO 104 I=1,NFAC4 NTFAC(I+NFAC3)=IFAC4(1,I)+IFAC4(2,I)+IFAC4(3,I)+IFAC4(4,I) KFAK(I+NFAC3)=I 104 CONTINUE 103 CONTINUE IF (NFAC6.EQ.0) GOTO 105 DO 106 I=1,NFAC6 NTFAC(I+NFAC3+NFAC4)=IFAC6(1,I)+IFAC6(2,I)+IFAC6(3,I) #+IFAC6(4,I)+IFAC6(5,I)+IFAC6(6,I) KFAK(I+NFAC3+NFAC4)=I 106 CONTINUE 105 CONTINUE IF (NFAC8.EQ.0) GOTO 107 DO 108 I=1,NFAC8 NTFAC(I+NFAC3+NFAC4+NFAC6)=IFAC8(1,I)+IFAC8(2,I)+IFAC8(3,I) #+IFAC8(4,I)+IFAC8(5,I)+IFAC8(6,I)+IFAC8(7,I)+IFAC8(8,I) KFAK(I+NFAC3+NFAC4+NFAC6)=I 108 CONTINUE 107 CONTINUE C IL N'Y A PLUS QU'A TRIER ET RETASSER KFAK SUIVANT NTFAC SEGINI NAUX DO 300 ITYP=1,4 GOTO (301,302,303,304),ITYP 301 CONTINUE IF (NFAC3.LE.1) GOTO 300 NAUX(1)=1 NAUX(2)=NFAC3 GOTO 310 302 CONTINUE IF (NFAC4.LE.1) GOTO 300 NAUX(1)=NFAC3+1 NAUX(2)=NFAC3+NFAC4 GOTO 310 303 CONTINUE IF (NFAC6.LE.1) GOTO 300 NAUX(1)=NFAC3+NFAC4+1 NAUX(2)=NFAC3+NFAC4+NFAC6 GOTO 310 304 CONTINUE IF (NFAC8.LE.1) GOTO 300 NAUX(1)=NFAC3+NFAC4+NFAC6+1 NAUX(2)=NFAC GOTO 310 310 CONTINUE IZ=2 208 IZ=IZ-1 IF (IZ.LE.0) GOTO 209 IPB=NAUX(IZ*2-1) IPH=NAUX(IZ*2) IF(IPB.GE.IPH) GOTO 208 JPB=IPB-1 JPH=IPH+1 C CALCUL DU PIVOT NPV=0 * DO 207 J=IPB,IPH * NPV=NPV+NTFAC(J) * 207 CONTINUE * NPV=NPV/(IPH-IPB+1) NPV=(NTFAC(IPB)+NTFAC(IPH))/2 242 JPB=JPB+1 IF (JPH.EQ.JPB) GOTO 245 IF (NTFAC(JPB).LE.NPV) GOTO 243 GOTO 242 243 JPH=JPH-1 IF (JPH.EQ.JPB) GOTO 245 IF (NTFAC(JPH).GE.NPV) GOTO 244 GOTO 243 244 IAUX=KFAK(JPB) KFAK(JPB)=KFAK(JPH) KFAK(JPH)=IAUX NTAUX=NTFAC(JPB) NTFAC(JPB)=NTFAC(JPH) NTFAC(JPH)=NTAUX GOTO 242 245 IF (JPB.GE.IPB) GOTO 247 JPB=JPB+1 JPH=JPH+2 GOTO 248 247 IF (JPH.LE.IPH) GOTO 249 JPB=JPB-2 JPH=JPH-1 GOTO 248 249 IF (NTFAC(JPB).LE.NPV) GOTO 250 IF (JPH.EQ.IPH) GOTO 251 252 JPH=JPH+1 GOTO 248 250 IF (JPB.EQ.IPB) GOTO 252 251 JPB=JPB-1 248 IF (JPB.EQ.IPB) GOTO 253 NAUX(2*IZ)=JPB IZ=IZ+1 253 IF (JPH.EQ.IPH) GOTO 208 NAUX(2*IZ)=IPH NAUX(2*IZ-1)=JPH IZ=IZ+1 GOTO 208 209 CONTINUE 300 CONTINUE C ====================================================================== C LES FACES SONT CLASSEES DANS KFAK IL FAUT ELIMINER LES FACES EN DOUBL C ELLES SONT PAR TYPE LES UNES DERRIERES LES AUTRES LES PLUS HAUTES C DEVANT IF (IIMPI.NE.0) WRITE (IOIMP,9111) (KFAK(I),NTFAC(I),I=1,NFAC) 9111 FORMAT(5(2X,2I6)) DO 400 ITYP=1,4 GOTO (401,402,403,404),ITYP 401 IF (NFAC3.LE.1) GOTO 400 IDEB=1 IFIN=NFAC3 GOTO 410 402 IF (NFAC4.LE.1) GOTO 400 IDEB=NFAC3+1 IFIN=NFAC3+NFAC4 GOTO 410 403 IF (NFAC6.LE.1) GOTO 400 IDEB=NFAC3+NFAC4+1 IFIN=NFAC3+NFAC4+NFAC6 GOTO 410 404 IF (NFAC8.LE.1) GOTO 400 IDEB=NFAC3+NFAC4+NFAC6+1 IFIN=NFAC GOTO 410 410 CONTINUE IFINM=IFIN-1 DO 450 I1=IDEB,IFINM NTI1=NTFAC(I1) IF (NTI1.EQ.0) GOTO 450 IDEB1=I1+1 IF (NTI2.EQ.0) GOTO 460 IF (NTI2.NE.NTI1) GOTO 450 IR1=KFAK(I1) GOTO (470,480,490,500),ITYP 470 CONTINUE DO 471 J1=1,3 INU=IFAC3(J1,IR1) 472 CONTINUE GOTO 520 471 CONTINUE GOTO 510 480 CONTINUE DO 481 J1=1,4 INU=IFAC4(J1,IR1) 482 CONTINUE GOTO 520 481 CONTINUE GOTO 510 490 CONTINUE DO 491 J1=1,6 INU=IFAC6(J1,IR1) 492 CONTINUE GOTO 520 491 CONTINUE GOTO 510 500 CONTINUE DO 501 J1=1,8 INU=IFAC8(J1,IR1) 502 CONTINUE GOTO 520 501 CONTINUE GOTO 510 520 CONTINUE GOTO 460 510 CONTINUE C DEUX FACES EGALES ON LES SUPPRIMENT NTFAC(I1)=0 GOTO 450 460 CONTINUE 450 CONTINUE 400 CONTINUE IPT1=0 IPT2=0 IPT3=0 IPT4=0 NBSOUS=0 NBREF=0 NBSOU2=0 DO 600 ITY=1,4 GOTO (610,620,630,640),ITY 610 CONTINUE IF (NFAC3.EQ.0) GOTO 600 IDEB=1 IFIN=NFAC3 NBELEM=0 DO 611 I=IDEB,IFIN IF (NTFAC(I).NE.0) NBELEM=NBELEM+1 611 CONTINUE IF (NBELEM.EQ.0) GOTO 600 NBSOU2=NBSOU2+1 NBNN=3 SEGINI IPT1 IPT1.ITYPEL=4 JAUX=0 DO 612 J=IDEB,IFIN IF (NTFAC(J).EQ.0) GOTO 612 JAUX=JAUX+1 IPT1.ICOLOR(JAUX)=IFAC3(4,KFAK(J)) DO 613 I=1,NBNN IPT1.NUM(I,JAUX)=IFAC3(I,KFAK(J)) 613 CONTINUE 612 CONTINUE SEGDES IPT1 GOTO 600 620 CONTINUE IF (NFAC4.EQ.0) GOTO 600 IDEB=NFAC3+1 IFIN=NFAC3+NFAC4 NBELEM=0 DO 621 I=IDEB,IFIN IF (NTFAC(I).NE.0) NBELEM=NBELEM+1 621 CONTINUE IF (NBELEM.EQ.0) GOTO 600 NBSOU2=NBSOU2+1 NBNN=4 SEGINI IPT2 IPT2.ITYPEL=8 JAUX=0 DO 622 J=IDEB,IFIN IF (NTFAC(J).EQ.0) GOTO 622 JAUX=JAUX+1 IPT2.ICOLOR(JAUX)=IFAC4(5,KFAK(J)) DO 623 I=1,NBNN IPT2.NUM(I,JAUX)=IFAC4(I,KFAK(J)) 623 CONTINUE 622 CONTINUE SEGDES IPT2 GOTO 600 630 CONTINUE IF (NFAC6.EQ.0) GOTO 600 IDEB=NFAC3+NFAC4+1 IFIN=NFAC3+NFAC4+NFAC6 NBELEM=0 DO 631 I=IDEB,IFIN IF (NTFAC(I).NE.0) NBELEM=NBELEM+1 631 CONTINUE IF (NBELEM.EQ.0) GOTO 600 NBSOU2=NBSOU2+1 NBNN=6 SEGINI IPT3 IPT3.ITYPEL=6 JAUX=0 DO 632 J=IDEB,IFIN IF (NTFAC(J).EQ.0) GOTO 632 JAUX=JAUX+1 IPT3.ICOLOR(JAUX)=IFAC6(7,KFAK(J)) DO 633 I=1,NBNN IPT3.NUM(I,JAUX)=IFAC6(I,KFAK(J)) 633 CONTINUE 632 CONTINUE SEGDES IPT3 GOTO 600 640 CONTINUE IF (NFAC8.EQ.0) GOTO 600 IDEB=NFAC3+NFAC4+NFAC6+1 IFIN=NFAC NBELEM=0 DO 641 I=IDEB,IFIN IF (NTFAC(I).NE.0) NBELEM=NBELEM+1 641 CONTINUE IF (NBELEM.EQ.0) GOTO 600 NBSOU2=NBSOU2+1 NBNN=8 SEGINI IPT4 IPT4.ITYPEL=10 JAUX=0 DO 642 J=IDEB,IFIN IF (NTFAC(J).EQ.0) GOTO 642 JAUX=JAUX+1 IPT4.ICOLOR(JAUX)=IFAC8(9,KFAK(J)) DO 643 I=1,NBNN IPT4.NUM(I,JAUX)=IFAC8(I,KFAK(J)) 643 CONTINUE 642 CONTINUE SEGDES IPT4 GOTO 600 600 CONTINUE * on rajoute les points et les segments qui pouvaient etre dans le * maillage initial ipt5=0 segact meleme ipt6=meleme do 710 io=1,max(1,lisous(/1)) if (lisous(/1).ne.0) ipt6=lisous(io) segact ipt6 if (ipt6.itypel.le.3) then nbsou2=nbsou2+1 ipt5=ipt6 endif segdes ipt6 710 continue segdes meleme IF (NBSOU2.NE.1.OR.NTPOL.GE.0) GOTO 700 SEGSUP IFAC3,IFAC4,IFAC6,IFAC8,NTFAC,KFAK,NAUX RETURN 700 CONTINUE NBREF=0 NBSOUS=NBSOU2+NTPOL NBNN=0 NBELEM=0 SEGINI IPT5 I=0 IF (IPT1.EQ.0) GOTO 701 I=I+1 IPT5.LISOUS(I)=IPT1 701 CONTINUE IF (IPT2.EQ.0) GOTO 702 I=I+1 IPT5.LISOUS(I)=IPT2 702 CONTINUE IF (IPT3.EQ.0) GOTO 703 I=I+1 IPT5.LISOUS(I)=IPT3 703 CONTINUE IF (IPT4.EQ.0) GOTO 704 I=I+1 IPT5.LISOUS(I)=IPT4 704 CONTINUE segact meleme ipt1=meleme do 711 io=1,max(1,lisous(/1)) if (lisous(/1).ne.0) ipt1=lisous(io) segact ipt1 if (ipt1.itypel.le.3) then I=I+1 IPT5.LISOUS(I)=IPT1 endif segdes ipt1 711 continue DO 720, IO = 1, NTPOL I = I+1 IPT5.LISOUS(I)=IPPOL(IO) 720 CONTINUE if (ipt5.lisous(/1).eq.1) then ipt6=ipt5 ipt5=ipt6.lisous(1) segsup ipt6 endif segdes meleme SEGDES IPT5 SEGSUP IFAC3,IFAC4,IFAC6,IFAC8,NTFAC,KFAK,NAUX,IPPOL RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales