C XTY1 SOURCE CHAT 05/01/13 04:15:43 5004 subroutine xty1(mchpot,ich2,mlmotx,mlmoty,xret) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC CCOPTIO -INC SMCHPOI -INC SMLMOTS -INC SMELEME -INC SMCOORD segment itrav * izon : num de zone dans 2 chp d'un point * ipos : num de pt dans zone d'un point * integer izon(nbpts),ipos(nbpts) * * nbop : nb de terme dans produit 1-zonei 2-zonej * integer nbop(nbz1,nbz2) * * icpos1 icpos2 : num composante zone a traiter * integer icpos1(nbopma,nbz1,nbz2),icpos2(nbopma,nbz1,nbz2) * endsegment * xret=0.d0 * * creation de itrav * nbpts=xcoor(/1)/(idim+1) mlmot1=mlmotx segact mlmot1 nbopma=mlmot1.mots(/2) mlmot2=mlmoty segact mlmot2 if (nbopma.ne.mlmot2.mots(/2)) call erreur(217) if (ierr.ne.0) return mchpo1=mchpot segact mchpo1 nbz1=mchpo1.ipchp(/1) mchpo2=ich2 segact mchpo2 nbz2=mchpo2.ipchp(/1) segini itrav * * remplissage de itrav a partir du deuxieme champ * do 10 isoupo=1,nbz2 msoup2=mchpo2.ipchp(isoupo) segact msoup2 mpova2=msoup2.ipoval segact mpova2 ipt2=msoup2.igeoc segact ipt2 do 15 iel=1,ipt2.num(/2) ip=ipt2.num(1,iel) izon(ip)=isoupo ipos(ip)=iel 15 continue 10 continue * * travail effectif : boucle su r le premier chpoint * on fabriquera au vol les nbop icpos1 et icpos2 si necessaire * do 20 isoupo=1,nbz1 msoup1=mchpo1.ipchp(isoupo) segact msoup1 mpova1=msoup1.ipoval segact mpova1 ipt1=msoup1.igeoc segact ipt1 ieldin=1 100 continue do 110 ieldeb=ieldin,ipt1.num(/2) izocou=izon(ipt1.num(1,ieldeb)) if(izocou.ne.0) goto 115 110 continue goto 20 115 continue msoup2=mchpo2.ipchp(izocou) if (nbop(isoupo,izocou).eq.0) then do 30 im=1,nbopma do 35 ic1=1,msoup1.nocomp(/2) if (mlmot1.mots(im).eq.msoup1.nocomp(ic1)) goto 40 35 continue goto 30 40 continue do 45 ic2=1,msoup2.nocomp(/2) if (msoup1.noharm(ic1).ne.msoup2.noharm(ic2)) goto 45 if (mlmot2.mots(im).eq.msoup2.nocomp(ic2)) goto 50 45 continue goto 30 50 continue nbo=nbop(isoupo,izocou)+1 nbop(isoupo,izocou)=nbo icpos1(nbo,isoupo,izocou)=ic1 icpos2(nbo,isoupo,izocou)=ic2 30 continue 31 continue if (nbo.eq.0) nbop(isoupo,izocou)=-1 endif do 60 ielcou=ieldeb+1,ipt1.num(/2) ipt=ipt1.num(1,ielcou) izon2=izon(ipt) if (izon2.ne.izocou) goto 70 60 continue ielcou=ipt1.num(/2)+1 70 continue mpova2=msoup2.ipoval do 80 ic=1,nbop(isoupo,izocou) ic1=icpos1(ic,isoupo,izocou) ic2=icpos2(ic,isoupo,izocou) do 90 iel=ieldeb,ielcou-1 xret=xret+mpova1.vpocha(iel,ic1)* > mpova2.vpocha(ipos(ipt1.num(1,iel)),ic2) 90 continue 80 continue ieldin=ielcou if (ieldin.le.ipt1.num(/2)) goto 100 segdes msoup1,mpova1,ipt1 20 continue * c'est fini on nettoie segsup itrav if (mchpo1.ne.mchpo2) then do 150 isoupo=1,nbz2 msoup2=mchpo2.ipchp(isoupo) mpova2=msoup2.ipoval segdes mpova2 ipt2=msoup2.igeoc segdes ipt2 segdes msoup2 150 continue endif segdes mchpo1,mchpo2,mlmot1,mlmot2 return end