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

📄 search.f

📁 关于网格自动生成delaunay算法的
💻 F
📖 第 1 页 / 共 2 页
字号:
      data (sstg(i,3,3),i=1,3)
     $     /0.2000000000d0,0.8000000000d0,0.2000000000d0/
      data (sstg(i,4,3),i=1,3)
     $     /0.2000000000d0,0.2000000000d0,0.8000000000d0/
      data (sstg(i,5,3),i=1,3)
     $     /0.0000000000d0,0.0000000000d0,0.0000000000d0/
      data (sstg(i,6,3),i=1,3)
     $     /0.0000000000d0,0.0000000000d0,0.0000000000d0/
      data (sstg(i,7,3),i=1,3)
     $     /0.0000000000d0,0.0000000000d0,0.0000000000d0/
      data (sstg(i,1,4),i=1,3)
     $     /0.3333333333d0,0.3333333333d0,0.3333333333d0/
      data (sstg(i,2,4),i=1,3)
     $     /0.7974269853d0,0.1012865073d0,0.1012865073d0/
      data (sstg(i,3,4),i=1,3)
     $     /0.1012865073d0,0.7974269853d0,0.1012865073d0/
      data (sstg(i,4,4),i=1,3)
     $     /0.1012865073d0,0.1012865073d0,0.7974269853d0/
      data (sstg(i,5,4),i=1,3)
     $     /0.0597158717d0,0.4701420641d0,0.4701420641d0/
      data (sstg(i,6,4),i=1,3)
     $     /0.4701420641d0,0.0597158717d0,0.4701420641d0/
      data (sstg(i,7,4),i=1,3)
     $     /0.4701420641d0,0.4701420641d0,0.0597158717d0/
      data (wwtg(i,1),i=1,7)
     $     / 1.0000000000d0, 0.0000000000d0, 0.0000000000d0,
     $       0.0000000000d0, 0.0000000000d0, 0.0000000000d0,
     $       0.0000000000d0/
      data (wwtg(i,2),i=1,7)
     $     / 0.3333333333d0, 0.3333333333d0, 0.3333333333d0,
     $       0.0000000000d0, 0.0000000000d0, 0.0000000000d0,
     $       0.0000000000d0/
      data (wwtg(i,3),i=1,7)
     $     /-0.5625000000d0, 0.5208333333d0, 0.5208333333d0,
     $       0.5208333333d0, 0.0000000000d0, 0.0000000000d0,
     $       0.0000000000d0/
      data (wwtg(i,4),i=1,7)
     $     / 0.2250000000d0, 0.1259391805d0, 0.1259391805d0,
     $       0.1259391805d0, 0.1323941527d0, 0.1323941527d0,
     $       0.1323941527d0/
      end
*
**********************************************************************
*     making information table of Gauss points for boundary integral 
**********************************************************************
      subroutine mkitgb(mpoin,meb,ng,msrch,mtail,mnod,
     $     npoin,nadrs,x,nodb,isrch,ltail,
     $     ngbcls,nibcls,iflnod,nflnod,aldm,
     $     nbc,nbcbm,mgpb,mavnd,ngpb,
     $     xxgpb,wwgpb,dmaxb,ndgpb,idgpb)
      implicit real*8(a-h,o-z)
      integer    npoin
      dimension  isrch(2,msrch), ltail(mtail)
      dimension  x(ng,mpoin+3)
      dimension  nodb(2,meb)
      dimension  iflnod(mnod), nflnod(0:10)
      dimension  xxgpb(ng,mgpb), wwgpb(mgpb), dmaxb(mgpb)
      dimension  ndgpb(0:mgpb),idgpb(mgpb*mavnd)
      dimension  nbcbm(3,meb)
      dimension  ndelm(2), xnode(2,2)
      dimension  xx(2)
      common/gaussa/ssg(10,10),wwg(10,10)
      nss= ngbcls
      igpb= 0
      ndgpb(0)= 0
      iptot= 0
      do 100 ibc= 1,nbc
         ieb= nbcbm(1,ibc)
         do 200 inode= 1,2
            ndelm(inode)= nodb(inode,ieb)
            do 210 ig= 1,ng
               xnode(ig,inode)= x(ig,ndelm(inode))
 210        continue
 200     continue
         aleng= sqrt((xnode(1,2)-xnode(1,1))*(xnode(1,2)-xnode(1,1))
     $              +(xnode(2,2)-xnode(2,1))*(xnode(2,2)-xnode(2,1)))
         wwj= 0.5d0*aleng
         do 120 iss= 1, nss
            igpb= igpb+1
            if(igpb.gt.mgpb) then
               write(7777,*) 
     $              'Error Message from subroutine mkitgb 1 !   '
               write(7777,*) 'igpb is greater than mgpb  '
               write(7777,*) 'mgpb is too small '
               write(7777,*) 'igpb =',igpb
               write(7777,*) 'mgpb =',mgpb
               stop
            endif
            do 350 ig= 1,ng
               xx(ig)= 0.5d0*(1.0d0-ssg(iss,ngbcls))*xnode(ig,1)
     $               + 0.5d0*(1.0d0+ssg(iss,ngbcls))*xnode(ig,2)
 350        continue
            www= wwj*wwg(iss,ngbcls)
*
*----    search nodes under influence
*
            call getndb(mpoin,ng,msrch,mtail,mnod,
     $           npoin,nadrs,isrch,ltail,ndelm,
     $           nibcls,nnod,iflnod,nflnod,x,xx,aldm,ddmax)
*
*---- store coordinates, influence nodes, wait of a gauss point.
*
            iptot= iptot+nnod
            ndgpb(igpb)= iptot
            if(iptot.gt.mgpb*mavnd) then
               write(7777,*) 
     $              'Error Message from subroutine mkitgb 2 !   '
               write(7777,*) 
     $              'iptot is greater than mgpb*mavnd for idgpb  '
               write(7777,*) 'mgpb or mavnd may be too small  '
               write(7777,*) 'iptot =',iptot
               write(7777,*) 'mgpb*mavnd =',mgpb*mavnd
               stop
            endif
            do 180 i= 1,nnod
               idgpb(ndgpb(igpb-1)+i)= iflnod(i)
 180        continue
             do 240 ig= 1,ng
               xxgpb(ig,igpb)= xx(ig)
 240        continue
            wwgpb(igpb)= www
            dmaxb(igpb)= ddmax
 120     continue
 100  continue
      ngpb= igpb
      return
      end
*
**********************************************************************
*     getting nodes in the influence region
**********************************************************************
      subroutine getndb(mpoin,ng,msrch,mtail,mnod,
     $              npoin,nadrs,isrch,ltail,ndelm,
     $              nibcls,nnod,iflnod,nflnod,x,xx,aldm,ddmax)
      implicit real*8(a-h,o-z)
      integer    npoin
      dimension  isrch(2,msrch), ltail(mtail)
      dimension  x(ng,mpoin+3)
      dimension  xx(2)
      dimension  ndelm(2)
      dimension  iflnod(mnod), nflnod(0:10)
*
*---- search nodes under influence
*
      nflnod(0)= 0
      nflnod(1)= 2
*
*---- set ddmax 
*
      d = 0.0d0
      dm = 1.0d30
      do i = 1,2
         ntgpt = ndelm(i)
         call search(msrch,npoin,ntgpt,nadrs,
     $        isrch,mtail,ltail)
         do j=2,ltail(1)+1
            if(ltail(j).ne.ndelm(1).and.ltail(j).ne.ndelm(2)) then
               d = sqrt((x(1,ltail(j))-xx(1))**2+
     $              (x(2,ltail(j))-xx(2))**2 )
               if(d.lt.dm) then
                  ipp = ltail(j)
                  dm = d
               endif
            endif
         enddo
      enddo
      iflnod(1)= ndelm(1)
      iflnod(2)= ndelm(2)
      iflnod(3)= ipp
      dd12= sqrt((x(1,ndelm(1))-xx(1))**2+
     $     (x(2,ndelm(1))-xx(2))**2 )
      dd23= sqrt((x(1,ndelm(2))-xx(1))**2+
     $     (x(2,ndelm(2))-xx(2))**2 )
      ddmax= aldm*max(dd12,dd23,dm)
      ip= 3
      if(nibcls.ge.2) then
         jfrag= 0
         iiclas= 1
         do 140 while(iiclas.le.nibcls-1.and.jfrag.eq.0)
            if(nflnod(iiclas).gt.nflnod(iiclas-1)) then
               do 150 i= nflnod(iiclas-1)+1, nflnod(iiclas)
                  ntgpt= iflnod(i)
                  call search(msrch,npoin,ntgpt,nadrs,
     $                 isrch,mtail,ltail)
                  if(ltail(1).ge.1) then
                     do 160 j= 2, ltail(1)+1
                        ifrag= 1
                        do 170 k=1, ip
                           if(iflnod(k).eq.ltail(j)) then
                              ifrag= 0
                           endif
 170                    continue
                        if(ifrag.eq.1) then
                           ip= ip+1
                           if(ip.gt.mnod) then
                              write(7777,*)
     $                             'Error Message from subroutine 
     $                             getndb 1 !'
                              write(7777,*) 
     $                             'ip is greater than mnod for iflnod'
                              write(7777,*) 
     $                             'Too large nibcls or too small mnod'
                              write(7777,*) 'ip =',ip
                              write(7777,*) 'mnod =',mnod
                              stop
                           endif
                           iflnod(ip)= ltail(j)
                        endif
 160                 continue
                  endif
 150           continue
            endif
            nflnod(iiclas+1)= ip
            ip= nflnod(iiclas)
            jfrag= 1
            if(nflnod(iiclas+1).gt.nflnod(iiclas)) then
               do 180 i= nflnod(iiclas)+1, nflnod(iiclas+1)
                  ipoin= iflnod(i)
                  xi1 = x(1,ipoin)
                  xi2 = x(2,ipoin)
                  dd= sqrt( (xx(1)-xi1)**2+
     $                 (xx(2)-xi2)**2  )
                  if(dd.le.ddmax) then
                     ip= ip+1
                     iflnod(ip)= ipoin
                     jfrag= 0
                  endif
 180           continue
            endif
            nflnod(iiclas+1)= ip
            iiclas= iiclas+1
 140     continue
      endif
      nnod= ip
      return
      end
*
**********************************************************************
*     constants for gauss integration formula (line integral)
**********************************************************************
      block data gauss
      implicit real*8(a-h,o-z)
      common/gaussa/ssg(10,10),wwg(10,10)
      data ssg(1,1) / 0.0d0/
      data (ssg(i,2),i=1,2)/
     $ -0.577350269189626d0, 0.577350269189626d0/
      data (ssg(i,3),i=1,3)/
     $ -0.774596669241483d0, 0.000000000000000d0, 0.774596669241483d0/
      data (ssg(i,4),i=1,4)/
     $ -0.861136311594953d0,-0.339981043584856d0, 0.339981043584856d0,
     $  0.861136311594953d0/
      data (ssg(i,5),i=1,5)/
     $ -0.906179845938664d0,-0.538469310105683d0, 0.000000000000000d0,
     $  0.538469310105683d0, 0.906179845938664d0/
      data (ssg(i,6),i=1,6)/
     $ -0.932469514203152d0,-0.661209386466265d0,-0.238619186083197d0,
     $  0.238619186083197d0, 0.661209386466265d0, 0.932469514203152d0/
      data (ssg(i,7),i=1,7)/
     $ -0.949107912342759d0,-0.741531185599394d0,-0.405845151377397d0,
     $  0.000000000000000d0, 0.405845151377397d0, 0.741531185599394d0,
     $  0.949107912342759d0/
      data (ssg(i,8),i=1,8)/
     $ -0.960289856497536d0,-0.796666477413627d0,-0.525532409916329d0,
     $ -0.183434642495650d0, 0.183434642495650d0, 0.525532409916329d0,
     $  0.796666477413627d0, 0.960289856497536d0/
      data (ssg(i,9),i=1,9)/
     $ -0.968160239507626d0,-0.836031107326636d0,-0.613371432700590d0,
     $ -0.324253423403809d0, 0.000000000000000d0, 0.324253423403809d0,
     $  0.613371432700590d0, 0.836031107326636d0, 0.968160239507626d0/
      data (ssg(i,10),i=1,10)/
     $ -0.973906528517172d0,-0.865063366688985d0,-0.679409568299024d0,
     $ -0.433395394129247d0,-0.148874338981631d0, 0.148874338981631d0,
     $  0.433395394129247d0, 0.679409568299024d0, 0.865063366688985d0,
     $  0.973906528517172d0/
      data wwg(1,1)/ 2.0d0/
      data (wwg(i,2),i=1,2)/
     $  1.000000000000000d0, 1.000000000000000d0/
      data (wwg(i,3),i=1,3)/
     $  0.555555555555556d0, 0.888888888888889d0, 0.555555555555556d0/
      data (wwg(i,4),i=1,4)/
     $  0.347854845137454d0, 0.652145154862546d0, 0.652145154862546d0,
     $  0.347854845137454d0/
      data (wwg(i,5),i=1,5)/
     $  0.236926885056189d0, 0.478628670499366d0, 0.568888888888889d0,
     $  0.478628670499366d0, 0.236926885056189d0/
      data (wwg(i,6),i=1,6)/
     $  0.171324492379170d0, 0.360761573048139d0, 0.467913934572691d0,
     $  0.467913934572691d0, 0.360761573048139d0, 0.171324492379170d0/
      data (wwg(i,7),i=1,7)/
     $  0.129484966168870d0, 0.279705391489277d0, 0.381830050505119d0,
     $  0.417959183673469d0, 0.381830050505119d0, 0.279705391489277d0,
     $  0.129484966168870d0/
      data (wwg(i,8),i=1,8)/
     $  0.101228536290376d0, 0.222381034453374d0, 0.313706645877887d0,
     $  0.362683783378362d0, 0.362683783378362d0, 0.313706645877887d0,
     $  0.222381034453374d0, 0.101228536290376d0/
      data (wwg(i,9),i=1,9)/
     $  0.081274388361574d0, 0.180648160694857d0, 0.260610696402935d0,
     $  0.312347077040003d0, 0.330239355001260d0, 0.312347077040003d0,
     $  0.260610696402935d0, 0.180648160694857d0, 0.081274388361574d0/
      data (wwg(i,10),i=1,10)/
     $  0.066671344308688d0, 0.149451349150581d0, 0.219086362515982d0,
     $  0.269266719309996d0, 0.295524224714753d0, 0.295524224714753d0,
     $  0.269266719309996d0, 0.219086362515982d0, 0.149451349150581d0,
     $  0.066671344308688d0/
      end

⌨️ 快捷键说明

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