isova6
C ISOVA6 SOURCE PV 20/03/30 21:20:10 10567 IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : ISOVA6 C DESCRIPTION : * Les piles d'éléments peuvent contenir des informations redondantes : * - dans une pile d'éléments, plusieurs fois le même * - dans la pile des POI1, des noeuds déjà présents dans les piles * de SEG2, TRI3, TET4, PYR5, PRI6, QUA4 * - dans la pile des SEG2, des segments déjà présents dans les piles * de TRI3, TET4, PYR5, PRI6, QUA4 * - dans la pile des TRI3, des faces déjà présentes dans la pile des * TET4 * On réduit les piles de manière adéquate. C C C C LANGAGE : ESOPE C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF) C mél : gounand@semt2.smts.cea.fr C*********************************************************************** C VERSION : v1, 15/09/2014, version initiale C HISTORIQUE : v1, 15/09/2014, création C HISTORIQUE : v1.1, 16/03/2015, correction anomalie 8433 C HISTORIQUE : C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC SMLENTI -INC CCREEL -INC SMCOORD * * Segments ajustables 1D contenant les noeuds des éléments créés ainsi * que leur couleur * ELEM(1) contient des POI1 * ELEM(2) contient des SEG2 * ELEM(3) contient des TRI3 * ELEM(4) contient des TET4 * ELEM(5) contient des PYR5 * ELEM(6) contient des PRI6 * ELEM(7) contient des QUA4 * PARAMETER (NTYEL=7) SEGMENT ELEMS POINTEUR ELEM(NTYEL).MLENTI ENDSEGMENT * Défini dans isova1 INTEGER ITYPL(NTYEL) * SEGMENT ICPR(nbpts) segment inode(ino) segment jelnum(imaxel,ino) segment kelnum(imaxel,ino) segment xelnum(imaxel,ino) integer locfac(3) * LOGICAL LFOUND * * Executable statements * * Debuggage : ecriture des piles *dbg do idpil=1,ntyel *dbg mlenti=elem(idpil) *dbg ndnode=nbnne(itypl(idpil)) *dbg jdg=lect(/1) *dbg ndg=jdg/(ndnode+1) *dbg write(ioimp,*) '*** Pile ',idpil,' : ',ndnode,' noeuds ',ndg, *dbg $ ' elements' *dbg do idg=1,ndg *dbg iddx=(ndnode+1)*(idg-1) *dbg write(ioimp,147) idg,lect(iddx+ndnode+1), *dbg $ (lect(iddx+m),m=1,ndnode) *dbg enddo *dbg enddo *dbg 147 format (' element',1X,I6,' coul',1X,I6,10(1X,I6)) * * Il y aurait peut-être eu moyen de faire plus efficace en "flaggant" * les cas particuliers par rapport au cas général dans isova2.eso * mais ce serait plus compliqué à coder * *dbg write(ioimp,*) '****************************************' *dbg write(ioimp,*) ' Traitement des points redondants ' *dbg write(ioimp,*) '****************************************' ********************************************************************** * Traitement des points redondants ********************************************************************** * * La pile des points peut contenir des noeuds en double * on la réduit si nécessaire. * Egalement, on supprime les noeuds qui sont dans les piles * ELEM(2-7) car s'ils sont référencés dedans, cela veut dire que * l'isovaleur s'est arrêtée au bord d'un élément * MLENTI=ELEM(1) JG=LECT(/1) IF (JG.GT.0) THEN * Ici, un segment de logiques suffirait SEGINI ICPR do ipil=2,7 mlenti=elem(ipil) nnode=nbnne(itypl(ipil)) jg=lect(/1) ng=jg/(nnode+1) do ig=1,ng do iloc=1,nnode idx=(nnode+1)*(ig-1)+iloc * write(ioimp,*) 'nnode=',nnode,' ig=',ig,' iloc=',iloc * write(ioimp,*) ' idx=',idx inod=lect(idx) * write(ioimp,*) ' inod=',inod if (icpr(inod).eq.0) icpr(inod)=1 enddo enddo enddo * Dans la pile des points, on a des couples (noeud, couleur) ipil=1 mlenti=elem(ipil) nnode=nbnne(itypl(ipil)) jg=lect(/1) ng=jg/(nnode+1) ired=0 *dbg write(ioimp,*) 'nnode=',nnode,' ig=',ig,' jg=',jg do ig=1,ng idx=(nnode+1)*(ig-1)+1 inod=lect(idx) if (icpr(inod).eq.0) then icpr(inod)=1 if (ired.gt.0) then idxr=(nnode+1)*(ig-ired-1) idx =(nnode+1)*(ig-1) do iloc=1,nnode+1 lect(idxr+iloc)=lect(idx+iloc) enddo endif else ired=ired+1 endif enddo SEGSUP ICPR *dbg write(ioimp,*) 'nb noeuds redondants ou deja dans elements ', *dbg $ ' =',ired jg=jg-((nnode+1)*ired) segadj mlenti ENDIF * Debuggage : ecriture des piles *dbg do idpil=1,ntyel *dbg mlenti=elem(idpil) *dbg ndnode=nbnne(itypl(idpil)) *dbg jdg=lect(/1) *dbg ndg=jdg/(ndnode+1) *dbg write(ioimp,*) '*** Pile ',idpil,' : ',ndnode,' noeuds ',ndg, *dbg $ ' elements' *dbg do idg=1,ndg *dbg iddx=(ndnode+1)*(idg-1) *dbg write(ioimp,147) idg,lect(iddx+ndnode+1), *dbg $ (lect(iddx+m),m=1,ndnode) *dbg enddo *dbg enddo *dbg write(ioimp,*) '****************************************' *dbg write(ioimp,*) ' Traitement des segments redondants 1' *dbg write(ioimp,*) '****************************************' ********************************************************************** * Traitement des segments redondants ********************************************************************** * * On supprime les segments déjà référencés dans les piles d'éléments * surfaciques... (repris de reduri et chanlg) * ipil=2 mlenti=elem(ipil) nnode=nbnne(itypl(ipil)) jg=lect(/1) ng=jg/(nnode+1) IF (JG.GT.0) THEN *dbg WRITE(IOIMP,*) 'DIME MCOOR=',nbpts SEGINI ICPR * Création d'une numérotation locale ino=0 do ig=1,ng idx=(nnode+1)*(ig-1) inod1=lect(idx+1) inod2=lect(idx+2) ia=max(inod1,inod2) * WRITE(IOIMP,*) 'ia=',ia if(icpr(ia).eq.0) then ino=ino+1 icpr(ia)=ino endif enddo * * on compte combien de segments touche un noeud * on réduit la pile des segments en même temps * segini inode do ig=1,ng idx=(nnode+1)*(ig-1) inod1=lect(idx+1) inod2=lect(idx+2) ia=max(inod1,inod2) ib=icpr(ia) inode(ib)=inode(ib)+1 enddo imaxel=0 do i=1,ino imaxel=max(imaxel,inode(i)) inode(i)=0 enddo segini jelnum ired=0 do 122 ig=1,ng idx=(nnode+1)*(ig-1) inod1=lect(idx+1) inod2=lect(idx+2) imin=min(inod1,inod2) lfound=.false. do j=1,imaxel if (jelnum(j,ib).eq.0) then jelnum(j,ib)=imin * jelnum(j,ib,2)=lect(idx+3) inode(ib)=inode(ib)+1 goto 123 elseif (jelnum(j,ib).eq.imin) then lfound=.true. goto 123 endif enddo 123 continue if (lfound) then ired=ired+1 else if (ired.gt.0) then idxr=(nnode+1)*(ig-ired-1) idx =(nnode+1)*(ig-1) do iloc=1,nnode+1 lect(idxr+iloc)=lect(idx+iloc) enddo endif endif 122 continue *dbg write(ioimp,*) 'nb seg redondants pile segments=',ired *dbg write(ioimp,*) ' nb segments*3=',jg jg=jg-((nnode+1)*ired) segadj mlenti *dbg write(ioimp,*) ' nb segments*3 apres=',jg * Debuggage : ecriture des piles *dbg do idpil=1,ntyel *dbg mlenti=elem(idpil) *dbg ndnode=nbnne(itypl(idpil)) *dbg jdg=lect(/1) *dbg ndg=jdg/(ndnode+1) *dbg write(ioimp,*) '*** Pile ',idpil,' : ',ndnode,' noeuds ',ndg, *dbg $ ' elements' *dbg do idg=1,ndg *dbg iddx=(ndnode+1)*(idg-1) *dbg write(ioimp,147) idg,lect(iddx+ndnode+1), *dbg $ (lect(iddx+m),m=1,ndnode) *dbg enddo *dbg enddo * * Ici, on parcourt les segments des éléments * on met jelnum(j,ib) en négatif si on veut l'éliminer * * write(ioimp,*) 'parcours des segments des éléments' if (jg.gt.0) then do ipil=3,7 * write(ioimp,*) ' ipil=',ipil mlenti=elem(ipil) nnode=nbnne(itypl(ipil)) * write(ioimp,*) ' nnode=',nnode jg=lect(/1) * write(ioimp,*) ' jg=',jg ng=jg/(nnode+1) * write(ioimp,*) ' ng=',ng if (jg.gt.0) then ityp=itypl(ipil) * write(ioimp,*) 'ipil=',ipil,' ityp=',ityp nseg=LPL(ityp) idxseg=LPT(ityp)-1 * Parcours des éléments de la pile do ig=1,ng idx=(nnode+1)*(ig-1) * Parcours des segments des éléments do iseg=1,nseg iloc1=KSEGM(idxseg+2*(iseg-1)+1) iloc2=KSEGM(idxseg+2*(iseg-1)+2) inod1=lect(idx+iloc1) inod2=lect(idx+iloc2) * write(ioimp,*) 'iseg=',iseg,' iloc1=',iloc1, * $ ' iloc2=',iloc2 * write(ioimp,*) ' inod1=',inod1, * $ ' inod2=',inod2 imin=min(inod1,inod2) if (ib.ne.0) then do j=1,inode(ib) jmin=jelnum(j,ib) jamin=abs(jmin) if (jamin.eq.imin) then if (jmin.gt.0) jelnum(j,ib)=-jmin goto 125 endif enddo endif 125 continue enddo enddo endif enddo * * On réduit à nouveau la pile des segments. Le imin est négatif dans * jelnum pour les segments que l'on ne souhaite pas garder * ipil=2 mlenti=elem(ipil) nnode=nbnne(itypl(ipil)) jg=lect(/1) ng=jg/(nnode+1) ired=0 do 126 ig=1,ng idx=(nnode+1)*(ig-1) inod1=lect(idx+1) inod2=lect(idx+2) imin=min(inod1,inod2) lfound=.false. do j=1,inode(ib) jmin=jelnum(j,ib) jamin=abs(jmin) if (jamin.eq.imin) then if (jmin.lt.0) then lfound=.true. endif goto 127 endif enddo 127 continue if (lfound) then ired=ired+1 else if (ired.gt.0) then idxr=(nnode+1)*(ig-ired-1) idx =(nnode+1)*(ig-1) do iloc=1,nnode+1 lect(idxr+iloc)=lect(idx+iloc) enddo endif endif * enddo 126 continue *dbg write(ioimp,*) 'nb seg pile elts surf volu =',ired jg=jg-((nnode+1)*ired) segadj mlenti endif segsup jelnum segsup inode segsup icpr ENDIF *dbg write(ioimp,*) '****************************************' *dbg write(ioimp,*) ' Traitement des segments redondants 2' *dbg write(ioimp,*) '****************************************' * Debuggage : ecriture des piles *dbg do idpil=1,ntyel *dbg mlenti=elem(idpil) *dbg ndnode=nbnne(itypl(idpil)) *dbg jdg=lect(/1) *dbg ndg=jdg/(ndnode+1) *dbg write(ioimp,*) '*** Pile ',idpil,' : ',ndnode,' noeuds ',ndg, *dbg $ ' elements' *dbg do idg=1,ndg *dbg iddx=(ndnode+1)*(idg-1) *dbg write(ioimp,147) idg,lect(iddx+ndnode+1), *dbg $ (lect(iddx+m),m=1,ndnode) *dbg enddo *dbg enddo *dbg write(ioimp,*) '*****************************************' *dbg write(ioimp,*) ' Traitement des triangles redondants 1' *dbg write(ioimp,*) '*****************************************' ********************************************************************** * Traitement des faces (triangulaires) redondantes ********************************************************************** ipil=3 mlenti=elem(ipil) nnode=nbnne(itypl(ipil)) jg=lect(/1) ng=jg/(nnode+1) IF (JG.GT.0) THEN *dbg WRITE(IOIMP,*) 'DIME MCOOR=',nbpts SEGINI ICPR * Création d'une numérotation locale ino=0 do ig=1,ng idx=(nnode+1)*(ig-1) inod1=lect(idx+1) inod2=lect(idx+2) inod3=lect(idx+3) ia=max(inod1,inod2,inod3) * WRITE(IOIMP,*) 'ia=',ia if(icpr(ia).eq.0) then ino=ino+1 icpr(ia)=ino endif enddo * * on compte combien de faces triangulaires touche un noeud * on réduit la pile des faces triangulaires en même temps * segini inode do ig=1,ng idx=(nnode+1)*(ig-1) inod1=lect(idx+1) inod2=lect(idx+2) inod3=lect(idx+3) ia=max(inod1,inod2,inod3) ib=icpr(ia) inode(ib)=inode(ib)+1 enddo imaxel=0 do i=1,ino imaxel=max(imaxel,inode(i)) inode(i)=0 enddo segini jelnum segini kelnum ired=0 do 222 ig=1,ng idx=(nnode+1)*(ig-1) do inno=1,3 locfac(inno)=lect(idx+inno) enddo imin=locfac(1) imoy=locfac(2) lfound=.false. do j=1,imaxel if (jelnum(j,ib).eq.0) then jelnum(j,ib)=imin kelnum(j,ib)=imoy inode(ib)=inode(ib)+1 goto 223 elseif ((jelnum(j,ib).eq.imin).and. $ (kelnum(j,ib).eq.imoy)) then lfound=.true. goto 223 endif enddo 223 continue if (lfound) then ired=ired+1 else if (ired.gt.0) then idxr=(nnode+1)*(ig-ired-1) idx =(nnode+1)*(ig-1) do iloc=1,nnode+1 lect(idxr+iloc)=lect(idx+iloc) enddo endif endif 222 continue *dbg write(ioimp,*) 'nb fac redondants pile faces=',ired * write(ioimp,*) ' nb segments*3=',jg jg=jg-((nnode+1)*ired) segadj mlenti * * Ici, on parcourt les faces des éléments tétraédriques * on met jelnum(j,ib) en négatif si on veut l'éliminer * * write(ioimp,*) 'parcours des faces des éléments tétra' if (jg.gt.0) then ipil=4 * write(ioimp,*) ' ipil=',ipil mlenti=elem(ipil) nnode=nbnne(itypl(ipil)) * write(ioimp,*) ' nnode=',nnode jg=lect(/1) * write(ioimp,*) ' jg=',jg ng=jg/(nnode+1) * write(ioimp,*) ' ng=',ng if (jg.gt.0) then ityp=itypl(ipil) * write(ioimp,*) 'ipil=',ipil,' ityp=',ityp nfac=LTEL(1,ityp) idxdel=LTEL(2,ityp) *dbg write(ioimp,*) 'nfac=',nfac if (nfac.ne.4) then return endif * Parcours des éléments de la pile do ig=1,ng idx=(nnode+1)*(ig-1) * Parcours des faces des éléments do ifac=1,nfac *dbg ityfac=LDEL(1,idxdel+ifac-1) *dbg write(ioimp,*) 'ityfac=',ityfac if (ityfac.ne.1) then return endif *dbg idxfac=LDEL(2,idxdel+ifac-1) iloc1=LFAC(idxfac) iloc2=LFAC(idxfac+1) iloc3=LFAC(idxfac+2) locfac(1)=lect(idx+iloc1) locfac(2)=lect(idx+iloc2) locfac(3)=lect(idx+iloc3) *dbg write(ioimp,*) 'ifac=',ifac,' iloc1=',iloc1, *dbg $ ' iloc2=',iloc2,' iloc3=',iloc3 *dbg write(ioimp,*) ' locfac(1)=',locfac(1) *dbg $ ,' locfac(2)=',locfac(2),' locfac(3)=' *dbg $ ,locfac(3) imin=locfac(1) imoy=locfac(2) if (ib.ne.0) then do j=1,inode(ib) jmin=jelnum(j,ib) jmoy=kelnum(j,ib) jamin=abs(jmin) if (jamin.eq.imin.and.jmoy.eq.imoy) then if (jmin.gt.0) jelnum(j,ib)=-jmin goto 225 endif enddo endif 225 continue enddo enddo endif * * On réduit la pile des faces triangulaires. Le imin est négatif dans * jelnum pour les faces que l'on ne souhaite pas garder * ipil=3 mlenti=elem(ipil) nnode=nbnne(itypl(ipil)) jg=lect(/1) ng=jg/(nnode+1) ired=0 do 226 ig=1,ng idx=(nnode+1)*(ig-1) do inno=1,3 locfac(inno)=lect(idx+inno) enddo imin=locfac(1) imoy=locfac(2) lfound=.false. do j=1,inode(ib) jmin=jelnum(j,ib) jmoy=kelnum(j,ib) jamin=abs(jmin) if (jamin.eq.imin.and.jmoy.eq.imoy) then if (jmin.lt.0) then lfound=.true. endif goto 227 endif enddo 227 continue if (lfound) then ired=ired+1 else if (ired.gt.0) then idxr=(nnode+1)*(ig-ired-1) idx =(nnode+1)*(ig-1) do iloc=1,nnode+1 lect(idxr+iloc)=lect(idx+iloc) enddo endif endif * enddo 226 continue *dbg write(ioimp,*) 'nb fac pile elts volu =',ired jg=jg-((nnode+1)*ired) segadj mlenti endif segsup kelnum segsup jelnum segsup inode segsup icpr ENDIF *dbg write(ioimp,*) '*****************************************' *dbg write(ioimp,*) ' Traitement des triangles redondants 2' *dbg write(ioimp,*) '*****************************************' * Debuggage : ecriture des piles *dbg do ipil=1,ntyel *dbg mlenti=elem(ipil) *dbg nnode=nbnne(itypl(ipil)) *dbg jg=lect(/1) *dbg ng=jg/(nnode+1) *dbg write(ioimp,*) '*** Pile ',ipil,' : ',nnode,' noeuds ',ng, *dbg $ ' elements' *dbg do ig=1,ng *dbg idx=(nnode+1)*(ig-1) *dbg write(ioimp,147) ig,lect(idx+nnode+1), *dbg $ (lect(idx+m),m=1,nnode) *dbg enddo *dbg enddo * * End of subroutine ISOVA6 * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales