relasi
C RELASI SOURCE PV 19/02/27 21:15:06 10128 * simplification des relations * on elimine dans les relations les noeuds dont toutes les contributions sont < crit * * implicit real*8 (a-h,o-z) logical travail -INC PPARAM -INC CCOPTIO -INC SMRIGID -INC SMELEME * segment de travail pour le regroupement des relations * garde indique en quel position du nouveau re on va * eleg indique la nouvelle position dans l'element d'un noeud garde segment trav integer garde(nligrd) integer eleg(nbnn) endsegment character*4 inco1,inco2 if (iimpi.eq.7) write(6,*) 'entree dans relasi' travail=.false. segact mrigid nrigel=0 nrige1=0 * ri1 va contenir les relations simplifiees * ri2 va contenir celles que l'on garde segini ri1 segini,ri2=mrigid nbst=0 do 200 ir=1,irigel(/2) ** write (6,*) ' boucle 200 ',ir meleme=irigel(1,ir) descr=irigel(3,ir) xmatri=irigel(4,ir) segact meleme,descr segact xmatri*mod if (itypel.ne.22) then goto 200 endif ** fait au vol si besoin ipt2=meleme ** segini,ipt2=meleme nligrp=re(/1) nligrd=re(/2) nelrig=re(/3) xmatr2=xmatri ** segini,xmatr2 ri2.irigel(1,ir)=ipt2 ri2.irigel(4,ir)=xmatr2 nbnn=num(/1) nbref=0 nbsous=0 nbsimp=0 nbann=0 nbnn=num(/1) segini trav do 100 iel=1,re(/3) * test deja traite if (ipt2.num(1,iel).eq.0) goto 100 iok=1 remax=0.d0 * au cas ou la relation soit normalisee a autre chose que 1: do iv=2,re(/1) remax=max(remax,abs(re(iv,1,iel))) enddo * test (et correction) qu'une inconnue apparait plusieurs fois dans la relation do iv1=1,nligrd ip1=num(noeled(iv1),iel) inco1=lisdua(iv1) do iv2=iv1+1,nligrd ip2=num(noeled(iv2),iel) inco2=lisdua(iv2) if (ip1.eq.ip2.and.inco1.eq.inco2) then re(1,iv1,iel)=re(1,iv1,iel)+re(1,iv2,iel) re(1,iv2,iel)=0.d0 re(iv1,1,iel)=re(iv1,1,iel)+re(iv2,1,iel) re(iv2,1,iel)=0.d0 endif enddo enddo * y a t il des simplifications dans cette relation? do iv=2,re(/1) if (abs(re(iv,1,iel)).gt.critl) iok=iok+1 enddo if (iok.ne.re(/2)) then * il y a des termes a eliminer. on cree donc un nouveau paquet nligrp=iok nligrd=iok nelrig=re(/3) segini des1 segini xmatr1 nrige1=nrige1+1 if (nrige1.gt.nrigel) then nrigel=nrige1+10000 segadj ri1 endif ri1.coerig(nrige1)=coerig(ir) ri1.irigel(2,nrige1)=irigel(2,ir) ri1.irigel(3,nrige1)=des1 ri1.irigel(4,nrige1)=xmatr1 do i=5,irigel(/1) ri1.irigel(i,nrige1)=irigel(i,ir) enddo * on recopie le lx ivc=1 des1.lisinc(1)=lisinc(1) des1.lisdua(1)=lisdua(1) des1.noelep(1)=noelep(1) des1.noeled(1)=noeled(1) * recopie des valeurs en notant ou elles vont do iv=2,re(/1) if (abs(re(iv,1,iel)).gt.critl) then ivc=ivc+1 garde(iv)=ivc xmatr1.re(1,ivc,1)=re(iv,1,iel) xmatr1.re(ivc,1,1)=re(iv,1,iel) des1.lisinc(ivc)=lisinc(iv) des1.lisdua(ivc)=lisdua(iv) des1.noelep(ivc)=noelep(iv) des1.noeled(ivc)=noeled(iv) else garde(iv)=0 endif enddo * recreer le maillage support nbnn=num(/1) nbelem=re(/3) nbsous=0 nbref=0 segini ipt1 ipt1.itypel=22 ipt1.num(1,1)=num(1,iel) do in=2,nbnn ipt1.num(in,1)=-num(in,iel) enddo do ivc=2,des1.noelep(/1) ip=des1.noelep(ivc) ipt1.num(ip,1)=abs(ipt1.num(ip,1)) enddo * dans ipt1 en negatif les noeud a supprimer inc=0 * dans eleg la nouvelle position des noeuds do in=1,ipt1.num(/1) if (ipt1.num(in,1).gt.0) then inc = inc+1 eleg(in)=inc ipt1.num(inc,1)=ipt1.num(in,1) do ivc=1,des1.noelep(/1) if (des1.noelep(ivc).eq.in) then des1.noelep(ivc)=inc des1.noeled(ivc)=inc endif enddo else eleg(in)=0 endif enddo nbnn=inc segadj ipt1 * maillage reconstitue et descr mis a jour ri1.irigel(1,nrige1)=ipt1 * comme la relation a ete transferee dans un nouveau paquet on l'annule * on cree ipt2 et xmatr2 si ce n'a pas deja ete fait if (ipt2.eq.meleme) then segini,ipt2=meleme ri2.irigel(1,ir)=ipt2 endif ipt2.num(1,iel)=0 travail=.true. * maintenant, recherche des relations ayant les memes simplifications ** write (6,*) 'simplification',iel kel=1 do 110 jel=iel+1,re(/3) remax=0.d0 * au cas ou la relation soit normalisee a autre chose que 1: do iv=2,re(/1) remax=max(remax,abs(re(iv,1,jel))) enddo * deja traite? if (ipt2.num(1,jel).eq.0) goto 110 do iv=2,re(/1) * meme simplification? if (abs(re(iv,1,jel)).gt.critl.and.garde(iv).eq.0)goto 110 if (abs(re(iv,1,jel)).le.critl.and.garde(iv).ne.0)goto 110 enddo ** write (6,*) 'meme simplification',jel * a rajouter dans xmatr1.re kel=kel+1 do iv=2,re(/1) if (garde(iv).ne.0) then ivc=garde(iv) xmatr1.re(1,ivc,kel)=re(iv,1,jel) xmatr1.re(ivc,1,kel)=re(iv,1,jel) endif enddo do in=1,num(/1) if (eleg(in).ne.0) then ipt1.num(eleg(in),kel)=num(in,jel) endif enddo * annuler l'element ipt2.num(1,jel)=0 110 continue nelrig=kel segadj xmatr1 nbelem=kel segadj ipt1 nbsimp=nbsimp+kel endif 100 continue segsup trav * fin du do iel * maintenant, on retasse ri2.irigel(ir) if (ipt2.ne.meleme) then nligrp=re(/1) nligrd=re(/2) nelrig=re(/3)-nbsimp segini,xmatr2 ri2.irigel(4,ir)=xmatr2 nbelem=0 nbnn=ipt2.num(/1) nbsous=0 nbref=0 do iel=1,ipt2.num(/2) if (ipt2.num(1,iel).ne.0) then nbelem=nbelem+1 do in=1,ipt2.num(/1) ipt2.num(in,nbelem)=num(in,iel) enddo do ip=1,xmatr2.re(/2) do id=1,xmatr2.re(/1) xmatr2.re(id,ip,nbelem)=re(id,ip,iel) enddo enddo endif enddo segadj ipt2 endif nbst = nbst + nbsimp * write(6,*) ' regroupement de relation ',nbsimp 200 continue * plus qu'a tout assembler dans le resultat. * au passage on elimine les matrices vides * mais avant, si on n'a rien eu a faire, on sort la matrice initiale qui est toujours dans mrigid if (.not.travail) return nrige2=ri2.irigel(/2) if (iimpi.eq.7) write(6,*) ' nombre de relations simplifiees ', > nbst ** write(6,*) ' simplifications retenues annulees ',nrige1,nbann nrigel=nrige1+nrige2 segadj ri2 nrigel=0 do ir=1,nrige2 meleme=ri2.irigel(1,ir) segact meleme if (num(/2).ne.0) then nrigel=nrigel+1 do is=1,ri2.irigel(/1) ri2.irigel(is,nrigel)=ri2.irigel(is,ir) enddo ri2.coerig(nrigel)=ri2.coerig(ir) endif enddo do ir=1,nrige1 meleme=ri1.irigel(1,ir) segact meleme if (num(/2).ne.0) then nrigel=nrigel+1 do is=1,ri2.irigel(/1) ri2.irigel(is,nrigel)=ri1.irigel(is,ir) enddo ri2.coerig(nrigel)=ri1.coerig(ir) endif enddo segsup ri1 segadj ri2 mrigid = ri2 return end
© Cast3M 2003 - Tous droits réservés.
Mentions légales