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