⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 delaunay.f

📁 关于网格自动生成delaunay算法的
💻 F
📖 第 1 页 / 共 4 页
字号:
            ien(ir,jr2) = iv3
            jee(ir,jr1) = ia
            jee(ir,jr2) = il
            if(ia.ne.0) then
               call edge(ia,il,jee,lte,iedge)
               jee(ia,iedge) = ir
            endif
            if(ib.ne.0) then
               call edge(ib,ir,jee,lte,iedge)
               jee(ib,iedge) = il
            endif
            itop = itop+1
            jstack(itop) = ipush(il,maxstk,itop)
            go to 10
         endif
 20   continue
      go to 10
      endif
      return
      end
*
**********************************************************************
*   locate triangle which encloses point (xp,yp)
**********************************************************************  
      subroutine locate(xp,yp,x,mtj,jac,nelm,
     &     kte,ktj,itri)
      implicit real*8(a-h,o-z)  
      dimension x(2,ktj+3),mtj(kte,3),jac(0:kte,3)
      itri = nelm
 10   continue
      do i = 1,3
         ia = mtj(itri,i)
         ib = mtj(itri,mod(i,3)+1)
         if((x(2,ia)-yp)*(x(1,ib)-xp).gt.
     &        (x(1,ia)-xp)*(x(2,ib)-yp)) then
            itri = jac(itri,i)
            go to 10
         endif
      enddo
      return
      end
*
**********************************************************************
*    pick up points on boundary of given polygon
**********************************************************************  
      subroutine pick(iq,ip,iv,kv,mtj,jac,map,npa,npb,nsra,
     &     nsrb,kte,ltj)
      implicit real*8(a-h,o-z)      
      dimension kv(kte),mtj(kte,3),jac(0:kte,3),map(kte)
      dimension nsra(ltj),nsrb(ltj)
      npa = 1
      nsra(npa) = ip
      ivx = ivert(kv(1),ip,mtj,kte)
      npa = npa+1
      nsra(npa) = mtj(kv(1),mod(ivx,3)+1)
      do i = 2,iv-1
         jvx = ivert(kv(i),nsra(npa),mtj,kte)
         jelm = jac(kv(i),jvx)
         if(jelm.eq.0) then
            npa = npa + 1
            nsra(npa) = mtj(kv(i),mod(jvx,3)+1)
         elseif(map(jelm).eq.0) then
            npa = npa+1
            nsra(npa) = mtj(kv(i),mod(jvx,3)+1)
         endif
      enddo
      npa = npa + 1
      nsra(npa) = i
      npb = 1
      nsrb(npb) = iq
      ivx = ivert(kv(iv),iq,mtj,kte)
      npb = npb+1
      nsrb(npb) = mtj(kv(iv),mod(ivx,3)+1)
      do i = iv-1,2,-1
         jvx = ivert(kv(i),nsrb(npb),mtj,kte)
         jelm = jac(kv(i),jvx)
         if(jelm.eq.0) then
            npb = npb + 1
            nsrb(npb) = mtj(kv(i),mod(jvx,3)+1)
         elseif(map(jelm).eq.0) then
            npb = npb+1
            nsrb(npb) = mtj(kv(i),mod(jvx,3)+1)
         endif
      enddo
      npb = npb + 1
      nsrb(npb) = ip
      if(iv.ne.npa+npb-4) then
         write(7777,*) 'Error Message from subroutine pick 1 ! '
         write(7777,*) 'incorrect number of nodes'
         stop 
      endif
      return
      end
*
**********************************************************************
*  subdivide given polygon into finte element
**********************************************************************  
      subroutine poly(iq,ip,iv,kv,x,nelm,mtj,jac,jnb,
     &     nei,map,kte,ktj,kcm)
      implicit real*8(a-h,o-z)  
      parameter(lte=100)
      dimension kv(kte),x(2,ktj+3),mtj(kte,3)
      dimension jnb(ktj),nei(ktj,kcm),map(kte),nsra(lte+2)
      dimension iena(lte,3),ienb(lte,3),jeea(lte,3)
      dimension ihen(2*lte+1,2),jhen(2*lte+1),iad(2*lte+1)
      dimension jac(0:kte,3),nsrb(lte+2),jeeb(lte,3)
      dimension jstack(lte+2)
      if(iv.eq.2) then
         call edge(kv(1),kv(2),jac,kte,ia)
         call edge(kv(2),kv(1),jac,kte,ja)
         ir = jac(kv(1),mod(ia,3)+1) 
         jr = jac(kv(2),mod(ja,3)+1) 
         mtj(kv(1),mod(ia,3)+1) = iq
         jac(kv(1),ia) = jr
         jac(kv(1),mod(ia,3)+1) = kv(2)
         mtj(kv(2),mod(ja,3)+1) = ip
         jac(kv(2),ja) = ir
         jac(kv(2),mod(ja,3)+1) = kv(1)
         if(ir.ne.0) then
            call edge(ir,kv(1),jac,kte,iedge)
            jac(ir,iedge) = kv(2)
         endif
         if(jr.ne.0) then
            call edge(jr,kv(2),jac,kte,iedge)
            jac(jr,iedge) = kv(1)
         endif
         iv1 = mtj(kv(1),ia)
         iv2 = mtj(kv(2),ja)
         call decr(iv1,kv(2),jnb,nei,ktj,kcm)
         call decr(iv2,kv(1),jnb,nei,ktj,kcm)
         call incr(iq,kv(1),jnb,nei,ktj,kcm)
         call incr(ip,kv(2),jnb,nei,ktj,kcm)
      else
         ltj = lte+2
         lhn = 2*lte+1
         npa = 0
         npb = 0
         do i =1,ltj
            nsra(i) = 0
            nsrb(i) = 0
         enddo
         do i = 1,nelm
            map(i) = 0 
         enddo
         do i = 1,iv
            map(kv(i)) = 1
         enddo
         do i = 1,iv
            ielm = kv(i)
            do j = 1,3
               ivx = mtj(ielm,j)
               call decr(ivx,ielm,jnb,nei,ktj,kcm)
            enddo
         enddo
         call pick(iq,ip,iv,kv,mtj,jac,map,npa,npb,nsra,nsrb,
     &        kte,ltj)
         call subdiv(npa,nsra,x,nta,iena,jeea,ihen,jhen,
     &        iad,jstack,ktj,lte,ltj,lhn)
         call subdiv(npb,nsrb,x,ntb,ienb,jeeb,ihen,jhen,
     &        iad,jstack,ktj,lte,ltj,lhn)
         if(iv.ne.nta+ntb) then
            write(7777,*) 'Error Message from subroutine poly 1 ! '
            write(7777,*) 'incorrect number of elements formed'
            stop
         endif
         do i = 1,iv
            do j = 1,3
               jac(kv(i),j) = 0
            enddo
         enddo
         do i = 1,nta
            ielm = kv(i)
            do j = 1,3
               mtj(ielm,j) = iena(i,j)
               if(jeea(i,j).ne.0) then
                  jac(ielm,j) = kv(jeea(i,j))
               endif
            enddo
         enddo
         do i = 1,ntb
            ielm = kv(nta+i)
            do j = 1,3
               mtj(ielm,j) = ienb(i,j)
               if(jeeb(i,j).ne.0) then
                  jac(ielm,j) = kv(nta+jeeb(i,j))
               endif
            enddo
         enddo
         do i = 1,iv
            ielm = kv(i)
            do j = 1,3
               ivx = mtj(ielm,j)
               call incr(ivx,ielm,jnb,nei,ktj,kcm)
            enddo
         enddo

         do i = 1,iv
            ielm = kv(i)
            do 10 j = 1,3
               jelm = jac(ielm,j)
               if(jelm.ne.0) go to 10
               ips = mtj(ielm,j)
               ipg = mtj(ielm,mod(j,3)+1)
               do k =1,jnb(ipg)
                  kelm = nei(ipg,k)
                  do l = 1,3
                     iva = mtj(kelm,l)
                     ivb = mtj(kelm,mod(l,3)+1)
                     if((iva.eq.ipg).and.(ivb.eq.ips)) then
                        jac(ielm,j) = kelm
                        jac(kelm,l) = ielm
                        go to 10
                     endif
                  enddo
               enddo
 10         continue
         enddo
      endif
      return
      end
*
**********************************************************************
*    subdivide given domain by new data point
**********************************************************************   
      subroutine remesh(ielm,ied,jelm,jed,node,x,jnb,
     &     nei,nelm,mtj,jac,idm,istack,kte,ktj,kcm)
      implicit real*8(a-h,o-z)
      dimension x(2,ktj+3),jnb(ktj),nei(ktj,kcm)
      dimension jac(0:kte,3),idm(kte),istack(ktj),mtj(kte,3)
      itop = 0
      maxstk = node
      ip = node
      xp = x(1,ip)
      yp = x(2,ip)
      ibj = mod(ied,3) + 1
      jbj = mod(jed,3) + 1
      ia = jac(ielm,ibj) 
      ib = jac(ielm,mod(ibj,3)+1)
      ic = jac(jelm,jbj)
      id = jac(jelm,mod(jbj,3)+1)
      iv1 = mtj(ielm,ibj)
      iv2 = mtj(ielm,mod(ibj,3)+1)
      iv3 = mtj(jelm,jbj)
      iv4 = mtj(jelm,mod(jbj,3)+1)
      mtj(ielm,1) = ip
      mtj(ielm,2) = iv1
      mtj(ielm,3) = iv2
      jac(ielm,1) = nelm+2
      jac(ielm,2) = ia
      jac(ielm,3) = nelm+1
      nelm = nelm+1
      idm(nelm) = idm(ielm)
      mtj(nelm,1) = ip
      mtj(nelm,2) = iv2
      mtj(nelm,3) = iv3
      jac(nelm,1) = ielm
      jac(nelm,2) = ib
      jac(nelm,3) = jelm
      mtj(jelm,1) = ip
      mtj(jelm,2) = iv3
      mtj(jelm,3) = iv4
      jac(jelm,1) = nelm
      jac(jelm,2) = ic
      jac(jelm,3) = nelm+1
      nelm = nelm+1
      idm(nelm) = idm(jelm)
      mtj(nelm,1) = ip
      mtj(nelm,2) = iv4
      mtj(nelm,3) = iv1
      jac(nelm,1) = jelm
      jac(nelm,2) = id
      jac(nelm,3) = ielm
      if(iv1.le.ktj) then
         nei(iv1,neibor(iv1,jelm,jnb,nei,ktj,kcm)) = nelm
      endif
      call incr(iv2,nelm-1,jnb,nei,ktj,kcm)
      if(iv3.le.ktj) then
         nei(iv3,neibor(iv3,ielm,jnb,nei,ktj,kcm)) = nelm-1
      endif
      call incr(iv4,nelm,jnb,nei,ktj,kcm)
      jnb(ip) = 4
      nei(ip,1) = ielm
      nei(ip,2) = nelm-1
      nei(ip,3) = jelm
      nei(ip,4) = nelm
      if(ia.ne.0) then
         if(idm(ia).eq.idm(ielm)) then
            itop = itop + 1
            istack(itop) = ipush(ielm,maxstk,itop)
         endif
      endif
      if(ib.ne.0) then
         call edge(ib,ielm,jac,kte,iedge)
         jac(ib,iedge) = nelm-1
         if(idm(ib).eq.idm(nelm-1)) then
            itop = itop + 1
            istack(itop) = ipush(nelm-1,maxstk,itop)
         endif
      endif
      if(ic.ne.0) then
         if(idm(ic).eq.idm(jelm)) then
            itop = itop +1
            istack(itop) = ipush(jelm,maxstk,itop)
         endif
      endif
      if(id.ne.0) then
         call edge(id,jelm,jac,kte,iedge)
         jac(id,iedge) = nelm
         if(idm(id).eq.idm(nelm)) then
            itop = itop + 1
            istack(itop) = ipush(nelm,maxstk,itop)
         endif
      endif
 10   if(itop.gt.0) then
         il = istack(itop)
         itop = itop - 1
         ir = jac(il,2)
         call edge(ir,il,jac,kte,ierl)
         iera = mod(ierl,3) + 1
         ierb = mod(iera,3) + 1
         iv1 = mtj(ir,ierl)
         iv2 = mtj(ir,iera)
         iv3 = mtj(ir,ierb)
         call swap(x(1,iv1),x(2,iv1),x(1,iv2),x(2,iv2),x(1,iv3),
     &        x(2,iv3),xp,yp,iswap)
         if(iswap.eq.1) then
            ia = jac(ir,iera)
            ib = jac(ir,ierb)
            ic = jac(il,3)
            mtj(il,3) = iv3
            jac(il,2) = ia
            jac(il,3) = ir
            mtj(ir,1) = ip
            mtj(ir,2) = iv3
            mtj(ir,3) = iv1
            jac(ir,1) = il
            jac(ir,2) = ib
            jac(ir,3) = ic
            call decr(iv1,il,jnb,nei,ktj,kcm)
            call decr(iv2,ir,jnb,nei,ktj,kcm)
            call incr(ip,ir,jnb,nei,ktj,kcm)
            call incr(iv3,il,jnb,nei,ktj,kcm)
            if(ia.ne.0) then
               call edge(ia,ir,jac,kte,iedge)
               jac(ia,iedge) = il
               if(idm(ia).eq.idm(il)) then
                  itop = itop + 1
                  istack(itop) = ipush(il,maxstk,itop)
               endif
            endif
            if(ib.ne.0) then
               if(idm(ib).eq.idm(ir)) then
                  itop = itop+1
                  istack(itop) = ipush(ir,maxstk,itop)
               endif
            endif
            if(ic.ne.0) then
               call edge(ic,il,jac,kte,iedge)
               jac(ic,iedge) = ir
            endif
         endif
         go to 10
      endif
      return
      end
*
**********************************************************************
*   remove alltriangles outside of boundary
**********************************************************************  
      subroutine remove(nex,index,nelm,mtj,jac,idm,kbd,kte)
      implicit real*8(a-h,o-z)  
      dimension index(kbd+1),mtj(kte,3),jac(0:kte,3),idm(kte)
      dimension mkp(3),jkp(3)
      ielm = 0
      index(1) = 1
      do i = 1,nex
         iz = i
         inelm = 0
         do j = index(i),nelm
            if(idm(j).eq.iz) then
               ielm = ielm+1
               jelm = j
               inelm = inelm+1
               if(ielm.ne.jelm) then

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -