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