noepr2
C NOEPR2 SOURCE PV090527 24/01/18 21:15:01 10699 C**************************************************************************** C**************************************************************************** C*************NOEPERI ..NOEuds PERIpheriques********************************* C**************************************************************************** C**************************************************************************** C NOEPERI part de PIVOT,lui associe l=1, associe l=l+1 a ses voisins directs, C repart des voisins directs pour associer un l a leur voisins.... C LONG=max(l). C NRELONG(I)=l ,NOELON contient les noeuds tels que l=LONG. * noepr2 rend en prime la distance a la frontiere, sa taille et le * desequilibre des domaines * si nbtot n'est pas nul, noepr2 s'arrete des qu'il a trouve la * frontiere (il a remplis nbtot/2) pts. nrelong est alors remis a * zero * Octobre 2014: croissance simultanee de deux zones basees sur les pivots impairs ou pairs * > NODES,IPOS,NBTOT,lfront,lfron,londim,fcout,lpiv,iccon,icouch) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC CCREEL integer iadj(*),jadjc(*) integer pivot(lpiv) INTEGER LONG,DIMLON,Y,X,dimini,diminj integer nrelong(*),noelon(*) integer ipos(*) integer londim(*) INTEGER NODES INTEGER diml1,DIML2,diml3,diml1i,diml2f,diml1f,diml2i LOGICAL bool1,bool2,pretest pretest=.false. MDOMN=-1 do i=1,lpiv if (pivot(i).ne.0) then MDOMN=IPOS(PIVOT(i)+NODES) goto 1 endif enddo 1 continue mode=1 if (nbtot.eq.0) mode=2 if (nbtot.eq.-1) mode=3 nodz=nodes if (nbtot.gt.0) nodz=nbtot DIMLON=0 * write (6,*) ' noepr2 lpiv pivot ',lpiv,(pivot(i),i=1,lpiv) nbz1=0 nbz2=0 * insertion pivot impair zone 1 DIML1=0 do 10 i=1,lpiv,2 ** write (6,*) ' i pivot(i) ',i,pivot(i) if (pivot(i).le.0) goto 10 if (ipos(pivot(i)+nodes).ne.mdomn) goto 10 * if (i.eq.1) write (6,*) 'noepr2 mode i pivot nrelong', * > i,pivot(i),nrelong(pivot(i)) if (nrelong(pivot(i)).ne.0) goto 10 diml1=diml1+1 noelon(diml1)=pivot(i) nrelong(pivot(i))=1 nbz1=nbz1+1 10 continue * insertion pivot pair zone 2 DIML2=nodz+1 do 11 i=2,lpiv,2 if (pivot(i).le.0) goto 11 * write (6,*) 'noepr2 mode i pivot nrelong', * > i,pivot(i),nrelong(pivot(i)) if (ipos(pivot(i)+nodes).ne.mdomn) goto 11 if (nrelong(pivot(i)).ne.0) goto 11 diml2=diml2-1 noelon(diml2)=pivot(i) nrelong(pivot(i))=3 nbz2=nbz2+1 11 continue if (diml1.eq.0.and.diml2.eq.nodz+1) then fcout=xgrand lfront=1 return endif * * croissance des deux zones * icr1=2 icr2=3 bool1=.true. bool2=.true. diml1i=1 diml2f=nodz icouch=0 20 continue ** evaluation frontiere if (bool1.and.(icr1*nbz1.le.icr2*nbz2.or..not.bool2)) then if (pretest) then do 22 i=diml1i,diml1 nz1=0 nz2=0 x=noelon(i) if (nrelong(x).eq.2) goto 22 DO 29 J=IADJ(X),IADJ(X+1)-1 Y=JADJC(J) nrly=nrelong(y) ** if (mdomn.ne.ipos(y+nodes))goto 29 if (nrly.eq.1) nz1=nz1+1 if (nrly.eq.3) nz2=nz2+1 29 continue if (nz2.gt.nz1) then nbz1=nbz1-1 nrelong(x)=2 endif * write (6,*) 'frontiere 1 => 2',nz1,nz2 22 continue endif bool1=.false. diml1f=diml1 * write (6,*) ' diml1i diml1f ',diml1i,diml1f do 30 i=diml1i,diml1f x=noelon(i) if(nrelong(x).eq.2) goto 30 DO 40 J=IADJ(X),IADJ(X+1)-1 Y=JADJC(J) if (mdomn.ne.ipos(y+nodes))goto 40 IF(NRELONG(Y).EQ.0) then * insertion zone 1 diml1=diml1+1 if (.not.bool1) icouch=icouch+1 noelon(diml1)=y nrelong(y)=1 nbz1=nbz1+1 BOOL1=.true. * if (mode.ne.2) write (6,*) ' insertion dans 1 de ',diml1,y goto 40 elseif (NRELONG(Y).eq.1) then * zone 1 * if (mode.ne.2) write (6,*) ' deja en zone 1 ',y goto 40 elseif (nrelong(y).eq.2) then * frontiere * if (mode.ne.2) write (6,*) ' deja en frontiere 1 ',y goto 40 elseif (nrelong(y).eq.3) then * zone 2 <<> frontiere * if (mode.ne.2) write (6,*) ' passage 1 sur frontiere de ',y nrelong(y)=2 nbz2=nbz2-1 pretest=.true. goto 40 endif 40 continue 30 continue diml1i=diml1f+1 endif if (bool2.and.(icr1*nbz2.le.icr2*nbz1.or..not.bool1)) then if (pretest) then do 23 i=diml2f,diml2,-1 nz1=0 nz2=0 x=noelon(i) if (nrelong(x).eq.2) goto 23 DO 28 J=IADJ(X+1)-1,IADJ(X),-1 Y=JADJC(J) nrly=nrelong(y) ** if (mdomn.ne.ipos(y+nodes))goto 28 if (nrly.eq.1) nz1=nz1+1 if (nrly.eq.3) nz2=nz2+1 28 continue if (nz1.gt.nz2) then nbz2=nbz2-1 nrelong(x)=2 endif * write (6,*) 'frontiere 3 => 2',nz1,nz2 23 continue endif bool2=.false. diml2i=diml2 * write (6,*) ' diml2f diml2i ',diml2f,diml2i do 50 i=diml2f,diml2i,-1 x=noelon(i) if (nrelong(x).eq.2) goto 50 DO 60 J=IADJ(X+1)-1,IADJ(X),-1 Y=JADJC(J) if (mdomn.ne.ipos(y+nodes))goto 60 nrly=nrelong(y) IF(NRLY.EQ.0) then * insertion zone 3 diml2=diml2-1 if (.not.bool2) icouch=icouch+1 noelon(diml2)=y nrelong(y)=3 nbz2=nbz2+1 BOOL2=.true. * if (mode.ne.2) write (6,*) ' insertion dans 2 de ',diml2,y goto 60 elseif (NRLY.eq.3) then * zone 3 * if (mode.ne.2) write (6,*) ' deja en zone 2 ',y goto 60 elseif (nrly.eq.2) then * frontiere * if (mode.ne.2) write (6,*) ' deja en frontiere 2 ',y goto 60 elseif (nrly.eq.1) then * zone 1 ==> frontiere * if (mode.ne.2) write (6,*) ' passage 2 sur frontiere de ',y nrelong(y)=2 nbz1=nbz1-1 pretest=.true. goto 60 endif 60 continue 50 continue diml2f=diml2i-1 endif if (bool1.or.bool2) goto 20 nbtotn=diml1+nodz+1-diml2 * dans le cas ou la zone n'est pas connexe on va completer par * la partie non connexe if (mode.ne.2.and.nbtot.gt.nbtotn) then * write (6,*) ' ajout autres composantes connexes ',diml1,diml2, * > nbtotn,nbtot,nodz * si pas trop de noeuds * on commence par examiner le voisinage de la frontiere car c'est moins cher **** if (mode.ne.3) goto 21 diml1i=diml1 do 200 i=1,nbtot x=noelon(i) if (x.eq.0) goto 200 if (nrelong(x).ne.2) goto 200 DO 210 J=IADJ(X),IADJ(X+1)-1 Y=JADJC(J) if (mdomn.ne.ipos(y+nodes))goto 210 IF(NRELONG(Y).EQ.0) then DIML1=DIML1+1 NOELON(DIML1)=Y NRELONG(Y)=1 nbtotn=nbtotn+1 if (nbtot.le.nbtotn) goto 21 endif 210 continue 200 continue if (diml1.eq.diml1i) goto 220 * Si on a rajoute des noeuds, on fait aussi leurs voisinage 230 continue nodi=diml1i+1 diml1i=diml1 nodf=diml1 do 240 i=nodi,nodf x=noelon(i) DO 250 J=IADJ(X),IADJ(X+1)-1 Y=JADJC(J) if (mdomn.ne.ipos(y+nodes))goto 250 IF(NRELONG(Y).EQ.0) then DIML1=DIML1+1 NOELON(DIML1)=Y NRELONG(Y)=1 nbtotn=nbtotn+1 if (nbtot.le.nbtotn) goto 21 endif 250 continue 240 continue if (diml1.ne.diml1i) goto 230 220 continue if (mode.ne.3) goto 21 * write (6,*) ' ajout 2autres composantes connexes ',diml1,diml2, * > nbtotn,nbtot,nodz 21 continue endif * Si on n'a toujours pas notre compte, on balaye tout if ((iccon.eq.1.and.mode.eq.2).or. > (mode.eq.1.and.nbtot.gt.nbtotn)) then do Y=1,NODES IF((NRELONG(Y).EQ.0).AND.(MDOMN.EQ.IPOS(Y+NODES))) THEN DIML1=DIML1+1 NOELON(DIML1)=Y NRELONG(Y)=1 nbtotn=nbtotn+1 if (mode.eq.1.and.nbtot.le.nbtotn) goto 215 ENDIF enddo 215 continue endif nbtot=nbtotn * * remise au carre des deux zones et de la frontiere * nbtot=diml1+nodz+1-diml2 * write (6,*) ' nodes diml1 diml2 ',nodes,diml1,diml2,nbtot * classer a la fin par permutation dans zone 1 la frontiere diml1f=diml1 do 100 i=1,diml1-1 x=noelon(i) if (nrelong(x).eq.2) then do 105 j=diml1f,i+1,-1 y=noelon(j) if (nrelong(y).eq.1) goto 106 105 continue goto 107 106 continue diml1f=j-1 noelon(i)=y noelon(j)=x endif 100 continue 107 continue * classer au debut par permutation dans zone 2 la frontiere diml2i=diml2 do 110 i=nodz,diml2+1,-1 x=noelon(i) if (nrelong(x).eq.2) then do 115 j=diml2i,i-1 y=noelon(j) if (nrelong(y).eq.3) goto 116 115 continue goto 117 116 continue diml2i=j+1 noelon(i)=y noelon(j)=x endif 110 continue 117 continue * suprimer le trou entre les deux if (nodz.ne.nbtot) then do 120 i=diml2,nodz noelon(i-nodz+nbtot)=noelon(i) 120 continue endif * decompte des longueurs n1bz1=0 n1bz2=0 nbfr=0 do 130 i=1,nbtot x=noelon(i) nrlx=nrelong(x) if (nrlx.eq.1) n1bz1=n1bz1+1 if (nrlx.eq.2) nbfr=nbfr+1 if (nrlx.eq.3) n1bz2=n1bz2+1 130 continue ** if (nbfr.ne.nbfra) write (6,*) ' nbfr nbfra ',nbfr,nbfra * write (6,*) 'nbtot n1bz1 nbfr n1bz2',nbtot,n1bz1,nbfr,n1bz2 * * finalisation des infos * londim(1)=n1bz1 londim(2)=n1bz1+nbfr londim(3)=n1bz1+nbfr+n1bz2 dimlon=londim(3) ideseq=abs(n1bz1-n1bz2) xbtot=nbtot xbfr=nbfr xdeseq=ideseq ** fcout=(xbfr )**4 + (xdeseq )**3 fcout= 2*xbtot*xbfr+xbfr*xbfr*xbfr/3.0 + xdeseq**2 > -icouch**3.0 fcout=max(0.d0,fcout) ** write (6,*) 'xbtot',nbtot,'xbfr',nbfr,'xdeseq',ideseq,'fcout', ** > fcout,'icouch',icouch if (nbtot/(xdeseq+1).le.2) > fcout=fcout+xbtot*xbtot*xbtot*xbtot if (nbfr.eq.0.and.lpiv.ne.1.and.pivot(1).ne.0.and. > pivot(2).ne.0) then ** write (6,*) ' frontiere vide ',n1bz1,n1bz2,nbtot,mdomn if (mode.ne.2.and.n1bz1*n1bz2.ne.0) fcout=1 endif * write (6,*) ' noepr2 ',n1bz1,n1bz2,nbfr,nbtot, * > noelon(1),noelon(nbtot),fcout isens=2 if (n1bz1.lt.n1bz2) isens=1 * mise a zero eventuelle de nrelong if (mode.ne.2) then do i=1,dimlon x=noelon(i) if (x.ne.0) nrelong(x)=0 enddo endif lfron = long lfront=2 if (n1bz2.eq.0.or.n1bz1.eq.0) lfront=1 if (mode.eq.1) nbtot=nodz return end
© Cast3M 2003 - Tous droits réservés.
Mentions légales