envel1
C ENVEL1 SOURCE CB215821 19/08/20 21:17:02 10287 * copier sur envvol avec gestion du chamelem de valeurs associes * utilise dans trac cham C C SG 2016/07/20 Programmation comme faced2, envvo2 pour gerer les faces TRI7/QUA9 * IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMELEME -INC CCGEOME -INC SMCHAML * * Type de faces prises en compte: T3, Q4, T6, Q8, T7, Q9 * Numero dans KDFAC 1 2 3 4 7 8 * Pour ne pas se prendre la tête, on numerote pareil que KDFAC * Pour les 5 (non utilisé), 6 (polygone) et >8, ca restera à 0 * NTYFAC=20, codé en dur dans CCGEOME pour KDFAC PARAMETER (NTYFAC=20) * Nb de faces de chaque type, sert également de compteur SEGMENT NBFAC(NTYFAC) * Tableau d'index de début fin dans les tableaux ???(NFAC) SEGMENT IDXFAC(NTYFAC+1) * Pointeurs sur des segments MELEME et MELVAL par type de face SEGMENT IPTFAC(NTYFAC) SEGMENT MLVFAC(NTYFAC) * Un segment pointant sur les IFACI et les XFACI SEGMENT IPOFAC(2,NTYFAC) * Segment IFACI contenant les noeuds, la couleur et si la face d'un * type donné est vue ou non SEGMENT IFACI(NNODE+2,NFACI) * Segment XFACI contenant les coordonnees noeuds, la couleur et si la face d'un * type donné est vue ou non SEGMENT XFACI(NNODE,NFACI) * SEGMENT IPPOL(NTPOL) SEGMENT IPREF(NTPOL) SEGMENT NTFAC(NFAC) SEGMENT KFAK(NFAC) SEGMENT NAUX(max(2,NFAC)) *SG * Logique loquaf : pour les faces TRI7 et QUA9, normalement, le * dernier noeud de la face est unique à la face : il peut donc * servir de clé de hachage et on peut éviter de vérifier l'égaliteé * de tous les autres noeuds lorsque l'on teste l'égalité des faces. * C'est ce qu'on fait si loquaf=vrai. * LOGICAL LOQUAF,LOPT PARAMETER (LOQUAF=.TRUE.) * Pour chaque face dans KDFAC, le numéro d'élément associé * Ne se trouve pas dans CCGEOME, etonnant INTEGER ITYEL(NTYFAC) * T3, Q4, T6, Q8, ? , POLY, T7, Q9 DATA ITYEL/4,8,6,10,0,0,7,11,12*0/ *dbg write(ioimp,*) 'coucou envel1' n2ptel=0 n2el=0 SEGACT MELEME c on compte le nombre d elements dont les faces sont de type 1 2 3 4 c 7 8 dans NBFAC SEGINI NBFAC NTPOL=0 IPT1=MELEME SEGACT MELEME nbsour=lisous(/1) if (mcoup.ne.0) nbsour=nbsour-1 DO 10 IOB=1,nbsour IPT1=LISOUS(IOB) SEGACT IPT1 NBELEM=IPT1.NUM(/2) ILTEL=LTEL(1,IPT1.ITYPEL) IF (ILTEL.EQ.0) GOTO 12 ILTAD=LTEL(2,IPT1.ITYPEL) DO 13 IF=1,ILTEL NTPOL=NTPOL+1 ELSE ENDIF 13 CONTINUE 12 CONTINUE 10 CONTINUE c==== CREATION DES FACES ============================================== * Initialisation des IFACI,XFACI SEGINI IPOFAC DO ITYFAC=1,NTYFAC NNODE=KDFAC(1,ITYFAC) IF (NNODE.GT.0) THEN NFACI=NBFAC(ITYFAC) SEGINI IFACI IPOFAC(1,ITYFAC)=IFACI SEGINI XFACI IPOFAC(2,ITYFAC)=XFACI ENDIF ENDDO SEGINI IPPOL,IPREF c NBFAC sert maintenant de compteur DO ITYFAC=1,NTYFAC NBFAC(ITYFAC)=0 ENDDO NTPOL=0 DO 50 IOB=1,nbsour IPT1=LISOUS(IOB) * si objet en double on saute do 51 io2=1,iob-1 if (ipt1.eq.lisous(io2)) goto 50 51 continue SEGACT IPT1 IELIM=1 IF (KSURF(IPT1.ITYPEL).EQ.IPT1.ITYPEL) THEN * face non eliminable (pas un volume) IELIM=0 ENDIF melval=lisref(iob) if (melval.eq.0) goto 50 segact melval lval=velche(/1) ival=velche(/2) NBELEM=IPT1.NUM(/2) ILTEL=LTEL(1,IPT1.ITYPEL) IF (ILTEL.EQ.0) GOTO 52 ILTAD=LTEL(2,IPT1.ITYPEL) DO 60 IF=1,ILTEL ITYFAC=LDEL(1,ILTAD+IF-1) IAD=LDEL(2,ILTAD+IF-1) NNODE=KDFAC(1,ITYFAC) IF (NNODE.GT.0) THEN IFACI=IPOFAC(1,ITYFAC) XFACI=IPOFAC(2,ITYFAC) DO 66 IEL=1,NBELEM ielr=min(ival,iel) NBFAC(ITYFAC)=NBFAC(ITYFAC)+1 j=NBFAC(ITYFAC) DO i=1,NNODE IFACI(i,j)=IPT1.NUM(LFAC(IAD+i-1),IEL) XFACI(i,j)=velche(min(lval,LFAC(IAD+i-1)),ielr) ENDDO IFACI(NNODE+1,j)=IPT1.ICOLOR(IEL) IFACI(NNODE+2,j)=IELIM 66 CONTINUE ENDIF * Avant ce if était après le 52 CONTINUE mais alors ITYFAC etait * potentiellement non initialise IF (ITYFAC.EQ.6) THEN C Polygone NTPOL = NTPOL+1 IPPOL(NTPOL)= IPT1 SEGINI,MELVA1 = MELVAL IPREF(NTPOL) = MELVA1 ENDIF 60 CONTINUE 52 CONTINUE 50 CONTINUE C IF FAUT MAINTENANT RETASSER ET CLASSER LES TABLEAUX DES FACES C PROBLEME ELLES NE SONT PAS FORCEMENT DECRITES DE LA MEME FACON C SG 20160712 NTFAC sert de cle de hachage, elle est égale à la C somme des numeros de noeuds de la face NFAC=0 SEGINI IDXFAC IDXFAC(1)=NFAC+1 DO ITYFAC=1,NTYFAC NFAC=NFAC+NBFAC(ITYFAC) IDXFAC(ITYFAC+1)=NFAC+1 * write(ioimp,*) 'ityfac=',ityfac,' nbfac=',NBFAC(ITYFAC) ENDDO SEGINI NTFAC,KFAK IFAC=0 DO ITYFAC=1,NTYFAC NNODE=KDFAC(1,ITYFAC) IF (NNODE.GT.0) THEN LOPT=LOQUAF.AND.(ITYFAC.EQ.7.OR.ITYFAC.EQ.8) IFACI=IPOFAC(1,ITYFAC) DO I=1,NBFAC(ITYFAC) IFAC=IFAC+1 IF (LOPT) THEN NTFAC(IFAC)=IFACI(NNODE,I) ELSE DO J=1,NNODE NTFAC(IFAC)=NTFAC(IFAC)+IFACI(J,I) ENDDO ENDIF KFAK(IFAC)=I ENDDO ENDIF ENDDO C IL N'Y A PLUS QU'A TRIER ET RETASSER KFAK SUIVANT NTFAC SEGINI NAUX DO 300 ITYFAC=1,NTYFAC IDEB=IDXFAC(ITYFAC) IFIN=IDXFAC(ITYFAC+1)-1 IF (IFIN.LE.IDEB) GOTO 300 NAUX(1)=IDEB NAUX(2)=IFIN 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 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 ITYFAC=1,NTYFAC IDEB=IDXFAC(ITYFAC) IFIN=IDXFAC(ITYFAC+1)-1 IF (IFIN.LE.IDEB) GOTO 400 NNODE=KDFAC(1,ITYFAC) * A cette etape on doit avoir nnode.gt.0 IF (NNODE.LE.0) THEN RETURN ENDIF LOPT=LOQUAF.AND.(ITYFAC.EQ.7.OR.ITYFAC.EQ.8) IFACI=IPOFAC(1,ITYFAC) * 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) IF (IFACI(NNODE+2,IR1).EQ.0) GOTO 460 IF (IFACI(NNODE+2,IR2).EQ.0) GOTO 460 IF (.NOT.LOPT) THEN DO 471 J1=1,NNODE INU=IFACI(J1,IR1) 472 CONTINUE GOTO 460 471 CONTINUE ENDIF C DEUX FACES EGALES ON LES SUPPRIMENT NTFAC(I1)=0 GOTO 450 460 CONTINUE 450 CONTINUE 400 CONTINUE * IF (IIMPI.NE.0) WRITE (IOIMP,9111) (KFAK(I),NTFAC(I),I=1,NFAC) SEGINI IPTFAC,MLVFAC NBSOUS=0 NBREF=0 NBSOU2=0 DO 600 ITYFAC=1,NTYFAC IDEB=IDXFAC(ITYFAC) IFIN=IDXFAC(ITYFAC+1)-1 * write(ioimp,*) 'ityfac=',ityfac,' ideb=',ideb,' ifin=',ifin IF (IFIN.LT.IDEB) GOTO 600 NNODE=KDFAC(1,ITYFAC) * A cette etape on doit avoir nnode.gt.0 IF (NNODE.LE.0) THEN RETURN ENDIF IFACI=IPOFAC(1,ITYFAC) XFACI=IPOFAC(2,ITYFAC) NBELEM=0 DO 611 I=IDEB,IFIN IF (NTFAC(I).NE.0) NBELEM=NBELEM+1 611 CONTINUE * write(ioimp,*) 'nbelem=',nbelem,' nnode=',nnode IF (NBELEM.EQ.0) GOTO 600 NBSOU2=NBSOU2+1 NBNN=NNODE SEGINI IPT1 IPT1.ITYPEL=ITYEL(ITYFAC) n1ptel=nnode n1el=nbelem segini melva1 JAUX=0 DO 612 J=IDEB,IFIN IF (NTFAC(J).EQ.0) GOTO 612 JAUX=JAUX+1 IPT1.ICOLOR(JAUX)=IFACI(NNODE+1,KFAK(J)) DO 613 I=1,NBNN IPT1.NUM(I,JAUX)=IFACI(I,KFAK(J)) melva1.velche(I,JAUX)=XFACI(I,KFAK(J)) 613 CONTINUE 612 CONTINUE IPTFAC(ITYFAC)=IPT1 * write(ioimp,*) 'ipt1=',ipt1 MLVFAC(ITYFAC)=melva1 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,nbsour) if (nbsour.ne.0) ipt6=lisous(io) segact ipt6 if (ipt6.itypel.le.3) then nbsou2=nbsou2+1 ipt5=ipt6 endif 710 continue * write(ioimp,*) 'nbsou2=',nbsou2 NBSOUS=NBSOU2+NTPOL if (mcoup.ne.0) nbsous=nbsous+1 IF (IERR.NE.0) RETURN NBREF=nbsous NBNN=0 NBELEM=0 SEGINI IPT5 I=0 DO ITYFAC=1,NTYFAC IPT1=IPTFAC(ITYFAC) melva1=MLVFAC(ITYFAC) IF (IPT1.NE.0) THEN if (melva1.eq.0) then return endif I=I+1 IPT5.LISOUS(I)=IPT1 IPT5.LISref(I)=melva1 ENDIF ENDDO segact meleme ipt1=meleme do 711 io=1,max(1,nbsour) if (nbsour.ne.0) ipt1=lisous(io) segact ipt1 if (ipt1.itypel.le.3) then I=I+1 IPT5.LISOUS(I)=IPT1 IPT5.LISref(I)=lisref(io) endif 711 continue DO 720, IO = 1, NTPOL I= I+1 IPT5.LISOUS(I) = IPPOL(IO) IPT5.LISREF(I) = IPREF(IO) 720 CONTINUE if (mcoup.ne.0) then I= I+1 IPT5.LISOUS(I) = lisous(nbsour+1) IPT5.LISREF(I) = lisref(nbsour+1) endif melres=ipt5 SEGSUP IPTFAC,MLVFAC,NAUX,NTFAC,KFAK,IDXFAC,IPPOL,IPREF DO ITYFAC=1,NTYFAC IFACI=IPOFAC(1,ITYFAC) IF (IFACI.NE.0) THEN SEGSUP IFACI ENDIF XFACI=IPOFAC(2,ITYFAC) IF (XFACI.NE.0) THEN SEGSUP XFACI ENDIF ENDDO SEGSUP IPOFAC,NBFAC END
© Cast3M 2003 - Tous droits réservés.
Mentions légales