genera
C GENERA SOURCE SP204843 24/03/15 21:15:04 11871 C OPTION GENERATRICE C SUBROUTINE GENERA IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) DIMENSION XCO(4) -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC SMCOORD -INC SMELEME logical ltelq SEGMENT ICPR(2,NBELEC) SEGMENT ICPP(nbpts) COMMON/CTOURN/XPT1,YPT1,ZPT1,XV1,YV1,ZV1,XV2,YV2,ZV2,XVEC,YVEC, # ZVEC,ANGLE,ICLE,XP1,YP1,ZP1 IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IFUSE=0 IF (IPT1.NE.IRET) IFUSE=IPT1 IPT1=IRET IF (IERR.NE.0) RETURN SEGACT IPT8 IF (IERR.NE.0) RETURN NCOUCH=IPT8.NUM(/2) SEGACT IPT1 SEGACT MCOORD*mod NBNN =IPT1.NUM(/1) NBELEM=IPT1.NUM(/2) IBOUCL=0 IF (IPT1.NUM(1,1).EQ.IPT1.NUM(NBNN,NBELEM)) IBOUCL=1 20 CONTINUE NX=NCOUCH-1 IF (IIMPI.EQ.1) WRITE (IOIMP,1000) NCOUCH 1000 FORMAT(/,' COUCHES ',I6) NBNN =4 NBELEM=IPT1.NUM(/2)*NCOUCH NBSOUS=0 NBREF =4 SEGINI,MELEME ITYPEL=8 INCR =IPT1.ITYPEL-1 IL =1 NBELEC=IPT1.NUM(/2) SEGINI,ICPR C ON FAIT D'ABORD L' EXTREMITEE SEGINI,ICPP DO 52 I=1,ICPP(/1) ICPP(I)=0 52 CONTINUE ICLE =1 IPBAS =IPT8.NUM(1,1) IPHAU =IPT8.NUM(IPT8.NUM(/1),NCOUCH) IREFB =(IDIM+1)*(IPBAS-1) IREFH =(IDIM+1)*(IPHAU-1) DO 200 I=1,IDIM+1 XCO(I)=XCOOR(IREFH+I)-XCOOR(IREFB+I) 200 CONTINUE IF (IERR.NE.0) RETURN SEGSUP ICPP SEGACT MCOORD*mod SEGACT IPT3 SEGDES IPT4 LISREF(3)=IPT4 C ON REMPLIT LE TABLEAU ICPR DES PTS EFFECTIFS IDEB=nbpts+1 DO 70 I=1,2 DO 700 J=1,NBELEC ICPR(I,J)=0 700 CONTINUE 70 CONTINUE LCPR=0 DO 71 J=1,NBELEC DO 710 I=1,2 I1=IPT1.NUM((I-1)*INCR+1,J) LCPR=LCPR+1 DO 72 JJ=1,J DO 720 II=1,2 IF (IPT1.NUM((II-1)*INCR+1,JJ).NE.I1) GOTO 72 IF (II.NE.I) GOTO 73 IF (JJ.EQ.J) GOTO 71 73 ICPR(I,J)=II+(JJ-1)*2 LCPR=LCPR-1 IF (J.EQ.NBELEC.AND.I.EQ.2) GOTO 75 GOTO 71 75 IF (IBOUCL.EQ.1) GOTO 71 ICPR(I,J)=0 ICPR(II,JJ)=I+(J-1)*2 GOTO 71 720 CONTINUE 72 CONTINUE 710 CONTINUE 71 CONTINUE * IL SEMBLERAIT QUE L'ON AIT NCOUCH A FAIRE AVEC LCPR POINTS EFFECTIFS C ON NE S'OCCUPE QUE DE FABRIQUER DES RECTANGLES A 4 NOEUDS POUR C LE MOMENT D'ABORD LES POINTS DU BAS QUI NE SONT PAS A FABRIQUER DO 40 I=1,IPT1.NUM(/2) NUM(1,I)=IPT1.NUM(1,I) NUM(2,I)=IPT1.NUM(1+INCR,I) 40 CONTINUE ILASI=IDEB-1 ILASJ=ILASI+(INCR*NX)+INCR-1 IF (IBOUCL.EQ.1) ILASJ=ILASI ILAS=ILASJ+INCR*NX+INCR DO 42 ICOUCH=1,NCOUCH IF (NCOUCH.EQ.ICOUCH) GOTO 41 ILASI=ILASI+INCR ILASJ=ILASJ+INCR INI=(ICOUCH-1)*IPT1.NUM(/2) NUM(1,1+INI+NBELEC)=ILASI NUM(4,1+INI)=ILASI NUM(2,INI+2*NBELEC)=ILASJ NUM(3,INI+NBELEC)=ILASJ DO 420 J=1,IPT1.NUM(/2) DO 421 I=1,2 ILL=ILAS IF (I.EQ.1.AND.J.EQ.1) GOTO 421 IF (I.EQ.2.AND.J.EQ.NBELEC) GOTO 421 IF (ICPR(I,J).NE.0) ILL=NUM(MOD(ICPR(I,J)-1,2)+1, # (ICPR(I,J)-1)/2+1+INI+NBELEC) NUM(I,J+INI+NBELEC)=ILL NUM(5-I,J+INI)=ILL IF (ICPR(I,J).NE.0) GOTO 421 ILAS=ILL+1 421 CONTINUE 420 CONTINUE 42 CONTINUE 41 CONTINUE INI=(NCOUCH-1)*IPT1.NUM(/2) DO 43 I=1,NBELEC NUM(4,INI+I)=IPT3.NUM(1,I) NUM(3,INI+I)=IPT3.NUM(1+INCR,I) 43 CONTINUE DO 44 I=1,NCOUCH DO 440 J=1,IPT1.NUM(/2) II=(I-1)*IPT1.NUM(/2)+J ICOLOR(II)=IPT1.ICOLOR(J) 440 CONTINUE 44 CONTINUE LISREF(1)=IPT1 C CREATION DES BORDS LATERAUX PAR LIGNE PETIT SOUCI C CECI EST A REVOIR (NOUVEAU S-P POUR CE CAS QUI RESPECTE LA C NUMEROTATION ILS=IPT1.ITYPEL IDS=IPT1.ICOLOR(1) LP1=IPT1.NUM(1,1) LP2=IPT3.NUM(1,1) IF (IERR.NE.0) RETURN LISREF(4)=IPT4 SEGDES IPT4,IPT2 IF (IBOUCL.EQ.0) GOTO 46 LISREF(2)=IPT2 GOTO 45 46 CONTINUE IDS=IPT1.ICOLOR(IPT1.ICOLOR(/1)) LP2=IPT3.NUM(IPT3.NUM(/1),IPT3.NUM(/2)) LP1=IPT1.NUM(IPT1.NUM(/1),IPT1.NUM(/2)) IF (IERR.NE.0) RETURN SEGDES IPT2 LISREF(2)=IPT2 45 CONTINUE SEGSUP IPT3 C CREATION DES POINTS (PAS LES POINTS MILIEUX QUI SERONT FABRIQUES C EVENTUELLEMENT LORS DE LA CONVERSION DES ELEMENTS) IADR=nbpts IF (NCOUCH.EQ.1) GOTO 60 NBPTS=IADR+IPT1.NUM(/2)*(NCOUCH-1)*2 SEGADJ MCOORD DO 61 I=2,NCOUCH IF (IPT1.NUM(/2).EQ.1) GOTO 60 IREFI=(IDIM+1)*(IPT8.NUM(1,I)-1) XVI=XCOOR(IREFI+1)-XCOOR(IREFB+1) YVI=XCOOR(IREFI+2)-XCOOR(IREFB+2) ZVI=XCOOR(IREFI+3)-XCOOR(IREFB+3) DO 62 J=1,IPT1.NUM(/2) DO 620 K=1,2 IF (K.EQ.1.AND.J.EQ.1) GOTO 620 IF (K.EQ.2.AND.J.EQ.NBELEC) GOTO 620 IF (ICPR(K,J).NE.0) GOTO 620 IREF=(IDIM+1)*IPT1.NUM((K-1)*INCR+1,J)-IDIM XCOOR(IADR*(IDIM+1)+1)=XCOOR(IREF)+XVI XCOOR(IADR*(IDIM+1)+2)=XCOOR(IREF+1)+YVI IF (IDIM.NE.2) XCOOR(IADR*(IDIM+1)+3)=XCOOR(IREF+2)+ZVI XCOOR(IADR*(IDIM+1)+(IDIM+1))=XCOOR(IREF+IDIM) IADR=IADR+1 620 CONTINUE 62 CONTINUE 61 CONTINUE 60 CONTINUE NBPTS=IADR SEGADJ MCOORD IF (KSURF(ILCOUR).EQ.8) GOTO 101 IF (KSURF(ILCOUR).NE.4) GOTO 102 NBNN=3 NBELEM=2*NUM(/2) NBREF=4 NBSOUS=0 SEGINI IPT1 IPT1.ITYPEL=4 IPT1.LISREF(1)=LISREF(1) IPT1.LISREF(2)=LISREF(2) IPT1.LISREF(3)=LISREF(3) IPT1.LISREF(4)=LISREF(4) DO 103 I=1,NUM(/2),2 J=2*I-1 IPT1.NUM(1,J)=NUM(1,I) IPT1.NUM(2,J)=NUM(2,I) IPT1.NUM(3,J)=NUM(3,I) IPT1.ICOLOR(J)=ICOLOR(I) J=J+1 IPT1.NUM(1,J)=NUM(1,I) IPT1.NUM(2,J)=NUM(3,I) IPT1.NUM(3,J)=NUM(4,I) IPT1.ICOLOR(J)=ICOLOR(I) J=J+1 IF (J.GT.IPT1.NUM(/2)) GOTO 103 IPT1.NUM(1,J)=NUM(1,I+1) IPT1.NUM(2,J)=NUM(2,I+1) IPT1.NUM(3,J)=NUM(4,I+1) IPT1.ICOLOR(J)=ICOLOR(I+1) J=J+1 IPT1.NUM(1,J)=NUM(2,I+1) IPT1.NUM(2,J)=NUM(3,I+1) IPT1.NUM(3,J)=NUM(4,I+1) IPT1.ICOLOR(J)=ICOLOR(I+1) 103 CONTINUE SEGSUP MELEME MELEME=IPT1 GOTO 101 102 CONTINUE IF (KSURF(ILCOUR).NE.10.AND.KSURF(ILCOUR).NE.6) GOTO 104 C ON FAIT DES QUA8 OU DES TRI6 NBNN=8 NBELEM=NUM(/2) NBREF=4 NBSOUS=0 SEGINI IPT5 IPT5.ITYPEL=10 IPT1=LISREF(1) IPT2=LISREF(2) IPT3=LISREF(3) IPT4=LISREF(4) IPT5.LISREF(1)=IPT1 IPT5.LISREF(2)=IPT2 IPT5.LISREF(3)=IPT3 IPT5.LISREF(4)=IPT4 SEGACT IPT1,IPT2,IPT3,IPT4 DO 105 J=1,NUM(/1) JJ=2*J-1 DO 1050 I=1,NBELEM IPT5.NUM(JJ,I)=NUM(J,I) 1050 CONTINUE 105 CONTINUE DO 135 I=1,NBELEM IPT5.ICOLOR(I)=ICOLOR(I) 135 CONTINUE NLIG=IPT1.NUM(/2) DO 106 I=1,NLIG IPT5.NUM(2,I)=IPT1.NUM(2,I) IPT5.NUM(6,NBELEM+1-I)=IPT3.NUM(2,I) 106 CONTINUE NBPTA=nbpts NBPTS=NBPTA+NCOUCH*(NLIG+NLIG*2) SEGADJ MCOORD DO 107 I=1,NCOUCH IPT5.NUM(8,NLIG*(I-1)+1)=IPT4.NUM(2,NCOUCH+1-I) IPT5.NUM(4,NLIG*I)=IPT2.NUM(2,I) C ON FAIT D'ABORD LES NOEUDS 2 DU HAUT (6 DU BAS) C CREATION DES NOEUDS IF (I.EQ.NCOUCH) GOTO 108 IREFI=(IDIM+1)*(IPT8.NUM(IPT8.NUM(/1),I)-1) XVI=XCOOR(IREFI+1)-XCOOR(IREFB+1) YVI=XCOOR(IREFI+2)-XCOOR(IREFB+2) ZVI=XCOOR(IREFI+3)-XCOOR(IREFB+3) DO 109 J=1,NLIG IREF=(IDIM+1)*(IPT1.NUM(2,J)-1) XCOOR(IADR*(IDIM+1)+1)=XCOOR(IREF+1)+XVI XCOOR(IADR*(IDIM+1)+2)=XCOOR(IREF+2)+YVI IF (IDIM.GE.3) XCOOR(IADR*(IDIM+1)+3)=XCOOR(IREF+3)+ZVI XCOOR(IADR*(IDIM+1)+(IDIM+1))=XCOOR(IREF+IDIM+1) IADR=IADR+1 C ON MET LE NOEUD DANS LES ELEMENTS IPT5.NUM(6,(I-1)*NLIG+J)=IADR IPT5.NUM(2,I*NLIG+J)=IADR 109 CONTINUE 108 CONTINUE IF (NLIG.EQ.1) GOTO 113 C ON MET LES NOEUDS 4 DE GAUCHE ET 8 DE DROITE C CREATION DES NOEUDS IREFI=(IDIM+1)*(IPT8.NUM(2,I)-1) XVI=XCOOR(IREFI+1)-XCOOR(IREFB+1) YVI=XCOOR(IREFI+2)-XCOOR(IREFB+2) ZVI=XCOOR(IREFI+3)-XCOOR(IREFB+3) DO 115 J=1,NLIG DO 1150 K=1,2 IF (K.EQ.1.AND.J.EQ.1) GOTO 1150 IF (K.EQ.2.AND.J.EQ.NLIG) GOTO 1150 IF (ICPR(K,J).NE.0) GOTO 116 IREF=(IPT1.NUM(2*K-1,J)-1)*(IDIM+1) XCOOR(IADR*(IDIM+1)+1)=XCOOR(IREF+1)+XVI XCOOR(IADR*(IDIM+1)+2)=XCOOR(IREF+2)+YVI IF (IDIM.GE.3) XCOOR(IADR*(IDIM+1)+3)=XCOOR(IREF+3)+ZVI XCOOR(IADR*(IDIM+1)+(IDIM+1))=XCOOR(IREF+IDIM+1) IADR=IADR+1 116 CONTINUE C NOEUDS DES ELEM IF (ICPR(K,J).NE.0) GOTO 119 IPT5.NUM(4*(3-K),(I-1)*NLIG+J)=IADR GOTO 1150 119 CONTINUE IPT5.NUM(4*(3-K),(I-1)*NLIG+J)=IPT5.NUM(4*(2-MOD(ICPR(K,J)-1,2)), # (ICPR(K,J)+1)/2+(I-1)*NLIG) 1150 CONTINUE 115 CONTINUE 113 CONTINUE 107 CONTINUE NBPTS=IADR SEGADJ MCOORD SEGSUP MELEME MELEME=IPT5 SEGDES IPT1,IPT2,IPT3,IPT4 IF (KSURF(ILCOUR).NE.6) GOTO 101 C ON FAIT DES TRI6 NBNN=6 NBELEM=2*NUM(/2) NBREF=4 NBSOUS=0 SEGINI IPT1 IPT1.ITYPEL=6 IPT1.LISREF(1)=LISREF(1) IPT1.LISREF(2)=LISREF(2) IPT1.LISREF(3)=LISREF(3) IPT1.LISREF(4)=LISREF(4) IALT=1 NBPTS=nbpts+NCOUCH*NLIG SEGADJ MCOORD DO 120 I=1,NCOUCH IREFI=(IDIM+1)*(IPT8.NUM(2,I)-1) XVI=XCOOR(IREFI+1)-XCOOR(IREFB+1) YVI=XCOOR(IREFI+2)-XCOOR(IREFB+2) ZVI=XCOOR(IREFI+3)-XCOOR(IREFB+3) DO 1200 J=1,NLIG INU=(I-1)*NLIG+J IALT=3-IALT C CREATION DU POINT SUPPLEMENTAIRE IREF=(NUM(2,J)-1)*(IDIM+1) XCOOR(IADR*(IDIM+1)+1)=XCOOR(IREF+1)+XVI XCOOR(IADR*(IDIM+1)+2)=XCOOR(IREF+2)+YVI IF (IDIM.EQ.3) XCOOR(IADR*(IDIM+1)+3)=XCOOR(IREF+3)+ZVI XCOOR(IADR*(IDIM+1)+(IDIM+1))=XCOOR(IREF+IDIM+1) IADR=IADR+1 ITR1=2*INU-1 ITR2=2*INU GOTO (124,125),IALT C CREATION DES TRIANGLES 124 IPT1.NUM(1,ITR1)=NUM(1,INU) IPT1.NUM(2,ITR1)=NUM(2,INU) IPT1.NUM(3,ITR1)=NUM(3,INU) IPT1.NUM(5,ITR1)=NUM(7,INU) IPT1.NUM(6,ITR1)=NUM(8,INU) IPT1.NUM(4,ITR1)=IADR IPT1.NUM(1,ITR2)=NUM(3,INU) IPT1.NUM(2,ITR2)=NUM(4,INU) IPT1.NUM(3,ITR2)=NUM(5,INU) IPT1.NUM(4,ITR2)=NUM(6,INU) IPT1.NUM(5,ITR2)=NUM(7,INU) IPT1.NUM(6,ITR2)=IADR IPT1.ICOLOR(ITR1)=ICOLOR(INU) IPT1.ICOLOR(ITR2)=ICOLOR(INU) GOTO 126 125 IPT1.NUM(1,ITR1)=NUM(1,INU) IPT1.NUM(2,ITR1)=NUM(2,INU) IPT1.NUM(3,ITR1)=NUM(3,INU) IPT1.NUM(4,ITR1)=NUM(4,INU) IPT1.NUM(5,ITR1)=NUM(5,INU) IPT1.NUM(6,ITR1)=IADR IPT1.NUM(1,ITR2)=NUM(5,INU) IPT1.NUM(2,ITR2)=NUM(6,INU) IPT1.NUM(3,ITR2)=NUM(7,INU) IPT1.NUM(4,ITR2)=NUM(8,INU) IPT1.NUM(5,ITR2)=NUM(1,INU) IPT1.NUM(6,ITR2)=IADR IPT1.ICOLOR(ITR1)=ICOLOR(INU) IPT1.ICOLOR(ITR2)=ICOLOR(INU) GOTO 126 126 CONTINUE 1200 CONTINUE 120 CONTINUE SEGSUP MELEME MELEME=IPT1 GOTO 101 104 CONTINUE 101 CONTINUE SEGSUP ICPR C S'IL Y A LIEU EXAMINER LA DEGENERESCENCE (ROTATION) SEGDES IPT1 IF (IFUSE.EQ.0) GOTO 63 IPT5=IFUSE SEGACT IPT5,MELEME ltelq=.false. SEGDES IPT5 SEGSUP MELEME MELEME=IRET 63 CONTINUE SEGDES MELEME,IPT8 RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales