separm
C SEPARM SOURCE MB234859 24/10/30 21:15:05 12060 C---------------------------------------------------------------------- C Distinguer dans le MRIGID les rigidites elementaires pouvant etre C eliminees et celles devant etre conservees. C Les rigidites elementaires a eliminer, i.e. pouvant etre traitee C comme des dependances, sont regroupees dans RI1 C Les rigidites elementaires a conserver sont regroupees dans RI2 C C juillet 2003 passage aux simples multiplicateurs de Lagrange, mais C separm dualise ceux qu'il garde C---------------------------------------------------------------------- IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) integer oooval C -INC SMRIGID -INC SMCOORD -INC SMELEME -INC PPARAM -INC CCOPTIO -INC CCREEL *-INC CCHAMP C segment trav1 character*(lochpo) compp(lcomp1) endsegment segment trav2 integer ielim(nbnoc,nbincp),iautr(nbnoc,nbincp) integer icomb(nbnoc,nbincp),ideja(nbnoc,nbincp) endsegment C Remplir posinc pour accelerer les tests sur les composantes segment trav3 integer posinc(nligrp) endsegment segment trav4 integer itrv1(nbprl) integer itrv2(nbprl) real*8 dtrv1(nbprl) real*8 dtrv2(nbprl) endsegment segment trav5 integer idata(2,nligrp) endsegment segment icpr(nbpts) segment itemp(ntemp) character*(lochpo) co1 integer ri1p,ri1s,ri1f,ri2f C ** write(6,*) ' entree de separm ' ** call ooodmp(0) ** nbav=oooval(2,1) * write (6,*) ' dans separm nouinl ',nounil CC write (6,*) ' matrice mrigid' CC call prrigi(mrigid,0) CC segact,mrigid nbdep=0 nbpiv=0 nbpvt=0 iunil=0 C ----------------------------------------------------------------- C Distinguer ce qui peut etre elimine (ri4) et le reste (ri3) C ----------------------------------------------------------------- nbno=nbpts segini icpr nbnoc=0 segact mrigid nbrig=irigel(/2) ntemp=nbrig segini,itemp nrige3=0 do 760 irig=1,nbrig if (irigel(6,irig).ne.0) iunil=1 meleme=irigel(1,irig) segact meleme if ((itypel.ne.22.and.itypel.ne.28).or. & (irigel(7,irig).ne.0)) then itemp(irig)=1 nrige3=nrige3+1 endif ** write(6,*) '1 itypel dans separm',itypel do il=1,num(/2) do ip=1,num(/1) ipt=num(ip,il) if (icpr(ipt).eq.0) then nbnoc=nbnoc+1 icpr(ipt)=nbnoc endif enddo enddo 760 continue C nrigel=nrige3 segini,ri3 ri3.iforig=iforig ri3.mtymat=mtymat nrige4=nbrig-nrige3 nrigel=nrige4 segini,ri4 ri4.iforig=iforig ri4.mtymat=mtymat i3=0 i4=0 do 555 jj=1,nbrig if (itemp(jj).eq.1) then i3=i3+1 ii=i3 ri5=ri3 else i4=i4+1 ii=i4 ri5=ri4 endif ri5.coerig(ii)=coerig(jj) do kk=1,8 ri5.irigel(kk,ii)=irigel(kk,jj) enddo 555 continue segsup,itemp C ----------------------------------------------------------------- C Recuperer les noms de composantes (segment trav1) C ----------------------------------------------------------------- lcomp1 = 50 segini trav1 nbincp=0 do 10 irig=1,nrige4 descr=ri4.irigel(3,irig) segact descr do 40 nligrp=2,lisinc(/2) C print *,'lisinc(',nligrp,'/',lisinc(/2),')=',lisinc(nligrp) do 50 inc=1,nbincp if (compp(inc).eq.lisinc(nligrp)) goto 40 50 continue nbincp=nbincp+1 if (nbincp.GT.lcomp1) then lcomp1 = lcomp1 + 50 segadj trav1 endif compp(nbincp)=lisinc(nligrp) 40 continue 10 continue C ----------------------------------------------------------------- C Quelles inconnues peuvent etre eliminees? C ----------------------------------------------------------------- C Interdit d'eliminer les inconnues apparaissant dans des conditions C unilaterales lorsque nounil = 0. Si nelim = 0, tout garder segini,trav2 do 60 irig=1,nrige4 meleme=ri4.irigel(1,irig) if (nelim.ne.0) then if(itypel.ne.28) then if (ri4.irigel(6,irig).eq.0.or.nounil.eq.1) goto 60 endif endif C C Super-elements : si trop gros ce n'est pas avantageux C d'eliminer. Dans ce cas, idnetifier ses noeuds et ddl pour ne C pas les eliminer. if (itypel.ne.22.and. > (itypel.ne.28.or.num(/1).lt.255.or.if.lt.3)) goto 60 C descr=ri4.irigel(3,irig) nld=2 if(itypel.eq.28) nld=1 C do 70 nligrp=nld,lisinc(/2) do 80 inc=1,nbincp C print *,'lisinc(',nligrp,'/',lisinc(/2),')=',lisinc(nligrp) C & ,' compp(',inc,')=',compp(inc) if (compp(inc).eq.lisinc(nligrp)) goto 90 80 continue *** write(ioimp,*) '- ',lisinc(nligrp),' non trouve dans trav1' goto 70 90 continue C C La composante lisinc(nligrp) ne doit pas etre eliminee pour C les noeuds num(ip,j) ip=noelep(nligrp) do 100 j=1,num(/2) C IF(num(ip,j).GT.ielim(/1).OR.inc.GT.ielim(/2).OR. C * num(ip,j).GT.iautr(/1).OR.inc.GT.iautr(/2))THEN C print *,'BUG DANS SEPARM : ', C & num(ip,j),'>',ielim(/1),iautr(/1), C & inc,'>',ielim(/2),iautr(/2) C ENDIF ielim(icpr(num(ip,j)),inc)=1 iautr(icpr(num(ip,j)),inc)=1 100 continue 70 continue 60 continue C ----------------------------------------------------------------- C Nombre de conditions associees a chaque ddl de chaque noeud C ----------------------------------------------------------------- do 700 irig=1,nrige4 if (ri4.irigel(6,irig).ne.0.and.nounil.eq.0) goto 700 meleme=ri4.irigel(1,irig) if (itypel.ne.22) goto 700 descr=ri4.irigel(3,irig) C nligrp=lisinc(/2) segini trav3 do 730 inc=2,nligrp do 720 incp=1,nbincp if (lisinc(inc).eq.compp(incp)) then posinc(inc)=incp goto 730 endif 720 continue 730 continue C do 750 ince=2,lisinc(/2) incp=posinc(ince) do 740 j=1,num(/2) ip=num(noelep(ince),j) icomb(icpr(ip),incp)=icomb(icpr(ip),incp)+1 740 continue 750 continue segsup trav3 700 continue ipass=1 C C ----------------------------------------------------------------- 2000 CONTINUE nrigel=0 segini,ri1 ri1.iforig=iforig ri1.mtymat=mtymat segini,ri2=ri4 C C Trier pour attaquer en premier les relations portant sur le moins C d'inconnues nbprl=ri4.irigel(/2) segini trav4 do 765 irig=1,nbprl descr=ri4.irigel(3,irig) dtrv1(irig)= lisinc(/2)+(irig/(nbprl+1.)) if(irigel(6,irig).ne.0) dtrv1(irig)=dtrv1(irig)+1000000 if(irigel(6,irig).eq.2) dtrv1(irig)=dtrv1(irig)+1000000 ** if(irigel(6,irig).eq.0) dtrv1(irig)=dtrv1(irig)+1000000 ** itrv1(irig)=nbprl-irig+1 itrv1(irig)= irig 765 continue C do 200 iri=1,nbprl irig=itrv1(iri) ** irig=iri ** if (ipass.eq.1) irig=itrv1(iri) if (ri4.irigel(6,irig).ne.0.and.nounil.eq.0) goto 190 meleme=ri4.irigel(1,irig) if (itypel.ne.22) goto 190 Xmatri=ri4.irigel(4,irig) segact Xmatri if (abs(re(1,1,1)).gt.1d-30) goto 190 descr=ri4.irigel(3,irig) C nligrp=lisinc(/2) segini,trav3,trav5 do 230 inc=2,nligrp do 220 incp=1,nbincp if (lisinc(inc).eq.compp(incp)) then posinc(inc)=incp goto 230 endif 220 continue 230 continue C segini,ipt8=meleme nbdepe=0 do 210 j=1,num(/2) C C Cette matrice elementaire contient elle des inconnues if (noelep(/1).le.1) then ipt8.num(1,j)=0 goto 210 endif C C La matrice est elle augmentee if (abs(re(1,1,j)).gt.1d-5) then ipt8.num(1,j)=0 goto 210 endif C C Cette matrice elementaire contient-elle une inco. eliminee remax=abs(re(1,1,j)) do 240 inc=2,nligrp incpp=posinc(inc) ipp=ipt8.num(noelep(inc),j) if (ielim(icpr(ipp),incpp).eq.1) then ipt8.num(1,j)=0 goto 210 endif remax=max(remax,abs(re(1,inc,j))) 240 continue C C Choix du pivot incf=0 remaz=remax*0.9 do 250 inc=2,nligrp incpp=posinc(inc) ipp=ipt8.num(noelep(inc),j) if (iautr(icpr(ipp),incpp).eq.1) goto 250 if (abs(re(1,inc,j)).lt.remaz) goto 250 * if (icomb(icpr(ipp),incpp).eq.1) then incf=inc goto 260 * endif 250 continue 260 continue ince=incf if (incf.eq.0) ince=2 C C Traitement de l'inconnue incp du noeud ip incp=posinc(ince) ip=ipt8.num(noelep(ince),j) C C Le pivot est il correct remax=remax*1d-2 if (abs(re(1,ince,j)).le.remax) then ipt8.num(1,j)=0 nbpiv=nbpiv+1 goto 210 endif C C Cette inconnue apparait-elle dans d'autres CL if (ipass.eq.1.and.icomb(icpr(ip),incp).ne.1) then ipt8.num(1,j)=0 goto 210 endif C C Cette inconnue apparait-elle dans une dependance if (iautr(icpr(ip),incp).eq.1) then ipt8.num(1,j)=0 goto 210 endif C C Cette inconnue apparait-elle deux fois dans la relation ideux=0 do inc=2,nligrp if (ideja(icpr(ipt8.num(noelep(inc),j)),posinc(inc)).eq.1) then ideux=inc else ideja(icpr(ipt8.num(noelep(inc),j)),posinc(inc))=1 endif enddo do inc=2,nligrp ideja(icpr(ipt8.num(noelep(inc),j)),posinc(inc))=0 enddo if (ideux.ne.0) then moterr(1:4)=lisinc(ideux) interr(1)=ipt8.num(noelep(ideux),j) ipt8.num(1,j)=0 goto 210 endif C C Nouvelle dependance nbdepe=nbdepe+1 nbdep=nbdep+1 C write (6,*) 'Elimination noeud,inco,posi',ip,lisinc(ince),ince C Reperer l'inconnue eliminee et le noeud ipt8.num(1,j)=ince idata(1,ince)=idata(1,ince)+1 ielim(icpr(ip),incp)=1 do 280 inc=2,nligrp iautr(icpr(ipt8.num(noelep(inc),j)),posinc(inc))=1 280 continue C 210 continue segsup trav3 C C Creation de ri1 et ri2 pour scinder la sous-matrice irig C --------------------------------------------------------------- C Dimensions communes a RI1 et RI2 nbnn=num(/1) nbsous=0 nbref=0 nligrd=re(/1) nligrp=re(/2) C C Creation de RI2 : rigidites elementaires a conserver nbelem=num(/2)-nbdepe if (nbelem.gt.0) then segini,ipt2 ipt2.itypel=itypel nelrig=nbelem segini,xmatr2 xmatr2.symre=symre ri2.irigel(1,irig)=ipt2 ri2.irigel(3,irig)=descr ri2.irigel(4,irig)=xmatr2 do iii=5,8 ri2.irigel(iii,irig)=ri4.irigel(iii,irig) ENDDO ri2.coerig(irig)=ri4.coerig(irig) else ri2.irigel(1,irig)=0 xmatr2=0 endif C C Creation de RI1 : rigidites elementaires a eliminer. C L'inconnue a eliminer doit etre en 2eme position (apres LX) C Si l'inconnue a eliminer n'est pas celle apparaissant en C deuxieme position il faut pivoter la rigidite elementaire C et le descripteur associe ri1p=ri1 nrigel=0 do kkk=1,nligrp if (idata(1,kkk).gt.0) nrigel=nrigel+1 enddo nbpvt=nbpvt+nrigel segini,ri1 ri1.iforig=iforig ri1.mtymat=mtymat icpt=0 do 25 jjj=1,nligrp nelrig=idata(1,jjj) C Nombre d'elements elimines en choisissant la jjjeme inconnue if (nelrig.eq.0) goto 25 nbelem=nelrig segini,ipt1 ipt1.itypel=itypel segini,xmatr1 xmatr1.symre=symre des1=descr if (jjj.ne.2) then segini,des1=descr co1=des1.lisinc(2) des1.lisinc(2)=des1.lisinc(jjj) des1.lisinc(jjj)=co1 co1=des1.lisdua(2) des1.lisdua(2)=des1.lisdua(jjj) des1.lisdua(jjj)=co1 noe=des1.noelep(2) des1.noelep(2)=des1.noelep(jjj) des1.noelep(jjj)=noe noe=des1.noeled(2) des1.noeled(2)=des1.noeled(jjj) des1.noeled(jjj)=noe endif C icpt=icpt+1 ri1.irigel(1,icpt)=ipt1 ri1.irigel(3,icpt)=des1 ri1.irigel(4,icpt)=xmatr1 do iii=5,7 ri1.irigel(iii,icpt)=ri4.irigel(iii,irig) enddo ri1.irigel(8,icpt)=1 ri1.coerig(icpt)=ri4.coerig(irig) C C Compteur des elements et identifiant de la rigidite elem idata(1,jjj)=1 idata(2,jjj)=icpt 25 continue C C Remplir ri1 et ri2 en creant les xmatri/descr/maillages C --------------------------------------------------------------- idec=0 do 300 j=1,num(/2) if (ipt8.num(1,j).eq.0) then idec=idec+1 do 310 i=1,num(/1) ipt2.num(i,idec)=num(i,j) 310 continue do io=1,nligrp do iu=1,nligrd xmatr2.re(iu,io,idec)=re(iu,io,j) enddo enddo else ince=ipt8.num(1,j) iriel=idata(2,ince) ipt1=ri1.irigel(1,iriel) xmatr1=ri1.irigel(4,iriel) ielt=idata(1,ince) idata(1,ince)=idata(1,ince)+1 do 320 i=1,num(/1) ipt1.num(i,ielt)=num(i,j) 320 continue do io=1,nligrp do iu=1,nligrd xmatr1.re(iu,io,ielt)=re(iu,io,j) enddo enddo C C Pivoter les lignes/colonnes ince et 2 if (ince.ne.2) then do 1130 il=1,nligrd ret=xmatr1.re(il,2,ielt) xmatr1.re(il,2,ielt)=xmatr1.re(il,ince,ielt) xmatr1.re(il,ince,ielt)=ret 1130 continue do 1160 il=1,nligrp ret=xmatr1.re(2,il,ielt) xmatr1.re(2,il,ielt)=xmatr1.re(ince,il,ielt) xmatr1.re(ince,il,ielt)=ret 1160 continue endif C endif 300 continue C --------------------------------------------------------------- C ri1=ri1f if (xmatr2.ne.0) segdes,xmatr2 segsup,trav5 goto 200 C 190 continue C C Sous-matrice irig a conserver integralement ri2.irigel(1,irig)=ri4.irigel(1,irig) ri2.irigel(3,irig)=ri4.irigel(3,irig) ri2.irigel(4,irig)=ri4.irigel(4,irig) do iii=5,7 ri2.irigel(iii,irig)=ri4.irigel(iii,irig) enddo ri2.irigel(8,irig)=0 ri2.coerig(irig)=ri4.coerig(irig) C 200 continue C ----------------------------------------------------------------- segsup trav4 C C Compression de ri2 idec=0 do 600 irig=1,nbprl meleme=ri2.irigel(1,irig) if (meleme.eq.0) then idec=idec+1 else do 610 ir=1,8 ri2.irigel(ir,irig-idec)=ri2.irigel(ir,irig) 610 continue ri2.coerig(irig-idec)=ri2.coerig(irig) endif 600 continue nrigel=nbprl-idec C write (6,*) ' dimension de ri2 ',nrigel segadj,ri2 C C On va voir si on ne peut pas faire pivoter ri2 if (ipass.eq.2) goto 2001 ri1s=ri1 ri4=ri2 nbpiv=0 ipass=ipass+1 goto 2000 C 2001 CONTINUE C ----------------------------------------------------------------- C C RI1 : rigidites elementaires a eliminer ri1=ri1f C RI2 : rigidites elementaires a conserver ri2=ri2f C segsup trav1,trav2,icpr C if (iimpi.ne.0) then write (6,*) ' nombre de relations eliminees',nbdep write (6,*) ' nombre de relations gardees a cause du pivot',nbpiv write (6,*) ' nombre de relations gardees car non independantes', > nbinc write (6,*) ' nombre de paquets pivotes',nbpvt endif C C ----------------------------------------------------------------- C Dualisation des multiplicateurs de Lagrange C ----------------------------------------------------------------- C si on a des conditions unilaterales, on ne dualise pas, ce sera fait C dans le resou de unilater if ((iunil.eq.0.or.nounil.eq.1).and.lagdua.ge.0) then endif C * write(6,*) ' dans separm lagdua ',lagdua CC write (6,*) ' matrice ri1 ' CC call prrigi(ri1,0) CC write (6,*) ' matrice ri2 ' CC call prrigi(ri2,0) CC segact,ri1,ri2 CC write(6,*) ' sortie de separm ' ** call ooodmp(0) ** nbap=oooval(2,1) ** write(6,*) 'nb segmts dans separm avant apres ',nbav,nbap END
© Cast3M 2003 - Tous droits réservés.
Mentions légales