zoneg2
C ZONEG2 SOURCE CB215821 22/07/20 15:39:47 11411 C==================================================================== C localisation de points dans des elements d une zone elementaire C zonage et construction d un tableau de correspondance C C Entrees : C ip1 pointeur sur le maillage massif C ip2 pointeur sur le maillage poi1 C iexx pointeur sur un segment contenant les points deja vus C ( eviter comptage des point aux frontieres de 2 sous zones) C IFL = 0 noeuds communs a IP1 et IP2 non repertories( accro) C IFL = 1 "" comptabilisés ( proi) C Sorties : C iccoun pointeur sur le segment ICOUNT contenant le tableau de C correspondance voir commentaire pro2 C==================================================================== IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) *- -INC CCREEL -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC SMELEME -INC CCGEOME SEGMENT /STRAV/(NP1(ITE),NP2(ITE),NP3(ITE),NPI(ITE)) dimension xpu(3) PARAMETER (us3=1.D0/3.D0) PARAMETER (Un=1.D0) segment inomil(0) segment wrk4 real*8 xel(3,nbnn),shpp(6,nbnn),qsi(3) endsegment segment wrkl real*8 xell(3,nbnnl),shpl(6,nbnnl) endsegment SEGMENT ICOUNT INTEGER IEINT(2,NODES),IDEJVU(NODES),IACCRO ENDSEGMENT EXTERNAL SHAPE REAL*8 ZDIST ZDIST=0.D0 ip=1 ipo=1 * WRITE(IOIMP,*) ' entree dans zoneg2' itr=0 irate=0 IDIM1 = IDIM + 1 IPT2 = IP2 ipt1=ip1 * on fait le zonage sur les points SEGACT IPT2 Nodes = IPT2.NUM(/2) * WRITE(IOIMP,*) ' nodes ' , nodes numnp=nodes ITE=numnp+3+1 numnp3=ite-1 * write(6,*) ' numnp ite numnp3 ' , numnp , ite , numnp3 NF=100 NMULT=100 segini strav C C Cas 1D : idem qu'en 2D ou 3D mais pour eviter multiplications C -------- des tests (IF) qui alourdissent, on duplique ZONEG2 C pour le 1D en 600 IF (IDIM.EQ.1) GOTO 600 C recherche des min et max C iref = ipt2.NUM(1,1)*idim1-idim XMIN=xcoor(iref) YMIN=xcoor(iref+1) ZMIN=xcoor(iref+2) YMAx=ymin XMAx=xmin ZMAx=zmin DO 201 Iyr = 2,nodes IB=ipt2.NUM(1,Iyr) IA=IB*IDIM1-idim IF(XCOOR(IA).LT.XMIN) XMIn=XCOOR(IA) IF(XCOOR(IA).GT.XMAx) XMAx=XCOOR(IA) IF(XCOOR(IA+1).LT.YMIn) YMIn=XCOOR(IA+1) IF(XCOOR(IA+1).GT.YMAx) YMAx=XCOOR(IA+1) IF( IDIM.EQ.3 ) THEN IF(XCOOR(IA+2).LT.ZMIn) ZMIn=XCOOR(IA+2) IF(XCOOR(IA+2).GT.ZMAx) ZMAx=XCOOR(IA+2) ENDIF 201 CONTINUE if(idim.eq.2) then ZMIN=0.D0 ZMAX=0.D0 ZDIST=1.D0 ZDISTV=1.D0 endif XDIST=XMAx-XMIn YDIST=YMAx-YMIn xdistv=xdist ydistv=ydist IF(XDIST.EQ.0.D0) THEN NDEX=1 XDIST=1.D0 ELSE NDEX=0 ENDIF IF(YDIST.EQ.0.D0) THEN NDEY=1 YDIST=1.D0 ELSE NDEY=0 ENDIF * SMO=1E-5*XDIST*YDIST/NUMNP IF( IDIM.EQ.3 ) then zdist = zmax-zmin zdistv=zdist IF(ZDIST.EQ.0.D0) THEN NDEZ=1 ZDIST=1.D0 * SMO=1E-5*XDIST*YDIST*ZDIST/NUMNP ELSE NDEZ=0 ENDIF endif * write(ioimp,*) 'Maillage POI1' * write(ioimp,*) 'xmin,xmax,ymin,ymax,zmin,zmax=',xmin,xmax,ymin * $ ,ymax,zmin,zmax * write(ioimp,*) 'xdistv,ydistv,zdistv=',xdistv,ydistv,zdistv * write(ioimp,*) 'xdist,ydist,zdist=',xdist,ydist,zdist C C*** recherche sur les elements de la plus petite taille en x y et z C ipt1=ip1 segact ipt1 dminx=1.D10 dminy=1.D10 dminz=1.D10 do 453 isous=1,ipt1.lisous(/1) meleme=ipt1.lisous(isous) segact meleme do 454 iel=1,num(/2) dmix=1.D10 dmax=-1.D10 dmiy=1.D10 dmay=-1.D10 dmiz=1.D10 dmaz=-1.D10 do 455 ip=1,num(/1) ire=num(ip,iel)*idim1-idim if(xcoor(ire).le.dmix) dmix=xcoor(ire) if(xcoor(ire).gt.dmax) dmax=xcoor(ire) if(xcoor(ire+1).le.dmiy) dmiy=xcoor(ire+1) if(xcoor(ire+1).gt.dmay) dmay=xcoor(ire+1) if(xcoor(ire+2).le.dmiz) dmiz=xcoor(ire+2) if(xcoor(ire+2).gt.dmaz) dmaz=xcoor(ire+2) 455 continue if(dminx.gt.(dmax-dmix) ) dminx= dmax-dmix if(dminy.gt.(dmay-dmiy) ) dminy= dmay-dmiy if(dminz.gt.(dmaz-dmiz) ) dminz= dmaz-dmiz 454 continue 453 continue * write(ioimp,*) 'Maillage Massif' * WRITE(IOIMP,*) 'dminx,dminy,dminz=',dminx,dminy,dminz * WRITE(IOIMP,*) ' xdist,ydist,zdist',xdist,ydist,zdist if( dminx.eq.0.D0) then if(xdistv.eq.0.D0) then dminx=1.D0 else dminx = xdistv/1000.D0 endif endif if( dminy.eq.0.D0) then if(ydistv.eq.0.D0) then dminy=1.D0 else dminy = ydistv/1000.D0 endif endif if (idim.eq.3) then if( dminz.eq.0.D0) then if(zdistv.eq.0.D0) then dminz=1.D0 else dminz = zdistv/1000.D0 endif endif endif * * write(ioimp,*) 'Apres correction 1' * WRITE(IOIMP,*) 'dminx,dminy,dminz=',dminx,dminy,dminz dminx = max( dminx , xdist/10000.D0) dminy = max(dminy,ydist/10000.D0) if( idim.eq.3) dminz = max(dminz,zdist/10000.D0) * write(ioimp,*) 'Apres correction 2' * WRITE(IOIMP,*) 'dminx,dminy,dminz=',dminx,dminy,dminz if (ndex.eq.0) ndex=xdist/dminx ndex=max(1,ndex) if (ndey.eq.0) ndey=ydist/dminy ndey=max(1,ndey) if(idim.eq.3) then if (ndez.eq.0) ndez=zdist/dminz ndez=max(1,ndez) else ndez=1 zdist=1.D0 dminz=1.01D0 endif * WRITE(IOIMP,*) ' ndex ndey ndez',ndex,ndey,ndez C CALCUL DU DECOUPAGE EN ZONE NBZONE=NUMNP*NF * if( ndex*ndey*ndez.lt.nbzone) then * WRITE(IOIMP,*) ' ndex ndey ndez nbzone=',ndex,ndey,ndez,nbzone xnprop = real(ndex)*real(ndey)*real(ndez) * dimension effective : là où les découpages sont plus grands que 1 idimf=0 if (ndex.gt.1) idimf=idimf+1 if (ndey.gt.1) idimf=idimf+1 if (ndez.gt.1) idimf=idimf+1 * write(ioimp,*) ' idimf=',idimf * if(idim.eq.3) then * rap = (real(nbzone)/xnprop)**0.333333333D0 * else * rap= (real(nbzone)/xnprop)** 0.5D0 * endif if (idimf.gt.0) then rap = (real(nbzone)/xnprop)**(1.D0/real(idimf)) * write(ioimp,*) ' rap=',rap if(rap.gt.1.D0) rap=1.d0 else rap=1.d0 endif * write(ioimp,*) ' rap=',rap if (ndex.gt.1) then ndec=ndex*rap ndec=max(1,ndec) else ndec=1 endif * if (ndey.gt.1) then mdec=ndey*rap mdec = max(1,mdec) else mdec=1 endif * if(idim.eq.3) then if (ndez.gt.1) then ldec=ndez*rap ldec = max(1,ldec) else ldec=1 endif else ldec=1 endif * nbzone=ndec*mdec*ldec nf= nbzone / numnp3 +1 nmult=nf * write(ioimp,*) 'Apres correction 3' * WRITE(IOIMP,*) ' ndec mdec ldec nbzone=',ndec,mdec,ldec,nbzone * else * RAPY=YDIST/XDIST * NDEC=MAX(INT(SQRT(REAL(NBZONE)/RAPY)),1) * MDEC=NBZONE/NDEC * LDEC=1 * IF(IDIM.EQ.3) THEN * NDEC=max(int((real(nbzone)*xdist*xdist/(ydist*zdist)) * $ **0.3333333D0),1) * MDEC= max(int((real(nbzone)*ydist*ydist/(xdist*zdist)) * $ **0.3333333D0),1) * LDEC=NBZONE/(MDEC*NDEC) * ENDIF NBZONE=NDEC*MDEC*LDEC * endif * WRITE (IOIMP,8933) NDEC,MDEC,ldec,NBZONE,nmult * 8933 FORMAT(' DECOUPAGE EN X ',I6,' EN Y ',I6,' EN Z ',i6, * $ ' SOIT ',I8,' ZONES ') * write(6,*) 'diviseur des zones pour aller aux super zones',nmult * write(6,*) ' nombre max de super zones ', nbzone/nmult+1 XDEC=XDIST/NDEC*1.0000001D0 YDEC=YDIST/MDEC*1.0000001D0 ZDEC=ZDIST/LDEC*1.0000001D0 * WRITE (IOIMP,8935) XMIN,XMAX,YMIN,YMAX,zmin, zmax,XDEC,YDEC,zdec * 8935 FORMAT (' XMIN,XMAX,YMIN,YMAX,XDEC,YDEC ',2(6G12.5)) NMDEC=NDEC*MDEC if(idim.eq.2) THEN DO 2 I=1,NUMNP IB=IPT2.num(1,i) IA=IB*IDIM1-idim IZONE=INT(real((XCOOR(IA)-XMIN)/XDEC))+1+ & INT(real((XCOOR(IA+1)-YMIN)/YDEC))*NDEC IPOINT=IZONE/NMULT+1 * WRITE(IOIMP,*) ' point zone ipoint' ,ib,izone,ipoint np1(ipoint)=np1(ipoint)+1 2 CONTINUE ELSE DO 3 I=1,NUMNP IB=IPT2.num(1,i) IA=IB*IDIM1 -idim IZONE=INT(real((XCOOR(IA)-XMIn)/XDEC))+1+ & INT(real((XCOOR(IA+1)-YMIn)/YDEC))*NDEC + & INT(real((XCOOR(IA+2)-ZMIn)/ZDEC))*NMDEC IPOINT=IZONE/NMULT+1 * WRITE(IOIMP,*) ' point zone ipoint' ,ib,izone,ipoint np1(ipoint)=np1(ipoint)+1 3 CONTINUE endif C np1= NB DE POINTS PAR SUPER-ZONE DE CLASSEMENT DO 4 I=2,ite np1(i)=np1(i-1)+np1(i) 4 CONTINUE * WRITE(IOIMP,*) ' np1 avant descente' * WRITE(IOIMP,*) ( np1( iyou),iyou=1,ite) if(idim.eq.2) then do 35 i=1,numnp ia = ipt2.num(1,i)*idim1-idim IZONE=INT(real((XCOOR(IA)-XMIN)/XDEC))+1+ & INT(real((XCOOR(IA+1)-YMIN)/YDEC))*NDEC IPOINT=IZONE/NMULT+1 J=np1(ipoint) np3(j)=izone np2(j)=i np1(ipoint)=np1(ipoint)-1 35 continue else do 36 i=1,numnp ia = ipt2.num(1,i)*idim1-idim IZONE=INT(real((XCOOR(IA)-XMIN)/XDEC))+1+ & INT(real((XCOOR(IA+1)-YMIN)/YDEC))*NDEC + & INT(real((XCOOR(IA+2)-ZMIn)/ZDEC))*NMDEC IPOINT=IZONE/NMULT+1 J=np1(ipoint) np3(j)=izone np2(j)=i np1(ipoint)=np1(ipoint)-1 36 continue endif C * WRITE(IOIMP,*) ' np1 ite avant permutation' ,ite * WRITE(IOIMP,*) ( np1( iyuo),iyuo=1,ite) * WRITE(IOIMP,*) ' np2 ite avant permutation' ,ite * WRITE(IOIMP,*)( np2( iyuo),iyuo=1,ite) * WRITE(IOIMP,*) ' np3 ite avant permutation' ,ite * WRITE(IOIMP,*)( np3( iyuo),iyuo=1,ite) DO 40 I=1,NUMNP3 JD=NP1(I)+2 JF=NP1(I+1) * write(6,*) ' i jd jf ' ,i,jd,jf IF (JD.LE.JF) THEN 45 IPERM=0 DO 50 J=JD,JF IF(NP3(J-1).GT.NP3(J)) THEN L1=NP2(J-1) NP2(J-1)=NP2(J) NP2(J)=L1 L1=NP3(J-1) NP3(J-1)=NP3(J) NP3(J)=L1 IPERM=1 ENDIF 50 CONTINUE IF (IPERM.EQ.1) GO TO 45 ENDIF 40 CONTINUE * WRITE(IOIMP,*) ' dans zoneg2 apres boucle 40' C C a ce stade np1(i)=j le debut de la super zone i est en j-ieme position C +1 C np2(j)=k le premier point dans la super zone i est le k-ieme C np3(j)=m sa vrai zone est la m-ieme C * * IL NE RESTE PLUS QU'A FAIRE LE TRAVAIL PROPREMENT DIT POUR CHAQUE element * on va boucler sur les points qui sont dans les zones en dessous * * WRITE(IOIMP,*) ' np1 ite apres peerm ',ite * WRITE(IOIMP,*) ( np1( iyuo),iyuo=1,ite) * WRITE(IOIMP,*) ' np2 ite apres peerm ',ite * WRITE(IOIMP,*)( np2( iyuo),iyuo=1,ite) * WRITE(IOIMP,*) ' np3 ite apres peerm ',ite * WRITE(IOIMP,*)( np3( iyuo),iyuo=1,ite) segact ipt1 xpu(3)=0.d0 do 200 isous=1,ipt1.lisous(/1) * WRITE(IOIMP,*) ' boucle 200 isous' , isous meleme = ipt1.lisous(isous) segact meleme KEL =itypel nbnn=num(/1) C kd = kdegre(kel) nso = nbsom(kel) iad=nspos(kel)-1 segini wrk4 segini inomil C element quaf ? si oui kell=numero lineaire correspondant C si non kell=0 IF (IERR.NE.0) RETURN IF (KELL.NE.0) THEN nbnnl=NBNNE(KELL) segini wrkl do i=1,nbnnl inomil(**)=i enddo ELSE if(kd.eq.3) then C element quadratiques do 762 i=1,nbnn do 763 j=1,nso iso = ibsom(iad+j) if(i.eq.iso) goto 762 763 continue inomil(**)= i 762 continue elseif(kd.eq.2) then C elements lineaires do i=1,nbnn inomil(**)=i enddo endif ENDIF itest=1 do 101 iel=1,num(/2) * cas quaf if (kell.ne.0) then nsom=nbsom(kel) if(nsom.ne.nbnnl) then return endif idx=nspos(kel)-1 do innl=1,nbnnl do iid=1,idim xell(iid,innl)=xel(iid,ibsom(idx+innl)) enddo enddo endif iref = num(1,iel)*idim1 - idim xmi=xcoor(iref) ymi=xcoor(iref+1) zmi=xcoor(iref+2) xma=xmi yma=ymi zma=zmi do 102 ipo=2,num(/1) iref=num(ipo,iel)*idim1-idim if(xcoor(iref).lt.xmi) xmi = xcoor(iref) if(xcoor(iref).gt.xma) xma = xcoor(iref) if(xcoor(iref+1).lt.ymi) ymi = xcoor(iref+1) if(xcoor(iref+1).gt.yma) yma = xcoor(iref+1) if(xcoor(iref+2).lt.zmi) zmi = xcoor(iref+2) if(xcoor(iref+2).gt.zma) zma = xcoor(iref+2) 102 continue * if(iel.lt.2.and.isous.eq.1) then * WRITE(IOIMP,*) ' element ',iel * WRITE(IOIMP,*) ( num(iuo,iel),iuo=1,num(/1)) * WRITE(IOIMP,*) ' xmi ymi zmi xma yma zma' * WRITE(IOIMP,*) ' boite reelle' * WRITE(IOIMP,*) xmi,ymi,zmi,xma,yma,zma * endif xdec1=(xma-xmi)/3.D0 ydec1=(yma-ymi)/3.D0 zdec1=(zma-zmi)/3.D0 xmi=xmi-xdec1 xma=xma+xdec1 ymi=ymi-ydec1 yma=yma+ydec1 zmi=zmi-zdec1 zma=zma+zdec1 if(xmi.lt.xmin) xmi=xmin if(xmi.gt.xmax) xmi=xmax if(xma.lt.xmin) xma=xmin if(xma.gt.xmax) xma=xmax if(ymi.lt.ymin) ymi=ymin if(ymi.gt.ymax) ymi=ymax if(yma.lt.ymin) yma=ymin if(yma.gt.ymax) yma=ymax if(zmi.lt.zmin) zmi=zmin if(zmi.gt.zmax) zmi=zmax if(zma.lt.zmin) zma=zmin if(zma.gt.zmax) zma=zmax * if(iel.lt.2.and.isous.eq.1) then * * WRITE(IOIMP,*) ' boite apres modif' * WRITE(IOIMP,*) xmi,ymi,zmi,xma,yma,zma * endif * WRITE(IOIMP,*) ' xmi xma ymi yma zmi zma',xmi,xma,ymi,yma,zmi,zma * if(idim.eq.2) then * zmi=0.d0 * zma=0.d0 * endif C C C recherche des points interne à l'element C pour cela on balaye les super zones C if(idim.eq.2) then IXDEP=INT(real((Xmi-XMIN)/XDEC))+1+ & INT(real((ymi-YMIN)/YDEC))*NDEC ixpas=INT(real((Xma-XMIN)/XDEC))+1+ & INT(real((ymi-YMIN)/YDEC))*NDEC - ixdep iny=INT(real((yma-YMIn)/YDEC))-INT(real((ymi-YMIn) $ /YDEC))+1 do 120 ily=1,iny ile=ixdep +( ily -1 )* ndec ilf=ile + ixpas izv= ile/nf+1 * if (izv.gt.ite) WRITE(IOIMP,*) ' prob ',izv,ixpas,ixdep, * > ndec,mdec,xdec,ydec,ymi,ymin jd=np1(izv)+1 do 122 j=jd,numnp3 izd=np3(j) if(izd.lt.ile) go to 122 if(izd.gt.ilf) go to 122 ipo= np2(j) C recherche si le point est interne if(idejvu(ipo).eq.1) go to 122 ip=ipt2.num(1,ipo) iref=ip*idim1-idim xpu(1)=xcoor(iref) xpu(2)=xcoor(iref+1) if(xpu(1).lt.xmi.or.xpu(1).gt.xma) go to 122 if(xpu(2).lt.ymi.or.xpu(2).gt.yma) go to 122 * cas quaf if (kell.ne.0) then $ SHPL,qsi,iret) $ SHPP,qsi,iret) else endif IF (IRET.NE.0) then irate=irate+1 GOTO 122 endif IF (KELL.NE.0) THEN CALL SHAPE(qsi(1),qsi(2),qsi(3),kell,shpl $ ,iret2) if (iret2.eq.0) then MOTERR(1:4)=NOMS(KELL) RETURN endif ENDIF * WRITE(IOIMP,fmt='(8E12.5)')(shpp(1,ih),ih=1,nbnn) do i=1,inomil(/1) ilp= inomil(i) if (kell.ne.0) then if( shpl(1,ilp).lt.0.D0) goto 110 else if( shpp(1,ilp).lt.0.D0) goto 110 endif enddo C goto 100 110 xmap=1.D10 do i=1,inomil(/1) ilp=inomil(i) if (kell.ne.0) then xmap = min ( xmap,shpl(1,ilp)) else xmap = min ( xmap,shpp(1,ilp)) endif enddo do 180 jl =1,NUM(/1) if(IP.NE.NUM(jl,iel)) go to 180 if(IFL.EQ.0) go to 190 idejvu(ipo)=1 itr=itr+1 go to 181 180 continue 181 continue ieint(1,ipo)=isous ieint(2,ipo)=iel QQQ(1,ipo) = qsi(1) QQQ(2,ipo) = qsi(2) endif 190 continue go to 122 100 CONTINUE C on a trouve l element contenant le point ipo attention C si le point appartient aux deux maillages on ne le stocke pas C pour accro mais on le stocke pour proi do 18 jl =1,NUM(/1) if((IP.EQ.NUM(jl,iel)).AND.(IFL.EQ.0)) GOTO $ 19 18 continue if(idejvu(ipo).EQ.0) then idejvu(ipo) = 1 itr = itr + 1 IEINT(1,ipo) = isous IEINT(2,ipo) = iel QQQ(1,ipo) = qsi(1) QQQ(2,ipo) = qsi(2) * WRITE(IOIMP,*) 'trouve point' ,IP, 'Element' ,J * WRITE(IOIMP,2375)ip,j,(xpu(i1),i1=1,idim),(qsi(i2),i2=1,idim) endif 19 continue * 2375 format(2i4,6e12.5) 122 continue 120 continue endif if(idim.eq.3) then IXDEP=INT(real((Xmi-XMIN)/XDEC))+1+ & INT(real((ymi-YMIN)/YDEC))*NDEC + & INT(real((zmi-zmin)/ZDEC))*NMDEC ixpas=INT(real((Xma-XMIN)/XDEC))+1+ & INT(real((ymi-YMIN)/YDEC))*NDEC + & INT(real((zmi-zmin)/ZDEC))*NMDEC - ixdep iny=INT(real((yma-YMIn)/YDEC))-INT(real((ymi-YMIn) $ /YDEC))+1 inz= INT(real((zma-zmin)/ZDEC))-INT(real((zmi-zmin) $ /ZDEC))+1 * if(iel.lt.2.and.isous.eq.1) WRITE(IOIMP,*) ' inz iny',inz,iny do 240 itz=1,inz idexx= ixdep + (itz-1)*nmdec do 220 ily=1,iny ile=idexx +( ily -1 )* ndec ilf=ile + ixpas * if(iel.lt.2.and.isous.eq.1)WRITE(IOIMP,*)' ile,ilf' , ile,ilf izv= ile/nf + 1 jd=np1(izv)+1 * if(iel.lt.2.and.isous.eq.1) WRITE(IOIMP,*) ' jd,jf ',jd,jf do 222 j=jd,numnp3 izd=np3(j) * WRITE(IOIMP,*) ' izd ', izd if(izd.lt.ile) go to 222 if(izd.gt.ilf) go to 223 ipo= np2(j) C recherche si le point est interne if(idejvu(ipo).eq.1) go to 222 ip=ipt2.num(1,ipo) * if(iel.lt.2.and.isous.eq.1)WRITE(IOIMP,*) ' ipo ip ',ipo,ip iref=ip*idim1-idim xpu(1)=xcoor(iref) xpu(2)=xcoor(iref+1) xpu(3)=xcoor(iref+2) * if(iel.lt.2.and.isous.eq.1) WRITE(IOIMP,*) 'cooor ' * $ ,xpu(1),xpu(2),xpu(3) if(xpu(1).lt.xmi.or.xpu(1).gt.xma) go to 222 if(xpu(2).lt.ymi.or.xpu(2).gt.yma) go to 222 if(xpu(3).lt.zmi.or.xpu(3).gt.zma) go to 222 $ ,iret) IF (IRET.NE.0) THEN irate=irate+1 if(irate.eq.itest) then * WRITE(IOIMP,*) 'solution pas trouvee', irate itest=itest *2 endif GOTO 222 endif IF (KELL.NE.0) THEN CALL SHAPE(qsi(1),qsi(2),qsi(3),kell,shpl $ ,iret2) ENDIF C * WRITE(IOIMP,fmt='(8E12.5)')(shpp(1,ih),ih=1,nbnn) do i=1,inomil(/1) ilp= inomil(i) if (kell.ne.0) then if( shpl(1,ilp).lt.0.D0) goto 210 else if( shpp(1,ilp).lt.0.D0) goto 210 endif enddo C goto 300 210 xmap=1.D10 do i=1,inomil(/1) ilp=inomil(i) if (kell.ne.0) then xmap = min ( xmap,shpl(1,ilp)) else xmap = min ( xmap,shpp(1,ilp)) endif enddo do 280 jl =1,NUM(/1) if(IP.NE.NUM(jl,iel)) go to 280 if(IFL.EQ.0) go to 290 idejvu(ipo)=1 itr=itr+1 * if(iel.lt.3.and.isous.eq.1) WRITE(IOIMP,*)'egalite de point' C C C go to 281 280 continue 281 continue ieint(1,ipo)=isous ieint(2,ipo)=iel QQQ(1,ipo) = qsi(1) QQQ(2,ipo) = qsi(2) QQQ(3,ipo) = qsi(3) endif 290 continue go to 222 300 CONTINUE C on a trouve l element contenant le point ipo attention C si le point appartient aux deux maillages on ne le stocke pas C pour accro mais on le stocke pour proi do 28 jl =1,NUM(/1) if((IP.EQ.NUM(jl,iel)).AND.(IFL.EQ.0)) $ GOTO 29 28 continue if(idejvu(ipo).EQ.0) then idejvu(ipo) = 1 * if(iel.lt.3.and.isous.eq.1) WRITE(IOIMP,*)'point interne' itr = itr + 1 IEINT(1,ipo) = isous IEINT(2,ipo) = iel QQQ(1,ipo) = qsi(1) QQQ(2,ipo) = qsi(2) QQQ(3,ipo) = qsi(3) * if(iel.lt.3.and.isous.eq.1) then * WRITE(IOIMP,*) 'trouve point' ,IP, 'Element' ,iel * WRITE(IOIMP,2375)ip,iel,(xpu(i1),i1=1,idim),(qsi(i2),i2=1,idim C ) * endif endif 29 continue 222 continue 223 continue 220 continue 240 continue endif 101 continue segsup inomil,wrk4 IF (KELL.NE.0) THEN SEGSUP wrkl ENDIF segdes meleme 200 continue segdes ipt1 GOTO 800 C========================== C= CAS 1D - DIMENSION 1 = C========================== 600 CONTINUE C Recherche des min et max XMIN=XGRAND XMAX=-XGRAND DO i=1,nodes j=IPT2.NUM(1,i)*IDIM1-IDIM xx=XCOOR(j) XMIN=MIN(xx,XMIN) XMAX=MAX(xx,XMAX) ENDDO XDIST=XMAX-XMIN xdistv=XDIST IF (XDIST.EQ.0.D0) XDIST=1.D0 C Recherche sur les elements de la plus petite taille en x SEGACT,ipt1 nbsous=ipt1.lisous(/1) dminx=XGRAND DO isous=1,nbsous meleme=ipt1.lisous(isous) SEGACT,meleme nbnn=num(/1) DO iel=1,num(/2) dmix=XGRAND dmax=-XGRAND DO i=1,nbnn j=num(i,iel)*IDIM1-IDIM xx=XCOOR(j) dmix=MIN(dmix,xx) dmax=MAX(dmax,xx) ENDDO xx=dmax-dmix dminx=MIN(dminx,xx) ENDDO ENDDO C- WRITE(IOIMP,*) 'dminx',dminx,' xdist',xdist IF (dminx.EQ.0.D0) THEN IF (xdistv.EQ.0.D0) THEN dminx=1.D0 ELSE dminx=xdistv/1000.D0 ENDIF ENDIF dminx=MAX(dminx,xdist/10000.D0) ndex=xdist/dminx ndex=MAX(1,ndex) C- WRITE(IOIMP,*) ' ndex=',ndex C Calcul du decoupage en zones nbzone=NUMNP*NF rap=REAL(nbzone)/ndex rap=MIN(Un,rap) ndec=ndex*rap ndec = max(1,ndec) nbzone=ndec XDEC=xdist/ndec*1.0000001D0 nf=(nbzone/numnp3)+1 nmult=nf C- WRITE(IOIMP,601) ndec,nbzone C- 601 FORMAT(' DECOUPAGE EN X ',I6,' SOIT ',I8,' ZONES ') C- WRITE(IOIMP,602) XMIN,XMAX,XDEC C- 602 FORMAT(' XMIN,XMAX,XDEC ',3G12.5) DO i=1,numnp j=IPT2.num(1,i)*IDIM1-IDIM izone=INT((XCOOR(j)-XMIN)/XDEC)+1 ipoint=izone/nmult+1 np1(ipoint)=np1(ipoint)+1 C- WRITE(IOIMP,*) 'point,izone,ipoint =',i,j,izone,ipoint ENDDO C np1 = nb de points par super-zone de classement DO i=2,NUMNP3 np1(i)=np1(i)+np1(i-1) ENDDO C- WRITE(IOIMP,*) ' np1 avant descente' C- WRITE(IOIMP,*) (np1(i),i=1,ite) DO i=1,numnp j=IPT2.num(1,i)*IDIM1-IDIM izone=INT((XCOOR(j)-XMIN)/XDEC)+1 ipoint=izone/nmult+1 j=np1(ipoint) np3(j)=izone np2(j)=i np1(ipoint)=j-1 ENDDO C- WRITE(IOIMP,*) ' np1 ite avant permutation' ,ite C- WRITE(IOIMP,*) (np1(i),i=1,ite) C- WRITE(IOIMP,*) (np2(i),i=1,ite) C- WRITE(IOIMP,*) (np3(i),i=1,ite) DO i=1,NUMNP jD=np1(i)+2 jF=np1(i+1) IF (jD.LE.jF) THEN 610 IPERM=0 DO j=jD,jF k=j-1 IF (np3(k).GT.np3(j)) THEN L1=np2(k) np2(k)=np2(j) np2(j)=L1 L1=np3(k) np3(k)=np3(j) np3(j)=L1 IPERM=1 ENDIF ENDDO IF (IPERM.EQ.1) GOTO 610 ENDIF ENDDO C- WRITE(IOIMP,*) ' dans zoneg2 apres permutation' C- WRITE(IOIMP,*) ' np1 ite apres perm ',ite C- WRITE(IOIMP,*) (np1(i),i=1,ite) C- WRITE(IOIMP,*) (np2(i),i=1,ite) C- WRITE(IOIMP,*) (np3(i),i=1,ite) C A ce stade : C - np1(i)=j le debut de la super-zone i est en j-eme position + 1 C - np2(j)=k le premier point dans la super zone i est le k-eme C - np3(j)=m sa vrai zone est la m-eme C Il ne reste plus qu'a faire le travail pour chaque element. C On va boucler sur les points qui sont dans les zones en dessous. xpu(2)=0.D0 xpu(3)=0.D0 C SEGACT,ipt1 DO isous=1,nbsous C- WRITE(IOIMP,*) ' boucle isous=',isous meleme=ipt1.lisous(isous) C SEGACT,meleme nbnn=num(/1) SEGINI,wrk4 SEGINI,inomil kel=ITYPEL kd=KDEGRE(kel) C Elements quadratiques IF (kd.EQ.3) then jd=NSPOS(kel) jf=jd+NBSOM(kel)-1 DO i=1,nbnn DO j=jd,jf IF (i.EQ.ibsom(j)) GOTO 620 ENDDO inomil(**)=i 620 CONTINUE ENDDO C Elements lineaires ELSE IF (kd.EQ.2) THEN DO i=1,nbnn inomil(**)=i ENDDO ENDIF DO iel=1,num(/2) j=num(1,iel)*IDIM1-IDIM xmi=XCOOR(j) xma=xmi DO i=2,nbnn j=num(i,iel)*IDIM1-IDIM xx=XCOOR(j) xmi=MIN(xmi,xx) xma=MAX(xma,xx) ENDDO C- IF (iel.EQ.1.AND.isous.EQ.1) THEN C- WRITE(IOIMP,*) ' element ',iel C- WRITE(IOIMP,*) (num(i,iel),i=1,nbnn) C- WRITE(IOIMP,*) ' boite reelle : xmi xma ',xmi,xma C- ENDIF xdec1=us3*(xma-xmi) xmi=xmi-xdec1 xma=xma+xdec1 xmi=MAX(xmi,xmin) xmi=MIN(xmax,xmi) xma=MAX(xma,xmin) xma=MIN(xma,xmax) C- IF (iel.EQ.1.AND.isous.EQ.1) THEN C- WRITE(IOIMP,*) ' element ',iel C- WRITE(IOIMP,*) ' boite apres modif : xmi xma ',xmi,xma C- ENDIF C- WRITE(IOIMP,*) ' xmi xma :',xmi,xma C Recherche des points internes a l'element par balayage des super zones ixdep=INT((xmi-xmin)/xdec)+1 ixpas=INT((xma-xmin)/xdec)+1 ile=ixdep ilf=ile+ixpas izv=ile/nf+1 C- IF (izv.GT.ite) WRITE(IOIMP,*) ' prob ',izv,ixpas,ixdep,ndec,xdec jd=np1(izv)+1 DO 630 j=jd,numnp3 izd=np3(j) IF (izd.LT.ile.OR.izd.GT.ilf) GOTO 630 C Recherche si le point est interne ipo=np2(j) IF (idejvu(ipo).EQ.1) GOTO 630 ip=ipt2.num(1,ipo) xpu(1)=XCOOR(ip*IDIM1-IDIM) IF (xpu(1).LT.xmi.OR.xpu(1).GT.xma) GOTO 630 C- WRITE(IOIMP,FMT='(8E12.5)') (shpp(1,i),i=1,nbnn) IF (IRET.NE.0) then irate=irate+1 GOTO 630 ENDIF do i=1,inomil(/1) ilp= inomil(i) if( shpp(1,ilp).lt.0.D0) goto 1110 enddo C goto 1100 1110 xmap=1.D10 do i=1,inomil(/1) ilp=inomil(i) xmap = min ( xmap,shpp(1,ilp)) enddo do 1180 jl =1,NUM(/1) if(IP.NE.NUM(jl,iel)) go to 1180 if(IFL.EQ.0) go to 1190 idejvu(ipo)=1 itr=itr+1 go to 1181 1180 continue 1181 continue ieint(1,ipo)=isous ieint(2,ipo)=iel QQQ(1,ipo) = qsi(1) endif 1190 continue go to 630 1100 CONTINUE C on a trouve l element contenant le point ipo attention C si le point appartient aux deux maillages on ne le stocke pas C pour accro mais on le stocke pour proi DO i=1,nbnn IF ((ip.EQ.NUM(i,iel)).AND.(IFL.EQ.0)) GOTO 630 ENDDO IF (idejvu(ipo).EQ.0) THEN idejvu(ipo)=1 itr=itr+1 IEINT(1,ipo)=isous IEINT(2,ipo)=iel QQQ(1,ipo)=qsi(1) C WRITE(IOIMP,*) 'Trouve point de numero global ',IP C WRITE(IOIMP,*) 'dans le ',iel,'eme élément ', C $ 'de la ',isous,'eme sous-zone' C WRITE(IOIMP,*) 'Coordonnée globale = ',xpu(1) C WRITE(IOIMP,*) 'Coordonnée locale = ',qsi(1) CC- WRITE(IOIMP,*) 'Trouve point' ,IP, 'Element' ,J CC- WRITE(IOIMP,603) ip,j,xpu(1),qsi(1) C 603 FORMAT(2I4,2E12.5) ENDIF 630 CONTINUE ENDDO SEGSUP,inomil,wrk4 SEGDES,meleme ENDDO SEGDES IPT1 800 CONTINUE IACCRO=IACCRO+itr C- WRITE(IOIMP,*) ' nb points non converges dans qsijs ',irate SEGDES,IPT2 SEGSUP STRAV RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales