chanlg
C CHANLG SOURCE GOUNAND 26/07/30 21:15:05 12610 C CE SOUS PROGRAMME FABRIQUE L'ENSEMBLE DES ARETES D'UN MAILLAGE C IL FONCTIONNE SUIVANT UN PRINCIPE DERIVE DES TRACES C SUBROUTINE CHANLG IMPLICIT INTEGER(I-N) -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC SMELEME -INC SMCOORD PARAMETER(ndegma=2) SEGMENT ICPR(nbpts) SEGMENT IDCP(ITE) SEGMENT NTSEG(0) SEGMENT NELTOT(ndegma) SEGMENT JELTOT(NBSOR) SEGMENT KON(NBCON,NMAX,3,nbsor) ICPR = 0 IDCP = 0 KON = 0 IF (IERR.NE.0) RETURN * SEGINI ICPR ITE=0 SEGINI NELTOT idegre=0 SEGACT MELEME * IPT8 = MELEME NBSOU8 = meleme.LISOUS(/1) IPT1=MELEME DO 3 I=1,MAX(1,NBSOU8) IF (NBSOU8.NE.0) THEN IPT1 = meleme.LISOUS(I) ENDIF NBNOE1=IPT1.NUM(/1) NBELT1=IPT1.NUM(/2) K=IPT1.ITYPEL IDEP=NSPOS(K) if (idep.eq.0) goto 8 idegre=KDEGRE(K) * Pour l'instant, on ne fait que les lineaires et quadratiques if (idegre.le.0) goto 8 if (idegre.ge.ndegma+2.or.idegre.eq.1) then *Le type d'element fini %m1:8 ne convient pas. MOTERR(1:8)=NOMS(K) return ENDIF NELTOT(idegre-1)=NELTOT(idegre-1)+NBELT1 * IF (NBSOM(K).GT.0) THEN IFEP=IDEP+NBSOM(K)-1 ELSE C Cas du polygone IFEP=IDEP+NBNOE1-1 ENDIF DO 4 JJ=IDEP,IFEP J=IBSOM(JJ) DO 41 K=1,NBELT1 IPOIT=IPT1.NUM(J,K) IF (ICPR(IPOIT).NE.0) GOTO 41 ITE=ITE+1 ICPR(IPOIT)=ITE 41 CONTINUE 4 CONTINUE 8 CONTINUE 3 CONTINUE * IF (ITE.NE.0) GOTO 6 SEGSUP,ICPR * sg 2016/11/29 gestion maillage vide * Par défaut SEG2, sinon en fonction du dernier KDEGRE lu. ity=2 IF (idegre.ge.1.and.idegre.le.3) ity=idegre RETURN 6 CONTINUE C C Nombre de sous-maillages en sortie C nbsor=ndegma SEGINI JELTOT nbsor=0 DO idg=1,ndegma IF (NELTOT(idg).gt.0) then nbsor=nbsor+1 JELTOT(nbsor)=idg NELTOT(idg)=nbsor ENDIF ENDDO if (nbsor.eq.0) then return endif SEGADJ JELTOT C C ITE EST LE NOMBRE DE POINTS A CONSIDERER ICPR LE TABLEAU C ON VA MAINTENANT INITIALISER ET REMPLIR LE TABLEAU DES CONNECTIONS NBCON=7 NBCONR=NBCON-1 NMAX= 10*ITE SEGINI KON C FABRICATION DU TABLEAU DES CONNECTIONS C 1 POINT FINAL C 2 POINT INTERMEDIAIRE EVENTUEL ET SENS ICHAIN=ITE SEGACT MELEME IOO=0 IPT1=MELEME DO 30 IO=1,MAX(1,NBSOU8) IF (NBSOU8.NE.0) IPT1=LISOUS(IO) SEGACT IPT1 K=IPT1.ITYPEL If ((K.eq.22).or.(K.eq.48)) then segdes ipt1 goto 30 endif NBNN=KDEGRE(K) ibsor=neltot(nbnn-1) IPAS=NBNN-1 KKK=LTEL(1,K) c IPAS = 1 & KKK = 1 * Cas des segments IF (KKK.EQ.0) THEN DO 122 I=1,IPT1.NUM(/2) NMIL=1 N1=ICPR(IPT1.NUM(1,I)) JSUIV=1+IPAS N2=ICPR(IPT1.NUM(JSUIV,I)) IF (N1*N2.EQ.0) THEN GOTO 64 ENDIF IF (IPAS.EQ.2) NMIL=IPT1.NUM(1+1,I) NI=N1 NJ=N2 KSCOL=IPT1.ICOLOR(I) * PRINT *,'*KSCOL',KSCOL IPO=0 123 CONTINUE DO 125 IK=1,NBCONR 125 CONTINUE GOTO 123 126 CONTINUE GOTO 129 128 ICHAIN=ICHAIN+1 IF (ICHAIN.GE.NMAX) THEN GOTO 64 ENDIF IK=1 NI=ICHAIN GOTO 126 129 CONTINUE IF (IPO.EQ.1) GOTO 122 NMIL=-NMIL NI=N2 NJ=N1 IPO=1 GOTO 123 122 CONTINUE ELSE IOO=1 KK=LTEL(2,K)-1 c KKK = 1 && KK = 49 DO 300 III=1,KKK C ****BOUCLE PERMETTANT D'ALLER RECHERCHER TOUTES LES FACES KK=KK+1 ITYP=LDEL(1,KK) IDEP=LDEL(2,KK) IF (K.EQ.32) ITYP = 0 IF (ITYP.GT.0) THEN IFEP=IDEP+KDFAC(1,ITYP)-1 * SG 20160711 pour les faces TRI7 et QUA9, on ignore le dernier * point (centre de la face) IF (ITYP.EQ.7.OR.ITYP.EQ.8) IFEP=IFEP-1 ELSE C Cas du polygone IFEP= IDEP+IPT1.NUM(/1)-1 ENDIF DO 22 I=1,IPT1.NUM(/2) KSCOL=IPT1.ICOLOR(I) DO 221 J=IDEP,IFEP,IPAS NMIL=1 N1=ICPR(IPT1.NUM(LFAC(J),I)) JSUIV=J+IPAS IF (JSUIV.GT.IFEP) JSUIV=IDEP N2=ICPR(IPT1.NUM(LFAC(JSUIV),I)) IF (IPAS.EQ.2) NMIL=IPT1.NUM(LFAC(J+1),I) NI=N1 NJ=N2 IF (N1*N2.EQ.0) THEN GOTO 64 ENDIF IPO=0 23 CONTINUE DO 25 IK=1,NBCONR 25 CONTINUE GOTO 23 GOTO 29 28 ICHAIN=ICHAIN+1 IF (ICHAIN.GE.NMAX) THEN GOTO 64 ENDIF IK=1 NI=ICHAIN GOTO 26 29 IF (IPO.EQ.1) GOTO 221 NMIL=-NMIL NI=N2 NJ=N1 IPO=1 GOTO 23 221 CONTINUE 22 CONTINUE 300 CONTINUE ENDIF 30 CONTINUE IF (IIMPI.EQ.2)WRITE (IOIMP,1122) ((((KON(I,J,K,ibsor),K=1 $ ,2),I=1,NBCON),J=1,NMAX),ibsor=1,nbsor) 1122 FORMAT(1X,14I5) SEGINI IDCP DO 40 I=1,ICPR(/1) IF (ICPR(I).EQ.0) GOTO 40 IDCP(ICPR(I))=I 40 CONTINUE ************************************************************************ ** TEST VERIFIANT SI AU DEPART ON A DEJA DES POINTS,SEG2 OU SEG3 IF (IOO.EQ.0) THEN * LE MAILLAGE EXISTE DEJA * PRINT *,'*LE MAILLAGE EXISTE DEJA' GOTO 64 ENDIF * CREATION DE L'OBJET MAILLAGE NBREF=0 NBELEM=0 NBNN=0 IF (NBSOR.GT.1) THEN NBSOUS=NBSOR SEGINI IPT1 ENDIF NBSOUS=0 DO ibsor=1,NBSOR C ****ON COMPTE LE NOMBRE D'ELEMENTS POUR ACTIVER LE SEGMENT NBELEM=0 DO 170 J=1,ITE JJ=J 179 CONTINUE DO 180 I=1,NBCONR M=KON(I,JJ,1,ibsor) IF(M.LT.J) GOTO 180 NBELEM=NBELEM+1 180 CONTINUE IF (KON(NBCON,JJ,1,ibsor) .EQ. 0) GOTO 170 JJ=KON(NBCON,JJ,1,ibsor) GOTO 179 170 CONTINUE IF (NBELEM.EQ.0) THEN GOTO 64 ENDIF C****ETABLISSEMENT DU MAILLAGE C****CONSTRUCTION DU TABLEAU NUM NBNN=jeltot(ibsor)+1 SEGINI,MELEME ITYPEL=NBNN IEL=0 DO 100 J=1,ITE JJ=J 109 CONTINUE DO 110 I=1,NBCONR M=KON(I,JJ,1,ibsor) IF (M.LT.J) GOTO 110 IEL=IEL+1 NUM(1,IEL)=IDCP(J) NUM(NBNN,IEL)=IDCP(M) ICOLOR(IEL)=KON(I,JJ,3,ibsor) IF (NBNN.EQ.3) NUM(2,IEL)=ABS(KON(I,JJ,2,ibsor)) 110 CONTINUE IF (KON(NBCON,JJ,1,ibsor).EQ.0) GOTO 100 JJ=KON(NBCON,JJ,1,ibsor) GOTO 109 100 CONTINUE IF (NBSOR.GT.1) IPT1.LISOUS(ibsor)=MELEME ENDDO IF (NBSOR.GT.1) MELEME=IPT1 * ON INSCRIT LE MAILLAGE DANS LE MAILLAGE INITIAL * SEGACT,IPT8*MOD * IF (IPT8.LISREF(/1).EQ.0) THEN * NBREF=1 * NBNN=IPT8.NUM(/1) * NBELEM=IPT8.NUM(/2) * NBSOUS=IPT8.LISOUS(/1) * SEGADJ IPT8 * IPT8.LISREF(1)=MELEME * ENDIF * SEGDES IPT8 64 CONTINUE IF (KON.GT.0) SEGSUP,KON IF (IDCP.GT.0) SEGSUP,IDCP IF (ICPR.GT.0) SEGSUP,ICPR c CALL ACTOBJ pour meleme=ipt8 * SEGDES,IPT8 RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales