xref: /phasta/phSolver/common/findslpw.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
159599516SKenneth E. Jansen       subroutine findslpw(x,ilwork,iper,iBC)
259599516SKenneth E. Jansen       use pointer_data
359599516SKenneth E. Jansen       use slpw
459599516SKenneth E. Jansen       include "common.h"
559599516SKenneth E. Jansen       include "mpif.h"
659599516SKenneth E. Jansen       real*8 x(numnp,nsd)
759599516SKenneth E. Jansen       integer iper(nshg)
859599516SKenneth E. Jansen       integer ilwork(nlwork)
959599516SKenneth E. Jansen       integer ifirstvisit(nshg)
1059599516SKenneth E. Jansen       integer, allocatable :: ienb(:)
1159599516SKenneth E. Jansen       real*8 elnrm(nsd),wn1(nsd),wn2(nsd),wn3(nsd),aedg(nsd),bedg(nsd)
1259599516SKenneth E. Jansen       real*8 mag
1359599516SKenneth E. Jansen       integer iBC(nshg)
1459599516SKenneth E. Jansen       integer, allocatable :: IDslpw(:)
1559599516SKenneth E. Jansen       real*8 AA(nsd),BB(nsd),tmp
1659599516SKenneth E. Jansen       integer iparall
1759599516SKenneth E. Jansen
1859599516SKenneth E. Jansen       allocate(idxslpw(nshg))
1959599516SKenneth E. Jansen       allocate(mpslpw(nshg,2))
2059599516SKenneth E. Jansen       allocate(wlnorm(nshg,nsd,9))
2159599516SKenneth E. Jansen
2259599516SKenneth E. Jansen
2359599516SKenneth E. Jansen      nslpwnd=0
2459599516SKenneth E. Jansen      idxslpw=0
2559599516SKenneth E. Jansen      mpslpw=0
2659599516SKenneth E. Jansen      wlnorm=0
2759599516SKenneth E. Jansen      ifirstvisit(:)=1
2859599516SKenneth E. Jansen      do iblk=1,nelblb
2959599516SKenneth E. Jansen      npro=lcblkb(1,iblk+1)-lcblkb(1,iblk)
3059599516SKenneth E. Jansen      nenbl=lcblkb(6,iblk)
3159599516SKenneth E. Jansen      nshl=lcblkb(9,iblk)
3259599516SKenneth E. Jansen      allocate(ienb(nshl))
3359599516SKenneth E. Jansen      do i=1,npro
3459599516SKenneth E. Jansen      isfID=miBCB(iblk)%p(i,2)
3559599516SKenneth E. Jansen      if(isfID.gt.709.or.isfID.lt.701)cycle
3659599516SKenneth E. Jansen      islpw=mod(isfID,700)
3759599516SKenneth E. Jansen      ienb(1:nshl)=mienb(iblk)%p(i,1:nshl)
3859599516SKenneth E. Jansen      do j=1,nenbl
3959599516SKenneth E. Jansen         nn=ienb(j)
4059599516SKenneth E. Jansen         if(ifirstvisit(nn).eq.1)then
4159599516SKenneth E. Jansen            ifirstvisit(nn)=0
4259599516SKenneth E. Jansen            nslpwnd=nslpwnd+1
4359599516SKenneth E. Jansen            idxslpw(nslpwnd)=nn
4459599516SKenneth E. Jansen         endif
4559599516SKenneth E. Jansen         if(.not.btest(mpslpw(nn,2),islpw))then
4659599516SKenneth E. Jansen            mpslpw(nn,1)=mpslpw(nn,1)+1
4759599516SKenneth E. Jansen            mpslpw(nn,2)=mpslpw(nn,2)+2**islpw
4859599516SKenneth E. Jansen         endif
4959599516SKenneth E. Jansen         if(j.ne.1.and.j.ne.nenbl)then
5059599516SKenneth E. Jansen            aedg(:)=x(ienb(j+1),:)-x(nn,:)
5159599516SKenneth E. Jansen            bedg(:)=x(ienb(j-1),:)-x(nn,:)
5259599516SKenneth E. Jansen         elseif(j.eq.1)then
5359599516SKenneth E. Jansen            aedg(:)=x(ienb(j+1),:)-x(nn,:)
5459599516SKenneth E. Jansen            bedg(:)=x(ienb(nenbl),:)-x(nn,:)
5559599516SKenneth E. Jansen         elseif(j.eq.nenbl)then
5659599516SKenneth E. Jansen            aedg(:)=x(ienb(1),:)-x(nn,:)
5759599516SKenneth E. Jansen            bedg(:)=x(ienb(j-1),:)-x(nn,:)
5859599516SKenneth E. Jansen         endif
5959599516SKenneth E. Jansen         elnrm(1)=aedg(2)*bedg(3)-aedg(3)*bedg(2)
6059599516SKenneth E. Jansen         elnrm(2)=aedg(3)*bedg(1)-aedg(1)*bedg(3)
6159599516SKenneth E. Jansen         elnrm(3)=aedg(1)*bedg(2)-aedg(2)*bedg(1)
6259599516SKenneth E. Jansen         wlnorm(nn,:,islpw)=wlnorm(nn,:,islpw)+elnrm(:)
6359599516SKenneth E. Jansen      enddo
6459599516SKenneth E. Jansen      enddo
6559599516SKenneth E. Jansen      deallocate(ienb)
6659599516SKenneth E. Jansen      enddo
6759599516SKenneth E. Jansen
6859599516SKenneth E. Jansen       do k=1,9
6959599516SKenneth E. Jansen         if(numpe.gt.1) call commu(wlnorm(:,:,k),ilwork,3,'in ')
7059599516SKenneth E. Jansen         call bc3per(iBC,wlnorm(:,:,k),iper,ilwork,3)
7159599516SKenneth E. Jansen         if(numpe.gt.1) call commu(wlnorm(:,:,k),ilwork,3,'out')
7259599516SKenneth E. Jansen       enddo
7359599516SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccc
7459599516SKenneth E. Jansen
7559599516SKenneth E. Jansen
7659599516SKenneth E. Jansen      do id=1,nslpwnd
7759599516SKenneth E. Jansen       nn=idxslpw(id)
7859599516SKenneth E. Jansen       nslpw=mpslpw(nn,1)
7959599516SKenneth E. Jansen       ihis=mpslpw(nn,2)
8059599516SKenneth E. Jansen       nslpwg=nslpw
8159599516SKenneth E. Jansen
8259599516SKenneth E. Jansen       allocate(IDslpw(nslpw))
8359599516SKenneth E. Jansen       jslpw=0
8459599516SKenneth E. Jansen       do ni=1,nslpw
8559599516SKenneth E. Jansen          do islpw=1+jslpw,9
8659599516SKenneth E. Jansen             if(btest(ihis,islpw))exit
8759599516SKenneth E. Jansen          enddo
8859599516SKenneth E. Jansen          IDslpw(ni)=islpw
8959599516SKenneth E. Jansen          jslpw=islpw
9059599516SKenneth E. Jansen       enddo
9159599516SKenneth E. Jansen
9259599516SKenneth E. Jansen       ired=0
9359599516SKenneth E. Jansen       do i=1,nslpwg
9459599516SKenneth E. Jansen          if(btest(ired,i))cycle
9559599516SKenneth E. Jansen       do j=i+1,nslpwg
9659599516SKenneth E. Jansen          AA(:)=wlnorm(nn,:,IDslpw(i))
9759599516SKenneth E. Jansen          BB(:)=wlnorm(nn,:,IDslpw(j))
9859599516SKenneth E. Jansen          if(iparall(AA,BB).eq.1)then
9959599516SKenneth E. Jansen             nslpw=nslpw-1
10059599516SKenneth E. Jansen             ihis=ihis-2**IDslpw(j)
10159599516SKenneth E. Jansen             wlnorm(nn,:,IDslpw(i))=AA(:)+BB(:)
10259599516SKenneth E. Jansen             ired=ired+2**j
10359599516SKenneth E. Jansen          endif
10459599516SKenneth E. Jansen       enddo
10559599516SKenneth E. Jansen       enddo
10659599516SKenneth E. Jansen
10759599516SKenneth E. Jansen       do k=1,9
10859599516SKenneth E. Jansen          wn1(:)=wlnorm(nn,:,k)
10959599516SKenneth E. Jansen          mag=(wn1(1)**2+wn1(2)**2+wn1(3)**2)**0.5
11059599516SKenneth E. Jansen          if(mag.ne.0)wlnorm(nn,:,k)=wn1(:)/mag
11159599516SKenneth E. Jansen       enddo
11259599516SKenneth E. Jansen
11359599516SKenneth E. Jansen      mpslpw(nn,1)=nslpw
11459599516SKenneth E. Jansen      mpslpw(nn,2)=ihis
11559599516SKenneth E. Jansen
11659599516SKenneth E. Jansen      deallocate(IDslpw)
11759599516SKenneth E. Jansen      enddo
11859599516SKenneth E. Jansen
11959599516SKenneth E. Jansen
120*513954efSKenneth E. Jansenc        call write_field(myrank,'a'//char(0),
121*513954efSKenneth E. Jansenc     &      'wnrm'//char(0),4,wlnorm(:,:,1),'d'//char(0),nshg,3,701)
12259599516SKenneth E. Jansencc 7 is the number of charaters of the name of array wnrm701
123*513954efSKenneth E. Jansenc        call write_field(myrank,'a'//char(0),
124*513954efSKenneth E. Jansenc     &      'wnrm'//char(0),4,wlnorm(:,:,2),'d'//char(0),nshg,3,702)
12559599516SKenneth E. Jansenc      stop
12659599516SKenneth E. Jansen
12759599516SKenneth E. Jansen      return
12859599516SKenneth E. Jansen      end
12959599516SKenneth E. Jansen
13059599516SKenneth E. Jansencccccccccccccccccccccc
13159599516SKenneth E. Jansen
13259599516SKenneth E. Jansen      integer function iparall(A,B)
13359599516SKenneth E. Jansen      real*8 A(3),B(3)
13459599516SKenneth E. Jansen      real*8 angtol,tmp
13559599516SKenneth E. Jansen
13659599516SKenneth E. Jansen      tmp=(A(1)**2+A(2)**2+A(3)**2)**0.5
13759599516SKenneth E. Jansen      A(:)=A(:)/tmp
13859599516SKenneth E. Jansen      tmp=(B(1)**2+B(2)**2+B(3)**2)**0.5
13959599516SKenneth E. Jansen      B(:)=B(:)/tmp
14059599516SKenneth E. Jansen      pi=3.1415926535
14159599516SKenneth E. Jansen      angtol=10
14259599516SKenneth E. Jansen      angtol=sin(angtol*(pi/180))
14359599516SKenneth E. Jansen      C1=A(2)*B(3)-A(3)*B(2)
14459599516SKenneth E. Jansen      C2=A(3)*B(1)-A(1)*B(3)
14559599516SKenneth E. Jansen      C3=A(1)*B(2)-A(2)*B(1)
14659599516SKenneth E. Jansen      Cmag=(C1**2+C2**2+C3**2)**0.5
14759599516SKenneth E. Jansen      dotp=A(1)*B(1)+A(2)*B(2)+A(3)*B(3)
14859599516SKenneth E. Jansen      if(dotp.gt.0.and.Cmag.lt.angtol)then
14959599516SKenneth E. Jansen         iparall=1
15059599516SKenneth E. Jansen      else
15159599516SKenneth E. Jansen         iparall=0
15259599516SKenneth E. Jansen      endif
15359599516SKenneth E. Jansen
15459599516SKenneth E. Jansen      return
15559599516SKenneth E. Jansen      end
156