isova5
C ISOVA5 SOURCE PV 20/03/24 21:18:24 10554 IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : ISOVA5 C DESCRIPTION : La pile NEWNOD contient généralement des noeuds * géométriquement confondus : on les élimine. * Puis, on incrémente le segment MCOORD avec le nouveaux * noeuds non géométriquement confondus * et on met à jour les piles d'éléments. 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 : 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) * * Pile des nouveaux noeuds SEGMENT NEWNOD INTEGER NNOD INTEGER NOEINF(MAXNOD) INTEGER NOESUP(MAXNOD) REAL*8 COEINF(MAXNOD) ENDSEGMENT * segment newnum(nnod) * SEGMENT ICPR(nbpts) segment inode(ino) segment jelnum(imaxel,ino) segment kelnum(imaxel,ino) segment xelnum(imaxel,ino) * LOGICAL LFOUND * * Executable statements * ********************************************************************** * Traitement des noeuds redondants ********************************************************************** * * Trouver les noeuds redondants dans NEWNOD * * Création d'une numérotation locale segini icpr ino=0 do jnod=1,nnod ia=noesup(jnod) if(icpr(ia).eq.0) then ino=ino+1 icpr(ia)=ino endif enddo * on compte combien de segment touche un noeud segini inode do jnod=1,nnod ia=noesup(jnod) ib=icpr(ia) inode(ib)=inode(ib)+1 enddo imaxel=0 do i=1,ino imaxel=max(imaxel,inode(i)) * inode(i)=0 enddo segsup inode * on crée les noeuds uniques et une nouvelle numérotation * dans newnum(jnod) : si newnum(jnod)=knod>0 le noeud jnod est à garder * et est numéroté knod dans la nouvelle num * si newnum(jnod)=-knod<0 le noeud jnod est à * supprimer, il est remplacé par knod dans la * nouvelle num knod=0 ired=0 segini jelnum segini kelnum segini xelnum segini newnum do jnod=1,nnod ia=noesup(jnod) ib=icpr(ia) lfound=.false. do j=1,imaxel if (jelnum(j,ib).eq.0) then jelnum(j,ib)=noeinf(jnod) xelnum(j,ib)=coeinf(jnod) knod=knod+1 kelnum(j,ib)=knod newnum(jnod)=knod goto 103 elseif (jelnum(j,ib).eq.noeinf(jnod)) then * if (xelnum(j,ib).eq.coeinf(jnod)) then * On met xzprec*10.D0 pour mimer le XTOL mis dans isoval.eso if (abs(xelnum(j,ib)-coeinf(jnod)).le.(xzprec*10.d0)) $ then lfound=.true. newnum(jnod)=-kelnum(j,ib) goto 103 endif endif enddo 103 continue if (lfound) then ired=ired+1 else if (ired.gt.0) then noeinf(jnod-ired)=noeinf(jnod) noesup(jnod-ired)=noesup(jnod) coeinf(jnod-ired)=coeinf(jnod) endif endif enddo segsup jelnum segsup kelnum segsup xelnum if (ired.gt.0) then *dbg write(ioimp,*) 'il y a ired=',ired,' noeuds a eliminer' *dbg2 write(ioimp,*) 'Nouvelle numerotation :' *dbg2 write(ioimp,*) (newnum(i),i=1,newnum(/1)) nnod=nnod-ired maxnod=nnod segadj,newnod * * Passage dans la nouvelle numérotation dans les piles * do ipil=1,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) * esope n'aime pas trop la forme suivante * if (inod.le.0) lect(idx)=-abs(newnum(-inod)) if (inod.le.0) lect(idx)=-abs(newnum(0-inod)) enddo enddo enddo endif segsup newnum * * Création des nouveaux noeuds dans MCOORD et mise à jour * des numéros dans les piles d'éléments * SEGACT MCOORD*MOD IDIM1=IDIM+1 NBANC=nbpts *dbg write(ioimp,*) 'Nombre de nouveaux/anciens noeuds=',NNOD,' ',NBANC NBPTS=NBANC+NNOD SEGADJ,MCOORD DO JNOD=1,NNOD num1=noeinf(jnod) num2=noesup(jnod) x1=coeinf(jnod) x2=1.D0-x1 DO II=1,IDIM+1 XCOOR((NBANC+JNOD-1)*IDIM1+II)= $ (XCOOR((NUM2-1)*IDIM1+II)*X2)+ $ (XCOOR((NUM1-1)*IDIM1+II)*X1) ENDDO ENDDO SEGACT MCOORD SEGSUP NEWNOD * * Mise à jour des noeuds dans les piles (cette étape peut être faite *juste avant la modif de MCOORD, on la garde pour clarté). * do ipil=1,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) if (inod.le.0) lect(idx)=nbanc-inod enddo enddo enddo * * End of subroutine ISOVA5 * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales