genjo2
C GENJO2 SOURCE BP208322 16/11/18 21:17:20 9177 SUBROUTINE GENJO2 C-------------------------------------------------------------------- C C MAIL1 = GENJ MAIL2 FLOT1; C C MAIL1 : MAILLAGE DE JOI2 C MAIL2 : MAILLAGE DE QUA4 ET/OU DE TRI3 C FLOT1 : TOLERANCE C C Pierre Pegon/JRC Ispra C + modif PP 8/98 pour accelerer la recherche des contours C-------------------------------------------------------------------- IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C -INC PPARAM -INC CCOPTIO -INC SMELEME -INC SMCOORD -INC CCGEOME -INC SMLENTI C SEGMENT,JOIGEN INTEGER P1(NCOTE),P2(NCOTE),SZONE(NCOTE),NELMT(NCOTE) INTEGER FLAG(NCOTE) ENDSEGMENT POINTEUR JOIGE1.JOIGEN C IF(IERR.NE.0) RETURN IF(IERR.NE.0) RETURN C C VERIFICATION DE LA DIMENSION C IF (IDIM.NE.2)THEN WRITE(IOIMP,*)'GENJO2: on n"est pas en 2D' RETURN ENDIF C C VERIFICATION DES TYPES D'ELEMENT (POUR LE MOMENT QUA4 ET TRI3) C ET CALCUL DU NOMBRE DE COTES C NCOTE=0 SEGACT,IPT1 NBSOUS=IPT1.LISOUS(/1) DO IE1=1,MAX(NBSOUS,1) IF(NBSOUS.EQ.0)THEN MELEME=IPT1 ELSE MELEME=IPT1.LISOUS(IE1) SEGACT,MELEME ENDIF ILC=ITYPEL IF(ILC.NE.4.AND.ILC.NE.8)THEN WRITE(IOIMP,*)'GENJO2: type d"element incorrect' SEGDES,MELEME*NOMOD RETURN ELSE NCOTE=NCOTE+((ILC/4)+2)*ICOLOR(/1) ENDIF SEGDES,MELEME*NOMOD ENDDO C C REMPLISSAGE DU SEGMENT DES COTES C SEGACT,IPT1 SEGINI,JOIGEN IJOI=0 DO IE1=1,MAX(NBSOUS,1) IF(NBSOUS.EQ.0)THEN MELEME=IPT1 ELSE MELEME=IPT1.LISOUS(IE1) SEGACT,MELEME ENDIF NC=(ITYPEL/4)+2 DO IE3=1,NC IJOI=IJOI+1 P1(IJOI) =NUM(IE3,IE2) P2(IJOI) =NUM(MOD(IE3,NC)+1,IE2) SZONE(IJOI)=MIN(NBSOUS,IE1) NELMT(IJOI)=IE2 FLAG(IJOI) =P1(IJOI)+P2(IJOI) ENDDO ENDDO ENDDO C C ELIMINATION DES DOUBLONS A NOEUDS IDENTIQUES C C NOUVELLE STRATEGIE AVEC TRI PREALABLE COMME DANS GENJO3 (8/98) C JG=NCOTE SEGINI,MLENTI,MLENT1 DO IE1=1,NCOTE LECT(IE1)=IE1 MLENT1.LECT(IE1)=FLAG(IE1) ENDDO IFI=MLENT1.LECT(1) DO IE1=2,NCOTE IFF=MLENT1.LECT(IE1) IF(IFI.EQ.IFF)THEN JE1=LECT(IE1-1) IF(FLAG(JE1).NE.0)THEN DO IE2=IE1,NCOTE IFFF=MLENT1.LECT(IE2) IF(IFI.NE.IFFF)GOTO 10 JE2=LECT(IE2) IF(FLAG(JE2).NE.0)THEN IF((P1(JE1).EQ.P1(JE2).AND.P2(JE1).EQ.P2(JE2)).OR. > (P1(JE1).EQ.P2(JE2).AND.P2(JE1).EQ.P1(JE2)))THEN FLAG(JE1)=0 FLAG(JE2)=0 GOTO 10 ENDIF ENDIF ENDDO ENDIF ENDIF 10 IFI=IFF ENDDO SEGSUP,MLENTI,MLENT1 C C CONCATENATION DE LA LISTE C NNCOTE=NCOTE NCOTE=0 DO IE1=1,NNCOTE IF(FLAG(IE1).NE.0)NCOTE=NCOTE+1 ENDDO SEGINI,JOIGE1 IE2=0 DO IE1=1,NNCOTE IF(FLAG(IE1).NE.0)THEN IE2=IE2+1 JOIGE1.P1(IE2)=P1(IE1) JOIGE1.P2(IE2)=P2(IE1) JOIGE1.SZONE(IE2)=SZONE(IE1) JOIGE1.NELMT(IE2)=NELMT(IE1) JOIGE1.FLAG(IE2)=0 ENDIF ENDDO SEGSUP,JOIGEN JOIGEN=JOIGE1 C C DETERMINATION DES SEGMENTS AVEC VIS-A-VIS C DO IE1=1,NCOTE-1 IF(FLAG(IE1).EQ.0)THEN IPR1 = (IDIM+1)*(P1(IE1)-1) XP1 = XCOOR(IPR1+1) YP1 = XCOOR(IPR1+2) IPR2 = (IDIM+1)*(P2(IE1)-1) XP2 = XCOOR(IPR2+1) YP2 = XCOOR(IPR2+2) DO IE2=IE1+1,NCOTE IF(FLAG(IE2).EQ.0)THEN IPPR1= (IDIM+1)*(P1(IE2)-1) XPP1 = XCOOR(IPPR1+1) YPP1 = XCOOR(IPPR1+2) IPPR2= (IDIM+1)*(P2(IE2)-1) XPP2 = XCOOR(IPPR2+1) YPP2 = XCOOR(IPPR2+2) DIST1=SQRT((XP1-XPP1)**2+(YP1-YPP1)**2) > +SQRT((XP2-XPP2)**2+(YP2-YPP2)**2) DIST2=SQRT((XP1-XPP2)**2+(YP1-YPP2)**2) > +SQRT((XP2-XPP1)**2+(YP2-YPP1)**2) C PP 2001 IF(DIST1.LT.XTOL.OR.DIST2.LT.XTOL)THEN IF(DIST1.LT.2*XTOL.OR.DIST2.LT.2*XTOL)THEN FLAG(IE1)=IE2 FLAG(IE2)=IE1 C PP 2001 IF(DIST2.LT.XTOL)THEN IF(DIST2.LT.2*XTOL)THEN IPDUM=P1(IE2) P1(IE2)=P2(IE2) P2(IE2)=IPDUM ENDIF GOTO 20 ENDIF ENDIF ENDDO ENDIF 20 CONTINUE ENDDO C C CREATION DU MAILLAGE DE JOINT C NBNN=4 NBREF=0 NBSOUS=0 NBELEM=0 DO IE1=1,NCOTE IF(FLAG(IE1).NE.0)NBELEM=NBELEM+1 ENDDO NBELEM=NBELEM/2 SEGINI,IPT2 IPT2.ITYPEL=12 DO IE1=1,NBELEM IPT2.ICOLOR(IE1)=0 ENDDO C C GENERATION DU MAILLAGE DE JOINT C IELEM=0 DO IE1=1,NCOTE IF(FLAG(IE1).NE.0)THEN IELEM=IELEM+1 * * premier barycentre * XG=0.D0 YG=0.D0 IF(SZONE(IE1).EQ.0)THEN MELEME=IPT1 ELSE MELEME=IPT1.LISOUS(SZONE(IE1)) ENDIF DO IE3=1,NUM(/1) IPDUM=(IDIM+1)*(NUM(IE3,NELMT(IE1))-1) XG=XG+XCOOR(IPDUM+1) YG=YG+XCOOR(IPDUM+2) ENDDO XG=XG/NUM(/1) YG=YG/NUM(/1) * * 2 points le long du joint * IPR1 = (IDIM+1)*(P1(IE1)-1) XP1 = XCOOR(IPR1+1) YP1 = XCOOR(IPR1+2) IPR2 = (IDIM+1)*(P2(IE1)-1) XP2 = XCOOR(IPR2+1) YP2 = XCOOR(IPR2+2) * * second barycentre * IE2=FLAG(IE1) XGG=0.D0 YGG=0.D0 IF(SZONE(IE2).EQ.0)THEN MELEME=IPT1 ELSE MELEME=IPT1.LISOUS(SZONE(IE2)) ENDIF DO IE3=1,NUM(/1) IPDUM=(IDIM+1)*(NUM(IE3,NELMT(IE2))-1) XGG=XGG+XCOOR(IPDUM+1) YGG=YGG+XCOOR(IPDUM+2) ENDDO XGG=XGG/NUM(/1) YGG=YGG/NUM(/1) * * produit vectoriel, et selon son signe... * XVECT=(XP2-XP1)*(YGG-YG)-(YP2-YP1)*(XGG-XG) * PPj IF(XVECT.GT.0)THEN IF(XVECT.LT.0)THEN IPT2.NUM(1,IELEM)=P1(IE1) IPT2.NUM(2,IELEM)=P2(IE1) IPT2.NUM(3,IELEM)=P2(IE2) IPT2.NUM(4,IELEM)=P1(IE2) ELSE IPT2.NUM(1,IELEM)=P2(IE1) IPT2.NUM(2,IELEM)=P1(IE1) IPT2.NUM(3,IELEM)=P1(IE2) IPT2.NUM(4,IELEM)=P2(IE2) ENDIF * * on efface les 2 cotes * FLAG(IE1)=0 FLAG(IE2)=0 ENDIF ENDDO C C DESTRUCTION, DESACTIVATION ET RETOUR A GIBIANE C SEGSUP,JOIGEN NBSOUS=IPT1.LISOUS(/1) DO IE1=1,MAX(NBSOUS,1) IF(NBSOUS.EQ.0)THEN MELEME=IPT1 ELSE MELEME=IPT1.LISOUS(IE1) ENDIF SEGDES,MELEME*NOMOD ENDDO SEGDES,IPT2 C RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales