xref: /phasta/phSolver/common/findslpw.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen       subroutine findslpw(x,ilwork,iper,iBC)
2*59599516SKenneth E. Jansen       use pointer_data
3*59599516SKenneth E. Jansen       use slpw
4*59599516SKenneth E. Jansen       include "common.h"
5*59599516SKenneth E. Jansen       include "mpif.h"
6*59599516SKenneth E. Jansen       real*8 x(numnp,nsd)
7*59599516SKenneth E. Jansen       integer iper(nshg)
8*59599516SKenneth E. Jansen       integer ilwork(nlwork)
9*59599516SKenneth E. Jansen       integer ifirstvisit(nshg)
10*59599516SKenneth E. Jansen       integer, allocatable :: ienb(:)
11*59599516SKenneth E. Jansen       real*8 elnrm(nsd),wn1(nsd),wn2(nsd),wn3(nsd),aedg(nsd),bedg(nsd)
12*59599516SKenneth E. Jansen       real*8 mag
13*59599516SKenneth E. Jansen       integer iBC(nshg)
14*59599516SKenneth E. Jansen       integer, allocatable :: IDslpw(:)
15*59599516SKenneth E. Jansen       real*8 AA(nsd),BB(nsd),tmp
16*59599516SKenneth E. Jansen       integer iparall
17*59599516SKenneth E. Jansen
18*59599516SKenneth E. Jansen       allocate(idxslpw(nshg))
19*59599516SKenneth E. Jansen       allocate(mpslpw(nshg,2))
20*59599516SKenneth E. Jansen       allocate(wlnorm(nshg,nsd,9))
21*59599516SKenneth E. Jansen
22*59599516SKenneth E. Jansen
23*59599516SKenneth E. Jansen      nslpwnd=0
24*59599516SKenneth E. Jansen      idxslpw=0
25*59599516SKenneth E. Jansen      mpslpw=0
26*59599516SKenneth E. Jansen      wlnorm=0
27*59599516SKenneth E. Jansen      ifirstvisit(:)=1
28*59599516SKenneth E. Jansen      do iblk=1,nelblb
29*59599516SKenneth E. Jansen      npro=lcblkb(1,iblk+1)-lcblkb(1,iblk)
30*59599516SKenneth E. Jansen      nenbl=lcblkb(6,iblk)
31*59599516SKenneth E. Jansen      nshl=lcblkb(9,iblk)
32*59599516SKenneth E. Jansen      allocate(ienb(nshl))
33*59599516SKenneth E. Jansen      do i=1,npro
34*59599516SKenneth E. Jansen      isfID=miBCB(iblk)%p(i,2)
35*59599516SKenneth E. Jansen      if(isfID.gt.709.or.isfID.lt.701)cycle
36*59599516SKenneth E. Jansen      islpw=mod(isfID,700)
37*59599516SKenneth E. Jansen      ienb(1:nshl)=mienb(iblk)%p(i,1:nshl)
38*59599516SKenneth E. Jansen      do j=1,nenbl
39*59599516SKenneth E. Jansen         nn=ienb(j)
40*59599516SKenneth E. Jansen         if(ifirstvisit(nn).eq.1)then
41*59599516SKenneth E. Jansen            ifirstvisit(nn)=0
42*59599516SKenneth E. Jansen            nslpwnd=nslpwnd+1
43*59599516SKenneth E. Jansen            idxslpw(nslpwnd)=nn
44*59599516SKenneth E. Jansen         endif
45*59599516SKenneth E. Jansen         if(.not.btest(mpslpw(nn,2),islpw))then
46*59599516SKenneth E. Jansen            mpslpw(nn,1)=mpslpw(nn,1)+1
47*59599516SKenneth E. Jansen            mpslpw(nn,2)=mpslpw(nn,2)+2**islpw
48*59599516SKenneth E. Jansen         endif
49*59599516SKenneth E. Jansen         if(j.ne.1.and.j.ne.nenbl)then
50*59599516SKenneth E. Jansen            aedg(:)=x(ienb(j+1),:)-x(nn,:)
51*59599516SKenneth E. Jansen            bedg(:)=x(ienb(j-1),:)-x(nn,:)
52*59599516SKenneth E. Jansen         elseif(j.eq.1)then
53*59599516SKenneth E. Jansen            aedg(:)=x(ienb(j+1),:)-x(nn,:)
54*59599516SKenneth E. Jansen            bedg(:)=x(ienb(nenbl),:)-x(nn,:)
55*59599516SKenneth E. Jansen         elseif(j.eq.nenbl)then
56*59599516SKenneth E. Jansen            aedg(:)=x(ienb(1),:)-x(nn,:)
57*59599516SKenneth E. Jansen            bedg(:)=x(ienb(j-1),:)-x(nn,:)
58*59599516SKenneth E. Jansen         endif
59*59599516SKenneth E. Jansen         elnrm(1)=aedg(2)*bedg(3)-aedg(3)*bedg(2)
60*59599516SKenneth E. Jansen         elnrm(2)=aedg(3)*bedg(1)-aedg(1)*bedg(3)
61*59599516SKenneth E. Jansen         elnrm(3)=aedg(1)*bedg(2)-aedg(2)*bedg(1)
62*59599516SKenneth E. Jansen         wlnorm(nn,:,islpw)=wlnorm(nn,:,islpw)+elnrm(:)
63*59599516SKenneth E. Jansen      enddo
64*59599516SKenneth E. Jansen      enddo
65*59599516SKenneth E. Jansen      deallocate(ienb)
66*59599516SKenneth E. Jansen      enddo
67*59599516SKenneth E. Jansen
68*59599516SKenneth E. Jansen       do k=1,9
69*59599516SKenneth E. Jansen         if(numpe.gt.1) call commu(wlnorm(:,:,k),ilwork,3,'in ')
70*59599516SKenneth E. Jansen         call bc3per(iBC,wlnorm(:,:,k),iper,ilwork,3)
71*59599516SKenneth E. Jansen         if(numpe.gt.1) call commu(wlnorm(:,:,k),ilwork,3,'out')
72*59599516SKenneth E. Jansen       enddo
73*59599516SKenneth E. Jansencccccccccccccccccccccccccccccccccccccccccccccccccc
74*59599516SKenneth E. Jansen
75*59599516SKenneth E. Jansen
76*59599516SKenneth E. Jansen      do id=1,nslpwnd
77*59599516SKenneth E. Jansen       nn=idxslpw(id)
78*59599516SKenneth E. Jansen       nslpw=mpslpw(nn,1)
79*59599516SKenneth E. Jansen       ihis=mpslpw(nn,2)
80*59599516SKenneth E. Jansen       nslpwg=nslpw
81*59599516SKenneth E. Jansen
82*59599516SKenneth E. Jansen       allocate(IDslpw(nslpw))
83*59599516SKenneth E. Jansen       jslpw=0
84*59599516SKenneth E. Jansen       do ni=1,nslpw
85*59599516SKenneth E. Jansen          do islpw=1+jslpw,9
86*59599516SKenneth E. Jansen             if(btest(ihis,islpw))exit
87*59599516SKenneth E. Jansen          enddo
88*59599516SKenneth E. Jansen          IDslpw(ni)=islpw
89*59599516SKenneth E. Jansen          jslpw=islpw
90*59599516SKenneth E. Jansen       enddo
91*59599516SKenneth E. Jansen
92*59599516SKenneth E. Jansen       ired=0
93*59599516SKenneth E. Jansen       do i=1,nslpwg
94*59599516SKenneth E. Jansen          if(btest(ired,i))cycle
95*59599516SKenneth E. Jansen       do j=i+1,nslpwg
96*59599516SKenneth E. Jansen          AA(:)=wlnorm(nn,:,IDslpw(i))
97*59599516SKenneth E. Jansen          BB(:)=wlnorm(nn,:,IDslpw(j))
98*59599516SKenneth E. Jansen          if(iparall(AA,BB).eq.1)then
99*59599516SKenneth E. Jansen             nslpw=nslpw-1
100*59599516SKenneth E. Jansen             ihis=ihis-2**IDslpw(j)
101*59599516SKenneth E. Jansen             wlnorm(nn,:,IDslpw(i))=AA(:)+BB(:)
102*59599516SKenneth E. Jansen             ired=ired+2**j
103*59599516SKenneth E. Jansen          endif
104*59599516SKenneth E. Jansen       enddo
105*59599516SKenneth E. Jansen       enddo
106*59599516SKenneth E. Jansen
107*59599516SKenneth E. Jansen       do k=1,9
108*59599516SKenneth E. Jansen          wn1(:)=wlnorm(nn,:,k)
109*59599516SKenneth E. Jansen          mag=(wn1(1)**2+wn1(2)**2+wn1(3)**2)**0.5
110*59599516SKenneth E. Jansen          if(mag.ne.0)wlnorm(nn,:,k)=wn1(:)/mag
111*59599516SKenneth E. Jansen       enddo
112*59599516SKenneth E. Jansen
113*59599516SKenneth E. Jansen      mpslpw(nn,1)=nslpw
114*59599516SKenneth E. Jansen      mpslpw(nn,2)=ihis
115*59599516SKenneth E. Jansen
116*59599516SKenneth E. Jansen      deallocate(IDslpw)
117*59599516SKenneth E. Jansen      enddo
118*59599516SKenneth E. Jansen
119*59599516SKenneth E. Jansen
120*59599516SKenneth E. Jansenc        call write_field(myrank,'a',
121*59599516SKenneth E. Jansenc     &      'wnrm',4,wlnorm(:,:,1),'d',nshg,3,701)
122*59599516SKenneth E. Jansencc 7 is the number of charaters of the name of array wnrm701
123*59599516SKenneth E. Jansenc        call write_field(myrank,'a',
124*59599516SKenneth E. Jansenc     &      'wnrm',4,wlnorm(:,:,2),'d',nshg,3,702)
125*59599516SKenneth E. Jansenc      stop
126*59599516SKenneth E. Jansen
127*59599516SKenneth E. Jansen      return
128*59599516SKenneth E. Jansen      end
129*59599516SKenneth E. Jansen
130*59599516SKenneth E. Jansencccccccccccccccccccccc
131*59599516SKenneth E. Jansen
132*59599516SKenneth E. Jansen      integer function iparall(A,B)
133*59599516SKenneth E. Jansen      real*8 A(3),B(3)
134*59599516SKenneth E. Jansen      real*8 angtol,tmp
135*59599516SKenneth E. Jansen
136*59599516SKenneth E. Jansen      tmp=(A(1)**2+A(2)**2+A(3)**2)**0.5
137*59599516SKenneth E. Jansen      A(:)=A(:)/tmp
138*59599516SKenneth E. Jansen      tmp=(B(1)**2+B(2)**2+B(3)**2)**0.5
139*59599516SKenneth E. Jansen      B(:)=B(:)/tmp
140*59599516SKenneth E. Jansen      pi=3.1415926535
141*59599516SKenneth E. Jansen      angtol=10
142*59599516SKenneth E. Jansen      angtol=sin(angtol*(pi/180))
143*59599516SKenneth E. Jansen      C1=A(2)*B(3)-A(3)*B(2)
144*59599516SKenneth E. Jansen      C2=A(3)*B(1)-A(1)*B(3)
145*59599516SKenneth E. Jansen      C3=A(1)*B(2)-A(2)*B(1)
146*59599516SKenneth E. Jansen      Cmag=(C1**2+C2**2+C3**2)**0.5
147*59599516SKenneth E. Jansen      dotp=A(1)*B(1)+A(2)*B(2)+A(3)*B(3)
148*59599516SKenneth E. Jansen      if(dotp.gt.0.and.Cmag.lt.angtol)then
149*59599516SKenneth E. Jansen         iparall=1
150*59599516SKenneth E. Jansen      else
151*59599516SKenneth E. Jansen         iparall=0
152*59599516SKenneth E. Jansen      endif
153*59599516SKenneth E. Jansen
154*59599516SKenneth E. Jansen      return
155*59599516SKenneth E. Jansen      end
156