regle
C REGLE SOURCE CB215821 21/12/14 21:15:19 11220 C CONSTRUIT LA SURFACE REGLE ENTRE DEUX LIGNES DE MEME LONGUEUR C SUBROUTINE REGLE IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC SMCOORD -INC SMELEME -INC CCREEL SEGMENT TABPAR(NCOUCH) SEGMENT ICPR(2,NBELEC) SEGMENT JCPR(NBPTS) logical ltelq c * DIMENSION ITEST(0:NBCOUL-1) - NBCOUL stocke dans CCGEOME =16 dans bdata c DIMENSION ITEST(0:30) CHARACTER*(4) MLU IDIMP1 = IDIM+1 IMPOI=0 IMPOF=0 DEN1=0. DEN2=0. C Y A T IL UN DECOUPAGE IMPOSE INBR=0 * IF (IRETOU.EQ.1) INBR=MAX(1,INBR) * SI INBR NEGATIF ALORS DECOUPAGE IMPOSE AVEC PROGRESSION D'APRES * LES DENSITES C Y A T-IL DES DENSITES IMPOSEES IF (IRETOU.EQ.0) GOTO 83 IF (MLU.NE.'DINI') GOTO 81 DEN1=XXX IF (IERR.NE.0) RETURN IMPOI=1 IF (IMPOF.EQ.1) GOTO 83 IF (IRETOU.EQ.0) GOTO 83 81 IF (MLU.NE.'DFIN') GOTO 82 DEN2=XXX IF (IERR.NE.0) RETURN IMPOF=1 IF (IMPOI.EQ.0) GOTO 80 GOTO 83 83 CONTINUE IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IFUSE1=0 IF (IPT1.NE.IRET) IFUSE1=IPT1 IPT1=IRET IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IFUSE2=0 IF (IPT2.NE.IRET) IFUSE2=IPT2 IPT2=IRET SEGACT IPT1,IPT2 NBELEM=IPT1.NUM(/2) IF (IERR.EQ.0) GOTO 2 1 SEGDES IPT1,IPT2 RETURN 2 CONTINUE c c calcul de la couleur de melange via ITABM: c c fait ici, on va moyenner sur tous les elements c DO 90 I=0,(NBCOUL-1) c 90 ITEST(I)=0 c DO 91 I=1,IPT1.NUM(/2) c ITEST(IPT1.ICOLOR(I))=1 c 91 CONTINUE c DO 92 I=1,IPT2.NUM(/2) c ITEST(IPT2.ICOLOR(I))=1 c 92 CONTINUE c ICHCOL=-1 c DO 93 I=0,(NBCOUL-1) c IF (ITEST(I).EQ.1) THEN c IF (ICHCOL.EQ.-1) THEN c ICHCOL=I c ELSE c ICHCOL=ITABM(ICHCOL,I) c ENDIF c ENDIF c 93 CONTINUE SEGACT MCOORD*mod NBNN=IPT1.NUM(/1) ZG1=0. ZG2=0. DLONG=XPETIT IBOUCL=0 IF (IPT1.NUM(1,1).EQ.IPT1.NUM(NBNN,NBELEM)) IBOUCL=1 IF (IBOUCL.EQ.1.AND.IPT2.NUM(1,1).NE.IPT2.NUM(NBNN, #NBELEM)) THEN GOTO 1 ENDIF DEN1AU=DEN1 DEN2AU=DEN2 DO 10 I=1,NBNN DO 10 J=1,NBELEM IREF1=IPT1.NUM(I,J)*IDIMP1-IDIM XG1=XCOOR(IREF1) YG1=XCOOR(IREF1+1) IF (IDIM.GE.3) ZG1=XCOOR(IREF1+2) DEN1=XCOOR(IREF1+IDIM)+DEN1 IREF2=IPT2.NUM(I,J)*IDIMP1-IDIM XG2=XCOOR(IREF2) YG2=XCOOR(IREF2+1) IF (IDIM.GE.3) ZG2=XCOOR(IREF2+2) DEN2=XCOOR(IREF2+IDIM)+DEN2 XDIS=XG2-XG1 YDIS=YG2-YG1 ZDIS=ZG2-ZG1 DLONG=SQRT(XDIS*XDIS+YDIS*YDIS+ZDIS*ZDIS)+DLONG 10 CONTINUE NBTOT=NBNN*NBELEM DEN1=DEN1/NBTOT DEN2=DEN2/NBTOT DLONG=DLONG/NBTOT DLONG=MAX(XPETIT,DLONG) IF (IMPOI.EQ.1) DEN1=DEN1AU IF (IMPOF.EQ.1) DEN2=DEN2AU DEN1A=DEN1 DEN1B=DEN1 DEN2A=DEN2 DEN2B=DEN2 DEN1=DEN1/DLONG DEN2=DEN2/DLONG DENI = 0. DECA = 0. NX=NCOUCH-1 IF(DENI.EQ. 0.D0) DENI = DLONG / NCOUCH IF (IIMPI.EQ.1) WRITE (IOIMP,1000) NCOUCH,APROG 1000 FORMAT(/' COUCHES ',I6,' RAISON ',G12.5) NBNN =4 NBELEM=IPT1.NUM(/2)*NCOUCH NBSOUS=0 NBREF =4 SEGINI MELEME SEGINI TABPAR ITYPEL=8 INCR=IPT1.ITYPEL-1 IL=1 NBELEC=IPT1.NUM(/2) SEGINI ICPR SEGDES IPT4 LISREF(3)=IPT4 C ON REMPLIT LE TABLEAU ICPR DES PTS EFFECTIFS IDEB=nbpts+1 SEGINI,JCPR DO 510 J=1,NBELEC DO 511 I=1,2 I1=IPT1.NUM((I-1)*INCR+1,J) IF(JCPR(I1) .EQ. 0)THEN JCPR(I1)=J ENDIF 511 CONTINUE 510 CONTINUE C LCPR=0 DO 51 J=1,NBELEC DO 51 I=1,2 I1=IPT1.NUM((I-1)*INCR+1,J) C LCPR=LCPR+1 C DO 52 JJ=1,J JJ =JCPR(I1) DO 52 II=1,2 IF (II.NE.I ) GOTO 53 IF (JJ.EQ.J ) GOTO 51 53 ICPR(I,J)=II+(JJ-1)*2 C LCPR=LCPR-1 IF (J.EQ.NBELEC.AND.I.EQ.2) GOTO 55 GOTO 51 55 IF (IBOUCL.EQ.1) GOTO 51 ICPR(I,J)=0 ICPR(II,JJ)=I+(J-1)*2 GOTO 51 52 CONTINUE 51 CONTINUE SEGSUP,JCPR 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 DIN=DEN1 DO 60 I=1,IPT1.NUM(/2) NUM(1,I)=IPT1.NUM(1,I) NUM(2,I)=IPT1.NUM(1+INCR,I) c on crée la couleur moyenne par quadrangle ICOL1 = IPT1.ICOLOR(I) ICOL2 = IPT2.ICOLOR(I) ICOLOR(I)=ITABM(ICOL1,ICOL2) 60 CONTINUE ILASI=IDEB-1 ILASJ=ILASI+(INCR*NX)+INCR-1 IF (IBOUCL.EQ.1) ILASJ=ILASI ILAS=ILASJ+INCR*NX+INCR DO 62 ICOUCH=1,NCOUCH DIN=DIN*APROG TABPAR(ICOUCH)=DIN IF (NCOUCH.EQ.ICOUCH) GOTO 61 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 INI=(ICOUCH-1)*IPT1.NUM(/2) DO 62 J=1,IPT1.NUM(/2) ICOLOR(J+INI+NBELEC)=ICOLOR(J) DO 62 I=1,2 ILL=ILAS IF (I.EQ.1.AND.J.EQ.1) ILL=ILASI IF (I.EQ.2.AND.J.EQ.NBELEC) ILL=ILASJ 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 (I.EQ.1.AND.J.EQ.1) GOTO 62 IF (I.EQ.2.AND.J.EQ.NBELEC) GOTO 62 IF (ICPR(I,J).NE.0) GOTO 62 ILAS=ILL+1 62 CONTINUE TABPAR(NCOUCH)=DIN*APROG 61 CONTINUE INI=(NCOUCH-1)*IPT1.NUM(/2) DO 63 I=1,NBELEC NUM(4,INI+I)=IPT2.NUM(1,I) NUM(3,INI+I)=IPT2.NUM(1+INCR,I) 63 CONTINUE LISREF(1)=IPT1 C CREATION DES BORDS LATERAUX PAR LIGNE (DROITE) C IMPOSONS ILCOUR POUR CETTE MANIP (LES BORDS LATERAUX DOIVENT ETRE C CONSISTANT AVEC LES AUTRES ) ILSAUV=ILCOUR ILCOUR=IPT1.ITYPEL ITYPL=1 LP2=IPT2.NUM(1,1) LP1=IPT1.NUM(1,1) C CORRECTION POUR TENIR COMPTE DE LA DIFFERENCE DE LONGUEUR ENTRE C LE BORD ET LE MILIEU IREF1=(LP1-1)*IDIMP1 IREF2=(LP2-1)*IDIMP1 DL=0. DO 67 I=1,IDIM DL=DL+(XCOOR(IREF1+I)-XCOOR(IREF2+I))**2 67 CONTINUE DL=SQRT(DL) DEN1A=DEN1A*DL/DLONG DEN2A=DEN2A*DL/DLONG IF (IERR.NE.0) GOTO 100 SEGACT IPT3 LISREF(4)=IPT4 SEGDES IPT4 IF (IBOUCL.EQ.0) GOTO 66 LISREF(2)=IPT3 SEGDES IPT3 GOTO 65 66 CONTINUE SEGSUP IPT3 LP2=IPT2.NUM(IPT2.NUM(/1),IPT2.NUM(/2)) LP1=IPT1.NUM(IPT1.NUM(/1),IPT1.NUM(/2)) IREF1=(LP1-1)*IDIMP1 IREF2=(LP2-1)*IDIMP1 DL=0. DO 68 I=1,IDIM DL=DL+(XCOOR(IREF1+I)-XCOOR(IREF2+I))**2 68 CONTINUE DL=SQRT(DL) DEN1B=DEN1B*DL/DLONG DEN2B=DEN2B*DL/DLONG IF (IERR.NE.0) GOTO 100 SEGDES IPT3 LISREF(2)=IPT3 65 CONTINUE C ON RESTAURE ILCOUR 100 CONTINUE ILCOUR=ILSAUV IF (IERR.NE.0) RETURN C CREATION DES POINTS (PAS LES POINTS MILIEUX QUI SERONT FABRIQUES C EVENTUELLEMENT LORS DE LA CONVERSION DES ELEMENTS) DPAR=0. SEGACT MCOORD*mod IADR=nbpts IF (NCOUCH.EQ.1) GOTO 70 NBPTS=IADR+(NCOUCH-1)*IPT1.NUM(/2)*2 SEGADJ MCOORD DO 71 I=2,NCOUCH DIN=TABPAR(I-1) DPAR=DPAR+DIN IF (IPT1.NUM(/2).EQ.1) GOTO 70 UMDPAR=1.-DPAR DINA=DENI+DECA*DPAR DO 72 J=1,IPT1.NUM(/2) DO 72 K=1,2 IF (K.EQ.1.AND.J.EQ.1) GOTO 72 IF (K.EQ.2.AND.J.EQ.NBELEC) GOTO 72 IF (ICPR(K,J).NE.0) GOTO 72 IREF1=IDIMP1*IPT1.NUM((K-1)*INCR+1,J)-IDIM IREF2=IDIMP1*IPT2.NUM((K-1)*INCR+1,J)-IDIM IREFA=IADR*IDIMP1 XCOOR(IREFA+1)=UMDPAR*XCOOR(IREF1) +DPAR*XCOOR(IREF2) XCOOR(IREFA+2)=UMDPAR*XCOOR(IREF1+1)+DPAR*XCOOR(IREF2+1) IF(IDIM.NE.2) #XCOOR(IREFA+3)=UMDPAR*XCOOR(IREF1+2)+DPAR*XCOOR(IREF2+2) XCOOR(IREFA+IDIMP1)=DINA IADR=IADR+1 72 CONTINUE 71 CONTINUE 70 CONTINUE NBPTS=IADR SEGADJ MCOORD IPT7=IPT1 IPT8=IPT2 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) 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) 103 CONTINUE SEGSUP MELEME MELEME=IPT1 GOTO 101 102 CONTINUE * write (6,*) ' ilcour ksurf ',ilcour,ksurf(ilcour) IF (KSURF(ILCOUR).NE.10.AND.KSURF(ILCOUR).NE.6) GOTO 104 if (ipt7.itypel.ne.3) 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 105 I=1,NBELEM IPT5.NUM(JJ,I)=NUM(J,I) 105 CONTINUE NLIG=IPT1.NUM(/2) DO 106 I=1,NLIG IPT5.NUM(2,I)=IPT7.NUM(2,I) IPT5.NUM(6,NBELEM-NLIG+I)=IPT8.NUM(2,I) IPT5.ICOLOR(I) = IPT1.ICOLOR(I) 106 CONTINUE DPAR=0. NBPTS=IADR+NCOUCH*3*NLIG 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 DIN=TABPAR(I) DPAR=DPAR+DIN IF (I.EQ.NCOUCH) GOTO 108 UMDPAR=1.-DPAR DINA=DENI+DECA*DPAR DO 109 J=1,NLIG IREF1=IDIMP1*(IPT7.NUM(2,J)-1) IREF2=IDIMP1*(IPT8.NUM(2,J)-1) IREFA=IADR*IDIMP1 XCOOR(IREFA+1)=UMDPAR*XCOOR(IREF1+1)+DPAR*XCOOR(IREF2+1) XCOOR(IREFA+2)=UMDPAR*XCOOR(IREF1+2)+DPAR*XCOOR(IREF2+2) IF(IDIM.GE.3) #XCOOR(IREFA+3)=UMDPAR*XCOOR(IREF1+3)+DPAR*XCOOR(IREF2+3) XCOOR(IREFA+IDIMP1)=DINA 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 IPT5.ICOLOR(I*NLIG+J) = IPT1.ICOLOR(J) 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 EPAR=DPAR-TABPAR(I)*0.5 UMEPAR=1.-EPAR DINA=DEN1+DECA*EPAR DO 115 J=1,NLIG DO 115 K=1,2 IF (K.EQ.1.AND.J.EQ.1) GOTO 115 IF (K.EQ.2.AND.J.EQ.NLIG) GOTO 115 IF (ICPR(K,J).NE.0) GOTO 116 IREF1=(IPT7.NUM(2*K-1,J)-1)*IDIMP1 IREF2=(IPT8.NUM(2*K-1,J)-1)*IDIMP1 IREFA=IADR*IDIMP1 XCOOR(IREFA+1)=UMEPAR*XCOOR(IREF1+1)+EPAR*XCOOR(IREF2+1) XCOOR(IREFA+2)=UMEPAR*XCOOR(IREF1+2)+EPAR*XCOOR(IREF2+2) IF(IDIM.GE.3) #XCOOR(IREFA+3)=UMEPAR*XCOOR(IREF1+3)+EPAR*XCOOR(IREF2+3) XCOOR(IREFA+IDIMP1)=DINA 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 115 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) 115 CONTINUE 113 CONTINUE 107 CONTINUE NBPTS=IADR SEGADJ MCOORD SEGSUP MELEME MELEME=IPT5 SEGDES IPT1,IPT2,IPT3,IPT4,IPT7,IPT8 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=IADR+NCOUCH*NLIG SEGADJ MCOORD DO 120 I=1,NCOUCH DO 120 J=1,NLIG INU=(I-1)*NLIG+J IALT=3-IALT C CREATION DU POINT SUPPLEMENTAIRE IREF1=(NUM(2,INU)-1)*IDIMP1 IREF2=(NUM(6,INU)-1)*IDIMP1 IREFA=IADR*IDIMP1 XCOOR(IREFA+1)=(XCOOR(IREF1+1)+XCOOR(IREF2+1))*0.5 XCOOR(IREFA+2)=(XCOOR(IREF1+2)+XCOOR(IREF2+2))*0.5 IF (IDIM.GE.3) #XCOOR(IREFA+3)=(XCOOR(IREF1+3)+XCOOR(IREF2+3))*0.5 XCOOR(IREFA+IDIMP1)= # (XCOOR(IREF1+IDIMP1)+XCOOR(IREF2+IDIMP1))*0.5 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 120 CONTINUE SEGSUP MELEME MELEME=IPT1 GOTO 101 104 CONTINUE 101 CONTINUE SEGSUP TABPAR,ICPR c c attribution de la couleur "moyenne" c DO 152 I=1,NUM(/2) c 152 ICOLOR(I)=ICHCOL IF (IFUSE1.EQ.0) GOTO 150 IPT5=IFUSE1 SEGACT IPT5 ltelq=.false. SEGDES IPT5,MELEME MELEME=IRET 150 CONTINUE IF (IFUSE2.EQ.0) GOTO 151 IPT5=IFUSE2 SEGACT IPT5 ltelq=.false. SEGDES IPT5,MELEME MELEME=IRET 151 CONTINUE SEGDES MELEME RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales