mucpr1
C MUCPR1 SOURCE JK148537 24/11/05 21:15:08 12067 IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) * multiplication rapide d'une matrice par un champoint dans le cas * ou on connait deja la structure du chanpoint resultant, qui a par * exemple ete obtenu par un appel precedent a mucpri * * entree : mrigid, mchpo1 * sortie : mchpoi * -INC CCREEL -INC PPARAM -INC CCOPTIO -INC SMCHPOI -INC SMELEME -INC SMCOORD -INC SMRIGID segment itrav1 * liste des inconnues primales dans le champ etendu character*(LOCOMP) nocop(nctop) integer ifop(nctop) endsegment segment itrav2 * liste des inconnues duales dans le champ etendu character*(LOCOMP) nocod(nctod) integer ifod(nctod),ifodh(nctod),ifodp(nctod) endsegment segment itrav3 * champ primal etendu ** real*8 xvalp(nctop,ncpr ) real*8 xvalp(ncpr,nctop ) endsegment segment itrav4 * champ dual etendu ** real*8 xvald(nctod,ncpr ) real*8 xvald(ncpr,nctod) endsegment segment itrav5 * position inconnues primales et duales de la raideur dans les champs etendus integer icposp(nbpma),icposd(nbdma) * buffers primal et dual real*8 xbuffp(nbpma),xbuffd(nbdma) character*(LOCOMP) charm endsegment segment icpr(nbpts) character*4 cnoha integer*4 inoha equivalence(cnoha,inoha) data cnoha/'NOHA'/ * * creation du champ resultat * * traitement ctrlC if(ierr.ne.0) return segini icpr ncpr=0 segact mrigid nrigel=irigel(/2) mchpo2=imgeo2 segact mchpo2 if (mchpo2.ifopoi.ne.iforig) then interr(1)=mchpo2.ifopoi interr(2)=iforig interr(3)=IFOUR c-dbg write(ioimp,*) '1132 mucpr1',mchpo2,mrigid endif segini,mchpoi=mchpo2 nbz=ipchp(/1) do 1 isous=1,nbz msoup2=ipchp(isous) segini,msoupo=msoup2 ipchp(isous)=msoupo meleme=igeoc segact meleme nelt=num(/2) * nnoe=num(/1) do im=1,nelt * do in=1,nnoe * ip=num(in,im) ip=num(1,im) if (icpr(ip).eq.0) then ncpr=ncpr+1 icpr(ip)=ncpr endif * enddo enddo n=nelt nc=noharm(/1) segini mpoval ipoval=mpoval 1 continue * * constitution de la liste des composantes du chant primal * nctop=0 segact mchpo1 if (mchpo1.ifopoi.ne.iforig) then interr(1)=mchpo1.ifopoi interr(2)=iforig interr(3)=ifour c-dbg write(ioimp,*) '1132 mucpr1 (2)',mchpo1,mrigid endif do 10 isoupo=1,mchpo1.ipchp(/1) msoup1=mchpo1.ipchp(isoupo) segact msoup1 mpova1=msoup1.ipoval segact mpova1 ipt1=msoup1.igeoc segact ipt1 do im=1,ipt1.num(/2) * do in=1,ipt1.num(/1) * ip=ipt1.num(in,im) ip=ipt1.num(1,im) if (icpr(ip).eq.0) then ncpr=ncpr+1 icpr(ip)=ncpr endif * enddo enddo nctop=nctop+msoup1.nocomp(/2) 10 continue segini itrav1 nctop=0 do 11 isous=1,mchpo1.ipchp(/1) msoup1=mchpo1.ipchp(isous) do 12 i=1,msoup1.nocomp(/2) do 13 j=1,nctop if (ifop(j).ne.msoup1.noharm(i)) goto 13 if (nocop(j).eq.msoup1.nocomp(i)) goto 12 13 continue nctop=nctop+1 nocop(nctop)=msoup1.nocomp(i) ifop(nctop)=msoup1.noharm(i) c write(6,*) 'la',nctop,nocop(nctop),ifop(nctop),i,isous 12 continue 11 continue * write (6,*) ' mucpr1 nbpts,ncpr,nctop ', * > nbpts,ncpr,nctop * * constitution de la liste des composantes du champ dual * nctod=0 do 15 isoupo=1,ipchp(/1) msoupo=ipchp(isoupo) mpoval=ipoval segact mpoval*mod nctod=nctod+nocomp(/2) 15 continue * write (6,*) ' dans mucpr1 nctod-1 ',nctod,ipchp(/1) segini itrav2 nctod=0 do 16 isous=1,ipchp(/1) msoupo=ipchp(isous) do 17 i=1,nocomp(/2) do 18 j=1,nctod if (ifod(j).ne.noharm(i)) goto 18 if (nocod(j).eq.nocomp(i)) goto 17 18 continue nctod=nctod+1 nocod(nctod)=nocomp(i) ifod(nctod)=noharm(i) 17 continue 16 continue * write (6,*) ' dans mucpr1 nctod-2 ',nctod * * expansion du champ primal * segini itrav3,itrav4 do 20 isous=1,mchpo1.ipchp(/1) msoup1=mchpo1.ipchp(isous) mpova1=msoup1.ipoval ipt1=msoup1.igeoc do 22 i=1,msoup1.nocomp(/2) do 23 j=1,nctop if (ifop(j).ne.msoup1.noharm(i)) goto 23 if (nocop(j).eq.msoup1.nocomp(i)) goto 24 23 continue c write(6,*) 'mucpr1 - 1' 24 continue do 25 iel=1,mpova1.vpocha(/1) ** xvalp(j,icpr(ipt1.num(1,iel)))=mpova1.vpocha(iel,i) xvalp(icpr(ipt1.num(1,iel)),j)=mpova1.vpocha(iel,i) 25 continue 22 continue 20 continue * * creation de itrav5 * nbpma=0 nbdma=0 do 27 irige=1,nrigel descr=irigel(3,irige) segact descr nbpma=max(nbpma,lisinc(/2)) nbdma=max(nbdma,lisdua(/2)) 27 continue segini itrav5 if (nbdma.eq.0) goto 51 * * travail effectif : boucle sur la matrice. * do 50 irige=1,nrigel write (charm,fmt='(a4)') irigel(5,irige) cjk write (charm,fmt='(a4)') 'NOHA' descr=irigel(3,irige) segact descr * remplissage de icposp et icposd jsauv=0 do 30 i=1,lisinc(/2) do 35 j=1,nctop cjk if (ifop(j).ne.irigel(5,irige).and.charm.ne.'NOHA') goto 35 if (ifop(j).ne.irigel(5,irige)) goto 35 if (lisinc(i).eq.nocop(j)) goto 37 35 continue * inconnu du chp primal pas dans la raideur * write(6,*) 'inconnu du chp primal pas dans la raideur' j=0 37 continue icposp(i)=j if (jsauv*j.ne.0) then if (ifop(jsauv).ne.ifop(j)) then endif endif if (j.ne.0) jsauv=j 30 continue do 40 i=1,lisdua(/2) do 45 j=1,nctod if (ifod(j).ne.irigel(5,irige).and.charm.ne.'NOHA') goto 45 if (lisdua(i).eq.nocod(j)) goto 47 45 continue icposd(i)=0 goto 40 * write (6,*) ' dans mucpr1 ',lisdua(/2),nctod * write (6,*) irigel(5,irige),i,(lisdua(j),j=1,lisdua(/2)) * write (6,*) (nocod(j),ifod(j),j=1,nctod) * write(6,*) 'mucpr1 - 3' 47 continue if (charm.eq.'NOHA'.and.jsauv.ne.0) then ifodh(j)=ifop(jsauv)+2**17 endif icposd(i)=j 40 continue * transfert des valeurs dans le buffer primal ipt2=irigel(1,irige) segact ipt2 * write (6,*) ' ipt2 ',ipt2.num(/1),ipt2.num(/2) xmatri=irigel(4,irige) isyme=irigel(7,irige) if (ipt2.itypel.eq.22) then segact xmatri*mod else segact xmatri endif nod=noeled(/1) nop=noelep(/1) * if (nod.ne.nop) isyme=2 do 55 iel=1,ipt2.num(/2) ibfp=0 do 60 ip=1,nop if (icposp(ip).eq.0.or.icpr(ipt2.num(noelep(ip),iel)).eq.0) > then xbuffp(ip)=0.d0 else * write (6,*) ' icposp icposd ',icposp(ip),icposd(ip) * write (6,*) ' ip xbuffp ',ip,xbuffp(ip) * write (6,*) ' icposp noelep ',icposp(ip),noelep(ip) * write (6,*) ' irige coerig ',irige,coerig(irige) * write (6,*) ' ipt2 ',ipt2.num(noelep(ip),iel) * write (6,*) ' icpr ',icpr(ipt2.num(noelep(ip),iel)) * write (6,*) ' xvalp ',xvalp(icposp(ip), * > icpr(ipt2.num(noelep(ip),iel))) ** xbuffp(ip)=xvalp(icposp(ip),icpr(ipt2.num(noelep(ip),iel)))* xbuffp(ip)=xvalp(icpr(ipt2.num(noelep(ip),iel)),icposp(ip))* > coerig(irige) if (abs(xbuffp(ip)).gt.xpetit) ibfp=ibfp+1 endif 60 continue * operation * on impose l'egalite des multiplicateurs de Lagrange dans mucpr2 if (nop*nod.ne.0.and.ibfp.ne.0) then $ xbuffd,isyme) * transfert du buffer dual dans le vecteur dual etendu do 65 id=1,nod i1d=icposd(id) if (i1d.eq.0) then * write (6,*) ' i1d nul ' goto 65 endif i2d=icpr(ipt2.num(noeled(id),iel)) if (i2d.eq.0) goto 65 ** xvald(i1d,i2d)=xvald(i1d,i2d)+xbuffd(id) xvald(i2d,i1d)=xvald(i2d,i1d)+xbuffd(id) 65 continue ** else ** do id=1,nod ** xbuffd(id)=0.D0 ** enddo endif 55 continue * if (xmatri.ne.0) segdes xmatri segdes descr,xmatri 50 continue 51 continue * * transfert final dans le vecteur dual * isous=0 do 80 isouso=1,ipchp(/1) isous=isous+1 msoupo=ipchp(isouso) mpoval=ipoval meleme=igeoc segact meleme do 82 i=1,nocomp(/2) do 83 j=1,nctod if (ifod(j).ne.noharm(i).and.ifodh(j).ne.noharm(i)) goto 83 if (nocod(j).eq.nocomp(i)) goto 84 83 continue ifodp(i)=0 goto 82 * write(6,*) 'mucpr1 - 4' 84 continue if (ifodh(j).ne.0) noharm(i)=ifodh(j)-2**17 * write (charm,fmt='(a4)') noharm(i) if (charm.eq.'NOHA') noharm(i)=nifour ifodp(i)=j 82 continue ieln=0 ipt1=0 do 85 iel=1,vpocha(/1) ieln=ieln+1 if (ieln.ne.iel) num(1,ieln)=num(1,iel) ig=0 do 86 i=1,vpocha(/2) if (ifodp(i).eq.0) then * write (6,*) ' ifodp nul ' goto 86 endif ** xv=xvald(ifodp(i),icpr(num(1,iel))) xv=xvald(icpr(num(1,iel)),ifodp(i)) vpocha(ieln,i)=xv * if (abs(xv).gt.1e-35) ig=1 if (abs(xv).gt.xpetit) ig=1 86 continue if (ig.eq.0) then * il y a lieu de simplifier if (ipt1.eq.0) then segini,ipt1=meleme meleme=ipt1 endif ieln=ieln-1 endif 85 continue if (ieln.ne.vpocha(/1)) then nbnn =1 nbelem=ieln nbref =0 nbsous=0 segadj,meleme n=ieln nc=vpocha(/2) * write (6,*) ' chpoin simplifie ',vpocha(/1),ieln segadj mpoval endif igeoc=meleme segact,mpoval*nomod,meleme*nomod,msoupo*nomod if (ieln.eq.0) then isous=isous-1 segsup mpoval,msoupo else ipchp(isous)=ipchp(isouso) * write(6,*) 'isous ipchp ',isous,ipchp(isous),ipchp(/1) endif 80 continue *OLD mchpoi.ifopoi = mchpo1.ifopoi if (isous.ne.ipchp(/1)) then nat=jattri(/1) nsoupo=isous segadj mchpoi endif mchpoi.ifopoi = mrigid.iforig segact,mchpoi*nomod segdes,mrigid segsup itrav1,itrav2,itrav3,itrav4,itrav5,icpr end
© Cast3M 2003 - Tous droits réservés.
Mentions légales